feat: 适配5.x后端,重构前端架构

主要变更:
1. 重构API目录结构,采用模块化设计,适配5.x后端接口规范
2. 优化布局组件,提升用户界面体验
3. 增强国际化支持,完善多语言配置
4. 新增权限控制功能,支持前端路由权限管理
5. 优化认证流程,支持JWT认证机制
6. 新增中间件和插件,提升系统扩展性
7. 优化状态管理,采用更清晰的模块化设计
8. 新增搜索框、广告等组件,丰富页面功能
9. 更改包管理工具从npm到pnpm,提升依赖管理效率
10. 完善配置系统,支持多环境配置

适配5.x后端特性:
- 采用新的API接口规范
- 支持JWT认证机制
- 适配后端权限控制体系
- 支持后端国际化接口
- 优化数据交互方式
This commit is contained in:
Mr.April
2026-04-07 11:01:11 +08:00
parent 1b83f1890b
commit d84d972e73
127 changed files with 103052 additions and 14661 deletions
-87
View File
@@ -1,87 +0,0 @@
/**
* 用户登录认证
*/
export function authenticateUser(data: AnyObject) {
return request.post('/auth/login', data)
}
/**
* 手机验证码登录
*/
export function authenticateWithMobile(data: AnyObject) {
return request.post('/auth/login/mobile', data)
}
/**
* 获取登录配置信息
*/
export function getLoginConfig() {
return request.get('/auth/config')
}
/**
* 用户退出登录
*/
export function logoutUser() {
return request.post('/auth/logout')
}
/**
* 用户注册
*/
export function registerUser(data: AnyObject) {
const url = data.pid ? `/auth/register?pid=${data.pid}` : '/auth/register'
return request.post(url, data)
}
/**
* 手机号注册
*/
export function registerWithMobile(data: AnyObject) {
const url = data.pid ? `/auth/register/mobile?pid=${data.pid}` : '/auth/register/mobile'
return request.post(url, data)
}
/**
* 微信授权登录
*/
export function authenticateWithWechat(data: AnyObject) {
return request.post('/auth/wechat', data)
}
/**
* 微信小程序登录
*/
export function authenticateWithWeapp(data: AnyObject) {
return request.post('/auth/weapp', data)
}
/**
* 绑定手机号
*/
export function bindMobile(data: AnyObject) {
const url = data.pid ? `/auth/bind?pid=${data.pid}` : '/auth/bind'
return request.post(url, data)
}
/**
* 生成微信扫码登录二维码
*/
export function generateWechatQrCode() {
return request.post('/auth/wechat/scan')
}
/**
* 检查微信扫码状态
*/
export function checkWechatScanStatus(data: AnyObject) {
return request.get('/auth/wechat/scan/status', data)
}
/**
* 检查微信登录可用性
*/
export function checkWechatAvailability() {
return request.get('/auth/wechat/availability')
}
+188
View File
@@ -0,0 +1,188 @@
import request from '~/utils/request'
/**
* 用户登录认证
*/
export function authenticateUser(data: {
username: string
password: string
}): Promise<any> {
return request.post('/auth/login', data)
}
/**
* 手机验证码登录
*/
export function authenticateWithMobile(data: {
mobile: string
code: string
key: string
}): Promise<any> {
return request.post('/auth/login/mobile', data)
}
/**
* 用户退出登录
*/
export function logoutUser(): Promise<boolean> {
return request.post('/auth/logout')
}
/**
* 用户注册
*/
export function registerUser(data: {
username: string
email: string
password: string
confirm_password: string
pid?: string
}): Promise<any> {
const url = data.pid ? `/auth/register?pid=${data.pid}` : '/auth/register'
return request.post(url, data)
}
/**
* 手机号注册
*/
export function registerWithMobile(data: {
mobile: string
code: string
key: string
pid?: string
}): Promise<any> {
const url = data.pid ? `/auth/register/mobile?pid=${data.pid}` : '/auth/register/mobile'
return request.post(url, data)
}
/**
* 微信授权登录
*/
export function authenticateWithWechat(data: any): Promise<any> {
return request.post('/auth/wechat', data)
}
/**
* 微信小程序登录
*/
export function authenticateWithWeapp(data: any): Promise<any> {
return request.post('/auth/weapp', data)
}
/**
* 绑定手机号
*/
export function bindMobile(data: {
mobile: string
code: string
pid?: string
}): Promise<any> {
const url = data.pid ? `/auth/bind?pid=${data.pid}` : '/auth/bind'
return request.post(url, data)
}
/**
* 生成微信扫码登录二维码
*/
export function generateWechatQrCode(): Promise<any> {
return request.post('/auth/wechat/scan')
}
/**
* 检查微信扫码状态
*/
export function checkWechatScanStatus(data: { scene_id: string }): Promise<any> {
return request.get('/auth/wechat/scan/status', data)
}
/**
* 检查微信登录可用性
*/
export function checkWechatAvailability(): Promise<boolean> {
return request.get('/auth/wechat/availability')
}
/**
* 获取第三方绑定列表
*/
export function getThirdPartyList(): Promise<any[]> {
return request.get('/auth/third-party/list')
}
/**
* 绑定第三方账号
*/
export function bindThirdParty(data: { platform: number }): Promise<boolean> {
return request.post('/auth/third-party/bind', data)
}
/**
* 解绑第三方账号
*/
export function unbindThirdParty(platform: number): Promise<boolean> {
return request.delete(`/auth/third-party/unbind/${platform}`)
}
/**
* 生成第三方绑定二维码
*/
export function generateBindQrCode(platform: number): Promise<any> {
return request.post('/auth/third-party/qr-code', { platform })
}
/**
* 检查绑定二维码状态
*/
export function checkBindQrStatus(sceneId: string): Promise<any> {
return request.get('/auth/third-party/qr-status', { scene_id: sceneId })
}
/**
* 验证邮箱(第一步:验证邮箱和验证码)
*/
export function verifyEmail(data: {
email: string
code: string
}): Promise<boolean> {
return request.post('/auth/verify-email', data)
}
/**
* 发送邮箱验证码
*/
export function sendEmailCode(data: {
email: string
captcha_key: string
captcha_code: string
}): Promise<boolean> {
return request.post('/auth/send-email-code', data)
}
/**
* 忘记密码 - 重置密码(第二步:设置新密码)
*/
export function forgetPassword(data: {
email: string
code: string
new_password: string
confirm_password: string
}): Promise<boolean> {
return request.post('/auth/forget-password', data)
}
/**
* 刷新 Token
*/
export function refreshToken(refresh_token: string): Promise<{
code: number
msg: string
data?: {
access_token: string
refresh_token: string
}
}> {
return request.post('/auth/refresh', { refresh_token }, {
// 不带 token 请求,避免 401 循环
headers: {}
} as any)
}
+99
View File
@@ -0,0 +1,99 @@
/**
* 认证模块相关类型定义
*/
/**
* 登录数据
*/
export interface LoginData {
username?: string
password?: string
phone?: string
verify_code?: string
pid?: string
}
/**
* 注册数据
*/
export interface RegisterData {
username?: string
password?: string
phone?: string
verify_code?: string
pid?: string
}
/**
* 绑定手机号数据
*/
export interface BindMobileData {
mobile: string
code: string
pid?: string
}
/**
* 用户信息(登录/注册后返回)
*/
export interface UserInfo {
id: number
username: string
nickname?: string
avatar?: string
phone?: string
email?: string
token: string
}
/**
* 登录配置
*/
export interface LoginConfig {
enable_username_login: boolean
enable_mobile_login: boolean
enable_wechat_login: boolean
enable_weapp_login: boolean
enable_register: boolean
}
/**
* 扫码状态
*/
export enum ScanStatus {
WAITING = 'waiting',
SCANNED = 'scanned',
CONFIRMED = 'confirmed',
EXPIRED = 'expired',
CANCELED = 'canceled'
}
/**
* 第三方平台类型
*/
export enum ThirdPartyPlatform {
WECHAT = 1,
QQ = 2,
ALIPAY = 3
}
/**
* 第三方绑定信息
*/
export interface ThirdPartyBinding {
platform: number
platform_name: string
nickname?: string
avatar?: string
bind_time: number
}
/**
* 扫码登录信息
*/
export interface QrCodeLoginInfo {
scene_id: string
qrcode_url: string
expires_in: number
}
-55
View File
@@ -1,55 +0,0 @@
/**
* 获取会员基本信息
*/
export function getMemberProfile() {
return request.get('/member/profile')
}
/**
* 更新会员信息
*/
export function updateMemberInfo(data: AnyObject) {
return request.put(`/member/profile/${data.field}`, data)
}
/**
* 获取积分流水记录
*/
export function getPointTransactions(data: AnyObject) {
return request.get('/member/points/transactions', data)
}
/**
* 获取会员积分总额
*/
export function getMemberPointsTotal() {
return request.get('/member/points/total')
}
/**
* 获取余额流水记录
*/
export function getBalanceTransactions(data: AnyObject) {
return request.get('/member/balance/transactions', data)
}
/**
* 获取所有余额流水记录
*/
export function getAllBalanceTransactions(data: AnyObject) {
return request.get('/member/balance/transactions/all', data)
}
/**
* 绑定会员手机号
*/
export function bindMemberMobile(data: AnyObject) {
return request.put('/member/mobile', data)
}
/**
* 获取会员等级信息
*/
export function getMemberLevel() {
return request.get('/member/level')
}
+189
View File
@@ -0,0 +1,189 @@
import request from '~/utils/request'
import type {
MemberInfo,
Address,
PointTransactionsResponse,
BalanceTransactionsResponse,
SignCalendar,
SignStatistics,
MemberLevel,
SignStatus
} from './types'
/**
* 获取会员基本信息
*/
export function getMemberProfile(): Promise<MemberInfo> {
return request.get('/member/user-info')
}
/**
* 更新会员信息
*/
export function updateMemberInfo(data: Partial<MemberInfo>): Promise<boolean> {
return request.put('/member/user/update', data)
}
/**
* 获取积分流水记录
*/
export function getPointTransactions(data: {
page?: number
page_size?: number
}): Promise<PointTransactionsResponse> {
return request.get('/member/points/record', data)
}
/**
* 获取会员积分总额
*/
export function getMemberPointsTotal(): Promise<number> {
return request.get('/member/points/total')
}
/**
* 获取余额流水记录
*/
export function getBalanceTransactions(data: {
page?: number
page_size?: number
}): Promise<BalanceTransactionsResponse> {
return request.get('/member/balance/record', data)
}
/**
* 获取所有余额流水记录
*/
export function getAllBalanceTransactions(data?: {
page?: number
page_size?: number
}): Promise<BalanceTransactionsResponse> {
return request.get('/member/balance/all', data)
}
/**
* 获取会员等级信息
*/
export function getMemberLevel(): Promise<MemberLevel> {
return request.get('/member/points/level')
}
/**
* 会员签到
*/
export function memberSign(): Promise<number> {
return request.post('/member/points/sign')
}
/**
* 执行签到
*/
export function signIn(): Promise<boolean> {
return request.post('/member/sign')
}
/**
* 获取签到状态
*/
export function getSignStatus(): Promise<SignStatus> {
return request.get('/member/sign/status')
}
/**
* 获取签到日历
*/
export function getSignCalendar(year: number, month: number): Promise<SignCalendar> {
return request.get('/member/sign/calendar', { year, month })
}
/**
* 获取签到统计
*/
export function getSignStatistics(type: string = 'month'): Promise<SignStatistics> {
return request.get('/member/sign/statistics', { type })
}
/**
* 修改密码
*/
export function changePassword(data: {
old_password: string
new_password: string
confirm_password: string
}): Promise<boolean> {
return request.put('/member/user/change-password', data)
}
/**
* 获取地址列表
*/
export function getAddressList(): Promise<Address[]> {
return request.get('/member/user/address/list')
}
/**
* 创建地址
*/
export function createAddress(data: Partial<Address>): Promise<Address> {
return request.post('/member/user/address/create', data)
}
/**
* 更新地址
*/
export function updateAddress(id: number, data: Partial<Address>): Promise<boolean> {
return request.put(`/member/user/address/update/${id}`, data)
}
/**
* 删除地址
*/
export function deleteAddress(id: number): Promise<boolean> {
return request.delete(`/member/user/address/delete/${id}`)
}
/**
* 获取验证码
*/
export function getVerificationCode(data: { type: string; phone: string }): Promise<boolean> {
return request.post('/member/user/send-code', data)
}
/**
* 修改手机号码
*/
export function updateMemberMobile(data: {
oldMobile: string
newMobile: string
code: string
}): Promise<boolean> {
return request.put('/member/user/update-phone', {
old_phone: data.oldMobile,
new_phone: data.newMobile,
verify_code: data.code
})
}
/**
* 修改邮箱
*/
export function updateMemberEmail(data: { email: string; code: string }): Promise<boolean> {
return request.put('/member/user/update-email', {
email: data.email,
verify_code: data.code
})
}
/**
* 上传头像
*/
export function uploadAvatar(file: File): Promise<string> {
const formData = new FormData()
formData.append('file', file)
return request.post('/member/user/avatar', formData, {
headers: {
'Content-Type': 'multipart/form-data'
} as any
})
}
+122
View File
@@ -0,0 +1,122 @@
/**
* 会员模块相关类型定义
*/
/**
* 会员基本信息
*/
export interface MemberInfo {
id: number
username: string
nickname?: string
avatar?: string
phone?: string
email?: string
points: number
balance: number
level: number
level_name?: string
created_at: number
updated_at: number
}
/**
* 地址
*/
export interface Address {
id: number
user_id: number
consignee: string
phone: string
province: string
city: string
district: string
address: string
postal_code?: string
is_default: number
created_at: number
updated_at: number
}
/**
* 积分流水记录
*/
export interface PointTransaction {
id: number
user_id: number
type: string
amount: number
balance: number
description: string
created_at: number
}
/**
* 积分流水响应
*/
export interface PointTransactionsResponse {
total: number
list: PointTransaction[]
}
/**
* 余额流水记录
*/
export interface BalanceTransaction {
id: number
user_id: number
type: string
amount: number
balance: number
description: string
created_at: number
}
/**
* 余额流水响应
*/
export interface BalanceTransactionsResponse {
total: number
list: BalanceTransaction[]
}
/**
* 签到日历
*/
export interface SignCalendar {
year: number
month: number
signed_dates: number[]
total_signed: number
total_can_sign: number
}
/**
* 签到统计
*/
export interface SignStatistics {
total_signed: number
continuous_signed: number
this_month_signed: number
today_signed: boolean
}
/**
* 会员等级信息
*/
export interface MemberLevel {
level: number
level_name: string
points: number
next_level_points?: number
}
/**
* 签到状态
*/
export interface SignStatus {
today_signed: boolean
continuous_days: number
can_sign: boolean
}
+47
View File
@@ -0,0 +1,47 @@
import request from '~/utils/request'
import type { LinkItem, AdvertisementItem, NavigationItem, SiteData } from './types'
/**
* 获取友情链接列表
*/
export function getLinks(params?: { type?: string }): Promise<LinkItem[]> {
return request.get('/site/link', params)
}
/**
* 获取所有友情链接
*/
export function getAllLinks(): Promise<LinkItem[]> {
return request.get('/site/link/all')
}
/**
* 获取广告位信息
*/
export function getAdvertisements(params?: { type?: string }): Promise<AdvertisementItem[]> {
return request.get('/site/ads', params)
}
/**
* 获取导航菜单列表
*/
export function getNavigationList(): Promise<NavigationItem[]> {
return request.get('/site/nav')
}
/**
* 获取站点首页数据(广告、导航、友情链接等)
*/
export function getSiteData(): Promise<SiteData> {
return request.get('/site/site-data')
}
/**
* 获取 Web 分组所有配置
* 一次性获取前台站点设置、搜索配置、统计分析配置等
*/
export function getWebGroupConfigs(): Promise<Record<string, any>> {
return request.get('/system/config/group/web')
}
+82
View File
@@ -0,0 +1,82 @@
/**
* 站点首页模块相关类型定义
*/
/**
* 友情链接项
*/
export interface LinkItem {
id: number
name: string
url: string
logo?: string
description?: string
category?: string
sort: number
target?: string
click_count?: number
enabled: number
created_at: number
updated_at: number
deleted_at: number | null
}
/**
* 广告项
*/
export interface AdvertisementItem {
id: number
title: string
link: string
image: string
description?: string
sort: number
enabled: number
start_time: number
end_time: number
created_at: number
updated_at: number
deleted_at: number | null
}
/**
* 导航菜单项
*/
export interface NavigationItem {
id: number
title: string
url: string
icon?: string
code: string | null
sort: number
enabled: number
is_show: number
}
/**
* 站点首页数据
*/
export interface SiteData {
advertisements: AdvertisementItem[]
navigation: NavigationItem[]
links: LinkItem[]
}
/**
* 搜索配置项
*/
export interface SearchConfig {
keyword: string // 搜索引擎关键字
keyword_enabled: number // 是否启用关键字搜索 (0/1)
}
/**
* 统计分析配置项
*/
export interface AnalyticsConfig {
baidu_tongji_code: string // 百度统计代码
baidu_tongji_enabled: number // 是否启用百度统计 (0/1)
}
-97
View File
@@ -1,97 +0,0 @@
/**
* 获取验证码图片
*/
export function getCaptchaImage() {
return request.get('/system/captcha', { time: Date.now() })
}
/**
* 获取微信授权码
*/
export function getWechatAuthCode(data: AnyObject) {
return request.get('/system/wechat/auth-code', data)
}
/**
* 同步微信用户信息
*/
export function syncWechatUserInfo(data: AnyObject) {
return request.get('/system/wechat/sync', data)
}
/**
* 获取协议内容
*/
export function getAgreementContent(key: string) {
return request.get(`/system/agreement/${key}`)
}
/**
* 重置用户密码
*/
export function resetUserPassword(data: AnyObject) {
return request.post('/system/password/reset', data)
}
/**
* 发送短信验证码
*/
export function sendSmsVerificationCode(data: AnyObject) {
return request.post(`/system/sms/${data.type}`, data)
}
/**
* 获取微信 JSSDK 配置
*/
export function getWechatJssdkConfig(data: AnyObject) {
return request.get('/system/wechat/jssdk-config', data)
}
/**
* 获取远程图片
*/
export function fetchRemoteImage(data: AnyObject) {
return request.post('/system/image/fetch', data)
}
/**
* 获取 Base64 格式图片
*/
export function fetchBase64Image(data: AnyObject) {
return request.post('/system/image/base64', data)
}
/**
* 获取版权信息
*/
export function getCopyrightInfo() {
return request.get('/system/copyright')
}
/**
* 获取站点信息
*/
export function getSiteInformation() {
return request.get('/system/site')
}
/**
* 获取广告位信息
*/
export function getAdvertisementInfo(params: Record<string, any>) {
return request.get('/system/web/advertisements', params, { showErrorMessage: false })
}
/**
* 获取导航菜单列表
*/
export function getNavigationList() {
return request.get('/system/web/navigation')
}
/**
* 获取友情链接列表
*/
export function getFriendlyLinks() {
return request.get('/system/web/friendly-links')
}
+64
View File
@@ -0,0 +1,64 @@
import request from '~/utils/request'
import type { SiteConfig, AgreementType, SmsType } from './types'
/**
* 按分组获取配置
*/
export function getConfigByGroup(groupCode: string, options?: {
enabled_only?: boolean
with_metadata?: boolean
}) {
return request.get(`/system/config/group/${groupCode}`, options)
}
/**
* 按 code 获取配置
*/
export function getConfigByCode(code: string, options?: { group_code?: string}) {
return request.get(`/system/config/code/${code}`, options)
}
/**
* 获取协议内容
*/
export function getAgreementContent(key: AgreementType): Promise<string> {
return request.get(`/agreement/${key}`)
}
/**
* 发送短信验证码
*/
export function sendSmsVerificationCode(data: {
type: SmsType
phone: string
[key: string]: any
}): Promise<boolean> {
return request.post(`/sms/${data.type}`, data)
}
/**
* 获取验证码图片
*/
export function getCaptchaImage() {
return request.get('/captcha', { time: Date.now() }, {
showSuccessMessage: false,
returnFullResponse: true
})
}
/**
* 获取远程图片
*/
export function fetchRemoteImage(data: { url: string }): Promise<string> {
return request.post('/image/fetch', data)
}
/**
* 获取 Base64 格式图片
*/
export function fetchBase64Image(data: { url: string }): Promise<string> {
return request.post('/image/base64', data)
}
+41
View File
@@ -0,0 +1,41 @@
/**
* 系统配置相关类型定义
*/
/**
* 配置项
*/
export interface ConfigItem {
id: number
group_code: string
code: string
name: string
content: Record<string, any>
is_sys: number
enabled: number
created_at: number
updated_at: number
remark?: string
}
/**
* 站点设置配置
*/
export interface SiteConfig {
copyright: string
icp: string
icp_url: string
network_security: string
network_security_url: string
}
/**
* 协议类型
*/
export type AgreementType = 'user' | 'privacy' | 'service'
/**
* 短信/邮箱验证码类型
*/
export type SmsType = 'register' | 'login' | 'reset_password' | 'reset_password_email' | 'change_phone' | 'change_email'