refactor(功能模块): 将"时间银行"重命名为"互助中心"并完善相关功能

重构项目中的"时间银行"模块,统一更名为"互助中心",涉及前端路由、组件、文档及多处文本替换。新增互助中心页面功能,包括:
1. 通证兑换服务弹窗
2. 互助任务列表展示
3. 区块链存证交互流程

同时优化护理记录页面,增加筛选、导出功能,完善监管端仪表盘交互
This commit is contained in:
祀梦
2026-01-13 10:30:21 +08:00
parent 7077d0f9e0
commit 1b87097447
16 changed files with 499 additions and 175 deletions

View File

@@ -24,7 +24,7 @@
### 2. 👨‍👩‍👧 家属/用户端 (Client)
- **实时守护看板**:查看亲人实时状态(如“正在散步”),非视频流,保护隐私。
- **时间银行**:展示互助养老通证 (Token) 的赚取与消费。
- **互助中心**:展示互助养老通证 (Token) 的赚取与消费。
### 3. 🏥 机构/护理端 (Agency)
- **任务看板**实时接收机器人的分级告警L4 级跌倒事件会红色高亮并置顶。

View File

@@ -31,11 +31,11 @@
- **功能展示**:展示数据如何在本地完成推理,仅将加密摘要外传的动态过程。
### 3.2 用户/家属端 (The Trust Interface)
**核心对标:目标人群(子女)、隐私友好、时间银行**
**核心对标:目标人群(子女)、隐私友好、互助中心**
- **页面 1智能守护看板**
- **视觉效果**:非视频监控,而是基于 AI 识别的“实时行为状态图表”(如:正在午睡、已喝水、散步中)。
- **功能点**:点击“查看证据”,跳转至区块链存证详情。
- **页面 2时间银行 & 公益互助**
- **页面 2互助中心 & 公益互助**
- **视觉效果**:电子存折风格。
- **功能点**:展示家属为邻居老人提供互助服务获得的“智护通证”,可兑换本系统的机器人租赁额度。
- **页面 3残障友好模式**
@@ -93,7 +93,7 @@
2. **场景模拟**:切换到**机器人端**模拟王大爷跌倒L4
3. **技术解密**:暂停画面,展示**隐私计算**和**数据上链**动效(对标 4.1 & 4.3)。
4. **多端联动**:展示**护理员端**收到报警并签收,**家属端**实时查看脱敏后的证据链(对标 5.1)。
5. **价值升华**:最后回到**区块链浏览器**,展示“时间银行”的通证流转,讲述可持续发展的互助生态(对标 5.2)。
5. **价值升华**:最后回到**区块链浏览器**,展示“互助中心”的通证流转,讲述可持续发展的互助生态(对标 5.2)。
---

View File

@@ -0,0 +1,67 @@
# 智护链 (SmartCare Chain) 功能详解文档
本文档详细描述了智护链系统各端的功能模块、操作逻辑及技术实现细节。
## 1. 系统入口 (Landing Page)
- **路径**: `/`
- **功能**:
- **系统介绍**: 展示“区块链+隐私计算”的核心价值主张。
- **技术白皮书**: 点击可查看详细的系统架构与算法原理(路由 `/whitepaper`)。
- **快速演示入口**: 提供五大角色(家属、机器人、机构、监管、区块链)的快速跳转卡片。
- **安全登录**: 模拟 FISCO BCOS 身份认证登录流程。
## 2. 家属/用户端 (Client)
- **路径**: `/client/dashboard`, `/client/mutualaid`
- **核心功能**:
- **健康看板**: 实时显示老人心率、血压、血氧等生命体征。
- **实时监控**: 查看老人房间的实时视频流(模拟),支持“语音通话”和“摄像头接入”。
- *优化*: 增加了“演示模式”提示,未登录状态下会引导用户。
- **功能快捷键**:
- **语音通话**: 模拟呼叫老人终端或护士站。
- **提醒吃药**: 设置 AI 智能提醒,系统会自动调度机器人前往提醒。
- **召唤机器人**: 实时查看机器人位置,并一键呼叫至老人身边。
- **互助中心 (Mutual Aid)**:
- **账户概览**: 查看当前 Token 余额。
- **去赚取**: 跳转至社区互助任务列表,接单赚取 Token。
- **兑换服务**: 使用 Token 兑换专业护理(如助浴、陪诊)服务,支持区块链存证模拟。
## 3. 机构/护理端 (Agency)
- **路径**: `/agency/workspace`, `/agency/emergency`, `/agency/records`
- **核心功能**:
- **工作台 (Workspace)**:
- **任务看板**: 区分“常规巡护”、“需关注事项”和“紧急医疗告警”三类任务,支持 Kanban 视图。
- **楼层分布图**: 动态显示各房间状态及机器人实时位置。
- **应急响应中心 (Emergency)**:
- **L4 告警监控**: 实时弹窗展示跌倒等高危事件,附带现场视频流。
- **协同处置**: 勾选处置 SOP标准作业程序调度护士站与 AED 资源。
- **报告生成**: 支持查看加密的区块链事故报告。
- **护理记录 (Records)**:
- **全流程存证**: 每一条护理记录(生活护理、医疗协助等)均生成链上 Hash。
- **高级筛选**: 支持按老人姓名、房间号及记录类型筛选。
- **数据导出**: 支持将筛选后的记录导出为 CSV 格式(模拟)。
## 4. 机器人端 (Robot Edge)
- **路径**: `/robot/monitor`
- **核心功能**:
- **视觉感知 (Vision)**: 模拟 AI 姿态估计Pose Estimation实时识别老人行为如跌倒、挥手
- **环境监测**: 实时回传温度、湿度、CO2 浓度及噪音水平。
- **控制模式**:
- **自动巡航**: 机器人按预设路线巡逻。
- **人工接管**: 切换至手动模式通过虚拟摇杆WASD控制机器人移动。
- **系统状态**: 显示 CPU、内存、电池及网络延迟 (Latency) 数据。
## 5. 政府监管端 (Admin)
- **路径**: `/admin/dashboard`
- **核心功能**:
- **态势感知**: 基于 GIS 地图(模拟上海地图)展示各社区养老中心运行状态。
- **网格监控**: 切换至九宫格视频流视图,查看重点区域实时画面。
- **数据驾驶舱**: 展示覆盖社区数、在线终端数、今日告警数及 TPS 等关键指标。
- **审计报告**: 一键生成月度全域审计报告(模拟触发智能合约聚合数据)。
## 6. 区块链浏览器 (Blockchain Explorer)
- **路径**: `/blockchain/explorer`, `/blockchain/blocks`, `/blockchain/transactions`
- **核心功能**:
- **全网概览**: 实时显示区块高度、交易总量及节点状态。
- **区块流**: 动态展示新生成的区块Cube 动画效果)。
- **交易查询**: 支持按 Hash 或地址搜索交易记录。
- **智能合约**: 展示已部署的核心合约(如 `CareRecord`, `EvidenceStorage`)及其调用统计。

