caiyiling 2024-04-22 16:12:18 +08:00
commit 96cff33b25
15 changed files with 526 additions and 228 deletions

View File

@ -74,8 +74,8 @@ Vue.use(adaptive)
import dialogDrag from '@/directive/dialogDrag'
// 窗口拖拽
Vue.use(dialogDrag)
if(!String.prototype.replaceAll){
String.prototype.replaceAll = function(str, newStr){
if (!String.prototype.replaceAll) {
String.prototype.replaceAll = function (str, newStr) {
// 正则表达式
if (Object.prototype.toString.call(str).toLowerCase() === '[object regexp]') {
return this.replace(str, newStr)
@ -111,7 +111,7 @@ Vue.prototype.$getObjectName = (url) => {
console.log(url)
var value = url
var str = value.split("//"); //https://进行分割,
var index = str[1].indexOf("/")+1; //indexOf 获取第一个斜杠的索引,
var index = str[1].indexOf("/") + 1; //indexOf 获取第一个斜杠的索引,
console.log(str[1].substring(index)); //substring 截取,
return '/' + str[1].substring(index)
}
@ -128,18 +128,18 @@ Vue.prototype.getGuid = (text) => {
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}`
console.log(`${t4 + t3 + t2 + t1}-${t6 + t5}-${t8 + t7}-${t9}-${t10}`)
return `${t4 + t3 + t2 + t1}-${t6 + t5}-${t8 + t7}-${t9}-${t10}`
}
///50350000-3e2c-0016-eb4c-08db926b69d6/Image/84410000-3e10-0016-d156-08da242403fe/50350000-3e2c-0016-414e-08db926d9135/50350000-3e2c-0016-fd9d-08db926d9137/1.2.156.110002.21.2019.1.9.84822154.1/1.3.12.2.1107.5.1.4.73793.30000019010509500386600308609/1.3.12.2.1107.5.1.4.73793.30000019010509500386600308616/7fba7d7e-b3b3-d989-fa54-82e41f87a6ed
Vue.prototype.getGuid('1.2.156.110002.21.2019.1.9.84822154.11.3.12.2.1107.5.1.4.73793.300000190105095003866003086091.3.12.2.1107.5.1.4.73793.3000001901050950038660030861650350000-3e2c-0016-eb4c-08db926b69d6')
//7fba7d7e-b3b3-d989-fa54-82e41f87a6ed
Vue.prototype.$validatePassword = (rule, value, callback) => {
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
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(lang==='zh' ? new Error("密码必须包含18 32 个字符2至少1个数字3) 至少1个大写字母4至少1个小写字母5至少1个特殊字符 (~!-@#$%^&*_+?)") : new Error('Passwords must have: 1) 8 - 32 characters; 2) At least 1 number; 3) At least 1 uppercase letter; 4) At least 1 lowercase letter; 5) At least 1 special character (~!-@#$%^&*_+?) '))
callback(lang === 'zh' ? new Error("密码必须包含18 32 个字符2至少1个数字3) 至少1个大写字母4至少1个小写字母5至少1个特殊字符 (~!-@#$%^&*_+?)") : new Error('Passwords must have: 1) 8 - 32 characters; 2) At least 1 number; 3) At least 1 uppercase letter; 4) At least 1 lowercase letter; 5) At least 1 special character (~!-@#$%^&*_+?) '))
} else {
callback();
}
@ -173,7 +173,7 @@ Vue.prototype.fileToBlob = (file) => {
}
var _vm
async function VueInit () {
async function VueInit() {
var params
if (~window.location.href.indexOf('/readingDicoms') || ~window.location.href.indexOf('/noneDicomReading') || ~window.location.href.indexOf('/criterionquestions')) {
params = $q('TrialReadingCriterionId')
@ -192,14 +192,14 @@ async function VueInit () {
i18n.mergeLocaleMessage('en', enMessages)
let d = function (code) {
var dictInfo = res.Result
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
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 => {
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,
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
@ -207,7 +207,7 @@ async function VueInit () {
}) : []
dictInfo[code] = dictList
}
} catch (e){
} catch (e) {
console.error(e)
}
return dictInfo
@ -226,17 +226,17 @@ async function VueInit () {
console.log(e)
}
}
Vue.prototype.$updateDictionary = function() {
Vue.prototype.$updateDictionary = function () {
Vue.prototype.$d = function (code) {
var dictInfo = res.Result
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
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 => {
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,
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
@ -244,7 +244,7 @@ async function VueInit () {
}) : []
_vm.$set(dictInfo, code, dictList)
}
} catch (e){
} catch (e) {
console.error(e)
}
return dictInfo
@ -280,14 +280,14 @@ async function VueInit () {
let count = 0;
if (eval(process.env.VUE_APP_LOGIN_FOR_PERMISSION)) {
setInterval(() => {
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
if ( _vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/researchForm' || _vm.$route.path === '/researchLogin' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (_vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/researchForm' || _vm.$route.path === '/researchLogin' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {
return
}
if (_vm.$store.state.user.userId !== zzSessionStorage.getItem('userId')) {
window.location.href = `/login`
zzSessionStorage.removeItem('lastWorkbench')
_vm.$alert(lang === 'en'? 'The same browser only allows one user account to be logged in at a time.' : '同一浏览器只允许同时登陆一个账户', {
_vm.$alert(lang === 'en' ? 'The same browser only allows one user account to be logged in at a time.' : '同一浏览器只允许同时登陆一个账户', {
type: 'warning',
})
}
@ -301,10 +301,10 @@ async function VueInit () {
function countTime() {
count++
localStorage.setItem('count', count)
if (count == parseInt(second2) || isLock === 'true') {
if (count == parseInt(second2) || isLock === 'true') {
callback2();
}
if (count >= second) {
if (count >= second) {
callback();
count = 0;
localStorage.removeItem('count')
@ -340,22 +340,22 @@ async function VueInit () {
const h = _vm.$createElement
/* eslint-disable */
waitOperate(eval(process.env.VUE_APP_LOGOUT_FOR_PERMISSION) ? () => {
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
if (_vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {
count = 0;
localStorage.setItem('count', '0')
return
}
_vm.$store.dispatch('user/logout').then(res => {
window.location.href = `/login`
})
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (_vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {
count = 0;
localStorage.setItem('count', '0')
return
}
_vm.$store.dispatch('user/logout').then(res => {
window.location.href = `/login`
})
_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',
})
} : () => {}, process.env.VUE_APP_LOGOUT_FOR_TIME,
_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',
})
} : () => { }, process.env.VUE_APP_LOGOUT_FOR_TIME,
eval(process.env.VUE_APP_LOCK_FOR_PERMISSION) ? () => {
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
var lang = zzSessionStorage.getItem('lang') ? zzSessionStorage.getItem('lang') : 'zh'
if (_vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {
count = 0;
localStorage.setItem('count', '0')
@ -408,14 +408,14 @@ async function VueInit () {
}
}
},
message: h('div', {} , [
message: h('div', {}, [
h('el-form', {
props: { labelWidth: "80px" }
}, [
h('el-form-item', {
props: {label: lang === 'zh' ? '用户名' : 'User ID'},
props: { label: lang === 'zh' ? '用户名' : 'User ID' },
}, [
h('input',{
h('input', {
props: {
value: _vm.unlock.my_username
},
@ -435,7 +435,7 @@ async function VueInit () {
})
]),
h('el-form-item', {
props: {label: lang === 'zh' ? '密码' : 'Password'},
props: { label: lang === 'zh' ? '密码' : 'Password' },
}, [
h('input', {
props: {
@ -460,7 +460,7 @@ async function VueInit () {
])
])
})
} : () => {}, process.env.VUE_APP_LOCK_FOR_TIME)
} : () => { }, process.env.VUE_APP_LOCK_FOR_TIME)
}
VueInit()

View File

@ -12,7 +12,7 @@ NProgress.configure({ showSpinner: false })
const whiteList = ['/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
router.beforeEach(async(to, from, next) => {
router.beforeEach(async (to, from, next) => {
NProgress.start()
// 设置页面标题
// document.title = getPageTitle(to.meta.title)
@ -56,7 +56,10 @@ router.beforeEach(async(to, from, next) => {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// 在免登录whiteList中直接进入
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading'){
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading') {
OSSclient()
}
if (to.path === '/login') {
OSSclient()
}
next()
@ -68,7 +71,7 @@ router.beforeEach(async(to, from, next) => {
next(`/ReviewersResearch?`)
NProgress.done()
} else {
// 其他无权访问的页面将重定向到登录页面。
// 其他无权访问的页面将重定向到登录页面。
next(`/login?`)
NProgress.done()
}

View File

@ -6,7 +6,15 @@
<div class="login-body">
<div class="login-l">
<div class="login-logo">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
<img
v-if="language === 'zh'"
:src="
hospital.HospitalLogoPath
? OSSclientConfig.basePath + hospital.HospitalLogoPath
: logoImg
"
alt=""
/>
<img v-else src="@/assets/zzlogo3.png" alt="" />
</div>
<div class="login-image">
@ -16,7 +24,9 @@
<div class="login-r">
<div class="title-container">
<!-- IRC Management System -->
<div class="title">{{ $t("login:title:system") }}</div>
<div class="title">
{{ $t("login:title:system") }}
</div>
</div>
<el-form
ref="loginForm"
@ -135,11 +145,14 @@ import TopLang from "./topLang";
// import NoticeMarquee from '../trials/trials-layout/components/noticeMarquee'
import Vcode from "vue-puzzle-vcode";
import Img1 from "@/assets/pic-1.png";
import logoImg from "@/assets/zzlogo2.png";
import { getHospital } from "@/api/hospital.js";
export default {
name: "Login",
components: { TopLang, Vcode },
data() {
return {
logoImg,
VUE_APP_OSS_CONFIG_REGION: process.env.VUE_APP_OSS_CONFIG_REGION,
loginForm: {
username: "",
@ -174,11 +187,18 @@ export default {
location: null,
isShow: false,
Img1,
hospital: {
HospitalLogoPath: null,
HospitalName: null,
},
};
},
computed: {
...mapGetters(["asyncRoutes", "routes", "language"]),
},
created() {
this.getInfo();
},
mounted() {
this.loginType = this.$route.query.loginType;
this.location = this.$route.query.location;
@ -202,6 +222,19 @@ export default {
},
methods: {
...mapMutations({ setLanguage: "lang/setLanguage" }),
//
async getInfo() {
try {
let res = await getHospital();
if (res.IsSuccess) {
Object.keys(this.hospital).forEach((key) => {
this.hospital[key] = res.Result[key];
});
}
} catch (err) {
console.log(err);
}
},
showPwd() {
if (this.passwordType === "password") {
this.passwordType = "";

View File

@ -1,70 +1,91 @@
<template>
<el-form
ref="hospitalForm"
size="small"
:model="hospital"
:rules="hospitalFormRules"
label-width="150px"
style="width: 800px"
>
<el-card class="Basic" shadow="never" size="small">
<el-form-item label="医院名称: " prop="HospitalName">
<el-input v-model="hospital.HospitalName" :disabled="disabled" />
</el-form-item>
<div class="hospital">
<el-form
ref="hospitalForm"
size="small"
:model="hospital"
:rules="hospitalFormRules"
label-width="150px"
style="width: 800px"
>
<el-card class="Basic" shadow="never" size="small">
<el-form-item label="医院名称: " prop="HospitalName">
<el-input v-model="hospital.HospitalName" :disabled="disabled" />
</el-form-item>
<el-form-item label="医院编码: " prop="HospitalCode">
<el-input v-model="hospital.HospitalCode" :disabled="disabled" />
</el-form-item>
<el-form-item label="医院别称: " prop="HospitalAliasName">
<el-input v-model="hospital.HospitalAliasName" :disabled="disabled" />
</el-form-item>
<el-form-item label="医院别称: " prop="HospitalAliasName">
<el-input v-model="hospital.HospitalAliasName" :disabled="disabled" />
</el-form-item>
<el-form-item label="国家: " prop="Country">
<el-input v-model="hospital.Country" :disabled="disabled" />
</el-form-item>
<el-form-item label="省份: " prop="Province">
<el-input v-model="hospital.Province" :disabled="disabled" />
</el-form-item>
<el-form-item label="城市: " prop="City">
<el-input v-model="hospital.City" :disabled="disabled" />
</el-form-item>
<el-form-item label="地址: " prop="Address">
<el-input v-model="hospital.Address" :disabled="disabled" />
</el-form-item>
<el-form-item label="联系方式: " prop="Phone">
<el-input v-model="hospital.Phone" :disabled="disabled" />
</el-form-item>
<el-form-item label="是否可以连接互联网: ">
<el-switch
v-model="hospital.IsCanConnectInternet"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="是"
inactive-text="否"
:disabled="disabled"
<el-form-item label="国家: " prop="Country">
<el-input v-model="hospital.Country" :disabled="disabled" />
</el-form-item>
<el-form-item label="省份: " prop="Province">
<el-input v-model="hospital.Province" :disabled="disabled" />
</el-form-item>
<el-form-item label="城市: " prop="City">
<el-input v-model="hospital.City" :disabled="disabled" />
</el-form-item>
<el-form-item label="地址: " prop="Address">
<el-input v-model="hospital.Address" :disabled="disabled" />
</el-form-item>
<el-form-item label="联系方式: " prop="Phone">
<el-input v-model="hospital.Phone" :disabled="disabled" />
</el-form-item>
<el-form-item label="未激活项目数: " prop="TrialKeepCount">
<el-input
v-model="hospital.TrialKeepCount"
:disabled="disabled"
type="number"
/>
</el-form-item>
<el-form-item label="是否可以连接互联网: ">
<el-switch
v-model="hospital.IsCanConnectInternet"
active-color="#13ce66"
inactive-color="#ff4949"
active-text="是"
inactive-text="否"
:disabled="disabled"
>
</el-switch>
</el-form-item>
<el-form-item label="logo: " prop="HospitalLogoPath">
<upload-logo
:path.sync="hospital.HospitalLogoPath"
:disabled="disabled"
/>
</el-form-item>
</el-card>
<el-form-item v-hasPermi="['system:hospital:edit']">
<el-button
type="primary"
size="small"
style="margin: 10px 15px"
:loading="btnLoading"
:disabled="btnLoading"
@click="handleSave"
>保存</el-button
>
</el-switch>
</el-form-item>
</el-card>
<el-form-item v-hasPermi="['system:hospital:edit']">
<el-button
type="primary"
size="small"
style="margin: 10px 15px"
:loading="btnLoading"
:disabled="btnLoading"
@click="handleSave"
>保存</el-button
>
</el-form-item>
</el-form>
</el-form>
</div>
</template>
<script>
import { setHospital, getHospital } from "@/api/hospital.js";
import uploadLogo from "./uploadLogo.vue";
export default {
name: "systemHospital",
components: { "upload-logo": uploadLogo },
data() {
return {
hospital: {
HospitalName: null,
HospitalAliasName: null,
HospitalCode: null,
Country: null,
City: null,
Province: null,
@ -72,25 +93,36 @@ export default {
Phone: null,
IsCanConnectInternet: true,
Id: null,
TrialKeepCount: null,
HospitalLogoPath: null,
},
hospitalFormRules: {
HospitalName: [
{ required: true, message: "请输入医院名称", trigger: "blur" },
],
HospitalAliasName: [
{ required: true, message: "请输入医院别称", trigger: "blur" },
HospitalCode: [
{ required: true, message: "请输入医院编码", trigger: "blur" },
],
Country: [{ required: true, message: "请输入国家", trigger: "blur" }],
City: [{ required: true, message: "请输入所在城市", trigger: "blur" }],
Province: [
{ required: true, message: "请输入所在省份", trigger: "blur" },
HospitalLogoPath: [
{ required: true, message: "请上传医院logo", trigger: "blur" },
],
Address: [
{ required: true, message: "请输入医院地址", trigger: "blur" },
],
Phone: [
{ required: true, message: "请输入医院联系方式", trigger: "blur" },
TrialKeepCount: [
{ required: true, message: "请输入未激活项目数", trigger: "blur" },
],
// HospitalAliasName: [
// { required: true, message: "", trigger: "blur" },
// ],
// Country: [{ required: true, message: "", trigger: "blur" }],
// City: [{ required: true, message: "", trigger: "blur" }],
// Province: [
// { required: true, message: "", trigger: "blur" },
// ],
// Address: [
// { required: true, message: "", trigger: "blur" },
// ],
// Phone: [
// { required: true, message: "", trigger: "blur" },
// ],
},
btnLoading: false,
};
@ -139,5 +171,10 @@ export default {
::v-deep .is-error.my_new_pwd {
margin-bottom: 40px;
}
.hospital {
width: 100%;
height: 100%;
overflow-y: auto;
}
</style>

View File

@ -0,0 +1,171 @@
<template>
<div class="upload-container">
<el-upload
class="upload-demo"
action
:http-request="uploadFile"
:before-upload="beforeUpload"
:file-list="fileList"
:on-preview="handlePreview"
:on-remove="remove"
:limit="1"
:on-exceed="handleExceed"
accept=".png,.jpg,.jpeg"
v-if="!disabled"
>
<el-button size="small" type="primary" :disabled="btnDisabled"
>上传</el-button
>
<span slot="tip" class="el-upload__tip">(只能上传png/jpg/jpeg文件)</span>
</el-upload>
<p
v-if="fileList.length > 0 && disabled"
class="logoAMessage"
@click.stop="handlePreview(fileList[0])"
style="margin: 0"
>
<i class="el-icon-document"></i>
<span>{{ fileList.length > 0 ? fileList[0].name : "" }}</span>
</p>
</div>
</template>
<script>
const type = "Statement of Work";
export default {
name: "UploadLogo",
props: {
path: {
required: true,
default: "",
},
disabled: {
required: true,
default: false,
},
},
data() {
return {
fileList: [],
btnDisabled: false,
};
},
watch: {
path: {
handler() {
if (this.path) {
let name = this.path.split("/");
this.fileList = [
{
name: name[name.length - 1],
path: this.path,
fullPath: this.OSSclientConfig.basePath + this.path,
url: this.path,
},
];
}
},
immediate: true,
},
},
methods: {
remove(file, fileList) {
this.$emit("update:path", null);
},
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);
});
},
// oss
async uploadToOSS(name, file) {
try {
let res = await this.OSSclient.put(
`/System/GeneralDocuments/${name}`,
file
);
return res;
} catch (err) {
console.log(err);
return false;
}
},
initFileList(fileList) {
this.fileList = fileList;
},
async uploadFile(param) {
var fileName = param.file.name;
this.btnDisabled = true;
let file = await this.fileToBlob(param.file);
let res = await this.uploadToOSS(fileName, file);
this.btnDisabled = false;
if (!res) return;
this.fileList = [
{
name: fileName,
path: res.name,
fullPath: this.OSSclientConfig.basePath + res.name,
url: res.name,
},
];
console.log(this.fileList);
this.$emit("update:path", res.name);
return console.log(res);
},
beforeUpload(file, fileList) {
const isValidFile = this.fileValid(file.name, ["png", "jpg", "jpeg"]);
if (isValidFile) {
this.fileList = [];
} else {
this.$alert("请上传PNG/JPG/JPEG文件");
return false;
}
},
handlePreview(file) {
file.fullPath ? window.open(file.fullPath, "_blank") : "";
},
handleExceed(files, fileList) {
this.$message.warning(`Upload is currently limited to 1 file`);
},
fileValid(fileName, typeArr) {
var extendName = fileName
.substring(fileName.lastIndexOf(".") + 1)
.toLocaleLowerCase();
if (typeArr.indexOf(extendName) > -1) {
return true;
} else {
return false;
}
},
},
};
</script>
<style>
.upload-container .el-upload--text {
border: none;
width: 80px;
height: 30px;
}
.upload-container .el-form-item__label {
font-size: 12px;
}
.upload-container .el-upload-list__item {
font-size: 12px;
}
.logoAMessage {
font-size: 12px;
cursor: pointer;
}
</style>

View File

@ -39,7 +39,7 @@
>
<el-input v-model="user.FirstName" />
</el-form-item>
<el-form-item
<!-- <el-form-item
:label="$t('system:userlist:table:Gender')"
prop="Sex"
style="margin-right: 40px"
@ -48,7 +48,7 @@
<el-radio :label="1">Male</el-radio>
<el-radio :label="0">Female</el-radio>
</el-radio-group>
</el-form-item>
</el-form-item> -->
<el-form-item :label="$t('system:userlist:table:Email')" prop="EMail">
<el-input v-model="user.EMail" />
</el-form-item>
@ -90,7 +90,7 @@
</template>
</el-select>
</el-form-item>
<el-form-item
<!-- <el-form-item
:label="$t('trials:researchForm:form:checkCode')"
prop="checkCode"
v-if="!IsCanConnectInternet"
@ -99,7 +99,7 @@
<span style="color: red"
>请输入校验码用于用户首次登录重置密码时的校验</span
>
</el-form-item>
</el-form-item> -->
</el-card>
<el-card

View File

@ -122,6 +122,8 @@ export default {
submitMessage: {
SubjectId: null,
TrialId: null,
TrialCode: null,
ResearchProgramNo: null,
},
subjectIdList: [], //
rules: {

View File

@ -251,6 +251,11 @@ export default {
};
},
methods: {
handleDetail(row) {
this.$router.push({
path: `/trials/trials-panel?trialId=${this.submitMessage.TrialId}&trialCode=${this.submitMessage.TrialCode}&researchProgramNo=${this.submitMessage.ResearchProgramNo}`,
});
},
// 访
async remove(item) {
try {
@ -377,6 +382,11 @@ export default {
console.log(err);
}
},
handleDetail(row) {
this.$router.push({
path: `/trials/trials-panel?trialId=${row.Id}&trialCode=${row.TrialCode}&researchProgramNo=${row.ResearchProgramNo}`,
});
},
//
handleSearch() {
this.searchData.PageIndex = 1;

View File

@ -1,9 +1,17 @@
<template>
<div class="trials-navbar" style="position: relative">
<div class="leftMenu">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
<img
v-if="language === 'zh'"
:src="
hospital.HospitalLogoPath
? OSSclientConfig.basePath + hospital.HospitalLogoPath
: logoImg
"
alt=""
/>
<img v-else src="@/assets/zzlogo3.png" alt="" />
<span style="white-space:nowrap;">
<span style="white-space: nowrap">
<!-- 中心影像系统EICS -->
{{ $t("trials:trials:title:eics") }}
</span>
@ -85,14 +93,21 @@ import { loginOut } from "@/api/user";
import { mapGetters, mapMutations } from "vuex";
import TopLang from "./topLang";
import NoticeMarquee from "./noticeMarquee";
import { getHospital } from "@/api/hospital.js";
import logoImg from "@/assets/zzlogo2.png";
export default {
components: { TopLang, NoticeMarquee },
data() {
return {
logoImg,
activeIndex: "2",
isReviewer: false,
userTypeShortName: zzSessionStorage.getItem("userTypeShortName"),
notice: "",
hospital: {
HospitalLogoPath: null,
HospitalName: null,
},
};
},
computed: {
@ -113,9 +128,23 @@ export default {
created() {
this.isReviewer = JSON.parse(zzSessionStorage.getItem("IsReviewer"));
this.changeRoute(this.$route);
this.getInfo();
},
methods: {
...mapMutations({ setLanguage: "lang/setLanguage" }),
//
async getInfo() {
try {
let res = await getHospital();
if (res.IsSuccess) {
Object.keys(this.hospital).forEach((key) => {
this.hospital[key] = res.Result[key];
});
}
} catch (err) {
console.log(err);
}
},
changeRoute(v) {
if (v.path === "/trials/trials-inspection") {
this.activeIndex = "1";

View File

@ -67,7 +67,7 @@
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
</div>
<SignForm ref="signForm" :trial-id="trialId" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
<SignForm ref="signForm" :trial-id="trialId" :sign-code-enum="signCode" @close="closeSignDialog" />
</el-dialog>
</div>
</template>
@ -151,14 +151,14 @@ export default {
this.signVisible = false
this.$emit('getList')
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.$emit('closeDialog')
this.$emit('close')
}).catch(() => {
this.btnLoading = false
this.$refs['signForm'].btnLoading = false
})
},
handleCancel() {
this.$emit('closeDialog')
this.$emit('close')
},
closeSignDialog(isSign, signInfo) {
if (isSign) {

View File

@ -5,6 +5,7 @@
:title="$t('trials:trials-list:action:activateProject')"
width="500px"
append-to-body
:before-close="handleCancel"
>
<el-form
ref="activateProjectForm"
@ -20,9 +21,9 @@
</el-form-item>
<!-- 授权码 -->
<el-form-item :label="$t('trials:trials-list:form:authorizationCode')">
<p v-if="form.Authorization" class="AuthorizationBox">
<span class="Authorization" :title="form.Authorization">{{
form.Authorization
<p v-if="data.Authorization" class="AuthorizationBox">
<span class="Authorization" :title="data.Authorization">{{
data.Authorization
}}</span>
<span class="copy" @click.stop="copy">{{
$t("trials:trials-list:action:copy")
@ -69,11 +70,7 @@
</el-dialog>
</template>
<script>
import {
getTrialAuthorizationCode,
activateTrial,
getTrialActivationCode,
} from "@/api/trials.js";
import { activateTrial, getTrialActivationCode } from "@/api/trials.js";
export default {
name: "activateProject",
props: {
@ -139,7 +136,7 @@ export default {
},
//
copy() {
this.$copyText(this.form.Authorization)
this.$copyText(this.data.Authorization)
.then((res) => {
//
this.$message.success(
@ -151,25 +148,11 @@ export default {
this.$alert(this.$t("trials:researchRecord:message:copyFailed"));
});
},
//
async getTrialAuthorizationCode() {
let params = {
TrialId: this.data.TrialId,
};
try {
let res = await getTrialAuthorizationCode(params);
if (res.IsSuccess) {
this.form.Authorization = res.Result;
}
} catch (err) {
console.log(err);
}
},
//
async getCode() {
let params = {
TrialId: this.data.TrialId,
AuthorizationCode: this.form.Authorization,
AuthorizationCode: this.data.Authorization,
};
try {
let res = await getTrialActivationCode(params);

View File

@ -113,17 +113,17 @@
v-if="
scope.row.AuthorizationEncrypt &&
scope.row.AuthorizationDate &&
trialExpired(moment(scope.row.AuthorizationDate, 15))
!trialExpired(scope.row.AuthorizationDate, 15)
"
class="el-icon-warning-outline"
:title="$t('trials:trials-list:tipMessage:tipTwo')"
style="color: #0f0; font-size: 20px"
style="color: #e6a23c; font-size: 20px"
></i>
<i
v-if="
scope.row.AuthorizationEncrypt &&
scope.row.AuthorizationDate &&
trialExpired(moment(scope.row.AuthorizationDate))
!trialExpired(scope.row.AuthorizationDate)
"
class="el-icon-warning-outline"
:title="$t('trials:trials-list:tipMessage:tipThree')"
@ -231,13 +231,6 @@
/>
<el-table-column label="" min-width="150" align="left" fixed="right">
<template slot-scope="scope">
<!-- 激活 -->
<el-button
circle
icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)"
/>
<!-- 详情 -->
<el-button
v-hasPermi="['trials:trials-list:panel']"
@ -277,6 +270,13 @@
:title="$t('trials:trials-list:action:abolition')"
@click="handleAbandon(scope.row)"
/>
<!-- 激活 -->
<el-button
circle
icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)"
/>
<!-- 代办详情 -->
<!-- <el-button
v-hasPermi="['trials:trials-list:abolish']"
@ -357,7 +357,11 @@
</BaseContainer>
</template>
<script>
import { abandonTrial, getTrialListHir } from "@/api/trials";
import {
abandonTrial,
getTrialListHir,
getTrialAuthorizationCode,
} from "@/api/trials";
import { mapGetters } from "vuex";
import Excel from "exceljs";
import BaseContainer from "@/components/BaseContainer";
@ -473,10 +477,30 @@ export default {
}
return true;
},
//
async getTrialAuthorizationCode(item) {
let params = {
TrialId: item.TrialId,
};
try {
let res = await getTrialAuthorizationCode(params);
if (res.IsSuccess) {
this.currentRow.Authorization = res.Result;
return true;
}
return false;
} catch (err) {
console.log(err);
return false;
}
},
//
handleActivate(item) {
async handleActivate(item) {
this.currentRow = item;
this.activateVisible = true;
let res = await this.getTrialAuthorizationCode(item);
if (res) {
this.activateVisible = true;
}
},
initPage() {
this.getList();

View File

@ -277,30 +277,32 @@
}}</span>
</template>
</el-table-column>
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
<el-table-column :label="$t('trials:adReview:title:result')">
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
)
)
)
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
</el-table-column>
</el-table-column>
<!-- 是否入组 -->
<el-table-column

View File

@ -277,30 +277,32 @@
}}</span>
</template>
</el-table-column>
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
<el-table-column :label="$t('trials:adReview:title:result')">
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
)
)
)
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
</el-table-column>
</el-table-column>
<!-- 是否入组 -->
<el-table-column

View File

@ -148,7 +148,7 @@
</div>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 60 }"
v-adaptive="{ bottomOffset: 80 }"
v-loading="loading"
:data="list"
stripe
@ -276,30 +276,32 @@
}}</span>
</template>
</el-table-column>
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
<el-table-column :label="$t('trials:adReview:title:result')">
<el-table-column
prop="item.QuestionId"
:label="item.QuestionName"
min-width="140"
v-for="(item, index) of QuestionList"
:key="'QuestionId' + index"
show-overflow-tooltip
>
<template slot-scope="scope">
{{
item.DictionaryCode
? $fd(
item.DictionaryCode,
parseInt(
scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
)
)
)
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
: scope.row.PIReadingResultList.find(
(v) => v.QuestionId === item.QuestionId
).Answer
}}
</template>
</el-table-column>
</el-table-column>
<!-- 是否入组 -->
<el-table-column
@ -460,7 +462,7 @@ export default {
auditRecordVisible: false,
openWindow: null,
TrialReadingCriterionId: "0",
QuestionList:[]
QuestionList: [],
};
},
watch: {