最后一次提交

This commit is contained in:
lxc 2020-10-22 10:51:21 +08:00
parent 70df69ddc6
commit 1faf36c3bf
202 changed files with 31413 additions and 428 deletions

48
234.iss Normal file
View File

@ -0,0 +1,48 @@
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Ô¶³ÌÒ½Áƿͻ§¶Ë"
#define MyAppVersion "1.0"
#define MyAppPublisher "301telemed"
#define MyAppURL "http://www.301hospital.com.cn/"
#define MyAppExeName "301telemed.exe"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{3575055F-2AE6-4E4A-904A-1ECF6BB388AF}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=setup
SetupIconFile=D:\WebStorm 2017.2.3\workspace\electron-quick-start\myElectronApp\windowIco.ico
Password=301301
Compression=lzma
SolidCompression=yes
OutPutdir=C:\Users\lxc\Desktop
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
[Files]
Source: "D:\WebStorm 2017.2.3\workspace\electron-quick-start\301telemed\301telemed-win32-x64\301telemed.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\WebStorm 2017.2.3\workspace\electron-quick-start\301telemed\301telemed-win32-x64\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

View File

@ -1,39 +0,0 @@
CC0 1.0 Universal
==================
Statement of Purpose
---------------------
The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights.
--------------------------------
A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
2. Waiver.
-----------
To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback.
----------------------------
Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
4. Limitations and Disclaimers.
--------------------------------
a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.

View File

