Browse Source

Merge branch 'master' of gitea.intra.yunpaper.com:kuaileadmin/acupuncture_register_system_uniapp

master
zq 1 month ago
parent
commit
58974a01f0
  1. 38
      App.vue
  2. 303
      components/bookBox.vue
  3. 6
      main.js
  4. 450
      pages/index/index.vue
  5. 12
      中医针灸改版2.0_2025_03_06/需求拆分.txt
  6. 14
      针灸挂号系统功能拆分.txt

38
App.vue

@ -4,6 +4,42 @@
doctorId:'', doctorId:'',
doctoridStorageKey:'doctor_id' doctoridStorageKey:'doctor_id'
}, },
onShow: function() {
var updateManager = uni.getUpdateManager();
updateManager.onCheckForUpdate(function(res) {
console.log("是否有最近版本", res.hasUpdate)
});
updateManager.onUpdateReady(function(res) {
uni.showModal({
title: '更新提示',
content: '新版本已经准备好,是否重启应用?',
showCancel: false,
success(res) {
if (res.confirm) {
updateManager.applyUpdate();
}
}
});
});
updateManager.onUpdateFailed(function(res) {
uni.showModal({
title: '提示',
content: '新版小程序下载失败\n请自行退出程序,手动卸载本程序,再运行',
confirmText: "知道了",
showCancel: false,
success(res) {
wx.exitMiniProgram({
success: () => {
console.log('退出小程序成功');
}
});
}
});
});
},
onLaunch: function(option) { onLaunch: function(option) {
console.log(option, 'option===='); console.log(option, 'option====');
var did = false var did = false
@ -82,7 +118,6 @@
} }
}, },
onShow: function() {},
onHide: function() {} onHide: function() {}
} }
</script> </script>
@ -242,6 +277,7 @@
} }
.btn{ .btn{
text-align: center; text-align: center;
font-size: 32rpx;
} }
.primary.btn{ .primary.btn{
background-color: #39D067; background-color: #39D067;

303
components/bookBox.vue

@ -1,303 +0,0 @@
<template>
<view class="book-com">
<view class="date-wraper">
<view :class="'date'+((selectDay===item.date)?' active':'')" v-for="(item,key) in Object.values(RegistrationTimeList)" @click="chooseDay(item.date)">
<view class="top">
<view>{{item.month}}.{{ item.day }}</view>
<view class="PfScMedium">{{item.week_desc}}</view>
</view>
<view :class="'bot'+((item.work_desc !== '不出诊')?' active':'')+(key==0?' PfScMedium':'')">
{{item.work_desc}}
</view>
</view>
</view>
<view class="datelist">
<view :class="'item'+(timeList.am.length<=0?' itemempty':' ')" v-if="bookTimeList">
<view class="title PfScMedium">上午预约</view>
<view class="inner-wrapper" v-if="timeList.am.length>0">
<view v-for="(item,key) in timeList.am" :class="'son PfScMedium'+( time2remain[item] <=0?' disable':'')" @click="confirmSubmit(item, 1)" :hover-class="time2remain[item]>0?'hover2':''">
{{item.split('-')[0]}}
<text v-if="visitorList.length > time2remain[item] || time2remain[item]<=0">{{time2remain[item]>0?("(名额余"+time2remain[item]+")"):(time2remainExpire[item]?'':'(名额已满)')}}</text>
</view>
</view>
<view class="empty" v-else>
<img :src="cssUrl+'empty.png'" alt="">
<view class="info">当前时间段不可预约</view>
</view>
</view>
<view :class="'item'+(timeList.pm.length<=0?' itemempty':' ')" v-if="bookTimeList">
<view class="title PfScMedium">下午预约</view>
<view class="inner-wrapper" v-if="timeList.pm.length>0">
<view :class="'son PfScMedium'+(time2remain[item]<=0?' disable':'')" @click="confirmSubmit(item, 2)" :hover-class="time2remain[item]>0?'hover2':''" v-for="(item,key) in timeList.pm">
{{item.split('-')[0]}}
<text v-if="visitorList.length > time2remain[item] || time2remain[item]<=0">{{time2remain[item]>0?("(名额余"+time2remain[item]+")"):(time2remainExpire[item]?'':'(名额已满)')}}</text>
</view>
</view>
<view class="empty" v-else>
<img :src="cssUrl+'empty.png'" alt="">
<view class="info">当前时间段不可预约</view>
</view>
</view>
<view class="empty-all" v-else>
<img :src="cssUrl+'empty.png'" alt="">
<view class="info2">
<view class="PfScMedium">{{timeList.type_text}}</view>
<view>请选择其他可预约日期</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: "bookBox",
props: {
visitorList:{
type:Array,
default:()=>[]
},
},
data() {
return {
cssUrl:this.cssUrl,
time2remain:[],
bookTimeList:false,
timeList:true,
disable:true,
selectDay:-1,
RegistrationTimeList:[],
nowtime:'',
time2remainExpire:[],
}
},
methods: {
dataInit(allDate,chooseDate) {//
let firstRegistrationTime = allDate['date2time']
this.RegistrationTimeList = allDate['date2work']
this.nowtime = allDate['nowtime']
this.time2remain = allDate['time2remain'];
for (var key in this.time2remain) {
if (this.time2remain.hasOwnProperty(key)) {
var times = key.split('-')
var end_times = chooseDate+' '+times[1]
this.time2remainExpire[key] = 0
if(this.nowtime >= end_times) this.time2remainExpire[key] = 1
}
}
if(chooseDate){
this.selectDay = chooseDate;
}else{
this.selectDay = Object.keys(this.RegistrationTimeList)[0];
if(!this.selectDay)return
this.chooseDay(this.selectDay)
return
}
this.bookTimeList = false
if(firstRegistrationTime.am.length > 0 || firstRegistrationTime.pm.length > 0) this.bookTimeList = true
this.timeList = firstRegistrationTime
},
chooseDay(date){
this.selectDay = date
this.bookTimeList = false
this.$emit('getAvailabletRegistrationTime', true,this.selectDay)
},
confirmSubmit(time_interval, type){
let param = new Object()
if(this.time2remain[time_interval] <= 0) return
param.date = this.selectDay
param.time_interval = time_interval
param.type = type
this.$emit('confirmSubmitEvent', param)
}
}
};
</script>
<style lang="scss" scoped>
.book-com{
width: 100%;
height: auto;
overflow: hidden;
.date-wraper{
width: 714rpx;
margin: 24rpx auto 0;
height: 218rpx;
background: #FFFFFF;
box-shadow: 0rpx 2rpx 24rpx 0rpx rgba(0,0,0,0.03);
overflow-x: auto;
display: flex;
box-sizing: border-box;
padding: 40rpx 24rpx;
.date{
width: 120rpx;
flex-shrink: 0;
margin-right: 18rpx;
.top{
width: 106rpx;
height: 98rpx;
padding-top: 8rpx !important;
box-sizing: border-box;
view{
color: #333333;
font-size: 28rpx;
line-height: 36rpx;
height: 36rpx;
text-align: center;
}
view:last-of-type{
margin-top: 10rpx;
}
}
.bot{
height: 32rpx;
font-size: 24rpx;
color: #999999;
line-height: 32rpx;
margin-top: 14rpx;
text-align: center;
&.active{
color: #50C382;
}
}
&.active{
.top{
background: #39D067;
border-radius: 8rpx;
view{
color: white !important;
}
}
}
}
}
.datelist{
width: 714rpx;
margin: 20rpx auto 0;
height: auto;
background: #F8F8F8;
border-radius: 8rpx;
box-sizing: border-box;
overflow: hidden;
.title{
height: 50rpx;
font-size: 32rpx;
color: #000000;
line-height: 50rpx;
letter-spacing: 2rpx;
padding-top: 24rpx;
margin-bottom: 24rpx;
background: #FFFFFF;
}
.item{
min-height: 318rpx;
padding: 0 24rpx 0rpx 24rpx;
box-shadow: 0rpx 24rpx 24rpx 0rpx rgba(0,0,0,0.03);
background: #FFFFFF;
position: relative;
margin-bottom: 20rpx;
&.itemallempty{
background: #FFFFFF !important;
}
&.itemempty{
height: 420rpx !important;
padding-bottom: 0rpx !important;
}
.empty{
position: absolute;
top: 0;
left: 147rpx;
width: 420rpx;
height: 420rpx;
img{
width: 420rpx;
height: 420rpx;
display: block;
height: 420rpx;
margin: 0 auto;
}
.info{
width: 100%;
position: absolute;
z-index: 2;
bottom: 42rpx;
text-align: center;
height: 40rpx;
font-size: 28rpx;
color: #AEB0B8;
line-height: 40rpx;
}
}
.inner-wrapper{
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
.son{
display: flex;
align-items: center;
justify-content: center;
width: 320rpx;
height: 86rpx;
background: #F8FFF7;
border-radius: 8rpx;
border: 2rpx solid #39D067;
margin-bottom: 20rpx;
color: #50C382;
font-size: 30rpx;
&.disable{
background: #F1F1F1;
border: 2rpx solid #CACACA;
color: #999999;
}
}
}
}
img{
width: 420rpx;
height: 420rpx;
display: block;
height: 420rpx;
margin: 0 auto;
}
.info2{
position: absolute;
bottom: 50rpx;
width: 100%;
view{
width: 100%;
text-align: center;
}
view:first-of-type{
font-size: 28rpx;
height: 40rpx;
width: 100%;
color: #AEB0B8;
line-height: 40rpx;
}
view:last-of-type{
height: 33rpx;
font-size: 24rpx;
color: #BEC1CA;
line-height: 33rpx;
margin-top: 14rpx;
}
}
.empty-all{
height: 454rpx;
padding-bottom: 20rpx;
background: #FFFFFF;
position: relative;
}
}
}
</style>

6
main.js

@ -287,6 +287,12 @@ function req(url, data={}, method = 'POST', header={}) {
} }
return; return;
} }
if (rs.confirm && rdata.code!=CODE_LOGIN_EXIPRE && rdata.msg && rdata.msg.indexOf('用户信息不存在') > -1) {
removeLogin();
navToPath('/pages/index/index')
return;
}
} }
}); });

