first commit

This commit is contained in:
2025-11-24 16:06:44 +08:00
commit e57d497751
165 changed files with 59349 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
// 产品文档默认内容
export const DOCUMENTATION_DEFAULTS = {
// 基础说明默认内容
basicInfo: `## 请求头
| 字段名 | 类型 | 必填 | 描述 |
|--------|------|------|------|
| Access-Id | string | 是 | 账号的 Access-Id |
对于业务请求参数
通过加密后得到 Base64 字符串,将其放入到请求体中,字段名为 \`data\`,以此方式进行传参。
\`\`\`json
{
"data": "xxxx(base64)"
}
\`\`\`
对接响应得到的公共参数
\`\`\`json
{
"code": "int",
"message": "string",
"transaction_id": "string", // 流水号
"data": "string"
}
\`\`\`
**data** 字段为加密的数据,需要解密后查看。
## 加密和解密机制
账户获得的密钥(**Access Key**)是一个 16 进制字符串,使用 AES-128 加密算法。
### 加密过程:
- 加密模式:**AES-CBC 模式**。
- 密钥长度:**128 位16 字节)**。
- 填充方式:**PKCS7 填充**。
- **IV初始化向量**IV 长度为 16 字节128 位),每次加密时随机生成。
- 加密后,将 **IV** 和密文拼接在一起进行传输。
- 最后,将拼接了 IV 的密文通过 **Base64 编码**,方便在网络或文件中传输。
### 解密过程:
- 解密时,首先从 Base64 解码后的数据中提取前 16 字节作为 **IV**。
- 然后使用提取的 **IV**,通过 AES-CBC 模式解密剩余部分的密文。
- 解密后去除 **PKCS7 填充**,即可得到原始明文。`,
// 请求参数默认内容
requestParams: `## 请求参数
\`\`\`json
{
"mobile_no": "string",
"id_card": "string",
"name": "string"
}
\`\`\`
| 字段名 | 类型 | 必填 | 描述 |
|--------|------|------|------|
| mobile_no | string | 是 | 手机号 |
| id_card | string | 是 | 身份证号 |
| name | string | 是 | 姓名 |
通过加密后得到 Base64 字符串,将其放入到请求体中,字段名为 \`data\`
\`\`\`json
{
"data": "xxxx(base64)"
}
\`\`\``,
// 返回字段说明默认内容
responseFields: `## 返回字段说明
| 字段名 | 类型 | 说明 |
|--------|------|------|
| data.flag_telefraudpredictstd | string | 1(输出成功),0(未匹配上无输出),98(用户输入信息不足),99(系统异常) |
| data.tfps_level | string | 取值 0-6取值越高风险越大 |`,
// 响应示例默认内容
responseExample: `## 响应示例
### 成功响应
\`\`\`json
{
"data": {
"swift_number": "999333_20181029143459_23453A4E0",
"code": "00",
"flag_telefraudpredictstd": "1",
"tfps_level": "1"
}
}
\`\`\``,
// 错误代码默认内容
errorCodes: `## 错误代码
| code | message |
|------|---------|
| 0 | 业务成功 |
| 1000 | 查询为空 |
| 1001 | 接口异常 |
| 1002 | 参数解密失败 |
| 1003 | 基础参数校验不正确 |
| 1004 | 未经授权的IP |
| 1005 | 缺少Access-Id |
| 1006 | 未经授权的AccessId |
| 1007 | 账户余额不足,无法请求 |
| 1008 | 未开通此产品 |
| 2001 | 业务失败 |`
}
// 获取默认内容的辅助函数
export const getDefaultContent = (type) => {
return DOCUMENTATION_DEFAULTS[type] || ''
}
// 默认内容类型枚举
export const DEFAULT_CONTENT_TYPES = {
BASIC_INFO: 'basicInfo',
REQUEST_PARAMS: 'requestParams',
RESPONSE_FIELDS: 'responseFields',
RESPONSE_EXAMPLE: 'responseExample',
ERROR_CODES: 'errorCodes'
}

