sass警告
This commit is contained in:
+17
-3
@@ -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
@@ -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 []
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user