40
docs/Introduction.md Normal file
View File

@@ -0,0 +1,40 @@
# 智护链 (SmartCare Chain) 项目介绍
## 项目愿景
**智护链** 是一套基于 **区块链 (Blockchain)**、**边缘计算 (Edge Computing)** 与 **隐私计算 (Privacy Computing)** 技术构建的下一代智慧养老协作网络。
我们的目标是解决传统养老行业面临的“信任成本高”、“隐私保护难”、“服务监管弱”三大痛点,构建一个“以人为中心,以行为为存证”的可信养老生态。
## 核心技术特性
### 1. 全流程可信存证
基于 **FISCO BCOS** 联盟链底层,将养老服务中的关键环节(如护理记录、告警响应、服务结算)实时上链。
- **防篡改**: 所有记录一经生成,无法被单方修改或删除。
- **可追溯**: 完整的证据链条,为纠纷仲裁提供法律效力级别的证据。
### 2. 边缘 AI 隐私计算
采用“云-边-端”协同架构,将敏感的视频分析算法部署在本地边缘节点(机器人/网关)。
- **数据不出域**: 原始视频流在本地完成分析,仅将“跌倒”、“挥手”等结构化结果上报,最大程度保护老人隐私。
- **低延迟响应**: 毫秒级边缘决策确保危急时刻L4 告警)系统能立即做出反应,无需等待云端指令。
### 3. 互助中心通证经济
引入双通证模型激励社区互助:
- **Care Token**: 激励层。志愿者通过提供服务赚取 Token可用于兑换专业护理服务。
- **Gov Point**: 治理层。基于服务质量评价积累的信誉积分,决定节点在网络中的治理权重。
## 应用场景
### 居家养老
通过部署智能终端与机器人,让居家老人享受 24 小时隐形守护。家属可随时查看健康数据,并在紧急情况发生时第一时间介入。
### 机构养老
为养老院提供数字化管理工具。从护理任务分配到事故应急处理,实现标准化、透明化管理,降低运营风险。
### 政府监管
为民政部门提供全域态势感知大屏。实时掌握辖区内养老机构运行状况,基于链上数据进行精准补贴发放与服务质量审计。
## 技术栈
- **前端框架**: Vue 3 + Vite + Tailwind CSS
- **状态管理**: Pinia
- **路由管理**: Vue Router 4
- **模拟底层**: Mock Data (模拟区块链哈希与 AI 识别流)

View File

@@ -61,8 +61,8 @@ AI不仅是监控者更是受规则约束的参与者。根据风险等级实
### 5.1 技术创新:多技融合
首次在职业教育与竞赛赛道深度整合 **区块链 + 隐私计算 + AI + 机器人**,实现了从数据感知到证据闭环的原始性改良。
### 5.2 机制创新:“时间银行”互助模式
引入通证经济模型,将志愿者服务时长以数字资产形式存入“时间银行”,支持跨区兑换,激发社区互助活力(参考广州/上海先进案例)。
### 5.2 机制创新:“互助中心”互助模式
引入通证经济模型,将志愿者服务时长以数字资产形式存入“互助中心”,支持跨区兑换,激发社区互助活力(参考广州/上海先进案例)。
### 5.3 民生创意:残障友好指令集
针对视觉/听觉残障人士开发“触觉/听觉双向转换”指令集,将区块链指令转化为可感知信号,提升社会公益价值。

View File

