Sfoglia il codice sorgente

Merge remote-tracking branch 'upstream/master'

zhangcl 4 mesi fa
parent
commit
5ddff23ccc

+ 1 - 2
build/vite/index.ts

@@ -13,7 +13,7 @@ import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
 import viteCompression from 'vite-plugin-compression'
 import topLevelAwait from 'vite-plugin-top-level-await'
 import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite'
-import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
+import { createSvgIconsPlugin } from 'vite-plugin-svg-icons-ng'
 import UnoCSS from 'unocss/vite'
 
 export function createVitePlugins() {
@@ -78,7 +78,6 @@ export function createVitePlugins() {
     createSvgIconsPlugin({
       iconDirs: [pathResolve('src/assets/svgs')],
       symbolId: 'icon-[dir]-[name]',
-      svgoOptions: true
     }),
     viteCompression({
       verbose: true, // 是否在控制台输出压缩结果

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "yudao-ui-admin-vue3",
-  "version": "2.4.1-snapshot",
+  "version": "2.4.2-snapshot",
   "description": "基于vue3、vite4、element-plus、typesScript",
   "author": "xingyu",
   "private": false,
@@ -133,7 +133,7 @@
     "vite-plugin-eslint": "^1.8.1",
     "vite-plugin-progress": "^0.0.7",
     "vite-plugin-purge-icons": "^0.10.0",
-    "vite-plugin-svg-icons": "^2.0.1",
+    "vite-plugin-svg-icons-ng": "^1.3.1",
     "vite-plugin-top-level-await": "^1.4.4",
     "vue-eslint-parser": "^9.3.2",
     "vue-tsc": "^1.8.27"

File diff suppressed because it is too large
+ 107 - 277
pnpm-lock.yaml


+ 0 - 15
src/api/infra/codegen/index.ts

@@ -46,11 +46,6 @@ export type DatabaseTableVO = {
   comment: string
 }
 
-export type CodegenDetailVO = {
-  table: CodegenTableVO
-  columns: CodegenColumnVO[]
-}
-
 export type CodegenPreviewVO = {
   filePath: string
   code: string
@@ -61,11 +56,6 @@ export type CodegenUpdateReqVO = {
   columns: CodegenColumnVO[]
 }
 
-export type CodegenCreateListReqVO = {
-  dataSourceConfigId: number
-  tableNames: string[]
-}
-
 // 查询列表代码生成表定义
 export const getCodegenTableList = (dataSourceConfigId: number) => {
   return request.get({ url: '/infra/codegen/table/list?dataSourceConfigId=' + dataSourceConfigId })
@@ -81,11 +71,6 @@ export const getCodegenTable = (id: number) => {
   return request.get({ url: '/infra/codegen/detail?tableId=' + id })
 }
 
-// 新增代码生成表定义
-export const createCodegenTable = (data: CodegenCreateListReqVO) => {
-  return request.post({ url: '/infra/codegen/create', data })
-}
-
 // 修改代码生成表定义
 export const updateCodegenTable = (data: CodegenUpdateReqVO) => {
   return request.put({ url: '/infra/codegen/update', data })

+ 1 - 7
src/api/infra/file/index.ts

@@ -1,11 +1,5 @@
 import request from '@/config/axios'
 
-export interface FilePageReqVO extends PageParam {
-  path?: string
-  type?: string
-  createTime?: Date[]
-}
-
 // 文件预签名地址 Response VO
 export interface FilePresignedUrlRespVO {
   // 文件配置编号
@@ -17,7 +11,7 @@ export interface FilePresignedUrlRespVO {
 }
 
 // 查询文件列表
-export const getFilePage = (params: FilePageReqVO) => {
+export const getFilePage = (params: PageParam) => {
   return request.get({ url: '/infra/file/page', params })
 }
 

+ 2 - 7
src/api/system/user/index.ts

@@ -22,11 +22,6 @@ export const getUserPage = (params: PageParam) => {
   return request.get({ url: '/system/user/page', params })
 }
 
-// 查询所有用户列表
-export const getAllUser = () => {
-  return request.get({ url: '/system/user/all' })
-}
-
 // 查询用户详情
 export const getUser = (id: number) => {
   return request.get({ url: '/system/user/get?id=' + id })
@@ -48,7 +43,7 @@ export const deleteUser = (id: number) => {
 }
 
 // 导出用户
-export const exportUser = (params) => {
+export const exportUser = (params: any) => {
   return request.download({ url: '/system/user/export', params })
 }
 
@@ -58,7 +53,7 @@ export const importUserTemplate = () => {
 }
 
 // 用户密码重置
-export const resetUserPwd = (id: number, password: string) => {
+export const resetUserPassword = (id: number, password: string) => {
   const data = {
     id,
     password

+ 8 - 1
src/components/FormCreate/src/components/useApiSelect.tsx

@@ -69,11 +69,18 @@ export const useApiSelect = (option: ApiSelectProps) => {
         if (isEmpty(props.url)) {
           return
         }
+
         switch (props.method) {
           case 'GET':
             let url: string = props.url
             if (props.remote) {
-              url = `${url}?${props.remoteField}=${queryParam.value}`
+              if (queryParam.value != undefined) {
+                if (url.includes('?')) {
+                  url = `${url}&${props.remoteField}=${queryParam.value}`
+                } else {
+                  url = `${url}?${props.remoteField}=${queryParam.value}`
+                }
+              }
             }
             parseOptions(await request.get({ url: url }))
             break

+ 1 - 0
src/components/FormCreate/src/config/useSelectRule.ts

@@ -17,6 +17,7 @@ export const useSelectRule = (option: SelectRuleOption) => {
     icon: option.icon,
     label,
     name,
+    event: option.event,
     rule() {
       return {
         type: name,

+ 2 - 1
src/components/FormCreate/src/type/index.ts

@@ -46,5 +46,6 @@ export interface SelectRuleOption {
   label: string // label 名称
   name: string // 组件名称
   icon: string // 组件图标
-  props?: any[] // 组件规则
+  props?: any[], // 组件规则
+  event?: any[] // 事件配置
 }

+ 2 - 1
src/components/FormCreate/src/useFormCreateDesigner.ts

@@ -63,7 +63,8 @@ export const useFormCreateDesigner = async (designer: Ref) => {
     name: 'ApiSelect',
     label: '接口选择器',
     icon: 'icon-server',
-    props: [...apiSelectRule]
+    props: [...apiSelectRule],
+    event: ['click', 'change', 'visibleChange', 'clear', 'blur', 'focus']
   })
 
   /**

+ 2 - 2
src/utils/constants.ts

@@ -71,7 +71,7 @@ export const SystemUserSocialTypeEnum = {
 export const InfraCodegenTemplateTypeEnum = {
   CRUD: 1, // 基础 CRUD
   TREE: 2, // 树形 CRUD
-  SUB: 3 // 主子表 CRUD
+  SUB: 15 // 主子表 CRUD
 }
 
 /**
@@ -461,5 +461,5 @@ export const BpmProcessInstanceStatus = {
 export const BpmAutoApproveType = {
   NONE: 0, // 不自动通过
   APPROVE_ALL: 1, // 仅审批一次,后续重复的审批节点均自动通过
-  APPROVE_SEQUENT: 2, // 仅针对连续审批的节点自动通过
+  APPROVE_SEQUENT: 2 // 仅针对连续审批的节点自动通过
 }

+ 2 - 2
src/utils/index.ts

@@ -517,8 +517,8 @@ export function jsonParse(str: string) {
   try {
     return JSON.parse(str)
   } catch (e) {
-    console.log(`str[${str}] 不是一个 JSON 字符串`)
-    return ''
+    console.warn(`str[${str}] 不是一个 JSON 字符串`)
+    return str
   }
 }
 

+ 2 - 2
src/views/Login/components/LoginForm.vue

@@ -312,8 +312,8 @@ const doSocialLogin = async (type: number) => {
       }
     }
     // 计算 redirectUri
-    // tricky: type、redirect需要先encode一次,否则钉钉回调会丢失。
-    // 配合 Login/SocialLogin.vue#getUrlValue() 使用
+    // 注意: type、redirect 需要先 encode 一次,否则钉钉回调会丢失。
+    // 配合 social-login.vue#getUrlValue() 使用
     const redirectUri =
       location.origin +
       '/social-login?' +

+ 17 - 8
src/views/infra/codegen/ImportTable.vue

@@ -62,7 +62,11 @@
     </el-row>
     <!-- 操作 -->
     <template #footer>
-      <el-button :disabled="tableList.length === 0" type="primary" @click="handleImportTable">
+      <el-button
+        :disabled="tableList.length === 0 || dbTableLoading"
+        type="primary"
+        @click="handleImportTable"
+      >
         导入
       </el-button>
       <el-button @click="close">关闭</el-button>
@@ -139,13 +143,18 @@ const handleSelectionChange = (selection) => {
 
 /** 导入按钮操作 */
 const handleImportTable = async () => {
-  await CodegenApi.createCodegenList({
-    dataSourceConfigId: queryParams.dataSourceConfigId,
-    tableNames: tableList.value
-  })
-  message.success('导入成功')
-  emit('success')
-  close()
+  dbTableLoading.value = true
+  try {
+    await CodegenApi.createCodegenList({
+      dataSourceConfigId: queryParams.dataSourceConfigId,
+      tableNames: tableList.value
+    })
+    message.success('导入成功')
+    emit('success')
+    close()
+  } finally {
+    dbTableLoading.value = false
+  }
 }
 const emit = defineEmits(['success'])
 </script>

+ 0 - 1
src/views/iot/thingmodel/ThingModelForm.vue

@@ -132,7 +132,6 @@ defineExpose({ open, close: () => (dialogVisible.value = false) })
 /** 提交表单 */
 const emit = defineEmits(['success'])
 const submitForm = async () => {
-  debugger
   await formRef.value.validate()
   formLoading.value = true
   try {

+ 2 - 2
src/views/mall/promotion/kefu/index.vue

@@ -16,7 +16,6 @@ import { KeFuConversationRespVO } from '@/api/mall/promotion/kefu/conversation'
 import { getRefreshToken } from '@/utils/auth'
 import { useWebSocket } from '@vueuse/core'
 import { useMallKefuStore } from '@/store/modules/mall/kefu'
-import { jsonParse } from '@/utils'
 
 defineOptions({ name: 'KeFu' })
 
@@ -66,7 +65,8 @@ watch(
       // 2.3 消息类型:KEFU_MESSAGE_ADMIN_READ
       if (type === WebSocketMessageTypeConstants.KEFU_MESSAGE_ADMIN_READ) {
         // 更新会话已读
-        kefuStore.updateConversationStatus(jsonParse(jsonMessage.content))
+        const message = JSON.parse(jsonMessage.content)
+        kefuStore.updateConversationStatus(message.conversationId)
       }
     } catch (error) {
       console.error(error)

+ 1 - 0
src/views/system/menu/MenuForm.vue

@@ -147,6 +147,7 @@ const formData = ref({
 })
 const formRules = reactive({
   name: [{ required: true, message: '菜单名称不能为空', trigger: 'blur' }],
+  type: [{ required: true, message: '菜单类型不能为空', trigger: 'blur' }],
   sort: [{ required: true, message: '菜单顺序不能为空', trigger: 'blur' }],
   path: [{ required: true, message: '路由地址不能为空', trigger: 'blur' }],
   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]

+ 1 - 1
src/views/system/role/RoleDataPermissionForm.vue

@@ -20,7 +20,7 @@
     </el-form>
     <el-form-item
       v-if="formData.dataScope === SystemDataScopeEnum.DEPT_CUSTOM"
-      label="权限范围"
+      label="部门范围"
       label-width="80px"
     >
       <el-card class="w-full h-400px !overflow-y-scroll" shadow="never">

+ 2 - 2
src/views/system/user/index.vue

@@ -41,7 +41,7 @@
           <el-form-item label="状态" prop="status">
             <el-select
               v-model="queryParams.status"
-              placeholder="用户状态"
+              placeholder="请选择用户状态"
               clearable
               class="!w-240px"
             >
@@ -345,7 +345,7 @@ const handleResetPwd = async (row: UserApi.UserVO) => {
     )
     const password = result.value
     // 发起重置
-    await UserApi.resetUserPwd(row.id, password)
+    await UserApi.resetUserPassword(row.id, password)
     message.success('修改成功,新密码是:' + password)
   } catch {}
 }

Some files were not shown because too many files changed in this diff