瀏覽代碼

上线修改

chengqian 9 月之前
父節點
當前提交
9bd41788aa
共有 35 個文件被更改,包括 45 次插入4119 次删除
  1. 1 1
      server/api/v1/system/app_file.go
  2. 二進制
      server/build/veterans_admin
  3. 0 10
      server/core/server.go
  4. 二進制
      server/uploads/dept/1fdc0f893412ce55f0d2811821b84d3b_20240620205344.jpg
  5. 二進制
      uploadfiles/1718270515.pdf
  6. 二進制
      uploadfiles/1718884112.pptx
  7. 二進制
      uploadfiles/1718884281.xls
  8. 二進制
      uploadfiles/1718884444.xls
  9. 二進制
      uploadfiles/1718886810.pdf
  10. 二進制
      uploadfiles/1718930275.xls
  11. 1 5
      web/.env.development
  12. 6 4
      web/.env.production
  13. 15 0
      web/server.js
  14. 9 6
      web/src/api/appfile.js
  15. 0 142
      web/src/api/autoCode.js
  16. 0 80
      web/src/api/customer.js
  17. 0 97
      web/src/api/exportTemplate.js
  18. 0 27
      web/src/api/initdb.js
  19. 0 42
      web/src/api/system.js
  20. 0 5
      web/src/router/index.js
  21. 9 6
      web/src/utils/request.js
  22. 3 3
      web/src/view/superAdmin/file/file.vue
  23. 0 282
      web/src/view/systemTools/autoCode/component/fieldDialog.vue
  24. 0 82
      web/src/view/systemTools/autoCode/component/previewCodeDialg.vue
  25. 0 1071
      web/src/view/systemTools/autoCode/index.vue
  26. 0 227
      web/src/view/systemTools/autoCodeAdmin/index.vue
  27. 0 205
      web/src/view/systemTools/autoPkg/autoPkg.vue
  28. 0 349
      web/src/view/systemTools/autoPlug/autoPlug.vue
  29. 0 803
      web/src/view/systemTools/exportTemplate/exportTemplate.vue
  30. 0 19
      web/src/view/systemTools/formCreate/index.vue
  31. 0 23
      web/src/view/systemTools/index.vue
  32. 0 40
      web/src/view/systemTools/installPlugin/index.vue
  33. 0 32
      web/src/view/systemTools/pubPlug/pubPlug.vue
  34. 0 557
      web/src/view/systemTools/system/system.vue
  35. 1 1
      web/vite.config.js

+ 1 - 1
server/api/v1/system/app_file.go

@@ -235,5 +235,5 @@ func (b *FileApi) View(c *gin.Context) {
 	parentDir := filepath.Dir(currentDir)
 	data, _ := ioutil.ReadFile(parentDir + file.SavePath)
 	c.Data(http.StatusOK, "application/octet-stream", data)
-
+	response.OkWithMessage("查看成功", c)
 }

二進制
server/build/veterans_admin


+ 0 - 10
server/core/server.go

@@ -36,15 +36,5 @@ func RunWindowsServer() {
 
 	global.GVA_LOG.Info("server run success on ", zap.String("address", address))
 
-	fmt.Printf(`
-	欢迎使用 gin-vue-admin
-	当前版本:v2.6.3
-    加群方式:微信号:shouzi_1994 QQ群:470239250
-	插件市场:https://plugin.gin-vue-admin.com
-	GVA讨论社区:https://support.qq.com/products/371961
-	默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
-	默认前端文件运行地址:http://127.0.0.1:8080
-	如果项目让您获得了收益,希望您能请团队喝杯可乐:https://www.gin-vue-admin.com/coffee/index.html
-`, address)
 	global.GVA_LOG.Error(s.ListenAndServe().Error())
 }

二進制
server/uploads/dept/1fdc0f893412ce55f0d2811821b84d3b_20240620205344.jpg


二進制
uploadfiles/1718270515.pdf


二進制
uploadfiles/1718884112.pptx


二進制
uploadfiles/1718884281.xls


二進制
uploadfiles/1718884444.xls


二進制
uploadfiles/1718886810.pdf


二進制
uploadfiles/1718930275.xls


+ 1 - 5
web/.env.development

@@ -1,11 +1,7 @@
 ENV = 'development'
-VITE_CLI_PORT = 8080
+VITE_CLI_PORT = 8892
 VITE_SERVER_PORT = 8888
 VITE_BASE_API = /api
 VITE_FILE_API = /api
 VITE_BASE_PATH = http://127.0.0.1
-VITE_POSITION = close
 VITE_EDITOR = vscode
-// VITE_EDITOR = webstorm 如果使用webstorm开发且要使用dom定位到代码行功能 请先自定添加 webstorm到环境变量 再将VITE_EDITOR值修改为webstorm
-// 如果使用docker-compose开发模式,设置为下面的地址或本机主机IP
-//VITE_BASE_PATH = http://177.7.0.12

+ 6 - 4
web/.env.production

@@ -1,7 +1,9 @@
 ENV = 'production'
 
 #下方为上线需要用到的程序代理前缀,一般用于nginx代理转发
-VITE_BASE_API = /api
-VITE_FILE_API = /api
-#下方修改为你的线上ip(如果需要在线使用表单构建工具时使用,其余情况无需使用以下环境变量)
-VITE_BASE_PATH = https://demo.gin-vue-admin.com
+VITE_CLI_PORT = 8892
+VITE_SERVER_PORT = 443
+VITE_BASE_API = /veterans_admin_api
+VITE_FILE_API = /veterans_admin_api
+#下方修改为你的线上ip
+VITE_BASE_PATH = https://cloud.long-chi.com

+ 15 - 0
web/server.js

@@ -0,0 +1,15 @@
+const express = require('express');
+const app = express();
+app.use(express.static('./dist'));
+
+//运行时的端口,可以自己自定义
+const port = 7777;
+
+app.listen(port, function (err) {
+    if (err) {
+        console.log(err);
+        return;
+    }
+    console.log('Listening at http://localhost:' + port + '\n');
+});
+

+ 9 - 6
web/src/api/appfile.js

@@ -1,25 +1,28 @@
 import service from '@/utils/request'
 import axios from "axios";
 import * as http from "http";
+import {useUserStore} from "@/pinia/modules/user";
 
