shizhong 1 år sedan
förälder
incheckning
b7ec0eef6d
55 ändrade filer med 177 tillägg och 301 borttagningar
  1. 7 3
      .vscode/launch.json
  2. 3 0
      build/vite/index.ts
  3. 0 1
      build/vite/optimize.ts
  4. 2 2
      src/api/bpm/processInstance/index.ts
  5. 1 1
      src/api/bpm/task/index.ts
  6. 12 12
      src/api/infra/dataSourceConfig/index.ts
  7. 1 0
      src/api/infra/fileConfig/index.ts
  8. 0 33
      src/api/infra/redis/index.ts
  9. 0 9
      src/api/infra/redis/types.ts
  10. 2 2
      src/api/mall/product/spu.ts
  11. 1 1
      src/api/system/dict/dict.data.ts
  12. 2 2
      src/api/system/errorCode/index.ts
  13. 1 0
      src/api/system/loginLog/index.ts
  14. 3 2
      src/api/system/notify/template/index.ts
  15. 3 3
      src/api/system/oauth2/client.ts
  16. 10 0
      src/api/system/role/index.ts
  17. 9 8
      src/api/system/sensitiveWord/index.ts
  18. 2 2
      src/api/system/user/index.ts
  19. 1 1
      src/components/Verifition/src/Verify/VerifySlide.vue
  20. 38 45
      src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue
  21. 1 1
      src/layout/components/Footer/src/Footer.vue
  22. 0 1
      src/layout/components/TagsView/src/TagsView.vue
  23. 1 1
      src/locales/en.ts
  24. 3 2
      src/router/modules/remaining.ts
  25. 6 5
      src/store/modules/dict.ts
  26. 0 47
      src/utils/formatTime.ts
  27. 2 0
      src/utils/tree.ts
  28. 2 2
      src/views/Login/components/MobileForm.vue
  29. 1 1
      src/views/bpm/group/UserGroupForm.vue
  30. 1 1
      src/views/bpm/processInstance/detail/ProcessInstanceBpmnViewer.vue
  31. 1 1
      src/views/infra/codegen/components/ColumnInfoForm.vue
  32. 2 0
      src/views/infra/dbDoc/index.vue
  33. 3 0
      src/views/infra/druid/index.vue
  34. 5 54
      src/views/infra/redis/index.vue
  35. 2 0
      src/views/infra/server/index.vue
  36. 2 0
      src/views/infra/skywalking/index.vue
  37. 2 0
      src/views/infra/swagger/index.vue
  38. 1 1
      src/views/infra/webSocket/index.vue
  39. 1 1
      src/views/mall/product/category/CategoryForm.vue
  40. 2 4
      src/views/mall/product/property/PropertyForm.vue
  41. 10 11
      src/views/mall/product/spu/components/SkuList.vue
  42. 2 2
      src/views/mall/product/spu/components/index.ts
  43. 8 8
      src/views/mall/product/spu/form/index.vue
  44. 1 25
      src/views/member/user/UserForm.vue
  45. 2 0
      src/views/mp/account/index.vue
  46. 2 0
      src/views/mp/autoReply/index.vue
  47. 1 1
      src/views/mp/components/wx-voice-play/main.vue
  48. 2 0
      src/views/mp/draft/index.vue
  49. 2 0
      src/views/mp/freePublish/index.vue
  50. 1 0
      src/views/mp/material/index.vue
  51. 1 0
      src/views/mp/menu/index.vue
  52. 2 0
      src/views/mp/tag/index.vue
  53. 2 0
      src/views/mp/user/index.vue
  54. 2 2
      src/views/system/social/client/SocialClientForm.vue
  55. 3 3
      src/views/system/social/client/index.vue

+ 7 - 3
.vscode/launch.json

@@ -1,12 +1,16 @@
 {
+  // Use IntelliSense to learn about possible attributes.
+  // Hover to view descriptions of existing attributes.
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
   "version": "0.2.0",
   "configurations": [
     {
-      "name": "Launch debug",
+      "type": "msedge",
       "request": "launch",
-      "type": "chrome",
+      "name": "Launch Edge against localhost",
       "url": "http://localhost",
-      "webRoot": "${workspaceFolder}/src"
+      "webRoot": "${workspaceFolder}/src",
+      "sourceMaps": true
     }
   ]
 }

+ 3 - 0
build/vite/index.ts

@@ -5,6 +5,7 @@ import progress from 'vite-plugin-progress'
 import EslintPlugin from 'vite-plugin-eslint'
 import PurgeIcons from 'vite-plugin-purge-icons'
 import { ViteEjsPlugin } from 'vite-plugin-ejs'
+// @ts-ignore
 import ElementPlus from 'unplugin-element-plus/vite'
 import AutoImport from 'unplugin-auto-import/vite'
 import Components from 'unplugin-vue-components/vite'
