4.3 KiB
4.3 KiB
Major Feature Update Plan
A comprehensive update adding sub-project tracking granularity, a cross-table R&D summary view, and a data management system (backup/restore/reset).
Proposed Changes
A — Rename "服务类型预设" → "子项目"
No DB schema changes needed (service_types column name stays, only UI text changes).
[MODIFY] ClientManage.vue
- Label "服务类型预设" → "子项目预设"
- Dialog field label updated
[MODIFY] TimesheetForm.vue
- Label "项目类型" → "子项目"
- Placeholder text updated
B — Statistics display as "项目-子项目"
The project_type field in timesheets stores which sub-project was selected. Current stats queries ignore this field. We need to group by project_type within each project, and surface "项目名-子项目" combinations.
Important
This changes all 3 tab views (Sales/R&D/Project) to break down by sub-project in charts. Tables remain overview-level, but charts use the sub-project granularity.
[MODIFY] server/routes/admin.js
- Update
GET /admin/stats/sales,GET /admin/stats/rd,GET /admin/stats/projectqueries to include sub-project breakdown (join with project_type from timesheets)
[MODIFY] client/src/views/admin/Dashboard.vue
- Build chart data as
"项目-子项目"strings - Both pie and bar charts use this combined label
C — New Tab: 研发工时汇总 (Matrix)
A cross-table: rows = R&D personnel, columns = "项目-子项目", cells = total hours, plus row/column totals.
[NEW] server/routes/admin.js additions
GET /admin/summary-matrix?start_date=&end_date=— returns flat rows with{user_name, project_label, hours}GET /admin/export/matrix?start_date=&end_date=— returns Excel file of the matrix
[MODIFY] client/src/api/index.js
- Add
getSummaryMatrix(params)andexportMatrixExcel(params)toadminApi
[MODIFY] client/src/views/admin/Dashboard.vue
- Add 4th tab "📋 研发工时汇总"
- No charts, just the cross-table with totals row/column
- Date filter + Export button
D — Admin: Clear All Data
[NEW] server/routes/admin.js additions
POST /admin/reset— DELETE timesheets, DELETE clients (users preserved)
[NEW] client/src/views/admin/DataManage.vue
- New admin page for data management in one place
- Contains: Reset, Backup, Restore sections
[MODIFY] router/index.js + Layout.vue
- Add
/data-manageadmin route + menu item "🗄️ 数据管理"
E — Backup / Restore / Auto-backup
[MODIFY] server/package.json
- Add
node-crondependency
[NEW] server/routes/admin.js additions
GET /admin/backup/download— exports JSON{users, clients, timesheets}, sent as file downloadPOST /admin/restore— accepts JSON body, clears and re-populates tablesGET /admin/backups— lists saved auto-backup files (name, size, date)GET /admin/backups/:filename/download— download a specific auto-backup
[MODIFY] server/app.js
- After DB init: start
node-cronjob at0 3 * * * - On trigger: export DB to JSON → save to
server/backups/backup-YYYY-MM-DD.json - Purge files in
server/backups/older than 30 days
[MODIFY] client/src/views/admin/DataManage.vue
- 数据备份区: "立即备份" button → triggers download of backup JSON
- 备份恢复区:
el-uploadto upload a .json backup → calls restore API - 自动备份列表: table of auto-backup files with download buttons
- 危险操作区: "清除所有数据" button (double-confirmation)
Verification Plan
Backend Tests (manual curl / browser)
- POST client with same name → error
- GET
/admin/summary-matrix→ matrix data returned - GET
/admin/export/matrix→ Excel file downloads - POST
/admin/reset→ DB cleared, users remain - GET
/admin/backup/download→ JSON file with 3 sections - POST
/admin/restorewith that file → data re-populated - Auto-backup: verify
server/backups/gets .json files
Frontend
- Dashboard 4th tab: matrix table renders with totals
- Export matrix → file named correctly
- DataManage page: backup download, restore upload, reset with confirmation
- After restore: page refreshes with restored data