fix: 修复移动端API路径错误,统一归集到api/index.ts

问题:
- Vue文件中直接使用错误的API路径 /api/v1/xxx
- 导致请求URL重复包含/api/v1,被当作静态资源处理

修复:
1. 重构src/api/index.ts,按模块分类集中定义所有API
   - 用户认证:login, getUserInfo, logout
   - 项目管理:getProjectList, getProjectById
   - 客户管理:getCustomerList
   - 支出管理:createExpense, getExpenseList, getExpenseTypeTree, getTodayExpense
   - 应收款管理:getReceivableList, getUpcomingDueList, getTodayIncome, getUnpaidAmount, getOverdueCount

2. 修复各Vue文件,使用集中的API定义
   - Home.vue: 使用getTodayIncome, getTodayExpense, getUnpaidAmount
   - receivable/List.vue: 使用getReceivableList
   - expense/Add.vue: 使用createExpense, getExpenseTypeTree
   - Login.vue: 使用login

正确的API路径:
- 前端请求: /fund/receipt/receivable/page
- Gateway转发: /api/v1/receipt/receivable/page
This commit is contained in:
zhangjf 2026-02-23 11:18:44 +08:00
parent 610054918a
commit 2e7fb5f5d4
5 changed files with 29 additions and 28 deletions

View File

