测试暂未发现问题

This commit is contained in:
ChoChoX
2026-06-25 21:49:55 +08:00
parent 5cd569797c
commit 984d5b8118
26 changed files with 2414 additions and 636 deletions

View File

@@ -1,41 +1,26 @@
import axios from 'axios'
import { mockContractAPI } from './mock/contract'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
import request from './request'
// 获取合同列表
export const getContractList = (params) => {
if (USE_MOCK) return mockContractAPI.getList(params)
return request.get('/contracts', { params }).then(r => r.data)
return request.get('/contracts', { params })
}
// 获取合同详情
export const getContractDetail = (id) => {
if (USE_MOCK) return mockContractAPI.getDetail(id)
return request.get(`/contracts/${id}`).then(r => r.data)
return request.get(`/contracts/${id}`)
}
// 新增合同
export const createContract = (data) => {
if (USE_MOCK) return mockContractAPI.create(data)
return request.post('/contracts', data).then(r => r.data)
return request.post('/contracts', data)
}
// 更新合同
export const updateContract = (id, data) => {
if (USE_MOCK) return mockContractAPI.update(id, data)
return request.put(`/contracts/${id}`, data).then(r => r.data)
return request.put(`/contracts/${id}`, data)
}
// 删除合同
export const deleteContractAPI = (id) => {
if (USE_MOCK) return mockContractAPI.delete(id)
return request.delete(`/contracts/${id}`).then(r => r.data)
return request.delete(`/contracts/${id}`)
}

View File

