fix: 修复部分缺陷

This commit is contained in:
bunny 2025-04-06 12:55:21 +08:00
parent ad343567b7
commit b14435e35b
11 changed files with 81 additions and 104 deletions

View File

@ -22,6 +22,7 @@
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"axios": "^1.7.9", "axios": "^1.7.9",
"boxen": "^8.0.1", "boxen": "^8.0.1",
"dayjs": "^1.11.13",
"esbuild": "^0.25.1", "esbuild": "^0.25.1",
"eslint": "^9.9.1", "eslint": "^9.9.1",
"eslint-config-prettier": "^9.1.0", "eslint-config-prettier": "^9.1.0",
@ -29,8 +30,6 @@
"eslint-plugin-prettier": "^5.2.1", "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-vue": "^9.27.0", "eslint-plugin-vue": "^9.27.0",
"gradient-string": "^3.0.0", "gradient-string": "^3.0.0",
"js-cookie": "^3.0.5",
"list": "^2.0.19",
"naive-ui": "^2.41.0", "naive-ui": "^2.41.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"pinia": "^2.3.1", "pinia": "^2.3.1",
@ -48,7 +47,6 @@
"stylelint-prettier": "^5.0.3", "stylelint-prettier": "^5.0.3",
"terser": "^5.39.0", "terser": "^5.39.0",
"unocss": "^66.0.0", "unocss": "^66.0.0",
"vfonts": "^0.0.3",
"vite-plugin-cdn-import": "^1.0.1", "vite-plugin-cdn-import": "^1.0.1",
"vite-plugin-remove-console": "^2.2.0", "vite-plugin-remove-console": "^2.2.0",
"vite-plugin-vue-inspector": "^5.3.1", "vite-plugin-vue-inspector": "^5.3.1",

View File

@ -62,12 +62,6 @@ importers:
gradient-string: gradient-string:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.0.0 version: 3.0.0
js-cookie:
specifier: ^3.0.5
version: 3.0.5
list:
specifier: ^2.0.19
version: 2.0.19
naive-ui: naive-ui:
specifier: ^2.41.0 specifier: ^2.41.0
version: 2.41.0(vue@3.5.13(typescript@5.7.3)) version: 2.41.0(vue@3.5.13(typescript@5.7.3))
@ -119,9 +113,6 @@ importers:
unocss: unocss:
specifier: ^66.0.0 specifier: ^66.0.0
version: 66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3)) version: 66.0.0(postcss@8.5.3)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3))
vfonts:
specifier: ^0.0.3
version: 0.0.3
vite-plugin-cdn-import: vite-plugin-cdn-import:
specifier: ^1.0.1 specifier: ^1.0.1
version: 1.0.1(rollup@4.34.8)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)) version: 1.0.1(rollup@4.34.8)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0))
@ -1980,10 +1971,6 @@ packages:
resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
hasBin: true hasBin: true
js-cookie@3.0.5:
resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
engines: {node: '>=14'}
js-tokens@4.0.0: js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
@ -2050,9 +2037,6 @@ packages:
lines-and-columns@1.2.4: lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
list@2.0.19:
resolution: {integrity: sha512-nnVaRp4RaMAQkCpypTThsdxKqgPMiSwJq93eAm2/IbpUa8sd04XKBhkKu+bMk63HmdjK8b8Cuh4xARHWX2ye/Q==}
local-pkg@1.0.0: local-pkg@1.0.0:
resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==}
engines: {node: '>=14'} engines: {node: '>=14'}
@ -2729,9 +2713,6 @@ packages:
peerDependencies: peerDependencies:
vue: ^3.0.11 vue: ^3.0.11
vfonts@0.0.3:
resolution: {integrity: sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ==}
vite-plugin-cdn-import@1.0.1: vite-plugin-cdn-import@1.0.1:
resolution: {integrity: sha512-lgjLxgwFSKvJLbqjVBirUZ0rQo00GpUGJzRpgQu8RyBw9LA7jaqG6fUMQzBC9qWmTGabPC3iOzwCcoi7PseRAQ==} resolution: {integrity: sha512-lgjLxgwFSKvJLbqjVBirUZ0rQo00GpUGJzRpgQu8RyBw9LA7jaqG6fUMQzBC9qWmTGabPC3iOzwCcoi7PseRAQ==}
@ -4695,8 +4676,6 @@ snapshots:
jiti@2.4.2: {} jiti@2.4.2: {}
js-cookie@3.0.5: {}
js-tokens@4.0.0: {} js-tokens@4.0.0: {}
js-tokens@9.0.1: {} js-tokens@9.0.1: {}
@ -4761,8 +4740,6 @@ snapshots:
lines-and-columns@1.2.4: {} lines-and-columns@1.2.4: {}
list@2.0.19: {}
local-pkg@1.0.0: local-pkg@1.0.0:
dependencies: dependencies:
mlly: 1.7.4 mlly: 1.7.4
@ -5482,8 +5459,6 @@ snapshots:
evtd: 0.2.4 evtd: 0.2.4
vue: 3.5.13(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3)
vfonts@0.0.3: {}
vite-plugin-cdn-import@1.0.1(rollup@4.34.8)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)): vite-plugin-cdn-import@1.0.1(rollup@4.34.8)(vite@6.1.1(@types/node@22.13.10)(jiti@2.4.2)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)):
dependencies: dependencies:
rollup-plugin-external-globals: 0.10.0(rollup@4.34.8) rollup-plugin-external-globals: 0.10.0(rollup@4.34.8)

