用户服务(@uniboot/admin)

封装 admin-service 的账号域与用户 / 角色管理域 API,并提供 composable 与页面组件。个人中心忘记密码修改初始密码 从页面角度说明 Auth 模板如何接入,均由本包驱动。

能力域说明页面
账号域当前用户、验证码、忘记密码、改密、初始改密、换邮箱、基础资料AdminForgetPageAdminInitialPageAdminProfilePage(由安装入口内部懒加载)
用户 / 角色管理用户增删启停、重置解锁、角色 CRUD、权限树AdminUserManagePageAdminRoleManagePageAdminRoleAddPageAdminRoleDetailPage(主入口导出)

@uniboot/auth 的分工:auth 负责登录鉴权;admin 负责登录之后的账号与 RBAC。peerDependenciesuniboot-ui@uniboot/icons-vue@uniboot/utilsvuevue-i18nvue-router

推荐接入

Auth 模板只需两步。三服务地址均需配置:

环境变量含义谁用
APP_PUBLIC_API_URL业务系统后端默认 request
APP_PUBLIC_AUTH_SERVICE_URL授权服务Bundle → authHttp
APP_PUBLIC_ADMIN_SERVICE_URL用户服务(admin-service)Bundle → adminHttp(账号域 + RBAC)
ts
// 1. src/utils/request.ts
import { createUnibootAdminHttpBundle } from '@uniboot/admin'
import { createHttpClient } from '@uniboot/request'

const request = createHttpClient({
  baseURL: configs.baseUrl, // APP_PUBLIC_API_URL
  ...httpCommonOptions,
})

export const { adminApi, userApi, roleApi, authHttp, adminHttp } =
  createUnibootAdminHttpBundle({
    authServiceUrl: configs.authServiceUrl,
    adminServiceUrl: configs.adminServiceUrl,
    http: httpCommonOptions,
  })

export default request
ts
// 2. install 插件(createRouter 之后、app.use(router) 之前;Pinia / i18n 需已就绪)
import { setupUnibootAdmin } from '@uniboot/admin'

setupUnibootAdmin(app, {
  router,
  i18n,
  layout: LAYOUT,
  adminApi,
  userApi,
  roleApi,
  resolveRoleType: () => /* 当前用户可用角色类型 */,
  liveUser: () => useUserStore().userInfo,
  user: {
    snapshot: () => useUserStore().userInfo,
    logout: () => useUserStore().logout(),
    refreshUser: () => useUserStore().getUserInfo(),
  },
  appRuntime: {
    getLogo: () => appStore.config?.web_logo,
    getLightLogo: () => appStore.config?.web_logo_light,
    productTitle: config.title,
  },
  paths: {
    forget: PageEnum.FORGET,
    initialPassword: PageEnum.MODIFY_INIT_PWD,
    profile: PageEnum.PROFILE,
  },
  defaultAvatarSrc: '',
  profileMetaTitle: () => t('userCenter'),
  setLocale: setI18nLanguage,
  supportedLocales: [...SUPPORTED_LOCALES],
})

用户 / 角色管理页不自动挂路由,在菜单里直接引用包内组件即可(userApi / roleApi 已由 setupUnibootAdmin provide):

ts
component: () =>
  import('@uniboot/admin').then((m) => ({ default: m.AdminUserManagePage }))

菜单 component 支持字符串路径或懒加载函数,见 路由和菜单

createUnibootAdminHttpBundle

创建 authHttp / adminHttp,以及一律绑定 adminHttpadminApi / userApi / roleApi

参数

