ude.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import axios from 'axios'
  2. import { ElMessage } from 'element-plus'
  3. import { useUserStore } from '@/pinia/modules/user'
  4. import { UDE_SERVER } from '@/config'
  5. // UDE 后端(数据库透明加密 udeServer,go-zero)统一接口封装:
  6. // 所有接口带 /api/v1 前缀、直连返回「裸 JSON」(无 code 包裹),
  7. // 列表接口为分页结构 {list, total}(pageSize 上限 100)。
  8. // 成功由 httpx.OkJsonCtx 返回业务数据,错误由后端 errorHandler 以非 2xx 状态码 +
  9. // {code, msg} 返回。后端地址读 window.APP_CONFIG.UDE_SERVER / VITE_UDE_SERVER。
  10. const service = axios.create({
  11. baseURL: UDE_SERVER,
  12. timeout: 30000
  13. })
  14. // 透传登录态(udeServer 当前未启用 JWT,透传无副作用,便于后续统一鉴权)
  15. service.interceptors.request.use(
  16. config => {
  17. const userStore = useUserStore()
  18. if (userStore.token) {
  19. config.headers['Authorization'] = `Bearer ${userStore.token}`
  20. }
  21. return config
  22. },
  23. error => Promise.reject(error)
  24. )
  25. service.interceptors.response.use(
  26. response => {
  27. // udeServer 当前以 {code, message, data} 嵌套返回(go-zero 默认 SuccessHandler),
  28. // 早期约定 "裸 JSON"(直接 {list,total}/实体),两种都接受:有 code 字段就解一层。
  29. const body = response.data
  30. if (body && typeof body === 'object' && 'code' in body && 'data' in body) {
  31. return body.data
  32. }
  33. return body
  34. },
  35. error => {
  36. const status = error.response?.status
  37. if (status === 401) {
  38. const userStore = useUserStore()
  39. userStore.token = ''
  40. localStorage.clear()
  41. ElMessage({ showClose: true, type: 'error', message: '登录已过期,请重新登录' })
  42. return Promise.reject(error)
  43. }
  44. ElMessage({
  45. showClose: true,
  46. type: 'error',
  47. message: error.response?.data?.msg || error.response?.data?.message || error.message || '网络错误'
  48. })
  49. return Promise.reject(error)
  50. }
  51. )
  52. const BASE = '/api/v1'
  53. const MAX_PAGE_SIZE = 100 // 后端 pagination.go 限制 pageSize 上限
  54. // 分页列表接口拉全量(前端需完整数据做客户端过滤/分页)
  55. async function fetchAll(getPage) {
  56. const out = []
  57. let page = 1
  58. let total = 0
  59. do {
  60. const res = await getPage(page, MAX_PAGE_SIZE)
  61. total = res?.total || 0
  62. out.push(...(res?.list || []))
  63. page++
  64. } while (out.length < total)
  65. return out
  66. }
  67. // ---- 接入服务(t_service)----
  68. export const getServiceList = (page = 1, pageSize = MAX_PAGE_SIZE) =>
  69. service.get(`${BASE}/services`, { params: { page, pageSize }}) // -> {list, total}
  70. export const getAllServices = () => fetchAll(getServiceList) // -> ServiceResp[]
  71. export const createService = data => service.post(`${BASE}/services`, data) // data 无需 id(表自增)
  72. export const updateService = (id, data) => service.put(`${BASE}/services/${id}`, data)
  73. export const deleteService = id => service.delete(`${BASE}/services/${id}`)
  74. // 启用服务联动挂载 / 停用服务联动卸载(服务启用状态开关联动,后端同步更新 status 和 mount_status)
  75. export const mountService = id => service.post(`${BASE}/services/${id}/mount`)
  76. export const unmountService = id => service.post(`${BASE}/services/${id}/unmount`)
  77. // 一键刷库:下发刷库指令,外挂程序启动并同步配置后对保护目录内全量数据做加密处理
  78. export const brushService = id => service.post(`${BASE}/services/${id}/brush`)
  79. // ---- 密钥(t_key,用于「密钥标识」下拉)----
  80. export const getKeyList = (page = 1, pageSize = MAX_PAGE_SIZE) =>
  81. service.post(`${BASE}/keys/list`, { params: { page, pageSize }}) // -> {list, total}
  82. export const getAllKeys = () => fetchAll(getKeyList) // -> KeyResp[]
  83. // ---- 保护目录(t_directory)----
  84. export const getDirectoryList = (page = 1, pageSize = MAX_PAGE_SIZE) =>
  85. service.get(`${BASE}/directories`, { params: { page, pageSize }}) // -> {list, total}
  86. export const getAllDirectories = () => fetchAll(getDirectoryList) // -> DirectoryResp[]
  87. export const createDirectory = data => service.post(`${BASE}/directories`, data) // data 无需 id(表自增),仅 serviceId/directory
  88. export const deleteDirectory = id => service.delete(`${BASE}/directories/${id}`)
  89. // ---- UKey 兼容桩(身份鉴别模板残留,UDE 项目不实际使用) ----
  90. // src/utils/ukey/driver.js 仍被 login / user 页面引用,
  91. // udeServer 不暴露 UKey 配置接口,统一兜底为 longmai,使 driver.js 至少能实例化。
  92. export const getProxyUkey = () => Promise.resolve({ model: 'longmai' })
  93. // 本地目录懒加载(udeServer 所在 Linux 主机文件系统,从根目录 / 开始,只列目录不列文件)
  94. export const getDirChildren = (ip,port,path,iden) =>
  95. service.get(`${BASE}/dirs/children`, { params: { ip: ip,port: port, path: path || '/', iden: iden } })
  96. // 返回: { nodes: [{name, path, isDir, hasChildren}] }