80
src/constants/icons.js Normal file
View File

@@ -0,0 +1,80 @@
// 图标映射配置 - Element Plus 到 Heroicons 的映射
import {
ArrowRightOnRectangleIcon,
Bars3Icon,
BellIcon,
CalendarIcon,
CheckCircleIcon,
CheckIcon,
ChevronDownIcon,
ClockIcon,
Cog6ToothIcon,
DocumentCheckIcon,
ExclamationCircleIcon,
ExclamationTriangleIcon,
EyeIcon,
EyeSlashIcon,
FunnelIcon,
// 基础图标
HomeIcon,
InformationCircleIcon,
LinkIcon,
MagnifyingGlassIcon,
MinusIcon,
PencilIcon,
// 其他常用图标
PlusIcon,
ShieldCheckIcon,
TrashIcon,
UserCircleIcon,
UserIcon,
// 管理相关
UsersIcon,
WalletIcon,
XMarkIcon
} from '@heroicons/vue/24/outline'
// Element Plus 图标到 Heroicons 的映射
export const iconMap = {
// 基础导航图标
House: HomeIcon,
User: UserIcon,
Setting: Cog6ToothIcon,
Shield: ShieldCheckIcon,
Wallet: WalletIcon,
Link: LinkIcon,
Bell: BellIcon,
Menu: Bars3Icon,
ArrowDown: ChevronDownIcon,
Close: XMarkIcon,
Info: InformationCircleIcon,
UserFilled: UserCircleIcon,
Switch: ArrowRightOnRectangleIcon,
// 管理相关图标
UserFilled: UsersIcon,
DocumentCheck: DocumentCheckIcon,
// 其他常用图标
Plus: PlusIcon,
Minus: MinusIcon,
Edit: PencilIcon,
Delete: TrashIcon,
View: EyeIcon,
Hide: EyeSlashIcon,
Search: MagnifyingGlassIcon,
Filter: FunnelIcon,
Calendar: CalendarIcon,
Clock: ClockIcon,
Check: CheckIcon,
Warning: ExclamationTriangleIcon,
Error: ExclamationCircleIcon,
Success: CheckCircleIcon
}
// 导出所有 Heroicons 图标供直接使用
export {
ArrowRightOnRectangleIcon, Bars3Icon, BellIcon, CalendarIcon, CheckCircleIcon, CheckIcon, ChevronDownIcon, ClockIcon, Cog6ToothIcon, DocumentCheckIcon, ExclamationCircleIcon, ExclamationTriangleIcon, EyeIcon,
EyeSlashIcon, FunnelIcon, HomeIcon, InformationCircleIcon, LinkIcon, MagnifyingGlassIcon, MinusIcon,
PencilIcon, PlusIcon, ShieldCheckIcon, TrashIcon, UserCircleIcon, UserIcon, UsersIcon, WalletIcon, XMarkIcon
}

225
src/constants/index.js Normal file
View File