名称说明类型默认值
authServiceUrl授权服务地址(APP_PUBLIC_AUTH_SERVICE_URLstring
adminServiceUrl用户服务地址(APP_PUBLIC_ADMIN_SERVICE_URLstring
httpbaseURL 外与 createHttpClient 一致,应用到所有 clientobject

返回值

名称说明类型
adminApi账号域 APIobject
userApi用户管理域 APIobject
roleApi角色管理域 APIobject
authHttp授权域 HTTP 客户端object
adminHttp用户服务 HTTP 客户端object

setupUnibootAdmin

推荐安装入口:provide → 注册账号域路由 → 可选清理多余 locale。内部调用 initUnibootAdmin,账户页固定 recoverEmailStyle: 'admin'submitStyle: 'adminPatch'

参数

名称说明类型默认值
routerRouter 实例(需 addRoute / hasRouteobject
i18nvue-i18n 实例object
layout个人中心复用的布局组件object
adminApi账号域 APIobject
userApi用户管理域 API;传入则全局 provideobject
roleApi角色管理域 API;传入则全局 provideobject
resolveRoleType当前用户可用角色类型(新增角色页)function
liveUser个人中心实时用户 getter(与 Pinia 同步)function
displayTimeZone可选 IANA 时区 getterfunction
supportedLocaleslocale 白名单;传入则合并文案后删掉白名单外 keyarray
paths覆盖忘记密码 / 初始改密 / 个人中心路径object/forget/change-initial-password/profile
user.snapshot路由匹配时的用户快照function
user.logout登出(忘记密码返回、初始改密返回/提交后会调用)function
user.refreshUser改密 / 换邮箱 / 改资料后刷新本地用户function
appRuntime.getLogo普通 Logo;深色页未传 getLightLogo 时回退function
appRuntime.getLightLogo深色页(忘记密码 / 初始改密)浅色 Logofunction
appRuntime.productTitle初始改密页副标题插值string'App'
defaultAvatarSrc个人中心默认头像string
profileMetaTitle个人中心 meta.titlestring / function
changeEmailEnabled是否允许修改邮箱booleantrue
showBasicEditButton「基本信息」是否显示编辑按钮booleanfalse
basicEditDialogWidth修改基本信息弹窗宽度string / number由内置面板决定
setLocale语言切换回调function
reloadAfterLocaleChange切语言后是否整页刷新booleantrue

包内已合并 60+ 语言;宿主通常传 supportedLocales 即可。若不用安装入口、只要文案,可单独调用 mergeUnibootAdminLocales(i18n)

createAdminApi

账号域 API(一般由 Bundle 创建)。

参数

名称说明类型默认值
httpHTTP 客户端object
paths部分覆盖 defaultAdminApiPathsobjectdefaultAdminApiPaths
verifyCodeStyle验证码响应风格enum'json'

方法

名称路径说明
getCurrentUser()GET /users/current当前登录用户
getVerifyCode() / getVerifyCodeBlob()GET /account/verifycode图形验证码(JSON base64 / blob)
sendRecoverEmailCode() / sendRecoverEmailCodeGateway()POST /account/email-code忘记密码发信
passwordRecover()POST /account/password-recover忘记密码重置
changePassword()PATCH /account/password已登录改密
updateInitPasswordLoggedIn() / updateInitPasswordWithUserId() / postInitialPasswordLegacy()PATCH /account/init-password[/:userId]初始改密
sendEmailCode() / checkEmailCode() / sendNewEmailCode() / updateEmail()/account/email-code/*/account/email换绑邮箱
updateUserInfo()PATCH /account/info昵称 / 性别 / 生日

createUserApi / createRoleApi

固定基于 adminHttp。枚举:AdminUserStatusAdminUserLockedAdminRoleClass

名称说明
userApi.listUsers / createUser / deleteUser / setUserStatus / resetUser / unlockUser用户列表与写操作(resetUser 返回新密码明文)
roleApi.listRoles / listAllRoles / getRoleDetail / createRole / updateRole / deleteRole / getMenuTree角色与权限树

composable

均通过 options.api 注入,不依赖宿主 Pinia / 路由:

composable对接职责
useForgetAccountForgetPage验证码、发信、重置密码
useInitialPasswordInitialPage按场景提交新密码
useProfileAccountProfilePage换邮箱、改密、改资料;另导出 mapProfileEditToUserUpdatesexToGenderLabelformatBirthdayForProfile
useAdminUserManageAdminUserManagePage用户分页与写操作
useAdminRoleManageAdminRoleManagePage角色分页与删除
useAdminRoleFormAdminRoleAddPage / AdminRoleDetailPage权限树与提交

进阶:initUnibootAdmin

仅合并文案并注册账号域三条路由, provide。日常请用 setupUnibootAdmin;仅在需要自行控制注入时使用:

ts
app.provide(UNIBOOT_ADMIN_PROFILE_LIVE_USER, () => useUserStore().userInfo)
app.provide(ADMIN_USER_API_KEY, userApi)
app.provide(ADMIN_ROLE_API_KEY, roleApi)
app.provide(ADMIN_RESOLVE_ROLE_TYPE_KEY, resolveRoleType)

initUnibootAdmin({
  router,
  i18n,
  layout,
  adminApi,
  user,
  // 其余选项同 setupUnibootAdmin 中的路由 / 用户 / 文案字段(不含 liveUser、userApi、roleApi、supportedLocales 等安装扩展项)
})

注入 key:UNIBOOT_ADMIN_PROFILE_LIVE_USERUNIBOOT_ADMIN_DISPLAY_TIME_ZONEADMIN_USER_API_KEYADMIN_ROLE_API_KEYADMIN_RESOLVE_ROLE_TYPE_KEY。个人中心需 liveUser provide,否则页面无法随 Pinia 实时更新。