浏览代码

优化整体UI样式

Huanyi 1 月之前
父节点
当前提交
80e07aa7b3
共有 57 个文件被更改,包括 1653 次插入1717 次删除
  1. 2 2
      .env.development
  2. 2 2
      .env.production
  3. 1 1
      LICENSE
  4. 1 1
      README.md
  5. 3 3
      package.json
  6. 二进制
      public/favicon.ico
  7. 11 0
      src/api/erp/order/index.ts
  8. 二进制
      src/assets/logo/logo.jpg
  9. 二进制
      src/assets/logo/logo.png
  10. 1 1
      src/components/RuoYiGit/index.vue
  11. 2 5
      src/layout/components/Sidebar/Logo.vue
  12. 1 1
      src/layout/components/notice/index.vue
  13. 2 4
      src/views/complaint/index.vue
  14. 5 7
      src/views/customer/index.vue
  15. 16 15
      src/views/demo/demo/index.vue
  16. 17 30
      src/views/demo/tree/index.vue
  17. 588 137
      src/views/index.vue
  18. 57 73
      src/views/login.vue
  19. 7 11
      src/views/monitor/online/index.vue
  20. 1 3
      src/views/monitor/operlog/index.vue
  21. 26 191
      src/views/order/index.vue
  22. 1 1
      src/views/system/agreement/index.vue
  23. 24 17
      src/views/system/client/index.vue
  24. 23 24
      src/views/system/config/index.vue
  25. 27 46
      src/views/system/dept/index.vue
  26. 69 121
      src/views/system/dict/index.vue
  27. 31 52
      src/views/system/menu/index.vue
  28. 20 17
      src/views/system/notice/index.vue
  29. 259 306
      src/views/system/oss/config.vue
  30. 28 46
      src/views/system/oss/index.vue
  31. 2 2
      src/views/system/phone/index.vue
  32. 32 66
      src/views/system/post/index.vue
  33. 1 3
      src/views/system/role/authUser.vue
  34. 48 66
      src/views/system/role/index.vue
  35. 2 2
      src/views/system/role/selectUser.vue
  36. 35 28
      src/views/system/tenant/index.vue
  37. 25 26
      src/views/system/tenantPackage/index.vue
  38. 2 2
      src/views/system/user/authRole.vue
  39. 68 102
      src/views/system/user/index.vue
  40. 2 13
      src/views/system/user/profile/index.vue
  41. 1 3
      src/views/system/user/profile/onlineDevice.vue
  42. 2 2
      src/views/system/user/profile/resetPwd.vue
  43. 9 18
      src/views/system/user/profile/userAvatar.vue
  44. 2 2
      src/views/system/user/profile/userInfo.vue
  45. 4 3
      src/views/tool/gen/editTable.vue
  46. 2 2
      src/views/tool/gen/importTable.vue
  47. 30 36
      src/views/tool/gen/index.vue
  48. 17 30
      src/views/workflow/category/index.vue
  49. 21 26
      src/views/workflow/leave/index.vue
  50. 8 22
      src/views/workflow/processDefinition/index.vue
  51. 53 62
      src/views/workflow/processInstance/index.vue
  52. 4 8
      src/views/workflow/spel/index.vue
  53. 22 20
      src/views/workflow/task/allTaskWaiting.vue
  54. 20 40
      src/views/workflow/task/myDocument.vue
  55. 1 1
      src/views/workflow/task/taskCopyList.vue
  56. 14 14
      src/views/workflow/task/taskFinish.vue
  57. 1 1
      src/views/workflow/task/taskWaiting.vue

+ 2 - 2
.env.development

@@ -1,6 +1,6 @@
 # 页面标题
-VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
-VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
+VITE_APP_TITLE = 华晟在线下单系统
+VITE_APP_LOGO_TITLE = 华晟在线下单
 
 # 开发环境配置
 VITE_APP_ENV = 'development'

+ 2 - 2
.env.production

@@ -1,6 +1,6 @@
 # 页面标题
-VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
-VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
+VITE_APP_TITLE = 华晟在线下单系统
+VITE_APP_LOGO_TITLE = 华晟在线下单
 
 # 生产环境配置
 VITE_APP_ENV = 'production'

+ 1 - 1
LICENSE

@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2019 RuoYi-Vue-Plus
+Copyright (c) 2025 huasheng-erp-order-system
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of
 this software and associated documentation files (the "Software"), to deal in

+ 1 - 1
README.md

@@ -8,7 +8,7 @@
 
 | 介绍         | 项目名              | 项目地址                                                                                                                                                                           |
 |------------|:-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| 🔥 分布式集群框架 | RuoYi-Vue-Plus   | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus)      |
+| 🔥 分布式集群框架 | huasheng-erp-order-system   | - [Gitee](https://gitee.com/dromara/huasheng-erp-order-system)<br> - [GitHub](https://github.com/dromara/huasheng-erp-order-system)<br> - [GitCode](https://gitcode.com/dromara/huasheng-erp-order-system)      |
 | 🔥 微服务框架   | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) |
 
 ## 分支说明

+ 3 - 3
package.json

@@ -1,8 +1,8 @@
 {
   "$schema": "https://json.schemastore.org/package",
-  "name": "ruoyi-vue-plus",
-  "version": "5.6.1-2.6.1",
-  "description": "RuoYi-Vue-Plus多租户管理系统",
+  "name": "huasheng-erp-order-system",
+  "version": "1.0.0",
+  "description": "华晟ERP下单管理系统",
   "author": "LionLi",
   "license": "MIT",
   "type": "module",

二进制
public/favicon.ico


+ 11 - 0
src/api/erp/order/index.ts

@@ -52,3 +52,14 @@ export function auditOrder(data: any) {
     data: data
   });
 }
+
+/**
+ * 按状态统计订单数量
+ * @Author: Antigravity
+ */
+export function countOrder(): AxiosPromise<Record<string, number>> {
+  return request({
+    url: '/erp/order/count',
+    method: 'get'
+  });
+}

二进制
src/assets/logo/logo.jpg


二进制
src/assets/logo/logo.png


+ 1 - 1
src/components/RuoYiGit/index.vue

@@ -5,7 +5,7 @@
 </template>
 
 <script setup lang="ts">
