Browse Source

feature:系统管理->用户管理
1、界面样式调整

luoyb 1 month ago
parent
commit
edf76a3f22

+ 1 - 0
src/api/system/right/user/types.ts

@@ -29,6 +29,7 @@ export interface UserVO extends BaseEntity {
29 29
   userId: string | number;
30 30
   tenantId: string;
31 31
   deptId: number;
32
+  postId: string | number;
32 33
   userName: string;
33 34
   nickName: string;
34 35
   realName: string;

+ 34 - 23
src/views/system/right/user/UserDetailForm.vue

@@ -1,23 +1,23 @@
1 1
 <template>
2 2
   <div class="e-dialog">
3
-    <el-dialog v-model="dialog.visible" :title="dialog.title" :draggable="dialog.draggable" width="35%" align-center>
3
+    <el-dialog v-model="dialog.visible" :title="dialog.title" :draggable="draggable" width="35%" align-center>
4 4
       <el-form ref="formRef" v-loading="formLoading" :model="formData" :rules="formRules" label-width="auto" class="mt-3">
5 5
         <el-row>
6 6
           <el-col :span="12">
7
-            <el-form-item label="用户名" prop="userName" >
8
-              <el-input v-model="formData.userName" placeholder="请输入用户名/登录账号" disabled="disabled"/>
7
+            <el-form-item label="用户名" prop="userName">
8
+              <el-input v-model="formData.userName" placeholder="请输入用户名/登录账号" />
9 9
             </el-form-item>
10 10
           </el-col>
11 11
           <el-col :span="12">
12 12
             <el-form-item label="登录密码" prop="loginPwd">
13
-              <el-input v-model="formData.loginPwd" placeholder="请输入登录密码" type="password" maxlength="20" show-password disabled="disabled"/>
13
+              <el-input v-model="formData.loginPwd" placeholder="请输入登录密码" type="password" maxlength="20" show-password />
14 14
             </el-form-item>
15 15
           </el-col>
16 16
         </el-row>
17 17
         <el-row>
18 18
           <el-col :span="12">
19 19
             <el-form-item label="学/工号" prop="userNumb">
20
-              <el-input v-model="formData.userNumb" placeholder="请输入学/工号" disabled="disabled" />
20
+              <el-input v-model="formData.userNumb" placeholder="请输入学/工号" />
21 21
             </el-form-item>
22 22
           </el-col>
23 23
           <el-col :span="12">
@@ -36,12 +36,11 @@
36 36
                 value-key="id"
37 37
                 placeholder="请选择归属部门"
38 38
                 check-strictly
39
-                @change="handleDeptChange"
40 39
               />
41 40
             </el-form-item>
42 41
           </el-col>
43 42
           <el-col :span="12">
44
-            <el-form-item label="工作岗位" prop="postId">
43
+            <el-form-item label="所在岗位" prop="postId">
45 44
               <el-select v-model="formData.postId" placeholder="请选择">
46 45
                 <el-option
47 46
                   v-for="item in postOptions"
@@ -56,7 +55,7 @@
56 55
         </el-row>
57 56
         <el-row>
58 57
           <el-col :span="12">
59
-            <el-form-item label="用户身份" prop="category">
58
+            <el-form-item label="用户类型" prop="category">
60 59
               <el-select v-model="formData.category" placeholder="请选择用户身份">
61 60
                 <el-option v-for="dict in CATEGORY" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
62 61
               </el-select>
@@ -121,6 +120,7 @@ import { DeptVO } from '@/api/system/dept/types';
121 120
 import { PostVO } from '@/api/system/params/post/types';
122 121
 import { RoleVO } from '@/api/system/role/types';
123 122
 import { treeselect } from '@/api/system/dept';
123
+import { XfConsumeDetailForm } from '@/api/consumption/XfConsumeDetail/types';
124 124
 
125 125
 /** 当前组件属性 */
126 126
 defineOptions({ name: 'RecompenseForm' });
@@ -132,9 +132,10 @@ const { sys_yes_no, sys_user_sex, CATEGORY } = toRefs<any>(proxy?.useDict('sys_y
132 132
 // 对话框
133 133
 const dialog = reactive<DialogOption>({
134 134
   visible: false,
135
-  title: '',
136
-  draggable: true
135
+  title: ''
137 136
 });
137
+// 窗体是否可以拖动
138
+const draggable = ref(true);
138 139
 // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
139 140
 const formLoading = ref(false);
140 141
 // 表单的类型:create - 新增;update - 修改
@@ -142,7 +143,7 @@ const formType = ref('');
142 143
 // 操作类型
143 144
 const command = ref('');
144 145
 // 输入项是否禁用
145
-const disabled = ref(false);
146
+const disabled = ref(true);
146 147
 // 部门下拉数据
147 148
 const deptOptions = ref<DeptVO[]>([]);
148 149
 // 默认初始密码
@@ -196,13 +197,14 @@ const open = async (cmd: string, id?: string | number) => {
196 197
   try {
197 198
     let res;
198 199
     if (id) {
199
-      disabled.value = true;
200
+      disabled.value = false;
200 201
       res = await api.getUser(id);
201 202
       Object.assign(formData.value, res.data.user);
202 203
       formData.value.postIds = res.data.postIds;
203 204
       formData.value.roleIds = res.data.roleIds;
204 205
       formData.value.loginPwd = '';
205 206
     } else {
207
+      disabled.value = true;
206 208
       res = await api.getUser();
207 209
       formData.value.loginPwd = initPassword.value.toString();
208 210
     }
@@ -211,15 +213,6 @@ const open = async (cmd: string, id?: string | number) => {
211 213
   } finally {
212 214
     formLoading.value = false;
213 215
   }
214
-  // if (id) {
215
-  //   formLoading.value = true;
216
-  //   try {
217
-  //     const res = await api.getUser(id);
218
-  //     Object.assign(formData.value, res.data);
219
-  //   } finally {
220
-  //     formLoading.value = false;
221
-  //   }
222
-  // }
223 216
 };
224 217
 // 查询部门下拉树结构
225 218
 const getTreeSelect = async () => {
@@ -260,8 +253,26 @@ const resetForm = () => {
260 253
 defineExpose({ open });
261 254
 
262 255
 // 触发父组件的事件
263
-const emits = defineEmits([]);
264
-
256
+const emit = defineEmits(['success']);
257
+// 提交按钮
258
+const submitForm = async () => {
259
+  // 校验表单
260
+  if (!formRef.value) return;
261
+  const valid = await formRef.value?.validate();
262
+  if (!valid) return;
263
+  // 提交请求
264
+  formLoading.value = true;
265
+  try {
266
+    const data = formData.value as unknown as UserForm;
267
+    data.userId ? await api.updateUser(data) : await api.addUser(data);
268
+    proxy?.$modal.msgSuccess('操作成功');
269
+  } finally {
270
+    formLoading.value = false;
271
+  }
272
+  dialog.visible = false;
273
+  // 发送操作成功的事件
274
+  emit('success');
275
+};
265 276
 // 初始化
266 277
 onMounted(() => {
267 278
   // 初始化部门数据

+ 76 - 54
src/views/system/right/user/index.vue

@@ -20,19 +20,15 @@
20 20
         </el-card>
21 21
       </el-col>
22 22
       <el-col :lg="20" :xs="24">
23
-        <transition :enter-active-class="proxy?.animate.searchAnimate.enter"
24
-                    :leave-active-class="proxy?.animate.searchAnimate.leave">
23
+        <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
25 24
           <div v-show="showSearch" class="mb-[5px]">
26 25
             <el-card shadow="hover">
27
-              <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto"
28
-                       class="-mb-25px -mt-5px">
26
+              <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="auto" class="-mb-25px -mt-5px">
29 27
                 <el-form-item label="用户姓名" prop="realName">
30
-                  <el-input v-model="queryParams.realName" placeholder="请输入用户姓名" clearable
31
-                            @keyup.enter="handleQuery" />
28
+                  <el-input v-model="queryParams.realName" placeholder="请输入用户姓名" clearable @keyup.enter="handleQuery" />
32 29
                 </el-form-item>
33 30
                 <el-form-item label="手机号码" prop="phone">
34
-                  <el-input v-model="queryParams.phone" placeholder="请输入手机号码" clearable
35
-                            @keyup.enter="handleQuery" />
31
+                  <el-input v-model="queryParams.phone" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
36 32
                 </el-form-item>
37 33
                 <el-form-item>
38 34
                   <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -46,19 +42,15 @@
46 42
           <template #header>
47 43
             <el-row :gutter="10">
48 44
               <el-col :span="1.5">
49
-                <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus"
50
-                           @click="handleOpenDetail('add')">新增
51
-                </el-button>
45
+                <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleOpenDetail('add')">新增 </el-button>
52 46
               </el-col>
53 47
               <el-col :span="1.5">
54
-                <el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit"
55
-                           @click="handleOpenDetail('edit')">
48
+                <el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit" @click="handleOpenDetail('edit')">
56 49
                   修改
57 50
                 </el-button>
58 51
               </el-col>
59 52
               <el-col :span="1.5">
60
-                <el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete"
61
-                           @click="handleDelete()">
53
+                <el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">
62 54
                   删除
63 55
                 </el-button>
64 56
               </el-col>
@@ -68,8 +60,7 @@
68 60
                     更多
69 61
                     <el-icon class="el-icon--right">
70 62
                       <arrow-down />
71
-                    </el-icon
72
-                    >
63
+                    </el-icon>
73 64
                   </el-button>
74 65
                   <template #dropdown>
75 66
                     <el-dropdown-menu>
@@ -80,54 +71,88 @@
80 71
                   </template>
81 72
                 </el-dropdown>
82 73
               </el-col>
83
-              <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true"
84
-                             @query-table="getList"></right-toolbar>
74
+              <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar>
85 75
             </el-row>
86 76
           </template>
87
-          <el-table v-loading="loading" :data="userList" height="calc(100vh - 22rem)"
88
-                    @selection-change="handleSelectionChange">
77
+          <el-table v-loading="loading" :data="userList" height="calc(100vh - 22rem)" @selection-change="handleSelectionChange" highlight-current-row>
89 78
             <el-table-column type="selection" width="50" align="center" />
90
-            <el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" />
91
-            <el-table-column v-if="columns[1].visible" key="userName" label="用户名称" align="center" prop="userName"
92
-                             :show-overflow-tooltip="true" />
93
-            <el-table-column v-if="columns[2].visible" key="nickName" label="用户昵称" align="center" prop="nickName"
94
-                             :show-overflow-tooltip="true" />
95
-            <el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName"
96
-                             :show-overflow-tooltip="true" />
97
-            <el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center"
98
-                             prop="phonenumber" width="120" />
99
-            <el-table-column v-if="columns[5].visible" key="status" label="状态" align="center">
79
+            <el-table-column
80
+              v-if="columns[0].visible"
81
+              key="userId"
82
+              label="学/工号"
83
+              align="center"
84
+              prop="userNumb"
85
+              width="180"
86
+              :show-overflow-tooltip="true"
87
+            />
88
+            <el-table-column
89
+              v-if="columns[1].visible"
90
+              key="userName"
91
+              label="用户名"
92
+              align="center"
93
+              prop="userName"
94
+              width="160"
95
+              :show-overflow-tooltip="true"
96
+            />
97
+            <el-table-column
98
+              v-if="columns[2].visible"
99
+              key="nickName"
100
+              label="用户姓名"
101
+              align="center"
102
+              prop="realName"
103
+              width="160"
104
+              :show-overflow-tooltip="true"
105
+            />
106
+            <el-table-column
107
+              v-if="columns[3].visible"
108
+              key="deptName"
109
+              label="部门"
110
+              align="center"
111
+              prop="deptName"
112
+              :show-overflow-tooltip="true"
113
+            />
114
+            <el-table-column
115
+              v-if="columns[4].visible"
116
+              key="phone"
117
+              label="手机号码"
118
+              align="center"
119
+              prop="phone"
120
+              width="180"
121
+              :show-overflow-tooltip="true"
122
+            />
123
+            <el-table-column
124
+              v-if="columns[5].visible"
125
+              key="category"
126
+              label="用户类型"
127
+              align="center"
128
+              prop="category"
129
+              width="180"
130
+              :show-overflow-tooltip="true"
131
+            >
100 132
               <template #default="scope">
101
-                <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
102
-                           @change="handleStatusChange(scope.row)"></el-switch>
133
+                <dict-tag :options="CATEGORY" :value="scope.row.category" />
103 134
               </template>
104 135
             </el-table-column>
105
-
106
-            <el-table-column v-if="columns[6].visible" label="创建时间" align="center" prop="createTime" width="160">
136
+            <el-table-column v-if="columns[5].visible" key="status" label="状态" align="center" width="100">
107 137
               <template #default="scope">
108
-                <span>{{ scope.row.createTime }}</span>
138
+                <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
109 139
               </template>
110 140
             </el-table-column>
111
-
112
-            <el-table-column label="操作" fixed="right" width="180" class-name="small-padding fixed-width">
141
+            <el-table-column label="操作" fixed="right"  class-name="small-padding fixed-width">
113 142
               <template #default="scope">
114 143
                 <el-tooltip v-if="scope.row.userId !== 1" content="修改" placement="top">
115
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit"
116
-                             @click="handleUpdate(scope.row)"></el-button>
144
+                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>
117 145
                 </el-tooltip>
118 146
                 <el-tooltip v-if="scope.row.userId !== 1" content="删除" placement="top">
119
-                  <el-button v-hasPermi="['system:user:remove']" link type="primary" icon="Delete"
120
-                             @click="handleDelete(scope.row)"></el-button>
147
+                  <el-button v-hasPermi="['system:user:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button>
121 148
                 </el-tooltip>
122 149
 
123 150
                 <el-tooltip v-if="scope.row.userId !== 1" content="重置密码" placement="top">
124
-                  <el-button v-hasPermi="['system:user:resetPwd']" link type="primary" icon="Key"
125
-                             @click="handleResetPwd(scope.row)"></el-button>
151
+                  <el-button v-hasPermi="['system:user:resetPwd']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button>
126 152
                 </el-tooltip>
127 153
 
128 154
                 <el-tooltip v-if="scope.row.userId !== 1" content="分配角色" placement="top">
129
-                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="CircleCheck"
130
-                             @click="handleAuthRole(scope.row)"></el-button>
155
+                  <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button>
131 156
                 </el-tooltip>
132 157
               </template>
133 158
             </el-table-column>
@@ -169,9 +194,7 @@
169 194
               是否更新已经存在的用户数据
170 195
             </div>
171 196
             <span>仅允许导入xls、xlsx格式文件。</span>
172
-            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline"
173
-                     @click="importTemplate">下载模板
174
-            </el-link>
197
+            <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板 </el-link>
175 198
           </div>
176 199
         </template>
177 200
       </el-upload>
@@ -189,7 +212,6 @@
189 212
 import api from '@/api/system/right/user';
190 213
 import { UserForm, UserQuery, UserVO } from '@/api/system/right/user/types';
191 214
 import { DeptVO } from '@/api/system/dept/types';
192
-import { RoleVO } from '@/api/system/role/types';
193 215
 import { PostVO } from '@/api/system/params/post/types';
194 216
 import { treeselect } from '@/api/system/dept';
195 217
 import { globalHeaders } from '@/utils/request';
@@ -198,7 +220,7 @@ import UserDetailForm from '@/views/system/right/user/UserDetailForm.vue';
198 220
 
199 221
 const router = useRouter();
200 222
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
201
-const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex'));
223
+const { sys_normal_disable, sys_user_sex,CATEGORY } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex','CATEGORY'));
202 224
 const userList = ref<UserVO[]>();
203 225
 const loading = ref(true);
204 226
 const showSearch = ref(true);
@@ -211,7 +233,7 @@ const deptName = ref('');
211 233
 const deptOptions = ref<DeptVO[]>([]);
212 234
 const initPassword = ref<string>('');
213 235
 const postOptions = ref<PostVO[]>([]);
214
-const roleOptions = ref<RoleVO[]>([]);
236
+
215 237
 /*** 用户导入参数 */
216 238
 const upload = reactive<ImportOption>({
217 239
   // 是否显示弹出层(用户导入)
@@ -229,7 +251,7 @@ const upload = reactive<ImportOption>({
229 251
 });
230 252
 // 列显隐信息
231 253
 const columns = ref<FieldOption[]>([
232
-  { key: 0, label: `用户编号`, visible: false, children: [] },
254
+  { key: 0, label: `学/工号`, visible: true, children: [] },
233 255
   { key: 1, label: `用户名称`, visible: true, children: [] },
234 256
   { key: 2, label: `用户昵称`, visible: true, children: [] },
235 257
   { key: 3, label: `部门`, visible: true, children: [] },
@@ -455,7 +477,7 @@ const handleFileSuccess = (response: any, file: UploadFile) => {
455 477
   upload.open = false;
456 478
   upload.isUploading = false;
457 479
   uploadRef.value?.handleRemove(file);
458
-  ElMessageBox.alert('<div style=\'overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;\'>' + response.msg + '</div>', '导入结果', {
480
+  ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', {
459 481
     dangerouslyUseHTMLString: true
460 482
   });
461 483
   getList();