fix(admin): 微收口(注释/角色防御/dev 约定文档/husky 移除)

- routesAlias.ts 修复 clean:dev 打坏的块注释
- system-manage.ts menus/simple 标注死代码(backend 模式前置条件)
- /me 映射非 staff roles 兜底 R_USER,防空数组跳过菜单角色过滤
- 新增 README-dev.md:config-object 签名/URL 无 /api 前缀/Bearer 归映射层/v-html 红线
- package.json 删 husky prepare(防 pnpm install 改写 core.hooksPath)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-15 17:39:50 +08:00
parent 3a1f0a0b19
commit f11abbff43
5 changed files with 13 additions and 4 deletions
+8
View File
@@ -0,0 +1,8 @@
# admin 开发约定(Task 18-21 执行者必读)
基于 art-design-pro 模板的请求层适配约定,写业务前先读完本文件。
1. **request 是 config-object 签名**:`request.get<T>({ url, params })`,不是 axios 原生 `(url, config)`。
2. **URL 不带 `/api` 前缀**:`VITE_API_URL=/api` 已作为 baseURL,写 `/admin/auth/me` 即请求 `/api/admin/auth/me`;带 `/api` 会变成 `/api/api/...`。
3. **Bearer 不用业务层拼**:token 映射层已存 `Bearer <access>`,拦截器原样设置 Authorization;业务代码只管调 `request.*`。
4. **v-html 红线**:业务代码(`src/views/tracker/**`、`src/api/**`)禁用 v-html;也不得向模板内置 v-html 组件(ArtTextScroll / ThemeSvg / v-highlight)传访客来源数据(UTM、referrer、UA 等用户可控字段)。
-1
View File
@@ -15,7 +15,6 @@
"lint:prettier": "prettier --write \"**/*.{js,cjs,ts,json,tsx,css,less,scss,vue,html,md}\"",
"lint:stylelint": "stylelint \"**/*.{css,scss,vue}\" --fix",
"lint:lint-staged": "lint-staged",
"prepare": "husky",
"commit": "git-cz",
"clean:dev": "tsx scripts/clean-dev.ts"
},
+3 -2
View File
@@ -26,7 +26,8 @@ export async function fetchLogin(params: Api.Auth.LoginParams) {
*
* 后端仅返回 {username, is_admin},映射为模板 UserInfo 结构:
* - userName ← username;email/avatar 留空(模板有静态兜底头像)
* - roles ← is_admin ? ['R_ADMIN'] : [](菜单按 meta.roles 过滤,M1 无角色路由)
* - roles ← is_admin ? ['R_ADMIN'] : ['R_USER'](空数组会跳过菜单角色过滤,
* 非 staff 用户将看到全部菜单入口,故兜底 R_USER)
* - buttons ← [](按钮级权限占位);userId ← 0(仅用于多用户工作台清理判断)
*/
export async function fetchGetUserInfo(): Promise<Api.Auth.UserInfo> {
@@ -35,7 +36,7 @@ export async function fetchGetUserInfo(): Promise<Api.Auth.UserInfo> {
})
return {
buttons: [],
roles: data.is_admin ? ['R_ADMIN'] : [],
roles: data.is_admin ? ['R_ADMIN'] : ['R_USER'],
userId: 0,
userName: data.username,
email: ''
+1
View File
@@ -18,6 +18,7 @@ export function fetchGetRoleList(params: Api.SystemManage.RoleSearchParams) {
}
// 获取菜单列表
// 注意:后端无此端点,frontend 模式下死代码;切 backend 模式前需先实现
export function fetchGetMenuList() {
return request.get<AppRouteRecord[]>({
url: '/v3/system/menus/simple'
+1 -1
View File
@@ -1,6 +1,6 @@
/**
* 公共路由别名
# 存放系统级公共路由路径,如布局容器、登录页等
* 存放系统级公共路由路径,如布局容器、登录页等
*/
export enum RoutesAlias {
Layout = '/index/index', // 布局容器