+
+const userStore = useUserStore()
 //上传文件
 export const uploadfile = (formdata) =>{
-   return axios({
-        url: "http://localhost:8080/api/appfile/upload",
+    return service({
+        url: '/appfile/upload',
         method: 'post',
         data: formdata,
         headers: {
             'Content-Type': 'multipart/form-data'
-        }
+        },
     })
 }
 //预览文件
 export const previewfile = (data) =>{
-    return axios({
-        url: "http://localhost:8080/api/appfile/preview",
+    return service({
+        url: '/appfile/preview',
         method: 'post',
         data: data,
-        responseType: 'arraybuffer'
+        responseType: 'arraybuffer',
     })
 }
 

+ 0 - 142
web/src/api/autoCode.js

@@ -1,142 +0,0 @@
-import service from '@/utils/request'
-
-export const preview = (data) => {
-  return service({
-    url: '/autoCode/preview',
-    method: 'post',
-    data
-  })
-}
-
-export const createTemp = (data) => {
-  return service({
-    url: '/autoCode/createTemp',
-    method: 'post',
-    data,
-    responseType: 'blob'
-  })
-}
-
-// @Tags SysApi
-// @Summary 获取当前所有数据库
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router /autoCode/getDatabase [get]
-export const getDB = (params) => {
-  return service({
-    url: '/autoCode/getDB',
-    method: 'get',
-    params
-  })
-}
-
-// @Tags SysApi
-// @Summary 获取当前数据库所有表
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router /autoCode/getTables [get]
-export const getTable = (params) => {
-  return service({
-    url: '/autoCode/getTables',
-    method: 'get',
-    params
-  })
-}
-
-// @Tags SysApi
-// @Summary 获取当前数据库所有表
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router /autoCode/getColumn [get]
-export const getColumn = (params) => {
-  return service({
-    url: '/autoCode/getColumn',
-    method: 'get',
-    params
-  })
-}
-
-export const getSysHistory = (data) => {
-  return service({
-    url: '/autoCode/getSysHistory',
-    method: 'post',
-    data
-  })
-}
-
-export const rollback = (data) => {
-  return service({
-    url: '/autoCode/rollback',
-    method: 'post',
-    data
-  })
-}
-
-export const getMeta = (data) => {
-  return service({
-    url: '/autoCode/getMeta',
-    method: 'post',
-    data
-  })
-}
-
-export const delSysHistory = (data) => {
-  return service({
-    url: '/autoCode/delSysHistory',
-    method: 'post',
-    data
-  })
-}
-
-export const createPackageApi = (data) => {
-  return service({
-    url: '/autoCode/createPackage',
-    method: 'post',
-    data
-  })
-}
-
-export const getPackageApi = () => {
-  return service({
-    url: '/autoCode/getPackage',
-    method: 'post'
-  })
-}
-
-export const deletePackageApi = (data) => {
-  return service({
-    url: '/autoCode/delPackage',
-    method: 'post',
-    data
-  })
-}
-
-export const createPlugApi = (data) => {
-  return service({
-    url: '/autoCode/createPlug',
-    method: 'post',
-    data
-  })
-}
-
-export const installPlug = (data) => {
-  return service({
-    url: '/autoCode/installPlug',
-    method: 'post',
-    data
-  })
-}
-
-export const pubPlug = (params) => {
-  return service({
-    url: '/autoCode/pubPlug',
-    method: 'post',
-    params
-  })
-}

+ 0 - 80
web/src/api/customer.js

@@ -1,80 +0,0 @@
-import service from '@/utils/request'
-// @Tags SysApi
-// @Summary 删除客户
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body dbModel.ExaCustomer true "删除客户"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /customer/customer [post]
-export const createExaCustomer = (data) => {
-  return service({
-    url: '/customer/customer',
-    method: 'post',
-    data
-  })
-}
-
-// @Tags SysApi
-// @Summary 更新客户信息
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body dbModel.ExaCustomer true "更新客户信息"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /customer/customer [put]
-export const updateExaCustomer = (data) => {
-  return service({
-    url: '/customer/customer',
-    method: 'put',
-    data
-  })
-}
-
-// @Tags SysApi
-// @Summary 创建客户
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body dbModel.ExaCustomer true "创建客户"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /customer/customer [delete]
-export const deleteExaCustomer = (data) => {
-  return service({
-    url: '/customer/customer',
-    method: 'delete',
-    data
-  })
-}
-
-// @Tags SysApi
-// @Summary 获取单一客户信息
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body dbModel.ExaCustomer true "获取单一客户信息"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /customer/customer [get]
-export const getExaCustomer = (params) => {
-  return service({
-    url: '/customer/customer',
-    method: 'get',
-    params
-  })
-}
-
-// @Tags SysApi
-// @Summary 获取权限客户列表
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body modelInterface.PageInfo true "获取权限客户列表"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /customer/customerList [get]
-export const getExaCustomerList = (params) => {
-  return service({
-    url: '/customer/customerList',
-    method: 'get',
-    params
-  })
-}

+ 0 - 97
web/src/api/exportTemplate.js

@@ -1,97 +0,0 @@
-import service from '@/utils/request'
-
-// @Tags SysExportTemplate
-// @Summary 创建导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body model.SysExportTemplate true "创建导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router /sysExportTemplate/createSysExportTemplate [post]
-export const createSysExportTemplate = (data) => {
-  return service({
-    url: '/sysExportTemplate/createSysExportTemplate',
-    method: 'post',
-    data
-  })
-}
-
-// @Tags SysExportTemplate
-// @Summary 删除导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body model.SysExportTemplate true "删除导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
-// @Router /sysExportTemplate/deleteSysExportTemplate [delete]
-export const deleteSysExportTemplate = (data) => {
-  return service({
-    url: '/sysExportTemplate/deleteSysExportTemplate',
-    method: 'delete',
-    data
-  })
-}
-
-// @Tags SysExportTemplate
-// @Summary 批量删除导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body request.IdsReq true "批量删除导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
-// @Router /sysExportTemplate/deleteSysExportTemplate [delete]
-export const deleteSysExportTemplateByIds = (data) => {
-  return service({
-    url: '/sysExportTemplate/deleteSysExportTemplateByIds',
-    method: 'delete',
-    data
-  })
-}
-
-// @Tags SysExportTemplate
-// @Summary 更新导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body model.SysExportTemplate true "更新导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
-// @Router /sysExportTemplate/updateSysExportTemplate [put]
-export const updateSysExportTemplate = (data) => {
-  return service({
-    url: '/sysExportTemplate/updateSysExportTemplate',
-    method: 'put',
-    data
-  })
-}
-
-// @Tags SysExportTemplate
-// @Summary 用id查询导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data query model.SysExportTemplate true "用id查询导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
-// @Router /sysExportTemplate/findSysExportTemplate [get]
-export const findSysExportTemplate = (params) => {
-  return service({
-    url: '/sysExportTemplate/findSysExportTemplate',
-    method: 'get',
-    params
-  })
-}
-
-// @Tags SysExportTemplate
-// @Summary 分页获取导出模板列表
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data query request.PageInfo true "分页获取导出模板列表"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /sysExportTemplate/getSysExportTemplateList [get]
-export const getSysExportTemplateList = (params) => {
-  return service({
-    url: '/sysExportTemplate/getSysExportTemplateList',
-    method: 'get',
-    params
-  })
-}

+ 0 - 27
web/src/api/initdb.js

@@ -1,27 +0,0 @@
-import service from '@/utils/request'
-// @Tags InitDB
-// @Summary 初始化用户数据库
-// @Produce  application/json
-// @Param data body request.InitDB true "初始化数据库参数"
-// @Success 200 {string} string "{"code":0,"data":{},"msg":"自动创建数据库成功"}"
-// @Router /init/initdb [post]
-export const initDB = (data) => {
-  return service({
-    url: '/init/initdb',
-    method: 'post',
-    data,
-    donNotShowLoading: true
-  })
-}
-
-// @Tags CheckDB
-// @Summary 初始化用户数据库
-// @Produce  application/json
-// @Success 200 {string} string "{"code":0,"data":{},"msg":"探测完成"}"
-// @Router /init/checkdb [post]
-export const checkDB = () => {
-  return service({
-    url: '/init/checkdb',
-    method: 'post'
-  })
-}

+ 0 - 42
web/src/api/system.js

@@ -1,42 +0,0 @@
-import service from '@/utils/request'
-// @Tags systrm
-// @Summary 获取配置文件内容
-// @Security ApiKeyAuth
-// @Produce  application/json
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
-// @Router /system/getSystemConfig [post]
-export const getSystemConfig = () => {
-  return service({
-    url: '/system/getSystemConfig',
-    method: 'post'
-  })
-}
-
-// @Tags system
-// @Summary 设置配置文件内容
-// @Security ApiKeyAuth
-// @Produce  application/json
-// @Param data body sysModel.System true
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
-// @Router /system/setSystemConfig [post]
-export const setSystemConfig = (data) => {
-  return service({
-    url: '/system/setSystemConfig',
-    method: 'post',
-    data
-  })
-}
-
-// @Tags system
-// @Summary 获取服务器运行状态
-// @Security ApiKeyAuth
-// @Produce  application/json
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"返回成功"}"
-// @Router /system/getServerInfo [post]
-export const getSystemState = () => {
-  return service({
-    url: '/system/getServerInfo',
-    method: 'post',
-    donNotShowLoading: true
-  })
-}

+ 0 - 5
web/src/router/index.js

@@ -4,11 +4,6 @@ const routes = [{
   path: '/',
   redirect: '/login'
 },
-{
-  path: '/init',
-  name: 'Init',
-  component: () => import('@/view/init/index.vue')
-},
 {
   path: '/login',
   name: 'Login',

+ 9 - 6
web/src/utils/request.js

@@ -72,17 +72,20 @@ service.interceptors.response.use(
     if (response.headers['new-token']) {
       userStore.setToken(response.headers['new-token'])
     }
-    if (response.data.code === 0 || response.headers.success === 'true') {
+    if (response.data.code === 0 || response.headers.success === 'true')  {
       if (response.headers.msg) {
         response.data.msg = decodeURI(response.headers.msg)
       }
       return response.data
     } else {
-      ElMessage({
-        showClose: true,
-        message: response.data.msg || decodeURI(response.headers.msg),
-        type: 'error'
-      })
+      if (response.config.responseType === 'arraybuffer'){
+      }else {
+        ElMessage({
+          showClose: true,
+          message: response.data.msg || decodeURI(response.headers.msg),
+          type: 'error'
+        })
+      }
       return response.data.msg ? response.data : response
     }
   },

+ 3 - 3
web/src/view/superAdmin/file/file.vue

@@ -55,7 +55,7 @@
       <el-table-column prop="id" label="ID" width="200" />
       <el-table-column prop="icon" label="图标"  width="100">
         <template #default="scope">
-          <el-image style="width: 50px;height: 50px;" :src="'http://localhost:8888/form-generator/icons/'+scope.row.icon"></el-image>
+          <el-image style="width: 50px;height: 50px;" :src="fileApiUrl+'/form-generator/icons/'+scope.row.icon"></el-image>
         </template>
       </el-table-column>
       <el-table-column prop="originalName" label="文件名" />
@@ -210,6 +210,7 @@ import { ref,reactive } from 'vue'
 import {Share} from '@element-plus/icons-vue'
 import {ElMessage, ElMessageBox} from "element-plus";
 import CryptoJS from 'crypto-js';
+const fileApiUrl = import.meta.env.VITE_FILE_API;
 const page = ref(1)
 const total = ref(0)
 const pageSize = ref(10)
@@ -313,7 +314,7 @@ const enterAddFileDialog = async() => {
           formData.append('iv',CryptoJS.enc.Base64.stringify(iv))
           formData.append('file',encryptedFile)
           var res = await uploadfile(formData);
-          if (res.data.code === 0) {
+          if (res.code === 0) {
             ElMessage({ type: 'success', message: '上传成功' })
              getTableData()
             closeAddFileDialog()
@@ -343,7 +344,6 @@ const preview = async(obj) => {
   const key = CryptoJS.enc.Utf8.parse('vMmD8A9nGi5D9Org')
 
   const encryptedWordArray = CryptoJS.lib.WordArray.create(res.data);
-  console.log(res.data)
   const decrypted = CryptoJS.AES.decrypt({ ciphertext: encryptedWordArray }, key, { iv: iv });
   const arrayBuffer = wordArrayToArrayBuffer(decrypted);
 

+ 0 - 282
web/src/view/systemTools/autoCode/component/fieldDialog.vue

@@ -1,282 +0,0 @@
-<template>
-  <div>
-    <warning-bar title="id , created_at , updated_at , deleted_at 会自动生成请勿重复创建。搜索时如果条件为LIKE只支持字符串" />
-    <el-form
-      ref="fieldDialogFrom"
-      :model="middleDate"
-      label-width="120px"
-      label-position="right"
-      :rules="rules"
-      class="grid grid-cols-2"
-    >
-      <el-form-item
-        label="字段名称"
-        prop="fieldName"
-      >
-        <el-input
-          v-model="middleDate.fieldName"
-          autocomplete="off"
-          style="width:80%"
-        />
-        <el-button
-          style="width:18%;margin-left:2%"
-          @click="autoFill"
-        >
-          <span style="font-size: 12px">自动填充</span>
-        </el-button>
-      </el-form-item>
-      <el-form-item
-        label="字段中文名"
-        prop="fieldDesc"
-      >
-        <el-input
-          v-model="middleDate.fieldDesc"
-          autocomplete="off"
-        />
-      </el-form-item>
-      <el-form-item
-        label="字段JSON"
-        prop="fieldJson"
-      >
-        <el-input
-          v-model="middleDate.fieldJson"
-          autocomplete="off"
-        />
-      </el-form-item>
-      <el-form-item
-        label="数据库字段名"
-        prop="columnName"
-      >
-        <el-input
-          v-model="middleDate.columnName"
-          autocomplete="off"
-        />
-      </el-form-item>
-      <el-form-item
-        label="数据库字段描述"
-        prop="comment"
-      >
-        <el-input
-          v-model="middleDate.comment"
-          autocomplete="off"
-        />
-      </el-form-item>
-      <el-form-item
-        label="字段类型"
-        prop="fieldType"
-      >
-        <el-select
-          v-model="middleDate.fieldType"
-          style="width:100%"
-          placeholder="请选择字段类型"
-          clearable
-          @change="clearOther"
-        >
-          <el-option
-            v-for="item in typeOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-            :disabled="item.disabled"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item
-        :label="middleDate.fieldType === 'enum' ? '枚举值' : '类型长度'"
-        prop="dataTypeLong"
-      >
-        <el-input
-          v-model="middleDate.dataTypeLong"
-          :placeholder="middleDate.fieldType === 'enum'?`例:'北京','天津'`:'数据库类型长度'"
-        />
-      </el-form-item>
-      <el-form-item
-        label="字段查询条件"
-        prop="fieldSearchType"
-      >
-        <el-select
-          v-model="middleDate.fieldSearchType"
-          :disabled="middleDate.fieldType === 'json'"
-          style="width:100%"
-          placeholder="请选择字段查询条件"
-          clearable
-        >
-          <el-option
-            v-for="item in typeSearchOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-            :disabled="canSelect(item.value)"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item
-        label="关联字典"
-        prop="dictType"
-      >
-        <el-select
-          v-model="middleDate.dictType"
-          style="width:100%"
-          :disabled="middleDate.fieldType!=='string'"
-          placeholder="请选择字典"
-          clearable
-        >
-          <el-option
-            v-for="item in dictOptions"
-            :key="item.type"
-            :label="`${item.type}(${item.name})`"
-            :value="item.type"
-          />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="默认值">
-        <el-input
-          v-model="middleDate.defaultValue"
-          placeholder="请输入默认值"
-        />
-      </el-form-item>
-      <el-form-item label="主键">
-        <el-checkbox v-model="middleDate.primaryKey" />
-      </el-form-item>
-      <el-form-item label="前端可见">
-        <el-switch v-model="middleDate.front" />
-      </el-form-item>
-      <el-form-item label="是否排序">
-        <el-switch v-model="middleDate.sort" />
-      </el-form-item>
-      <el-form-item label="是否必填">
-        <el-switch v-model="middleDate.require" />
-      </el-form-item>
-      <el-form-item label="是否可清空">
-        <el-switch v-model="middleDate.clearable" />
-      </el-form-item>
-      <el-form-item label="校验失败文案">
-        <el-input v-model="middleDate.errorText" />
-      </el-form-item>
-    </el-form>
-    <el-collapse v-model="activeNames">
-      <el-collapse-item
-          title="数据源配置(此配置为高级配置,如编程基础不牢,可能导致自动化代码不可用)"
-          name="1"
-      >
-        <el-row :gutter="8">
-          <el-col
-              :span="8"
-          >
-            <el-input
-                v-model="middleDate.dataSource.table"
-                placeholder="数据源表"
-            />
-          </el-col>
-          <el-col
-              :span="8"
-          >
-            <el-input
-                v-model="middleDate.dataSource.label"
-                placeholder="展示用字段"
-            />
-          </el-col>
-          <el-col
-              :span="8"
-          >
-            <el-input
-                v-model="middleDate.dataSource.value"
-                placeholder="存储用字端"
-            />
-          </el-col>
-        </el-row>
-      </el-collapse-item>
-    </el-collapse>
-  </div>
-</template>
-
-<script setup>
-import { toLowerCase, toSQLLine } from '@/utils/stringFun'
-import { getSysDictionaryList } from '@/api/sysDictionary'
-import WarningBar from '@/components/warningBar/warningBar.vue'
-import { ref } from 'vue'
-
-defineOptions({
-  name: 'FieldDialog'
-})
-
-const props = defineProps({
-  dialogMiddle: {
-    type: Object,
-    default: function() {
-      return {}
-    }
-  },
-  typeOptions: {
-    type: Array,
-    default: function() {
-      return []
-    }
-  },
-  typeSearchOptions: {
-    type: Array,
-    default: function() {
-      return []
-    }
-  },
-})
-
-const activeNames = ref([])
-
-const middleDate = ref({})
-const dictOptions = ref([])
-
-const rules = ref({
-  fieldName: [
-    { required: true, message: '请输入字段英文名', trigger: 'blur' }
-  ],
-  fieldDesc: [
-    { required: true, message: '请输入字段中文名', trigger: 'blur' }
-  ],
-  fieldJson: [
-    { required: true, message: '请输入字段格式化json', trigger: 'blur' }
-  ],
-  columnName: [
-    { required: true, message: '请输入数据库字段', trigger: 'blur' }
-  ],
-  fieldType: [
-    { required: true, message: '请选择字段类型', trigger: 'blur' }
-  ]
-})
-
-const init = async() => {
-  middleDate.value = props.dialogMiddle
-  const dictRes = await getSysDictionaryList({
-    page: 1,
-    pageSize: 999999
-  })
-
-  dictOptions.value = dictRes.data
-}
-init()
-
-const autoFill = () => {
-  middleDate.value.fieldJson = toLowerCase(middleDate.value.fieldName)
-  middleDate.value.columnName = toSQLLine(middleDate.value.fieldJson)
-}
-
-const canSelect = (item) => {
-  const fieldType = middleDate.value.fieldType
-  if (fieldType !== 'string' && item === 'LIKE') {
-    return true
-  }
-
-  if ((fieldType !== 'int' && fieldType !== 'time.Time' && fieldType !== 'float64') && (item === 'BETWEEN' || item === 'NOT BETWEEN')) {
-    return true
-  }
-  return false
-}
-
-const clearOther = () => {
-  middleDate.value.fieldSearchType = ''
-  middleDate.value.dictType = ''
-}
-
-const fieldDialogFrom = ref(null)
-defineExpose({ fieldDialogFrom })
-</script>

+ 0 - 82
web/src/view/systemTools/autoCode/component/previewCodeDialg.vue

@@ -1,82 +0,0 @@
-<template>
-  <el-tabs v-model="activeName">
-    <el-tab-pane
-      v-for="(item, key) in previewCode"
-      :key="key"
-      :label="key"
-      :name="key"
-    >
-      <div
-        :id="key"
-        class="h-[calc(100vh-160px)] bg-white px-5 overflow-y-scroll"
-      />
-    </el-tab-pane>
-  </el-tabs>
-</template>
-
-<script setup>
-import { marked } from 'marked'
-import hljs from 'highlight.js'
-import 'highlight.js/styles/atom-one-dark.css'
-import { ElMessage } from 'element-plus'
-import { onMounted, ref } from 'vue'
-
-const props = defineProps({
-  previewCode: {
-    type: Object,
-    default() {
-      return {}
-    }
-  }
-})
-
-const activeName = ref('')
-onMounted(() => {
-  marked.setOptions({
-    renderer: new marked.Renderer(),
-    highlight: function(code) {
-      return hljs.highlightAuto(code).value
-    },
-    pedantic: false,
-    gfm: true,
-    tables: true,
-    breaks: false,
-    sanitize: false,
-    smartLists: true,
-    smartypants: false,
-    xhtml: false,
-    langPrefix: 'hljs language-'
-  })
-  for (const key in props.previewCode) {
-    if (activeName.value === '') {
-      activeName.value = key
-    }
-    document.getElementById(key).innerHTML = marked(props.previewCode[key])
-  }
-})
-
-const selectText = () => {
-  const element = document.getElementById(activeName.value)
-  if (document.body.createTextRange) {
-    const range = document.body.createTextRange()
-    range.moveToElementText(element)
-    range.select()
-  } else if (window.getSelection) {
-    const selection = window.getSelection()
-    const range = document.createRange()
-    range.selectNodeContents(element)
-    selection.removeAllRanges()
-    selection.addRange(range)
-  } else {
-    alert('none')
-  }
-}
-const copy = () => {
-  selectText()
-  document.execCommand('copy')
-  ElMessage.success('复制成功')
-}
-
-defineExpose({ copy })
-
-</script>

文件差異過大導致無法顯示
+ 0 - 1071
web/src/view/systemTools/autoCode/index.vue


+ 0 - 227
web/src/view/systemTools/autoCodeAdmin/index.vue

@@ -1,227 +0,0 @@
-<template>
-  <div>
-    <div class="gva-table-box">
-      <div class="gva-btn-list">
-        <el-button
-          type="primary"
-          icon="plus"
-          @click="goAutoCode(null)"
-        >新增</el-button>
-      </div>
-      <el-table :data="tableData">
-        <el-table-column
-          type="selection"
-          width="55"
-        />
-        <el-table-column
-          align="left"
-          label="id"
-          width="60"
-          prop="ID"
-        />
-        <el-table-column
-          align="left"
-          label="日期"
-          width="180"
-        >
-          <template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
-        </el-table-column>
-        <el-table-column
-          align="left"
-          label="结构体名"
-          min-width="150"
-          prop="structName"
-        />
-        <el-table-column
-          align="left"
-          label="结构体描述"
-          min-width="150"
-          prop="structCNName"
-        />
-        <el-table-column
-          align="left"
-          label="表名称"
-          min-width="150"
-          prop="tableName"
-        />
-        <el-table-column
-          align="left"
-          label="回滚标记"
-          min-width="150"
-          prop="flag"
-        >
-          <template #default="scope">
-            <el-tag
-              v-if="scope.row.flag"
-              type="danger"
-
-              effect="dark"
-            >
-              已回滚
-            </el-tag>
-            <el-tag
-              v-else
-
-              type="success"
-              effect="dark"
-            >
-              未回滚
-            </el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column
-          align="left"
-          label="操作"
-          min-width="240"
-        >
-          <template #default="scope">
-            <div>
-              <el-button
-                type="primary"
-                link
-                :disabled="scope.row.flag === 1"
-                @click="rollbackFunc(scope.row,true)"
-              >回滚(删表)</el-button>
-              <el-button
-                type="primary"
-                link
-                :disabled="scope.row.flag === 1"
-                @click="rollbackFunc(scope.row,false)"
-              >回滚(不删表)</el-button>
-              <el-button
-                type="primary"
-                link
-                @click="goAutoCode(scope.row)"
-              >复用</el-button>
-              <el-button
-                type="primary"
-                link
-                @click="deleteRow(scope.row)"
-              >删除</el-button>
-            </div>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="gva-pagination">
-        <el-pagination
-          :current-page="page"
-          :page-size="pageSize"
-          :page-sizes="[10, 30, 50, 100]"
-          :total="total"
-          layout="total, sizes, prev, pager, next, jumper"
-          @current-change="handleCurrentChange"
-          @size-change="handleSizeChange"
-        />
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { getSysHistory, rollback, delSysHistory } from '@/api/autoCode.js'
-import { useRouter } from 'vue-router'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { ref } from 'vue'
-import { formatDate } from '@/utils/format'
-
-defineOptions({
-  name: 'AutoCodeAdmin'
-})
-
-const router = useRouter()
-
-const page = ref(1)
-const total = ref(0)
-const pageSize = ref(10)
-const tableData = ref([])
-
-// 分页
-const handleSizeChange = (val) => {
-  pageSize.value = val
-  getTableData()
-}
-
-const handleCurrentChange = (val) => {
-  page.value = val
-  getTableData()
-}
-
-// 查询
-const getTableData = async() => {
-  const table = await getSysHistory({
-    page: page.value,
-    pageSize: pageSize.value
-  })
-  if (table.code === 0) {
-    tableData.value = table.data.list
-    total.value = table.data.total
-    page.value = table.data.page
-    pageSize.value = table.data.pageSize
-  }
-}
-
-getTableData()
-
-const deleteRow = async(row) => {
-  ElMessageBox.confirm('此操作将删除本历史, 是否继续?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(async() => {
-    const res = await delSysHistory({ id: Number(row.ID) })
-    if (res.code === 0) {
-      ElMessage.success('删除成功')
-      getTableData()
-    }
-  })
-}
-const rollbackFunc = async(row, flag) => {
-  if (flag) {
-    ElMessageBox.confirm(`此操作将删除自动创建的文件和api(会删除表!!!), 是否继续?`, '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    }).then(async() => {
-      ElMessageBox.confirm(`此操作将删除自动创建的文件和api(会删除表!!!), 请继续确认!!!`, '会删除表', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(async() => {
-        ElMessageBox.confirm(`此操作将删除自动创建的文件和api(会删除表!!!), 请继续确认!!!`, '会删除表', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }).then(async() => {
-          const res = await rollback({ id: Number(row.ID), deleteTable: flag })
-          if (res.code === 0) {
-            ElMessage.success('回滚成功')
-            getTableData()
-          }
-        })
-      })
-    })
-  } else {
-    ElMessageBox.confirm(`此操作将删除自动创建的文件和api, 是否继续?`, '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    }).then(async() => {
-      const res = await rollback({ id: Number(row.ID), deleteTable: flag })
-      if (res.code === 0) {
-        ElMessage.success('回滚成功')
-        getTableData()
-      }
-    })
-  }
-}
-const goAutoCode = (row) => {
-  if (row) {
-    router.push({ name: 'autoCodeEdit', params: {
-      id: row.ID
-    }})
-  } else {
-    router.push({ name: 'autoCode' })
-  }
-}
-
-</script>

+ 0 - 205
web/src/view/systemTools/autoPkg/autoPkg.vue

@@ -1,205 +0,0 @@
-<template>
-  <div>
-    <div class="gva-table-box">
-      <div class="gva-btn-list gap-3 flex items-center">
-        <el-button
-          type="primary"
-          icon="plus"
-          @click="openDialog('addApi')"
-        >新增</el-button>
-      </div>
-      <el-table :data="tableData">
-        <el-table-column
-          align="left"
-          label="id"
-          width="60"
-          prop="ID"
-        />
-        <el-table-column
-          align="left"
-          label="包名"
-          width="150"
-          prop="packageName"
-        />
-        <el-table-column
-          align="left"
-          label="展示名"
-          width="150"
-          prop="label"
-        />
-        <el-table-column
-          align="left"
-          label="描述"
-          min-width="150"
-          prop="desc"
-        />
-
-        <el-table-column
-          align="left"
-          label="操作"
-          width="200"
-        >
-          <template #default="scope">
-            <el-button
-              icon="delete"
-
-              type="primary"
-              link
-              @click="deleteApiFunc(scope.row)"
-            >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-
-    </div>
-
-    <el-dialog
-      v-model="dialogFormVisible"
-      :before-close="closeDialog"
-      title="创建Package"
-    >
-      <warning-bar title="新增Pkg用于自动化代码使用" />
-      <el-form
-        ref="pkgForm"
-        :model="form"
-        :rules="rules"
-        label-width="80px"
-      >
-        <el-form-item
-          label="包名"
-          prop="packageName"
-        >
-          <el-input
-            v-model="form.packageName"
-            autocomplete="off"
-          />
-        </el-form-item>
-        <el-form-item
-          label="展示名"
-          prop="label"
-        >
-          <el-input
-            v-model="form.label"
-            autocomplete="off"
-          />
-        </el-form-item>
-        <el-form-item
-          label="描述"
-          prop="desc"
-        >
-          <el-input
-            v-model="form.desc"
-            autocomplete="off"
-          />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="closeDialog">取 消</el-button>
-          <el-button
-            type="primary"
-            @click="enterDialog"
-          >确 定</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup>
-import {
-  createPackageApi,
-  getPackageApi,
-  deletePackageApi,
-} from '@/api/autoCode'
-import { ref } from 'vue'
-import WarningBar from '@/components/warningBar/warningBar.vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { toDoc } from '@/utils/doc'
-import { VideoCameraFilled } from '@element-plus/icons-vue'
-
-defineOptions({
-  name: 'AutoPkg',
-})
-
-const form = ref({
-  packageName: '',
-  label: '',
-  desc: '',
-})
-
-const validateNum = (rule, value, callback) => {
-  if ((/^\d+$/.test(value[0]))) {
-    callback(new Error('不能够以数字开头'))
-  } else {
-    callback()
-  }
-}
-
-const rules = ref({
-  packageName: [
-    { required: true, message: '请输入包名', trigger: 'blur' },
-    { validator: validateNum, trigger: 'blur' }
-  ],
-})
-
-const dialogFormVisible = ref(false)
-const openDialog = () => {
-  dialogFormVisible.value = true
-}
-
-const closeDialog = () => {
-  dialogFormVisible.value = false
-  form.value = {
-    packageName: '',
-    label: '',
-    desc: '',
-  }
-}
-
-const pkgForm = ref(null)
-const enterDialog = async() => {
-  pkgForm.value.validate(async valid => {
-    if (valid) {
-      const res = await createPackageApi(form.value)
-      if (res.code === 0) {
-        ElMessage({
-          type: 'success',
-          message: '添加成功',
-          showClose: true
-        })
-      }
-      getTableData()
-      closeDialog()
-    }
-  })
-}
-
-const tableData = ref([])
-const getTableData = async() => {
-  const table = await getPackageApi()
-  if (table.code === 0) {
-    tableData.value = table.data.pkgs
-  }
-}
-
-const deleteApiFunc = async(row) => {
-  ElMessageBox.confirm('此操作仅删除数据库中的pkg存储,后端相应目录结构请自行删除与数据库保持一致!', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  })
-    .then(async() => {
-      const res = await deletePackageApi(row)
-      if (res.code === 0) {
-        ElMessage({
-          type: 'success',
-          message: '删除成功!'
-        })
-        getTableData()
-      }
-    })
-}
-
-getTableData()
-</script>

+ 0 - 349
web/src/view/systemTools/autoPlug/autoPlug.vue

@@ -1,349 +0,0 @@
-<template>
-  <div>
-    <div class="gva-table-box">
-      <el-form
-        label-width="140px"
-        class="w-[680px]"
-      >
-        <el-form-item label="插件名">
-          <el-input
-            v-model="form.plugName"
-            placeholder="必填(英文大写字母开头)"
-            @blur="titleCase"
-          />
-        </el-form-item>
-        <el-form-item label="路由组">
-          <el-input
-            v-model="form.routerGroup"
-            placeholder="将会作为插件路由组使用"
-          />
-        </el-form-item>
-        <el-form-item label="使用全局属性">
-          <el-checkbox v-model="form.hasGlobal" />
-        </el-form-item>
-        <el-form-item
-          v-if="form.hasGlobal"
-          label="全局属性"
-        >
-          <div
-            v-for="(i,k) in form.global"
-            :key="k"
-            class="plug-row"
-          >
-            <span>
-              <el-input
-                v-model="i.key"
-                placeholder="key 必填"
-              />
-            </span>
-            <span>
-              <el-select
-                class="w-32"
-                v-model="i.type"
-                placeholder="type 必填"
-              >
-                <el-option
-                  label="string"
-                  value="string"
-                />
-                <el-option
-                  label="int"
-                  value="int"
-                />
-                <el-option
-                  label="float32"
-                  value="float32"
-                />
-                <el-option
-                  label="float64"
-                  value="float64"
-                />
-                <el-option
-                  label="bool"
-                  value="bool"
-                />
-              </el-select>
-            </span>
-            <span>
-              <el-input
-                v-model="i.desc"
-                placeholder="备注 必填"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Plus"
-                circle
-                @click="addkv(form.global)"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Minus"
-                circle
-                @click="minkv(form.global,k)"
-              />
-            </span>
-          </div>
-        </el-form-item>
-        <el-form-item label="使用Request">
-          <el-checkbox v-model="form.hasRequest" />
-        </el-form-item>
-        <el-form-item
-          v-if="form.hasRequest"
-          label="Request"
-        >
-          <div
-            v-for="(i,k) in form.request"
-            :key="k"
-            class="plug-row"
-          >
-            <span>
-              <el-input
-                v-model="i.key"
-                placeholder="key 必填"
-              />
-            </span>
-            <span>
-              <el-select
-                v-model="i.type"
-                class="w-32"
-                placeholder="type 必填"
-              >
-                <el-option
-                  label="string"
-                  value="string"
-                />
-                <el-option
-                  label="int"
-                  value="int"
-                />
-                <el-option
-                  label="float32"
-                  value="float32"
-                />
-                <el-option
-                  label="float64"
-                  value="float64"
-                />
-                <el-option
-                  label="bool"
-                  value="bool"
-                />
-              </el-select>
-            </span>
-            <span>
-              <el-input
-                v-model="i.desc"
-                placeholder="备注 必填"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Plus"
-                circle
-                @click="addkv(form.request)"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Minus"
-                circle
-                @click="minkv(form.request,k)"
-              />
-            </span>
-          </div>
-        </el-form-item>
-        <el-form-item label="使用Response">
-          <el-checkbox v-model="form.hasResponse" />
-        </el-form-item>
-        <el-form-item
-          v-if="form.hasResponse"
-          label="Response"
-        >
-          <div
-            v-for="(i,k) in form.response"
-            :key="k"
-            class="plug-row"
-          >
-            <span>
-              <el-input
-                v-model="i.key"
-                placeholder="key 必填"
-              />
-            </span>
-            <span>
-              <el-select
-                v-model="i.type"
-                class="w-32"
-                placeholder="type 必填"
-              >
-                <el-option
-                  label="string"
-                  value="string"
-                />
-                <el-option
-                  label="int"
-                  value="int"
-                />
-                <el-option
-                  label="float32"
-                  value="float32"
-                />
-                <el-option
-                  label="float64"
-                  value="float64"
-                />
-                <el-option
-                  label="bool"
-                  value="bool"
-                />
-              </el-select>
-            </span>
-            <span>
-              <el-input
-                v-model="i.desc"
-                placeholder="备注 必填"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Plus"
-                circle
-                @click="addkv(form.response)"
-              />
-            </span>
-            <span>
-              <el-button
-                :icon="Minus"
-                circle
-                @click="minkv(form.response,k)"
-              />
-            </span>
-          </div>
-        </el-form-item>
-        <el-form-item>
-          <el-button
-            type="primary"
-            @click="createPlug"
-          >创建</el-button>
-        </el-form-item>
-      </el-form>
-
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { toUpperCase } from '@/utils/stringFun'
-
-import {
-  Plus,
-  Minus, VideoCameraFilled
-} from '@element-plus/icons-vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-
-import { createPlugApi } from '@/api/autoCode.js'
-
-import { reactive } from 'vue'
-import { toDoc } from '@/utils/doc'
-
-const form = reactive({
-  plugName: '',
-  routerGroup: '',
-  hasGlobal: true,
-  hasRequest: true,
-  hasResponse: true,
-  global: [{
-    key: '',
-    type: '',
-    desc: '',
-  }],
-  request: [{
-    key: '',
-    type: '',
-    desc: '',
-  }],
-  response: [{
-    key: '',
-    type: '',
-    desc: '',
-  }]
-})
-
-const titleCase = () => {
-  form.plugName = toUpperCase(form.plugName)
-}
-
-const createPlug = async() => {
-  if (!form.plugName || !form.routerGroup) {
-    ElMessage.error('插件名称和插件路由组为必填项')
-    return
-  }
-  if (form.hasGlobal) {
-    const intercept = form.global.some(i => {
-      if (!i.key || !i.type) {
-        return true
-      }
-    })
-    if (intercept) {
-      ElMessage.error('全局属性的key和type为必填项')
-      return
-    }
-  }
-  if (form.hasRequest) {
-    const intercept = form.request.some(i => {
-      if (!i.key || !i.type) {
-        return true
-      }
-    })
-    if (intercept) {
-      ElMessage.error('请求属性的key和type为必填项')
-      return
-    }
-  }
-  if (form.hasResponse) {
-    const intercept = form.response.some(i => {
-      if (!i.key || !i.type) {
-        return true
-      }
-    })
-    if (intercept) {
-      ElMessage.error('响应属性的key和type为必填项')
-      return
-    }
-  }
-  const res = await createPlugApi(form)
-  if (res.code === 0) {
-    ElMessageBox('创建成功,插件已自动写入后端plugin目录下,请按照自己的逻辑进行创造')
-  }
-}
-
-const addkv = (arr) => {
-  arr.push({
-    key: '',
-    value: '',
-  })
-}
-
-const minkv = (arr, key) => {
-  if (arr.length === 1) {
-    ElMessage.warning('至少有一个全局属性')
-    return
-  }
-  arr.splice(key, 1)
-}
-
-</script>
-
-<style lang="scss" scoped>
-    .plug-row{
-      @apply flex items-center w-full;
-        &+&{
-          @apply mt-3;
-        }
-        &>span{
-          @apply ml-2;
-        }
-    }
-</style>

+ 0 - 803
web/src/view/systemTools/exportTemplate/exportTemplate.vue

@@ -1,803 +0,0 @@
-<template>
-  <div>
-    <WarningBar
-      title="本功能提供同步的表格导出功能,大数据量的异步表格导出功能,可以选择点我定制"
-      href="https://flipped-aurora.feishu.cn/docx/KwjxdnvatozgwIxGV0rcpkZSn4d"
-    />
-    <div class="gva-search-box">
-      <el-form
-        ref="elSearchFormRef"
-        :inline="true"
-        :model="searchInfo"
-        class="demo-form-inline"
-        :rules="searchRule"
-        @keyup.enter="onSubmit"
-      >
-        <el-form-item
-          label="创建日期"
-          prop="createdAt"
-        >
-          <template #label>
-            <span>
-              创建日期
-              <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
-                <el-icon><QuestionFilled /></el-icon>
-              </el-tooltip>
-            </span>
-          </template>
-          <el-date-picker
-            v-model="searchInfo.startCreatedAt"
-            type="datetime"
-            placeholder="开始日期"
-            :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"
-          />
-          —
-          <el-date-picker
-            v-model="searchInfo.endCreatedAt"
-            type="datetime"
-            placeholder="结束日期"
-            :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"
-          />
-        </el-form-item>
-        <el-form-item
-          label="模板名称"
-          prop="name"
-        >
-          <el-input
-            v-model="searchInfo.name"
-            placeholder="搜索条件"
-          />
-
-        </el-form-item>
-        <el-form-item
-          label="表名称"
-          prop="tableName"
-        >
-          <el-input
-            v-model="searchInfo.tableName"
-            placeholder="搜索条件"
-          />
-
-        </el-form-item>
-        <el-form-item
-          label="模板标识"
-          prop="templateID"
-        >
-          <el-input
-            v-model="searchInfo.templateID"
-            placeholder="搜索条件"
-          />
-
-        </el-form-item>
-        <el-form-item>
-          <el-button
-            type="primary"
-            icon="search"
-            @click="onSubmit"
-          >查询</el-button>
-          <el-button
-            icon="refresh"
-            @click="onReset"
-          >重置</el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <div class="gva-table-box">
-      <div class="gva-btn-list">
-        <el-button
-          type="primary"
-          icon="plus"
-          @click="openDialog"
-        >新增</el-button>
-
-        <el-button
-          icon="delete"
-          style="margin-left: 10px;"
-          :disabled="!multipleSelection.length"
-          @click="onDelete"
-        >删除</el-button>
-      </div>
-      <el-table
-        ref="multipleTable"
-        style="width: 100%"
-        tooltip-effect="dark"
-        :data="tableData"
-        row-key="ID"
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column
-          type="selection"
-          width="55"
-        />
-        <el-table-column
-          align="left"
-          label="日期"
-          width="180"
-        >
-          <template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
-        </el-table-column>
-        <el-table-column
-          align="left"
-          label="数据库"
-          prop="name"
-          width="120"
-        >
-          <template #defalut="scope">
-            <span>{{ scope.row.dbNname || "GVA库" }}</span>
-          </template>
-        </el-table-column>
-        <el-table-column
-          align="left"
-          label="模板名称"
-          prop="name"
-          width="120"
-        />
-        <el-table-column
-          align="left"
-          label="表名称"
-          prop="tableName"
-          width="120"
-        />
-        <el-table-column
-          align="left"
-          label="模板标识"
-          prop="templateID"
-          width="120"
-        />
-        <el-table-column
-          align="left"
-          label="模板信息"
-          prop="templateInfo"
-          min-width="120"
-        />
-        <el-table-column
-          align="left"
-          label="操作"
-          min-width="120"
-        >
-          <template #default="scope">
-            <el-button
-              type="primary"
-              link
-              icon="edit"
-              class="table-button"
-              @click="updateSysExportTemplateFunc(scope.row)"
-            >变更</el-button>
-            <el-button
-              type="primary"
-              link
-              icon="delete"
-              @click="deleteRow(scope.row)"
-            >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div class="gva-pagination">
-        <el-pagination
-          layout="total, sizes, prev, pager, next, jumper"
-          :current-page="page"
-          :page-size="pageSize"
-          :page-sizes="[10, 30, 50, 100]"
-          :total="total"
-          @current-change="handleCurrentChange"
-          @size-change="handleSizeChange"
-        />
-      </div>
-    </div>
-    <el-drawer
-      v-model="dialogFormVisible"
-      size="60%"
-      :before-close="closeDialog"
-      :title="type==='create'?'添加':'修改'"
-      :show-close="false"
-      destroy-on-close
-    >
-
-      <template #header>
-        <div class="flex justify-between items-center">
-          <span class="text-lg">{{ type==='create'?'添加':'修改' }}</span>
-          <div>
-            <el-button @click="closeDialog">取 消</el-button>
-            <el-button
-              type="primary"
-              @click="enterDialog"
-            >确 定</el-button>
-          </div>
-        </div>
-      </template>
-
-      <el-form
-        ref="elFormRef"
-        :model="formData"
-        label-position="right"
-        :rules="rule"
-        label-width="100px"
-      >
-
-        <el-form-item
-          label="业务库"
-          prop="dbName"
-        >
-          <template #label>
-            <el-tooltip
-              content="注:需要提前到db-list自行配置多数据库,如未配置需配置后重启服务方可使用。若无法选择,请到config.yaml中设置disabled:false,选择导入导出的目标库。"
-              placement="bottom"
-              effect="light"
-            >
-              <div> 业务库 <el-icon><QuestionFilled /></el-icon> </div>
-            </el-tooltip>
-          </template>
-          <el-select
-            v-model="formData.dbName"
-            clearable
-            placeholder="选择业务库"
-          >
-            <el-option
-              v-for="item in dbList"
-              :key="item.aliasName"
-              :value="item.aliasName"
-              :label="item.aliasName"
-              :disabled="item.disable"
-            >
-              <div>
-                <span>{{ item.aliasName }}</span>
-                <span style="float:right;color:#8492a6;font-size:13px">{{ item.dbName }}</span>
-              </div>
-            </el-option>
-          </el-select>
-        </el-form-item>
-
-        <el-form-item
-          label="模板名称:"
-          prop="name"
-        >
-          <el-input
-            v-model="formData.name"
-            :clearable="true"
-            placeholder="请输入模板名称"
-          />
-        </el-form-item>
-        <el-form-item
-          label="表名称:"
-          prop="tableName"
-        >
-          <el-input
-            v-model="formData.tableName"
-            :clearable="true"
-            placeholder="请输入要导出的表名称"
-          />
-        </el-form-item>
-        <el-form-item
-          label="模板标识:"
-          prop="templateID"
-        >
-          <el-input
-            v-model="formData.templateID"
-            :clearable="true"
-            placeholder="模板标识为前端组件需要挂在的标识属性"
-          />
-        </el-form-item>
-
-        <el-form-item
-          label="关联条件:"
-        >
-          <div
-            v-for="(join,key) in formData.joinTemplate"
-            :key="key"
-            class="flex gap-4 w-full mb-2"
-          >
-            <el-select
-              v-model="join.joins"
-              placeholder="请选择关联方式"
-            >
-              <el-option
-                label="LEFT JOIN"
-                value="LEFT JOIN"
-              />
-              <el-option
-                label="INNER JOIN"
-                value="INNER JOIN"
-              />
-              <el-option
-                label="RIGHT JOIN"
-                value="RIGHT JOIN"
-              />
-            </el-select>
-            <el-input
-                v-model="join.table"
-                placeholder="请输入关联表"
-            />
-            <el-input
-              v-model="join.on"
-              placeholder="关联条件 table1.a = table2.b"
-            />
-            <el-button
-              type="danger"
-              icon="delete"
-              @click="() => formData.joinTemplate.splice(key, 1)"
-            >删除</el-button>
-          </div>
-          <div class="flex justify-end w-full">
-            <el-button
-              type="primary"
-              icon="plus"
-              @click="addJoin"
-            >添加条件</el-button>
-          </div>
-        </el-form-item>
-
-        <el-form-item
-          label="模板信息:"
-          prop="templateInfo"
-        >
-          <el-input
-            v-model="formData.templateInfo"
-            type="textarea"
-            :rows="12"
-            :clearable="true"
-            :placeholder="templatePlaceholder"
-          />
-        </el-form-item>
-        <el-form-item
-          label="默认导出条数:"
-        >
-          <el-input-number
-            v-model="formData.limit"
-            :step="1"
-            :step-strictly="true"
-            :precision="0"
-          />
-        </el-form-item>
-        <el-form-item
-          label="默认排序条件:"
-        >
-          <el-input
-            v-model="formData.order"
-            placeholder="例:id desc"
-          />
-        </el-form-item>
-        <el-form-item
-          label="导出条件:"
-        >
-          <div
-            v-for="(condition,key) in formData.conditions"
-            :key="key"
-            class="flex gap-4 w-full mb-2"
-          >
-            <el-input
-              v-model="condition.from"
-              placeholder="需要从查询条件取的json key"
-            />
-            <el-input
-              v-model="condition.column"
-              placeholder="表对应的column"
-            />
-            <el-select
-              v-model="condition.operator"
-              placeholder="请选择查询条件"
-            >
-              <el-option
-                v-for="item in typeSearchOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
-            </el-select>
-            <el-button
-              type="danger"
-              icon="delete"
-              @click="() => formData.conditions.splice(key, 1)"
-            >删除</el-button>
-          </div>
-          <div class="flex justify-end w-full">
-            <el-button
-              type="primary"
-              icon="plus"
-              @click="addCondition"
-            >添加条件</el-button>
-          </div>
-        </el-form-item>
-      </el-form>
-    </el-drawer>
-  </div>
-</template>
-
-<script setup>
-import {
-  createSysExportTemplate,
-  deleteSysExportTemplate,
-  deleteSysExportTemplateByIds,
-  updateSysExportTemplate,
-  findSysExportTemplate,
-  getSysExportTemplateList
-} from '@/api/exportTemplate.js'
-
-// 全量引入格式化工具 请按需保留
-import { formatDate } from '@/utils/format'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { ref, reactive } from 'vue'
-import WarningBar from '@/components/warningBar/warningBar.vue'
-import { getDB } from '@/api/autoCode'
-
-defineOptions({
-  name: 'ExportTemplate'
-})
-
-const templatePlaceholder = `模板信息格式:key标识数据库column列名称(在join模式下需要写为 table.column),value标识导出excel列名称,如下:
-{
-  "table_column1":"第一列",
-  "table_column2":"第二列",
-  "table_column3":"第三列",
-  "table_column4":"第四列",
-}
-如果增加了JOINS导出key应该列为 {table_name1.table_column1:"第一列",table_name2.table_column2:"第二列"}
-JOINS模式下不支持导入
-`
-
-// 自动化生成的字典(可能为空)以及字段
-const formData = ref({
-  name: '',
-  tableName: '',
-  templateID: '',
-  templateInfo: '',
-  limit: 0,
-  order: '',
-  conditions: [],
-  joinTemplate: []
-})
-
-const typeSearchOptions = ref([
-  {
-    label: '=',
-    value: '='
-  },
-  {
-    label: '<>',
-    value: '<>'
-  },
-  {
-    label: '>',
-    value: '>'
-  },
-  {
-    label: '<',
-    value: '<'
-  },
-  {
-    label: 'LIKE',
-    value: 'LIKE'
-  },
-  {
-    label: 'BETWEEN',
-    value: 'BETWEEN'
-  },
-  {
-    label: 'NOT BETWEEN',
-    value: 'NOT BETWEEN'
-  }
-])
-
-const addCondition = () => {
-  formData.value.conditions.push({
-    from: '',
-    column: '',
-    operator: ''
-  })
-}
-
-const addJoin = () => {
-  formData.value.joinTemplate.push({
-    joins: 'LEFT JOIN',
-    table: '',
-    on: ''
-  })
-}
-
-// 验证规则
-const rule = reactive({
-  name: [{
-    required: true,
-    message: '',
-    trigger: ['input', 'blur'],
-  },
-  {
-    whitespace: true,
-    message: '不能只输入空格',
-    trigger: ['input', 'blur'],
-  }
-  ],
-  tableName: [{
-    required: true,
-    message: '',
-    trigger: ['input', 'blur'],
-  },
-  {
-    whitespace: true,
-    message: '不能只输入空格',
-    trigger: ['input', 'blur'],
-  }
-  ],
-  templateID: [{
-    required: true,
-    message: '',
-    trigger: ['input', 'blur'],
-  },
-  {
-    whitespace: true,
-    message: '不能只输入空格',
-    trigger: ['input', 'blur'],
-  }
-  ],
-  templateInfo: [{
-    required: true,
-    message: '',
-    trigger: ['input', 'blur'],
-  },
-  {
-    whitespace: true,
-    message: '不能只输入空格',
-    trigger: ['input', 'blur'],
-  }
-  ],
-})
-
-const searchRule = reactive({
-  createdAt: [
-    { validator: (rule, value, callback) => {
-      if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
-        callback(new Error('请填写结束日期'))
-      } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
-        callback(new Error('请填写开始日期'))
-      } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
-        callback(new Error('开始日期应当早于结束日期'))
-      } else {
-        callback()
-      }
-    }, trigger: 'change' }
-  ],
-})
-
-const elFormRef = ref()
-const elSearchFormRef = ref()
-
-// =========== 表格控制部分 ===========
-const page = ref(1)
-const total = ref(0)
-const pageSize = ref(10)
-const tableData = ref([])
-const searchInfo = ref({})
-const dbList = ref([])
-
-const getDbFunc = async() => {
-  const res = await getDB()
-  if (res.code === 0) {
-    dbList.value = res.data.dbList
-  }
-}
-
-getDbFunc()
-
-// 重置
-const onReset = () => {
-  searchInfo.value = {}
-  getTableData()
-}
-
-// 搜索
-const onSubmit = () => {
-  elSearchFormRef.value?.validate(async(valid) => {
-    if (!valid) return
-    page.value = 1
-    pageSize.value = 10
-    getTableData()
-  })
-}
-
-// 分页
-const handleSizeChange = (val) => {
-  pageSize.value = val
-  getTableData()
-}
-
-// 修改页面容量
-const handleCurrentChange = (val) => {
-  page.value = val
-  getTableData()
-}
-
-// 查询
-const getTableData = async() => {
-  const table = await getSysExportTemplateList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
-  if (table.code === 0) {
-    tableData.value = table.data.list
-    total.value = table.data.total
-    page.value = table.data.page
-    pageSize.value = table.data.pageSize
-  }
-}
-
-getTableData()
-
-// ============== 表格控制部分结束 ===============
-
-// 获取需要的字典 可能为空 按需保留
-const setOptions = async() => {
-}
-
-// 获取需要的字典 可能为空 按需保留
-setOptions()
-
-// 多选数据
-const multipleSelection = ref([])
-// 多选
-const handleSelectionChange = (val) => {
-  multipleSelection.value = val
-}
-
-// 删除行
-const deleteRow = (row) => {
-  ElMessageBox.confirm('确定要删除吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(() => {
-    deleteSysExportTemplateFunc(row)
-  })
-}
-
-// 多选删除
-const onDelete = async() => {
-  ElMessageBox.confirm('确定要删除吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning'
-  }).then(async() => {
-    const ids = []
-    if (multipleSelection.value.length === 0) {
-      ElMessage({
-        type: 'warning',
-        message: '请选择要删除的数据'
-      })
-      return
-    }
-    multipleSelection.value &&
-    multipleSelection.value.map(item => {
-      ids.push(item.ID)
-    })
-    const res = await deleteSysExportTemplateByIds({ ids })
-    if (res.code === 0) {
-      ElMessage({
-        type: 'success',
-        message: '删除成功'
-      })
-      if (tableData.value.length === ids.length && page.value > 1) {
-        page.value--
-      }
-      getTableData()
-    }
-  })
-}
-
-// 行为控制标记(弹窗内部需要增还是改)
-const type = ref('')
-
-// 更新行
-const updateSysExportTemplateFunc = async(row) => {
-  const res = await findSysExportTemplate({ ID: row.ID })
-  type.value = 'update'
-  if (res.code === 0) {
-    formData.value = res.data.resysExportTemplate
-    if (!formData.value.conditions) {
-      formData.value.conditions = []
-    }
-    if (!formData.value.joinTemplate) {
-      formData.value.joinTemplate = []
-    }
-    dialogFormVisible.value = true
-  }
-}
-
-// 删除行
-const deleteSysExportTemplateFunc = async(row) => {
-  const res = await deleteSysExportTemplate({ ID: row.ID })
-  if (res.code === 0) {
-    ElMessage({
-      type: 'success',
-      message: '删除成功'
-    })
-    if (tableData.value.length === 1 && page.value > 1) {
-      page.value--
-    }
-    getTableData()
-  }
-}
-
-// 弹窗控制标记
-const dialogFormVisible = ref(false)
-
-// 打开弹窗
-const openDialog = () => {
-  type.value = 'create'
-  dialogFormVisible.value = true
-}
-
-// 关闭弹窗
-const closeDialog = () => {
-  dialogFormVisible.value = false
-  formData.value = {
-    name: '',
-    tableName: '',
-    templateID: '',
-    templateInfo: '',
-    limit: 0,
-    order: '',
-    conditions: [],
-    joinTemplate: [],
-  }
-}
-// 弹窗确定
-const enterDialog = async() => {
-  // 判断 formData.templateInfo 是否为标准json格式 如果不是标准json 则辅助调整
-  try {
-    JSON.parse(formData.value.templateInfo)
-  } catch (error) {
-    ElMessage({
-      type: 'error',
-      message: '模板信息格式不正确,请检查'
-    })
-    return
-  }
-
-  const reqData = JSON.parse(JSON.stringify(formData.value))
-  for (let i = 0; i < reqData.conditions.length; i++) {
-    if (!reqData.conditions[i].from || !reqData.conditions[i].column || !reqData.conditions[i].operator) {
-      ElMessage({
-        type: 'error',
-        message: '请填写完整的导出条件'
-      })
-      return
-    }
-    reqData.conditions[i].templateID = reqData.templateID
-  }
-
-  for (let i = 0; i < reqData.joinTemplate.length; i++) {
-    if (!reqData.joinTemplate[i].joins || !reqData.joinTemplate[i].on) {
-      ElMessage({
-        type: 'error',
-        message: '请填写完整的关联'
-      })
-      return
-    }
-    reqData.joinTemplate[i].templateID = reqData.templateID
-  }
-
-  elFormRef.value?.validate(async(valid) => {
-    if (!valid) return
-    let res
-    switch (type.value) {
-      case 'create':
-        res = await createSysExportTemplate(reqData)
-        break
-      case 'update':
-        res = await updateSysExportTemplate(reqData)
-        break
-      default:
-        res = await createSysExportTemplate(reqData)
-        break
-    }
-    if (res.code === 0) {
-      ElMessage({
-        type: 'success',
-        message: '创建/更改成功'
-      })
-      closeDialog()
-      getTableData()
-    }
-  })
-}
-
-</script>
-
-<style>
-
-</style>