@ -1,45 +1,21 @@
# electron-quick-start # socket client桌面程序 (使用quasar-electron)
**Clone and run for a quick way to see Electron in action.**
This is a minimal Electron application based on the [Quick Start Guide](https://electronjs.org/docs/tutorial/quick-start) within the Electron documentation.
**Use this app along with the [Electron API Demos](https://electronjs.org/#get-started) app for API code examples to help you get started.**
A basic Electron application needs just these files:
- `package.json` - Points to the app's main file and lists its details and dependencies.
- `main.js` - Starts the app and creates a browser window to render HTML. This is the app's **main process**.
- `index.html` - A web page to render. This is the app's **renderer process**.
You can learn more about each of these components within the [Quick Start Guide](https://electronjs.org/docs/tutorial/quick-start).
## To Use
To clone and run this repository you'll need [Git](https://git-scm.com) and [Node.js](https://nodejs.org/en/download/) (which comes with [npm](http://npmjs.com)) installed on your computer. From your command line:
## 安装moudel
```bash ```bash
# Clone this repository
git clone https://github.com/electron/electron-quick-start
# Go into the repository
cd electron-quick-start
# Install dependencies
npm install npm install
# Run the app
npm start
``` ```
Note: If you're using Linux Bash for Windows, [see this guide](https://www.howtogeek.com/261575/how-to-run-graphical-linux-desktop-applications-from-windows-10s-bash-shell/) or use `node` from the command prompt. ### 启动项目
```bash
npm run start
```
## Resources for Learning Electron
- [electronjs.org/docs](https://electronjs.org/docs) - all of Electron's documentation ### 项目编译exe
- [electronjs.org/community#boilerplates](https://electronjs.org/community#boilerplates) - sample starter apps created by the community ```bash
- [electron/electron-quick-start](https://github.com/electron/electron-quick-start) - a very basic starter Electron app npm run pack
- [electron/simple-samples](https://github.com/electron/simple-samples) - small applications with ideas for taking them further ```
- [electron/electron-api-demos](https://github.com/electron/electron-api-demos) - an Electron app that teaches you how to use Electron
- [hokein/electron-sample-apps](https://github.com/hokein/electron-sample-apps) - small demo apps for the various Electron APIs
## License > 项目打包成安装文件使用`234.iss`,打包后的文件会出现在桌面
[CC0 1.0 (Public Domain)](LICENSE.md)

View File

@ -1,19 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
<!-- All of the Node.js APIs are available in this renderer process. -->
We are using Node.js <script>document.write(process.versions.node)</script>,
Chromium <script>document.write(process.versions.chrome)</script>,
and Electron <script>document.write(process.versions.electron)</script>.
<script>
// You can also require other files to run in this process
require('./renderer.js')
</script>
</body>
</html>

91
login.html Normal file
View File

@ -0,0 +1,91 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>登录</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<link rel="stylesheet" href="src/assets/layui/css/layui.css" />
<link rel="stylesheet" href="src/assets/css/public.css" />
</head>
<body>
<!--<button id="login">登录</button>
<button id="close">X</button>-->
<form id="loginBox">
<ul class="login-c">
<li>
<p><img src="src/assets/images/admin.png"/>用户名</p>
<input datatype="*" type="text" class="layui-input" name="userName" id="userName"/>
</li>
<li>
<p><img src="src/assets/images/password.png"/><span style="display: inline-block;width: 18px"></span></p>
<input datatype="*" type="password" class="layui-input" name="password" id="password"/>
</li>
<!--<li class="login-pw">-->
<!--<input type="checkbox" id="login-pw" class="f-left">-->
<!--<label for="login-pw" class="f-left">&nbsp;记住密码</label>-->
<!--</li>-->
<li class="login-messge"> <!--login-messge opacity:1-->
用户名或者密码错误
</li>
</ul>
<div class="login-btn">
<button class="layui-btn" type="submit" id="login">登录</button>
<a class="layui-btn layui-btn-primary" id="registered">注册</a>
</div>
</form>
</body>
<script src="src/assets/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="src/assets/layui/layui.js" ></script>
<script type="text/javascript" src="src/assets/js/Validform_v5.3.2.js" ></script>
<script>
const {ipcRenderer} = require('electron');
const url = parent.require('electron').remote.require('./url.config').url
$("#userName").val(localStorage.userName)
layui.use(['layer'], function(){
var layer = layui.layer;
});
$(document).keyup(function(event){
if(event.keyCode ==13){
$("#login").trigger("click");
}
});
$("#loginBox").Validform({
tiptype:function(msg,o,cssctl){
if(!o.obj.is("form")){
var infoObj=o.obj;
if(o.type==2 || o.type==4){
infoObj.removeClass("has-error")
}else{
if(infoObj.hasClass("has-error")){return;}
infoObj.addClass("has-error")
}
}
},
ajaxPost:true,
btnSubmit:'#login',
url:url+'client/login',
callback:function(data){
console.info(url+'client/login')
if(data.status==1){
require('electron').remote.getGlobal('account').accountId =data.data.account.accountId
require('electron').remote.getGlobal('account').realName = data.data.applicationHospital
localStorage.userName = $("#userName").val()
ipcRenderer.send('asynchronous-message', 'ping')
}else{
layer.open({
title: '消息'
,content: data.message
});
}
}
});
$("#registered").click(function(){
ipcRenderer.send('asynchronous-zhuce', 'ping')
})
</script>
</html>

271
main.js
View File

@ -1,50 +1,253 @@
const windowStateKeeper =require( 'electron-window-state')
// Modules to control application life and create native browser window // Modules to control application life and create native browser window
const {app, BrowserWindow} = require('electron') const {app, BrowserWindow,ipcMain,Tray,Menu,dialog,globalShortcut } = require('electron')
const fs = require("fs")
const path = require("path")
var urlConfig = require("./url.config");
console.log(urlConfig)
var url =urlConfig .url
var type = urlConfig.type;
//获取mac地址的js
const getMac = require('getmac')
//网络请求
const request = require("request");
//登陆状态
let logined = false;
// Keep a global reference of the window object, if you don't, the window will // Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected. // be closed automatically when the JavaScript object is garbage collected.
let mainWindow let mainWindow
let tray;
let settings = {};;
let isWin = process.platform === 'win32';
let isOsx = process.platform === 'darwin';
global.account = {
accountId: ''
,realName:''
}
//托盘菜单
var lable = '切换为'+(type=='1'?'正式版':'测试版');
let trayMenu = [
{
label: `打开`,
click() {
mainWindow.show();
}
},
{
label:lable,
click(){
var data = {"type":"1","url": "http://192.168.3.203:8087/"}
if(type==1){
var data = {"type":"2","url": "http://202.106.159.90/"}
}
function createWindow () { fs.writeFile(path.join(app.getPath('userData'), '/url.config.json'),JSON.stringify(data),function(){
// Create the browser window. app.relaunch({ args: process.argv.slice(1).concat(['--relaunch']) })
mainWindow = new BrowserWindow({width: 800, height: 600}) app.quit();
// and load the index.html of the app.
mainWindow.loadFile('index.html')
// Open the DevTools.
// mainWindow.webContents.openDevTools()
// Emitted when the window is closed.
mainWindow.on('closed', function () {
// Dereference the window object, usually you would store windows
// in an array if your app supports multi windows, this is the time
// when you should delete the corresponding element.
mainWindow = null
}) })
}
},
{
type: 'separator'
},
{
label: '退出',
selector: 'terminate:',
click() {
logined = false;
mainWindow = null;
tray.destroy();
tray = null;
app.quit();
}
}
];
const icon = __dirname+'/src/assets/images/applogo.png';
//Windows系统托盘
function createTray() {
if (!isOsx) {
// Always show the tray icon on windows
settings.showOnTray = true;
}
if (settings.showOnTray) {
if (tray ) {
return;
}
let contextmenu = Menu.buildFromTemplate(trayMenu);
// Init tray icon
tray = new Tray(icon);
tray.on('right-click', () => {
tray.popUpContextMenu();
});
tray.on('click', () => {
mainWindow.show();
});
tray.setContextMenu(contextmenu);
} else {
if (!tray) return;
tray.destroy();
tray = null;
}
} }
// This method will be called when Electron has finished function updateTray() {
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)
// Quit when all windows are closed. trayMenu.splice(1,1)
app.on('window-all-closed', function () { let contextmenu1 = Menu.buildFromTemplate(trayMenu);
// On macOS it is common for applications and their menu bar if (!tray) {
// to stay active until the user quits explicitly with Cmd + Q tray = new Tray(icon);
if (process.platform !== 'darwin') {
app.quit()
} }
tray.setContextMenu(contextmenu1);
}
//创建应用窗口方法
function createWindow () {
var mainWindowState = windowStateKeeper({
defaultWidth: 715,
defaultHeight: 400,
});
// Create the browser window.
mainWindow = new BrowserWindow({
x: mainWindowState.x,
y: mainWindowState.y,
width: 730,
height: 420,
minWidth: 400,
minHeight: 350,
})
mainWindow.setResizable(false);
// 当窗口被关闭时判断用户是否登陆来决定是否退出应用
mainWindow.on('close', function (e) {
console.log(logined)
if (!logined) {
mainWindow = null;
app.quit();
} else {
e.preventDefault();
mainWindow.hide();
}
})
ipcMain.on('print-getList', (event, deviceName) => {
const printers = mainWindow.webContents.getPrinters();
event.returnValue= printers;
})
ipcMain.on('print-start', (event, deviceName) => {
console.info('deviceName>>>>'+deviceName)
const printers = mainWindow.webContents.getPrinters();
console.info(printers)
printers.forEach(element => {
if (element.name === deviceName) {
console.log(element);
}
if (element.name === deviceName && element.status != 0) {
console.info('print-error', deviceName + '打印机异常');
event.returnValue = false;
}
event.returnValue = true;
});
})
//登陆成功请求跳转
ipcMain.on('asynchronous-message', (event, arg) => {
logined = true;
updateTray();
mainWindow.setResizable(true);
mainWindow.setSize(mainWindowState.width, mainWindowState.height);
mainWindowState.manage(mainWindow);
mainWindow.loadFile('src/index.html')
})
//注册账号请求跳转
ipcMain.on('asynchronous-zhuce', (event, arg) => {
mainWindow.setResizable(true);
mainWindow.setSize(mainWindowState.width, mainWindowState.height);
mainWindowState.manage(mainWindow);
mainWindow.loadFile('registered.html')
})
//注册序列号
ipcMain.on('asynchronous-reg', (event, arg) => {
getMac.getMac(function(err, macAddress){
request.post({url:'http://202.106.159.90/client/selectBySerialNumber', form: {serialNumber:arg,macAddress:macAddress}}, function(err,res,body){
var by= JSON.parse(body);
if(by.status==1){
mainWindow.loadFile('login.html')
}
event.returnValue = by
})
})
})
//下载文件
ipcMain.on('download', (event, arg) => {
mainWindow.webContents.downloadURL(arg);
})
mainWindow.webContents.session.on('will-download', (e, item) => {
const totalBytes = item.getTotalBytes();
//监听下载过程,计算并设置进度条进度
item.on('updated', () => {
mainWindow.setProgressBar(item.getReceivedBytes() / totalBytes);
});
//监听下载结束事件
item.on('done', (e, state) => {
//如果窗口还在的话,去掉进度条
if (!mainWindow.isDestroyed()) {
mainWindow.setProgressBar(-1);
}
//下载被取消或中断了
if (state === 'interrupted') {
dialog.showErrorBox('下载失败', `文件 ${item.getFilename()} 因为某些原因被中断下载`);
}
//下载完成
if (state === 'completed') {
dialog.showMessageBox({type:'info',title :'消息',message :'下载完成'})
}
});
});
createTray()
}
app.on('ready', ()=>{
//判断软件是否被激活
// getMac.getMac(function(err, macAddress){
// console.info(macAddress)
// request.post({url:'http://202.106.159.90/client/selectByMacAddress', form: {macAddress:macAddress}}, function(err,res,body){
// if(err){
// console.info(err)
// }
// var by= JSON.parse(body);
createWindow()
// if(by.status==1){
// console.info(mainWindow.getSize())
mainWindow.loadFile('login.html')
// }else{
// //如没有进入激活窗口
// mainWindow.loadFile('serialNumber.html')
// }
// })
// })
}) })
app.on('activate', function () { app.on('activate', function () {
// On macOS it's common to re-create a window in the app when the if (!mainWindow.isVisible()) {
// dock icon is clicked and there are no other windows open. mainWindow.show();
if (mainWindow === null) {
createWindow()
} }
}) })
// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.

1327
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,22 +1,27 @@
{ {
"name": "electron-quick-start", "name": "myElectronApp",
"version": "1.0.0", "version": "1.0.0",
"description": "A minimal Electron application", "description": "myElectronApp",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {
"start": "electron ." "start": "electron .",
"pack": "electron-packager . 301telemed --win --out ../301telemed --arch=x64 --app-version=0.0.1 --electron-version=3.0.13 --overwrite --ignore=.gitignore --asar --icon=windowIco.ico"
}, },
"repository": "https://github.com/electron/electron-quick-start",
"keywords": [ "keywords": [
"Electron", "Electron",
"quick", "quick",
"start", "start"
"tutorial",
"demo"
], ],
"author": "GitHub", "author": "lxc",
"license": "CC0-1.0", "license": "CC0-1.0",
"devDependencies": { "devDependencies": {
"electron": "^3.0.7" "electron": "^3.0.7",
"electron-packager": "^13.0.1"
},
"dependencies": {
"electron-window-state": "^5.0.3",
"getmac": "^1.4.6",
"request": "^2.88.0",
"vue": "^2.5.21"
} }
} }

360
registered.html Normal file
View File

@ -0,0 +1,360 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>注册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<link rel="stylesheet" href="src/assets/layui/css/layui.css" />
<link rel="stylesheet" href="src/assets/css/public.css" />
</head>
<body>
<div class="wrap">
<div class="h-top">
<span class="h-logo f-left">
<img src="src/assets/images/301logo.png" />
</span>
<ul class="h-infor f-left">
<li class="h-name f-left">欢迎注册</li>
</ul>
</div>
<div class="c-box">
<div class="f-box">
<!--主体-->
<form id="hosp_form" v-bind:action="action">
<div class="f-content layui-form">
<div class="layui-row">
<div class="layui-col-sm12 layui-col-md12">
<div class="layui-form-item">
<label class="layui-form-label">医院名称<span class="requiredSpan">*</span></label>
<div class="layui-input-block hospitalName">
<select name="provinceId" id="province" datatype="*" lay-filter="province" v-model="province">
<option value="" >请选择省/市</option>
<option v-for="p in provinceList" v-bind:value="p.code" >{{p.name}}</option>
</select>
<select name="cityId" id="city" lay-filter="city" datatype="*" v-model="city">
<option value="">请选择市</option>
<option v-for="c in cityList" v-bind:value="c.code" >{{c.name}}</option>
</select>
<select name="townId" id="town" lay-filter="town" datatype="*" v-model="town">
<option value="">请选择县</option>
<option v-for="t in townList" v-bind:value="t.code" >{{t.name}}</option>
</select>
<input name="hospName" type="text" class="layui-input" id="hospName" placeholder="请输入医院名称" datatype="*" value="">
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-form-item">
<label class="layui-form-label">登录名<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input v-bind:ajaxurl="ajaxurl" name="loginName" type="text" id="loginName" datatype="*" class="layui-input">
<span class="err_n"><i class="layui-icon">&#xe617;</i> 已被占用</span>
<span class="yes_r"><i class="layui-icon">&#xe617;</i> 可以使用</span>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">邮箱<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="email" type="email" id="email" datatype="e" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">诊室电话<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="conPhone" type="text" id="sectionTel" datatype="m" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">日门诊量<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="dayNum" type="text" id="dayNum" datatype="n" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">医院性质<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<select name="hospProp" id="hospProp" datatype="*">
<option value="1" >综合医院</option>
<option value="2" >中医院</option>
<option value="3" >中西医结合医院</option>
<option value="4" >民族医院</option>
<option value="5" >专科医院</option>
<option value="6" >护理院</option>
<option value="7" >疗养院</option>
<option value="8" >卫生院</option>
<option value="9" >社区卫生服务所站</option>
<option value="10" >门诊部</option>
<option value="11" >卫生所</option>
<option value="12" >其它</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">科室总数<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="sectionNum" type="text" id="sectionNum" datatype="n" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md6">
<div class="layui-form-item">
<label class="layui-form-label">密码<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input type="password" id="password1" placeholder="密码长度为6~16位" datatype="*6-16" name="password1" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">确认密码<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input type="password" name="password2" id="password2" placeholder="确认密码与密码一致" datatype="*" recheck="password1" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">联系手机<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="mobile" type="text" id="mobile" datatype="m" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">月住院量<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="monthNum" type="text" id="monthNum" datatype="n" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">医院等级<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<select name="hospLevel" id="hospLevel" datatype="*">
<option value="">请选择医院等级</option>
<option value="1" >一级甲等</option>
<option value="2" >一级乙等</option>
<option value="3" >一级丙等</option>
<option value="4" >二级甲等</option>
<option value="5" >二级乙等</option>
<option value="6" >二级丙等</option>
<option value="7" >三级特等</option>
<option value="8" >三级甲等</option>
<option value="9" >三级乙等</option>
<option value="10" >三级丙等</option>
<option value="11" >其他</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">床位总数<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<input name="bedNum" type="text" id="bedNum" datatype="n" class="layui-input">
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md12">
<div class="layui-form-item">
<label class="layui-form-label">通讯地址<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<textarea name="address" class="layui-textarea" rows="1" id="address" datatype="*"></textarea>
</div>
</div>
</div>
<div class="layui-col-sm12 layui-col-md12">
<div class="layui-form-item">
<label class="layui-form-label">医院简介<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<textarea name="desc" class="layui-textarea" rows="1" id="desc" datatype="*"></textarea>
</div>
</div>
</div>
<input type="hidden" id="photo" name="photo">
<div class="layui-col-sm12 layui-col-md12">
<div class="layui-form-item">
<label class="layui-form-label">头像上传<span class="requiredSpan">*</span></label>
<div class="layui-input-block">
<div class="layui-upload-drag" id="file1">
<div class="img_box">
<i class="layui-icon"></i>
<p>点击上传,或将图片拖拽到此处</p>
</div>
<div class="layui-upload-list">
<img class="layui-upload-img" id="fi_img1" src="">
<p id="fileText"></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--按钮-->
<div class="formBtn">
<a id="sub" class="layui-btn">注册</a>
</div>
</form>
</div>
</div>
</div>
<script type="text/javascript" src="src/assets/js/jquery-1.8.3.js" ></script>
<script type="text/javascript" src="src/assets/js/Validform_v5.3.2.js" ></script>
<script type="text/javascript" src="src/assets/layui/layui.js" ></script>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
var form;
const url = parent.require('electron').remote.require('./url.config').url
var vueForm = new Vue({
el:'#hosp_form',
data:{
ajaxurl:url+'reg/loginName',
action:url+'client/memberRegister',
provinceList:[],
province:'',
cityList:[],
city:'',
townList:[],
town:''
},
watch:{
province:function (newValue,oldValue) {
if(newValue != ''){
this.cityList = this.getdata(newValue);
}else{
this.cityList = [];
this.townList = [];
}
this.city=''
this.town=''
this.$nextTick(function () {
layui.use(['layer', 'form'], function () {
var form = layui.form;
form.render();
});
})
},
city:function (newValue,oldValue) {
if(newValue != ''){
this.townList = this.getdata(newValue);
}else{
this.townList = [];
}
this.town=''
this.$nextTick(function () {
layui.use(['layer', 'form'], function () {
var form = layui.form;
form.render();
});
})
}
},
created:function(){
this.provinceList = this.getdata('00')
},
methods:{
getdata:function (parentId) {
var addressListData = [];
$.ajax({
url:url+'reg/getRegionByParentCode',
data : { parentCode: parentId },
type: 'post',
async:false,
dataType: 'json',
success: function(data){
if(data.success == true){
addressListData = data.list.list;
}
}
})
return addressListData;
}
}
})
//必填选中
$("form").Validform({
tiptype:function(msg,o,cssctl){
if(!o.obj.is("form")){
var infoObj=o.obj;
console.info(infoObj)
if(o.type==2 || o.type==4){
if(infoObj[0].id=='province' ||infoObj[0].id=='city' ||infoObj[0].id=='town'){
infoObj = infoObj.next();
}
infoObj.removeClass("err_n");
if(infoObj[0].id == 'loginName'){
$('#loginName').next().hide();
$('#loginName').next().next().show();
}
}else{
if(infoObj[0].id=='province' ||infoObj[0].id=='city' ||infoObj[0].id=='town'){
infoObj = infoObj.next();
infoObj.find('div').find('input').focus()
}
if(infoObj.hasClass("err_n")){return;}
infoObj.addClass("err_n");
if(infoObj[0].id == 'loginName'){
$('#loginName').next().show();
$('#loginName').next().next().hide();
}
}
}
},
ajaxPost:true,
btnSubmit:'#sub',
callback:function(data){
//返回数据data是json对象{"info":"demo info","status":"y"}
//注意如果不是ajax方式提交表单传入callback这时data参数是当前表单对象回调函数会在表单验证全部通过后执行然后判断是否提交表单如果callback里明确return false则表单不会提交如果return true或没有return则会提交表单。
if(data.isSuccess){
console.info('注册成功')
window.location.href='registrationSuccess.html?loginName='+data.loginName+"&password="+data.password+"&hospName="+data.hospName;
}
}
});
layui.use(['form','upload'], function(){
form = layui.form;
var upload = layui.upload;
var uploadInst = upload.render({
elem: '#file1' //绑定元素
,url: url+'expertFileUpload/uploadAD' //上传接口
,before: function(obj){
//预读本地文件示例不支持ie8
obj.preview(function(index, file, result){
$('#file1').css('padding','0');
$('.img_box').css('display','none');
$('.layui-upload-list').css({'display':'block','margin':'0'}); //显示图片
$('#fi_img1').attr('src', result); //图片链接base64
$('#fi_img1').css('max-height','170px');
});
}
,done: function(res){
$('#photo').val(res.sessionFileName)
}
,error: function(){
//演示失败状态,并实现重传
$('.img_box').css('display','none');
$('.layui-upload-list').css('display','block'); //显示文字
var demoText = $('#fileText');
demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
demoText.find('.demo-reload').on('click', function(){
uploadInst.upload();
});
}
});
form.on('select(province)', function(data){
vueForm.province = data.value;
});
form.on('select(city)', function(data){
vueForm.city = data.value;
});
form.on('select(town)', function(data){
vueForm.town = data.value;
});
})
</script>
</body>
</html>

103
registrationSuccess.html Normal file
View File

@ -0,0 +1,103 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>注册</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<link rel="stylesheet" href="src/assets/layui/css/layui.css" />
<link rel="stylesheet" href="src/assets/css/public.css" />
</head>
<body>
<div class="wrap" id="wrapDiv">
<div class="h-top">
<span class="h-logo f-left">
<img src="src/assets/images/301logo.png" />
</span>
<ul class="h-infor f-left">
<li class="h-name f-left">尊敬的{{hospName}},您好</li>
</ul>
</div>
<div class="c-box">
<!--主体-->
<div id="regSuccess">
<div class="regSuc-c">
<p class="regSuc-t">请等待管理员审核,完成注册!</p>
<p class="regSuc-i">以下是您的用户信息:</p>
<div class="regSuc-inp">
<div class="layui-inline">
<label class="layui-form-label">用户名:</label>
<div class="layui-input-inline" style="width: 220px;">
<input class="layui-input f-left" type="text" readonly="readonly" v-model="loginName"/>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">密码:</label>
<div class="layui-input-inline" style="width: 180px;">
<input class="layui-input f-left" type="text" readonly="readonly" v-model="password"/>
</div>
</div>
</div>
<hr class="layui-bg-blue">
<p class="regSuc-b">
请务必妥善保管并留意手机短信获取审核通知。如有疑问请致电010-66936043
</p>
<div class="regSuc-f">
<p>中国人民解放军总医院 远程医学中心</p>
<p>{{ today | formatDate('yyyy.MM.dd') }}</p>
</div>
</div>
<div class="regSuccess-btn" style="clear: both;">
<button id="exit" type="button" class="layui-btn layui-btn-danger">退出</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="src/assets/js/jquery-1.8.3.js" ></script>
<script type="text/javascript" src="src/assets/js/util.js" ></script>
<script type="text/javascript" src="src/assets/layui/layui.js" ></script>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
var wrapDiv=new Vue({
el:'#wrapDiv',
data:{
loginName: getUrlParam("loginName"),
password: getUrlParam("password"),
hospName: getUrlParam("hospName"),
today: new Date()
},
filters: {
formatDate: function (value,fmt) {
let getDate = new Date(value);
let o = {
'M+': getDate.getMonth() + 1,
'd+': getDate.getDate(),
'h+': getDate.getHours(),
'm+': getDate.getMinutes(),
's+': getDate.getSeconds(),
'q+': Math.floor((getDate.getMonth() + 3) / 3),
'S': getDate.getMilliseconds()
};
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (getDate.getFullYear() + '').substr(4 - RegExp.$1.length))
}
for (let k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
}
}
return fmt;
}
}
})
$("#exit").click(function(){
const win = require('electron').remote.getCurrentWindow();
win.close();
})
</script>
</body>
</html>

View File

@ -1,3 +0,0 @@
// This file is required by the index.html file and will
// be executed in the renderer process for that window.
// All of the Node.js APIs are available in this process.

122
serialNumber.html Normal file
View File

@ -0,0 +1,122 @@
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>序列号</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
<link rel="stylesheet" href="src/assets/layui/css/layui.css" />
<link rel="stylesheet" href="src/assets/css/public.css" />
</head>
<body style="min-width: 710px;min-height: 320px;">
<div id="number-box">
<div class="f-left num-logo">
<img src="src/assets/images/301logo-1.png" />
</div>
<div class="f-left num-c">
<p>请输入序列号:</p>
<ul class="num-list" id="num-list">
<li class="f-left">
<input type="text" ref="regCode1" v-model="regCode1" id="regCode1" class="layui-input"/>
</li>
<li class="f-left">
<input type="text" ref="regCode2" v-model="regCode2" id="regCode2" class="layui-input"/>
</li>
<li class="f-left">
<input type="text" ref="regCode3" v-model="regCode3" id="regCode3" class="layui-input"/>
</li>
<li class="f-left">
<input type="text" ref="regCode4" v-model="regCode4" id="regCode4" class="layui-input"/>
</li>
<li class="num-tips-no" v-bind:class="{ numNo: errMsg}">
<p><i class="layui-icon layui-icon-tips"></i>{{errMsg}}</p>
<!--numNo 错误-li-class-->
</li><li class="num-tips-no">
<p><i class="layui-icon layui-icon-auz"></i>请确认</p>
<!--numYes 正确-li-class -->
</li>
</ul>
<div class="num-btn">
<button type="button" id="sub" class="layui-btn layui-btn-normal">确认</button>
</div>
</div>
</div>
<script src="src/assets/js/jquery-1.8.3.js"></script>
<script type="text/javascript" src="src/assets/layui/layui.js" ></script>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
const {ipcRenderer} = require('electron');
layui.use(['layer'], function(){
var layer = layui.layer;
});
var app = new Vue({
el:'#num-list',
data:{
regCode1:'',
regCode2:'',
regCode3:'',
regCode4:'',
errMsg:''
},
watch:{
regCode1:function(newRegCode1, oldRegCode1){
if(newRegCode1.length>4){
this.regCode1 = newRegCode1.substr(0,4)
this.regCode2 = newRegCode1.substr(4,newRegCode1.length-4)
$(this.$refs.regCode2).focus();
}
},
regCode2:function(newRegCode2, oldRegCode2){
if(newRegCode2.length>4){
this.regCode2 = newRegCode2.substr(0,4)
this.regCode3 = newRegCode2.substr(4,newRegCode2.length)
$(this.$refs.regCode3).focus();
}
if(newRegCode2.length==0){
$(this.$refs.regCode1).focus();
}
},
regCode3:function(newRegCode3, oldRegCode3){
if(newRegCode3.length>4){
this.regCode3 = newRegCode3.substr(0,4)
this.regCode4 = newRegCode3.substr(4,newRegCode3.length)
$(this.$refs.regCode4).focus();
}
if(newRegCode3.length==0){
$(this.$refs.regCode2).focus();
}
},
regCode4:function(newRegCode4, oldRegCode4){
console.info(newRegCode4)
if(newRegCode4.length>=4){
this.regCode4 = newRegCode4.substr(0,4)
}
if(newRegCode4.length==0){
$(this.$refs.regCode3).focus();
}
}
},
computed: {
regCode: {
get:function() {
return this.regCode1 + this.regCode2 + this.regCode3 + this.regCode4
}
}
}
})
$("#sub").click(function () {
if(app.regCode.length<16){
app.errMsg = '请先填写注册码!'
}else{
var regCode = app.regCode
var aa = ipcRenderer.sendSync('asynchronous-reg',regCode);
if(aa.status!=1){
app.errMsg= aa.message
}
}
})
</script>
</body>
</html>

View File

@ -0,0 +1,662 @@
HIS 一体化 301 远程医疗服务系统
温馨提示:本系统需在 win7 以上版本运行,平台所有操作需要在
Google 浏览器内完成
会员操作手册
中国人民解放军总医院
中国人民解放军医学院
远程医学中心
1
目录
一、 系统介绍..............................................................................................................4
1.1 系统简介 ........................................................................................................4
1.1.1 用户身份 ..............................................................................................4
1.1.2 用户说明 ..............................................................................................4
1.2 基本操作 ........................................................................................................4
1.2.1 用户说明 ..............................................................................................5
1.2.2 鼠标移动到列表事项操作 ..................................................................5
1.2.3 连接操作 ..............................................................................................5
1.2.4 翻页操作 ..............................................................................................5
1.2.5 时间选择框操作 ..................................................................................6
1.2.6 文本框输入 ..........................................................................................6
1.2.7 下拉列表选择 ......................................................................................7
1.2.8 单选框输入 ..........................................................................................8
1.2.9 按钮操作 ..............................................................................................8
二、 系统登录..............................................................................................................9
2.1 会员登录 .........................................................................................................9
三、 会员操作............................................................................................................10
3.1 会员注册 .......................................................................................................10
3.2 会诊申请 .......................................................................................................12
3.2.1 预约制会诊 ........................................................................................13
3.2.2 点名加急会诊 ....................................................................................19
3.2.3 书面影像会诊 ....................................................................................23
3.3 HIS 一体化会诊 .............................................................................................24
3.3.1 会诊申请 ...........................................................................................24
3.3.2 会诊列表 ...........................................................................................34
3.3.3 HIS 一体化调取信息 ..........................................................................34
3.4 付款方式 ......................................................................................................40
3.4.1 二维码付费 .......................................................................................40
2
3.4.2 微信公众号付费 ...............................................................................43
3.5 专家查询 .......................................................................................................45
3.4 申请列表 .......................................................................................................46
3.4.1 已提交 ................................................................................................46
3.4.2 待调度 ................................................................................................47
3.4.3 待会诊 ................................................................................................49
3.4.4 已会诊 ................................................................................................50
3.5 复诊申请 .......................................................................................................54
3.6 消费清单 .......................................................................................................55
3.7 文献检索 .......................................................................................................56
3.8 草稿箱 ...........................................................................................................59
3.9 短信通知 .......................................................................................................60
3
一、系统介绍
1.1 系统简介
系统名称:解放军总医院 HIS 一体化远程医疗服务管理系统
版本2.0
1.1.1 用户身份
本系统中用户身份分为:超级管理、调度管理员、专家管理员、会员管理员、
会员、专家、子账户。
超级管理对调度管理元、专家管理员和会员管理员等会员身份进行添加、编
辑、删除等操作。
会员、专家、用户通过系统自己注册。
子账户由会员进行添加。
1.1.2 用户说明
本《用户手册》以用户的不同身份进行针对性的系统界面业务和功能操作进
行说明,包含系统的个主要模块功能介绍、操作步骤、界面展现等等,希望能够
对用户的学习本系统有所借鉴和帮助。
另外,需要说明的是,系统将根据不同用户的身份和安全访问权限自动进行
分配。
1.2 基本操作
在使用本系统时,为提升系统和用户的交换效果,在此针对常用的操作作出
以下约定和说明。这些操作主要有鼠标和键盘结合完成,熟悉掌握以下内容将有
助于我们更好的使用本系统。
请认真参考以下内容,并加以练习。(提示:请记住下面这些名词,在以后的
章节中将直接使用,不再予以解释)。
4
1.2.1 用户说明
界面左侧是菜单项,菜单区是系统功能的链入区域。
点击菜单可以进行针对的功能操作。
1.2.2 鼠标移动到列表事项操作
当鼠标移动到列表事项时,系统显示鼠标右侧提示信息。
1.2.3 连接操作
当鼠标(默认),显示由“ ”变为“ ”时,表示此项目有连接,可以展
开信息内容。
1.2.4 翻页操作
在系统的列表页内,右下角具有“ ”标示符,
进行翻页操作时,直接点击目标页“ ”即可,点击“ ”,翻页到第一页,点
击“ ”,翻页到最后一页。
5
1.2.5 时间选择框操作
当鼠标点击“医院创建日期”后面的文本框时,会弹出时间选择框,可以直
接在时间选择框中选择要设置上的时间,从而操作更加简便,无需手工录入。
1.2.6 文本框输入
所谓的文本框是指我们可以在里面输入文字的容器,其作用就好像就是一张纸,
我们可以在上面记录我们需要的内容。文本框需要两个部分:
1. “文本框的名字”:用来表示这个文本框的含义,既指示我们应当在这个文本
框输入什么内容,例如下图中的“医院负责人(院长):”,表示我们应当在这个
文本框中输入的内容是院长的姓名;
2. “可输入部分”:如下图“医院负责人(院长):”后面的白框。在这个区域内
我们可以输入的具体内容:
具体操作如下:需要在文本框输入内容时,首先将鼠标移到文本框的课输入
部分的上面当鼠标指针有箭头变成“I”时单击鼠标左键可以看到要录入
信息的文本框中出现闪烁的光标,此时就可以进行文字的录入了,新输入的文字
全部插到指定的文字后面。具体操作课参看下图:
6
1.2.7 下拉列表选择
下拉列表:和文本框的作用是一样的,所不同是我们所需要的内容并不用自
己去填写,下拉框已经为我们提供了很多选择,我们所要做的就是从里面找到我
们需要的内容。下拉框同样分为两个部分:
1. “下了列表的名字”:用来表示这个下拉框的含义,如下图的“医院等级:”,
就表示这个下拉框是要选择医院等级;
2. “可输入部分”:如下图,“医院等级”后面的白框。在这个区域内我们可以选
择需要的内容:
具体如下:要选择内容,首先将鼠标移至可输入部分(找到一个人黑色的倒
三角),点击鼠标左键,此时将弹出一个列表,在列表中进行选择(如果内容显
示不下,会显示滚动条,以显示更多内容),将鼠标指针移动所要选择的内容上
面。此时可以看到此内容变为蓝色,单击鼠标左键,此时应看到列表备收起,可
输入部分显示刚选择的内容,录入完成。
7
1.2.8 单选框输入
单选框的作用和上面两种输入框的作用是相同的,它针对某一项内容提供了
一组信息,供我们选择,要注意的事我们只能从这些信息中选择一项。单选项分
为两部分:
1. “单选框的名字”:用来表示这个单选框的含义,如下图的“性别:”表示这个
单选框用来进行是否重要督查事项的选择;
2. “可输入部分”:紧跟在名字的后面。这里提供了一组信息供我们选择,每一
项信息的前面都有一个白色的圆孔,参看下图:这里提供了两项信息“男”和“女”,
系统默认为:“男”。我们从这两条信息中选择我们需要的,具体方法参看下面:
如下图所示,单选框提供了一组选项,每一项包括选项代表的信息内容和一
个白色的圆孔组成,用户只要根据需要进行选择,对于一系列单选框只可有一项
被选中,例如:性别的选择:如果是男,就单击男前面的“ ”,当“ ”变为
“ ”,表示此选项被选中。如果再次选择其他项(这里指“女”),则可以看到
选项“女”对应圆孔内圆点消失,这表示所有信息只能有一项被选中。
1.2.9 按钮操作
按钮用于执行某项任务,用户使用鼠标左键点击特定按钮后,系统将进行一
系列的业务处理,并将处理结果返回给我们。
按钮如下图所示,上面带有此按钮的功能说明,例如下图中的“保存”,表示
此按钮的作用是选中后进行执行的操作:
8
二、系统登录
2.1 会员登录
温馨提示:本系统需要 win7 以上系统支持,需要 Google 浏览器登录
在浏览器
输入会员访问路径打开登录界面:
登录步骤如下:
第一步:在右侧登录区域,输入会员医院用户名、密码,按照图
片提示输入验证码。
第二步:点“ ”。
9
三、会员操作
3.1 会员注册
【会员注册】
操作步骤
1. 点击“ ”,进入会员注册页面;
2. 弹出注册选择框如下图:
10
3. 依次输入会员注册信息,上传照片、附件。(上传附件详细操作见【上传
附件】);
4. 点击立即注册;
5. 系统会提示“提交成功,正在审核”;
【会员注册成功之后,需要会员管理对申请进行审核,审核通过,才可登录,进
入主页】
11
会员登录
操作步骤:
1.输入用户名、密码、验证码。
2.点击“ ”,进入选择会员首页。
如上图,左侧为菜单栏,中间为会诊列表提示,右侧为用户信息,右上角为用户
个人信息修改项以及会诊排行,如下图:
3.2 会诊申请
点击一级菜单栏中“ ”可以进入会诊申请页面。会诊申
请包括交互式会诊、非交互式会诊、心电监护会诊、常规心电监护会诊、心内科
12
无创会诊。
3.2.1 预约制会诊
预约制远程会诊是中国人民解放军总医院远程医学中心 2015 年 10 月开
展的一项新技术新业务,其模式采用预先安排我院会诊专家时间,通过远程医学
平台向站点医院发布,由站点医院根据专家时间申请远程会诊及完成病历资料传
递,经审核完整后进行预约制远程会诊。
预约制远程会诊的服务模式积极响应了习近平总书记提出的“共同构建网络
空间命运共同体”及李克强总理在政府工作报告上提出的“互联网+”医疗行动
计划,自 2015 年 10 月 20 日试运行以来,以我院卓越的专家资源和医疗资源
优势,向全国、全军 1300 余家站点医院进行辐射,产生了较为深远的社会影响。
截止 2015 年 12 月 31 日,已完成预约制远程会诊 2216 例,其中地方患者
1256 例,军队巡诊 322 例,心电会诊 638 例。以 12 月单月为例,会诊例数达
1036 例,与传统远程会诊工作模式比较,同比增加 43.3%。预约制远程会诊与
传统工作方式相比,起到了减少工作流程、提高会诊效率和会诊质量的双重效果,
将优质医疗资源向基层下沉,是对“互联网+医疗”的积极响应。
预约制远程会诊主要在全国、全军各 301 医院联网站点医院试运行,覆盖我
院各科室。运营模式与我院现有专家门诊、特需门诊相近:每周为专家安排固定
的远程会诊时间,各远程联网医院应按照专家出诊时间申请会诊。每位专家每日
出诊 5-10 个病人,预约满为止,各联网医院可提前预约两周预约。
13
点击“ ”,系统出现预约制会诊科室界面,如下图:
右侧为医院出诊排班
14
操作步骤:
1. 点击需要预约制会诊的科室(备注:科室后面标有“绿色号”字的科室
可以进行预约),如下图所示:
科室、专家预约界面(备注:门诊号量有余的可进行预约)
2. 点击“ ”预约某科室专家进行会诊,进入填写、上传资料页面
如下图:
患者资料填、上传界面(备注:图中红色区域为:附件 1301 会诊
智能识别病历模板)
15
如上图:会诊申请单填写完毕后进行上传。
上传智能会诊清单区域
16
智能识别会诊清单上传中
智能识别会诊清单上传完毕,所有信息已自动录入
3. 上传附件 ”按钮,会弹出附件上传弹出窗口
1) .上传附件,点击“
17
2) .点击“ ”按钮,选择目标文件,点击确定后,系统自法定提示
“上传成功”。
3) .附件列表页面显示上传文件速度。
4) .文件上传成功如下提示:
5) .点击“删除”,系统会提示“删除成功”或者“删除失败”。
4. 点击“ ”,系统弹出预约成功页面;
18
【会诊预约成功之后,调度管理员进行病理审核】
3.2.2 点名加急会诊
点击“ ”,系统弹出点名加急会诊申请页面,如下图:
点名加急会诊申请页面(备注:图中红色区域为:附件 1301 会诊
智能识别病历模板)
19
如上图:会诊申请单填写完毕后进行上传。
上传智能会诊清单区域
20
智能识别会诊清单上传中
智能识别会诊清单上传完毕,所有信息已自动录入
1. 智能识别会诊申请患者信息,选择需要申请的科室,这里可以进行单科到疑
难杂症四科联合会诊。需要注意的是,只有单科室可以点名,其他申请都需要调
度管理员安排出诊专家。
21
2. 填 写 、 上 传 完 患 者 信 息 、 资 料 等 点 击 下 一 步 系 统 会 跳 转 至 选 择 专 家
申请点名专家页面
3. 选择会诊专家,在选择的专家信息后点击“ ”,专家会出现在已选专家
列表中:
4. 点击“ ”进入支付页面如下图:
22
5. 点击“ ”按钮,系统跳转到首页。
【点名加急会诊申请成功之后,调度管理员进行病理审核】
3.2.3 书面影像会诊
书面影像会诊与点名加急会诊操作类似,书面影像会诊没有点名专家选项。
请参考点名加急会诊申请!这里不再熬述。
23
3.3 HIS 一体化会诊
HIS 一体化会诊顾名思义是指通过计算机技术、医院 HIS 技术、远程医疗服
务管理系统、计算机网络技术将分布在不同地域、不同办公场地的医院数字化信
息实现跨区域共享。以实现区域内医院 HIS 系统信息共享、资源共享、系统共享
的目的。HIS 一体化会诊是传统 HIS 系统的扩展和创新的产物,是国务院新医改
政策的产物。
HIS 一体化会诊可拓展功能和与院内医院院内 HIS\LIS\PACS\EMR 系统对接
功能实现输入患者唯一 ID 号即可提取、上传、调阅患者所有有图像和图文报告
等内容及入院信息
HIS 一体化会诊:主治医生可以通过远程医疗系统与医学专家进行高清视频
面对面会诊,还可以一键共享 HIS医院信息系统中的患者数据对患者的病情
实时交换意见,提高会诊效率。
远程医学服务管理系统 HIS 一体化会诊具备可拓展功能和与院内信息系统
对接功能;远程医学服务管理系统平台通过信息化手段可扩展与各医院的电子病
EMR、医疗机构院内医院信息系统HIS、 影像系统PACS、实验室
验科)信息系统(LIS) 进行数据对接互通,从而实现患者信息、入院记录、首程记
录、查房记录、病程记录、临时医嘱、长期医嘱、护理记录、检验、检查结果、
心电和影像信息等与医院系统的双向互通。
3.3.1 会诊申请
24
3.3.1.1 预约制会诊
如上图点击“预约制会诊”,系统出现预约制会诊科室界面,如下图:
如上图所示左侧为可预约科室列表
右侧为医院出诊排班,如下图所示
25
操作步骤:
1. 点击需要预约制会诊的科室(备注:科室后面标有“绿色号”字的科室
可以进行预约),如下图所示:
科室、专家预约界面(备注:门诊号量有余的可进行预约)
2. 点击“ ”预约某科室专家进行会诊,进入填写患者唯一 ID 即身
份证号码,调取患者 HIS 信息页面如下图:
患者资料调取界面(备注:图中身份证号为必填项)
3. 点击“ ”,系统弹出调取 HIS 议题数据上传页面;
26
4. 患者 HIS 一体数据调取上传完毕后出现如下申请成功页面,如下图
【会诊预约成功之后,前往会诊列表进行付费】
27
3.3.1.2 点名会诊
如上图点击“点名会诊”,系统出现填写患者信息界面,如下图:
操作步骤:
1. 点击需点名会诊如下图所示:
点名会诊患者信息界面
2. 进入填写患者唯一 ID 即身份证号码,调取患者 HIS 信息页面如下图:
28
患者资料调取界面(备注:图中红色星号为必填项)
3. 填写完毕后,点击“ ”,系统弹出科室申请选择页面;
4. 科室选择填写完毕后,点击“ ”,点击“ ”系统弹出调取
HIS 议题数据上传页面;
29
5. 患者 HIS 一体数据调取上传完毕后出现如下申请成功页面,如下图
【点名会诊申请成功之后,前往会诊列表进行付费】
30
3.3.1.3 书面影像会诊
如上图点击“书面影像会诊”,系统出现填写患者信息界面,如下图:
操作步骤:
1. 点击书面影像会诊如下图所示:
点名会诊患者信息界面
2. 进入填写患者唯一 ID 即身份证号码,调取患者 HIS 信息页面如下图:
31
患者资料调取界面(备注:图中红色星号为必填项)
3. 填写完毕后,点击“ ”,系统弹出科室申请选择页面;
4. 科室选择填写完毕后,点击“ ”,点击“ ”系统弹出调取
HIS 议题数据上传页面;
32
5. 患者 HIS 一体数据调取上传完毕后出现如下申请成功页面,如下图
【书面影像会诊申请成功之后,前往会诊列表进行付费】
33
3.3.2 会诊列表
待审核:提交会诊申请后,等待管理员审核
待付款:审核通过后,需要付款会诊费
待调度:等待管理员调度安排会诊
待会诊:等待会诊
已完成:查看、下载专家手稿报告
3.3.3 HIS 一体化调取信息
如上图所示:为 HIS 一体化会诊患者病历信息,点击蓝色区域“ ”
调取患者电子病历EMR、医疗机构院内医院信息系统HIS、 影像系统PACS
实验室(检验科)信息系统(LIS) 进行数据对接互通,从而实现患者信息、入院记
录、首程记录、查房记录、病程记录、临时医嘱、长期医嘱、护理记录、检验、
34
检查结果、心电和影像信息等与医院系统的双向互通。
如下图所示:
1、 电子病历---入院记录:
35
2、 电子病历---首次病程
36
3、 影像检查
37
4、 医学检验
38
5、 医嘱
临时医嘱
长期医嘱
39
3.4 付款方式 ”后面的操作列会出现“ ”如
3.4.1 二维码付费
1、 点击会诊列表查看状态为“
下图:
2、 点击凭证弹出如下图所示:
40
3、 扫描二维码进行会诊费付费界面
41
4、 会诊费付费成功界面
42
3.4.2 微信公众号付费
1、 进入解放军总医院 301 医院微信公众号如下图,打开门诊缴费
43
2、 里面显示待支付凭证,核对信息进行付费
44
3.5 专家查询
点击一级菜单栏中“ ”,可以进入专家信息页面。
包括专家所在科室、级别、专家特长等信息。
45
3.4 申请列表 ”,右边出现会诊状态的列表,
点击“
如上图可以查看到申请病例进度的详细信息。 ”系统进入会员所有
3.4.1 已提交
操作步骤
1. 点击“
已提交病历页面,可以撤销病历如下图:
46
2.点击“ ”栏“ ”进入患者病历信息查看页面如下图:
3.4.2 待调度
操作步骤
1. 点击“ 系统进入会员医
院所有病历已提交病历页面,可以查看病历状态如下图:
47
2.点击“ ”栏“ ”进入患者病历信息查看页面如下图:
48
3.4.3 待会诊
1. 点击“ ”系统进入会员医院所有
病历已提交病历页面,可以查看病历状态如下图:
2. 点击“ ”栏“ ”进入患者病历信息查看页面如下图:
49
3.4.4 已会诊
1. 点击“ ”系统进入会员医院
所已已经会诊完毕病历页面,可以查看病历状态如下图:
50
2.点击“ ”栏“ ”进入患者病历信息查看页面如下图:
51
3. 点击“ ”栏“ ”进入专家会诊意见页面如下图:
4. 点击“ ”栏“ ”进入专家会诊意见页面进行专家手稿查看、下载
操作如下图:
52
5. 点击“ ”进入患者病历信息页面,点击最下面的“ ”,在点
击“ ”按钮,系统会弹出专家手稿报告下载链接如下图:
6. 点击—保存—另存为,保存、下载专家手稿报告,如下图:
7. 将下载下来的图片,打印存档。
53
3.5 复诊申请
远程会诊初诊完成后,如果患者需要复诊,可点击一级菜单
“ ”选择患者初诊已完成的病例在选择复诊申请。单击
“ ”,右边出现已会诊列表,
点击复诊申请,系统弹出复诊申请页面如下图:
如上图所示,复诊申请可申请预约制会诊、点名加急制会诊、书面影像制会
诊等业务。复诊申请类似会诊申请,操作请参考会诊申请,这里不再叙述。
54
3.6 消费清单
点击“ ”,进入,历史会诊消费列表页面;
如上图这里反应的是,会员医院每一笔消会诊取消退费等详细信息,
支持按时间段查询某一段时间内历史的消费记录。
【搜索】
支持按时间段查询某一段时间内,某子会员充值记录。
操作步骤
1.选择起始时间和结束时间,选择指定子会员;
2.点“ ”;
3.清单列表页面显示查询结果。
【导出】
系统支持将搜索结果以 Excel 格式导出。
操作步骤
1.点“ ”;
2.系统弹出文件下载窗口,点击“保存”按钮,选择文件保存地址。
55
3.7 文献检索
专家文献检索功能是远程医学管理系统推出的一项增值服务功能,通过该功
能可以让会员医院的广大医务工作者有机会检索和学习到全国卫生医疗方面最
优秀、最全面、最专业的医疗知识的论文和文献资料,给基层医务工作者提供了
一个学习知识,提高医疗水平的平台和机会。
在这里会员可以任意检索到自己最想了解、关注的医疗知识材料,快速了解医疗
服务最前沿的技术和信息,对会员医院的建设和医务人员素质的提高具有很大的
推动作用。次增值服务功能的推出,深受广大会员医院的大力支持,让我们以此
为契机更好的为会员医院提供最优质服务。
专家文献检索数据库主要包含下面 5 个库:
56
1. 点击“医疗卫生科技工具书”弹出链接如下图所示:
2. 点击“重要会议论文库”弹出链接如下图所示:
57
3. 点击“医院支持全库”弹出链接如下图所示:
4. 点击“医疗期刊全库”弹出链接如下图所示:
58
5. 点击“重要报纸全库”弹出链接如下图所示:
3.8 草稿箱
草稿箱针对填写的病例信息的保存功能,如下图所示:
在填写预约制会诊、点名加急制会诊、书面影像制会诊,患者资料上传、填写完
毕后,点击“保存草稿” 后,草稿会自动保存在
草稿箱,下次可以直接提交,避免重复填写病例操作。
提交:
点击提交,已经保存的患者信息到在,可直接进行下一步进入专家选择。
59
3.9 短信通知
又叫短信推送通知备份,如下图:
每申请一次病例,会短信通知到会诊操作员,通知内容如下
60

