Browse Source

🚀 设置系统头像

master
wangxiang 2 years ago
parent
commit
df3977a07f
  1. 5
      src/store/modules/user.ts
  2. 7
      src/views/system/user/user.data.ts
  3. 39
      src/views/system/user/userInfo/index.vue

5
src/store/modules/user.ts

@ -18,6 +18,9 @@ import { router } from '/@/router';
import { usePermissionStore } from '/@/store/modules/permission'; import { usePermissionStore } from '/@/store/modules/permission';
import { RouteRecordRaw } from 'vue-router'; import { RouteRecordRaw } from 'vue-router';
import defaultAvatar from '/@/assets/images/defaultAvatar.svg'; import defaultAvatar from '/@/assets/images/defaultAvatar.svg';
import { isUrl } from '/@/utils/is';
import { useGlobSetting } from '/@/hooks/setting';
const { apiUrl } = useGlobSetting();
interface UserState { interface UserState {
userInfo: Nullable<User>; userInfo: Nullable<User>;
@ -134,7 +137,7 @@ export const useUserStore = defineStore({
/** 获取用户信息 */ /** 获取用户信息 */
async getUserInfoAction(): Promise<User> { async getUserInfoAction(): Promise<User> {
const userInfo = await getUserInfo().catch(()=> this.resetState()); const userInfo = await getUserInfo().catch(()=> this.resetState());
userInfo.avatar || (userInfo.avatar = defaultAvatar); userInfo.avatar ? (userInfo.avatar = isUrl(userInfo.avatar) ? userInfo.avatar : apiUrl + userInfo.avatar) : (userInfo.avatar = defaultAvatar);
userInfo.tenantIds = String(userInfo.tenantId).split(','); userInfo.tenantIds = String(userInfo.tenantId).split(',');
// 存储用户扩展信息,便于鉴权 // 存储用户扩展信息,便于鉴权
this.setUserInfo(userInfo); this.setUserInfo(userInfo);

7
src/views/system/user/user.data.ts

@ -122,6 +122,13 @@ export const userFormSchema: FormSchema[] = [
span: 12 span: 12
} }
}, },
{
field: 'avatar',
label: '头像',
component: 'Input',
defaultValue: 'https://godolphinx.org/dolphin1024x1024.png',
show: false
},
{ {
field: 'deptId', field: 'deptId',
label: '归属机构', label: '归属机构',

39
src/views/system/user/userInfo/index.vue

@ -12,7 +12,7 @@
<div class="user-info-top"> <div class="user-info-top">
<AAvatar draggable <AAvatar draggable
width="32px" width="32px"
src="https://godolphinx.org/dolphin1024x1024.png" :src="getUserInfo.avatar"
:size="80" :size="80"
/> />
<h2>{{ getUserInfo.nickName }}</h2> <h2>{{ getUserInfo.nickName }}</h2>
@ -80,17 +80,16 @@
<AForm v-show="state.currentCardKey === 'uploadAvatar'" <AForm v-show="state.currentCardKey === 'uploadAvatar'"
ref="formElRef" ref="formElRef"
class="upload-avatar-form" class="upload-avatar-form"
:model="state.userInfo"
:scrollToFirstError="true" :scrollToFirstError="true"
@keypress.enter="handleSubmit" @keypress.enter="handleSubmit"
> >
<AFormItem name="avatar"> <AFormItem>
<AUpload list-type="picture-card" <AUpload list-type="picture-card"
class="avatar-uploader" class="avatar-uploader"
accept="image/*" accept="image/*"
:multiple="false" :multiple="false"
:customRequest="handleUploadAvatar"
:show-upload-list="false" :show-upload-list="false"
:customRequest="handleUploadAvatar"
:before-upload="handleBeforeUpload" :before-upload="handleBeforeUpload"
> >
<img v-if="state.imageUrl" :src="state.imageUrl"> <img v-if="state.imageUrl" :src="state.imageUrl">
@ -105,6 +104,7 @@
<a-button preIcon="fa-regular:save" <a-button preIcon="fa-regular:save"
:loading="state.uploadAvatarBtnLoading" :loading="state.uploadAvatarBtnLoading"
type="primary" type="primary"
@click="handleAvatarSubmit"
>保存</a-button> >保存</a-button>
</AFormItem> </AFormItem>
</AForm> </AForm>
@ -129,6 +129,7 @@
import {useUserStore} from '/@/store/modules/user'; import {useUserStore} from '/@/store/modules/user';
import {commonUpload} from '/@/api/platform/core/controller/upload'; import {commonUpload} from '/@/api/platform/core/controller/upload';
import {useGlobSetting} from '/@/hooks/setting'; import {useGlobSetting} from '/@/hooks/setting';
import {isUrl} from '/@/utils/is';
interface InfoState { interface InfoState {
currentCardKey: string; currentCardKey: string;
@ -170,7 +171,7 @@
} }
] ]
}); });
const defaultAvatarUrl = 'https://godolphinx.org/dolphin1024x1024.png';
const [registerForm, { resetFields, setFieldsValue, updateSchema, validate, clearValidate }] = useForm({ const [registerForm, { resetFields, setFieldsValue, updateSchema, validate, clearValidate }] = useForm({
labelWidth: 100, labelWidth: 100,
schemas: userFormSchema, schemas: userFormSchema,
@ -194,18 +195,40 @@
try { try {
const formData = await validate(); const formData = await validate();
state.baseInfoBtnLoading = true; state.baseInfoBtnLoading = true;
editUser(formData).then(async () => { await editUser(formData);
createMessage.success('保存成功!'); createMessage.success('保存成功!');
const result = await getUser(userInfo.id); const result = await getUser(userInfo.id);
state.userInfo = result.result; state.userInfo = result.result;
await setFieldsValue(result.result); await setFieldsValue(result.result);
});
} finally { } finally {
state.baseInfoBtnLoading = false; state.baseInfoBtnLoading = false;
} }
} }
const getUserInfo = computed((): User & any => state.userInfo ? state.userInfo : {}); async function handleAvatarSubmit() {
try {
state.uploadAvatarBtnLoading = true;
await editUser({
id: userInfo.id,
avatar: state.imageUrl
});
createMessage.success('保存成功!');
const result = await getUser(userInfo.id);
state.userInfo = result.result;
await setFieldsValue(result.result);
} finally {
state.uploadAvatarBtnLoading = false;
}
}
const getUserInfo = computed((): User & any => {
let userInfo = state.userInfo ? state.userInfo : {};
if (userInfo.avatar) {
userInfo.avatar ? (userInfo.avatar = isUrl(userInfo.avatar) ? userInfo.avatar : apiUrl + userInfo.avatar) : (userInfo.avatar = defaultAvatarUrl);
state!.imageUrl = userInfo.avatar;
}
return userInfo;
});
const getLabelStyle = computed((): CSSProperties => ({ const getLabelStyle = computed((): CSSProperties => ({
fontSize: '14px', fontSize: '14px',

Loading…
Cancel
Save