diff --git a/packages/ui/certd-client/src/locales/langs/en-US/authentication.ts b/packages/ui/certd-client/src/locales/langs/en-US/authentication.ts index d133bf28..33b150b3 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/authentication.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/authentication.ts @@ -81,4 +81,5 @@ export default { nickName: "Nickname", phoneNumber: "Phone Number", changePassword: "Change Password", + updateProfile: "Update Profile", }; diff --git a/packages/ui/certd-client/src/locales/langs/en-US/common.ts b/packages/ui/certd-client/src/locales/langs/en-US/common.ts index d461d909..34777d30 100644 --- a/packages/ui/certd-client/src/locales/langs/en-US/common.ts +++ b/packages/ui/certd-client/src/locales/langs/en-US/common.ts @@ -19,4 +19,5 @@ export default { create: "Create", yes: "Yes", no: "No", + handle: "Handle", }; diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/authentication.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/authentication.ts index 2bd39d05..c71bb400 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/authentication.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/authentication.ts @@ -82,4 +82,5 @@ export default { nickName: "昵称", phoneNumber: "手机号", changePassword: "修改密码", + updateProfile: "修改个人信息", }; diff --git a/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts b/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts index e9ba4012..9cec01a9 100644 --- a/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts +++ b/packages/ui/certd-client/src/locales/langs/zh-CN/common.ts @@ -19,4 +19,5 @@ export default { create: "新增", yes: "是", no: "否", + handle: "操作", }; diff --git a/packages/ui/certd-client/src/views/certd/mine/api.ts b/packages/ui/certd-client/src/views/certd/mine/api.ts index 7b1805c9..aa996cf5 100644 --- a/packages/ui/certd-client/src/views/certd/mine/api.ts +++ b/packages/ui/certd-client/src/views/certd/mine/api.ts @@ -14,3 +14,11 @@ export async function changePassword(form: any) { data: form, }); } + +export async function UpdateProfile(form: any) { + return await request({ + url: "/mine/updateProfile", + method: "POST", + data: form, + }); +} diff --git a/packages/ui/certd-client/src/views/certd/mine/use.tsx b/packages/ui/certd-client/src/views/certd/mine/use.tsx new file mode 100644 index 00000000..bebefc2d --- /dev/null +++ b/packages/ui/certd-client/src/views/certd/mine/use.tsx @@ -0,0 +1,110 @@ +// useUserProfile, 获取 openEditProfileDialog ,参考 useTemplate方法 +import { useFormWrapper } from "@fast-crud/fast-crud"; +import { ref } from "vue"; +import { cloneDeep, merge } from "lodash-es"; + +// 假设的 API 导入 +import * as userProfileApi from "./api"; +import { useUserStore } from "/@/store/user"; +import { useI18n } from "/src/locales"; + +/** + * 获取用户资料编辑相关功能 + * @returns {{openEditProfileDialog: openEditProfileDialog}} + */ +export function useUserProfile() { + const { openCrudFormDialog } = useFormWrapper(); + const wrapperRef = ref(); + async function openEditProfileDialog(req: { onUpdated?: (ctx: any) => void }) { + const detail = await userProfileApi.getMineInfo(); + if (!detail) { + throw new Error("用户资料不存在"); + } + + const { t } = useI18n(); + + const userStore = useUserStore(); + const userProfileFormRef = ref(); + async function doSubmit(opts: { form: any }) { + const form = opts.form; + const { id } = await userProfileApi.UpdateProfile(form); + if (req.onUpdated) { + req.onUpdated({ id }); + } + } + + const crudOptions: any = { + form: { + doSubmit, + wrapper: { + title: `编辑用户资料`, + width: 1100, + onOpened(opts: { form: any }) { + merge(opts.form, detail); + }, + }, + }, + columns: { + nickName: { + title: t("certd.nickName"), + type: "text", + form: { + component: { + placeholder: t("certd.nickName"), + }, + rules: [{ required: true, message: t("certd.nickName") }], + }, + }, + avatar: { + title: t("certd.avatar"), + type: "cropper-uploader", + column: { + width: 70, + component: { + style: { + height: "30px", + width: "auto", + }, + buildUrl(key: string) { + return `api/basic/file/download?&key=` + key; + }, + }, + }, + form: { + component: { + vModel: "modelValue", + valueType: "key", + cropper: { + aspectRatio: 1, + autoCropArea: 1, + viewMode: 0, + }, + onReady: null, + uploader: { + type: "form", + action: "/basic/file/upload", + name: "file", + headers: { + Authorization: "Bearer " + userStore.getToken, + }, + successHandle(res: any) { + return res; + }, + }, + buildUrl(key: string) { + return `api/basic/file/download?&key=` + key; + }, + }, + }, + }, + }, + }; + + const wrapper = await openCrudFormDialog({ crudOptions }); + wrapperRef.value = wrapper; + } + + return { + openEditProfileDialog, + }; +} diff --git a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue index 0e2d29ee..bd3ecb60 100644 --- a/packages/ui/certd-client/src/views/certd/mine/user-profile.vue +++ b/packages/ui/certd-client/src/views/certd/mine/user-profile.vue @@ -4,19 +4,21 @@
{{ t("certd.myInfo") }}
- + {{ userInfo.username }} + {{ userInfo.nickName }} {{ userInfo.username }} - {{ userInfo.nickName }} {{ userInfo.email }} {{ userInfo.phoneCode }}{{ userInfo.mobile }} - - + + + {{ t("authentication.updateProfile") }} +
@@ -28,6 +30,7 @@ import * as api from "./api"; import { Ref, ref } from "vue"; import ChangePasswordButton from "/@/views/certd/mine/change-password-button.vue"; import { useI18n } from "vue-i18n"; +import { useUserProfile } from "./use"; const { t } = useI18n(); @@ -41,4 +44,14 @@ const getUserInfo = async () => { userInfo.value = await api.getMineInfo(); }; getUserInfo(); + +const { openEditProfileDialog } = useUserProfile(); + +function doUpdate() { + openEditProfileDialog({ + onUpdated: async () => { + await getUserInfo(); + }, + }); +} diff --git a/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts b/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts index a3949c59..dfce3d2b 100644 --- a/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts +++ b/packages/ui/certd-server/src/controller/user/mine/mine-controller.ts @@ -32,4 +32,15 @@ export class MineController extends BaseController { await this.userService.changePassword(userId, body); return this.ok({}); } + + @Post('/updateProfile', { summary: Constants.per.authOnly }) + public async updateProfile(@Body(ALL) body: any) { + const userId = this.getUserId(); + + await this.userService.updateProfile(userId, { + avatar: body.avatar, + nickName: body.nickName, + }); + return this.ok({}); + } } diff --git a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts index e9f320d6..fec66ac4 100644 --- a/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts +++ b/packages/ui/certd-server/src/modules/sys/authority/service/user-service.ts @@ -23,6 +23,7 @@ export const AdminRoleId = 1 @Provide() @Scope(ScopeEnum.Request, { allowDowngrade: true }) export class UserService extends BaseService { + @InjectEntityModel(UserEntity) repository: Repository; @Inject() @@ -335,4 +336,14 @@ export class UserService extends BaseService { }, }) } + + async updateProfile(userId: any, body: any) { + + await this.update({ + id: userId, + ...body, + }) + + + } }