导师列表和导师详情

This commit is contained in:
2026-07-03 11:55:44 +08:00
parent 51be3e5585
commit a1a27073e4
22 changed files with 2007 additions and 346 deletions
+29
View File
@@ -0,0 +1,29 @@
/**
* 图片地址处理工具
* 将后端返回的内部文件路径转为 OSS 公开访问地址
*/
/** OSS 基础地址 */
const OSS_BASE = 'https://jsxq-service-read.oss-cn-shenzhen.aliyuncs.com/uploads/'
/** 后端返回的内部路径前缀 */
const INTERNAL_PREFIX = '/admin/sys-file/jsxq-service-read/uploads/'
/**
* 将后端图片路径转为 OSS 公开地址
* - 空值安全:传入 null / undefined / 空字符串 返回空字符串
* - 如果已经是完整 http(s) 链接则直接返回,不做二次拼接
* - 如果是内部路径则替换为 OSS 地址
*/
export function toOssUrl(path: string | null | undefined): string {
if (!path) return ''
// 已经是完整链接,直接返回
if (path.startsWith('http://') || path.startsWith('https://')) return path
// 内部路径前缀替换
if (path.startsWith(INTERNAL_PREFIX)) {
const filename = path.slice(INTERNAL_PREFIX.length)
return OSS_BASE + filename
}
// 兜底:可能只是文件名,拼上 OSS 基础地址
return OSS_BASE + path
}
+54
View File
@@ -0,0 +1,54 @@
import axios from 'axios'
import type { AxiosResponse } from 'axios'
/**
* 自定义 JSON 解析:将超过安全整数范围的数字转为字符串,避免精度丢失
* 原理:用正则把 JSON 中超长数字(≥16位)加上引号变成字符串再交给 JSON.parse
*/
function parseBigIntJson(text: string): any {
// 匹配 JSON 中独立的长数字(非字符串内的),将 ≥16 位整数用引号包裹
const processed = text.replace(/:\s*(\d{16,})/g, ':"$1"')
return JSON.parse(processed)
}
/**
* 见识星球专用 axios 实例
* 开发环境:走 Vite proxy/jianshi-api → https://api.jianshixingqiu.com)解决跨域
* 生产环境:直接请求 https://api.jianshixingqiu.com
* 接口完全公开,不需要 token 和登录鉴权
*/
const jianshiRequest = axios.create({
baseURL: import.meta.env.VITE_JIANSHI_BASE_URL as string,
timeout: 15000,
// 见识星球接口固定请求头
headers: {
Authorization: 'Bearer f69b5086-97b0-4e5e-b172-453e444d448c',
'TENANT-ID': '1',
'CLIENT-TOC': 'Y',
'Content-Type': 'application/json',
},
// 自定义响应数据转换:防止大数 id 精度丢失
transformResponse: [(data: string) => {
if (!data) return data
try {
return parseBigIntJson(data)
} catch {
return data
}
}],
})
/**
* 响应拦截器
*/
jianshiRequest.interceptors.response.use(
(response: AxiosResponse) => {
return response.data
},
(error) => {
console.error('[见识星球接口错误]', error)
return Promise.reject(error)
},
)
export default jianshiRequest