View File

@ -0,0 +1,34 @@
中国人民解放军总医院远程会诊申请单
患者姓名:
222
性别:
年龄:
11
301就诊ID:
123123
身份证:
130681199106021012
患者电话:
13522334455
主治医生:
赵旭
操作员电话:
13522334455
会诊室电话:
13522334455
病历摘要
23423424324
既往史
234234
过敏史
阿三打撒萨达撒旦
家族史
fdfdfdf啊实打实的
初步诊断
十分反感和回家看看看看
治疗意见
嘀咕饭否哈哈哈
会诊目的
非官方赶紧看看

1735
src/assets/css/public.css Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,28 @@
.webuploader-container {
position: relative;
}
.webuploader-element-invisible {
position: absolute !important;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px,1px,1px,1px);
}
.webuploader-pick {
position: relative;
display: inline-block;
cursor: pointer;
background: #00b7ee;
padding: 7.5px 15px;
color: #fff;
text-align: center;
border-radius: 3px;
overflow: hidden;
}
.webuploader-pick-hover {
background: #00a2d4;
}
.webuploader-pick-disable {
opacity: 0.6;
pointer-events:none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
src/assets/images/DICOM.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
src/assets/images/admin.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
src/assets/images/bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 577 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 240 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 B

BIN
src/assets/images/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
src/assets/images/liBg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 KiB

BIN
src/assets/images/named.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
src/assets/images/out.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1009 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

Binary file not shown.

BIN
src/assets/js/Uploader.swf Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

9472
src/assets/js/jquery-1.8.3.js vendored Normal file

File diff suppressed because it is too large Load Diff

7
src/assets/js/util.js Normal file
View File

@ -0,0 +1,7 @@
function getUrlParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if (r != null) return decodeURI(r[2]); return null;
}

8106
src/assets/js/webuploader.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
/** layui-v2.4.5 MIT License By https://www.layui.com */
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 701 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 274 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Some files were not shown because too many files have changed in this diff Show More