@@ -0,0 +1,225 @@
// 应用常量
export const APP_NAME = '天远数据控制台'
export const APP_VERSION = '1.0.0'
// API相关常量
export const API_BASE_URL = '/api/v1'
export const API_TIMEOUT = 10000
// 认证相关常量
export const TOKEN_KEY = 'token'
export const REFRESH_TOKEN_KEY = 'refresh_token'
// 用户角色
export const USER_ROLES = {
USER: 'user',
ADMIN: 'admin',
SUPER_ADMIN: 'super_admin'
}
// 认证状态
export const CERTIFICATION_STATUS = {
PENDING: 'pending',
SUBMITTED: 'submitted',
REVIEWING: 'reviewing',
APPROVED: 'approved',
REJECTED: 'rejected'
}
// 认证状态中文映射
export const CERTIFICATION_STATUS_TEXT = {
[CERTIFICATION_STATUS.PENDING]: '待提交',
[CERTIFICATION_STATUS.SUBMITTED]: '已提交',
[CERTIFICATION_STATUS.REVIEWING]: '审核中',
[CERTIFICATION_STATUS.APPROVED]: '已通过',
[CERTIFICATION_STATUS.REJECTED]: '已拒绝'
}
// 交易类型
export const TRANSACTION_TYPES = {
RECHARGE: 'recharge',
WITHDRAW: 'withdraw',
CONSUME: 'consume',
REFUND: 'refund'
}
// 交易状态
export const TRANSACTION_STATUS = {
PENDING: 'pending',
PROCESSING: 'processing',
SUCCESS: 'success',
FAILED: 'failed',
CANCELLED: 'cancelled'
}
// 交易状态中文映射
export const TRANSACTION_STATUS_TEXT = {
[TRANSACTION_STATUS.PENDING]: '待处理',
[TRANSACTION_STATUS.PROCESSING]: '处理中',
[TRANSACTION_STATUS.SUCCESS]: '成功',
[TRANSACTION_STATUS.FAILED]: '失败',
[TRANSACTION_STATUS.CANCELLED]: '已取消'
}
// 验证码场景
export const SMS_SCENES = {
REGISTER: 'register',
LOGIN: 'login',
CHANGE_PASSWORD: 'change_password',
RESET_PASSWORD: 'reset_password',
BIND: 'bind',
UNBIND: 'unbind'
}
// 验证码场景中文映射
export const SMS_SCENES_TEXT = {
[SMS_SCENES.REGISTER]: '注册',
[SMS_SCENES.LOGIN]: '登录',
[SMS_SCENES.CHANGE_PASSWORD]: '修改密码',
[SMS_SCENES.RESET_PASSWORD]: '重置密码',
[SMS_SCENES.BIND]: '绑定',
[SMS_SCENES.UNBIND]: '解绑'
}
// 文件上传相关
export const UPLOAD_CONFIG = {
MAX_SIZE: 10 * 1024 * 1024, // 10MB
ALLOWED_TYPES: ['image/jpeg', 'image/png', 'image/gif', 'application/pdf'],
ALLOWED_EXTENSIONS: ['.jpg', '.jpeg', '.png', '.gif', '.pdf']
}
// 分页配置
export const PAGINATION_CONFIG = {
DEFAULT_PAGE_SIZE: 10,
PAGE_SIZE_OPTIONS: [10, 20, 50, 100]
}
// 主题配置
export const THEME_CONFIG = {
LIGHT: 'light',
DARK: 'dark'
}
// 语言配置
export const LANGUAGE_CONFIG = {
ZH_CN: 'zh-CN',
EN_US: 'en-US'
}
// 路由配置
export const ROUTE_CONFIG = {
AUTH: {
LOGIN: '/auth/login',
REGISTER: '/auth/register',
RESET_PASSWORD: '/auth/reset'
},
DASHBOARD: '/products',
CERTIFICATION: '/certification',
FINANCE: '/finance',
API: '/api',
PROFILE: '/profile',
ADMIN: '/admin'
}
// 权限配置
export const PERMISSIONS = {
// 用户权限
USER_READ: 'user:read',
USER_WRITE: 'user:write',
USER_DELETE: 'user:delete',
// 认证权限
CERTIFICATION_READ: 'certification:read',
CERTIFICATION_WRITE: 'certification:write',
CERTIFICATION_REVIEW: 'certification:review',
// 财务权限
FINANCE_READ: 'finance:read',
FINANCE_WRITE: 'finance:write',
FINANCE_APPROVE: 'finance:approve',
// API权限
API_READ: 'api:read',
API_WRITE: 'api:write',
API_DELETE: 'api:delete',
// 系统权限
SYSTEM_READ: 'system:read',
SYSTEM_WRITE: 'system:write',
SYSTEM_ADMIN: 'system:admin'
}
// 错误码配置
export const ERROR_CODES = {
// 通用错误
UNKNOWN_ERROR: 'UNKNOWN_ERROR',
NETWORK_ERROR: 'NETWORK_ERROR',
TIMEOUT_ERROR: 'TIMEOUT_ERROR',
// 认证错误
UNAUTHORIZED: 'UNAUTHORIZED',
FORBIDDEN: 'FORBIDDEN',
TOKEN_EXPIRED: 'TOKEN_EXPIRED',
INVALID_CREDENTIALS: 'INVALID_CREDENTIALS',
// 业务错误
VALIDATION_ERROR: 'VALIDATION_ERROR',
RESOURCE_NOT_FOUND: 'RESOURCE_NOT_FOUND',
RESOURCE_ALREADY_EXISTS: 'RESOURCE_ALREADY_EXISTS',
OPERATION_FAILED: 'OPERATION_FAILED',
// 用户相关错误
USER_NOT_FOUND: 'USER_NOT_FOUND',
USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS',
INVALID_PHONE: 'INVALID_PHONE',
INVALID_CODE: 'INVALID_CODE',
CODE_EXPIRED: 'CODE_EXPIRED',
// 认证相关错误
CERTIFICATION_NOT_FOUND: 'CERTIFICATION_NOT_FOUND',
CERTIFICATION_ALREADY_EXISTS: 'CERTIFICATION_ALREADY_EXISTS',
CERTIFICATION_IN_PROGRESS: 'CERTIFICATION_IN_PROGRESS',
// 财务相关错误
INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',
TRANSACTION_FAILED: 'TRANSACTION_FAILED',
WALLET_NOT_FOUND: 'WALLET_NOT_FOUND'
}
// 本地存储键名
export const STORAGE_KEYS = {
TOKEN: 'token',
USER_INFO: 'user_info',
THEME: 'theme',
LANGUAGE: 'language',
SIDEBAR_COLLAPSED: 'sidebar_collapsed',
NOTIFICATIONS: 'notifications'
}
// 正则表达式
export const REGEX = {
PHONE: /^1[3-9]\d{9}$/,
EMAIL: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
ID_CARD: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
PASSWORD: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$/,
VERIFY_CODE: /^\d{6}$/
}
// 时间格式
export const DATE_FORMATS = {
DATE: 'YYYY-MM-DD',
DATETIME: 'YYYY-MM-DD HH:mm:ss',
TIME: 'HH:mm:ss',
MONTH: 'YYYY-MM',
YEAR: 'YYYY'
}
// 响应式断点
export const BREAKPOINTS = {
XS: 480,
SM: 768,
MD: 1024,
LG: 1280,
XL: 1440,
XXL: 1920
}

