new Files
32
front/public/code/AppendDoc.vue
Normal file
@ -0,0 +1,32 @@
|
||||
<template>
|
||||
|
||||
<el-row>
|
||||
<el-button-group>
|
||||
<el-button plain type="primary" @click="appendHtml()">添加病程</el-button>
|
||||
</el-button-group>
|
||||
</el-row>
|
||||
|
||||
<Source src="/code/AppendDoc.vue"></Source>
|
||||
<Editor doc="https://www.x-emr.cn/doc/233.html" @load="onLoad" style="margin: 10px 0;"></Editor>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script setup>
|
||||
import axios from 'axios'//引入axios
|
||||
|
||||
let editor
|
||||
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
//添加日常病程
|
||||
const appendHtml = function() {
|
||||
axios.get('https://www.x-emr.cn/doc/233.html').then((result) => {
|
||||
editor.appendHtml(result.data)
|
||||
})
|
||||
}
|
||||
|
||||
</script>
|
96
front/public/code/BindData.vue
Normal file
@ -0,0 +1,96 @@
|
||||
<template>
|
||||
<Source src="/code/BindData.vue"></Source>
|
||||
<el-row>
|
||||
<el-col :span="16">
|
||||
<Editor @load="onLoad" style="margin: 10px 0;"></Editor>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-card style="margin: 10px;">
|
||||
<el-form @change="bindData()" label-width="auto">
|
||||
<el-form-item label="姓名">
|
||||
<el-input v-model="patient.pat_name" ></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别">
|
||||
<el-input v-model="patient.pat_sex"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="年龄">
|
||||
<el-input v-model="patient.pat_age"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="就诊科室">
|
||||
<el-input v-model="patient.visit_dept"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="就诊号">
|
||||
<el-input v-model="patient.pat_id"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="就诊时间">
|
||||
<el-date-picker v-model="patient.visit_time" type="datetime" value-format="YYYY-MM-DD hh:mm:ss"></el-date-picker>
|
||||
<el-radio-group v-model="patient.firstcall" style="margin-left: 10px;">
|
||||
<el-radio value="1">初诊</el-radio>
|
||||
<el-radio value="2">复诊</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系电话">
|
||||
<el-input v-model="patient.pat_phone"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 家庭住址">
|
||||
<el-input v-model="patient.pat_address"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 主诉">
|
||||
<el-input v-model="patient.pat_appeal"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 现病史">
|
||||
<el-input v-model="patient.pat_now_history"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 既往史">
|
||||
<el-input v-model="patient.pat_past_history"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 过敏史">
|
||||
<el-input v-model="patient.pat_allergy_history"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 诊断">
|
||||
<el-input v-model="patient.diagnosis"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 处方">
|
||||
<el-input v-model="patient.presc" type="textarea"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 建议">
|
||||
<el-input v-model="patient.advice"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label=" 医生签字">
|
||||
<el-input v-model="patient.doctor_name"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const patient = ref({})
|
||||
|
||||
var editor
|
||||
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
|
||||
editor = e.target.contentWindow.editor
|
||||
|
||||
setTimeout(()=>{
|
||||
//异步加载文档
|
||||
editor.loadUrl('/mock/bind_data.html').then(()=>{
|
||||
patient.value = editor.getBindObject()
|
||||
})
|
||||
//文档输入后表单值随着变化
|
||||
editor.document.addEventListener('input', ()=>{
|
||||
patient.value = editor.getBindObject()
|
||||
})
|
||||
}, 0)
|
||||
}
|
||||
|
||||
//表单数据改变
|
||||
const bindData = () => {
|
||||
editor.setBindObject(patient.value)
|
||||
}
|
||||
</script>
|
19
front/public/code/Calculate.vue
Normal file
@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<Source src="/code/Calculate.vue"></Source>
|
||||
<el-row>
|
||||
<Editor doc="/mock/assess_table.html" @load="onLoad" style="margin: 10px 0;" mode="design"></Editor>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
var editor
|
||||
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
|
||||
</script>
|
47
front/public/code/Command.vue
Normal file
@ -0,0 +1,47 @@
|
||||
<template>
|
||||
<Source src="/code/Command.vue"></Source>
|
||||
<el-row>
|
||||
<el-button-group>
|
||||
<el-button plain type="primary" @click="execCommand('form')">表单模式</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('design')">设计模式</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('readonly')">只读模式</el-button>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin-left: 20px;">
|
||||
<el-button plain type="primary" @click="execCommand('print')">打印</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('preview')">打印预览</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('previewPdf')">预览PDF</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('previewHtml')">预览HTML</el-button>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin-left: 20px;">
|
||||
<el-button plain type="primary" @click="execCommand('exportHtml')">导出模板</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('exportJson')">导出数据</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('exportPdf')">导出PDF</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('exportWord')">导出Word</el-button>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin-left: 20px;">
|
||||
<el-button plain type="primary" @click="execCommand('mobile')">移动填报</el-button>
|
||||
</el-button-group>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<Editor doc="https://www.x-emr.cn/doc/999.html" @load="onLoad" style="margin: 10px 0;" mode="design"></Editor>
|
||||
</el-row>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
var editor
|
||||
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
//文档命令I
|
||||
const execCommand = (cmd) => {
|
||||
let param = {fileName:'病案首页'}
|
||||
editor.execCommand(cmd, param)
|
||||
}
|
||||
const current = ref("1")
|
||||
|
||||
</script>
|
60
front/public/code/DataTable.vue
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
<template>
|
||||
<Source src="/code/DataTable.vue"></Source>
|
||||
<el-row>
|
||||
<el-col :span="2" style="vertical-align: center;">服务器地址:</el-col>
|
||||
<el-col :span="8"><el-input v-model="dataUrl" ></el-input></el-col>
|
||||
<el-col :span="1"></el-col>
|
||||
<el-col :span="1"><el-button plain type="primary" @click="bindDataForTable">填充数据</el-button></el-col>
|
||||
<el-col :span="1"></el-col>
|
||||
<el-col :span="1"><el-button plain type="primary" @click="clearDataTable">清除数据</el-button></el-col>
|
||||
<el-col :span="1"></el-col>
|
||||
<el-col :span="1"><el-button plain type="primary" @click="execCommand('preview')">打印预览</el-button></el-col>
|
||||
<el-col :span="1"></el-col>
|
||||
<el-col :span="1"><el-button plain type="primary" @click="execCommand('print')">打印</el-button></el-col>
|
||||
</el-row>
|
||||
<Editor @load="onLoad" doc="/mock/data_table.html" mode="design" style="margin: 10px 0;"></Editor>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import axios from 'axios'
|
||||
|
||||
export default{
|
||||
data(){
|
||||
return{
|
||||
editor:null,
|
||||
//服务端地址
|
||||
dataUrl:'https://www.x-emr.cn/doc/list.json'
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
|
||||
//加载编辑器
|
||||
onLoad: function(e) {
|
||||
this.editor = e.target.contentWindow.editor
|
||||
},
|
||||
|
||||
//获取数据到表格
|
||||
bindDataForTable: function() {
|
||||
axios.get(this.dataUrl).then(res=>{
|
||||
this.editor.bindDataList('list', res.data)
|
||||
|
||||
let html = `<field tabindex="0" id="" type="DropdownList" contenteditable="false" class="blank input" title="请选择" data-list="[{"value":"0","text":"选项1"},{"value":"1","text":"选项2"}]" name="" data-code="" data-expression="" event="undefined" multi="false" validate="false" data-show-vaule="" data-show-id="">请选择</field>`
|
||||
this.editor.$('#list tr:not(:first) td:nth-child(3)').html(html)
|
||||
|
||||
})
|
||||
},
|
||||
//清除数据表格
|
||||
clearDataTable: function() {
|
||||
this.editor.bindDataList('list', [])
|
||||
},
|
||||
execCommand : function(cmd){
|
||||
this.editor.execCommand(cmd)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
27
front/public/code/DocLang.vue
Normal file
@ -0,0 +1,27 @@
|
||||
<template>
|
||||
<Source src="/code/DocLang.vue"></Source>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="英文" name="en-us" >
|
||||
<Editor mode="design" lang="en-us" doc="/mock/en_us.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="简体中文" name="zh-cn">
|
||||
<Editor mode="design" lang="zh-cn" doc="https://www.x-emr.cn/doc/999.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="繁体中文" name="zh-tw">
|
||||
<Editor mode="design" lang="zh-tw" doc="/mock/zh-tw.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="藏文" name="zh-bo">
|
||||
<Editor mode="design" lang="zh-bo" doc="/mock/zh-bo.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="维文" name="zh-ug">
|
||||
<Editor mode="design" lang="zh-ug" doc="/mock/zh-ug.html"></Editor>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const activeName = ref('en-us')
|
||||
|
||||
</script>
|
20
front/public/code/DocMode.vue
Normal file
@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<Source src="/code/DocMode.vue"></Source>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="设计模式" name="design">
|
||||
<Editor mode="design" doc="https://www.x-emr.cn/doc/999.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="表单模式" name="form">
|
||||
<Editor mode="form" doc="https://www.x-emr.cn/doc/999.html"></Editor>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="阅读模式" name="readonly">
|
||||
<Editor mode="readonly" doc="https://www.x-emr.cn/doc/999.html"></Editor>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
const activeName = ref('design')
|
||||
|
||||
</script>
|
153
front/public/code/EChart.vue
Normal file
@ -0,0 +1,153 @@
|
||||
<template>
|
||||
<h2>echarts 代码参考 https://echarts.apache.org/examples/zh/index.html</h2>
|
||||
<el-row>
|
||||
<el-button-group>
|
||||
<el-button plain type="primary" @click="addSvgEChart()">添加图表(SVG)</el-button>
|
||||
<el-button plain type="primary" @click="addCanvasEChart()">添加图表(Canvas)</el-button>
|
||||
</el-button-group>
|
||||
</el-row>
|
||||
<Source src="/code/EChart.vue"></Source>
|
||||
<Editor doc="https://www.x-emr.cn/doc/asdf1.html" @load="onLoad" style="margin: 10px 0;"></Editor>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup>
|
||||
import * as echarts from 'echarts';
|
||||
|
||||
let editor = null
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
//添加图表
|
||||
const addSvgEChart = function () {
|
||||
var _body = editor.document.getElementById('_body')
|
||||
let chartDom = editor.document.createElement('div')
|
||||
chartDom.style.width = '100%'
|
||||
chartDom.style.height = '500px'
|
||||
_body.appendChild(chartDom)
|
||||
|
||||
var myChart = echarts.init(chartDom, null, { renderer: 'svg' });
|
||||
var option = {
|
||||
title: {
|
||||
text: 'Referer of a Website',
|
||||
subtext: 'Fake Data',
|
||||
left: 'center'
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item'
|
||||
},
|
||||
legend: {
|
||||
orient: 'vertical',
|
||||
left: 'left'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: 'Access From',
|
||||
type: 'pie',
|
||||
radius: '50%',
|
||||
data: [
|
||||
{ value: 1048, name: 'Search Engine' },
|
||||
{ value: 735, name: 'Direct' },
|
||||
{ value: 580, name: 'Email' },
|
||||
{ value: 484, name: 'Union Ads' },
|
||||
{ value: 300, name: 'Video Ads' }
|
||||
],
|
||||
emphasis: {
|
||||
itemStyle: {
|
||||
shadowBlur: 10,
|
||||
shadowOffsetX: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
|
||||
//添加图表
|
||||
const addCanvasEChart = function () {
|
||||
var _body = editor.document.getElementById('_body')
|
||||
let chartDom = editor.document.createElement('div')
|
||||
chartDom.style.width = '100%'
|
||||
chartDom.style.height = '500px'
|
||||
_body.appendChild(chartDom)
|
||||
|
||||
var myChart = echarts.init(chartDom, null, { renderer: 'canvas' });
|
||||
var option = {
|
||||
title: {
|
||||
text: 'Rainfall vs Evaporation',
|
||||
subtext: 'Fake Data'
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis'
|
||||
},
|
||||
legend: {
|
||||
data: ['Rainfall', 'Evaporation']
|
||||
},
|
||||
toolbox: {
|
||||
show: true,
|
||||
feature: {
|
||||
dataView: { show: true, readOnly: false },
|
||||
magicType: { show: true, type: ['line', 'bar'] },
|
||||
restore: { show: true },
|
||||
saveAsImage: { show: true }
|
||||
}
|
||||
},
|
||||
calculable: true,
|
||||
xAxis: [
|
||||
{
|
||||
type: 'category',
|
||||
// prettier-ignore
|
||||
data: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||
}
|
||||
],
|
||||
yAxis: [
|
||||
{
|
||||
type: 'value'
|
||||
}
|
||||
],
|
||||
series: [
|
||||
{
|
||||
name: 'Rainfall',
|
||||
type: 'bar',
|
||||
data: [
|
||||
2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3
|
||||
],
|
||||
markPoint: {
|
||||
data: [
|
||||
{ type: 'max', name: 'Max' },
|
||||
{ type: 'min', name: 'Min' }
|
||||
]
|
||||
},
|
||||
markLine: {
|
||||
data: [{ type: 'average', name: 'Avg' }]
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'Evaporation',
|
||||
type: 'bar',
|
||||
data: [
|
||||
2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3
|
||||
],
|
||||
markPoint: {
|
||||
data: [
|
||||
{ name: 'Max', value: 182.2, xAxis: 7, yAxis: 183 },
|
||||
{ name: 'Min', value: 2.3, xAxis: 11, yAxis: 3 }
|
||||
]
|
||||
},
|
||||
markLine: {
|
||||
data: [{ type: 'average', name: 'Avg' }]
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
|
||||
option && myChart.setOption(option);
|
||||
}
|
||||
|
||||
</script>
|
18
front/public/code/Editor.vue
Normal file
@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<!-- 根据实际部署环境修改 editor.html 的路径 -->
|
||||
<iframe src="./editor.html" v-bind="objectOfAttrs"></iframe>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
objectOfAttrs:{
|
||||
width:'100%',
|
||||
height:'800vh',
|
||||
frameborder: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
15
front/public/code/Home.vue
Normal file
@ -0,0 +1,15 @@
|
||||
<template>
|
||||
<h3>
|
||||
Vue 集成X-EMR 编辑器步骤
|
||||
</h3>
|
||||
<h4>1.新建组件 Editor.vue</h4>
|
||||
<Source src="/code/Editor.vue" open="true"></Source>
|
||||
<h4>2.模块中使用@load获取组件的editor实例</h4>
|
||||
<Source src="/code/Simple.vue" open="true"></Source>
|
||||
<h4>3.自定义修改配置 editor.html</h4>
|
||||
<Source src="/editor.html" open="true"></Source>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
</script>
|
76
front/public/code/SaveDoc.vue
Normal file
@ -0,0 +1,76 @@
|
||||
|
||||
<template>
|
||||
<el-row>
|
||||
<el-col :span="2" style="vertical-align: center;">服务器地址:</el-col>
|
||||
<el-col :span="10"><el-input v-model="serverUrl" ></el-input></el-col>
|
||||
<el-col :span="1"></el-col>
|
||||
<el-col :span="2"><el-button plain type="primary" @click="saveHtml">保存文档</el-button></el-col>
|
||||
<el-col :span="2"> <el-button plain type="primary" @click="saveHtmlAndData">保存数据&文档</el-button></el-col>
|
||||
</el-row>
|
||||
<Source src="/code/SaveDoc.vue"></Source>
|
||||
<Editor @load="onLoad" doc="https://www.x-emr.cn/doc/999.html" style="margin: 10px 0;"></Editor>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios'
|
||||
|
||||
export default{
|
||||
data(){
|
||||
return{
|
||||
editor:null,
|
||||
//服务端地址
|
||||
serverUrl:'http://localhost/post'
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
//初始化
|
||||
onLoad: function(e) {
|
||||
this.editor = e.target.contentWindow.editor
|
||||
},
|
||||
//仅保存HTML文档
|
||||
saveHtml: function() {
|
||||
|
||||
// 若文档未修改,则无需保存
|
||||
if(this.editor.edited == false){
|
||||
this.$message.error('文档未修改,无需保存');
|
||||
return;
|
||||
}
|
||||
|
||||
// 若文档校验不通过,则无法保存
|
||||
if(this.editor.validate() == false){
|
||||
this.$message.error('请查看文档是否有未填项或不合规内容');
|
||||
return;
|
||||
}
|
||||
|
||||
let data = {'doc': this.editor.getHtml()}
|
||||
axios.post(this.serverUrl, data).then(res=>{
|
||||
this.$message.success('保存成功')
|
||||
})
|
||||
},
|
||||
//保存文档及机构化数据
|
||||
saveHtmlAndData: function() {
|
||||
// 若文档未修改,则无需保存
|
||||
if(this.editor.edited == false){
|
||||
this.$message.error('文档未修改,无需保存');
|
||||
return;
|
||||
}
|
||||
|
||||
// 若文档校验不通过,则无法保存
|
||||
if(this.editor.validate() == false){
|
||||
this.$message.error('请查看文档是否有未填项或不合规内容');
|
||||
return;
|
||||
}
|
||||
|
||||
let data = {
|
||||
'doc': this.editor.getHtml(),
|
||||
'data': this.editor.getBindObject()
|
||||
}
|
||||
axios.post(this.serverUrl, data).then(res=>{
|
||||
this.$message.success('保存成功')
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
44
front/public/code/Signature.vue
Normal file
20
front/public/code/Simple.vue
Normal file
@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<el-button plain type="primary" @click="execCommand('print')">打印</el-button>
|
||||
<Editor doc="https://www.x-emr.cn/doc/999.html" @load="onLoad" style="margin: 10px 0;" mode="design"></Editor>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
var editor = null
|
||||
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
//处理文档命令
|
||||
const execCommand = (cmd) => {
|
||||
editor.execCommand(cmd)
|
||||
}
|
||||
|
||||
</script>
|
134
front/public/code/VitalSigns.vue
Normal file
@ -0,0 +1,134 @@
|
||||
<template>
|
||||
<Source src="/code/VitalSigns.vue"></Source>
|
||||
<el-row>
|
||||
<el-form-item label="体温单ID">
|
||||
<el-col :span="24"><el-input v-model="vitalSignsId" ></el-input></el-col>
|
||||
</el-form-item>
|
||||
<el-button-group style="margin-left: 20px;">
|
||||
<el-button plain type="primary" @click="createVitalSigns()">创建体温单</el-button>
|
||||
<el-button plain type="primary" @click="updateVitalSigns()">更新体温单</el-button>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin: 0 20px;">
|
||||
<el-button plain type="primary" @click="createBabyVitalSigns()">新生儿体温单</el-button>
|
||||
</el-button-group>
|
||||
<el-button-group style="margin-left: 20px;">
|
||||
<el-button plain type="primary" @click="execCommand('preview')">打印预览</el-button>
|
||||
<el-button plain type="primary" @click="execCommand('print')">打印</el-button>
|
||||
</el-button-group>
|
||||
</el-row>
|
||||
<Editor @load="onLoad" style="margin: 10px 0;"></Editor>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
|
||||
const vitalSignsId = ref('')
|
||||
|
||||
let editor = null
|
||||
//初始化后
|
||||
const onLoad = function(e) {
|
||||
editor = e.target.contentWindow.editor
|
||||
}
|
||||
|
||||
//文档命令
|
||||
const execCommand = (cmd) => {
|
||||
editor.execCommand(cmd)
|
||||
}
|
||||
//添加体温单
|
||||
const createVitalSigns = () => {
|
||||
let data = {
|
||||
"id": vitalSignsId.value,
|
||||
"name": "吴晓莉",
|
||||
"inDate": "2023-08-01",
|
||||
"diag": "新型冠状病毒肺炎",
|
||||
"dept": "呼吸内科",
|
||||
"bed": "801",
|
||||
"medicalNo": "202300991",
|
||||
"begin": "2023-08-01",
|
||||
"operateDate": "2023-08-03",
|
||||
"notes": "入院-十时二十分,,转入ICU,,,,,,,手术,,,,,,,,,,,,,,,出院,死亡于×时×分",
|
||||
"sphygmus": "112,110,109,103,108,85,90,83,90,103,108,85,90,83,90,,90,83,90,103,108,85,90,83,90",
|
||||
"heart": "112,120,118,111,,,,,,,112,120,118,111",
|
||||
"tempType": "0,1,2,3,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1",
|
||||
"temperature": "38.7,38.9,38.5,39.1|37.1,38.5,38.5,,,38.5,38.5|36.9,38.4,38.8,,38.5,38.6,38.8,,38.9,38.8,38.5,38.6,38.8,,38.9,38.8,34,34.0",
|
||||
"breath": "30,30,R,,35,35,35,35,35,35,35,35,,R,R,35,35,,R,,,35,35,,R",
|
||||
"labels": "血压(mmHg)|入水量(ml)|出水量(ml)|大便(次)|小便(次)|身高(cm)|体重(kg)|过敏药",
|
||||
"data1": "120/85,121/84,,110/75,",
|
||||
"data2": "1180ml,,,500ml,,40ml",
|
||||
"data3": "500ml,,,,500ml,,67ml",
|
||||
"data4": "2,4,5,3,3,3,2,,2",
|
||||
"data5": "2,4,5,3,3,3,2,,2",
|
||||
"data6": "167cm,,,,,,,,,164cm",
|
||||
"data7": "95kg,,,,,90kg",
|
||||
"data8": "青霉素,",
|
||||
"data9": "测试,"
|
||||
}
|
||||
vitalSignsId.value = editor.createVitalSigns(data)
|
||||
}
|
||||
|
||||
//更新体温单
|
||||
const updateVitalSigns = () => {
|
||||
let data = {
|
||||
"id": vitalSignsId.value,
|
||||
"name": "吴晓莉",
|
||||
"inDate": "2023-08-01",
|
||||
"diag": "新型冠状病毒肺炎",
|
||||
"dept": "呼吸内科",
|
||||
"bed": "801",
|
||||
"medicalNo": "202300991",
|
||||
"begin": "2023-09-01",
|
||||
"operateDate": "2023-08-03",
|
||||
"notes": ",,,,,,,,,,,,,,出院,死亡于×时×分",
|
||||
"sphygmus": "112,110,109,103,108,85,90,83,90,103,108,85,90,83,90,90,90,83,90,103,108,85,90,83,90",
|
||||
"heart": ",,,,,,112,120,118,111,,,110,120,120,118,111,100",
|
||||
"tempType": ",,,,,,0,1,2,3,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1",
|
||||
"temperature": ",,,,,,38.7,38.9,38.5,39.1,38.5,38.5,,,38.5,38.5,38.4,38.8,,38.5,38.6,38.8,,38.9,38.838.5,38.6,38.8,,38.9,38.8,34,34.0",
|
||||
"breath": ",,,,,,30,30,R,,35,35,35,35,35,35,35,35,,R,R,35,35,,R,,,35,35,,R",
|
||||
"labels": "血压(mmHg)|入水量(ml)|出水量(ml)|大便(次)|小便(次)|身高(cm)|体重(kg)|过敏药",
|
||||
"data1": ",,,,,,120/85,121/84,,110/75,",
|
||||
"data2": ",,,,,,1180ml,,,500ml,,40ml",
|
||||
"data3": "500ml,,,,500ml,,67ml",
|
||||
"data4": "2,4,5,3,3,3,2,,2",
|
||||
"data5": "2,4,5,3,3,3,2,,2",
|
||||
"data6": "167cm,,,,,,,,,164cm",
|
||||
"data7": "95kg,,,,,90kg",
|
||||
"data8": "青霉素,",
|
||||
"data9": "测试,",
|
||||
"pain":"2,2,4,5,8,8,9|2,6|3,,,4,4,4"
|
||||
|
||||
}
|
||||
vitalSignsId.value = editor.createVitalSigns(data)
|
||||
}
|
||||
|
||||
//添加新生儿体温单
|
||||
const createBabyVitalSigns = () => {
|
||||
let data =
|
||||
{
|
||||
"id": vitalSignsId.value,
|
||||
"type": "baby",
|
||||
"name": "吴晓莉",
|
||||
"inDate": "2023-08-01",
|
||||
"sex": "男",
|
||||
"dept": "妇产科",
|
||||
"bed": "801",
|
||||
"medicalNo": "202300991",
|
||||
"begin": "2023-08-01",
|
||||
"notes": "出生-十时二十分",
|
||||
"weight": "3200,,,,3300,,,,3400,,,,3400,,,,3500,,,,3400,,,,",
|
||||
"heart": "112,120,118,111,,,,,,,112,120,118,111",
|
||||
"tempType": "2,2,2,3,2,1,2,2,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1",
|
||||
"temperature": "37.7,37.9,38.5,37.1,37.5,38.5,,,37.5,38.5,37.4,37.8,,37.5,37.6,37.8,,37.9,37.8,37.5,38.6,37.8,,37.9,37.8",
|
||||
"physicalcool": ",,,37.6,,,,,,,,37.5,,,,,,,,,37.4,,",
|
||||
"breath": "30,30,R,,35,35,35,35,35,35,35,35,,R,R,35,35,,R,,,35,35,,R",
|
||||
"labels": "血压(mmHg)|入水量(ml)|出水量(ml)|大便(次)|小便(次)",
|
||||
"data1": "120/85,121/84,,110/75,",
|
||||
"data2": "1180ml,,,500ml,,40ml",
|
||||
"data3": "500ml,,,,500ml,,67ml",
|
||||
"data4": "2,4,5,3,3,3,2,,2",
|
||||
"data5": "2,4,5,3,3,3,2,,2",
|
||||
}
|
||||
//第二个参数isBaby:true
|
||||
editor.createVitalSigns(data)
|
||||
}
|
||||
|
||||
</script>
|
49
front/public/editor.html
Normal file
@ -0,0 +1,49 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<link rel="shortcut icon" href="./favicon.svg" type="image/svg+xml"/>
|
||||
<link rel="stylesheet" href="./vender/jquery/zTreeStyle/zTreeStyle.css" type="text/css">
|
||||
<script src = "./vender/jquery/jquery.js"></script>
|
||||
<script src = "./vender/date97/WdatePicker.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.core.min.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.exedit.min.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.exhide.min.js"></script>
|
||||
<script src = "./vender/codemirror.js"></script>
|
||||
<script src = "./vender/fabric.js"></script>
|
||||
<!-- 局域网环境, 请下载 editor.js替换以下路径 -->
|
||||
<script src="https://www.x-emr.cn/js/editor.js"></script>
|
||||
<script>
|
||||
$(function() {
|
||||
//配置项可以不设置,会使用默认设置
|
||||
let option = {
|
||||
license:'gaR8jJur/A30SFnd5RHwJT4vNz7zuTe+5UVjd3EztbJyrcUa2ZMAc0WXBJZMJs5D+lpGh+a7p49pT8G1di9alwDwAzKnsz0BTNhHKUsLrU4uMy6I5iQ6l0OMB76w/VP2u1Qf8PCJQiO388mrc8dEcEZjeSVls1O3GedGINg3Od0=',
|
||||
mode:'form', //默认模式 form:表单模式,design:设计模式
|
||||
pdfUrl:'https://www.x-emr.cn/pdf/post', //pdf生成服务
|
||||
dictionary: [ //知识库
|
||||
{name: '体征', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=20', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '症状', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=20', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '卫生信息数据元', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=40', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '电子病历数据集', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=50', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '国家医保标准', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=80', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '省数据平台标准', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=90', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
]
|
||||
}
|
||||
|
||||
//从模块的Editor组件中获取mode,doc,lang属性 (该段代码可删除)
|
||||
let mode = window.frameElement.getAttribute('mode')
|
||||
let doc = window.frameElement.getAttribute('doc')
|
||||
let lang = window.frameElement.getAttribute('lang')
|
||||
mode? option.mode = mode: null
|
||||
lang? option.lang = lang: null
|
||||
|
||||
//初始化编辑器(初始化代码可以放入组件的load事件中)
|
||||
editor.init(option).then(()=>{
|
||||
doc? editor.loadUrl(doc) : null
|
||||
})
|
||||
|
||||
})
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
54
front/public/editor_dev.html
Normal file
@ -0,0 +1,54 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<link rel="shortcut icon" href="./favicon.svg" type="image/svg+xml"/>
|
||||
<link rel="stylesheet" href="./vender/jquery/zTreeStyle/zTreeStyle.css" type="text/css">
|
||||
<script src = "./vender/jquery/jquery.js"></script>
|
||||
<script src = "./vender/date97/WdatePicker.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.core.min.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.exedit.min.js"></script>
|
||||
<script src = "./vender/jquery/jquery.ztree.exhide.min.js"></script>
|
||||
<script src = "./vender/codemirror.js"></script>
|
||||
<script src = "./vender/fabric.js"></script>
|
||||
<script src="./vender/requirejs/require.js"></script>
|
||||
<script>
|
||||
require.config({
|
||||
baseUrl: 'http://localhost:81/src',
|
||||
paths: {'editor': 'editor'}
|
||||
})
|
||||
|
||||
require(['editor'], function () {
|
||||
|
||||
//配置项可以不设置,会使用默认设置
|
||||
let option = {
|
||||
license:'gaR8jJur/A30SFnd5RHwJT4vNz7zuTe+5UVjd3EztbJyrcUa2ZMAc0WXBJZMJs5D+lpGh+a7p49pT8G1di9alwDwAzKnsz0BTNhHKUsLrU4uMy6I5iQ6l0OMB76w/VP2u1Qf8PCJQiO388mrc8dEcEZjeSVls1O3GedGINg3Od0=',
|
||||
mode:'form', //默认模式 form:表单模式,design:设计模式
|
||||
pdfUrl:'https://www.x-emr.cn/pdf/post', //pdf生成服务
|
||||
dictionary: [ //知识库
|
||||
{name: '体征', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=20', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '症状', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=20', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '卫生信息数据元', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=40', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '电子病历数据集', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=50', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '国家医保标准', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=80', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
{name: '省数据平台标准', isParent:true, treeUrl:'https://www.x-emr.cn/dict?category=90', itemUrl:'https://www.x-emr.cn/dictitem'},
|
||||
]
|
||||
}
|
||||
|
||||
//从模块的Editor组件中获取mode,doc,lang属性 (该段代码可删除)
|
||||
let mode = window.frameElement.getAttribute('mode')
|
||||
let doc = window.frameElement.getAttribute('doc')
|
||||
let lang = window.frameElement.getAttribute('lang')
|
||||
mode? option.mode = mode: null
|
||||
lang? option.lang = lang: null
|
||||
|
||||
//初始化编辑器(初始化代码可以放入组件的load事件中)
|
||||
editor.init(option).then(()=>{
|
||||
doc? editor.loadUrl(doc) : null
|
||||
})
|
||||
|
||||
})
|
||||
</script>
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
48
front/public/mock/assess_table.html
Normal file
@ -0,0 +1,48 @@
|
||||
<div id="_page" style="margin: 0px auto; background: rgb(255, 255, 255); width: 210mm; min-height: 297mm; transform: scale(1, 1); transform-origin: 50% 0px 0px;" pagekind="A4" direct="portrait"><div id="_header" style="min-height: 0.65cm; padding-left: 0.65cm; padding-right: 0.65cm; padding-top: 0.65cm; position: relative; outline: none;" contenteditable="false" class="">
|
||||
<div style="text-align: center; "> </div>
|
||||
<div style="text-align: center;font-size: 15px;"><span>姓名:</span>
|
||||
<field tabindex="0" id="name" type="Text" contenteditable="true" class="input blank" title="姓名" value="姓名" name="name" data-code="" data-expression="" multiline="false" validate="false" format="" style="display: inline-block; min-width: 60px;">姓名</field>
|
||||
<span> 科室:</span>
|
||||
<field tabindex="0" id="department" type="Text" contenteditable="true" class="input blank" title="科室" value="科室" name="department" data-code="" data-expression="" multiline="false" validate="false" format="" style="display: inline-block; min-width: 60px;">科室</field><span> 床号:</span>
|
||||
<field tabindex="0" id="bed_number" type="Text" contenteditable="true" class="input blank" title="床号" value="床号" name="bed_number" data-code="" data-expression="" multiline="false" validate="false" format="" style="display: inline-block; min-width: 60px;">床号</field><span title="" contenteditable="false"> 住院号:</span>
|
||||
<field tabindex="0" id="admission_number" type="Text" contenteditable="true" class="input blank" title="住院号" value="文本输入域" name="admission_number" data-code="" data-expression="" multiline="false" validate="false" format="" style="display: inline-block; min-width: 60px;">住院号</field><span> 病案号:</span>
|
||||
<field tabindex="0" id="medical_record_number" type="Text" contenteditable="true" class="input blank" title="病案号" value="文本输入域" name="medical_record_number" data-code="" data-expression="" multiline="false" validate="false" format="" style="display: inline-block; min-width: 60px;">病案号</field>
|
||||
</div>
|
||||
</div><div id="_body" style="min-height: calc(1024.25px); padding-left: 0.65cm; padding-right: 0.65cm;" contenteditable="false" class=""><div class="Section0" style=""><p class="MsoNormal" style="margin-top:10.2500pt;margin-left:213.2000pt;mso-outline-level:1;"><span style="letter-spacing: 0.9pt; font-weight: bold; font-size: 16pt;">抑郁焦虑表</span></p><table class="16" id="" title="" data-field="" style="border-width: 1px; border-color: rgb(0, 0, 0);"><colgroup><col style="width: 421px;"><col style="width: 304px;"></colgroup><tbody style=""><tr style="height: 72.8pt"><td colspan="2" class=""><p class="15" style="margin-top: 1pt; margin-left: 26.1pt; line-height: 1.5;"><span style="letter-spacing: 0.266667px; font-size: 10.5pt;">1)我对以往感兴趣的事情还是有兴趣</span></p><p class="15" style="margin-left:24.7500pt;"><group type="radio" id="radio0" style="font-size: 10.5pt;"><input type="radio" id="radio0__0" name="radio0" value="0" checked="true"><label for="radio0__0">肯定一样——0分</label><br><input type="radio" id="radio0__1" name="radio0" value="1" style=""><label for="radio0__1">不像以前那样——1分</label><br><input type="radio" id="radio0__2" name="radio0" value="2"><label for="radio0__2">只有一点——2分</label><br><input type="radio" id="radio0__3" name="radio0" value="3"><label for="radio0__3">基本上没有了——3分</label><br></group><br></p></td></tr><tr style="height:72.5000pt"><td colspan="2" class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top:1.5500pt;margin-left:25.5000pt;line-height:15.6500pt;
|
||||
mso-line-height-rule:exactly;"><span style="font-size: 12px; letter-spacing: 0.333333px;">2</span><span style="letter-spacing: 0.333333px; font-size: 10.5pt;">)我能够哈哈大笑,并看到事物好的一面</span></p><p class="15" style="margin-left:24.7500pt;"><group type="radio" id="radio1" style="font-size: 10.5pt;"><input type="radio" id="radio1__0" name="radio1" value="0" checked="true"><label for="radio1__0">我经常这样——0分</label><br><input type="radio" id="radio1__1" name="radio1" value="1"><label for="radio1__1">现在已经不太这样了——1分</label><br><input type="radio" id="radio1__2" name="radio1" value="2"><label for="radio1__2">现在肯定是不太多了——2分</label><br><input type="radio" id="radio1__3" name="radio1" value="3"><label for="radio1__3">根本没有——3分</label><br></group><br></p></td></tr><tr style="height: 72.55pt;"><td colspan="2" class="" style="border-color: rgb(0, 0, 0);"><p class="15" style="margin-top:2.2500pt;margin-left:25.6000pt;"><span style="letter-spacing: 0.15pt; font-size: 9pt;">3</span><span style="letter-spacing: 0.15pt; font-size: 10.5pt;">)我感到愉快</span></p><p class="15" style="margin-top: 5.2pt; margin-left: 24.75pt; line-height: 15.7pt;"><span style="letter-spacing: -0.65pt; position: relative; top: -5pt;"><group type="radio" id="radio2" style="font-size: 10.5pt;"><input type="radio" id="radio2__0" name="radio2" value="0" checked="true"><label for="radio2__0">大多数时间——0分</label><br><input type="radio" id="radio2__1" name="radio2" value="1"><label for="radio2__1">有时——1分</label><br><input type="radio" id="radio2__2" name="radio2" value="2"><label for="radio2__2">并不经常——2分</label><br><input type="radio" id="radio2__3" name="radio2" value="3"><label for="radio2__3">根本没有——3分</label><br></group><br></span></p></td></tr><tr style="height: 72.55pt;"><td colspan="2" class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top: 3.1pt; margin-left: 25.35pt; line-height: 1.5;"><span style="letter-spacing: 0.25pt; font-size: 9pt;">4</span><span style="font-size: 10.5pt; line-height: 1.5;"><span style="letter-spacing: 0.25pt;">)我对自己的仪容失去兴趣</span><o:p></o:p></span></p><p class="15" style="margin-top: 5.2pt; margin-left: 24.75pt; line-height: 1.5;"><span style="letter-spacing: -0.85pt; position: relative; top: -5pt; line-height: 1.5;"><group type="radio" id="radio3" style="font-size: 10.5pt; line-height: 1.5;"><input type="radio" id="radio30" name="radio3" value="0" checked="true"><label for="radio30">我仍然像以往一样关心——0分</label><br><input type="radio" id="radio31" name="radio3" value="1"><label for="radio31">我可能不是非常关心——1分</label><br><input type="radio" id="radio32" name="radio3" value="2"><label for="radio32">并不像我应该做的那样关心我——2分</label><br><input type="radio" id="radio33" name="radio3" value="3"><label for="radio33">肯定——3分</label><br></group><span style="font-size: 10.5pt; line-height: 1.5;"><br></span></span></p></td></tr><tr style="height: 72.55pt"><td colspan="2" class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top: 3.8pt; margin-left: 25.6pt; line-height: 1.5;"><span style="font-size: 10.5pt; line-height: 1.5;"><span style="letter-spacing: 0.2pt; position: relative; top: -5pt;">5)我对一切都是乐观地向前看</span><o:p style=""></o:p></span></p><p class="15" style="margin-left: 24.75pt;"><span style="letter-spacing: -0.45pt;"><group type="radio" id="radio4" style="font-size: 10.5pt;"><input type="radio" id="radio40" name="radio4" value="0" checked="true"><label for="radio40">差不多是这样做——0分</label><br><input type="radio" id="radio41" name="radio4" value="1"><label for="radio41">并不完全是这样做的——1分</label><br><input type="radio" id="radio42" name="radio4" value="2"><label for="radio42">很少这样做——2分</label><br><input type="radio" id="radio43" name="radio4" value="3"><label for="radio43">几乎从不这样做——3分</label><br></group><br></span></p></td></tr><tr style="height: 108px"><td colspan="2" class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top:4.5000pt;margin-left:25.5000pt;line-height:15.7500pt;
|
||||
mso-line-height-rule:exactly;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt; position: relative; top: -5pt;">6)我好像感到情绪在渐渐低落</span><o:p></o:p></span></p><p class="15" style="margin-left:24.7500pt;"><span style="letter-spacing: -0.75pt;"><group type="radio" id="radio5" style="font-size: 10.5pt;"><input type="radio" id="radio5__0" name="radio5" value="0" checked="true"><label for="radio5__0">根本没有——0分</label><br><input type="radio" id="radio5__1" name="radio5" value="1"><label for="radio5__1">有时——1分</label><br><input type="radio" id="radio5__2" name="radio5" value="2"><label for="radio5__2">很经常——2分</label><br><input type="radio" id="radio5__3" name="radio5" value="3"><label for="radio5__3">几乎所有时间——3分</label><br></group><br></span></p></td></tr><tr style="height: 118px"><td colspan="2" class="" style="border-color: rgb(0, 0, 0);"><p class="15" style="margin-top:3.2500pt;margin-left:25.5000pt;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt;">7)我能欣赏一本好书或意向好的广播或电视节目</span><o:p></o:p></span></p><p class="15" style="margin-top: 5.25pt; margin-left: 24.75pt; line-height: 15.7pt;"><group type="radio" id="radio6" style="font-size: 10.5pt;"><input type="radio" id="radio6__0" name="radio6" value="0"><label for="radio6__0">常常如此——0分</label><br><input type="radio" id="radio6__1" name="radio6" value="1" checked="true"><label for="radio6__1">有时——1分</label><br><input type="radio" id="radio6__2" name="radio6" value="2"><label for="radio6__2">并非经常——2分</label><br><input type="radio" id="radio6__3" name="radio6" value="3"><label for="radio6__3">很少——3分</label><br></group><br></p></td></tr><tr style="height: 38px"><td class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top:9.5000pt;margin-left:25.4000pt;"><span style="letter-spacing: 0.1pt; font-size: 10.5pt;"><font face="宋体" style="">抑郁得分(</font>0-21分)</span><span style="font-size: 9pt;"><o:p></o:p></span></p></td><td class=""><p class="MsoNormal" style=""><span style="font-family: Arial; font-size: 10.5pt;"><span> </span><field tabindex="0" id="total1" type="Text" contenteditable="true" class="input" title="文本输入域" value="1" name="total1" data-code="" data-expression="= radio0 + radio1 + radio2 + radio3 + radio4 + radio5 + radio6" multiline="false" validate="false" format="" style="display: inline-block; min-width: 100px; text-align: left;">1</field> </span></p></td></tr>
|
||||
|
||||
|
||||
|
||||
<tr style="height: 72.55pt"><td colspan="2" class="" style="border-color: rgb(0, 0, 0)"><p class="15" style="margin-top:1.7500pt;margin-left:26.1000pt;"><span style="letter-spacing: 0.1pt; font-size: 10.5pt;">1)我感到紧张(或痛苦)</span></p><p class="15" style="margin-top: 5.2pt; margin-left: 24.75pt; line-height: 15.7pt;"><span style="font-size: 10.5pt;"><group type="radio" id="radio7" style=""><input type="radio" id="radio7__0" name="radio7" value="0" checked="true"><label for="radio7__0">根本没有——0分</label><br><input type="radio" id="radio7__1" name="radio7" value="1"><label for="radio7__1">有时候——1分</label><br><input type="radio" id="radio7__2" name="radio7" value="2"><label for="radio7__2">大多时候——2分</label><br><input type="radio" id="radio7__3" name="radio7" value="3"><label for="radio7__3">几乎所有时候——3分</label><br></group><span> </span></span></p></td></tr><tr style="height: 138px;"><td colspan="2" class="" style="border-color: rgb(0, 0, 0);"><p class="15" style="margin-top:2.5000pt;margin-left:25.5000pt;line-height:15.7000pt;
|
||||
mso-line-height-rule:exactly;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt; position: relative; top: -5pt;">2)我感到有点害怕好像预感到什么可怕的事情要发生</span><o:p></o:p></span></p><p class="15" style="margin-left: 24.75pt;"><group type="radio" id="radio8" style="font-size: 10.5pt;"><input type="radio" id="radio8__0" name="radio8" value="0" checked="true"><label for="radio8__0">根本没有——0分</label><br><input type="radio" id="radio8__1" name="radio8" value="1"><label for="radio8__1">有一点,但并不使我苦恼——1分</label><br><input type="radio" id="radio8__2" name="radio8" value="2"><label for="radio8__2">是有,不太严重——2分</label><br><input type="radio" id="radio8__3" name="radio8" value="3"><label for="radio8__3">非常肯定和十分严重——3分</label><br></group><br></p></td></tr><tr style="height: 127px;"><td colspan="2" class="" style="border-color: rgb(0, 0, 0);"><p class="MsoNormal" style="text-indent: 30px;"><span style="font-size: 10.5pt;">3)我的心中充满烦恼</span></p><p class="MsoNormal" style="margin-left: 24.75pt;"><span style="font-size: 10.5pt;"><group type="radio" id="radio9" style=""><input type="radio" id="radio90" name="radio9" value="0" checked="true"><label for="radio90">根本没有——0分</label><br><input type="radio" id="radio91" name="radio9" value="1" style=""><label for="radio91">有时候——1分</label><br><input type="radio" id="radio92" name="radio9" value="2"><label for="radio92">大多时候——2分</label><br><input type="radio" id="radio93" name="radio9" value="3"><label for="radio93">几乎所有时候——3分</label><br></group></span></p></td></tr><tr class="" style=""><td colspan="2">
|
||||
|
||||
<!--StartFragment--><p class="15" style="margin-top:1.9000pt;margin-left:25.3500pt;line-height:15.6500pt;
|
||||
mso-line-height-rule:exactly;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt; position: relative; top: -5pt;">4)我能够安闲而轻松地坐着</span><o:p></o:p></span></p><p class="15" style="margin-left: 24.75pt;"><group type="radio" id="radio10" style=""><input type="radio" id="radio100" name="radio10" value="0" checked="true"><label for="radio100">肯定--0分</label><br><input type="radio" id="radio101" name="radio10" value="1"><label for="radio101">经常--1分</label><br><input type="radio" id="radio102" name="radio10" value="2"><label for="radio102">并不经常--2分</label><br><input type="radio" id="radio103" name="radio10" value="3"><label for="radio103">更本没有--3分</label><br></group></p><!--EndFragment-->
|
||||
|
||||
</td></tr><tr class="" style=""><td colspan="2" style="">
|
||||
|
||||
<!--StartFragment--><p class="15" style="margin-top:2.9500pt;margin-left:25.6000pt;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt;">5)我有点坐立不安,好像感到非要活动不可</span><o:p></o:p></span></p><p class="15" style="margin-top: 5.2pt; margin-left: 24.75pt; line-height: 15.75pt;"><group type="radio" id="radio11" style=""><input type="radio" id="radio11__0" name="radio11" value="0" checked="true"><label for="radio11__0">根本没有——0分</label><br><input type="radio" id="radio11__1" name="radio11" value="1"><label for="radio11__1">并不很少——1分</label><br><input type="radio" id="radio11__2" name="radio11" value="2"><label for="radio11__2">是不少——2分</label><br><input type="radio" id="radio11__3" name="radio11" value="3"><label for="radio11__3">确实非常多——3分</label><br></group></p><!--EndFragment-->
|
||||
|
||||
</td></tr><tr class=""><td colspan="2" style=""><span>
|
||||
|
||||
</span><!--StartFragment--><p class="15" style="margin-top:3.9500pt;margin-left:25.5000pt;"><span style="letter-spacing: 0.2pt; font-size: 9pt;">6)</span><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.2pt;">我突然发现有恐慌感</span><o:p></o:p></span></p><p class="15" style="margin-top:5.2000pt;margin-left:24.7500pt;line-height:15.7500pt;
|
||||
mso-line-height-rule:exactly;"><group type="radio" id="radio12" style=""><input type="radio" id="radio12__0" name="radio12" value="0" checked="true"><label for="radio12__0">根本没有——0分</label><br><input type="radio" id="radio12__1" name="radio12" value="1"><label for="radio12__1">并非经常——1分</label><br><input type="radio" id="radio12__2" name="radio12" value="2"><label for="radio12__2">非常肯定,十分严重——2分</label><br><input type="radio" id="radio12__3" name="radio12" value="3"><label for="radio12__3">确实很经常——3分</label><br></group></p><!--EndFragment--><span>
|
||||
|
||||
</span></td></tr><tr class="" style=""><td colspan="2" style=""><span>
|
||||
|
||||
</span><!--StartFragment--><p class="15" style="margin-top:2.9500pt;margin-left:25.6500pt;line-height:15.7500pt;
|
||||
mso-line-height-rule:exactly;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.25pt; position: relative; top: -5pt;">7)我感到有点害怕,好像某个内脏器官变化了</span><o:p></o:p></span></p><p class="15" style="margin-left: 24.75pt;"><group type="radio" id="radio13" style=""><input type="radio" id="radio13__0" name="radio13" value="0" checked="true"><label for="radio13__0">根本没有——0分</label><br><input type="radio" id="radio13__1" name="radio13" value="1"><label for="radio13__1">有时——1分</label><br><input type="radio" id="radio13__2" name="radio13" value="2"><label for="radio13__2">很经常——2分</label><br><input type="radio" id="radio13__3" name="radio13" value="3"><label for="radio13__3">非常经常——3分</label><br></group></p><!--EndFragment--><span>
|
||||
|
||||
</span></td></tr><tr style="height: 35px"><td class="" id="" title="" style="border-color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); vertical-align: middle; text-align: center"><p class="15" style="text-align: center; margin-top: 0pt; margin-left: 0pt;"><span style="letter-spacing: 0.1pt; font-size: 10.5pt;"><font face="宋体" style=""></font>
|
||||
|
||||
<!--StartFragment-->焦虑得分</span></p></td><td class="" style="border-width: 1pt; border-color: rgb(0, 0, 0)"><field tabindex="0" id="total2" name="total2" type="Text" contenteditable="true" class="input" title="文本输入域" value="0" data-code="" data-expression="= radio7 + radio8 + radio9 + radio10 + radio11 + radio12 + radio13" multiline="false" validate="false" format="" style="display: inline-block; min-width: 100px; text-align: left;">0</field><span> </span></td></tr><tr class=""><td colspan="1"><span>
|
||||
|
||||
</span><!--StartFragment--><p class="15" style="margin-top:1.7500pt;margin-left:129.0500pt;"><span style="font-size: 10.5pt;"><span>结果</span><o:p></o:p></span></p><p class="15" style="margin-top:0.0500pt;margin-right:0.6500pt;margin-left:124.2000pt;
|
||||
text-indent:-97.2500pt;"><span style="font-size: 10.5pt;"><span style="letter-spacing: 0.2pt;"><font face="宋体">(</font>0-7分为阴性;8-10为轻度;11-14分为</span><span style="letter-spacing: 0.15pt;"><font face="宋体">中度</font>;15-21分为</span> <span style="letter-spacing: -0.1pt;">重</span><span style="letter-spacing: -0.1pt;">度)</span></span></p><!--EndFragment--><span>
|
||||
|
||||
</span></td><td colspan="1" class=""><field tabindex="0" id="field_4" name="field_4" type="Text" contenteditable="true" class="input" title="文本输入域" value="1" data-code="" data-expression="=total1 + total2" multiline="false" validate="false" format="" style="display: inline-block; min-width: 100px; text-align: left;">1</field> <br></td></tr></tbody></table></div><p class="MsoNormal" style="margin-left:90.0500pt;"><span style="position:absolute;z-index:1;margin-left:75.5000px;
|
||||
margin-top:112.3333px;width:680.0000px;height:0.0000px;"><br></span><span style="position:absolute;z-index:1;margin-left:75.5000px;
|
||||
margin-top:112.3333px;width:680.0000px;height:0.0000px;"><br></span><span style="position:absolute;z-index:1;margin-left:75.5000px;
|
||||
margin-top:112.3333px;width:680.0000px;height:0.0000px;"><br></span></p><br></div><div id="_footer" style="position: relative; min-height: 0.65cm; padding-left: 0.65cm; padding-right: 0.65cm; padding-bottom: 0.65cm; outline: none;" contenteditable="false" class=""></div>
|
||||
</div>
|
140
front/public/mock/bind_data.html
Normal file
@ -0,0 +1,140 @@
|
||||
|
||||
<div id="_page"
|
||||
style="margin: 0px auto; background: rgb(255, 255, 255); width: 209.5mm; min-height: 148mm; transform: scale(1, 1); transform-origin: 50% 0px 0px;"
|
||||
pagekind="A5" direct="landscape">
|
||||
<div id="_header"
|
||||
style="outline: none; min-height: 0.5cm; padding-left: 1cm; padding-right: 1cm; padding-top: 0.65cm; position: relative;"
|
||||
contenteditable="false" class="">
|
||||
<div style="text-align: center; line-height: 1.5;"><span
|
||||
style="font-size: x-large; font-weight: 700;">成都中医药大学附属第一医院</span></div>
|
||||
<div style="text-align: center; line-height: 1;"><span
|
||||
style="font-weight: bold; font-size: large;">电子病历</span></div>
|
||||
<div style="text-align: center;"><span
|
||||
style="font-weight: bold; font-family: 楷体; line-height: 1; color: rgb(255, 255, 255); font-size: 5pt;">.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="_body" style="min-height: calc(472.441px); padding-left: 1cm; padding-right: 1cm;"
|
||||
contenteditable="false" class="">
|
||||
<div style="text-align: left;" domain="" code="" title="" contenteditable="false"><span
|
||||
style="font-size: small; text-align: justify; font-weight: bold;" domain="" code="" title=""
|
||||
contenteditable="false">姓名:</span>
|
||||
<field tabindex="0" id="pat_name" type="Text" contenteditable="false" class="input" title="姓名"
|
||||
name="pat_name" data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-size: small; text-align: justify;" value=""></field><span
|
||||
style="font-size: small; text-align: justify;"> </span><span
|
||||
style="font-size: small; text-align: justify; font-weight: bold;" domain="" code="" title=""
|
||||
contenteditable="false">性别:</span>
|
||||
<field tabindex="0" id="pat_sex" type="Text" contenteditable="false" class="input" title="性别" value="男"
|
||||
name="pat_sex" data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-size: small; text-align: justify;">男</field><span
|
||||
style="font-size: small; text-align: justify;"> </span><span
|
||||
style="font-size: small; text-align: justify; font-weight: bold;" domain="" code="" title=""
|
||||
contenteditable="false">年龄:</span>
|
||||
<field tabindex="0" id="pat_age" type="Text" contenteditable="false" class="input" title="年龄"
|
||||
name="pat_age" data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-size: small; text-align: justify;" value=""></field><span
|
||||
style="font-size: small; text-align: justify;"> </span><span
|
||||
style="font-size: small; text-align: justify; font-weight: bold;" domain="" code="" title=""
|
||||
contenteditable="false">就诊科室:</span>
|
||||
<field tabindex="0" id="visit_dept" type="Text" contenteditable="false" class="input" title="就诊科室"
|
||||
name="visit_dept" data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-size: small; text-align: justify;" value="风湿免疫科">风湿免疫科</field><span
|
||||
style="font-size: small; text-align: justify; font-weight: bold;" domain="" code="" title=""
|
||||
contenteditable="false"> 就诊号:</span>
|
||||
<field tabindex="0" type="Text" contenteditable="false" class="input" title="就诊号" data-code=""
|
||||
data-expression="" multiline="false" validate="false" format="" style="font-size: small;" domain=""
|
||||
code="" required="false" inputmode="" id="pat_id" name="pat_id" value="MZ07882405098">
|
||||
MZ07882405098</field><span style="font-size: small; text-align: justify;"> </span>
|
||||
</div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="line-height: 2;"><span
|
||||
style="font-weight: 700; line-height: 2;">
|
||||
<hr style="font-size: small;"><span style="font-size: 9pt;">就诊时间:</span>
|
||||
</span>
|
||||
<field tabindex="0" id="visit_time" type="Text" class="input" title="就诊时间" name="visit_time"
|
||||
data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-size: 9pt;" value="2024-05-09 14:21:52">2024-05-09 14:21:52</field>
|
||||
<field tabindex="0" type="Text" class="blank input" title="就诊时间" name="visit_time" data-code=""
|
||||
data-expression="" multiline="false" validate="false" format=""
|
||||
style="font-weight: 700; font-size: 9pt;"> </field>
|
||||
</span><span style="font-size: 9pt; line-height: 2;">
|
||||
<group type="radio" id="firstcall" domain="" code="" style=""><input type="radio" id="firstcall__0"
|
||||
name="firstcall" value="1" checked><label for="firstcall__0">初诊</label><input type="radio"
|
||||
id="firstcall__1" name="firstcall" value="2"><label for="firstcall__1">复诊</label></group>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;">联系电话:</span>
|
||||
<field tabindex="0" id="pat_phone" type="Text" class="input" title="联系电话" name="pat_phone"
|
||||
data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
contenteditable="true" style="" value=""></field><span style="" domain=""
|
||||
code="" title=" "><span style="font-weight: bold;"> 家庭住址:</span>
|
||||
<field tabindex="0" id="pat_address" name="pat_address" type="Text" contenteditable="true"
|
||||
class="blank input" title="地址" domain="" code="" multiline="true" required="false" format=""
|
||||
inputmode="" data-expression="" value="">地址</field>
|
||||
</span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;">主诉:</span>
|
||||
<field tabindex="0" id="pat_appeal" name="pat_appeal" type="Text" contenteditable="true"
|
||||
class="input" title="主诉" domain="" code="" multiline="true" required="false" format=""
|
||||
inputmode="" data-expression="" style="" value=""></field><span
|
||||
style="font-weight: bold;"> </span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="" title="" domain="" code=""><span style="font-weight: bold;">现病史:</span>
|
||||
<field tabindex="0" id="pat_now_history" name="pat_now_history" type="Text"
|
||||
contenteditable="true" class="input" title="病史" domain="" code="" multiline="true"
|
||||
required="false" format="" inputmode="" data-expression="" style=""
|
||||
value=""></field><span
|
||||
style="font-weight: bold;"> </span>
|
||||
</span></span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;">既往史:</span>
|
||||
<field tabindex="0" id="pat_past_history" name="pat_past_history" type="Text" contenteditable="true"
|
||||
class="blank input" title="既往史" domain="" code="" multiline="true" required="false" format=""
|
||||
inputmode="" data-expression="" style="">既往史</field><span
|
||||
style="font-weight: bold;"> </span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;" domain="" code="" title=" "><span
|
||||
style="font-size: 9pt; line-height: 2;"><span style="font-weight: bold;">过敏史:</span>
|
||||
<field tabindex="0" id="pat_allergy_history" name="pat_allergy_history" type="Text"
|
||||
contenteditable="true" class="blank input" title="过敏史" domain="" code="" multiline="true"
|
||||
required="false" format="" inputmode="" data-expression="" style="">过敏史</field><span
|
||||
style="font-weight: bold;"> </span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;">诊断:</span>
|
||||
<field tabindex="0" id="diagnosis" name="diagnosis" type="Text" contenteditable="true" class="input"
|
||||
title="诊断" domain="" code="" multiline="true" required="false" format="" inputmode=""
|
||||
data-expression="" style="" value=""></field>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 12px;"><span
|
||||
style="font-weight: 700;">处方:</span>
|
||||
<field tabindex="0" id="presc" name="presc" type="Text" contenteditable="false" class="input"
|
||||
title="处方" domain="" code="" multiline="true" required="false" format="" inputmode=""
|
||||
data-expression="" style="" value=""></field><span style="font-weight: 700;"> </span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;">建议:</span>
|
||||
<field tabindex="0" id="advice" type="Text" contenteditable="true" class="input" title="建议" domain="" code=""
|
||||
multiline="true" required="false" format="" inputmode="" data-expression="" style=""
|
||||
value="在用药过程中有任何身体不适,请及时前往实体医院就诊">在用药过程中有任何身体不适,请及时前往实体医院就诊</field><span
|
||||
style="font-weight: bold;"> </span>
|
||||
</span></div>
|
||||
<div style="text-align: justify; line-height: 2;"><span style="font-size: 9pt; line-height: 2;"><span
|
||||
style="font-weight: bold;"><br></span></span></div>
|
||||
<div style="text-align: justify; line-height: 2;" domain="" code="" title="" contenteditable="false"><span
|
||||
style="font-weight: bold; line-height: 2; font-size: 9pt;">医师签字:</span>
|
||||
<field tabindex="0" id="doctor_name" type="Text" contenteditable="false" class="input" title="医师签字"
|
||||
name="doctor_name" data-code="" data-expression="" multiline="false" validate="false" format=""
|
||||
style="line-height: 2; font-size: 9pt;" domain="" code="" required="false" inputmode="" value="贾连荣">
|
||||
张某某</field><span style="line-height: 2; font-size: 9pt;">
|
||||
<span style="font-weight: bold; line-height: 2;">手签:</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div id="_footer"
|
||||
style="outline: none; position: relative; min-height: 0.5cm; padding-left: 1cm; padding-right: 1cm; padding-bottom: 0.65cm;"
|
||||
contenteditable="false" class="">
|
||||
<div style="text-align: center;"><span style="font-size: small;">第<field page="pageNum" style="">#</field>
|
||||
页,共<field page="pageTotal" style="">#</field>页</span></div>
|
||||
</div>
|
||||
</div>
|
37
front/public/mock/data_table.html
Normal file
10
front/public/mock/en_us.html
Normal file
75
front/public/mock/sign.html
Normal file
@ -0,0 +1,75 @@
|
||||
|
||||
<div id="_page" style="margin: 0px auto; background: rgb(255, 255, 255); width: 210mm; min-height: 297mm; transform: scale(1, 1); transform-origin: 50% 0px 0px;" pagekind="A4" direct="portrait">
|
||||
<div id="_header" style="outline: none; min-height: 0.99cm; padding-left: 1.5cm; padding-right: 1.5cm; padding-top: 0.99cm; position: relative;" contenteditable="false" class="">
|
||||
<p style=" font-family: 宋体; font-size: 15.75pt; text-align: Center;">
|
||||
<label style=" font-family: 宋体; font-size: 15.75pt; font-weight: bold; text-align: Center;">云南城投昆明妇女儿童医院</label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt; text-align: Center;">
|
||||
<label style=" font-family: 宋体; font-size: 15.75pt; font-weight: bold;">麻醉知情同意书</label>
|
||||
</p></div>
|
||||
|
||||
<div id="_body" style="outline:none;min-height: calc(297mm - 0.99cm - 0.48cm - 0.99cm - 1.5cm);padding-left:1.5cm;padding-right:1.5cm;" contenteditable="false" class="">
|
||||
<p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">姓名:</label>
|
||||
<field tabindex="0" id="姓名" name="姓名" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="姓名">姓名</field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;"> 性别:</label>
|
||||
<field tabindex="0" id="性别" name="性别" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="性别">性别</field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;"> 年龄:</label>
|
||||
<field tabindex="0" id="年龄" name="年龄" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="年龄">年龄</field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;"> 门诊号:</label>
|
||||
<field tabindex="0" id="病历号" name="病历号" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="病历号" data-code="" validate="false" format="">病历号</field> <label style=" font-family: 仿宋; font-size: 14.25pt;">科室:</label>
|
||||
<field tabindex="0" id="科室" name="科室" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="{科室}">科室</field> <label style=" font-family: 仿宋; font-size: 14.25pt;"> 床号:</label>
|
||||
<field tabindex="0" id="日期" name="日期" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="床号">床号</field>
|
||||
</p><p style=" font-family: 仿宋; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">诊断:</label>
|
||||
<field tabindex="0" id="诊断" name="诊断" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="诊断" data-code="" validate="false" format="">诊断</field> <label style=" font-family: 仿宋; font-size: 14.25pt;">执行检查手术: </label>
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="执行手术">执行手术</field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;"> 体重: </label>
|
||||
<field tabindex="0" id="体重" name="体重" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title="体重" data-code="" validate="false" format="alpha">{体重}</field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">k</label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">任何麻醉均有风险性,在根据患者病情,切实做好麻醉前准备并按操作规范认真做好麻醉工 作及范防范措施情况下,仍有可能发生以下难以避免的麻醉意外及并发症:</label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">1、根据麻醉需要及操作规范,遵照《中华人民共和国药典》要求使用各种麻醉药物和输液用液体 后,由于患者体制原因,出现输液反应,过敏、高敏反应,致热源反应等,甚至导致过敏性休 克、呼吸心跳停止; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">2、麻醉期间可能发生恶心、呕吐、返流误吸、喉水肿、喉痉挛,导致气道梗阻,窒息;</label>
|
||||
<label style=" font-family: 宋体; font-size: 14.25pt;"> </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">3、呼吸抑制甚至短暂呼吸暂停;血压下降;心率减慢;严重者可能发生心跳呼吸骤停; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">4、因麻醉诱发原有隐患匿性疾病发作,如哮喘、癫痫、心脑血管意外等; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">5、因抢救需要气管插管,可能损伤患者口唇、牙齿、引起反流误吸、气道痉挛、窒息; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">6、其他难以预料的并发症及意外。 </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">麻醉后注意事项 </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">1、麻醉结束后2小时内不要饮水、进食; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">2、接受麻醉后当天,不能驾驶机动车,骑自行车及电动车,不能经行精细操作工作和高空作业; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">3、麻醉结束后,请在医院观察休息一段时间,待麻醉医生认可后,方能离开; </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">我们将以良好的医德医术为患者实行麻醉,力争将麻醉风险降低到最低程度,保障患者安全。上 述情况以对患者及家属说明,并对患者方提出的问题作了详细的解答,经慎重考虑,患者及家属 对麻醉可能出现的风险表示充分的理解,同意要求实行麻醉,签字为证:</label>
|
||||
</p><p style="undefined" id="" title="患者签名">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">患者本人签字</label><img type="sign" alt="双击手写签名" style="width: 120px; height: 40px;" draggable="false" id="patient-sign" name="patient-sign" title=""><span style="font-size: 14.25pt;"> 签字时间_____年___月___日___ 时____分 </span></p><p style=" font-family: 仿宋; font-size: 14.25pt;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">患者家属签字</label><img type="sign" alt="双击手写签名" style="width: 120px; height: 40px;" draggable="false" id="patient-family-sign" name="patient-family-sign" title="家属签名"><span style="font-size: 14.25pt;">与患者关系_____</span></p><p style=" font-family: 仿宋; font-size: 14.25pt; text-align: Center;"><br></p><p style=" font-family: 宋体; font-size: 12pt; text-align: Right;">
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">麻醉医师签名: <img readonly style="width: 120px; height: 80px;" type="sign" alt="医生签名" id="doctor-sign" name="doctor-sign" title="医生签名"> </label>
|
||||
</p><p style=" font-family: 宋体; font-size: 12pt; text-align: Right;">
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title=""></field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">年</label>
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title=""></field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">月</label>
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title=""></field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">日</label>
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title=""></field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">时</label>
|
||||
<field tabindex="0" class="blank" style=" font-family: 仿宋; font-size: 14.25pt;" contenteditable="true" type="Text" value="" title=""></field>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt;">分</label>
|
||||
<label style=" font-family: 仿宋; font-size: 14.25pt; text-align: Right;"> </label>
|
||||
</p></div>
|
||||
|
||||
<div id="_footer" style="outline:none; position:relative;min-height:1.5cm;padding-left:1.5cm;padding-right:1.5cm;padding-bottom:0.48cm;" contenteditable="false" class="">
|
||||
<p style=""><label style=" font-family: 宋体; font-size: 10.5pt; color: #323232;"> </label> </p></div>
|
||||
|
||||
</div>
|
12
front/public/mock/yizhu.html
Normal file
1368
front/public/mock/zh-bo.html
Normal file
1167
front/public/mock/zh-tw.html
Normal file
1167
front/public/mock/zh-ug.html
Normal file
3670
front/public/vender/JsBarcode.all.js
Normal file
1
front/public/vender/codemirror.js
Normal file
66
front/public/vender/date97/My97DatePicker.htm
Normal file
@ -0,0 +1,66 @@
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="content-type" content="text/xml; charset=gb2312" />
|
||||
<title>My97DatePicker</title>
|
||||
<script type="text/javascript" src="config.js" charset=gb2312></script>
|
||||
<script>
|
||||
//var l = location;
|
||||
if(parent==window)
|
||||
location.href = 'http://www.my97.net';
|
||||
/*
|
||||
else{
|
||||
var start=l.href.indexOf('#')+1;
|
||||
if(start>0){
|
||||
document.domain = l.href.substr(start);
|
||||
}
|
||||
}
|
||||
*/
|
||||
var $d, $dp, $pdp = parent.$dp, $dt, $tdt, $sdt, $lastInput, $IE=$pdp.ie, $FF = $pdp.ff,$OPERA=$pdp.opera, $ny, $cMark = false;
|
||||
|
||||
//˵<><CBB5><EFBFBD><EFBFBD>flat<61><74>ʱ,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>$dp
|
||||
if ($pdp.eCont) {
|
||||
$dp = {};
|
||||
for (var p in $pdp) {
|
||||
$dp[p] = $pdp[p];
|
||||
}
|
||||
}
|
||||
else{
|
||||
$dp = $pdp;
|
||||
}
|
||||
|
||||
$dp.getLangIndex = function(name){
|
||||
var arr = langList;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
if (arr[i].name == name) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
$dp.getLang = function(name){
|
||||
var index = $dp.getLangIndex(name);
|
||||
if (index == -1) {
|
||||
index = 0;
|
||||
}
|
||||
return langList[index];
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
$dp.realLang = $dp.getLang($dp.lang);
|
||||
document.write("<script src='lang/" + $dp.realLang.name + ".js' charset='" + $dp.realLang.charset + "'><\/script>");
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD>б<EFBFBD><D0B1>ļ<EFBFBD>
|
||||
for (var i = 0; i < skinList.length; i++) {
|
||||
document.write('<link rel="stylesheet" type="text/css" href="skin/' + skinList[i].name + '/datepicker.css" title="' + skinList[i].name + '" charset="' + skinList[i].charset + '" disabled="true"/>');
|
||||
}
|
||||
|
||||
</script>
|
||||
<script type="text/javascript" src="calendar.js" charset="gb2312"></script>
|
||||
</head>
|
||||
<body leftmargin="0" topmargin="0" onLoad="$c.autoSize()" tabindex=0>
|
||||
</body>
|
||||
</html>
|
||||
<script>
|
||||
new My97DP();
|
||||
</script>
|
678
front/public/vender/date97/WdatePicker.js
Normal file
@ -0,0 +1,678 @@
|
||||
/*
|
||||
* My97 DatePicker 4.8.5
|
||||
* License: http://www.my97.net/license.asp
|
||||
*/
|
||||
var $dp, WdatePicker;
|
||||
(function () {
|
||||
var Config = {
|
||||
$langList: [{
|
||||
name: 'en',
|
||||
charset: 'UTF-8'
|
||||
},
|
||||
{
|
||||
name: 'zh-cn',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'zh-tw',
|
||||
charset: 'GBK'
|
||||
}
|
||||
],
|
||||
$skinList: [{
|
||||
name: 'default',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'whyGreen',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'blue',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'green',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'simple',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'ext',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'blueFresh',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'twoer',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'YcloudRed',
|
||||
charset: 'gb2312'
|
||||
},
|
||||
{
|
||||
name: 'thinkpap',
|
||||
charset: 'gb2312'
|
||||
}
|
||||
],
|
||||
$wdate: false,
|
||||
$crossFrame: false,
|
||||
$preLoad: false,
|
||||
$dpPath: '',
|
||||
doubleCalendar: false,
|
||||
enableKeyboard: true,
|
||||
enableInputMask: true,
|
||||
autoUpdateOnChanged: null,
|
||||
weekMethod: 'MSExcel',
|
||||
position: {},
|
||||
lang: 'auto',
|
||||
skin: 'default',
|
||||
dateFmt: 'yyyy年MM月dd日 HH时mm分',
|
||||
realDateFmt: 'yyyy-MM-dd',
|
||||
realTimeFmt: 'HH:mm:ss',
|
||||
realFullFmt: '%Date %Time',
|
||||
minDate: '0001-01-01 00:00:00',
|
||||
maxDate: '9999-12-31 23:59:59',
|
||||
minTime: '00:00:00',
|
||||
maxTime: '23:59:59',
|
||||
startDate: '',
|
||||
alwaysUseStartDate: false,
|
||||
yearOffset: 1911,
|
||||
firstDayOfWeek: 0,
|
||||
isShowWeek: false,
|
||||
highLineWeekDay: true,
|
||||
isShowClear: true,
|
||||
isShowToday: true,
|
||||
isShowOK: true,
|
||||
isShowOthers: true,
|
||||
readOnly: false,
|
||||
errDealMode: 0,
|
||||
autoPickDate: null,
|
||||
qsEnabled: true,
|
||||
autoShowQS: false,
|
||||
hmsMenuCfg: {
|
||||
H: [1, 6],
|
||||
m: [5, 6],
|
||||
s: [15, 4]
|
||||
},
|
||||
|
||||
opposite: false,
|
||||
specialDates: null,
|
||||
specialDays: null,
|
||||
disabledDates: null,
|
||||
disabledDays: null,
|
||||
onpicking: null,
|
||||
onpicked: null,
|
||||
onclearing: null,
|
||||
oncleared: null,
|
||||
ychanging: null,
|
||||
ychanged: null,
|
||||
Mchanging: null,
|
||||
Mchanged: null,
|
||||
dchanging: null,
|
||||
dchanged: null,
|
||||
Hchanging: null,
|
||||
Hchanged: null,
|
||||
mchanging: null,
|
||||
mchanged: null,
|
||||
schanging: null,
|
||||
schanged: null,
|
||||
eCont: null,
|
||||
vel: null,
|
||||
elProp: '',
|
||||
errMsg: '',
|
||||
quickSel: [],
|
||||
has: {},
|
||||
getRealLang: function () {
|
||||
var arr = Config.$langList;
|
||||
for (var i = 0; i < arr.length; i++) {
|
||||
if (arr[i].name == this.lang) {
|
||||
return arr[i]
|
||||
}
|
||||
}
|
||||
return arr[0]
|
||||
}
|
||||
};
|
||||
WdatePicker = main;
|
||||
var w = window,
|
||||
emptyEl = {
|
||||
innerHTML: ''
|
||||
},
|
||||
d = 'document',
|
||||
de = 'documentElement',
|
||||
tag = 'getElementsByTagName',
|
||||
dptop, jsPath, $IE, $FF, $OPERA;
|
||||
var ua = navigator.userAgent,
|
||||
isTablet = /(?:iPad|PlayBook)/.test(ua) || (/(?:Android)/.test(ua) && !/(?:Mobile)/.test(ua)),
|
||||
isPhone = /(?:iPhone)/.test(ua) || /(?:Android)/.test(ua) && /(?:Mobile)/.test(ua);
|
||||
var appName = navigator.appName;
|
||||
if (appName == 'Microsoft Internet Explorer') $IE = true;
|
||||
else if (appName == 'Opera') $OPERA = true;
|
||||
else $FF = true;
|
||||
jsPath = Config.$dpPath || getJsPath();
|
||||
if (Config.$wdate) {
|
||||
loadCSS(jsPath + 'skin/WdatePicker.css')
|
||||
}
|
||||
dptop = w;
|
||||
if (Config.$crossFrame) {
|
||||
try {
|
||||
while (dptop.parent != dptop && dptop.parent[d][tag]('frameset').length == 0) {
|
||||
dptop = dptop.parent
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
if (!dptop.$dp) {
|
||||
dptop.$dp = {
|
||||
ff: $FF,
|
||||
ie: $IE,
|
||||
opera: $OPERA,
|
||||
status: 0,
|
||||
defMinDate: Config.minDate,
|
||||
defMaxDate: Config.maxDate,
|
||||
isTablet: isTablet,
|
||||
isPhone: isPhone,
|
||||
isTouch: isTablet || isPhone
|
||||
}
|
||||
}
|
||||
initTopDP();
|
||||
if (Config.$preLoad && $dp.status == 0) {
|
||||
dpAttachEvent(w, 'onload', function () {
|
||||
main(null, true)
|
||||
})
|
||||
}
|
||||
var docEventName = $dp.isTouch ? 'ontouchstart' : 'onmousedown';
|
||||
if (!w[d].docMD) {
|
||||
dpAttachEvent(w[d], docEventName, disposeDP, true);
|
||||
w[d].docMD = true
|
||||
}
|
||||
if (!dptop[d].docMD) {
|
||||
dpAttachEvent(dptop[d], docEventName, disposeDP, true);
|
||||
dptop[d].docMD = true
|
||||
}
|
||||
dpAttachEvent(w, 'onunload', function () {
|
||||
if ($dp.dd) {
|
||||
display($dp.dd, "none")
|
||||
}
|
||||
});
|
||||
|
||||
function initTopDP() {
|
||||
try {
|
||||
dptop[d], dptop.$dp = dptop.$dp || {}
|
||||
} catch (e) {
|
||||
dptop = w;
|
||||
$dp = $dp || {}
|
||||
}
|
||||
var obj = {
|
||||
win: w,
|
||||
$: function (el) {
|
||||
return (typeof el == 'string') ? w[d].getElementById(el) : el
|
||||
},
|
||||
$D: function (id, arg) {
|
||||
return this.$DV(this.$(id).value, arg)
|
||||
},
|
||||
$DV: function (v, arg) {
|
||||
if (v != '') {
|
||||
this.dt = $dp.cal.splitDate(v, $dp.cal.dateFmt);
|
||||
if (arg) {
|
||||
for (var p in arg) {
|
||||
if (this.dt[p] === undefined) {
|
||||
this.errMsg = 'invalid property:' + p
|
||||
} else {
|
||||
this.dt[p] += arg[p];
|
||||
if (p == 'M') {
|
||||
var offset = arg['M'] > 0 ? 1 : 0;
|
||||
var tmpday = new Date(this.dt['y'], this.dt['M'], 0).getDate();
|
||||
this.dt['d'] = Math.min(tmpday + offset, this.dt['d'])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this.dt.refresh()) {
|
||||
return this.dt
|
||||
}
|
||||
}
|
||||
return ''
|
||||
},
|
||||
show: function () {
|
||||
var divs = dptop[d].getElementsByTagName('div'),
|
||||
maxZIndex = 1e5;
|
||||
for (var i = 0; i < divs.length; i++) {
|
||||
var curZ = parseInt(divs[i].style.zIndex);
|
||||
if (curZ > maxZIndex) {
|
||||
maxZIndex = curZ
|
||||
}
|
||||
}
|
||||
this.dd.style.zIndex = maxZIndex + 2;
|
||||
display(this.dd, "block");
|
||||
display(this.dd.firstChild, "")
|
||||
},
|
||||
unbind: function (el) {
|
||||
el = this.$(el);
|
||||
if (el.initcfg) {
|
||||
dpDetachEvent(el, 'onclick', function () {
|
||||
main(el.initcfg)
|
||||
});
|
||||
dpDetachEvent(el, 'onfocus', function () {
|
||||
main(el.initcfg)
|
||||
})
|
||||
}
|
||||
},
|
||||
hide: function () {
|
||||
display(this.dd, "none")
|
||||
},
|
||||
attachEvent: dpAttachEvent
|
||||
};
|
||||
for (var p in obj) {
|
||||
dptop.$dp[p] = obj[p];
|
||||
}
|
||||
$dp = dptop.$dp
|
||||
}
|
||||
|
||||
function dpAttachEvent(o, sType, fHandler, useCapture) {
|
||||
if (o.addEventListener) {
|
||||
var shortTypeName = sType.replace(/on/, "");
|
||||
fHandler._ieEmuEventHandler = function (e) {
|
||||
return fHandler(e)
|
||||
};
|
||||
o.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, useCapture)
|
||||
} else {
|
||||
o.attachEvent(sType, fHandler)
|
||||
}
|
||||
}
|
||||
|
||||
function dpDetachEvent(o, sType, fHandler) {
|
||||
if (o.removeEventListener) {
|
||||
var shortTypeName = sType.replace(/on/, "");
|
||||
fHandler._ieEmuEventHandler = function (e) {
|
||||
return fHandler(e)
|
||||
};
|
||||
o.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false)
|
||||
} else {
|
||||
o.detachEvent(sType, fHandler)
|
||||
}
|
||||
}
|
||||
|
||||
function compareCfg(o1, o2, issub) {
|
||||
if (typeof o1 != typeof o2) return false;
|
||||
if (typeof o1 == 'object') {
|
||||
if (!issub) {
|
||||
for (var o in o1) {
|
||||
if (typeof o2[o] == 'undefined') return false;
|
||||
if (!compareCfg(o1[o], o2[o], true)) return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
} else if (typeof o1 == 'function' && typeof o2 == 'function') {
|
||||
return o1.toString() == o2.toString()
|
||||
} else {
|
||||
return o1 == o2
|
||||
}
|
||||
}
|
||||
|
||||
function getJsPath() {
|
||||
var path, tmp, scripts = w[d][tag]("script");
|
||||
for (var i = 0; i < scripts.length; i++) {
|
||||
path = scripts[i].getAttribute('src') || '';
|
||||
path = path.substr(0, path.toLowerCase().indexOf('wdatepicker.js'));
|
||||
var tmp = path.lastIndexOf("/");
|
||||
if (tmp > 0) path = path.substring(0, tmp + 1);
|
||||
if (path) break
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
function loadCSS(path, title, charset) {
|
||||
var head = w[d][tag]('HEAD').item(0),
|
||||
style = w[d].createElement('link');
|
||||
if (head) {
|
||||
style.href = path;
|
||||
style.rel = 'stylesheet';
|
||||
style.type = 'text/css';
|
||||
if (title) style.title = title;
|
||||
if (charset) style.charset = charset;
|
||||
head.appendChild(style)
|
||||
}
|
||||
}
|
||||
|
||||
function getAbsM(w) {
|
||||
w = w || dptop;
|
||||
var lm = 0,
|
||||
tm = 0;
|
||||
while (w != dptop) {
|
||||
var ifs = w.parent[d][tag]('iframe');
|
||||
for (var i = 0; i < ifs.length; i++) {
|
||||
try {
|
||||
if (ifs[i].contentWindow == w) {
|
||||
var rc = getBound(ifs[i]);
|
||||
lm += rc.left;
|
||||
tm += rc.top;
|
||||
break
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
w = w.parent
|
||||
}
|
||||
return {
|
||||
'leftM': lm,
|
||||
'topM': tm
|
||||
}
|
||||
}
|
||||
|
||||
function getBound(o, ignoreScr) {
|
||||
if (o.getBoundingClientRect) {
|
||||
return o.getBoundingClientRect()
|
||||
} else {
|
||||
var patterns = {
|
||||
ROOT_TAG: /^body|html$/i,
|
||||
OP_SCROLL: /^(?:inline|table-row)$/i
|
||||
};
|
||||
var hssFixed = false,
|
||||
win = null,
|
||||
t = o.offsetTop,
|
||||
l = o.offsetLeft,
|
||||
r = o.offsetWidth,
|
||||
b = o.offsetHeight;
|
||||
var parentNode = o.offsetParent;
|
||||
if (parentNode != o) {
|
||||
while (parentNode) {
|
||||
l += parentNode.offsetLeft;
|
||||
t += parentNode.offsetTop;
|
||||
if (getStyle(parentNode, 'position').toLowerCase() == 'fixed') hssFixed = true;
|
||||
else if (parentNode.tagName.toLowerCase() == "body") win = parentNode.ownerDocument.defaultView;
|
||||
parentNode = parentNode.offsetParent
|
||||
}
|
||||
}
|
||||
parentNode = o.parentNode;
|
||||
while (parentNode.tagName && !patterns.ROOT_TAG.test(parentNode.tagName)) {
|
||||
if (parentNode.scrollTop || parentNode.scrollLeft) {
|
||||
if (!patterns.OP_SCROLL.test(display(parentNode))) {
|
||||
if (!$OPERA || parentNode.style.overflow !== 'visible') {
|
||||
l -= parentNode.scrollLeft;
|
||||
t -= parentNode.scrollTop
|
||||
}
|
||||
}
|
||||
}
|
||||
parentNode = parentNode.parentNode
|
||||
}
|
||||
if (!hssFixed) {
|
||||
var scr = getScroll(win);
|
||||
l -= scr.left;
|
||||
t -= scr.top
|
||||
}
|
||||
r += l;
|
||||
b += t;
|
||||
return {
|
||||
'left': l,
|
||||
'top': t,
|
||||
'right': r,
|
||||
'bottom': b
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getWH(w) {
|
||||
w = w || dptop;
|
||||
var doc = w[d],
|
||||
width = (w.innerWidth) ? w.innerWidth : (doc[de] && doc[de].clientWidth) ? doc[de].clientWidth : doc.body.offsetWidth,
|
||||
height = (w.innerHeight) ? w.innerHeight : (doc[de] && doc[de].clientHeight) ? doc[de].clientHeight : doc.body.offsetHeight;
|
||||
return {
|
||||
'width': width,
|
||||
'height': height
|
||||
}
|
||||
}
|
||||
|
||||
function getScroll(w) {
|
||||
w = w || dptop;
|
||||
var doc = w[d],
|
||||
doce = doc[de],
|
||||
db = doc.body;
|
||||
doc = (doce && doce.scrollTop != null && (doce.scrollTop > db.scrollTop || doce.scrollLeft > db.scrollLeft)) ? doce : db;
|
||||
return {
|
||||
'top': doc.scrollTop,
|
||||
'left': doc.scrollLeft
|
||||
}
|
||||
}
|
||||
|
||||
function disposeDP(e) {
|
||||
try {
|
||||
var src = e ? (e.srcElement || e.target) : null;
|
||||
if ($dp.cal && !$dp.eCont && $dp.dd && src != $dp.el && $dp.dd.style.display == 'block') {
|
||||
$dp.cal.close()
|
||||
}
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
function dpLoaded() {
|
||||
$dp.status = 2
|
||||
}
|
||||
var isDptopReady, dptopInterval;
|
||||
|
||||
function main(initcfg, preLoad) {
|
||||
if (!$dp) return;
|
||||
initcfg.el = initcfg.el || w[d].activeElement;
|
||||
if ($dp.isTouch) {
|
||||
try {
|
||||
initcfg.el.readOnly = true;
|
||||
initcfg.el.blur()
|
||||
} catch (e) {}
|
||||
}
|
||||
initTopDP();
|
||||
var cfg = {};
|
||||
for (var p in initcfg) {
|
||||
cfg[p] = initcfg[p]
|
||||
}
|
||||
for (var p in Config) {
|
||||
if (p.substring(0, 1) != '$' && cfg[p] === undefined) {
|
||||
cfg[p] = Config[p]
|
||||
}
|
||||
}
|
||||
if (preLoad) {
|
||||
if (!dptopReady()) {
|
||||
dptopInterval = dptopInterval || setInterval(function () {
|
||||
if (dptop[d].readyState == 'complete') {
|
||||
clearInterval(dptopInterval);
|
||||
}
|
||||
main(null, true)
|
||||
}, 50);
|
||||
return
|
||||
}
|
||||
if ($dp.status == 0) {
|
||||
$dp.status = 1;
|
||||
cfg.el = emptyEl;
|
||||
showPicker(cfg, true)
|
||||
} else {
|
||||
return
|
||||
}
|
||||
} else if (cfg.eCont) {
|
||||
cfg.eCont = $dp.$(cfg.eCont);
|
||||
cfg.el = emptyEl;
|
||||
cfg.autoPickDate = true;
|
||||
cfg.qsEnabled = false;
|
||||
showPicker(cfg)
|
||||
} else {
|
||||
if (Config.$preLoad && $dp.status != 2) return;
|
||||
if (!cfg.el) {
|
||||
var evt = SearchEvent();
|
||||
if (w.event === evt || evt) {
|
||||
cfg.srcEl = evt.srcElement || evt.target;
|
||||
evt.cancelBubble = true
|
||||
}
|
||||
}
|
||||
cfg.el = cfg.el = $dp.$(cfg.el || cfg.srcEl);
|
||||
if (cfg.el == null) {
|
||||
alert('WdatePicker:el is null!\nexample:onclick="WdatePicker({el:this})"');
|
||||
return
|
||||
}
|
||||
try {
|
||||
if (!cfg.el || cfg.el['My97Mark'] === true || cfg.el.disabled || ($dp.dd && display($dp.dd) != 'none' && $dp.dd.style.left != '-970px')) {
|
||||
if (cfg.el['My97Mark']) cfg.el['My97Mark'] = false;
|
||||
return
|
||||
}
|
||||
} catch (e) {}
|
||||
if (evt && cfg.el.nodeType == 1 && !compareCfg(cfg.el.initcfg, initcfg)) {
|
||||
$dp.unbind(cfg.el);
|
||||
dpAttachEvent(cfg.el, evt.type == 'focus' ? 'onclick' : 'onfocus', function () {
|
||||
main(initcfg)
|
||||
});
|
||||
cfg.el.initcfg = initcfg;
|
||||
}
|
||||
showPicker(cfg)
|
||||
}
|
||||
|
||||
function dptopReady() {
|
||||
if ($IE && dptop != w && dptop[d].readyState != 'complete') return false;
|
||||
return true
|
||||
}
|
||||
|
||||
function SearchEvent() {
|
||||
if ($FF) {
|
||||
try {
|
||||
var count = 0;
|
||||
func = SearchEvent.caller;
|
||||
while (func != null) {
|
||||
var arg0 = func.arguments[0];
|
||||
if (arg0 && (arg0 + '').indexOf('Event') >= 0 || (count++) > 97) {
|
||||
return arg0
|
||||
}
|
||||
func = func.caller
|
||||
}
|
||||
} catch (e) {}
|
||||
return null
|
||||
}
|
||||
return event
|
||||
}
|
||||
}
|
||||
|
||||
function getStyle(obj, attribute) {
|
||||
return obj.currentStyle ? obj.currentStyle[attribute] : document.defaultView.getComputedStyle(obj, false)[attribute]
|
||||
}
|
||||
|
||||
function display(obj, value) {
|
||||
if (obj) {
|
||||
if (value != null) obj.style.display = value;
|
||||
else return getStyle(obj, 'display')
|
||||
}
|
||||
}
|
||||
|
||||
function showPicker(cfg, preLoad) {
|
||||
var nodeName = cfg.el ? cfg.el.nodeName : 'INPUT';
|
||||
if (preLoad || cfg.eCont || new RegExp(/input|textarea|div|field|span|p|a/ig).test(nodeName)) {
|
||||
cfg.elProp = cfg.elProp || nodeName == 'INPUT' ? 'value' : 'innerHTML'
|
||||
} else {
|
||||
return
|
||||
}
|
||||
if (cfg.lang == 'auto') {
|
||||
cfg.lang = $IE ? navigator.browserLanguage.toLowerCase() : navigator.language.toLowerCase()
|
||||
}
|
||||
if (!cfg.eCont) {
|
||||
for (var p in cfg) {
|
||||
$dp[p] = cfg[p]
|
||||
}
|
||||
}
|
||||
if (!$dp.dd || cfg.eCont || ($dp.dd && (cfg.getRealLang().name != $dp.dd.lang || cfg.skin != $dp.dd.skin))) {
|
||||
if (cfg.eCont) {
|
||||
ddInit(cfg.eCont, cfg)
|
||||
} else {
|
||||
$dp.dd = dptop[d].createElement("DIV");
|
||||
$dp.dd.style.cssText = 'position:absolute';
|
||||
dptop[d].body.appendChild($dp.dd);
|
||||
ddInit($dp.dd, cfg);
|
||||
if (preLoad) {
|
||||
$dp.dd.style.left = $dp.dd.style.top = '-970px'
|
||||
} else {
|
||||
$dp.show();
|
||||
setPos($dp)
|
||||
}
|
||||
}
|
||||
} else if ($dp.cal) {
|
||||
$dp.show();
|
||||
$dp.cal.init();
|
||||
if (!$dp.eCont) setPos($dp)
|
||||
}
|
||||
|
||||
function ddInit(cont, cfg) {
|
||||
var dm = dptop[d].domain,
|
||||
isCross = false,
|
||||
defHtml = '<iframe hideFocus=true width=9 height=7 frameborder=0 border=0 scrolling=no src="about:blank"></iframe>';
|
||||
cont.innerHTML = defHtml;
|
||||
var langList = Config.$langList,
|
||||
skinList = Config.$skinList,
|
||||
doc;
|
||||
try {
|
||||
doc = cont.lastChild.contentWindow[d]
|
||||
} catch (e) {
|
||||
isCross = true;
|
||||
cont.removeChild(cont.lastChild);
|
||||
var ifr = dptop[d].createElement("iframe");
|
||||
ifr.hideFocus = true;
|
||||
ifr.frameBorder = 0;
|
||||
ifr.scrolling = 'no';
|
||||
ifr.src = "javascript:(function(){var d=document;d.open();d.domain='" + dm + "';})()";
|
||||
cont.appendChild(ifr);
|
||||
setTimeout(function () {
|
||||
doc = cont.lastChild.contentWindow[d];
|
||||
ddWrite()
|
||||
}, 97);
|
||||
return
|
||||
}
|
||||
ddWrite();
|
||||
|
||||
function ddWrite() {
|
||||
var realLang = cfg.getRealLang(),
|
||||
ver = '4.9.0b3';
|
||||
cont.lang = realLang.name;
|
||||
cont.skin = cfg.skin;
|
||||
var h = ['<head><script>', '', 'var doc=document, $d, $dp, $cfg=doc.cfg, $pdp = parent.$dp, $dt, $tdt, $sdt, $lastInput, $IE=$pdp.ie, $FF = $pdp.ff,$OPERA=$pdp.opera, $ny, $cMark = false;', 'if($cfg.eCont){$dp = {};for(var p in $pdp)$dp[p]=$pdp[p];}else{$dp=$pdp;};for(var p in $cfg){$dp[p]=$cfg[p];}', 'if(!$dp.isTouch)doc.oncontextmenu=function(){try{$c._fillQS(!$dp.has.d,1);showB($d.qsDivSel);}catch(e){};return false;};', '</script><script src=', jsPath, 'lang/', realLang.name, '.js?' + ver + ' charset=', realLang.charset, '></script>'];
|
||||
if (isCross) h[1] = 'document.domain="' + dm + '";';
|
||||
for (var i = 0; i < skinList.length; i++) {
|
||||
if (skinList[i].name == cfg.skin) {
|
||||
h.push('<link rel="stylesheet" type="text/css" href="' + jsPath + 'skin/' + skinList[i].name + '/datepicker.css?');
|
||||
h.push(ver);
|
||||
h.push('" charset="' + skinList[i].charset + '"/>')
|
||||
}
|
||||
}
|
||||
h.push('<script src="' + jsPath + 'calendar.js?');
|
||||
h.push(ver);
|
||||
h.push('"></script>');
|
||||
h.push('</head><body leftmargin="0" topmargin="0" tabindex=0></body></html>');
|
||||
h.push('<script>var t;t=t||setInterval(function(){if((typeof(doc.ready)=="boolean"&&doc.ready)||doc.readyState=="complete"){new My97DP();$cfg.onload();$c.autoSize();$cfg.setPos($dp);clearInterval(t);}},20);</script>');
|
||||
cfg.setPos = setPos;
|
||||
cfg.onload = dpLoaded;
|
||||
doc.write('<html>');
|
||||
doc.cfg = cfg;
|
||||
doc.write(h.join(''));
|
||||
doc.close()
|
||||
}
|
||||
}
|
||||
|
||||
function setPos(dp) {
|
||||
var l = dp.position.left,
|
||||
t = dp.position.top,
|
||||
el = dp.el;
|
||||
if (el == emptyEl) return;
|
||||
if (el != dp.srcEl && (display(el) == 'none' || el.type == 'hidden')) el = dp.srcEl;
|
||||
var objxy = getBound(el),
|
||||
mm = getAbsM(w),
|
||||
currWH = getWH(dptop),
|
||||
scr = getScroll(dptop),
|
||||
ddHeight = $dp.dd.offsetHeight,
|
||||
ddWidth = $dp.dd.offsetWidth;
|
||||
if (isNaN(t)) t = 0;
|
||||
if ((mm.topM + objxy.bottom + ddHeight > currWH.height) && (mm.topM + objxy.top - ddHeight > 0)) {
|
||||
t += scr.top + mm.topM + objxy.top - ddHeight - 2
|
||||
} else {
|
||||
t += scr.top + mm.topM + objxy.bottom;
|
||||
var offsetT = t - scr.top + ddHeight - currWH.height;
|
||||
if (offsetT > 0) t -= offsetT
|
||||
}
|
||||
if (isNaN(l)) l = 0;
|
||||
l += scr.left + Math.min(mm.leftM + objxy.left, currWH.width - ddWidth - 5) - ($IE ? 2 : 0);
|
||||
dp.dd.style.top = (t + 2) + 'px';
|
||||
dp.dd.style.left = l + 'px'
|
||||
}
|
||||
}
|
||||
})();
|
5
front/public/vender/date97/calendar.js
Normal file
14
front/public/vender/date97/lang/en.js
Normal file
@ -0,0 +1,14 @@
|
||||
var $lang={
|
||||
errAlertMsg: "Invalid date or the date out of range,redo or not?",
|
||||
aWeekStr: ["wk", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
||||
aLongWeekStr:["wk","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],
|
||||
aMonStr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
||||
aLongMonStr: ["January","February","March","April","May","June","July","August","September","October","November","December"],
|
||||
clearStr: "Clear",
|
||||
todayStr: "Today",
|
||||
okStr: "OK",
|
||||
updateStr: "OK",
|
||||
timeStr: "Time",
|
||||
quickStr: "Quick Selection",
|
||||
err_1: 'MinDate Cannot be bigger than MaxDate!'
|
||||
}
|
14
front/public/vender/date97/lang/zh-cn.js
Normal file
@ -0,0 +1,14 @@
|
||||
var $lang={
|
||||
errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u8303\u56F4,\u9700\u8981\u64A4\u9500\u5417?",
|
||||
aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"],
|
||||
aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"],
|
||||
aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"],
|
||||
aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],
|
||||
clearStr: "\u6E05\u7A7A",
|
||||
todayStr: "\u4ECA\u5929",
|
||||
okStr: "\u786E\u5B9A",
|
||||
updateStr: "\u786E\u5B9A",
|
||||
timeStr: "\u65F6\u95F4",
|
||||
quickStr: "\u5FEB\u901F\u9009\u62E9",
|
||||
err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u4E8E\u6700\u5927\u65E5\u671F!'
|
||||
}
|
14
front/public/vender/date97/lang/zh-tw.js
Normal file
@ -0,0 +1,14 @@
|
||||
var $lang={
|
||||
errAlertMsg: "\u4E0D\u5408\u6CD5\u7684\u65E5\u671F\u683C\u5F0F\u6216\u8005\u65E5\u671F\u8D85\u51FA\u9650\u5B9A\u7BC4\u570D,\u9700\u8981\u64A4\u92B7\u55CE?",
|
||||
aWeekStr: ["\u5468","\u65E5","\u4E00","\u4E8C","\u4E09","\u56DB","\u4E94","\u516D"],
|
||||
aLongWeekStr:["\u5468","\u661F\u671F\u65E5","\u661F\u671F\u4E00","\u661F\u671F\u4E8C","\u661F\u671F\u4E09","\u661F\u671F\u56DB","\u661F\u671F\u4E94","\u661F\u671F\u516D"],
|
||||
aMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00","\u5341\u4E8C"],
|
||||
aLongMonStr: ["\u4E00\u6708","\u4E8C\u6708","\u4E09\u6708","\u56DB\u6708","\u4E94\u6708","\u516D\u6708","\u4E03\u6708","\u516B\u6708","\u4E5D\u6708","\u5341\u6708","\u5341\u4E00\u6708","\u5341\u4E8C\u6708"],
|
||||
clearStr: "\u6E05\u7A7A",
|
||||
todayStr: "\u4ECA\u5929",
|
||||
okStr: "\u78BA\u5B9A",
|
||||
updateStr: "\u78BA\u5B9A",
|
||||
timeStr: "\u6642\u9593",
|
||||
quickStr: "\u5FEB\u901F\u9078\u64C7",
|
||||
err_1: '\u6700\u5C0F\u65E5\u671F\u4E0D\u80FD\u5927\u65BC\u6700\u5927\u65E5\u671F!'
|
||||
}
|
11
front/public/vender/date97/skin/WdatePicker.css
Normal file
@ -0,0 +1,11 @@
|
||||
.Wdate{
|
||||
border:#999 1px solid;
|
||||
height:20px;
|
||||
background:#fff url(datePicker.gif) no-repeat right;
|
||||
}
|
||||
.Wdate::-ms-clear{display:none;}
|
||||
|
||||
.WdateFmtErr{
|
||||
font-weight:bold;
|
||||
color:red;
|
||||
}
|
BIN
front/public/vender/date97/skin/datePicker.gif
Normal file
After Width: | Height: | Size: 1.0 KiB |
328
front/public/vender/date97/skin/default/datepicker.css
Normal file
@ -0,0 +1,328 @@
|
||||
/**
|
||||
* yyh & kimi from mb518.com
|
||||
* 2019-3-25
|
||||
**/
|
||||
.WdateDiv {
|
||||
width: 216px;
|
||||
background-color: #FFF;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #cecece;
|
||||
}
|
||||
|
||||
.WdateDiv2 {
|
||||
width: 432px;
|
||||
}
|
||||
|
||||
.WdateDiv > div:nth-child(3) {
|
||||
padding: 0px 0.375em;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImg a {
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImgll a {
|
||||
float: left;
|
||||
background: url(img.gif) no-repeat;
|
||||
background-size: 400%;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImgl a {
|
||||
float: left;
|
||||
background: url(img.gif) no-repeat -1em 0;
|
||||
background-size: 400%;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImgr a {
|
||||
float: right;
|
||||
background: url(img.gif) no-repeat -2em 0;
|
||||
background-size: 400%;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImgrr a {
|
||||
float: right;
|
||||
background: url(img.gif) no-repeat -3em 0;
|
||||
background-size: 400%;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTitle {
|
||||
height: 1.875em;
|
||||
padding: 0.1875em 0.3125em;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTitle > div:nth-child(3),
|
||||
.WdateDiv #dpTitle > div:nth-child(4) {
|
||||
margin: 0px 0.8125em;
|
||||
}
|
||||
|
||||
.WdateDiv .yminput {
|
||||
margin-top: 0.375em;
|
||||
text-align: center;
|
||||
border: 0px;
|
||||
height: 1.75em;
|
||||
width: 3.125em;
|
||||
color: #333;
|
||||
background-color: #eefaff;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
font-size: 0.8125em;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.WdateDiv .yminputfocus {
|
||||
font-size: 0.8125em;
|
||||
margin-top: 0.375em;
|
||||
text-align: center;
|
||||
border: 0;
|
||||
color: #333;
|
||||
height: 1.25em;
|
||||
width: 3.125em;
|
||||
outline: none;
|
||||
background-color: #eefaff;
|
||||
}
|
||||
|
||||
.WdateDiv .menuSel {
|
||||
z-index: 1;
|
||||
position: absolute;
|
||||
background-color: #FFFFFF;
|
||||
display: none;
|
||||
padding: 0.3125em;
|
||||
border-radius: 3px;
|
||||
box-shadow: rgb(204, 204, 204) 0px 0px 2px 2px;
|
||||
}
|
||||
|
||||
.WdateDiv .menu {
|
||||
cursor: pointer;
|
||||
background-color: #fff;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.WdateDiv .menuOn {
|
||||
cursor: pointer;
|
||||
text-align: center;
|
||||
background-color: #d6f2ff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.WdateDiv .invalidMenu {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.WdateDiv .YMenu {
|
||||
margin-top: 1.875em;
|
||||
}
|
||||
|
||||
.WdateDiv .MMenu {
|
||||
margin-top: 1.875em;
|
||||
box-shadow: rgb(204, 204, 204) 0px 0px 2px 2px;
|
||||
padding: 0.3125em;
|
||||
border-radius: 3px;
|
||||
*width: 3.875em;
|
||||
}
|
||||
|
||||
.WdateDiv .hhMenu {
|
||||
margin-top: -5.625em;
|
||||
margin-left: 1.625em;
|
||||
}
|
||||
|
||||
.WdateDiv .mmMenu {
|
||||
margin-top: -2.875em;
|
||||
margin-left: 1.625em;
|
||||
}
|
||||
|
||||
.WdateDiv .ssMenu {
|
||||
margin-top: -1.5em;
|
||||
margin-left: 1.625em;
|
||||
}
|
||||
|
||||
.WdateDiv .Wweek {
|
||||
text-align: center;
|
||||
background: #DAF3F5;
|
||||
border-right: #BDEBEE 1px solid;
|
||||
}
|
||||
|
||||
.WdateDiv .MTitle {
|
||||
background-color: #f3f3f3;
|
||||
border-radius: 5px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayTable2 {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayTable2 table {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayTable {
|
||||
font-size: 0.75em;
|
||||
line-height: 1.5em;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayTable td {
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #f3f3f3;
|
||||
padding: 0.1875em 0;
|
||||
}
|
||||
|
||||
.WdateDiv .Wday {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayOn {
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
background-color: #C0EBEF;
|
||||
}
|
||||
|
||||
.WdateDiv .Wwday {
|
||||
cursor: pointer;
|
||||
color: #ab1e1e;
|
||||
}
|
||||
|
||||
.WdateDiv .WwdayOn {
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
background-color: #C0EBEF;
|
||||
}
|
||||
|
||||
.WdateDiv .Wtoday {
|
||||
cursor: pointer;
|
||||
color: blue;
|
||||
}
|
||||
|
||||
.WdateDiv .Wselday {
|
||||
background-color: #35baf6;
|
||||
border-radius: 3px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.WdateDiv .WspecialDay {
|
||||
background-color: #66F4DF;
|
||||
}
|
||||
|
||||
.WdateDiv .WotherDay {
|
||||
cursor: pointer;
|
||||
color: #8585e1;
|
||||
}
|
||||
|
||||
.WdateDiv .WotherDayOn {
|
||||
cursor: pointer;
|
||||
background-color: #d6f2ff;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.WdateDiv .WinvalidDay {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime {
|
||||
margin: 0.1875em 0 0.1875em 0.625em;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime #dpTimeStr {
|
||||
margin-left: 0.0625em;
|
||||
color: #333;
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime table:nth-child(4) {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime table:nth-child(-n+3) {
|
||||
font-size: 0.75em;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime input {
|
||||
-webkit-appearance: none;
|
||||
font-size: 0.75em;
|
||||
height: 1.25em;
|
||||
width: 1.875em;
|
||||
text-align: center;
|
||||
color: #333;
|
||||
border: 0;
|
||||
background-color: #eefaff;
|
||||
border-radius: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime input:disabled {
|
||||
background-color: #e7e7e7;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tB {
|
||||
border-right: 0px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tE {
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tm {
|
||||
width: 0.9375em;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
}
|
||||
|
||||
/*.WdateDiv #dpTime button {
|
||||
font-size: 0.75em;
|
||||
}*/
|
||||
|
||||
.WdateDiv #dpTime #dpTimeUp {
|
||||
height: 0.625em;
|
||||
width: 0.8125em;
|
||||
border: 0px;
|
||||
background: url(img.gif) no-repeat -2em -1em;
|
||||
background-size: 450%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime #dpTimeDown {
|
||||
height: 0.625em;
|
||||
width: 0.8125em;
|
||||
border: 0px;
|
||||
background: url(img.gif) no-repeat -2em -1.625em;
|
||||
background-size: 450%;
|
||||
}
|
||||
|
||||
.WdateDiv #dpQS {
|
||||
float: left;
|
||||
margin-right: 0.1875em;
|
||||
margin-top: 0.3125em;
|
||||
background: url(img.gif) no-repeat 0px -1em;
|
||||
background-size: 320%;
|
||||
width: 1.25em;
|
||||
height: 1.25em;
|
||||
cursor: pointer;
|
||||
margin-left: 0.375em;
|
||||
}
|
||||
|
||||
.WdateDiv #dpControl {
|
||||
text-align: right;
|
||||
margin-top: 0.1875em;
|
||||
padding: 0 0.3125em;
|
||||
padding-bottom: 0.1875em;
|
||||
}
|
||||
|
||||
.WdateDiv .dpButton {
|
||||
font-size: 0.75em;
|
||||
-webkit-appearance: none;
|
||||
padding-top: 0;
|
||||
height: 1.75em;
|
||||
width: 2.8125em;
|
||||
border: 0;
|
||||
margin-top: 0.1875em;
|
||||
margin-right: 0.1875em;
|
||||
background: #35baf6;
|
||||
color: #fff;
|
||||
border-radius: 0;
|
||||
}
|
BIN
front/public/vender/date97/skin/default/img.gif
Normal file
After Width: | Height: | Size: 2.4 KiB |
309
front/public/vender/date97/skin/ext/datepicker.css
Normal file
@ -0,0 +1,309 @@
|
||||
/*
|
||||
* My97 DatePicker 4.7
|
||||
* Ƥ<><C6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ext
|
||||
* Ƥ<><C6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:CssRain
|
||||
* <20><><EFBFBD><EFBFBD>blog:http://www.CssRain.cn
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:cssrain@gmail.com
|
||||
*/
|
||||
|
||||
/* <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DIV */
|
||||
.WdateDiv{
|
||||
width:180px;
|
||||
background-color:#fff;
|
||||
border:1px solid #718BB7;
|
||||
}
|
||||
/* ˫<><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD> */
|
||||
.WdateDiv2{
|
||||
width:360px;
|
||||
}
|
||||
.WdateDiv *{font-size:9pt;}
|
||||
|
||||
/****************************
|
||||
* <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC> ȫ<><C8AB><EFBFBD><EFBFBD>A<EFBFBD><41>ǩ
|
||||
***************************/
|
||||
.WdateDiv .NavImg a{
|
||||
margin-top:3px;
|
||||
cursor:pointer;
|
||||
display:block;
|
||||
width:15px;
|
||||
height:15px;
|
||||
}
|
||||
.WdateDiv .NavImgll a{
|
||||
background:url(left-btn2.gif) no-repeat center center;
|
||||
float:left;
|
||||
margin-left:2px;
|
||||
}
|
||||
.WdateDiv .NavImgl a{
|
||||
background:url(left-btn.gif) no-repeat center center;
|
||||
float:left;
|
||||
margin-left:2px;
|
||||
}
|
||||
.WdateDiv .NavImgr a{
|
||||
background:url(right-btn.gif) no-repeat center center;
|
||||
float:right;
|
||||
margin-right:2px;
|
||||
}
|
||||
.WdateDiv .NavImgrr a{
|
||||
background:url(right-btn2.gif) no-repeat center center;
|
||||
float:right;
|
||||
margin-right:2px;
|
||||
}
|
||||
|
||||
/****************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
***************************/
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD> DIV */
|
||||
.WdateDiv #dpTitle{
|
||||
height:22px;
|
||||
background:transparent url(hd-sprite.gif) repeat-x scroll 0 -83px;
|
||||
color:#FFFFFF;
|
||||
font-family:"sans serif",tahoma,verdana,helvetica;
|
||||
font-size:12px;
|
||||
font-size-adjust:none;
|
||||
font-stretch:normal;
|
||||
font-style:normal;
|
||||
font-variant:normal;
|
||||
font-weight:bold;
|
||||
padding-top:2px;
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> INPUT */
|
||||
.WdateDiv .yminput{
|
||||
margin-top:2px;
|
||||
text-align:center;
|
||||
border:0px;
|
||||
height:20px;
|
||||
width:50px;
|
||||
color:#FFF;
|
||||
background-color:transparent;
|
||||
cursor:pointer;
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʽ INPUT */
|
||||
.WdateDiv .yminputfocus{
|
||||
margin-top:2px;
|
||||
text-align:center;
|
||||
border:#939393 1px solid;
|
||||
font-weight:bold;
|
||||
color:#034c50;
|
||||
height:16px;
|
||||
width:50px;
|
||||
}
|
||||
/* <20>˵<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD> DIV */
|
||||
.WdateDiv .menuSel{
|
||||
z-index:1;
|
||||
position:absolute;
|
||||
background-color:#FFFFFF;
|
||||
border:1px solid #718BB7;
|
||||
display:none;
|
||||
}
|
||||
/* <20>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>ʽ TD */
|
||||
.WdateDiv .menu{
|
||||
cursor:pointer;
|
||||
background-color:#fff;
|
||||
color:#11777C;
|
||||
}
|
||||
/* <20>˵<EFBFBD><CBB5><EFBFBD>mouseover<65><72>ʽ TD */
|
||||
.WdateDiv .menuOn{
|
||||
cursor:pointer;
|
||||
background-color: #B3CEEF;
|
||||
}
|
||||
/* <20>˵<EFBFBD><CBB5><EFBFBD>Чʱ<D0A7><CAB1><EFBFBD><EFBFBD>ʽ TD */
|
||||
.WdateDiv .invalidMenu{
|
||||
color:#aaa;
|
||||
}
|
||||
/* <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> DIV */
|
||||
.WdateDiv .YMenu{
|
||||
margin-top:16px;
|
||||
}
|
||||
/* <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> DIV */
|
||||
.WdateDiv .MMenu{
|
||||
margin-top:16px;
|
||||
*width:62px;
|
||||
}
|
||||
/* ʱѡ<CAB1><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> DIV */
|
||||
.WdateDiv .hhMenu{
|
||||
margin-top:-90px;
|
||||
margin-left:26px;
|
||||
}
|
||||
/* <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> DIV */
|
||||
.WdateDiv .mmMenu{
|
||||
margin-top:-46px;
|
||||
margin-left:26px;
|
||||
}
|
||||
/* <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> DIV */
|
||||
.WdateDiv .ssMenu{
|
||||
margin-top:-24px;
|
||||
margin-left:26px;
|
||||
}
|
||||
|
||||
/****************************
|
||||
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
***************************/
|
||||
.WdateDiv .Wweek {
|
||||
text-align:center;
|
||||
background:#DAF3F5;
|
||||
border-right:#BDEBEE 1px solid;
|
||||
}
|
||||
/****************************
|
||||
* <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
***************************/
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TR */
|
||||
.WdateDiv .MTitle{
|
||||
color:#233D6D;
|
||||
background:#DFECFB url(glass-bg.gif) repeat-x scroll left top;
|
||||
color:#233D6D;
|
||||
cursor:default;
|
||||
font-size:10px;
|
||||
padding-top:2px;
|
||||
}
|
||||
.WdateDiv .MTitle td{
|
||||
border-bottom:1px solid #A3BAD9;
|
||||
}
|
||||
.WdateDiv .WdayTable2{
|
||||
border-collapse:collapse;
|
||||
border:black 1px solid;
|
||||
}
|
||||
.WdateDiv .WdayTable2 table{
|
||||
border:0;
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TABLE */
|
||||
.WdateDiv .WdayTable{
|
||||
line-height:20px;
|
||||
color:black;
|
||||
}
|
||||
.WdateDiv .WdayTable td{
|
||||
text-align:center;
|
||||
}
|
||||
/* <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʽ TD */
|
||||
.WdateDiv .Wday{
|
||||
cursor:pointer;
|
||||
}
|
||||
/* <20><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>mouseover<65><72>ʽ TD */
|
||||
.WdateDiv .WdayOn{
|
||||
cursor:pointer;
|
||||
background-color:#B3CEEF;
|
||||
}
|
||||
/* <20><>ĩ<EFBFBD><C4A9><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʽ TD */
|
||||
.WdateDiv .Wwday{
|
||||
cursor:pointer;
|
||||
color:#ab1e1e;
|
||||
}
|
||||
/* <20><>ĩ<EFBFBD><C4A9><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD>mouseover<65><72>ʽ TD */
|
||||
.WdateDiv .WwdayOn{
|
||||
cursor:pointer;
|
||||
background-color:#B3CEEF;
|
||||
}
|
||||
.WdateDiv .Wtoday{
|
||||
cursor:pointer;
|
||||
color:red;
|
||||
}
|
||||
.WdateDiv .Wselday{
|
||||
background-color:#B3CEEF;
|
||||
}
|
||||
.WdateDiv .WspecialDay{
|
||||
background-color:#66F4DF;
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD> */
|
||||
.WdateDiv .WotherDay{
|
||||
cursor:pointer;
|
||||
color:#AAAAAA;
|
||||
}
|
||||
/* <20><><EFBFBD><EFBFBD><EFBFBD>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD>mouseover<65><72>ʽ */
|
||||
.WdateDiv .WotherDayOn{
|
||||
cursor:pointer;
|
||||
background-color:#B3CEEF;
|
||||
}
|
||||
/* <20><>Ч<EFBFBD><D0A7><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>ʽ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʽ,<2C><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
.WdateDiv .WinvalidDay{
|
||||
color:#aaa;
|
||||
}
|
||||
|
||||
/****************************
|
||||
* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
***************************/
|
||||
/* ʱ<><CAB1><EFBFBD><EFBFBD> DIV */
|
||||
.WdateDiv #dpTime{
|
||||
width:120px;
|
||||
text-align:left;
|
||||
margin-left:32px;
|
||||
height:20px;
|
||||
line-height:20px;
|
||||
padding-top:1px;
|
||||
}
|
||||
/* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SPAN */
|
||||
.WdateDiv #dpTime #dpTimeStr{
|
||||
margin-left:1px;
|
||||
color:#233D6D;
|
||||
}
|
||||
/* ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> INPUT */
|
||||
.WdateDiv #dpTime input{
|
||||
height:16px;
|
||||
width:18px;
|
||||
text-align:center;
|
||||
color:#333;
|
||||
border:#A3BAD9 1px solid;
|
||||
}
|
||||
/* ʱ<><CAB1> ʱ INPUT */
|
||||
.WdateDiv #dpTime .tB{
|
||||
border-right:0px;
|
||||
}
|
||||
/* ʱ<><CAB1> <20>ֺͼ<D6BA><CDBC><EFBFBD><EFBFBD><EFBFBD> ':' INPUT */
|
||||
.WdateDiv #dpTime .tE{
|
||||
border-left:0;
|
||||
border-right:0;
|
||||
}
|
||||
/* ʱ<><CAB1> <20><> INPUT */
|
||||
.WdateDiv #dpTime .tm{
|
||||
width:7px;
|
||||
border-left:0;
|
||||
border-right:0;
|
||||
}
|
||||
/* ʱ<><CAB1><EFBFBD>ұߵ<D2B1><DFB5><EFBFBD><EFBFBD>ϰ<EFBFBD>ť BUTTON */
|
||||
.WdateDiv #dpTime #dpTimeUp{
|
||||
height:8px;
|
||||
width:13px;
|
||||
border:0px;
|
||||
background:url(img.gif) no-repeat -32px -16px;
|
||||
cursor:pointer;
|
||||
margin-bottom:0;
|
||||
padding-bottom:0;
|
||||
}
|
||||
/* ʱ<><CAB1><EFBFBD>ұߵ<D2B1><DFB5><EFBFBD><EFBFBD>°<EFBFBD>ť BUTTON */
|
||||
.WdateDiv #dpTime #dpTimeDown{
|
||||
height:8px;
|
||||
width:13px;
|
||||
border:0px;
|
||||
background:url(img.gif) no-repeat -48px -16px;
|
||||
cursor:pointer;
|
||||
margin-top:0;
|
||||
padding-top:0;
|
||||
}
|
||||
/****************************
|
||||
* <20><><EFBFBD><EFBFBD>
|
||||
***************************/
|
||||
.WdateDiv #dpQS {
|
||||
float:left;
|
||||
margin-left:3px;
|
||||
margin-top:9px;
|
||||
background:url(dateselect.gif) no-repeat;
|
||||
width:20px;
|
||||
height:20px;
|
||||
cursor:pointer;
|
||||
}
|
||||
.WdateDiv #dpControl {
|
||||
text-align:right;
|
||||
margin-top:3px;
|
||||
background:#DFECFB url(glass-bg.gif) repeat-x scroll left top;
|
||||
border-top:1px solid #A3BAD9;
|
||||
padding:4px;
|
||||
}
|
||||
.WdateDiv .dpButton{
|
||||
width:44px;
|
||||
height:22px;
|
||||
background:#083772 none repeat scroll 0 0;
|
||||
border-color:#3366CC #000055 #000055 #3366CC;
|
||||
border-style:solid;
|
||||
border-width:1px;
|
||||
color:white;
|
||||
cursor:pointer;
|
||||
|
||||
}
|
BIN
front/public/vender/date97/skin/ext/dateselect.gif
Normal file
After Width: | Height: | Size: 190 B |
BIN
front/public/vender/date97/skin/ext/glass-bg.gif
Normal file
After Width: | Height: | Size: 873 B |
BIN
front/public/vender/date97/skin/ext/hd-sprite.gif
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
front/public/vender/date97/skin/ext/img.gif
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
front/public/vender/date97/skin/ext/left-btn.gif
Normal file
After Width: | Height: | Size: 870 B |
BIN
front/public/vender/date97/skin/ext/left-btn2.gif
Normal file
After Width: | Height: | Size: 113 B |
BIN
front/public/vender/date97/skin/ext/right-btn.gif
Normal file
After Width: | Height: | Size: 871 B |
BIN
front/public/vender/date97/skin/ext/right-btn2.gif
Normal file
After Width: | Height: | Size: 113 B |
BIN
front/public/vender/date97/skin/whyGreen/bg.jpg
Normal file
After Width: | Height: | Size: 307 B |
256
front/public/vender/date97/skin/whyGreen/datepicker.css
Normal file
@ -0,0 +1,256 @@
|
||||
/*
|
||||
* My97 DatePicker 4.8 Skin:whyGreen
|
||||
*/
|
||||
.WdateDiv{
|
||||
width:180px;
|
||||
background-color:#fff;
|
||||
border:#C5E1E4 1px solid;
|
||||
padding:2px;
|
||||
}
|
||||
|
||||
.WdateDiv2{
|
||||
width:360px;
|
||||
}
|
||||
.WdateDiv *{font-size:9pt;}
|
||||
|
||||
.WdateDiv .NavImg a{
|
||||
cursor:pointer;
|
||||
display:block;
|
||||
width:16px;
|
||||
height:16px;
|
||||
margin-top:1px;
|
||||
}
|
||||
|
||||
.WdateDiv .NavImgll a{
|
||||
float:left;
|
||||
background:url(img.gif) no-repeat;
|
||||
}
|
||||
.WdateDiv .NavImgl a{
|
||||
float:left;
|
||||
background:url(img.gif) no-repeat -16px 0px;
|
||||
}
|
||||
.WdateDiv .NavImgr a{
|
||||
float:right;
|
||||
background:url(img.gif) no-repeat -32px 0px;
|
||||
}
|
||||
.WdateDiv .NavImgrr a{
|
||||
float:right;
|
||||
background:url(img.gif) no-repeat -48px 0px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTitle{
|
||||
height:24px;
|
||||
padding:1px;
|
||||
border:#c5d9e8 1px solid;
|
||||
background:url(bg.jpg);
|
||||
margin-bottom:2px;
|
||||
}
|
||||
|
||||
.WdateDiv .yminput{
|
||||
margin-top:2px;
|
||||
text-align:center;
|
||||
border:0px;
|
||||
height:20px;
|
||||
width:50px;
|
||||
color:#034c50;
|
||||
background-color:transparent;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.WdateDiv .yminputfocus{
|
||||
margin-top:2px;
|
||||
text-align:center;
|
||||
border:#939393 1px solid;
|
||||
font-weight:bold;
|
||||
color:#034c50;
|
||||
height:20px;
|
||||
width:50px;
|
||||
}
|
||||
|
||||
.WdateDiv .menuSel{
|
||||
z-index:1;
|
||||
position:absolute;
|
||||
background-color:#FFFFFF;
|
||||
border:#A3C6C8 1px solid;
|
||||
display:none;
|
||||
}
|
||||
|
||||
.WdateDiv .menu{
|
||||
cursor:pointer;
|
||||
background-color:#fff;
|
||||
color:#11777C;
|
||||
}
|
||||
|
||||
.WdateDiv .menuOn{
|
||||
cursor:pointer;
|
||||
background-color:#BEEBEE;
|
||||
}
|
||||
|
||||
.WdateDiv .invalidMenu{
|
||||
color:#aaa;
|
||||
}
|
||||
|
||||
.WdateDiv .YMenu{
|
||||
margin-top:20px;
|
||||
}
|
||||
|
||||
.WdateDiv .MMenu{
|
||||
margin-top:20px;
|
||||
*width:62px;
|
||||
}
|
||||
|
||||
.WdateDiv .hhMenu{
|
||||
margin-top:-90px;
|
||||
margin-left:26px;
|
||||
}
|
||||
|
||||
.WdateDiv .mmMenu{
|
||||
margin-top:-46px;
|
||||
margin-left:26px;
|
||||
}
|
||||
|
||||
.WdateDiv .ssMenu{
|
||||
margin-top:-24px;
|
||||
margin-left:26px;
|
||||
}
|
||||
|
||||
.WdateDiv .Wweek {
|
||||
text-align:center;
|
||||
background:#DAF3F5;
|
||||
border-right:#BDEBEE 1px solid;
|
||||
}
|
||||
|
||||
.WdateDiv .MTitle{
|
||||
color:#13777e;
|
||||
background-color:#bdebee;
|
||||
}
|
||||
.WdateDiv .WdayTable2{
|
||||
border-collapse:collapse;
|
||||
border:#BEE9F0 1px solid;
|
||||
}
|
||||
.WdateDiv .WdayTable2 table{
|
||||
border:0;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayTable{
|
||||
line-height:20px;
|
||||
color:#13777e;
|
||||
background-color:#edfbfb;
|
||||
border:#BEE9F0 1px solid;
|
||||
}
|
||||
.WdateDiv .WdayTable td{
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.WdateDiv .Wday{
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.WdateDiv .WdayOn{
|
||||
cursor:pointer;
|
||||
background-color:#74d2d9 ;
|
||||
}
|
||||
|
||||
.WdateDiv .Wwday{
|
||||
cursor:pointer;
|
||||
color:#ab1e1e;
|
||||
}
|
||||
|
||||
.WdateDiv .WwdayOn{
|
||||
cursor:pointer;
|
||||
background-color:#74d2d9;
|
||||
}
|
||||
.WdateDiv .Wtoday{
|
||||
cursor:pointer;
|
||||
color:blue;
|
||||
}
|
||||
.WdateDiv .Wselday{
|
||||
background-color:#A7E2E7;
|
||||
}
|
||||
.WdateDiv .WspecialDay{
|
||||
background-color:#66F4DF;
|
||||
}
|
||||
|
||||
.WdateDiv .WotherDay{
|
||||
cursor:pointer;
|
||||
color:#0099CC;
|
||||
}
|
||||
|
||||
.WdateDiv .WotherDayOn{
|
||||
cursor:pointer;
|
||||
background-color:#C0EBEF;
|
||||
}
|
||||
|
||||
.WdateDiv .WinvalidDay{
|
||||
color:#aaa;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime{
|
||||
float:left;
|
||||
margin-top:3px;
|
||||
margin-right:30px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime #dpTimeStr{
|
||||
margin-left:1px;
|
||||
color:#497F7F;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime input{
|
||||
height:20px;
|
||||
width:18px;
|
||||
text-align:center;
|
||||
color:#333;
|
||||
border:#61CAD0 1px solid;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tB{
|
||||
border-right:0px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tE{
|
||||
border-left:0;
|
||||
border-right:0;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime .tm{
|
||||
width:7px;
|
||||
border-left:0;
|
||||
border-right:0;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime #dpTimeUp{
|
||||
height:10px;
|
||||
width:13px;
|
||||
border:0px;
|
||||
background:url(img.gif) no-repeat -32px -16px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpTime #dpTimeDown{
|
||||
height:10px;
|
||||
width:13px;
|
||||
border:0px;
|
||||
background:url(img.gif) no-repeat -48px -16px;
|
||||
}
|
||||
|
||||
.WdateDiv #dpQS {
|
||||
float:left;
|
||||
margin-right:3px;
|
||||
margin-top:3px;
|
||||
background:url(img.gif) no-repeat 0px -16px;
|
||||
width:20px;
|
||||
height:20px;
|
||||
cursor:pointer;
|
||||
}
|
||||
.WdateDiv #dpControl {
|
||||
text-align:right;
|
||||
margin-top:3px;
|
||||
}
|
||||
.WdateDiv .dpButton{
|
||||
height:20px;
|
||||
width:45px;
|
||||
margin-top:2px;
|
||||
border:#38B1B9 1px solid;
|
||||
background-color:#CFEBEE;
|
||||
color:#08575B;
|
||||
}
|
BIN
front/public/vender/date97/skin/whyGreen/img.gif
Normal file
After Width: | Height: | Size: 1.6 KiB |
1627
front/public/vender/diff.js
Normal file
31187
front/public/vender/fabric.js
Normal file
BIN
front/public/vender/fonts/mui.ttf
Normal file
190
front/public/vender/jquery/jquery.base64.js
Normal file
@ -0,0 +1,190 @@
|
||||
/*jslint adsafe: false, bitwise: true, browser: true, cap: false, css: false,
|
||||
debug: false, devel: true, eqeqeq: true, es5: false, evil: false,
|
||||
forin: false, fragment: false, immed: true, laxbreak: false, newcap: true,
|
||||
nomen: false, on: false, onevar: true, passfail: false, plusplus: true,
|
||||
regexp: false, rhino: true, safe: false, strict: false, sub: false,
|
||||
undef: true, white: false, widget: false, windows: false */
|
||||
/*global jQuery: false, window: false */
|
||||
"use strict";
|
||||
|
||||
/*
|
||||
* Original code (c) 2010 Nick Galbreath
|
||||
* http://code.google.com/p/stringencoders/source/browse/#svn/trunk/javascript
|
||||
*
|
||||
* jQuery port (c) 2010 Carlo Zottmann
|
||||
* http://github.com/carlo/jquery-base64
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person
|
||||
* obtaining a copy of this software and associated documentation
|
||||
* files (the "Software"), to deal in the Software without
|
||||
* restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following
|
||||
* conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be
|
||||
* included in all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/* base64 encode/decode compatible with window.btoa/atob
|
||||
*
|
||||
* window.atob/btoa is a Firefox extension to convert binary data (the "b")
|
||||
* to base64 (ascii, the "a").
|
||||
*
|
||||
* It is also found in Safari and Chrome. It is not available in IE.
|
||||
*
|
||||
* if (!window.btoa) window.btoa = $.base64.encode
|
||||
* if (!window.atob) window.atob = $.base64.decode
|
||||
*
|
||||
* The original spec's for atob/btoa are a bit lacking
|
||||
* https://developer.mozilla.org/en/DOM/window.atob
|
||||
* https://developer.mozilla.org/en/DOM/window.btoa
|
||||
*
|
||||
* window.btoa and $.base64.encode takes a string where charCodeAt is [0,255]
|
||||
* If any character is not [0,255], then an exception is thrown.
|
||||
*
|
||||
* window.atob and $.base64.decode take a base64-encoded string
|
||||
* If the input length is not a multiple of 4, or contains invalid characters
|
||||
* then an exception is thrown.
|
||||
*/
|
||||
|
||||
jQuery.base64 = ( function( $ ) {
|
||||
|
||||
var _PADCHAR = "=",
|
||||
_ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
|
||||
_VERSION = "1.0";
|
||||
|
||||
|
||||
function _getbyte64( s, i ) {
|
||||
// This is oddly fast, except on Chrome/V8.
|
||||
// Minimal or no improvement in performance by using a
|
||||
// object with properties mapping chars to value (eg. 'A': 0)
|
||||
|
||||
var idx = _ALPHA.indexOf( s.charAt( i ) );
|
||||
|
||||
if ( idx === -1 ) {
|
||||
throw "Cannot decode base64";
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
|
||||
function _decode( s ) {
|
||||
var pads = 0,
|
||||
i,
|
||||
b10,
|
||||
imax = s.length,
|
||||
x = [];
|
||||
|
||||
s = String( s );
|
||||
|
||||
if ( imax === 0 ) {
|
||||
return s;
|
||||
}
|
||||
|
||||
if ( imax % 4 !== 0 ) {
|
||||
throw "Cannot decode base64";
|
||||
}
|
||||
|
||||
if ( s.charAt( imax - 1 ) === _PADCHAR ) {
|
||||
pads = 1;
|
||||
|
||||
if ( s.charAt( imax - 2 ) === _PADCHAR ) {
|
||||
pads = 2;
|
||||
}
|
||||
|
||||
// either way, we want to ignore this last block
|
||||
imax -= 4;
|
||||
}
|
||||
|
||||
for ( i = 0; i < imax; i += 4 ) {
|
||||
b10 = ( _getbyte64( s, i ) << 18 ) | ( _getbyte64( s, i + 1 ) << 12 ) | ( _getbyte64( s, i + 2 ) << 6 ) | _getbyte64( s, i + 3 );
|
||||
x.push( String.fromCharCode( b10 >> 16, ( b10 >> 8 ) & 0xff, b10 & 0xff ) );
|
||||
}
|
||||
|
||||
switch ( pads ) {
|
||||
case 1:
|
||||
b10 = ( _getbyte64( s, i ) << 18 ) | ( _getbyte64( s, i + 1 ) << 12 ) | ( _getbyte64( s, i + 2 ) << 6 );
|
||||
x.push( String.fromCharCode( b10 >> 16, ( b10 >> 8 ) & 0xff ) );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
b10 = ( _getbyte64( s, i ) << 18) | ( _getbyte64( s, i + 1 ) << 12 );
|
||||
x.push( String.fromCharCode( b10 >> 16 ) );
|
||||
break;
|
||||
}
|
||||
|
||||
return x.join( "" );
|
||||
}
|
||||
|
||||
|
||||
function _getbyte( s, i ) {
|
||||
var x = s.charCodeAt( i );
|
||||
|
||||
if ( x > 255 ) {
|
||||
throw "INVALID_CHARACTER_ERR: DOM Exception 5";
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
|
||||
function _encode( s ) {
|
||||
if ( arguments.length !== 1 ) {
|
||||
throw "SyntaxError: exactly one argument required";
|
||||
}
|
||||
|
||||
s = String( s );
|
||||
|
||||
var i,
|
||||
b10,
|
||||
x = [],
|
||||
imax = s.length - s.length % 3;
|
||||
|
||||
if ( s.length === 0 ) {
|
||||
return s;
|
||||
}
|
||||
|
||||
for ( i = 0; i < imax; i += 3 ) {
|
||||
b10 = ( _getbyte( s, i ) << 16 ) | ( _getbyte( s, i + 1 ) << 8 ) | _getbyte( s, i + 2 );
|
||||
x.push( _ALPHA.charAt( b10 >> 18 ) );
|
||||
x.push( _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) );
|
||||
x.push( _ALPHA.charAt( ( b10 >> 6 ) & 0x3f ) );
|
||||
x.push( _ALPHA.charAt( b10 & 0x3f ) );
|
||||
}
|
||||
|
||||
switch ( s.length - imax ) {
|
||||
case 1:
|
||||
b10 = _getbyte( s, i ) << 16;
|
||||
x.push( _ALPHA.charAt( b10 >> 18 ) + _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) + _PADCHAR + _PADCHAR );
|
||||
break;
|
||||
|
||||
case 2:
|
||||
b10 = ( _getbyte( s, i ) << 16 ) | ( _getbyte( s, i + 1 ) << 8 );
|
||||
x.push( _ALPHA.charAt( b10 >> 18 ) + _ALPHA.charAt( ( b10 >> 12 ) & 0x3F ) + _ALPHA.charAt( ( b10 >> 6 ) & 0x3f ) + _PADCHAR );
|
||||
break;
|
||||
}
|
||||
|
||||
return x.join( "" );
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
decode: _decode,
|
||||
encode: _encode,
|
||||
VERSION: _VERSION
|
||||
};
|
||||
|
||||
}( jQuery ) );
|
||||
|
10872
front/public/vender/jquery/jquery.js
vendored
Normal file
255
front/public/vender/jquery/jquery.print.js
Normal file
@ -0,0 +1,255 @@
|
||||
/* @license
|
||||
* jQuery.print, version 1.5.1
|
||||
* (c) Sathvik Ponangi, Doers' Guild
|
||||
* Licence: CC-By (http://creativecommons.org/licenses/by/3.0/)
|
||||
*--------------------------------------------------------------------------*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
// A nice closure for our definitions
|
||||
function getjQueryObject(string) {
|
||||
// Make string a vaild jQuery thing
|
||||
var jqObj = $("");
|
||||
try {
|
||||
jqObj = $(string)
|
||||
.clone();
|
||||
} catch (e) {
|
||||
jqObj = $("<span />")
|
||||
.html(string);
|
||||
}
|
||||
return jqObj;
|
||||
}
|
||||
|
||||
function printFrame(frameWindow, content, options) {
|
||||
// Print the selected window/iframe
|
||||
var def = $.Deferred();
|
||||
try {
|
||||
frameWindow = frameWindow.contentWindow || frameWindow.contentDocument || frameWindow;
|
||||
var wdoc = frameWindow.document || frameWindow.contentDocument || frameWindow;
|
||||
if(options.doctype) {
|
||||
wdoc.write(options.doctype);
|
||||
}
|
||||
wdoc.write(content);
|
||||
wdoc.close();
|
||||
var printed = false;
|
||||
var callPrint = function () {
|
||||
if(printed) {
|
||||
return;
|
||||
}
|
||||
// Fix for IE : Allow it to render the iframe
|
||||
frameWindow.focus();
|
||||
try {
|
||||
// Fix for IE11 - printng the whole page instead of the iframe content
|
||||
if (!frameWindow.document.execCommand('print', false, null)) {
|
||||
// document.execCommand returns false if it failed -http://stackoverflow.com/a/21336448/937891
|
||||
frameWindow.print();
|
||||
}
|
||||
// focus body as it is losing focus in iPad and content not getting printed
|
||||
$('body').focus();
|
||||
} catch (e) {
|
||||
frameWindow.print();
|
||||
}
|
||||
frameWindow.close();
|
||||
printed = true;
|
||||
def.resolve();
|
||||
}
|
||||
// Print once the frame window loads - seems to work for the new-window option but unreliable for the iframe
|
||||
$(frameWindow).on("load", callPrint);
|
||||
// Fallback to printing directly if the frame doesn't fire the load event for whatever reason
|
||||
setTimeout(callPrint, options.timeout);
|
||||
} catch (err) {
|
||||
def.reject(err);
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
||||
function printContentInIFrame(content, options) {
|
||||
var $iframe = $(options.iframe + "");
|
||||
var iframeCount = $iframe.length;
|
||||
if (iframeCount === 0) {
|
||||
// Create a new iFrame if none is given
|
||||
$iframe = $('<iframe height="0" width="0" border="0" wmode="Opaque"/>')
|
||||
.prependTo('body')
|
||||
.css({
|
||||
"position": "absolute",
|
||||
"top": -999,
|
||||
"left": -999
|
||||
});
|
||||
}
|
||||
var frameWindow = $iframe.get(0);
|
||||
return printFrame(frameWindow, content, options)
|
||||
.done(function () {
|
||||
// Success
|
||||
setTimeout(function () {
|
||||
// Wait for IE
|
||||
if (iframeCount === 0) {
|
||||
// Destroy the iframe if created here
|
||||
$iframe.remove();
|
||||
}
|
||||
}, 1000);
|
||||
})
|
||||
.fail(function (err) {
|
||||
// Use the pop-up method if iframe fails for some reason
|
||||
console.error("Failed to print from iframe", err);
|
||||
printContentInNewWindow(content, options);
|
||||
})
|
||||
.always(function () {
|
||||
try {
|
||||
options.deferred.resolve();
|
||||
} catch (err) {
|
||||
console.warn('Error notifying deferred', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function printContentInNewWindow(content, options) {
|
||||
// Open a new window and print selected content
|
||||
var frameWindow = window.open();
|
||||
return printFrame(frameWindow, content, options)
|
||||
.always(function () {
|
||||
try {
|
||||
options.deferred.resolve();
|
||||
} catch (err) {
|
||||
console.warn('Error notifying deferred', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function isNode(o) {
|
||||
/* http://stackoverflow.com/a/384380/937891 */
|
||||
return !!(typeof Node === "object" ? o instanceof Node : o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName === "string");
|
||||
}
|
||||
$.print = $.fn.print = function () {
|
||||
// Print a given set of elements
|
||||
var options, $this, self = this;
|
||||
// console.log("Printing", this, arguments);
|
||||
if (self instanceof $) {
|
||||
// Get the node if it is a jQuery object
|
||||
self = self.get(0);
|
||||
}
|
||||
if (isNode(self)) {
|
||||
// If `this` is a HTML element, i.e. for
|
||||
// $(selector).print()
|
||||
$this = $(self);
|
||||
if (arguments.length > 0) {
|
||||
options = arguments[0];
|
||||
}
|
||||
} else {
|
||||
if (arguments.length > 0) {
|
||||
// $.print(selector,options)
|
||||
$this = $(arguments[0]);
|
||||
if (isNode($this[0])) {
|
||||
if (arguments.length > 1) {
|
||||
options = arguments[1];
|
||||
}
|
||||
} else {
|
||||
// $.print(options)
|
||||
options = arguments[0];
|
||||
$this = $("html");
|
||||
}
|
||||
} else {
|
||||
// $.print()
|
||||
$this = $("html");
|
||||
}
|
||||
}
|
||||
// Default options
|
||||
var defaults = {
|
||||
globalStyles: true,
|
||||
mediaPrint: false,
|
||||
stylesheet: null,
|
||||
noPrintSelector: ".no-print",
|
||||
iframe: true,
|
||||
append: null,
|
||||
prepend: null,
|
||||
manuallyCopyFormValues: true,
|
||||
deferred: $.Deferred(),
|
||||
timeout: 750,
|
||||
title: null,
|
||||
doctype: '<!doctype html>'
|
||||
};
|
||||
// Merge with user-options
|
||||
options = $.extend({}, defaults, (options || {}));
|
||||
var $styles = $("");
|
||||
if (options.globalStyles) {
|
||||
// Apply the stlyes from the current sheet to the printed page
|
||||
$styles = $("style, link, meta, base, title");
|
||||
} else if (options.mediaPrint) {
|
||||
// Apply the media-print stylesheet
|
||||
$styles = $("link[media=print]");
|
||||
}
|
||||
if (options.stylesheet) {
|
||||
// Add a custom stylesheet if given
|
||||
$styles = $.merge($styles, $('<link rel="stylesheet" href="' + options.stylesheet + '">'));
|
||||
}
|
||||
// Create a copy of the element to print
|
||||
var copy = $this.clone();
|
||||
// Wrap it in a span to get the HTML markup string
|
||||
copy = $("<span/>")
|
||||
.append(copy);
|
||||
// Remove unwanted elements
|
||||
copy.find(options.noPrintSelector)
|
||||
.remove();
|
||||
// Add in the styles
|
||||
copy.append($styles.clone());
|
||||
// Update title
|
||||
if (options.title) {
|
||||
var title = $("title", copy);
|
||||
if (title.length === 0) {
|
||||
title = $("<title />");
|
||||
copy.append(title);
|
||||
}
|
||||
title.text(options.title);
|
||||
}
|
||||
// Appedned content
|
||||
copy.append(getjQueryObject(options.append));
|
||||
// Prepended content
|
||||
copy.prepend(getjQueryObject(options.prepend));
|
||||
if (options.manuallyCopyFormValues) {
|
||||
// Manually copy form values into the HTML for printing user-modified input fields
|
||||
// http://stackoverflow.com/a/26707753
|
||||
copy.find("input")
|
||||
.each(function () {
|
||||
var $field = $(this);
|
||||
if ($field.is("[type='radio']") || $field.is("[type='checkbox']")) {
|
||||
if ($field.prop("checked")) {
|
||||
$field.attr("checked", "checked");
|
||||
}
|
||||
} else {
|
||||
$field.attr("value", $field.val());
|
||||
}
|
||||
});
|
||||
copy.find("select").each(function () {
|
||||
var $field = $(this);
|
||||
$field.find(":selected").attr("selected", "selected");
|
||||
});
|
||||
copy.find("textarea").each(function () {
|
||||
// Fix for https://github.com/DoersGuild/jQuery.print/issues/18#issuecomment-96451589
|
||||
var $field = $(this);
|
||||
$field.text($field.val());
|
||||
});
|
||||
}
|
||||
// Get the HTML markup string
|
||||
var content = copy.html();
|
||||
// Notify with generated markup & cloned elements - useful for logging, etc
|
||||
try {
|
||||
options.deferred.notify('generated_markup', content, copy);
|
||||
} catch (err) {
|
||||
console.warn('Error notifying deferred', err);
|
||||
}
|
||||
// Destroy the copy
|
||||
copy.remove();
|
||||
if (options.iframe) {
|
||||
// Use an iframe for printing
|
||||
try {
|
||||
printContentInIFrame(content, options);
|
||||
} catch (e) {
|
||||
// Use the pop-up method if iframe fails for some reason
|
||||
console.error("Failed to print from iframe", e.stack, e.message);
|
||||
printContentInNewWindow(content, options);
|
||||
}
|
||||
} else {
|
||||
// Use a new window for printing
|
||||
printContentInNewWindow(content, options);
|
||||
}
|
||||
return this;
|
||||
};
|
||||
})(jQuery);
|
1
front/public/vender/jquery/jquery.ztree.core.min.js
vendored
Normal file
1
front/public/vender/jquery/jquery.ztree.exedit.min.js
vendored
Normal file
1
front/public/vender/jquery/jquery.ztree.exhide.min.js
vendored
Normal file
BIN
front/public/vender/jquery/zTreeStyle/img/diy/1_close.png
Normal file
After Width: | Height: | Size: 601 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/1_open.png
Normal file
After Width: | Height: | Size: 580 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/2.png
Normal file
After Width: | Height: | Size: 570 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/3.png
Normal file
After Width: | Height: | Size: 762 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/4.png
Normal file
After Width: | Height: | Size: 399 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/5.png
Normal file
After Width: | Height: | Size: 710 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/6.png
Normal file
After Width: | Height: | Size: 432 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/7.png
Normal file
After Width: | Height: | Size: 534 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/8.png
Normal file
After Width: | Height: | Size: 529 B |
BIN
front/public/vender/jquery/zTreeStyle/img/diy/9.png
Normal file
After Width: | Height: | Size: 467 B |
BIN
front/public/vender/jquery/zTreeStyle/img/line_conn.gif
Normal file
After Width: | Height: | Size: 45 B |
BIN
front/public/vender/jquery/zTreeStyle/img/loading.gif
Normal file
After Width: | Height: | Size: 381 B |
BIN
front/public/vender/jquery/zTreeStyle/img/zTreeStandard.gif
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
front/public/vender/jquery/zTreeStyle/img/zTreeStandard.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
front/public/vender/jquery/zTreeStyle/img/zTreeStandard.psd
Normal file
97
front/public/vender/jquery/zTreeStyle/zTreeStyle.css
Normal file
@ -0,0 +1,97 @@
|
||||
/*-------------------------------------
|
||||
zTree Style
|
||||
|
||||
version: 3.5.19
|
||||
author: Hunter.z
|
||||
email: hunter.z@263.net
|
||||
website: http://code.google.com/p/jquerytree/
|
||||
|
||||
-------------------------------------*/
|
||||
|
||||
.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
|
||||
.ztree {margin:0; padding:5px; color:#333}
|
||||
.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
|
||||
.ztree li ul{ margin:0; padding:0 0 0 18px}
|
||||
.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
|
||||
|
||||
.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
|
||||
text-decoration:none; vertical-align:top; display: inline-block}
|
||||
.ztree li a:hover {text-decoration:underline}
|
||||
.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
|
||||
.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
|
||||
.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
|
||||
opacity:0.8; filter:alpha(opacity=80)}
|
||||
.ztree li a.tmpTargetNode_prev {}
|
||||
.ztree li a.tmpTargetNode_next {}
|
||||
.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
|
||||
font-size:12px; border:1px #7EC4CC solid; *border:0px}
|
||||
.ztree li span {line-height:16px; margin-right:2px}
|
||||
.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
|
||||
border:0 none; cursor: pointer;outline:none;
|
||||
background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
|
||||
background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
|
||||
|
||||
.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
|
||||
.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
|
||||
.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
|
||||
.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
|
||||
.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
|
||||
.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
|
||||
.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
|
||||
.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
|
||||
.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
|
||||
.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
|
||||
.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
|
||||
.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
|
||||
.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
|
||||
.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
|
||||
.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
|
||||
.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
|
||||
.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
|
||||
.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
|
||||
.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
|
||||
.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
|
||||
.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
|
||||
|
||||
.ztree li span.button.switch {width:18px; height:18px}
|
||||
.ztree li span.button.root_open{background-position:-92px -54px}
|
||||
.ztree li span.button.root_close{background-position:-74px -54px}
|
||||
.ztree li span.button.roots_open{background-position:-92px 0}
|
||||
.ztree li span.button.roots_close{background-position:-74px 0}
|
||||
.ztree li span.button.center_open{background-position:-92px -18px}
|
||||
.ztree li span.button.center_close{background-position:-74px -18px}
|
||||
.ztree li span.button.bottom_open{background-position:-92px -36px}
|
||||
.ztree li span.button.bottom_close{background-position:-74px -36px}
|
||||
.ztree li span.button.noline_open{background-position:-92px -72px}
|
||||
.ztree li span.button.noline_close{background-position:-74px -72px}
|
||||
.ztree li span.button.root_docu{ background:none;}
|
||||
.ztree li span.button.roots_docu{background-position:-56px 0}
|
||||
.ztree li span.button.center_docu{background-position:-56px -18px}
|
||||
.ztree li span.button.bottom_docu{background-position:-56px -36px}
|
||||
.ztree li span.button.noline_docu{ background:none;}
|
||||
|
||||
.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
|
||||
.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
|
||||
.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
|
||||
.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
|
||||
.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
|
||||
|
||||
.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
|
||||
|
||||
ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
|
||||
|
||||
span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
|
||||
background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
|
||||
background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
|
||||
|
||||
ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
|
||||
.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
|
||||
|
||||
/* level style*/
|
||||
/*.ztree li span.button.level0 {
|
||||
display:none;
|
||||
}
|
||||
.ztree li ul.level0 {
|
||||
padding:0;
|
||||
background:none;
|
||||
}*/
|
5
front/public/vender/mui/mui.min.css
vendored
Normal file
6
front/public/vender/mui/mui.min.js
vendored
Normal file
7
front/public/vender/mui/mui.picker.min.css
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
/**
|
||||
* 选择列表插件
|
||||
* varstion 2.0.0
|
||||
* by Houfeng
|
||||
* Houfeng@DCloud.io
|
||||
**/
|
||||
.mui-pciker-list li,.mui-picker,.mui-picker-inner{box-sizing:border-box;overflow:hidden}.mui-picker{background-color:#ddd;position:relative;height:200px;border:1px solid rgba(0,0,0,.1);-webkit-user-select:none;user-select:none}.mui-dtpicker,.mui-poppicker{left:0;background-color:#eee;box-shadow:0 -5px 7px 0 rgba(0,0,0,.1);-webkit-transition:.3s;width:100%}.mui-picker-inner{position:relative;width:100%;height:100%;-webkit-mask-box-image:-webkit-linear-gradient(bottom,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent);-webkit-mask-box-image:linear-gradient(top,transparent,transparent 5%,#fff 20%,#fff 80%,transparent 95%,transparent)}.mui-pciker-list,.mui-pciker-rule{box-sizing:border-box;padding:0;margin:-18px 0 0;width:100%;height:36px;line-height:36px;position:absolute;left:0;top:50%}.mui-pciker-rule-bg{z-index:0}.mui-pciker-rule-ft{z-index:2;border-top:solid 1px rgba(0,0,0,.1);border-bottom:solid 1px rgba(0,0,0,.1)}.mui-pciker-list{z-index:1;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform:perspective(750pt) rotateY(0) rotateX(0);transform:perspective(750pt) rotateY(0) rotateX(0)}.mui-pciker-list li{width:100%;height:100%;position:absolute;text-align:center;vertical-align:middle;-webkit-backface-visibility:hidden;backface-visibility:hidden;font-size:1pc;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#888;padding:0 8px;white-space:nowrap;-webkit-text-overflow:ellipsis;text-overflow:ellipsis;cursor:default;visibility:hidden}.mui-pciker-list li.highlight,.mui-pciker-list li.visible{visibility:visible}.mui-pciker-list li.highlight{color:#222}.mui-poppicker{position:fixed;z-index:999;border-top:solid 1px #ccc;bottom:0;-webkit-transform:translateY(300px)}.mui-poppicker.mui-active{-webkit-transform:translateY(0)}.mui-android-5-1 .mui-poppicker{bottom:-300px;-webkit-transition-property:bottom;-webkit-transform:none}.mui-android-5-1 .mui-poppicker.mui-active{bottom:0;-webkit-transition-property:bottom;-webkit-transform:none}.mui-poppicker-header{padding:6px;font-size:14px;color:#888}.mui-poppicker-header .mui-btn{font-size:9pt;padding:5px 10px}.mui-poppicker-btn-cancel{float:left}.mui-poppicker-btn-ok{float:right}.mui-poppicker-clear{clear:both;height:0;line-height:0;font-size:0;overflow:hidden}.mui-poppicker-body{position:relative;width:100%;height:200px;border-top:solid 1px #ddd}.mui-poppicker-body .mui-picker{width:100%;height:100%;margin:0;border:none;float:left}.mui-dtpicker{position:fixed;z-index:999999;border-top:solid 1px #ccc;bottom:0;-webkit-transform:translateY(300px)}.mui-dtpicker.mui-active{-webkit-transform:translateY(0)}.mui-dtpicker-active-for-page{overflow:hidden!important}.mui-android-5-1 .mui-dtpicker{bottom:-300px;-webkit-transition-property:bottom;-webkit-transform:none}.mui-android-5-1 .mui-dtpicker.mui-active{bottom:0;-webkit-transition-property:bottom;-webkit-transform:none}.mui-dtpicker-header{padding:6px;font-size:14px;color:#888}.mui-dtpicker-header button{font-size:9pt;padding:5px 10px}.mui-dtpicker-header button:last-child{float:right}.mui-dtpicker-body{position:relative;width:100%;height:200px}.mui-ios .mui-dtpicker-body{-webkit-perspective:75pc;perspective:75pc;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.mui-dtpicker-title h5{display:inline-block;width:20%;margin:0;padding:8px;text-align:center;border-top:solid 1px #ddd;background-color:#f0f0f0;border-bottom:solid 1px #ccc}[data-type=hour] [data-id=title-i],[data-type=hour] [data-id=picker-i],[data-type=month] [data-id=title-i],[data-type=month] [data-id=picker-d],[data-type=month] [data-id=title-d],[data-type=month] [data-id=picker-h],[data-type=month] [data-id=title-h],[data-type=month] [data-id=picker-i],[data-type=time] [data-id=picker-y],[data-type=time] [data-id=picker-m],[data-type=time] [data-id=picker-d],[data-type=time] [data-id=title-y],[data-type=time] [data-id=title-m],[data-type=time] [data-id=title-d],[data-type=date] [data-id=title-i],[data-type=date] [data-id=picker-h],[data-type=date] [data-id=title-h],[data-type=date] [data-id=picker-i]{display:none}.mui-dtpicker .mui-picker{width:20%;height:100%;margin:0;float:left;border:none}[data-type=hour] [data-id=picker-h],[data-type=hour] [data-id=title-h],[data-type=datetime] [data-id=picker-h],[data-type=datetime] [data-id=title-h]{border-left:dotted 1px #ccc}[data-type=datetime] .mui-picker,[data-type=time] .mui-dtpicker-title h5{width:20%}[data-type=date] .mui-dtpicker-title h5,[data-type=date] .mui-picker{width:33.3%}[data-type=hour] .mui-dtpicker-title h5,[data-type=hour] .mui-picker{width:25%}[data-type=month] .mui-dtpicker-title h5,[data-type=month] .mui-picker,[data-type=time] .mui-dtpicker-title h5,[data-type=time] .mui-picker{width:50%}
|
7
front/public/vender/mui/mui.picker.min.js
vendored
Normal file
7
front/public/vender/qrcode.js
Normal file
2145
front/public/vender/requirejs/require.js
Normal file
519
front/public/vender/signature/jSignature.CompressorSVG.js
Normal file
@ -0,0 +1,519 @@
|
||||
/** @license
|
||||
jSignature v2 SVG export plugin.
|
||||
|
||||
*/
|
||||
/**
|
||||
Copyright (c) 2012 Willow Systems Corp http://willow-systems.com
|
||||
MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/
|
||||
|
||||
;(function(){
|
||||
'use strict'
|
||||
|
||||
/** @preserve
|
||||
Simplify.js BSD
|
||||
(c) 2012, Vladimir Agafonkin
|
||||
mourner.github.com/simplify-js
|
||||
|
||||
*/
|
||||
;(function(a,b){function c(a,b){var c=a.x-b.x,d=a.y-b.y;return c*c+d*d}function d(a,b,c){var d=b.x,e=b.y,f=c.x-d,g=c.y-e,h;if(f!==0||g!==0)h=((a.x-d)*f+(a.y-e)*g)/(f*f+g*g),h>1?(d=c.x,e=c.y):h>0&&(d+=f*h,e+=g*h);return f=a.x-d,g=a.y-e,f*f+g*g}function e(a,b){var d,e=a.length,f,g=a[0],h=[g];for(d=1;d<e;d++)f=a[d],c(f,g)>b&&(h.push(f),g=f);return g!==f&&h.push(f),h}function f(a,c){var e=a.length,f=typeof Uint8Array!=b+""?Uint8Array:Array,g=new f(e),h=0,i=e-1,j,k,l,m,n=[],o=[],p=[];g[h]=g[i]=1;while(i){k=0;for(j=h+1;j<i;j++)l=d(a[j],a[h],a[i]),l>k&&(m=j,k=l);k>c&&(g[m]=1,n.push(h),o.push(m),n.push(m),o.push(i)),h=n.pop(),i=o.pop()}for(j=0;j<e;j++)g[j]&&p.push(a[j]);return p}"use strict";var g=a;g.simplify=function(a,c,d){var g=c!==b?c*c:1;return d||(a=e(a,g)),a=f(a,g),a}})(window);
|
||||
|
||||
|
||||
/**
|
||||
Vector class. Allows us to simplify representation and manipulation of coordinate-pair
|
||||
representing shift against (0, 0)
|
||||
|
||||
@public
|
||||
@class
|
||||
@param
|
||||
@returns {Type}
|
||||
*/
|
||||
function Vector(x,y){
|
||||
this.x = x
|
||||
this.y = y
|
||||
this.reverse = function(){
|
||||
return new this.constructor(
|
||||
this.x * -1
|
||||
, this.y * -1
|
||||
)
|
||||
}
|
||||
this._length = null
|
||||
this.getLength = function(){
|
||||
if (!this._length){
|
||||
this._length = Math.sqrt( Math.pow(this.x, 2) + Math.pow(this.y, 2) )
|
||||
}
|
||||
return this._length
|
||||
}
|
||||
|
||||
var polarity = function (e){
|
||||
return Math.round(e / Math.abs(e))
|
||||
}
|
||||
this.resizeTo = function(length){
|
||||
// proportionally changes x,y such that the hypotenuse (vector length) is = new length
|
||||
if (this.x === 0 && this.y === 0){
|
||||
this._length = 0
|
||||
} else if (this.x === 0){
|
||||
this._length = length
|
||||
this.y = length * polarity(this.y)
|
||||
} else if(this.y === 0){
|
||||
this._length = length
|
||||
this.x = length * polarity(this.x)
|
||||
} else {
|
||||
var proportion = Math.abs(this.y / this.x)
|
||||
, x = Math.sqrt(Math.pow(length, 2) / (1 + Math.pow(proportion, 2)))
|
||||
, y = proportion * x
|
||||
this._length = length
|
||||
this.x = x * polarity(this.x)
|
||||
this.y = y * polarity(this.y)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the angle between 'this' vector and another.
|
||||
* @public
|
||||
* @function
|
||||
* @returns {Number} The angle between the two vectors as measured in PI.
|
||||
*/
|
||||
this.angleTo = function(vectorB) {
|
||||
var divisor = this.getLength() * vectorB.getLength()
|
||||
if (divisor === 0) {
|
||||
return 0
|
||||
} else {
|
||||
// JavaScript floating point math is screwed up.
|
||||
// because of it, the core of the formula can, on occasion, have values
|
||||
// over 1.0 and below -1.0.
|
||||
return Math.acos(
|
||||
Math.min(
|
||||
Math.max(
|
||||
( this.x * vectorB.x + this.y * vectorB.y ) / divisor
|
||||
, -1.0
|
||||
)
|
||||
, 1.0
|
||||
)
|
||||
) / Math.PI
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function Point(x,y){
|
||||
this.x = x
|
||||
this.y = y
|
||||
|
||||
this.getVectorToCoordinates = function (x, y) {
|
||||
return new Vector(x - this.x, y - this.y)
|
||||
}
|
||||
this.getVectorFromCoordinates = function (x, y) {
|
||||
return this.getVectorToCoordinates(x, y).reverse()
|
||||
}
|
||||
this.getVectorToPoint = function (point) {
|
||||
return new Vector(point.x - this.x, point.y - this.y)
|
||||
}
|
||||
this.getVectorFromPoint = function (point) {
|
||||
return this.getVectorToPoint(point).reverse()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Allows one to round a number to arbitrary precision.
|
||||
Math.round() rounds to whole only.
|
||||
Number.toFixed(precision) returns a string.
|
||||
I need float to float, but with arbitrary precision, hence:
|
||||
|
||||
@public
|
||||
@function
|
||||
@param number {Number}
|
||||
@param position {Number} number of digits right of decimal point to keep. If negative, rounding to the left of decimal.
|
||||
@returns {Type}
|
||||
*/
|
||||
function round (number, position){
|
||||
var tmp = Math.pow(10, position)
|
||||
return Math.round( number * tmp ) / tmp
|
||||
}
|
||||
|
||||
// /**
|
||||
// * This is a simple, points-to-lines (not curves) renderer.
|
||||
// * Keeping it around so we can activate it from time to time and see
|
||||
// * if smoothing logic is off much.
|
||||
// * @public
|
||||
// * @function
|
||||
// * @returns {String} Like so "l 1 2 3 5' with stroke as long line chain.
|
||||
// */
|
||||
// function compressstroke(stroke, shiftx, shifty){
|
||||
// // we combine strokes data into string like this:
|
||||
// // 'M 53 7 l 1 2 3 4 -5 -6 5 -6'
|
||||
// // see SVG documentation for Path element's 'd' argument.
|
||||
// var lastx = stroke.x[0]
|
||||
// , lasty = stroke.y[0]
|
||||
// , i
|
||||
// , l = stroke.x.length
|
||||
// , answer = ['M', lastx - shiftx, lasty - shifty, 'l']
|
||||
//
|
||||
// if (l === 1){
|
||||
// // meaning this was just a DOT, not a stroke.
|
||||
// // instead of creating a circle, we just create a short line
|
||||
// answer.concat(1, -1)
|
||||
// } else {
|
||||
// for(i = 1; i < l; i++){
|
||||
// answer = answer.concat(stroke.x[i] - lastx, stroke.y[i] - lasty)
|
||||
// lastx = stroke.x[i]
|
||||
// lasty = stroke.y[i]
|
||||
// }
|
||||
// }
|
||||
// return answer.join(' ')
|
||||
// }
|
||||
|
||||
function segmentToCurve(stroke, positionInStroke, lineCurveThreshold){
|
||||
'use strict'
|
||||
// long lines (ones with many pixels between them) do not look good when they are part of a large curvy stroke.
|
||||
// You know, the jaggedy crocodile spine instead of a pretty, smooth curve. Yuck!
|
||||
// We want to approximate pretty curves in-place of those ugly lines.
|
||||
// To approximate a very nice curve we need to know the direction of line before and after.
|
||||
// Hence, on long lines we actually wait for another point beyond it to come back from
|
||||
// mousemoved before we draw this curve.
|
||||
|
||||
// So for "prior curve" to be calc'ed we need 4 points
|
||||
// A, B, C, D (we are on D now, A is 3 points in the past.)
|
||||
// and 3 lines:
|
||||
// pre-line (from points A to B),
|
||||
// this line (from points B to C), (we call it "this" because if it was not yet, it's the only one we can draw for sure.)
|
||||
// post-line (from points C to D) (even through D point is 'current' we don't know how we can draw it yet)
|
||||
//
|
||||
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
||||
|
||||
// Again, we can only derive curve between points positionInStroke-1 and positionInStroke
|
||||
// Thus, since we can only draw a line if we know one point ahead of it, we need to shift our focus one point ahead.
|
||||
positionInStroke += 1
|
||||
// Let's hope the code that calls us knows we do that and does not call us with positionInStroke = index of last point.
|
||||
|
||||
var Cpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
||||
, Dpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
||||
, CDvector = Cpoint.getVectorToPoint(Dpoint)
|
||||
// Again, we have a chance here to draw only PREVIOUS line segment - BC
|
||||
|
||||
// So, let's start with BC curve.
|
||||
// if there is only 2 points in stroke array (C, D), we don't have "history" long enough to have point B, let alone point A.
|
||||
// so positionInStroke should start with 2, ie
|
||||
// we are here when there are at least 3 points in stroke array.
|
||||
var Bpoint = new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])
|
||||
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
||||
, ABvector
|
||||
, rounding = 2
|
||||
|
||||
if ( BCvector.getLength() > lineCurveThreshold ){
|
||||
// Yey! Pretty curves, here we come!
|
||||
if(positionInStroke > 2) {
|
||||
ABvector = (new Point(stroke.x[positionInStroke-3], stroke.y[positionInStroke-3])).getVectorToPoint(Bpoint)
|
||||
} else {
|
||||
ABvector = new Vector(0,0)
|
||||
}
|
||||
var minlenfraction = 0.05
|
||||
, maxlen = BCvector.getLength() * 0.35
|
||||
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
||||
, BCDangle = CDvector.angleTo(BCvector.reverse())
|
||||
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
||||
Math.max(minlenfraction, ABCangle) * maxlen
|
||||
)
|
||||
, CtoCP2vector = (new Vector(BCvector.x + CDvector.x, BCvector.y + CDvector.y)).reverse().resizeTo(
|
||||
Math.max(minlenfraction, BCDangle) * maxlen
|
||||
)
|
||||
, BtoCP2vector = new Vector(BCvector.x + CtoCP2vector.x, BCvector.y + CtoCP2vector.y)
|
||||
|
||||
// returing curve for BC segment
|
||||
// all coords are vectors against Bpoint
|
||||
return [
|
||||
'c' // bezier curve
|
||||
, round( BtoCP1vector.x, rounding )
|
||||
, round( BtoCP1vector.y, rounding )
|
||||
, round( BtoCP2vector.x, rounding )
|
||||
, round( BtoCP2vector.y, rounding )
|
||||
, round( BCvector.x, rounding )
|
||||
, round( BCvector.y, rounding )
|
||||
]
|
||||
} else {
|
||||
return [
|
||||
'l' // line
|
||||
, round( BCvector.x, rounding )
|
||||
, round( BCvector.y, rounding )
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
function lastSegmentToCurve(stroke, lineCurveThreshold){
|
||||
'use strict'
|
||||
// Here we tidy up things left unfinished
|
||||
|
||||
// What's left unfinished there is the curve between the last points
|
||||
// in the stroke
|
||||
// We can also be called when there is only one point in the stroke (meaning, the
|
||||
// stroke was just a dot), in which case there is nothing for us to do.
|
||||
|
||||
// So for "this curve" to be calc'ed we need 3 points
|
||||
// A, B, C
|
||||
// and 2 lines:
|
||||
// pre-line (from points A to B),
|
||||
// this line (from points B to C)
|
||||
// Well, actually, we don't need to *know* the point A, just the vector A->B
|
||||
// so, we really need points B, C and AB vector.
|
||||
var positionInStroke = stroke.x.length - 1
|
||||
|
||||
// there must be at least 2 points in the stroke.for us to work. Hope calling code checks for that.
|
||||
var Cpoint = new Point(stroke.x[positionInStroke], stroke.y[positionInStroke])
|
||||
, Bpoint = new Point(stroke.x[positionInStroke-1], stroke.y[positionInStroke-1])
|
||||
, BCvector = Bpoint.getVectorToPoint(Cpoint)
|
||||
, rounding = 2
|
||||
|
||||
if (positionInStroke > 1 && BCvector.getLength() > lineCurveThreshold){
|
||||
// we have at least 3 elems in stroke
|
||||
var ABvector = (new Point(stroke.x[positionInStroke-2], stroke.y[positionInStroke-2])).getVectorToPoint(Bpoint)
|
||||
, ABCangle = BCvector.angleTo(ABvector.reverse())
|
||||
, minlenfraction = 0.05
|
||||
, maxlen = BCvector.getLength() * 0.35
|
||||
, BtoCP1vector = new Vector(ABvector.x + BCvector.x, ABvector.y + BCvector.y).resizeTo(
|
||||
Math.max(minlenfraction, ABCangle) * maxlen
|
||||
)
|
||||
|
||||
return [
|
||||
'c' // bezier curve
|
||||
, round( BtoCP1vector.x, rounding )
|
||||
, round( BtoCP1vector.y, rounding )
|
||||
, round( BCvector.x, rounding ) // CP2 is same as Cpoint
|
||||
, round( BCvector.y, rounding ) // CP2 is same as Cpoint
|
||||
, round( BCvector.x, rounding )
|
||||
, round( BCvector.y, rounding )
|
||||
]
|
||||
} else {
|
||||
// Since there is no AB leg, there is no curve to draw. This is just line
|
||||
return [
|
||||
'l' // simple line
|
||||
, round( BCvector.x, rounding )
|
||||
, round( BCvector.y, rounding )
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
function addstroke(stroke, shiftx, shifty){
|
||||
'use strict'
|
||||
// we combine strokes data into string like this:
|
||||
// 'M 53 7 l 1 2 c 3 4 -5 -6 5 -6'
|
||||
// see SVG documentation for Path element's 'd' argument.
|
||||
var lines = [
|
||||
'M' // move to
|
||||
, round( (stroke.x[0] - shiftx), 2)
|
||||
, round( (stroke.y[0] - shifty), 2)
|
||||
]
|
||||
// processing all points but first and last.
|
||||
, i = 1 // index zero item in there is STARTING point. we already extracted it.
|
||||
, l = stroke.x.length - 1 // this is a trick. We are leaving last point coordinates for separate processing.
|
||||
, lineCurveThreshold = 1
|
||||
|
||||
for(; i < l; i++){
|
||||
lines.push.apply(lines, segmentToCurve(stroke, i, lineCurveThreshold))
|
||||
}
|
||||
if (l > 0 /* effectively more than 1, since we "-1" above */){
|
||||
lines.push.apply(lines, lastSegmentToCurve(stroke, i, lineCurveThreshold))
|
||||
} else if (l === 0){
|
||||
// meaning we only have ONE point in the stroke (and otherwise refer to the stroke as "dot")
|
||||
lines.push.apply(lines, ['l' , 1, 1])
|
||||
}
|
||||
return lines.join(' ')
|
||||
}
|
||||
|
||||
function simplifystroke(stroke){
|
||||
var d = []
|
||||
, newstroke = {'x':[], 'y':[]}
|
||||
, i, l
|
||||
|
||||
for (i = 0, l = stroke.x.length; i < l; i++){
|
||||
d.push({'x':stroke.x[i], 'y':stroke.y[i]})
|
||||
}
|
||||
d = simplify(d, 0.7, true)
|
||||
for (i = 0, l = d.length; i < l; i++){
|
||||
newstroke.x.push(d[i].x)
|
||||
newstroke.y.push(d[i].y)
|
||||
}
|
||||
return newstroke
|
||||
}
|
||||
|
||||
// generate SVG style from settings
|
||||
function styleFromSettings(settings){
|
||||
var styles = [];
|
||||
var meta = [
|
||||
// ["style attr", "key in settings", "default value"]
|
||||
["fill", undefined, "none"],
|
||||
["stroke", "color", "#000000"],
|
||||
["stroke-width", "lineWidth", 2],
|
||||
["stroke-linecap", undefined, "round"],
|
||||
["stroke-linejoin", undefined, "round"]
|
||||
];
|
||||
for (var i = meta.length - 1; i >= 0; i--){
|
||||
var attr = meta[i][0]
|
||||
, key = meta[i][1]
|
||||
, defaultVal = meta[i][2];
|
||||
styles.push(attr + '="' + (key in settings && settings[key] ? settings[key] : defaultVal) + '"');
|
||||
}
|
||||
return styles.join(' ');
|
||||
}
|
||||
|
||||
function compressstrokes(data, settings){
|
||||
'use strict'
|
||||
var answer = [
|
||||
'<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
|
||||
, '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'
|
||||
]
|
||||
, i , l = data.length
|
||||
, stroke
|
||||
, xlimits = []
|
||||
, ylimits = []
|
||||
, sizex = 0
|
||||
, sizey = 0
|
||||
, shiftx = 0
|
||||
, shifty = 0
|
||||
, minx, maxx, miny, maxy, padding = 1
|
||||
, simplifieddata = []
|
||||
|
||||
if(l !== 0){
|
||||
for(i = 0; i < l; i++){
|
||||
stroke = simplifystroke( data[i] )
|
||||
simplifieddata.push(stroke)
|
||||
xlimits = xlimits.concat(stroke.x)
|
||||
ylimits = ylimits.concat(stroke.y)
|
||||
}
|
||||
|
||||
minx = Math.min.apply(null, xlimits) - padding
|
||||
maxx = Math.max.apply(null, xlimits) + padding
|
||||
miny = Math.min.apply(null, ylimits) - padding
|
||||
maxy = Math.max.apply(null, ylimits) + padding
|
||||
shiftx = minx < 0? 0 : minx
|
||||
shifty = miny < 0? 0 : miny
|
||||
sizex = maxx - minx
|
||||
sizey = maxy - miny
|
||||
}
|
||||
|
||||
answer.push(
|
||||
'<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="'+
|
||||
sizex.toString() +
|
||||
'" height="'+
|
||||
sizey.toString() +
|
||||
'">'
|
||||
)
|
||||
|
||||
// // This is a nice idea: use style declaration on top, and mark the lines with 'class="f"'
|
||||
// // thus saving space in svg...
|
||||
// // alas, many SVG renderers don't understand "class" and render the strokes in default "fill = black, no stroke" style. Ugh!!!
|
||||
// // TODO: Rewrite ImageMagic / GraphicsMagic, InkScape, http://svg.codeplex.com/ to support style + class. until then, we hardcode the stroke style within the path.
|
||||
// answer.push(
|
||||
// '<style type="text/css"><![CDATA[.f {fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}]]></style>'
|
||||
// )
|
||||
|
||||
// // This set is accompaniment to "simple line renderer" - compressstroke
|
||||
// answer.push(
|
||||
// '<style type="text/css"><![CDATA[.t {fill:none;stroke:#FF0000;stroke-width:2}]]></style>'
|
||||
// )
|
||||
// for(i = 0; i < l; i++){
|
||||
// stroke = data[i]
|
||||
// // This one is accompaniment to "simple line renderer"
|
||||
// answer.push('<path class="t" d="'+ compressstroke(stroke, shiftx, shifty) +'"/>')
|
||||
// }
|
||||
|
||||
for(i = 0, l = simplifieddata.length; i < l; i++){
|
||||
stroke = simplifieddata[i]
|
||||
answer.push('<path ' + styleFromSettings(settings) + ' d="'+ addstroke(stroke, shiftx, shifty) + '"/>')
|
||||
}
|
||||
answer.push('</svg>')
|
||||
return answer.join('')
|
||||
}
|
||||
|
||||
if (typeof btoa !== 'function')
|
||||
{
|
||||
var btoa = function(data) {
|
||||
/** @preserve
|
||||
base64 encoder
|
||||
MIT, GPL
|
||||
http://phpjs.org/functions/base64_encode
|
||||
+ original by: Tyler Akins (http://rumkin.com)
|
||||
+ improved by: Bayron Guevara
|
||||
+ improved by: Thunder.m
|
||||
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
+ bugfixed by: Pellentesque Malesuada
|
||||
+ improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
+ improved by: Rafal Kukawski (http://kukawski.pl)
|
||||
|
||||
*/
|
||||
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
|
||||
, b64a = b64.split('')
|
||||
, o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
|
||||
ac = 0,
|
||||
enc = "",
|
||||
tmp_arr = [];
|
||||
|
||||
do { // pack three octets into four hexets
|
||||
o1 = data.charCodeAt(i++);
|
||||
o2 = data.charCodeAt(i++);
|
||||
o3 = data.charCodeAt(i++);
|
||||
|
||||
bits = o1 << 16 | o2 << 8 | o3;
|
||||
|
||||
h1 = bits >> 18 & 0x3f;
|
||||
h2 = bits >> 12 & 0x3f;
|
||||
h3 = bits >> 6 & 0x3f;
|
||||
h4 = bits & 0x3f;
|
||||
|
||||
// use hexets to index into b64, and append result to encoded string
|
||||
tmp_arr[ac++] = b64a[h1] + b64a[h2] + b64a[h3] + b64a[h4];
|
||||
} while (i < data.length);
|
||||
|
||||
enc = tmp_arr.join('');
|
||||
var r = data.length % 3;
|
||||
return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
|
||||
|
||||
// end of base64 encoder MIT, GPL
|
||||
}
|
||||
}
|
||||
|
||||
var unencodedmime = 'image/svg+xml'
|
||||
function getUnencodedSVG(data, settings){
|
||||
return [unencodedmime , compressstrokes(data, settings)];
|
||||
}
|
||||
|
||||
var base64encodedmime = 'image/svg+xml;base64'
|
||||
function getBase64encodedSVG(data, settings){
|
||||
|
||||
return [base64encodedmime , btoa( compressstrokes(data, settings) )];
|
||||
}
|
||||
|
||||
function Initializer($){
|
||||
var mothership = $.fn['jSignature']
|
||||
mothership(
|
||||
'addPlugin'
|
||||
,'export'
|
||||
,'svg' // alias
|
||||
,getUnencodedSVG
|
||||
)
|
||||
mothership(
|
||||
'addPlugin'
|
||||
,'export'
|
||||
,unencodedmime // full name
|
||||
,getUnencodedSVG
|
||||
)
|
||||
mothership(
|
||||
'addPlugin'
|
||||
,'export'
|
||||
,'svgbase64' // alias
|
||||
,getBase64encodedSVG
|
||||
)
|
||||
mothership(
|
||||
'addPlugin'
|
||||
,'export'
|
||||
,base64encodedmime // full name
|
||||
,getBase64encodedSVG
|
||||
)
|
||||
}
|
||||
|
||||
// //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense
|
||||
// //Need to revisit this later.
|
||||
|
||||
if(typeof $ === 'undefined') {throw new Error("We need jQuery for some of the functionality. jQuery is not detected. Failing to initialize...")}
|
||||
Initializer($)
|
||||
|
||||
})();
|
165
front/public/vender/signature/jSignature.UndoButton.js
Normal file
@ -0,0 +1,165 @@
|
||||
/** @license
|
||||
jSignature v2 jSignature's Undo Button and undo functionality plugin
|
||||
|
||||
*/
|
||||
/**
|
||||
Copyright (c) 2011 Willow Systems Corp http://willow-systems.com
|
||||
MIT License <http://www.opensource.org/licenses/mit-license.php>
|
||||
*/
|
||||
|
||||
;(function(){
|
||||
|
||||
var apinamespace = 'jSignature'
|
||||
|
||||
function attachHandlers(buttonRenderer, apinamespace, extensionName) {
|
||||
var $undoButton = buttonRenderer.call(this)
|
||||
|
||||
;(function(jSignatureInstance, $undoButton, apinamespace) {
|
||||
jSignatureInstance.events.subscribe(
|
||||
apinamespace + '.change'
|
||||
, function(){
|
||||
if (jSignatureInstance.dataEngine.data.length) {
|
||||
$undoButton.show()
|
||||
} else {
|
||||
$undoButton.hide()
|
||||
}
|
||||
}
|
||||
)
|
||||
})( this, $undoButton, apinamespace )
|
||||
|
||||
;(function(jSignatureInstance, $undoButton, apinamespace) {
|
||||
|
||||
var eventName = apinamespace + '.undo'
|
||||
|
||||
$undoButton.bind('click', function(){
|
||||
jSignatureInstance.events.publish(eventName)
|
||||
})
|
||||
|
||||
// This one creates new "undo" event listener to jSignature instance
|
||||
// It handles the actual undo-ing.
|
||||
jSignatureInstance.events.subscribe(
|
||||
eventName
|
||||
, function(){
|
||||
var data = jSignatureInstance.dataEngine.data
|
||||
if (data.length) {
|
||||
data.pop()
|
||||
jSignatureInstance.resetCanvas(data)
|
||||
}
|
||||
}
|
||||
)
|
||||
})(
|
||||
this
|
||||
, $undoButton
|
||||
, this.events.topics.hasOwnProperty( apinamespace + '.undo' ) ?
|
||||
// oops, seems some other plugin or code has already claimed "jSignature.undo" event
|
||||
// we will use this extension's name for event name prefix
|
||||
extensionName :
|
||||
// Great! we will use 'jSignature' for event name prefix.
|
||||
apinamespace
|
||||
)
|
||||
}
|
||||
|
||||
function ExtensionInitializer(extensionName){
|
||||
// we are called very early in instance's life.
|
||||
// right after the settings are resolved and
|
||||
// jSignatureInstance.events is created
|
||||
// and right before first ("jSignature.initializing") event is called.
|
||||
// You don't really need to manupilate
|
||||
// jSignatureInstance directly, just attach
|
||||
// a bunch of events to jSignatureInstance.events
|
||||
// (look at the source of jSignatureClass to see when these fire)
|
||||
// and your special pieces of code will attach by themselves.
|
||||
|
||||
// this function runs every time a new instance is set up.
|
||||
// this means every var you create will live only for one instance
|
||||
// unless you attach it to something outside, like "window."
|
||||
// and pick it up later from there.
|
||||
|
||||
// when globalEvents' events fire, 'this' is globalEvents object
|
||||
// when jSignatureInstance's events fire, 'this' is jSignatureInstance
|
||||
|
||||
// Here,
|
||||
// this = is new jSignatureClass's instance.
|
||||
|
||||
// The way you COULD approch setting this up is:
|
||||
// if you have multistep set up, attach event to "jSignature.initializing"
|
||||
// that attaches other events to be fired further lower the init stream.
|
||||
// Or, if you know for sure you rely on only one jSignatureInstance's event,
|
||||
// just attach to it directly
|
||||
|
||||
var apinamespace = 'jSignature'
|
||||
|
||||
this.events.subscribe(
|
||||
// name of the event
|
||||
apinamespace + '.attachingEventHandlers'
|
||||
// event handlers, can pass args too, but in majority of cases,
|
||||
// 'this' which is jSignatureClass object instance pointer is enough to get by.
|
||||
, function(){
|
||||
|
||||
// hooking up "undo" button to lower edge of Canvas.
|
||||
// but only when options passed to jSignature('init', options)
|
||||
// contain "undoButton":renderingFunction pair.
|
||||
// or "undoButton":true (in which case default, internal rendering fn is used)
|
||||
if (this.settings[extensionName]) {
|
||||
var oursettings = this.settings[extensionName]
|
||||
if (typeof oursettings !== 'function') {
|
||||
// we make it a function.
|
||||
|
||||
// we allow people to override the button rendering code,
|
||||
// but when developler is OK with default look (and just passes "truthy" value)
|
||||
// this defines default look for the button:
|
||||
// centered against canvas, hanging on its lower side.
|
||||
oursettings = function(){
|
||||
// this === jSignatureInstance
|
||||
var undoButtonSytle = 'position:absolute;display:none;margin:0 !important;top:auto'
|
||||
, $undoButton = $('<input type="button" value="撤销" style="'+undoButtonSytle+'" />')
|
||||
.appendTo(this.$controlbarLower)
|
||||
|
||||
// this centers the button against the canvas.
|
||||
var buttonWidth = $undoButton.width()
|
||||
$undoButton.css(
|
||||
'left'
|
||||
, Math.round(( this.canvas.width - buttonWidth ) / 2)
|
||||
)
|
||||
// IE 7 grows the button. Correcting for that.
|
||||
if ( buttonWidth !== $undoButton.width() ) {
|
||||
$undoButton.width(buttonWidth)
|
||||
}
|
||||
|
||||
return $undoButton
|
||||
}
|
||||
}
|
||||
|
||||
attachHandlers.call(
|
||||
this
|
||||
, oursettings
|
||||
, apinamespace
|
||||
, extensionName
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
var ExtensionAttacher = function(){
|
||||
$.fn[apinamespace](
|
||||
'addPlugin'
|
||||
,'instance' // type of plugin
|
||||
,'UndoButton' // extension name
|
||||
,ExtensionInitializer
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
// //Because plugins are minified together with jSignature, multiple defines per (minified) file blow up and dont make sense
|
||||
// //Need to revisit this later.
|
||||
|
||||
// if ( typeof define === "function" && define.amd != null) {
|
||||
// // AMD-loader compatible resource declaration
|
||||
// // you need to call this one with jQuery as argument.
|
||||
// define(function(){return Initializer} )
|
||||
// } else {
|
||||
ExtensionAttacher()
|
||||
// }
|
||||
|
||||
})();
|
1486
front/public/vender/signature/jSignature.js
Normal file
5094
front/public/vender/validator.js
Normal file
5659
front/public/vender/weui/weui.css
Normal file
5
front/public/vender/weui/weui.min.css
vendored
Normal file
12
front/public/vender/weui/weui.min.js
vendored
Normal file
@ -1,57 +1,67 @@
|
||||
<script setup>
|
||||
import {reactive, ref, shallowRef} from 'vue'
|
||||
import { ThemeServiceInit, infinityTheme } from 'devui-theme';
|
||||
import HomePage from './views/HomePage.vue'
|
||||
import menjizhenItemView from './views/zl-station/menjizhenItemView.vue'
|
||||
import NotFoundPage from './views/404/notFoundPage.vue'
|
||||
|
||||
import Menu from './Menu.vue'
|
||||
|
||||
|
||||
// 使用无限主题
|
||||
ThemeServiceInit({ infinityTheme }, 'infinityTheme');
|
||||
|
||||
// 当前激活的菜单项
|
||||
const activeMenu = ref('item1')
|
||||
// // 当前激活的菜单项
|
||||
// const activeMenu = ref('item1')
|
||||
|
||||
// 当前显示的组件
|
||||
const currentComponent = shallowRef(HomePage)
|
||||
// // 当前显示的组件
|
||||
// const currentComponent = shallowRef(HomePage)
|
||||
|
||||
// 组件映射表
|
||||
const componentMap = {
|
||||
'item1': HomePage,
|
||||
'menjizhen-item': menjizhenItemView,
|
||||
'notFoundPage': NotFoundPage,
|
||||
// 其他菜单项对应的组件...
|
||||
}
|
||||
// const componentMap = {
|
||||
// 'item1': HomePage,
|
||||
// 'menjizhen-item': menjizhenItemView,
|
||||
// 'notFoundPage': NotFoundPage,
|
||||
// // 其他菜单项对应的组件...
|
||||
// }
|
||||
|
||||
// 处理菜单选择
|
||||
const handleMenuSelect = (key) => {
|
||||
activeMenu.value = key["key"]
|
||||
if (componentMap[key["key"]]) {
|
||||
currentComponent.value = componentMap[key["key"]]
|
||||
// // 处理菜单选择
|
||||
// const handleMenuSelect = (key) => {
|
||||
// activeMenu.value = key["key"]
|
||||
// if (componentMap[key["key"]]) {
|
||||
// currentComponent.value = componentMap[key["key"]]
|
||||
// } else {
|
||||
// console.warn(`未找到菜单项 ${key} 对应的组件`)
|
||||
// console.warn(key["key"])
|
||||
// currentComponent.value = NotFoundPage
|
||||
// }
|
||||
// }
|
||||
|
||||
//
|
||||
|
||||
const menu = ref(null)
|
||||
const toggleClick = function() {
|
||||
let menu = document.querySelector('.menu-aside')
|
||||
|
||||
menu.style.transition = menu.style.transition || 'all 0.3s ease-in-out'
|
||||
|
||||
if (menu.style.display == 'none') {
|
||||
menu.style.display = 'block'
|
||||
} else {
|
||||
console.warn(`未找到菜单项 ${key} 对应的组件`)
|
||||
console.warn(key["key"])
|
||||
currentComponent.value = NotFoundPage
|
||||
menu.style.display = 'none'
|
||||
}
|
||||
}
|
||||
|
||||
// 面包屑导航
|
||||
const source = reactive([
|
||||
{ title: '首页', link: '/', linkType: 'routerLink', replace: true },
|
||||
{ title: 'Breadcrumb', link: 'components/breadcrumb/', noNavigation: true },
|
||||
]);
|
||||
|
||||
</script>
|
||||
<template>
|
||||
<d-layout style="width: 100vw; ">
|
||||
<!-- 顶栏 -->
|
||||
<d-header style="position: fixed; width: 100%; z-index: 100;background: #fff;height: 56px;box-shadow: 0 2px 4px rgba(0,0,0,0.04);">
|
||||
|
||||
<div class="nav-collapse i icon-nav-collapse me-4 ms-4" @click="toggleClick()"></div>
|
||||
<span class="avatar-demo-2" style="position: relative;
|
||||
text-align: right;">
|
||||
<d-avatar name="张医生" :width="28" :height="28" class="profile"/>
|
||||
<span class="name" style="margin-left: 10px;">张医生</span>
|
||||
</span>
|
||||
<d-breadcrumb :source="source" style="display: inline-flex;text-align: center; position: relative; overflow: hidden; width: auto; margin-left:180px" />
|
||||
<!-- <d-breadcrumb :source="source" style="display: inline-flex;text-align: center; position: relative; overflow: hidden; width: auto; margin-left:180px" />-->
|
||||
|
||||
<div style="float: right;
|
||||
text-align: right;
|
||||
@ -78,7 +88,7 @@ const source = reactive([
|
||||
margin-top: 1rem;"
|
||||
>
|
||||
<d-icon name="feedback"/>
|
||||
<a href="/messages" style="color:#54dc35 ;">
|
||||
<a style="color:#54dc35 ;">
|
||||
<d-badge :count="100" status="info" class="badge-item">未读消息</d-badge>
|
||||
</a>
|
||||
</span>
|
||||
@ -98,84 +108,86 @@ const source = reactive([
|
||||
<!-- 侧边栏 - 添加fixed样式 -->
|
||||
<d-aside style="
|
||||
position: relative;
|
||||
z-index: 99;
|
||||
">
|
||||
<d-menu
|
||||
mode="vertical"
|
||||
:default-select-keys="['item1']"
|
||||
width="256px"
|
||||
@select="handleMenuSelect"
|
||||
>
|
||||
<!-- 首页 -->
|
||||
<d-menu-item key="item1">
|
||||
<template #icon><i class="icon-homepage"></i></template>
|
||||
<span>首页</span>
|
||||
</d-menu-item>
|
||||
<!-- 诊疗工作站 -->
|
||||
<d-sub-menu title="诊疗工作站" key="zl-station">
|
||||
<template #icon><i class="icon-system"></i></template>
|
||||
<d-menu-item key="menjizhen-item"><span>门急诊医生站</span></d-menu-item>
|
||||
<d-menu-item key="zhuyuan-item"><span>住院医生站</span></d-menu-item>
|
||||
<d-menu-item key="rjssmz-item"><span>日间手术门诊工作站</span></d-menu-item>
|
||||
<d-menu-item key="rjsszy-item"><span>日间手术住院工作站</span></d-menu-item>
|
||||
<d-menu-item key="hzjlgl-item"><span>会诊记录管理</span></d-menu-item>
|
||||
</d-sub-menu>
|
||||
<!-- 病历管理 -->
|
||||
<d-sub-menu title="病历管理" key="bl-manage">
|
||||
<template #icon><i class="icon-system"></i></template>
|
||||
<d-menu-item key="cyblbj-item"><span>出院病历编辑</span></d-menu-item>
|
||||
<d-menu-item key="cybldy-item"><span>出院病历打印</span></d-menu-item>
|
||||
<d-menu-item key="mzbljs-item"><span>门诊病历检索</span></d-menu-item>
|
||||
<d-menu-item key="zybljs-item"><span>住院病历检索</span></d-menu-item>
|
||||
<d-menu-item key="blxgjl-item"><span>病历修改记录</span></d-menu-item>
|
||||
<d-menu-item key="blfcxf-item"><span>病历封存解封</span></d-menu-item>
|
||||
<d-menu-item key="bljs-item"><span>病历解锁</span></d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="我的申请" key="my-apply">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="my-apply-item">
|
||||
<span>我的申请</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="我的审批" key="my-approve">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="my-approve-item">
|
||||
<span>我的审批</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="个人质检" key="personal-check">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="质控管理" key="quality-control">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="quality-control-item">
|
||||
<span>质控管理</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="系统管理" key="system-manage">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="user-manage">
|
||||
<span>用户管理</span>
|
||||
</d-menu-item>
|
||||
<d-menu-item key="role-manage">
|
||||
<span>角色管理</span>
|
||||
</d-menu-item>
|
||||
<d-menu-item key="permission-manage">
|
||||
<span>权限管理</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
</d-menu>
|
||||
|
||||
z-index: 99;"
|
||||
class="menu-aside"
|
||||
>
|
||||
<!-- <d-menu-->
|
||||
<!-- mode="vertical"-->
|
||||
<!-- :default-select-keys="['item1']"-->
|
||||
<!-- width="256px"-->
|
||||
<!-- @select="handleMenuSelect"-->
|
||||
<!-- >-->
|
||||
<!-- <!– 首页 –>-->
|
||||
<!-- <d-menu-item key="item1">-->
|
||||
<!-- <template #icon><i class="icon-homepage"></i></template>-->
|
||||
<!-- <span>首页</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- <!– 诊疗工作站 –>-->
|
||||
<!-- <d-sub-menu title="诊疗工作站" key="zl-station">-->
|
||||
<!-- <template #icon><i class="icon-system"></i></template>-->
|
||||
<!-- <d-menu-item key="menjizhen-item"><span>门急诊医生站</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="zhuyuan-item"><span>住院医生站</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="rjssmz-item"><span>日间手术门诊工作站</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="rjsszy-item"><span>日间手术住院工作站</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="hzjlgl-item"><span>会诊记录管理</span></d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <!– 病历管理 –>-->
|
||||
<!-- <d-sub-menu title="病历管理" key="bl-manage">-->
|
||||
<!-- <template #icon><i class="icon-system"></i></template>-->
|
||||
<!-- <d-menu-item key="cyblbj-item"><span>出院病历编辑</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="cybldy-item"><span>出院病历打印</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="mzbljs-item"><span>门诊病历检索</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="zybljs-item"><span>住院病历检索</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="blxgjl-item"><span>病历修改记录</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="blfcxf-item"><span>病历封存解封</span></d-menu-item>-->
|
||||
<!-- <d-menu-item key="bljs-item"><span>病历解锁</span></d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <d-sub-menu title="我的申请" key="my-apply">-->
|
||||
<!-- <template #icon>-->
|
||||
<!-- <i class="icon-system"></i>-->
|
||||
<!-- </template>-->
|
||||
<!-- <d-menu-item key="my-apply-item">-->
|
||||
<!-- <span>我的申请</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <d-sub-menu title="我的审批" key="my-approve">-->
|
||||
<!-- <template #icon>-->
|
||||
<!-- <i class="icon-system"></i>-->
|
||||
<!-- </template>-->
|
||||
<!-- <d-menu-item key="my-approve-item">-->
|
||||
<!-- <span>我的审批</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <d-sub-menu title="个人质检" key="personal-check">-->
|
||||
<!-- <template #icon>-->
|
||||
<!-- <i class="icon-system"></i>-->
|
||||
<!-- </template>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <d-sub-menu title="质控管理" key="quality-control">-->
|
||||
<!-- <template #icon>-->
|
||||
<!-- <i class="icon-system"></i>-->
|
||||
<!-- </template>-->
|
||||
<!-- <d-menu-item key="quality-control-item">-->
|
||||
<!-- <span>质控管理</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- <d-sub-menu title="系统管理" key="system-manage">-->
|
||||
<!-- <template #icon>-->
|
||||
<!-- <i class="icon-system"></i>-->
|
||||
<!-- </template>-->
|
||||
<!-- <d-menu-item key="user-manage">-->
|
||||
<!-- <span>用户管理</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- <d-menu-item key="role-manage">-->
|
||||
<!-- <span>角色管理</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- <d-menu-item key="permission-manage">-->
|
||||
<!-- <span>权限管理</span>-->
|
||||
<!-- </d-menu-item>-->
|
||||
<!-- </d-sub-menu>-->
|
||||
<!-- </d-menu>-->
|
||||
<!-- 使用独立组件-->
|
||||
<Menu></Menu>
|
||||
</d-aside>
|
||||
<!-- 主显示区 - 添加左侧边距 -->
|
||||
<d-content
|
||||
@ -183,7 +195,8 @@ const source = reactive([
|
||||
padding: 16px;
|
||||
overflow-x: hidden; /* 禁止内容溢出 */
|
||||
">
|
||||
<component :is="currentComponent"/>
|
||||
<!-- <component :is="currentComponent"/>-->
|
||||
<router-view></router-view>
|
||||
</d-content>
|
||||
</d-layout>
|
||||
<d-footer style="position: fixed; bottom: 0; width: 100%; z-index: 100;background: #fff;height: 16px;">
|
||||
@ -220,4 +233,15 @@ const source = reactive([
|
||||
font-style: oblique 0deg 20deg; /* 可选的斜体范围 */
|
||||
font-display: swap; /* 优化加载体验 */
|
||||
}
|
||||
|
||||
.nav-collapse{
|
||||
display: inline-block;
|
||||
}
|
||||
.nav-collapse:hover{
|
||||
cursor: pointer;
|
||||
color: rgb(126, 126, 126);
|
||||
}
|
||||
|
||||
|
||||
|
||||
</style>
|
95
front/src/Menu.vue
Normal file
@ -0,0 +1,95 @@
|
||||
<script setup>
|
||||
import router from "@/router/index.js";
|
||||
import { ref } from 'vue'
|
||||
|
||||
const handleMenuSelect = (key) => {
|
||||
router.push(`/${key["key"]}`)
|
||||
|
||||
}
|
||||
|
||||
// 当前激活的菜单项
|
||||
const activeMenu = ref('HomePage')
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<d-menu
|
||||
mode="vertical"
|
||||
:default-select-keys="['HomePage']"
|
||||
width="256px"
|
||||
@select="handleMenuSelect"
|
||||
>
|
||||
<!-- 首页 -->
|
||||
<d-menu-item key="HomePage">
|
||||
<template #icon><i class="icon-homepage"></i></template>
|
||||
<span>首页</span>
|
||||
</d-menu-item>
|
||||
<!-- 诊疗工作站 -->
|
||||
<d-sub-menu title="诊疗工作站" key="zl-station">
|
||||
<template #icon><i class="icon-system"></i></template>
|
||||
<d-menu-item key="menjizhen-item"><span>门急诊医生站</span></d-menu-item>
|
||||
<d-menu-item key="zhuyuan-item"><span>住院医生站</span></d-menu-item>
|
||||
<d-menu-item key="rjssmz-item"><span>日间手术门诊工作站</span></d-menu-item>
|
||||
<d-menu-item key="rjsszy-item"><span>日间手术住院工作站</span></d-menu-item>
|
||||
<d-menu-item key="hzjlgl-item"><span>会诊记录管理</span></d-menu-item>
|
||||
</d-sub-menu>
|
||||
<!-- 病历管理 -->
|
||||
<d-sub-menu title="病历管理" key="bl-manage">
|
||||
<template #icon><i class="icon-system"></i></template>
|
||||
<d-menu-item key="cyblbj-item"><span>出院病历编辑</span></d-menu-item>
|
||||
<d-menu-item key="cybldy-item"><span>出院病历打印</span></d-menu-item>
|
||||
<d-menu-item key="mzbljs-item"><span>门诊病历检索</span></d-menu-item>
|
||||
<d-menu-item key="zybljs-item"><span>住院病历检索</span></d-menu-item>
|
||||
<d-menu-item key="blxgjl-item"><span>病历修改记录</span></d-menu-item>
|
||||
<d-menu-item key="blfcxf-item"><span>病历封存解封</span></d-menu-item>
|
||||
<d-menu-item key="bljs-item"><span>病历解锁</span></d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="我的申请" key="my-apply">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="my-apply-item">
|
||||
<span>我的申请</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="我的审批" key="my-approve">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="my-approve-item">
|
||||
<span>我的审批</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="个人质检" key="personal-check">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="质控管理" key="quality-control">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="quality-control-item">
|
||||
<span>质控管理</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
<d-sub-menu title="系统管理" key="system-manage">
|
||||
<template #icon>
|
||||
<i class="icon-system"></i>
|
||||
</template>
|
||||
<d-menu-item key="user-manage">
|
||||
<span>用户管理</span>
|
||||
</d-menu-item>
|
||||
<d-menu-item key="role-manage">
|
||||
<span>角色管理</span>
|
||||
</d-menu-item>
|
||||
<d-menu-item key="permission-manage">
|
||||
<span>权限管理</span>
|
||||
</d-menu-item>
|
||||
</d-sub-menu>
|
||||
</d-menu>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
18
front/src/components/Editor.vue
Normal file
@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<!-- 根据实际部署环境修改 editor.html 的路径 -->
|
||||
<iframe src="public/editor.html" v-bind="objectOfAttrs"></iframe>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
objectOfAttrs:{
|
||||
width:'100%',
|
||||
height:'800vh',
|
||||
frameborder: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -3,16 +3,25 @@ import DevUI from 'vue-devui';
|
||||
import 'vue-devui/style.css';
|
||||
import '@devui-design/icons/icomoon/devui-icon.css';
|
||||
import { ThemeServiceInit, infinityTheme } from 'devui-theme';
|
||||
|
||||
import router from './router/index'
|
||||
|
||||
import 'devui-theme/styles-var/devui-var.scss'
|
||||
|
||||
import 'bootstrap/dist/css/bootstrap.min.css'
|
||||
import 'bootstrap/dist/js/bootstrap.min.js'
|
||||
|
||||
import { router } from "./router/index.js";
|
||||
//
|
||||
import Editor from '@/components/Editor.vue'
|
||||
|
||||
|
||||
ThemeServiceInit({ infinityTheme }, 'infinityTheme');
|
||||
|
||||
import { createApp } from 'vue'
|
||||
import App from './App.vue'
|
||||
const app = createApp(App)
|
||||
|
||||
createApp(App).use(DevUI).mount('#app');
|
||||
app.component('Editor', Editor)
|
||||
app.use(DevUI)
|
||||
app.use(router)
|
||||
app.mount('#app')
|
||||
|
@ -12,8 +12,8 @@
|
||||
<template #title> 快捷导航 </template>
|
||||
<template #subtitle> 最近访问 </template>
|
||||
<template #content>
|
||||
<d-button type="primary" class="me-1 mb-2" size="small" @click="$router.push('/menjizhenItemView')"><i class="icon-system me-1" />门急诊医生站</d-button>
|
||||
<d-button type="primary" class="me-1" size="small" @click="$router.push('/charts')"><i class="icon-system me-1" />住院医生站</d-button>
|
||||
<d-button type="primary" class="me-1 mb-2" size="small" @click="$router.push('/menjizhen-item')"><i class="icon-system me-1" />门急诊医生站</d-button>
|
||||
<d-button type="primary" class="me-1" size="small" @click="$router.push('/zhuyuan-item')"><i class="icon-system me-1" />住院医生站</d-button>
|
||||
<d-button type="primary" class="me-1" size="small" @click="$router.push('/form')"><i class="icon-system me-1" />日间手术门诊工作站</d-button>
|
||||
<d-button type="primary" class="me-1" size="small" @click="$router.push('/table')"><i class="icon-system me-1" />日间手术住院工作站</d-button>
|
||||
<d-button type="primary" class="me-1" size="small" @click="$router.push('/docs')"><i class="icon-system me-1" />会诊记录管理</d-button>
|
99
front/src/pages/zl-station/menjizhenItem-tabs/tab2.vue
Normal file
@ -0,0 +1,99 @@
|
||||
<template>
|
||||
<d-layout direction="column" class="p-6 bg-grey-50 min-h-screen">
|
||||
<d-breadcrumb :items="['首页', '门诊', '诊断']" />
|
||||
<d-card class="mt-4">
|
||||
<template #title>门诊诊断</template>
|
||||
<d-card-body>
|
||||
<!-- 患者信息 -->
|
||||
<d-grid :cols="2" row-gap="16px" col-gap="16px" class="mb-6">
|
||||
<div>
|
||||
<strong>姓名:</strong>{{ patient.name }}
|
||||
</div>
|
||||
<div>
|
||||
<strong>年龄:</strong>{{ patient.age }}
|
||||
</div>
|
||||
<div>
|
||||
<strong>性别:</strong>{{ patient.gender }}
|
||||
</div>
|
||||
<div>
|
||||
<strong>就诊日期:</strong>{{ currentDate }}
|
||||
</div>
|
||||
</d-grid>
|
||||
<!-- 诊断表单 -->
|
||||
<d-form layout="vertical" ref="formRef" :data="form">
|
||||
<d-form-item field="chiefComplaint" label="主诉" required>
|
||||
<d-textarea v-model="form.chiefComplaint" placeholder="请输入主诉" rows="3" />
|
||||
</d-form-item>
|
||||
<d-form-item field="historyPresentIllness" label="现病史" required>
|
||||
<d-textarea v-model="form.historyPresentIllness" placeholder="请输入现病史" rows="3" />
|
||||
</d-form-item>
|
||||
<d-form-item field="preliminaryDiagnosis" label="初步诊断" required>
|
||||
<d-input v-model="form.preliminaryDiagnosis" placeholder="请输入初步诊断" />
|
||||
</d-form-item>
|
||||
<d-form-item field="treatmentPlan" label="治疗计划" required>
|
||||
<d-textarea v-model="form.treatmentPlan" placeholder="请输入治疗计划" rows="3" />
|
||||
</d-form-item>
|
||||
<d-form-operation>
|
||||
<d-button variant="solid" @click="onSubmit">保存</d-button>
|
||||
<d-button @click="onReset">重置</d-button>
|
||||
</d-form-operation>
|
||||
</d-form>
|
||||
</d-card-body>
|
||||
</d-card>
|
||||
</d-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue';
|
||||
|
||||
|
||||
// 患者基础信息
|
||||
const patient = reactive({ name: '', age: '', gender: '' });
|
||||
// 诊断表单数据
|
||||
const form = reactive({
|
||||
chiefComplaint: '',
|
||||
historyPresentIllness: '',
|
||||
preliminaryDiagnosis: '',
|
||||
treatmentPlan: ''
|
||||
});
|
||||
// 表单引用
|
||||
const formRef = ref(null);
|
||||
// 当前日期 YYYY-MM-DD
|
||||
const currentDate = new Date().toISOString().split('T')[0];
|
||||
|
||||
// 模拟接口:获取患者信息
|
||||
const fetchPatient = async () => {
|
||||
// TODO: 换成实际 API 请求
|
||||
patient.name = '张三';
|
||||
patient.age = 30;
|
||||
patient.gender = '男';
|
||||
};
|
||||
|
||||
// 提交诊断信息
|
||||
const onSubmit = async () => {
|
||||
try {
|
||||
// TODO: 调用后端保存接口
|
||||
DMessage.success('诊断信息已保存');
|
||||
formRef.value.resetFields();
|
||||
} catch (error) {
|
||||
DMessage.error('保存失败,请重试');
|
||||
}
|
||||
};
|
||||
|
||||
// 重置表单
|
||||
const onReset = () => {
|
||||
formRef.value.resetFields();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
fetchPatient();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.bg-grey-50 { background-color: #F9FAFB; }
|
||||
.mb-6 { margin-bottom: 24px; }
|
||||
.mt-4 { margin-top: 16px; }
|
||||
.p-6 { padding: 24px; }
|
||||
.min-h-screen { min-height: 100vh; }
|
||||
</style>
|
157
front/src/pages/zl-station/menjizhenItem-tabs/tab3.vue
Normal file
@ -0,0 +1,157 @@
|
||||
<template>
|
||||
<d-layout direction="column" class="p-6 bg-grey-50 min-h-screen">
|
||||
<d-breadcrumb :items="['首页', '处方管理']" />
|
||||
<d-card class="mt-4">
|
||||
<template #title>处方管理</template>
|
||||
<d-card-body>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="flex justify-end mb-4">
|
||||
<d-button variant="solid" @click="showForm = true">新建处方</d-button>
|
||||
</div>
|
||||
<!-- 处方列表 -->
|
||||
<d-table
|
||||
:columns="columns"
|
||||
:data="prescriptions"
|
||||
row-key="id"
|
||||
:show-index="true"
|
||||
>
|
||||
<template #operation="{ row }">
|
||||
<d-space>
|
||||
<d-button size="small" @click="onEdit(row)">编辑</d-button>
|
||||
<d-button size="small" variant="text" @click="onDelete(row.id)">删除</d-button>
|
||||
</d-space>
|
||||
</template>
|
||||
</d-table>
|
||||
|
||||
<!-- 新建/编辑 弹窗 -->
|
||||
<d-dialog v-model:show="showForm" title="{{ editMode ? '编辑处方' : '新建处方' }}">
|
||||
<d-form layout="vertical" ref="formRef" :data="form">
|
||||
<d-form-item field="patientName" label="患者姓名" required>
|
||||
<d-input v-model="form.patientName" placeholder="请输入患者姓名" />
|
||||
</d-form-item>
|
||||
<d-form-item field="date" label="开具日期" required>
|
||||
<d-date-picker-pro v-model="form.date" placeholder="选择日期" />
|
||||
</d-form-item>
|
||||
<d-form-item field="medications" label="药品列表" required>
|
||||
<d-space direction="vertical" style="width:100%">
|
||||
<div v-for="(item, idx) in form.medications" :key="idx" class="flex items-center space-x-2">
|
||||
<d-input v-model="item.name" placeholder="药品名称" />
|
||||
<d-input v-model="item.dosage" placeholder="用量" />
|
||||
<d-input v-model="item.frequency" placeholder="频次" />
|
||||
<d-input-number v-model="item.quantity" :min="1" />
|
||||
<d-button size="small" variant="text" @click="removeMedication(idx)">删除</d-button>
|
||||
</div>
|
||||
<d-button size="small" variant="text" @click="addMedication">+ 添加药品</d-button>
|
||||
</d-space>
|
||||
</d-form-item>
|
||||
</d-form>
|
||||
<template #footer>
|
||||
<d-space class="justify-end">
|
||||
<d-button @click="onClose">取消</d-button>
|
||||
<d-button variant="solid" @click="onSubmit">保存</d-button>
|
||||
</d-space>
|
||||
</template>
|
||||
</d-dialog>
|
||||
</d-card-body>
|
||||
</d-card>
|
||||
</d-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue';
|
||||
|
||||
interface Medication {
|
||||
name: string;
|
||||
dosage: string;
|
||||
frequency: string;
|
||||
quantity: number;
|
||||
}
|
||||
interface Prescription {
|
||||
id: number;
|
||||
patientName: string;
|
||||
date: string;
|
||||
medications: Medication[];
|
||||
}
|
||||
|
||||
// 列配置
|
||||
const columns = [
|
||||
{ title: '患者姓名', key: 'patientName' },
|
||||
{ title: '开具日期', key: 'date' },
|
||||
{ title: '药品数量', key: 'medications', render: (row: Prescription) => row.medications.length },
|
||||
{ title: '操作', key: 'operation', render: 'operation' }
|
||||
];
|
||||
|
||||
// 数据状态
|
||||
const prescriptions = ref<Prescription[]>([]);
|
||||
const showForm = ref(false);
|
||||
const editMode = ref(false);
|
||||
const formRef = ref<any>(null);
|
||||
|
||||
const form = reactive<Prescription>({
|
||||
id: 0,
|
||||
patientName: '',
|
||||
date: '',
|
||||
medications: []
|
||||
});
|
||||
|
||||
// 初始化:加载处方列表
|
||||
onMounted(() => {
|
||||
// TODO: 从接口获取列表
|
||||
prescriptions.value = [];
|
||||
});
|
||||
|
||||
const addMedication = () => {
|
||||
form.medications.push({ name: '', dosage: '', frequency: '', quantity: 1 });
|
||||
};
|
||||
|
||||
const removeMedication = (idx: number) => {
|
||||
form.medications.splice(idx, 1);
|
||||
};
|
||||
|
||||
const onEdit = (row: Prescription) => {
|
||||
editMode.value = true;
|
||||
Object.assign(form, { ...row, medications: JSON.parse(JSON.stringify(row.medications)) });
|
||||
showForm.value = true;
|
||||
};
|
||||
|
||||
const onDelete = (id: number) => {
|
||||
// TODO: 调用删除接口
|
||||
prescriptions.value = prescriptions.value.filter(p => p.id !== id);
|
||||
DMessage.success('处方已删除');
|
||||
};
|
||||
|
||||
const onClose = () => {
|
||||
showForm.value = false;
|
||||
formRef.value.resetFields();
|
||||
};
|
||||
|
||||
const onSubmit = () => {
|
||||
formRef.value.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
if (editMode.value) {
|
||||
// 更新
|
||||
const idx = prescriptions.value.findIndex(p => p.id === form.id);
|
||||
prescriptions.value[idx] = JSON.parse(JSON.stringify(form));
|
||||
DMessage.success('处方已更新');
|
||||
} else {
|
||||
// 新增
|
||||
form.id = Date.now();
|
||||
prescriptions.value.push(JSON.parse(JSON.stringify(form)));
|
||||
DMessage.success('处方已创建');
|
||||
}
|
||||
onClose();
|
||||
editMode.value = false;
|
||||
}
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.bg-grey-50 { background-color: #F9FAFB; }
|
||||
.mb-4 { margin-bottom: 16px; }
|
||||
.mt-4 { margin-top: 16px; }
|
||||
.p-6 { padding: 24px; }
|
||||
.min-h-screen { min-height: 100vh; }
|
||||
.justify-end { justify-content: flex-end; }
|
||||
.flex { display: flex; }
|
||||
</style>
|
118
front/src/pages/zl-station/menjizhenItem-tabs/tab4.vue
Normal file
@ -0,0 +1,118 @@
|
||||
<template>
|
||||
<d-layout direction="column" class="p-6 bg-grey-50 min-h-screen">
|
||||
<d-breadcrumb :items="['首页', '申请单管理', '新建申请单']" />
|
||||
<d-card class="mt-4">
|
||||
<template #title>申请单</template>
|
||||
<d-card-body>
|
||||
<d-form layout="vertical" ref="formRef" :data="form">
|
||||
<!-- 申请单编号 -->
|
||||
<d-form-item field="requestNo" label="申请单编号" required>
|
||||
<d-input v-model="form.requestNo" disabled />
|
||||
</d-form-item>
|
||||
<!-- 申请类型 -->
|
||||
<d-form-item field="requestType" label="申请类型" required>
|
||||
<d-select v-model="form.requestType" placeholder="请选择申请类型">
|
||||
<d-option v-for="opt in typeOptions" :key="opt.value" :value="opt.value">
|
||||
{{ opt.label }}
|
||||
</d-option>
|
||||
</d-select>
|
||||
</d-form-item>
|
||||
<!-- 患者信息 -->
|
||||
<d-form-item field="patientName" label="患者姓名" required>
|
||||
<d-input v-model="form.patientName" placeholder="请输入患者姓名" />
|
||||
</d-form-item>
|
||||
<d-form-item field="recordNo" label="病历号" required>
|
||||
<d-input v-model="form.recordNo" placeholder="请输入病历号" />
|
||||
</d-form-item>
|
||||
<!-- 申请日期 -->
|
||||
<d-form-item field="date" label="申请日期" required>
|
||||
<d-date-picker-pro v-model="form.date" placeholder="选择日期" />
|
||||
</d-form-item>
|
||||
<!-- 申请原因 -->
|
||||
<d-form-item field="reason" label="申请原因" required>
|
||||
<d-textarea v-model="form.reason" placeholder="请输入申请原因" rows="4" />
|
||||
</d-form-item>
|
||||
<!-- 附件上传 -->
|
||||
<d-form-item field="attachments" label="附件上传">
|
||||
<d-upload
|
||||
v-model:file-list="form.attachments"
|
||||
:action="uploadAction"
|
||||
multiple
|
||||
list-type="text"
|
||||
/>
|
||||
</d-form-item>
|
||||
<!-- 操作按钮 -->
|
||||
<d-form-operation>
|
||||
<d-button variant="solid" @click="onSubmit">保存</d-button>
|
||||
<d-button @click="onReset">重置</d-button>
|
||||
</d-form-operation>
|
||||
</d-form>
|
||||
</d-card-body>
|
||||
</d-card>
|
||||
</d-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue';
|
||||
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
requestNo: '',
|
||||
requestType: '',
|
||||
patientName: '',
|
||||
recordNo: '',
|
||||
date: '',
|
||||
reason: '',
|
||||
attachments: [] as Array<{name: string; url: string;}>
|
||||
});
|
||||
|
||||
// 下拉选项
|
||||
const typeOptions = [
|
||||
{ label: '检验申请', value: 'lab' },
|
||||
{ label: '检查申请', value: 'exam' },
|
||||
{ label: '医疗物资申请', value: 'supply' },
|
||||
{ label: '其他', value: 'other' }
|
||||
];
|
||||
|
||||
// 表单引用
|
||||
const formRef = ref<any>(null);
|
||||
// 上传接口(示例)
|
||||
const uploadAction = '/api/upload';
|
||||
|
||||
// 生成申请单编号
|
||||
const generateRequestNo = () => {
|
||||
const ts = Date.now();
|
||||
return `REQ${ts}`;
|
||||
};
|
||||
|
||||
// 提交
|
||||
const onSubmit = () => {
|
||||
formRef.value.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
// TODO: 调用后端接口提交申请单
|
||||
DMessage.success('申请单已保存');
|
||||
onReset();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 重置
|
||||
const onReset = () => {
|
||||
formRef.value.resetFields();
|
||||
form.requestNo = generateRequestNo();
|
||||
form.date = new Date().toISOString().split('T')[0];
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
form.requestNo = generateRequestNo();
|
||||
form.date = new Date().toISOString().split('T')[0];
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.bg-grey-50 { background-color: #F9FAFB; }
|
||||
.mt-4 { margin-top: 16px; }
|
||||
.p-6 { padding: 24px; }
|
||||
.min-h-screen { min-height: 100vh; }
|
||||
</style>
|
150
front/src/pages/zl-station/menjizhenItem-tabs/tab5.vue
Normal file
@ -0,0 +1,150 @@
|
||||
<template>
|
||||
<d-layout direction="column" class="p-6 bg-grey-50 min-h-screen">
|
||||
<d-breadcrumb :items="['首页', '病历管理', '历史病史']" />
|
||||
<d-card class="mt-4">
|
||||
<template #title>历史病史</template>
|
||||
<d-card-body>
|
||||
<!-- 过滤条件 -->
|
||||
<d-form layout="inline" :data="filters" class="mb-4">
|
||||
<d-form-item field="patientName" label="患者姓名">
|
||||
<d-input v-model="filters.patientName" placeholder="请输入患者姓名" />
|
||||
</d-form-item>
|
||||
<d-form-item field="dateRange" label="就诊日期">
|
||||
<d-range-picker v-model="filters.dateRange" placeholder="选择日期范围" />
|
||||
</d-form-item>
|
||||
<d-form-operation>
|
||||
<d-button variant="solid" @click="onSearch">搜索</d-button>
|
||||
<d-button @click="onResetFilters">重置</d-button>
|
||||
</d-form-operation>
|
||||
</d-form>
|
||||
|
||||
<!-- 历史记录列表 -->
|
||||
<d-table
|
||||
:columns="columns"
|
||||
:data="records"
|
||||
row-key="id"
|
||||
:show-index="true"
|
||||
class="mb-4"
|
||||
>
|
||||
<template #operation="{ row }">
|
||||
<d-button size="small" @click="viewDetail(row)">查看</d-button>
|
||||
</template>
|
||||
</d-table>
|
||||
|
||||
<!-- 查看详情弹窗 -->
|
||||
<d-dialog v-model:show="showDetail" title="病史详情" width="600px">
|
||||
<d-card-body>
|
||||
<p><strong>患者姓名:</strong>{{ detail.patientName }}</p>
|
||||
<p><strong>就诊日期:</strong>{{ detail.date }}</p>
|
||||
<p><strong>主诉:</strong>{{ detail.chiefComplaint }}</p>
|
||||
<p><strong>现病史:</strong>{{ detail.historyPresentIllness }}</p>
|
||||
<p><strong>初步诊断:</strong>{{ detail.preliminaryDiagnosis }}</p>
|
||||
<p><strong>治疗计划:</strong>{{ detail.treatmentPlan }}</p>
|
||||
</d-card-body>
|
||||
<template #footer>
|
||||
<d-button variant="solid" @click="showDetail = false">关闭</d-button>
|
||||
</template>
|
||||
</d-dialog>
|
||||
</d-card-body>
|
||||
</d-card>
|
||||
</d-layout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { reactive, ref, onMounted } from 'vue';
|
||||
|
||||
|
||||
interface HistoryRecord {
|
||||
id: number;
|
||||
patientName: string;
|
||||
date: string;
|
||||
chiefComplaint: string;
|
||||
historyPresentIllness: string;
|
||||
preliminaryDiagnosis: string;
|
||||
treatmentPlan: string;
|
||||
}
|
||||
|
||||
// 过滤条件
|
||||
const filters = reactive({
|
||||
patientName: '',
|
||||
dateRange: [] as string[]
|
||||
});
|
||||
|
||||
// 表格数据
|
||||
const records = ref<HistoryRecord[]>([]);
|
||||
|
||||
// 列配置
|
||||
const columns = [
|
||||
{ title: '患者姓名', key: 'patientName' },
|
||||
{ title: '就诊日期', key: 'date' },
|
||||
{ title: '初步诊断', key: 'preliminaryDiagnosis' },
|
||||
{ title: '操作', key: 'operation', render: 'operation' }
|
||||
];
|
||||
|
||||
// 详情弹窗
|
||||
const showDetail = ref(false);
|
||||
const detail = reactive<HistoryRecord>({
|
||||
id: 0,
|
||||
patientName: '',
|
||||
date: '',
|
||||
chiefComplaint: '',
|
||||
historyPresentIllness: '',
|
||||
preliminaryDiagnosis: '',
|
||||
treatmentPlan: ''
|
||||
});
|
||||
|
||||
// 模拟接口:加载历史病史
|
||||
const fetchRecords = async () => {
|
||||
// TODO: 调用后端接口并根据 filters 过滤
|
||||
records.value = [
|
||||
{
|
||||
id: 1,
|
||||
patientName: '张三',
|
||||
date: '2025-04-10',
|
||||
chiefComplaint: '头痛',
|
||||
historyPresentIllness: '一周反复头痛',
|
||||
preliminaryDiagnosis: '偏头痛',
|
||||
treatmentPlan: '口服止痛药'
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
patientName: '李四',
|
||||
date: '2025-03-22',
|
||||
chiefComplaint: '咳嗽',
|
||||
historyPresentIllness: '持续两周',
|
||||
preliminaryDiagnosis: '急性支气管炎',
|
||||
treatmentPlan: '咳嗽药水'
|
||||
}
|
||||
];
|
||||
};
|
||||
|
||||
// 搜索
|
||||
const onSearch = () => {
|
||||
fetchRecords();
|
||||
};
|
||||
|
||||
// 重置过滤
|
||||
const onResetFilters = () => {
|
||||
filters.patientName = '';
|
||||
filters.dateRange = [];
|
||||
fetchRecords();
|
||||
};
|
||||
|
||||
// 查看详情
|
||||
const viewDetail = (row: HistoryRecord) => {
|
||||
Object.assign(detail, row);
|
||||
showDetail.value = true;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
fetchRecords();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.bg-grey-50 { background-color: #F9FAFB; }
|
||||
.mb-4 { margin-bottom: 16px; }
|
||||
.mt-4 { margin-top: 16px; }
|
||||
.p-6 { padding: 24px; }
|
||||
.min-h-screen { min-height: 100vh; }
|
||||
</style>
|
250
front/src/pages/zl-station/menjizhenItemView.vue
Normal file
@ -0,0 +1,250 @@
|
||||
<script setup>
|
||||
import { ref, reactive } from 'vue';
|
||||
import tab2 from '@/pages/zl-station/menjizhenItem-tabs/tab2.vue';
|
||||
import tab3 from '@/pages/zl-station/menjizhenItem-tabs/tab3.vue';
|
||||
import tab4 from '@/pages/zl-station/menjizhenItem-tabs/tab4.vue';
|
||||
import tab5 from "@/pages/zl-station/menjizhenItem-tabs/tab5.vue";
|
||||
// 病人候选下拉框
|
||||
const value1 = ref('');
|
||||
const value2 = ref('');
|
||||
const value3 = ref('');
|
||||
const value4 = ref('');
|
||||
const items = [
|
||||
{ value: '510123456789012345', name: '张三' },
|
||||
{ value: '510123456789012342', name: '李四' },
|
||||
{ value: '510123456789012346', name: '王五' },
|
||||
{ value: '510123456789012347', name: '赵六' },
|
||||
{ value: '510123456789012348', name: '田七' },
|
||||
{ value: '510123456789012349', name: '周八' },
|
||||
{ value: '510123456789012350', name: '吴九' },
|
||||
{ value: '510123456789012351', name: '郑十' },
|
||||
{ value: '510123456789012352', name: '冯十一' },
|
||||
{ value: '510123456789012353', name: '陈十二' },
|
||||
{ value: '510123456789012354', name: '褚十三' },
|
||||
{ value: '510123456789012355', name: '卫十四' },
|
||||
{ value: '510123456789012356', name: '蒋十五' },
|
||||
{ value: '510123456789012357', name: '沈十六' },
|
||||
{ value: '510123456789012358', name: '韩十七' },
|
||||
{ value: '510123456789012359', name: '杨十八' },
|
||||
{ value: '510123456789012360', name: '朱十九' },
|
||||
{ value: '510123456789012361', name: '秦二十' },
|
||||
{ value: '510123456789012362', name: '尤二十一' },
|
||||
{ value: '510123456789012363', name: '许二十二' },
|
||||
{ value: '510123456789012364', name: '何二十三' },
|
||||
{ value: '510123456789012365', name: '吕二十四' },
|
||||
];
|
||||
const items2 = [
|
||||
{ value: '510123456789012366', name: '施二十五' },
|
||||
{ value: '510123456789012367', name: '张二十六' },
|
||||
{ value: '510123456789012368', name: '孙二十七' },
|
||||
{ value: '510123456789012369', name: '曹二十八' },
|
||||
{ value: '510123456789012370', name: '严二十九' },
|
||||
{ value: '510123456789012371', name: '华三十' },
|
||||
{ value: '510123456789012372', name: '邱三十一' },
|
||||
{ value: '510123456789012373', name: '高三十二' },
|
||||
{ value: '510123456789012374', name: '林三十三' },
|
||||
];
|
||||
const options = reactive({
|
||||
data: items,
|
||||
});
|
||||
const options2 = reactive({
|
||||
data: items2,
|
||||
});
|
||||
//单选框分组
|
||||
const groupFilterList1 = ref(['全天', '上午', '下午']);
|
||||
let groupFilterChoose1 = ref('全天');
|
||||
|
||||
// 分割器
|
||||
const collapsed = ref(false);
|
||||
const disableBarSize = '2px';
|
||||
|
||||
const sizeChange = (size) => {
|
||||
console.log(size);
|
||||
};
|
||||
|
||||
// tab切换
|
||||
const id = ref('tab1');
|
||||
|
||||
//X-EMR-VUE
|
||||
|
||||
const patient = ref({})
|
||||
|
||||
var editor = null
|
||||
//加载编辑器
|
||||
const onLoad = (e) => {
|
||||
editor = e.target.contentWindow.editor
|
||||
|
||||
setTimeout(()=>{
|
||||
//异步加载文档
|
||||
editor.loadUrl('/mock/bind_data.html').then(()=>{
|
||||
patient.value = editor.getBindObject()
|
||||
})
|
||||
//文档输入后表单值随着变化
|
||||
editor.document.addEventListener('input', ()=>{
|
||||
patient.value = editor.getBindObject()
|
||||
})
|
||||
}, 0)
|
||||
|
||||
}
|
||||
|
||||
//表单数据改变
|
||||
const bindData = () => {
|
||||
editor.setBindObject(patient.value)
|
||||
}
|
||||
|
||||
|
||||
const getNameByValue = (value) => {
|
||||
const item = items.find((item) => item.value === value);
|
||||
if(item){
|
||||
return item.name;
|
||||
}
|
||||
else{
|
||||
const item = items2.find((item) => item.value === value);
|
||||
if(item){
|
||||
return item.name;
|
||||
}else{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const handleInput = (value) => {
|
||||
console.log(value1["value"]);
|
||||
console.log(getNameByValue(value1["value"]))
|
||||
patient.value.pat_name = getNameByValue(value1["value"]);
|
||||
editor.setBindObject(patient.value)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section>
|
||||
<d-splitter style="height: 1000px" class="splitter-border" orientation="vertical" :disableBarSize="disableBarSize">
|
||||
<template v-slot:DSplitterPane>
|
||||
<d-splitter-pane size="30px" minSize="30px" maxSize="50px" :collapsed="collapsed" :collapsible="true" @sizeChange="sizeChange">
|
||||
<div class="pane-content">
|
||||
<d-radio-group class="mb-2 patient" direction="row" v-model="groupFilterChoose1" >
|
||||
<d-radio v-for="item in groupFilterList1" :key="item" :value="item">
|
||||
{{ item }}
|
||||
</d-radio>
|
||||
</d-radio-group>
|
||||
<d-select size="sm" class="mb-2 patient patient-select" v-model="value1" overview="underlined" placeholder="请选择患者" :allow-clear="true" filter @value-change="handleInput">
|
||||
<d-option-group label="待诊病人">
|
||||
<d-option v-for="(item, index) in options.data" :key="index" :value="item.value" :name="item.name"></d-option>
|
||||
</d-option-group>
|
||||
<d-option-group label="已诊病人">
|
||||
<d-option v-for="(item, index) in options2.data" :key="index" :value="item.value" :name="item.name"></d-option>
|
||||
</d-option-group>
|
||||
</d-select>
|
||||
<d-button size="sm" class="patient">患者管理</d-button>
|
||||
</div>
|
||||
</d-splitter-pane>
|
||||
<d-splitter-pane style="overflow: hidden">
|
||||
<div class="pane-content">
|
||||
<d-tabs v-model="id" custom-width="100px">
|
||||
<d-tab id="tab1" title="门诊病历">
|
||||
<d-row>
|
||||
<d-col :span="16">
|
||||
<Editor @load="onLoad" style="margin: 10px 0;"></Editor>
|
||||
</d-col>
|
||||
<d-col :span="8">
|
||||
<d-card style="margin: 10px;">
|
||||
<d-form @change="bindData()" label-width="auto">
|
||||
<d-form-item label="姓名">
|
||||
<d-input v-model="patient.pat_name" ></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label="性别">
|
||||
<d-input v-model="patient.pat_sex"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label="年龄">
|
||||
<d-input v-model="patient.pat_age"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label="就诊科室">
|
||||
<d-input v-model="patient.visit_dept"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label="就诊号">
|
||||
<d-input v-model="patient.pat_id"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label="就诊时间">
|
||||
<d-date-picker-pro v-model="patient.visit_time" format="YYYY-MM-DD hh:mm"></d-date-picker-pro>
|
||||
<d-radio-group v-model="patient.firstcall" style="margin-left: 10px;">
|
||||
<d-radio value="1">初诊</d-radio>
|
||||
<d-radio value="2">复诊</d-radio>
|
||||
</d-radio-group>
|
||||
</d-form-item>
|
||||
<d-form-item label="联系电话">
|
||||
<d-input v-model="patient.pat_phone"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 家庭住址">
|
||||
<d-input v-model="patient.pat_address"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 主诉">
|
||||
<d-input v-model="patient.pat_appeal"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 现病史">
|
||||
<d-input v-model="patient.pat_now_history"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 既往史">
|
||||
<d-input v-model="patient.pat_past_history"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 过敏史">
|
||||
<d-input v-model="patient.pat_allergy_history"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 诊断">
|
||||
<d-input v-model="patient.diagnosis"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 处方">
|
||||
<d-input v-model="patient.presc" type="textarea"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 建议">
|
||||
<d-input v-model="patient.advice"></d-input>
|
||||
</d-form-item>
|
||||
<d-form-item label=" 医生签字">
|
||||
<d-input v-model="patient.doctor_name"></d-input>
|
||||
</d-form-item>
|
||||
</d-form>
|
||||
</d-card>
|
||||
</d-col>
|
||||
</d-row>
|
||||
</d-tab>
|
||||
<d-tab id="tab2" title="门诊诊断">
|
||||
<tab2></tab2>
|
||||
</d-tab>
|
||||
<d-tab id="tab3" title="处方管理">
|
||||
<tab3></tab3>
|
||||
</d-tab>
|
||||
<d-tab id="tab4" title="申请单">
|
||||
<tab4></tab4>
|
||||
</d-tab>
|
||||
<d-tab id="tab5" title="历史病历">
|
||||
<tab5></tab5>
|
||||
</d-tab>
|
||||
</d-tabs>
|
||||
</div>
|
||||
</d-splitter-pane>
|
||||
<!-- <d-splitter-pane size="150px" :resizable="false" :collapsible="true">-->
|
||||
<!-- <div class="pane-content">-->
|
||||
<!-- <h2>Bottom</h2>-->
|
||||
<!-- <div>height: 150px, resizable: false</div>-->
|
||||
<!-- </div>-->
|
||||
<!-- </d-splitter-pane>-->
|
||||
</template>
|
||||
</d-splitter>
|
||||
</section>
|
||||
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.patient-select {
|
||||
width: auto;
|
||||
}
|
||||
.patient {
|
||||
position: relative;
|
||||
bottom: 0;
|
||||
margin-right: 16px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.pane-content {
|
||||
padding: 0 12px;
|
||||
}
|
||||
</style>
|
231
front/src/pages/zl-station/zhuyuanItem/subItem.vue
Normal file
@ -0,0 +1,231 @@
|
||||
<template>
|
||||
<d-layout>
|
||||
<d-header>
|
||||
</d-header>
|
||||
<d-content>
|
||||
<div class="nav-buttons">
|
||||
<d-tabs v-model="id">
|
||||
<d-tab id="tab1" title="患者选择">
|
||||
<d-row>
|
||||
<d-col :span="24">
|
||||
<div class="sub-nav">
|
||||
<d-button variant="text" class="sub-btn">分管患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">科室患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">授权患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">出院三天内患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">出院三天未归档患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">我关注的患者</d-button>
|
||||
<d-button variant="text" class="sub-btn">诊疗组患者</d-button>
|
||||
</div>
|
||||
</d-col>
|
||||
</d-row>
|
||||
|
||||
<d-row class="patient-cards">
|
||||
<!-- First Patient Card -->
|
||||
<d-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<div class="patient-card">
|
||||
<div class="ribbon in-hospital"></div>
|
||||
<div class="card-header">
|
||||
<h3>17床</h3>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
<div class="patient-info">
|
||||
<div class="patient-name">张三 <span class="gender-age">男 43岁</span></div>
|
||||
<div class="patient-id">152322</div>
|
||||
<div class="history-note">无过敏史</div>
|
||||
<div class="admit-time">入院时间: 2022-11-02 04:18</div>
|
||||
<div class="insurance">费别信息: 医保</div>
|
||||
<div class="stay-days">住院天数: 4天</div>
|
||||
<div class="total-cost">费用合计: 4000.00</div>
|
||||
<div class="diagnosis">诊断信息: 糖尿病</div>
|
||||
<div class="doctor">管床医生: 张夫</div>
|
||||
<div class="nurse">责任护士:</div>
|
||||
<div class="danger-flag"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</d-col>
|
||||
|
||||
<!-- Second Patient Card -->
|
||||
<d-col :xs="24" :sm="12" :md="8" :lg="6">
|
||||
<div class="patient-card">
|
||||
<div class="ribbon new-patient"></div>
|
||||
<div class="card-header">
|
||||
<h3>+01床</h3>
|
||||
</div>
|
||||
<div class="card-content">
|
||||
<div class="patient-info">
|
||||
<div class="patient-name">李四 <span class="gender-age">女 34岁</span></div>
|
||||
<div class="patient-id">152323</div>
|
||||
<div class="history-note">无过敏史</div>
|
||||
<div class="admit-time">入院时间: 2022-11-01 17:11</div>
|
||||
<div class="insurance">费别信息: 医保</div>
|
||||
<div class="stay-days">住院天数: 12天</div>
|
||||
<div class="total-cost">费用合计: ¥5000.22</div>
|
||||
<div class="diagnosis">诊断信息: I型呼吸衰竭</div>
|
||||
<div class="doctor">管床医生: 王俊</div>
|
||||
<div class="nurse">责任护士:</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</d-col>
|
||||
</d-row>
|
||||
|
||||
</d-tab>
|
||||
<d-tab id="tab2" title="住院医嘱"><tab2></tab2></d-tab>
|
||||
<d-tab id="tab3" title="诊断手术"><tab3></tab3></d-tab>
|
||||
<d-tab id="tab4" title="住院病历"><tab4></tab4></d-tab>
|
||||
<d-tab id="tab5" title="医嘱单打印"><tab5></tab5></d-tab>
|
||||
<d-tab id="tab6" title="申请单"><tab6></tab6></d-tab>
|
||||
<d-tab id="tab7" title="历史信息"></d-tab>
|
||||
<d-tab id="tab8" title="临床路径"></d-tab>
|
||||
<d-tab id="tab9" title="科研随访"></d-tab>
|
||||
</d-tabs>
|
||||
</div>
|
||||
|
||||
</d-content>
|
||||
</d-layout>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
|
||||
import Tab2 from "@/pages/zl-station/zhuyuanItem/tabs/tab2.vue";
|
||||
import Tab3 from "@/pages/zl-station/zhuyuanItem/tabs/tab3.vue";
|
||||
import Tab4 from "@/pages/zl-station/zhuyuanItem/tabs/tab4.vue";
|
||||
import Tab5 from "@/pages/zl-station/zhuyuanItem/tabs/tab5.vue";
|
||||
import Tab6 from "@/pages/zl-station/zhuyuanItem/tabs/tab6.vue";
|
||||
|
||||
export default {
|
||||
name: 'PatientManagementPage',
|
||||
components: {Tab6, Tab5, Tab4, Tab3, Tab2},
|
||||
data() {
|
||||
return {
|
||||
id: 'tab1',
|
||||
// Add reactive data if needed
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.header-row {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.nav-buttons {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
background-color: #e6e6e6;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.nav-btn {
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.sub-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
background-color: #f5f5f5;
|
||||
padding: 8px;
|
||||
margin-bottom: 15px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.sub-btn {
|
||||
margin-right: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.view-toggle {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.patient-cards {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.patient-card {
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.ribbon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
transform: rotate(45deg);
|
||||
transform-origin: top left;
|
||||
}
|
||||
|
||||
.in-hospital {
|
||||
background-color: #2c8cf4;
|
||||
}
|
||||
|
||||
.new-patient {
|
||||
background-color: #ff5c4a;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
padding: 10px;
|
||||
background-color: #f9f9f9;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
.card-header h3 {
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.card-content {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.patient-info > div {
|
||||
margin-bottom: 5px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.patient-name {
|
||||
font-weight: bold;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.gender-age {
|
||||
font-weight: normal;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.patient-id {
|
||||
color: #2c8cf4;
|
||||
}
|
||||
|
||||
.history-note {
|
||||
color: #4caf50;
|
||||
}
|
||||
|
||||
.diagnosis {
|
||||
color: #2c8cf4;
|
||||
}
|
||||
|
||||
.danger-flag {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
left: 10px;
|
||||
color: #ff5c4a;
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
</style>
|
407
front/src/pages/zl-station/zhuyuanItem/tabs/tab2.vue
Normal file
@ -0,0 +1,407 @@
|
||||
<template>
|
||||
<div class="medical-orders-page">
|
||||
<!-- Top Toolbar -->
|
||||
<div class="toolbar">
|
||||
<d-button class="tool-button" icon="document">开立</d-button>
|
||||
<d-button class="tool-button" icon="pause-circle">暂停/停止</d-button>
|
||||
<d-button class="tool-button" icon="select-all">全停</d-button>
|
||||
<d-button class="tool-button" icon="link">组合</d-button>
|
||||
<d-button class="tool-button" icon="prescription">草药</d-button>
|
||||
<d-button class="tool-button" icon="save">保存</d-button>
|
||||
<d-button class="tool-button" icon="increase">追加</d-button>
|
||||
<d-button class="tool-button" icon="return">退出</d-button>
|
||||
<d-button class="tool-button" icon="refresh">刷新</d-button>
|
||||
<d-button class="tool-button" icon="list">保存模板</d-button>
|
||||
<d-button class="tool-button" icon="medicine">抗菌药</d-button>
|
||||
<d-button class="tool-button" icon="edit">手术</d-button>
|
||||
<d-button class="tool-button" icon="calendar">预约</d-button>
|
||||
<d-button class="tool-button" icon="print">打印</d-button>
|
||||
<d-dropdown class="more-actions">
|
||||
<d-button icon="more"></d-button>
|
||||
</d-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Tab Navigation -->
|
||||
<d-tabs type="pills">
|
||||
<d-tab title="开立医嘱" active></d-tab>
|
||||
<d-tab title="长期医嘱"></d-tab>
|
||||
<d-tab title="临时医嘱"></d-tab>
|
||||
</d-tabs>
|
||||
|
||||
<!-- Orders Table -->
|
||||
<div class="table-container">
|
||||
<d-data-table :columns="columns" :data="tableData" stripe bordered>
|
||||
<!-- Custom checkbox column -->
|
||||
<template #cell-selection="scope">
|
||||
<d-checkbox v-model="scope.row.selected"></d-checkbox>
|
||||
</template>
|
||||
</d-data-table>
|
||||
</div>
|
||||
|
||||
<!-- Status Indicators -->
|
||||
<div class="status-indicators">
|
||||
<div class="status-item">
|
||||
<span class="status-dot not-submitted"></span>
|
||||
<span>未提交</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot newly-created"></span>
|
||||
<span>新开立</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot executed"></span>
|
||||
<span>已审核</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot in-progress"></span>
|
||||
<span>已执行</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot stopped"></span>
|
||||
<span>停止/作废</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot scheduled"></span>
|
||||
<span>预停止</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot displayed"></span>
|
||||
<span>全部显示</span>
|
||||
</div>
|
||||
<div class="status-item">
|
||||
<span class="status-dot available"></span>
|
||||
<span>有效医嘱</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Form Area -->
|
||||
<div class="form-area">
|
||||
<div class="form-row">
|
||||
<div class="form-item">
|
||||
<label>医嘱类型:</label>
|
||||
<d-select v-model="orderForm.type" class="form-control">
|
||||
<d-option value="长期医嘱">长期医嘱</d-option>
|
||||
<d-option value="临时医嘱">临时医嘱</d-option>
|
||||
</d-select>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>文字医嘱</label>
|
||||
<d-input v-model="orderForm.textOrder" placeholder="输入"></d-input>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>名称:</label>
|
||||
<d-input v-model="orderForm.name"></d-input>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>数量:</label>
|
||||
<d-input-number v-model="orderForm.quantity" :min="0"></d-input-number>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-item">
|
||||
<label>每次用量:</label>
|
||||
<d-input v-model="orderForm.dosagePrefix" placeholder="开立数值"></d-input>
|
||||
<d-input v-model="orderForm.dosage" class="small-input"></d-input>
|
||||
<span>=</span>
|
||||
<d-input v-model="orderForm.dosageCalculated" class="small-input"></d-input>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>用法:</label>
|
||||
<d-select v-model="orderForm.usage" class="form-control">
|
||||
<d-option value="口服">口服</d-option>
|
||||
<d-option value="静脉注射">静脉注射</d-option>
|
||||
</d-select>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>执行科室:</label>
|
||||
<d-select v-model="orderForm.department" class="form-control">
|
||||
<d-option value="药剂科">药剂科</d-option>
|
||||
<d-option value="护理部">护理部</d-option>
|
||||
</d-select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-item">
|
||||
<label>频次:</label>
|
||||
<d-select v-model="orderForm.frequency" class="form-control">
|
||||
<d-option value="每日一次">每日一次</d-option>
|
||||
<d-option value="每日两次">每日两次</d-option>
|
||||
</d-select>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>首日量:</label>
|
||||
<d-input v-model="orderForm.firstDayDosage" placeholder="首日"></d-input>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>备注:</label>
|
||||
<d-select v-model="orderForm.remarks" class="form-control">
|
||||
<d-option value="饭前">饭前</d-option>
|
||||
<d-option value="饭后">饭后</d-option>
|
||||
</d-select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-row">
|
||||
<div class="form-item">
|
||||
<label>开始时间:</label>
|
||||
<d-date-picker
|
||||
v-model="orderForm.startDate"
|
||||
type="datetime"
|
||||
format="yyyy-MM-dd HH:mm"
|
||||
placeholder="选择日期时间"
|
||||
></d-date-picker>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<label>停止时间:</label>
|
||||
<d-checkbox v-model="orderForm.hasEndTime"></d-checkbox>
|
||||
<d-date-picker
|
||||
v-model="orderForm.endDate"
|
||||
type="datetime"
|
||||
format="yyyy-MM-dd HH:mm"
|
||||
placeholder="选择日期时间"
|
||||
:disabled="!orderForm.hasEndTime"
|
||||
></d-date-picker>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'MedicalOrdersPage',
|
||||
data() {
|
||||
return {
|
||||
columns: [
|
||||
{
|
||||
field: 'selection',
|
||||
title: '',
|
||||
width: '50px'
|
||||
},
|
||||
{
|
||||
field: 'orderType',
|
||||
title: '医嘱类型',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'startTime',
|
||||
title: '开始时间',
|
||||
width: '150px'
|
||||
},
|
||||
{
|
||||
field: 'orderName',
|
||||
title: '医嘱名称',
|
||||
width: '250px'
|
||||
},
|
||||
{
|
||||
field: 'dosage',
|
||||
title: '每次用量',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'unit',
|
||||
title: '单位',
|
||||
width: '80px'
|
||||
},
|
||||
{
|
||||
field: 'group',
|
||||
title: '组合',
|
||||
width: '80px'
|
||||
},
|
||||
{
|
||||
field: 'usageMethod',
|
||||
title: '用法名称',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'frequency',
|
||||
title: '频次名称',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'stopPerson',
|
||||
title: '停止人',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'stopTime',
|
||||
title: '停止时间',
|
||||
width: '150px'
|
||||
},
|
||||
{
|
||||
field: 'creator',
|
||||
title: '开立医生',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'auditor',
|
||||
title: '审核人',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'executor',
|
||||
title: '执行人',
|
||||
width: '100px'
|
||||
},
|
||||
{
|
||||
field: 'firstDayDosage',
|
||||
title: '首日量',
|
||||
width: '80px'
|
||||
},
|
||||
{
|
||||
field: 'totalQuantity',
|
||||
title: '总量',
|
||||
width: '80px'
|
||||
},
|
||||
{
|
||||
field: 'totalAmount',
|
||||
title: '总量单位',
|
||||
width: '80px'
|
||||
}
|
||||
],
|
||||
tableData: [],
|
||||
orderForm: {
|
||||
type: '长期医嘱',
|
||||
textOrder: '',
|
||||
name: '',
|
||||
quantity: 0,
|
||||
dosagePrefix: '',
|
||||
dosage: '',
|
||||
dosageCalculated: '',
|
||||
usage: '',
|
||||
department: '',
|
||||
frequency: '',
|
||||
firstDayDosage: '',
|
||||
remarks: '',
|
||||
startDate: new Date('2025-04-23 11:31'),
|
||||
hasEndTime: false,
|
||||
endDate: new Date('2025-04-23 12:29')
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.medical-orders-page {
|
||||
font-family: Arial, sans-serif;
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
}
|
||||
|
||||
.toolbar {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 5px;
|
||||
padding: 5px 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.tool-button {
|
||||
font-size: 12px;
|
||||
padding: 5px 10px;
|
||||
}
|
||||
|
||||
.table-container {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
margin: 10px 0;
|
||||
border: 1px solid #e0e0e0;
|
||||
}
|
||||
|
||||
.status-indicators {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
padding: 10px 0;
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.status-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 50%;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.not-submitted {
|
||||
background-color: #8BC34A;
|
||||
border: 1px solid #558B2F;
|
||||
}
|
||||
|
||||
.newly-created {
|
||||
background-color: #4CAF50;
|
||||
border: 1px solid #2E7D32;
|
||||
}
|
||||
|
||||
.executed {
|
||||
background-color: #2196F3;
|
||||
border: 1px solid #1565C0;
|
||||
}
|
||||
|
||||
.in-progress {
|
||||
background-color: #FF9800;
|
||||
border: 1px solid #EF6C00;
|
||||
}
|
||||
|
||||
.stopped {
|
||||
background-color: #F44336;
|
||||
border: 1px solid #C62828;
|
||||
}
|
||||
|
||||
.scheduled {
|
||||
background-color: #9C27B0;
|
||||
border: 1px solid #6A1B9A;
|
||||
}
|
||||
|
||||
.displayed {
|
||||
background-color: #00BCD4;
|
||||
border: 1px solid #00838F;
|
||||
}
|
||||
|
||||
.available {
|
||||
background-color: #9E9E9E;
|
||||
border: 1px solid #616161;
|
||||
}
|
||||
|
||||
.form-area {
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.form-row {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.form-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.form-item label {
|
||||
font-size: 12px;
|
||||
margin-right: 5px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
.small-input {
|
||||
width: 60px;
|
||||
}
|
||||
</style>
|