+ 0 - 19
web/src/view/systemTools/formCreate/index.vue

@@ -1,19 +0,0 @@
-<template>
-  <div style="height:80vh">
-    <iframe
-      width="100%"
-      height="100%"
-      :src="`${basePath}:${basePort}/form-generator/#/`"
-      frameborder="0"
-    />
-  </div>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-const basePath = ref(import.meta.env.VITE_BASE_PATH)
-const basePort = ref(import.meta.env.VITE_SERVER_PORT)
-defineOptions({
-  name: 'FormGenerator'
-})
-</script>

+ 0 - 23
web/src/view/systemTools/index.vue

@@ -1,23 +0,0 @@
-<template>
-  <div>
-    <router-view v-slot="{ Component }">
-      <transition
-        mode="out-in"
-        name="el-fade-in-linear"
-      >
-        <keep-alive :include="routerStore.keepAliveRouters">
-          <component :is="Component" />
-        </keep-alive>
-      </transition>
-    </router-view>
-  </div>
-</template>
-
-<script setup>
-import { useRouterStore } from '@/pinia/modules/router'
-const routerStore = useRouterStore()
-
-defineOptions({
-  name: 'System'
-})
-</script>

+ 0 - 40
web/src/view/systemTools/installPlugin/index.vue

@@ -1,40 +0,0 @@
-<template>
-  <div>
-    <el-upload
-      drag
-      :action="`${path}/autoCode/installPlugin`"
-      :show-file-list="false"
-      :on-success="handleSuccess"
-      :on-error="handleSuccess"
-      name="plug"
-    >
-      <el-icon class="el-icon--upload"><upload-filled /></el-icon>
-      <div class="el-upload__text">
-        拖拽或<em>点击上传</em>
-      </div>
-      <template #tip>
-        <div class="el-upload__tip">
-          请把安装包的zip拖拽至此处上传
-        </div>
-      </template>
-    </el-upload>
-  </div>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import { ElMessage } from 'element-plus'
-const path = ref(import.meta.env.VITE_BASE_API)
-
-const handleSuccess = (res) => {
-  if (res.code === 0) {
-    let msg = ``
-    res.data && res.data.forEach((item, index) => {
-      msg += `${index + 1}.${item.msg}\n`
-    })
-    alert(msg)
-  } else {
-    ElMessage.error(res.msg)
-  }
-}
-</script>

