This commit is contained in:
zoujiandong
2025-07-22 15:56:22 +08:00
parent 89336f5621
commit 1d598d149b
28 changed files with 881 additions and 509 deletions
+2 -4
View File
@@ -11,16 +11,14 @@
@query="queryList"
>
<template #top>
<backDetailNav :navName="'肝胆相照临床病例库'"></backDetailNav>
<backDetailNav :navName="type=='exchange'?'肝胆相照病例交流园地':'肝胆相照临床病例库'"></backDetailNav>
</template>
<template #bottom>
<view class="bottom">
<view class="iptbox" @click="open">
<up--image
:src="chatImg"
width="46rpx"
height="46rpx"
radius="50%"
@@ -1345,7 +1343,7 @@ const collectVideo = (id) => {
};
const collectExchange = (id) => {
api.collectExchange(id).then((res) => {
api.exchangeCollect(id).then((res) => {
uni.showToast({
icon: "none",
title: "收藏成功",
+2 -2
View File
@@ -17,7 +17,7 @@
</view>
</view>
<view class="databox">
<view class="databox" v-if="numInfo.article_num+numInfo.video_num>=5">
<view class="cell">
<view class="num">{{ numInfo.article_num }}</view>
<view class="name">文章</view>
@@ -45,7 +45,7 @@
</view>
<u-icon name="arrow-right" color="#9CA3AF" size="18"></u-icon>
</view>
<view class="cell" @click="goCert">
<view class="cell" @click="goCert" v-if="numInfo.article_num+numInfo.video_num>=5">
<view class="left">
<up--image
:src="myDownload"
+11 -4
View File
@@ -34,8 +34,8 @@
</view>
</template>
<view class="item" v-for="(item, index) in dataList" @click="goDetail()" :key="item.collect_id">
<view class="title ellipsis">{{item.data.title}}</view>
<view class="item" v-for="(item, index) in dataList" @click="goDetail(item.data.id)" :key="item.collect_id">
<view class="title ellipsis-two-lines">{{item.data.title}}</view>
<view class="tagsbox">
<view class="tag" v-for="tag in item.data.author" :key="tag.author_id">{{ tag.doctor_name }}</view>
</view>
@@ -132,9 +132,16 @@ const formatdate=(date)=>{
return dayjs(date).format('YYYY-MM-DD')
}
const goDetail=(id)=>{
console.log(11111)
console.log(type1.value)
console.log(id)
let type=isArticle.value?'article':'video'
let type="article";
if(type2.value==1){
type="article";
}else if(type2.value==2){
type="video";
}else if(type2.value==3){
type="exchange";
}
navTo({
url: `/pages/detail/detail?id=${id}&type=${type}`
})
+291 -120
View File
@@ -10,7 +10,7 @@
>
<template #top>
<navBarSearch
:navName="'肝胆相照精选病例交流'"
:navName="'肝胆相照病例交流园地'"
@changeWord="changeWord"
></navBarSearch>
<!-- <view class="bar"></view> -->
@@ -26,22 +26,31 @@
<view class="filterbox">
<!-- <view class="type" @click="swicthType">{{!isArticle?'文章':'视频'}}<up--image :src="switchImg" width="31rpx" height="31rpx"></up--image></view> -->
<view class="casesdown" @click="openCase" >筛选<up--image :src="caseImg" width="31rpx" height="31rpx"></up--image></view>
<up-dropdown class="u-dropdown" ref="uDropdownRef">
<up-dropdown-item
v-model="order.push_date"
title="发布时间"
@change="changeDate"
:options="options"
></up-dropdown-item>
<up-dropdown-item
v-model="order.read_num"
title="阅读量"
@change="changeRead"
:options="options"
></up-dropdown-item>
</up-dropdown>
<up-dropdown class="u-dropdown" ref="uDropdownRef">
<up-dropdown-item :title="dropTitle">
<view class="dropcontent">
<up-radio-group
@change="changeDate"
v-model="orderFilter"
iconPlacement="right"
placement="column"
>
<view
class="column"
v-for="item in options"
:key="item.value"
:class="[orderFilter==item.value?'active':'']"
>
<up-radio
activeColor="#3CC7C0"
:label="item.label"
:name="item.value"
></up-radio>
</view>
</up-radio-group>
</view>
</up-dropdown-item>
</up-dropdown>
</view>
</template>
<view class="box">
@@ -74,7 +83,7 @@
>{{ item.user_name }}{{ item.hospital_name }}</view
>
</view>
<view class="content" @click="goDetail(item.exchange_id)"> {{ item.exchange_content }} </view>
<view class="content ellipsis-two-lines" @click="goDetail(item.exchange_id)"> {{ htmlToText(item.exchange_content) }} </view>
<view
class="imgbox"
@click="goDetail(item.exchange_id)"
@@ -130,7 +139,7 @@
<up-icon name="eye" color="#4B5563" size="28rpx"></up-icon>
<view class="num">{{ item.read_num }}</view>
</view>
<view class="collect item">
<view class="collect item" v-if="item.collect_num >0">
<up-icon
name="heart"
color="#4B5563"
@@ -138,7 +147,7 @@
></up-icon>
<view class="num">{{ item.collect_num }}</view>
</view>
<view class="chat item">
<view class="chat item" v-if="item.comment_num >0">
<up-icon name="chat" color="#4B5563" size="28rpx"></up-icon>
<view class="num">{{ item.comment_num }}</view>
</view>
@@ -159,25 +168,54 @@
<up-popup
:round="10"
zIndex="9"
:closeOnClickOverlay="false"
:show="showCase"
mode="bottom"
@close="closeCase"
>
<view class="votepop casepop">
<view class="titlebox">
<view class="left" @click="showCase = false">取消</view>
<view class="left continue" @click="continueCase" v-show="level != 3"
>继续选择</view
>
<view class="left" @click="cancelCase">取消</view>
<view class="right" @click="confirmCase">确定</view>
</view>
<view class="stepbox">
<up-steps :current="level-1" direction="column" :key="freshKey">
<up-steps-item >
<template v-slot:content>
<view class="slot-content" @click="openCaseLevel('1')">
<view class="left">{{!caseValue1.name?'请选择选项':caseValue1.name}}</view>
<u-icon name="arrow-right"></u-icon>
</view>
</template>
</up-steps-item>
<up-steps-item v-if="caseValue1.name && labelObj.list2.length>0">
<template v-slot:content>
<view class="slot-content" @click="openCaseLevel('2')">
<view class="left">{{!caseValue2.name?'请选择选项':caseValue2.name}}</view>
<u-icon name="arrow-right"></u-icon>
</view>
</template>
</up-steps-item>
<up-steps-item v-if="caseValue2.name && labelObj.list3.length>0">
<template v-slot:content>
<view class="slot-content" @click="openCaseLevel('3')">
<view class="left">{{!caseValue3.name?'请选择选项':caseValue3.name}}</view>
<u-icon name="arrow-right"></u-icon>
</view>
</template>
</up-steps-item>
</up-steps>
</view>
<scroll-view class="casecon" scroll-y="true">
<view v-show="level == 1" >
<up-radio-group
v-model="caseValue1"
v-model="caseValue1.value"
name="group1"
iconPlacement="right"
placement="column"
@change="groupChange1"
>
<view
class="column"
@@ -194,7 +232,9 @@
</view>
<view v-show="level == 2" >
<up-radio-group
v-model="caseValue2"
name="group2"
@change="groupChange2"
v-model="caseValue2.value"
iconPlacement="right"
placement="column"
>
@@ -213,8 +253,9 @@
</view>
<view v-show="level == 3" >
<up-radio-group
v-model="caseValue3"
name="group3"
@change="groupChange3"
v-model="caseValue3.value"
iconPlacement="right"
placement="column"
>
@@ -288,35 +329,170 @@ const dataList = ref([]);
const total = ref(0);
const keyWord = ref("");
const vote=ref(null);
const showNum = ref(true);
const showNum = ref(false);
const label_iden=ref('');
const dropTitle=ref('发布时间');
const orderFilter=ref('1')
const uDropdownRef=ref(null);
const options= ref([
{
label: "正序",
value: 'asc',
label: "发布时间",
value: '1',
},
{
label: "倒序",
value: 'desc',
label: "互动更新时间",
value: '2',
},
{
label: "互动次数",
value: '3',
},
]);
const isSearch=ref(true);
const order=reactive({
read_num:'',
push_date:''
push_date:'desc'
})
const label_iden=ref('')
const showCase = ref(false);
const canOpenCase = ref(false);
const caseValue1 = ref("");
const caseValue2 = ref("");
const caseValue3 = ref("");
const caseValue1 = reactive({
value:'',
name:'',
});
const caseValue2 = reactive({
value:'',
name:'',
});
const caseValue3 = reactive({
value:'',
name:'',
});
const level = ref(1);
const dealId=ref('');
const labelObj = reactive({
list1: [],
list2: [],
list3: [],
list3: []
});
const openCaseLevel=(lev)=>{
freshKey.value++;
level.value=lev;
if(lev==1){
caseValue2.name='';
caseValue2.value='';
labelObj.list2=[]
}else if(lev==2){
labelObj.list3=[];
caseValue3.name='';
caseValue3.value=''
}
};
const groupChange1=(e)=>{
caseValue1.value=e;
for (var i = 0; i <labelObj.list1.length; i++) {
if(labelObj.list1[i].app_iden==caseValue1.value){
caseValue1.name=labelObj.list1[i].label_name;
break;
}
}
getCaseLabel(2,e)
}
const groupChange2=(e)=>{
caseValue2.value=e;
for (var i = 0; i <labelObj.list2.length; i++) {
if(labelObj.list2[i].app_iden==caseValue2.value){
caseValue2.name=labelObj.list2[i].label_name;
break;
}
}
getCaseLabel(3,e)
}
const groupChange3=(e)=>{
caseValue3.value=e;
level.value =3
for (var i = 0; i <labelObj.list3.length; i++) {
if(labelObj.list3[i].app_iden==caseValue3.value){
caseValue3.name=labelObj.list3[i].label_name;
break;
}
}
}
const getCaseLabel = (lev,pid=0) => {
api.getCaseLabel({
pId:pid
}).then((res) => {
level.value = lev;
if (lev == 1) {
labelObj.list1 = res.data.data;
//label_iden.value = caseValue1.value;
} else if (lev == 2) {
labelObj.list2 = res.data.data;
if(res.data.data.length==0){
level.value = 1
}
//label_iden.value = caseValue2.value;
} else if (lev == 3) {
labelObj.list3 = res.data.data;
if(res.data.data.length==0){
level.value = 2
}
//label_iden.value = caseValue3.value;
}
});
};
const openCase=()=>{
showCase.value = true;
}
const cancelCase=()=>{
showCase.value=false;
level.value=1;
caseValue1.name='';
caseValue1.value='';
caseValue2.name='';
caseValue2.value='';
caseValue3.name='';
caseValue3.value='';
//labelObj.list1=[];
labelObj.list2=[];
labelObj.list3=[];
}
const confirmCase = () => {
if (level.value == 1 && caseValue1.value == "") {
uni.showToast({ title: "请选择疾病选项", icon: "none" });
return false;
};
if(level.value == 1){
label_iden.value = caseValue1.value;
}
if(level.value == 2 ){
if(!caseValue2.value){
label_iden.value = caseValue1.value;
}else{
label_iden.value = caseValue2.value;
}
}
if(level.value == 3 ){
if(!caseValue3.value){
label_iden.value = caseValue2.value;
}else{
label_iden.value = caseValue3.value;
}
}
paging.value.reload();
showCase.value=false;
//cancelCase();
};
const closeCase = () => {
showCase.value = false;
};
const openDeal = (id,voteObj) => {
showDeal.value = true;
dealId.value=id;
@@ -341,6 +517,14 @@ const goEdit=()=>{
url:'/pages/publish/publish?exchange_id='+dealId.value
})
}
const htmlToText=(html)=>{
return html
.replace(/<[^>]*>/g, '') // 移除所有HTML标签
.replace(/&nbsp;/gi, ' ') // 将HTML实体转换为字符
.replace(/<br\s*\/?>/gi, '\n').replace(/<img\s[^>]*>/gi, '') // 移除<img>标签及其内容
.replace(/<video[^>]*>[\s\S]*?/gi, ''); // 将换行符替换为实际的换行符
}
const confirmDel = () => {
//删除
showModal.value = false;
@@ -349,75 +533,7 @@ const confirmDel = () => {
const closeDealPop = () => {
showDeal.value = false;
};
const getCaseLabel = (lev,pid=0) => {
api.getCaseLabel({
pId:pid
}).then((res) => {
if (lev == 1) {
labelObj.list1 = res.data.data;
} else if (lev == 2) {
labelObj.list2 = res.data.data;
} else if (lev == 3) {
labelObj.list3 = res.data.data;
}
level.value = lev;
});
};
const openCase=()=>{
getCaseLabel(1,0)
showCase.value = true;
}
const confirmCase = () => {
if (level.value == 1 && caseValue1.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
if (level.value == 2 && caseValue2.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
if (level.value == 3 && caseValue3.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
showCase.value = false;
if(level.value == 1){
label_iden.value = caseValue1.value
}
if(level.value == 2 ){
label_iden.value = caseValue2.value
}
if(level.value == 3 ){
label_iden.value = caseValue3.value
}
paging.value.reload();
};
const continueCase = () => {
if (level.value == 1 && caseValue1.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
if (level.value == 2 && caseValue2.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
if (level.value == 3 && caseValue3.value == "") {
uni.showToast({ title: "请选择疾病", icon: "none" });
return false;
}
if(level.value == 1 ){
getCaseLabel(2,caseValue1.value);
}else if(level.value == 2 ){
getCaseLabel(3,caseValue2.value);
}
paging.value.reload();
};
const closeCase = () => {
showCase.value = false;
};
const formatdate = (date) => {
return dayjs(date).format("YYYY-MM-DD");
@@ -435,19 +551,31 @@ onLoad((options) => {
if(options.type=="mine"){
isMine.value=true;
}
getCaseLabel(1,0)
});
onShow(()=>{
paging.value?.refresh();
})
const changeDate=(e)=>{
console.log(e);
order.read_num='';
paging.value.reload();
}
const changeRead=(e)=>{
console.log(e);
order.push_date=''
if(e==1){
order.push_date='desc';
order.comment_num='';
order.last_comment_time="";
dropTitle.value="发布时间"
}else if(e==2){
order.push_date='';
order.comment_num="";
order.last_comment_time="desc";
dropTitle.value="互动更新时间"
}else{
order.push_date='';
order.last_comment_time="";
order.comment_num="desc";
dropTitle.value="互动数"
}
orderFilter.value=e;
uDropdownRef.value.close();
paging.value.reload();
}
const videoErrorCallback = (e) => {
@@ -481,11 +609,17 @@ const searchList = async (params) => {
user_id: user_id.value,
label_iden:label_iden.value
};
if(!label_iden.value){
delete searchForm.label_iden
}
if(Number(is_selected.value)){
searchForm.is_selected=Number(is_selected.value)
}
if(!order.read_num){
delete order.read_num
if(!order.comment_num){
delete order.comment_num
}
if(!order.last_comment_time){
delete order.last_comment_time
}
if(!label_iden.value){
delete searchForm.label_iden
@@ -493,7 +627,7 @@ const searchList = async (params) => {
if(!order.push_date){
delete order.push_date
}
if(order.read_num || order.push_date){
if(order.comment_num || order.push_date || order.last_comment_time){
searchForm.order=order
}
api.searchExchage({
@@ -511,6 +645,42 @@ const searchList = async (params) => {
</script>
<style lang='scss' scoped>
.dropcontent{
padding-top: 40rpx;
padding-bottom: 20rpx;
background-color: #fff;
:deep(.u-radio){
margin-bottom: 6px!important;
margin-top: 16px!important;
}
.column {
padding: 0 30rpx;
border-top: 2rpx solid #e5e7eb;
:deep(.u-radio__text){
color: #333 !important;
}
}
.column.active{
:deep(.u-radio__text){
color: #3CC7C0 !important;
}
}
}
.stepbox{
padding:15rpx 30rpx;
border-bottom: 2rpx dotted #f3f4f6;
:deep(.u-steps-item__content){
margin-top: -5rpx!important;
}
.slot-content{
width:100%;
margin-bottom: 25rpx;
justify-content: space-between;
align-items: center;
display: flex;
}
}
.dealbox {
.dealcell {
display: flex;
@@ -530,6 +700,7 @@ const searchList = async (params) => {
border-bottom: 2rpx solid #f3f4f6;
:deep(.u-dropdown__menu__item__text){
font-size: 14px!important;
color: #3c9cff !important
}
.type{
color: #606266;