450
pages/index/index.vue

@ -3,55 +3,55 @@
<view class="header-wrapper flex"> <view class="header-wrapper flex">
<view class="left"> <view class="left">
<view class="flex top PfScMedium"> <view class="flex top PfScMedium">
<view class="ft50 over2">{{doctorInfo.doctor_info.doctor_name}}</view> <view class="ft50 over2">{{ doctorInfo.doctor_info.doctor_name }}</view>
<view v-if="doctor_dept"> <view v-if="doctorInfo.doctor_info.label">
<view class="over2">{{doctor_dept}}</view> <view class="over2">{{ doctorInfo.doctor_info.label }}</view>
</view> </view>
</view> </view>
<view class="bt over2" v-if="doctorInfo.doctor_info.doctor_desc"> <view class="bt over2" v-if="doctorInfo.doctor_info.doctor_desc">
{{doctorInfo.doctor_info.doctor_desc}} {{ doctorInfo.doctor_info.doctor_desc }}
</view> </view>
</view> </view>
<img class="right" :src="doctorInfo.doctor_info.avator" alt="" @click="enlargePicture(doctorInfo.doctor_info.avator)" v-if="doctorInfo.doctor_info.avator"> <img class="right" :src="doctorInfo.doctor_info.avator" alt=""
@click="enlargePicture(doctorInfo.doctor_info.avator)" v-if="doctorInfo.doctor_info.avator">
</view> </view>
<view class="block desc-wrapper" v-if="doctorInfo.doctor_info.doctor_detail"> <view class="block desc-wrapper" v-if="doctorInfo.doctor_info.doctor_detail">
<view class="title-wrapper flex"> <!-- <view class="title-wrapper flex">
<view class="title"> <view class="title">
医生简介 医生简介
</view> </view>
<img :src="cssUrl+'right_bg.png'" alt=""> <img :src="cssUrl+'right_bg.png'" alt="">
</view> </view> -->
<view class="con"> <view class="con">
{{doctorInfo.doctor_info.doctor_detail}} {{ doctorInfo.doctor_info.doctor_detail }}
</view> </view>
</view> </view>
<view class="block hospital-wrapper" v-if="hospitals"> <view class="block hospital-wrapper" v-if="hospitals">
<!-- <view class="title-wrapper flex">
<view class="title-wrapper flex">
<view class="title"> <view class="title">
出诊信息 出诊信息
</view> </view>
<img :src="cssUrl+'right_bg.png'" alt=""> <img :src="cssUrl+'right_bg.png'" alt="">
</view> </view> -->
<view class="item" v-for="(item,key) in hospitals"> <view class="item" v-for="(item, key) in hospitals">
<view class="top flex"> <view class="top flex">
<view class="left"> <view class="left">
<view class="title flex"> <view class="title flex">
<text class="over2 PfScMedium hospital_name">{{item.hospital_name}}</text> <text class="over2 PfScMedium hospital_name">{{ item.hospital_name }}</text>
<view class="fixed_hospital" v-if="item.is_fixed == 1">医保定点</view> <view class="fixed_hospital" v-if="item.is_fixed == 1">医保定点</view>
</view> </view>
<view class="date over2 over4" v-if="item.address"> <view class="date over2 over4" v-if="item.address">
{{item.address}} {{ item.address }}
</view> </view>
</view> </view>
<view class="right"> <view class="right">
<view class="flex right-wrapper" style="justify-content:center;" v-if="item.hospital_pos"> <view class="flex right-wrapper" style="justify-content:center;" v-if="item.hospital_pos">
<view class="" @click="toLocation(item)"> <view class="" @click="toLocation(item)">
<img :src="cssUrl+'index_nav.svg'" alt=""> <img :src="cssUrl + 'index_nav.svg'" alt="">
<view class="map-wrap">导航</view> <view class="map-wrap">导航</view>
</view> </view>
@ -59,20 +59,20 @@
</view> </view>
</view> </view>
<view class="center"> <view class="center" v-if="item.workdate_desc">
出诊{{ item.workdate_desc }} 出诊{{ item.workdate_desc }}
</view> </view>
<uni-collapse ref="collapse" v-model="collapseValue[key]" class="notice-collapse" v-if="item.notice"> <uni-collapse ref="collapse" v-model="collapseValue[key]" class="notice-collapse" v-if="item.notice">
<uni-collapse-item title="就诊须知"> <uni-collapse-item title="预约须知">
<view class=" content" > <view class=" content">
<view class="text" v-html="item.notice"></view> <view class="text" v-html="item.notice"></view>
</view> </view>
</uni-collapse-item> </uni-collapse-item>
</uni-collapse> </uni-collapse>
<view class="bot primary btn btn2" hover-class="hover" @click="toVisitors(item)" v-if="item.type==0"> <view class="bot primary btn btn2" hover-class="hover" @click="toVisitors(item)" v-if="item.type == 0">
预约看病 开始预约
</view> </view>
</view> </view>
</view> </view>
@ -81,51 +81,73 @@
<view class="header flex"> <view class="header flex">
<view class="title-wrapper flex booklist"> <view class="title-wrapper flex booklist">
<view class="title"> <view class="title">
最近就诊 最近预约
</view> </view>
<img :src="cssUrl+'right_bg.png'" alt=""> <img :src="cssUrl + 'right_bg.png'" alt="">
</view> </view>
<view class="opt flex" @click="toPrebookList"> <view class="opt flex" @click="toPrebookList">
查看全部<img :src="cssUrl+'index_comback2.svg'" alt=""> 查看全部<img :src="cssUrl + 'index_comback2.svg'" alt="">
</view> </view>
</view> </view>
</view> </view>
<pre-book-list class="preg-books" :dataList="recentAppoint" :topnopadding="true" v-if="this.doctorInfo && !this.doctorInfo.is_all_card"></pre-book-list> <pre-book-list class="preg-books" :dataList="recentAppoint" :topnopadding="true"
v-if="this.doctorInfo && !this.doctorInfo.is_all_card"></pre-book-list>
<tabbar current="1" leftButtonText="主页" v-if="!doctorInfo.is_all_card"></tabbar> <tabbar current="1" leftButtonText="主页" v-if="!doctorInfo.is_all_card"></tabbar>
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<doctorImport v-if="user_type == '1' || user_type == '2'"></doctorImport> <doctorImport v-if="user_type == '1' || user_type == '2'"></doctorImport>
<!-- #endif --> <!-- #endif -->
<uni-popup ref="nameWrap" :safe-area="false">
<view class="popup-container">
<view class="header">
<view class="title PfScMedium">需要填写真实姓名来确保您账号的唯一性</view>
</view>
<view class="label">真实姓名</view>
<input type="text" class="realName" v-model="realName" placeholder-class="placeholder-style" placeholder="请填写">
<view class="confirm-button-wrapper btPadding">
<view class="confirm-button PfScMedium" @click="handleConfirm">
完成
</view>
</view>
</view>
</uni-popup>
<button class="getphone-box" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" v-if="!doctorInfo.aid"></button>
</view> </view>
</template> </template>
<script> <script>
import tabbar from '@/components/tabbar.vue' import tabbar from '@/components/tabbar.vue'
import preBookList from '@/components/preBookList.vue' import preBookList from '@/components/preBookList.vue'
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
import doctorImport from '@/components/doctorImport.vue' import doctorImport from '@/components/doctorImport.vue'
// #endif // #endif
export default { export default {
data() { data() {
return { return {
collapseValue:[], realName:'',
cssUrl:this.cssUrl, collapseValue: [],
code:'', cssUrl: this.cssUrl,
pageShow:false, code: '',
doctor_id:'', pageShow: false,
doctorInfo:false, doctor_id: '',
doctor_dept:false, doctorInfo: false,
hospitals:false, doctor_dept: false,
recentAppoint:[], hospitals: false,
loginToken:false, recentAppoint: [],
state:'', loginToken: false,
workdate:[], state: '',
user_type:-1 workdate: [],
user_type: -1,
show_info:false,
showNameDialog: false,
userName: "",
hasRejectedPhone: false, //
} }
}, },
components:{ components: {
tabbar, tabbar,
preBookList, preBookList,
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
@ -133,30 +155,53 @@
// #endif // #endif
}, },
onLoad(option) { onLoad(option) {
if(option.code && option.state) { if (option.code && option.state) {
this.code = option.code this.code = option.code
this.state = option.state this.state = option.state
} }
}, },
async onShow() { async onShow() {
this.doctor_id = getApp().globalData.doctorId this.doctor_id = getApp().globalData.doctorId
if(!this.doctor_id) return if (!this.doctor_id) return
var title = '预约就诊' var title = ''
if(this.code) title = '登录' if (this.code) title = '登录'
uni.setNavigationBarTitle({ uni.setNavigationBarTitle({
title:title title: title
}) })
var token = this.$token.getToken() var token = this.$token.getToken()
if(this.code && this.state && !token) { if (this.code && this.state && !token) {
this.login() this.login()
return return
} }
await this.getDoctorInfo() await this.getDoctorInfo()
}, },
methods: { methods: {
toLocation(hospital){ handleConfirm(){
if(!this.realName.trim()){
uni.showModal({
title:'提示',
content: '姓名不可为空',
})
return
}
this.$http.req('/api/user/set_realname', { realname:this.realName}, 'POST').then(data => {
if (data == -1) return
this.$refs.nameWrap.close()
});
},
getPhoneNumber(e) {
console.log(e)
if (e.detail.errMsg === 'getPhoneNumber:ok') {
this.$http.req('api/user/bind_phone', {phonecode:e.detail.code}, 'POST').then(data=>{
if(data == -1) return
this.getDoctorInfo()
});
} else {
}
},
toLocation(hospital) {
// #ifdef MP-WEIXIN // #ifdef MP-WEIXIN
var lngLat = hospital.hospital_pos.toString().split(',') var lngLat = hospital.hospital_pos.toString().split(',')
var lng = Number(lngLat[1]) var lng = Number(lngLat[1])
@ -187,10 +232,10 @@
var baiduLngLat = that.qqMapTransBMap(lng, lat) var baiduLngLat = that.qqMapTransBMap(lng, lat)
var mapList = [ var mapList = [
'http://apis.map.qq.com/uri/v1/marker?marker=coord:'+ lat+','+lng+';addr:'+hospital.hospital_name, 'http://apis.map.qq.com/uri/v1/marker?marker=coord:' + lat + ',' + lng + ';addr:' + hospital.hospital_name,
// 'http://apis.map.qq.com/uri/v1/marker?marker=coord:'+ lat+','+lng+';title:'+hospital.hospital_name+ 'addr:'+hospital.address, // new title // 'http://apis.map.qq.com/uri/v1/marker?marker=coord:'+ lat+','+lng+';title:'+hospital.hospital_name+ 'addr:'+hospital.address, // new title
'http://api.map.baidu.com/marker?location='+baiduLngLat.lat+','+baiduLngLat.lng+'&title='+hospital.hospital_name+'&content=即将前往目的地&output=html&src=webapp.baidu.openAPIdemo', 'http://api.map.baidu.com/marker?location=' + baiduLngLat.lat + ',' + baiduLngLat.lng + '&title=' + hospital.hospital_name + '&content=即将前往目的地&output=html&src=webapp.baidu.openAPIdemo',
'https://m.amap.com/share/index/lnglat='+hospital.hospital_pos+'&name='+hospital.hospital_name+'&src=uriapi&innersrc=uriapi', 'https://m.amap.com/share/index/lnglat=' + hospital.hospital_pos + '&name=' + hospital.hospital_name + '&src=uriapi&innersrc=uriapi',
] ]
location.href(mapList[res.tapIndex]) location.href(mapList[res.tapIndex])
}, },
@ -199,7 +244,7 @@
}); });
// #endif // #endif
}, },
copyAddress(address){ copyAddress(address) {
uni.setClipboardData({ uni.setClipboardData({
data: address, data: address,
success: () => { success: () => {
@ -211,42 +256,55 @@
this.$setuinfo.setUinfo(JSON.stringify(info)) this.$setuinfo.setUinfo(JSON.stringify(info))
}, },
login() { login() {
this.$http.req('api/common/get_user_info', {code:this.code,state:this.state}, 'POST').then(data=>{ this.$http.req('api/common/get_user_info', { code: this.code, state: this.state }, 'POST').then(data => {
if(data == -1) return if (data == -1) return
this.$settoken.setToken(data.jwttoken) this.$settoken.setToken(data.jwttoken)
this.setLoginUserInfo(data) this.setLoginUserInfo(data)
var stat_info = this.state.split('-'); var stat_info = this.state.split('-');
if(stat_info.length > 2) { if (stat_info.length > 2) {
uni.removeStorageSync('checkin_depart_id'); uni.removeStorageSync('checkin_depart_id');
this.$nav.navToPath('/pages/visitors/visitors?type=3&depart_id='+stat_info[2]) this.$nav.navToPath('/pages/visitors/visitors?type=3&depart_id=' + stat_info[2])
return; return;
} }
this.getDoctorInfo() this.getDoctorInfo()
}); });
}, },
async getDoctorInfo() { async getDoctorInfo() {
await this.$http.req('api/user/index_info', {}, 'GET').then(data=>{ await this.$http.req('api/user/index_info', {}, 'GET').then(data => {
if(data == -1) return if (data == -1) return
// var data = JSON.parse(uni.getStorageSync('doctor_info')); // var data = JSON.parse(uni.getStorageSync('doctor_info'));
var checkin_depart_id = uni.getStorageSync('checkin_depart_id'); var checkin_depart_id = uni.getStorageSync('checkin_depart_id');
if(checkin_depart_id){ if (checkin_depart_id) {
uni.removeStorageSync('checkin_depart_id'); uni.removeStorageSync('checkin_depart_id');
this.$nav.navToPath('/pages/visitors/visitors?type=3&depart_id='+checkin_depart_id) this.$nav.navToPath('/pages/visitors/visitors?type=3&depart_id=' + checkin_depart_id)
return; return;
} }
this.pageShow = true; this.pageShow = true;
let visitFlag = true; let visitFlag = true;
this.doctorInfo = data; this.doctorInfo = data;
this.user_type = this.doctorInfo.user_type; this.user_type = this.doctorInfo.user_type;
if(this.doctorInfo.doctor_info && this.doctorInfo.doctor_info.depart_name && this.doctorInfo.doctor_info.depart_name.length>0){ if(!data.realname && data.aid) {
this.$nextTick(() => {
this.$refs.nameWrap.open('bottom')
})
}
var title = this.doctorInfo.doctor_info.doctor_name + '主页'
uni.setNavigationBarTitle({
title: title
})
if (this.doctorInfo.doctor_info && this.doctorInfo.doctor_info.depart_name && this.doctorInfo.doctor_info.depart_name.length > 0) {
this.doctor_dept = this.doctorInfo.doctor_info.depart_name; this.doctor_dept = this.doctorInfo.doctor_info.depart_name;
} }
if(this.doctorInfo.hospital_departs && this.doctorInfo.hospital_departs.length>0){ if (this.doctorInfo.hospital_departs && this.doctorInfo.hospital_departs.length > 0) {
this.hospitals = this.doctorInfo.hospital_departs; this.hospitals = this.doctorInfo.hospital_departs;
this.doctor_dept = this.doctorInfo.hospital_departs[0]['depart_name']; this.doctor_dept = this.doctorInfo.hospital_departs[0]['depart_name'];
this.doctorInfo.doctor_info.depart_name = this.doctor_dept; this.doctorInfo.doctor_info.depart_name = this.doctor_dept;
@ -254,20 +312,20 @@
for (var index = 0; index < this.hospitals.length; index++) { for (var index = 0; index < this.hospitals.length; index++) {
this.collapseValue[index] = [] this.collapseValue[index] = []
} }
}else{ } else {
visitFlag = false; visitFlag = false;
} }
if(this.doctorInfo.visit_list && this.doctorInfo.visit_list.length>0){ if (this.doctorInfo.visit_list && this.doctorInfo.visit_list.length > 0) {
this.recentAppoint = this.doctorInfo.visit_list; this.recentAppoint = this.doctorInfo.visit_list;
} }
if(this.doctorInfo.workdate && Object.keys(this.doctorInfo.workdate).length > 0){ if (this.doctorInfo.workdate && Object.keys(this.doctorInfo.workdate).length > 0) {
this.workdate = this.doctorInfo.workdate; this.workdate = this.doctorInfo.workdate;
}else{ } else {
visitFlag = false; visitFlag = false;
} }
this.hospital_departs = this.doctorInfo.hospital_departs.map((item,index)=>{ this.hospital_departs = this.doctorInfo.hospital_departs.map((item, index) => {
item.workdate_desc = this.doctorInfo.workdate_desc[item.depart_id] if (this.doctorInfo.workdate_desc) item.workdate_desc = this.doctorInfo.workdate_desc[item.depart_id]
return item return item
}) })
}); });
@ -280,17 +338,16 @@
urls: list urls: list
}); });
}, },
toVisitors(hospital){ toVisitors(hospital) {
uni.setStorageSync('depart_id', hospital.depart_id) uni.setStorageSync('depart_id', hospital.depart_id)
uni.setStorageSync('depart', JSON.stringify(hospital)) uni.setStorageSync('depart', JSON.stringify(hospital))
uni.setStorageSync('doctor_info', JSON.stringify(this.doctorInfo)) uni.setStorageSync('doctor_info', JSON.stringify(this.doctorInfo))
this.$nav.navToPath("/pages/visitors/visitors?type=1&is_preview=1") this.$nav.navToPath("/pages/visitors/visitors?type=1&is_preview=1")
}, },
toPrebookList(){ toPrebookList() {
this.$nav.navToPath("/pages/prebook_list/prebook_list") this.$nav.navToPath("/pages/prebook_list/prebook_list")
}, },
toPrebookDetail(){ toPrebookDetail() {
this.$nav.navToPath("/pages/visit_detail/visit_detail") this.$nav.navToPath("/pages/visit_detail/visit_detail")
}, },
qqMapTransBMap(lng, lat) { qqMapTransBMap(lng, lat) {
@ -310,32 +367,36 @@
onShareAppMessage() { onShareAppMessage() {
return { return {
title: this.doctorInfo.doctor_info.doctor_name + '的预约挂号', title: this.doctorInfo.doctor_info.doctor_name + '的预约挂号',
path: '/pages/index/index?did='+this.doctor_id path: '/pages/index/index?did=' + this.doctor_id
}
} }
} }
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.index-page{ .index-page {
.header-wrapper{ .header-wrapper {
min-height: 208rpx; min-height: 208rpx;
padding: 27rpx 40rpx 24rpx; padding: 27rpx 40rpx 24rpx;
box-sizing: border-box; box-sizing: border-box;
.left{
.left {
width: 510rpx; width: 510rpx;
.top{
.top {
overflow: hidden; overflow: hidden;
margin-top: 31rpx; margin-top: 31rpx;
& view:first-of-type{
& view:first-of-type {
color: #333; color: #333;
letter-spacing: 1.32rpx; letter-spacing: 1.32rpx;
margin-right: 27rpx; margin-right: 27rpx;
max-width: 250rpx; max-width: 250rpx;
font-weight: 500; font-weight: 500;
} }
& view:last-of-type{
view{ & view:last-of-type {
view {
width: auto; width: auto;
padding: 0 15rpx; padding: 0 15rpx;
margin-top: 5rpx; margin-top: 5rpx;
@ -344,13 +405,14 @@
align-items: center; align-items: center;
height: 42rpx; height: 42rpx;
font-size: 28rpx; font-size: 28rpx;
background: linear-gradient( 288deg, #FFEED2 0%, #FED9A6 100%); background: linear-gradient(288deg, #FFEED2 0%, #FED9A6 100%);
border-radius: 8rpx; border-radius: 8rpx;
color: #7D501F; color: #7D501F;
} }
} }
} }
.bt{
.bt {
width: 480rpx; width: 480rpx;
line-height: 40rpx; line-height: 40rpx;
font-size: 28rpx; font-size: 28rpx;
@ -358,7 +420,8 @@
margin-top: 21rpx; margin-top: 21rpx;
} }
} }
.right{
.right {
flex-grow: 1; flex-grow: 1;
display: block; display: block;
border-radius: 100%; border-radius: 100%;
@ -366,7 +429,8 @@
width: 160rpx; width: 160rpx;
} }
} }
.block{
.block {
background: #FFFFFF; background: #FFFFFF;
border-radius: 8rpx; border-radius: 8rpx;
padding: 36rpx 24rpx; padding: 36rpx 24rpx;
@ -375,16 +439,19 @@
width: 714rpx; width: 714rpx;
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }
.desc-wrapper{
box-shadow: 0rpx 2rpx 24rpx 0rpx rgba(0,0,0,0.03); .desc-wrapper {
box-shadow: 0rpx 2rpx 24rpx 0rpx rgba(0, 0, 0, 0.03);
color: #949699; color: #949699;
font-size: 30rpx; font-size: 30rpx;
line-height: 50rpx; line-height: 50rpx;
.con{
.con {
overflow-y: auto; overflow-y: auto;
max-height: 200rpx; max-height: 200rpx;
color: #666666; color: #666666;
} }
.con::-webkit-scrollbar { .con::-webkit-scrollbar {
display: none; display: none;
width: 0; width: 0;
@ -392,8 +459,9 @@
color: transparent; color: transparent;
} }
} }
.title-wrapper{
.title{ .title-wrapper {
.title {
width: 117rpx; width: 117rpx;
height: 42rpx; height: 42rpx;
padding-left: 13rpx; padding-left: 13rpx;
@ -403,47 +471,55 @@
line-height: 42rpx; line-height: 42rpx;
text-align: center; text-align: center;
border-radius: 8rpx 0rpx 0rpx 8rpx; border-radius: 8rpx 0rpx 0rpx 8rpx;
background: linear-gradient( 98deg, #53C184 0%, #5CD378 100%); background: linear-gradient(98deg, #53C184 0%, #5CD378 100%);
} }
&.booklist .title{
&.booklist .title {
margin-bottom: 0rpx; margin-bottom: 0rpx;
} }
img{
img {
width: 48rpx; width: 48rpx;
height: 42rpx; height: 42rpx;
} }
} }
.hospital-wrapper{
.item{ .hospital-wrapper {
.item {
min-height: 207rpx; min-height: 207rpx;
width: 100%; width: 100%;
margin-bottom: 36rpx; margin-bottom: 36rpx;
border-bottom: 2rpx solid #F1F1F1; border-bottom: 2rpx solid #F1F1F1;
padding-bottom: 36rpx; padding-bottom: 36rpx;
&:last-child{ &:last-child {
margin-bottom: 0rpx; margin-bottom: 0rpx;
padding-bottom: 0rpx; padding-bottom: 0rpx;
border-bottom:none !important; border-bottom: none !important;
} }
.top{
.left{ .top {
.left {
flex-grow: 1; flex-grow: 1;
.title{
.title {
align-items: center; align-items: center;
flex-wrap: wrap; flex-wrap: wrap;
column-gap: 20rpx; column-gap: 20rpx;
row-gap: 12rpx; row-gap: 12rpx;
.hospital_name{
.hospital_name {
color: #333; color: #333;
font-size: 32rpx; font-size: 32rpx;
} }
img{
img {
width: 20rpx; width: 20rpx;
height: 32rpx; height: 32rpx;
} }
.fixed_hospital{
.fixed_hospital {
border-radius: 6rpx; border-radius: 6rpx;
background: #F7FCFF; background: #F7FCFF;
border: 2rpx solid rgba(9, 131, 208, 0.6); border: 2rpx solid rgba(9, 131, 208, 0.6);
@ -459,21 +535,24 @@
} }
} }
.date{
.date {
line-height: 40rpx; line-height: 40rpx;
font-size: 28rpx; font-size: 28rpx;
color: #949699; color: #949699;
margin-top: 22rpx; margin-top: 22rpx;
} }
} }
.right{
.right {
width: 172rpx; width: 172rpx;
flex-shrink: 0; flex-shrink: 0;
height: 100%; height: 100%;
color: #666666; color: #666666;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
.map-wrap{
.map-wrap {
font-size: 26rpx; font-size: 26rpx;
font-weight: normal; font-weight: normal;
line-height: normal; line-height: normal;
@ -481,11 +560,13 @@
color: #666666; color: #666666;
margin-top: 4rpx; margin-top: 4rpx;
} }
img{
img {
width: 52rpx; width: 52rpx;
height: 52rpx; height: 52rpx;
} }
.copy_btn{
.copy_btn {
display: block; display: block;
line-height: normal; line-height: normal;
text-align: center; text-align: center;
@ -495,7 +576,8 @@
} }
} }
} }
.center{
.center {
justify-content: flex-start; justify-content: flex-start;
align-items: center; align-items: center;
width: 100%; width: 100%;
@ -512,10 +594,12 @@
margin-bottom: 24rpx; margin-bottom: 24rpx;
word-break: break-all; word-break: break-all;
} }
.notice-collapse { .notice-collapse {
margin-top: 24rpx; margin-top: 24rpx;
::v-deep { ::v-deep {
.uni-collapse-item__title-box{ .uni-collapse-item__title-box {
padding: 0; padding: 0;
display: flex; display: flex;
justify-content: flex-start; justify-content: flex-start;
@ -526,37 +610,46 @@
font-weight: normal; font-weight: normal;
margin-top: 0rpx; margin-top: 0rpx;
} }
.uni-collapse-item__title{
.uni-collapse-item__title {
border: none !important; border: none !important;
} }
.uni-collapse-item__title-arrow{
.uni-collapse-item__title-arrow {
width: 32rpx; width: 32rpx;
height: 32rpx; height: 32rpx;
margin-left: 12rpx; margin-left: 12rpx;
} }
.uni-icons{
.uni-icons {
width: 32rpx; width: 32rpx;
height: 32rpx; height: 32rpx;
} }
.uni-collapse-item__title-text{
.uni-collapse-item__title-text {
font-size: 28rpx; font-size: 28rpx;
letter-spacing: 0.22rpx; letter-spacing: 0.22rpx;
color: #949699; color: #949699;
} }
.uni-collapse-item__title-wrap{
.uni-collapse-item__title-wrap {
width: auto; width: auto;
flex: unset; flex: unset;
} }
.content{
color:red !important; .content {
color: red !important;
} }
.uni-collapse-item__wrap-content{
.uni-collapse-item__wrap-content {
border: none !important; border: none !important;
} }
.uni-collapse-item__title.is-open{
.uni-collapse-item__title.is-open {
margin-bottom: 24rpx; margin-bottom: 24rpx;
} }
.content{
.content {
width: 100%; width: 100%;
height: auto; height: auto;
padding: 24rpx; padding: 24rpx;
@ -564,7 +657,8 @@
background: #F8F6F9; background: #F8F6F9;
border-radius: 12rpx; border-radius: 12rpx;
} }
.content .text{
.content .text {
font-size: 28rpx; font-size: 28rpx;
font-weight: normal; font-weight: normal;
line-height: 40rpx; line-height: 40rpx;
@ -575,22 +669,26 @@
} }
} }
.bot{ .bot {
margin-top: 16rpx; margin-top: 16rpx;
font-size: 32rpx; font-size: 32rpx;
} }
} }
} }
.visit-wrapper{
.visit-wrapper {
margin-bottom: 0; margin-bottom: 0;
.header{
.header {
justify-content: space-between; justify-content: space-between;
.opt{
.opt {
align-items: center; align-items: center;
overflow: hidden; overflow: hidden;
font-size: 26rpx; font-size: 26rpx;
color: #949699; color: #949699;
img{
img {
width: 20rpx; width: 20rpx;
height: 32rpx; height: 32rpx;
margin-left: 8rpx; margin-left: 8rpx;
@ -598,11 +696,103 @@
} }
} }
} }
.preg-books{
.preg-books {
width: 714rpx; width: 714rpx;
margin: 0 auto; margin: 0 auto;
} }
.getphone-box{
position: fixed;
left: 0;
top: 0;
width: 100vw;
height: 100vh;
z-index: 8999999999;
opacity: 0;
}
}
.popup-container {
position: relative;
max-height: calc(100vh - 200rpx);
overflow-y: scroll;
background: #ffffff;
border-radius: 40rpx 40rpx 0px 0px;
padding: 42rpx 48rpx 16rpx;
.header {
position: relative;
text-align: left;
.title {
font-size: 30rpx;
font-weight: 500;
line-height: 42rpx;
letter-spacing: normal;
color: #000000;
}
}
.label {
margin-top: 54rpx;
font-family: PingFang SC;
font-size: 34rpx;
font-weight: 500;
line-height: 47.6rpx;
letter-spacing: normal;
color: #000000;
}
.realName {
color: #000000;
font-size: 34rpx;
line-height: 40rpx;
height: 40rpx;
font-family: PingFang SC;
font-weight: normal;
letter-spacing: normal;
padding: 22rpx 0;
border-bottom: 2rpx solid rgba(0, 0, 0, 0.1);
margin-bottom: 160rpx;
margin-top: 22rpx;
&::placeholder {
opacity: 0.3;
}
}
.placeholder-style {
opacity: 0.3;
}
.confirm-button-wrapper {
display: flex;
align-items: center;
justify-content: center;
.confirm-button {
justify-content: center;
display: flex;
align-items: center;
font-weight: 600;
font-size: 34rpx;
color: #ffffff;
text-align: center;
width: 368rpx;
height: 80rpx;
border-radius: 8rpx;
background: #07C160;
}
} }
.date {
margin: 12rpx 36rpx 42rpx;
text-align: center;
color: #000000;
font-size: 26rpx;
font-family: PingFang SC;
}
}
</style> </style>

12
中医针灸改版2.0_2025_03_06/需求拆分.txt

@ -1,23 +1,23 @@
中医针灸患者端静态页面及样式改造 中医针灸患者端静态页面及样式改造
1.首页调整 1.首页调整
(1)首页医院地址导航在小程序中打开样式 (1)首页医院地址导航在小程序中打开样式
(2)增加就诊须知折叠面板 (2)增加预约须知折叠面板
(3)增加医保定点标签 (3)增加医保定点标签
(4)出诊医院列表样式调整 (4)出诊医院列表样式调整
2.底部公共菜单增加“现场报道”入口 2.底部公共菜单增加“现场报道”入口
3.首页医院列表部分样式调整 3.首页医院列表部分样式调整
4.选择就诊人列表页面调整 4.选择预约人列表页面调整
进行中 进行中
4.新增就诊人页面样式改造 4.新增预约人页面样式改造
5.扫码报道页面 5.扫码报道页面
6.确认报道页面 6.确认报道页面
7.确认报道空页面 7.确认报道空页面
8.候诊方式页面 8.候诊方式页面
9.个人中心页面样式改造 9.个人中心页面样式改造
11.就诊人列表页面 11.预约人列表页面
12.就诊记录页面 12.预约记录页面
13.就诊详情页面样式改造 13.预约详情页面样式改造
14.候诊状态,所在床位弹窗 14.候诊状态,所在床位弹窗
1.首页医院地址导航在小程序中打开调整 1.首页医院地址导航在小程序中打开调整

14
针灸挂号系统功能拆分.txt

@ -14,23 +14,23 @@
2.用户端首页样式调整 2.用户端首页样式调整
已完成 已完成
1.挂号就诊人页面 1.挂号预约人页面
2.新增就诊人信息页面 2.新增预约人信息页面
已完成 已完成
1.针灸挂号系统选择就诊人页面 1.针灸挂号系统选择预约人页面
2.修改就诊人信息页面 2.修改预约人信息页面
3.就诊人信息页面 3.预约人信息页面
待完成 待完成
一、患者端 静态页面 一、患者端 静态页面
2.就诊人预约挂号页面 2.预约人预约挂号页面
预计完成 2024-03-11 09:30~2024-03-11 19:00 预计完成 2024-03-11 09:30~2024-03-11 19:00
3.个人中心页面 3.个人中心页面
4.修改个人资料页面 4.修改个人资料页面
预计完成 2024-03-12 09:30~2024-03-12 19:00 预计完成 2024-03-12 09:30~2024-03-12 19:00
5.就诊人列表页面 5.预约人列表页面
预计完成 2024-03-13 09:30~2024-03-13 19:00 预计完成 2024-03-13 09:30~2024-03-13 19:00
6.预约列表页面 6.预约列表页面

Loading…
Cancel
Save