From 4ff3e9204952b55314917bdd4464bdbabdfa9fb7 Mon Sep 17 00:00:00 2001 From: Ironsp <1522278303@qq.com> Date: Wed, 23 Sep 2026 10:52:28 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E6=8E=A5=E5=8F=A3api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 ++ package.json | 2 +- src/api/device/index.ts | 53 +++++++++++++ src/api/home/index.ts | 0 src/api/report/index.ts | 98 +++++++++++++++++++++++++ src/api/request.ts | 35 ++------- src/api/types.ts | 20 +++++ src/components/report/detailMetrics.vue | 8 +- src/env.d.ts | 8 ++ 9 files changed, 198 insertions(+), 33 deletions(-) create mode 100644 src/api/device/index.ts delete mode 100644 src/api/home/index.ts create mode 100644 src/api/report/index.ts create mode 100644 src/api/types.ts diff --git a/.gitignore b/.gitignore index 8a9f9a2..da39b17 100644 --- a/.gitignore +++ b/.gitignore @@ -6,12 +6,19 @@ yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* +doc node_modules .DS_Store dist *.local .omo +.clinerules +CLAUDE.md +.github +.vscode +.claude +.rtk # Editor directories and files .idea diff --git a/package.json b/package.json index 659b7ae..c0527cd 100644 --- a/package.json +++ b/package.json @@ -90,6 +90,6 @@ "pre-commit": "pnpm lint-staged" }, "lint-staged": { - "*": "eslint --fix" + "*.{js,jsx,ts,tsx,mjs,cjs,mts,cts,vue}": "eslint --fix" } } diff --git a/src/api/device/index.ts b/src/api/device/index.ts new file mode 100644 index 0000000..dbb01bb --- /dev/null +++ b/src/api/device/index.ts @@ -0,0 +1,53 @@ +import type { ApiResult, AuthStatus } from '../types' +import { request } from '../request' + +export interface DeviceAuthStatus { + deviceId: string + deviceName: string + authStatus: AuthStatus | string + startDate: string + endDate: string + remainingDays: number +} + +export interface ActivateDeviceResult extends ApiResult { + endDate: string + deviceId: string +} + +export interface RenewDeviceParams { + activationCode: string + deviceId: string +} + +export interface RenewDeviceResult extends ApiResult { + endDate: string + deviceId: string +} + +/** POST /api/device/activate 激活设备 */ +export function activateDevice(params: { activationCode?: string, deviceId?: string }) { + return request({ + url: '/api/device/activate', + method: 'POST', + params, + }) +} + +/** GET /api/device/status 查询设备授权状态 */ +export function getDeviceStatus(deviceId?: string) { + return request>({ + url: '/api/device/status', + method: 'GET', + params: deviceId ? { deviceId } : undefined, + }) +} + +/** POST /api/device/renew 续期 */ +export function renewDevice(data: RenewDeviceParams) { + return request({ + url: '/api/device/renew', + method: 'POST', + data, + }) +} diff --git a/src/api/home/index.ts b/src/api/home/index.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/api/report/index.ts b/src/api/report/index.ts new file mode 100644 index 0000000..3f865a3 --- /dev/null +++ b/src/api/report/index.ts @@ -0,0 +1,98 @@ +import type { ApiResult, PageResult, ReportStatus } from '../types' +import { request } from '../request' + +export interface ReportItem { + reportId: number + reportNo: string + deviceId: string + projectId: number + projectName: string + constructionSection: string + compactArea: number + qualificationRate: number + reportStatus: ReportStatus | string + workStartTime: string + workEndTime: string + workDuration?: number | null + avgAmplitude?: number | null + avgCompaction?: number | null + avgFrequency?: number | null + avgSpeed?: number | null + avgTemperature?: number | null + passCount?: number | null + exceptionCount?: number | null + conclusion?: string | null + filePath?: string | null + generateTime?: string | null + createBy?: string | null + createTime?: string | null + updateBy?: string | null + updateTime?: string | null + remark?: string | null +} + +export interface UploadReportParams { + /** 本地文件路径(uni.uploadFile) */ + filePath: string + deviceId: string + projectId: string + reportNo: string + workStartTime: string + workEndTime: string + compactArea: string + qualificationRate: string + constructionSection: string +} + +/** GET /api/report/list 报告列表 */ +export function getReportList(params?: Record) { + return request>({ + url: '/api/report/list', + method: 'GET', + params, + }) +} + +/** GET /api/report/{reportId} 报告详情 */ +export function getReportDetail(reportId: number | string) { + return request>({ + url: `/api/report/${reportId}`, + method: 'GET', + }) +} + +/** + * POST /api/report/upload 上传报告文件 + * 使用 uni.uploadFile,适用于 App / 小程序本地文件路径 + */ +export function uploadReport(data: UploadReportParams) { + const baseURL = import.meta.env.VITE_API_BASE_URL || 'https://api.example.com' + + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: `${baseURL}/api/report/upload`, + filePath: data.filePath, + name: 'file', + formData: { + deviceId: data.deviceId, + projectId: data.projectId, + reportNo: data.reportNo, + workStartTime: data.workStartTime, + workEndTime: data.workEndTime, + compactArea: data.compactArea, + qualificationRate: data.qualificationRate, + constructionSection: data.constructionSection, + }, + success: (res) => { + try { + const result = typeof res.data === 'string' ? JSON.parse(res.data) : res.data + resolve(result) + } + catch (e) { + reject(e) + } + }, + fail: reject, + }) + }) +} diff --git a/src/api/request.ts b/src/api/request.ts index d9e1a01..fa4e4cf 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -2,47 +2,26 @@ import type { AxiosRequestConfig, AxiosResponse } from 'axios' import { createUniAppAxiosAdapter } from '@uni-helper/axios-adapter' import axios from 'axios' -// 创建自定义实例 const instance = axios.create({ - baseURL: 'https://api.example.com', // 你的基础域名 + baseURL: import.meta.env.VITE_API_BASE_URL || 'https://api.example.com', timeout: 10000, - adapter: createUniAppAxiosAdapter(), // 指定 uniapp 适配器 + adapter: createUniAppAxiosAdapter(), }) -// 请求拦截器(守卫) -instance.interceptors.request.use( - (config) => { - // 例如:在这里统一添加 Token - // const token = uni.getStorageSync('token'); - // if (token) config.headers.Authorization = `Bearer ${token}`; - return config - }, - error => Promise.reject(error), -) - -// 响应拦截器(守卫) instance.interceptors.response.use( (response: AxiosResponse) => { - // 直接返回解包后的 data,这样调用时就不需要写 res.data.data 了 return response.data }, - // (error) => { - // // 统一错误处理 - // uni.showToast({ title: error.message || '请求失败', icon: 'none' }) - // return Promise.reject(error) - // }, (error: any) => { let { message } = error - if (message === 'Network Error') { + if (message === 'Network Error') message = '后端接口连接异常' - } - else if (message.includes('timeout')) { + else if (message?.includes('timeout')) message = '系统接口请求超时' - } - else if (message.includes('Request failed with status code')) { + else if (message?.includes('Request failed with status code')) message = `系统接口${message.substr(message.length - 3)}异常` - } - ElMessage({ message, type: 'error', duration: 5 * 1000 }) + + uni.showToast({ title: message || '请求失败', icon: 'none', duration: 3000 }) return Promise.reject(error) }, ) diff --git a/src/api/types.ts b/src/api/types.ts new file mode 100644 index 0000000..2801876 --- /dev/null +++ b/src/api/types.ts @@ -0,0 +1,20 @@ +/** 通用接口响应 */ +export interface ApiResult { + code: number + msg: string + data?: T +} + +/** 分页列表响应 */ +export interface PageResult { + code: number + msg: string + total: number + rows: T[] +} + +/** 授权状态:0=未激活,1=已激活,2=已过期,3=已禁用 */ +export type AuthStatus = '0' | '1' | '2' | '3' + +/** 报告状态:0=已完成,1=有异常 */ +export type ReportStatus = '0' | '1' diff --git a/src/components/report/detailMetrics.vue b/src/components/report/detailMetrics.vue index 2ae80b4..4014ca9 100644 --- a/src/components/report/detailMetrics.vue +++ b/src/components/report/detailMetrics.vue @@ -23,22 +23,22 @@ defineProps<{ {{ avgSpeed }} - + + 平均摊铺温度 diff --git a/src/env.d.ts b/src/env.d.ts index 11f02fe..17aa348 100644 --- a/src/env.d.ts +++ b/src/env.d.ts @@ -1 +1,9 @@ /// + +interface ImportMetaEnv { + readonly VITE_API_BASE_URL?: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +}