generated from template/vite-react-template
	Initial commit
This commit is contained in:
		
							
								
								
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
# Logs
 | 
			
		||||
logs
 | 
			
		||||
*.log
 | 
			
		||||
.env
 | 
			
		||||
npm-debug.log*
 | 
			
		||||
yarn-debug.log*
 | 
			
		||||
yarn-error.log*
 | 
			
		||||
pnpm-debug.log*
 | 
			
		||||
lerna-debug.log*
 | 
			
		||||
 | 
			
		||||
node_modules
 | 
			
		||||
dist
 | 
			
		||||
dist-ssr
 | 
			
		||||
*.local
 | 
			
		||||
 | 
			
		||||
# Editor directories and files
 | 
			
		||||
.vscode/*
 | 
			
		||||
!.vscode/extensions.json
 | 
			
		||||
.idea
 | 
			
		||||
.DS_Store
 | 
			
		||||
*.suo
 | 
			
		||||
*.ntvs*
 | 
			
		||||
*.njsproj
 | 
			
		||||
*.sln
 | 
			
		||||
*.sw?
 | 
			
		||||
 | 
			
		||||
tsconfig.app.tsbuildinfo
 | 
			
		||||
tsconfig.node.tsbuildinfo
 | 
			
		||||
 | 
			
		||||
.turbo
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
[submodule "packages/components"]
 | 
			
		||||
	path = packages/components
 | 
			
		||||
	url = git@git.xiongxiao.me:kevisual/components.git
 | 
			
		||||
							
								
								
									
										3
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.npmrc
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
//npm.xiongxiao.me/:_authToken=${ME_NPM_TOKEN}
 | 
			
		||||
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
 | 
			
		||||
ignore-workspace-root-check=true
 | 
			
		||||
							
								
								
									
										33
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="UTF-8" />
 | 
			
		||||
  <link rel="icon" type="image/png" href="https://kevisual.xiongxiao.me/root/center/panda.png" />
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
  <title>Vite + React + TS</title>
 | 
			
		||||
  <link rel="stylesheet" href="/src/index.css" />
 | 
			
		||||
  <style>
 | 
			
		||||
    html,
 | 
			
		||||
    body {
 | 
			
		||||
      height: 100%;
 | 
			
		||||
      margin: 0;
 | 
			
		||||
      padding: 0;
 | 
			
		||||
      overflow: hidden;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #root {
 | 
			
		||||
      height: 100%;
 | 
			
		||||
      margin: 0;
 | 
			
		||||
      padding: 0;
 | 
			
		||||
      overflow: hidden;
 | 
			
		||||
    }
 | 
			
		||||
  </style>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
  <div id="root"></div>
 | 
			
		||||
  <script type="module" src="/src/main.tsx"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										61
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "vite-react",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "version": "0.0.1",
 | 
			
		||||
  "type": "module",
 | 
			
		||||
  "basename": "/",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "dev": "vite",
 | 
			
		||||
    "build": "vite build",
 | 
			
		||||
    "build:css": "tailwindcss -i ./src/index.css -o ./dist/render.css --minify",
 | 
			
		||||
    "postbuild2": "pnpm build:css",
 | 
			
		||||
    "preview": "vite preview",
 | 
			
		||||
    "pub": "envision deploy ./dist -k vite-react -v 0.0.1",
 | 
			
		||||
    "dev:lib": "turbo dev",
 | 
			
		||||
    "git:submodule": "git submodule update --init --recursive",
 | 
			
		||||
    "cmd": "tsx ./script/index.ts "
 | 
			
		||||
  },
 | 
			
		||||
  "files": [
 | 
			
		||||
    "dist"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": "abearxiong <xiongxiao@xiongxiao.me>",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@emotion/react": "^11.14.0",
 | 
			
		||||
    "@emotion/styled": "^11.14.0",
 | 
			
		||||
    "@kevisual/router": "0.0.10",
 | 
			
		||||
    "@mui/material": "^7.0.1",
 | 
			
		||||
    "clsx": "^2.1.1",
 | 
			
		||||
    "dayjs": "^1.11.13",
 | 
			
		||||
    "lodash-es": "^4.17.21",
 | 
			
		||||
    "lucide-react": "^0.487.0",
 | 
			
		||||
    "nanoid": "^5.1.5",
 | 
			
		||||
    "react": "^19.1.0",
 | 
			
		||||
    "react-dom": "^19.1.0",
 | 
			
		||||
    "react-hook-form": "^7.55.0",
 | 
			
		||||
    "react-router": "^7.5.0",
 | 
			
		||||
    "react-router-dom": "^7.5.0",
 | 
			
		||||
    "react-toastify": "^11.0.5",
 | 
			
		||||
    "zustand": "^5.0.3"
 | 
			
		||||
  },
 | 
			
		||||
  "publishConfig": {
 | 
			
		||||
    "access": "public"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@kevisual/components": "workspace:*",
 | 
			
		||||
    "@kevisual/query": "0.0.17",
 | 
			
		||||
    "@kevisual/types": "^0.0.6",
 | 
			
		||||
    "@tailwindcss/vite": "^4.1.3",
 | 
			
		||||
    "@types/node": "^22.14.0",
 | 
			
		||||
    "@types/react": "^19.1.0",
 | 
			
		||||
    "@types/react-dom": "^19.1.1",
 | 
			
		||||
    "@vitejs/plugin-basic-ssl": "^2.0.0",
 | 
			
		||||
    "@vitejs/plugin-react": "^4.3.4",
 | 
			
		||||
    "commander": "^13.1.0",
 | 
			
		||||
    "inquire": "^0.4.8",
 | 
			
		||||
    "tailwindcss": "^4.1.3",
 | 
			
		||||
    "typescript": "^5.8.3",
 | 
			
		||||
    "vite": "^6.2.5"
 | 
			
		||||
  },
 | 
			
		||||
  "packageManager": "pnpm@10.7.1"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								packages/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								packages/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								packages/components
									
									
									
									
									
										Submodule
									
								
							
							
								
								
								
								
								
							
						
						
									
										1
									
								
								packages/components
									
									
									
									
									
										Submodule
									
								
							 Submodule packages/components added at bdf6243bd9
									
								
							
							
								
								
									
										2837
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										2837
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								pnpm-workspace.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
packages:
 | 
			
		||||
  - 'submodules/*'
 | 
			
		||||
  - 'packages/*'
 | 
			
		||||
							
								
								
									
										39
									
								
								public/demo.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								public/demo.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="UTF-8" />
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
  <link rel="icon" type="image/png" href="https://kevisual.xiongxiao.me/root/center/panda.png" />
 | 
			
		||||
  <title>Demo</title>
 | 
			
		||||
  <style>
 | 
			
		||||
    html,
 | 
			
		||||
    body {
 | 
			
		||||
      margin: 0;
 | 
			
		||||
      padding: 0;
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 100%;
 | 
			
		||||
      overflow: hidden;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #root {
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      height: 100%;
 | 
			
		||||
    }
 | 
			
		||||
  </style>
 | 
			
		||||
  <link rel="stylesheet" crossorigin href="./render.css">
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
  <div id="root"></div>
 | 
			
		||||
  <script type="module">
 | 
			
		||||
    import { render } from './render.js';
 | 
			
		||||
    console.log('render', render);
 | 
			
		||||
    const opts = {
 | 
			
		||||
      renderRoot: document.getElementById('root'),
 | 
			
		||||
    }
 | 
			
		||||
    render(opts);
 | 
			
		||||
  </script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										15
									
								
								script/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								script/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
import fs from 'fs';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import { program, Command } from './program';
 | 
			
		||||
 | 
			
		||||
export const root = process.cwd();
 | 
			
		||||
 | 
			
		||||
export const clearWorkspace = () => {
 | 
			
		||||
  const files = ['submodules', 'packages', 'pnpm-workspace.yaml', 'turbo.json'];
 | 
			
		||||
  for (const file of files) {
 | 
			
		||||
    fs.rmSync(path.join(root, file), { recursive: true, force: true });
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
program.addCommand(new Command('clear').action(clearWorkspace));
 | 
			
		||||
 | 
			
		||||
program.parse(process.argv);
 | 
			
		||||
							
								
								
									
										2
									
								
								script/program.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								script/program.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
import { program, Command } from 'commander';
 | 
			
		||||
export { program, Command };
 | 
			
		||||
							
								
								
									
										0
									
								
								src/app.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/app.ts
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										1
									
								
								src/index.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/index.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
@import "tailwindcss";
 | 
			
		||||
							
								
								
									
										10
									
								
								src/main.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/main.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
import { createRoot } from 'react-dom/client';
 | 
			
		||||
import { App, AppRoute } from './pages/App.tsx';
 | 
			
		||||
import { CustomThemeProvider } from '@kevisual/components/theme/index.tsx';
 | 
			
		||||
 | 
			
		||||
console.log('cu',)
 | 
			
		||||
createRoot(document.getElementById('root')!).render(
 | 
			
		||||
  <CustomThemeProvider>
 | 
			
		||||
    <AppRoute />
 | 
			
		||||
  </CustomThemeProvider>,
 | 
			
		||||
);
 | 
			
		||||
							
								
								
									
										1
									
								
								src/modules/basename.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/modules/basename.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
export const basename = DEV_SERVER ? '/' : BASE_NAME;
 | 
			
		||||
							
								
								
									
										3
									
								
								src/modules/query.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/modules/query.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
import { QueryClient } from '@kevisual/query';
 | 
			
		||||
 | 
			
		||||
export const query = new QueryClient();
 | 
			
		||||
							
								
								
									
										18
									
								
								src/pages/App.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/pages/App.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
import { basename } from '../modules/basename';
 | 
			
		||||
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
 | 
			
		||||
console.log('basename', basename);
 | 
			
		||||
import { App as AppDemo } from './app-demo';
 | 
			
		||||
export const App = () => {
 | 
			
		||||
  return <div className='bg-slate-200 w-full h-full border'>123</div>;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const AppRoute = () => {
 | 
			
		||||
  return (
 | 
			
		||||
    <Router>
 | 
			
		||||
      <Routes>
 | 
			
		||||
        <Route path='/' element={<Navigate to='/app-demo/list' />} />
 | 
			
		||||
        <Route path='/app-demo/*' element={<AppDemo />} />
 | 
			
		||||
      </Routes>
 | 
			
		||||
    </Router>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										11
									
								
								src/pages/app-demo/index.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/pages/app-demo/index.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
import { Routes, Route } from 'react-router';
 | 
			
		||||
import { List } from './pages/List';
 | 
			
		||||
 | 
			
		||||
export const App = () => {
 | 
			
		||||
  return (
 | 
			
		||||
    <Routes>
 | 
			
		||||
      <Route index element={<List />} />
 | 
			
		||||
      <Route path='/list' element={<List />} />
 | 
			
		||||
    </Routes>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										62
									
								
								src/pages/app-demo/pages/List.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/pages/app-demo/pages/List.tsx
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,62 @@
 | 
			
		||||
import { useEffect } from 'react';
 | 
			
		||||
import { useDemoStore } from '../store';
 | 
			
		||||
import { useShallow } from 'zustand/react/shallow';
 | 
			
		||||
import { Dialog, DialogTitle, DialogContent, TextField, Button } from '@mui/material';
 | 
			
		||||
import { Controller, useForm } from 'react-hook-form';
 | 
			
		||||
export const EditDialog = () => {
 | 
			
		||||
  const { control, handleSubmit, reset } = useForm();
 | 
			
		||||
  const store = useDemoStore(
 | 
			
		||||
    useShallow((state) => ({
 | 
			
		||||
      formData: state.formData,
 | 
			
		||||
      setFormData: state.setFormData,
 | 
			
		||||
      showEdit: state.showEdit,
 | 
			
		||||
      setShowEdit: state.setShowEdit,
 | 
			
		||||
    })),
 | 
			
		||||
  );
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    if (store.showEdit) {
 | 
			
		||||
      reset(store.formData || {});
 | 
			
		||||
    }
 | 
			
		||||
  }, [store.formData]);
 | 
			
		||||
  const onSubmit = (data: any) => {
 | 
			
		||||
    console.log(data);
 | 
			
		||||
  };
 | 
			
		||||
  const hasId = !!store.formData?.id;
 | 
			
		||||
  return (
 | 
			
		||||
    <Dialog open={store.showEdit} onClose={() => store.setShowEdit(false)}>
 | 
			
		||||
      <DialogTitle>{hasId ? 'Edit' : 'Add'}</DialogTitle>
 | 
			
		||||
      <DialogContent>
 | 
			
		||||
        <form onSubmit={handleSubmit(onSubmit)}>
 | 
			
		||||
          <Controller control={control} name='title' render={({ field }) => <TextField {...field} label='Title' />} />
 | 
			
		||||
          <Button type='submit'>提交</Button>
 | 
			
		||||
        </form>
 | 
			
		||||
      </DialogContent>
 | 
			
		||||
    </Dialog>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const List = () => {
 | 
			
		||||
  const store = useDemoStore(
 | 
			
		||||
    useShallow((state) => ({
 | 
			
		||||
      list: state.list,
 | 
			
		||||
      init: state.init,
 | 
			
		||||
      setShowEdit: state.setShowEdit,
 | 
			
		||||
    })),
 | 
			
		||||
  );
 | 
			
		||||
  useEffect(() => {
 | 
			
		||||
    store.init();
 | 
			
		||||
  }, []);
 | 
			
		||||
  return (
 | 
			
		||||
    <div className='w-full h-full flex flex-col gap-2 bg-gray-100'>
 | 
			
		||||
      <div className='flex justify-end'>
 | 
			
		||||
        <Button onClick={() => store.setShowEdit(true)}>添加</Button>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div>
 | 
			
		||||
        {store.list.map((item) => (
 | 
			
		||||
          <div key={item.id}>{item.title}</div>
 | 
			
		||||
        ))}
 | 
			
		||||
      </div>
 | 
			
		||||
      <EditDialog />
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										46
									
								
								src/pages/app-demo/query.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/pages/app-demo/query.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
import { BaseQuery } from '@kevisual/query';
 | 
			
		||||
export class QueryApi extends BaseQuery {
 | 
			
		||||
  constructor(options: { query: any }) {
 | 
			
		||||
    super(options);
 | 
			
		||||
  }
 | 
			
		||||
  async getList(params?: any, dataOpts?: any) {
 | 
			
		||||
    return this.query.post(
 | 
			
		||||
      {
 | 
			
		||||
        path: 'demo',
 | 
			
		||||
        key: 'list',
 | 
			
		||||
        ...params,
 | 
			
		||||
      },
 | 
			
		||||
      dataOpts,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  async getDetail(id?: string, dataOpts?: any) {
 | 
			
		||||
    return this.query.post(
 | 
			
		||||
      {
 | 
			
		||||
        path: 'demo',
 | 
			
		||||
        key: 'get',
 | 
			
		||||
        data: { id },
 | 
			
		||||
      },
 | 
			
		||||
      dataOpts,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  async update(data?: any, dataOpts?: any) {
 | 
			
		||||
    return this.query.post(
 | 
			
		||||
      {
 | 
			
		||||
        path: 'demo',
 | 
			
		||||
        key: 'update',
 | 
			
		||||
        data,
 | 
			
		||||
      },
 | 
			
		||||
      dataOpts,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
  async delete(id?: string, dataOpts?: any) {
 | 
			
		||||
    return this.query.post(
 | 
			
		||||
      {
 | 
			
		||||
        path: 'demo',
 | 
			
		||||
        key: 'delete',
 | 
			
		||||
        data: { id },
 | 
			
		||||
      },
 | 
			
		||||
      dataOpts,
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										87
									
								
								src/pages/app-demo/store.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/pages/app-demo/store.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
import { create } from 'zustand';
 | 
			
		||||
import { query } from '@/modules/query';
 | 
			
		||||
import { QueryApi } from './query';
 | 
			
		||||
import { toast } from 'react-toastify';
 | 
			
		||||
 | 
			
		||||
export const queryApi = new QueryApi({ query });
 | 
			
		||||
type Store = {
 | 
			
		||||
  list: any[];
 | 
			
		||||
  setList: (list: any[]) => void;
 | 
			
		||||
  data: any;
 | 
			
		||||
  setData: (data: any) => void;
 | 
			
		||||
  loading: boolean;
 | 
			
		||||
  setLoading: (loading: boolean) => void;
 | 
			
		||||
  formData: any;
 | 
			
		||||
  setFormData: (data: any) => void;
 | 
			
		||||
  showEdit: boolean;
 | 
			
		||||
  setShowEdit: (showEdit: boolean) => void;
 | 
			
		||||
  getList: () => Promise<any>;
 | 
			
		||||
  init: () => Promise<void>;
 | 
			
		||||
  getData: (id: string) => Promise<any>;
 | 
			
		||||
  updateData: (data: any, opts?: { refresh?: boolean }) => Promise<any>;
 | 
			
		||||
  deleteData: (id: string, opts?: { refresh?: boolean }) => Promise<any>;
 | 
			
		||||
};
 | 
			
		||||
export const useDemoStore = create<Store>((set, get) => ({
 | 
			
		||||
  list: [],
 | 
			
		||||
  setList: (list) => set({ list }),
 | 
			
		||||
  data: null,
 | 
			
		||||
  setData: (data) => set({ data }),
 | 
			
		||||
  loading: false,
 | 
			
		||||
  setLoading: (loading) => set({ loading }),
 | 
			
		||||
  formData: null,
 | 
			
		||||
  setFormData: (formData) => set({ formData }),
 | 
			
		||||
  showEdit: false,
 | 
			
		||||
  setShowEdit: (showEdit) => set({ showEdit }),
 | 
			
		||||
  getList: async () => {
 | 
			
		||||
    set({ loading: true });
 | 
			
		||||
    const res = await queryApi.getList();
 | 
			
		||||
    set({ loading: false });
 | 
			
		||||
    if (res.code === 200) {
 | 
			
		||||
      set({ list: res.data });
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
  },
 | 
			
		||||
  init: async () => {
 | 
			
		||||
    await get().getList();
 | 
			
		||||
  },
 | 
			
		||||
  getData: async (id) => {
 | 
			
		||||
    set({ loading: true });
 | 
			
		||||
    const res = await queryApi.getDetail(id);
 | 
			
		||||
    set({ loading: false });
 | 
			
		||||
    if (res.code === 200) {
 | 
			
		||||
      const data = res.data;
 | 
			
		||||
      set({ data });
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
  },
 | 
			
		||||
  updateData: async (data, opts = { refresh: true }) => {
 | 
			
		||||
    set({ loading: true });
 | 
			
		||||
    const res = await queryApi.update(data);
 | 
			
		||||
    set({ loading: false });
 | 
			
		||||
    if (res.code === 200) {
 | 
			
		||||
      set({ data: res.data });
 | 
			
		||||
      toast.success('更新成功');
 | 
			
		||||
    } else {
 | 
			
		||||
      toast.error(res.message || '更新失败');
 | 
			
		||||
    }
 | 
			
		||||
    if (opts.refresh) {
 | 
			
		||||
      await get().getList();
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
  },
 | 
			
		||||
  deleteData: async (id, opts = { refresh: true }) => {
 | 
			
		||||
    set({ loading: true });
 | 
			
		||||
    const res = await queryApi.delete(id);
 | 
			
		||||
    set({ loading: false });
 | 
			
		||||
    if (res.code === 200) {
 | 
			
		||||
      set({ data: null });
 | 
			
		||||
      toast.success('删除成功');
 | 
			
		||||
    } else {
 | 
			
		||||
      toast.error(res.message || '删除失败');
 | 
			
		||||
    }
 | 
			
		||||
    if (opts.refresh) {
 | 
			
		||||
      await get().getList();
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
  },
 | 
			
		||||
}));
 | 
			
		||||
							
								
								
									
										1
									
								
								src/routes/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/routes/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
// import {}
 | 
			
		||||
							
								
								
									
										6
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								src/vite-env.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
/// <reference types="vite/client" />
 | 
			
		||||
type SimpleObject = {
 | 
			
		||||
  [key: string | number]: any;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
declare let BASE_NAME: string;
 | 
			
		||||
							
								
								
									
										0
									
								
								submodules/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								submodules/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										43
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								tsconfig.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
{
 | 
			
		||||
  "compilerOptions": {
 | 
			
		||||
    "target": "ES2020",
 | 
			
		||||
    "useDefineForClassFields": true,
 | 
			
		||||
    "lib": [
 | 
			
		||||
      "ES2020",
 | 
			
		||||
      "DOM",
 | 
			
		||||
      "DOM.Iterable"
 | 
			
		||||
    ],
 | 
			
		||||
    "module": "ESNext",
 | 
			
		||||
    "skipLibCheck": true,
 | 
			
		||||
    /* Bundler mode */
 | 
			
		||||
    "moduleResolution": "bundler",
 | 
			
		||||
    "allowImportingTsExtensions": true,
 | 
			
		||||
    "isolatedModules": true,
 | 
			
		||||
    "moduleDetection": "force",
 | 
			
		||||
    "noEmit": true,
 | 
			
		||||
    // "jsx": "react",
 | 
			
		||||
    // "jsxFragmentFactory": "Fragment",
 | 
			
		||||
    // "jsxFactory": "h",
 | 
			
		||||
    "jsx": "react-jsx",
 | 
			
		||||
    "baseUrl": "./",
 | 
			
		||||
    "typeRoots": [
 | 
			
		||||
      "node_modules/@types",
 | 
			
		||||
      "node_modules/@kevisual/types",
 | 
			
		||||
    ],
 | 
			
		||||
    "paths": {
 | 
			
		||||
      "@/*": [
 | 
			
		||||
        "src/*"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    /* Linting */
 | 
			
		||||
    "strict": true,
 | 
			
		||||
    "noImplicitAny": false,
 | 
			
		||||
    "noUnusedLocals": false,
 | 
			
		||||
    "noUnusedParameters": false,
 | 
			
		||||
    "noFallthroughCasesInSwitch": true
 | 
			
		||||
  },
 | 
			
		||||
  "include": [
 | 
			
		||||
    "src",
 | 
			
		||||
    "typings.d.ts"
 | 
			
		||||
  ]
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								turbo.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								turbo.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
{
 | 
			
		||||
  "$schema": "https://turbo.build/schema.json",
 | 
			
		||||
  "tasks": {
 | 
			
		||||
    "build": {
 | 
			
		||||
      "dependsOn": [
 | 
			
		||||
        "^build"
 | 
			
		||||
      ],
 | 
			
		||||
      "outputs": [
 | 
			
		||||
        "dist/**"
 | 
			
		||||
      ]
 | 
			
		||||
    },
 | 
			
		||||
    "dev:lib": {
 | 
			
		||||
      "persistent": true,
 | 
			
		||||
      "cache": true
 | 
			
		||||
    },
 | 
			
		||||
    "build:lib": {
 | 
			
		||||
      "dependsOn": [
 | 
			
		||||
        "^build:lib"
 | 
			
		||||
      ]
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										95
									
								
								vite.config.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								vite.config.mjs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,95 @@
 | 
			
		||||
import { defineConfig } from 'vite';
 | 
			
		||||
import react from '@vitejs/plugin-react';
 | 
			
		||||
import path from 'path';
 | 
			
		||||
import pkgs from './package.json' with { type: 'json' };
 | 
			
		||||
const version = pkgs.version || '0.0.1';
 | 
			
		||||
 | 
			
		||||
const isDev = process.env.NODE_ENV === 'development';
 | 
			
		||||
const basename = isDev ? '/' : pkgs?.basename || '/';
 | 
			
		||||
 | 
			
		||||
const checkJsh = () => {
 | 
			
		||||
  return process.env.SHELL === '/bin/jsh';
 | 
			
		||||
};
 | 
			
		||||
const isJsh = checkJsh();
 | 
			
		||||
const plugins = [react(), ];
 | 
			
		||||
 | 
			
		||||
if (!isJsh) {
 | 
			
		||||
  const basicSsl = await import('@vitejs/plugin-basic-ssl');
 | 
			
		||||
  const tailwindcss = await import('@tailwindcss/vite');
 | 
			
		||||
  const defaultPlugin = basicSsl.default;
 | 
			
		||||
  const defaultCssPlugin = tailwindcss.default;
 | 
			
		||||
  plugins.push(defaultCssPlugin(),defaultPlugin());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let target = 'https://kevisual.xiongxiao.me';
 | 
			
		||||
if (isDev) {
 | 
			
		||||
  target = 'https://kevisual.xiongxiao.me';
 | 
			
		||||
} else {
 | 
			
		||||
  target = 'https://kevisual.cn';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let proxy = {
 | 
			
		||||
  '/root/center/': {
 | 
			
		||||
    target: `https://${target}/root/center/`,
 | 
			
		||||
  },
 | 
			
		||||
  '/root/system-lib/': {
 | 
			
		||||
    target: `https://${target}/root/system-lib/`,
 | 
			
		||||
  },
 | 
			
		||||
  '/user/login/': {
 | 
			
		||||
    target: `https://${target}/user/login/`,
 | 
			
		||||
  },
 | 
			
		||||
  '/api': {
 | 
			
		||||
    target: `https://${target}`,
 | 
			
		||||
    changeOrigin: true,
 | 
			
		||||
    ws: true,
 | 
			
		||||
    rewriteWsOrigin: true,
 | 
			
		||||
    cookieDomainRewrite: 'localhost',
 | 
			
		||||
  },
 | 
			
		||||
};
 | 
			
		||||
/**
 | 
			
		||||
 * @see https://vitejs.dev/config/
 | 
			
		||||
 */
 | 
			
		||||
export default defineConfig({
 | 
			
		||||
  plugins,
 | 
			
		||||
  resolve: {
 | 
			
		||||
    alias: {
 | 
			
		||||
      '@': path.resolve(__dirname, './src')
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
  base: basename,
 | 
			
		||||
  define: {
 | 
			
		||||
    DEV_SERVER: JSON.stringify(process.env.NODE_ENV === 'development'),
 | 
			
		||||
    APP_VERSION: JSON.stringify(version),
 | 
			
		||||
    BASE_NAME: JSON.stringify(basename),
 | 
			
		||||
    'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
 | 
			
		||||
  },
 | 
			
		||||
  build: {
 | 
			
		||||
    target: 'modules',
 | 
			
		||||
    // lib: {
 | 
			
		||||
    //   entry: './src/libs.ts',
 | 
			
		||||
    //   formats: ['es'],
 | 
			
		||||
    //   fileName: (format) => `render.js`,
 | 
			
		||||
    // },
 | 
			
		||||
  },
 | 
			
		||||
  server: {
 | 
			
		||||
    port: 7008,
 | 
			
		||||
    host: '0.0.0.0',
 | 
			
		||||
    proxy: {
 | 
			
		||||
      '/api': {
 | 
			
		||||
        target: 'http://localhost:3000',
 | 
			
		||||
        changeOrigin: true,
 | 
			
		||||
        ws: true,
 | 
			
		||||
        rewriteWsOrigin: true,
 | 
			
		||||
        rewrite: (path) => path.replace(/^\/api/, '/api'),
 | 
			
		||||
      },
 | 
			
		||||
      '/api/router': {
 | 
			
		||||
        target: 'ws://localhost:3000',
 | 
			
		||||
        changeOrigin: true,
 | 
			
		||||
        ws: true,
 | 
			
		||||
        rewriteWsOrigin: true,
 | 
			
		||||
        rewrite: (path) => path.replace(/^\/api/, '/api'),
 | 
			
		||||
      },
 | 
			
		||||
      ...proxy,
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
		Reference in New Issue
	
	Block a user