+ 0 - 32
web/src/view/systemTools/pubPlug/pubPlug.vue

@@ -1,32 +0,0 @@
-<template>
-  <div class="p-5 bg-white">
-    <WarningBar title="目前只支持标准插件(通过插件模板生成的标准目录插件),非标准插件请自行打包" />
-    <div class="flex items-center gap-3">
-      <el-input
-        v-model="plugName"
-        placeholder="插件模板处填写的【插件名】"
-      />
-      <el-button
-        type="primary"
-        @click="pubPlugin"
-      >打包插件</el-button>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref } from 'vue'
-import WarningBar from '@/components/warningBar/warningBar.vue'
-import { pubPlug } from '@/api/autoCode.js'
-import { ElMessage } from 'element-plus'
-const plugName = ref('')
-
-const pubPlugin = async() => {
-  const res = await pubPlug({ plugName: plugName.value })
-  if (res.code === 0) {
-    ElMessage.success(res.msg)
-  }
-}
-
-</script>
-

+ 0 - 557
web/src/view/systemTools/system/system.vue

@@ -1,557 +0,0 @@
-<template>
-  <div class="system">
-    <el-form
-      ref="form"
-      :model="config"
-      label-width="240px"
-    >
-      <!--  System start  -->
-      <el-collapse v-model="activeNames">
-        <el-collapse-item
-          title="系统配置"
-          name="1"
-        >
-          <el-form-item label="端口值">
-            <el-input v-model.number="config.system.addr" />
-          </el-form-item>
-          <el-form-item label="数据库类型">
-            <el-select
-              v-model="config.system['db-type']"
-              style="width:100%"
-            >
-              <el-option value="mysql" />
-              <el-option value="pgsql" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="Oss类型">
-            <el-select
-              v-model="config.system['oss-type']"
-              style="width:100%"
-            >
-              <el-option value="local" />
-              <el-option value="qiniu" />
-              <el-option value="tencent-cos" />
-              <el-option value="aliyun-oss" />
-              <el-option value="huawei-obs" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="多点登录拦截">
-            <el-checkbox v-model="config.system['use-multipoint']">开启</el-checkbox>
-          </el-form-item>
-          <el-form-item label="开启redis">
-            <el-checkbox v-model="config.system['use-redis']">开启</el-checkbox>
-          </el-form-item>
-          <el-form-item label="限流次数">
-            <el-input-number v-model.number="config.system['iplimit-count']" />
-          </el-form-item>
-          <el-form-item label="限流时间">
-            <el-input-number v-model.number="config.system['iplimit-time']" />
-          </el-form-item>
-          <el-tooltip
-            content="请修改完成后,注意一并修改前端env环境下的VITE_BASE_PATH"
-            placement="top-start"
-          >
-            <el-form-item label="全局路由前缀">
-              <el-input v-model="config.system['router-prefix']" />
-            </el-form-item>
-          </el-tooltip>
-        </el-collapse-item>
-        <el-collapse-item
-          title="jwt签名"
-          name="2"
-        >
-          <el-form-item label="jwt签名">
-            <el-input v-model="config.jwt['signing-key']" />
-          </el-form-item>
-          <el-form-item label="有效期">
-            <el-input v-model="config.jwt['expires-time']" />
-          </el-form-item>
-          <el-form-item label="缓冲期">
-            <el-input v-model="config.jwt['buffer-time']" />
-          </el-form-item>
-          <el-form-item label="签发者">
-            <el-input v-model="config.jwt.issuer" />
-          </el-form-item>
-        </el-collapse-item>
-        <el-collapse-item
-          title="Zap日志配置"
-          name="3"
-        >
-          <el-form-item label="级别">
-            <el-input v-model.number="config.zap.level" />
-          </el-form-item>
-          <el-form-item label="输出">
-            <el-input v-model="config.zap.format" />
-          </el-form-item>
-          <el-form-item label="日志前缀">
-            <el-input v-model="config.zap.prefix" />
-          </el-form-item>
-          <el-form-item label="日志文件夹">
-            <el-input v-model="config.zap.director" />
-          </el-form-item>
-          <el-form-item label="编码级">
-            <el-input v-model="config.zap['encode-level']" />
-          </el-form-item>
-          <el-form-item label="栈名">
-            <el-input v-model="config.zap['stacktrace-key']" />
-          </el-form-item>
-          <el-form-item label="日志留存时间(默认以天为单位)">
-            <el-input v-model.number="config.zap['max-age']" />
-          </el-form-item>
-          <el-form-item label="显示行">
-            <el-checkbox v-model="config.zap['show-line']" />
-          </el-form-item>
-          <el-form-item label="输出控制台">
-            <el-checkbox v-model="config.zap['log-in-console']" />
-          </el-form-item>
-        </el-collapse-item>
-        <el-collapse-item
-          title="Redis admin数据库配置"
-          name="4"
-        >
-          <el-form-item label="库">
-            <el-input v-model.number="config.redis.db" />
-          </el-form-item>
-          <el-form-item label="地址">
-            <el-input v-model="config.redis.addr" />
-          </el-form-item>
-          <el-form-item label="密码">
-            <el-input v-model="config.redis.password" />
-          </el-form-item>
-        </el-collapse-item>
-
-        <el-collapse-item
-          title="Mongo 数据库配置"
-          name="14"
-        >
-          <el-form-item label="collection name(表名,一般不写)">
-            <el-input v-model="config.mongo.coll" />
-          </el-form-item>
-          <el-form-item label="mongodb options">
-            <el-input v-model="config.mongo.options" />
-          </el-form-item>
-          <el-form-item label="database name(数据库名)">
-            <el-input v-model="config.mongo.database" />
-          </el-form-item>
-          <el-form-item label="用户名">
-            <el-input v-model="config.mongo.username" />
-          </el-form-item>
-          <el-form-item label="密码">
-            <el-input v-model="config.mongo.password" />
-          </el-form-item>
-          <el-form-item label="最小连接池">
-            <el-input v-model="config.mongo['min-pool-size']" />
-          </el-form-item>
-          <el-form-item label="最大连接池">
-            <el-input v-model="config.mongo['max-pool-size']" />
-          </el-form-item>
-          <el-form-item label="socket超时时间">
-            <el-input v-model="config.mongo['socket-timeout-ms']" />
-          </el-form-item>
-          <el-form-item label="连接超时时间">
-            <el-input v-model="config.mongo['socket-timeout-ms']" />
-          </el-form-item>
-          <el-form-item label="是否开启zap日志">
-            <el-checkbox v-model="config.mongo['is-zap']" />
-          </el-form-item>
-          <el-form-item label="hosts">
-            <template v-for="(item,k) in config.mongo.hosts">
-            <div
-              v-for="(_,k2) in item"
-              :key="k2"
-            >
-              <el-form-item
-                :key="k+k2"
-                :label="k2"
-              >
-                <el-input v-model="item[k2]" />
-              </el-form-item>
-            </div>
-          </template>
-          </el-form-item>
-        </el-collapse-item>
-
-        <el-collapse-item
-          title="邮箱配置"
-          name="5"
-        >
-          <el-form-item label="接收者邮箱">
-            <el-input
-              v-model="config.email.to"
-              placeholder="可多个,以逗号分隔"
-            />
-          </el-form-item>
-          <el-form-item label="端口">
-            <el-input v-model.number="config.email.port" />
-          </el-form-item>
-          <el-form-item label="发送者邮箱">
-            <el-input v-model="config.email.from" />
-          </el-form-item>
-          <el-form-item label="host">
-            <el-input v-model="config.email.host" />
-          </el-form-item>
-          <el-form-item label="是否为ssl">
-            <el-checkbox v-model="config.email['is-ssl']" />
-          </el-form-item>
-          <el-form-item label="secret">
-            <el-input v-model="config.email.secret" />
-          </el-form-item>
-          <el-form-item label="测试邮件">
-            <el-button @click="email">测试邮件</el-button>
-          </el-form-item>
-        </el-collapse-item>
-        <el-collapse-item
-          title="验证码配置"
-          name="7"
-        >
-          <el-form-item label="字符长度">
-            <el-input v-model.number="config.captcha['key-long']" />
-          </el-form-item>
-          <el-form-item label="图片宽度">
-            <el-input v-model.number="config.captcha['img-width']" />
-          </el-form-item>
-          <el-form-item label="图片高度">
-            <el-input v-model.number="config.captcha['img-height']" />
-          </el-form-item>
-        </el-collapse-item>
-        <el-collapse-item
-          title="数据库配置"
-          name="9"
-        >
-          <template v-if="config.system['db-type'] === 'mysql'">
-            <el-form-item label="用户名">
-              <el-input v-model="config.mysql.username" />
-            </el-form-item>
-            <el-form-item label="密码">
-              <el-input v-model="config.mysql.password" />
-            </el-form-item>
-            <el-form-item label="地址">
-              <el-input v-model="config.mysql.path" />
-            </el-form-item>
-            <el-form-item label="数据库">
-              <el-input v-model="config.mysql['db-name']" />
-            </el-form-item>
-            <el-form-item label="前缀">
-              <el-input v-model="config.mysql['refix']" />
-            </el-form-item>
-            <el-form-item label="复数表">
-              <el-switch v-model="config.mysql['singular']" />
-            </el-form-item>
-            <el-form-item label="引擎">
-              <el-input v-model="config.mysql['engine']" />
-            </el-form-item>
-            <el-form-item label="maxIdleConns">
-              <el-input v-model.number="config.mysql['max-idle-conns']" />
-            </el-form-item>
-            <el-form-item label="maxOpenConns">
-              <el-input v-model.number="config.mysql['max-open-conns']" />
-            </el-form-item>
-            <el-form-item label="写入日志">
-              <el-checkbox v-model="config.mysql['log-zap']" />
-            </el-form-item>
-            <el-form-item label="日志模式">
-              <el-input v-model="config.mysql['log-mode']" />
-            </el-form-item>
-          </template>
-          <template v-if="config.system['db-type'] === 'pgsql'">
-            <el-form-item label="用户名">
-              <el-input v-model="config.pgsql.username" />
-            </el-form-item>
-            <el-form-item label="密码">
-              <el-input v-model="config.pgsql.password" />
-            </el-form-item>
-            <el-form-item label="地址">
-              <el-input v-model="config.pgsql.path" />
-            </el-form-item>
-            <el-form-item label="数据库">
-              <el-input v-model="config.pgsql.dbname" />
-            </el-form-item>
-            <el-form-item label="前缀">
-              <el-input v-model="config.pgsql['refix']" />
-            </el-form-item>
-            <el-form-item label="复数表">
-              <el-switch v-model="config.pgsql['singular']" />
-            </el-form-item>
-            <el-form-item label="引擎">
-              <el-input v-model="config.pgsql['engine']" />
-            </el-form-item>
-            <el-form-item label="maxIdleConns">
-              <el-input v-model.number="config.pgsql['max-idle-conns']" />
-            </el-form-item>
-            <el-form-item label="maxOpenConns">
-              <el-input v-model.number="config.pgsql['max-open-conns']" />
-            </el-form-item>
-            <el-form-item label="写入日志">
-              <el-checkbox v-model="config.pgsql['log-zap']" />
-            </el-form-item>
-            <el-form-item label="日志模式">
-              <el-input v-model="config.pgsql['log-mode']" />
-            </el-form-item>
-          </template>
-        </el-collapse-item>
-
-        <el-collapse-item
-          title="oss配置"
-          name="10"
-        >
-          <template v-if="config.system['oss-type'] === 'local'">
-            <h2>本地文件配置</h2>
-            <el-form-item label="本地文件访问路径">
-              <el-input v-model="config.local.path" />
-            </el-form-item>
-            <el-form-item label="本地文件存储路径">
-              <el-input v-model="config.local['store-path']" />
-            </el-form-item>
-          </template>
-          <template v-if="config.system['oss-type'] === 'qiniu'">
-            <h2>qiniu上传配置</h2>
-            <el-form-item label="存储区域">
-              <el-input v-model="config.qiniu.zone" />
-            </el-form-item>
-            <el-form-item label="空间名称">
-              <el-input v-model="config.qiniu.bucket" />
-            </el-form-item>
-            <el-form-item label="CDN加速域名">
-              <el-input v-model="config.qiniu['img-path']" />
-            </el-form-item>
-            <el-form-item label="是否使用https">
-              <el-checkbox v-model="config.qiniu['use-https']">开启</el-checkbox>
-            </el-form-item>
-            <el-form-item label="accessKey">
-              <el-input v-model="config.qiniu['access-key']" />
-            </el-form-item>
-            <el-form-item label="secretKey">
-              <el-input v-model="config.qiniu['secret-key']" />
-            </el-form-item>
-            <el-form-item label="上传是否使用CDN上传加速">
-              <el-checkbox v-model="config.qiniu['use-cdn-domains']">开启</el-checkbox>
-            </el-form-item>
-          </template>
-          <template v-if="config.system['oss-type'] === 'tencent-cos'">
-            <h2>腾讯云COS上传配置</h2>
-            <el-form-item label="存储桶名称">
-              <el-input v-model="config['tencent-cos']['bucket']" />
-            </el-form-item>
-            <el-form-item label="所属地域">
-              <el-input v-model="config['tencent-cos'].region" />
-            </el-form-item>
-            <el-form-item label="secretID">
-              <el-input v-model="config['tencent-cos']['secret-id']" />
-            </el-form-item>
-            <el-form-item label="secretKey">
-              <el-input v-model="config['tencent-cos']['secret-key']" />
-            </el-form-item>
-            <el-form-item label="路径前缀">
-              <el-input v-model="config['tencent-cos']['path-prefix']" />
-            </el-form-item>
-            <el-form-item label="访问域名">
-              <el-input v-model="config['tencent-cos']['base-url']" />
-            </el-form-item>
-          </template>
-          <template v-if="config.system['oss-type'] === 'aliyun-oss'">
-            <h2>阿里云OSS上传配置</h2>
-            <el-form-item label="区域">
-              <el-input v-model="config['aliyun-oss'].endpoint" />
-            </el-form-item>
-            <el-form-item label="accessKeyId">
-              <el-input v-model="config['aliyun-oss']['access-key-id']" />
-            </el-form-item>
-            <el-form-item label="accessKeySecret">
-              <el-input v-model="config['aliyun-oss']['access-key-secret']" />
-            </el-form-item>
-            <el-form-item label="存储桶名称">
-              <el-input v-model="config['aliyun-oss']['bucket-name']" />
-            </el-form-item>
-            <el-form-item label="访问域名">
-              <el-input v-model="config['aliyun-oss']['bucket-url']" />
-            </el-form-item>
-          </template>
-          <template v-if="config.system['oss-type'] === 'huawei-obs'">
-            <h2>华为云Obs上传配置</h2>
-            <el-form-item label="路径">
-              <el-input v-model="config['hua-wei-obs'].path" />
-            </el-form-item>
-            <el-form-item label="存储桶名称">
-              <el-input v-model="config['hua-wei-obs'].bucket" />
-            </el-form-item>
-            <el-form-item label="区域">
-              <el-input v-model="config['hua-wei-obs'].endpoint" />
-            </el-form-item>
-            <el-form-item label="accessKey">
-              <el-input v-model="config['hua-wei-obs']['access-key']" />
-            </el-form-item>
-            <el-form-item label="secretKey">
-              <el-input v-model="config['hua-wei-obs']['secret-key']" />
-            </el-form-item>
-          </template>
-
-        </el-collapse-item>
-
-        <el-collapse-item
-          title="Excel上传配置"
-          name="11"
-        >
-          <el-form-item label="合成目标地址">
-            <el-input v-model="config.excel.dir" />
-          </el-form-item>
-        </el-collapse-item>
-
-        <el-collapse-item
-          title="自动化代码配置"
-          name="12"
-        >
-          <el-form-item label="是否自动重启(linux)">
-            <el-checkbox v-model="config.autocode['transfer-restart']" />
-          </el-form-item>
-          <el-form-item label="root(项目根路径)">
-            <el-input
-              v-model="config.autocode.root"
-              disabled
-            />
-          </el-form-item>
-          <el-form-item label="Server(后端代码地址)">
-            <el-input v-model="config.autocode['transfer-restart']" />
-          </el-form-item>
-          <el-form-item label="SApi(后端api文件夹地址)">
-            <el-input v-model="config.autocode['server-api']" />
-          </el-form-item>
-          <el-form-item label="SInitialize(后端Initialize文件夹)">
-            <el-input v-model="config.autocode['server-initialize']" />
-          </el-form-item>
-          <el-form-item label="SModel(后端Model文件地址)">
-            <el-input v-model="config.autocode['server-model']" />
-          </el-form-item>
-          <el-form-item label="SRequest(后端Request文件夹地址)">
-            <el-input v-model="config.autocode['server-request']" />
-          </el-form-item>
-          <el-form-item label="SRouter(后端Router文件夹地址)">
-            <el-input v-model="config.autocode['server-router']" />
-          </el-form-item>
-          <el-form-item label="SService(后端Service文件夹地址)">
-            <el-input v-model="config.autocode['server-service']" />
-          </el-form-item>
-          <el-form-item label="Web(前端文件夹地址)">
-            <el-input v-model="config.autocode.web" />
-          </el-form-item>
-          <el-form-item label="WApi(后端WApi文件夹地址)">
-            <el-input v-model="config.autocode['web-api']" />
-          </el-form-item>
-          <el-form-item label="WForm(后端WForm文件夹地址)">
-            <el-input v-model="config.autocode['web-form']" />
-          </el-form-item>
-          <el-form-item label="WTable(后端WTable文件夹地址)">
-            <el-input v-model="config.autocode['web-table']" />
-          </el-form-item>
-        </el-collapse-item>
-      </el-collapse>
-    </el-form>
-    <div class="mt-4">
-      <el-button
-        type="primary"
-        @click="update"
-      >立即更新</el-button>
-      <el-button
-        type="primary"
-        @click="reload"
-      >重启服务(开发中)</el-button>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { getSystemConfig, setSystemConfig } from '@/api/system'
-import { emailTest } from '@/api/email'
-import { ref, reactive } from 'vue'
-import { ElMessage } from 'element-plus'
-
-defineOptions({
-  name: 'Config'
-})
-
-const activeNames = reactive([])
-const config = ref({
-  system: {
-    'iplimit-count': 0,
-    'iplimit-time': 0
-  },
-  jwt: {},
-  mysql: {},
-  pgsql: {},
-  excel: {},
-  autocode: {},
-  redis: {},
-  mongo: {
-    coll: '',
-    options: '',
-    database: '',
-    username: '',
-    password: '',
-    'min-pool-size': '',
-    'max-pool-size': '',
-    'socket-timeout-ms': '',
-    'connect-timeout-ms': '',
-    'is-zap': '',
-    hosts: [
-      {
-        host: '',
-        port: ''
-      }
-    ]
-  },
-  qiniu: {},
-  'tencent-cos': {},
-  'aliyun-oss': {},
-  'hua-wei-obs': {},
-  captcha: {},
-  zap: {},
-  local: {},
-  email: {},
-  timer: {
-    detail: {}
-  }
-})
-
-const initForm = async() => {
-  const res = await getSystemConfig()
-  if (res.code === 0) {
-    config.value = res.data.config
-  }
-}
-initForm()
-const reload = () => {}
-const update = async() => {
-  const res = await setSystemConfig({ config: config.value })
-  if (res.code === 0) {
-    ElMessage({
-      type: 'success',
-      message: '配置文件设置成功'
-    })
-    await initForm()
-  }
-}
-const email = async() => {
-  const res = await emailTest()
-  if (res.code === 0) {
-    ElMessage({
-      type: 'success',
-      message: '邮件发送成功'
-    })
-    await initForm()
-  } else {
-    ElMessage({
-      type: 'error',
-      message: '邮件发送失败'
-    })
-  }
-}
-
-</script>
-
-<style lang="scss">
-.system {
-  @apply bg-white p-9 rounded;
-  h2 {
-    @apply p-2.5 my-2.5 text-lg shadow;
-  }
-}
-</style>

+ 1 - 1
web/vite.config.js

@@ -67,7 +67,7 @@ export default ({
         // detail: https://cli.vuejs.org/config/#devserver-proxy
         [process.env.VITE_BASE_API]: { // 需要代理的路径   例如 '/api'
           target: `${process.env.VITE_BASE_PATH}:${process.env.VITE_SERVER_PORT}/`, // 代理到 目标路径
-          changeOrigin: false,
+          changeOrigin: true,
           rewrite: path => path.replace(new RegExp('^' + process.env.VITE_BASE_API), ''),
         }
       },