add
This commit is contained in:
72
frontend/src/views/nurse/CareRecords.vue
Normal file
72
frontend/src/views/nurse/CareRecords.vue
Normal file
@@ -0,0 +1,72 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>Care Records</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-upload :http-request="upload" :show-file-list="false">
|
||||
<el-button size="mini">Upload</el-button>
|
||||
</el-upload>
|
||||
<div v-if="form.attachmentUrl" style="margin-top: 6px;">
|
||||
Uploaded: {{ form.attachmentUrl }}
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-button type="primary" @click="create">Save</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-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>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nurseCareCreate, nurseCareList, uploadFile } from "../../api";
|
||||
import { formatDateTime } from "../../utils/date";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: { elderId: "", content: "", recordTime: "", attachmentUrl: "" },
|
||||
filterElderId: "",
|
||||
items: []
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async upload(option) {
|
||||
try {
|
||||
const res = await uploadFile(option.file);
|
||||
this.form.attachmentUrl = res.data.data.url;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "upload failed");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
try {
|
||||
const payload = { ...this.form, recordTime: formatDateTime(this.form.recordTime) };
|
||||
await nurseCareCreate(payload);
|
||||
this.$message.success("saved");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
}
|
||||
},
|
||||
async load() {
|
||||
if (!this.filterElderId) return;
|
||||
try {
|
||||
const res = await nurseCareList(this.filterElderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
6
frontend/src/views/nurse/Dashboard.vue
Normal file
6
frontend/src/views/nurse/Dashboard.vue
Normal file
@@ -0,0 +1,6 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>Nurse Dashboard</h3>
|
||||
<p>Use the menu to manage schedules and records.</p>
|
||||
</div>
|
||||
</template>
|
||||
52
frontend/src/views/nurse/Handovers.vue
Normal file
52
frontend/src/views/nurse/Handovers.vue
Normal file
@@ -0,0 +1,52 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>Handovers</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>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nurseHandoverCreate, nurseHandoverList } from "../../api";
|
||||
import { formatDate } from "../../utils/date";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: { date: "", content: "" },
|
||||
items: []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.load();
|
||||
},
|
||||
methods: {
|
||||
async load() {
|
||||
try {
|
||||
const res = await nurseHandoverList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
}
|
||||
},
|
||||
async create() {
|
||||
try {
|
||||
const payload = { ...this.form, date: formatDate(this.form.date) };
|
||||
await nurseHandoverCreate(payload);
|
||||
this.$message.success("saved");
|
||||
this.load();
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
67
frontend/src/views/nurse/HealthRecords.vue
Normal file
67
frontend/src/views/nurse/HealthRecords.vue
Normal file
@@ -0,0 +1,67 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>Health Records</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">
|
||||
<div style="display:flex; gap:8px;">
|
||||
<el-input v-model="form.bpSystolic" placeholder="Systolic" />
|
||||
<el-input v-model="form.bpDiastolic" placeholder="Diastolic" />
|
||||
</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>
|
||||
|
||||
<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-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>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nurseHealthCreate, nurseHealthList } from "../../api";
|
||||
import { formatDateTime } from "../../utils/date";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: { elderId: "", temperature: "", bpSystolic: "", bpDiastolic: "", heartRate: "", note: "", recordTime: "" },
|
||||
filterElderId: "",
|
||||
items: []
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
async create() {
|
||||
try {
|
||||
const payload = { ...this.form, recordTime: formatDateTime(this.form.recordTime) };
|
||||
await nurseHealthCreate(payload);
|
||||
this.$message.success("saved");
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "save failed");
|
||||
}
|
||||
},
|
||||
async load() {
|
||||
if (!this.filterElderId) return;
|
||||
try {
|
||||
const res = await nurseHealthList(this.filterElderId);
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
28
frontend/src/views/nurse/Notices.vue
Normal file
28
frontend/src/views/nurse/Notices.vue
Normal file
@@ -0,0 +1,28 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>Notices</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>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nurseNoticeList } from "../../api";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return { items: [] };
|
||||
},
|
||||
async created() {
|
||||
try {
|
||||
const res = await nurseNoticeList();
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
36
frontend/src/views/nurse/Schedules.vue
Normal file
36
frontend/src/views/nurse/Schedules.vue
Normal file
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<div class="page-card">
|
||||
<h3>My Schedule</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>
|
||||
</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>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { nurseSchedules } from "../../api";
|
||||
import { formatDate } from "../../utils/date";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return { date: "", items: [] };
|
||||
},
|
||||
methods: {
|
||||
async load() {
|
||||
if (!this.date) return;
|
||||
try {
|
||||
const res = await nurseSchedules(formatDate(this.date));
|
||||
this.items = res.data.data;
|
||||
} catch (e) {
|
||||
this.$message.error(e.message || "load failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
Reference in New Issue
Block a user