@ -1,6 +1,7 @@
import request from './request' import request from './request'
// 用户认证 // ===================== 用户认证 =====================
export function login(data: { username: string; password: string }) { export function login(data: { username: string; password: string }) {
return request.post('/auth/login', data) return request.post('/auth/login', data)
} }
@ -13,7 +14,8 @@ export function logout() {
return request.post('/auth/logout') return request.post('/auth/logout')
} }
// 项目管理 // ===================== 项目管理 =====================
export function getProjectList(params?: { pageNum: number; pageSize: number; projectName?: string }) { export function getProjectList(params?: { pageNum: number; pageSize: number; projectName?: string }) {
return request.get('/project/page', { params }) return request.get('/project/page', { params })
} }
@ -22,12 +24,14 @@ export function getProjectById(id: number) {
return request.get(`/project/${id}`) return request.get(`/project/${id}`)
} }
// 客户管理 // ===================== 客户管理 =====================
export function getCustomerList(params?: { pageNum: number; pageSize: number; customerName?: string }) { export function getCustomerList(params?: { pageNum: number; pageSize: number; customerName?: string }) {
return request.get('/customer/page', { params }) return request.get('/customer/page', { params })
} }
// 支出管理 // ===================== 支出管理 =====================
export function createExpense(data: any) { export function createExpense(data: any) {
return request.post('/exp/expense', data) return request.post('/exp/expense', data)
} }
@ -36,7 +40,16 @@ export function getExpenseList(params: { pageNum: number; pageSize: number }) {
return request.get('/exp/expense/page', { params }) return request.get('/exp/expense/page', { params })
} }
// 应收款管理 export function getExpenseTypeTree() {
return request.get('/exp/expense-type/tree')
}
export function getTodayExpense() {
return request.get('/exp/expense/stats/today-expense')
}
// ===================== 应收款管理 =====================
export function getReceivableList(params: { pageNum: number; pageSize: number; status?: string }) { export function getReceivableList(params: { pageNum: number; pageSize: number; status?: string }) {
return request.get('/receipt/receivable/page', { params }) return request.get('/receipt/receivable/page', { params })
} }
@ -45,15 +58,10 @@ export function getUpcomingDueList(daysWithin: number = 7) {
return request.get(`/receipt/receivable/upcoming-due?daysWithin=${daysWithin}`) return request.get(`/receipt/receivable/upcoming-due?daysWithin=${daysWithin}`)
} }
// 统计数据
export function getTodayIncome() { export function getTodayIncome() {
return request.get('/receipt/receivable/stats/today-income') return request.get('/receipt/receivable/stats/today-income')
} }
export function getTodayExpense() {
return request.get('/exp/expense/stats/today-expense')
}
export function getUnpaidAmount() { export function getUnpaidAmount() {
return request.get('/receipt/receivable/stats/unpaid-amount') return request.get('/receipt/receivable/stats/unpaid-amount')
} }
@ -61,8 +69,3 @@ export function getUnpaidAmount() {
export function getOverdueCount() { export function getOverdueCount() {
return request.get('/receipt/receivable/stats/overdue-count') return request.get('/receipt/receivable/stats/overdue-count')
} }
// 支出类型
export function getExpenseTypeTree() {
return request.get('/exp/expense-type/tree')
}

View File

@ -86,7 +86,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, computed, onMounted } from 'vue' import { ref, computed, onMounted } from 'vue'
import request from '@/api/request' import { getTodayIncome, getTodayExpense, getUnpaidAmount } from '@/api'
const summary = ref({ const summary = ref({
todayIncome: 0, todayIncome: 0,
@ -114,9 +114,9 @@ const formatMoney = (value: number) => {
const loadSummary = async () => { const loadSummary = async () => {
try { try {
const [incomeRes, expenseRes, unpaidRes] = await Promise.all([ const [incomeRes, expenseRes, unpaidRes] = await Promise.all([
request.get('/receipt/api/v1/receipt/receivable/stats/today-income'), getTodayIncome(),
request.get('/exp/api/v1/exp/expense/stats/today-expense'), getTodayExpense(),
request.get('/receipt/api/v1/receipt/receivable/stats/unpaid-amount') getUnpaidAmount()
]) ])
summary.value.todayIncome = (incomeRes as any).data || 0 summary.value.todayIncome = (incomeRes as any).data || 0

View File

@ -51,7 +51,7 @@
import { ref, reactive } from 'vue' import { ref, reactive } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { showToast, showSuccessToast } from 'vant' import { showToast, showSuccessToast } from 'vant'
import request from '@/api/request' import { login } from '@/api'
const router = useRouter() const router = useRouter()
const loading = ref(false) const loading = ref(false)
@ -74,7 +74,7 @@ const handleLogin = async () => {
loading.value = true loading.value = true
try { try {
const res: any = await request.post('/auth/login', form) const res: any = await login(form)
const data = res.data const data = res.data
localStorage.setItem('token', data.token) localStorage.setItem('token', data.token)
localStorage.setItem('userInfo', JSON.stringify({ localStorage.setItem('userInfo', JSON.stringify({

View File

@ -70,7 +70,7 @@
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { showToast, showSuccessToast } from 'vant' import { showToast, showSuccessToast } from 'vant'
import request from '@/api/request' import { createExpense, getExpenseTypeTree } from '@/api'
const router = useRouter() const router = useRouter()
const loading = ref(false) const loading = ref(false)
@ -127,7 +127,7 @@ const handleSubmit = async () => {
payeeName: '待填写' payeeName: '待填写'
} }
console.log('提交支出数据:', requestData) console.log('提交支出数据:', requestData)
await request.post('/exp/api/v1/exp/expense', requestData) await createExpense(requestData)
showSuccessToast('提交成功') showSuccessToast('提交成功')
router.back() router.back()
} catch (e: any) { } catch (e: any) {
@ -141,7 +141,7 @@ const handleSubmit = async () => {
onMounted(async () => { onMounted(async () => {
// //
try { try {
const res: any = await request.get('/exp/api/v1/exp/expense-type/tree') const res: any = await getExpenseTypeTree()
const types = res.data || [] const types = res.data || []
typeColumns.value = types.map((t: any) => ({ typeColumns.value = types.map((t: any) => ({
text: t.typeName, text: t.typeName,

View File

@ -43,7 +43,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { showToast } from 'vant' import { showToast } from 'vant'
import request from '@/api/request' import { getReceivableList } from '@/api'
const loading = ref(false) const loading = ref(false)
const refreshing = ref(false) const refreshing = ref(false)
@ -74,9 +74,7 @@ const getStatusName = (status: string) => {
const onLoad = async () => { const onLoad = async () => {
try { try {
const res: any = await request.get('/receipt/api/v1/receipt/receivable/page', { const res: any = await getReceivableList({ pageNum: pageNum.value, pageSize })
params: { pageNum: pageNum.value, pageSize }
})
const records = res.data?.records || [] const records = res.data?.records || []
list.value.push(...records) list.value.push(...records)
loading.value = false loading.value = false