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

View File

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

View File

@ -1,10 +1,14 @@
import { defineStore } from 'pinia';
import { generator } from '@/api/vms';
import { generator, getVmsPathList } from '@/api/vms';
export const useVmsStore = defineStore('vmsStore', {
state: () => ({
generators: [],
// 生成服务端内容
serverOptions: [],
// 生成前端内容
webOptions: [],
}),
getters: {},
actions: {
@ -16,8 +20,21 @@ export const useVmsStore = defineStore('vmsStore', {
(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} 数据`);
},
/* 获取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');
a.href = url;
a.download = filename;
console.log(filename);
// 触发下载
document.body.appendChild(a);
a.click();

View File

@ -1,13 +1,11 @@
<script lang="ts" setup>
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 {
formOption,
formValue,
serverOptions,
webOptions,
} from '@/views/generator-code/components/generator/option';
import { formOption, formValue } from '@/views/generator-code/components/generator/option';
const vmsStore = useVmsStore();
</script>
<template>
@ -42,14 +40,18 @@ import {
<n-form-item-gi :span="8" label="生成后端" path="generatorServer">
<n-checkbox-group v-model:value="formOption.generatorServer">
<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 }}
</n-checkbox>
<!-- 选择按钮 -->
<select-button-group
v-model:selected="formOption.generatorServer"
:data="serverOptions"
:data="vmsStore.serverOptions"
id-key="name"
/>
</n-space>
@ -58,14 +60,18 @@ import {
<n-form-item-gi :span="8" label="生成前端" path="generatorWeb">
<n-checkbox-group v-model:value="formOption.generatorWeb">
<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 }}
</n-checkbox>
<!-- 选择按钮 -->
<select-button-group
v-model:selected="formOption.generatorWeb"
:data="webOptions"
:data="vmsStore.webOptions"
id-key="name"
/>
</n-space>

View File

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

View File

@ -1,6 +1,8 @@
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({
generatorServer: [],
@ -32,21 +34,21 @@ export const formValueInit = (tableName: any) => {
/* 全部选择 */
export const selectAll = () => {
formOption.generatorServer = serverOptions.map((option: any) => option.name);
formOption.generatorWeb = webOptions.map((option: any) => option.name);
formOption.generatorServer = vmsStore.serverOptions.map((option: any) => option.name);
formOption.generatorWeb = vmsStore.webOptions.map((option: any) => option.name);
};
/* 全部反选 */
export const selectAllInvert = () => {
// 反选server
const serverNames: string[] = serverOptions.map((item) => item['name']);
const serverNames: string[] = vmsStore.serverOptions.map((item) => item['name']);
const generatorServer = formOption.generatorServer;
formOption.generatorServer = serverNames.filter(
(name: string) => !generatorServer.includes(name)
);
// 反选web
const webNames: string[] = webOptions.map((item) => item['name']);
const webNames: string[] = vmsStore.webOptions.map((item) => item['name']);
const generatorWeb = formOption.generatorWeb;
formOption.generatorWeb = webNames.filter((name) => !generatorWeb.includes(name));
};

View File

@ -3,21 +3,28 @@
<generator-form />
<n-form-item>
<n-button-group>
<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="error" @click="selectCancelAll">全选取消</n-button>
<n-button attr-type="button" type="info" @click="onSubmit">开始生成</n-button>
<n-button
:disabled="!(vmsStore.generators.length > 0 && formValue.path.length > 0)"
attr-type="button"
type="info"
@click="downloadAll"
>
{{ formValue.path.length }}
下载全部
</n-button>
</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="warning" @click="selectAllInvert">全部反选</n-button>
<n-button attr-type="button" type="error" @click="selectCancelAll">全选取消</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
:disabled="!(vmsStore.generators.length > 0)"
attr-type="button"
type="primary"
@click="downloadAll"
>
下载全部 {{ vmsStore.generators.length }}
</n-button>
</n-gi>
</n-grid>
</n-form-item>
</n-form>
@ -26,7 +33,7 @@
</template>
<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 { toRaw } from 'vue-demi';
import { useRoute } from 'vue-router';
@ -55,12 +62,8 @@ const onSubmit = (e: MouseEvent) => {
formRef.value?.validate(async (errors: any) => {
if (!errors) {
//
const generatorWeb = formOption.generatorWeb;
const generatorServer = formOption.generatorServer;
//
const server = generatorServer.map((server: string) => `server/${server}`);
const web = generatorWeb.map((server: string) => `web/${server}`);
const web = formOption.generatorWeb;
const server = formOption.generatorServer;
//
formValue.path = [...server, ...web];
@ -85,12 +88,9 @@ const onSubmit = (e: MouseEvent) => {
const downloadAll = () => {
vmsStore.generators.forEach((vms) => {
const code = vms.code;
const path = vms.path;
const path = vms.path.split('/')[1];
const extension = path.includes('web') ? 'ts' : 'java';
let filename = `${path.split('/')[1]}.${extension}`;
downloadTextAsFile(code, filename);
downloadTextAsFile(code, path);
});
};
@ -98,5 +98,7 @@ onMounted(() => {
//
const tableName: any = route.query.tableName;
formValueInit(tableName);
vmsStore.getVmsPathList();
});
</script>

View File

@ -7,26 +7,6 @@ const validatorFormOption = () => {
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 = {
author: { required: true, trigger: ['blur', 'change', 'input'], message: '作者不能为空' },