import axios from 'axios' import { ElMessage } from 'element-plus' import { useUserStore } from '@/pinia/modules/user' import { UDE_SERVER } from '@/config' // UDE 后端(数据库透明加密 udeServer,go-zero)统一接口封装: // 所有接口带 /api/v1 前缀、直连返回「裸 JSON」(无 code 包裹), // 列表接口为分页结构 {list, total}(pageSize 上限 100)。 // 成功由 httpx.OkJsonCtx 返回业务数据,错误由后端 errorHandler 以非 2xx 状态码 + // {code, msg} 返回。后端地址读 window.APP_CONFIG.UDE_SERVER / VITE_UDE_SERVER。 const service = axios.create({ baseURL: UDE_SERVER, timeout: 30000 }) // 透传登录态(udeServer 当前未启用 JWT,透传无副作用,便于后续统一鉴权) service.interceptors.request.use( config => { const userStore = useUserStore() if (userStore.token) { config.headers['Authorization'] = `Bearer ${userStore.token}` } return config }, error => Promise.reject(error) ) service.interceptors.response.use( response => { // udeServer 当前以 {code, message, data} 嵌套返回(go-zero 默认 SuccessHandler), // 早期约定 "裸 JSON"(直接 {list,total}/实体),两种都接受:有 code 字段就解一层。 const body = response.data if (body && typeof body === 'object' && 'code' in body && 'data' in body) { return body.data } return body }, error => { const status = error.response?.status if (status === 401) { const userStore = useUserStore() userStore.token = '' localStorage.clear() ElMessage({ showClose: true, type: 'error', message: '登录已过期,请重新登录' }) return Promise.reject(error) } ElMessage({ showClose: true, type: 'error', message: error.response?.data?.msg || error.response?.data?.message || error.message || '网络错误' }) return Promise.reject(error) } ) const BASE = '/api/v1' const MAX_PAGE_SIZE = 100 // 后端 pagination.go 限制 pageSize 上限 // 分页列表接口拉全量(前端需完整数据做客户端过滤/分页) async function fetchAll(getPage) { const out = [] let page = 1 let total = 0 do { const res = await getPage(page, MAX_PAGE_SIZE) total = res?.total || 0 out.push(...(res?.list || [])) page++ } while (out.length < total) return out } // ---- 接入服务(t_service)---- export const getServiceList = (page = 1, pageSize = MAX_PAGE_SIZE) => service.get(`${BASE}/services`, { params: { page, pageSize }}) // -> {list, total} export const getAllServices = () => fetchAll(getServiceList) // -> ServiceResp[] export const createService = data => service.post(`${BASE}/services`, data) // data 无需 id(表自增) export const updateService = (id, data) => service.put(`${BASE}/services/${id}`, data) export const deleteService = id => service.delete(`${BASE}/services/${id}`) // 启用服务联动挂载 / 停用服务联动卸载(服务启用状态开关联动,后端同步更新 status 和 mount_status) export const mountService = id => service.post(`${BASE}/services/${id}/mount`) export const unmountService = id => service.post(`${BASE}/services/${id}/unmount`) // 一键刷库:下发刷库指令,外挂程序启动并同步配置后对保护目录内全量数据做加密处理 export const brushService = id => service.post(`${BASE}/services/${id}/brush`) // ---- 密钥(t_key,用于「密钥标识」下拉)---- export const getKeyList = (page = 1, pageSize = MAX_PAGE_SIZE) => service.post(`${BASE}/keys/list`, { params: { page, pageSize }}) // -> {list, total} export const getAllKeys = () => fetchAll(getKeyList) // -> KeyResp[] // ---- 保护目录(t_directory)---- export const getDirectoryList = (page = 1, pageSize = MAX_PAGE_SIZE) => service.get(`${BASE}/directories`, { params: { page, pageSize }}) // -> {list, total} export const getAllDirectories = () => fetchAll(getDirectoryList) // -> DirectoryResp[] export const createDirectory = data => service.post(`${BASE}/directories`, data) // data 无需 id(表自增),仅 serviceId/directory export const deleteDirectory = id => service.delete(`${BASE}/directories/${id}`) // ---- UKey 兼容桩(身份鉴别模板残留,UDE 项目不实际使用) ---- // src/utils/ukey/driver.js 仍被 login / user 页面引用, // udeServer 不暴露 UKey 配置接口,统一兜底为 longmai,使 driver.js 至少能实例化。 export const getProxyUkey = () => Promise.resolve({ model: 'longmai' }) // 本地目录懒加载(udeServer 所在 Linux 主机文件系统,从根目录 / 开始,只列目录不列文件) export const getDirChildren = (ip,port,path,iden) => service.get(`${BASE}/dirs/children`, { params: { ip: ip,port: port, path: path || '/', iden: iden } }) // 返回: { nodes: [{name, path, isDir, hasChildren}] }