@@ -1,18 +1,85 @@
# 智护链 (SmartCare Chain) 综合指南
项目信息 项目名称 “智护链”——基于区块链+AI+隐私计算的助残养老机器人远程协作系统
赛道名称 新一代信息技术
项目简介600字以内如何展示技能水平、职业素养等
针对我国老龄化社会中居家养老安全监测难、隐私易泄露、服务责任认定难等一线“真问题”,本项目构建了一套“智护链”——基于区块链+AI+隐私计算的助残养老机器人远程协作系统。在技能操作层面团队深度集成区块链底层技术采用FISCO BCOS架构搭建国产可信存证平台通过Solidity语言开发智能合约实现了养老服务合同的自动执行与健康数据的全流程存证。参赛选手将现场展示区块链节点的部署、共识算法的配置以及智能合约的逻辑验证体现对复杂软件工具使用的熟练度与操作规范性 。
系统核心融合了AI与机器人控制技术机器人端部署了轻量化AI模型能够实时执行跌倒检测、情绪识别及异常行为分析。针对数据安全痛点项目创新性地应用了联邦学习与隐私计算技术在本地完成AI推理以确保原始健康隐私不出户仅将计算摘要与加密特征值上链充分体现了新一代信息技术中技术选择的先进性与数字化转型特征 。
在职业素养方面,项目设计严格遵循行业标准与安全规范,在机器人运行逻辑中预设了多级避障与紧急刹车等风险防范机制,展现出极强的安全意识与劳动保护意识 。代码开发与硬件调试过程中,团队秉持精益求精的工匠精神,确保每行逻辑的可溯源与硬件布线的标准化,体现了管理意识与质量意识 。通过现场对机器人远程调度、AI实时预警及区块链追溯审计的完整演示本项目将系统性地展示团队在面对复杂生产、服务场景时运用多技术融合手段解决实际问题的综合技能水平与职业风貌
欢迎使用智护链系统。本文档将作为您的“使用说明书”,结合最新的系统功能,引导您全面体验下一代智慧养老平台。
应用价值300字以内 实用性、经济性、可持续性等
---
实用性: 直接解决居家养老中的跌倒报警延迟与健康监护空缺失,方案可快速移植到智慧社区和康复中心,契合国家人口老龄化战略需求 。
经济性: 通过区块链分布式存储与AI边缘计算降低了昂贵的中心服务器带宽成本实现高效益运营助力高质量就业 。
可持续性: 模块化软硬件设计支持远程升级,减少电子垃圾;数字化存证替代大量纸质报告,符合绿色低碳发展方向 。
创新创意300字以内: 创新意识、创新成效等
创新意识: 打破传统机器人“信息孤岛”现状提出“行为即存证”理念将AI决策过程与区块链共识机制深度融合体现原始创新精神 。
创新成效: 技术融合创新方面,首次在职业教育赛道深度整合区块链+隐私计算+AI+机器人,实现加工工艺(数据脱敏流转)的原始性改良 。
民生类创意: 开发了针对视觉/听觉残障人士的“触觉/听觉双向转换”区块链指令集,提升了应用性优化的社会价值 。
## 🚀 快速开始
### 1. 启动系统
在项目根目录下运行以下命令启动开发服务器:
```bash
npm run dev
```
访问 `http://localhost:5173` (或终端显示的地址) 进入系统首页。
### 2. 首页导航
系统首页提供了通往各个子系统的快速入口。您可以点击 **“立即启动系统”** 进入登录页,或通过右侧的 **“快速进入演示终端”** 直接跳转至特定角色视图。
- **推荐**: 点击 **“查看技术白皮书”** 了解系统底层的架构设计。
---
## 💡 核心功能体验流程
为了完整体验智护链的设计理念,建议按照以下顺序进行操作:
### 场景一:紧急救援闭环 (L4 级告警)
1. **触发**: 进入 **机器人端 (`/robot/monitor`)**
- 观察 AI 视觉识别流。
- *(可选)* 点击“人工接管”模式,尝试控制机器人视角。
2. **响应**: 切换至 **机构端 (`/agency/emergency`)**
- 您会看到一个红色的 **L4 级告警卡片**
- 点击处置流程中的 SOP 勾选框(如“通知护士站”)。
- 点击 **“一键发起多方协同”** 调度资源。
- 最后点击 **“标记为已处理”** 完成归档。
3. **存证**: 系统会提示生成了区块链 Hash证明此次救援行动已被记录。
### 场景二:护理服务与存证
1. **记录**: 进入 **机构端 - 护理记录 (`/agency/records`)**
- 点击右上角 **“+ 新增护理记录”**。
- 填写服务内容(如“助浴”),点击提交。
2. **查证**:
- 在列表中找到刚才提交的记录,注意观察其 **Chain Hash** 字段。
- 使用顶部的 **搜索框****筛选器** 查找特定老人的记录。
- 点击 **“导出数据”** 按钮,体验数据导出功能。
### 场景三:互助中心互助
1. **查看**: 进入 **家属端 - 互助中心 (`/client/mutualaid`)**
- 查看当前的 Token 余额。
2. **兑换**: 点击 **“兑换服务”**。
- 选择一项服务(如“陪诊”),确认消耗 Token。
3. **赚取**: 点击 **“去赚取”**。
- 浏览附近的互助任务,点击 **“接单”**。
### 场景四:全域监管
1. **监控**: 进入 **监管端 (`/admin/dashboard`)**
- 查看地图上的社区分布。
- 点击右上角的 **“生成月度审计报告”**,模拟触发智能合约审计。
---
## 🛠️ 系统优化与扩展日志
本次更新对系统进行了全面的功能补全与体验优化:
### ✅ 已实现功能
- **技术白皮书**: 新增了独立的白皮书页面,详细解析架构与算法。
- **机器人控制**: 在 Monitor 页面新增了“人工/自动”切换及虚拟摇杆。
- **数据导出**: 护理记录页面现支持 CSV 格式导出。
- **报表生成**: 监管端新增了审计报告生成入口。
- **全网搜索**: 区块链浏览器新增了全网数据检索功能。
### 🎨 体验优化
- **交互反馈**: 所有关键操作(提交、兑换、导出)均增加了 Toast 或 Alert 反馈。
- **视觉增强**: 统一了各端 UI 风格,增加了动态图表与微交互动画。
- **数据联动**: 模拟了从“端”到“链”的数据流转逻辑。
---
## 📚 更多文档
- 如需了解详细的功能点列表,请阅读 [功能详解文档](./Functional_Documentation.md)。
- 如需了解项目背景与愿景,请阅读 [项目介绍](./Introduction.md)。
---
© 2026 SmartCare Chain Team.

