init: F9智慧缫丝系统 - 后端(server) + 主前端(web) + 打印设计器(openprint) 首次提交

This commit is contained in:
2026-08-15 15:37:25 +08:00
commit 7235265749
294 changed files with 59182 additions and 0 deletions
+54
View File
@@ -0,0 +1,54 @@
import request from './request'
// ========== 认证 ==========
export const login = (data) => request.post('/auth/login', data)
export const getMe = () => request.get('/auth/me')
export const changePassword = (data) => request.post('/auth/change-password', data)
// ========== 天气 ==========
export const getWeather = (params) => request.get('/weather/now', { params })
// 天气码 → 中文描述(Open-Meteo WMO Weather interpretation codes
const WEATHER_CODES = {
0: '晴', 1: '晴', 2: '多云', 3: '阴', 45: '雾', 48: '雾凇',
51: '毛毛雨', 53: '小雨', 55: '中雨', 56: '冻雨', 57: '强冻雨',
61: '小雨', 63: '中雨', 65: '大雨', 66: '冻雨', 67: '强冻雨',
71: '小雪', 73: '中雪', 75: '大雪', 77: '雪粒',
80: '阵雨', 81: '强阵雨', 82: '暴雨', 85: '阵雪', 86: '强阵雪',
95: '雷暴', 96: '雷暴伴冰雹', 99: '强雷暴伴冰雹'
}
/** 天气接口原始数据 → 前端展示字段 */
export function mapWeather(data) {
if (!data) return null
return {
temp: Math.round(data.temperature ?? 0),
desc: WEATHER_CODES[data.weatherCode] || '未知',
wind: `风速 ${data.windSpeed ?? 0}m/s`,
humidity: data.humidity,
location: '缫丝厂区'
}
}
// ========== 表元数据 ==========
export const getTableMeta = (table) => request.get(`/meta/table/${table}`)
// 关联表下拉数据 [{value,label}]
export const getRefs = (table, params) => request.get(`/meta/refs/${table}`, { params })
// 业务编号自动生成(如 YLZ20260815-001
export const genCode = (table, field) => request.post(`/meta/gencode/${table}/${field}`)
// ========== 动态 CRUD ==========
export const crudPage = (table, data) => request.post(`/data/${table}/page`, data)
export const crudGet = (table, id) => request.get(`/data/${table}/${id}`)
export const crudAdd = (table, data) => request.post(`/data/${table}/add`, data)
export const crudUpdate = (table, data) => request.post(`/data/${table}/update`, data)
export const crudDelete = (table, id) => request.post(`/data/${table}/delete/${id}`)
export const crudDeleteRange = (table, ids) => request.post(`/data/${table}/deleteRange`, ids)
export const crudAll = (table) => request.get(`/data/${table}/all`)
// ========== 菜单/基础数据 ==========
export const getMenus = () => request.get('/basesys/menus')
// ========== 工作台 ==========
// 工作台聚合数据:统计卡 + 趋势 + 占比 + 待办 + 预警
export const getWorkBenchSummary = () => request.get('/workbench/summary')
+59
View File
@@ -0,0 +1,59 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'
// 创建 axios 实例
const service = axios.create({
baseURL: '/api',
timeout: 30000
})
// 请求拦截器:附加 token
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) => {
const res = response.data
// 非 ApiResult 结构(如文件流)直接返回
if (res === null || typeof res !== 'object' || !('code' in res)) {
return res
}
if (res.code !== 0) {
if (res.code === 401) {
const userStore = useUserStore()
userStore.logout()
router.push('/login')
ElMessage.error('登录已过期,请重新登录')
} else {
ElMessage.error(res.message || '请求失败')
}
return Promise.reject(new Error(res.message || '请求失败'))
}
return res
},
(error) => {
const status = error.response?.status
if (status === 401) {
const userStore = useUserStore()
userStore.logout()
router.push('/login')
ElMessage.error('登录已过期,请重新登录')
} else {
ElMessage.error(error.response?.data?.message || error.message || '网络错误')
}
return Promise.reject(error)
}
)
export default service