@@ -17,10 +18,12 @@ import UnoCSS from 'unocss/vite'
 
 export function createVitePlugins() {
   const root = process.cwd()
+
   // 路径查找
   function pathResolve(dir: string) {
     return resolve(root, '.', dir)
   }
+
   return [
     Vue(),
     VueJsx(),

+ 0 - 1
build/vite/optimize.ts

@@ -17,7 +17,6 @@ const include = [
   'cropperjs',
   'lodash-es',
   'nprogress',
-  'animate.css',
   'vxe-table',
   'vxe-table/es/style',
   'vxe-table/lib/locale/lang/zh-CN',

+ 2 - 2
src/api/bpm/processInstance/index.ts

@@ -62,8 +62,8 @@ export const createProcessInstanceCC = async (data) => {
 
 /**
  * 抄送列表
- * @param params
- * @returns
+ * @param params 
+ * @returns 
  */
 export const getProcessInstanceCCPage = async (params) => {
   return await request.get({ url: '/bpm/process-instance/cc/my-page', params })

+ 1 - 1
src/api/bpm/task/index.ts

@@ -49,7 +49,7 @@ export const getReturnList = async (params) => {
 
 // 回退
 export const returnTask = async (data) => {
-  return await request.put({ url: '/bpm/task/rollback', data })
+  return await request.put({ url: '/bpm/task/return', data })
 }
 
 /**

+ 12 - 12
src/api/infra/dataSourceConfig/index.ts

@@ -1,22 +1,12 @@
 import request from '@/config/axios'
 
 export interface DataSourceConfigVO {
-  id: number
+  id: number | undefined
   name: string
   url: string
   username: string
   password: string
-  createTime: Date
-}
-
-// 查询数据源配置列表
-export const getDataSourceConfigListApi = () => {
-  return request.get({ url: '/infra/data-source-config/list' })
-}
-
-// 查询数据源配置详情
-export const getDataSourceConfigApi = (id: number) => {
-  return request.get({ url: '/infra/data-source-config/get?id=' + id })
+  createTime?: Date
 }
 
 // 新增数据源配置
@@ -33,3 +23,13 @@ export const updateDataSourceConfigApi = (data: DataSourceConfigVO) => {
 export const deleteDataSourceConfigApi = (id: number) => {
   return request.delete({ url: '/infra/data-source-config/delete?id=' + id })
 }
+
+// 查询数据源配置列表
+export const getDataSourceConfigListApi = () => {
+  return request.get({ url: '/infra/data-source-config/list' })
+}
+
+// 查询数据源配置详情
+export const getDataSourceConfigApi = (id: number) => {
+  return request.get({ url: '/infra/data-source-config/get?id=' + id })
+}

+ 1 - 0
src/api/infra/fileConfig/index.ts

@@ -13,6 +13,7 @@ export interface FileClientConfig {
   accessSecret?: string
   domain: string
 }
+
 export interface FileConfigVO {
   id: number
   name: string

+ 0 - 33
src/api/infra/redis/index.ts

@@ -6,36 +6,3 @@ import request from '@/config/axios'
 export const getCacheApi = () => {
   return request.get({ url: '/infra/redis/get-monitor-info' })
 }
-// 获取模块
-export const getKeyDefineListApi = () => {
-  return request.get({ url: '/infra/redis/get-key-define-list' })
-}
-/**
- * 获取redis key列表
- */
-export const getKeyListApi = (keyTemplate: string) => {
-  return request.get({
-    url: '/infra/redis/get-key-list',
-    params: {
-      keyTemplate
-    }
-  })
-}
-// 获取缓存内容
-export const getKeyValueApi = (key: string) => {
-  return request.get({ url: '/infra/redis/get-key-value?key=' + key })
-}
-
-// 根据键名删除缓存
-export const deleteKeyApi = (key: string) => {
-  return request.delete({ url: '/infra/redis/delete-key?key=' + key })
-}
-
-export const deleteKeysApi = (keyTemplate: string) => {
-  return request.delete({
-    url: '/infra/redis/delete-keys?',
-    params: {
-      keyTemplate
-    }
-  })
-}

+ 0 - 9
src/api/infra/redis/types.ts

@@ -174,12 +174,3 @@ export interface RedisCommandStatsVO {
   calls: number
   usec: number
 }
-
-export interface RedisKeyInfo {
-  keyTemplate: string
-  keyType: string
-  valueType: string
-  timeoutType: number
-  timeout: number
-  memo: string
-}

+ 2 - 2
src/api/mall/product/spu.ts

@@ -20,8 +20,8 @@ export interface Sku {
   stock?: number // 库存
   weight?: number // 商品重量,单位:kg 千克
   volume?: number // 商品体积,单位:m^3 平米
-  firstBrokerageRecord?: number | string // 一级分销的佣金
-  secondBrokerageRecord?: number | string // 二级分销的佣金
+  firstBrokeragePrice?: number | string // 一级分销的佣金
+  secondBrokeragePrice?: number | string // 二级分销的佣金
   salesCount?: number // 商品销量
 }
 

+ 1 - 1
src/api/system/dict/dict.data.ts

@@ -2,7 +2,7 @@ import request from '@/config/axios'
 import type { DictDataVO, DictDataPageReqVO, DictDataExportReqVO } from './types'
 
 // 查询字典数据(精简)列表
-export const listSimpleDictDataApi = () => {
+export const getSimpleDictDataList = () => {
   return request.get({ url: '/system/dict-data/simple-list' })
 }
 

+ 2 - 2
src/api/system/errorCode/index.ts

@@ -1,10 +1,10 @@
 import request from '@/config/axios'
 
 export interface ErrorCodeVO {
-  id: number
+  id: number | undefined
   type: number
   applicationName: string
-  code: number
+  code: number | undefined
   message: string
   memo: string
   createTime: Date

+ 1 - 0
src/api/system/loginLog/index.ts

@@ -25,6 +25,7 @@ export interface LoginLogReqVO extends PageParam {
 export const getLoginLogPageApi = (params: LoginLogReqVO) => {
   return request.get({ url: '/system/login-log/page', params })
 }
+
 // 导出登录日志
 export const exportLoginLogApi = (params: LoginLogReqVO) => {
   return request.download({ url: '/system/login-log/export', params })

+ 3 - 2
src/api/system/notify/template/index.ts

@@ -1,8 +1,9 @@
 import request from '@/config/axios'
 
 export interface NotifyTemplateVO {
-  id: number
+  id?: number
   name: string
+  nickname: string
   code: string
   content: string
   type?: number
@@ -19,7 +20,7 @@ export interface NotifyTemplatePageReqVO extends PageParam {
 }
 
 export interface NotifySendReqVO {
-  userId: number
+  userId: number | null
   templateCode: string
   templateParams: Map<String, Object>
 }

+ 3 - 3
src/api/system/oauth2/client.ts

@@ -30,17 +30,17 @@ export const getOAuth2ClientPageApi = (params: OAuth2ClientPageReqVO) => {
   return request.get({ url: '/system/oauth2-client/page', params })
 }
 
-// 查询 OAuth2详情
+// 查询 OAuth2 客户端的详情
 export const getOAuth2ClientApi = (id: number) => {
   return request.get({ url: '/system/oauth2-client/get?id=' + id })
 }
 
-// 新增 OAuth2
+// 新增 OAuth2 客户端
 export const createOAuth2ClientApi = (data: OAuth2ClientVO) => {
   return request.post({ url: '/system/oauth2-client/create', data })
 }
 
-// 修改 OAuth2
+// 修改 OAuth2 客户端
 export const updateOAuth2ClientApi = (data: OAuth2ClientVO) => {
   return request.put({ url: '/system/oauth2-client/update', data })
 }

+ 10 - 0
src/api/system/role/index.ts

@@ -7,6 +7,8 @@ export interface RoleVO {
   sort: number
   status: number
   type: number
+  dataScope: number
+  dataScopeDeptIds: number[]
   createTime: Date
 }
 
@@ -56,3 +58,11 @@ export const updateRoleStatusApi = async (data: UpdateStatusReqVO) => {
 export const deleteRoleApi = async (id: number) => {
   return await request.delete({ url: '/system/role/delete?id=' + id })
 }
+
+// 导出角色
+export const exportRole = (params) => {
+  return request.download({
+    url: '/system/role/export-excel',
+    params
+  })
+}

+ 9 - 8
src/api/system/sensitiveWord/index.ts

@@ -1,4 +1,5 @@
 import request from '@/config/axios'
+import qs from 'qs'
 
 export interface SensitiveWordVO {
   id: number
@@ -16,11 +17,9 @@ export interface SensitiveWordPageReqVO extends PageParam {
   createTime?: Date[]
 }
 
-export interface SensitiveWordExportReqVO {
-  name?: string
-  tag?: string
-  status?: number
-  createTime?: Date[]
+export interface SensitiveWordTestReqVO {
+  text: string
+  tag: string[]
 }
 
 // 查询敏感词列表
@@ -49,7 +48,7 @@ export const deleteSensitiveWordApi = (id: number) => {
 }
 
 // 导出敏感词
-export const exportSensitiveWordApi = (params: SensitiveWordExportReqVO) => {
+export const exportSensitiveWordApi = (params: SensitiveWordPageReqVO) => {
   return request.download({ url: '/system/sensitive-word/export-excel', params })
 }
 
@@ -59,6 +58,8 @@ export const getSensitiveWordTagsApi = () => {
 }
 
 // 获得文本所包含的不合法的敏感词数组
-export const validateTextApi = (id: number) => {
-  return request.get({ url: '/system/sensitive-word/validate-text?' + id })
+export const validateTextApi = (query: SensitiveWordTestReqVO) => {
+  return request.get({
+    url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' })
+  })
 }

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

@@ -91,10 +91,10 @@ export const updateUserStatusApi = (id: number, status: number) => {
 }
 
 // 获取用户精简信息列表
-export const getListSimpleUsersApi = () => {
+export const getListSimpleUsersApi = (): Promise<UserVO[]> => {
   return request.get({ url: '/system/user/simple-list' })
 }
 
-export const getSimpleUserList = () => {
+export const getSimpleUserList = (): Promise<UserVO[]> => {
   return request.get({ url: '/system/user/simple-list' })
 }

+ 1 - 1
src/components/Verifition/src/Verify/VerifySlide.vue

@@ -303,7 +303,7 @@ const end = () => {
           }, 1500)
         }
         passFlag.value = true
-        tipWords.value = `${((endMovetime.value - startMoveTime.value) / 1000).toFixed(2)}s 
+        tipWords.value = `${((endMovetime.value - startMoveTime.value) / 1000).toFixed(2)}s
             ${t('captcha.success')}`
         var captchaVerification = secretKey.value
           ? aesEncrypt(

+ 38 - 45
src/components/bpmnProcessDesigner/package/designer/ProcessDesigner.vue

@@ -196,8 +196,11 @@
       max-height="600px"
     >
       <!-- append-to-body -->
-      <div>
-        <pre><code class="hljs" v-html="highlightedCode(previewResult)"></code></pre>
+      <div v-highlight>
+        <code class="hljs">
+          <!-- 高亮代码块 -->
+          {{ previewResult }}
+        </code>
       </div>
     </Dialog>
   </div>
@@ -233,6 +236,14 @@ import flowableModdleExtension from './plugins/extension-moddle/flowable'
 // import xml2js from 'xml-js'
 // import xml2js from 'fast-xml-parser'
 import { XmlNode, XmlNodeType, parseXmlString } from 'steady-xml'
+// 代码高亮插件
+// import hljs from 'highlight.js/lib/highlight'
+// import 'highlight.js/styles/github-gist.css'
+// hljs.registerLanguage('xml', 'highlight.js/lib/languages/xml')
+// hljs.registerLanguage('json', 'highlight.js/lib/languages/json')
+// const eventName = reactive({
+//   name: ''
+// })
 
 defineOptions({ name: 'MyProcessDesigner' })
 
@@ -360,9 +371,9 @@ const additionalModules = computed(() => {
   return Modules
 })
 const moddleExtensions = computed(() => {
-  // console.log(props.onlyCustomizeModdle, 'props.onlyCustomizeModdle')
-  // console.log(props.moddleExtension, 'props.moddleExtension')
-  // console.log(props.prefix, 'props.prefix')
+  console.log(props.onlyCustomizeModdle, 'props.onlyCustomizeModdle')
+  console.log(props.moddleExtension, 'props.moddleExtension')
+  console.log(props.prefix, 'props.prefix')
   const Extensions: any = {}
   // 仅使用用户自定义模块
   if (props.onlyCustomizeModdle) {
@@ -425,22 +436,22 @@ const initBpmnModeler = () => {
 
   // bpmnModeler.createDiagram()
 
-  // console.log(bpmnModeler, 'bpmnModeler111111')
+  console.log(bpmnModeler, 'bpmnModeler111111')
   emit('init-finished', bpmnModeler)
   initModelListeners()
 }
 
 const initModelListeners = () => {
   const EventBus = bpmnModeler.get('eventBus')
-  // console.log(EventBus, 'EventBus')
+  console.log(EventBus, 'EventBus')
   // 注册需要的监听事件, 将. 替换为 - , 避免解析异常
   props.events.forEach((event: any) => {
     EventBus.on(event, function (eventObj) {
-      // let eventName = event.replace(/\./g, '-')
+      let eventName = event.replace(/\./g, '-')
       // eventName.name = eventName
       let element = eventObj ? eventObj.element : null
-      // console.log(eventName, 'eventName')
-      // console.log(element, 'element')
+      console.log(eventName, 'eventName')
+      console.log(element, 'element')
       emit('element-click', element, eventObj)
       // emit(eventName, element, eventObj)
     })
@@ -467,7 +478,7 @@ const initModelListeners = () => {
 }
 /* 创建新的流程图 */
 const createNewDiagram = async (xml) => {
-  // console.log(xml, 'xml')
+  console.log(xml, 'xml')
   // 将字符串转换成图显示出来
   let newId = props.processId || `Process_${new Date().getTime()}`
   let newName = props.processName || `业务流程_${new Date().getTime()}`
@@ -476,7 +487,7 @@ const createNewDiagram = async (xml) => {
     // console.log(xmlString, 'xmlString')
     // console.log(this.bpmnModeler.importXML);
     let { warnings } = await bpmnModeler.importXML(xmlString)
-    // console.log(warnings, 'warnings')
+    console.log(warnings, 'warnings')
     if (warnings && warnings.length) {
       warnings.forEach((warn) => console.warn(warn))
     }
@@ -556,7 +567,7 @@ const downloadProcessAsSvg = () => {
 }
 const processSimulation = () => {
   simulationStatus.value = !simulationStatus.value
-  // console.log(bpmnModeler.get('toggleMode', 'strict'), "bpmnModeler.get('toggleMode')")
+  console.log(bpmnModeler.get('toggleMode', 'strict'), "bpmnModeler.get('toggleMode')")
   props.simulation && bpmnModeler.get('toggleMode', 'strict').toggleMode()
 }
 const processRedo = () => {
@@ -619,7 +630,7 @@ const elementsAlign = (align) => {
 }
 /*-----------------------------    方法结束     ---------------------------------*/
 const previewProcessXML = () => {
-  // console.log(bpmnModeler.saveXML, 'bpmnModeler')
+  console.log(bpmnModeler.saveXML, 'bpmnModeler')
   bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
     // console.log(xml, 'xml111111')
     previewResult.value = xml
@@ -655,10 +666,10 @@ const previewProcessJson = () => {
 }
 /* ------------------------------------------------ 芋道源码 methods ------------------------------------------------------ */
 const processSave = async () => {
-  // console.log(bpmnModeler, 'bpmnModelerbpmnModelerbpmnModelerbpmnModeler')
+  console.log(bpmnModeler, 'bpmnModelerbpmnModelerbpmnModelerbpmnModeler')
   const { err, xml } = await bpmnModeler.saveXML()
-  // console.log(err, 'errerrerrerrerr')
-  // console.log(xml, 'xmlxmlxmlxmlxml')
+  console.log(err, 'errerrerrerrerr')
+  console.log(xml, 'xmlxmlxmlxmlxml')
   // 读取异常时抛出异常
   if (err) {
     // this.$modal.msgError('保存模型失败,请重试!')
@@ -668,38 +679,20 @@ const processSave = async () => {
   // 触发 save 事件
   emit('save', xml)
 }
+/** 高亮显示 */
+// const highlightedCode = (previewType, previewResult) => {
+//   console.log(previewType, 'previewType, previewResult')
+//   console.log(previewResult, 'previewType, previewResult')
+//   console.log(hljs.highlight, 'hljs.highlight')
+//   const result = hljs.highlight(previewType, previewResult.value || '', true)
+//   return result.value || '&nbsp;'
+// }
 onBeforeMount(() => {
-  // console.log(props, 'propspropspropsprops')
+  console.log(props, 'propspropspropsprops')
 })
-
-/**
- * 代码高亮
- */
-import hljs from 'highlight.js' // 导入代码高亮文件
-import 'highlight.js/styles/github.css' // 导入代码高亮样式
-import java from 'highlight.js/lib/languages/java'
-import xml from 'highlight.js/lib/languages/java'
-import javascript from 'highlight.js/lib/languages/javascript'
-import sql from 'highlight.js/lib/languages/sql'
-import typescript from 'highlight.js/lib/languages/typescript'
-const highlightedCode = (item) => {
-  const language = item.filePath.substring(item.filePath.lastIndexOf('.') + 1)
-  const result = hljs.highlight(language, item.code || '', true)
-  return result.value || '&nbsp;'
-}
-
-/** 初始化 **/
-onMounted(async () => {
+onMounted(() => {
   initBpmnModeler()
   createNewDiagram(props.value)
-  // 注册代码高亮的各种语言
-  hljs.registerLanguage('java', java)
-  hljs.registerLanguage('xml', xml)
-  hljs.registerLanguage('html', xml)
-  hljs.registerLanguage('vue', xml)
-  hljs.registerLanguage('javascript', javascript)
-  hljs.registerLanguage('sql', sql)
-  hljs.registerLanguage('typescript', typescript)
 })
 onBeforeUnmount(() => {
   // this.$once('hook:beforeDestroy', () => {

+ 1 - 1
src/layout/components/Footer/src/Footer.vue

@@ -1,4 +1,4 @@
-<script lang="ts" name="Footer" setup>
+<script lang="ts" setup>
 import { useAppStore } from '@/store/modules/app'
 import { useDesign } from '@/hooks/web/useDesign'
 

+ 0 - 1
src/layout/components/TagsView/src/TagsView.vue

@@ -3,7 +3,6 @@ import type { RouteLocationNormalizedLoaded, RouterLinkProps } from 'vue-router'
 import { usePermissionStore } from '@/store/modules/permission'
 import { useTagsViewStore } from '@/store/modules/tagsView'
 import { useAppStore } from '@/store/modules/app'
-
 import { filterAffixTags } from './helper'
 import { ContextMenu, ContextMenuExpose } from '@/layout/components/ContextMenu'
 import { useDesign } from '@/hooks/web/useDesign'

+ 1 - 1
src/locales/en.ts

@@ -454,5 +454,5 @@ export default {
     btn_zoom_out: 'Zoom out',
     preview: 'Preivew'
   },
-  'OAuth 2.0': 'OAuth 2.0'
+  'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
 }

+ 3 - 2
src/router/modules/remaining.ts

@@ -122,7 +122,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
           hidden: true,
           canTo: true,
           icon: '',
-          activeMenu: 'system/dict/index'
+          activeMenu: '/system/dict'
         }
       }
     ]
@@ -567,7 +567,8 @@ const remainingRouter: AppRouteRecordRaw[] = [
         meta: {
           title: '联系人详情',
           noCache: true,
-          hidden: true
+          hidden: true,
+          activeMenu: '/crm/contact'
         },
         component: () => import('@/views/crm/contact/detail/index.vue')
       },

+ 6 - 5
src/store/modules/dict.ts

@@ -1,9 +1,10 @@
 import { defineStore } from 'pinia'
 import { store } from '../index'
+// @ts-ignore
 import { DictDataVO } from '@/api/system/dict/types'
 import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
 const { wsCache } = useCache('sessionStorage')
-import { listSimpleDictDataApi } from '@/api/system/dict/dict.data'
+import { getSimpleDictDataList } from '@/api/system/dict/dict.data'
 
 export interface DictValueType {
   value: any
@@ -44,9 +45,9 @@ export const useDictStore = defineStore('dict', {
         this.dictMap = dictMap
         this.isSetDict = true
       } else {
-        const res = await listSimpleDictDataApi()
+        const res = await getSimpleDictDataList()
         // 设置数据
-        const dictDataMap = new Map<string, any>();
+        const dictDataMap = new Map<string, any>()
         if (res != null) {
           res.forEach((dictData: DictDataVO) => {
             // 获得 dictType 层级
@@ -61,7 +62,7 @@ export const useDictStore = defineStore('dict', {
               colorType: dictData.colorType,
               cssClass: dictData.cssClass
             })
-          });
+          })
         }
         this.dictMap = dictDataMap
         this.isSetDict = true
@@ -76,7 +77,7 @@ export const useDictStore = defineStore('dict', {
     },
     async resetDict() {
       wsCache.delete(CACHE_KEY.DICT_CACHE)
-      const res = await listSimpleDictDataApi()
+      const res = await getSimpleDictDataList()
       // 设置数据
       const dictDataMap = new Map<string, any>()
       res.forEach((dictData: DictDataVO) => {

+ 0 - 47
src/utils/formatTime.ts

@@ -72,53 +72,6 @@ export function formatDate(date: Date, format?: string): string {
   return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''
 }
 
-// TODO 芋艿:稍后去掉
-// 日期格式化
-export function parseTime(time: any, pattern?: string) {
-  if (arguments.length === 0 || !time) {
-    return null
-  }
-  const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
-  let date
-  if (typeof time === 'object') {
-    date = time
-  } else {
-    if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
-      time = parseInt(time)
-    } else if (typeof time === 'string') {
-      time = time
-        .replace(new RegExp(/-/gm), '/')
-        .replace('T', ' ')
-        .replace(new RegExp(/\.\d{3}/gm), '')
-    }
-    if (typeof time === 'number' && time.toString().length === 10) {
-      time = time * 1000
-    }
-    date = new Date(time)
-  }
-  const formatObj = {
-    y: date.getFullYear(),
-    m: date.getMonth() + 1,
-    d: date.getDate(),
-    h: date.getHours(),
-    i: date.getMinutes(),
-    s: date.getSeconds(),
-    a: date.getDay()
-  }
-  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
-    let value = formatObj[key]
-    // Note: getDay() returns 0 on Sunday
-    if (key === 'a') {
-      return ['日', '一', '二', '三', '四', '五', '六'][value]
-    }
-    if (result.length > 0 && value < 10) {
-      value = '0' + value
-    }
-    return value || 0
-  })
-  return time_str
-}
-
 /**
  * 获取当前的日期+时间
  */

+ 2 - 0
src/utils/tree.ts

@@ -271,6 +271,7 @@ export const handleTree = (data: any[], id?: string, parentId?: string, children
 
   return tree
 }
+
 /**
  * 构造树型结构数据
  * @param {*} data 数据源
@@ -279,6 +280,7 @@ export const handleTree = (data: any[], id?: string, parentId?: string, children
  * @param {*} children 孩子节点字段 默认 'children'
  * @param {*} rootId 根Id 默认 0
  */
+// @ts-ignore
 export const handleTree2 = (data, id, parentId, children, rootId) => {
   id = id || 'id'
   parentId = parentId || 'parentId'

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

@@ -19,11 +19,11 @@
       <el-col :span="24" style="padding-right: 10px; padding-left: 10px">
         <el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
           <el-input
-            type="primary"
-            link
             v-model="loginData.loginForm.tenantName"
             :placeholder="t('login.tenantNamePlaceholder')"
             :prefix-icon="iconHouse"
+            type="primary"
+            link
           />
         </el-form-item>
       </el-col>

+ 1 - 1
src/views/bpm/group/UserGroupForm.vue

@@ -70,7 +70,7 @@ const formRules = reactive({
   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
-const userList = ref([]) // 用户列表
+const userList = ref<any[]>([]) // 用户列表
 
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {

+ 1 - 1
src/views/bpm/processInstance/detail/ProcessInstanceBpmnViewer.vue

@@ -16,8 +16,8 @@
 </template>
 <script lang="ts" setup>
 import { propTypes } from '@/utils/propTypes'
-import * as ActivityApi from '@/api/bpm/activity'
 import { MyProcessViewer } from '@/components/bpmnProcessDesigner/package'
+import * as ActivityApi from '@/api/bpm/activity'
 
 defineOptions({ name: 'BpmProcessInstanceBpmnViewer' })
 

+ 1 - 1
src/views/infra/codegen/components/ColumnInfoForm.vue

@@ -117,7 +117,7 @@ import { PropType } from 'vue'
 import * as CodegenApi from '@/api/infra/codegen'
 import * as DictDataApi from '@/api/system/dict/dict.type'
 
-defineOptions({ name: 'InfraCodegenColumInfoForm' })
+defineOptions({ name: 'InfraCodegenColumnInfoForm' })
 
 const props = defineProps({
   columns: {

+ 2 - 0
src/views/infra/dbDoc/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="数据库文档" url="https://doc.iocoder.cn/db-doc/" />
+
   <ContentWrap title="数据库文档">
     <div class="mb-10px">
       <el-button type="primary" plain @click="handleExport('HTML')">

+ 3 - 0
src/views/infra/druid/index.vue

@@ -1,4 +1,7 @@
 <template>
+  <doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" />
+  <doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" />
+
   <ContentWrap>
     <IFrame v-if="!loading" :src="url" />
   </ContentWrap>

+ 5 - 54
src/views/infra/redis/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" />
+  <doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" />
   <el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
     <el-row>
       <!-- 基本信息 -->
@@ -59,68 +61,20 @@
       </el-col>
     </el-row>
   </el-scrollbar>
-  <XModal v-model="dialogVisible" :title="keyTemplate + ' 模板'">
-    <el-row>
-      <el-col :span="14" class="mt-3">
-        <el-card shadow="always">
-          <template #header>
-            <div class="card-header">
-              <span>键名列表</span>
-            </div>
-          </template>
-          <el-table :data="cacheKeys" style="width: 100%" @row-click="handleKeyValue">
-            <el-table-column label="缓存键名" align="center" :show-overflow-tooltip="true">
-              <template #default="{ row }">
-                {{ row }}
-              </template>
-            </el-table-column>
-            <el-table-column label="操作" align="right" width="60">
-              <template #default="{ row }">
-                <XTextButton preIcon="ep:delete" @click="handleDeleteKey(row)" />
-              </template>
-            </el-table-column>
-          </el-table>
-        </el-card>
-      </el-col>
-      <el-col :span="10" class="mt-3">
-        <el-card shadow="always">
-          <template #header>
-            <div class="card-header">
-              <span>缓存内容</span>
-              <XTextButton
-                preIcon="ep:refresh"
-                title="清理全部"
-                class="float-right p-1"
-                @click="handleDeleteKeys(keyTemplate)"
-              />
-            </div>
-          </template>
-          <el-descriptions :column="1">
-            <el-descriptions-item label="缓存键名:">{{ cacheForm.key }}</el-descriptions-item>
-            <el-descriptions-item label="缓存内容:">{{ cacheForm.value }}</el-descriptions-item>
-          </el-descriptions>
-        </el-card>
-      </el-col>
-    </el-row>
-  </XModal>
 </template>
 <script lang="ts" setup>
 import * as RedisApi from '@/api/infra/redis'
-import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
-import { DICT_TYPE } from '@/utils/dict'
+import { RedisMonitorInfoVO } from '@/api/infra/redis/types'
 
 defineOptions({ name: 'InfraRedis' })
 
-const { t } = useI18n() // 国际化
-const message = useMessage() // 消息弹窗
 const cache = ref<RedisMonitorInfoVO>()
 // 基本信息
 const readRedisInfo = async () => {
   const data = await RedisApi.getCacheApi()
   cache.value = data
-  // loadEchartOptions(data.commandStats)
 }
-const dialogVisible = ref(false)
+
 // 内存使用情况
 const usedmemoryEchartChika = reactive<any>({
   title: {
@@ -299,7 +253,7 @@ const usedMemoryInstance = async () => {
       value: cache.value!.info.used_memory_human,
       name: '内存消耗'
     }
-    // console.log(cache.value!.info)
+    console.log(cache.value!.info)
     usedmemoryEchartChika.tooltip = {
       formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human
     }
@@ -313,7 +267,4 @@ onMounted(() => {
   // 加载数据
   getSummary()
 })
-onBeforeMount(() => {
-  readRedisInfo()
-})
 </script>

+ 2 - 0
src/views/infra/server/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
+
   <ContentWrap>
     <IFrame v-if="!loading" v-loading="loading" :src="src" />
   </ContentWrap>

+ 2 - 0
src/views/infra/skywalking/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
+
   <ContentWrap>
     <IFrame v-if="!loading" v-loading="loading" :src="src" />
   </ContentWrap>

+ 2 - 0
src/views/infra/swagger/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" />
+
   <ContentWrap>
     <IFrame :src="src" />
   </ContentWrap>

+ 1 - 1
src/views/infra/webSocket/index.vue

@@ -74,7 +74,7 @@ import { useWebSocket } from '@vueuse/core'
 import { getAccessToken } from '@/utils/auth'
 import * as UserApi from '@/api/system/user'
 
-defineOptions({ name: 'WebSocket' })
+defineOptions({ name: 'InfraWebSocket' })
 
 const message = useMessage() // 消息弹窗
 

+ 1 - 1
src/views/mall/product/category/CategoryForm.vue

@@ -51,7 +51,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
 import { CommonStatusEnum } from '@/utils/constants'
 import * as ProductCategoryApi from '@/api/mall/product/category'
 
-defineOptions({ name: 'ProductCategoryForm' })
+defineOptions({ name: 'ProductCategory' })
 
 const { t } = useI18n() // 国际化
 const message = useMessage() // 消息弹窗

+ 2 - 4
src/views/mall/product/property/PropertyForm.vue

@@ -15,10 +15,8 @@
       </el-form-item>
     </el-form>
     <template #footer>
-      <div class="dialog-footer">
-        <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="dialogVisible = false">取 消</el-button>
-      </div>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
 </template>

+ 10 - 11
src/views/mall/product/spu/components/SkuList.vue

@@ -103,7 +103,7 @@
       <el-table-column align="center" label="一级返佣(元)" min-width="168">
         <template #default="{ row }">
           <el-input-number
-            v-model="row.firstBrokerageRecord"
+            v-model="row.firstBrokeragePrice"
             :min="0"
             :precision="2"
             :step="0.1"
@@ -115,7 +115,7 @@
       <el-table-column align="center" label="二级返佣(元)" min-width="168">
         <template #default="{ row }">
           <el-input-number
-            v-model="row.secondBrokerageRecord"
+            v-model="row.secondBrokeragePrice"
             :min="0"
             :precision="2"
             :step="0.1"
@@ -211,12 +211,12 @@
     <template v-if="formData!.subCommissionType">
       <el-table-column align="center" label="一级返佣(元)" min-width="80">
         <template #default="{ row }">
-          {{ row.firstBrokerageRecord }}
+          {{ row.firstBrokeragePrice }}
         </template>
       </el-table-column>
       <el-table-column align="center" label="二级返佣(元)" min-width="80">
         <template #default="{ row }">
-          {{ row.secondBrokerageRecord }}
+          {{ row.secondBrokeragePrice }}
         </template>
       </el-table-column>
     </template>
@@ -294,7 +294,6 @@ import { PropertyAndValues } from './index'
 import { ElTable } from 'element-plus'
 
 defineOptions({ name: 'SkuList' })
-
 const message = useMessage() // 消息弹窗
 
 const props = defineProps({
@@ -326,8 +325,8 @@ const skuList = ref<Sku[]>([
     stock: 0, // 库存
     weight: 0, // 商品重量
     volume: 0, // 商品体积
-    firstBrokerageRecord: 0, // 一级分销的佣金
-    secondBrokerageRecord: 0 // 二级分销的佣金
+    firstBrokeragePrice: 0, // 一级分销的佣金
+    secondBrokeragePrice: 0 // 二级分销的佣金
   }
 ]) // 批量添加时的临时数据
 
@@ -446,8 +445,8 @@ const generateTableData = (propertyList: any[]) => {
       stock: 0,
       weight: 0,
       volume: 0,
-      firstBrokerageRecord: 0,
-      secondBrokerageRecord: 0
+      firstBrokeragePrice: 0,
+      secondBrokeragePrice: 0
     }
     // 如果存在属性相同的 sku 则不做处理
     const index = formData.value!.skus!.findIndex(
@@ -522,8 +521,8 @@ watch(
           stock: 0,
           weight: 0,
           volume: 0,
-          firstBrokerageRecord: 0,
-          secondBrokerageRecord: 0
+          firstBrokeragePrice: 0,
+          secondBrokeragePrice: 0
         }
       ]
     }

+ 2 - 2
src/views/mall/product/spu/components/index.ts

@@ -24,7 +24,7 @@ interface RuleConfig {
 }
 
 /**
- * 获得商品的规格列表
+ * 获得商品的规格列表 - 商品相关的公共函数
  *
  * @param spu
  * @return PropertyAndValues 规格列表
@@ -51,4 +51,4 @@ const getPropertyList = (spu: Spu): PropertyAndValues[] => {
   return properties
 }
 
-export { SkuList, getPropertyList, PropertyAndValues, RuleConfig }
+export { SkuList, PropertyAndValues, RuleConfig, getPropertyList }

+ 8 - 8
src/views/mall/product/spu/form/index.vue

@@ -102,8 +102,8 @@ const formData = ref<ProductSpuApi.Spu>({
       stock: 0, // 库存
       weight: 0, // 商品重量
       volume: 0, // 商品体积
-      firstBrokerageRecord: 0, // 一级分销的佣金
-      secondBrokerageRecord: 0 // 二级分销的佣金
+      firstBrokeragePrice: 0, // 一级分销的佣金
+      secondBrokeragePrice: 0 // 二级分销的佣金
     }
   ],
   description: '', // 商品详情
@@ -127,15 +127,15 @@ const getDetail = async () => {
           item.price = floatToFixed2(item.price)
           item.marketPrice = floatToFixed2(item.marketPrice)
           item.costPrice = floatToFixed2(item.costPrice)
-          item.firstBrokerageRecord = floatToFixed2(item.firstBrokerageRecord)
-          item.secondBrokerageRecord = floatToFixed2(item.secondBrokerageRecord)
+          item.firstBrokeragePrice = floatToFixed2(item.firstBrokeragePrice)
+          item.secondBrokeragePrice = floatToFixed2(item.secondBrokeragePrice)
         } else {
           // 回显价格分转元
           item.price = formatToFraction(item.price)
           item.marketPrice = formatToFraction(item.marketPrice)
           item.costPrice = formatToFraction(item.costPrice)
-          item.firstBrokerageRecord = formatToFraction(item.firstBrokerageRecord)
-          item.secondBrokerageRecord = formatToFraction(item.secondBrokerageRecord)
+          item.firstBrokeragePrice = formatToFraction(item.firstBrokeragePrice)
+          item.secondBrokeragePrice = formatToFraction(item.secondBrokeragePrice)
         }
       })
       formData.value = res
@@ -165,8 +165,8 @@ const submitForm = async () => {
       item.price = convertToInteger(item.price)
       item.marketPrice = convertToInteger(item.marketPrice)
       item.costPrice = convertToInteger(item.costPrice)
-      item.firstBrokerageRecord = convertToInteger(item.firstBrokerageRecord)
-      item.secondBrokerageRecord = convertToInteger(item.secondBrokerageRecord)
+      item.firstBrokeragePrice = convertToInteger(item.firstBrokeragePrice)
+      item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice)
     })
     // 处理轮播图列表
     const newSliderPicUrls: any[] = []

+ 1 - 25
src/views/member/user/UserForm.vue

@@ -60,22 +60,6 @@
       <el-form-item label="用户标签" prop="tagIds">
         <MemberTagSelect v-model="formData.tagIds" show-add />
       </el-form-item>
-      <el-row>
-        <el-col :span="12">
-          <el-form-item label="用户等级" prop="levelId">
-            <MemberLevelSelect v-model="formData.levelId" />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item
-            label="修改原因"
-            prop="levelReason"
-            v-if="formData.levelId !== originLevelId"
-          >
-            <el-input type="text" v-model="formData.levelReason" placeholder="请输入修改原因" />
-          </el-form-item>
-        </el-col>
-      </el-row>
       <el-form-item label="用户分组" prop="groupId">
         <MemberGroupSelect v-model="formData.groupId" />
       </el-form-item>
@@ -95,7 +79,6 @@ import * as UserApi from '@/api/member/user'
 import * as AreaApi from '@/api/system/area'
 import { defaultProps } from '@/utils/tree'
 import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue'
-import MemberLevelSelect from '@/views/member/level/components/MemberLevelSelect.vue'
 import MemberGroupSelect from '@/views/member/group/components/MemberGroupSelect.vue'
 
 const { t } = useI18n() // 国际化
@@ -118,18 +101,14 @@ const formData = ref({
   birthday: undefined,
   mark: undefined,
   tagIds: [],
-  levelId: undefined,
-  levelReason: undefined,
   groupId: undefined
 })
 const formRules = reactive({
   mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
-  status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
-  levelReason: [{ required: true, message: '修改原因不能为空', trigger: 'blur' }]
+  status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
 })
 const formRef = ref() // 表单 Ref
 const areaList = ref([]) // 地区列表
-const originLevelId = ref() // 修改前的会员等级
 
 /** 打开弹窗 */
 const open = async (type: string, id?: number) => {
@@ -142,7 +121,6 @@ const open = async (type: string, id?: number) => {
     formLoading.value = true
     try {
       formData.value = await UserApi.getUser(id)
-      originLevelId.value = formData.value.levelId
     } finally {
       formLoading.value = false
     }
@@ -194,8 +172,6 @@ const resetForm = () => {
     birthday: undefined,
     mark: undefined,
     tagIds: [],
-    levelId: undefined,
-    levelReason: undefined,
     groupId: undefined
   }
   formRef.value?.resetFields()

+ 2 - 0
src/views/mp/account/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="公众号接入" url="https://doc.iocoder.cn/mp/account/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 2 - 0
src/views/mp/autoReply/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="自动回复" url="https://doc.iocoder.cn/mp/auto-reply/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" :model="queryParams" :inline="true" label-width="68px">

+ 1 - 1
src/views/mp/components/wx-voice-play/main.vue

@@ -17,7 +17,7 @@
       <span class="amr-duration" v-if="duration">{{ duration }} 秒</span>
     </el-icon>
     <div v-if="content">
-      <el-tag type="success" size="mini">语音识别</el-tag>
+      <el-tag type="success" size="small">语音识别</el-tag>
       {{ content }}
     </div>
   </div>

+ 2 - 0
src/views/mp/draft/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 2 - 0
src/views/mp/freePublish/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 1 - 0
src/views/mp/material/index.vue

@@ -1,4 +1,5 @@
 <template>
+  <doc-alert title="公众号素材" url="https://doc.iocoder.cn/mp/material/" />
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" :inline="true" label-width="68px">

+ 1 - 0
src/views/mp/menu/index.vue

@@ -1,4 +1,5 @@
 <template>
+  <doc-alert title="公众号菜单" url="https://doc.iocoder.cn/mp/menu/" />
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form class="-mb-15px" ref="queryFormRef" :inline="true" label-width="68px">

+ 2 - 0
src/views/mp/tag/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="公众号标签" url="https://doc.iocoder.cn/mp/tag/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 2 - 0
src/views/mp/user/index.vue

@@ -1,4 +1,6 @@
 <template>
+  <doc-alert title="公众号粉丝" url="https://doc.iocoder.cn/mp/user/" />
+
   <!-- 搜索工作栏 -->
   <ContentWrap>
     <el-form

+ 2 - 2
src/views/system/social/client/SocialClientForm.vue

@@ -14,7 +14,7 @@
         <el-radio-group v-model="formData.socialType">
           <el-radio
             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_TYPE)"
-            :key="dict.value as number"
+            :key="dict.value"
             :label="dict.value"
           >
             {{ dict.label }}
@@ -48,7 +48,7 @@
         <el-radio-group v-model="formData.status">
           <el-radio
             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
-            :key="dict.value as number"
+            :key="dict.value"
             :label="dict.value"
           >
             {{ dict.label }}

+ 3 - 3
src/views/system/social/client/index.vue

@@ -28,7 +28,7 @@
         >
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_TYPE)"
-            :key="dict.value as number"
+            :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           />
@@ -43,7 +43,7 @@
         >
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.USER_TYPE)"
-            :key="dict.value as number"
+            :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           />
@@ -62,7 +62,7 @@
         <el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="请选择状态">
           <el-option
             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
-            :key="dict.value as number"
+            :key="dict.value"
             :label="dict.label"
             :value="dict.value"
           />