From f3737c80bea7b503d1a54dd76e7ddbed53ec5011 Mon Sep 17 00:00:00 2001 From: g1307092382 <1307092382@qq.com> Date: Sat, 15 Aug 2026 16:38:30 +0800 Subject: [PATCH] feat(old-items): complete reuse workflow and refine miniapp home --- apps/admin-web/package.json | 1 + apps/admin-web/src/App.vue | 11 + apps/admin-web/src/api/old-item-rewards.ts | 57 ++ apps/admin-web/src/api/old-items.ts | 135 ++++ .../src/components/OldItemInventoryPanel.vue | 495 ++++++++++++ .../src/components/OldItemRewardsPanel.vue | 270 +++++++ apps/admin-web/src/styles.css | 328 ++++++++ apps/admin-web/src/views/OldItemsView.vue | 392 +++++++++ .../migration.sql | 102 +++ .../migration.sql | 89 ++ .../migration.sql | 113 +++ apps/api/prisma/schema.prisma | 662 ++++++++++++--- apps/api/src/app.module.ts | 2 + apps/api/src/old-items/dto/old-items.dto.ts | 191 +++++ .../old-items/old-item-inventory.service.ts | 634 +++++++++++++++ .../src/old-items/old-item-rewards.service.ts | 658 +++++++++++++++ .../api/src/old-items/old-items.controller.ts | 331 ++++++++ apps/api/src/old-items/old-items.module.ts | 14 + apps/api/src/old-items/old-items.service.ts | 763 ++++++++++++++++++ .../participation/dto/participation.dto.ts | 3 +- apps/api/src/participation/media.service.ts | 14 +- .../src/participation/participation.module.ts | 1 + apps/api/test/old-items.integration-spec.ts | 495 ++++++++++++ apps/miniprogram/miniprogram/app.json | 10 +- .../assets/images/service-child-care-v2.jpg | Bin 0 -> 68302 bytes .../assets/images/service-life-support-v2.jpg | Bin 0 -> 71984 bytes .../images/service-other-support-v2.jpg | Bin 0 -> 60947 bytes .../images/service-women-support-v2.jpg | Bin 0 -> 73650 bytes apps/miniprogram/miniprogram/old-items.wxss | 208 +++++ .../application-detail/application-detail.ts | 2 +- .../application-detail.wxml | 4 +- .../application-form/application-form.json | 2 +- .../application-form/application-form.ts | 27 +- .../application-form/application-form.wxml | 11 +- .../application-success.ts | 4 +- .../application-success.wxml | 4 +- .../miniprogram/pages/index/index.ts | 19 +- .../miniprogram/pages/index/index.wxml | 19 +- .../miniprogram/pages/index/index.wxss | 62 +- .../my-applications/my-applications.json | 2 +- .../my-applications/my-applications.wxml | 4 +- .../old-item-certificate.json | 3 + .../old-item-certificate.ts | 33 + .../old-item-certificate.wxml | 9 + .../old-item-certificate.wxss | 62 ++ .../old-item-detail/old-item-detail.json | 1 + .../pages/old-item-detail/old-item-detail.ts | 80 ++ .../old-item-detail/old-item-detail.wxml | 1 + .../old-item-detail/old-item-detail.wxss | 1 + .../old-item-donate/old-item-donate.json | 1 + .../pages/old-item-donate/old-item-donate.ts | 154 ++++ .../old-item-donate/old-item-donate.wxml | 1 + .../old-item-donate/old-item-donate.wxss | 1 + .../pages/old-item-guide/old-item-guide.json | 1 + .../pages/old-item-guide/old-item-guide.ts | 1 + .../pages/old-item-guide/old-item-guide.wxml | 1 + .../pages/old-item-guide/old-item-guide.wxss | 1 + .../pages/old-item-home/old-item-home.json | 1 + .../pages/old-item-home/old-item-home.ts | 47 ++ .../pages/old-item-home/old-item-home.wxml | 10 + .../pages/old-item-home/old-item-home.wxss | 1 + .../pages/old-item-needs/old-item-needs.json | 1 + .../pages/old-item-needs/old-item-needs.ts | 48 ++ .../pages/old-item-needs/old-item-needs.wxml | 1 + .../pages/old-item-needs/old-item-needs.wxss | 1 + .../old-item-records/old-item-records.json | 1 + .../old-item-records/old-item-records.ts | 65 ++ .../old-item-records/old-item-records.wxml | 1 + .../old-item-records/old-item-records.wxss | 1 + .../old-item-rewards/old-item-rewards.json | 3 + .../old-item-rewards/old-item-rewards.ts | 47 ++ .../old-item-rewards/old-item-rewards.wxml | 10 + .../old-item-rewards/old-item-rewards.wxss | 43 + .../miniprogram/pages/profile/profile.ts | 3 + .../miniprogram/pages/profile/profile.wxml | 4 +- .../pages/service-hub/service-hub.ts | 21 +- .../pages/service-hub/service-hub.wxml | 2 +- .../miniprogram/services/old-items.ts | 95 +++ docs/02_PRODUCT_PRD_V1.md | 6 +- docs/04_DATA_MODEL.md | 34 + docs/05_API_AND_WORKFLOW.md | 70 ++ docs/06_SECURITY_PRIVACY.md | 14 + docs/07_UI_UX.md | 15 + docs/09_TEST_ACCEPTANCE.md | 32 + docs/10_TASK_STATE.md | 76 +- docs/11_DECISIONS.md | 62 ++ docs/15_FRONTEND_DESIGN_SPEC.md | 25 +- docs/18_OLD_ITEM_REUSE_PLAN.md | 32 + packages/contracts/src/auth.ts | 9 + packages/contracts/src/index.ts | 54 ++ packages/contracts/src/old-items.ts | 338 ++++++++ packages/contracts/src/participation.ts | 2 +- pnpm-lock.yaml | 426 ++++++++++ pnpm-workspace.yaml | 4 + 94 files changed, 7880 insertions(+), 215 deletions(-) create mode 100644 apps/admin-web/src/api/old-item-rewards.ts create mode 100644 apps/admin-web/src/api/old-items.ts create mode 100644 apps/admin-web/src/components/OldItemInventoryPanel.vue create mode 100644 apps/admin-web/src/components/OldItemRewardsPanel.vue create mode 100644 apps/admin-web/src/views/OldItemsView.vue create mode 100644 apps/api/prisma/migrations/20260815130000_old_item_reuse_phase1/migration.sql create mode 100644 apps/api/prisma/migrations/20260815180000_old_item_inventory_phase2/migration.sql create mode 100644 apps/api/prisma/migrations/20260815210000_old_item_rewards_phase3/migration.sql create mode 100644 apps/api/src/old-items/dto/old-items.dto.ts create mode 100644 apps/api/src/old-items/old-item-inventory.service.ts create mode 100644 apps/api/src/old-items/old-item-rewards.service.ts create mode 100644 apps/api/src/old-items/old-items.controller.ts create mode 100644 apps/api/src/old-items/old-items.module.ts create mode 100644 apps/api/src/old-items/old-items.service.ts create mode 100644 apps/api/test/old-items.integration-spec.ts create mode 100644 apps/miniprogram/miniprogram/assets/images/service-child-care-v2.jpg create mode 100644 apps/miniprogram/miniprogram/assets/images/service-life-support-v2.jpg create mode 100644 apps/miniprogram/miniprogram/assets/images/service-other-support-v2.jpg create mode 100644 apps/miniprogram/miniprogram/assets/images/service-women-support-v2.jpg create mode 100644 apps/miniprogram/miniprogram/old-items.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-certificate/old-item-certificate.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-certificate/old-item-certificate.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-certificate/old-item-certificate.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-certificate/old-item-certificate.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-detail/old-item-detail.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-detail/old-item-detail.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-detail/old-item-detail.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-detail/old-item-detail.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-donate/old-item-donate.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-donate/old-item-donate.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-donate/old-item-donate.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-donate/old-item-donate.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-guide/old-item-guide.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-guide/old-item-guide.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-guide/old-item-guide.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-guide/old-item-guide.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-home/old-item-home.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-home/old-item-home.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-home/old-item-home.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-home/old-item-home.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-needs/old-item-needs.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-needs/old-item-needs.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-needs/old-item-needs.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-needs/old-item-needs.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-records/old-item-records.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-records/old-item-records.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-records/old-item-records.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-records/old-item-records.wxss create mode 100644 apps/miniprogram/miniprogram/pages/old-item-rewards/old-item-rewards.json create mode 100644 apps/miniprogram/miniprogram/pages/old-item-rewards/old-item-rewards.ts create mode 100644 apps/miniprogram/miniprogram/pages/old-item-rewards/old-item-rewards.wxml create mode 100644 apps/miniprogram/miniprogram/pages/old-item-rewards/old-item-rewards.wxss create mode 100644 apps/miniprogram/miniprogram/services/old-items.ts create mode 100644 docs/18_OLD_ITEM_REUSE_PLAN.md create mode 100644 packages/contracts/src/old-items.ts diff --git a/apps/admin-web/package.json b/apps/admin-web/package.json index 01cdb99..a623bff 100644 --- a/apps/admin-web/package.json +++ b/apps/admin-web/package.json @@ -12,6 +12,7 @@ "dependencies": { "@lehuo/contracts": "workspace:*", "dompurify": "^3.4.13", + "exceljs": "4.4.0", "mammoth": "^1.12.1", "pinia": "^3.0.3", "vue": "^3.5.20", diff --git a/apps/admin-web/src/App.vue b/apps/admin-web/src/App.vue index f0af4f8..c476ce3 100644 --- a/apps/admin-web/src/App.vue +++ b/apps/admin-web/src/App.vue @@ -18,6 +18,7 @@ import StatisticsView from './views/StatisticsView.vue'; import DashboardView from './views/DashboardView.vue'; import AdminIcon from './components/AdminIcon.vue'; import FinancialDisclosuresView from './views/FinancialDisclosuresView.vue'; +import OldItemsView from './views/OldItemsView.vue'; const auth = useAuthStore(); const form = reactive({ username: '', password: '' }); @@ -38,6 +39,7 @@ const activeView = ref< | 'notifications' | 'statistics' | 'financial-disclosures' + | 'old-items' >('dashboard'); onMounted(() => auth.restore()); @@ -141,6 +143,14 @@ async function logout(): Promise {
乐活公益管理平台