View File

@ -5,3 +5,8 @@ import type { BaseResult } from '@/types/request'; /* 获取所有数据表 */
export const generator = (data: any) => { export const generator = (data: any) => {
return request<any, BaseResult<any>>({ url: '/vms/generator', method: 'post', data }); return request<any, BaseResult<any>>({ url: '/vms/generator', method: 'post', data });
}; };
/* 获取vms文件路径 */
export const getVmsPathList = () => {
return request<any, BaseResult<any>>({ url: '/vms/getVmsPathList', method: 'get' });
};

View File

@ -23,10 +23,4 @@ export const resetRouter = () => {
router.replace({ path: '/' }).then(); router.replace({ path: '/' }).then();
}; };
// router.afterEach((to, from) => {
// const toDepth = to.path.split('/').length;
// const fromDepth = from.path.split('/').length;
// to.meta.transition = toDepth < fromDepth ? 'slide-right' : 'slide-left';
// });
export default router; export default router;

View File

@ -1,10 +1,14 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { generator } from '@/api/vms'; import { generator, getVmsPathList } from '@/api/vms';
export const useVmsStore = defineStore('vmsStore', { export const useVmsStore = defineStore('vmsStore', {
state: () => ({ state: () => ({
generators: [], generators: [],
// 生成服务端内容
serverOptions: [],
// 生成前端内容
webOptions: [],
}), }),
getters: {}, getters: {},
actions: { actions: {
@ -16,8 +20,21 @@ export const useVmsStore = defineStore('vmsStore', {
(window as any).$message.error(result.message); (window as any).$message.error(result.message);
} }
this.generators = result.data; this.generators = result.data.map((i) => ({ ...i, path: i.path.replace('.vm', '') }));
(window as any).$message.success(`生成成功,共 ${this.generators.length} 数据`); (window as any).$message.success(`生成成功,共 ${this.generators.length} 数据`);
}, },
/* 获取vms文件路径 */
async getVmsPathList() {
const result = await getVmsPathList();
// 需要确保已经在 setup 中执行了 window.$message = message
if (result.code !== 200) {
(window as any).$message.error(result.message);
return {};
}
this.webOptions = result.data.web;
this.serverOptions = result.data.server;
},
}, },
}); });

View File

