irc_web/src/main.js

611 lines
21 KiB
JavaScript

import Vue from 'vue'
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
// import { createVersionPolling } from "@/utils/version-polling.esm.js";
import ElementUI, { MessageBox } from 'element-ui'
import { getBasicDataAllSelect, getFrontInternationalizationList, getCurrentPublishInfo } from '@/api/dictionary/dictionary'
import { resetReadingRestTime } from '@/api/trials/reading'
// import 'element-ui/lib/theme-chalk/index.css'
import './assets/css/theme-blue/index.css' // 浅绿色主题
import './assets/css/iconfont/index.css' // 阿里巴巴图标库
// import locale from 'element-ui/lib/locale/lang/en' // lang i18n
import i18n from './lang'
import '@/styles/index.scss' // global css
import App from './App'
import store from './store'
import router from './router'
import WHITELIST from "./utils/whiteList"
import '@/icons' // icon
import '@/permission' // permission control
import md5 from 'js-md5'
import VueClipboard from 'vue-clipboard2'
Vue.use(VueClipboard)
// import htmlToPdf from './utils/htmlToPdf'
// Vue.use(htmlToPdf)
import permission from './utils/permission'
Vue.use(permission)
import Viewer from 'v-viewer'
import './assets/css/viewer.css'
Viewer.setDefaults({
// navbar: true, //底部缩略图
toolbar: {
zoomIn: true,
zoomOut: true,
reset: true,
prev: true,
next: true,
rotateLeft: true,
rotateRight: true,
flipHorizontal: true,
flipVertical: true,
}
})
Vue.use(Viewer)
import hasPermi from './directive/permission'
Vue.use(hasPermi)
// set ElementUI lang to EN
// Vue.use(ElementUI, { locale, size: 'medium' })
import upload from '@/components/element-ui/upload'
Vue.use(upload)
import Preview from '@/components/Preview/index'
Vue.use(Preview)
import Onlyoffice from '@/components/Preview_onlyoffice/index'
Vue.use(Onlyoffice)
import MFA from '@/components/MFA/index'
Vue.use(MFA)
import FB from '@/components/feedBack/index'
Vue.use(FB)
import FBT from '@/components/feedBackTable/index'
Vue.use(FBT)
import adaptive from '@/directive/adaptive/index'
// 表格自适应指令
Vue.use(adaptive)
import dialogDrag from '@/directive/dialogDrag'
// 窗口拖拽
Vue.use(dialogDrag)
if (!String.prototype.replaceAll) {
String.prototype.replaceAll = function (str, newStr) {
// 正则表达式
if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]') {
return this.replace(str, newStr)
}
// 字符串
return this.replace(new RegExp(str, 'g'), newStr)
}
}
import { parseTime, resetForm, selectDictLabel, selectDictLabels, handleTree, params } from '@/utils/ruoyi'
import { xfHasPermi } from '@/utils/hasPermi'
// 字典数据组件
import DictTag from '@/components/DictTag'
import DictData from '@/components/DictData'
import { getBasicDataSelect } from '@/api/dictionary/dictionary'
import { checkConfig } from '@/const/check/index'
import { getTrialBodyPartList } from "@/api/trials/setting";
// 全局方法挂载
var $q = params
Vue.prototype.checkConfig = checkConfig
Vue.prototype.$q = $q()
Vue.prototype.hasPermi = xfHasPermi
Vue.prototype.getDicts = getBasicDataSelect
Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictLabels = selectDictLabels
Vue.component('DictTag', DictTag)
// 全局方法挂载
Vue.prototype.parseTime = parseTime
Vue.prototype.resetForm = resetForm
Vue.prototype.selectDictLabel = selectDictLabel
// Vue.prototype.download = download
Vue.prototype.handleTree = handleTree
Vue.prototype.$getObjectName = (url) => {
// console.log(url,'url')
// console.log(Vue.prototype.OSSclientConfig.viewEndpoint,'url')
var value = url;
let basePath = Vue.prototype.OSSclientConfig.viewEndpoint;
if (Vue.prototype.OSSclientConfig.ObjectStoreUse === 'AliyunOSS') {
basePath = Vue.prototype.OSSclientConfig.endPoint.split('https://').length > 1 ? Vue.prototype.OSSclientConfig.endPoint.split('https://')[1] : Vue.prototype.OSSclientConfig.endPoint;
}
return value.split(basePath)[1];
}
Vue.prototype.getGuid = (text) => {
text = md5(text)
let t1, t2, t3, t4, t5, t6, t7, t8, t9, t10
t1 = text.substr(0, 2)
t2 = text.substr(2, 2)
t3 = text.substr(4, 2)
t4 = text.substr(6, 2)
t5 = text.substr(8, 2)
t6 = text.substr(10, 2)
t7 = text.substr(12, 2)
t8 = text.substr(14, 2)
t9 = text.substr(16, 4)
t10 = text.substr(20, 12)
// console.log(`${t4+t3+t2+t1}-${t6+t5}-${t8+t7}-${t9}-${t10}`)
return `${t4 + t3 + t2 + t1}-${t6 + t5}-${t8 + t7}-${t9}-${t10}`
}
Vue.prototype.$validatePassword = (rule, value, callback) => {
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
/* eslint-disable */
var reg1 = eval(process.env.VUE_APP_PASSWORD_FOR_PERMISSION) ? new RegExp(`${process.env.VUE_APP_PASSWORD_FOR_REGULAR}`) : /.*/g; //密码必须是8位以上、必须含有字母、数字、特殊符号
if (!reg1.test(value)) {
callback(
new Error(_vm.$t('env:regExp:formatPassword')))
} else {
callback();
}
}
DictData.install()
import global_ from './components/Global'
Vue.prototype.GLOBAL = global_
Vue.config.productionTip = false
Vue.prototype.$upload = () => {
_vm.$forceUpdate()
}
Vue.prototype.$guid = () => {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
Vue.prototype.fileToBlob = (file) => {
// 创建 FileReader 对象
const reader = new FileReader()
return new Promise(resolve => {
// FileReader 添加 load 事件
reader.addEventListener('load', (e) => {
let blob
if (typeof e.target.result === 'object') {
blob = new Blob([e.target.result])
} else {
blob = e.target.result
}
resolve(blob)
})
// FileReader 以 ArrayBuffer 格式 读取 File 对象中数据
reader.readAsArrayBuffer(file)
})
}
var _vm
async function VueInit() {
var params
var res
if (~window.location.href.indexOf('/readingDicoms') || ~window.location.href.indexOf('/noneDicomReading') || ~window.location.href.indexOf('/criterionquestions') || ~window.location.href.indexOf('/petct') || ~window.location.href.indexOf('/fusion')) {
params = $q('TrialReadingCriterionId')
res = await getBasicDataAllSelect(params)
} else if (~window.location.href.indexOf('/ecrfPreview')) {
params = $q('SystemReadingCriterionId')
res = await getBasicDataAllSelect(params, true)
} else {
res = await getBasicDataAllSelect(params)
}
var Internationalization = await getFrontInternationalizationList()
Vue.prototype.$tl = Internationalization.Result
let zhMessages = {}, enMessages = {}
Vue.prototype.$tl.forEach(v => {
// zhMessages[v.Description + '_' + v.Code] = v.ValueCN
// enMessages[v.Description + '_' + v.Code] = v.Value
zhMessages[v.Code] = v.ValueCN
enMessages[v.Code] = v.Value
})
// 获取版本信息
let PublishInfo = await getCurrentPublishInfo();
Vue.prototype.$version = PublishInfo.Result;
// 获取检查部位
Vue.prototype.$getBodyPart = (id) => {
return new Promise(async (resolve, reject) => {
try {
let params = {
TrialId: id
}
let BodyPart = await getTrialBodyPartList(params)
if (BodyPart.IsSuccess) {
resolve(BodyPart.Result);
} else {
reject(BodyPart);
}
} catch (err) {
reject(err)
}
})
}
i18n.mergeLocaleMessage('zh', zhMessages)
i18n.mergeLocaleMessage('en', enMessages)
Vue.use(ElementUI, {
i18n: (key, value) => i18n.t(key, value),
size: 'medium'
})
let d = function (code) {
var dictInfo = res.Result
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
try {
for (var code in dictInfo) {
var dictList = (dictInfo[code] && dictInfo[code].length > 0) ? dictInfo[code].map(dict => {
return {
id: dict.Id,
label: lang === 'zh' ? dict.ValueCN : dict.Value,
value: dict.DataTypeEnum === 3 ? eval(dict.Code) : dict.IsEnumInt ? parseInt(dict.Code) : dict.Code,
raw: Object.assign({}, dict),
IsBaseLineUse: false,
IsFollowVisitUse: false
}
}) : []
dictInfo[code] = dictList
}
} catch (e) {
console.error(e)
}
return dictInfo
}()
Vue.prototype.$d = d
Vue.prototype.$fd = function (code, v, type, arr, key = 'label') {
try {
let data = arr || d;
type = type || 'value';
// code === 'YesOrNo' ? console.log(d) : ''
return data[code].find(i => {
return i[type] === v
}) ? data[code].find(i => {
return i[type] === v
})[key] : ''
} catch (e) {
}
}
Vue.prototype.$company = (isShort = true) => {
let companyName = null
if (localStorage.getItem('CompanyInfo')) {
let CompanyInfo = JSON.parse(localStorage.getItem('CompanyInfo'))
let isZh = zzSessionStorage.getItem('lang') === 'zh' || _vm.$i18n.locale == 'zh'
if (isZh) {
companyName = isShort ? CompanyInfo.CompanyShortNameCN : CompanyInfo.CompanyNameCN
} else {
companyName = isShort ? CompanyInfo.CompanyShortName : CompanyInfo.CompanyName
}
}
return companyName;
}
Vue.prototype.$updateDictionary = function () {
Vue.prototype.$d = function (code) {
var dictInfo = res.Result
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
try {
for (var code in dictInfo) {
var dictList = (dictInfo[code] && dictInfo[code].length > 0) ? dictInfo[code].map(dict => {
return {
id: dict.raw.Id,
label: lang === 'zh' ? dict.raw.ValueCN : dict.raw.Value,
value: dict.raw.DataTypeEnum === 3 ? eval(dict.raw.Code) : dict.raw.IsEnumInt ? parseInt(dict.raw.Code) : dict.raw.Code,
raw: Object.assign({}, dict.raw),
IsBaseLineUse: false,
IsFollowVisitUse: false
}
}) : []
_vm.$set(dictInfo, code, dictList)
}
} catch (e) {
console.error(e)
}
return dictInfo
}()
_vm.$forceUpdate()
}
Vue.prototype.$EventBus = new Vue()
Vue.prototype.$path = []
var t = function (key) {
if (!~Vue.prototype.$path.indexOf(key)) {
Vue.prototype.$path.push(key)
}
let text = i18n.t(key)
if (Array.isArray(store.state.trials.config.TrialObjectNameList) && store.state.trials.config.TrialObjectNameList.length > 0) {
let arr = JSON.parse(JSON.stringify(store.state.trials.config.TrialObjectNameList))
arr.sort((a, b) => b.Name.length - a.Name.length)
arr.forEach(item => {
let test = new RegExp(item.Name, 'ig')
text = text.replace(test, item.TrialName)
})
}
let CompanyInfo = JSON.parse(localStorage.getItem('CompanyInfo'))
if(CompanyInfo&&CompanyInfo.SystemShortName){
let test = new RegExp('IRC', 'ig')
text = text.replace(test, 'LILI')
}
// return i18n.t(key)
return text;
}
Vue.prototype.$t = t
_vm = new Vue({
el: '#app',
router,
store,
i18n,
data: {
unlock: {
my_username: null,
my_password: null,
view: false
}
},
render: h => h(App)
})
var isLock = zzSessionStorage.getItem('isLock')
var isOpen = false
let count = 0;
if (eval(process.env.VUE_APP_LOGIN_FOR_PERMISSION)) {
setInterval(() => {
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (WHITELIST.includes(_vm.$route.path)) {
return
}
if (_vm.$store.state.user.userId !== zzSessionStorage.getItem('userId')) {
window.location.href = `/login`
zzSessionStorage.removeItem('lastWorkbench')
_vm.$alert(_vm.$t("env:sso:tip"), {
type: 'warning',
})
}
}, 3000)
}
const waitOperate = (callback, second, callback2, second2) => {
let x;
let y;
let timer;
//监听键盘
function countTime() {
count++
localStorage.setItem('count', count)
if (count == parseInt(second2) || isLock === 'true') {
callback2();
}
if (count >= second) {
callback();
count = 0;
localStorage.removeItem('count')
}
}
var blob = new Blob([document.querySelector('#worker').textContent]);
var url = window.URL.createObjectURL(blob);
var worker = new Worker(url);
worker.onmessage = function (e, msg) {
if (localStorage.getItem('count') === '0') {
count = 0
localStorage.removeItem('count')
}
countTime()
}
//监听鼠标
document.onmousemove = function (event) {
const x1 = event.clientX;
const y1 = event.clientY;
if (x != x1 || y != y1) {
count = 0;
localStorage.setItem('count', '0')
}
x = x1;
y = y1;
};
document.onkeyup = function () {
count = 0;
localStorage.setItem('count', '0')
};
}
const h = _vm.$createElement
/* eslint-disable */
// eval(process.env.VUE_APP_LOGOUT_FOR_PERMISSION)
// process.env.VUE_APP_LOGOUT_FOR_TIME
// eval(process.env.VUE_APP_LOCK_FOR_PERMISSION)
// process.env.VUE_APP_LOCK_FOR_TIME
// window.VUE_APP_COMPANY_NAME = process.env.VUE_APP_COMPANY_NAME;
waitOperate(eval(process.env.VUE_APP_LOGOUT_FOR_PERMISSION) ? () => {
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (_vm.$store.state.trials.unlock || WHITELIST.includes(_vm.$route.path)) {
count = 0;
localStorage.setItem('count', '0')
return
}
_vm.$store.dispatch('user/logout').then(res => {
// window.location.href = `/login`
try {
if (_vm.$msgbox && _vm.$msgbox.close) {
_vm.$msgbox.close();
}
} catch (err) {
console.log(err)
}
_vm.$FB.close();
_vm.$FBT.close();
_vm.$MFA.close();
isOpen = false
isLock = null
zzSessionStorage.removeItem('isLock')
router.push("/login")
}).then(() => {
// _vm.$alert(lang === 'zh' ? '由于您长时间未操作,为保护您的数据安全已强制将您下线,如果需要继续操作请重新登陆!' : 'No operation for a long time non-operation, you have been forced logout to protect data security. If continue to operate, please login again!', {
// type: 'warning',
// })
_vm.$alert(_vm.$t("env:loginOut"), {
type: 'warning',
})
})
} : () => { }, process.env.VUE_APP_LOGOUT_FOR_TIME,
eval(process.env.VUE_APP_LOCK_FOR_PERMISSION) ? () => {
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (_vm.$store.state.trials.unlock || WHITELIST.includes(_vm.$route.path)) {
count = 0;
localStorage.setItem('count', '0')
if (_vm.$route.path === '/login') {
zzSessionStorage.removeItem('lastWorkbench')
zzSessionStorage.removeItem('isLock')
isLock = null
}
return
}
if (isOpen) {
return
}
isOpen = true
zzSessionStorage.setItem('isLock', 'true')
_vm.$msgbox({
title: _vm.$t("env:lock:msgBox:title"),
confirmButtonText: _vm.$t("env:lock:msgBox:confirmButtonText"),
showClose: false,
beforeClose: (action, instance, done) => {
if (action === 'confirm') {
if (!_vm.unlock.my_username) {
_vm.$message.warning(_vm.$t("env:lock:msgBox:iupUser"))
return
}
if (!_vm.unlock.my_password) {
_vm.$message.warning(_vm.$t("env:lock:msgBox:inpPassword"))
return
}
var my_username = zzSessionStorage.getItem('my_username')
var my_password = zzSessionStorage.getItem('my_password')
let my_userid = zzSessionStorage.getItem('userId')
let my_EMail = zzSessionStorage.getItem('my_EMail') || ''
if (md5(_vm.unlock.my_password) === my_password && (my_username === _vm.unlock.my_username || my_EMail.toUpperCase() === vm.unlock.my_username.toUpperCase())) {
resetReadingRestTime().then(() => {
})
const closeLock = (_vm) => {
_vm.$message.success(_vm.$t("env:lock:msgBox:lockSuccess"))
_vm.unlock = {
my_username: null,
my_password: null,
view: false
}
isOpen = false
count = 0;
isLock = null
zzSessionStorage.removeItem('isLock')
localStorage.setItem('count', '0')
document.querySelector('#my_username').value = null
document.querySelector('#my_password').value = null
setTimeout(() => {
done()
}, 500)
}
// if (eval(process.env.VUE_APP_LOCK_FOR_PERMISSION_MFA)) {
// sendMFAEmail({ UserId: my_userid, MfaType: 1 }).then((res) => {
// done();
// Vue.prototype.$MFA({
// status: "lock",
// UserId: my_userid,
// EMail: res.Result,
// username: my_username,
// callBack: () => {
// closeLock(_vm)
// },
// })
// })
// } else {
closeLock(_vm)
// }
} else {
// console.log(111)
_vm.$message.error(_vm.$t('env:lock:msgBox:userFail'))
}
}
},
message: h('div', {}, [
h('el-form', {
props: { labelWidth: "80px" }
}, [
h('el-form-item', {
props: { label: _vm.$t("env:lock:msgBox:form:username") },
}, [
h('input', {
props: {
value: _vm.unlock.my_username
},
attrs: {
id: 'my_username',
class: 'el-input__inner',
autocomplete: 'new-password'
},
on: {
change: (event) => {
_vm.unlock.my_username = event.target.value
},
input: (event) => {
_vm.unlock.my_username = event.target.value
}
}
})
]),
h('el-form-item', {
props: { label: _vm.$t("env:lock:msgBox:form:Password") },
attrs: {
style: "position: relative;"
}
}, [
h('input', {
props: {
value: _vm.unlock.my_password
},
ref: "unlock_my_password_input",
attrs: {
id: 'my_password',
class: 'el-input__inner',
type: _vm.unlock.view ? 'text' : 'password',
autocomplete: 'new-password',
style: "padding-right:25px"
},
on: {
change: (event) => {
_vm.unlock.my_password = event.target.value
},
input: (event) => {
_vm.unlock.my_password = event.target.value
}
}
}),
h('i', {
attrs: {
id: 'my_password_view',
class: "el-icon-view",
style: "cursor: pointer;position: absolute;top:35%;right:10px"
},
on: {
click: (event) => {
_vm.unlock.view = !_vm.unlock.view
if (_vm.unlock.view) {
_vm.$refs['unlock_my_password_input'].type = "text"
} else {
_vm.$refs['unlock_my_password_input'].type = "password"
}
},
}
}),
])
])
])
})
} : () => { }, process.env.VUE_APP_LOCK_FOR_TIME)
}
VueInit()
// createVersionPolling({
// appETagKey: "__APP_ETAG__",
// pollingInterval: 5 * 60 * 1000, // 单位为毫秒
// silent: process.env.NODE_ENV === false, // 开发环境下不检测
// onUpdate: (self) => {
// // 当检测到有新版本时,执行的回调函数,可以在这里提示用户刷新页面
// const result = confirm(_vm.$t("versionPolling:tip"));
// if (result) {
// self.onRefresh();
// } else {
// self.onCancel();
// }
// // 强制更新可以用alert
// // alert('有新版本,请刷新页面');
// },
// });
export default _vm