View File

@@ -70,7 +70,7 @@ Fund)提出,旨在打破时空局限以推动养老服务高质量发展,通过
模式的实践探索,旨在精准对接老年人群体多元化、个性化服务需求,并在智能化、专业化及标准化养老
服务体系的构建方面取得初步成效。其中,杭州作为先行者,创新性地将“智慧化”理念融入社区居家养
老服务中,通过实施需求精准评估、强化护理人才队伍建设、激发社会成员广泛参与,构建了高质量的智
慧养老服务体系。[18]南京等地则将“时间银行积分机制”引入互助养老模式中,遵循统一化管理、标准化
慧养老服务体系。[18]南京等地则将“互助中心积分机制”引入互助养老模式中,遵循统一化管理、标准化
流程及平台化运作的原则,实现了养老模式的全过程规范化管理。[19]苏州和兰州等地开设就地养老的
“虚拟养老院”,采用政府引导与企业运行的方式,为老年人提供医疗保健、健康护理、衣食住行和生活文
娱等方面的服务。[20]
@@ -150,7 +150,7 @@ R
的连接;家庭医生签约对养老主体行为全过程记录,养老服务提供方在整合大数据的基础上,强化与长
者监护人的信息交互,实现社区居家养老服务的专业化和广覆盖。较为典型的是广州市“区块链+时间
银行”的互助模式,其将志愿者服务时长以通证形式存入个人账户,通证可兑换家政服务或医疗护理。
截至2024年5月,“时间银行”累计存储23万小时服务时长,跨区兑换率达89%。“链上记录公开透
截至2024年5月,“互助中心”累计存储23万小时服务时长,跨区兑换率达89%。“链上记录公开透
明,兑换服务时不再担心赖账,参与积极性提高了。”(访谈241017AC1)
3.秩序互信:规范社区智慧养老服务领域的有序发展
首先,实现透明监管与服务合规化。政府部门可利用区块链上的存证数据进行审核审计,杜绝养老
@@ -184,7 +184,7 @@ R
体的信息共享激励与约束机制,促进供应商动态迭代、集成商高效整合、服务商无缝对接,增强分布式供
应链中多主体间的合作信任,优化信息共享流程,确保利益合理分配与风险共担机制的落实,形成“个性
信息全记录、服务信息全匹配、管理信息全自动”的社区居家智慧养老服务信息与资源链条,以解决服务
供给主体间数据公开、协同、调配、储存等问题。例如,北京市海淀区“时间银行3.0”项目创新采用“双
供给主体间数据公开、协同、调配、储存等问题。例如,北京市海淀区“互助中心3.0”项目创新采用“双
链架构”,民政链记录服务时长与质量评价,志愿链对接“志愿北京”平台实现积分跨系统兑换。截至
2023年底,注册志愿者达2.4万人,累计存储服务时长38.7万小时,其中23%的积分已通过区块链智
能合约兑换为家政服务。“区块链能够系统自动匹配距离最近的认证护工,将护理时长、血压监测记录
@@ -340,7 +340,7 @@ NGO组织、社会养老机构、政府部门等相关机构组织作为节点
“区块链+社区居家养老”服务细则,如出台服务人员执业法等。二是确立统一的养老服务行业标准化
体系,涵盖服务流程、质量监控及老年人需求评估机制,同步完善从业人员资格认证与管理规范,加强各
部门主体间数据的标准化建设,打破“数据孤岛”,完善部门协作与资源共享的运行机制。三是强化对现
有“时间银行”等虚拟货币的管理与应用。应用区块链技术,确保“养老币”等时间资产的存储与兑换公
有“互助中心”等虚拟货币的管理与应用。应用区块链技术,确保“养老币”等时间资产的存储与兑换公
开与透明,为智能合约的履责与执行提供制度支持,如细化“养老币”的运营规则等,即低龄老年人通过
参与社区志愿服务累积时间,未来在高龄时换取等值的志愿服务时间,实现了服务的跨期交换与自我保
障。[25]四是积极引导社会力量参与建设。搭建“区块链+社区居家养老”的服务平台,开展与养老服务
@@ -410,7 +410,7 @@ _15069707,2021-10-26/2024-12-01.
[17] 张泉,李辉.从“何以可能”到“何以可行”———国外智慧养老研究进展与启示[J].学习与实践,2019,(2):109-118.
[18] 常敏,孙刚锋.整体性治理视角下智慧居家养老服务体系建设研究———以杭州创新实践为样本[J].中共福建省委党校学报,2017,
(3):85-91.
[19] 曹海军,闫晓玲.时间银行互助养老服务项目跨部门协作结果解释———基于多案例的比较研究[J].经济社会体制比较,2023,(2):
[19] 曹海军,闫晓玲.互助中心互助养老服务项目跨部门协作结果解释———基于多案例的比较研究[J].经济社会体制比较,2023,(2):
33-41.
[20] 杜孝珍,孙婧娜.我国虚拟养老院发展的优势、风险及路径[J].上海行政学院学报,2020,21(4):74-85.
[21] 王莉莉.基于“服务链”理论的居家养老服务需求、供给与利用研究[J].人口学刊,2013,35(2):49-59.
@@ -418,5 +418,5 @@ _15069707,2021-10-26/2024-12-01.
(4):108-119.
[23] 刘晓梅,李蹊.社区居家养老研究的回顾与展望———基于Citespace的文献计量分析[J].学习与探索,2022,(3):33-40.
[24] 封铁英,马朵朵.社区居家养老服务如何包容性发展?一个理论分析视角[J].社会保障评论,2020,4(3):77-89.
[25] 徐俊,刘丽杭.“数字赋能”养老服务时间银行:以区块链“嵌入式”技术创新为基础[J].中共天津市委党校学报,2023,25(2):86-95.
[25] 徐俊,刘丽杭.“数字赋能”养老服务互助中心:以区块链“嵌入式”技术创新为基础[J].中共天津市委党校学报,2023,25(2):86-95.
[26] 钟仁耀,王怀月.城市社区智能居家养老服务模式探讨[J].理论探索,2023,(3):90-97.