-const url = ref('https://gitee.com/dromara/RuoYi-Vue-Plus');
+const url = ref('https://gitee.com/dromara/huasheng-erp-order-system');
 
 function goto() {
   window.open(url.value);

+ 2 - 5
src/layout/components/Sidebar/Logo.vue

@@ -1,8 +1,5 @@
 <template>
-  <div
-    class="sidebar-logo-container"
-    :class="{ collapse: collapse }"
-  >
+  <div class="sidebar-logo-container" :class="{ collapse: collapse }">
     <transition :enter-active-class="proxy?.animate.logoAnimate.enter" mode="out-in">
       <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
         <img v-if="logo" :src="logo" class="sidebar-logo" />
@@ -22,7 +19,7 @@
 
 <script setup lang="ts">
 import variables from '@/assets/styles/variables.module.scss';
-import logo from '@/assets/logo/logo.png';
+import logo from '@/assets/logo/logo.jpg';
 import { useSettingsStore } from '@/store/modules/settings';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 import { NavTypeEnum } from '@/enums/NavTypeEnum';

+ 1 - 1
src/layout/components/notice/index.vue

@@ -54,7 +54,7 @@ const onNewsClick = (item: any) => {
 
 // 前往通知中心点击
 const onGoToGiteeClick = () => {
-  window.open('https://gitee.com/dromara/RuoYi-Vue-Plus/tree/5.X/');
+  window.open('https://gitee.com/dromara/huasheng-erp-order-system');
 };
 
 onMounted(() => {

+ 2 - 4
src/views/complaint/index.vue

@@ -56,10 +56,8 @@
                 <el-table-column label="提交时间" align="center" prop="createTime" width="160" />
                 <el-table-column label="操作" align="center" width="80">
                     <template #default="scope">
-                        <el-tooltip content="删除" placement="top">
-                            <el-button v-hasPermi="['system:complaint:remove']" link type="primary" icon="Delete"
-                                @click="handleDelete(scope.row)"></el-button>
-                        </el-tooltip>
+                        <el-button v-hasPermi="['system:complaint:remove']" link type="danger" icon="Delete"
+                            @click="handleDelete(scope.row)">删除</el-button>
                     </template>
                 </el-table-column>
             </el-table>

+ 5 - 7
src/views/customer/index.vue

@@ -41,12 +41,10 @@
                 <el-table-column label="授权客户名称" align="center" prop="authClientName" :show-overflow-tooltip="true" />
                 <el-table-column label="授权客户类型" align="center" prop="authClientClass" width="120" />
                 <el-table-column label="授权加入时间" align="center" prop="authClientEnterDate" width="160" />
-                <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100">
                     <template #default="scope">
-                        <el-tooltip content="授权客户" placement="top">
-                            <el-button v-hasPermi="['customer:customer:auth']" link type="primary" icon="User"
-                                @click="handleAuth(scope.row)"></el-button>
-                        </el-tooltip>
+                        <el-button v-hasPermi="['customer:customer:auth']" link type="success" icon="User"
+                            @click="handleAuth(scope.row)">授权</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -85,8 +83,8 @@
                 @pagination="getErpList" />
             <template #footer>
                 <div class="dialog-footer">
-                    <el-button :loading="buttonLoading" type="primary" @click="confirmAuth">确 定</el-button>
-                    <el-button @click="authDialog.visible = false">取 消</el-button>
+                    <el-button :loading="buttonLoading" type="primary" icon="Check" @click="confirmAuth">确 定</el-button>
+                    <el-button icon="Close" @click="authDialog.visible = false">取 消</el-button>
                 </div>
             </template>
         </el-dialog>

+ 16 - 15
src/views/demo/demo/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -26,15 +27,16 @@
             <el-button v-hasPermi="['demo:demo:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['demo:demo:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button>
+            <el-button v-hasPermi="['demo:demo:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['demo:demo:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
-              >删除</el-button
-            >
+            <el-button v-hasPermi="['demo:demo:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">删除</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['demo:demo:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['demo:demo:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -50,17 +52,16 @@
         <el-table-column label="值" align="center" prop="value" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['demo:demo:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['demo:demo:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['demo:demo:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['demo:demo:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
     <!-- 添加或修改测试单对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
@@ -83,8 +84,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 17 - 30
src/views/demo/tree/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -20,7 +21,8 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['demo:tree:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+            <el-button v-hasPermi="['demo:tree:add']" type="primary" plain icon="Plus"
+              @click="handleAdd()">新增</el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
@@ -28,30 +30,20 @@
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
       </template>
-      <el-table
-        ref="treeTableRef"
-        v-loading="loading"
-        :data="treeList"
-        row-key="id"
-        border
-        :default-expand-all="isExpandAll"
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-      >
+      <el-table ref="treeTableRef" v-loading="loading" :data="treeList" row-key="id" border
+        :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
         <el-table-column label="父id" align="center" prop="parentId" />
         <el-table-column label="部门id" align="center" prop="deptId" />
         <el-table-column label="用户id" align="center" prop="userId" />
         <el-table-column label="树节点名" align="center" prop="treeName" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['demo:tree:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button v-hasPermi="['demo:tree:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['demo:tree:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
-            </el-tooltip>
+            <el-button v-hasPermi="['demo:tree:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['demo:tree:add']" link type="success" icon="Plus"
+              @click="handleAdd(scope.row)">新增</el-button>
+            <el-button v-hasPermi="['demo:tree:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -60,14 +52,9 @@
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
       <el-form ref="treeFormRef" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="父id" prop="parentId">
-          <el-tree-select
-            v-model="form.parentId"
-            :data="treeOptions"
-            :props="{ value: 'id', label: 'treeName', children: 'children' } as any"
-            value-key="id"
-            placeholder="请选择父id"
-            check-strictly
-          />
+          <el-tree-select v-model="form.parentId" :data="treeOptions"
+            :props="{ value: 'id', label: 'treeName', children: 'children' } as any" value-key="id" placeholder="请选择父id"
+            check-strictly />
         </el-form-item>
         <el-form-item label="部门id" prop="deptId">
           <el-input v-model="form.deptId" placeholder="请输入部门id" />
@@ -81,8 +68,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 588 - 137
src/views/index.vue

@@ -1,165 +1,616 @@
 <template>
-  <div class="app-container home">
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>RuoYi-Vue-Plus多租户管理系统</h2>
-        <p>
-          RuoYi-Vue-Plus 是基于 RuoYi-Vue 针对 分布式集群 场景升级(不兼容原框架)
-          <br />
-          * 前端开发框架 Vue3、TS、Element Plus<br />
-          * 后端开发框架 Spring Boot<br />
-          * 容器框架 Undertow 基于 Netty 的高性能容器<br />
-          * 权限认证框架 Sa-Token 支持多终端认证系统<br />
-          * 关系数据库 MySQL 适配 8.X 最低 5.7<br />
-          * 缓存数据库 Redis 适配 6.X 最低 4.X<br />
-          * 数据库框架 Mybatis-Plus 快速 CRUD 增加开发效率<br />
-          * 数据库框架 p6spy 更强劲的 SQL 分析<br />
-          * 多数据源框架 dynamic-datasource 支持主从与多种类数据库异构<br />
-          * 序列化框架 Jackson 统一使用 jackson 高效可靠<br />
-          * Redis客户端 Redisson 性能强劲、API丰富<br />
-          * 分布式限流 Redisson 全局、请求IP、集群ID 多种限流<br />
-          * 分布式锁 Lock4j 注解锁、工具锁 多种多样<br />
-          * 分布式幂等 Lock4j 基于分布式锁实现<br />
-          * 分布式链路追踪 SkyWalking 支持链路追踪、网格分析、度量聚合、可视化<br />
-          * 分布式任务调度 SnailJob 高性能 高可靠 易扩展<br />
-          * 文件存储 Minio 本地存储<br />
-          * 文件存储 七牛、阿里、腾讯 云存储<br />
-          * 监控框架 SpringBoot-Admin 全方位服务监控<br />
-          * 校验框架 Validation 增强接口安全性 严谨性<br />
-          * Excel框架 FastExcel(原Alibaba EasyExcel) 性能优异 扩展性强<br />
-          * 文档框架 SpringDoc、javadoc 无注解零入侵基于java注释<br />
-          * 工具类框架 Hutool、Lombok 减少代码冗余 增加安全性<br />
-          * 代码生成器 适配MP、SpringDoc规范化代码 一键生成前后端代码<br />
-          * 部署方式 Docker 容器编排 一键部署业务集群<br />
-          * 国际化 SpringMessage Spring标准国际化方案<br />
-        </p>
-        <p><b>当前版本:</b> <span>v5.6.1</span></p>
-        <p>
-          <el-tag type="danger">&yen;免费开源</el-tag>
-        </p>
-        <p>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://gitee.com/dromara/RuoYi-Vue-Plus')">访问码云</el-button>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://github.com/dromara/RuoYi-Vue-Plus')">访问GitHub</el-button>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://plus-doc.dromara.org/#/ruoyi-vue-plus/changlog')"
-            >更新日志</el-button
-          >
-        </p>
-      </el-col>
-
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>RuoYi-Cloud-Plus多租户微服务管理系统</h2>
-        <p>
-          RuoYi-Cloud-Plus 微服务通用权限管理系统 重写 RuoYi-Cloud 全方位升级(不兼容原框架)
-          <br />
-          * 前端开发框架 Vue3、TS、Element UI<br />
-          * 后端开发框架 Spring Boot<br />
-          * 微服务开发框架 Spring Cloud、Spring Cloud Alibaba<br />
-          * 容器框架 Undertow 基于 XNIO 的高性能容器<br />
-          * 权限认证框架 Sa-Token、Jwt 支持多终端认证系统<br />
-          * 关系数据库 MySQL 适配 8.X 最低 5.7<br />
-          * 关系数据库 Oracle 适配 11g 12c<br />
-          * 关系数据库 PostgreSQL 适配 13 14<br />
-          * 关系数据库 SQLServer 适配 2017 2019<br />
-          * 缓存数据库 Redis 适配 6.X 最低 5.X<br />
-          * 分布式注册中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
-          * 分布式配置中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
-          * 服务网关 Spring Cloud Gateway 响应式高性能网关<br />
-          * 负载均衡 Spring Cloud Loadbalancer 负载均衡处理<br />
-          * RPC远程调用 Apache Dubbo 原生态使用体验、高性能<br />
-          * 分布式限流熔断 Alibaba Sentinel 无侵入、高扩展<br />
-          * 分布式事务 Alibaba Seata 无侵入、高扩展 支持 四种模式<br />
-          * 分布式消息队列 Apache Kafka 高性能高速度<br />
-          * 分布式消息队列 Apache RocketMQ 高可用功能多样<br />
-          * 分布式消息队列 RabbitMQ 支持各种扩展插件功能多样性<br />
-          * 分布式搜索引擎 ElasticSearch 业界知名<br />
-          * 分布式链路追踪 Apache SkyWalking 链路追踪、网格分析、度量聚合、可视化<br />
-          * 分布式日志中心 ELK 业界成熟解决方案<br />
-          * 分布式监控 Prometheus、Grafana 全方位性能监控<br />
-          * 其余与 Vue 版本一致<br />
-        </p>
-        <p><b>当前版本:</b> <span>v2.6.1</span></p>
-        <p>
-          <el-tag type="danger">&yen;免费开源</el-tag>
-        </p>
-        <p>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://gitee.com/dromara/RuoYi-Cloud-Plus')">访问码云</el-button>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://github.com/dromara/RuoYi-Cloud-Plus')">访问GitHub</el-button>
-          <el-button type="primary" icon="Cloudy" plain @click="goTarget('https://plus-doc.dromara.org/#/ruoyi-cloud-plus/changlog')"
-            >更新日志</el-button
-          >
-        </p>
-      </el-col>
-    </el-row>
-    <el-divider />
+  <div class="dashboard">
+    <div class="welcome-section">
+      <div class="welcome-bg-decor">
+        <div class="decor-ring ring-1"></div>
+        <div class="decor-ring ring-2"></div>
+        <div class="decor-ring ring-3"></div>
+        <div class="decor-grid"></div>
+        <div class="decor-particle p1"></div>
+        <div class="decor-particle p2"></div>
+        <div class="decor-particle p3"></div>
+      </div>
+      <div class="welcome-content">
+        <div class="welcome-text">
+          <div class="welcome-tag">华晟ERP订单管理系统</div>
+          <h2>{{ greeting }},{{ userStore.nickname || userStore.name }}</h2>
+          <p class="welcome-sub">
+            <span class="date-icon">📅</span>
+            {{ currentDate }}
+          </p>
+        </div>
+        <div class="welcome-actions">
+          <el-button plain round icon="Refresh" @click="loadStatistics" :loading="loading">刷新数据</el-button>
+        </div>
+      </div>
+    </div>
+
+    <div class="stats-grid">
+      <div
+        v-for="(stat, idx) in statistics"
+        :key="stat.label"
+        class="stat-card"
+        :style="{ '--card-color': stat.color, '--card-bg': stat.bgColor, '--delay': idx * 0.08 + 's' }"
+        @click="router.push('/order')"
+      >
+        <div class="stat-card-glow" :style="{ background: stat.color }"></div>
+        <div class="stat-card-inner">
+          <div class="stat-top">
+            <div class="stat-icon-wrap">
+              <svg-icon :icon-class="stat.icon" />
+            </div>
+            <div class="stat-badge" :style="{ background: stat.bgColor, color: stat.color }">
+              {{ stat.label }}
+            </div>
+          </div>
+          <div class="stat-body">
+            <div class="stat-value">{{ stat.count }}</div>
+            <div class="stat-unit">笔</div>
+          </div>
+          <div class="stat-footer">
+            <span class="stat-hint">点击查看详情</span>
+            <span class="stat-arrow">→</span>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <div class="chart-section">
+      <div class="chart-header">
+        <div class="chart-header-left">
+          <div class="chart-title">订单分布</div>
+          <div class="chart-subtitle">各状态订单数量占比</div>
+        </div>
+        <div class="chart-legend">
+          <div v-for="stat in statistics" :key="stat.label" class="legend-item">
+            <span class="legend-dot" :style="{ background: stat.color }"></span>
+            <span class="legend-label">{{ stat.label }}</span>
+          </div>
+        </div>
+      </div>
+      <div class="chart-body">
+        <div v-for="(stat, idx) in statistics" :key="stat.label" class="chart-row">
+          <div class="chart-row-label">
+            <span class="chart-row-dot" :style="{ background: stat.color }"></span>
+            {{ stat.label }}
+          </div>
+          <div class="chart-row-bar-wrap">
+            <div class="chart-row-bar-bg">
+              <div
+                class="chart-row-bar-fill"
+                :style="{
+                  width: barWidth(stat.count),
+                  background: `linear-gradient(90deg, ${stat.color}, ${stat.color}dd)`,
+                  '--delay': idx * 0.1 + 's'
+                }"
+              ></div>
+            </div>
+          </div>
+          <div class="chart-row-value">{{ stat.count }}<span class="chart-row-unit">笔</span></div>
+          <div class="chart-row-pct">{{ barPercent(stat.count) }}</div>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
 <script setup name="Index" lang="ts">
-const goTarget = (url: string) => {
-  window.open(url, '__blank');
-};
+import { countOrder } from '@/api/erp/order';
+import { useUserStore } from '@/store/modules/user';
+import { useRouter } from 'vue-router';
+
+/** @Author: Antigravity */
+
+const userStore = useUserStore();
+const router = useRouter();
+const loading = ref(false);
+
+const statistics = ref([
+  { label: '全部订单', count: 0, color: '#4F6EF7', bgColor: '#EEF1FE', icon: 'order' },
+  { label: '待审核', count: 0, color: '#F7A83E', bgColor: '#FEF6E6', icon: 'wait' },
+  { label: '生产中', count: 0, color: '#5FDBA7', bgColor: '#E8FBF2', icon: 'success' },
+  { label: '已完成', count: 0, color: '#409EFF', bgColor: '#ECF5FF', icon: 'finish' }
+]);
+
+const currentDate = computed(() => {
+  const d = new Date();
+  const weekdays = ['日', '一', '二', '三', '四', '五', '六'];
+  return `${d.getFullYear()}年${d.getMonth() + 1}月${d.getDate()}日 星期${weekdays[d.getDay()]}`;
+});
+
+const greeting = computed(() => {
+  const hour = new Date().getHours();
+  if (hour < 6) return '夜深了';
+  if (hour < 9) return '早上好';
+  if (hour < 12) return '上午好';
+  if (hour < 14) return '中午好';
+  if (hour < 18) return '下午好';
+  return '晚上好';
+});
+
+function barWidth(count: number) {
+  const max = Math.max(...statistics.value.map(s => s.count), 1);
+  return (count / max * 100).toFixed(1) + '%';
+}
+
+function barPercent(count: number) {
+  const total = statistics.value.reduce((s, v) => s + v.count, 0);
+  if (!total) return '0%';
+  return (count / total * 100).toFixed(1) + '%';
+}
+
+function loadStatistics() {
+  loading.value = true;
+  countOrder().then(res => {
+    const data = res.data || {};
+    const total = Object.values(data).reduce((sum: number, v: any) => sum + (Number(v) || 0), 0);
+    statistics.value[0].count = total;
+    statistics.value[1].count = data[0] || 0;
+    statistics.value[2].count = data[3] || 0;
+    statistics.value[3].count = data[4] || 0;
+  }).finally(() => {
+    loading.value = false;
+  });
+}
+
+onMounted(() => {
+  loadStatistics();
+});
 </script>
 
 <style lang="scss" scoped>
-.home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
+.dashboard {
+  padding: 24px;
+  min-height: calc(100vh - 100px);
+  background: #f5f7fa;
+}
+
+.welcome-section {
+  background: linear-gradient(135deg, #4F6EF7 0%, #7C5CFC 50%, #A855F7 100%);
+  border-radius: 16px;
+  padding: 36px 44px;
+  margin-bottom: 28px;
+  position: relative;
+  overflow: hidden;
+
+  .welcome-bg-decor {
+    position: absolute;
+    inset: 0;
+    pointer-events: none;
+
+    .decor-ring {
+      position: absolute;
+      border-radius: 50%;
+      border: 1px solid rgba(255, 255, 255, 0.06);
+
+      &.ring-1 {
+        top: -30%;
+        right: -3%;
+        width: 450px;
+        height: 450px;
+      }
+
+      &.ring-2 {
+        bottom: -20%;
+        right: 8%;
+        width: 300px;
+        height: 300px;
+        border-color: rgba(255, 255, 255, 0.04);
+      }
+
+      &.ring-3 {
+        top: 15%;
+        left: 50%;
+        width: 160px;
+        height: 160px;
+        border-color: rgba(255, 255, 255, 0.03);
+      }
+    }
+
+    .decor-grid {
+      position: absolute;
+      top: 24px;
+      left: 32px;
+      width: 72px;
+      height: 72px;
+      background-image:
+        linear-gradient(rgba(255,255,255,0.06) 1px, transparent 1px),
+        linear-gradient(90deg, rgba(255,255,255,0.06) 1px, transparent 1px);
+      background-size: 12px 12px;
+    }
+
+    .decor-particle {
+      position: absolute;
+      border-radius: 50%;
+      background: rgba(255, 255, 255, 0.08);
+
+      &.p1 {
+        top: 25%;
+        left: 38%;
+        width: 6px;
+        height: 6px;
+      }
+
+      &.p2 {
+        top: 55%;
+        left: 42%;
+        width: 4px;
+        height: 4px;
+        background: rgba(255, 255, 255, 0.05);
+      }
+
+      &.p3 {
+        top: 35%;
+        left: 60%;
+        width: 5px;
+        height: 5px;
+      }
+    }
   }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
+
+  .welcome-content {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    position: relative;
+    z-index: 1;
+  }
+
+  .welcome-text {
+    .welcome-tag {
+      display: inline-block;
+      font-size: 12px;
+      color: rgba(255, 255, 255, 0.7);
+      background: rgba(255, 255, 255, 0.1);
+      padding: 3px 12px;
+      border-radius: 20px;
+      margin-bottom: 12px;
+      letter-spacing: 1px;
+      backdrop-filter: blur(4px);
+      border: 1px solid rgba(255, 255, 255, 0.08);
+    }
+
+    h2 {
+      margin: 0 0 10px 0;
+      font-size: 26px;
+      font-weight: 700;
+      color: #fff;
+      letter-spacing: 0.5px;
+    }
+
+    .welcome-sub {
+      margin: 0;
+      font-size: 14px;
+      color: rgba(255, 255, 255, 0.7);
+      display: flex;
+      align-items: center;
+      gap: 6px;
+
+      .date-icon {
+        font-size: 14px;
+      }
+    }
+  }
+
+  .welcome-actions {
+    .el-button {
+      background: rgba(255, 255, 255, 0.12);
+      border-color: rgba(255, 255, 255, 0.2);
+      color: #fff;
+      font-size: 13px;
+      padding: 9px 22px;
+      backdrop-filter: blur(6px);
+      border-radius: 20px;
+
+      &:hover {
+        background: rgba(255, 255, 255, 0.22);
+        border-color: rgba(255, 255, 255, 0.3);
+      }
+    }
+  }
+}
+
+.stats-grid {
+  display: grid;
+  grid-template-columns: repeat(4, 1fr);
+  gap: 20px;
+  margin-bottom: 28px;
+
+  .stat-card {
+    background: #fff;
+    border-radius: 16px;
+    cursor: pointer;
+    transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
+    border: 1px solid #edf0f5;
+    position: relative;
+    overflow: hidden;
+    animation: cardFadeIn 0.6s ease both;
+    animation-delay: var(--delay);
+
+    &:hover {
+      transform: translateY(-8px);
+      box-shadow: 0 20px 48px -8px rgba(0, 0, 0, 0.1);
+      border-color: var(--card-color);
+
+      .stat-card-glow {
+        opacity: 1;
+        transform: scale(1);
+      }
+
+      .stat-arrow {
+        transform: translateX(4px);
+        opacity: 1;
+      }
+    }
+
+    .stat-card-glow {
+      position: absolute;
+      top: -80px;
+      right: -80px;
+      width: 200px;
+      height: 200px;
+      border-radius: 50%;
+      opacity: 0;
+      transform: scale(0.3);
+      transition: all 0.5s ease;
+      filter: blur(50px);
+    }
+
+    .stat-card-inner {
+      position: relative;
+      z-index: 1;
+      padding: 24px 24px 18px;
+    }
+
+    .stat-top {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      margin-bottom: 20px;
+    }
+
+    .stat-icon-wrap {
+      width: 46px;
+      height: 46px;
+      border-radius: 14px;
+      background: var(--card-bg);
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 24px;
+      color: var(--card-color);
+      transition: all 0.4s ease;
+    }
+
+    &:hover .stat-icon-wrap {
+      transform: scale(1.08) rotate(-6deg);
+      box-shadow: 0 8px 24px rgba(79, 110, 247, 0.15);
+    }
+
+    .stat-badge {
+      font-size: 12px;
+      font-weight: 500;
+      padding: 4px 14px;
+      border-radius: 20px;
+      letter-spacing: 0.5px;
+    }
+
+    .stat-body {
+      display: flex;
+      align-items: baseline;
+      gap: 4px;
+      margin-bottom: 16px;
+
+      .stat-value {
+        font-size: 32px;
+        font-weight: 800;
+        color: #1a1a2e;
+        line-height: 1;
+        font-variant-numeric: tabular-nums;
+        letter-spacing: -0.5px;
+      }
+
+      .stat-unit {
+        font-size: 14px;
+        color: #bfc0c4;
+        font-weight: 400;
+      }
+    }
+
+    .stat-footer {
+      display: flex;
+      justify-content: space-between;
+      align-items: center;
+      padding-top: 14px;
+      border-top: 1px solid #f0f2f5;
+
+      .stat-hint {
+        font-size: 12px;
+        color: #c0c4cc;
+      }
+
+      .stat-arrow {
+        font-size: 14px;
+        color: var(--card-color);
+        transition: all 0.3s ease;
+        opacity: 0.5;
+      }
+    }
   }
-  .col-item {
-    margin-bottom: 20px;
+}
+
+.chart-section {
+  background: #fff;
+  border-radius: 16px;
+  padding: 28px 32px;
+  border: 1px solid #edf0f5;
+
+  .chart-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 28px;
+
+    .chart-header-left {
+      .chart-title {
+        font-size: 16px;
+        font-weight: 600;
+        color: #1a1a2e;
+        margin-bottom: 4px;
+      }
+
+      .chart-subtitle {
+        font-size: 13px;
+        color: #bfc0c4;
+      }
+    }
+
+    .chart-legend {
+      display: flex;
+      gap: 20px;
+
+      .legend-item {
+        display: flex;
+        align-items: center;
+        gap: 6px;
+
+        .legend-dot {
+          width: 8px;
+          height: 8px;
+          border-radius: 50%;
+        }
+
+        .legend-label {
+          font-size: 12px;
+          color: #606266;
+        }
+      }
+    }
   }
 
-  ul {
-    padding: 0;
-    margin: 0;
+  .chart-body {
+    display: flex;
+    flex-direction: column;
+    gap: 18px;
+
+    .chart-row {
+      display: grid;
+      grid-template-columns: 100px 1fr 70px 60px;
+      align-items: center;
+      gap: 16px;
+
+      .chart-row-label {
+        display: flex;
+        align-items: center;
+        gap: 8px;
+        font-size: 13px;
+        color: #606266;
+        font-weight: 500;
+
+        .chart-row-dot {
+          width: 6px;
+          height: 6px;
+          border-radius: 50%;
+          flex-shrink: 0;
+        }
+      }
+
+      .chart-row-bar-wrap {
+        .chart-row-bar-bg {
+          height: 8px;
+          background: #f0f2f5;
+          border-radius: 4px;
+          overflow: hidden;
+
+          .chart-row-bar-fill {
+            height: 100%;
+            border-radius: 4px;
+            animation: barGrow 1s ease both;
+            animation-delay: var(--delay);
+          }
+        }
+      }
+
+      .chart-row-value {
+        font-size: 14px;
+        font-weight: 600;
+        color: #1a1a2e;
+        text-align: right;
+
+        .chart-row-unit {
+          font-size: 11px;
+          color: #bfc0c4;
+          font-weight: 400;
+          margin-left: 2px;
+        }
+      }
+
+      .chart-row-pct {
+        font-size: 12px;
+        color: #909399;
+        text-align: right;
+      }
+    }
   }
+}
 
-  font-family: 'open sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
+@keyframes cardFadeIn {
+  from {
+    opacity: 0;
+    transform: translateY(24px);
+  }
+  to {
+    opacity: 1;
+    transform: translateY(0);
+  }
+}
 
-  ul {
-    list-style-type: none;
+@keyframes barGrow {
+  from {
+    width: 0 !important;
   }
+}
 
-  h4 {
-    margin-top: 0px;
+@media (max-width: 1200px) {
+  .stats-grid {
+    grid-template-columns: repeat(2, 1fr);
   }
+}
 
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
+@media (max-width: 768px) {
+  .stats-grid {
+    grid-template-columns: repeat(2, 1fr);
+    gap: 12px;
   }
 
-  p {
-    margin-top: 10px;
+  .welcome-section {
+    padding: 24px;
 
-    b {
-      font-weight: 700;
+    .welcome-content {
+      flex-direction: column;
+      align-items: flex-start;
+      gap: 16px;
     }
   }
 
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
+  .chart-section {
+    padding: 20px;
+
+    .chart-header {
+      flex-direction: column;
+      align-items: flex-start;
+      gap: 12px;
+
+      .chart-legend {
+        flex-wrap: wrap;
+        gap: 12px;
+      }
+    }
+
+    .chart-body .chart-row {
+      grid-template-columns: 80px 1fr 50px 50px;
+      gap: 10px;
     }
   }
 }
-</style>
+</style>

+ 57 - 73
src/views/login.vue

@@ -1,74 +1,53 @@
 <template>
-  <div class="login">
-    <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-      <div class="title-box">
-        <h3 class="title">{{ title }}</h3>
-        <lang-select />
-      </div>
-      <el-form-item v-if="tenantEnabled" prop="tenantId">
-        <el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')"
-          style="width: 100%">
-          <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName"
-            :value="item.tenantId"></el-option>
-          <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="username">
-        <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off"
-          :placeholder="proxy.$t('login.username')">
-          <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
-        </el-input>
-      </el-form-item>
-      <el-form-item prop="password">
-        <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off"
-          :placeholder="proxy.$t('login.password')" @keyup.enter="handleLogin">
-          <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
-        </el-input>
-      </el-form-item>
-      <el-form-item v-if="captchaEnabled" prop="code">
-        <el-input v-model="loginForm.code" size="large" auto-complete="off" :placeholder="proxy.$t('login.code')"
-          style="width: 63%" @keyup.enter="handleLogin">
-          <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
-        </el-input>
-        <div class="login-code">
-          <img :src="codeUrl" class="login-code-img" @click="getCode" />
+  <div class="login" v-loading="pageLoading" element-loading-background="rgba(0,0,0,0.6)">
+    <template v-if="!pageLoading">
+      <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
+        <div class="title-box">
+          <h3 class="title">{{ title }}</h3>
+          <lang-select />
         </div>
-      </el-form-item>
-      <el-checkbox v-model="loginForm.rememberMe" style="margin: 0 0 25px 0">{{ proxy.$t('login.rememberPassword')
-        }}</el-checkbox>
-      <!-- 第三方登录入口(暂时隐藏)
-      <el-form-item style="float: right">
-        <el-button circle :title="proxy.$t('login.social.wechat')" @click="doSocialLogin('wechat')">
-          <svg-icon icon-class="wechat" />
-        </el-button>
-        <el-button circle :title="proxy.$t('login.social.maxkey')" @click="doSocialLogin('maxkey')">
-          <svg-icon icon-class="maxkey" />
-        </el-button>
-        <el-button circle :title="proxy.$t('login.social.topiam')" @click="doSocialLogin('topiam')">
-          <svg-icon icon-class="topiam" />
-        </el-button>
-        <el-button circle :title="proxy.$t('login.social.gitee')" @click="doSocialLogin('gitee')">
-          <svg-icon icon-class="gitee" />
-        </el-button>
-        <el-button circle :title="proxy.$t('login.social.github')" @click="doSocialLogin('github')">
-          <svg-icon icon-class="github" />
-        </el-button>
-      </el-form-item>
-      -->
-      <el-form-item style="width: 100%">
-        <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
-          <span v-if="!loading">{{ proxy.$t('login.login') }}</span>
-          <span v-else>{{ proxy.$t('login.logging') }}</span>
-        </el-button>
-        <!-- <div v-if="register" style="float: right">
-          <router-link class="link-type" :to="'/register'">{{ proxy.$t('login.switchRegisterPage') }}</router-link>
-        </div> -->
-      </el-form-item>
-    </el-form>
-    <!--  底部  -->
-    <div class="el-login-footer">
-      <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
-    </div>
+        <el-form-item v-if="tenantEnabled" prop="tenantId">
+          <el-select v-model="loginForm.tenantId" filterable :placeholder="proxy.$t('login.selectPlaceholder')"
+            style="width: 100%">
+            <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName"
+              :value="item.tenantId"></el-option>
+            <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="username">
+          <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off"
+            :placeholder="proxy.$t('login.username')">
+            <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
+          </el-input>
+        </el-form-item>
+        <el-form-item prop="password">
+          <el-input v-model="loginForm.password" type="password" size="large" auto-complete="off"
+            :placeholder="proxy.$t('login.password')" @keyup.enter="handleLogin">
+            <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
+          </el-input>
+        </el-form-item>
+        <el-form-item v-if="captchaEnabled" prop="code">
+          <el-input v-model="loginForm.code" size="large" auto-complete="off" :placeholder="proxy.$t('login.code')"
+            style="width: 63%" @keyup.enter="handleLogin">
+            <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
+          </el-input>
+          <div class="login-code">
+            <img :src="codeUrl" class="login-code-img" @click="getCode" />
+          </div>
+        </el-form-item>
+        <el-checkbox v-model="loginForm.rememberMe" style="margin: 0 0 25px 0">{{ proxy.$t('login.rememberPassword')
+          }}</el-checkbox>
+        <el-form-item style="width: 100%">
+          <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin">
+            <span v-if="!loading">{{ proxy.$t('login.login') }}</span>
+            <span v-else>{{ proxy.$t('login.logging') }}</span>
+          </el-button>
+        </el-form-item>
+      </el-form>
+      <div class="el-login-footer">
+        <span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
+      </div>
+    </template>
   </div>
 </template>
 
@@ -106,6 +85,7 @@ const loginRules: ElFormRules = {
 
 const codeUrl = ref('');
 const loading = ref(false);
+const pageLoading = ref(true);
 // 验证码开关
 const captchaEnabled = ref(true);
 // 租户开关
@@ -219,10 +199,14 @@ const doSocialLogin = (type: string) => {
   });
 };
 
-onMounted(() => {
-  getCode();
-  initTenantList();
-  getLoginData();
+onMounted(async () => {
+  pageLoading.value = true;
+  await Promise.all([
+    getCode(),
+    initTenantList(),
+    getLoginData()
+  ]);
+  pageLoading.value = false;
 });
 </script>
 

+ 7 - 11
src/views/monitor/online/index.vue

@@ -17,12 +17,9 @@
       </el-card>
     </div>
     <el-card shadow="hover">
-      <el-table
-        v-loading="loading"
-        border
+      <el-table v-loading="loading" border
         :data="onlineList.slice((queryParams.pageNum - 1) * queryParams.pageSize, queryParams.pageNum * queryParams.pageSize)"
-        style="width: 100%"
-      >
+        style="width: 100%">
         <el-table-column label="序号" width="50" type="index" align="center">
           <template #default="scope">
             <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
@@ -46,17 +43,16 @@
             <span>{{ proxy.parseTime(scope.row.loginTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column label="操作" align="center" width="80" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="强退" placement="top">
-              <el-button v-hasPermi="['monitor:online:forceLogout']" link type="primary" icon="Delete" @click="handleForceLogout(scope.row)">
-              </el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['monitor:online:forceLogout']" link type="danger" icon="Delete"
+              @click="handleForceLogout(scope.row)">强退</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" />
     </el-card>
   </div>
 </template>

+ 1 - 3
src/views/monitor/operlog/index.vue

@@ -114,9 +114,7 @@
         </el-table-column>
         <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="详细" placement="top">
-              <el-button v-hasPermi="['monitor:operlog:query']" link type="primary" icon="View" @click="handleView(scope.row)"> </el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['monitor:operlog:query']" link type="warning" icon="View" @click="handleView(scope.row)">详细</el-button>
           </template>
         </el-table-column>
       </el-table>

+ 26 - 191
src/views/order/index.vue

@@ -5,12 +5,10 @@
       <div v-show="showSearch" class="search">
         <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="85px">
           <el-form-item label="订单单号" prop="code">
-            <el-input v-model="queryParams.code" placeholder="请输入订单单号" clearable
-              @keyup.enter="handleQuery" />
+            <el-input v-model="queryParams.code" placeholder="请输入订单单号" clearable @keyup.enter="handleQuery" />
           </el-form-item>
           <el-form-item label="下单人" prop="placer">
-            <el-input v-model="queryParams.placer" placeholder="请输入下单人" clearable
-              @keyup.enter="handleQuery" />
+            <el-input v-model="queryParams.placer" placeholder="请输入下单人" clearable @keyup.enter="handleQuery" />
           </el-form-item>
 
           <el-form-item>
@@ -28,15 +26,9 @@
         </el-row>
       </template>
 
-      <!-- 状态筛选标签栏(内嵌于卡片) -->
       <div class="status-tabs">
-        <div
-          v-for="(tab, index) in statusTabs"
-          :key="index"
-          class="tab-item"
-          :class="{ active: currentTab === tab.value }"
-          @click="handleTabClick(tab.value)"
-        >
+        <div v-for="(tab, index) in statusTabs" :key="index" class="tab-item"
+          :class="{ active: currentTab === tab.value }" @click="handleTabClick(tab.value)">
           {{ tab.label }}
         </div>
       </div>
@@ -52,9 +44,7 @@
         <el-table-column label="总支数" align="center" prop="totalCount" />
         <el-table-column label="状态" align="center" prop="status">
           <template #default="scope">
-            <el-tag v-if="scope.row.status === -1" type="info">已撤销</el-tag>
-            <el-tag v-else-if="scope.row.status === 0" type="warning">待审核</el-tag>
-            <el-tag v-else-if="scope.row.status === 1" type="danger">已驳回</el-tag>
+            <el-tag v-if="scope.row.status === 0" type="warning">待审核</el-tag>
             <el-tag v-else-if="scope.row.status === 2" type="primary">待签批</el-tag>
             <el-tag v-else-if="scope.row.status === 3" type="info">生产中</el-tag>
             <el-tag v-else-if="scope.row.status === 4" type="success">已完成</el-tag>
@@ -66,12 +56,10 @@
             <span>{{ parseTime(scope.row.createTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="查看详情" placement="top">
-              <el-button v-hasPermi="['order:order:query']" link type="primary" icon="View"
-                @click="handleViewOrder(scope.row)" />
-            </el-tooltip>
+            <el-button v-hasPermi="['order:order:query']" link type="warning" icon="View"
+              @click="handleViewOrder(scope.row)">查看</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -80,69 +68,6 @@
         v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
 
-    <!-- 添加或修改订单对话框 -->
-    <el-dialog :title="title" v-model="open" width="1000px" append-to-body>
-      <el-form ref="orderRef" :model="form" :rules="rules" label-width="80px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="订单单号" prop="code">
-              <el-input v-model="form.code" placeholder="请输入订单单号" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="下单人" prop="placer">
-              <el-input v-model="form.placer" placeholder="请输入下单人" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-divider content-position="center">订单明细信息</el-divider>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button type="primary" icon="Plus" @click="handleAddErpOrderDetail">添加</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button type="danger" icon="Delete" @click="handleDeleteErpOrderDetail">删除</el-button>
-          </el-col>
-        </el-row>
-        <el-table :data="form.details" :row-class-name="rowErpOrderDetailIndex"
-          @selection-change="handleErpOrderDetailSelectionChange" ref="erpOrderDetailTable">
-          <el-table-column type="selection" width="50" align="center" />
-          <el-table-column label="序号" align="center" prop="index" width="50" />
-          <el-table-column label="型材" prop="modelId" width="200">
-            <template #default="scope">
-              <el-select v-model="scope.row.modelId" filterable placeholder="请选择型材">
-                <el-option v-for="item in modelOptions" :key="item.rowId" :label="item.name" :value="item.rowId" />
-              </el-select>
-            </template>
-          </el-table-column>
-          <el-table-column label="颜色" prop="colorId" width="200">
-            <template #default="scope">
-              <el-select v-model="scope.row.colorId" filterable placeholder="请选择颜色">
-                <el-option v-for="item in colorOptions" :key="item.rowId" :label="item.name" :value="item.rowId" />
-              </el-select>
-            </template>
-          </el-table-column>
-          <el-table-column label="数量" prop="count" width="150">
-            <template #default="scope">
-              <el-input-number v-model="scope.row.count" :min="1" controls-position="right" placeholder="请输入数量" />
-            </template>
-          </el-table-column>
-          <el-table-column label="备注" prop="remark">
-            <template #default="scope">
-              <el-input v-model="scope.row.remark" placeholder="请输入备注" />
-            </template>
-          </el-table-column>
-        </el-table>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
     <!-- 订单详情对话框 -->
     <el-dialog title="订单详情" v-model="detailOpen" width="800px" append-to-body>
       <template v-if="detailOrder">
@@ -151,9 +76,7 @@
           <el-descriptions-item label="订单单号" :span="2">{{ detailOrder.code }}</el-descriptions-item>
           <el-descriptions-item label="下单人">{{ detailOrder.placerName }}</el-descriptions-item>
           <el-descriptions-item label="订单状态">
-            <el-tag v-if="detailOrder.status === -1" type="info">已撤销</el-tag>
-            <el-tag v-else-if="detailOrder.status === 0" type="warning">待审核</el-tag>
-            <el-tag v-else-if="detailOrder.status === 1" type="danger">已驳回</el-tag>
+            <el-tag v-if="detailOrder.status === 0" type="warning">待审核</el-tag>
             <el-tag v-else-if="detailOrder.status === 2" type="primary">待签批</el-tag>
             <el-tag v-else-if="detailOrder.status === 3" type="info">生产中</el-tag>
             <el-tag v-else-if="detailOrder.status === 4" type="success">已完成</el-tag>
@@ -192,29 +115,23 @@
 </template>
 
 <script setup name="Order">
-import { listOrder, getOrder, addOrder } from "@/api/erp/order";
-import { listModel } from "@/api/erp/model";
-import { listColor } from "@/api/erp/color";
-import { View } from '@element-plus/icons-vue';
+import { listOrder, getOrder } from "@/api/erp/order";
 
 /** @Author: Antigravity */
 
 const { proxy } = getCurrentInstance();
 
 const orderList = ref([]);
-const open = ref(false);
 const loading = ref(true);
 const showSearch = ref(true);
 const total = ref(0);
-const title = ref("");
 const detailOpen = ref(false);
 const detailOrder = ref(null);
 const currentTab = ref(undefined);
+
 const statusTabs = [
   { label: '全部', value: undefined },
-  { label: '已撤销', value: -1 },
   { label: '待审核', value: 0 },
-  { label: '已驳回', value: 1 },
   { label: '待签批', value: 2 },
   { label: '生产中', value: 3 },
   { label: '已完成', value: 4 }
@@ -222,29 +139,21 @@ const statusTabs = [
 
 const queryFormRef = ref();
 
-const modelOptions = ref([]);
-const colorOptions = ref([]);
-const checkedErpOrderDetail = ref([]);
-
 const data = reactive({
-  form: {},
   queryParams: {
     pageNum: 1,
     pageSize: 10,
     code: undefined,
     placer: undefined,
     status: undefined
-  },
-  rules: {
-    placer: [{ required: true, message: "下单人不能为空", trigger: "blur" }]
-  },
+  }
 });
 
-const { queryParams, form, rules } = toRefs(data);
+const { queryParams } = toRefs(data);
 
 /** 查询订单列表 */
 function getList() {
-  loading.ref = true;
+  loading.value = true;
   queryParams.value.status = currentTab.value;
   listOrder(queryParams.value).then(response => {
     orderList.value = response.rows;
@@ -253,34 +162,6 @@ function getList() {
   });
 }
 
-/** 查询型材和颜色选项 */
-function getOptions() {
-  listModel({}).then(res => {
-    modelOptions.value = res.data;
-  });
-  listColor().then(res => {
-    colorOptions.value = res.data;
-  });
-}
-
-// 取消按钮
-function cancel() {
-  open.value = false;
-  reset();
-}
-
-// 表单重置
-function reset() {
-  form.value = {
-    rowId: undefined,
-    code: undefined,
-    placer: undefined,
-    status: 0,
-    details: []
-  };
-  proxy.resetForm("orderRef");
-}
-
 /** 搜索按钮操作 */
 function handleQuery() {
   queryParams.value.pageNum = 1;
@@ -301,13 +182,6 @@ function resetQuery() {
   handleQuery();
 }
 
-/** 新增按钮操作 */
-function handleAdd() {
-  reset();
-  open.value = true;
-  title.value = "添加订单";
-}
-
 /** 查看订单详情 */
 function handleViewOrder(row) {
   detailOpen.value = true;
@@ -319,53 +193,6 @@ function handleViewOrder(row) {
   });
 }
 
-/** 提交按钮 */
-function submitForm() {
-  proxy.$refs["orderRef"].validate(valid => {
-    if (valid) {
-      addOrder(form.value).then(response => {
-        proxy.$modal.msgSuccess("新增成功");
-        open.value = false;
-        getList();
-      });
-    }
-  });
-}
-
-
-/** 订单明细序号 */
-function rowErpOrderDetailIndex({ row, rowIndex }) {
-  row.index = rowIndex + 1;
-}
-
-/** 订单明细添加按钮操作 */
-function handleAddErpOrderDetail() {
-  let obj = {};
-  obj.modelId = "";
-  obj.colorId = "";
-  obj.count = 1;
-  obj.remark = "";
-  form.value.details.push(obj);
-}
-
-/** 订单明细删除按钮操作 */
-function handleDeleteErpOrderDetail() {
-  if (checkedErpOrderDetail.value.length == 0) {
-    proxy.$modal.msgError("请选择要删除的订单明细数据");
-  } else {
-    const details = form.value.details;
-    const checkedDetails = checkedErpOrderDetail.value;
-    form.value.details = details.filter(function (item) {
-      return checkedDetails.indexOf(item.index) == -1;
-    });
-  }
-}
-
-/** 复选框选中数据 */
-function handleErpOrderDetailSelectionChange(selection) {
-  checkedErpOrderDetail.value = selection.map(item => item.index);
-}
-
 /** 格式化数值,匹配小程序端的 toFixed(4) 显示 */
 function formatNum(val, fallback = '0') {
   if (val === null || val === undefined || val === '') return fallback;
@@ -373,13 +200,10 @@ function formatNum(val, fallback = '0') {
   return isNaN(num) ? fallback : num.toFixed(4);
 }
 
-getOptions();
 getList();
 </script>
 
 <style scoped>
-
-
 /* ========== 状态筛选标签栏 ========== */
 .status-tabs {
   display: flex;
@@ -388,6 +212,7 @@ getList();
   border-bottom: 1px solid #ebeef5;
   padding-bottom: 0;
 }
+
 .tab-item {
   position: relative;
   padding: 10px 20px;
@@ -397,6 +222,7 @@ getList();
   transition: color 0.25s ease;
   user-select: none;
 }
+
 .tab-item::after {
   content: '';
   position: absolute;
@@ -408,13 +234,16 @@ getList();
   background: #409eff;
   transition: transform 0.25s ease;
 }
+
 .tab-item:hover {
   color: #409eff;
 }
+
 .tab-item.active {
   color: #409eff;
   font-weight: 600;
 }
+
 .tab-item.active::after {
   transform: translateX(-50%) scaleX(1);
 }
@@ -428,11 +257,13 @@ getList();
   padding-left: 10px;
   border-left: 3px solid #C1001C;
 }
+
 .detail-scroll {
   max-height: 420px;
   overflow-y: auto;
   padding-right: 2px;
 }
+
 .detail-card {
   background: #fff;
   border: 1px solid #ebeef5;
@@ -440,16 +271,19 @@ getList();
   padding: 14px;
   margin-bottom: 12px;
 }
+
 .detail-card-head {
   font-size: 13px;
   font-weight: 600;
   color: #303133;
   margin-bottom: 10px;
 }
+
 .count-red {
   color: #ff3b30;
   font-weight: 600;
 }
+
 .detail-remark {
   margin-top: 8px;
   padding: 6px 10px;
@@ -458,7 +292,8 @@ getList();
   font-size: 12px;
   color: #606266;
 }
+
 .remark-label {
   color: #909399;
 }
-</style>
+</style>

+ 1 - 1
src/views/system/agreement/index.vue

@@ -22,7 +22,7 @@
                     </div>
                 </el-form-item>
                 <el-form-item>
-                    <el-button v-hasPermi="['system:agreement:edit']" type="primary" :loading="saving"
+                    <el-button v-hasPermi="['system:agreement:edit']" type="primary" icon="Check" :loading="saving"
                         @click="handleSave">
                         保存
                     </el-button>

+ 24 - 17
src/views/system/client/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="search">
         <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="85px">
           <el-form-item label="客户端key" prop="clientKey">
@@ -26,20 +27,24 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:client:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:client:add']" type="primary" plain icon="Plus"
+              @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:client:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">
+            <el-button v-hasPermi="['system:client:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">
               修改
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:client:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:client:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:client:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:client:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -65,22 +70,22 @@
         <el-table-column label="Token固定超时时间" align="center" prop="timeout" />
         <el-table-column key="status" label="状态" align="center">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+              @change="handleStatusChange(scope.row)"></el-switch>
           </template>
         </el-table-column>
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:client:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:client:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:client:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:client:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
     <!-- 添加或修改客户端管理对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
@@ -93,12 +98,14 @@
         </el-form-item>
         <el-form-item label="授权类型" prop="grantTypeList">
           <el-select v-model="form.grantTypeList" multiple placeholder="请输入授权类型">
-            <el-option v-for="dict in sys_grant_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+            <el-option v-for="dict in sys_grant_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="设备类型" prop="deviceType">
           <el-select v-model="form.deviceType" placeholder="请输入设备类型">
-            <el-option v-for="dict in sys_device_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+            <el-option v-for="dict in sys_device_type" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="activeTimeout" label-width="auto">
@@ -133,8 +140,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 23 - 24
src/views/system/config/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -16,15 +17,9 @@
               </el-select>
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRange"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-              ></el-date-picker>
+              <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
             </el-form-item>
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -38,23 +33,28 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:config:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:config:add']" type="primary" plain icon="Plus"
+              @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:config:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">
+            <el-button v-hasPermi="['system:config:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">
               修改
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:config:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:config:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button>
+            <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Refresh"
+              @click="handleRefreshCache">刷新缓存</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -79,16 +79,15 @@
         </el-table-column>
         <el-table-column label="操作" align="center" width="150" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:config:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:config:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:config:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:config:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
 
     <!-- 添加或修改参数配置对话框 -->
@@ -114,8 +113,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 27 - 46
src/views/system/dept/index.vue

@@ -1,18 +1,17 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
             <el-form-item label="部门名称" prop="deptName">
               <el-input v-model="queryParams.deptName" placeholder="请输入部门名称" clearable @keyup.enter="handleQuery" />
             </el-form-item>
-            <el-form-item label="类别编码" prop="deptCategory">
-              <el-input v-model="queryParams.deptCategory" placeholder="请输入类别编码" clearable style="width: 240px" @keyup.enter="handleQuery" />
-            </el-form-item>
             <el-form-item label="状态" prop="status">
               <el-select v-model="queryParams.status" placeholder="部门状态" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -28,7 +27,8 @@
       <template #header>
         <el-row :gutter="10">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:dept:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增 </el-button>
+            <el-button v-hasPermi="['system:dept:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增
+            </el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
@@ -37,39 +37,28 @@
         </el-row>
       </template>
 
-      <el-table
-        ref="deptTableRef"
-        v-loading="loading"
-        :data="deptList"
-        row-key="deptId"
-        border
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        :default-expand-all="isExpandAll"
-      >
-        <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
-        <el-table-column prop="deptCategory" align="center" label="类别编码" width="200"></el-table-column>
-        <el-table-column prop="orderNum" align="center" label="排序" width="200"></el-table-column>
+      <el-table ref="deptTableRef" v-loading="loading" :data="deptList" row-key="deptId" border
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="isExpandAll">
+        <el-table-column prop="deptName" label="部门名称" min-width="200"></el-table-column>
+        <el-table-column prop="orderNum" align="center" label="排序" width="120"></el-table-column>
         <el-table-column prop="status" align="center" label="状态" width="100">
           <template #default="scope">
             <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
           </template>
         </el-table-column>
-        <el-table-column label="创建时间" align="center" prop="createTime" width="200">
+        <el-table-column label="创建时间" align="center" prop="createTime" width="180">
           <template #default="scope">
             <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
           </template>
         </el-table-column>
-        <el-table-column fixed="right" align="center" label="操作">
+        <el-table-column fixed="right" align="center" label="操作" width="220">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:dept:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button v-hasPermi="['system:dept:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:dept:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
-            </el-tooltip>
+            <el-button v-hasPermi="['system:dept:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:dept:add']" link type="success" icon="Plus"
+              @click="handleAdd(scope.row)">新增</el-button>
+            <el-button v-hasPermi="['system:dept:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -80,14 +69,9 @@
         <el-row>
           <el-col v-if="form.parentId !== 0" :span="24">
             <el-form-item label="上级部门" prop="parentId">
-              <el-tree-select
-                v-model="form.parentId"
-                :data="deptOptions"
-                :props="{ value: 'deptId', label: 'deptName', children: 'children' } as any"
-                value-key="deptId"
-                placeholder="选择上级部门"
-                check-strictly
-              />
+              <el-tree-select v-model="form.parentId" :data="deptOptions"
+                :props="{ value: 'deptId', label: 'deptName', children: 'children' } as any" value-key="deptId"
+                placeholder="选择上级部门" check-strictly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -95,11 +79,6 @@
               <el-input v-model="form.deptName" placeholder="请输入部门名称" />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="类别编码" prop="deptCategory">
-              <el-input v-model="form.deptCategory" placeholder="请输入类别编码" />
-            </el-form-item>
-          </el-col>
           <el-col :span="12">
             <el-form-item label="显示排序" prop="orderNum">
               <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
@@ -108,7 +87,8 @@
           <el-col :span="12">
             <el-form-item label="负责人" prop="leader">
               <el-select v-model="form.leader" placeholder="请选择负责人">
-                <el-option v-for="item in deptUserList" :key="item.userId" :label="item.userName" :value="item.userId" />
+                <el-option v-for="item in deptUserList" :key="item.userId" :label="item.userName"
+                  :value="item.userId" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -125,7 +105,8 @@
           <el-col :span="12">
             <el-form-item label="部门状态">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label
+                  }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -133,8 +114,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 69 - 121
src/views/system/dict/index.vue

@@ -1,4 +1,4 @@
-<template>
+<template>
   <div class="p-2 dict-page">
     <el-row :gutter="16" class="dict-grid">
       <!-- 字典类型 -->
@@ -14,21 +14,17 @@
           <div v-show="showTypeSearch" class="dict-form-scroll">
             <el-form ref="typeQueryFormRef" :model="typeQueryParams" :inline="true">
               <el-form-item label="字典名称" prop="dictName">
-                <el-input v-model="typeQueryParams.dictName" placeholder="请输入字典名称" clearable @keyup.enter="handleTypeQuery" />
+                <el-input v-model="typeQueryParams.dictName" placeholder="请输入字典名称" clearable
+                  @keyup.enter="handleTypeQuery" />
               </el-form-item>
               <el-form-item label="字典类型" prop="dictType">
-                <el-input v-model="typeQueryParams.dictType" placeholder="请输入字典类型" clearable @keyup.enter="handleTypeQuery" />
+                <el-input v-model="typeQueryParams.dictType" placeholder="请输入字典类型" clearable
+                  @keyup.enter="handleTypeQuery" />
               </el-form-item>
               <el-form-item label="创建时间" style="width: 308px">
-                <el-date-picker
-                  v-model="dateRange"
-                  value-format="YYYY-MM-DD HH:mm:ss"
-                  type="daterange"
-                  range-separator="-"
-                  start-placeholder="开始日期"
-                  end-placeholder="结束日期"
-                  :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-                ></el-date-picker>
+                <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                  range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                  :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
               </el-form-item>
               <el-form-item>
                 <el-button type="primary" icon="Search" @click="handleTypeQuery">搜索</el-button>
@@ -38,61 +34,49 @@
           </div>
 
           <div class="dict-actions">
-            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleTypeAdd">新增</el-button>
-            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="typeSingle" @click="handleTypeUpdate()"
-              >修改</el-button
-            >
-            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="typeMultiple" @click="handleTypeDelete()"
-              >删除</el-button
-            >
-            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleTypeExport">导出</el-button>
-            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button>
+            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus"
+              @click="handleTypeAdd">新增</el-button>
+            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="typeSingle"
+              @click="handleTypeUpdate()">修改</el-button>
+            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="typeMultiple"
+              @click="handleTypeDelete()">删除</el-button>
+            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download"
+              @click="handleTypeExport">导出</el-button>
+            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh"
+              @click="handleRefreshCache">刷新缓存</el-button>
           </div>
 
           <div class="dict-table-wrap">
-            <el-table
-              ref="typeTableRef"
-              v-loading="typeLoading"
-              border
-              :data="typeList"
-              highlight-current-row
-              @row-click="handleTypeRowClick"
-              @selection-change="handleTypeSelectionChange"
-            >
+            <el-table ref="typeTableRef" v-loading="typeLoading" border :data="typeList" highlight-current-row
+              style="width: 100%" @row-click="handleTypeRowClick" @selection-change="handleTypeSelectionChange">
               <el-table-column type="selection" width="55" align="center" />
               <el-table-column v-if="false" label="字典编号" align="center" prop="dictId" />
-              <el-table-column label="字典名称" align="center" prop="dictName" width="120" />
-              <el-table-column label="字典类型" align="center" prop="dictType" width="160">
+              <el-table-column label="字典名称" align="center" prop="dictName" min-width="120" />
+              <el-table-column label="字典类型" align="center" prop="dictType" min-width="200">
                 <template #default="scope">
                   <span class="link-type" @click.stop="handleTypeRowClick(scope.row)">{{ scope.row.dictType }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="备注" align="center" prop="remark" width="160"/>
-              <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+              <el-table-column label="备注" align="center" prop="remark" min-width="120" />
+              <el-table-column label="创建时间" align="center" prop="createTime" width="160">
                 <template #default="scope">
                   <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" fixed="right" align="center" width="120" class-name="small-padding fixed-width">
+              <el-table-column label="操作" fixed="right" align="center" width="180"
+                class-name="small-padding fixed-width">
                 <template #default="scope">
-                  <el-tooltip content="修改" placement="top">
-                    <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleTypeUpdate(scope.row)"></el-button>
-                  </el-tooltip>
-                  <el-tooltip content="删除" placement="top">
-                    <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleTypeDelete(scope.row)"></el-button>
-                  </el-tooltip>
+                  <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit"
+                    @click="handleTypeUpdate(scope.row)">修改</el-button>
+                  <el-button v-hasPermi="['system:dict:remove']" link type="danger" icon="Delete"
+                    @click="handleTypeDelete(scope.row)">删除</el-button>
                 </template>
               </el-table-column>
             </el-table>
           </div>
 
-          <pagination
-            v-show="typeTotal > 0"
-            v-model:page="typeQueryParams.pageNum"
-            v-model:limit="typeQueryParams.pageSize"
-            :total="typeTotal"
-            @pagination="getTypeList"
-          />
+          <pagination v-show="typeTotal > 0" v-model:page="typeQueryParams.pageNum"
+            v-model:limit="typeQueryParams.pageSize" :total="typeTotal" @pagination="getTypeList" />
         </el-card>
       </el-col>
 
@@ -112,96 +96,65 @@
           <div v-show="showDataSearch" class="dict-form-scroll">
             <el-form ref="dataQueryFormRef" :model="dataQueryParams" :inline="true">
               <el-form-item label="字典标签" prop="dictLabel">
-                <el-input
-                  v-model="dataQueryParams.dictLabel"
-                  placeholder="请输入字典标签"
-                  clearable
-                  :disabled="!hasCurrentDict"
-                  @keyup.enter="handleDataQuery"
-                />
+                <el-input v-model="dataQueryParams.dictLabel" placeholder="请输入字典标签" clearable
+                  :disabled="!hasCurrentDict" @keyup.enter="handleDataQuery" />
               </el-form-item>
               <el-form-item>
-                <el-button type="primary" icon="Search" :disabled="!hasCurrentDict" @click="handleDataQuery">搜索</el-button>
+                <el-button type="primary" icon="Search" :disabled="!hasCurrentDict"
+                  @click="handleDataQuery">搜索</el-button>
                 <el-button icon="Refresh" :disabled="!hasCurrentDict" @click="handleDataResetQuery">重置</el-button>
               </el-form-item>
             </el-form>
           </div>
 
           <div class="dict-actions">
-            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" :disabled="!hasCurrentDict" @click="handleDataAdd"
-              >新增</el-button
-            >
-            <el-button
-              v-hasPermi="['system:dict:edit']"
-              type="success"
-              plain
-              icon="Edit"
-              :disabled="dataSingle || !hasCurrentDict"
-              @click="handleDataUpdate()"
-              >修改</el-button
-            >
-            <el-button
-              v-hasPermi="['system:dict:remove']"
-              type="danger"
-              plain
-              icon="Delete"
-              :disabled="dataMultiple || !hasCurrentDict"
-              @click="handleDataDelete()"
-              >删除</el-button
-            >
-            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" :disabled="!hasCurrentDict" @click="handleDataExport"
-              >导出</el-button
-            >
+            <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" :disabled="!hasCurrentDict"
+              @click="handleDataAdd">新增</el-button>
+            <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit"
+              :disabled="dataSingle || !hasCurrentDict" @click="handleDataUpdate()">修改</el-button>
+            <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete"
+              :disabled="dataMultiple || !hasCurrentDict" @click="handleDataDelete()">删除</el-button>
+            <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download"
+              :disabled="!hasCurrentDict" @click="handleDataExport">导出</el-button>
           </div>
 
           <div class="dict-table-wrap">
-            <el-table v-loading="dataLoading" border :data="dataList" @selection-change="handleDataSelectionChange">
+            <el-table v-loading="dataLoading" border :data="dataList" style="width: 100%"
+              @selection-change="handleDataSelectionChange">
               <el-table-column type="selection" width="55" align="center" />
               <el-table-column v-if="false" label="字典编码" align="center" prop="dictCode" />
-              <el-table-column label="字典标签" align="center" prop="dictLabel" width="80">
+              <el-table-column label="字典标签" align="center" prop="dictLabel" min-width="80">
                 <template #default="scope">
-                  <span
-                    v-if="
-                      (scope.row.listClass === '' || scope.row.listClass === 'default') && (scope.row.cssClass === '' || scope.row.cssClass == null)
-                    "
-                    >{{ scope.row.dictLabel }}</span
-                  >
-                  <el-tag
-                    v-else
+                  <span v-if="
+                    (scope.row.listClass === '' || scope.row.listClass === 'default') && (scope.row.cssClass === '' || scope.row.cssClass == null)
+                  ">{{ scope.row.dictLabel }}</span>
+                  <el-tag v-else
                     :type="scope.row.listClass === 'primary' || scope.row.listClass === 'default' ? 'primary' : scope.row.listClass"
-                    :class="scope.row.cssClass"
-                    >{{ scope.row.dictLabel }}</el-tag
-                  >
+                    :class="scope.row.cssClass">{{ scope.row.dictLabel }}</el-tag>
                 </template>
               </el-table-column>
-              <el-table-column label="字典键值" align="center" prop="dictValue" width="80" />
+              <el-table-column label="字典键值" align="center" prop="dictValue" min-width="80" />
               <el-table-column label="字典排序" align="center" prop="dictSort" width="80" />
-              <el-table-column label="备注" align="center" prop="remark" width="100" />
-              <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+              <el-table-column label="备注" align="center" prop="remark" min-width="100" />
+              <el-table-column label="创建时间" align="center" prop="createTime" width="160">
                 <template #default="scope">
                   <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" fixed="right" align="center" width="120" class-name="small-padding fixed-width">
+              <el-table-column label="操作" fixed="right" align="center" width="180"
+                class-name="small-padding fixed-width">
                 <template #default="scope">
-                  <el-tooltip content="修改" placement="top">
-                    <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleDataUpdate(scope.row)"></el-button>
-                  </el-tooltip>
-                  <el-tooltip content="删除" placement="top">
-                    <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleDataDelete(scope.row)"></el-button>
-                  </el-tooltip>
+                  <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit"
+                    @click="handleDataUpdate(scope.row)">修改</el-button>
+                  <el-button v-hasPermi="['system:dict:remove']" link type="danger" icon="Delete"
+                    @click="handleDataDelete(scope.row)">删除</el-button>
                 </template>
               </el-table-column>
             </el-table>
           </div>
 
-          <pagination
-            v-show="dataTotal > 0"
-            v-model:page="dataQueryParams.pageNum"
-            v-model:limit="dataQueryParams.pageSize"
-            :total="dataTotal"
-            @pagination="getDataList"
-          />
+          <pagination v-show="dataTotal > 0" v-model:page="dataQueryParams.pageNum"
+            v-model:limit="dataQueryParams.pageSize" :total="dataTotal" @pagination="getDataList" />
         </el-card>
       </el-col>
     </el-row>
@@ -227,8 +180,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitTypeForm">确 定</el-button>
-          <el-button @click="cancelType">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitTypeForm">确 定</el-button>
+          <el-button icon="Close" @click="cancelType">取 消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -253,12 +206,8 @@
         </el-form-item>
         <el-form-item label="回显样式" prop="listClass">
           <el-select v-model="dataForm.listClass">
-            <el-option
-              v-for="item in listClassOptions"
-              :key="item.value"
-              :label="item.label + '(' + item.value + ')'"
-              :value="item.value"
-            ></el-option>
+            <el-option v-for="item in listClassOptions" :key="item.value" :label="item.label + '(' + item.value + ')'"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
@@ -267,8 +216,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitDataForm">确 定</el-button>
-          <el-button @click="cancelData">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitDataForm">确 定</el-button>
+          <el-button icon="Close" @click="cancelData">取 消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -671,5 +620,4 @@ onMounted(() => {
 .dict-table-wrap {
   overflow-x: auto;
 }
-
 </style>

+ 31 - 52
src/views/system/menu/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -9,7 +10,8 @@
             </el-form-item>
             <el-form-item label="状态" prop="status">
               <el-select v-model="queryParams.status" placeholder="菜单状态" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -25,27 +27,20 @@
       <template #header>
         <el-row :gutter="10">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+            <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus"
+              @click="handleAdd()">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete" @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
+            <el-button v-hasPermi="['system:menu:remove']" type="danger" plain icon="Delete"
+              @click="handleCascadeDelete" :loading="deleteLoading">级联删除</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
       </template>
 
-      <el-table
-        ref="menuTableRef"
-        v-loading="loading"
-        :data="menuList"
-        row-key="menuId"
-        border
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        :default-expand-all="false"
-        lazy
-        :load="getChildrenList"
-        :expand-change="expandMenuHandle"
-      >
+      <el-table ref="menuTableRef" v-loading="loading" :data="menuList" row-key="menuId" border
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" :default-expand-all="false" lazy
+        :load="getChildrenList" :expand-change="expandMenuHandle">
         <el-table-column prop="menuName" label="菜单名称" :show-overflow-tooltip="true" width="160"></el-table-column>
         <el-table-column prop="icon" label="图标" align="center" width="100">
           <template #default="scope">
@@ -65,17 +60,14 @@
             <span>{{ scope.row.createTime }}</span>
           </template>
         </el-table-column>
-        <el-table-column fixed="right" label="操作" width="180">
+        <el-table-column fixed="right" label="操作" width="220">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" />
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" />
-            </el-tooltip>
+            <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:menu:add']" link type="success" icon="Plus"
+              @click="handleAdd(scope.row)">新增</el-button>
+            <el-button v-hasPermi="['system:menu:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -86,14 +78,9 @@
         <el-row>
           <el-col :span="24">
             <el-form-item label="上级菜单">
-              <el-tree-select
-                v-model="form.parentId"
-                :data="menuOptions"
-                :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any"
-                value-key="menuId"
-                placeholder="选择上级菜单"
-                check-strictly
-              />
+              <el-tree-select v-model="form.parentId" :data="menuOptions"
+                :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" value-key="menuId"
+                placeholder="选择上级菜单" check-strictly />
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -128,8 +115,7 @@
                   <el-tooltip content="选择是外链则路由地址需要以`http(s)://`开头" placement="top">
                     <el-icon>
                       <question-filled />
-                    </el-icon> </el-tooltip
-                  >是否外链
+                    </el-icon> </el-tooltip>是否外链
                 </span>
               </template>
               <el-radio-group v-model="form.isFrame">
@@ -229,7 +215,8 @@
                 </span>
               </template>
               <el-radio-group v-model="form.visible">
-                <el-radio v-for="dict in sys_show_hide" :key="dict.value" :value="dict.value">{{ dict.label }} </el-radio>
+                <el-radio v-for="dict in sys_show_hide" :key="dict.value" :value="dict.value">{{ dict.label }}
+                </el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -271,28 +258,20 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>
 
     <el-dialog v-model="deleteDialog.visible" :title="deleteDialog.title" destroy-on-close append-to-bod width="750px">
-      <el-tree
-        ref="menuTreeRef"
-        class="tree-border"
-        :data="menuOptions"
-        show-checkbox
-        node-key="menuId"
-        :check-strictly="false"
-        empty-text="加载中,请稍候"
-        :default-expanded-keys="[0]"
-        :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any"
-      />
+      <el-tree ref="menuTreeRef" class="tree-border" :data="menuOptions" show-checkbox node-key="menuId"
+        :check-strictly="false" empty-text="加载中,请稍候" :default-expanded-keys="[0]"
+        :props="{ value: 'menuId', label: 'menuName', children: 'children' } as any" />
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitDeleteForm" :loading="deleteLoading">确 定</el-button>
-          <el-button @click="cancelCascade">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitDeleteForm" :loading="deleteLoading">确 定</el-button>
+          <el-button icon="Close" @click="cancelCascade">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 20 - 17
src/views/system/notice/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -28,15 +29,16 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:notice:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:notice:add']" type="primary" plain icon="Plus"
+              @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:notice:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-              >修改</el-button
-            >
+            <el-button v-hasPermi="['system:notice:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:notice:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:notice:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
@@ -66,17 +68,16 @@
         </el-table-column>
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:notice:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:notice:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:notice:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:notice:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
     <!-- 添加或修改公告对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="780px" append-to-body>
@@ -90,14 +91,16 @@
           <el-col :span="12">
             <el-form-item label="公告类型" prop="noticeType">
               <el-select v-model="form.noticeType" placeholder="请选择">
-                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+                <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label"
+                  :value="dict.value"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="24">
             <el-form-item label="状态">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_notice_status" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_notice_status" :key="dict.value" :value="dict.value">{{ dict.label
+                }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -110,8 +113,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 259 - 306
src/views/system/oss/config.vue

@@ -1,186 +1,117 @@
 <template>
-  <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
-      <div v-show="showSearch" class="mb-[10px]">
-        <el-card shadow="hover">
-          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
-            <el-form-item label="配置key" prop="configKey">
-              <el-input v-model="queryParams.configKey" placeholder="配置key" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="桶名称" prop="bucketName">
-              <el-input v-model="queryParams.bucketName" placeholder="请输入桶名称" clearable @keyup.enter="handleQuery" />
-            </el-form-item>
-            <el-form-item label="是否默认" prop="status">
-              <el-select v-model="queryParams.status" placeholder="请选择状态" clearable>
-                <el-option key="0" label="是" value="0" />
-                <el-option key="1" label="否" value="1" />
-              </el-select>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" icon="search" @click="handleQuery">搜索</el-button>
-              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
-            </el-form-item>
-          </el-form>
-        </el-card>
-      </div>
-    </transition>
-
-    <el-card shadow="hover">
-      <template #header>
-        <el-row :gutter="10" class="mb8">
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['system:ossConfig:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
-          </el-col>
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['system:ossConfig:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-              >修改</el-button
-            >
-          </el-col>
-          <el-col :span="1.5">
-            <el-button v-hasPermi="['system:ossConfig:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
-              删除
-            </el-button>
-          </el-col>
-          <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
-        </el-row>
-      </template>
-
-      <el-table v-loading="loading" border :data="ossConfigList" @selection-change="handleSelectionChange">
-        <el-table-column type="selection" width="55" align="center" />
-        <el-table-column v-if="columns[0].visible" label="主建" align="center" prop="ossConfigId" />
-        <el-table-column v-if="columns[1].visible" label="配置key" align="center" prop="configKey" />
-        <el-table-column v-if="columns[2].visible" label="访问站点" align="center" prop="endpoint" width="200" />
-        <el-table-column v-if="columns[3].visible" label="自定义域名" align="center" prop="domain" width="200" />
-        <el-table-column v-if="columns[4].visible" label="桶名称" align="center" prop="bucketName" />
-        <el-table-column v-if="columns[5].visible" label="前缀" align="center" prop="prefix" />
-        <el-table-column v-if="columns[6].visible" label="域" align="center" prop="region" />
-        <el-table-column v-if="columns[7].visible" label="桶权限类型" align="center" prop="accessPolicy">
-          <template #default="scope">
-            <el-tag v-if="scope.row.accessPolicy === '0'" type="warning">private</el-tag>
-            <el-tag v-if="scope.row.accessPolicy === '1'" type="success">public</el-tag>
-            <el-tag v-if="scope.row.accessPolicy === '2'" type="info">custom</el-tag>
-          </template>
-        </el-table-column>
-        <el-table-column v-if="columns[8].visible" label="是否默认" align="center" prop="status">
-          <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" fixed="right" align="center" width="150" class-name="small-padding">
-          <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:ossConfig:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:ossConfig:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
-          </template>
-        </el-table-column>
-      </el-table>
-
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
-    </el-card>
-    <!-- 添加或修改对象存储配置对话框 -->
-    <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" append-to-body>
-      <el-form ref="ossConfigFormRef" :model="form" :rules="rules" label-width="120px">
-        <el-form-item label="配置key" prop="configKey">
-          <el-input v-model="form.configKey" placeholder="请输入配置key" />
-        </el-form-item>
-        <el-form-item label="访问站点" prop="endpoint">
-          <el-input v-model="form.endpoint" placeholder="请输入访问站点">
-            <template #prefix>
-              <span style="color: #999">{{ protocol }}</span>
-            </template>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="自定义域名" prop="domain">
-          <el-input v-model="form.domain" placeholder="请输入自定义域名">
-            <template #prefix>
-              <span style="color: #999">{{ protocol }}</span>
-            </template>
-          </el-input>
-        </el-form-item>
-        <el-form-item label="accessKey" prop="accessKey">
-          <el-input v-model="form.accessKey" placeholder="请输入accessKey" />
-        </el-form-item>
-        <el-form-item label="secretKey" prop="secretKey">
-          <el-input v-model="form.secretKey" placeholder="请输入秘钥" show-password />
-        </el-form-item>
-        <el-form-item label="桶名称" prop="bucketName">
-          <el-input v-model="form.bucketName" placeholder="请输入桶名称" />
-        </el-form-item>
-        <el-form-item label="前缀" prop="prefix">
-          <el-input v-model="form.prefix" placeholder="请输入前缀" />
-        </el-form-item>
-        <el-form-item label="是否HTTPS">
-          <el-radio-group v-model="form.isHttps">
-            <el-radio v-for="dict in sys_yes_no" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="桶权限类型">
-          <el-radio-group v-model="form.accessPolicy">
-            <el-radio value="0">private</el-radio>
-            <el-radio value="1">public</el-radio>
-            <el-radio value="2">custom</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="域" prop="region">
-          <el-input v-model="form.region" placeholder="请输入域" />
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
+  <div class="oss-config-page">
+    <div class="setting-hint">
+      <el-alert :closable="false" type="info" class="custom-alert">
+        <template #title>
+          <div class="alert-content">
+            <span>上线后更换请慎重,迁移存储耗时较长;本地存储需将图片域名绑定到 public/upload 目录。</span>
+          </div>
+        </template>
+      </el-alert>
+    </div>
+
+    <div class="setting-body">
+      <el-card shadow="never" class="setting-card">
+        <template #header>
+          <div class="setting-card-header">
+            <span class="setting-card-title">存储配置</span>
+          </div>
+        </template>
+
+        <el-form ref="ossFormRef" :model="form" :rules="rules" label-width="110px" class="premium-form">
+          <el-form-item label="存储服务">
+            <el-radio-group v-model="form.configKey" @change="handleTypeChange" class="storage-radio-group">
+              <el-radio value="local" border>本地存储</el-radio>
+              <el-radio value="minio" border>Minio</el-radio>
+              <el-radio value="qiniu" border>七牛云</el-radio>
+              <el-radio value="aliyun" border>阿里云</el-radio>
+              <el-radio value="qcloud" border>腾讯云</el-radio>
+            </el-radio-group>
+          </el-form-item>
+
+          <el-row :gutter="24">
+            <el-col :span="12">
+              <el-form-item label="访问站点" prop="endpoint">
+                <el-input v-model="form.endpoint" placeholder="请输入访问站点" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="自定义域名" prop="domain">
+                <el-input v-model="form.domain" placeholder="请输入自定义域名">
+                  <template #prefix>
+                    <span class="protocol-prefix">{{ protocol }}</span>
+                  </template>
+                </el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="AccessKey" prop="accessKey">
+                <el-input v-model="form.accessKey" placeholder="请输入 AccessKey" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="SecretKey" prop="secretKey">
+                <el-input v-model="form.secretKey" placeholder="请输入 SecretKey" show-password />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="桶名称" prop="bucketName">
+                <el-input v-model="form.bucketName" placeholder="请输入存储桶名称" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="前缀路径" prop="prefix">
+                <el-input v-model="form.prefix" placeholder="选填,如 upload、static" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="存储区域" prop="region">
+                <el-input v-model="form.region" placeholder="如 cn-hangzhou" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="HTTPS 访问">
+                <el-switch v-model="form.isHttps" active-value="Y" inactive-value="N" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="桶权限">
+                <el-radio-group v-model="form.accessPolicy">
+                  <el-radio value="0">private</el-radio>
+                  <el-radio value="1">public</el-radio>
+                  <el-radio value="2">custom</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-form-item label="备注" prop="remark">
+            <el-input v-model="form.remark" type="textarea" placeholder="请输入备注内容" :rows="2" />
+          </el-form-item>
+
+          <el-form-item class="action-item">
+            <el-button type="primary" class="save-btn" icon="Check" :loading="buttonLoading"
+              @click="submitForm">保存配置</el-button>
+            <el-button icon="Refresh" @click="resetForm">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </el-card>
+    </div>
   </div>
 </template>
 
 <script setup name="OssConfig" lang="ts">
-import { listOssConfig, getOssConfig, delOssConfig, addOssConfig, updateOssConfig, changeOssConfigStatus } from '@/api/system/ossConfig';
-import { OssConfigForm, OssConfigQuery, OssConfigVO } from '@/api/system/ossConfig/types';
+import { listOssConfig, addOssConfig, updateOssConfig } from '@/api/system/ossConfig';
+import { OssConfigForm } from '@/api/system/ossConfig/types';
 
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no'));
 
-const ossConfigList = ref<OssConfigVO[]>([]);
 const buttonLoading = ref(false);
-const loading = ref(true);
-const showSearch = ref(true);
-const ids = ref<Array<number | string>>([]);
-const single = ref(true);
-const multiple = ref(true);
-const total = ref(0);
-
-const queryFormRef = ref<ElFormInstance>();
-const ossConfigFormRef = ref<ElFormInstance>();
-
-const dialog = reactive<DialogOption>({
-  visible: false,
-  title: ''
-});
-
-// 列显隐信息
-const columns = ref<FieldOption[]>([
-  { key: 0, label: `主建`, visible: false },
-  { key: 1, label: `配置key`, visible: true },
-  { key: 2, label: `访问站点`, visible: true },
-  { key: 3, label: `自定义域名`, visible: true },
-  { key: 4, label: `桶名称`, visible: true },
-  { key: 5, label: `前缀`, visible: true },
-  { key: 6, label: `域`, visible: true },
-  { key: 7, label: `桶权限类型`, visible: true },
-  { key: 8, label: `状态`, visible: true }
-]);
+const ossFormRef = ref<ElFormInstance>();
 
 const initFormData: OssConfigForm = {
   ossConfigId: undefined,
-  configKey: '',
+  configKey: 'local',
   accessKey: '',
   secretKey: '',
   bucketName: '',
@@ -190,155 +121,177 @@ const initFormData: OssConfigForm = {
   isHttps: 'N',
   accessPolicy: '1',
   region: '',
-  status: '1',
+  status: '0',
   remark: ''
 };
-const data = reactive<PageData<OssConfigForm, OssConfigQuery>>({
-  form: { ...initFormData },
-  // 查询参数
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    configKey: '',
-    bucketName: '',
-    status: ''
-  },
-  rules: {
-    configKey: [{ required: true, message: 'configKey不能为空', trigger: 'blur' }],
-    accessKey: [
-      { required: true, message: 'accessKey不能为空', trigger: 'blur' },
-      {
-        min: 2,
-        max: 200,
-        message: 'accessKey长度必须介于 2 和 100 之间',
-        trigger: 'blur'
-      }
-    ],
-    secretKey: [
-      { required: true, message: 'secretKey不能为空', trigger: 'blur' },
-      {
-        min: 2,
-        max: 100,
-        message: 'secretKey长度必须介于 2 和 100 之间',
-        trigger: 'blur'
-      }
-    ],
-    bucketName: [
-      { required: true, message: 'bucketName不能为空', trigger: 'blur' },
-      {
-        min: 2,
-        max: 100,
-        message: 'bucketName长度必须介于 2 和 100 之间',
-        trigger: 'blur'
-      }
-    ],
-    endpoint: [
-      { required: true, message: 'endpoint不能为空', trigger: 'blur' },
-      {
-        min: 2,
-        max: 100,
-        message: 'endpoint名称长度必须介于 2 和 100 之间',
-        trigger: 'blur'
-      }
-    ],
-    accessPolicy: [{ required: true, message: 'accessPolicy不能为空', trigger: 'blur' }]
-  }
-});
 
-const { queryParams, form, rules } = toRefs(data);
+const form = ref<OssConfigForm>({ ...initFormData });
+
+const rules = {
+  endpoint: [{ required: true, message: '访问站点不能为空', trigger: 'blur' }],
+  domain: [{ required: true, message: '自定义域名不能为空', trigger: 'blur' }],
+  accessKey: [
+    { required: true, message: 'AccessKey 不能为空', trigger: 'blur' },
+    { min: 2, max: 200, message: '长度必须介于 2 和 200 之间', trigger: 'blur' }
+  ],
+  secretKey: [
+    { required: true, message: 'SecretKey 不能为空', trigger: 'blur' },
+    { min: 2, max: 100, message: '长度必须介于 2 和 100 之间', trigger: 'blur' }
+  ],
+  bucketName: [
+    { required: true, message: '桶名称不能为空', trigger: 'blur' },
+    { min: 2, max: 100, message: '长度必须介于 2 和 100 之间', trigger: 'blur' }
+  ]
+};
 
 const protocol = computed(() => (form.value.isHttps === 'Y' ? 'https://' : 'http://'));
 
-/** 查询对象存储配置列表 */
-const getList = async () => {
-  loading.value = true;
-  const res = await listOssConfig(queryParams.value);
-  ossConfigList.value = res.rows;
-  total.value = res.total;
-  loading.value = false;
-};
-/** 取消按钮 */
-const cancel = () => {
-  dialog.visible = false;
-  reset();
-};
-/** 表单重置 */
-const reset = () => {
+function loadTypeConfig(configKey: string) {
+  listOssConfig({ configKey } as any).then(res => {
+    if (res.rows && res.rows.length > 0) {
+      Object.assign(form.value, res.rows[0]);
+      form.value.status = '0';
+    } else {
+      form.value = { ...initFormData, configKey };
+    }
+  });
+}
+
+function handleTypeChange(val: string) {
+  loadTypeConfig(val);
+}
+
+function resetForm() {
   form.value = { ...initFormData };
-  ossConfigFormRef.value?.resetFields();
-};
-/** 搜索按钮操作 */
-const handleQuery = () => {
-  queryParams.value.pageNum = 1;
-  getList();
-};
-/** 重置按钮操作 */
-const resetQuery = () => {
-  queryFormRef.value?.resetFields();
-  handleQuery();
-};
-/** 选择条数  */
-const handleSelectionChange = (selection: OssConfigVO[]) => {
-  ids.value = selection.map((item) => item.ossConfigId);
-  single.value = selection.length != 1;
-  multiple.value = !selection.length;
-};
-/** 新增按钮操作 */
-const handleAdd = () => {
-  reset();
-  dialog.visible = true;
-  dialog.title = '添加对象存储配置';
-};
-/** 修改按钮操作 */
-const handleUpdate = async (row?: OssConfigVO) => {
-  reset();
-  const ossConfigId = row?.ossConfigId || ids.value[0];
-  const res = await getOssConfig(ossConfigId);
-  Object.assign(form.value, res.data);
-  dialog.visible = true;
-  dialog.title = '修改对象存储配置';
-};
-/** 提交按钮 */
-const submitForm = () => {
-  ossConfigFormRef.value?.validate(async (valid: boolean) => {
+  ossFormRef.value?.resetFields();
+  loadTypeConfig('local');
+}
+
+function submitForm() {
+  ossFormRef.value?.validate(async (valid: boolean) => {
     if (valid) {
       buttonLoading.value = true;
-      if (form.value.ossConfigId) {
-        await updateOssConfig(form.value).finally(() => (buttonLoading.value = false));
+      try {
+        form.value.status = '0';
+        if (form.value.ossConfigId) {
+          await updateOssConfig(form.value);
+        } else {
+          await addOssConfig(form.value);
+        }
+        proxy?.$modal.msgSuccess('存储配置已保存');
+        await loadTypeConfig(form.value.configKey);
+      } finally {
+        buttonLoading.value = false;
+      }
+    }
+  });
+}
+
+function initOssConfig() {
+  listOssConfig({} as any).then(res => {
+    if (res.rows && res.rows.length > 0) {
+      const activeItem = res.rows.find((item: any) => item.status === '0');
+      if (activeItem) {
+        form.value.configKey = activeItem.configKey;
+        Object.assign(form.value, activeItem);
       } else {
-        await addOssConfig(form.value).finally(() => (buttonLoading.value = false));
+        loadTypeConfig('local');
       }
-      proxy?.$modal.msgSuccess('新增成功');
-      dialog.visible = false;
-      await getList();
+    } else {
+      loadTypeConfig('local');
     }
   });
-};
-/** 状态修改  */
-const handleStatusChange = async (row: OssConfigVO) => {
-  const text = row.status === '0' ? '启用' : '停用';
-  try {
-    await proxy?.$modal.confirm('确认要"' + text + '""' + row.configKey + '"配置吗?');
-    await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey);
-    await getList();
-    proxy?.$modal.msgSuccess(text + '成功');
-  } catch {
-    return;
-  } finally {
-    row.status = row.status === '0' ? '1' : '0';
-  }
-};
-/** 删除按钮操作 */
-const handleDelete = async (row?: OssConfigVO) => {
-  const ossConfigIds = row?.ossConfigId || ids.value;
-  await proxy?.$modal.confirm('是否确认删除OSS配置编号为"' + ossConfigIds + '"的数据项?');
-  loading.value = true;
-  await delOssConfig(ossConfigIds).finally(() => (loading.value = false));
-  await getList();
-  proxy?.$modal.msgSuccess('删除成功');
-};
+}
 
 onMounted(() => {
-  getList();
+  initOssConfig();
 });
 </script>
+
+<style lang="scss" scoped>
+.oss-config-page {
+  padding: 16px;
+  min-height: calc(100vh - 100px);
+  background: #f5f7fa;
+}
+
+.setting-hint {
+  margin-bottom: 16px;
+
+  .custom-alert {
+    background: #f0faff;
+    border: 1px solid #c2eaff;
+    border-radius: 8px;
+
+    .alert-content {
+      color: #0089ff;
+      font-size: 13px;
+      line-height: 1.6;
+    }
+  }
+}
+
+.setting-body {
+  .setting-card {
+    border-radius: 8px;
+    border: 1px solid #edf0f5;
+    background: #fff;
+
+    .setting-card-header {
+      .setting-card-title {
+        font-size: 15px;
+        font-weight: 600;
+        color: #1a1a2e;
+      }
+    }
+  }
+}
+
+.premium-form {
+  max-width: 920px;
+
+  .storage-radio-group {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+
+    :deep(.el-radio) {
+      margin-right: 0;
+      border-radius: 6px;
+      padding: 7px 18px;
+      height: auto;
+      border-color: #e5e6eb;
+      transition: all 0.2s ease;
+
+      &:hover {
+        border-color: #409eff;
+      }
+
+      &.is-checked {
+        border-color: #409eff;
+        background: rgba(64, 158, 255, 0.04);
+      }
+
+      .el-radio__label {
+        font-size: 13px;
+      }
+    }
+  }
+
+  .protocol-prefix {
+    color: #bfc0c4;
+    font-size: 13px;
+  }
+
+  .action-item {
+    margin-top: 4px;
+    padding-top: 16px;
+    border-top: 1px solid #f0f2f5;
+  }
+
+  .save-btn {
+    padding: 8px 28px;
+    border-radius: 6px;
+  }
+}
+</style>

+ 28 - 46
src/views/system/oss/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -14,15 +15,9 @@
               <el-input v-model="queryParams.fileSuffix" placeholder="请输入文件后缀" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRangeCreateTime"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-              ></el-date-picker>
+              <el-date-picker v-model="dateRangeCreateTime" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
             </el-form-item>
             <el-form-item label="服务商" prop="service">
               <el-input v-model="queryParams.service" placeholder="请输入服务商" clearable @keyup.enter="handleQuery" />
@@ -40,41 +35,34 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload" @click="handleFile">上传文件</el-button>
+            <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload"
+              @click="handleFile">上传文件</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload" @click="handleImage">上传图片</el-button>
+            <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload"
+              @click="handleImage">上传图片</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:oss:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:oss:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button
-              v-hasPermi="['system:oss:edit']"
-              :type="previewListResource ? 'danger' : 'warning'"
-              plain
-              @click="handlePreviewListResource(!previewListResource)"
-              >预览开关 : {{ previewListResource ? '禁用' : '启用' }}</el-button
-            >
+            <el-button v-hasPermi="['system:oss:edit']" :type="previewListResource ? 'danger' : 'warning'" plain
+              @click="handlePreviewListResource(!previewListResource)">预览开关 : {{ previewListResource ? '禁用' : '启用'
+              }}</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:ossConfig:list']" type="info" plain icon="Operation" @click="handleOssConfig">配置管理</el-button>
+            <el-button v-hasPermi="['system:ossConfig:list']" type="info" plain icon="Operation"
+              @click="handleOssConfig">配置管理</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
       </template>
 
-      <el-table
-        v-if="showTable"
-        v-loading="loading"
-        :data="ossList"
-        border
-        :header-cell-class-name="handleHeaderClass"
-        @selection-change="handleSelectionChange"
-        @header-click="handleHeaderCLick"
-      >
+      <el-table v-if="showTable" v-loading="loading" :data="ossList" border :header-cell-class-name="handleHeaderClass"
+        @selection-change="handleSelectionChange" @header-click="handleHeaderCLick">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column v-if="false" label="对象存储主键" align="center" prop="ossId" />
         <el-table-column label="文件名" align="center" prop="fileName" />
@@ -82,13 +70,8 @@
         <el-table-column label="文件后缀" align="center" prop="fileSuffix" />
         <el-table-column label="文件展示" align="center" prop="url">
           <template #default="scope">
-            <ImagePreview
-              v-if="previewListResource && checkFileSuffix(scope.row.fileSuffix)"
-              :width="100"
-              :height="100"
-              :src="scope.row.url"
-              :preview-src-list="[scope.row.url]"
-            />
+            <ImagePreview v-if="previewListResource && checkFileSuffix(scope.row.fileSuffix)" :width="100" :height="100"
+              :src="scope.row.url" :preview-src-list="[scope.row.url]" />
             <span v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" v-text="scope.row.url" />
           </template>
         </el-table-column>
@@ -101,17 +84,16 @@
         <el-table-column label="服务商" align="center" prop="service" sortable="custom" />
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="下载" placement="top">
-              <el-button v-hasPermi="['system:oss:download']" link type="primary" icon="Download" @click="handleDownload(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:oss:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:oss:download']" link type="warning" icon="Download"
+              @click="handleDownload(scope.row)">下载</el-button>
+            <el-button v-hasPermi="['system:oss:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
     <!-- 添加或修改OSS对象存储对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
@@ -123,8 +105,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

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

@@ -13,10 +13,10 @@
           <el-input v-model="form.servicePhone" placeholder="请输入客服电话" style="width: 300px" maxlength="20" />
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" :loading="saving" @click="handleSave">
+          <el-button type="primary" icon="Check" :loading="saving" @click="handleSave">
             保存
           </el-button>
-          <el-button @click="loadPhone">重置</el-button>
+          <el-button icon="Refresh" @click="loadPhone">重置</el-button>
         </el-form-item>
       </el-form>
     </el-card>

+ 32 - 66
src/views/system/post/index.vue

@@ -5,53 +5,32 @@
       <el-col :lg="4" :xs="24" style="">
         <el-card shadow="hover">
           <el-input v-model="deptName" placeholder="请输入部门名称" prefix-icon="Search" clearable />
-          <el-tree
-            ref="deptTreeRef"
-            class="mt-2"
-            node-key="id"
-            :data="deptOptions"
-            :props="{ label: 'label', children: 'children' } as any"
-            :expand-on-click-node="false"
-            :filter-node-method="filterNode"
-            highlight-current
-            default-expand-all
-            @node-click="handleNodeClick"
-          />
+          <el-tree ref="deptTreeRef" class="mt-2" node-key="id" :data="deptOptions"
+            :props="{ label: 'label', children: 'children' } as any" :expand-on-click-node="false"
+            :filter-node-method="filterNode" highlight-current default-expand-all @node-click="handleNodeClick" />
         </el-card>
       </el-col>
       <el-col :lg="20" :xs="24">
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+          :leave-active-class="proxy?.animate.searchAnimate.leave">
           <div v-show="showSearch" class="mb-[10px]">
             <el-card shadow="hover">
               <el-form ref="queryFormRef" :model="queryParams" :inline="true">
                 <el-form-item label="岗位编码" prop="postCode">
                   <el-input v-model="queryParams.postCode" placeholder="请输入岗位编码" clearable @keyup.enter="handleQuery" />
                 </el-form-item>
-                <el-form-item label="类别编码" prop="postCategory">
-                  <el-input
-                    v-model="queryParams.postCategory"
-                    placeholder="请输入类别编码"
-                    clearable
-                    style="width: 200px"
-                    @keyup.enter="handleQuery"
-                  />
-                </el-form-item>
                 <el-form-item label="岗位名称" prop="postName">
                   <el-input v-model="queryParams.postName" placeholder="请输入岗位名称" clearable @keyup.enter="handleQuery" />
                 </el-form-item>
                 <el-form-item label="部门" prop="deptId">
-                  <el-tree-select
-                    v-model="queryParams.deptId"
-                    :data="deptOptions"
-                    :props="{ value: 'id', label: 'label', children: 'children' } as any"
-                    value-key="id"
-                    placeholder="请选择部门"
-                    check-strictly
-                  />
+                  <el-tree-select v-model="queryParams.deptId" :data="deptOptions"
+                    :props="{ value: 'id', label: 'label', children: 'children' } as any" value-key="id"
+                    placeholder="请选择部门" check-strictly />
                 </el-form-item>
                 <el-form-item label="状态" prop="status">
                   <el-select v-model="queryParams.status" placeholder="岗位状态" clearable>
-                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+                      :value="dict.value" />
                   </el-select>
                 </el-form-item>
                 <el-form-item>
@@ -66,20 +45,22 @@
           <template #header>
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
-                <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+                <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus"
+                  @click="handleAdd">新增</el-button>
               </el-col>
               <el-col :span="1.5">
-                <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-                  >修改</el-button
-                >
+                <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single"
+                  @click="handleUpdate()">修改</el-button>
               </el-col>
               <el-col :span="1.5">
-                <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+                <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+                  @click="handleDelete()">
                   删除
                 </el-button>
               </el-col>
               <el-col :span="1.5">
-                <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+                <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download"
+                  @click="handleExport">导出</el-button>
               </el-col>
               <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
             </el-row>
@@ -88,7 +69,6 @@
             <el-table-column type="selection" width="55" align="center" />
             <el-table-column v-if="false" label="岗位编号" align="center" prop="postId" />
             <el-table-column label="岗位编码" align="center" prop="postCode" />
-            <el-table-column label="类别编码" align="center" prop="postCategory" />
             <el-table-column label="岗位名称" align="center" prop="postName" />
             <el-table-column label="部门" align="center" prop="deptName" />
             <el-table-column label="排序" align="center" prop="postSort" />
@@ -102,25 +82,18 @@
                 <span>{{ proxy.parseTime(scope.row.createTime) }}</span>
               </template>
             </el-table-column>
-            <el-table-column label="操作" width="180" align="center" class-name="small-padding fixed-width">
+            <el-table-column label="操作" width="150" align="center" class-name="small-padding fixed-width">
               <template #default="scope">
-                <el-tooltip content="修改" placement="top">
-                  <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-                </el-tooltip>
-                <el-tooltip content="删除" placement="top">
-                  <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-                </el-tooltip>
+                <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit"
+                  @click="handleUpdate(scope.row)">修改</el-button>
+                <el-button v-hasPermi="['system:post:remove']" link type="danger" icon="Delete"
+                  @click="handleDelete(scope.row)">删除</el-button>
               </template>
             </el-table-column>
           </el-table>
 
-          <pagination
-            v-show="total > 0"
-            v-model:page="queryParams.pageNum"
-            v-model:limit="queryParams.pageSize"
-            :total="total"
-            @pagination="getList"
-          />
+          <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+            :total="total" @pagination="getList" />
         </el-card>
 
         <!-- 添加或修改岗位对话框 -->
@@ -130,27 +103,20 @@
               <el-input v-model="form.postName" placeholder="请输入岗位名称" />
             </el-form-item>
             <el-form-item label="部门" prop="deptId">
-              <el-tree-select
-                v-model="form.deptId"
-                :data="deptOptions"
-                :props="{ value: 'id', label: 'label', children: 'children' } as any"
-                value-key="id"
-                placeholder="请选择部门"
-                check-strictly
-              />
+              <el-tree-select v-model="form.deptId" :data="deptOptions"
+                :props="{ value: 'id', label: 'label', children: 'children' } as any" value-key="id" placeholder="请选择部门"
+                check-strictly />
             </el-form-item>
             <el-form-item label="岗位编码" prop="postCode">
               <el-input v-model="form.postCode" placeholder="请输入编码名称" />
             </el-form-item>
-            <el-form-item label="类别编码" prop="postCategory">
-              <el-input v-model="form.postCategory" placeholder="请输入类别编码" />
-            </el-form-item>
             <el-form-item label="岗位顺序" prop="postSort">
               <el-input-number v-model="form.postSort" controls-position="right" :min="0" />
             </el-form-item>
             <el-form-item label="岗位状态" prop="status">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label
+                  }}</el-radio>
               </el-radio-group>
             </el-form-item>
             <el-form-item label="备注" prop="remark">
@@ -159,8 +125,8 @@
           </el-form>
           <template #footer>
             <div class="dialog-footer">
-              <el-button type="primary" @click="submitForm">确 定</el-button>
-              <el-button @click="cancel">取 消</el-button>
+              <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+              <el-button icon="Close" @click="cancel">取 消</el-button>
             </div>
           </template>
         </el-dialog>

+ 1 - 3
src/views/system/role/authUser.vue

@@ -51,9 +51,7 @@
         </el-table-column>
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="取消授权" placement="top">
-              <el-button v-hasPermi="['system:role:remove']" link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)"> </el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:role:remove']" link type="danger" icon="CircleClose" @click="cancelAuthUser(scope.row)">取消授权</el-button>
           </template>
         </el-table-column>
       </el-table>

+ 48 - 66
src/views/system/role/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -10,19 +11,14 @@
 
             <el-form-item label="状态" prop="status">
               <el-select v-model="queryParams.status" placeholder="角色状态" clearable>
-                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
               </el-select>
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRange"
-                value-format="YYYY-MM-DD HH:mm:ss"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-              ></el-date-picker>
+              <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
             </el-form-item>
 
             <el-form-item>
@@ -38,22 +34,27 @@
       <template #header>
         <el-row :gutter="10">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+            <el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus"
+              @click="handleAdd()">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">修改</el-button>
+            <el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit"
+              @click="handleUpdate()">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:role:remove']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">删除</el-button>
+            <el-button v-hasPermi="['system:role:remove']" type="danger" plain :disabled="ids.length === 0"
+              @click="handleDelete()">删除</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:role:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:role:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
       </template>
 
-      <el-table ref="roleTableRef" border v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
+      <el-table ref="roleTableRef" border v-loading="loading" :data="roleList"
+        @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column v-if="false" label="角色编号" prop="roleId" width="120" />
         <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
@@ -61,7 +62,8 @@
         <el-table-column label="显示顺序" prop="roleSort" width="100" />
         <el-table-column label="状态" align="center" width="100">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+              @change="handleStatusChange(scope.row)"></el-switch>
           </template>
         </el-table-column>
         <el-table-column label="创建时间" align="center" prop="createTime">
@@ -70,31 +72,22 @@
           </template>
         </el-table-column>
 
-        <el-table-column fixed="right" label="操作" width="180">
+        <el-table-column fixed="right" label="操作" width="360">
           <template #default="scope">
-            <el-tooltip v-if="scope.row.roleId !== 1" content="修改" placement="top">
-              <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip v-if="scope.row.roleId !== 1" content="删除" placement="top">
-              <el-button v-hasPermi="['system:role:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip v-if="scope.row.roleId !== 1" content="数据权限" placement="top">
-              <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip v-if="scope.row.roleId !== 1" content="分配用户" placement="top">
-              <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="User" @click="handleAuthUser(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-if="scope.row.roleId !== 1" v-hasPermi="['system:role:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-if="scope.row.roleId !== 1" v-hasPermi="['system:role:remove']" link type="danger"
+              icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+            <el-button v-if="scope.row.roleId !== 1" v-hasPermi="['system:role:edit']" link type="warning"
+              icon="CircleCheck" @click="handleDataScope(scope.row)">数据权限</el-button>
+            <el-button v-if="scope.row.roleId !== 1" v-hasPermi="['system:role:edit']" link type="success" icon="User"
+              @click="handleAuthUser(scope.row)">分配用户</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination
-        v-if="total > 0"
-        v-model:total="total"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        @pagination="getList"
-      />
+      <pagination v-if="total > 0" v-model:total="total" v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize" @pagination="getList" />
     </el-card>
 
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
@@ -108,23 +101,18 @@
         </el-form-item>
         <el-form-item label="状态">
           <el-radio-group v-model="form.status">
-            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label
+              }}</el-radio>
           </el-radio-group>
         </el-form-item>
         <el-form-item label="菜单权限">
           <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
           <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
-          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
-          <el-tree
-            ref="menuRef"
-            class="tree-border"
-            :data="menuOptions"
-            show-checkbox
-            node-key="id"
-            :check-strictly="!form.menuCheckStrictly"
-            empty-text="加载中,请稍候"
-            :props="{ label: 'label', children: 'children' } as any"
-          ></el-tree>
+          <el-checkbox v-model="form.menuCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-tree ref="menuRef" class="tree-border" :data="menuOptions" show-checkbox node-key="id"
+            :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' } as any"></el-tree>
         </el-form-item>
         <el-form-item label="备注">
           <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
@@ -132,8 +120,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>
@@ -149,30 +137,24 @@
         </el-form-item>
         <el-form-item label="权限范围">
           <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
-            <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option>
+            <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item v-show="form.dataScope === '2'" label="数据权限">
           <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
           <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
-          <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
-          <el-tree
-            ref="deptRef"
-            class="tree-border"
-            :data="deptOptions"
-            show-checkbox
-            default-expand-all
-            node-key="id"
-            :check-strictly="!form.deptCheckStrictly"
-            empty-text="加载中,请稍候"
-            :props="{ label: 'label', children: 'children' } as any"
-          ></el-tree>
+          <el-checkbox v-model="form.deptCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
+          <el-tree ref="deptRef" class="tree-border" :data="deptOptions" show-checkbox default-expand-all node-key="id"
+            :check-strictly="!form.deptCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' } as any"></el-tree>
         </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitDataScope">确 定</el-button>
-          <el-button @click="cancelDataScope">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitDataScope">确 定</el-button>
+          <el-button icon="Close" @click="cancelDataScope">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 2 - 2
src/views/system/role/selectUser.vue

@@ -35,8 +35,8 @@
       </el-row>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="handleSelectUser">确 定</el-button>
-          <el-button @click="visible = false">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="handleSelectUser">确 定</el-button>
+          <el-button icon="Close" @click="visible = false">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 35 - 28
src/views/system/tenant/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -8,7 +9,8 @@
               <el-input v-model="queryParams.tenantId" placeholder="请输入租户编号" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="联系人" prop="contactUserName">
-              <el-input v-model="queryParams.contactUserName" placeholder="请输入联系人" clearable @keyup.enter="handleQuery" />
+              <el-input v-model="queryParams.contactUserName" placeholder="请输入联系人" clearable
+                @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="联系电话" prop="contactPhone">
               <el-input v-model="queryParams.contactPhone" placeholder="请输入联系电话" clearable @keyup.enter="handleQuery" />
@@ -29,26 +31,30 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenant:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['system:tenant:add']" type="primary" plain icon="Plus"
+              @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenant:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"
-              >修改</el-button
-            >
+            <el-button v-hasPermi="['system:tenant:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenant:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:tenant:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenant:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['system:tenant:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-if="userId === 1" type="success" plain icon="Refresh" @click="handleSyncTenantDict">同步租户字典</el-button>
+            <el-button v-if="userId === 1" type="success" plain icon="Refresh"
+              @click="handleSyncTenantDict">同步租户字典</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-if="userId === 1" type="success" plain icon="Refresh" @click="handleSyncTenantConfig">同步租户参数配置</el-button>
+            <el-button v-if="userId === 1" type="success" plain icon="Refresh"
+              @click="handleSyncTenantConfig">同步租户参数配置</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -69,26 +75,24 @@
         </el-table-column>
         <el-table-column label="租户状态" align="center" prop="status">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+              @change="handleStatusChange(scope.row)"></el-switch>
           </template>
         </el-table-column>
-        <el-table-column width="150" label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
+        <el-table-column width="220" label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:tenant:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="同步套餐" placement="top">
-              <el-button v-hasPermi="['system:tenant:edit']" link type="primary" icon="Refresh" @click="handleSyncTenantPackage(scope.row)">
-              </el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:tenant:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:tenant:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:tenant:edit']" link type="success" icon="Refresh"
+              @click="handleSyncTenantPackage(scope.row)">同步套餐</el-button>
+            <el-button v-hasPermi="['system:tenant:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
     <!-- 添加或修改租户对话框 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
@@ -109,12 +113,15 @@
           <el-input v-model="form.password" type="password" placeholder="请输入系统用户密码" maxlength="20" />
         </el-form-item>
         <el-form-item label="租户套餐" prop="packageId">
-          <el-select v-model="form.packageId" :disabled="!!form.tenantId" placeholder="请选择租户套餐" clearable style="width: 100%">
-            <el-option v-for="item in packageList" :key="item.packageId" :label="item.packageName" :value="item.packageId" />
+          <el-select v-model="form.packageId" :disabled="!!form.tenantId" placeholder="请选择租户套餐" clearable
+            style="width: 100%">
+            <el-option v-for="item in packageList" :key="item.packageId" :label="item.packageName"
+              :value="item.packageId" />
           </el-select>
         </el-form-item>
         <el-form-item label="过期时间" prop="expireTime">
-          <el-date-picker v-model="form.expireTime" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择过期时间">
+          <el-date-picker v-model="form.expireTime" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss"
+            placeholder="请选择过期时间">
           </el-date-picker>
         </el-form-item>
         <el-form-item label="用户数量" prop="accountCount">
@@ -138,8 +145,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 25 - 26
src/views/system/tenantPackage/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -20,20 +21,24 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenantPackage:add']" type="primary" plain icon="Plus" @click="handleAdd"> 新增 </el-button>
+            <el-button v-hasPermi="['system:tenantPackage:add']" type="primary" plain icon="Plus" @click="handleAdd"> 新增
+            </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenantPackage:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">
+            <el-button v-hasPermi="['system:tenantPackage:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleUpdate()">
               修改
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenantPackage:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['system:tenantPackage:remove']" type="danger" plain icon="Delete"
+              :disabled="multiple" @click="handleDelete()">
               删除
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['system:tenantPackage:export']" type="warning" plain icon="Download" @click="handleExport">导出 </el-button>
+            <el-button v-hasPermi="['system:tenantPackage:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出 </el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -46,22 +51,22 @@
         <el-table-column label="备注" align="center" prop="remark" />
         <el-table-column label="状态" align="center" prop="status">
           <template #default="scope">
-            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @click="handleStatusChange(scope.row)"></el-switch>
+            <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+              @click="handleStatusChange(scope.row)"></el-switch>
           </template>
         </el-table-column>
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button v-hasPermi="['system:tenantPackage:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['system:tenantPackage:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['system:tenantPackage:edit']" link type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button v-hasPermi="['system:tenantPackage:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
 
     <!-- 添加或修改租户套餐对话框 -->
@@ -73,17 +78,11 @@
         <el-form-item label="关联菜单">
           <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
           <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选 </el-checkbox>
-          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动 </el-checkbox>
-          <el-tree
-            ref="menuTreeRef"
-            class="tree-border"
-            :data="menuOptions"
-            show-checkbox
-            node-key="id"
-            :check-strictly="!form.menuCheckStrictly"
-            empty-text="加载中,请稍候"
-            :props="{ label: 'label', children: 'children' } as any"
-          ></el-tree>
+          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动
+          </el-checkbox>
+          <el-tree ref="menuTreeRef" class="tree-border" :data="menuOptions" show-checkbox node-key="id"
+            :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' } as any"></el-tree>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="form.remark" placeholder="请输入备注" />
@@ -91,8 +90,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

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

@@ -46,8 +46,8 @@
         </el-table>
         <pagination v-show="total > 0" v-model:page="pageNum" v-model:limit="pageSize" :total="total" />
         <div style="text-align: center; margin-left: -120px; margin-top: 30px">
-          <el-button type="primary" @click="submitForm()">提交</el-button>
-          <el-button @click="close()">返回</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm()">提交</el-button>
+          <el-button icon="Back" @click="close()">返回</el-button>
         </div>
         <div></div>
       </div>

+ 68 - 102
src/views/system/user/index.vue

@@ -5,22 +5,14 @@
       <el-col :lg="4" :xs="24" style="">
         <el-card shadow="hover">
           <el-input v-model="deptName" placeholder="请输入部门名称" prefix-icon="Search" clearable />
-          <el-tree
-            ref="deptTreeRef"
-            class="mt-2"
-            node-key="id"
-            :data="deptOptions"
-            :props="{ label: 'label', children: 'children' } as any"
-            :expand-on-click-node="false"
-            :filter-node-method="filterNode"
-            highlight-current
-            default-expand-all
-            @node-click="handleNodeClick"
-          />
+          <el-tree ref="deptTreeRef" class="mt-2" node-key="id" :data="deptOptions"
+            :props="{ label: 'label', children: 'children' } as any" :expand-on-click-node="false"
+            :filter-node-method="filterNode" highlight-current default-expand-all @node-click="handleNodeClick" />
         </el-card>
       </el-col>
       <el-col :lg="20" :xs="24">
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+          :leave-active-class="proxy?.animate.searchAnimate.leave">
           <div v-show="showSearch" class="mb-[10px]">
             <el-card shadow="hover">
               <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -31,24 +23,20 @@
                   <el-input v-model="queryParams.nickName" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" />
                 </el-form-item>
                 <el-form-item label="手机号码" prop="phonenumber">
-                  <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
+                  <el-input v-model="queryParams.phonenumber" placeholder="请输入手机号码" clearable
+                    @keyup.enter="handleQuery" />
                 </el-form-item>
 
                 <el-form-item label="状态" prop="status">
                   <el-select v-model="queryParams.status" placeholder="用户状态" clearable>
-                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+                    <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label"
+                      :value="dict.value" />
                   </el-select>
                 </el-form-item>
                 <el-form-item label="创建时间" style="width: 308px">
-                  <el-date-picker
-                    v-model="dateRange"
-                    value-format="YYYY-MM-DD HH:mm:ss"
-                    type="daterange"
-                    range-separator="-"
-                    start-placeholder="开始日期"
-                    end-placeholder="结束日期"
-                    :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-                  ></el-date-picker>
+                  <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange"
+                    range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                    :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
                 </el-form-item>
                 <el-form-item>
                   <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -63,15 +51,18 @@
           <template #header>
             <el-row :gutter="10">
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
+                <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus"
+                  @click="handleAdd()">新增</el-button>
               </el-col>
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">
+                <el-button v-has-permi="['system:user:edit']" type="success" plain :disabled="single" icon="Edit"
+                  @click="handleUpdate()">
                   修改
                 </el-button>
               </el-col>
               <el-col :span="1.5">
-                <el-button v-has-permi="['system:user:remove']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">
+                <el-button v-has-permi="['system:user:remove']" type="danger" plain :disabled="multiple" icon="Delete"
+                  @click="handleDelete()">
                   删除
                 </el-button>
               </el-col>
@@ -79,32 +70,39 @@
                 <el-dropdown class="mt-[1px]">
                   <el-button plain type="info">
                     更多
-                    <el-icon class="el-icon--right"><arrow-down /></el-icon
-                  ></el-button>
+                    <el-icon class="el-icon--right"><arrow-down /></el-icon></el-button>
                   <template #dropdown>
                     <el-dropdown-menu>
                       <el-dropdown-item icon="Download" @click="importTemplate">下载模板</el-dropdown-item>
                       <!-- 注意 由于el-dropdown-item标签是延迟加载的 所以v-has-permi自定义标签不生效 需要使用v-if调用方法执行 -->
-                      <el-dropdown-item v-if="checkPermi(['system:user:import'])" icon="Top" @click="handleImport">导入数据</el-dropdown-item>
-                      <el-dropdown-item v-if="checkPermi(['system:user:export'])" icon="Download" @click="handleExport">导出数据</el-dropdown-item>
+                      <el-dropdown-item v-if="checkPermi(['system:user:import'])" icon="Top"
+                        @click="handleImport">导入数据</el-dropdown-item>
+                      <el-dropdown-item v-if="checkPermi(['system:user:export'])" icon="Download"
+                        @click="handleExport">导出数据</el-dropdown-item>
                     </el-dropdown-menu>
                   </template>
                 </el-dropdown>
               </el-col>
-              <right-toolbar v-model:show-search="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar>
+              <right-toolbar v-model:show-search="showSearch" :columns="columns" :search="true"
+                @query-table="getList"></right-toolbar>
             </el-row>
           </template>
 
           <el-table v-loading="loading" border :data="userList" @selection-change="handleSelectionChange">
             <el-table-column type="selection" width="50" align="center" />
             <el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" />
-            <el-table-column v-if="columns[1].visible" key="userName" label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" />
-            <el-table-column v-if="columns[2].visible" key="nickName" label="用户昵称" align="center" prop="nickName" :show-overflow-tooltip="true" />
-            <el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" />
-            <el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" />
+            <el-table-column v-if="columns[1].visible" key="userName" label="用户名称" align="center" prop="userName"
+              :show-overflow-tooltip="true" />
+            <el-table-column v-if="columns[2].visible" key="nickName" label="用户昵称" align="center" prop="nickName"
+              :show-overflow-tooltip="true" />
+            <el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName"
+              :show-overflow-tooltip="true" />
+            <el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber"
+              width="120" />
             <el-table-column v-if="columns[5].visible" key="status" label="状态" align="center">
               <template #default="scope">
-                <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
+                <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+                  @change="handleStatusChange(scope.row)"></el-switch>
               </template>
             </el-table-column>
 
@@ -114,39 +112,29 @@
               </template>
             </el-table-column>
 
-            <el-table-column label="操作" fixed="right" width="180" class-name="small-padding fixed-width">
+            <el-table-column label="操作" fixed="right" width="280" class-name="small-padding fixed-width">
               <template #default="scope">
-                <el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
-                </el-tooltip>
-                <el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
-                  <el-button v-hasPermi="['system:user:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-                </el-tooltip>
-
-                <el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
-                  <el-button v-hasPermi="['system:user:resetPwd']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button>
-                </el-tooltip>
-
-                <el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button>
-                </el-tooltip>
+                <el-button v-if="scope.row.userId !== 1" v-hasPermi="['system:user:edit']" link type="primary"
+                  icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
+                <el-button v-if="scope.row.userId !== 1" v-hasPermi="['system:user:remove']" link type="danger"
+                  icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+                <el-button v-if="scope.row.userId !== 1" v-hasPermi="['system:user:resetPwd']" link type="danger"
+                  icon="Key" @click="handleResetPwd(scope.row)">重置密码</el-button>
+                <el-button v-if="scope.row.userId !== 1" v-hasPermi="['system:user:edit']" link type="success"
+                  icon="CircleCheck" @click="handleAuthRole(scope.row)">分配角色</el-button>
               </template>
             </el-table-column>
           </el-table>
 
-          <pagination
-            v-show="total > 0"
-            v-model:page="queryParams.pageNum"
-            v-model:limit="queryParams.pageSize"
-            :total="total"
-            @pagination="getList"
-          />
+          <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+            :total="total" @pagination="getList" />
         </el-card>
       </el-col>
     </el-row>
 
     <!-- 添加或修改用户配置对话框 -->
-    <el-dialog ref="formDialogRef" v-model="dialog.visible" :title="dialog.title" width="600px" append-to-body @close="closeDialog">
+    <el-dialog ref="formDialogRef" v-model="dialog.visible" :title="dialog.title" width="600px" append-to-body
+      @close="closeDialog">
       <el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
@@ -156,15 +144,9 @@
           </el-col>
           <el-col :span="12" v-if="form.userId == null || form.userId != useUserStore().userId">
             <el-form-item label="归属部门" prop="deptId">
-              <el-tree-select
-                v-model="form.deptId"
-                :data="enabledDeptOptions"
-                :props="{ value: 'id', label: 'label', children: 'children' } as any"
-                value-key="id"
-                placeholder="请选择归属部门"
-                check-strictly
-                @change="handleDeptChange"
-              />
+              <el-tree-select v-model="form.deptId" :data="enabledDeptOptions"
+                :props="{ value: 'id', label: 'label', children: 'children' } as any" value-key="id"
+                placeholder="请选择归属部门" check-strictly @change="handleDeptChange" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -196,14 +178,16 @@
           <el-col :span="12">
             <el-form-item label="用户性别">
               <el-select v-model="form.sex" placeholder="请选择">
-                <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+                <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label"
+                  :value="dict.value"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="状态">
               <el-radio-group v-model="form.status">
-                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio>
+                <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label
+                  }}</el-radio>
               </el-radio-group>
             </el-form-item>
           </el-col>
@@ -212,26 +196,16 @@
           <el-col :span="12" v-if="form.userId == null || form.userId != useUserStore().userId">
             <el-form-item label="岗位">
               <el-select v-model="form.postIds" multiple placeholder="请选择">
-                <el-option
-                  v-for="item in postOptions"
-                  :key="item.postId"
-                  :label="item.postName"
-                  :value="item.postId"
-                  :disabled="item.status == '1'"
-                ></el-option>
+                <el-option v-for="item in postOptions" :key="item.postId" :label="item.postName" :value="item.postId"
+                  :disabled="item.status == '1'"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12" v-if="form.userId == null || form.userId != useUserStore().userId">
             <el-form-item label="角色" prop="roleIds">
               <el-select v-model="form.roleIds" filterable multiple placeholder="请选择">
-                <el-option
-                  v-for="item in roleOptions"
-                  :key="item.roleId"
-                  :label="item.roleName"
-                  :value="item.roleId"
-                  :disabled="item.status == '1'"
-                ></el-option>
+                <el-option v-for="item in roleOptions" :key="item.roleId" :label="item.roleName" :value="item.roleId"
+                  :disabled="item.status == '1'"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
@@ -246,26 +220,17 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel()">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel()">取 消</el-button>
         </div>
       </template>
     </el-dialog>
 
     <!-- 用户导入对话框 -->
     <el-dialog v-model="upload.open" :title="upload.title" width="400px" append-to-body>
-      <el-upload
-        ref="uploadRef"
-        :limit="1"
-        accept=".xlsx, .xls"
-        :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
-        :disabled="upload.isUploading"
-        :on-progress="handleFileUploadProgress"
-        :on-success="handleFileSuccess"
-        :auto-upload="false"
-        drag
-      >
+      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
         <el-icon class="el-icon--upload">
           <i-ep-upload-filled />
         </el-icon>
@@ -274,14 +239,15 @@
           <div class="text-center el-upload__tip">
             <div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />是否更新已经存在的用户数据</div>
             <span>仅允许导入xls、xlsx格式文件。</span>
-            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
+              @click="importTemplate">下载模板</el-link>
           </div>
         </template>
       </el-upload>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitFileForm">确 定</el-button>
-          <el-button @click="upload.open = false">取 消</el-button>
+          <el-button type="primary" icon="Check" @click="submitFileForm">确 定</el-button>
+          <el-button icon="Close" @click="upload.open = false">取 消</el-button>
         </div>
       </template>
     </el-dialog>

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

@@ -27,7 +27,8 @@
               </li>
               <li class="list-group-item">
                 <svg-icon icon-class="tree" />所属部门
-                <div v-if="state.user.deptName" class="pull-right">{{ state.user.deptName }} / {{ state.postGroup }}</div>
+                <div v-if="state.user.deptName" class="pull-right">{{ state.user.deptName }} / {{ state.postGroup }}
+                </div>
               </li>
               <li class="list-group-item">
                 <svg-icon icon-class="peoples" />所属角色
@@ -55,9 +56,6 @@
             <el-tab-pane label="修改密码" name="resetPwd">
               <resetPwd />
             </el-tab-pane>
-            <el-tab-pane label="第三方应用" name="thirdParty">
-              <thirdParty :auths="state.auths" />
-            </el-tab-pane>
             <el-tab-pane label="在线设备" name="onlineDevice">
               <onlineDevice :devices="state.devices" />
             </el-tab-pane>
@@ -72,9 +70,7 @@
 import UserAvatar from './userAvatar.vue';
 import UserInfo from './userInfo.vue';
 import ResetPwd from './resetPwd.vue';
-import ThirdParty from './thirdParty.vue';
 import OnlineDevice from './onlineDevice.vue';
-import { getAuthList } from '@/api/system/social/auth';
 import { getUserProfile } from '@/api/system/user';
 import { getOnline } from '@/api/monitor/online';
 import { UserVO } from '@/api/system/user/types';
@@ -84,14 +80,12 @@ interface State {
   user: Partial<UserVO>;
   roleGroup: string;
   postGroup: string;
-  auths: any;
   devices: any;
 }
 const state = ref<State>({
   user: {},
   roleGroup: '',
   postGroup: '',
-  auths: [],
   devices: []
 });
 
@@ -105,10 +99,6 @@ const getUser = async () => {
   state.value.postGroup = res.data.postGroup;
 };
 
-const getAuths = async () => {
-  const res = await getAuthList();
-  state.value.auths = res.data;
-};
 const getOnlines = async () => {
   const res = await getOnline();
   state.value.devices = res.rows;
@@ -116,7 +106,6 @@ const getOnlines = async () => {
 
 onMounted(() => {
   getUser();
-  getAuths();
   getOnlines();
 });
 </script>

+ 1 - 3
src/views/system/user/profile/onlineDevice.vue

@@ -17,9 +17,7 @@
       </el-table-column>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template #default="scope">
-          <el-tooltip content="删除" placement="top">
-            <el-button link type="primary" icon="Delete" @click="handldDelOnline(scope.row)"> </el-button>
-          </el-tooltip>
+          <el-button link type="danger" icon="Delete" @click="handldDelOnline(scope.row)">删除</el-button>
         </template>
       </el-table-column>
     </el-table>

+ 2 - 2
src/views/system/user/profile/resetPwd.vue

@@ -10,8 +10,8 @@
       <el-input v-model="user.confirmPassword" placeholder="请确认新密码" type="password" show-password />
     </el-form-item>
     <el-form-item>
-      <el-button type="primary" @click="submit">保存</el-button>
-      <el-button type="danger" @click="close">关闭</el-button>
+      <el-button type="primary" icon="Check" @click="submit">保存</el-button>
+      <el-button type="danger" icon="Close" @click="close">关闭</el-button>
     </el-form-item>
   </el-form>
 </template>

+ 9 - 18
src/views/system/user/profile/userAvatar.vue

@@ -4,18 +4,9 @@
     <el-dialog v-model="open" :title="title" width="800px" append-to-body @opened="modalOpened" @close="closeDialog">
       <el-row>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
-          <vue-cropper
-            v-if="visible"
-            ref="cropper"
-            :img="options.img"
-            :info="true"
-            :auto-crop="options.autoCrop"
-            :auto-crop-width="options.autoCropWidth"
-            :auto-crop-height="options.autoCropHeight"
-            :fixed-box="options.fixedBox"
-            :output-type="options.outputType"
-            @real-time="realTime"
-          />
+          <vue-cropper v-if="visible" ref="cropper" :img="options.img" :info="true" :auto-crop="options.autoCrop"
+            :auto-crop-width="options.autoCropWidth" :auto-crop-height="options.autoCropHeight"
+            :fixed-box="options.fixedBox" :output-type="options.outputType" @real-time="realTime" />
         </el-col>
         <el-col :xs="24" :md="12" :style="{ height: '350px' }">
           <div class="avatar-upload-preview">
@@ -36,19 +27,19 @@
           </el-upload>
         </el-col>
         <el-col :lg="{ span: 1, offset: 2 }" :md="2">
-          <el-button icon="Plus" @click="changeScale(1)"></el-button>
+          <el-button icon="Plus" @click="changeScale(1)">放大</el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :md="2">
-          <el-button icon="Minus" @click="changeScale(-1)"></el-button>
+          <el-button icon="Minus" @click="changeScale(-1)">缩小</el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :md="2">
-          <el-button icon="RefreshLeft" @click="rotateLeft()"></el-button>
+          <el-button icon="RefreshLeft" @click="rotateLeft()">左转</el-button>
         </el-col>
         <el-col :lg="{ span: 1, offset: 1 }" :md="2">
-          <el-button icon="RefreshRight" @click="rotateRight()"></el-button>
+          <el-button icon="RefreshRight" @click="rotateRight()">右转</el-button>
         </el-col>
         <el-col :lg="{ span: 2, offset: 6 }" :md="2">
-          <el-button type="primary" @click="uploadImg()">提 交</el-button>
+          <el-button type="primary" icon="Check" @click="uploadImg()">提 交</el-button>
         </el-col>
       </el-row>
     </el-dialog>
@@ -104,7 +95,7 @@ const modalOpened = () => {
   visible.value = true;
 };
 /** 覆盖默认上传行为 */
-const requestUpload = (): any => {};
+const requestUpload = (): any => { };
 /** 向左旋转 */
 const rotateLeft = () => {
   cropper.value.rotateLeft();

+ 2 - 2
src/views/system/user/profile/userInfo.vue

@@ -16,8 +16,8 @@
       </el-radio-group>
     </el-form-item>
     <el-form-item>
-      <el-button type="primary" @click="submit">保存</el-button>
-      <el-button type="danger" @click="close">关闭</el-button>
+      <el-button type="primary" icon="Check" @click="submit">保存</el-button>
+      <el-button type="danger" icon="Close" @click="close">关闭</el-button>
     </el-form-item>
   </el-form>
 </template>

+ 4 - 3
src/views/tool/gen/editTable.vue

@@ -90,7 +90,8 @@
           <el-table-column label="字典类型" min-width="12%">
             <template #default="scope">
               <el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择" value-on-clear="">
-                <el-option v-for="dict in dictOptions" :key="dict.dictType" :label="dict.dictName" :value="dict.dictType">
+                <el-option v-for="dict in dictOptions" :key="dict.dictType" :label="dict.dictName"
+                  :value="dict.dictType">
                   <span style="float: left">{{ dict.dictName }}</span>
                   <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span>
                 </el-option>
@@ -105,8 +106,8 @@
     </el-tabs>
     <el-form label-width="100px">
       <div style="text-align: center; margin-left: -100px; margin-top: 10px">
-        <el-button type="primary" @click="submitForm()">提交</el-button>
-        <el-button @click="close()">返回</el-button>
+        <el-button type="primary" icon="Check" @click="submitForm()">提交</el-button>
+        <el-button icon="Back" @click="close()">返回</el-button>
       </div>
     </el-form>
   </el-card>

+ 2 - 2
src/views/tool/gen/importTable.vue

@@ -30,8 +30,8 @@
     </el-row>
     <template #footer>
       <div class="dialog-footer">
-        <el-button type="primary" @click="handleImportTable">确 定</el-button>
-        <el-button @click="visible = false">取 消</el-button>
+        <el-button type="primary" icon="Check" @click="handleImportTable">确 定</el-button>
+        <el-button icon="Close" @click="visible = false">取 消</el-button>
       </div>
     </template>
   </el-dialog>

+ 30 - 36
src/views/tool/gen/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@@ -17,14 +18,8 @@
               <el-input v-model="queryParams.tableComment" placeholder="请输入表描述" clearable @keyup.enter="handleQuery" />
             </el-form-item>
             <el-form-item label="创建时间" style="width: 308px">
-              <el-date-picker
-                v-model="dateRange"
-                value-format="YYYY-MM-DD"
-                type="daterange"
-                range-separator="-"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-              ></el-date-picker>
+              <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-"
+                start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
             </el-form-item>
             <el-form-item>
               <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -39,16 +34,20 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['tool:gen:code']" type="primary" plain icon="Download" @click="handleGenTable()">生成</el-button>
+            <el-button v-hasPermi="['tool:gen:code']" type="primary" plain icon="Download"
+              @click="handleGenTable()">生成</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['tool:gen:import']" type="info" plain icon="Upload" @click="openImportTable">导入</el-button>
+            <el-button v-hasPermi="['tool:gen:import']" type="info" plain icon="Upload"
+              @click="openImportTable">导入</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['tool:gen:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleEditTable()">修改</el-button>
+            <el-button v-hasPermi="['tool:gen:edit']" type="success" plain icon="Edit" :disabled="single"
+              @click="handleEditTable()">修改</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['tool:gen:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
+            <el-button v-hasPermi="['tool:gen:remove']" type="danger" plain icon="Delete" :disabled="multiple"
+              @click="handleDelete()">
               删除
             </el-button>
           </el-col>
@@ -69,39 +68,33 @@
         <el-table-column label="实体" align="center" prop="className" :show-overflow-tooltip="true" />
         <el-table-column label="创建时间" align="center" prop="createTime" width="160" />
         <el-table-column label="更新时间" align="center" prop="updateTime" width="160" />
-        <el-table-column label="操作" align="center" width="330" class-name="small-padding fixed-width">
+        <el-table-column label="操作" align="center" width="380" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="预览" placement="top">
-              <el-button v-hasPermi="['tool:gen:preview']" link type="primary" icon="View" @click="handlePreview(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="编辑" placement="top">
-              <el-button v-hasPermi="['tool:gen:edit']" link type="primary" icon="Edit" @click="handleEditTable(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button v-hasPermi="['tool:gen:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="同步" placement="top">
-              <el-button v-hasPermi="['tool:gen:edit']" link type="primary" icon="Refresh" @click="handleSynchDb(scope.row)"></el-button>
-            </el-tooltip>
-            <el-tooltip content="生成代码" placement="top">
-              <el-button v-hasPermi="['tool:gen:code']" link type="primary" icon="Download" @click="handleGenTable(scope.row)"></el-button>
-            </el-tooltip>
+            <el-button v-hasPermi="['tool:gen:preview']" link type="warning" icon="View"
+              @click="handlePreview(scope.row)">预览</el-button>
+            <el-button v-hasPermi="['tool:gen:edit']" link type="primary" icon="Edit"
+              @click="handleEditTable(scope.row)">编辑</el-button>
+            <el-button v-hasPermi="['tool:gen:remove']" link type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
+            <el-button v-hasPermi="['tool:gen:edit']" link type="success" icon="Refresh"
+              @click="handleSynchDb(scope.row)">同步</el-button>
+            <el-button v-hasPermi="['tool:gen:code']" link type="warning" icon="Download"
+              @click="handleGenTable(scope.row)">生成代码</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
 
     <!-- 预览界面 -->
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="80%" top="5vh" append-to-body class="scrollbar">
       <el-tabs v-model="preview.activeName">
-        <el-tab-pane
-          v-for="(value, key) in preview.data"
-          :key="value"
+        <el-tab-pane v-for="(value, key) in preview.data" :key="value"
           :label="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))"
-          :name="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))"
-        >
-          <el-link v-copyText="value" v-copyText:callback="copyTextSuccess" :underline="false" icon="DocumentCopy" style="float: right">
+          :name="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))">
+          <el-link v-copyText="value" v-copyText:callback="copyTextSuccess" :underline="false" icon="DocumentCopy"
+            style="float: right">
             &nbsp;复制
           </el-link>
           <highlightjs :code="value" />
@@ -252,6 +245,7 @@ onMounted(() => {
 <style lang="scss" scoped>
 .el-tab-pane {
   background-color: #282c34;
+
   .el-link {
     color: #fff;
   }

+ 17 - 30
src/views/workflow/category/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="search">
         <el-form ref="queryFormRef" :model="queryParams" :inline="true">
           <el-form-item label="分类名称" prop="categoryName">
@@ -18,7 +19,8 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['workflow:category:add']">新增</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd()"
+              v-hasPermi="['workflow:category:add']">新增</el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">展开/折叠</el-button>
@@ -26,29 +28,19 @@
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
       </template>
-      <el-table
-        ref="categoryTableRef"
-        v-loading="loading"
-        :data="categoryList"
-        row-key="categoryId"
-        border
-        :default-expand-all="isExpandAll"
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-      >
+      <el-table ref="categoryTableRef" v-loading="loading" :data="categoryList" row-key="categoryId" border
+        :default-expand-all="isExpandAll" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
         <el-table-column label="分类名称" prop="categoryName" width="260" />
         <el-table-column label="显示顺序" align="center" prop="orderNum" width="200" />
         <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
         <el-table-column label="操作" fixed="right" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['workflow:category:edit']" />
-            </el-tooltip>
-            <el-tooltip content="新增" placement="top">
-              <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['workflow:category:add']" />
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['workflow:category:remove']" />
-            </el-tooltip>
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+              v-hasPermi="['workflow:category:edit']">修改</el-button>
+            <el-button link type="success" icon="Plus" @click="handleAdd(scope.row)"
+              v-hasPermi="['workflow:category:add']">新增</el-button>
+            <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)"
+              v-hasPermi="['workflow:category:remove']">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -56,14 +48,9 @@
     <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body>
       <el-form ref="categoryFormRef" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="上级分类" prop="parentId">
-          <el-tree-select
-            v-model="form.parentId"
-            :data="categoryOptions"
-            :props="{ value: 'categoryId', label: 'categoryName', children: 'children' } as any"
-            value-key="categoryId"
-            placeholder="请选择上级分类"
-            check-strictly
-          />
+          <el-tree-select v-model="form.parentId" :data="categoryOptions"
+            :props="{ value: 'categoryId', label: 'categoryName', children: 'children' } as any" value-key="categoryId"
+            placeholder="请选择上级分类" check-strictly />
         </el-form-item>
         <el-row :gutter="20">
           <el-col :span="12">
@@ -80,8 +67,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 21 - 26
src/views/workflow/leave/index.vue

@@ -1,6 +1,7 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="search">
         <el-form ref="queryFormRef" :model="queryParams" :inline="true">
           <el-form-item label="请假天数" prop="startLeaveDays">
@@ -22,10 +23,12 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
-            <el-button v-hasPermi="['workflow:leave:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
+            <el-button v-hasPermi="['workflow:leave:add']" type="primary" plain icon="Plus"
+              @click="handleAdd">新增</el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button v-hasPermi="['workflow:leave:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>
+            <el-button v-hasPermi="['workflow:leave:export']" type="warning" plain icon="Download"
+              @click="handleExport">导出</el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
         </el-row>
@@ -36,7 +39,7 @@
         <el-table-column v-if="false" label="主键" align="center" prop="id" />
         <el-table-column label="请假类型" align="center">
           <template #default="scope">
-            <el-tag>{{ options.find((e) => e.value === scope.row.leaveType)?.label }}</el-tag>
+            <el-tag>{{options.find((e) => e.value === scope.row.leaveType)?.label}}</el-tag>
           </template>
         </el-table-column>
         <el-table-column label="开始时间" align="center" prop="startDate">
@@ -56,33 +59,25 @@
             <dict-tag :options="wf_business_status" :value="scope.row.status"></dict-tag>
           </template>
         </el-table-column>
-        <el-table-column label="操作" align="center" width="162">
+        <el-table-column label="操作" align="center" width="280">
           <template #default="scope">
-            <el-row :gutter="10" class="mb8">
-              <el-col :span="1.5" v-if="scope.row.status === 'draft' || scope.row.status === 'cancel' || scope.row.status === 'back'">
-                <el-button v-hasPermi="['workflow:leave:edit']" size="small" type="primary" icon="Edit" @click="handleUpdate(scope.row)"
-                  >修改</el-button
-                >
-              </el-col>
-              <el-col :span="1.5" v-if="scope.row.status === 'draft' || scope.row.status === 'cancel' || scope.row.status === 'back'">
-                <el-button v-hasPermi="['workflow:leave:remove']" size="small" type="primary" icon="Delete" @click="handleDelete(scope.row)"
-                  >删除</el-button
-                >
-              </el-col>
-            </el-row>
-            <el-row :gutter="10" class="mb8">
-              <el-col :span="1.5">
-                <el-button type="primary" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
-              </el-col>
-              <el-col :span="1.5" v-if="scope.row.status === 'waiting'">
-                <el-button size="small" type="primary" icon="Notification" @click="handleCancelProcessApply(scope.row.id)">撤销</el-button>
-              </el-col>
-            </el-row>
+            <el-button
+              v-if="scope.row.status === 'draft' || scope.row.status === 'cancel' || scope.row.status === 'back'"
+              v-hasPermi="['workflow:leave:edit']" size="small" type="primary" icon="Edit"
+              @click="handleUpdate(scope.row)">修改</el-button>
+            <el-button
+              v-if="scope.row.status === 'draft' || scope.row.status === 'cancel' || scope.row.status === 'back'"
+              v-hasPermi="['workflow:leave:remove']" size="small" type="danger" icon="Delete"
+              @click="handleDelete(scope.row)">删除</el-button>
+            <el-button type="warning" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
+            <el-button v-if="scope.row.status === 'waiting'" size="small" type="danger" icon="Notification"
+              @click="handleCancelProcessApply(scope.row.id)">撤销</el-button>
           </template>
         </el-table-column>
       </el-table>
 
-      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="getList" />
     </el-card>
   </div>
 </template>

+ 8 - 22
src/views/workflow/processDefinition/index.vue

@@ -89,27 +89,13 @@
                   <el-tag v-else type="danger">失效</el-tag>
                 </template>
               </el-table-column>
-              <el-table-column fixed="right" label="操作" align="center" width="170" class-name="small-padding fixed-width">
+              <el-table-column fixed="right" label="操作" align="center" width="380" class-name="small-padding fixed-width">
                 <template #default="scope">
-                  <el-row :gutter="10" class="mb8">
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:definition:remove']" link type="primary" size="small" icon="Delete" @click="handleDelete(scope.row)">删除流程</el-button>
-                    </el-col>
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:definition:copy']" link type="primary" size="small" icon="CopyDocument" @click="handleCopyDef(scope.row)">复制流程</el-button>
-                    </el-col>
-                  </el-row>
-                  <el-row :gutter="10" class="mb8">
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:definition:query']" link type="primary" v-if="scope.row.isPublish === 0" icon="Pointer" size="small" @click="design(scope.row)"
-                        >流程设计</el-button
-                      >
-                      <el-button v-hasPermi="['workflow:definition:query']" link type="primary" v-else icon="View" size="small" @click="designView(scope.row)">查看流程</el-button>
-                    </el-col>
-                    <el-col v-if="scope.row.isPublish !== 1" :span="1.5">
-                      <el-button v-hasPermi="['workflow:definition:publish']" link type="primary" size="small" icon="CircleCheck" @click="handlePublish(scope.row)">发布流程</el-button>
-                    </el-col>
-                  </el-row>
+                  <el-button v-hasPermi="['workflow:definition:remove']" link type="danger" size="small" icon="Delete" @click="handleDelete(scope.row)">删除流程</el-button>
+                  <el-button v-hasPermi="['workflow:definition:copy']" link type="success" size="small" icon="CopyDocument" @click="handleCopyDef(scope.row)">复制流程</el-button>
+                  <el-button v-hasPermi="['workflow:definition:query']" link type="primary" v-if="scope.row.isPublish === 0" icon="Pointer" size="small" @click="design(scope.row)">流程设计</el-button>
+                  <el-button v-hasPermi="['workflow:definition:query']" link type="warning" v-else icon="View" size="small" @click="designView(scope.row)">查看流程</el-button>
+                  <el-button v-if="scope.row.isPublish !== 1" v-hasPermi="['workflow:definition:publish']" link type="success" size="small" icon="CircleCheck" @click="handlePublish(scope.row)">发布流程</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -199,8 +185,8 @@
           </el-form-item>
         </el-form>
         <div class="dialog-footer">
-          <el-button @click="modelDialog.visible = false">取消</el-button>
-          <el-button type="primary" @click="handleSubmit">保存</el-button>
+          <el-button icon="Close" @click="modelDialog.visible = false">取消</el-button>
+          <el-button type="primary" icon="Check" @click="handleSubmit">保存</el-button>
         </div>
       </template>
     </el-dialog>

+ 53 - 62
src/views/workflow/processInstance/index.vue

@@ -5,28 +5,21 @@
       <el-col :lg="4" :xs="24" style="">
         <el-card shadow="hover">
           <el-input v-model="categoryName" placeholder="请输入流程分类名" prefix-icon="Search" clearable />
-          <el-tree
-            ref="categoryTreeRef"
-            class="mt-2"
-            node-key="id"
-            :data="categoryOptions"
-            :props="{ label: 'label', children: 'children' } as any"
-            :expand-on-click-node="false"
-            :filter-node-method="filterNode"
-            highlight-current
-            default-expand-all
-            @node-click="handleNodeClick"
-          ></el-tree>
+          <el-tree ref="categoryTreeRef" class="mt-2" node-key="id" :data="categoryOptions"
+            :props="{ label: 'label', children: 'children' } as any" :expand-on-click-node="false"
+            :filter-node-method="filterNode" highlight-current default-expand-all
+            @node-click="handleNodeClick"></el-tree>
         </el-card>
       </el-col>
       <el-col :lg="20" :xs="24">
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+          :leave-active-class="proxy?.animate.searchAnimate.leave">
           <div v-show="showSearch" class="mb-[10px]">
             <el-card shadow="hover">
               <el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
                 <el-form-item>
                   <el-badge :value="userSelectCount" :max="10" class="item">
-                    <el-button type="primary" @click="openUserSelect">选择申请人</el-button>
+                    <el-button type="primary" icon="User" @click="openUserSelect">选择申请人</el-button>
                   </el-badge>
                 </el-form-item>
                 <el-form-item label="任务名称" prop="nodeName">
@@ -50,7 +43,8 @@
           <template #header>
             <el-row :gutter="10" class="mb8">
               <el-col :span="1.5">
-                <el-button v-hasPermi="['workflow:instance:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">删除</el-button>
+                <el-button v-hasPermi="['workflow:instance:remove']" type="danger" plain icon="Delete"
+                  :disabled="multiple" @click="handleDelete">删除</el-button>
               </el-col>
               <right-toolbar v-model:show-search="showSearch" @query-table="handleQuery"></right-toolbar>
             </el-row>
@@ -61,8 +55,10 @@
             <el-table v-loading="loading" border :data="processInstanceList" @selection-change="handleSelectionChange">
               <el-table-column type="selection" width="55" align="center" />
               <el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
-              <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center" label="业务编码"></el-table-column>
-              <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center" label="业务标题"></el-table-column>
+              <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center"
+                label="业务编码"></el-table-column>
+              <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center"
+                label="业务标题"></el-table-column>
               <el-table-column :show-overflow-tooltip="true" align="center" width="120" label="流程定义名称">
                 <template #default="scope">
                   <span>{{ scope.row.flowName }}v{{ scope.row.version }}</span>
@@ -71,11 +67,13 @@
               <el-table-column align="center" prop="flowCode" width="120" label="流程定义编码"></el-table-column>
               <el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
               <el-table-column align="center" prop="nodeName" label="任务名称"></el-table-column>
-              <el-table-column align="center" prop="createByName" :show-overflow-tooltip="true" label="申请人"></el-table-column>
+              <el-table-column align="center" prop="createByName" :show-overflow-tooltip="true"
+                label="申请人"></el-table-column>
               <el-table-column align="center" prop="version" label="版本号" width="90">
                 <template #default="scope"> v{{ scope.row.version }}.0</template>
               </el-table-column>
-              <el-table-column v-if="tab === 'running'" v-hasPermi="['workflow:instance:active']" align="center" prop="isSuspended" label="状态" min-width="70">
+              <el-table-column v-if="tab === 'running'" v-hasPermi="['workflow:instance:active']" align="center"
+                prop="isSuspended" label="状态" min-width="70">
                 <template #default="scope">
                   <el-tag v-if="!scope.row.isSuspended" type="success">激活</el-tag>
                   <el-tag v-else type="danger">挂起</el-tag>
@@ -87,49 +85,39 @@
                 </template>
               </el-table-column>
               <el-table-column align="center" prop="createTime" label="启动时间" width="160"></el-table-column>
-              <el-table-column v-if="tab === 'finish'" align="center" prop="updateTime" label="结束时间" width="160"></el-table-column>
-              <el-table-column label="操作" align="center" :width="165" fixed="right">
+              <el-table-column v-if="tab === 'finish'" align="center" prop="updateTime" label="结束时间"
+                width="160"></el-table-column>
+              <el-table-column fixed="right" label="操作" align="center" width="280"
+                class-name="small-padding fixed-width">
                 <template #default="scope">
-                  <el-row v-if="tab === 'running'" :gutter="10" class="mb8">
-                    <el-col :span="1.5">
-                      <el-popover :ref="`popoverRef${scope.$index}`" trigger="click" placement="left" :width="300">
-                        <el-input v-model="deleteReason" resize="none" :rows="3" type="textarea" placeholder="请输入作废原因" />
-                        <div style="text-align: right; margin: 5px 0px 0px 0px">
-                          <el-button size="small" text @click="cancelPopover(scope.$index)">取消</el-button>
-                          <el-button size="small" type="primary" @click="handleInvalid(scope.row)">确认</el-button>
-                        </div>
-                        <template #reference>
-                          <el-button type="danger" size="small" icon="CircleClose">作废</el-button>
-                        </template>
-                      </el-popover>
-                    </el-col>
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:instance:remove']" type="danger" size="small" icon="Delete" @click="handleDelete(scope.row)">删除 </el-button>
-                    </el-col>
-                  </el-row>
-                  <el-row :gutter="10" class="mb8">
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:instance:query']" type="primary" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
-                    </el-col>
-                    <el-col :span="1.5">
-                      <el-button v-hasPermi="['workflow:instance:variableQuery']" type="primary" size="small" icon="Document" @click="handleInstanceVariable(scope.row)"> 变量 </el-button>
-                    </el-col>
-                  </el-row>
+                  <el-popover v-if="tab === 'running'" :ref="`popoverRef${scope.$index}`" trigger="click"
+                    placement="left" :width="300">
+                    <el-input v-model="deleteReason" resize="none" :rows="3" type="textarea" placeholder="请输入作废原因" />
+                    <div style="text-align: right; margin: 5px 0px 0px 0px">
+                      <el-button size="small" text @click="cancelPopover(scope.$index)">取消</el-button>
+                      <el-button size="small" type="primary" @click="handleInvalid(scope.row)">确认</el-button>
+                    </div>
+                    <template #reference>
+                      <el-button type="danger" size="small" icon="CircleClose">作废</el-button>
+                    </template>
+                  </el-popover>
+                  <el-button v-if="tab === 'running'" v-hasPermi="['workflow:instance:remove']" type="danger"
+                    size="small" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+                  <el-button v-hasPermi="['workflow:instance:query']" type="warning" size="small" icon="View"
+                    @click="handleView(scope.row)">查看</el-button>
+                  <el-button v-hasPermi="['workflow:instance:variableQuery']" type="primary" size="small"
+                    icon="Document" @click="handleInstanceVariable(scope.row)">变量</el-button>
                 </template>
               </el-table-column>
             </el-table>
-            <pagination
-              v-show="total > 0"
-              v-model:page="queryParams.pageNum"
-              v-model:limit="queryParams.pageSize"
-              :total="total"
-              @pagination="handleQuery"
-            />
+            <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+              :total="total" @pagination="handleQuery" />
           </el-tabs>
         </el-card>
       </el-col>
     </el-row>
-    <el-dialog v-if="processDefinitionDialog.visible" v-model="processDefinitionDialog.visible" :title="processDefinitionDialog.title" width="70%">
+    <el-dialog v-if="processDefinitionDialog.visible" v-model="processDefinitionDialog.visible"
+      :title="processDefinitionDialog.title" width="70%">
       <el-table v-loading="loading" :data="processDefinitionHistoryList">
         <el-table-column fixed align="center" type="index" label="序号" width="60"></el-table-column>
         <el-table-column fixed align="center" prop="name" label="流程定义名称"></el-table-column>
@@ -138,23 +126,24 @@
         <el-table-column align="center" prop="version" label="版本号" width="90">
           <template #default="scope"> v{{ scope.row.version }}.0</template>
         </el-table-column>
-        <el-table-column v-hasPermi="['workflow:instance:active']" align="center" prop="suspensionState" label="状态" min-width="70">
+        <el-table-column v-hasPermi="['workflow:instance:active']" align="center" prop="suspensionState" label="状态"
+          min-width="70">
           <template #default="scope">
             <el-tag v-if="scope.row.suspensionState == 1" type="success">激活</el-tag>
             <el-tag v-else type="danger">挂起</el-tag>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="deploymentTime" label="部署时间" :show-overflow-tooltip="true"></el-table-column>
+        <el-table-column align="center" prop="deploymentTime" label="部署时间"
+          :show-overflow-tooltip="true"></el-table-column>
       </el-table>
     </el-dialog>
     <!-- 流程变量开始 -->
-    <el-dialog v-model="variableVisible" v-if="variableVisible" draggable title="流程变量" width="60%" :close-on-click-modal="false">
+    <el-dialog v-model="variableVisible" v-if="variableVisible" draggable title="流程变量" width="60%"
+      :close-on-click-modal="false">
       <el-card v-loading="variableLoading">
         <template #header>
           <div class="clearfix">
-            <span
-              >流程定义名称:<el-tag>{{ processDefinitionName }}</el-tag></span
-            >
+            <span>流程定义名称:<el-tag>{{ processDefinitionName }}</el-tag></span>
           </div>
         </template>
         <div class="max-h-500px overflow-y-auto">
@@ -170,7 +159,8 @@
             <el-input v-model="form.value" placeholder="请输入变量值" />
           </el-form-item>
           <el-form-item>
-            <el-button v-hasPermi="['workflow:instance:variable']" type="primary" @click="handleVariable(ruleFormRef)">确认</el-button>
+            <el-button v-hasPermi="['workflow:instance:variable']" type="primary"
+              @click="handleVariable(ruleFormRef)">确认</el-button>
           </el-form-item>
         </el-form>
       </el-card>
@@ -178,7 +168,8 @@
     <!-- 流程变量结束 -->
 
     <!-- 申请人 -->
-    <UserSelect ref="userSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack"></UserSelect>
+    <UserSelect ref="userSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack">
+    </UserSelect>
   </div>
 </template>
 

+ 4 - 8
src/views/workflow/spel/index.vue

@@ -71,12 +71,8 @@
         </el-table-column>
         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
           <template #default="scope">
-            <el-tooltip content="修改" placement="top">
-              <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['workflow:spel:edit']"></el-button>
-            </el-tooltip>
-            <el-tooltip content="删除" placement="top">
-              <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['workflow:spel:remove']"></el-button>
-            </el-tooltip>
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['workflow:spel:edit']">修改</el-button>
+            <el-button link type="danger" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['workflow:spel:remove']">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -140,8 +136,8 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
-          <el-button @click="cancel">取 消</el-button>
+          <el-button :loading="buttonLoading" type="primary" icon="Check" @click="submitForm">确 定</el-button>
+          <el-button icon="Close" @click="cancel">取 消</el-button>
         </div>
       </template>
     </el-dialog>

+ 22 - 20
src/views/workflow/task/allTaskWaiting.vue

@@ -1,12 +1,13 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
             <el-form-item>
               <el-badge :value="userSelectCount" :max="10" class="item">
-                <el-button type="primary" @click="openUserSelect">选择申请人</el-button>
+                <el-button type="primary" icon="User" @click="openUserSelect">选择申请人</el-button>
               </el-badge>
             </el-form-item>
             <el-form-item label="任务名称" prop="nodeName">
@@ -27,11 +28,11 @@
       <template #header>
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5" v-if="tab === 'waiting'">
-            <el-button class="todo-action-btn todo-action-btn--primary" type="primary" plain icon="Edit" :disabled="multiple" @click="handleUserOpen()"
-              >修改办理人
+            <el-button class="todo-action-btn todo-action-btn--primary" type="primary" plain icon="Edit"
+              :disabled="multiple" @click="handleUserOpen()">修改办理人
             </el-button>
-            <el-button class="todo-action-btn todo-action-btn--warning" type="warning" plain icon="Bell" :disabled="multiple" @click="handleUrgeTaskOpen()"
-              >催办
+            <el-button class="todo-action-btn todo-action-btn--warning" type="warning" plain icon="Bell"
+              :disabled="multiple" @click="handleUrgeTaskOpen()">催办
             </el-button>
           </el-col>
           <right-toolbar v-model:show-search="showSearch" @query-table="handleQuery"></right-toolbar>
@@ -43,16 +44,20 @@
         <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
-          <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center" label="业务编码"></el-table-column>
-          <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center" label="业务标题"></el-table-column>
-          <el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" width="120" label="流程定义名称"></el-table-column>
+          <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center"
+            label="业务编码"></el-table-column>
+          <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center"
+            label="业务标题"></el-table-column>
+          <el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" width="120"
+            label="流程定义名称"></el-table-column>
           <el-table-column align="center" prop="flowCode" width="120" label="流程定义编码"></el-table-column>
           <el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
           <el-table-column align="center" prop="version" label="版本号" width="90">
             <template #default="scope"> v{{ scope.row.version }}.0</template>
           </el-table-column>
           <el-table-column align="center" prop="nodeName" :show-overflow-tooltip="true" label="任务名称"></el-table-column>
-          <el-table-column align="center" prop="createByName" :show-overflow-tooltip="true" label="申请人"></el-table-column>
+          <el-table-column align="center" prop="createByName" :show-overflow-tooltip="true"
+            label="申请人"></el-table-column>
           <el-table-column align="center" label="办理人">
             <template #default="scope">
               <template v-if="tab === 'waiting'">
@@ -85,22 +90,18 @@
             <template #default="scope">
               <el-row :gutter="10" class="mb8">
                 <el-col :span="1.5" v-if="tab === 'waiting' || tab === 'finish'">
-                  <el-button type="primary" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
+                  <el-button type="warning" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
                 </el-col>
                 <el-col :span="1.5" v-if="tab === 'waiting'">
-                  <el-button type="primary" size="small" icon="Setting" @click="handleMeddle(scope.row)">流程干预 </el-button>
+                  <el-button type="warning" size="small" icon="Setting"
+                    @click="handleMeddle(scope.row)">流程干预</el-button>
                 </el-col>
               </el-row>
             </template>
           </el-table-column>
         </el-table>
-        <pagination
-          v-show="total > 0"
-          v-model:page="queryParams.pageNum"
-          v-model:limit="queryParams.pageSize"
-          :total="total"
-          @pagination="handleQuery"
-        />
+        <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+          :total="total" @pagination="handleQuery" />
       </el-tabs>
     </el-card>
     <!-- 选人组件 -->
@@ -108,7 +109,8 @@
     <!-- 流程干预组件 -->
     <processMeddle ref="processMeddleRef" @submitCallback="getWaitingList"></processMeddle>
     <!-- 申请人 -->
-    <UserSelect ref="applyUserSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack"></UserSelect>
+    <UserSelect ref="applyUserSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack">
+    </UserSelect>
     <!-- 流程干预组件 -->
     <messageType ref="messageTypeRef" @submitCallback="handleUserTask"></messageType>
   </div>

+ 20 - 40
src/views/workflow/task/myDocument.vue

@@ -5,22 +5,15 @@
       <el-col :lg="4" :xs="24" style="">
         <el-card shadow="hover">
           <el-input v-model="categoryName" placeholder="请输入流程分类名" prefix-icon="Search" clearable />
-          <el-tree
-            ref="categoryTreeRef"
-            class="mt-2"
-            node-key="id"
-            :data="categoryOptions"
-            :props="{ label: 'label', children: 'children' } as any"
-            :expand-on-click-node="false"
-            :filter-node-method="filterNode"
-            highlight-current
-            default-expand-all
-            @node-click="handleNodeClick"
-          ></el-tree>
+          <el-tree ref="categoryTreeRef" class="mt-2" node-key="id" :data="categoryOptions"
+            :props="{ label: 'label', children: 'children' } as any" :expand-on-click-node="false"
+            :filter-node-method="filterNode" highlight-current default-expand-all
+            @node-click="handleNodeClick"></el-tree>
         </el-card>
       </el-col>
       <el-col :lg="20" :xs="24">
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+          :leave-active-class="proxy?.animate.searchAnimate.leave">
           <div v-show="showSearch" class="mb-[10px]">
             <el-card shadow="hover">
               <el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true" label-width="120px">
@@ -46,7 +39,8 @@
             <el-table-column type="selection" width="55" align="center" />
             <el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
             <el-table-column v-if="false" align="center" prop="id" label="id"></el-table-column>
-            <el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程定义名称"> </el-table-column>
+            <el-table-column :show-overflow-tooltip="true" prop="flowName" align="center" label="流程定义名称">
+            </el-table-column>
             <el-table-column align="center" prop="flowCode" label="流程定义编码"></el-table-column>
             <el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
             <el-table-column align="center" prop="version" label="版本号" width="90">
@@ -64,36 +58,22 @@
               </template>
             </el-table-column>
             <el-table-column align="center" prop="createTime" label="启动时间" width="160"></el-table-column>
-            <el-table-column label="操作" align="center" width="162">
+            <el-table-column label="操作" align="center" width="280">
               <template #default="scope">
-                <el-row :gutter="10" class="mb8">
-                  <el-col :span="1.5" v-if="scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'cancel' || scope.row.flowStatus === 'back'">
-                    <el-button type="primary" size="small" icon="Edit" @click="handleOpen(scope.row, 'update')">编辑</el-button>
-                  </el-col>
-                  <el-col :span="1.5" v-if="scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'cancel' || scope.row.flowStatus === 'back'">
-                    <el-button type="primary" size="small" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
-                  </el-col>
-                </el-row>
-                <el-row :gutter="10" class="mb8">
-                  <el-col :span="1.5">
-                    <el-button type="primary" size="small" icon="View" @click="handleOpen(scope.row, 'view')">查看</el-button>
-                  </el-col>
-                  <el-col :span="1.5" v-if="scope.row.flowStatus === 'waiting'">
-                    <el-button type="primary" size="small" icon="Notification" @click="handleCancelProcessApply(scope.row.businessId)"
-                      >撤销</el-button
-                    >
-                  </el-col>
-                </el-row>
+                <el-button
+                  v-if="scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'cancel' || scope.row.flowStatus === 'back'"
+                  type="primary" size="small" icon="Edit" @click="handleOpen(scope.row, 'update')">编辑</el-button>
+                <el-button
+                  v-if="scope.row.flowStatus === 'draft' || scope.row.flowStatus === 'cancel' || scope.row.flowStatus === 'back'"
+                  type="danger" size="small" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+                <el-button type="warning" size="small" icon="View" @click="handleOpen(scope.row, 'view')">查看</el-button>
+                <el-button v-if="scope.row.flowStatus === 'waiting'" type="danger" size="small" icon="Notification"
+                  @click="handleCancelProcessApply(scope.row.businessId)">撤销</el-button>
               </template>
             </el-table-column>
           </el-table>
-          <pagination
-            v-show="total > 0"
-            v-model:page="queryParams.pageNum"
-            v-model:limit="queryParams.pageSize"
-            :total="total"
-            @pagination="getList"
-          />
+          <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+            :total="total" @pagination="getList" />
         </el-card>
       </el-col>
     </el-row>

+ 1 - 1
src/views/workflow/task/taskCopyList.vue

@@ -47,7 +47,7 @@
         </el-table-column>
         <el-table-column label="操作" align="center" width="200">
           <template #default="scope">
-            <el-button type="primary" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
+            <el-button type="warning" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
           </template>
         </el-table-column>
       </el-table>

+ 14 - 14
src/views/workflow/task/taskFinish.vue

@@ -1,12 +1,13 @@
 <template>
   <div class="p-2">
-    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
+      :leave-active-class="proxy?.animate.searchAnimate.leave">
       <div v-show="showSearch" class="mb-[10px]">
         <el-card shadow="hover">
           <el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
             <el-form-item>
               <el-badge :value="userSelectCount" :max="10" class="item">
-                <el-button type="primary" @click="openUserSelect">选择申请人</el-button>
+                <el-button type="primary" icon="User" @click="openUserSelect">选择申请人</el-button>
               </el-badge>
             </el-form-item>
             <el-form-item label="任务名称" prop="nodeName">
@@ -36,8 +37,10 @@
       <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column align="center" type="index" label="序号" width="60"></el-table-column>
-        <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center" label="业务编码"></el-table-column>
-        <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center" label="业务标题"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" prop="businessCode" align="center"
+          label="业务编码"></el-table-column>
+        <el-table-column :show-overflow-tooltip="true" prop="businessTitle" align="center"
+          label="业务标题"></el-table-column>
         <el-table-column align="center" prop="flowName" width="120" label="流程定义名称"></el-table-column>
         <el-table-column align="center" prop="flowCode" width="120" label="流程定义编码"></el-table-column>
         <el-table-column align="center" prop="categoryName" label="流程分类"></el-table-column>
@@ -63,23 +66,20 @@
             <dict-tag :options="wf_task_status" :value="scope.row.flowTaskStatus"></dict-tag>
           </template>
         </el-table-column>
-        <el-table-column align="center" prop="createTime" label="创建时间" :show-overflow-tooltip="true" width="150"></el-table-column>
+        <el-table-column align="center" prop="createTime" label="创建时间" :show-overflow-tooltip="true"
+          width="150"></el-table-column>
         <el-table-column label="操作" align="center" width="200">
           <template #default="scope">
-            <el-button type="primary" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
+            <el-button type="warning" size="small" icon="View" @click="handleView(scope.row)">查看</el-button>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
-        v-show="total > 0"
-        v-model:page="queryParams.pageNum"
-        v-model:limit="queryParams.pageSize"
-        :total="total"
-        @pagination="handleQuery"
-      />
+      <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
+        :total="total" @pagination="handleQuery" />
     </el-card>
     <!-- 申请人 -->
-    <UserSelect ref="userSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack"></UserSelect>
+    <UserSelect ref="userSelectRef" :multiple="true" :data="selectUserIds" @confirm-call-back="userSelectCallBack">
+    </UserSelect>
   </div>
 </template>
 

+ 1 - 1
src/views/workflow/task/taskWaiting.vue

@@ -6,7 +6,7 @@
           <el-form v-show="showSearch" ref="queryFormRef" :model="queryParams" :inline="true">
             <el-form-item>
               <el-badge :value="userSelectCount" :max="10" class="item">
-                <el-button type="primary" @click="openUserSelect">选择申请人</el-button>
+                <el-button type="primary" icon="User" @click="openUserSelect">选择申请人</el-button>
               </el-badge>
             </el-form-item>
             <el-form-item label="任务名称" prop="nodeName">