提交 86b5da0e 编写于 作者: 张平's avatar 张平

Merge branch 'dev-cme-1216' into 'release'

查看cme 项目列表和项目详情页  codereviewer:张平

查看cme 项目列表和项目详情页  codereviewer:张平1

See merge request !1
此差异已折叠。
......@@ -6,12 +6,12 @@
v-for="(component , index) in projectComponent"
:key="index">
<!-- <CommonTitle :fontWeight="500" :title="component.name" :isShowCert="true" :isShowExplain="true" @showDialog="showDialog(component.introduce)"></CommonTitle> -->
<MergeTitle :fontWeight="500" :title="component.name" :isShowCert="component.status" :isShowExplain="true" @showDialog="showDialog(component.introduce)"></MergeTitle>
<!-- <MergeTitle :fontWeight="500" :title="component.name" :isShowCert="component.status" :isShowExplain="true" @showDialog="showDialog(component.introduce)"></MergeTitle> -->
<van-collapse v-model="activeNames" @change="changeCollapse">
<van-collapse-item
v-for="(portalModule , index) in component.portalModuleDTOS"
v-for="(portalModule, index) in component.portalModuleDTOS"
:key="index"
:title="portalModule.moduleName | shortName(19)"
:title="(parseInt(index) + 1) + '.' + portalModule.moduleName | shortName(19)"
:name="portalModule.expandKey"
:value="portalModule.value"
:disabled="portalModule.disabled"
......@@ -45,10 +45,10 @@
<!-- <img v-show="item.status == 13" class="text-action-dh" src="../../images/icon-dh.png"> -->
{{getActionText(item.status)}}
</span>
<div class="connect-line"
<!-- <div class="connect-line"
:class="{'len1': item.height === 1, 'len2': item.height === '1','len3': item.height === 2, 'len4': item.height === '2', 'line-complete': index+1 < portalModule.contentList.length && portalModule.contentList[index+1].useFlag == 1}"
v-if="index+1 < portalModule.contentList.length && portalModule.contentList[index].templetId == portalModule.contentList[index+1].templetId">
</div>
</div> -->
<div class="foot-line"
v-if="index+1 < portalModule.contentList.length && portalModule.contentList[index].templetId == portalModule.contentList[index+1].templetId">
</div>
......@@ -61,9 +61,10 @@
</van-collapse-item>
</van-collapse>
<!-- <Toast ref="toastTitle"></Toast> -->
<div v-if="index+1 < projectComponent.length" class="line-component"></div>
<!-- <div v-if="index+1 < projectComponent.length" class="line-component"></div> -->
</div>
<NoMoreContent v-if="detailNum > 9" />
<!-- <NoMoreContent v-if="detailNum > 9" /> -->
<NoMoreContent />
<div v-if="detailNum <= 9" class="no-more-bottom"></div>
<van-dialog
v-model="dialogState"
......@@ -94,73 +95,33 @@ const actionMap = {
22: "继续学习",
23: "去复习"
};
const sendBuriedDataMap = {
11: "211012",
12: "211013",
21: "211009",
22: "211010",
23: "211011"
}
export default {
name: "cell-list-item",
data() {
return {
appVersion: "200",
hocImg: require("../../images/has-owner-cert.png"),
activeNames: [],
activeNames: [1],
dialogState: false,
projectId: 1,
componentList: [
{
name: '教培考核-必修部分',
introduce: '本次培训工作以指南为依据,本次培训工作以指南为依据。 <br>必修部分共10门课程,需全部考核通过,单门课程成绩总60-79分为合格,80-100分为优秀,每门考试共可考2次,支持中途退出后继续答题。',
portalModuleDTOS: [
{
moduleName: '1 总论篇',
expandKey: '1',
value: '共3节',
disabled: false,
},
{
moduleName: '2 诊断篇',
expandKey: '2',
value: '共3节',
disabled: false,
},
{
moduleName: '3 老年高血压篇',
expandKey: '3',
value: '尚未开始',
disabled: true,
},
],
},
{
name: '教培考核-选修部分',
introduce: '本次培训工作以指南为依据。 \n必修部分共11门课,需全部通过',
portalModuleDTOS: [
{
moduleName: '1 高血压慢病资格',
expandKey: 'abc',
value: '共3节',
},
{
moduleName: '2 诊断篇',
expandKey: '6',
value: '共3节',
},
{
moduleName: '3 老年高血压篇',
expandKey: '7',
value: '共3节',
},
],
}
],
projectId: 1
};
},
props: {
moduleName: {
type: String,
default: ""
},
paramData: {
type: Array,
default: () => []
},
// moduleName: {
// type: String,
// default: ""
// },
// paramData: {
// type: Array,
// default: () => []
// },
projectComponent: {
type: Array,
default: () => []
......@@ -224,7 +185,13 @@ export default {
} else if (item.type == 2) {
this.gotoCourse(item.id);
}
console.log(item);
// 埋点:去学习、继续学习、复习、去考试、重考
let actionCode = sendBuriedDataMap[item.status];
if(actionCode) {
this.$sendBuriedData({
component_tag: `211#${actionCode}#${this.projectId}`
});
}
},
// 跳转到课程
......@@ -288,13 +255,13 @@ export default {
getActionText(status) {
return actionMap[status];
},
showDialog(introduce) {
Dialog.alert({
title: '说明',
message: introduce,
confirmButtonText: '我知道了',
})
},
// showDialog(introduce) {
// Dialog.alert({
// title: '说明',
// message: introduce,
// confirmButtonText: '我知道了',
// })
// },
changeCollapse(activeNames) {
console.log('activeNames',activeNames);
let param = {
......@@ -451,7 +418,7 @@ export default {
.cell-container {
display: flex;
flex-direction: column;
margin: px2rem(20px) px2rem(15px) px2rem(-28px) px2rem(15px);
margin: px2rem(20px) px2rem(0px) px2rem(-28px) px2rem(0px);
&-item {
position: relative;
display: flex;
......@@ -539,7 +506,7 @@ export default {
// font-family: "PingFangSC-Medium", "PingFangSC", "Microsoft Yahei";
width: px2rem(231px);
font-size: px2rem(15px);
font-weight: 500;
font-weight: 700;
line-height: px2rem(22px);
color: #333333;
float: left;
......
......@@ -3,15 +3,21 @@
<section class="nc-container">
<img
class="nc-container-img"
src="https://pica-pro.oss-cn-shanghai.aliyuncs.com/2019/03/07/cooperation/no-content.png"
src="../../images/cme/no-content.png"
>
<span class="nc-container-text">暂无内容</span>
<span v-if="tabNum == 1" class="nc-container-text">您还未参加CME项目哦~</span>
<span v-if="tabNum == 2" class="nc-container-text">当前无可学CME项目哦~</span>
</section>
</template>
<script>
export default {
name: "no-content",
props: {
tabNum: {
default: 1
}
},
data() {
return {};
}
......@@ -26,7 +32,7 @@ export default {
flex-direction: column;
justify-content: center;
align-content: center;
margin-top: px2rem(20px);
margin-top: px2rem(150px);
margin-bottom: px2rem(20px);
text-align: center;
// margin: 0 auto;
......
......@@ -2,7 +2,7 @@
<div class="dialog-mask-container" v-if="showGoUpdate">
<div class="dialog-mask"></div>
<div class="dialog-container">
<div class="dialog-content">更新至最新版本才能观看视频哦</div>
<div class="dialog-content">更新至最新版本才能观看视频哦更新至最新版本才能观看视频哦</div>
<div class="dialog-footer v-hairline-top">
<span @click.stop.prevent="goUpdateHandler(1)">取消</span>
<span class="confirm-btn v-hairline-left" @click.stop.prevent="goUpdateHandler(2)">立即更新</span>
......
<template>
<div class="basic-container">
<div class="basic-title">基本信息</div>
<div class="content">
<span>项目名称</span>
<span>{{projectNo}}</span>
</div>
<div class="content">
<span>学习收获</span>
<span>{{level}} {{projectCredit}}</span>
</div>
<div class="content">
<span>申请范围</span>
<span>{{scope}}</span>
</div>
<div class="remind" v-if="remind">
<span>{{remind}}</span>
</div>
<div class="content">
<span>起止时间</span>
<span>{{startDate | formatTime('{y}.{m}.{d}')}}{{endDate | formatTime('{y}.{m}.{d}')}}</span>
</div>
<div class="content">
<span>发起机构</span>
<span>{{organName}}</span>
</div>
</div>
</template>
<script>
export default {
props: {
projectNo: {
type: String,
default: "GWKX-20180326-42843"
},
credit: {
type: String,
default: ""
},
level: {
type: String,
default: ""
},
scope: {
type: String,
default: ""
},
startDate: {
type: Number,
default: ""
},
endDate: {
type: Number,
default: ""
},
organName: {
type: String,
default: ""
},
remind: {
type: String,
default: ""
},
projectCredit: {
type: String,
default: ""
}
}
}
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.basic-container {
padding-bottom: px2rem(20px);
margin: px2rem(30px) px2rem(15px) 0px;
border-bottom: px2rem(1px) solid #E7E8E9;
.basic-title {
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #373839;
font-weight: 700;
}
.content {
margin-top: px2rem(16px);
height: px2rem(16px);
line-height: px2rem(0px);
span {
display: inline-block;
font-size: px2rem(14px);
}
span:first-child {
color: #979899;
}
span:last-child {
margin-left: px2rem(15px);
color: #676869;
}
}
.remind {
line-height: px2rem(14px);
margin-top: px2rem(10px);
span {
position: relative;
display: inline-block;
padding: px2rem(5px) px2rem(10px);
margin-left: px2rem(78px);
font-size: px2rem(14px);
color: #FB5B52;
background: #FCEEED;
border-radius: px2rem(4px);
}
span:after {
content: "";
position: absolute;
left: px2rem(10px);
bottom: px2rem(20px);
width: 0;
height: 0;
border-width: 0 px2rem(8px) px2rem(8px);
border-style: solid;
border-color: transparent transparent #FCEEED;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="step-content">
<p class="step-text step1-text" v-if="step1">学习进度{{studyProgress}}</p>
<div class="step-item">
<span :class="{'actived': step1 || step2 || step3 || step4}">1</span>
<p :class="{'actived': step1 || step2 || step3 || step4}">项目学习</p>
</div>
<div class="step-line step-one-line" :class="{'actived': step2 || step3 || step4}"></div>
<p class="step-text step2-text" v-if="step2" @click="applyFor">
立即申请
<img src="../../images/cme/step-right-arrow.png"/>
</p>
<div class="step-item">
<span :class="{'actived': step2 || step3 || step4}">2</span>
<p :class="{'actived': step2 || step3 || step4}">申请学分</p>
</div>
<div class="step-line step-two-line" :class="{'actived': step3 || step4}"></div>
<p class="step-text step3-text" v-if="step3" @click="verifyResult">
{{progressText}}
<img src="../../images/cme/step-right-arrow.png"/>
</p>
<div class="step-item">
<span :class="{'actived': step3 || step4}">3</span>
<p :class="{'actived': step3 || step4}">学分审核</p>
</div>
<div class="step-line step-three-line" :class="{'actived': step4}"></div>
<p class="step-text step4-text" v-if="step4" @click="getScore">
获得{{credit}}
<img src="../../images/cme/step-right-arrow.png"/>
</p>
<div class="step-item">
<span :class="{'actived': step4}">4</span>
<p :class="{'actived': step4}">申请成功</p>
</div>
<!-- 申请学分提示框 -->
<div class="apply-score-content" v-if="showTip">
<div class="lm">
<img src="../../images/cme/hand.png" />
</div>
<div class="title">恭喜您完成该项目学习及考试,快去申请学分</div>
<div class="line"></div>
<div class="rm" @click="closeTip">
<img src="../../images/cme/delete.png" />
</div>
</div>
</div>
</template>
<script>
import { getWebPageUrl, gotoPage } from "@/utils/index";
export default {
props: {
currentProgress: {
type: Number,
default: 0
},
studyProgress: {
type: String,
default: "0%"
},
credit: {
type: String,
default: ""
},
creditId: {
type: Number,
default: 0
},
certificateUrl: {
type: String,
default: ""
},
certificateId: {
type: String,
default: ""
},
projectId: {
type: String,
default: "1"
},
inScope: {
type: Number,
default: 0
}
},
data() {
return {
step1: false,
step2: false,
step3: false,
step4: false,
progressText: "",
showTip: false,
btnDisabled: true
};
},
watch: {
currentProgress(n,o) {
let _this = this;
if(n == 1) { // 项目学习
_this.step1 = true;
_this.step2 = false;
_this.step3 = false;
_this.step4 = false;
}else if(n == 2) { // 申请学分
_this.step1 = false;
_this.step2 = true;
_this.step3 = false;
_this.step4 = false;
_this.showTip = true;
setInterval(() => {
_this.showTip = false;
},5000)
}else if(n == 3) { // 学分审核
_this.step1 = false;
_this.step2 = false;
_this.step3 = true;
_this.step4 = false;
_this.progressText = "审核中";
}else if(n == 4) { // 审核失败
_this.step1 = false;
_this.step2 = false;
_this.step3 = true;
_this.step4 = false;
_this.progressText = "审核失败";
}else if(n == 5 || n == 6) { // 申请成功
_this.step1 = false;
_this.step2 = false;
_this.step3 = false;
_this.step4 = true;
}
}
},
created() {},
methods: {
// 立即申请
applyFor() {
this.$sendBuriedData({
component_tag: `211#211001#${this.projectId}`
});
this.$emit("applicationCredit");
},
// 关闭提示
closeTip() {
this.showTip = false;
},
// 审核
verifyResult() {
if(this.currentProgress == 3) {
this.$sendBuriedData({
component_tag: `211#211003#${this.projectId}`
});
}else if(this.currentProgress == 4) {
this.$sendBuriedData({
component_tag: `211#211005#${this.projectId}`
});
}
gotoPage(this,`cme/#/credit-detail?creditId=${this.creditId}&projectId=${this.projectId}`);
},
// 获得学分--下载证书
getScore() {
let paramList = [
{
key: "className",
value:
"com.picahealth.yunque.activitys.honor.CheckCertificatesActivity###YQWebView",
type: 4,
seqNo: 1
},
{
key: "url",
value: this.certificateUrl,
type: 4,
seqNo: 2
},
{
key: "id",
value: this.certificateId,
type: 4,
seqNo: 3
},
{
key: "navTitle",
value: "学分详情",
type: 4,
seqNo: 4
},
{
key: "isNotTab",
value: true,
type: 4,
seqNo: 5
},
{
key: "isShowDownload",
value: true,
type: 4,
seqNo: 6
}
];
rocNative.dispatchEventByModuleCode({
modeCode: "M200",
jsonString: paramList
});
this.$sendBuriedData({
component_tag: `211#211004#${this.projectId}`
});
}
}
};
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.step-content {
position: relative;
height: px2rem(110px);
background: rgba(248, 249, 250, 1);
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
.step-item {
flex-grow: 1;
text-align: center;
padding-top: px2rem(20px);
line-height: px2rem(20px);
span {
display: inline-block;
width: px2rem(20px);
height: px2rem(20px);
line-height: px2rem(17px);
border-radius: 50%;
background: #676869;
border: 2px solid rgba(255, 255, 255, 1);
color: #fff;
font-size: px2rem(12px);
font-weight: 700;
}
span.actived {
background: #449284;
}
p {
font-size: px2rem(13px);
color: #373839;
}
p.actived {
color: #449284;
}
}
.step-line {
position: absolute;
top: px2rem(58px);
width: px2rem(75px);
height: px2rem(3px);
background: #dadde1;
}
.step-one-line {
left: px2rem(56px);
}
.step-two-line {
left: px2rem(150px);
}
.step-three-line {
right: px2rem(56px);
}
.step-one-line.actived,
.step-two-line.actived,
.step-three-line.actived {
background: #449284;
}
.step-text {
position: absolute;
top: px2rem(25px);
padding: px2rem(4px) px2rem(6px);
background: #449284;
border-radius: px2rem(10px);
font-size: px2rem(12px);
line-height: px2rem(12px);
color: #fff;
img {
display: inline-block;
width: px2rem(6px);
height: px2rem(9px);
padding-left: px2rem(4px);
}
}
.step1-text {
left: px2rem(20px);
}
.step1-text:after {
content: "";
width: px2rem(0px);
height: px2rem(0px);
border-top: px2rem(7px) solid #449284;
border-left: px2rem(7px) solid transparent;
border-right: px2rem(7px) solid transparent;
position: absolute;
top: px2rem(18px);
left: px2rem(21px);
}
.step2-text {
left: px2rem(106px);
}
.step2-text:after,
.step3-text:after {
content: "";
width: px2rem(0px);
height: px2rem(0px);
border-top: px2rem(7px) solid #449284;
border-left: px2rem(7px) solid transparent;
border-right: px2rem(7px) solid transparent;
position: absolute;
top: px2rem(18px);
left: px2rem(29px);
}
.step3-text {
left: px2rem(207px);
}
.step3-text:after {
content: "";
width: px2rem(0px);
height: px2rem(0px);
border-top: px2rem(7px) solid #449284;
border-left: px2rem(7px) solid transparent;
border-right: px2rem(7px) solid transparent;
position: absolute;
top: px2rem(18px);
left: px2rem(21px);
}
.step4-text {
right: px2rem(20px);
}
.step4-text:after {
content: "";
width: px2rem(0px);
height: px2rem(0px);
border-top: px2rem(7px) solid #449284;
border-left: px2rem(7px) solid transparent;
border-right: px2rem(7px) solid transparent;
position: absolute;
top: px2rem(18px);
right: px2rem(20px);
}
.apply-score-content {
display: flex;
position: absolute;
left: px2rem(105px);
top: px2rem(-42px);
background: #000;
opacity: 0.6;
width: px2rem(236px);
height: px2rem(51px);
border-radius: px2rem(6px);
.title {
font-size: px2rem(12px);
color: rgba(255, 255, 255, 1);
margin: px2rem(7px) px2rem(11px) 0 px2rem(0px);
width: px2rem(133px);
}
.lm {
width: px2rem(41px);
img {
display: inline-block;
width: px2rem(20px);
padding: 0 0 px2rem(7px) px2rem(15px);
}
}
.line {
width: px2rem(1px);
height: px2rem(51px);
background: #fff;
opacity: 0.18;
}
.rm {
width: px2rem(41px);
img {
display: inline-block;
width: px2rem(15px);
padding: 0 px2rem(15px) px2rem(7px);
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="common-bottom-info-wrapper">
<div class="common-bottom">
<span>若有问题可联系客服:</span>
<img src="../../images/cme/icon-phone.png" />
<span>400-920-8877</span>
</div>
</div>
</template>
<style lang="scss" scoped>
@import "../../style/mixin";
.common-bottom-info-wrapper {
position: fixed;
width: 100%;
bottom: 0;
left: 0;
margin: 20px auto;
.common-bottom {
display: flex;
display: 100%;
flex-direction: row;
font-size: 14px;
text-align: center;
justify-content: center;
align-items: center;
span {
font-size: 14px;
font-weight: 400;
height: 14px;
line-height: 14px;
color: #676869;
&:nth-child(3) {
color: #449284;
}
}
// span:nth-child(1) {
// color: #449284;
// }
img {
margin-right: 4px;
width: 10px;
height: 12px;
}
}
}
</style>
<template>
<div class="common-button-wrapper button-default" :class="type" @click="btnClick">
<span>{{btnText}}</span>
</div>
</template>
<script>
export default {
props: {
btnText: {
type: String,
default: '确定'
},
type: {
type: String,
default: 'primary'
}
},
data() {
return {
}
},
methods: {
btnClick() {
if(this.type == 'disabled') return;
this.$emit('btnClick');
}
},
}
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.common-button-wrapper {
font-size: px2rem(14px);
margin: px2rem(20px) px2rem(15px);
text-align: center;
&.button-default {
span {
display: block;
height: px2rem(50px);
line-height: px2rem(50px);
width: 100%;
border-radius: px2rem(25px);
font-size: 17px;
font-weight: 700;
color: #FFFFFF;
background: #449284;
}
}
&.primary {
span {
color: #FFFFFF;
background: #449284;
}
}
&.disabled {
span {
color: rgba(255, 255, 255, 0.95);
background: rgba(68, 146, 132, 0.4);;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="common-dialog-wrraper" v-if="isShowDialog">
<div class="dialog-mask"></div>
<div class="dialog-container">
<div class="dialog-content">{{content}}</div>
<div v-show="needSubContent" class="dialog-sub-content" v-html="subContent"></div>
<div class="dialog-footer v-hairline-top">
<span :class="{'single-btn': isSingle}" @click.stop.prevent="handlerAction(1)">{{cancleBtnText}}</span>
<span v-show="!isSingle" class="confirm-btn v-hairline-left" @click.stop.prevent="handlerAction(2)">{{confirmBtnText}}</span>
</div>
</div>
</div>
</template>
<script>
export default {
name: "common-dialog",
data() {
return {
};
},
props: {
content: {
type: String,
default: ''
},
needSubContent: {
type: Boolean,
default: false
},
subContent: {
type: String,
default: ''
},
cancleBtnText: {
type: String,
default: '取消'
},
confirmBtnText: {
type: String,
default: '确定'
},
isShowDialog: {
type: Boolean,
default: false
},
isSingle: {
type: Boolean,
default: false
},
},
methods: {
handlerAction(type) {
this.$emit("handlerAction", type);
}
}
};
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.common-dialog-wrraper {
position: fixed;
top: 0;
left: 0;
bottom: 0;
width: 100%;
height: 100%;
z-index: 2019;
.dialog-mask {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 2020;
}
.dialog-container {
z-index: 2021;
position: absolute;
top: 50%;
left: 50%;
overflow: hidden;
width: px2rem(300px);
font-size: px2rem(18px);
-webkit-transition: 0.3s;
transition: 0.3s;
border-radius: px2rem(4px);
background-color: #fff;
-webkit-transform: translate3d(-50%, -50%, 0);
transform: translate3d(-50%, -50%, 0);
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
.dialog-content {
// margin: px2rem(30px) px2rem(22px);
margin: px2rem(30px);
text-align: center;
font-size: px2rem(18px);
font-weight: 400;
color: #373839;
}
.dialog-sub-content {
margin: px2rem(-16px) px2rem(30px) px2rem(30px);
// margin: px2rem(-16px) px2rem(22px) px2rem(30px);
text-align: left;
font-size: px2rem(14px);
line-height: px2rem(24px);
font-weight: 400;
color: #676869;
}
.dialog-footer {
height: px2rem(50px);
display: flex;
align-items: center;
&.v-hairline-top::after {
border-top-width: 1px;
}
span {
display: inline-block;
// width: 50%;
flex: 1;
height: px2rem(50px);
line-height: px2rem(50px);
font-size: px2rem(17px);
text-align: center;
color: #979899;
&.v-hairline-left::after {
border-left-width: 1px;
}
&.confirm-btn {
color: #449284;
}
&.single-btn {
color: #449284;
}
}
}
}
[class*="v-hairline"] {
position: relative;
&::after {
content: " ";
position: absolute;
pointer-events: none;
box-sizing: border-box;
top: -50%;
left: -50%;
right: -50%;
bottom: -50%;
-webkit-transform: scale(0.5);
transform: scale(0.5);
border: 0 solid #f0f1f2;
}
}
}
</style>
<template>
<div class="item-intro-container">
<div class="basic-title">项目介绍</div>
<div class="content">
<div class="text">{{textContent}}</div>
<div v-if="textContent.length > 70" class="desc" @click="allText">
<span>{{btnText}}</span>
<img v-if="!allTextFlag" src="../../images/down.png"/>
<img v-if="allTextFlag" src="../../images/up.png"/>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
textContent: {
type: String,
default: ''
}
},
data() {
return {
btnText: '详情',
allTextFlag: false
}
},
methods: {
allText() {
let _this = this;
if(!_this.allTextFlag) {
_this.btnText = '收起';
_this.allTextFlag = true;
}else {
_this.btnText = '详情';
_this.allTextFlag = false;
}
_this.$emit("itemIntroText", {allTextFlag: _this.allTextFlag});
}
}
}
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.item-intro-container {
padding-bottom: px2rem(20px);
margin: px2rem(30px) px2rem(15px) 0px;
border-bottom: px2rem(1px) solid #E7E8E9;
.basic-title {
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #373839;
font-weight: 700;
}
.content {
position: relative;
margin-top: px2rem(16px);
.text {
font-size: px2rem(14px);
line-height: px2rem(21px);
color: #676869;
}
.desc {
// position: absolute;
// right: 0;
// bottom: px2rem(1px);
text-align: right;
background: #fff;
line-height: px2rem(14px);
z-index: 99;
span {
font-size: px2rem(14px);
line-height: px2rem(14px);
color: #449284;
}
img {
width: px2rem(12px);
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="item-leader-container">
<div class="basic-title">项目负责人</div>
<div class="leader-info">
<img :src="projectLeader.appImageUrl" />
<div class="leader-text">
<div class="leader-con">
<span>{{projectLeader.name}}</span>
<span class="leader-title">{{projectLeader.title}}</span>
</div>
<div class="address">{{projectLeader.hospital}}</div>
</div>
</div>
<div class="content">
<div class="text">{{leaderText}}</div>
<div v-if="leaderText.length > 70" class="desc" @click="allText">
<span>{{btnText}}</span>
<img v-if="!allTextFlag" src="../../images/down.png" />
<img v-if="allTextFlag" src="../../images/up.png" />
</div>
</div>
</div>
</template>
<script>
export default {
props: {
projectLeader: {
type: Object,
default: () => {}
},
leaderText: {
type: String,
default: ""
}
},
data() {
return {
btnText: "详情",
allTextFlag: false
};
},
methods: {
allText() {
if (!this.allTextFlag) {
this.btnText = "收起";
this.allTextFlag = true;
} else {
this.btnText = "详情";
this.allTextFlag = false;
}
this.$emit("changeLeaderText",{allTextFlag: this.allTextFlag});
}
}
};
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.item-leader-container {
padding-bottom: px2rem(20px);
margin: px2rem(30px) px2rem(15px) 0px;
border-bottom: px2rem(1px) solid #e7e8e9;
.basic-title {
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #373839;
font-weight: 700;
}
.leader-info {
display: flex;
flex-direction: row;
margin-top: px2rem(16px);
img {
display: inline-block;
width: px2rem(44px);
height: px2rem(44px);
border-radius: 50%;
}
.leader-text {
margin-left: px2rem(16px);
margin-top: px2rem(6px);
.leader-con {
line-height: px2rem(14px);
display: flex;
flex-direction: row;
span {
font-size: px2rem(16px);
color: #676869;
}
span:first-child {
font-size: px2rem(16px);
color: #373839;
font-weight: 700;
}
.leader-title {
width: px2rem(220px);
overflow : hidden;
text-overflow: ellipsis;
white-space:nowrap;
line-height: px2rem(16px);
margin-left: px2rem(10px);
}
}
.address {
margin-top: px2rem(5px);
font-size: px2rem(13px);
color: #979899;
width: px2rem(240px);
overflow : hidden;
text-overflow: ellipsis;
white-space:nowrap;
}
}
}
.content {
position: relative;
margin-top: px2rem(16px);
.text {
font-size: px2rem(14px);
line-height: px2rem(21px);
color: #676869;
}
.desc {
// position: absolute;
// right: 0;
// bottom: px2rem(1px);
text-align: right;
background: #fff;
line-height: px2rem(14px);
z-index: 99;
span {
font-size: px2rem(14px);
color: #449284;
}
img {
width: px2rem(12px);
}
}
}
}
</style>
\ No newline at end of file
<template>
<div class="learn-know-container">
<div class="basic-title">学习须知</div>
<div class="content">
<span v-html="mustKnow"></span>
</div>
</div>
</template>
<script>
export default {
props: {
mustKnow: {
type: String,
default: ''
}
}
}
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.learn-know-container {
margin: px2rem(30px) px2rem(15px) px2rem(20px);
.basic-title {
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #373839;
font-weight: 700;
}
.content {
margin-top: px2rem(16px);
line-height: px2rem(21px);
span {
display: inline-block;
font-size: px2rem(14px);
color: #676869;
}
}
}
</style>
\ No newline at end of file
<template>
<div class="teacter-intro-container">
<div class="basic-title">讲师介绍</div>
<div class="leader-info" v-for="(item,index) in doctorList" :key="index">
<img :src="item.appImageUrl"/>
<div class="leader-text">
<div class="leader-con">
<span>{{item.name}}</span>
<span class="leader-title">{{item.title}}</span>
</div>
<div class="address">{{item.hospital}}</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
doctorList: {
type: Array,
default: () => []
}
},
data() {
return {
}
},
created() {
},
mounted() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.teacter-intro-container {
margin: px2rem(30px) px2rem(15px) 0px;
.basic-title {
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #373839;
font-weight: 700;
}
.leader-info {
display: flex;
flex-direction: row;
margin-top: px2rem(16px);
padding-bottom: px2rem(16px);
img {
display: inline-block;
width: px2rem(44px);
height: px2rem(44px);
border-radius: 50%;
}
.leader-text {
margin-left: px2rem(16px);
margin-top: px2rem(6px);
.leader-con {
line-height: px2rem(14px);
display: flex;
flex-direction: row;
span {
font-size: px2rem(16px);
color: #676869;
}
span:first-child {
font-size: px2rem(16px);
color: #373839;
font-weight: 700;
}
.leader-title {
width: px2rem(220px);
overflow : hidden;
text-overflow: ellipsis;
white-space:nowrap;
line-height: px2rem(16px);
margin-left: px2rem(10px);
}
}
.address {
margin-top: px2rem(5px);
font-size: px2rem(13px);
color: #979899;
width: px2rem(240px);
overflow : hidden;
text-overflow: ellipsis;
white-space:nowrap;
}
}
}
}
</style>
\ No newline at end of file
<template>
<div>
<div class="desc-title" v-show="isShowTitle">
<span>{{descTitle}}</span>
<div class="desc-container">
<div class="desc-title">
<span>{{projectName}}</span>
</div>
<div class="desc-detail">
<span class="desc_text" v-html="message"></span>
<!-- <CommonSpliteLine></CommonSpliteLine> -->
<div class="split-line"></div>
<div class="desc_text_tp" @click="showDesc()">
<span v-show="!isShowFlag">显示全部</span>
<span v-show="isShowFlag">收起</span>
</div>
<span class="desc_text" v-if="studyNum && subject">{{newStudyNum}}人已学/{{subject}}</span>
</div>
</div>
</template>
......@@ -20,109 +14,80 @@ export default {
name: "common-description",
data() {
return {
isShowFlag: false
};
},
computed: {
CommonSpliteLine
},
props: {
isShowTitle: {
type: Boolean,
default: true
},
descTitle: {
projectName: {
type: String,
default: ""
},
value: {
studyNum: {
type: Number,
default: 0
},
subject: {
type: String,
default: ""
}
},
created() {},
mounted() {},
computed: {
message: function() {
// return this.isShowFlag
// ? '<span style="color: red;">简介</span>' + this.value
// : '<span style="color: red;">简介</span>' +
// this.value.slice(0, 34) +
// "...";
let shortMsg = this.value || "";
if (shortMsg.length > 63) {
shortMsg = this.value.slice(0, 63) + "...";
newStudyNum: function() {
if(this.studyNum > 1000 && this.studyNum < 10000) {
return (this.studyNum / 1000 + 'K');
}else if(this.studyNum > 10000) {
return (this.studyNum / 10000 + 'W');
}else {
return this.studyNum;
}
return this.isShowFlag ? this.value : shortMsg;
}
},
created() {},
mounted() {
},
methods: {
showDesc() {
this.isShowFlag = !this.isShowFlag;
}
}
};
</script>
<style lang="scss" scoped>
@import "../../style/mixin";
.desc-title {
display: flex;
padding: px2rem(15px);
padding-bottom: 0px;
line-height: px2rem(22px);
font-weight: 700;
color: rgba(51, 51, 51, 1);
span {
font-family: "PingFangSC-Medium", "PingFangSC", "Microsoft Yahei";
font-size: px2rem(18px);
.desc-container {
padding: px2rem(20px) px2rem(15px);
.desc-title {
display: flex;
padding-bottom: 0px;
line-height: px2rem(22px);
font-weight: 700;
span {
font-family: "PingFangSC-Medium", "PingFangSC", "Microsoft Yahei";
font-size: px2rem(18px);
font-weight: 700;
color: #333333;
}
}
.desc-detail {
display: flex;
position: relative;
word-break: normal;
// margin-bottom: px2rem(40px);
// height: px2rem(60px);
.desc_text {
padding-top: px2rem(6px);
font-size: px2rem(13px);
color: #676869;
line-height: px2rem(25px);
letter-spacing: 1px;
word-wrap: break-word;
word-break: break-all;
// word-break: normal;
text-align: justify;
flex-direction: row;
flex-wrap: wrap;
}
}
}
.desc-detail {
display: flex;
position: relative;
word-break: normal;
margin-bottom: px2rem(40px);
// height: px2rem(60px);
}
.display-none {
position: fixed;
top: 0;
visibility: hidden;
}
.desc_text {
padding: px2rem(15px);
padding-top: px2rem(6px);
font-size: px2rem(14px);
color: #999999;
line-height: px2rem(25px);
letter-spacing: 1px;
word-wrap: break-word;
word-break: break-all;
// word-break: normal;
text-align: justify;
flex-direction: row;
flex-wrap: wrap;
}
.desc_text_tp {
position: absolute;
left: 0;
bottom: px2rem(-30px);
// left: 50%;
// transform: translateX(px2rem(-32px));
width: 100%;
text-align: center;
font-size: px2rem(16px);
font-weight: 700;
color: #cccccc;
// border-top: 1px solid #f1f1f1;
}
.split-line {
display: flex;
width: 92%;
position: absolute;
left: 4%;
bottom: px2rem(0px);
border-bottom: 0.5px solid #f1f1f1;
}
</style>
<template>
<section :class="isFixNavbar ? 'nav-top fixed' : 'nav-top'" :style="'height:' + navHeight">
<section v-if="!isWeb" :class="isFixNavbar ? 'nav-top fixed' : 'nav-top'" :style="'height:' + navHeight">
<!-- <section v-if="isWeb" :class="isFixNavbar ? 'nav-top fixed' : 'nav-top'"> -->
<div
class="nav-part"
......@@ -14,11 +14,11 @@
<!-- <img class="nav-back" src="../../images//grey-throw.png"/> -->
</span>
<span class="nav-title-title" v-show="bgColor!=='none'">{{title}}</span>
<span v-show="isShowShare" class="nav-share" @click="goShare">
<img
src="https://pica-pro.oss-cn-shanghai.aliyuncs.com/eagle_plan/courses/Group17_hover%403x.png"
<span v-if="isShowShare" class="nav-share" @click="goShare">
<img v-show="isBlack"
src="../../images/cme/share-icon-black.png"
>
<!-- <img src="../../images/share-icon.png"/> -->
<img v-show="!isBlack" src="../../images/cme/share-icon-white.png"/>
</span>
</div>
</div>
......@@ -71,6 +71,14 @@ export default {
isBlack: {
type: Boolean,
default: true
},
shareTitle: {
type: String,
default: ""
},
shareTitleInfo: {
type: String,
default: ""
}
},
computed: {
......@@ -121,9 +129,9 @@ export default {
// shareImageUrl: '_this.shareImageUrl'
type: 6,
shareId: 0,
shareUrl: 'shareUrl',
title1: "this.shareTitle1",
title2: "this.shareTitle2",
shareUrl: url,
title1: _this.shareTitle,
title2: _this.shareTitleInfo,
shareImageUrl: "https://file.yunqueyi.com/logo.png?version=" + new Date().getTime()
});
}
......
......@@ -8,11 +8,16 @@ import '@/utils/rem' // 引入自适应
import '@/utils/yqy-bridge' // 移动端服务
// import FastClick from 'fastclick'
import vueFilters from '@/utils/filter'
// import VConsole from 'vconsole/dist/vconsole.min.js'
// if(!(process.env.BUILD_ENV === 'uat' || process.env.BUILD_ENV === 'pro')) {
import VConsole from 'vconsole/dist/vconsole.min.js'
import BuriedPoint,{ sendBuriedData} from 'web-buried-point';
import Vant from 'vant';
import 'vant/lib/index.css';
if(!(process.env.BUILD_ENV === 'uat' || process.env.BUILD_ENV === 'pro')) {
// if(!(process.env.BUILD_ENV === 'pro')) {
// let vConsole = new VConsole() // 初始化
// }
let vConsole = new VConsole() // 初始化
}
// 可调试
// Vue.config.devtools = true;
......@@ -53,7 +58,6 @@ Vue.mixin({
})
// import './plugins';
import BuriedPoint,{ sendBuriedData} from 'web-buried-point';
// import { buriedURL } from './apiConfig';
let domain = '';
if (process.env.BUILD_ENV === 'prod') {
......@@ -69,13 +73,11 @@ if (process.env.BUILD_ENV === 'prod') {
}
Vue.use(BuriedPoint, {
class_name: `web_app_cooperation`,
class_name: 'web_app_cme',
url: `${domain}/file/log/trace1`
});
Vue.prototype.$sendBuriedData = sendBuriedData;
import Vant from 'vant';
import 'vant/lib/index.css';
Vue.use(Vant);
new Vue({
......
......@@ -5,6 +5,10 @@ const complist = r => require.ensure([], () => r(require('../views/component-det
const cooplist = r => require.ensure([], () => r(require('../views/cooperation-details')), 'cooplist')
const parent = r => require.ensure([], () => r(require('../views/parent-page')), 'parent')
const merge = r => require.ensure([], () => r(require('../views/merge-detail')), 'merge')
const test = r => require.ensure([], () => r(require('../views/test-components')), 'test-components')
const creditedit = r => require.ensure([], () => r(require('../views/credit-edit')), 'credit-edit')
const creditdetail = r => require.ensure([], () => r(require('../views/credit-detail')), 'credit-detail')
const excgtips = r => require.ensure([], () => r(require('../views/exchange-tips')), 'exchange-tips')
export default [{
path: '/',
......@@ -38,5 +42,22 @@ export default [{
path: '/coop',
component: merge
},
{
path: '/test',
component: test
},
{
path: '/credit-edit',
component: creditedit
},
{
path: '/credit-detail',
component: creditdetail
},
{
path: '/excg-tips',
component: excgtips
},
]
}]
......@@ -12,8 +12,8 @@ body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, l
font-style: normal;
text-decoration: none;
border: none;
font-size: px2rem(14px);
color: #333;
// font-size: px2rem(14px);
// color: #333;
font-weight: normal;
// font-family: "PingFangSC-Medium", "PingFangSC", "Microsoft Yahei";
font-family: "PingFangSC-Regular","-apple-system-font","Source Han Sans","Helvetica Neue","sans-serif";
......@@ -139,4 +139,7 @@ html,body{
border: 0 solid #F0F1F2;
}
}
// .van-toast__text {
// color: #fff !important;
// }
......@@ -82,4 +82,31 @@
}
.fs30{
font-size: px2rem(15px);
}
.van-cell {
padding: px2rem(17px) px2rem(15px) !important;
font-size: px2rem(15px) !important;
color: #373839 !important;
}
.van-cell:not(:last-child)::after {
left: 0 !important;
}
.van-field__control {
text-align: right !important;
}
// .van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
// border-width: px2rem(1px) 0 !important;
// }
// .van-hairline, .van-hairline--surround, .van-hairline--top, .van-hairline--top-bottom {
// position: inherit !important;
// }
// .van-hairline--top {
// }
// .van-field__label, .van-field__body {
// height: px2rem(15px) !important;
// line-height: px2rem(15px) !important;
// }
.van-cell__title span {
font-weight: 700 !important;
}
\ No newline at end of file
......@@ -7,17 +7,17 @@ export const envConfig = {
// baseUrl: 'https://dev-sc.yunqueyi.com/',
// baseUrl: 'http://10.177.15.180:10202/',
// baseUrl: 'http://192.168.140.14:10201/',
// apiUrl: 'https://dev-api.yunqueyi.com/',
// webPageUrl: 'https://dev-phome.yunqueyi.com/',
// baseUrl: 'https://dev-sc.yunqueyi.com/',
apiUrl: 'https://dev-api.yunqueyi.com/',
webPageUrl: 'https://dev-phome.yunqueyi.com/',
baseUrl: 'https://test1-sc.yunqueyi.com/',
// baseUrl: 'https://test1-sc.yunqueyi.com/',
// apiUrl: 'https://test1-api.yunqueyi.com/',
// webPageUrl: 'https://test1-phome.yunqueyi.com/'
baseUrl: 'https://uat-sc.yunqueyi.com/',
apiUrl: 'https://uat-api.yunqueyi.com/',
webPageUrl: 'https://uat-phome.yunqueyi.com/'
// baseUrl: 'https://uat-sc.yunqueyi.com/',
// apiUrl: 'https://uat-api.yunqueyi.com/',
// webPageUrl: 'https://uat-phome.yunqueyi.com/'
// baseUrl: 'https://sc.yunqueyi.com/',
// apiUrl: 'https://api.yunqueyi.com/',
......
......@@ -11,13 +11,15 @@ const service = axios.create({
// request拦截器
service.interceptors.request.use(config => {
// debugger
if (config.data && config.data.setEntry) {
config.headers['sysCode'] = config.data.sysCode || 10
if(config.data.token){
config.headers['token'] = config.data.token || '0F32D60C3D7042158BCF1FB574E482BE'
if( process.env.BUILD_ENV == "development" ){ // 本地开发环境
config.headers['token'] = '11B8076631AE45999D350EC08A7E66AE';
config.headers['token'] = config.data.token || 'DA2A4E43343E47DEB4C4B708288D02D4' || 'F5CE3BAEC4934864B1022C1C4D39EB40';
}
// delete config.data.token;
}
config.headers['deviceInfo'] = JSON.stringify({ "app_channel": "", "app_mac": "", "app_uuid": "", "app_version": "", "device_brand": "", "device_ip": "", "device_model": "", "device_net": "", "device_ops": "", "resolution_wh": "", "system_level": "", "device_type": '10' })
......
......@@ -25,8 +25,8 @@ function getConfigByEnvType(urlType) {
// 日期与时间解析函数
export function parseTime(time, cFormat) {
if (arguments.length === 0) {
return null
if (arguments.length === 0 || !time) {
return ''
}
const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
let date
......@@ -117,4 +117,25 @@ export function deepCopy(obj) {
export function mergeObjs(...ojbs){
}
// 跳转:在App中使用原生跳转,在浏览器中使用本地路由跳转
export function gotoPage(context, pageUrl) {
if(__isWeb) {
context.$router.push(pageUrl)
// context.$router.push({path: pageUrl, query: query});
} else {
let paramList = [
{
key: "pageUrl",
value: getWebPageUrl(pageUrl),
type: 4,
seqNo: 1
}
];
rocNative.dispatchEventByModuleCode({
modeCode: "M300",
jsonString: paramList
});
}
}
\ No newline at end of file
......@@ -4,26 +4,16 @@ import { getBaseUrl, getApiUrl } from '@/utils/index'
module.exports = {
data: function () {
return {
// isIpx: Utils.env.isIPhoneX(),//是不是iphoneX
// isAndroid: Utils.env.isAndroid(),
// isIOS: false,
// isWeb: false,
token: null
}
},
created: function () {
// let query = (this.$router && this.$router.query) || {};
// let query = this.$router.query
let query;
if(this.$router !== undefined) {
query = this.$router.query
if (this.$route !== undefined) {
query = this.$route.query
}
// this.token = this.getUrlSearch(location.href, 'token') || (query && query.token) || null
// this.token = this.getUrlKey('token') || (query && query.token) || '1540EC1ECF7042CFA7F43363A72A7C81'
// this.token = this.getUrlKey('token') || (query && query.token) || '40C891A41D774DAEABF809071BD4B3BF'
// this.token = this.getUrlKey('token') || (query && query.token) || '5782BC5A96A44C2E8B1EC48F54462A6E'
this.token = this.getUrlKey('token') || (query && query.token) || '006EAC5D201B4547A27C842505F0E368'
// alert('this.token' + this.token)
this.token = this.getUrlKey('token') || (query && query.token) || '9B62E5874DA94979A54DB3E9DFC1443F'
},
mounted() {
......@@ -44,16 +34,16 @@ module.exports = {
return ''
},
// 埋点
pageBurialPoin(options){
pageBurialPoin(options) {
rocNative.appBuryingPointEntrust(options)
},
setRouterParm(paramList){
setRouterParm(paramList) {
let parm = {};
if(paramList.length<=1){
if (paramList.length <= 1) {
return '';
}
for(let i=1;i<paramList.length;i++){
for (let i = 1; i < paramList.length; i++) {
parm[paramList[i].key] = paramList[i].value;
}
return parm;
......@@ -61,12 +51,12 @@ module.exports = {
// 拼接多个参数
getUrlParmByCode(paramList) {
if ( paramList.length <= 1) {
if (paramList.length <= 1) {
return ''
}
let dataStr = ''
let list = [];
for( let i = 1; i < paramList.length; i ++) {
for (let i = 1; i < paramList.length; i++) {
list.push(paramList[i].key + '=' + paramList[i].value)
}
dataStr = list.join('&')
......@@ -83,57 +73,17 @@ module.exports = {
return d;
},
// 根据条件排序
async searchForOrder(searchCategory = '1', searchValue = '', sortItem = 1, pageSize = 10, sourceData = []) {
if(pageSize <=0 ) return;
let str2 = (searchValue || '').replace(/[\-\_\,\!\|\~\`\(\)\#\$\%\^\&\*\{\}\:\;\"\L\<\>\?]/g, '');// 去掉特殊字符
let _this = this,
para = {
searchCategory: searchCategory,
searchValue: str2,
keywordColor: 'rgba(244,122,72,1)',
sortItem: sortItem,
pageNo: 1,
pageSize: pageSize,
token: _this.token,
setEntry: 'headers',
}
let url = 'contents/searchKeyword/searchContent'
let csourceData = await this.GET(url, para).then(res => {
// _this.searchText = ''
if (res.code == '000000') {
// 课程
if(searchCategory.indexOf('1') >= 0) {
sourceData = (res.data && res.data.contentAppModels) || []
}
if(searchCategory.indexOf('2') >= 0) {
// sourceData = []
sourceData = this.handelFive(res.data.fiveMinutesMedicalContentList || [])
}
if(searchCategory.indexOf('3') >= 0) {
sourceData = (res.data && res.data.pCourseDoctorModels) || []
}
if(searchCategory.indexOf('4') >= 0) {
sourceData = res.data.educationContents
}
}
return sourceData || []
})
return csourceData
},
setEventByModuleCode(itemData){
setEventByModuleCode(itemData) {
let modeCode = itemData.appModuleInfo.code || '';
let paramList = itemData.appModuleInfo.paramList ? itemData.appModuleInfo.paramList : ''
if( modeCode === 'M001' || modeCode === 'M002' || modeCode === 'M003') {
if (modeCode === 'M001' || modeCode === 'M002' || modeCode === 'M003') {
paramList = ''
}else if( modeCode === 'M100' || modeCode === 'M300' ) {
} else if (modeCode === 'M100' || modeCode === 'M300') {
// 支持多个参数
let urlPara = this.getUrlParmByCode(paramList);
if(paramList[0]){
if( paramList[0].value.indexOf("?") == -1){
if (paramList[0]) {
if (paramList[0].value.indexOf("?") == -1) {
paramList[0].value += urlPara
}
}
......@@ -142,23 +92,24 @@ module.exports = {
let v = paramList[0]['value'];
let query = this.setRouterParm(paramList);
paramList = [{
url:v,
query:query
url: v,
query: query
}]
this.$router.push({
path: v,
query: query
})
return 'NO'
return 'NO'
}
if(typeof paramList === 'string' && !paramList){
if (typeof paramList === 'string' && !paramList) {
paramList = []
}
return paramList;
},
// 通用GET请求
GET(api, para, callback,str) {
GET(api, para, callback, str) {
// debugger
para.token = para.token || this.token || '006EAC5D201B4547A27C842505F0E368'
let url = api + this.getUrlPara(para)
return fetch({
......@@ -168,7 +119,7 @@ module.exports = {
})
},
NEW_GET(api, para, callback,str) {
NEW_GET(api, para, callback, str) {
para.token = para.token || this.token || '006EAC5D201B4547A27C842505F0E368'
let url = api + this.getUrlPara(para)
return fetch({
......@@ -179,7 +130,7 @@ module.exports = {
},
// 通用GET2请求
GET2(api, para, callback,str) {
GET2(api, para, callback, str) {
para.token = para.token || this.token || '4B43CD3CD5DB4979AC1B5B3F508391CA'
// let url = api + this.getUrlPara(para)
// let url = 'http://192.168.140.38:12801' + api
......@@ -210,7 +161,7 @@ module.exports = {
data: para
})
},
// 通用GET请求
API_GET(api, para, callback) {
para.token = para.token || this.token || '00175A13D70D4234822D90AC3C74202C' //'AF3DFCF2DD4B4115AC47ACA25D5420E9''F90DF48D3EFA49DFAE1267A67DBEFB18'//token
......
......@@ -4,38 +4,9 @@
e.rocNative = {
// 参数说明 e:回传回来的移动端服务名称; t:前端自己传递的回调JS方法
__nativeCall: function (e, t, n) {
// if(t == '__refresh'){
// console.log('!__refresh: ',t,n);
// __refresh(n);
// // return;
// }
if( window[t] ){
if (window[t]) {
window[t](n)
}
// if(t == '__getUserInfo64Comp') {
// __getUserInfo64Comp(n);
// }
// if(t == '__getUserInfo'){
// __getUserInfo(n);
// // return;
// }
// if(t == '__getUserInfo4Comp'){
// __getUserInfo4Comp(n);
// // return;
// }
// if(t == '__getUserInfo4Coop'){
// __getUserInfo4Coop(n);
// // return;
// }
// if (t == '__sendBuriedPoint') {
// __sendBuriedPoint(n);
// // return
// }
// if (t == '__openErrorDebug') {
// __openErrorDebug(n);
// // return
// }
},
__callNative: function (t, a, o) {
"function" == typeof o && (n++ , i[n] = o);
......@@ -82,7 +53,7 @@
})
}
})
}("gotoLogin", "dispatchEventByModuleCode", "gotoAuthentication", "shareWechat", "backPreviousPage", "bindingWechat", "getDeviceInfo", "goBack", "appBuryingPointEntrust", "getAuthPermission", "getAppVersionCode", "getToken", "gotoNewActivity", "gotoNewActivityWithParams", "gotoNewWebActivity", "gotoYidianActivity", "readMessage", "openFiveMintusAudio", "getStatusBarSize", "showNativeDialog", "showNativeToast", "gotoViewTop", "appInit", "checkPermissions", "getStatusBarHeight", "setTabMiniIcon", "getUserInfo", "pauseAudioView", "sendBuriedPoint", "openErrorDebug", "upGradeVersion","getLocalData");
}("gotoLogin", "dispatchEventByModuleCode", "gotoAuthentication", "shareWechat", "backPreviousPage", "bindingWechat", "getDeviceInfo", "goBack", "appBuryingPointEntrust", "getAuthPermission", "getAppVersionCode", "getToken", "gotoNewActivity", "gotoNewActivityWithParams", "gotoNewWebActivity", "gotoYidianActivity", "readMessage", "openFiveMintusAudio", "getStatusBarSize", "showNativeDialog", "showNativeToast", "gotoViewTop", "appInit", "checkPermissions", "getStatusBarHeight", "setTabMiniIcon", "getUserInfo", "pauseAudioView", "sendBuriedPoint", "openErrorDebug", "upGradeVersion", "getLocalData");
if (e.__rocAndroid) {
e.__isAndroid = true
e.__isIOS = false
......@@ -96,7 +67,7 @@
e.__isIOS = false
e.__isWeb = true
}
if(window.__isIOS){
if (window.__isIOS) {
rocNative.appInit()
}
}(window);
此差异已折叠。
<!-- 学分:个人信息编辑页面 -->
<template>
<section class="credit-edit-wrapper">
<CommonNavbar
:bgColor="bgColor"
v-show="isShowNavbar"
:isBlack="isBlack"
:title="navTitle"
:isFixNavbar="isFixNavbar"
:burialPoint="pointStyle"
borderStyle="0px solid #fff"
:backMethod="from"
></CommonNavbar>
<van-cell-group class="group">
<van-field label-width="150" disabled v-model="formData.name" label="姓名" placeholder="" />
<van-field label-width="150" v-model="formData.idCardNumber" label="身份证号" maxlength=18 placeholder="请填写您的真实身份证号" />
<van-field label-width="150" v-model="formData.icCardNumber" label="继续医学教育IC卡号" maxlength=9 placeholder="请填写您的IC卡号" />
</van-cell-group>
<div class="tips">
您的身份证号将用于生成项目学分证书对应的编号,请确保您所填写的身份证号的真实性
</div>
<CommonButton :type="buttonStyleType" @btnClick="applyCredit" btnText="提交"></CommonButton>
<CommonDialog content="提交成功" subContent="您可在“个人中心-证书与学分”中查看审核结果" cancleBtnText="我知道了" isSingle needSubContent :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog>
</section>
</template>
<script>
import CommonNavbar from "@/components/common/common-navbar";
import CommonButton from "@/components/cme/common-button";
import CommonDialog from "@/components/cme/common-dialog";
export default {
components: {
CommonNavbar,
CommonButton,
CommonDialog
},
data() {
return {
formData: {
creditId: "",
id: "",
name: "",
idCardNumber: "",
icCardNumber: "",
},
// projectId: "",
token: "9B62E5874DA94979A54DB3E9DFC1443F",
buttonStyleType: 'disabled',
from: "native",
isBlack: true,
bgColor: "#fff",
navTitle: "申请学分",
isShowNavbar: true,
isFixNavbar: false,
pointStyle: "activity",
isShowDialog: false,
creditId: 0
};
},
watch: {
formData: {
handler(newVal) {
let idCardReg = /^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/;
let icCardReg = /^[a-zA-Z0-9]{9}$/;
if(newVal.name && newVal.idCardNumber && newVal.icCardNumber
&& idCardReg.test(newVal.idCardNumber)
&& icCardReg.test(newVal.icCardNumber)) {
this.buttonStyleType = 'primary';
} else {
this.buttonStyleType = 'disabled';
}
},
deep: true
}
},
created() {
let _this = this;
window.__getUserInfoInCEdit = function(param) {
_this.token = param.userToken;
_this.getUserInfoByToken();
_this.getLatestApplyRecord();
};
window.__refresh = function() {
_this.getUserInfo();
};
// 前一页面传creditId
// this.projectId = this.$route && this.$route.query && this.$route.query.projectId || '';
this.from = this.$route && this.$route.query && this.$route.query.from || this.from;
this.creditId = this.$route && this.$route.query && this.$route.query.creditId || this.creditId;
// this.formData.id = this.projectId;
this.formData.creditId = this.creditId;
this.token = this.$route && this.$route.query && this.$route.query.token || this.token || ''
if (__isWeb) {
this.getUserInfoByToken();
this.getLatestApplyRecord();
} else {
this.getUserInfo()
}
},
methods: {
getUserInfo() {
rocNative.getUserInfo({
__funcName: "__getUserInfoInCEdit"
});
},
// 提交申请
applyCredit() {
let param = {
...this.formData,
token: this.token,
setEntry: true
};
this.POST("cme/credit/apply", param).then(res => {
if(res.code == '000000') {
this.isShowDialog = true
} else {
this.$toast({message: res.message});
}
})
},
// 最后一次提交信息:获取用户的idCardNumber
getLatestApplyRecord() {
let param = {
token: this.token,
setEntry: true
};
this.POST("cme/credit/latestApplyRecord/" + this.creditId, param).then(res => {
this.formData.icCardNumber = res.data.icCardNumber;
})
},
// 根据token获取用户信息
getUserInfoByToken() {
let param = {
token: this.token,
setEntry: true
};
this.GET("cme/credit/doctor/info", param).then(res => {
this.formData.name = res.data.name;
this.formData.idCardNumber = res.data.card;
// this.isShowDialog = true
})
},
// 显示提交成功的提示信息
handlerDialogAction(type) {
this.isShowDialog = false;
// 跳转到前一页面
if (window.__isWeb) {
this.$router.back(-1);
} else {
rocNative.goBack();
}
},
},
};
</script>
<style lang="scss">
@import "../style/mixin";
.credit-edit-wrapper {
.group {
margin: 10px 15px;
}
.tips {
margin: px2rem(10px) px2rem(15px) px2rem(50px);
font-weight: 400;
font-size: px2rem(14px);
line-height: px2rem(21px);
color: #979899;
}
.van-cell__title .van-field__label {
line-height: px2rem(30px) !important;
height: px2rem(20px) !important;
}
.van-cell {
padding: px2rem(20px) 0 !important;
font-size: px2rem(15px) !important;
color: #373839 !important;
}
.van-cell__title span {
font-weight: 400 !important;
}
.van-field__body {
line-height: px2rem(30px) !important;
height: px2rem(20px) !important;
}
.van-field__control {
padding-top: px2rem(8px) !important;
line-height: px2rem(20px) !important;
font-size: px2rem(15px);
}
}
</style>
\ No newline at end of file
<template>
<div>
<header class="header">
<span>兑换须知</span>
<!-- <img src="../images/cme/close.png" alt=""> -->
</header>
<div class="exchange-tips-wrapper fixed">
<div class="content">
<p class="title">一、云鹊医课程的版权归属何方?</p>
<p class="text">云鹊医平台所有的在线课程版权归云鹊医所有,任何以录屏或其它方式进行的盗版或盗版售卖行为均属侵权行为,一经发现,云鹊医将采取最严厉的措施进行打击并维权,包括但不限于:起诉侵权人、发函侵权人学校或单位、云鹊医全平台公示侵权人所有信息、在一定时间内或永久限制该侵权人购买、观看课程的权利。</p>
<p class="title">二、我应该如何兑换课程?</p>
<p class="text">点击课程页面上的“点击兑换”,即可通过云鹊豆兑换等值的课程。如果云鹊豆不足,可以通过云鹊豆中心的任务列表赚取。目前仅支持完整课程的兑换,暂不支持单独章节的兑换。在云鹊豆系统上线以前、用户已经加入学习的课程不受影响。</p>
<p class="title">三、兑换课程以后如何看课?</p>
<p class="text">打开云鹊医app,进入“个人中心”- “我的课程”,在“学习中”即可看到兑换成功的课程。课程兑换成功以后,用户可以永久收看该门课程。</p>
<p class="title">四、我兑换课程以后后悔了,可以退课吗?</p>
<p class="text">目前云鹊医平台不支持通过云鹊豆兑换的课程退货,即不支持退回云鹊豆的动作,所以请在兑换成功前自行确认是否要用云鹊豆兑换该课程。对于用户自主消费云鹊豆的行为产生的云鹊豆减少,云鹊医平台不作后续处理。</p>
<p class="title">五、其它提示:</p>
<p class="text">由于学员较多,如有问题请直接留言,客服会在24小时以内回复,请谅解。 如果事件过于紧急,请联系云鹊医客服电话:4009208877。</p>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
@import "../style/mixin";
.header {
width: 100%;
position: fixed;
top: 0;
left: 0;
text-align: center;
padding: px2rem(26px) 0 px2rem(20px);
font-size: px2rem(18px);
line-height: px2rem(18px);
color: #333333;
background: #fff;
// img {
// position: absolute;
// right: px2rem(20px);
// width: px2rem(13px);
// height: px2rem(13px);
// }
}
.exchange-tips-wrapper {
padding-top: px2rem(40px);
margin: px2rem(20px);
font-size: px2rem(16px);
.content {
.title {
line-height: px2rem(18px);
font-weight: 700;
color: #373839;
margin: px2rem(12px) 0;
}
.text {
color: #676869;
// text-align-last: justify;
text-align: justify;
}
}
}
</style>
\ No newline at end of file
......@@ -22,7 +22,7 @@
<td @click="changeTab(2)" :class="{'active': tabIndex === 2}">
<div class="tap-title">
<!-- <span>其它项目</span> -->
<span :style="{'color': tabIndex === 2 ? '#333' : '#999'}">其它项目</span>
<span :style="{'color': tabIndex === 2 ? '#333' : '#999'}">全部项目</span>
<span></span>
</div>
</td>
......@@ -30,10 +30,20 @@
</table>
<article class="page-content-list">
<section v-if="tabIndex === 1">
<CoopListItem :paramData="joinProjectList" :coopType="1" :tabTo="1" :isShow="isShow"></CoopListItem>
<CoopListItem
:paramData="joinProjectList"
:coopType="1"
:tabTo="1"
:isShow="isShow"
:userMobile="userMobile"></CoopListItem>
</section>
<section v-if="tabIndex === 2">
<CoopListItem :paramData="otherProjectList" :coopType="1" :tabTo="2" :isShow="isShow"></CoopListItem>
<CoopListItem
:paramData="otherProjectList"
:coopType="1"
:tabTo="2"
:isShow="isShow"
:userMobile="userMobile"></CoopListItem>
</section>
</article>
</section>
......@@ -58,15 +68,15 @@ export default {
showLoading: false,
bgColor: "#fff",
isShow: false,
navTitle: "专项合作",
navTitle: "CME项目",
compTitle: "组件名称",
isShowNavbar: true,
isFixNavbar: false,
pointStyle: "activity",
descTitle: "规定从何处开始选取。如果是负数",
tabIndex: 1,
joinProjectList: [],
otherProjectList: [],
joinProjectList: [], // 我的项目
otherProjectList: [], // 全部项目
token: "",
toastTitle: "",
userMobile: ""
......@@ -96,11 +106,18 @@ export default {
_this.getCoopData();
}
window.__refresh = function() {
_this.tabIndex = _this.projectTabIndex;
// _this.getUserInfo();
//_this.tabIndex = _this.projectTabIndex;
_this.getUserInfo();
// document.documentElement.scrollTop = 0;
// document.body.scrollTop = 0;
};
// 打开页面埋点
this.$sendBuriedData({
action: '打开页面',
component_tag: '210#0#0#0'
});
},
mounted() {
var _this = this;
......@@ -123,9 +140,12 @@ export default {
});
},
changeTab(index) {
let tag = index == 1 ? '089#400079' : '089#400080';
let tag = index == 1 ? '210#210001#0' : '210#210001#1';
this.tabIndex = index;
if(index == 1 && !this.userMobile) {
rocNative.gotoLogin();
this.tabIndex = 2;
}
this.$sendBuriedData({
component_tag: tag
});
......@@ -142,45 +162,48 @@ export default {
let cachedOtherProjectList = []
_this.otherProjectList = []
_this.showLoading = true;
this.GET("portal/portalApp/queryProjectCooperationInfoV2", param).then(
this.GET("cme/project/list", param).then(
res => {
_this.showLoading = false;
if (res.code == "000000") {
let oldProjects1 = [];
let oldProjects2 = [];
for(let i=0;i<res.data.oldProjects.length;i++) {
if(res.data.oldProjects[i].roleFlag == 1) {
oldProjects1.push(res.data.oldProjects[i]);
} else if (res.data.oldProjects[i].roleFlag == 0) {
oldProjects2.push(res.data.oldProjects[i]);
}
}
// let oldProjects1 = [];
// let oldProjects2 = [];
// for(let i = 0; i < res.data.oldProjects.length; i++) {
// if(res.data.oldProjects[i].roleFlag == 1) {
// oldProjects1.push(res.data.oldProjects[i]);
// } else if (res.data.oldProjects[i].roleFlag == 0) {
// oldProjects2.push(res.data.oldProjects[i]);
// }
// }
// console.log('项目1',oldProjects1,'项目2',oldProjects2);
// cachedJoinProjectList = res.data.myProjectList;
// _this.joinProjectList = res.data.myProjectList;
// _this.otherProjectList = res.data.otherProjectList;
cachedJoinProjectList = _this.handleOldProject(
oldProjects1,
res.data.myProjectList
);
cachedOtherProjectList = _this.handleOldProject(
oldProjects2,
res.data.otherProjectList
);
cachedJoinProjectList = res.data.myCMEProjectListDtoList;
cachedOtherProjectList = res.data.allCMEProjectListDtoList;
_this.joinProjectList = res.data.myCMEProjectListDtoList;
_this.otherProjectList = res.data.allCMEProjectListDtoList;
// cachedJoinProjectList = _this.handleOldProject(
// oldProjects1,
// res.data.myProjectList
// );
// cachedOtherProjectList = _this.handleOldProject(
// oldProjects2,
// res.data.otherProjectList
// );
// 如果用户已经登陆,则将"至今"的几个项目移到我的列表中
if(_this.userMobile) {
cachedOtherProjectList.map(item => {
if(item.projectName && item.projectName.indexOf('国家基本公共卫生服务项目基层高血压管理办公室') >= 0) {
cachedJoinProjectList.unshift(item);
} else {
_this.otherProjectList.push(item);
}
})
// cachedOtherProjectList.map(item => {
// if(item.projectName && item.projectName.indexOf('国家基本公共卫生服务项目基层高血压管理办公室') >= 0) {
// cachedJoinProjectList.unshift(item);
// } else {
// _this.otherProjectList.push(item);
// }
// })
_this.tabIndex = 1;
} else {
_this.otherProjectList = cachedOtherProjectList
_this.tabIndex = 2;
// _this.otherProjectList = cachedOtherProjectList
}
_this.joinProjectList = cachedJoinProjectList;
// _this.joinProjectList = cachedJoinProjectList;
if (_this.joinProjectList && _this.joinProjectList.length === 0) {
_this.tabIndex = 2;
}
......@@ -208,6 +231,7 @@ export default {
</script>
<style lang="scss" scoped>
@import "../style/mixin";
.page-content {
&-table {
position: fixed;
......
此差异已折叠。
<template>
<div class="test-container">
<CommonButton btnText="去学习"></CommonButton>
<!-- <CommonDialog content="该项目仅对河北省石家庄市的用户开放" :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog> -->
<!-- <CommonDialog content="您暂未认证身份,完成认证身份后可申请学分" confirmBtnText="去认证" :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog> -->
<!-- <CommonDialog content="您暂未加入机构,加入机构后且认证身份后可申请学分" confirmBtnText="加入机构" :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog> -->
<!-- <CommonDialog content="您的所属机构不在可申请范围(河北省石家庄市)内" cancleBtnText="我知道了" isSingle :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog> -->
<CommonDialog content="提交成功" subContent="您可在“个人中心-证书与学分”中查看审核结果" cancleBtnText="我知道了" isSingle needSubContent :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog>
<!-- <CommonDialog content="兑换" subContent="确定要花200云鹊豆兑换课程吗?<br>我的云鹊豆:<span style='color:#FF9A4B;'>1500</span>" cancleBtnText="我再想想" confirmBtnText="确认兑换" needSubContent :isShowDialog="isShowDialog" @handlerAction="handlerDialogAction"></CommonDialog> -->
<CommonBottomInfo></CommonBottomInfo>
</div>
</template>
<script>
import CommonButton from "@/components/cme/common-button";
import CommonDialog from "@/components/cme/common-dialog";
import CommonBottomInfo from "@/components/cme/common-bottom-info";
export default {
data() {
return {
isShowDialog: true,
};
},
components: {
CommonButton,
CommonDialog,
CommonBottomInfo
},
mounted() {
// Toast
this.$toast({message: '展示图片', duration: 3000 });
},
beforeDestroyed() {},
methods: {
handlerDialogAction(type) {
this.isShowDialog = false;
}
}
};
</script>
<style lang="scss" scoped>
@import "../style/mixin";
</style>
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册