用户服务(@uniboot/admin) ​

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

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

与 @uniboot/auth 的分工:auth 负责登录鉴权;admin 负责登录之后的账号与 RBAC。peerDependencies:uniboot-ui、@uniboot/icons-vue、@uniboot/utils、vue、vue-i18n、vue-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,以及一律绑定 adminHttp 的 adminApi / userApi / roleApi。

参数 ​

名称说明类型默认值
authServiceUrl授权服务地址(APP_PUBLIC_AUTH_SERVICE_URL)string—
adminServiceUrl用户服务地址(APP_PUBLIC_ADMIN_SERVICE_URL)string—
http除 baseURL 外与 createHttpClient 一致,应用到所有 client。refreshToken 应与业务 request 使用同一函数引用object—

返回值 ​

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

setupUnibootAdmin ​

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

参数 ​

名称说明类型默认值
routerRouter 实例(需 addRoute / hasRoute)object—
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图形验证码(均 withToken: false)
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。枚举:AdminUserStatus、AdminUserLocked、AdminRoleClass。

名称说明
userApi.listUsers / createUser / deleteUser / setUserStatus / resetUser / unlockUser用户列表与写操作(resetUser 兼容 result / data / 嵌套 password)
roleApi.listRoles / listAllRoles / getRoleDetail / createRole / updateRole / deleteRole / getMenuTree角色与权限树

composable ​

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

composable对接职责
useForgetAccountForgetPage验证码、发信、重置密码
useInitialPasswordInitialPage按场景提交新密码
useProfileAccountProfilePage换邮箱、改密、改资料;另导出 mapProfileEditToUserUpdate、sexToGenderLabel、formatBirthdayForProfile
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_USER、UNIBOOT_ADMIN_DISPLAY_TIME_ZONE、ADMIN_USER_API_KEY、ADMIN_ROLE_API_KEY、ADMIN_RESOLVE_ROLE_TYPE_KEY。个人中心需 liveUser provide,否则页面无法随 Pinia 实时更新。