179
src/constants/menu.js Normal file
View File

@@ -0,0 +1,179 @@
import {
ChartBarIcon as ChartBar,
ChartPieIcon as ChartPie,
ClipboardDocumentListIcon as Clipboard,
CreditCardIcon as CreditCard,
CubeIcon as Cube,
DocumentTextIcon as DocumentText,
PresentationChartLineIcon as PresentationChartLine,
Cog6ToothIcon as Setting,
ShieldCheckIcon as ShieldCheck,
ShoppingCartIcon as ShoppingCart,
TagIcon as Tag,
UserIcon as User,
UserGroupIcon as Users,
WalletIcon as Wallet
} from '@heroicons/vue/24/outline'
// 用户菜单配置(分组结构)
export const userMenuItems = [
{
group: '数据中心',
icon: ChartBar,
children: [
{ name: '仪表盘', path: '/dashboard', icon: PresentationChartLine },
{ name: '数据大厅', path: '/products', icon: Cube },
{ name: '我的订阅', path: '/subscriptions', icon: ShoppingCart }
]
},
{
group: '账户中心',
icon: User,
children: [
{ name: '账户中心', path: '/profile', icon: User },
{ name: '企业入驻', path: '/profile/certification', icon: ShieldCheck }
]
},
{
group: '财务管理',
icon: Wallet,
children: [
{ name: '余额充值', path: '/finance/wallet', icon: CreditCard, requiresCertification: true },
{ name: '充值记录', path: '/finance/recharge-records', icon: CreditCard, requiresCertification: true },
{ name: '消费记录', path: '/finance/transactions', icon: Clipboard, requiresCertification: true },
{ name: '发票申请', path: '/finance/invoice', icon: Wallet, requiresCertification: true }
]
},
{
group: '开发者中心',
icon: Setting,
children: [
// { name: 'API管理', path: '/api/management', icon: Key },
{ name: '在线调试', path: '/apis/debugger', icon: Clipboard, requiresCertification: true },
{ name: '调用记录', path: '/apis/usage', icon: Clipboard, requiresCertification: true },
{ name: '白名单管理', path: '/apis/whitelist', icon: ShieldCheck, requiresCertification: true }
]
}
]
// 管理员菜单配置
export const adminMenuItems = [
{
name: '产品管理',
path: '/admin/products',
icon: Cube
},
{
name: '分类管理',
path: '/admin/categories',
icon: Tag
},
{
name: '订阅管理',
path: '/admin/subscriptions',
icon: ShoppingCart
},
{
name: '用户管理',
path: '/admin/users',
icon: Users
},
{
name: '文章管理',
path: '/admin/articles',
icon: DocumentText
},
{
name: '系统统计',
path: '/admin/statistics',
icon: ChartPie
}
]
// 新增:根据用户类型动态生成菜单
export const getMenuItems = (userType = 'user') => {
if (userType === 'admin') {
return adminMenuItems
}
return userMenuItems
}
// 新增:获取用户可访问的菜单项(包含管理员菜单)
export const getUserAccessibleMenuItems = (userType = 'user') => {
const baseMenuItems = [...userMenuItems]
// 如果是管理员,添加管理员菜单组
if (userType === 'admin') {
baseMenuItems.push({
group: '管理后台',
icon: Setting,
children: [
{ name: '系统统计', path: '/admin/statistics', icon: ChartBar },
{ name: '产品管理', path: '/admin/products', icon: Cube },
{ name: '用户管理', path: '/admin/users', icon: Users },
{ name: '分类管理', path: '/admin/categories', icon: Tag },
{ name: '订阅管理', path: '/admin/subscriptions', icon: ShoppingCart },
{ name: '文章管理', path: '/admin/articles', icon: DocumentText },
{ name: '调用记录', path: '/admin/usage', icon: Clipboard },
{ name: '消费记录', path: '/admin/transactions', icon: Clipboard },
{ name: '充值记录', path: '/admin/recharge-records', icon: CreditCard },
{ name: '发票管理', path: '/admin/invoices', icon: Wallet }
]
})
}
return baseMenuItems
}
// 需要企业认证的页面路径列表
export const requiresCertificationPaths = [
'/finance/wallet',
'/finance/recharge-records',
'/finance/transactions',
'/apis/usage',
'/apis/whitelist'
]
// 检查页面是否需要企业认证
export const isPageRequiresCertification = (path) => {
return requiresCertificationPaths.includes(path)
}
// 获取当前页面的认证配置
export const getCurrentPageCertificationConfig = (path) => {
// 检查是否在需要认证的路径列表中
const requiresCert = isPageRequiresCertification(path)
if (!requiresCert) {
return null
}
// 根据路径获取页面信息
const pageConfig = {
'/finance/wallet': {
title: '钱包充值',
description: '为了享受完整的充值服务,请先完成企业入驻认证。认证成功后我们将赠送您一定的调用额度!'
},
'/finance/recharge-records': {
title: '充值记录',
description: '为了查看完整的充值记录,请先完成企业入驻认证。认证成功后我们将赠送您一定的调用额度!'
},
'/finance/transactions': {
title: '消费记录',
description: '为了查看完整的消费记录,请先完成企业入驻认证。认证成功后我们将赠送您一定的调用额度!'
},
'/apis/usage': {
title: 'API调用记录',
description: '为了查看完整的API调用记录请先完成企业入驻认证。认证成功后我们将赠送您一定的调用额度'
},
'/apis/whitelist': {
title: '白名单管理',
description: '为了管理API访问白名单请先完成企业入驻认证。认证成功后我们将赠送您一定的调用额度'
}
}
return {
requiresCertification: true,
...pageConfig[path]
}
}