This commit is contained in:
王子琦
2026-01-20 13:24:10 +08:00
parent cc7d8f30ff
commit 19249fb374
81 changed files with 475 additions and 345 deletions

View File

@@ -1,4 +1,4 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
@@ -65,6 +65,17 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

View File

@@ -1,4 +1,4 @@
CREATE DATABASE IF NOT EXISTS nursing_home DEFAULT CHARACTER SET utf8mb4;
CREATE DATABASE IF NOT EXISTS nursing_home DEFAULT CHARACTER SET utf8mb4;
USE nursing_home;
DROP TABLE IF EXISTS payment_record;
@@ -141,3 +141,60 @@ CREATE TABLE payment_record (
INSERT INTO sys_user(username, password, name, phone, role, status)
VALUES ('admin', 'admin123', 'Administrator', '13800000000', 'ADMIN', 1);
INSERT INTO sys_user(username, password, name, phone, role, status)
VALUES
('nurse1', 'nurse123', '护工刘敏', '13800000001', 'NURSE', 1),
('nurse2', 'nurse123', '护工张凯', '13800000002', 'NURSE', 1),
('family1', 'family123', '家属王伟', '13800000003', 'FAMILY', 1);
INSERT INTO elder(name, gender, id_card, birthday, room_no, check_in_date, care_level, status, remark)
VALUES
('陈国强', 'M', '110101194001010011', '1940-01-01', 'A101', '2023-01-10', '一级', '在住', '糖尿病史'),
('李秀兰', 'F', '110101194502020022', '1945-02-02', 'A102', '2023-02-15', '二级', '在住', '需要日常护理'),
('王德华', 'M', '110101195003030033', '1950-03-03', 'B201', '2023-03-20', '一级', '在住', '身体状况良好');
INSERT INTO family_elder(family_id, elder_id, relationship)
VALUES
(3, 1, '儿子'),
(3, 2, '女儿');
INSERT INTO schedule(nurse_id, date, shift, task)
VALUES
(2, '2024-06-01', '早班', 'A区日常巡查'),
(2, '2024-06-02', '夜班', 'A区夜间护理'),
(3, '2024-06-01', '中班', 'B区护理支持');
INSERT INTO care_record(elder_id, nurse_id, content, attachment_url, record_time)
VALUES
(1, 2, '协助用餐与日常清洁', NULL, '2024-06-01 09:30:00'),
(2, 3, '协助进行下肢活动训练', NULL, '2024-06-01 14:10:00');
INSERT INTO health_record(elder_id, nurse_id, temperature, bp_systolic, bp_diastolic, heart_rate, note, record_time)
VALUES
(1, 2, 36.6, 120, 80, 72, '正常', '2024-06-01 09:45:00'),
(2, 3, 36.8, 130, 85, 78, '血压略高', '2024-06-01 14:20:00');
INSERT INTO handover(nurse_id, date, content)
VALUES
(2, '2024-06-01', 'A区平稳晚餐后关注陈国强'),
(3, '2024-06-01', 'B区训练完成无异常情况');
INSERT INTO notice(title, content, target_role, target_user_id, created_by)
VALUES
('培训通知', '本周五10点进行消防演练培训', 'NURSE', NULL, 1),
('探视时间', '探视时间更新为 14:00-17:00', 'FAMILY', NULL, 1),
('全员会议', '周一上午召开月度会议', 'ALL', NULL, 1);
INSERT INTO feedback(family_id, elder_id, type, content, rating, status)
VALUES
(3, 1, 'SUGGESTION', '建议餐食增加蔬菜比例', 4, 'NEW');
INSERT INTO bill(elder_id, month, bed_fee, care_fee, meal_fee, other_fee, total, status)
VALUES
(1, '2024-05', 2000.00, 1500.00, 800.00, 0.00, 4300.00, 'UNPAID'),
(2, '2024-05', 2000.00, 1800.00, 800.00, 100.00, 4700.00, 'PAID');
INSERT INTO payment_record(bill_id, family_id, amount, method, paid_at)
VALUES
(2, 3, 4700.00, 'ONLINE', '2024-05-28 10:00:00');

View File

@@ -1,4 +1,4 @@
package com.nursinghome;
package com.nursinghome;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.common;
package com.nursinghome.common;
public class ApiException extends RuntimeException {
public ApiException(String message) {

View File

@@ -1,4 +1,4 @@
package com.nursinghome.common;
package com.nursinghome.common;
public class ApiResponse<T> {
private int code;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.common;
package com.nursinghome.common;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.config;
package com.nursinghome.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.config;
package com.nursinghome.config;
import cn.dev33.satoken.stp.StpInterface;
import com.nursinghome.entity.User;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.config;
package com.nursinghome.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.controller;
package com.nursinghome.controller;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.StpUtil;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.controller;
package com.nursinghome.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.controller;
package com.nursinghome.controller;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.StpUtil;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.controller;
package com.nursinghome.controller;
import com.nursinghome.common.ApiResponse;
import org.springframework.beans.factory.annotation.Value;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.controller;
package com.nursinghome.controller;
import cn.dev33.satoken.annotation.SaCheckRole;
import cn.dev33.satoken.stp.StpUtil;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.math.BigDecimal;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.time.LocalDate;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class FeedbackRequest {
private Long elderId;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class FeedbackUpdateRequest {
private Long id;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.time.LocalDate;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.math.BigDecimal;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class NoticeRequest {
private String title;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class PayRequest {
private String method;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import jakarta.validation.constraints.NotBlank;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
import java.time.LocalDate;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class UserRequest {
private String username;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.dto;
package com.nursinghome.dto;
public class UserUpdateRequest {
private Long id;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDate;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDate;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.math.BigDecimal;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDate;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.entity;
package com.nursinghome.entity;
import java.time.LocalDateTime;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Bill;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.CareRecord;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Elder;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.FamilyElder;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Feedback;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Handover;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.HealthRecord;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Notice;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.PaymentRecord;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.Schedule;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.mapper;
package com.nursinghome.mapper;
import com.nursinghome.entity.User;
import org.apache.ibatis.annotations.*;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.service;
package com.nursinghome.service;
import com.nursinghome.entity.Bill;
import com.nursinghome.entity.PaymentRecord;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.service;
package com.nursinghome.service;
import com.nursinghome.common.ApiException;
import com.nursinghome.entity.Elder;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.service;
package com.nursinghome.service;
import com.nursinghome.common.ApiException;
import com.nursinghome.entity.Elder;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.service;
package com.nursinghome.service;
import com.nursinghome.common.ApiException;
import com.nursinghome.entity.User;

View File

@@ -1,4 +1,4 @@
package com.nursinghome.util;
package com.nursinghome.util;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

View File

@@ -1,11 +1,11 @@
server:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/nursing_home?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
url: jdbc:mysql://localhost:3307/nursing_home?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root
password: qq5211314
driver-class-name: com.mysql.cj.jdbc.Driver
servlet:
multipart:
@@ -23,6 +23,7 @@ sa-token:
is-concurrent: true
is-share: true
token-style: uuid
active-timeout: -1
app:
upload-dir: uploads

View File

@@ -1,4 +1,4 @@
{
{
"name": "nursing-home-frontend",
"version": "1.0.0",
"private": true,
@@ -8,6 +8,7 @@
},
"dependencies": {
"axios": "^1.6.8",
"core-js": "^3.36.0",
"element-ui": "^2.15.14",
"vue": "^2.7.16",
"vue-router": "^3.6.5"
@@ -15,8 +16,12 @@
"devDependencies": {
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-service": "^5.0.8",
"@babel/preset-env": "7.23.9",
"babel-core": "^7.0.0-bridge.0",
"babel-loader": "^8.3.0",
"vue-template-compiler": "^2.7.16"
},
"overrides": {
"@babel/preset-env": "7.23.9"
}
}

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Nursing Home</title>
<title>颐云养老院管理平台</title>
</head>
<body>
<noscript>

View File

@@ -2,7 +2,7 @@
<el-container style="min-height: 100vh;">
<el-aside width="220px" style="background: #0f2f23; color: #fff;">
<div style="padding: 18px 16px; font-size: 18px; font-weight: 600;">
Nursing Home
颐云养老院管理平台
</div>
<el-menu
:default-active="activeMenu"
@@ -16,12 +16,12 @@
</el-menu>
</el-aside>
<el-container>
<div class="header-bar">
<el-header class="header-bar">
<div>{{ roleLabel }}</div>
<div>
<el-button size="mini" type="primary" @click="handleLogout">Logout</el-button>
<el-button size="mini" type="primary" @click="handleLogout">退出登录</el-button>
</div>
</div>
</el-header>
<el-main>
<router-view />
</el-main>
@@ -42,42 +42,42 @@ export default {
menu() {
if (this.role === "ADMIN") {
return [
{ path: "/admin/dashboard", label: "Dashboard" },
{ path: "/admin/users", label: "Users" },
{ path: "/admin/elders", label: "Elders" },
{ path: "/admin/schedules", label: "Schedules" },
{ path: "/admin/bills", label: "Bills" },
{ path: "/admin/feedback", label: "Feedback" },
{ path: "/admin/notices", label: "Notices" }
{ path: "/admin/dashboard", label: "运营概览" },
{ path: "/admin/users", label: "账号管理" },
{ path: "/admin/elders", label: "长者档案" },
{ path: "/admin/schedules", label: "排班管理" },
{ path: "/admin/bills", label: "账单管理" },
{ path: "/admin/feedback", label: "反馈处理" },
{ path: "/admin/notices", label: "通知公告" }
];
}
if (this.role === "NURSE") {
return [
{ path: "/nurse/dashboard", label: "Dashboard" },
{ path: "/nurse/schedules", label: "My Schedule" },
{ path: "/nurse/care", label: "Care Records" },
{ path: "/nurse/health", label: "Health Records" },
{ path: "/nurse/handovers", label: "Handovers" },
{ path: "/nurse/notices", label: "Notices" }
{ path: "/nurse/dashboard", label: "工作台" },
{ path: "/nurse/schedules", label: "我的排班" },
{ path: "/nurse/care", label: "护理记录" },
{ path: "/nurse/health", label: "健康监测" },
{ path: "/nurse/handovers", label: "交班记录" },
{ path: "/nurse/notices", label: "通知中心" }
];
}
return [
{ path: "/family/dashboard", label: "Dashboard" },
{ path: "/family/elders", label: "Elders" },
{ path: "/family/care", label: "Daily Care" },
{ path: "/family/health", label: "Health" },
{ path: "/family/bills", label: "Bills" },
{ path: "/family/feedback", label: "Feedback" },
{ path: "/family/notices", label: "Notices" }
{ path: "/family/dashboard", label: "家属首页" },
{ path: "/family/elders", label: "亲人档案" },
{ path: "/family/care", label: "每日动态" },
{ path: "/family/health", label: "健康记录" },
{ path: "/family/bills", label: "账单支付" },
{ path: "/family/feedback", label: "服务反馈" },
{ path: "/family/notices", label: "通知中心" }
];
},
activeMenu() {
return this.$route.path;
},
roleLabel() {
if (this.role === "ADMIN") return "Administrator";
if (this.role === "NURSE") return "Nurse";
return "Family";
if (this.role === "ADMIN") return "管理员";
if (this.role === "NURSE") return "护工";
return "家属";
}
},
methods: {

View File

@@ -1,19 +1,19 @@
<template>
<div class="login-page">
<div class="login-card">
<h2>Welcome Back</h2>
<h2>欢迎登录</h2>
<el-form :model="form" label-position="top">
<el-form-item label="Username">
<el-input v-model="form.username" placeholder="username"></el-input>
<el-form-item label="账号">
<el-input v-model="form.username" placeholder="请输入账号"></el-input>
</el-form-item>
<el-form-item label="Password">
<el-input v-model="form.password" type="password" placeholder="password"></el-input>
<el-form-item label="密码">
<el-input v-model="form.password" type="password" placeholder="请输入密码"></el-input>
</el-form-item>
<el-button type="primary" style="width: 100%;" @click="handleLogin">Login</el-button>
<el-button type="primary" style="width: 100%;" @click="handleLogin">登录</el-button>
</el-form>
<div class="login-footer">
<span>No account?</span>
<el-button type="text" @click="$router.push('/register')">Register</el-button>
<span>还没有账号</span>
<el-button type="text" @click="$router.push('/register')">注册</el-button>
</div>
</div>
</div>

View File

@@ -1,30 +1,30 @@
<template>
<div class="login-page">
<div class="login-card">
<h2>Family Register</h2>
<h2>家属注册</h2>
<el-form :model="form" label-position="top">
<el-form-item label="Username">
<el-form-item label="账号">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="Password">
<el-form-item label="密码">
<el-input v-model="form.password" type="password"></el-input>
</el-form-item>
<el-form-item label="Name">
<el-form-item label="姓名">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="Phone">
<el-form-item label="手机号">
<el-input v-model="form.phone"></el-input>
</el-form-item>
<el-form-item label="Elder ID Card">
<el-form-item label="亲属身份证号">
<el-input v-model="form.elderIdCard"></el-input>
</el-form-item>
<el-form-item label="Relationship">
<el-input v-model="form.relationship" placeholder="son/daughter/spouse"></el-input>
<el-form-item label="关系">
<el-input v-model="form.relationship" placeholder="如:儿子/女儿/配偶"></el-input>
</el-form-item>
<el-button type="primary" style="width: 100%;" @click="handleRegister">Register</el-button>
<el-button type="primary" style="width: 100%;" @click="handleRegister">注册</el-button>
</el-form>
<div class="login-footer">
<el-button type="text" @click="$router.push('/login')">Back to Login</el-button>
<el-button type="text" @click="$router.push('/login')">返回登录</el-button>
</div>
</div>
</div>

View File

@@ -1,31 +1,31 @@
<template>
<div class="page-card">
<h3>Billing</h3>
<h3>账单管理</h3>
<div style="display:flex; gap: 12px; margin-bottom: 12px;">
<el-input v-model="filterElderId" placeholder="Elder ID" style="width: 200px;" />
<el-button type="primary" @click="load">Search</el-button>
<el-button @click="showCreate = true">New Bill</el-button>
<el-input v-model="filterElderId" placeholder="长者ID" style="width: 200px;" />
<el-button type="primary" @click="load">查询</el-button>
<el-button @click="showCreate = true">新建账单</el-button>
</div>
<el-table :data="bills" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="elderId" label="Elder ID" width="100" />
<el-table-column prop="month" label="Month" />
<el-table-column prop="total" label="Total" />
<el-table-column prop="status" label="Status" />
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="elderId" label="长者ID" width="100" />
<el-table-column prop="month" label="月份" />
<el-table-column prop="total" label="金额" />
<el-table-column prop="status" label="状态" />
</el-table>
<el-dialog title="New Bill" :visible.sync="showCreate">
<el-dialog title="新建账单" :visible.sync="showCreate">
<el-form :model="form" label-width="120px">
<el-form-item label="Elder ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="Month"><el-input v-model="form.month" placeholder="YYYY-MM"/></el-form-item>
<el-form-item label="Bed Fee"><el-input v-model="form.bedFee"/></el-form-item>
<el-form-item label="Care Fee"><el-input v-model="form.careFee"/></el-form-item>
<el-form-item label="Meal Fee"><el-input v-model="form.mealFee"/></el-form-item>
<el-form-item label="Other Fee"><el-input v-model="form.otherFee"/></el-form-item>
<el-form-item label="长者ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="月份"><el-input v-model="form.month" placeholder="YYYY-MM"/></el-form-item>
<el-form-item label="床位费"><el-input v-model="form.bedFee"/></el-form-item>
<el-form-item label="护理费"><el-input v-model="form.careFee"/></el-form-item>
<el-form-item label="餐饮费"><el-input v-model="form.mealFee"/></el-form-item>
<el-form-item label="其他费用"><el-input v-model="form.otherFee"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showCreate = false">Cancel</el-button>
<el-button type="primary" @click="create">Create</el-button>
<el-button @click="showCreate = false">取消</el-button>
<el-button type="primary" @click="create">创建</el-button>
</span>
</el-dialog>
</div>

View File

@@ -1,28 +1,28 @@
<template>
<div class="page-card">
<h3>Admin Dashboard</h3>
<h3>运营概览</h3>
<el-row :gutter="16" style="margin-top: 12px;">
<el-col :span="6">
<el-card>
<div>Elders</div>
<div>在住长者</div>
<h2>{{ stats.elders }}</h2>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<div>Nurses</div>
<div>护工数量</div>
<h2>{{ stats.nurses }}</h2>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<div>Families</div>
<div>家属数量</div>
<h2>{{ stats.families }}</h2>
</el-card>
</el-col>
<el-col :span="6">
<el-card>
<div>Income</div>
<div>累计收入</div>
<h2>{{ stats.income }}</h2>
</el-card>
</el-col>

View File

@@ -1,57 +1,89 @@
<template>
<div class="page-card">
<div style="display:flex; justify-content: space-between; align-items:center;">
<h3>Elders</h3>
<el-button type="primary" @click="showCreate = true">Add Elder</el-button>
<h3>长者档案</h3>
<el-button type="primary" @click="showCreate = true">新增长者</el-button>
</div>
<el-table :data="elders" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="name" label="Name" />
<el-table-column prop="gender" label="Gender" width="80" />
<el-table-column prop="idCard" label="ID Card" />
<el-table-column prop="roomNo" label="Room" width="100" />
<el-table-column prop="careLevel" label="Care Level" />
<el-table-column label="Actions" width="200">
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="gender" label="性别" width="80" />
<el-table-column prop="idCard" label="身份证号" />
<el-table-column prop="roomNo" label="房间号" width="100" />
<el-table-column prop="careLevel" label="护理等级" />
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button size="mini" @click="editElder(scope.row)">Edit</el-button>
<el-button size="mini" type="danger" @click="deleteElder(scope.row)">Delete</el-button>
<el-button size="mini" @click="editElder(scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="deleteElder(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="Add Elder" :visible.sync="showCreate">
<el-dialog title="新增长者" :visible.sync="showCreate">
<el-form :model="form" label-width="120px">
<el-form-item label="Name"><el-input v-model="form.name"/></el-form-item>
<el-form-item label="Gender"><el-input v-model="form.gender"/></el-form-item>
<el-form-item label="ID Card"><el-input v-model="form.idCard"/></el-form-item>
<el-form-item label="Birthday"><el-date-picker v-model="form.birthday" type="date"/></el-form-item>
<el-form-item label="Room No"><el-input v-model="form.roomNo"/></el-form-item>
<el-form-item label="Check In"><el-date-picker v-model="form.checkInDate" type="date"/></el-form-item>
<el-form-item label="Care Level"><el-input v-model="form.careLevel"/></el-form-item>
<el-form-item label="Status"><el-input v-model="form.status"/></el-form-item>
<el-form-item label="Remark"><el-input v-model="form.remark"/></el-form-item>
<el-form-item label="姓名"><el-input v-model="form.name"/></el-form-item>
<el-form-item label="性别">
<el-select v-model="form.gender" placeholder="选择性别">
<el-option label="男" value="M" />
<el-option label="女" value="F" />
</el-select>
</el-form-item>
<el-form-item label="身份证号"><el-input v-model="form.idCard" @input="syncBirthday('create')"/></el-form-item>
<el-form-item label="出生日期"><el-date-picker v-model="form.birthday" type="date"/></el-form-item>
<el-form-item label="房间号"><el-input v-model="form.roomNo"/></el-form-item>
<el-form-item label="入住日期"><el-date-picker v-model="form.checkInDate" type="date"/></el-form-item>
<el-form-item label="护理等级">
<el-select v-model="form.careLevel" placeholder="选择护理等级">
<el-option label="一级" value="一级" />
<el-option label="二级" value="二级" />
<el-option label="三级" value="三级" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="form.status" placeholder="选择状态">
<el-option label="在住" value="在住" />
<el-option label="离院" value="离院" />
</el-select>
</el-form-item>
<el-form-item label="备注"><el-input v-model="form.remark"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showCreate = false">Cancel</el-button>
<el-button type="primary" @click="createElder">Create</el-button>
<el-button @click="showCreate = false">取消</el-button>
<el-button type="primary" @click="createElder">创建</el-button>
</span>
</el-dialog>
<el-dialog title="Edit Elder" :visible.sync="showEdit">
<el-dialog title="编辑长者" :visible.sync="showEdit">
<el-form :model="editForm" label-width="120px">
<el-form-item label="Name"><el-input v-model="editForm.name"/></el-form-item>
<el-form-item label="Gender"><el-input v-model="editForm.gender"/></el-form-item>
<el-form-item label="ID Card"><el-input v-model="editForm.idCard"/></el-form-item>
<el-form-item label="Birthday"><el-date-picker v-model="editForm.birthday" type="date"/></el-form-item>
<el-form-item label="Room No"><el-input v-model="editForm.roomNo"/></el-form-item>
<el-form-item label="Check In"><el-date-picker v-model="editForm.checkInDate" type="date"/></el-form-item>
<el-form-item label="Care Level"><el-input v-model="editForm.careLevel"/></el-form-item>
<el-form-item label="Status"><el-input v-model="editForm.status"/></el-form-item>
<el-form-item label="Remark"><el-input v-model="editForm.remark"/></el-form-item>
<el-form-item label="姓名"><el-input v-model="editForm.name"/></el-form-item>
<el-form-item label="性别">
<el-select v-model="editForm.gender" placeholder="选择性别">
<el-option label="男" value="M" />
<el-option label="女" value="F" />
</el-select>
</el-form-item>
<el-form-item label="身份证号"><el-input v-model="editForm.idCard" @input="syncBirthday('edit')"/></el-form-item>
<el-form-item label="出生日期"><el-date-picker v-model="editForm.birthday" type="date"/></el-form-item>
<el-form-item label="房间号"><el-input v-model="editForm.roomNo"/></el-form-item>
<el-form-item label="入住日期"><el-date-picker v-model="editForm.checkInDate" type="date"/></el-form-item>
<el-form-item label="护理等级">
<el-select v-model="editForm.careLevel" placeholder="选择护理等级">
<el-option label="一级" value="一级" />
<el-option label="二级" value="二级" />
<el-option label="三级" value="三级" />
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="editForm.status" placeholder="选择状态">
<el-option label="在住" value="在住" />
<el-option label="离院" value="离院" />
</el-select>
</el-form-item>
<el-form-item label="备注"><el-input v-model="editForm.remark"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showEdit = false">Cancel</el-button>
<el-button type="primary" @click="updateElder">Save</el-button>
<el-button @click="showEdit = false">取消</el-button>
<el-button type="primary" @click="updateElder">保存</el-button>
</span>
</el-dialog>
</div>
@@ -122,6 +154,30 @@ export default {
} catch (e) {
this.$message.error(e.message || "delete failed");
}
},
syncBirthday(type) {
const target = type === "edit" ? this.editForm : this.form;
if (!target || !target.idCard) return;
const id = target.idCard.trim();
if (id.length === 18) {
const year = id.substring(6, 10);
const month = id.substring(10, 12);
const day = id.substring(12, 14);
target.birthday = `${year}-${month}-${day}`;
const genderFlag = parseInt(id.substring(16, 17), 10);
if (!Number.isNaN(genderFlag)) {
target.gender = genderFlag % 2 === 0 ? "F" : "M";
}
} else if (id.length === 15) {
const year = `19${id.substring(6, 8)}`;
const month = id.substring(8, 10);
const day = id.substring(10, 12);
target.birthday = `${year}-${month}-${day}`;
const genderFlag = parseInt(id.substring(14, 15), 10);
if (!Number.isNaN(genderFlag)) {
target.gender = genderFlag % 2 === 0 ? "F" : "M";
}
}
}
}
};

View File

@@ -1,35 +1,35 @@
<template>
<div class="page-card">
<h3>Feedback</h3>
<h3>反馈处理</h3>
<el-table :data="items" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="elderId" label="Elder ID" />
<el-table-column prop="type" label="Type" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="status" label="Status" width="120" />
<el-table-column label="Actions" width="200">
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="elderId" label="长者ID" />
<el-table-column prop="type" label="类型" />
<el-table-column prop="content" label="内容" />
<el-table-column prop="status" label="状态" width="120" />
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button size="mini" @click="openReply(scope.row)">Reply</el-button>
<el-button size="mini" @click="openReply(scope.row)">回复</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="Reply" :visible.sync="showReply">
<el-dialog title="回复处理" :visible.sync="showReply">
<el-form :model="replyForm" label-width="120px">
<el-form-item label="Status">
<el-form-item label="状态">
<el-select v-model="replyForm.status">
<el-option label="New" value="NEW" />
<el-option label="Processing" value="PROCESSING" />
<el-option label="Closed" value="CLOSED" />
<el-option label="新建" value="NEW" />
<el-option label="处理中" value="PROCESSING" />
<el-option label="已关闭" value="CLOSED" />
</el-select>
</el-form-item>
<el-form-item label="Reply">
<el-form-item label="回复">
<el-input v-model="replyForm.reply" type="textarea" />
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showReply = false">Cancel</el-button>
<el-button type="primary" @click="saveReply">Save</el-button>
<el-button @click="showReply = false">取消</el-button>
<el-button type="primary" @click="saveReply">保存</el-button>
</span>
</el-dialog>
</div>

View File

@@ -1,32 +1,32 @@
<template>
<div class="page-card">
<h3>Notices</h3>
<h3>通知公告</h3>
<div style="margin-bottom: 12px;">
<el-button type="primary" @click="showCreate = true">New Notice</el-button>
<el-button type="primary" @click="showCreate = true">发布通知</el-button>
</div>
<el-table :data="items" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="title" label="Title" />
<el-table-column prop="targetRole" label="Target" width="120" />
<el-table-column prop="createdAt" label="Created" />
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="title" label="标题" />
<el-table-column prop="targetRole" label="对象" width="120" />
<el-table-column prop="createdAt" label="创建时间" />
</el-table>
<el-dialog title="New Notice" :visible.sync="showCreate">
<el-dialog title="发布通知" :visible.sync="showCreate">
<el-form :model="form" label-width="120px">
<el-form-item label="Title"><el-input v-model="form.title"/></el-form-item>
<el-form-item label="Content"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-form-item label="Target Role">
<el-form-item label="标题"><el-input v-model="form.title"/></el-form-item>
<el-form-item label="内容"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-form-item label="通知对象">
<el-select v-model="form.targetRole">
<el-option label="All" value="ALL" />
<el-option label="Nurse" value="NURSE" />
<el-option label="Family" value="FAMILY" />
<el-option label="全部" value="ALL" />
<el-option label="护工" value="NURSE" />
<el-option label="家属" value="FAMILY" />
</el-select>
</el-form-item>
<el-form-item label="Target User ID"><el-input v-model="form.targetUserId"/></el-form-item>
<el-form-item label="指定用户ID"><el-input v-model="form.targetUserId"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showCreate = false">Cancel</el-button>
<el-button type="primary" @click="create">Create</el-button>
<el-button @click="showCreate = false">取消</el-button>
<el-button type="primary" @click="create">发布</el-button>
</span>
</el-dialog>
</div>

View File

@@ -1,48 +1,48 @@
<template>
<div class="page-card">
<h3>Schedule Management</h3>
<h3>排班管理</h3>
<div style="margin: 12px 0; display:flex; gap: 12px;">
<el-date-picker v-model="date" type="date" placeholder="Pick date" />
<el-button type="primary" @click="load">Search</el-button>
<el-button @click="showCreate = true">Add Schedule</el-button>
<el-date-picker v-model="date" type="date" placeholder="选择日期" />
<el-button type="primary" @click="load">查询</el-button>
<el-button @click="showCreate = true">新增排班</el-button>
</div>
<el-table :data="schedules" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="nurseId" label="Nurse ID" width="100" />
<el-table-column prop="date" label="Date" />
<el-table-column prop="shift" label="Shift" />
<el-table-column prop="task" label="Task" />
<el-table-column label="Actions" width="200">
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="nurseId" label="护工ID" width="100" />
<el-table-column prop="date" label="日期" />
<el-table-column prop="shift" label="班次" />
<el-table-column prop="task" label="任务" />
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button size="mini" @click="edit(scope.row)">Edit</el-button>
<el-button size="mini" type="danger" @click="remove(scope.row)">Delete</el-button>
<el-button size="mini" @click="edit(scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="remove(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="Schedule" :visible.sync="showCreate">
<el-dialog title="新增排班" :visible.sync="showCreate">
<el-form :model="form" label-width="120px">
<el-form-item label="Nurse ID"><el-input v-model="form.nurseId"/></el-form-item>
<el-form-item label="Date"><el-date-picker v-model="form.date" type="date"/></el-form-item>
<el-form-item label="Shift"><el-input v-model="form.shift"/></el-form-item>
<el-form-item label="Task"><el-input v-model="form.task"/></el-form-item>
<el-form-item label="护工ID"><el-input v-model="form.nurseId"/></el-form-item>
<el-form-item label="日期"><el-date-picker v-model="form.date" type="date"/></el-form-item>
<el-form-item label="班次"><el-input v-model="form.shift"/></el-form-item>
<el-form-item label="任务"><el-input v-model="form.task"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showCreate = false">Cancel</el-button>
<el-button type="primary" @click="create">Save</el-button>
<el-button @click="showCreate = false">取消</el-button>
<el-button type="primary" @click="create">保存</el-button>
</span>
</el-dialog>
<el-dialog title="Edit Schedule" :visible.sync="showEdit">
<el-dialog title="编辑排班" :visible.sync="showEdit">
<el-form :model="editForm" label-width="120px">
<el-form-item label="Nurse ID"><el-input v-model="editForm.nurseId"/></el-form-item>
<el-form-item label="Date"><el-date-picker v-model="editForm.date" type="date"/></el-form-item>
<el-form-item label="Shift"><el-input v-model="editForm.shift"/></el-form-item>
<el-form-item label="Task"><el-input v-model="editForm.task"/></el-form-item>
<el-form-item label="护工ID"><el-input v-model="editForm.nurseId"/></el-form-item>
<el-form-item label="日期"><el-date-picker v-model="editForm.date" type="date"/></el-form-item>
<el-form-item label="班次"><el-input v-model="editForm.shift"/></el-form-item>
<el-form-item label="任务"><el-input v-model="editForm.task"/></el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showEdit = false">Cancel</el-button>
<el-button type="primary" @click="update">Save</el-button>
<el-button @click="showEdit = false">取消</el-button>
<el-button type="primary" @click="update">保存</el-button>
</span>
</el-dialog>
</div>

View File

@@ -1,71 +1,71 @@
<template>
<div class="page-card">
<div style="display:flex; justify-content: space-between; align-items:center;">
<h3>User Management</h3>
<el-button type="primary" @click="showCreate = true">New User</el-button>
<h3>账号管理</h3>
<el-button type="primary" @click="showCreate = true">新建用户</el-button>
</div>
<div style="margin: 12px 0;">
<el-select v-model="role" placeholder="role" @change="loadUsers">
<el-option label="All" value=""></el-option>
<el-option label="Admin" value="ADMIN"></el-option>
<el-option label="Nurse" value="NURSE"></el-option>
<el-option label="Family" value="FAMILY"></el-option>
<el-select v-model="role" placeholder="角色" @change="loadUsers">
<el-option label="全部" value=""></el-option>
<el-option label="管理员" value="ADMIN"></el-option>
<el-option label="护工" value="NURSE"></el-option>
<el-option label="家属" value="FAMILY"></el-option>
</el-select>
</div>
<el-table :data="users" stripe>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="username" label="Username" />
<el-table-column prop="name" label="Name" />
<el-table-column prop="role" label="Role" width="100" />
<el-table-column prop="status" label="Status" width="100">
<el-table-column prop="id" label="编号" width="80" />
<el-table-column prop="username" label="账号" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="role" label="角色" width="100" />
<el-table-column prop="status" label="状态" width="100">
<template slot-scope="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : 'info'">
{{ scope.row.status === 1 ? 'Active' : 'Disabled' }}
{{ scope.row.status === 1 ? '启用' : '禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="Actions" width="200">
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button size="mini" @click="editUser(scope.row)">Edit</el-button>
<el-button size="mini" @click="resetPwd(scope.row)">Reset</el-button>
<el-button size="mini" @click="editUser(scope.row)">编辑</el-button>
<el-button size="mini" @click="resetPwd(scope.row)">重置密码</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="Create User" :visible.sync="showCreate">
<el-dialog title="新建用户" :visible.sync="showCreate">
<el-form :model="createForm" label-width="120px">
<el-form-item label="Username"><el-input v-model="createForm.username"/></el-form-item>
<el-form-item label="Password"><el-input v-model="createForm.password" type="password"/></el-form-item>
<el-form-item label="Name"><el-input v-model="createForm.name"/></el-form-item>
<el-form-item label="Phone"><el-input v-model="createForm.phone"/></el-form-item>
<el-form-item label="Role">
<el-form-item label="账号"><el-input v-model="createForm.username"/></el-form-item>
<el-form-item label="密码"><el-input v-model="createForm.password" type="password"/></el-form-item>
<el-form-item label="姓名"><el-input v-model="createForm.name"/></el-form-item>
<el-form-item label="手机号"><el-input v-model="createForm.phone"/></el-form-item>
<el-form-item label="角色">
<el-select v-model="createForm.role">
<el-option label="Admin" value="ADMIN"/>
<el-option label="Nurse" value="NURSE"/>
<el-option label="Family" value="FAMILY"/>
<el-option label="管理员" value="ADMIN"/>
<el-option label="护工" value="NURSE"/>
<el-option label="家属" value="FAMILY"/>
</el-select>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showCreate = false">Cancel</el-button>
<el-button type="primary" @click="createUser">Create</el-button>
<el-button @click="showCreate = false">取消</el-button>
<el-button type="primary" @click="createUser">创建</el-button>
</span>
</el-dialog>
<el-dialog title="Edit User" :visible.sync="showEdit">
<el-dialog title="编辑用户" :visible.sync="showEdit">
<el-form :model="editForm" label-width="120px">
<el-form-item label="Name"><el-input v-model="editForm.name"/></el-form-item>
<el-form-item label="Phone"><el-input v-model="editForm.phone"/></el-form-item>
<el-form-item label="Status">
<el-form-item label="姓名"><el-input v-model="editForm.name"/></el-form-item>
<el-form-item label="手机号"><el-input v-model="editForm.phone"/></el-form-item>
<el-form-item label="状态">
<el-select v-model="editForm.status">
<el-option label="Active" :value="1"/>
<el-option label="Disabled" :value="0"/>
<el-option label="启用" :value="1"/>
<el-option label="禁用" :value="0"/>
</el-select>
</el-form-item>
</el-form>
<span slot="footer">
<el-button @click="showEdit = false">Cancel</el-button>
<el-button type="primary" @click="updateUser">Save</el-button>
<el-button @click="showEdit = false">取消</el-button>
<el-button type="primary" @click="updateUser">保存</el-button>
</span>
</el-dialog>
</div>

View File

@@ -1,19 +1,19 @@
<template>
<div class="page-card">
<h3>Bills</h3>
<h3>账单支付</h3>
<div style="margin-bottom: 12px;">
<el-select v-model="elderId" placeholder="Select elder" @change="load">
<el-select v-model="elderId" placeholder="选择亲人" @change="load">
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
</el-select>
</div>
<el-table :data="items" stripe>
<el-table-column prop="month" label="Month" />
<el-table-column prop="total" label="Total" />
<el-table-column prop="status" label="Status" />
<el-table-column label="Actions" width="160">
<el-table-column prop="month" label="月份" />
<el-table-column prop="total" label="金额" />
<el-table-column prop="status" label="状态" />
<el-table-column label="操作" width="160">
<template slot-scope="scope">
<el-button size="mini" type="primary" @click="pay(scope.row)" :disabled="scope.row.status === 'PAID'">
Pay
支付
</el-button>
</template>
</el-table-column>

View File

@@ -1,15 +1,15 @@
<template>
<div class="page-card">
<h3>Daily Care</h3>
<h3>每日动态</h3>
<div style="margin-bottom: 12px;">
<el-select v-model="elderId" placeholder="Select elder" @change="load">
<el-select v-model="elderId" placeholder="选择亲人" @change="load">
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
</el-select>
</div>
<el-table :data="items" stripe>
<el-table-column prop="recordTime" label="Time" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="attachmentUrl" label="Attachment" />
<el-table-column prop="recordTime" label="时间" />
<el-table-column prop="content" label="护理内容" />
<el-table-column prop="attachmentUrl" label="附件" />
</el-table>
</div>
</template>

View File

@@ -1,6 +1,6 @@
<template>
<div class="page-card">
<h3>Family Dashboard</h3>
<p>View elder status, bills, and send feedback.</p>
<h3>家属首页</h3>
<p>查看亲人情况账单与服务反馈</p>
</div>
</template>

View File

@@ -1,11 +1,11 @@
<template>
<div class="page-card">
<h3>Elders</h3>
<h3>亲人档案</h3>
<el-table :data="elders" stripe>
<el-table-column prop="name" label="Name" />
<el-table-column prop="gender" label="Gender" width="80" />
<el-table-column prop="roomNo" label="Room" width="100" />
<el-table-column prop="careLevel" label="Care Level" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="gender" label="性别" width="80" />
<el-table-column prop="roomNo" label="房间号" width="100" />
<el-table-column prop="careLevel" label="护理等级" />
</el-table>
</div>
</template>

View File

@@ -1,26 +1,26 @@
<template>
<div class="page-card">
<h3>Feedback</h3>
<h3>服务反馈</h3>
<el-form :model="form" label-width="120px">
<el-form-item label="Elder">
<el-select v-model="form.elderId" placeholder="Select elder">
<el-form-item label="亲人">
<el-select v-model="form.elderId" placeholder="选择亲人">
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
</el-select>
</el-form-item>
<el-form-item label="Type">
<el-form-item label="类型">
<el-select v-model="form.type">
<el-option label="Suggestion" value="SUGGESTION" />
<el-option label="Complaint" value="COMPLAINT" />
<el-option label="Praise" value="PRAISE" />
<el-option label="建议" value="SUGGESTION" />
<el-option label="投诉" value="COMPLAINT" />
<el-option label="表扬" value="PRAISE" />
</el-select>
</el-form-item>
<el-form-item label="Content">
<el-form-item label="内容">
<el-input v-model="form.content" type="textarea" />
</el-form-item>
<el-form-item label="Rating">
<el-form-item label="评分">
<el-input v-model="form.rating" />
</el-form-item>
<el-button type="primary" @click="submit">Submit</el-button>
<el-button type="primary" @click="submit">提交</el-button>
</el-form>
</div>
</template>

View File

@@ -1,17 +1,17 @@
<template>
<div class="page-card">
<h3>Health Records</h3>
<h3>健康记录</h3>
<div style="margin-bottom: 12px;">
<el-select v-model="elderId" placeholder="Select elder" @change="load">
<el-select v-model="elderId" placeholder="选择亲人" @change="load">
<el-option v-for="elder in elders" :key="elder.id" :label="elder.name" :value="elder.id" />
</el-select>
</div>
<el-table :data="items" stripe>
<el-table-column prop="recordTime" label="Time" />
<el-table-column prop="temperature" label="Temp" />
<el-table-column prop="bpSystolic" label="BP S" />
<el-table-column prop="bpDiastolic" label="BP D" />
<el-table-column prop="heartRate" label="HR" />
<el-table-column prop="recordTime" label="时间" />
<el-table-column prop="temperature" label="体温" />
<el-table-column prop="bpSystolic" label="收缩压" />
<el-table-column prop="bpDiastolic" label="舒张压" />
<el-table-column prop="heartRate" label="心率" />
</el-table>
</div>
</template>

View File

@@ -1,10 +1,10 @@
<template>
<div class="page-card">
<h3>Notices</h3>
<h3>通知中心</h3>
<el-table :data="items" stripe>
<el-table-column prop="title" label="Title" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="createdAt" label="Created" />
<el-table-column prop="title" label="标题" />
<el-table-column prop="content" label="内容" />
<el-table-column prop="createdAt" label="时间" />
</el-table>
</div>
</template>

View File

@@ -1,28 +1,28 @@
<template>
<div class="page-card">
<h3>Care Records</h3>
<h3>护理记录</h3>
<el-form :model="form" label-width="120px">
<el-form-item label="Elder ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="Content"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-form-item label="Record Time"><el-date-picker v-model="form.recordTime" type="datetime"/></el-form-item>
<el-form-item label="Attachment">
<el-form-item label="长者ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="护理内容"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-form-item label="记录时间"><el-date-picker v-model="form.recordTime" type="datetime"/></el-form-item>
<el-form-item label="附件">
<el-upload :http-request="upload" :show-file-list="false">
<el-button size="mini">Upload</el-button>
<el-button size="mini">上传</el-button>
</el-upload>
<div v-if="form.attachmentUrl" style="margin-top: 6px;">
Uploaded: {{ form.attachmentUrl }}
已上传: {{ form.attachmentUrl }}
</div>
</el-form-item>
<el-button type="primary" @click="create">Save</el-button>
<el-button type="primary" @click="create">保存</el-button>
</el-form>
<div style="margin-top: 16px;">
<el-input v-model="filterElderId" placeholder="Elder ID" style="width: 200px;" />
<el-button @click="load" style="margin-left: 8px;">Search</el-button>
<el-input v-model="filterElderId" placeholder="长者ID" style="width: 200px;" />
<el-button @click="load" style="margin-left: 8px;">查询</el-button>
<el-table :data="items" stripe style="margin-top: 12px;">
<el-table-column prop="elderId" label="Elder ID" width="100" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="recordTime" label="Record Time" />
<el-table-column prop="elderId" label="长者ID" width="100" />
<el-table-column prop="content" label="护理内容" />
<el-table-column prop="recordTime" label="记录时间" />
</el-table>
</div>
</div>

View File

@@ -1,6 +1,6 @@
<template>
<div class="page-card">
<h3>Nurse Dashboard</h3>
<p>Use the menu to manage schedules and records.</p>
<h3>护工工作台</h3>
<p>通过左侧菜单管理排班与护理记录</p>
</div>
</template>

View File

@@ -1,15 +1,15 @@
<template>
<div class="page-card">
<h3>Handovers</h3>
<h3>交班记录</h3>
<el-form :model="form" label-width="120px">
<el-form-item label="Date"><el-date-picker v-model="form.date" type="date"/></el-form-item>
<el-form-item label="Content"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-button type="primary" @click="create">Save</el-button>
<el-form-item label="日期"><el-date-picker v-model="form.date" type="date"/></el-form-item>
<el-form-item label="内容"><el-input v-model="form.content" type="textarea"/></el-form-item>
<el-button type="primary" @click="create">保存</el-button>
</el-form>
<el-table :data="items" stripe style="margin-top: 12px;">
<el-table-column prop="date" label="Date" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="date" label="日期" />
<el-table-column prop="content" label="内容" />
</el-table>
</div>
</template>

View File

@@ -1,31 +1,31 @@
<template>
<div class="page-card">
<h3>Health Records</h3>
<h3>健康监测</h3>
<el-form :model="form" label-width="140px">
<el-form-item label="Elder ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="Temperature"><el-input v-model="form.temperature"/></el-form-item>
<el-form-item label="Blood Pressure">
<el-form-item label="长者ID"><el-input v-model="form.elderId"/></el-form-item>
<el-form-item label="体温"><el-input v-model="form.temperature"/></el-form-item>
<el-form-item label="血压">
<div style="display:flex; gap:8px;">
<el-input v-model="form.bpSystolic" placeholder="Systolic" />
<el-input v-model="form.bpDiastolic" placeholder="Diastolic" />
<el-input v-model="form.bpSystolic" placeholder="收缩压" />
<el-input v-model="form.bpDiastolic" placeholder="舒张压" />
</div>
</el-form-item>
<el-form-item label="Heart Rate"><el-input v-model="form.heartRate"/></el-form-item>
<el-form-item label="Note"><el-input v-model="form.note"/></el-form-item>
<el-form-item label="Record Time"><el-date-picker v-model="form.recordTime" type="datetime"/></el-form-item>
<el-button type="primary" @click="create">Save</el-button>
<el-form-item label="心率"><el-input v-model="form.heartRate"/></el-form-item>
<el-form-item label="备注"><el-input v-model="form.note"/></el-form-item>
<el-form-item label="记录时间"><el-date-picker v-model="form.recordTime" type="datetime"/></el-form-item>
<el-button type="primary" @click="create">保存</el-button>
</el-form>
<div style="margin-top: 16px;">
<el-input v-model="filterElderId" placeholder="Elder ID" style="width: 200px;" />
<el-button @click="load" style="margin-left: 8px;">Search</el-button>
<el-input v-model="filterElderId" placeholder="长者ID" style="width: 200px;" />
<el-button @click="load" style="margin-left: 8px;">查询</el-button>
<el-table :data="items" stripe style="margin-top: 12px;">
<el-table-column prop="elderId" label="Elder ID" width="100" />
<el-table-column prop="temperature" label="Temp" />
<el-table-column prop="bpSystolic" label="BP S" />
<el-table-column prop="bpDiastolic" label="BP D" />
<el-table-column prop="heartRate" label="HR" />
<el-table-column prop="recordTime" label="Record Time" />
<el-table-column prop="elderId" label="长者ID" width="100" />
<el-table-column prop="temperature" label="体温" />
<el-table-column prop="bpSystolic" label="收缩压" />
<el-table-column prop="bpDiastolic" label="舒张压" />
<el-table-column prop="heartRate" label="心率" />
<el-table-column prop="recordTime" label="记录时间" />
</el-table>
</div>
</div>

View File

@@ -1,10 +1,10 @@
<template>
<div class="page-card">
<h3>Notices</h3>
<h3>通知中心</h3>
<el-table :data="items" stripe>
<el-table-column prop="title" label="Title" />
<el-table-column prop="content" label="Content" />
<el-table-column prop="createdAt" label="Created" />
<el-table-column prop="title" label="标题" />
<el-table-column prop="content" label="内容" />
<el-table-column prop="createdAt" label="时间" />
</el-table>
</div>
</template>

View File

@@ -1,14 +1,14 @@
<template>
<div class="page-card">
<h3>My Schedule</h3>
<h3>我的排班</h3>
<div style="margin-bottom: 12px; display:flex; gap: 12px;">
<el-date-picker v-model="date" type="date" placeholder="Pick date" />
<el-button type="primary" @click="load">Search</el-button>
<el-date-picker v-model="date" type="date" placeholder="选择日期" />
<el-button type="primary" @click="load">查询</el-button>
</div>
<el-table :data="items" stripe>
<el-table-column prop="date" label="Date" />
<el-table-column prop="shift" label="Shift" />
<el-table-column prop="task" label="Task" />
<el-table-column prop="date" label="日期" />
<el-table-column prop="shift" label="班次" />
<el-table-column prop="task" label="任务" />
</el-table>
</div>
</template>