KouJin пре 1 година
родитељ
комит
218c617613

+ 2 - 2
src/components/Form/src/Form.vue

@@ -203,7 +203,7 @@ export default defineComponent({
203
                       icon="ep:warning"
203
                       icon="ep:warning"
204
                       size={16}
204
                       size={16}
205
                       color="var(--el-color-primary)"
205
                       color="var(--el-color-primary)"
206
-                      class="relative top-1px ml-2px"
206
+                      class="relative  top-1px ml-2px"
207
                     ></Icon>
207
                     ></Icon>
208
                   )
208
                   )
209
                 }}
209
                 }}
@@ -213,7 +213,7 @@ export default defineComponent({
213
         }
213
         }
214
       }
214
       }
215
       return (
215
       return (
216
-        <ElFormItem {...(item.formItemProps || {})} prop={item.field} label={item.label || ''}>
216
+        <ElFormItem class="mt-40px w-[70%]" {...(item.formItemProps || {})} prop={item.field} label={item.label || ''}>
217
           {{
217
           {{
218
             ...formItemSlots,
218
             ...formItemSlots,
219
             default: () => {
219
             default: () => {

Разлика између датотеке није приказан због своје велике величине
+ 7 - 7
src/views/Profile/Index.vue


+ 19 - 11
src/views/Profile/components/BasicInfo.vue

@@ -1,16 +1,24 @@
1
 <template>
1
 <template>
2
-  <Form ref="formRef" :labelWidth="200" :rules="rules" :schema="schema">
3
-    <template #sex="form">
4
-      <el-radio-group v-model="form['sex']">
5
-        <el-radio :value="1">{{ t('profile.user.man') }}</el-radio>
6
-        <el-radio :value="2">{{ t('profile.user.woman') }}</el-radio>
7
-      </el-radio-group>
8
-    </template>
9
-  </Form>
10
-  <div style="text-align: center">
11
-    <XButton :title="t('common.save')" type="primary" @click="submit()" />
12
-    <XButton :title="t('common.reset')" type="danger" @click="init()" />
2
+  <div class="w-full h-full flex">
3
+    <div class="flex-1 flex justify-center items-center" >
4
+      <div class="w-150px h-150px flex justify-center items-center text-2xl">这是一个icon</div>
5
+    </div>
6
+    <div class="flex-1">
7
+      <Form ref="formRef"  :rules="rules" :schema="schema">
8
+        <template #sex="form">
9
+          <el-radio-group v-model="form['sex']">
10
+            <el-radio :value="1">{{ t('profile.user.man') }}</el-radio>
11
+            <el-radio :value="2">{{ t('profile.user.woman') }}</el-radio>
12
+          </el-radio-group>
13
+        </template>
14
+      </Form>
15
+      <div class="w-[70%] text-center mt-30px  mb-30px">
16
+        <XButton :title="t('common.save')" type="primary" @click="submit()" />
17
+        <XButton :title="t('common.reset')" type="danger" @click="init()" />
18
+      </div>
19
+    </div>
13
   </div>
20
   </div>
21
+
14
 </template>
22
 </template>
15
 <script lang="ts" setup>
23
 <script lang="ts" setup>
16
 import type { FormRules } from 'element-plus'
24
 import type { FormRules } from 'element-plus'

+ 51 - 56
src/views/Profile/components/ProfileUser.vue

@@ -1,68 +1,67 @@
1
 <template>
1
 <template>
2
   <div class="w-full h-full flex">
2
   <div class="w-full h-full flex">
3
     <div class="flex-1">
3
     <div class="flex-1">
4
-        <div class="text-center">
5
-          <UserAvatar :img="userInfo?.avatar" />
6
-          <div class="lh-100px font-20px text-center" style="font-size: 25px;font-family: '黑体'">用户头像</div>
7
-        </div>
4
+      <div class="text-center">
5
+        <UserAvatar :img="userInfo?.avatar"/>
6
+      </div>
8
     </div>
7
     </div>
9
     <div class="flex-1">
8
     <div class="flex-1">
10
       <div>
9
       <div>
11
-      <ul class="list-group list-group-striped">
12
-        <li class="list-group-item">
13
-          <Icon class="mr-5px" icon="ep:user" />
14
-          {{ t('profile.user.username') }}
15
-          <div class="pull-right">{{ userInfo?.username }}</div>
16
-        </li>
17
-        <li class="list-group-item">
18
-          <Icon class="mr-5px" icon="ep:phone" />
19
-          {{ t('profile.user.mobile') }}
20
-          <div class="pull-right">{{ userInfo?.mobile }}</div>
21
-        </li>
22
-        <li class="list-group-item">
23
-          <Icon class="mr-5px" icon="fontisto:email" />
24
-          {{ t('profile.user.email') }}
25
-          <div class="pull-right">{{ userInfo?.email }}</div>
26
-        </li>
27
-        <li class="list-group-item">
28
-          <Icon class="mr-5px" icon="carbon:tree-view-alt" />
29
-          {{ t('profile.user.dept') }}
30
-          <div v-if="userInfo?.dept" class="pull-right">{{ userInfo?.dept.name }}</div>
31
-        </li>
32
-        <li class="list-group-item">
33
-          <Icon class="mr-5px" icon="ep:suitcase" />
34
-          {{ t('profile.user.posts') }}
35
-          <div v-if="userInfo?.posts" class="pull-right">
36
-            {{ userInfo?.posts.map((post) => post.name).join(',') }}
37
-          </div>
38
-        </li>
39
-        <li class="list-group-item">
40
-          <Icon class="mr-5px" icon="icon-park-outline:peoples" />
41
-          {{ t('profile.user.roles') }}
42
-          <div v-if="userInfo?.roles" class="pull-right">
43
-            {{ userInfo?.roles.map((role) => role.name).join(',') }}
44
-          </div>
45
-        </li>
46
-        <li class="list-group-item">
47
-          <Icon class="mr-5px" icon="ep:calendar" />
48
-          {{ t('profile.user.createTime') }}
49
-          <div class="pull-right">{{ formatDate(userInfo.createTime) }}</div>
50
-        </li>
51
-      </ul>
52
-    </div>
10
+        <ul class="list-group list-group-striped">
11
+          <li class="list-group-item">
12
+            <Icon class="mr-5px" icon="ep:user"/>
13
+            {{ t('profile.user.username') }}
14
+            <div class="pull-right">{{ userInfo?.username }}</div>
15
+          </li>
16
+          <li class="list-group-item">
17
+            <Icon class="mr-5px" icon="ep:phone"/>
18
+            {{ t('profile.user.mobile') }}
19
+            <div class="pull-right">{{ userInfo?.mobile }}</div>
20
+          </li>
21
+          <li class="list-group-item">
22
+            <Icon class="mr-5px" icon="fontisto:email"/>
23
+            {{ t('profile.user.email') }}
24
+            <div class="pull-right">{{ userInfo?.email }}</div>
25
+          </li>
26
+          <li class="list-group-item">
27
+            <Icon class="mr-5px" icon="carbon:tree-view-alt"/>
28
+            {{ t('profile.user.dept') }}
29
+            <div v-if="userInfo?.dept" class="pull-right">{{ userInfo?.dept.name }}</div>
30
+          </li>
31
+          <!--        <li class="list-group-item">-->
32
+          <!--          <Icon class="mr-5px" icon="ep:suitcase" />-->
33
+          <!--          {{ t('profile.user.posts') }}-->
34
+          <!--          <div v-if="userInfo?.posts" class="pull-right">-->
35
+          <!--            {{ userInfo?.posts.map((post) => post.name).join(',') }}-->
36
+          <!--          </div>-->
37
+          <!--        </li>-->
38
+          <li class="list-group-item">
39
+            <Icon class="mr-5px" icon="icon-park-outline:peoples"/>
40
+            {{ t('profile.user.roles') }}
41
+            <div v-if="userInfo?.roles" class="pull-right">
42
+              {{ userInfo?.roles.map((role) => role.name).join(',') }}
43
+            </div>
44
+          </li>
45
+          <li class="list-group-item">
46
+            <Icon class="mr-5px" icon="ep:calendar"/>
47
+            {{ t('profile.user.createTime') }}
48
+            <div class="pull-right">{{ formatDate(userInfo.createTime) }}</div>
49
+          </li>
50
+        </ul>
51
+      </div>
53
     </div>
52
     </div>
54
   </div>
53
   </div>
55
 
54
 
56
 </template>
55
 </template>
57
 <script lang="ts" setup>
56
 <script lang="ts" setup>
58
-import { formatDate } from '@/utils/formatTime'
57
+import {formatDate} from '@/utils/formatTime'
59
 import UserAvatar from './UserAvatar.vue'
58
 import UserAvatar from './UserAvatar.vue'
60
 
59
 
61
-import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
60
+import {getUserProfile, ProfileVO} from '@/api/system/user/profile'
62
 
61
 
63
-defineOptions({ name: 'ProfileUser' })
62
+defineOptions({name: 'ProfileUser'})
64
 
63
 
65
-const { t } = useI18n()
64
+const {t} = useI18n()
66
 const userInfo = ref({} as ProfileVO)
65
 const userInfo = ref({} as ProfileVO)
67
 const getUserInfo = async () => {
66
 const getUserInfo = async () => {
68
   const users = await getUserProfile()
67
   const users = await getUserProfile()
@@ -74,11 +73,7 @@ onMounted(async () => {
74
 </script>
73
 </script>
75
 
74
 
76
 <style scoped>
75
 <style scoped>
77
-.text-center {
78
-  position: relative;
79
-  height: 120px;
80
-  text-align: center;
81
-}
76
+
82
 
77
 
83
 .list-group-striped > .list-group-item {
78
 .list-group-striped > .list-group-item {
84
   padding-right: 0;
79
   padding-right: 0;
@@ -94,7 +89,7 @@ onMounted(async () => {
94
 }
89
 }
95
 
90
 
96
 .list-group-item {
91
 .list-group-item {
97
-  padding: 11px 0;
92
+  padding: 25px 0;
98
   margin-bottom: 10px;
93
   margin-bottom: 10px;
99
   font-size: 13px;
94
   font-size: 13px;
100
 
95
 

+ 39 - 26
src/views/Profile/components/ResetPwd.vue

@@ -1,29 +1,42 @@
1
 <template>
1
 <template>
2
-  <el-form ref="formRef" :model="password" :rules="rules" :label-width="200">
3
-    <el-form-item :label="t('profile.password.oldPassword')" prop="oldPassword">
4
-      <InputPassword v-model="password.oldPassword" />
5
-    </el-form-item>
6
-    <el-form-item :label="t('profile.password.newPassword')" prop="newPassword">
7
-      <InputPassword v-model="password.newPassword" strength />
8
-    </el-form-item>
9
-    <el-form-item :label="t('profile.password.confirmPassword')" prop="confirmPassword">
10
-      <InputPassword v-model="password.confirmPassword" strength />
11
-    </el-form-item>
12
-    <el-form-item>
13
-      <XButton :title="t('common.save')" type="primary" @click="submit(formRef)" />
14
-      <XButton :title="t('common.reset')" type="danger" @click="reset(formRef)" />
15
-    </el-form-item>
16
-  </el-form>
2
+  <div class="w-full h-full flex">
3
+    <div class="flex-1 flex justify-center items-center" >
4
+      <div class="w-150px h-150px flex justify-center items-center text-2xl">这是一个icon</div>
5
+    </div>
6
+    <div class="flex-1">
7
+      <el-form ref="formRef" :model="password" :rules="rules" label-width="80">
8
+        <el-form-item :label="t('profile.password.oldPassword')" class="mt-40px w-[70%]"
9
+                      prop="oldPassword">
10
+          <InputPassword v-model="password.oldPassword" class="w-full"/>
11
+        </el-form-item>
12
+        <el-form-item :label="t('profile.password.newPassword')" class="mt-50px w-[70%] "
13
+                      prop="newPassword">
14
+          <InputPassword v-model="password.newPassword" class="w-full" strength/>
15
+        </el-form-item>
16
+        <el-form-item :label="t('profile.password.confirmPassword')" class="mt-40px w-[70%]"
17
+                      prop="confirmPassword">
18
+          <InputPassword v-model="password.confirmPassword" class="w-full" strength/>
19
+        </el-form-item>
20
+
21
+          <div class="mt-50px w-[70%] text-center  mb-30px mb-30px">
22
+            <XButton :title="t('common.save')" type="primary" @click="submit(formRef)"/>
23
+            <XButton :title="t('common.reset')" type="danger" @click="reset(formRef)"/>
24
+          </div>
25
+
26
+
27
+      </el-form>
28
+    </div>
29
+  </div>
17
 </template>
30
 </template>
18
 <script lang="ts" setup>
31
 <script lang="ts" setup>
19
-import type { FormInstance, FormRules } from 'element-plus'
32
+import type {FormInstance, FormRules} from 'element-plus'
20
 
33
 
21
-import { InputPassword } from '@/components/InputPassword'
22
-import { updateUserPassword } from '@/api/system/user/profile'
34
+import {InputPassword} from '@/components/InputPassword'
35
+import {updateUserPassword} from '@/api/system/user/profile'
23
 
36
 
24
-defineOptions({ name: 'ResetPwd' })
37
+defineOptions({name: 'ResetPwd'})
25
 
38
 
26
-const { t } = useI18n()
39
+const {t} = useI18n()
27
 const message = useMessage()
40
 const message = useMessage()
28
 const formRef = ref<FormInstance>()
41
 const formRef = ref<FormInstance>()
29
 const password = reactive({
42
 const password = reactive({
@@ -43,16 +56,16 @@ const equalToPassword = (_rule, value, callback) => {
43
 
56
 
44
 const rules = reactive<FormRules>({
57
 const rules = reactive<FormRules>({
45
   oldPassword: [
58
   oldPassword: [
46
-    { required: true, message: t('profile.password.oldPwdMsg'), trigger: 'blur' },
47
-    { min: 6, max: 20, message: t('profile.password.pwdRules'), trigger: 'blur' }
59
+    {required: true, message: t('profile.password.oldPwdMsg'), trigger: 'blur'},
60
+    {min: 6, max: 20, message: t('profile.password.pwdRules'), trigger: 'blur'}
48
   ],
61
   ],
49
   newPassword: [
62
   newPassword: [
50
-    { required: true, message: t('profile.password.newPwdMsg'), trigger: 'blur' },
51
-    { min: 6, max: 20, message: t('profile.password.pwdRules'), trigger: 'blur' }
63
+    {required: true, message: t('profile.password.newPwdMsg'), trigger: 'blur'},
64
+    {min: 6, max: 20, message: t('profile.password.pwdRules'), trigger: 'blur'}
52
   ],
65
   ],
53
   confirmPassword: [
66
   confirmPassword: [
54
-    { required: true, message: t('profile.password.cfPwdMsg'), trigger: 'blur' },
55
-    { required: true, validator: equalToPassword, trigger: 'blur' }
67
+    {required: true, message: t('profile.password.cfPwdMsg'), trigger: 'blur'},
68
+    {required: true, validator: equalToPassword, trigger: 'blur'}
56
   ]
69
   ]
57
 })
70
 })
58
 
71
 

+ 4 - 1
src/views/Profile/components/UserAvatar.vue

@@ -1,5 +1,5 @@
1
 <template>
1
 <template>
2
-  <div class="change-avatar">
2
+  <div class="change-avatar mt-100px mb-150px mr-120px relative">
3
     <CropperAvatar
3
     <CropperAvatar
4
       ref="cropperRef"
4
       ref="cropperRef"
5
       :btnProps="{ preIcon: 'ant-design:cloud-upload-outlined' }"
5
       :btnProps="{ preIcon: 'ant-design:cloud-upload-outlined' }"
@@ -8,6 +8,9 @@
8
       width="120px"
8
       width="120px"
9
       @change="handelUpload"
9
       @change="handelUpload"
10
     />
10
     />
11
+     <div class="text-2xl absolute right-50px bottom-0px text-[#000000]">超级管理员
12
+      <div class="text-sm lh-50px text-[#000000bd]">超级管理员,普通角色</div>
13
+     </div>
11
   </div>
14
   </div>
12
 </template>
15
 </template>
13
 <script lang="ts" setup>
16
 <script lang="ts" setup>

+ 4 - 14
src/views/system/user/UserForm.vue

@@ -96,7 +96,7 @@
96
 
96
 
97
 
97
 
98
         <el-col :span="8">
98
         <el-col :span="8">
99
-          <el-form-item label="省" prop="shengCode">
99
+          <el-form-item :prop="shengCodeProps" label="省">
100
             <el-select v-model="formData.shengCode"
100
             <el-select v-model="formData.shengCode"
101
                        clearable
101
                        clearable
102
                        placeholder="所属省份">
102
                        placeholder="所属省份">
@@ -327,23 +327,13 @@ watch(() => formData.value.shiCode, async (newValue) => {
327
     xianList.value = []
327
     xianList.value = []
328
   }
328
   }
329
 });
329
 });
330
+let shengCodeProps = ref('shengCode')
330
 watch(
331
 watch(
331
   () => formData.value.deptId,
332
   () => formData.value.deptId,
332
   async (newValue) => {
333
   async (newValue) => {
333
-    if (newValue == '112') {
334
-      // 当 deptId 为 '112' 时,shengCode 不是必填
335
-      formRules.shengCode[0].required = false;
336
-      // 清除 shengCode 的校验状态
337
-      await formRef.value?.clearValidate('shengCode');
338
-
339
-    } else {
340
-      // 否则,shengCode 是必填的
341
-      formRules.shengCode[0].required = true;
342
-      // 重新校验 shengCode 字段
343
-      await formRef.value?.validateField('shengCode');
344
-    }
334
+    shengCodeProps.value = newValue == '112' ? '' : 'shengCode';
345
   },
335
   },
346
-  { deep: true }
336
+  {deep: true}
347
 );
337
 );
348
 onMounted(async () => {
338
 onMounted(async () => {
349
 
339