From 297ea8e259c51f85711ec3d9af94733ef27720db Mon Sep 17 00:00:00 2001 From: zhangjf Date: Tue, 17 Feb 2026 09:22:53 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E5=BC=80=E5=8F=91?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=B8=85=E5=8D=95=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按照规范,不应主动创建文档文件 --- fund-admin/src/App.vue | 18 - fund-admin/src/api/auth.js | 24 - fund-admin/src/api/contract.js | 65 -- fund-admin/src/api/customer.js | 70 -- fund-admin/src/api/dashboard.js | 12 - fund-admin/src/api/dept.js | 64 -- fund-admin/src/api/expense.js | 65 -- fund-admin/src/api/expenseType.js | 74 -- fund-admin/src/api/file.js | 67 -- fund-admin/src/api/menu.js | 47 -- fund-admin/src/api/operationLog.js | 43 -- fund-admin/src/api/post.js | 85 --- fund-admin/src/api/project.js | 65 -- fund-admin/src/api/projectMember.js | 74 -- fund-admin/src/api/receipt.js | 70 -- fund-admin/src/api/receivable.js | 76 --- fund-admin/src/api/requirement.js | 76 --- fund-admin/src/api/role.js | 54 -- fund-admin/src/api/sysConfig.js | 63 -- fund-admin/src/api/sysDict.js | 78 --- fund-admin/src/api/user.js | 55 -- fund-admin/src/api/userAssignment.js | 55 -- fund-admin/src/assets/vue.svg | 1 - fund-admin/src/components/HelloWorld.vue | 43 -- fund-admin/src/components/Layout.vue | 185 ----- .../src/components/MobileSidebar/index.vue | 178 ----- fund-admin/src/composables/useMobile.js | 209 ------ fund-admin/src/main.js | 20 - fund-admin/src/router/index.js | 197 ------ fund-admin/src/stores/user.js | 72 -- fund-admin/src/style.css | 79 --- fund-admin/src/styles/mobile.scss | 296 -------- fund-admin/src/utils/request.js | 82 --- fund-admin/src/views/customer/contact.vue | 332 --------- fund-admin/src/views/customer/list.vue | 298 -------- fund-admin/src/views/dashboard/index.vue | 638 ----------------- fund-admin/src/views/finance/expense.vue | 506 -------------- fund-admin/src/views/finance/expenseType.vue | 295 -------- fund-admin/src/views/finance/receipt.vue | 391 ----------- fund-admin/src/views/finance/receivable.vue | 540 --------------- fund-admin/src/views/login/index.vue | 139 ---- fund-admin/src/views/project/contract.vue | 343 ---------- fund-admin/src/views/project/list.vue | 392 ----------- .../src/views/project/projectMember.vue | 393 ----------- fund-admin/src/views/project/requirement.vue | 641 ------------------ fund-admin/src/views/system/dept.vue | 257 ------- fund-admin/src/views/system/file.vue | 402 ----------- fund-admin/src/views/system/menu.vue | 288 -------- fund-admin/src/views/system/operationLog.vue | 350 ---------- fund-admin/src/views/system/post.vue | 415 ------------ fund-admin/src/views/system/role.vue | 361 ---------- fund-admin/src/views/system/sysConfig.vue | 404 ----------- fund-admin/src/views/system/sysDict.vue | 393 ----------- fund-admin/src/views/system/user.vue | 361 ---------- .../src/views/system/userAssignment.vue | 407 ----------- fundplatform | 2 +- 开发规则清单.md | 429 ------------ 57 files changed, 1 insertion(+), 11638 deletions(-) delete mode 100644 fund-admin/src/App.vue delete mode 100644 fund-admin/src/api/auth.js delete mode 100644 fund-admin/src/api/contract.js delete mode 100644 fund-admin/src/api/customer.js delete mode 100644 fund-admin/src/api/dashboard.js delete mode 100644 fund-admin/src/api/dept.js delete mode 100644 fund-admin/src/api/expense.js delete mode 100644 fund-admin/src/api/expenseType.js delete mode 100644 fund-admin/src/api/file.js delete mode 100644 fund-admin/src/api/menu.js delete mode 100644 fund-admin/src/api/operationLog.js delete mode 100644 fund-admin/src/api/post.js delete mode 100644 fund-admin/src/api/project.js delete mode 100644 fund-admin/src/api/projectMember.js delete mode 100644 fund-admin/src/api/receipt.js delete mode 100644 fund-admin/src/api/receivable.js delete mode 100644 fund-admin/src/api/requirement.js delete mode 100644 fund-admin/src/api/role.js delete mode 100644 fund-admin/src/api/sysConfig.js delete mode 100644 fund-admin/src/api/sysDict.js delete mode 100644 fund-admin/src/api/user.js delete mode 100644 fund-admin/src/api/userAssignment.js delete mode 100644 fund-admin/src/assets/vue.svg delete mode 100644 fund-admin/src/components/HelloWorld.vue delete mode 100644 fund-admin/src/components/Layout.vue delete mode 100644 fund-admin/src/components/MobileSidebar/index.vue delete mode 100644 fund-admin/src/composables/useMobile.js delete mode 100644 fund-admin/src/main.js delete mode 100644 fund-admin/src/router/index.js delete mode 100644 fund-admin/src/stores/user.js delete mode 100644 fund-admin/src/style.css delete mode 100644 fund-admin/src/styles/mobile.scss delete mode 100644 fund-admin/src/utils/request.js delete mode 100644 fund-admin/src/views/customer/contact.vue delete mode 100644 fund-admin/src/views/customer/list.vue delete mode 100644 fund-admin/src/views/dashboard/index.vue delete mode 100644 fund-admin/src/views/finance/expense.vue delete mode 100644 fund-admin/src/views/finance/expenseType.vue delete mode 100644 fund-admin/src/views/finance/receipt.vue delete mode 100644 fund-admin/src/views/finance/receivable.vue delete mode 100644 fund-admin/src/views/login/index.vue delete mode 100644 fund-admin/src/views/project/contract.vue delete mode 100644 fund-admin/src/views/project/list.vue delete mode 100644 fund-admin/src/views/project/projectMember.vue delete mode 100644 fund-admin/src/views/project/requirement.vue delete mode 100644 fund-admin/src/views/system/dept.vue delete mode 100644 fund-admin/src/views/system/file.vue delete mode 100644 fund-admin/src/views/system/menu.vue delete mode 100644 fund-admin/src/views/system/operationLog.vue delete mode 100644 fund-admin/src/views/system/post.vue delete mode 100644 fund-admin/src/views/system/role.vue delete mode 100644 fund-admin/src/views/system/sysConfig.vue delete mode 100644 fund-admin/src/views/system/sysDict.vue delete mode 100644 fund-admin/src/views/system/user.vue delete mode 100644 fund-admin/src/views/system/userAssignment.vue delete mode 100644 开发规则清单.md diff --git a/fund-admin/src/App.vue b/fund-admin/src/App.vue deleted file mode 100644 index 02e6d3e..0000000 --- a/fund-admin/src/App.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/fund-admin/src/api/auth.js b/fund-admin/src/api/auth.js deleted file mode 100644 index e465661..0000000 --- a/fund-admin/src/api/auth.js +++ /dev/null @@ -1,24 +0,0 @@ -import request from '../utils/request' - -export const login = (data) => { - return request({ - url: '/sys/api/v1/auth/login', - method: 'post', - data - }) -} - -export const refreshToken = (refreshToken) => { - return request({ - url: '/sys/api/v1/auth/refresh', - method: 'post', - data: { refreshToken } - }) -} - -export const logout = () => { - return request({ - url: '/sys/api/v1/auth/logout', - method: 'post' - }) -} diff --git a/fund-admin/src/api/contract.js b/fund-admin/src/api/contract.js deleted file mode 100644 index d95575a..0000000 --- a/fund-admin/src/api/contract.js +++ /dev/null @@ -1,65 +0,0 @@ -import request from '../utils/request' - -/** - * 获取合同列表(分页) - */ -export const getContractList = (params) => { - return request({ - url: '/proj/api/v1/contract/list', - method: 'get', - params - }) -} - -/** - * 获取合同详情 - */ -export const getContractById = (id) => { - return request({ - url: `/proj/api/v1/contract/${id}`, - method: 'get' - }) -} - -/** - * 创建合同 - */ -export const createContract = (data) => { - return request({ - url: '/proj/api/v1/contract', - method: 'post', - data - }) -} - -/** - * 更新合同 - */ -export const updateContract = (id, data) => { - return request({ - url: `/proj/api/v1/contract/${id}`, - method: 'put', - data - }) -} - -/** - * 删除合同 - */ -export const deleteContract = (id) => { - return request({ - url: `/proj/api/v1/contract/${id}`, - method: 'delete' - }) -} - -/** - * 更新合同状态 - */ -export const updateContractStatus = (id, status) => { - return request({ - url: `/proj/api/v1/contract/${id}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/customer.js b/fund-admin/src/api/customer.js deleted file mode 100644 index 49d3124..0000000 --- a/fund-admin/src/api/customer.js +++ /dev/null @@ -1,70 +0,0 @@ -import request from '../utils/request' - -export const getCustomerList = (params) => { - return request({ - url: '/cust/api/v1/customer/list', - method: 'get', - params - }) -} - -export const getCustomerById = (id) => { - return request({ - url: `/cust/api/v1/customer/${id}`, - method: 'get' - }) -} - -export const createCustomer = (data) => { - return request({ - url: '/cust/api/v1/customer', - method: 'post', - data - }) -} - -export const updateCustomer = (id, data) => { - return request({ - url: `/cust/api/v1/customer/${id}`, - method: 'put', - data - }) -} - -export const deleteCustomer = (id) => { - return request({ - url: `/cust/api/v1/customer/${id}`, - method: 'delete' - }) -} - -export const getContactList = (params) => { - return request({ - url: '/cust/api/v1/contact/list', - method: 'get', - params - }) -} - -export const createContact = (data) => { - return request({ - url: '/cust/api/v1/contact', - method: 'post', - data - }) -} - -export const updateContact = (id, data) => { - return request({ - url: `/cust/api/v1/contact/${id}`, - method: 'put', - data - }) -} - -export const deleteContact = (id) => { - return request({ - url: `/cust/api/v1/contact/${id}`, - method: 'delete' - }) -} diff --git a/fund-admin/src/api/dashboard.js b/fund-admin/src/api/dashboard.js deleted file mode 100644 index 05f0736..0000000 --- a/fund-admin/src/api/dashboard.js +++ /dev/null @@ -1,12 +0,0 @@ -import request from '../utils/request' - -/** - * 获取仪表盘统计数据 - */ -export const getDashboardData = (params) => { - return request({ - url: '/proj/api/v1/dashboard', - method: 'get', - params - }) -} diff --git a/fund-admin/src/api/dept.js b/fund-admin/src/api/dept.js deleted file mode 100644 index ce7ca4f..0000000 --- a/fund-admin/src/api/dept.js +++ /dev/null @@ -1,64 +0,0 @@ -import request from '../utils/request' - -/** - * 获取部门树 - */ -export const getDeptTree = () => { - return request({ - url: '/sys/api/v1/dept/tree', - method: 'get' - }) -} - -/** - * 获取部门列表 - */ -export const getDeptList = (params) => { - return request({ - url: '/sys/api/v1/dept/list', - method: 'get', - params - }) -} - -/** - * 获取部门详情 - */ -export const getDeptById = (id) => { - return request({ - url: `/sys/api/v1/dept/${id}`, - method: 'get' - }) -} - -/** - * 创建部门 - */ -export const createDept = (data) => { - return request({ - url: '/sys/api/v1/dept', - method: 'post', - data - }) -} - -/** - * 更新部门 - */ -export const updateDept = (id, data) => { - return request({ - url: `/sys/api/v1/dept/${id}`, - method: 'put', - data - }) -} - -/** - * 删除部门 - */ -export const deleteDept = (id) => { - return request({ - url: `/sys/api/v1/dept/${id}`, - method: 'delete' - }) -} diff --git a/fund-admin/src/api/expense.js b/fund-admin/src/api/expense.js deleted file mode 100644 index 7e6c7db..0000000 --- a/fund-admin/src/api/expense.js +++ /dev/null @@ -1,65 +0,0 @@ -import request from '../utils/request' - -/** - * 获取支出列表(分页) - */ -export const getExpenseList = (params) => { - return request({ - url: '/proj/api/v1/expense/list', - method: 'get', - params - }) -} - -/** - * 获取支出详情 - */ -export const getExpenseById = (expenseId) => { - return request({ - url: `/proj/api/v1/expense/${expenseId}`, - method: 'get' - }) -} - -/** - * 创建支出 - */ -export const createExpense = (data) => { - return request({ - url: '/proj/api/v1/expense', - method: 'post', - data - }) -} - -/** - * 更新支出 - */ -export const updateExpense = (expenseId, data) => { - return request({ - url: `/proj/api/v1/expense/${expenseId}`, - method: 'put', - data - }) -} - -/** - * 删除支出 - */ -export const deleteExpense = (expenseId) => { - return request({ - url: `/proj/api/v1/expense/${expenseId}`, - method: 'delete' - }) -} - -/** - * 更新支出状态 - */ -export const updateExpenseStatus = (expenseId, status) => { - return request({ - url: `/proj/api/v1/expense/${expenseId}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/expenseType.js b/fund-admin/src/api/expenseType.js deleted file mode 100644 index 5c76155..0000000 --- a/fund-admin/src/api/expenseType.js +++ /dev/null @@ -1,74 +0,0 @@ -import request from '../utils/request' - -/** - * 获取支出类型树(仅启用) - */ -export const getExpenseTypeTree = () => { - return request({ - url: '/proj/api/v1/expense-type/tree', - method: 'get' - }) -} - -/** - * 获取所有支出类型树(包含禁用) - */ -export const getAllExpenseTypeTree = () => { - return request({ - url: '/proj/api/v1/expense-type/tree/all', - method: 'get' - }) -} - -/** - * 获取支出类型详情 - */ -export const getExpenseTypeById = (typeId) => { - return request({ - url: `/proj/api/v1/expense-type/${typeId}`, - method: 'get' - }) -} - -/** - * 创建支出类型 - */ -export const createExpenseType = (data) => { - return request({ - url: '/proj/api/v1/expense-type', - method: 'post', - data - }) -} - -/** - * 更新支出类型 - */ -export const updateExpenseType = (typeId, data) => { - return request({ - url: `/proj/api/v1/expense-type/${typeId}`, - method: 'put', - data - }) -} - -/** - * 删除支出类型 - */ -export const deleteExpenseType = (typeId) => { - return request({ - url: `/proj/api/v1/expense-type/${typeId}`, - method: 'delete' - }) -} - -/** - * 更新支出类型状态 - */ -export const updateExpenseTypeStatus = (typeId, status) => { - return request({ - url: `/proj/api/v1/expense-type/${typeId}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/file.js b/fund-admin/src/api/file.js deleted file mode 100644 index e56f0b5..0000000 --- a/fund-admin/src/api/file.js +++ /dev/null @@ -1,67 +0,0 @@ -import request from '../utils/request' - -/** - * 上传文件 - */ -export const uploadFile = (data) => { - return request({ - url: '/sys/api/v1/file/upload', - method: 'post', - data, - headers: { - 'Content-Type': 'multipart/form-data' - } - }) -} - -/** - * 获取文件列表(分页) - */ -export const getFileList = (params) => { - return request({ - url: '/sys/api/v1/file/list', - method: 'get', - params - }) -} - -/** - * 根据业务类型和ID查询文件列表 - */ -export const getFileListByBusiness = (businessType, businessId) => { - return request({ - url: '/sys/api/v1/file/list/business', - method: 'get', - params: { businessType, businessId } - }) -} - -/** - * 获取文件详情 - */ -export const getFileById = (fileId) => { - return request({ - url: `/sys/api/v1/file/${fileId}`, - method: 'get' - }) -} - -/** - * 删除文件 - */ -export const deleteFile = (fileId) => { - return request({ - url: `/sys/api/v1/file/${fileId}`, - method: 'delete' - }) -} - -/** - * 获取文件访问URL - */ -export const getFileUrl = (fileId) => { - return request({ - url: `/sys/api/v1/file/${fileId}/url`, - method: 'get' - }) -} diff --git a/fund-admin/src/api/menu.js b/fund-admin/src/api/menu.js deleted file mode 100644 index e071d09..0000000 --- a/fund-admin/src/api/menu.js +++ /dev/null @@ -1,47 +0,0 @@ -import request from '../utils/request' - -export const getMenuTree = (params) => { - return request({ - url: '/sys/api/v1/menu/tree', - method: 'get', - params - }) -} - -export const getMenuList = (params) => { - return request({ - url: '/sys/api/v1/menu/list', - method: 'get', - params - }) -} - -export const getMenuDetail = (menuId) => { - return request({ - url: `/sys/api/v1/menu/${menuId}`, - method: 'get' - }) -} - -export const createMenu = (data) => { - return request({ - url: '/sys/api/v1/menu', - method: 'post', - data - }) -} - -export const updateMenu = (menuId, data) => { - return request({ - url: `/sys/api/v1/menu/${menuId}`, - method: 'put', - data - }) -} - -export const deleteMenu = (menuId) => { - return request({ - url: `/sys/api/v1/menu/${menuId}`, - method: 'delete' - }) -} diff --git a/fund-admin/src/api/operationLog.js b/fund-admin/src/api/operationLog.js deleted file mode 100644 index 589f20d..0000000 --- a/fund-admin/src/api/operationLog.js +++ /dev/null @@ -1,43 +0,0 @@ -import request from '../utils/request' - -/** - * 获取操作日志列表(分页) - */ -export const getOperationLogList = (params) => { - return request({ - url: '/sys/api/v1/operation-log/list', - method: 'get', - params - }) -} - -/** - * 获取操作日志详情 - */ -export const getOperationLogById = (logId) => { - return request({ - url: `/sys/api/v1/operation-log/${logId}`, - method: 'get' - }) -} - -/** - * 删除操作日志 - */ -export const deleteOperationLog = (logId) => { - return request({ - url: `/sys/api/v1/operation-log/${logId}`, - method: 'delete' - }) -} - -/** - * 批量删除操作日志(删除指定天数之前的日志) - */ -export const batchDeleteOperationLog = (days) => { - return request({ - url: '/sys/api/v1/operation-log/batch', - method: 'delete', - params: { days } - }) -} diff --git a/fund-admin/src/api/post.js b/fund-admin/src/api/post.js deleted file mode 100644 index 262f354..0000000 --- a/fund-admin/src/api/post.js +++ /dev/null @@ -1,85 +0,0 @@ -import request from '../utils/request' - -/** - * 获取岗位列表(分页) - */ -export const getPostList = (params) => { - return request({ - url: '/sys/api/v1/post/list', - method: 'get', - params - }) -} - -/** - * 根据部门ID获取岗位列表 - */ -export const getPostListByDept = (deptId) => { - return request({ - url: `/sys/api/v1/post/list/dept/${deptId}`, - method: 'get' - }) -} - -/** - * 获取所有启用的岗位列表 - */ -export const getPostListEnabled = () => { - return request({ - url: '/sys/api/v1/post/list/enabled', - method: 'get' - }) -} - -/** - * 获取岗位详情 - */ -export const getPostById = (postId) => { - return request({ - url: `/sys/api/v1/post/${postId}`, - method: 'get' - }) -} - -/** - * 创建岗位 - */ -export const createPost = (data) => { - return request({ - url: '/sys/api/v1/post', - method: 'post', - data - }) -} - -/** - * 更新岗位 - */ -export const updatePost = (postId, data) => { - return request({ - url: `/sys/api/v1/post/${postId}`, - method: 'put', - data - }) -} - -/** - * 删除岗位 - */ -export const deletePost = (postId) => { - return request({ - url: `/sys/api/v1/post/${postId}`, - method: 'delete' - }) -} - -/** - * 更新岗位状态 - */ -export const updatePostStatus = (postId, status) => { - return request({ - url: `/sys/api/v1/post/${postId}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/project.js b/fund-admin/src/api/project.js deleted file mode 100644 index c5f5677..0000000 --- a/fund-admin/src/api/project.js +++ /dev/null @@ -1,65 +0,0 @@ -import request from '../utils/request' - -/** - * 获取项目列表(分页) - */ -export const getProjectList = (params) => { - return request({ - url: '/proj/api/v1/project/list', - method: 'get', - params - }) -} - -/** - * 获取项目详情 - */ -export const getProjectById = (id) => { - return request({ - url: `/proj/api/v1/project/${id}`, - method: 'get' - }) -} - -/** - * 创建项目 - */ -export const createProject = (data) => { - return request({ - url: '/proj/api/v1/project', - method: 'post', - data - }) -} - -/** - * 更新项目 - */ -export const updateProject = (id, data) => { - return request({ - url: `/proj/api/v1/project/${id}`, - method: 'put', - data - }) -} - -/** - * 删除项目 - */ -export const deleteProject = (id) => { - return request({ - url: `/proj/api/v1/project/${id}`, - method: 'delete' - }) -} - -/** - * 更新项目状态 - */ -export const updateProjectStatus = (id, status) => { - return request({ - url: `/proj/api/v1/project/${id}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/projectMember.js b/fund-admin/src/api/projectMember.js deleted file mode 100644 index 3bde51e..0000000 --- a/fund-admin/src/api/projectMember.js +++ /dev/null @@ -1,74 +0,0 @@ -import request from '../utils/request' - -/** - * 获取项目成员列表(按项目ID) - */ -export const getMemberListByProject = (projectId) => { - return request({ - url: `/proj/api/v1/project-member/list/project/${projectId}`, - method: 'get' - }) -} - -/** - * 获取用户的项目列表(按用户ID) - */ -export const getMemberListByUser = (userId) => { - return request({ - url: `/proj/api/v1/project-member/list/user/${userId}`, - method: 'get' - }) -} - -/** - * 获取项目成员详情 - */ -export const getMemberById = (memberId) => { - return request({ - url: `/proj/api/v1/project-member/${memberId}`, - method: 'get' - }) -} - -/** - * 添加项目成员 - */ -export const addMember = (data) => { - return request({ - url: '/proj/api/v1/project-member', - method: 'post', - data - }) -} - -/** - * 更新项目成员 - */ -export const updateMember = (memberId, data) => { - return request({ - url: `/proj/api/v1/project-member/${memberId}`, - method: 'put', - data - }) -} - -/** - * 移除项目成员 - */ -export const removeMember = (memberId) => { - return request({ - url: `/proj/api/v1/project-member/${memberId}`, - method: 'delete' - }) -} - -/** - * 更新成员状态 - */ -export const updateMemberStatus = (memberId, status) => { - return request({ - url: `/proj/api/v1/project-member/${memberId}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/receipt.js b/fund-admin/src/api/receipt.js deleted file mode 100644 index 4126c77..0000000 --- a/fund-admin/src/api/receipt.js +++ /dev/null @@ -1,70 +0,0 @@ -import request from '@/utils/request' - -// 收款记录管理API - -export function getReceiptPage(params) { - return request({ - url: '/receipt/page', - method: 'get', - params - }) -} - -export function getReceiptById(receiptId) { - return request({ - url: `/receipt/${receiptId}`, - method: 'get' - }) -} - -export function createReceipt(data) { - return request({ - url: '/receipt', - method: 'post', - data - }) -} - -export function updateReceipt(receiptId, data) { - return request({ - url: `/receipt/${receiptId}`, - method: 'put', - data - }) -} - -export function deleteReceipt(receiptId) { - return request({ - url: `/receipt/${receiptId}`, - method: 'delete' - }) -} - -export function batchDeleteReceipt(receiptIds) { - return request({ - url: '/receipt/batch', - method: 'delete', - params: { receiptIds } - }) -} - -export function getReceiptStatistics() { - return request({ - url: '/receipt/statistics', - method: 'get' - }) -} - -export function getReceiptsByProject(projectId) { - return request({ - url: '/receipt/project/' + projectId, - method: 'get' - }) -} - -export function getReceiptsByCustomer(customerId) { - return request({ - url: '/receipt/customer/' + customerId, - method: 'get' - }) -} diff --git a/fund-admin/src/api/receivable.js b/fund-admin/src/api/receivable.js deleted file mode 100644 index aa66c2b..0000000 --- a/fund-admin/src/api/receivable.js +++ /dev/null @@ -1,76 +0,0 @@ -import request from '../utils/request' - -/** - * 获取应收款列表(分页) - */ -export const getReceivableList = (params) => { - return request({ - url: '/proj/api/v1/receivable/list', - method: 'get', - params - }) -} - -/** - * 获取应收款详情 - */ -export const getReceivableById = (receivableId) => { - return request({ - url: `/proj/api/v1/receivable/${receivableId}`, - method: 'get' - }) -} - -/** - * 创建应收款 - */ -export const createReceivable = (data) => { - return request({ - url: '/proj/api/v1/receivable', - method: 'post', - data - }) -} - -/** - * 更新应收款 - */ -export const updateReceivable = (receivableId, data) => { - return request({ - url: `/proj/api/v1/receivable/${receivableId}`, - method: 'put', - data - }) -} - -/** - * 删除应收款 - */ -export const deleteReceivable = (receivableId) => { - return request({ - url: `/proj/api/v1/receivable/${receivableId}`, - method: 'delete' - }) -} - -/** - * 记录收款 - */ -export const recordPayment = (receivableId, amount) => { - return request({ - url: `/proj/api/v1/receivable/${receivableId}/payment`, - method: 'post', - params: { amount } - }) -} - -/** - * 更新应收款状态 - */ -export const updateReceivableStatus = (receivableId, status) => { - return request({ - url: `/proj/api/v1/receivable/${receivableId}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/requirement.js b/fund-admin/src/api/requirement.js deleted file mode 100644 index b83f3a3..0000000 --- a/fund-admin/src/api/requirement.js +++ /dev/null @@ -1,76 +0,0 @@ -import request from '../utils/request' - -/** - * 获取需求工单列表 - */ -export const getRequirementList = (params) => { - return request({ - url: '/proj/api/v1/requirement/list', - method: 'get', - params - }) -} - -/** - * 获取需求工单详情 - */ -export const getRequirementById = (requirementId) => { - return request({ - url: `/proj/api/v1/requirement/${requirementId}`, - method: 'get' - }) -} - -/** - * 创建需求工单 - */ -export const createRequirement = (data) => { - return request({ - url: '/proj/api/v1/requirement', - method: 'post', - data - }) -} - -/** - * 更新需求工单 - */ -export const updateRequirement = (requirementId, data) => { - return request({ - url: `/proj/api/v1/requirement/${requirementId}`, - method: 'put', - data - }) -} - -/** - * 删除需求工单 - */ -export const deleteRequirement = (requirementId) => { - return request({ - url: `/proj/api/v1/requirement/${requirementId}`, - method: 'delete' - }) -} - -/** - * 更新需求状态 - */ -export const updateRequirementStatus = (requirementId, status) => { - return request({ - url: `/proj/api/v1/requirement/${requirementId}/status`, - method: 'put', - params: { status } - }) -} - -/** - * 更新需求进度 - */ -export const updateRequirementProgress = (requirementId, progress) => { - return request({ - url: `/proj/api/v1/requirement/${requirementId}/progress`, - method: 'put', - params: { progress } - }) -} diff --git a/fund-admin/src/api/role.js b/fund-admin/src/api/role.js deleted file mode 100644 index 13912f0..0000000 --- a/fund-admin/src/api/role.js +++ /dev/null @@ -1,54 +0,0 @@ -import request from '../utils/request' - -export const getRoleList = (params) => { - return request({ - url: '/sys/api/v1/role/list', - method: 'get', - params - }) -} - -export const getRoleDetail = (roleId) => { - return request({ - url: `/sys/api/v1/role/${roleId}`, - method: 'get' - }) -} - -export const createRole = (data) => { - return request({ - url: '/sys/api/v1/role', - method: 'post', - data - }) -} - -export const updateRole = (roleId, data) => { - return request({ - url: `/sys/api/v1/role/${roleId}`, - method: 'put', - data - }) -} - -export const deleteRole = (roleId) => { - return request({ - url: `/sys/api/v1/role/${roleId}`, - method: 'delete' - }) -} - -export const getRoleMenuIds = (roleId) => { - return request({ - url: `/sys/api/v1/role/${roleId}/menus`, - method: 'get' - }) -} - -export const assignRoleMenus = (roleId, menuIds) => { - return request({ - url: `/sys/api/v1/role/${roleId}/menus`, - method: 'post', - data: { menuIds } - }) -} diff --git a/fund-admin/src/api/sysConfig.js b/fund-admin/src/api/sysConfig.js deleted file mode 100644 index 5547e6e..0000000 --- a/fund-admin/src/api/sysConfig.js +++ /dev/null @@ -1,63 +0,0 @@ -import request from '@/utils/request' - -// 系统配置管理API - -export function getConfigPage(params) { - return request({ - url: '/sys/config/page', - method: 'get', - params - }) -} - -export function getConfigById(configId) { - return request({ - url: `/sys/config/${configId}`, - method: 'get' - }) -} - -export function getConfigValue(configKey) { - return request({ - url: `/sys/config/value/${configKey}`, - method: 'get' - }) -} - -export function getConfigByGroup(configGroup) { - return request({ - url: `/sys/config/group/${configGroup}`, - method: 'get' - }) -} - -export function createConfig(data) { - return request({ - url: '/sys/config', - method: 'post', - data - }) -} - -export function updateConfig(configId, data) { - return request({ - url: `/sys/config/${configId}`, - method: 'put', - data - }) -} - -export function deleteConfig(configId) { - return request({ - url: `/sys/config/${configId}`, - method: 'delete' - }) -} - -export function batchDeleteConfig(configIds) { - return request({ - url: '/sys/config/batch', - method: 'delete', - params: { configIds } - }) -} diff --git a/fund-admin/src/api/sysDict.js b/fund-admin/src/api/sysDict.js deleted file mode 100644 index 53be994..0000000 --- a/fund-admin/src/api/sysDict.js +++ /dev/null @@ -1,78 +0,0 @@ -import request from '@/utils/request' - -// 数据字典管理API - -export function getDictPage(params) { - return request({ - url: '/sys/dict/page', - method: 'get', - params - }) -} - -export function getDictById(dictId) { - return request({ - url: `/sys/dict/${dictId}`, - method: 'get' - }) -} - -export function getDictByType(dictType) { - return request({ - url: `/sys/dict/type/${dictType}`, - method: 'get' - }) -} - -export function getAllDictTypes() { - return request({ - url: '/sys/dict/types', - method: 'get' - }) -} - -export function getDictMap(dictType) { - return request({ - url: `/sys/dict/map/${dictType}`, - method: 'get' - }) -} - -export function getDictLabel(dictType, dictCode) { - return request({ - url: '/sys/dict/label', - method: 'get', - params: { dictType, dictCode } - }) -} - -export function createDict(data) { - return request({ - url: '/sys/dict', - method: 'post', - data - }) -} - -export function updateDict(dictId, data) { - return request({ - url: `/sys/dict/${dictId}`, - method: 'put', - data - }) -} - -export function deleteDict(dictId) { - return request({ - url: `/sys/dict/${dictId}`, - method: 'delete' - }) -} - -export function batchDeleteDict(dictIds) { - return request({ - url: '/sys/dict/batch', - method: 'delete', - params: { dictIds } - }) -} diff --git a/fund-admin/src/api/user.js b/fund-admin/src/api/user.js deleted file mode 100644 index dc736d2..0000000 --- a/fund-admin/src/api/user.js +++ /dev/null @@ -1,55 +0,0 @@ -import request from '../utils/request' - -export const getUserList = (params) => { - return request({ - url: '/sys/api/v1/user/list', - method: 'get', - params - }) -} - -export const getUserById = (id) => { - return request({ - url: `/sys/api/v1/user/${id}`, - method: 'get' - }) -} - -export const createUser = (data) => { - return request({ - url: '/sys/api/v1/user', - method: 'post', - data - }) -} - -export const updateUser = (id, data) => { - return request({ - url: `/sys/api/v1/user/${id}`, - method: 'put', - data - }) -} - -export const deleteUser = (id) => { - return request({ - url: `/sys/api/v1/user/${id}`, - method: 'delete' - }) -} - -export const resetPassword = (id, newPassword) => { - return request({ - url: `/sys/api/v1/user/${id}/reset-password`, - method: 'put', - params: { newPassword } - }) -} - -export const updateUserStatus = (id, status) => { - return request({ - url: `/sys/api/v1/user/${id}/status`, - method: 'put', - params: { status } - }) -} diff --git a/fund-admin/src/api/userAssignment.js b/fund-admin/src/api/userAssignment.js deleted file mode 100644 index 035e39a..0000000 --- a/fund-admin/src/api/userAssignment.js +++ /dev/null @@ -1,55 +0,0 @@ -import request from '../utils/request' - -/** - * 获取用户分配列表(分页) - */ -export const getUserAssignmentList = (params) => { - return request({ - url: '/sys/api/v1/user-assignment/list', - method: 'get', - params - }) -} - -/** - * 根据部门ID获取用户列表 - */ -export const getUserListByDept = (deptId) => { - return request({ - url: `/sys/api/v1/user-assignment/list/dept/${deptId}`, - method: 'get' - }) -} - -/** - * 分配用户到部门和岗位 - */ -export const assignUser = (userId, data) => { - return request({ - url: `/sys/api/v1/user-assignment/${userId}`, - method: 'put', - params: data - }) -} - -/** - * 批量分配用户 - */ -export const batchAssignUsers = (userIds, deptId, postId) => { - return request({ - url: '/sys/api/v1/user-assignment/batch', - method: 'put', - data: userIds, - params: { deptId, postId } - }) -} - -/** - * 移除用户分配 - */ -export const removeUserAssignment = (userId) => { - return request({ - url: `/sys/api/v1/user-assignment/${userId}`, - method: 'delete' - }) -} diff --git a/fund-admin/src/assets/vue.svg b/fund-admin/src/assets/vue.svg deleted file mode 100644 index 770e9d3..0000000 --- a/fund-admin/src/assets/vue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/fund-admin/src/components/HelloWorld.vue b/fund-admin/src/components/HelloWorld.vue deleted file mode 100644 index 546ebbc..0000000 --- a/fund-admin/src/components/HelloWorld.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/fund-admin/src/components/Layout.vue b/fund-admin/src/components/Layout.vue deleted file mode 100644 index 987b31b..0000000 --- a/fund-admin/src/components/Layout.vue +++ /dev/null @@ -1,185 +0,0 @@ - - - - - diff --git a/fund-admin/src/components/MobileSidebar/index.vue b/fund-admin/src/components/MobileSidebar/index.vue deleted file mode 100644 index 60a187e..0000000 --- a/fund-admin/src/components/MobileSidebar/index.vue +++ /dev/null @@ -1,178 +0,0 @@ - - - - - diff --git a/fund-admin/src/composables/useMobile.js b/fund-admin/src/composables/useMobile.js deleted file mode 100644 index 592cbbb..0000000 --- a/fund-admin/src/composables/useMobile.js +++ /dev/null @@ -1,209 +0,0 @@ -import { ref, computed, onMounted, onUnmounted } from 'vue' - -// 断点定义 -const BREAKPOINTS = { - xs: 768, // 手机 - sm: 992, // 平板 - md: 1200, // 小桌面 - lg: 1920 // 大桌面 -} - -/** - * 移动端检测组合式函数 - */ -export function useMobile() { - // 视口宽度 - const width = ref(window.innerWidth) - const height = ref(window.innerHeight) - - // 是否移动端(< 768px) - const isMobile = computed(() => width.value < BREAKPOINTS.xs) - - // 是否平板(768px - 992px) - const isTablet = computed(() => width.value >= BREAKPOINTS.xs && width.value < BREAKPOINTS.sm) - - // 是否桌面(>= 992px) - const isDesktop = computed(() => width.value >= BREAKPOINTS.sm) - - // 是否小屏幕(< 992px) - const isSmallScreen = computed(() => width.value < BREAKPOINTS.sm) - - // 当前断点 - const breakpoint = computed(() => { - if (width.value < BREAKPOINTS.xs) return 'xs' - if (width.value < BREAKPOINTS.sm) return 'sm' - if (width.value < BREAKPOINTS.md) return 'md' - if (width.value < BREAKPOINTS.lg) return 'lg' - return 'xl' - }) - - // 侧边栏是否折叠 - const sidebarCollapsed = ref(false) - - // 移动端侧边栏是否打开 - const mobileSidebarOpen = ref(false) - - // 切换侧边栏 - const toggleSidebar = () => { - if (isMobile.value) { - mobileSidebarOpen.value = !mobileSidebarOpen.value - } else { - sidebarCollapsed.value = !sidebarCollapsed.value - } - } - - // 关闭移动端侧边栏 - const closeMobileSidebar = () => { - mobileSidebarOpen.value = false - } - - // 打开移动端侧边栏 - const openMobileSidebar = () => { - mobileSidebarOpen.value = true - } - - // 监听窗口大小变化 - const handleResize = () => { - width.value = window.innerWidth - height.value = window.innerHeight - - // 切换到桌面端时关闭移动端侧边栏 - if (!isMobile.value) { - mobileSidebarOpen.value = false - } - } - - onMounted(() => { - window.addEventListener('resize', handleResize) - handleResize() - }) - - onUnmounted(() => { - window.removeEventListener('resize', handleResize) - }) - - return { - width, - height, - isMobile, - isTablet, - isDesktop, - isSmallScreen, - breakpoint, - sidebarCollapsed, - mobileSidebarOpen, - toggleSidebar, - closeMobileSidebar, - openMobileSidebar - } -} - -/** - * 响应式表格组合式函数 - */ -export function useResponsiveTable() { - const { isMobile } = useMobile() - - // 表格高度 - const tableHeight = computed(() => { - if (isMobile.value) { - return 'auto' - } - // 桌面端:视口高度 - 头部(50) - 搜索区域(80) - 分页(50) - 边距(40) - return window.innerHeight - 220 - }) - - // 分页大小选项 - const pageSizeOptions = computed(() => { - return isMobile.value ? [10, 20] : [10, 20, 50, 100] - }) - - // 默认分页大小 - const defaultPageSize = computed(() => { - return isMobile.value ? 10 : 20 - }) - - return { - isMobile, - tableHeight, - pageSizeOptions, - defaultPageSize - } -} - -/** - * 触摸手势支持 - */ -export function useTouchGesture() { - const touchStartX = ref(0) - const touchEndX = ref(0) - const touchStartY = ref(0) - const touchEndY = ref(0) - - // 最小滑动距离 - const MIN_SWIPE_DISTANCE = 50 - - // 处理触摸开始 - const handleTouchStart = (e) => { - touchStartX.value = e.touches[0].clientX - touchStartY.value = e.touches[0].clientY - } - - // 处理触摸结束 - const handleTouchEnd = (e) => { - touchEndX.value = e.changedTouches[0].clientX - touchEndY.value = e.changedTouches[0].clientY - - return { - direction: getSwipeDirection(), - distance: Math.abs(touchEndX.value - touchStartX.value) - } - } - - // 获取滑动方向 - const getSwipeDirection = () => { - const diffX = touchEndX.value - touchStartX.value - const diffY = touchEndY.value - touchStartY.value - - // 判断是水平滑动还是垂直滑动 - if (Math.abs(diffX) > Math.abs(diffY)) { - if (Math.abs(diffX) < MIN_SWIPE_DISTANCE) return null - return diffX > 0 ? 'right' : 'left' - } else { - if (Math.abs(diffY) < MIN_SWIPE_DISTANCE) return null - return diffY > 0 ? 'down' : 'up' - } - } - - return { - handleTouchStart, - handleTouchEnd, - getSwipeDirection - } -} - -/** - * 虚拟键盘检测 - */ -export function useVirtualKeyboard() { - const isKeyboardOpen = ref(false) - const windowHeight = ref(window.innerHeight) - - const handleResize = () => { - const currentHeight = window.innerHeight - // 如果窗口高度变小超过150px,认为是虚拟键盘打开 - isKeyboardOpen.value = windowHeight.value - currentHeight > 150 - } - - onMounted(() => { - window.addEventListener('resize', handleResize) - }) - - onUnmounted(() => { - window.removeEventListener('resize', handleResize) - }) - - return { - isKeyboardOpen - } -} diff --git a/fund-admin/src/main.js b/fund-admin/src/main.js deleted file mode 100644 index c4808c1..0000000 --- a/fund-admin/src/main.js +++ /dev/null @@ -1,20 +0,0 @@ -import { createApp } from 'vue' -import App from './App.vue' -import router from './router' -import { createPinia } from 'pinia' -import ElementPlus from 'element-plus' -import 'element-plus/dist/index.css' -import * as ElementPlusIconsVue from '@element-plus/icons-vue' - -const app = createApp(App) - -// 注册所有图标 -for (const [key, component] of Object.entries(ElementPlusIconsVue)) { - app.component(key, component) -} - -app.use(createPinia()) -app.use(router) -app.use(ElementPlus) - -app.mount('#app') diff --git a/fund-admin/src/router/index.js b/fund-admin/src/router/index.js deleted file mode 100644 index 73e5fc1..0000000 --- a/fund-admin/src/router/index.js +++ /dev/null @@ -1,197 +0,0 @@ -import { createRouter, createWebHistory } from 'vue-router' -import { useUserStore } from '../stores/user' - -const routes = [ - { - path: '/login', - name: 'Login', - component: () => import('../views/login/index.vue'), - meta: { public: true } - }, - { - path: '/', - name: 'Layout', - component: () => import('../components/Layout.vue'), - redirect: '/dashboard', - children: [ - { - path: 'dashboard', - name: 'Dashboard', - component: () => import('../views/dashboard/index.vue'), - meta: { title: '首页', icon: 'HomeFilled' } - }, - { - path: 'system', - name: 'System', - meta: { title: '系统管理', icon: 'Setting' }, - children: [ - { - path: 'user', - name: 'User', - component: () => import('../views/system/user.vue'), - meta: { title: '用户管理' } - }, - { - path: 'dept', - name: 'Dept', - component: () => import('../views/system/dept.vue'), - meta: { title: '部门管理' } - }, - { - path: 'role', - name: 'Role', - component: () => import('../views/system/role.vue'), - meta: { title: '角色管理' } - }, - { - path: 'menu', - name: 'Menu', - component: () => import('../views/system/menu.vue'), - meta: { title: '菜单管理' } - }, - { - path: 'post', - name: 'Post', - component: () => import('../views/system/post.vue'), - meta: { title: '岗位管理' } - }, - { - path: 'user-assignment', - name: 'UserAssignment', - component: () => import('../views/system/userAssignment.vue'), - meta: { title: '人员分配' } - }, - { - path: 'file', - name: 'File', - component: () => import('../views/system/file.vue'), - meta: { title: '文件管理' } - }, - { - path: 'operation-log', - name: 'OperationLog', - component: () => import('../views/system/operationLog.vue'), - meta: { title: '操作日志' } - }, - { - path: 'sys-config', - name: 'SysConfig', - component: () => import('../views/system/sysConfig.vue'), - meta: { title: '系统配置' } - }, - { - path: 'sys-dict', - name: 'SysDict', - component: () => import('../views/system/sysDict.vue'), - meta: { title: '数据字典' } - } - ] - }, - { - path: 'customer', - name: 'Customer', - meta: { title: '客户中心', icon: 'UserFilled' }, - children: [ - { - path: 'list', - name: 'CustomerList', - component: () => import('../views/customer/list.vue'), - meta: { title: '客户管理' } - }, - { - path: 'contact', - name: 'CustomerContact', - component: () => import('../views/customer/contact.vue'), - meta: { title: '联系人管理' } - } - ] - }, - { - path: 'project', - name: 'Project', - meta: { title: '项目管理', icon: 'FolderOpened' }, - children: [ - { - path: 'list', - name: 'ProjectList', - component: () => import('../views/project/list.vue'), - meta: { title: '项目管理' } - }, - { - path: 'contract', - name: 'Contract', - component: () => import('../views/project/contract.vue'), - meta: { title: '合同管理' } - }, - { - path: 'requirement', - name: 'Requirement', - component: () => import('../views/project/requirement.vue'), - meta: { title: '需求工单' } - }, - { - path: 'member', - name: 'ProjectMember', - component: () => import('../views/project/projectMember.vue'), - meta: { title: '项目成员' } - } - ] - }, - { - path: 'finance', - name: 'Finance', - meta: { title: '财务管理', icon: 'Money' }, - children: [ - { - path: 'expense-type', - name: 'ExpenseType', - component: () => import('../views/finance/expenseType.vue'), - meta: { title: '支出类型' } - }, - { - path: 'expense', - name: 'Expense', - component: () => import('../views/finance/expense.vue'), - meta: { title: '支出管理' } - }, - { - path: 'receivable', - name: 'Receivable', - component: () => import('../views/finance/receivable.vue'), - meta: { title: '应收款管理' } - }, - { - path: 'receipt', - name: 'Receipt', - component: () => import('../views/finance/receipt.vue'), - meta: { title: '收款记录' } - } - ] - } - ] - } -] - -const router = createRouter({ - history: createWebHistory(), - routes -}) - -// 路由守卫 -router.beforeEach((to, from, next) => { - const userStore = useUserStore() - - if (to.meta.public) { - next() - return - } - - if (!userStore.token) { - next('/login') - return - } - - next() -}) - -export default router diff --git a/fund-admin/src/stores/user.js b/fund-admin/src/stores/user.js deleted file mode 100644 index f7f3088..0000000 --- a/fund-admin/src/stores/user.js +++ /dev/null @@ -1,72 +0,0 @@ -import { defineStore } from 'pinia' -import { ref, computed } from 'vue' - -export const useUserStore = defineStore('user', () => { - // State - const token = ref(localStorage.getItem('token') || '') - const userInfo = ref(JSON.parse(localStorage.getItem('userInfo') || '{}')) - const permissions = ref(JSON.parse(localStorage.getItem('permissions') || '[]')) - const roles = ref(JSON.parse(localStorage.getItem('roles') || '[]')) - - // Getters - const isLoggedIn = computed(() => !!token.value) - const username = computed(() => userInfo.value?.username || '') - const realName = computed(() => userInfo.value?.realName || '') - - // Actions - const setToken = (newToken) => { - token.value = newToken - localStorage.setItem('token', newToken) - } - - const setUserInfo = (info) => { - userInfo.value = info - localStorage.setItem('userInfo', JSON.stringify(info)) - } - - const setPermissions = (perms) => { - permissions.value = perms - localStorage.setItem('permissions', JSON.stringify(perms)) - } - - const setRoles = (roleList) => { - roles.value = roleList - localStorage.setItem('roles', JSON.stringify(roleList)) - } - - const hasPermission = (perm) => { - return permissions.value.includes(perm) - } - - const hasRole = (role) => { - return roles.value.includes(role) - } - - const logout = () => { - token.value = '' - userInfo.value = {} - permissions.value = [] - roles.value = [] - localStorage.removeItem('token') - localStorage.removeItem('userInfo') - localStorage.removeItem('permissions') - localStorage.removeItem('roles') - } - - return { - token, - userInfo, - permissions, - roles, - isLoggedIn, - username, - realName, - setToken, - setUserInfo, - setPermissions, - setRoles, - hasPermission, - hasRole, - logout - } -}) diff --git a/fund-admin/src/style.css b/fund-admin/src/style.css deleted file mode 100644 index f691315..0000000 --- a/fund-admin/src/style.css +++ /dev/null @@ -1,79 +0,0 @@ -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -.card { - padding: 2em; -} - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - a:hover { - color: #747bff; - } - button { - background-color: #f9f9f9; - } -} diff --git a/fund-admin/src/styles/mobile.scss b/fund-admin/src/styles/mobile.scss deleted file mode 100644 index 336f1e3..0000000 --- a/fund-admin/src/styles/mobile.scss +++ /dev/null @@ -1,296 +0,0 @@ -// 移动端适配样式 -// 断点定义:xs < 768px < sm < 992px < md < 1200px < lg - -// 移动端基础样式 -@media screen and (max-width: 768px) { - // 隐藏侧边栏 - .sidebar-container { - transform: translateX(-100%); - transition: transform 0.3s; - - &.mobile-open { - transform: translateX(0); - } - } - - // 主内容区域全宽 - .main-container { - margin-left: 0 !important; - width: 100% !important; - } - - // 顶部导航栏适配 - .navbar { - .hamburger-container { - display: none; - } - - .breadcrumb-container { - display: none; - } - - .right-menu { - .right-menu-item { - padding: 0 8px; - } - } - } - - // 搜索表单改为垂直布局 - .search-form { - .el-form-item { - margin-right: 0; - margin-bottom: 10px; - width: 100%; - - .el-input, - .el-select { - width: 100% !important; - } - } - - .el-button { - width: 100%; - margin-left: 0 !important; - margin-bottom: 10px; - } - } - - // 表格操作按钮 - .el-table { - .el-button--link { - padding: 4px 8px; - font-size: 12px; - } - } - - // 分页器适配 - .el-pagination { - .el-pagination__sizes, - .el-pagination__jump { - display: none; - } - - .btn-prev, - .btn-next { - min-width: 28px; - } - - .el-pager li { - min-width: 28px; - } - } - - // 对话框全屏 - .el-dialog { - width: 100% !important; - margin: 0 !important; - border-radius: 0 !important; - height: 100vh; - - .el-dialog__body { - max-height: calc(100vh - 120px); - overflow-y: auto; - } - } - - // 抽屉全屏 - .el-drawer { - width: 100% !important; - } - - // 表单单行显示 - .el-form { - .el-form-item { - margin-bottom: 15px; - - .el-form-item__label { - float: none; - display: block; - text-align: left; - margin-bottom: 5px; - } - - .el-form-item__content { - margin-left: 0 !important; - } - } - } - - // 卡片内边距减小 - .el-card { - .el-card__header { - padding: 12px 15px; - } - - .el-card__body { - padding: 15px; - } - } - - // 统计卡片 - .dashboard-card { - margin-bottom: 15px; - - .card-icon { - font-size: 36px; - } - - .card-value { - font-size: 20px; - } - } - - // 底部固定按钮 - .fixed-bottom-buttons { - position: fixed; - bottom: 0; - left: 0; - right: 0; - padding: 10px 15px; - background: #fff; - box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1); - z-index: 100; - display: flex; - gap: 10px; - - .el-button { - flex: 1; - } - } - - // 底部留白(避免被固定按钮遮挡) - .has-fixed-bottom { - padding-bottom: 60px; - } -} - -// 平板适配 -@media screen and (min-width: 769px) and (max-width: 992px) { - .sidebar-container { - width: 54px !important; - - .el-menu { - .el-sub-menu__title, - .el-menu-item { - padding: 0 15px !important; - - span { - display: none; - } - - .el-sub-menu__icon-arrow { - display: none; - } - } - } - } - - .main-container { - margin-left: 54px !important; - } -} - -// 移动端菜单按钮 -.mobile-menu-btn { - display: none; - - @media screen and (max-width: 768px) { - display: inline-flex; - align-items: center; - justify-content: center; - width: 40px; - height: 40px; - font-size: 20px; - cursor: pointer; - } -} - -// 移动端遮罩层 -.mobile-sidebar-mask { - display: none; - - @media screen and (max-width: 768px) { - display: block; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - z-index: 999; - opacity: 0; - visibility: hidden; - transition: all 0.3s; - - &.show { - opacity: 1; - visibility: visible; - } - } -} - -// 响应式工具类 -.hide-on-mobile { - @media screen and (max-width: 768px) { - display: none !important; - } -} - -.show-on-mobile { - display: none !important; - - @media screen and (max-width: 768px) { - display: block !important; - } -} - -// 响应式表格 -.responsive-table { - @media screen and (max-width: 768px) { - .el-table { - &__header-wrapper { - display: none; - } - - &__body-wrapper { - .el-table__row { - display: block; - margin-bottom: 15px; - border: 1px solid #ebeef5; - border-radius: 4px; - padding: 10px; - - td { - display: flex; - justify-content: space-between; - align-items: center; - border: none; - padding: 8px 0; - - &:not(:last-child) { - border-bottom: 1px solid #ebeef5; - } - - &::before { - content: attr(data-label); - font-weight: bold; - color: #606266; - } - } - } - } - } - } -} - -// 触摸优化 -@media (hover: none) { - .el-button:hover { - opacity: 1; - } - - .el-table__row:hover > td { - background-color: transparent !important; - } -} diff --git a/fund-admin/src/utils/request.js b/fund-admin/src/utils/request.js deleted file mode 100644 index 8a7adcf..0000000 --- a/fund-admin/src/utils/request.js +++ /dev/null @@ -1,82 +0,0 @@ -import axios from 'axios' -import { ElMessage } from 'element-plus' -import { useUserStore } from '../stores/user' - -// 创建axios实例 -const request = axios.create({ - baseURL: '', - timeout: 10000, - headers: { - 'Content-Type': 'application/json' - } -}) - -// 请求拦截器 -request.interceptors.request.use( - (config) => { - const userStore = useUserStore() - if (userStore.token) { - config.headers.Authorization = `Bearer ${userStore.token}` - } - return config - }, - (error) => { - return Promise.reject(error) - } -) - -// 响应拦截器 -request.interceptors.response.use( - (response) => { - const res = response.data - - // 业务成功 - if (res.code === 200) { - return res.data - } - - // 处理401未认证 - if (res.code === 401) { - ElMessage.error(res.message || '登录已过期,请重新登录') - const userStore = useUserStore() - userStore.logout() - window.location.href = '/login' - return Promise.reject(new Error(res.message || '未认证')) - } - - // 其他业务失败 - ElMessage.error(res.message || '请求失败') - return Promise.reject(new Error(res.message || '请求失败')) - }, - (error) => { - const { response } = error - - if (response) { - switch (response.status) { - case 401: - ElMessage.error('登录已过期,请重新登录') - const userStore = useUserStore() - userStore.logout() - window.location.href = '/login' - break - case 403: - ElMessage.error('没有权限访问') - break - case 404: - ElMessage.error('请求的资源不存在') - break - case 500: - ElMessage.error('服务器内部错误') - break - default: - ElMessage.error(response.data?.message || '请求失败') - } - } else { - ElMessage.error('网络错误,请检查网络连接') - } - - return Promise.reject(error) - } -) - -export default request diff --git a/fund-admin/src/views/customer/contact.vue b/fund-admin/src/views/customer/contact.vue deleted file mode 100644 index d642ce4..0000000 --- a/fund-admin/src/views/customer/contact.vue +++ /dev/null @@ -1,332 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/customer/list.vue b/fund-admin/src/views/customer/list.vue deleted file mode 100644 index 17cc57e..0000000 --- a/fund-admin/src/views/customer/list.vue +++ /dev/null @@ -1,298 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/dashboard/index.vue b/fund-admin/src/views/dashboard/index.vue deleted file mode 100644 index 615f0b2..0000000 --- a/fund-admin/src/views/dashboard/index.vue +++ /dev/null @@ -1,638 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/finance/expense.vue b/fund-admin/src/views/finance/expense.vue deleted file mode 100644 index c696b9a..0000000 --- a/fund-admin/src/views/finance/expense.vue +++ /dev/null @@ -1,506 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/finance/expenseType.vue b/fund-admin/src/views/finance/expenseType.vue deleted file mode 100644 index 160082a..0000000 --- a/fund-admin/src/views/finance/expenseType.vue +++ /dev/null @@ -1,295 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/finance/receipt.vue b/fund-admin/src/views/finance/receipt.vue deleted file mode 100644 index 7ada1eb..0000000 --- a/fund-admin/src/views/finance/receipt.vue +++ /dev/null @@ -1,391 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/finance/receivable.vue b/fund-admin/src/views/finance/receivable.vue deleted file mode 100644 index 0704a10..0000000 --- a/fund-admin/src/views/finance/receivable.vue +++ /dev/null @@ -1,540 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/login/index.vue b/fund-admin/src/views/login/index.vue deleted file mode 100644 index c907694..0000000 --- a/fund-admin/src/views/login/index.vue +++ /dev/null @@ -1,139 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/project/contract.vue b/fund-admin/src/views/project/contract.vue deleted file mode 100644 index a1480c3..0000000 --- a/fund-admin/src/views/project/contract.vue +++ /dev/null @@ -1,343 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/project/list.vue b/fund-admin/src/views/project/list.vue deleted file mode 100644 index a0685b0..0000000 --- a/fund-admin/src/views/project/list.vue +++ /dev/null @@ -1,392 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/project/projectMember.vue b/fund-admin/src/views/project/projectMember.vue deleted file mode 100644 index 4bdf449..0000000 --- a/fund-admin/src/views/project/projectMember.vue +++ /dev/null @@ -1,393 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/project/requirement.vue b/fund-admin/src/views/project/requirement.vue deleted file mode 100644 index 5098841..0000000 --- a/fund-admin/src/views/project/requirement.vue +++ /dev/null @@ -1,641 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/dept.vue b/fund-admin/src/views/system/dept.vue deleted file mode 100644 index 35a96a7..0000000 --- a/fund-admin/src/views/system/dept.vue +++ /dev/null @@ -1,257 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/file.vue b/fund-admin/src/views/system/file.vue deleted file mode 100644 index e413b31..0000000 --- a/fund-admin/src/views/system/file.vue +++ /dev/null @@ -1,402 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/menu.vue b/fund-admin/src/views/system/menu.vue deleted file mode 100644 index 04105f6..0000000 --- a/fund-admin/src/views/system/menu.vue +++ /dev/null @@ -1,288 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/operationLog.vue b/fund-admin/src/views/system/operationLog.vue deleted file mode 100644 index fa99713..0000000 --- a/fund-admin/src/views/system/operationLog.vue +++ /dev/null @@ -1,350 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/post.vue b/fund-admin/src/views/system/post.vue deleted file mode 100644 index 5954e80..0000000 --- a/fund-admin/src/views/system/post.vue +++ /dev/null @@ -1,415 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/role.vue b/fund-admin/src/views/system/role.vue deleted file mode 100644 index abef997..0000000 --- a/fund-admin/src/views/system/role.vue +++ /dev/null @@ -1,361 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/sysConfig.vue b/fund-admin/src/views/system/sysConfig.vue deleted file mode 100644 index 78d0b6c..0000000 --- a/fund-admin/src/views/system/sysConfig.vue +++ /dev/null @@ -1,404 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/sysDict.vue b/fund-admin/src/views/system/sysDict.vue deleted file mode 100644 index 503eead..0000000 --- a/fund-admin/src/views/system/sysDict.vue +++ /dev/null @@ -1,393 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/user.vue b/fund-admin/src/views/system/user.vue deleted file mode 100644 index a923082..0000000 --- a/fund-admin/src/views/system/user.vue +++ /dev/null @@ -1,361 +0,0 @@ - - - - - diff --git a/fund-admin/src/views/system/userAssignment.vue b/fund-admin/src/views/system/userAssignment.vue deleted file mode 100644 index f4105be..0000000 --- a/fund-admin/src/views/system/userAssignment.vue +++ /dev/null @@ -1,407 +0,0 @@ - - - - - diff --git a/fundplatform b/fundplatform index 85528d3..b2e2535 160000 --- a/fundplatform +++ b/fundplatform @@ -1 +1 @@ -Subproject commit 85528d3f3bcefbcea1a237175ee93b18f7b8feb2 +Subproject commit b2e2535d6798d027d15320c5cab163907c2fb920 diff --git a/开发规则清单.md b/开发规则清单.md deleted file mode 100644 index 3924276..0000000 --- a/开发规则清单.md +++ /dev/null @@ -1,429 +0,0 @@ -# 资金服务平台 - 开发规则清单 - -> **创建时间**: 2026-02-17 -> **用途**: 重新生成代码前的规范和约束 -> **版本**: v1.0 - ---- - -## 1. 技术栈规范 - -### 1.1 核心框架 -- **Java**: 21 -- **Spring Boot**: 3.2.0 -- **Spring Cloud**: 2023.0.0 -- **认证框架**: Apache Shiro 2.0.0(必须,不使用 Spring Security) -- **数据库连接池**: HikariCP -- **ORM框架**: MyBatis-Plus 3.5.6 - -### 1.2 依赖版本锁定 -```xml -1.18.30 -2.0.0 -4.4.0 -5.8.23 -3.5.6 -``` - -### 1.3 禁用的依赖 -- ❌ `spring-boot-starter-security` -- ❌ Shiro 1.x(不兼容 Spring Boot 3) - ---- - -## 2. Maven 多模块配置规范 - -### 2.1 父 POM 配置 -```xml - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.13.0 - - 21 - 21 - - -parameters - - - - org.projectlombok - lombok - ${lombok.version} - - - - - - -``` - -### 2.2 子模块 POM 配置 -**每个子模块都必须显式激活 maven-compiler-plugin**: -```xml - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.13.0 - - 21 - 21 - - -parameters - - - - org.projectlombok - lombok - ${lombok.version} - - - - - - -``` - -### 2.3 依赖冲突检查 -- ⚠️ 避免在 pom.xml 中重复声明同一依赖 -- ⚠️ 使用 `mvn dependency:tree` 检查依赖冲突 - ---- - -## 3. Lombok 使用规范 - -### 3.1 禁止在继承 ServiceImpl 的类上使用 @Slf4j - -**❌ 错误示例**: -```java -@Slf4j -@Service -public class DeptService extends ServiceImpl { - public void saveDept(Dept dept) { - log.info("保存部门"); // 编译错误! - } -} -``` - -**✅ 正确示例**: -```java -@Service -public class DeptService extends ServiceImpl { - private static final Logger logger = LoggerFactory.getLogger(DeptService.class); - - public void saveDept(Dept dept) { - logger.info("保存部门"); - } -} -``` - -**原因**: MyBatis-Plus 的 ServiceImpl 基类已定义 `protected Log log`(org.apache.ibatis.logging.Log),与 Lombok @Slf4j 生成的字段冲突。 - -### 3.2 实体类 Lombok 注解规范 -```java -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_dept") -public class Dept extends BaseEntity { - // 必须确保 import lombok.Data 和 import lombok.EqualsAndHashCode 存在 -} -``` - -### 3.3 Controller/Component Lombok 注解 -```java -@RestController -@RequestMapping("/api/v1/dept") -@RequiredArgsConstructor // 推荐用于依赖注入 -public class DeptController { - private final DeptService deptService; -} -``` - ---- - -## 4. Shiro 认证框架规范 - -### 4.1 核心组件清单 -1. **JwtToken.java** - 自定义 Token 类 -2. **JwtRealm.java** - 认证授权域 -3. **JwtFilter.java** - JWT 过滤器 -4. **ShiroConfig.java** - Shiro 配置类 -5. **PasswordEncoderConfig.java** - 密码编码器(使用 BCrypt) - -### 4.2 权限注解规范 -- ✅ 使用 `@RequiresRoles("ADMIN")` -- ✅ 使用 `@RequiresPermissions("system:user:view")` -- ❌ 不使用 Spring Security 注解(@PreAuthorize) - -### 4.3 认证流程 -1. 用户登录 → 查询数据库 -2. BCrypt 验证密码 -3. 生成 JWT Token(包含 userId, username, tenantId) -4. 每次请求通过 JwtFilter 验证 Token -5. JwtRealm 加载用户权限 - ---- - -## 5. 代码编写规范 - -### 5.1 分层架构 -``` -Controller → Service → Mapper → Database - ↓ ↓ - DTO Entity -``` - -### 5.2 包结构规范 -``` -com.fundplatform.sys -├── controller # 控制器层 -├── service # 业务逻辑层 -├── mapper # 数据访问层 -├── entity # 实体类 -├── dto # 数据传输对象 -├── vo # 视图对象 -├── security # 安全相关(Shiro配置) -├── config # 配置类 -└── util # 工具类 -``` - -### 5.3 命名规范 -- **Entity**: 单数名词,如 `User.java`、`Dept.java` -- **Mapper**: 实体名 + Mapper,如 `UserMapper.java` -- **Service**: 实体名 + Service,如 `UserService.java` -- **Controller**: 实体名 + Controller,如 `UserController.java` - -### 5.4 日志规范 -```java -// 业务操作日志 -logger.info("[ServiceName] 业务操作描述: {}, 参数: {}", entity.getName(), param); - -// 错误日志 -logger.error("[ServiceName] 操作失败: {}", errorMessage, exception); -``` - ---- - -## 6. 数据库规范 - -### 6.1 表命名规范 -- 系统表前缀: `sys_`(如 `sys_user`, `sys_role`) -- 业务表前缀: `biz_`(如 `biz_project`, `biz_fund`) - -### 6.2 字段规范 -- 主键: `主表名_id`(如 `user_id`, `dept_id`) -- 租户ID: `tenant_id`(必须字段,默认值 1) -- 软删除: `deleted`(0-未删除,1-已删除) -- 状态: `status`(1-启用,0-禁用) -- 时间: `created_time`, `updated_time` - -### 6.3 BaseEntity 基类 -```java -@Data -public class BaseEntity implements Serializable { - private Long tenantId; // 租户ID - private Integer deleted; // 删除标记 - private LocalDateTime createdTime; // 创建时间 - private Long createdBy; // 创建人 - private LocalDateTime updatedTime; // 更新时间 - private Long updatedBy; // 更新人 -} -``` - ---- - -## 7. API 规范 - -### 7.1 RESTful 路径规范 -``` -GET /api/v1/dept # 查询列表 -GET /api/v1/dept/{id} # 查询单个 -POST /api/v1/dept # 创建 -PUT /api/v1/dept/{id} # 更新 -DELETE /api/v1/dept/{id} # 删除 -``` - -### 7.2 统一响应格式 -```java -public class Result { - private Integer code; // 200-成功,其他-失败 - private String message; - private T data; -} -``` - -### 7.3 认证路径规范 -``` -POST /api/v1/auth/login # 登录(不需要认证) -POST /api/v1/auth/logout # 登出 -POST /api/v1/auth/refresh # 刷新Token -``` - ---- - -## 8. 多租户规范 - -### 8.1 租户隔离 -- 所有业务表必须包含 `tenant_id` 字段 -- Service 层插入数据时自动设置 `tenant_id` -- 查询时自动过滤 `tenant_id` - -### 8.2 默认租户 -- 系统租户: `tenant_id = 0` -- 业务租户: `tenant_id >= 1` - ---- - -## 9. 编译和测试规范 - -### 9.1 编译命令 -```bash -# 清理编译 -cd /home/along/MyCode/wanjiabuluo/fundplatform/fundplatform -mvn clean compile -DskipTests - -# 安装到本地仓库 -mvn clean install -DskipTests - -# 编译单个模块 -mvn clean compile -pl fund-sys -am -DskipTests -``` - -### 9.2 禁止的操作 -- ❌ 不要在 run_in_terminal 中重复 `cd` 到同一目录 -- ❌ 不要使用 `mvn clean` 后立即执行其他命令(应分开执行) - ---- - -## 10. Git 规范 - -### 10.1 分支策略 -- `main` - 生产分支 -- `develop` - 开发分支 -- `feature/*` - 功能分支 -- `bugfix/*` - 修复分支 - -### 10.2 提交规范 -``` -feat: 新功能 -fix: 修复bug -refactor: 重构 -docs: 文档更新 -style: 代码格式调整 -test: 测试相关 -chore: 构建/工具链相关 -``` - ---- - -## 11. 常见陷阱清单 - -### 11.1 Lombok 相关 -- ✓ 每个子模块必须显式配置 maven-compiler-plugin -- ✓ 继承 ServiceImpl 的类不能使用 @Slf4j -- ✓ 确保所有 import lombok.* 语句存在 - -### 11.2 Shiro 相关 -- ✓ 使用 Shiro 2.0.0(支持 jakarta.servlet) -- ✓ 保留 spring-security-crypto(用于 BCrypt) -- ✓ 登录接口路径配置为匿名访问 - -### 11.3 Maven 相关 -- ✓ 避免在 pom.xml 中重复声明依赖 -- ✓ 父 pom 中未创建的子模块需注释掉 -- ✓ 使用 `-U` 参数强制更新依赖 - -### 11.4 数据库相关 -- ✓ 初始化 SQL 主键必须与字段定义一致 -- ✓ tenant_id 必须有默认值保障机制 -- ✓ 软删除字段 deleted 默认为 0 - ---- - -## 12. 重新生成代码的策略 - -### 12.1 代码生成工具选择 -**选项 A**: MyBatis-Plus 代码生成器 -- 优点: 自动生成 Entity、Mapper、Service、Controller -- 缺点: 需要手动调整生成的代码 - -**选项 B**: 手动编写 -- 优点: 完全可控,符合规范 -- 缺点: 工作量大 - -**选项 C**: 模板化生成 -- 优点: 可重复使用,质量稳定 -- 缺点: 需要先建立模板 - -### 12.2 推荐策略 -1. **第一步**: 手动编写核心基础类(BaseEntity、Result、自定义异常) -2. **第二步**: 使用 MyBatis-Plus 生成器生成基础 CRUD -3. **第三步**: 手动完善业务逻辑和复杂查询 -4. **第四步**: 编写单元测试验证 - -### 12.3 生成顺序 -``` -1. fund-common (基础类) - ├── BaseEntity - ├── Result - └── 工具类 - -2. fund-sys (系统模块) - ├── 实体类 (Entity) - ├── Mapper 接口 - ├── Service 实现 - ├── Controller - └── Shiro 配置 - -3. fund-gateway (网关) - └── 路由配置 - -4. fund-cust (客户模块) -5. fund-proj (项目模块) -``` - ---- - -## 13. 架构约束 - -### 13.1 必须遵守的架构要求 -1. ✅ 使用 Shiro 作为认证框架(架构文档要求) -2. ✅ 实现多租户数据隔离 -3. ✅ Header 透传(X-Uid, X-Uname) -4. ✅ 全链路日志追踪 - -### 13.2 性能要求 -- 接口响应时间 < 500ms -- 数据库查询使用索引 -- 使用 Redis 缓存热点数据 - ---- - -## 14. 下一步行动 - -### 14.1 准备工作 -- [ ] 备份当前代码 -- [ ] 清理所有 target 目录 -- [ ] 确认数据库表结构 -- [ ] 准备初始化 SQL 脚本 - -### 14.2 代码生成 -- [ ] 生成 fund-common 基础类 -- [ ] 生成 fund-sys 实体类和 Mapper -- [ ] 实现 Shiro 认证框架 -- [ ] 编写核心业务逻辑 - -### 14.3 验证 -- [ ] 编译通过(mvn clean compile) -- [ ] 启动成功 -- [ ] 登录功能正常 -- [ ] 基础 CRUD 接口正常 - ---- - -**注意**: 本规则清单将持续更新,每次遇到问题都会添加到"常见陷阱清单"中。 -