sass警告

This commit is contained in:
2026-06-02 14:21:13 +08:00
parent dde72be9de
commit 557a6f30f2
19 changed files with 353 additions and 48 deletions
+17 -3
View File
@@ -1,4 +1,5 @@
import request from '@/utils/request'
import store from '@/stores'
/** 通用响应结构 */
export interface ApiResult<T = any> {
@@ -31,13 +32,26 @@ export function sendSmsCode(mobileNumber: string) {
* POST /public/login/smsLogin
* Body: { mobileNumber, code, inviteCode? }
* 登录成功后后端会 Set-Cookie: Token=xxx
*
* inviteCode 优先使用传入参数,其次从全局 store 中读取(URL 邀请码)
* 登录成功后自动清空全局邀请码,避免重复发送
*/
export function smsLogin(mobileNumber: string, code: string, inviteCode?: string) {
return request.post<any, ApiResult<LoginData>>('/public/login/smsLogin', {
export async function smsLogin(mobileNumber: string, code: string, inviteCode?: string) {
// 优先使用显式传入的邀请码,否则从全局 store 取
const finalInviteCode = inviteCode || store.state.inviteCode || ''
const res = await request.post<any, ApiResult<LoginData>>('/public/login/smsLogin', {
mobileNumber,
code,
...(inviteCode ? { inviteCode } : {}),
...(finalInviteCode ? { inviteCode: finalInviteCode } : {}),
})
// 登录成功后清空全局邀请码
if (res.code === '0' && store.state.inviteCode) {
store.commit('SET_INVITE_CODE', '')
}
return res
}
/**
+64 -18
View File
@@ -1,15 +1,35 @@
import request from '@/utils/request'
import type { ApiResult } from '@/api/auth'
/**
* 获取当前用户有权限的路由列表
*
* 【mock 阶段】直接返回写死的数据,模拟后端接口
* 【对接真实接口时】把下面的 mock 数据替换成:
* return axios.get('/api/user/menus').then(res => res.data)
*
* 返回格式约定:
* path — 路由路径
* name — 路由名称(唯一标识,也用于 removeRoute
* component — 字符串,对应前端组件映射表的 key
* meta — 可选,传给路由的 meta 信息(图标、标题等)
* 路由菜单项 — 后端 /route/menu 接口返回的数据结构
*/
export interface RouteMenuVo {
/** 主键 */
id: string
/** 根节点ID */
rootId: string
/** 父级路由ID */
parentId: string
/** 路由名称(用于侧边栏显示) */
routeName: string
/** 前端路径 */
routePath: string
/** 前端组件路径(对应 componentMap 的 key */
component: string
/** 图标 key */
icon: string
/** 排序 */
sortOrder: number
/** 是否有使用权限:true=可用 false=无权限(需会员) */
accessible: boolean
/** 递归子菜单 */
children?: RouteMenuVo[]
}
/**
* 兼容旧版 MenuItemRaw 类型(供 SideNav 和 store 使用)
* 在新接口基础上补充原有字段映射
*/
export interface MenuItemRaw {
path: string
@@ -22,14 +42,40 @@ export interface MenuItemRaw {
/** 'footer' 表示该菜单项显示在底部区域而非主导航 */
position?: string
}
/** 排序字段 */
sortOrder: number
/** 是否有使用权限 */
accessible: boolean
}
/**
* 将后端返回的 RouteMenuVo 转换为前端使用的 MenuItemRaw
*/
function mapRouteMenuToMenuItem(item: RouteMenuVo): MenuItemRaw {
return {
path: item.routePath,
name: item.component, // component 作为路由 name(与 componentMap 对应)
component: item.component,
meta: {
label: item.routeName,
icon: item.icon,
},
sortOrder: item.sortOrder,
accessible: item.accessible,
}
}
/**
* 获取当前用户有权限的路由菜单列表
* GET /route/menu
* Cookie 自动携带 Token
*/
export async function fetchUserRoutes(): Promise<MenuItemRaw[]> {
// TODO: 替换为真实接口 → return axios.get('/api/user/menus').then(res => res.data)
return [
{ path: '/resume', name: 'Resume', component: 'Resume', meta: { label: '简历', icon: 'nav-resume-icon' } },
{ path: '/profile', name: 'Profile', component: 'Profile', meta: { label: '个人资料', icon: 'nav-profile-icon' } },
{ path: '/agent', name: 'Agent', component: 'Agent', meta: { label: 'AI助手', icon: 'nav-agent-icon', badge: 'NEW' } },
{ path: '/settings', name: 'Settings', component: 'Settings', meta: { label: '设置', icon: 'nav-setting-icon', position: 'footer' } },
]
const res = await request.get<any, ApiResult<RouteMenuVo[]>>('/route/menu')
if (res.code === '0' && res.data) {
// 按 sortOrder 排序后转换格式
const sorted = [...res.data].sort((a, b) => a.sortOrder - b.sortOrder)
return sorted.map(mapRouteMenuToMenuItem)
}
return []
}