diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9ae98fc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+package-lock.json
+node_modules
+.DS_Store
+dist
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/README.md b/README.md
index a8bace8..618120e 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,10 @@
# rax-medical
-
-#### 介绍
-{**以下是 Gitee 平台说明,您可以替换此简介**
-Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
-无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
-
-#### 软件架构
-软件架构说明
-
-
-#### 安装教程
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 使用说明
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 参与贡献
-
-1. Fork 本仓库
-2. 新建 Feat_xxx 分支
-3. 提交代码
-4. 新建 Pull Request
-
-
-#### 特技
-
-1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
-3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
-4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
-5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+```bash
+# vue安装启动
+npm i
+npm run serve
+# node服务安装启动
+cd node-server
+npm i
+node index.js
+```
\ No newline at end of file
diff --git a/env.d.ts b/env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..6cb0bdd
--- /dev/null
+++ b/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/node-server/README.md b/node-server/README.md
new file mode 100644
index 0000000..3a4c187
--- /dev/null
+++ b/node-server/README.md
@@ -0,0 +1,7 @@
+# rax-medical
+## node-server
+123.57.147.184
+Xg137839
+
+
+
diff --git a/node-server/core/AIMedicineTable.js b/node-server/core/AIMedicineTable.js
new file mode 100644
index 0000000..015d320
--- /dev/null
+++ b/node-server/core/AIMedicineTable.js
@@ -0,0 +1,26 @@
+import common from "./common.js";
+const app = common.app;
+const connection = common.connection;
+const m_get = common.m_get;
+const nowTime = common.nowTime;
+
+const getTable = () => app.post('/getaimedicine', function (req, res) {
+ const database = req.body.database;
+ const table = `AIMedicineTable`;
+ const order = `ID`;
+ const Clause = false;
+ const start = ~~req.body.start;
+ const end = ~~req.body.end;
+ connection(database).query(m_get(table, Clause, order, start, end), function (error, results, fields) {
+ if (error) {
+ console.log(`${nowTime()} 错误:${JSON.stringify(error)}`);
+ return res.status(500).send(error);
+ } else {
+ res.send(results);
+ }
+ });
+});
+
+export default {
+ getTable
+};
diff --git a/node-server/core/common.js b/node-server/core/common.js
new file mode 100644
index 0000000..8574bf4
--- /dev/null
+++ b/node-server/core/common.js
@@ -0,0 +1,78 @@
+
+import express from "express";
+import mysql from "mysql";
+/**
+ * 401 需要跳转登录验证
+ * 500 接口错误
+ */
+const app = express();
+// 连接 mysql 数据库
+const connection = (database) => {
+ return mysql.createConnection({
+ host: '123.57.147.184',
+ port: '3306',
+ user: 'root',
+ password: 'Xg137839',
+ database: database || 'zhangxinhe'
+ });
+}
+
+// 查询数据方法 SELECT * FROM table
+const m_get = (table, Clause, order, start, end) => {
+ return `SELECT * FROM ${table} ${Clause ? 'WHERE ' + Clause : ``} ORDER BY ${order || `ID`} DESC ${!end ? `` : `LIMIT ` + start + `,` + end};`
+}
+// 插入数据方法 INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );
+const m_add = (table, field, value) => {
+ return `INSERT INTO ${table} ( ${field} ) VALUES ( ${value} );`
+}
+// 更新数据方法 UPDATE table_name SET field1=new-value1, field2=new-value2 [WHERE Clause]
+const m_update = (table, data, Clause) => {
+ return `UPDATE ${table} SET ${data} WHERE ${Clause};`
+}
+// 删除数据方法 DELETE FROM table_name [WHERE Clause]
+const m_delete = (table, Clause) => {
+ return `DELETE FROM ${table} WHERE ${Clause};`
+}
+
+const nowTime = () => {
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = now.getMonth();
+ const date = now.getDate() >= 10 ? now.getDate() : ('0' + now.getDate());
+ const hour = now.getHours() >= 10 ? now.getHours() : ('0' + now.getHours());
+ const miu = now.getMinutes() >= 10 ? now.getMinutes() : ('0' + now.getMinutes());
+ const sec = now.getSeconds() >= 10 ? now.getSeconds() : ('0' + now.getSeconds());
+ return +year + "-" + (month + 1) + "-" + date + " " + hour + ":" + miu + ":" + sec;
+}
+
+/**
+ * 格式化时间
+ * @returns
+ */
+const dateFormater = (formater, time) => {
+ let date = time ? new Date(time) : new Date(),
+ Y = date.getFullYear() + '',
+ M = date.getMonth() + 1,
+ D = date.getDate(),
+ H = date.getHours(),
+ m = date.getMinutes(),
+ s = date.getSeconds();
+ return formater.replace(/YYYY|yyyy/g, Y)
+ .replace(/YY|yy/g, Y.substr(2, 2))
+ .replace(/MM/g, (M < 10 ? '0' : '') + M)
+ .replace(/DD|dd/g, (D < 10 ? '0' : '') + D)
+ .replace(/HH|hh/g, (H < 10 ? '0' : '') + H)
+ .replace(/mm/g, (m < 10 ? '0' : '') + m)
+ .replace(/ss/g, (s < 10 ? '0' : '') + s)
+}
+
+export default {
+ app,
+ connection,
+ m_get,
+ m_add,
+ m_update,
+ m_delete,
+ nowTime,
+ dateFormater
+};
\ No newline at end of file
diff --git a/node-server/core/doctorMedicineTable.js b/node-server/core/doctorMedicineTable.js
new file mode 100644
index 0000000..979309b
--- /dev/null
+++ b/node-server/core/doctorMedicineTable.js
@@ -0,0 +1,26 @@
+import common from "./common.js";
+const app = common.app;
+const connection = common.connection;
+const m_get = common.m_get;
+const nowTime = common.nowTime;
+
+const getTable = () => app.post('/getdoctormedicine', function (req, res) {
+ const database = req.body.database;
+ const table = `DoctorMedicineTable`;
+ const order = `ID`;
+ const Clause = false;
+ const start = ~~req.body.start;
+ const end = ~~req.body.end;
+ connection(database).query(m_get(table, Clause, order, start, end), function (error, results, fields) {
+ if (error) {
+ console.log(`${nowTime()} 错误:${JSON.stringify(error)}`);
+ return res.status(500).send(error);
+ } else {
+ res.send(results);
+ }
+ });
+});
+
+export default {
+ getTable
+};
diff --git a/node-server/core/featureTable.js b/node-server/core/featureTable.js
new file mode 100644
index 0000000..f2c55f4
--- /dev/null
+++ b/node-server/core/featureTable.js
@@ -0,0 +1,26 @@
+import common from "./common.js";
+const app = common.app;
+const connection = common.connection;
+const m_get = common.m_get;
+const nowTime = common.nowTime;
+
+const getTable = () => app.post('/getfeature', function (req, res) {
+ const database = req.body.database;
+ const table = `FeatureTable`;
+ const order = `ID`;
+ const Clause = false;
+ const start = ~~req.body.start;
+ const end = ~~req.body.end;
+ connection(database).query(m_get(table, Clause, order, start, end), function (error, results, fields) {
+ if (error) {
+ console.log(`${nowTime()} 错误:${JSON.stringify(error)}`);
+ return res.status(500).send(error);
+ } else {
+ res.send(results);
+ }
+ });
+});
+
+export default {
+ getTable
+};
diff --git a/node-server/index.js b/node-server/index.js
new file mode 100644
index 0000000..1debc3e
--- /dev/null
+++ b/node-server/index.js
@@ -0,0 +1,33 @@
+
+import bodyParser from "body-parser";
+// 解决跨域
+import cors from "cors";
+import common from "./core/common.js";
+import featureTable from "./core/featureTable.js";
+import AIMedicineTable from "./core/AIMedicineTable.js";
+import doctorMedicineTable from "./core/doctorMedicineTable.js";
+
+// root/Gao!8636
+const app = common.app;
+const connection = common.connection;
+const nowTime = common.nowTime;
+
+//配置ajax跨域请求
+app.use(cors({
+ origin: "*",
+ credentials: true //每次登陆都验证跨域请求,要不会每次报跨域错误
+}));
+// 配置 bodyParser
+app.use(bodyParser.urlencoded({ extended: false }));
+app.use(bodyParser.json());
+
+app.listen(3001, () => console.log('服务启动! ' + nowTime()));
+
+connection().connect();
+
+featureTable.getTable();
+AIMedicineTable.getTable();
+doctorMedicineTable.getTable();
+
+// MedicineFeadbackInfoTable
+// TimingFeadbackInfoTable
diff --git a/node-server/package.json b/node-server/package.json
new file mode 100644
index 0000000..6f1d79d
--- /dev/null
+++ b/node-server/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "server",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "type": "module",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "body-parser": "^1.20.2",
+ "cors": "^2.8.5",
+ "express": "^4.18.2",
+ "mysql": "^2.18.1"
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..b2c3528
--- /dev/null
+++ b/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "rax-medical",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "serve": "vite",
+ "build": "run-p type-check build-only",
+ "preview": "vite preview",
+ "build-only": "vite build",
+ "type-check": "vue-tsc --noEmit"
+ },
+ "dependencies": {
+ "axios": "^1.3.3",
+ "sass": "^1.58.3",
+ "echarts": "^5.4.1",
+ "element-plus": "2.3.1",
+ "vue": "^3.2.45",
+ "vue-router": "^4.1.6"
+ },
+ "devDependencies": {
+ "@types/node": "^18.11.12",
+ "@vitejs/plugin-vue": "^4.0.0",
+ "@vue/tsconfig": "^0.1.3",
+ "npm-run-all": "^4.1.5",
+ "typescript": "^5.0.2",
+ "vite": "^4.0.0",
+ "vue-tsc": "^1.0.12"
+ }
+}
diff --git a/src/assets/css/global.scss b/src/assets/css/global.scss
new file mode 100644
index 0000000..35b7388
--- /dev/null
+++ b/src/assets/css/global.scss
@@ -0,0 +1,306 @@
+$main-color: #006080;
+
+html,
+body {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+}
+
+span,
+p {
+ word-wrap: break-word;
+}
+
+p,
+h3 {
+ margin: 0;
+}
+
+ul,
+li {
+ margin: 0;
+ list-style: none;
+}
+
+#app {
+ width: 100%;
+ height: 100%;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+::-webkit-scrollbar {
+ width: 5px;
+ height: 5px;
+ background: transparent;
+ border-radius: 0;
+}
+
+::-webkit-scrollbar-track-piece {
+ background-color: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ border: 0;
+ background-color: rgba($main-color, .5);
+ border-radius: 0;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ border: 0;
+ background-color: $main-color;
+}
+
+// 震动
+.shake_1 {
+ animation: shake_1 .2s ease-out;
+}
+
+@keyframes shake_1 {
+ 2% {
+ transform: translate(-.5px, .5px) rotate(-.5deg);
+ }
+
+ 4% {
+ transform: translate(2.5px, .5px) rotate(-.5deg);
+ }
+
+ 6% {
+ transform: translate(-.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 8% {
+ transform: translate(.5px, .5px) rotate(-.5deg);
+ }
+
+ 10% {
+ transform: translate(-.5px, -1.5px) rotate(-.5deg);
+ }
+
+ 12% {
+ transform: translate(.5px, -.5px) rotate(1.5deg);
+ }
+
+ 14% {
+ transform: translate(1.5px, 2.5px) rotate(-.5deg);
+ }
+
+ 16% {
+ transform: translate(-.5px, -.5px) rotate(.5deg);
+ }
+
+ 18% {
+ transform: translate(2.5px, .5px) rotate(.5deg);
+ }
+
+ 20% {
+ transform: translate(.5px, -1.5px) rotate(-.5deg);
+ }
+
+ 22% {
+ transform: translate(2.5px, 2.5px) rotate(-.5deg);
+ }
+
+ 24% {
+ transform: translate(2.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 26% {
+ transform: translate(.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 28% {
+ transform: translate(1.5px, .5px) rotate(.5deg);
+ }
+
+ 30% {
+ transform: translate(-1.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 32% {
+ transform: translate(.5px, .5px) rotate(.5deg);
+ }
+
+ 34% {
+ transform: translate(.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 36% {
+ transform: translate(2.5px, -.5px) rotate(1.5deg);
+ }
+
+ 38% {
+ transform: translate(.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 40% {
+ transform: translate(2.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 42% {
+ transform: translate(2.5px, -1.5px) rotate(.5deg);
+ }
+
+ 44% {
+ transform: translate(.5px, -.5px) rotate(.5deg);
+ }
+
+ 46% {
+ transform: translate(1.5px, -1.5px) rotate(.5deg);
+ }
+
+ 48% {
+ transform: translate(-1.5px, -.5px) rotate(.5deg);
+ }
+
+ 50% {
+ transform: translate(2.5px, -1.5px) rotate(1.5deg);
+ }
+
+ 52% {
+ transform: translate(.5px, 1.5px) rotate(.5deg);
+ }
+
+ 54% {
+ transform: translate(2.5px, -.5px) rotate(.5deg);
+ }
+
+ 56% {
+ transform: translate(2.5px, 2.5px) rotate(.5deg);
+ }
+
+ 58% {
+ transform: translate(2.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 60% {
+ transform: translate(1.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 62% {
+ transform: translate(-.5px, .5px) rotate(-.5deg);
+ }
+
+ 64% {
+ transform: translate(2.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 66% {
+ transform: translate(-1.5px, .5px) rotate(1.5deg);
+ }
+
+ 68% {
+ transform: translate(1.5px, -1.5px) rotate(.5deg);
+ }
+
+ 70% {
+ transform: translate(.5px, .5px) rotate(-.5deg);
+ }
+
+ 72% {
+ transform: translate(-.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 74% {
+ transform: translate(-1.5px, 1.5px) rotate(1.5deg);
+ }
+
+ 76% {
+ transform: translate(2.5px, -.5px) rotate(.5deg);
+ }
+
+ 78% {
+ transform: translate(2.5px, 2.5px) rotate(.5deg);
+ }
+
+ 80% {
+ transform: translate(-1.5px, 2.5px) rotate(.5deg);
+ }
+
+ 82% {
+ transform: translate(-1.5px, -.5px) rotate(.5deg);
+ }
+
+ 84% {
+ transform: translate(.5px, 1.5px) rotate(-.5deg);
+ }
+
+ 86% {
+ transform: translate(-.5px, 2.5px) rotate(.5deg);
+ }
+
+ 88% {
+ transform: translate(2.5px, 2.5px) rotate(1.5deg);
+ }
+
+ 90% {
+ transform: translate(-.5px, -1.5px) rotate(-.5deg);
+ }
+
+ 92% {
+ transform: translate(1.5px, .5px) rotate(.5deg);
+ }
+
+ 94% {
+ transform: translate(-.5px, -.5px) rotate(.5deg);
+ }
+
+ 96% {
+ transform: translate(1.5px, .5px) rotate(1.5deg);
+ }
+
+ 98% {
+ transform: translate(.5px, -.5px) rotate(1.5deg);
+ }
+
+ 0%,
+ 100% {
+ transform: translate(0, 0) rotate(0);
+ }
+}
+
+.el-select-dropdown__item.selected {
+ color: #006080;
+}
+.el-select {
+ --el-select-input-focus-border-color: #006080;
+}
+.el-dialog {
+ .el-dialog__header {
+ .el-dialog__headerbtn:focus .el-dialog__close,
+ .el-dialog__headerbtn:hover .el-dialog__close {
+ color: #006080;
+ }
+ }
+ .el-dialog__body {
+ padding: 10px 20px;
+ }
+ .el-button {
+ --el-button-hover-text-color: #006080;
+ --el-button-hover-bg-color: rgba(0, 96, 128, .1);
+ --el-button-hover-border-color: rgba(0, 96, 128, .8);
+ --el-button-active-text-color: #006080;
+ --el-button-active-border-color: rgba(0, 96, 128, .8);
+ --el-button-active-bg-color: rgba(0, 96, 128, .1);
+ }
+
+ .el-button--primary {
+ --el-button-text-color: white;
+ --el-button-bg-color: #006080;
+ --el-button-border-color: #006080;
+ --el-button-outline-color: rgba(0, 96, 128, .5);
+ --el-button-active-color: rgba(0, 96, 128, .8);
+ --el-button-hover-text-color: white;
+ --el-button-hover-link-text-color: rgba(0, 96, 128, .5);
+ --el-button-hover-bg-color: rgba(0, 96, 128, .7);
+ --el-button-hover-border-color: rgba(0, 96, 128, .7);
+ --el-button-active-bg-color: rgba(0, 96, 128, .8);
+ --el-button-active-border-color: rgba(0, 96, 128, .8);
+ }
+
+}
\ No newline at end of file
diff --git a/src/assets/imgs/heart.png b/src/assets/imgs/heart.png
new file mode 100644
index 0000000..6960932
Binary files /dev/null and b/src/assets/imgs/heart.png differ
diff --git a/src/assets/imgs/heart_alarm.png b/src/assets/imgs/heart_alarm.png
new file mode 100644
index 0000000..ed3ea62
Binary files /dev/null and b/src/assets/imgs/heart_alarm.png differ
diff --git a/src/assets/imgs/logo.png b/src/assets/imgs/logo.png
new file mode 100644
index 0000000..051d707
Binary files /dev/null and b/src/assets/imgs/logo.png differ
diff --git a/src/assets/imgs/lung.png b/src/assets/imgs/lung.png
new file mode 100644
index 0000000..d646a6f
Binary files /dev/null and b/src/assets/imgs/lung.png differ
diff --git a/src/assets/imgs/lung_alarm.png b/src/assets/imgs/lung_alarm.png
new file mode 100644
index 0000000..8637833
Binary files /dev/null and b/src/assets/imgs/lung_alarm.png differ
diff --git a/src/assets/imgs/main_body.png b/src/assets/imgs/main_body.png
new file mode 100644
index 0000000..5480a3a
Binary files /dev/null and b/src/assets/imgs/main_body.png differ
diff --git a/src/assets/imgs/main_body_copy.png b/src/assets/imgs/main_body_copy.png
new file mode 100644
index 0000000..f54d9a1
Binary files /dev/null and b/src/assets/imgs/main_body_copy.png differ
diff --git a/src/assets/imgs/menu_1.png b/src/assets/imgs/menu_1.png
new file mode 100644
index 0000000..d211536
Binary files /dev/null and b/src/assets/imgs/menu_1.png differ
diff --git a/src/assets/imgs/video_bck.png b/src/assets/imgs/video_bck.png
new file mode 100644
index 0000000..cc1a870
Binary files /dev/null and b/src/assets/imgs/video_bck.png differ
diff --git a/src/assets/medical.mp4 b/src/assets/medical.mp4
new file mode 100644
index 0000000..89fc390
Binary files /dev/null and b/src/assets/medical.mp4 differ
diff --git a/src/assets/微信图片_20231109085813.png b/src/assets/微信图片_20231109085813.png
new file mode 100644
index 0000000..c5bc01c
Binary files /dev/null and b/src/assets/微信图片_20231109085813.png differ
diff --git a/src/axios/index.js b/src/axios/index.js
new file mode 100644
index 0000000..6c4847f
--- /dev/null
+++ b/src/axios/index.js
@@ -0,0 +1,17 @@
+import axios from "axios";
+
+// const HOST = 'http://127.0.0.1:3001';
+const HOST = 'http://123.57.183.183:3001';
+
+export const get = (url, params, success) => {
+ axios.get(HOST + url, params)
+ .then(res => {
+ success(res);
+ });
+};
+export const post = (url, params, success) => {
+ axios.post(HOST + url, params)
+ .then(res => {
+ success(res);
+ });
+};
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..e4672a1
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,21 @@
+import { createApp, defineComponent, ref, reactive } from 'vue'
+
+import main from './main.vue'
+import router from './router'
+import ElementPlus from 'element-plus';
+import * as ElementPlusIconsVue from '@element-plus/icons-vue'
+
+
+import 'element-plus/dist/index.css';
+import './assets/css/global.scss';
+
+const app = createApp(main)
+
+app.use(router)
+ .use(ElementPlus) // ElementPlus 全局引入
+
+for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
+ app.component(key, component)
+}
+
+app.mount('#app')
diff --git a/src/main.vue b/src/main.vue
new file mode 100644
index 0000000..a139d24
--- /dev/null
+++ b/src/main.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..8496be6
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,14 @@
+import { createRouter, createWebHistory } from 'vue-router'
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ name: '远程管理',
+ component: () => import('@/views/remote-manage/remote-manage.vue'),
+ }
+ ]
+})
+
+export default router
diff --git a/src/views/remote-manage/chart-ecg.vue b/src/views/remote-manage/chart-ecg.vue
new file mode 100644
index 0000000..fb7efe2
--- /dev/null
+++ b/src/views/remote-manage/chart-ecg.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
diff --git a/src/views/remote-manage/chart-line.vue b/src/views/remote-manage/chart-line.vue
new file mode 100644
index 0000000..bb5c2b0
--- /dev/null
+++ b/src/views/remote-manage/chart-line.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
diff --git a/src/views/remote-manage/date-util.ts b/src/views/remote-manage/date-util.ts
new file mode 100644
index 0000000..e55f586
--- /dev/null
+++ b/src/views/remote-manage/date-util.ts
@@ -0,0 +1,17 @@
+export function dateFormater(formater: string, time?: any) {
+ let date = time ? new Date(time) : new Date(),
+ Y = date.getFullYear() + '',
+ M = date.getMonth() + 1,
+ D = date.getDate(),
+ H = date.getHours(),
+ m = date.getMinutes(),
+ s = date.getSeconds();
+ return formater
+ .replace(/YYYY|yyyy/g, Y)
+ .replace(/YY|yy/g, Y.substr(2, 2))
+ .replace(/MM/g, (M < 10 ? '0' : '') + M)
+ .replace(/DD|dd/g, (D < 10 ? '0' : '') + D)
+ .replace(/HH|hh/g, (H < 10 ? '0' : '') + H)
+ .replace(/mm/g, (m < 10 ? '0' : '') + m)
+ .replace(/ss/g, (s < 10 ? '0' : '') + s);
+}
diff --git a/src/views/remote-manage/remote-manage.vue b/src/views/remote-manage/remote-manage.vue
new file mode 100644
index 0000000..3110f0a
--- /dev/null
+++ b/src/views/remote-manage/remote-manage.vue
@@ -0,0 +1,858 @@
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ userName }}
+
+
+
+
+
+
+ 设置
+ 退出
+
+
+
+
+
+
+
+
远程控制 1
+
+
+
+
+
+
+
+
+
+
{{ isStart ? '终止' : '开始'
+ }}
+
+ AI给药
+ 人工给药
+
+
+
+
+
+
+
+
+
+ 患者信息
+ 已连接
+ 机器人运行正常
+
+
+
+ 返回
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tsconfig.config.json b/tsconfig.config.json
new file mode 100644
index 0000000..424084a
--- /dev/null
+++ b/tsconfig.config.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..11b3067
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,22 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "compilerOptions": {
+ "ignoreDeprecations": "5.0",
+ "allowJs": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ },
+ "lib": [
+ "es2017",
+ "dom"
+ ]
+ },
+
+ "references": [
+ {
+ "path": "./tsconfig.config.json"
+ }
+ ]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..b2dfd9e
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,23 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ base: '/medical/',
+ plugins: [vue()],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ },
+ css:{
+ preprocessorOptions:{
+ scss:{
+ // additionalData: '@import "./src/assets/css/global.scss";' //引入scss文件
+ }
+ }
+ }
+})