View File

@@ -15,7 +15,7 @@
<span class="mr-1">🏠</span> 退出
</router-link>
<router-link to="/client/dashboard" class="text-gray-600 hover:text-vitality-orange px-3 py-2 rounded-md text-sm font-medium">首页</router-link>
<router-link to="/client/timebank" class="text-gray-600 hover:text-vitality-orange px-3 py-2 rounded-md text-sm font-medium">时间银行</router-link>
<router-link to="/client/mutualaid" class="text-gray-600 hover:text-vitality-orange px-3 py-2 rounded-md text-sm font-medium">互助中心</router-link>
<div class="ml-4 flex items-center">
<img class="h-8 w-8 rounded-full" src="https://api.dicebear.com/7.x/avataaars/svg?seed=Felix" alt="User Avatar" />
</div>

View File

@@ -19,6 +19,7 @@ const routes = [
{
path: '/client',
component: () => import('../layouts/ClientLayout.vue'),
redirect: '/client/dashboard',
children: [
{
path: 'dashboard',
@@ -26,15 +27,16 @@ const routes = [
component: () => import('../views/client/Dashboard.vue')
},
{
path: 'timebank',
name: 'TimeBank',
component: () => import('../views/client/TimeBank.vue')
path: 'mutualaid',
name: 'MutualAid',
component: () => import('../views/client/MutualAid.vue')
}
]
},
{
path: '/robot',
component: () => import('../layouts/RobotLayout.vue'),
redirect: '/robot/monitor',
children: [
{
path: 'monitor',
@@ -46,6 +48,7 @@ const routes = [
{
path: '/agency',
component: () => import('../layouts/AgencyLayout.vue'),
redirect: '/agency/workspace',
children: [
{
path: 'workspace',
@@ -67,6 +70,7 @@ const routes = [
{
path: '/admin',
component: () => import('../layouts/AdminLayout.vue'),
redirect: '/admin/dashboard',
children: [
{
path: 'dashboard',
@@ -78,6 +82,7 @@ const routes = [
{
path: '/blockchain',
component: () => import('../layouts/BlockchainLayout.vue'),
redirect: '/blockchain/explorer',
children: [
{
path: 'explorer',

View File

@@ -94,7 +94,7 @@ const roles = [
{
id: 'client',
name: '家属/用户端',
desc: '查看亲人状态,管理隐私权限,参与时间银行互助。',
desc: '查看亲人状态,管理隐私权限,参与互助中心互助。',
icon: '👨‍👩‍👧',
path: '/client/dashboard'
},

View File

@@ -95,7 +95,7 @@
<span class="mr-2">📜</span> 智能合约治理
</h4>
<p class="text-sm text-slate-600 leading-relaxed">
所有业务逻辑通过 Solidity 编写的智能合约执行包括身份认证 (DID)服务质量对赌 (SLA)时间银行通证分发等
所有业务逻辑通过 Solidity 编写的智能合约执行包括身份认证 (DID)服务质量对赌 (SLA)互助中心通证分发等
实现法典即代码 (Code is Law)
</p>
</div>
@@ -167,7 +167,7 @@
<section id="tokenomics" class="scroll-mt-24">
<h2 class="text-3xl font-black text-slate-900 mb-8 flex items-center">
<span class="w-8 h-8 bg-slate-900 text-white rounded-lg flex items-center justify-center mr-4 text-sm">6</span>
通证经济时间银行 (Time Bank)
通证经济互助中心 (Mutual Aid)
</h2>
<div class="bg-gradient-to-br from-blue-600 to-indigo-700 rounded-3xl p-10 text-white shadow-xl relative overflow-hidden">
<div class="absolute top-0 right-0 w-64 h-64 bg-white/10 rounded-full -mr-32 -mt-32 blur-3xl"></div>

View File

@@ -1,12 +1,23 @@
<template>
<div class="h-full flex flex-col space-y-6">
<!-- Header Actions -->
<div class="flex justify-between items-center">
<h2 class="text-2xl font-bold text-white">全域态势感知中心</h2>
<button @click="generateReport" class="px-4 py-2 bg-blue-600 hover:bg-blue-500 text-white rounded-lg text-sm font-bold flex items-center transition-colors">
<span class="mr-2">📄</span> 生成月度审计报告
</button>
</div>
<!-- Top KPI Cards -->
<div class="grid grid-cols-4 gap-6">
<div v-for="kpi in kpis" :key="kpi.label" class="bg-slate-800/50 backdrop-blur border border-slate-700 p-4 rounded-xl">
<div class="text-sm text-slate-400">{{ kpi.label }}</div>
<div v-for="kpi in kpis" :key="kpi.label"
@click="showKpiDetail(kpi)"
class="bg-slate-800/50 backdrop-blur border border-slate-700 p-4 rounded-xl cursor-pointer hover:bg-slate-700/50 transition-colors group">
<div class="text-sm text-slate-400 group-hover:text-slate-300">{{ kpi.label }}</div>
<div class="text-2xl font-bold text-white mt-1">{{ kpi.value }}</div>
<div class="text-xs mt-2" :class="kpi.trendUp ? 'text-green-400' : 'text-red-400'">
{{ kpi.trendUp ? '↑' : '↓' }} {{ kpi.trend }} vs last week
<div class="text-xs mt-2 flex justify-between items-center" :class="kpi.trendUp ? 'text-green-400' : 'text-red-400'">
<span>{{ kpi.trendUp ? '↑' : '↓' }} {{ kpi.trend }} vs last week</span>
<span class="opacity-0 group-hover:opacity-100 transition-opacity text-slate-500">详情 ></span>
</div>
</div>
</div>
@@ -175,7 +186,7 @@
</template>
<script setup>
import { ref } from 'vue'
import { ref, onMounted } from 'vue'
import { useGlobalStore } from '../../stores/global'
const store = useGlobalStore()
@@ -223,11 +234,22 @@ const communities = ref([
])
const kpis = ref([
{ label: '覆盖社区数', value: '128', trend: '12%', trendUp: true },
{ label: '在线机器人', value: '1,042', trend: '5%', trendUp: true },
{ label: '今日告警处理', value: '89', trend: '2%', trendUp: false },
{ label: '服务满意度', value: '98.5%', trend: '0.5%', trendUp: true },
{ label: '覆盖社区数', value: '128', trend: '12', trendUp: true },
{ label: '在线 AI 终端', value: '3,450', trend: '150', trendUp: true },
{ label: '今日告警处理', value: '45', trend: '5', trendUp: false },
{ label: '区块链交易 TPS', value: '2,800', trend: '300', trendUp: true },
])
const generateReport = () => {
const confirm = window.confirm('确定要生成本月全域审计报告吗?\n该操作将触发链上数据聚合预计耗时 15 秒。')
if (confirm) {
alert('请求已提交!\n智能合约正在聚合数据报告生成后将发送至监管端邮箱。')
}
}
const showKpiDetail = (kpi) => {
alert(`正在加载 "${kpi.label}" 的详细历史数据趋势图...`)
}
</script>
<style scoped>

View File

@@ -26,15 +26,18 @@
<div class="flex items-center space-x-4">
<div class="relative">
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 text-xs">🔍</span>
<input type="text" placeholder="搜索老人姓名/房间号..." class="pl-9 pr-4 py-2 bg-gray-50 border-none rounded-lg text-sm focus:ring-2 focus:ring-blue-500 w-64">
<input type="text" v-model="searchQuery" placeholder="搜索老人姓名/房间号..." class="pl-9 pr-4 py-2 bg-gray-50 border-none rounded-lg text-sm focus:ring-2 focus:ring-blue-500 w-64 transition-all">
</div>
<select class="bg-gray-50 border-none rounded-lg text-sm px-4 py-2 focus:ring-2 focus:ring-blue-500">
<option>全部记录类型</option>
<option>生活护理</option>
<option>医疗协助</option>
<option>心理慰藉</option>
<option>日常巡查</option>
<select v-model="filterType" class="bg-gray-50 border-none rounded-lg text-sm px-4 py-2 focus:ring-2 focus:ring-blue-500 transition-all cursor-pointer">
<option value="all">全部记录类型</option>
<option value="生活护理">生活护理</option>
<option value="医疗协助">医疗协助</option>
<option value="心理慰藉">心理慰藉</option>
<option value="日常巡查">日常巡查</option>
</select>
<button @click="exportRecords" class="px-4 py-2 bg-gray-50 hover:bg-gray-100 text-gray-600 rounded-lg text-sm font-bold transition-colors border border-gray-100 flex items-center">
<span class="mr-2">📥</span> 导出数据
</button>
</div>
<div class="flex items-center space-x-2">
<span class="text-xs text-gray-400">数据状态:</span>
@@ -50,8 +53,10 @@
<div class="lg:col-span-2 space-y-6">
<h3 class="text-lg font-bold text-gray-800 flex items-center px-1">
<span class="mr-3 text-2xl">📅</span> 日常护理日志
<span class="ml-3 text-xs bg-gray-100 text-gray-500 px-2 py-1 rounded-full">{{ filteredRecords.length }} 条记录</span>
</h3>
<div v-for="record in records" :key="record.id"
<TransitionGroup name="list" tag="div" class="space-y-6">
<div v-for="record in filteredRecords" :key="record.id"
class="bg-white rounded-3xl border border-gray-100 shadow-sm hover:shadow-xl hover:-translate-y-1 transition-all group overflow-hidden">
<div class="flex">
<!-- Side Indicator -->
@@ -103,6 +108,7 @@
</div>
</div>
</div>
</TransitionGroup>
</div>
<!-- Blockchain Audit Logs (From Global Store) -->
@@ -186,15 +192,15 @@
<div class="grid grid-cols-2 gap-4">
<div>
<label class="block text-xs font-bold text-gray-400 uppercase mb-1.5">老人姓名</label>
<select class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
<option>张大爷 (302)</option>
<option>李奶奶 (105)</option>
<option>王阿姨 (208)</option>
<select v-model="newRecord.elder" class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
<option value="张大爷 (302室)">张大爷 (302)</option>
<option value="李奶奶 (105室)">李奶奶 (105)</option>
<option value="王阿姨 (208室)">王阿姨 (208)</option>
</select>
</div>
<div>
<label class="block text-xs font-bold text-gray-400 uppercase mb-1.5">记录类型</label>
<select class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
<select v-model="newRecord.type" class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
<option>生活护理</option>
<option>医疗协助</option>
<option>康复训练</option>
@@ -203,11 +209,11 @@
</div>
<div>
<label class="block text-xs font-bold text-gray-400 uppercase mb-1.5">记录标题</label>
<input type="text" placeholder="例如: 完成晨间洗漱" class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
<input type="text" v-model="newRecord.title" placeholder="例如: 完成晨间洗漱" class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3">
</div>
<div>
<label class="block text-xs font-bold text-gray-400 uppercase mb-1.5">详细内容</label>
<textarea rows="3" placeholder="请详细描述护理过程及观察到的状况..." class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3"></textarea>
<textarea v-model="newRecord.content" rows="3" placeholder="请详细描述护理过程及观察到的状况..." class="w-full bg-gray-50 border-none rounded-xl text-sm px-4 py-3"></textarea>
</div>
<div class="bg-blue-50 p-3 rounded-xl border border-blue-100">
<div class="flex items-center space-x-2">
@@ -230,93 +236,141 @@
</template>
<script setup>
import { ref } from 'vue'
import { ref, computed } from 'vue'
import { useGlobalStore } from '../../stores/global'
const store = useGlobalStore()
const showAddModal = ref(false)
const searchQuery = ref('')
const filterType = ref('all')
const recordStats = [
{ label: '今日新增记录', value: '42', trend: '+12%' },
{ label: '待审计记录', value: '5', trend: '-20%' },
{ label: '本月服务总时数', value: '1,280h', trend: '+5%' },
{ label: '家属满意度', value: '4.9', trend: '稳定' }
]
const recordStats = ref([
{ label: '今日记录总数', value: '42', trend: '+12%', trendUp: true },
{ label: '异常护理项', value: '3', trend: '-1', trendUp: false },
{ label: '区块链确认', value: '100%', trend: '稳定', trendUp: true },
{ label: '服务满意度', value: '4.9', trend: '+0.1', trendUp: true },
])
const records = ref([
{
id: 1,
elder: '张大爷',
room: '302室',
elder: '王建国',
room: '201室',
avatar: '👴',
type: '医疗协助',
title: '按时服用降压药',
content: '观察血压 135/85 mmHg精神状态良好无不适反应。',
time: '今天 08:15',
staff: '王护理员',
hash: '0x8f2a...9b1c'
type: '生活护理',
title: '完成晨间助浴与更衣',
content: '老人精神状态良好,配合度高。助浴过程中检查皮肤无异常,已更换干净衣物。',
time: '08:30',
hash: '0x7a8...9b2'
},
{
id: 2,
elder: '李奶奶',
room: '105室',
elder: '李秀兰',
room: '203室',
avatar: '👵',
type: '生活护理',
title: '完成午餐进食',
content: '进食量 250g摄入水分 150ml自主进食过程顺畅。',
time: '今天 12:30',
staff: '张护理员',
hash: '0x3d4e...1f9a'
type: '医疗协助',
title: '协助服用降压药',
content: '血压测量结果 135/85遵医嘱协助服用降压药一粒。观察15分钟无不良反应。',
time: '09:15',
hash: '0x3c4...1f9'
},
{
id: 3,
elder: '王阿姨',
room: '208室',
avatar: '👩‍🦳',
type: '康复训练',
title: '室内行走练习',
content: '在护理员辅助下行走 200 米,步态较稳,心率正常。',
time: '昨天 16:45',
staff: '李康复师',
hash: '0x7a8b...2c3d'
elder: '张德福',
room: '205室',
avatar: '<EFBFBD>',
type: '日常巡查',
title: '房间环境安全检查',
content: '地面干燥无积水,呼叫器功能正常,通风状况良好。',
time: '10:00',
hash: '0x8d2...4e6'
},
{
id: 4,
elder: '赵大爷',
room: '401室',
avatar: '👴',
elder: '赵淑芬',
room: '202室',
avatar: '<EFBFBD>',
type: '心理慰藉',
title: '情感交流与谈心',
content: '与其交流家乡趣事,老人情绪明显好转,积极参加后续活动。',
time: '昨天 10:20',
staff: '张护理员',
hash: '0x5e4d...3f2b'
}
title: '情绪疏导与陪伴',
content: '老人因想念子女情绪低落陪同聊天30分钟情绪明显好转。',
time: '11:20',
hash: '0x5b1...8a3'
},
])
const getTypeColor = (type) => {
switch (type) {
case '医疗协助': return 'bg-red-500'
case '生活护理': return 'bg-green-500'
case '康复训练': return 'bg-blue-500'
case '心理慰藉': return 'bg-purple-500'
default: return 'bg-gray-500'
const filteredRecords = computed(() => {
return records.value.filter(record => {
const matchQuery = record.elder.includes(searchQuery.value) || record.room.includes(searchQuery.value)
const matchType = filterType.value === 'all' || record.type === filterType.value
return matchQuery && matchType
})
})
const exportRecords = () => {
const csvContent = "data:text/csv;charset=utf-8,"
+ "ID,老人,房间,类型,标题,时间,Hash\n"
+ filteredRecords.value.map(e => `${e.id},${e.elder},${e.room},${e.type},${e.title},${e.time},${e.hash}`).join("\n");
const encodedUri = encodeURI(csvContent);
const link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "nursing_records_export.csv");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
alert(`成功导出 ${filteredRecords.value.length} 条护理记录!`)
}
const newRecord = ref({
elder: '',
type: '生活护理',
title: '',
content: ''
})
const submitRecord = () => {
// Simulate Blockchain Transaction
const newId = records.value.length + 1
const mockHash = '0x' + Math.random().toString(16).slice(2, 10) + '...' + Math.random().toString(16).slice(2, 6)
records.value.unshift({
id: newId,
elder: newRecord.value.elder || '未知老人',
room: '待定',
avatar: '👤',
type: newRecord.value.type,
title: newRecord.value.title || '新提交护理记录',
content: newRecord.value.content,
time: new Date().toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'}),
hash: mockHash
})
showAddModal.value = false
newRecord.value = { elder: '', type: '生活护理', title: '', content: '' }
// Show success toast (simulated)
alert(`记录已上链存证!\nHash: ${mockHash}`)
}
const getTypeColor = (type) => {
const colors = {
'生活护理': 'bg-blue-500',
'医疗协助': 'bg-red-500',
'心理慰藉': 'bg-purple-500',
'日常巡查': 'bg-green-500'
}
return colors[type] || 'bg-gray-500'
}
const getTypeBadge = (type) => {
switch (type) {
case '医疗协助': return 'bg-red-50 text-red-600'
case '生活护理': return 'bg-green-50 text-green-600'
case '康复训练': return 'bg-blue-50 text-blue-600'
case '心理慰藉': return 'bg-purple-50 text-purple-600'
default: return 'bg-gray-50 text-gray-600'
const badges = {
'生活护理': 'bg-blue-100 text-blue-600',
'医疗协助': 'bg-red-100 text-red-600',
'心理慰藉': 'bg-purple-100 text-purple-600',
'日常巡查': 'bg-green-100 text-green-600'
}
}
const submitRecord = () => {
alert('记录已成功提交!\n1. 区块链存证已完成\n2. 已同步至家属端 APP\n3. 系统已自动计算本次服务积分')
showAddModal.value = false
return badges[type] || 'bg-gray-100 text-gray-600'
}
</script>
@@ -337,4 +391,20 @@ const submitRecord = () => {
.animate-bounce-in {
animation: bounce-in 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.list-move,
.list-enter-active,
.list-leave-active {
transition: all 0.5s ease;
}
.list-enter-from,
.list-leave-to {
opacity: 0;
transform: translateX(30px);
}
.list-leave-active {
position: absolute;
}
</style>

View File

@@ -1,5 +1,16 @@
<template>
<div class="space-y-8">
<!-- Search Bar -->
<div class="bg-slate-800/50 p-4 rounded-xl border border-slate-700 flex items-center space-x-4">
<div class="flex-1 relative">
<span class="absolute left-3 top-1/2 -translate-y-1/2 text-slate-500">🔍</span>
<input type="text" placeholder="搜索区块高度 / 交易哈希 / 账户地址..." class="w-full bg-slate-900 border border-slate-700 rounded-lg py-2 pl-10 pr-4 text-sm text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500 outline-none transition-all">
</div>
<button class="px-6 py-2 bg-blue-600 hover:bg-blue-500 text-white font-bold rounded-lg text-sm transition-colors">
查询
</button>
</div>
<!-- Network Stats -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div v-for="stat in stats" :key="stat.label" class="bg-[#1e293b]/50 border border-slate-700 p-4 rounded-lg">

View File

@@ -27,6 +27,37 @@
</button>
</div>
<!-- Manual Control Toggle -->
<div class="absolute top-16 right-4 z-10">
<button @click="toggleManualMode"
class="px-4 py-2 text-xs font-bold border rounded-lg backdrop-blur-md transition-all flex items-center space-x-2"
:class="isManualMode ? 'bg-orange-500 text-white border-orange-500 animate-pulse' : 'bg-black/50 text-white/50 border-white/20 hover:border-white/50'">
<span>🎮</span>
<span>{{ isManualMode ? '人工接管中' : '自动巡航模式' }}</span>
</button>
</div>
<!-- Manual Control Pad -->
<div v-if="isManualMode" class="absolute bottom-8 left-1/2 -translate-x-1/2 z-20 flex flex-col items-center space-y-2 animate-fade-in-up">
<button class="w-12 h-12 bg-white/10 hover:bg-white/30 backdrop-blur border border-white/20 rounded-lg flex items-center justify-center text-white text-xl active:bg-orange-500 active:scale-95 transition-all">
</button>
<div class="flex space-x-4">
<button class="w-12 h-12 bg-white/10 hover:bg-white/30 backdrop-blur border border-white/20 rounded-lg flex items-center justify-center text-white text-xl active:bg-orange-500 active:scale-95 transition-all">
</button>
<button class="w-12 h-12 bg-red-500/80 hover:bg-red-500 backdrop-blur border border-red-400 rounded-full flex items-center justify-center text-white text-xl active:scale-95 transition-all shadow-[0_0_15px_rgba(239,68,68,0.5)]">
🛑
</button>
<button class="w-12 h-12 bg-white/10 hover:bg-white/30 backdrop-blur border border-white/20 rounded-lg flex items-center justify-center text-white text-xl active:bg-orange-500 active:scale-95 transition-all">
</button>
</div>
<button class="w-12 h-12 bg-white/10 hover:bg-white/30 backdrop-blur border border-white/20 rounded-lg flex items-center justify-center text-white text-xl active:bg-orange-500 active:scale-95 transition-all">
</button>
</div>
<!-- SVG Filters for Edge Detection Effect -->
<svg class="absolute w-0 h-0">
<filter id="edge-detection">
@@ -329,6 +360,17 @@ const blockchainStore = useBlockchainStore()
// State
const currentLevel = computed(() => store.robotStatus.level)
const isManualMode = ref(false)
const toggleManualMode = () => {
isManualMode.value = !isManualMode.value
if (isManualMode.value) {
addLog('操作:已切换至人工遥控模式,自动巡航暂停。', 'info')
} else {
addLog('操作:恢复自动巡航模式。', 'info')
}
}
const fps = ref(30)
const latency = ref(12)
const logs = ref([])