Files
order_site/apps/backend/src/routes/admin/users.ts
T
yml2213 040100f290 feat(dcauth): 新增后台手机号与设备认证登录
登录链路改为账号密码 + 短信验证码 + DCAuth 设备签名,并新增后台手机号绑定、
登录日志、设备绑定与重置接口。
2026-10-21 20:46:24 +08:00

236 lines
6.2 KiB
TypeScript

import { Router } from 'express'
import {
createManagedAdminUser,
getAdminUserList,
resetManagedAdminUserPassword,
resetManagedAdminUserDevice,
updateManagedAdminUserDisplayName,
updateManagedAdminUserPhone,
updateManagedAdminUserTestAccount,
updateManagedAdminUserRole,
updateManagedAdminUserStatus,
} from '../../services/admin/admin-auth-service.js'
import { createJsonHandler, getRequiredAdminSession, requireAdminRoles } from './session.js'
type AdminUserMutationResult = {
user: {
userId: number
username: string
displayName: string
role: string
status?: string
}
}
const router = Router()
router.use('/users', requireAdminRoles(['admin']))
router.get(
'/users',
createJsonHandler((req) => getAdminUserList(req.query), {
successMessage: 'ok',
errorMessage: '读取后台用户列表失败',
scope: '[admin/users]',
}),
)
router.post(
'/users',
createJsonHandler((req) => createManagedAdminUser(req.body), {
successMessage: '后台用户已创建',
errorMessage: '创建后台用户失败',
scope: '[admin/users:create]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_created',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: {
username: result.user.username,
role: result.user.role,
status: result.user.status,
},
}
},
}),
)
router.post(
'/users/:userId/role',
createJsonHandler(
(req) =>
updateManagedAdminUserRole(
String(req.params.userId || ''),
req.body,
getRequiredAdminSession(req),
),
{
successMessage: '用户角色已更新',
errorMessage: '更新用户角色失败',
scope: '[admin/users/:userId/role]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_role_updated',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: {
username: result.user.username,
role: result.user.role,
},
}
},
},
),
)
router.post(
'/users/:userId/display-name',
createJsonHandler(
(req) => updateManagedAdminUserDisplayName(String(req.params.userId || ''), req.body),
{
successMessage: '用户姓名已更新',
errorMessage: '更新用户姓名失败',
scope: '[admin/users/:userId/display-name]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_display_name_updated',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: {
username: result.user.username,
displayName: result.user.displayName,
},
}
},
},
),
)
router.post(
'/users/:userId/status',
createJsonHandler(
(req) =>
updateManagedAdminUserStatus(
String(req.params.userId || ''),
req.body,
getRequiredAdminSession(req),
),
{
successMessage: '用户状态已更新',
errorMessage: '更新用户状态失败',
scope: '[admin/users/:userId/status]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_status_updated',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: {
username: result.user.username,
status: result.user.status,
},
}
},
},
),
)
router.post(
'/users/:userId/reset-password',
createJsonHandler(
(req) => resetManagedAdminUserPassword(String(req.params.userId || ''), req.body),
{
successMessage: '用户密码已重置',
errorMessage: '重置用户密码失败',
scope: '[admin/users/:userId/reset-password]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_password_reset',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: {
username: result.user.username,
},
}
},
},
),
)
router.post(
'/users/:userId/phone',
createJsonHandler(
(req) =>
updateManagedAdminUserPhone(
String(req.params.userId || ''),
req.body,
getRequiredAdminSession(req),
),
{
successMessage: '手机号已绑定',
errorMessage: '绑定手机号失败',
scope: '[admin/users/:userId/phone]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_phone_updated',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: { username: result.user.username },
}
},
},
),
)
router.post(
'/users/:userId/device/reset',
createJsonHandler(
(req) =>
resetManagedAdminUserDevice(String(req.params.userId || ''), getRequiredAdminSession(req)),
{
successMessage: '设备绑定已重置',
errorMessage: '重置设备绑定失败',
scope: '[admin/users/:userId/device/reset]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_device_reset',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: { username: result.user.username },
}
},
},
),
)
router.post(
'/users/:userId/test-account',
createJsonHandler(
(req) => updateManagedAdminUserTestAccount(String(req.params.userId || ''), req.body),
{
successMessage: '测试账号设置已更新',
errorMessage: '更新测试账号设置失败',
scope: '[admin/users/:userId/test-account]',
audit: (_req, data) => {
const result = data as AdminUserMutationResult
return {
action: 'admin_user_test_account_updated',
targetType: 'admin_user',
targetId: String(result.user.userId),
data: { username: result.user.username },
}
},
},
),
)
export default router