@ -7,7 +7,7 @@ export function downloadTextAsFile(text: string, filename: string) {
const a = document.createElement('a'); const a = document.createElement('a');
a.href = url; a.href = url;
a.download = filename; a.download = filename;
console.log(filename);
// 触发下载 // 触发下载
document.body.appendChild(a); document.body.appendChild(a);
a.click(); a.click();

View File

@ -1,13 +1,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { NCheckbox, NCheckboxGroup, NFormItemGi, NGrid, NInput, NSpace } from 'naive-ui'; import { NCheckbox, NCheckboxGroup, NFormItemGi, NGrid, NInput, NSpace } from 'naive-ui';
import { useVmsStore } from '@/store/modules/vms';
import SelectButtonGroup from '@/views/generator-code/components/generator/components/select-button-group.vue'; import SelectButtonGroup from '@/views/generator-code/components/generator/components/select-button-group.vue';
import { import { formOption, formValue } from '@/views/generator-code/components/generator/option';
formOption,
formValue, const vmsStore = useVmsStore();
serverOptions,
webOptions,
} from '@/views/generator-code/components/generator/option';
</script> </script>
<template> <template>
@ -42,14 +40,18 @@ import {
<n-form-item-gi :span="8" label="生成后端" path="generatorServer"> <n-form-item-gi :span="8" label="生成后端" path="generatorServer">
<n-checkbox-group v-model:value="formOption.generatorServer"> <n-checkbox-group v-model:value="formOption.generatorServer">
<n-space> <n-space>
<n-checkbox v-for="(item, index) in serverOptions" :key="index" :value="item.name"> <n-checkbox
v-for="(item, index) in vmsStore.serverOptions"
:key="index"
:value="item.name"
>
{{ item.label }} {{ item.label }}
</n-checkbox> </n-checkbox>
<!-- 选择按钮 --> <!-- 选择按钮 -->
<select-button-group <select-button-group
v-model:selected="formOption.generatorServer" v-model:selected="formOption.generatorServer"
:data="serverOptions" :data="vmsStore.serverOptions"
id-key="name" id-key="name"
/> />
</n-space> </n-space>
@ -58,14 +60,18 @@ import {
<n-form-item-gi :span="8" label="生成前端" path="generatorWeb"> <n-form-item-gi :span="8" label="生成前端" path="generatorWeb">
<n-checkbox-group v-model:value="formOption.generatorWeb"> <n-checkbox-group v-model:value="formOption.generatorWeb">
<n-space> <n-space>
<n-checkbox v-for="(item, index) in webOptions" :key="index" v-model:value="item.name"> <n-checkbox
v-for="(item, index) in vmsStore.webOptions"
:key="index"
v-model:value="item.name"
>
{{ item.label }} {{ item.label }}
</n-checkbox> </n-checkbox>
<!-- 选择按钮 --> <!-- 选择按钮 -->
<select-button-group <select-button-group
v-model:selected="formOption.generatorWeb" v-model:selected="formOption.generatorWeb"
:data="webOptions" :data="vmsStore.webOptions"
id-key="name" id-key="name"
/> />
</n-space> </n-space>

View File

@ -10,10 +10,8 @@ const message = useMessage();
const vmsStore = useVmsStore(); const vmsStore = useVmsStore();
const download = (code: string, filename: string) => { const download = (code: string, filename: string) => {
const extension = filename.includes('web') ? 'ts' : 'java'; filename = filename.split('/')[1];
filename = `${filename.split('/')[1]}.${extension}`; const inputValue = ref(filename);
let inputValue = ref(filename);
dialog.info({ dialog.info({
title: '修改文件名', title: '修改文件名',
@ -24,7 +22,7 @@ const download = (code: string, filename: string) => {
placeholder="Tiny Input" placeholder="Tiny Input"
clearable clearable
value={inputValue.value} value={inputValue.value}
onInput={(value) => (inputValue.value = value)} onInput={(value: any) => (inputValue.value = value)}
/> />
), ),
onPositiveClick: () => { onPositiveClick: () => {

View File

@ -1,6 +1,8 @@
import { reactive } from 'vue'; import { reactive } from 'vue';
import { serverOptions, webOptions } from '@/views/generator-code/components/generator/option'; import { useVmsStore } from '@/store/modules/vms';
const vmsStore = useVmsStore();
export const formOption = reactive({ export const formOption = reactive({
generatorServer: [], generatorServer: [],
@ -32,21 +34,21 @@ export const formValueInit = (tableName: any) => {
/* 全部选择 */ /* 全部选择 */
export const selectAll = () => { export const selectAll = () => {
formOption.generatorServer = serverOptions.map((option: any) => option.name); formOption.generatorServer = vmsStore.serverOptions.map((option: any) => option.name);
formOption.generatorWeb = webOptions.map((option: any) => option.name); formOption.generatorWeb = vmsStore.webOptions.map((option: any) => option.name);
}; };
/* 全部反选 */ /* 全部反选 */
export const selectAllInvert = () => { export const selectAllInvert = () => {
// 反选server // 反选server
const serverNames: string[] = serverOptions.map((item) => item['name']); const serverNames: string[] = vmsStore.serverOptions.map((item) => item['name']);
const generatorServer = formOption.generatorServer; const generatorServer = formOption.generatorServer;
formOption.generatorServer = serverNames.filter( formOption.generatorServer = serverNames.filter(
(name: string) => !generatorServer.includes(name) (name: string) => !generatorServer.includes(name)
); );
// 反选web // 反选web
const webNames: string[] = webOptions.map((item) => item['name']); const webNames: string[] = vmsStore.webOptions.map((item) => item['name']);
const generatorWeb = formOption.generatorWeb; const generatorWeb = formOption.generatorWeb;
formOption.generatorWeb = webNames.filter((name) => !generatorWeb.includes(name)); formOption.generatorWeb = webNames.filter((name) => !generatorWeb.includes(name));
}; };

View File

@ -3,21 +3,28 @@
<generator-form /> <generator-form />
<n-form-item> <n-form-item>
<n-button-group> <n-grid class="justify-items-center" cols="3" x-gap="24">
<n-gi>
<n-button attr-type="button" type="success" @click="selectAll">全部选择</n-button> <n-button attr-type="button" type="success" @click="selectAll">全部选择</n-button>
<n-button attr-type="button" type="warning" @click="selectAllInvert">全部反选</n-button> <n-button attr-type="button" type="warning" @click="selectAllInvert">全部反选</n-button>
<n-button attr-type="button" type="error" @click="selectCancelAll">全选取消</n-button> <n-button attr-type="button" type="error" @click="selectCancelAll">全选取消</n-button>
<n-button attr-type="button" type="info" @click="onSubmit">开始生成</n-button> </n-gi>
<n-gi>
<n-button attr-type="button" type="success" @click="onSubmit">开始生成</n-button>
<n-button attr-type="button" type="error" @click="() => (vmsStore.generators = [])">
清空已生成
</n-button>
<n-button <n-button
:disabled="!(vmsStore.generators.length > 0 && formValue.path.length > 0)" :disabled="!(vmsStore.generators.length > 0)"
attr-type="button" attr-type="button"
type="info" type="primary"
@click="downloadAll" @click="downloadAll"
> >
{{ formValue.path.length }} 下载全部 {{ vmsStore.generators.length }}
下载全部
</n-button> </n-button>
</n-button-group> </n-gi>
</n-grid>
</n-form-item> </n-form-item>
</n-form> </n-form>
@ -26,7 +33,7 @@
</template> </template>
<script lang="tsx" setup> <script lang="tsx" setup>
import { NButton, NButtonGroup, NForm, NFormItem, useMessage } from 'naive-ui'; import { NButton, NForm, NFormItem, NGi, NGrid, useMessage } from 'naive-ui';
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import { toRaw } from 'vue-demi'; import { toRaw } from 'vue-demi';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
@ -55,12 +62,8 @@ const onSubmit = (e: MouseEvent) => {
formRef.value?.validate(async (errors: any) => { formRef.value?.validate(async (errors: any) => {
if (!errors) { if (!errors) {
// //
const generatorWeb = formOption.generatorWeb; const web = formOption.generatorWeb;
const generatorServer = formOption.generatorServer; const server = formOption.generatorServer;
//
const server = generatorServer.map((server: string) => `server/${server}`);
const web = generatorWeb.map((server: string) => `web/${server}`);
// //
formValue.path = [...server, ...web]; formValue.path = [...server, ...web];
@ -85,12 +88,9 @@ const onSubmit = (e: MouseEvent) => {
const downloadAll = () => { const downloadAll = () => {
vmsStore.generators.forEach((vms) => { vmsStore.generators.forEach((vms) => {
const code = vms.code; const code = vms.code;
const path = vms.path; const path = vms.path.split('/')[1];
const extension = path.includes('web') ? 'ts' : 'java'; downloadTextAsFile(code, path);
let filename = `${path.split('/')[1]}.${extension}`;
downloadTextAsFile(code, filename);
}); });
}; };
@ -98,5 +98,7 @@ onMounted(() => {
// //
const tableName: any = route.query.tableName; const tableName: any = route.query.tableName;
formValueInit(tableName); formValueInit(tableName);
vmsStore.getVmsPathList();
}); });
</script> </script>

View File

@ -7,26 +7,6 @@ const validatorFormOption = () => {
return formOption.generatorServer.length > 0 || formOption.generatorWeb.length > 0; return formOption.generatorServer.length > 0 || formOption.generatorWeb.length > 0;
}; };
// 生成服务端内容
export const serverOptions = [
{ name: 'controller', label: 'controller' },
{ name: 'mapper', label: 'mapper' },
{ name: 'resourceMapper', label: 'resourceMapper' },
{ name: 'service', label: 'service' },
{ name: 'serviceImpl', label: 'serviceImpl' },
];
// 生成前端内容
export const webOptions = [
{ name: 'api', label: 'api' },
{ name: 'columns', label: 'columns' },
{ name: 'dialog', label: 'dialog' },
{ name: 'hook', label: 'hook' },
{ name: 'index', label: 'index' },
{ name: 'store', label: 'store' },
{ name: 'types', label: 'types' },
];
// 表单验证 // 表单验证
export const rules: FormRules = { export const rules: FormRules = {
author: { required: true, trigger: ['blur', 'change', 'input'], message: '作者不能为空' }, author: { required: true, trigger: ['blur', 'change', 'input'], message: '作者不能为空' },