@@ -1,41 +1,26 @@
import axios from 'axios'
import { mockCustomerAPI } from './mock/customer'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
import request from './request'
// 获取客户列表
export const getCustomerList = (params) => {
if (USE_MOCK) return mockCustomerAPI.getList(params)
return request.get('/customers', { params }).then(r => r.data)
export const getCustomerList = (params, config) => {
return request.get('/customers', { params, ...config })
}
// 获取客户详情
export const getCustomerDetail = (id) => {
if (USE_MOCK) return mockCustomerAPI.getDetail(id)
return request.get(`/customers/${id}`).then(r => r.data)
return request.get(`/customers/${id}`)
}
// 新增客户
export const createCustomer = (data) => {
if (USE_MOCK) return mockCustomerAPI.create(data)
return request.post('/customers', data).then(r => r.data)
return request.post('/customers', data)
}
// 更新客户
export const updateCustomer = (id, data) => {
if (USE_MOCK) return mockCustomerAPI.update(id, data)
return request.put(`/customers/${id}`, data).then(r => r.data)
return request.put(`/customers/${id}`, data)
}
// 删除客户
export const deleteCustomerAPI = (id) => {
if (USE_MOCK) return mockCustomerAPI.delete(id)
return request.delete(`/customers/${id}`).then(r => r.data)
return request.delete(`/customers/${id}`)
}

View File

@@ -1,41 +1,31 @@
import axios from 'axios'
import { mockEmployeeAPI } from './mock/employee'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
import request from './request'
// 获取员工列表
export const getEmployeeList = (params) => {
if (USE_MOCK) return mockEmployeeAPI.getList(params)
return request.get('/employees', { params }).then(r => r.data)
export const getEmployeeList = (params, config) => {
return request.get('/employees', { params, ...config })
}
// 获取简易员工列表(无数据范围限制,支持按部门过滤)
export const getSimpleEmployeeList = (params, config) => {
return request.get('/employees/simple', { params, ...config })
}
// 获取员工详情
export const getEmployeeDetail = (id) => {
if (USE_MOCK) return mockEmployeeAPI.getDetail(id)
return request.get(`/employees/${id}`).then(r => r.data)
return request.get(`/employees/${id}`)
}
// 新增员工
export const createEmployee = (data) => {
if (USE_MOCK) return mockEmployeeAPI.create(data)
return request.post('/employees', data).then(r => r.data)
return request.post('/employees', data)
}
// 更新员工
export const updateEmployee = (id, data) => {
if (USE_MOCK) return mockEmployeeAPI.update(id, data)
return request.put(`/employees/${id}`, data).then(r => r.data)
return request.put(`/employees/${id}`, data)
}
// 删除员工
export const deleteEmployeeAPI = (id) => {
if (USE_MOCK) return mockEmployeeAPI.delete(id)
return request.delete(`/employees/${id}`).then(r => r.data)
return request.delete(`/employees/${id}`)
}

View File

@@ -2,7 +2,6 @@
const mockContracts = [
{
id: 1,
contract_no: 'HT-2025-001',
contract_name: '蜜雪冰城加盟合同',
type: '加盟合同',
party_a: '蜜雪冰城股份有限公司',
@@ -17,7 +16,6 @@ const mockContracts = [
},
{
id: 2,
contract_no: 'HT-2025-002',
contract_name: '原材料供货合同',
type: '供货合同',
party_a: '蜜雪冰城股份有限公司',
@@ -32,7 +30,6 @@ const mockContracts = [
},
{
id: 3,
contract_no: 'HT-2024-010',
contract_name: '门店租赁合同',
type: '租赁合同',
party_a: '蜜雪冰城股份有限公司',
@@ -47,7 +44,6 @@ const mockContracts = [
},
{
id: 4,
contract_no: 'HT-2025-003',
contract_name: '设备维护服务合同',
type: '服务合同',
party_a: '蜜雪冰城股份有限公司',
@@ -76,7 +72,7 @@ export const mockContractAPI = {
if (params.keyword) {
const keyword = params.keyword.toLowerCase()
result = result.filter(item =>
item.contract_no.toLowerCase().includes(keyword) ||
String(item.id).includes(keyword) ||
item.contract_name.toLowerCase().includes(keyword) ||
item.party_b.toLowerCase().includes(keyword)
)

View File

@@ -9,7 +9,6 @@ const mockCustomers = [
district: '南山区',
address: '科技园路1号',
email: 'zhangsan@example.com',
customer_type: 'VIP',
create_time: '2025-01-15 10:30:00'
},
{
@@ -21,7 +20,6 @@ const mockCustomers = [
district: '西湖区',
address: '文三路100号',
email: 'lisi@example.com',
customer_type: 'Normal',
create_time: '2025-02-20 14:20:00'
},
{
@@ -33,7 +31,6 @@ const mockCustomers = [
district: '武侯区',
address: '天府大道200号',
email: 'wangwu@example.com',
customer_type: 'VIP',
create_time: '2025-03-10 09:15:00'
},
{
@@ -45,7 +42,6 @@ const mockCustomers = [
district: '岳麓区',
address: '麓山南路100号',
email: 'zhaoliu@example.com',
customer_type: 'Normal',
create_time: '2025-04-05 16:45:00'
}
]
@@ -88,11 +84,6 @@ export const mockCustomerAPI = {
}
}
// 客户类型筛选
if (params.customer_type) {
result = result.filter(item => item.customer_type === params.customer_type)
}
// 地区筛选(省/市/区)
if (params.province) {
result = result.filter(item => item.province === params.province)

View File

@@ -1,5 +1,5 @@
// 模拟员工数据
const mockEmployees = [
// 模拟员工数据(单一数据源,同时包含用户字段)
export const mockEmployees = [
{
id: 1,
name: '张伟',
@@ -14,6 +14,11 @@ const mockEmployees = [
email: 'zhangwei@mxbc.com',
status: 1,
remark: '负责门店日常运营',
// 用户字段
username: 'zhangwei',
password: '123456',
user_type: 'admin',
user_status: '1',
created_at: '2023-03-15 09:00:00',
updated_at: '2023-03-15 09:00:00'
},
@@ -31,6 +36,11 @@ const mockEmployees = [
email: 'lina@mxbc.com',
status: 1,
remark: '',
// 用户字段
username: 'lina',
password: '123456',
user_type: 'user',
user_status: '1',
created_at: '2023-06-01 09:00:00',
updated_at: '2023-06-01 09:00:00'
},
@@ -48,6 +58,11 @@ const mockEmployees = [
email: 'wangqiang@mxbc.com',
status: 1,
remark: '负责系统架构设计',
// 用户字段(无用户账号)
username: null,
password: null,
user_type: null,
user_status: null,
created_at: '2022-11-10 09:00:00',
updated_at: '2022-11-10 09:00:00'
},
@@ -65,6 +80,11 @@ const mockEmployees = [
email: 'liuyang@mxbc.com',
status: 0,
remark: '已离职',
// 用户字段(无用户账号)
username: null,
password: null,
user_type: null,
user_status: null,
created_at: '2024-01-20 09:00:00',
updated_at: '2025-03-01 17:00:00'
},
@@ -82,6 +102,11 @@ const mockEmployees = [
email: 'zhaomin@mxbc.com',
status: 1,
remark: '',
// 用户字段
username: 'zhaomin',
password: '123456',
user_type: 'user',
user_status: '0',
created_at: '2023-09-05 09:00:00',
updated_at: '2023-09-05 09:00:00'
},
@@ -99,6 +124,11 @@ const mockEmployees = [
email: 'chengang@mxbc.com',
status: 1,
remark: '负责原料入库出库',
// 用户字段(无用户账号)
username: null,
password: null,
user_type: null,
user_status: null,
created_at: '2022-04-12 09:00:00',
updated_at: '2022-04-12 09:00:00'
}
@@ -169,6 +199,11 @@ export const mockEmployeeAPI = {
id: maxId + 1,
status: 1,
...data,
// 用户字段初始为空
username: null,
password: null,
user_type: null,
user_status: null,
created_at: now,
updated_at: now
}

View File

@@ -1,61 +1,26 @@
// 模拟用户数据
const mockUsers = [
{
id: 1,
username: 'admin',
password: '123456',
name: '系统管理员',
user_type: 'admin',
status: '1',
createdate: '2025-01-10 08:00:00'
},
{
id: 2,
username: 'zhangsan',
password: '123456',
name: '张三',
user_type: 'user',
status: '1',
createdate: '2025-02-15 10:30:00'
},
{
id: 3,
username: 'lisi',
password: '123456',
name: '李四',
user_type: 'user',
status: '0',
createdate: '2025-03-20 14:00:00'
},
{
id: 4,
username: 'wangwu',
password: '123456',
name: '王五',
user_type: 'admin',
status: '1',
createdate: '2025-04-05 09:15:00'
},
{
id: 5,
username: 'zhaoliu',
password: '123456',
name: '赵六',
user_type: 'user',
status: '0',
createdate: '2025-05-10 16:45:00'
}
]
import { mockEmployees } from './employee'
// 模拟网络延迟
const delay = (ms = 300) => new Promise(r => setTimeout(r, ms))
// Mock API
// 将员工记录转换为用户格式(字段名映射)
const toUserFormat = (employee) => ({
id: employee.id,
username: employee.username,
name: employee.name,
user_type: employee.user_type,
status: employee.user_status,
employee_id: employee.id,
createdate: employee.created_at
})
// Mock API操作同一数据源 mockEmployees
export const mockUserAPI = {
// 获取列表
// 获取用户列表(返回有用户账号的员工记录)
async getList(params = {}) {
await delay()
let result = [...mockUsers]
// 筛选有用户名的记录(即已创建用户的员工)
let result = mockEmployees.filter(item => item.username).map(toUserFormat)
// 关键词搜索
if (params.keyword) {
@@ -67,16 +32,15 @@ export const mockUserAPI = {
result = result.filter(item => String(item.id) === keyword)
} else if (searchField === '1') {
// 用户名:模糊匹配
result = result.filter(item => item.username.includes(keyword))
result = result.filter(item => item.username && item.username.includes(keyword))
} else if (searchField === '3') {
// 真实姓名:模糊匹配
result = result.filter(item => item.name.includes(keyword))
result = result.filter(item => item.name.toLowerCase().includes(keyword))
} else {
// 默认:模糊匹配所有字段
result = result.filter(item =>
String(item.id).includes(keyword) ||
item.username.includes(keyword) ||
item.name.includes(keyword)
(item.username && item.username.includes(keyword)) ||
item.name.toLowerCase().includes(keyword)
)
}
}
@@ -94,47 +58,80 @@ export const mockUserAPI = {
return { code: 200, data: result, total: result.length }
},
// 获取详情
// 获取用户详情
async getDetail(id) {
await delay()
const user = mockUsers.find(item => item.id === id)
if (user) {
return { code: 200, data: user }
const employee = mockEmployees.find(item => item.id === id && item.username)
if (employee) {
return { code: 200, data: toUserFormat(employee) }
}
return { code: 404, message: '用户不存在' }
},
// 新增
// 创建用户(实际上是更新已有员工记录,添加用户字段)
async create(data) {
await delay()
const maxId = mockUsers.length > 0 ? Math.max(...mockUsers.map(item => item.id)) : 0
const newUser = {
id: maxId + 1,
...data,
createdate: new Date().toISOString().replace('T', ' ').slice(0, 19)
// 查找对应的员工记录
const employeeIndex = mockEmployees.findIndex(item => item.id === data.id || item.id === data.employee_id)
if (employeeIndex === -1) {
return { code: 404, message: '关联员工不存在' }
}
mockUsers.push(newUser)
return { code: 200, data: newUser, message: '新增成功' }
// 检查是否已有用户账号
if (mockEmployees[employeeIndex].username) {
return { code: 400, message: '该员工已有用户账号' }
}
// 更新员工记录,添加用户字段
mockEmployees[employeeIndex] = {
...mockEmployees[employeeIndex],
username: data.username,
password: data.password,
user_type: data.user_type || 'user',
user_status: data.status || '1',
updated_at: new Date().toISOString().replace('T', ' ').slice(0, 19)
}
return { code: 200, data: toUserFormat(mockEmployees[employeeIndex]), message: '用户创建成功' }
},
// 更新
// 更新用户(更新用户字段)
async update(id, data) {
await delay()
const index = mockUsers.findIndex(item => item.id === id)
const index = mockEmployees.findIndex(item => item.id === id && item.username)
if (index !== -1) {
mockUsers[index] = { ...mockUsers[index], ...data }
return { code: 200, data: mockUsers[index], message: '更新成功' }
// 只更新用户相关字段
const updateFields = {}
if (data.username !== undefined) updateFields.username = data.username
if (data.password !== undefined) updateFields.password = data.password
if (data.user_type !== undefined) updateFields.user_type = data.user_type
if (data.status !== undefined) updateFields.user_status = data.status
mockEmployees[index] = {
...mockEmployees[index],
...updateFields,
updated_at: new Date().toISOString().replace('T', ' ').slice(0, 19)
}
return { code: 200, data: toUserFormat(mockEmployees[index]), message: '更新成功' }
}
return { code: 404, message: '用户不存在' }
},
// 删除
// 删除用户(清除用户字段,保留员工记录)
async delete(id) {
await delay()
const index = mockUsers.findIndex(item => item.id === id)
const index = mockEmployees.findIndex(item => item.id === id && item.username)
if (index !== -1) {
mockUsers.splice(index, 1)
return { code: 200, message: '删除成功' }
// 清除用户字段,而不是删除记录
mockEmployees[index] = {
...mockEmployees[index],
username: null,
password: null,
user_type: null,
user_status: null,
updated_at: new Date().toISOString().replace('T', ' ').slice(0, 19)
}
return { code: 200, message: '用户已删除' }
}
return { code: 404, message: '用户不存在' }
}

View File

@@ -1,41 +1,26 @@
import axios from 'axios'
import { mockProductsAPI } from './mock/products'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
import request from './request'
// 获取产品列表
export const getProductsList = (params) => {
if (USE_MOCK) return mockProductsAPI.getList(params)
return request.get('/products', { params }).then(r => r.data)
return request.get('/products', { params })
}
// 获取产品详情
export const getProductsDetail = (id) => {
if (USE_MOCK) return mockProductsAPI.getDetail(id)
return request.get(`/products/${id}`).then(r => r.data)
return request.get(`/products/${id}`)
}
// 新增产品
export const createProducts = (data) => {
if (USE_MOCK) return mockProductsAPI.create(data)
return request.post('/products', data).then(r => r.data)
return request.post('/products', data)
}
// 更新产品
export const updateProducts = (id, data) => {
if (USE_MOCK) return mockProductsAPI.update(id, data)
return request.put(`/products/${id}`, data).then(r => r.data)
return request.put(`/products/${id}`, data)
}
// 删除产品
export const deleteProductsAPI = (id) => {
if (USE_MOCK) return mockProductsAPI.delete(id)
return request.delete(`/products/${id}`).then(r => r.data)
return request.delete(`/products/${id}`)
}

53
src/api/request.js Normal file
View File

@@ -0,0 +1,53 @@
import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '../router'
// 创建 axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 10000
})
// 请求拦截器:自动添加 token
request.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
},
(error) => {
return Promise.reject(error)
}
)
// 响应拦截器统一处理错误config.quiet = true 时不弹窗)
request.interceptors.response.use(
(response) => {
return response.data
},
(error) => {
const status = error.response?.status
const message = error.response?.data?.message || '请求失败'
const quiet = error.config?.quiet
const isLogin = error.config?.url?.includes('/user/login')
if (!quiet) {
if (status === 401) {
localStorage.removeItem('token')
localStorage.removeItem('userInfo')
router.push('/login')
ElMessage.error('登录已过期,请重新登录')
} else if (status === 403 && !isLogin) {
ElMessage.error('权限不足')
} else {
ElMessage.error(message)
}
}
return Promise.reject(error)
}
)
export default request

View File

@@ -1,41 +1,26 @@
import axios from 'axios'
import { mockServiceAPI } from './mock/service'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
import request from './request'
// 获取售后列表
export const getServiceList = (params) => {
if (USE_MOCK) return mockServiceAPI.getList(params)
return request.get('/after-sales', { params }).then(r => r.data)
return request.get('/after-sales', { params })
}
// 获取售后详情
export const getServiceDetail = (id) => {
if (USE_MOCK) return mockServiceAPI.getDetail(id)
return request.get(`/after-sales/${id}`).then(r => r.data)
return request.get(`/after-sales/${id}`)
}
// 新增售后
export const createService = (data) => {
if (USE_MOCK) return mockServiceAPI.create(data)
return request.post('/after-sales', data).then(r => r.data)
return request.post('/after-sales', data)
}
// 更新售后
export const updateService = (id, data) => {
if (USE_MOCK) return mockServiceAPI.update(id, data)
return request.put(`/after-sales/${id}`, data).then(r => r.data)
return request.put(`/after-sales/${id}`, data)
}
// 删除售后
export const deleteServiceAPI = (id) => {
if (USE_MOCK) return mockServiceAPI.delete(id)
return request.delete(`/after-sales/${id}`).then(r => r.data)
return request.delete(`/after-sales/${id}`)
}

26
src/api/suppliers.js Normal file
View File

@@ -0,0 +1,26 @@
import request from './request'
// 获取供应商列表
export const getSupplierList = (params, config) => {
return request.get('/suppliers', { params, ...config })
}
// 获取供应商详情
export const getSupplierDetail = (id) => {
return request.get(`/suppliers/${id}`)
}
// 新增供应商
export const createSupplier = (data) => {
return request.post('/suppliers', data)
}
// 更新供应商
export const updateSupplier = (id, data) => {
return request.put(`/suppliers/${id}`, data)
}
// 删除供应商
export const deleteSupplierAPI = (id) => {
return request.delete(`/suppliers/${id}`)
}

View File

@@ -1,41 +1,31 @@
import axios from 'axios'
import { mockUserAPI } from './mock/user'
import request from './request'
// 开关true 用 mockfalse 用真实接口
const USE_MOCK = true
// 获取用户列表(管理员)
export const getUserList = (params, config) => {
return request.get('/users', { params, ...config })
}
// axios 实例
const request = axios.create({
baseURL: '/api',
timeout: 5000
})
// 获取用户列表
export const getUserList = (params) => {
if (USE_MOCK) return mockUserAPI.getList(params)
return request.get('/users', { params }).then(r => r.data)
// 获取简易用户列表(用于下拉选择,仅需登录)
export const getSimpleUserList = (config) => {
return request.get('/user/list', config)
}
// 获取用户详情
export const getUserDetail = (id) => {
if (USE_MOCK) return mockUserAPI.getDetail(id)
return request.get(`/users/${id}`).then(r => r.data)
return request.get(`/users/${id}`)
}
// 新增用户
// 创建用户
export const createUser = (data) => {
if (USE_MOCK) return mockUserAPI.create(data)
return request.post('/users', data).then(r => r.data)
return request.post('/users', data)
}
// 更新用户
export const updateUser = (id, data) => {
if (USE_MOCK) return mockUserAPI.update(id, data)
return request.put(`/users/${id}`, data).then(r => r.data)
return request.put(`/users/${id}`, data)
}
// 删除用户
export const deleteUserAPI = (id) => {
if (USE_MOCK) return mockUserAPI.delete(id)
return request.delete(`/users/${id}`).then(r => r.data)
return request.delete(`/users/${id}`)
}