new Files

This commit is contained in:
2025-04-23 13:27:25 +08:00
parent f21d8ef2c4
commit 1a86b9bfc1
107 changed files with 72655 additions and 258 deletions

View 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>

View 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>

View 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>

View 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>

View 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="[{&quot;value&quot;:&quot;0&quot;,&quot;text&quot;:&quot;选项1&quot;},{&quot;value&quot;:&quot;1&quot;,&quot;text&quot;:&quot;选项2&quot;}]" 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

File diff suppressed because one or more lines are too long

View 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>

View 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
View 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组件中获取modedoclang属性 (该段代码可删除)
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>

View 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组件中获取modedoclang属性 (该段代码可删除)
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>

View 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; ">&nbsp;</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>&nbsp;科室:</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>&nbsp;床号:</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">&nbsp;住院号:</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>&nbsp;病案号:</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>&nbsp;
</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;<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>&nbsp;<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>

View 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;">&nbsp; &nbsp;</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;">&nbsp; &nbsp;</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;">&nbsp; &nbsp;</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">&nbsp; &nbsp;就诊号:</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;">&nbsp;</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;">&nbsp;</field>
</span><span style="font-size: 9pt; line-height: 2;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<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;">&nbsp; 家庭住址:</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp;</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;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; <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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,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>&nbsp;<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>&nbsp;<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>&nbsp;<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>&nbsp;</p></div>
</div>

File diff suppressed because one or more lines are too long

1368
front/public/mock/zh-bo.html Normal file

File diff suppressed because one or more lines are too long

1167
front/public/mock/zh-tw.html Normal file

File diff suppressed because it is too large Load Diff

1167
front/public/mock/zh-ug.html Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View 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>

View 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'
}
}
})();

File diff suppressed because one or more lines are too long

View 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!'
}

View 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!'
}

View 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!'
}

View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

View 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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

1627
front/public/vender/diff.js Normal file

File diff suppressed because it is too large Load Diff

31187
front/public/vender/fabric.js Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

View 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

File diff suppressed because it is too large Load Diff

View 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);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View 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

File diff suppressed because one or more lines are too long

6
front/public/vender/mui/mui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View 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%}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View 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($)
})();

View 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()
// }
})();

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

5
front/public/vender/weui/weui.min.css vendored Normal file

File diff suppressed because one or more lines are too long

12
front/public/vender/weui/weui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View 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"-->
<!-- >-->
<!-- &lt;!&ndash; 首页 &ndash;&gt;-->
<!-- <d-menu-item key="item1">-->
<!-- <template #icon><i class="icon-homepage"></i></template>-->
<!-- <span>首页</span>-->
<!-- </d-menu-item>-->
<!-- &lt;!&ndash; 诊疗工作站 &ndash;&gt;-->
<!-- <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>-->
<!-- &lt;!&ndash; 病历管理 &ndash;&gt;-->
<!-- <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
View 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>

View 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>

View File

@ -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')

View File

@ -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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

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