Compare commits

...

2 Commits

Author SHA1 Message Date
b7cfbe3622 fix: fix upload chunk use libs 2025-04-06 01:45:50 +08:00
24a7344b6e add change password 2025-04-03 22:50:56 +08:00
18 changed files with 520 additions and 689 deletions

View File

@ -1,7 +1,7 @@
{
"name": "@kevisual/center",
"private": true,
"version": "0.0.9",
"version": "0.0.10",
"type": "module",
"scripts": {
"dev": "vite",
@ -9,7 +9,7 @@
"dev:kv": "cross-env VITE_USE_KV=true vite",
"lint": "eslint .",
"preview": "vite preview",
"pub": "envision deploy ./dist -k center -v 0.0.9 -u -o root",
"pub": "envision deploy ./dist -k center -v 0.0.10 -u -o root",
"turbo:dev": "turbo dev:lib",
"dev:lib": "turbo dev:lib",
"dev:query": "turbo dev:lib --filter=@kevisual/query",
@ -87,7 +87,7 @@
"turbo": "^2.4.4",
"typescript": "^5.8.2",
"typescript-eslint": "^8.29.0",
"vite": "^6.2.4"
"vite": "^6.2.5"
},
"packageManager": "pnpm@10.7.1"
}

View File

@ -18,7 +18,7 @@
"type": "module",
"dependencies": {
"@codemirror/autocomplete": "^6.18.6",
"@codemirror/commands": "^6.8.0",
"@codemirror/commands": "^6.8.1",
"@codemirror/lang-css": "^6.3.1",
"@codemirror/lang-html": "^6.4.9",
"@codemirror/lang-javascript": "^6.2.3",
@ -27,13 +27,13 @@
"@codemirror/lang-yaml": "^6.1.2",
"@codemirror/language": "^6.11.0",
"@codemirror/state": "^6.5.2",
"@codemirror/view": "^6.36.4",
"@codemirror/view": "^6.36.5",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
"@kevisual/components": "workspace:*",
"@kevisual/router": "^0.0.9",
"@kevisual/store": "^0.0.2",
"@mui/material": "^6.4.8",
"@kevisual/router": "^0.0.10",
"@kevisual/store": "^0.0.4",
"@mui/material": "^7.0.1",
"@types/lodash-es": "^4.17.12",
"@types/nprogress": "^0.2.3",
"@uiw/codemirror-theme-duotone": "^4.23.10",
@ -44,16 +44,16 @@
"highlight.js": "^11.11.1",
"immer": "^10.1.1",
"lodash-es": "^4.17.21",
"lucide-react": "^0.483.0",
"lucide-react": "^0.487.0",
"marked": "^15.0.7",
"marked-highlight": "^2.2.1",
"nanoid": "^5.1.5",
"nprogress": "^0.2.0",
"prettier": "^3.5.3",
"pretty-bytes": "^6.1.1",
"react": "19.0.0",
"react": "19.1.0",
"react-datepicker": "^8.2.1",
"react-dom": "19.0.0",
"react-dom": "19.1.0",
"react-dropzone": "^14.3.8",
"react-toastify": "^11.0.5",
"zustand": "^5.0.3"

@ -1 +1 @@
Subproject commit a857afbb2c8f5b5f98771824e875dfffd23b6ad2
Subproject commit 967c2f94f27d0cd7f6733c5293d2f201eacad090

View File

@ -24,8 +24,6 @@
"@kevisual/router": "^0.0.9",
"@kevisual/store": "^0.0.2",
"@mui/material": "^6.4.8",
"@types/lodash-es": "^4.17.12",
"@types/nprogress": "^0.2.3",
"@vitejs/plugin-basic-ssl": "^2.0.0",
"dayjs": "^1.11.13",
"immer": "^10.1.1",
@ -42,7 +40,9 @@
"zustand": "^5.0.3"
},
"devDependencies": {
"@kevisual/types": "^0.0.6"
"@kevisual/types": "^0.0.6",
"@types/lodash-es": "^4.17.12",
"@types/nprogress": "^0.2.3"
},
"exports": {
".": "./src/index.tsx",

View File

@ -43,19 +43,19 @@ export const QuickPreview = () => {
let accordionList: AccordionItem[] = [];
const encodeUrl = encodeURIComponent(url);
const previewUrl = `${baseUrl}/app/preview?fileUrl=${encodeUrl}&fileType=${fileType}`;
accordionList.push({
title: '文件预览',
key: 'preview-file',
url: previewUrl,
content: (
<div className=''>
<div className='text-sm break-words'>{previewUrl}</div>
<Button variant='contained' color='primary' style={{ color: 'white' }} onClick={() => window.open(previewUrl, '_blank')}>
</Button>
</div>
),
});
// accordionList.push({
// title: '文件预览',
// key: 'preview-file',
// url: previewUrl,
// content: (
// <div className=''>
// <div className='text-sm break-words'>{previewUrl}</div>
// <Button variant='contained' color='primary' style={{ color: 'white' }} onClick={() => window.open(previewUrl, '_blank')}>
// 点击查看
// </Button>
// </div>
// ),
// });
if (fileType === 'image') {
accordionList.push({

View File

@ -3,8 +3,8 @@ import 'nprogress/nprogress.css';
import { Id, toast } from 'react-toastify';
import { nanoid } from 'nanoid';
import { toastLogin } from '@kevisual/resources/pages/message/ToastLogin';
import { uploadFileChunked, UploadProgress } from '@kevisual/query-upload/query-upload';
import { toFile } from '@kevisual/query-upload/query-upload';
import { uploadFileChunked, UploadProgress } from '@kevisual/query-upload/query-upload.js';
import { toFile } from '@kevisual/query-upload/query-upload.js';
export type ConvertOpts = {
appKey?: string;
version?: string;

1051
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@ -92,5 +92,6 @@
"Check username introduction": "Check your username, if the username is not available, you can contact the customer service to modify.",
"Delete and remove file": "Delete and remove file",
"Delete App Introduce": "Delete App, when you click the delete button, the file will be deleted from the file management system.",
"Detect Files": "Detect Files"
"Detect Files": "Detect Files",
"Change Password": "Change Password"
}

View File

@ -92,5 +92,6 @@
"Check username introduction": "查看是否可以取名,如果当前用户名已存在,请更换其他用户名。其中用户名以@开头",
"Delete and remove file": "删除并删除文件",
"Delete App Introduce": "删除应用, 当点击同时删除文件,会把文件管理中,应用相关的存储的资源同步删除。",
"Detect Files": "检测文件"
"Detect Files": "检测文件",
"Change Password": "修改密码"
}

View File

@ -11,8 +11,7 @@ import { App as DomainApp } from './pages/domain';
import { App as HomeApp } from './pages/home';
import { basename } from './modules/basename';
import { Redirect } from './modules/Redirect';
import { CustomThemeProvider } from '@kevisual/components/theme/index.tsx';
import { useTheme } from '@mui/material/styles';
import { CustomThemeProvider, useTheme, themeOptions, theme } from '@kevisual/components/theme/index.tsx';
import { ToastContainer } from 'react-toastify';
import 'dayjs/locale/zh-cn';
import 'dayjs/locale/en';
@ -21,7 +20,10 @@ import enUS from 'antd/locale/en_US';
import ConfigProvider from 'antd/es/config-provider';
import { useTranslation } from 'react-i18next';
import { useEffect, useState } from 'react';
import { ThemeProvider, createTheme } from '@mui/material';
export const CustomThemeProvider2 = ({ children }: { children: React.ReactNode }) => {
return <ThemeProvider theme={theme}>{children}</ThemeProvider>;
};
const AntProvider = ({ children }: { children: React.ReactNode }) => {
const theme = useTheme();
const primaryColor = theme.palette.primary.main;
@ -67,7 +69,7 @@ const AntProvider = ({ children }: { children: React.ReactNode }) => {
};
export const App = () => {
return (
<CustomThemeProvider>
<CustomThemeProvider2>
<AntProvider>
<div className='w-full h-full'>
<Router basename={basename}>
@ -93,6 +95,6 @@ export const App = () => {
<div id='for-drawer'></div>
<div id='for-modal'></div>
<ToastContainer />
</CustomThemeProvider>
</CustomThemeProvider2>
);
};

View File

@ -17,6 +17,7 @@ import { IconButton } from '@kevisual/components/button/index.tsx';
import { Languages, QrCode } from 'lucide-react';
import { useTranslation } from 'react-i18next';
import { toast } from 'react-toastify';
import { useTheme } from '@kevisual/components/theme/index.tsx';
type LayoutMainProps = {
title?: React.ReactNode;

View File

@ -10,9 +10,10 @@ import UploadOutlined from '@ant-design/icons/UploadOutlined';
import PandaPNG from '@/assets/panda.png';
import { FileUpload } from '../module/FileUpload';
import { useTranslation } from 'react-i18next';
import { Edit } from 'lucide-react';
import { Edit, UserCog } from 'lucide-react';
import { toast } from 'react-toastify';
import { useAdminStore } from '../admin/store/admin-store';
import { IconButton } from '@kevisual/components/button/index.tsx';
export const CheckUserExistModal = () => {
const { t } = useTranslation();
const userStore = useUserStore(
@ -62,7 +63,57 @@ export const CheckUserExistModal = () => {
</Dialog>
);
};
export const ChangePasswordModal = () => {
const { t } = useTranslation();
const userStore = useUserStore(
useShallow((state) => {
return {
showChangePassword: state.showChangePassword,
setShowChangePassword: state.setShowChangePassword,
updateSelf: state.updateSelf,
};
}),
);
const [newPassword, setNewPassword] = useState('');
const [confirmPassword, setConfirmPassword] = useState('');
const onSubmit = async () => {
if (newPassword !== confirmPassword) {
toast.error('两次密码不一致');
return;
}
const res = await userStore.updateSelf({
password: newPassword,
});
if (res.code === 200) {
onClose();
}
};
const onClose = () => {
setNewPassword('');
setConfirmPassword('');
userStore.setShowChangePassword(false);
};
return (
<Dialog open={userStore.showChangePassword} onClose={onClose}>
<DialogTitle>{t('Change Password')}</DialogTitle>
<DialogContent>
<div className='flex flex-col w-[400px] p-4 gap-4 pt-2'>
{/* <TextField label='oldPassword' /> */}
<TextField label='New Password' type='password' value={newPassword} onChange={(e) => setNewPassword(e.target.value)} />
<TextField label='Confirm Password' type='password' value={confirmPassword} onChange={(e) => setConfirmPassword(e.target.value)} />
<div className='flex justify-end gap-2 '>
<Button variant='contained' color='primary' onClick={onSubmit}>
{t('Submit')}
</Button>
<Button variant='contained' color='primary' onClick={onClose}>
{t('Cancel')}
</Button>
</div>
</div>
</DialogContent>
</Dialog>
);
};
export const Profile = () => {
const { t } = useTranslation();
const { control, handleSubmit, setValue, reset, formState, getValues } = useForm({
@ -83,6 +134,7 @@ export const Profile = () => {
setFormData: state.setFormData,
updateSelf: state.updateSelf,
setShowCheckUserExist: state.setShowCheckUserExist,
setShowChangePassword: state.setShowChangePassword,
};
}),
);
@ -201,8 +253,16 @@ export const Profile = () => {
</Button>
</form>
</div>
<div className='mt-2'>
<Tooltip title={t('Change Password')}>
<IconButton className='' onClick={() => userStore.setShowChangePassword(true)}>
<UserCog size={16} />
</IconButton>
</Tooltip>
</div>
</div>
<CheckUserExistModal />
<ChangePasswordModal />
</div>
</div>
);

View File

@ -17,6 +17,8 @@ type UserStore = {
updateData: (data: any) => Promise<void>;
updateSelf: (data: any) => Promise<any>;
deleteData: (id: string) => Promise<void>;
showChangePassword: boolean;
setShowChangePassword: (showChangePassword: boolean) => void;
};
export const useUserStore = create<UserStore>((set, get) => {
return {
@ -88,5 +90,7 @@ export const useUserStore = create<UserStore>((set, get) => {
message.error(res.message || 'Request failed');
}
},
showChangePassword: false,
setShowChangePassword: (showChangePassword) => set({ showChangePassword }),
};
});

@ -1 +1 @@
Subproject commit 862b29cfa4e5faa4a581f0bc68d885c20da889dd
Subproject commit 53cd97454dc4300a1a1040c25dd26d86c390f1c8

@ -1 +1 @@
Subproject commit a7faaca4188cae055deb1af1d1b758b6d5439f8d
Subproject commit efa7fbe62e32a432b509629f4fe2f04719ef8a43

@ -1 +1 @@
Subproject commit d70118ad3db513a4ae95a925f0dd651929a8f632
Subproject commit 351b2e336624b05e1b2c9f8b67d9a45cda7ebf9d

@ -1 +1 @@
Subproject commit 4d0e945a92eea77784dd4fdf790fc2471e20b8c7
Subproject commit 3eaf262ee87feeacfdd5dbdab6d46c086971b5a6

View File

@ -32,7 +32,8 @@
},
"include": [
"src",
"packages/**/*"
// "packages/**/*"
"@kevisual/components/**/*"
],
"exclude": [
"node_modules",