当前位置: 首页 > article >正文

便民医疗服务小程序后端springboot 服务 vue3 开发的后端 系统设计与实现

博主介绍:专注于Java(springboot ssm springcloud等开发框架) vue  .net  php phython node.js    uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
更多项目地址 介绍 翰文编程-CSDN博客

系统实现预览

4  系统设计

4.1 功能模块设计

便民医疗服务小程序根据权限类型进行分类,主要可分为用户微信、管理员医生服务端三大模块。用户微信端模块主要实现了医疗知识、预约挂号、我的操作,加强了用户的操作体验。管理员服务端模块主要根据管理员对整个系统的管理进行设计,提高了管理的效率和规范[11]。系统总体模块设计如下图所示:

图4-1 系统总体模块设计

4.2 系统数据库设计

4.2.1 数据库系统

本系统采用MySQL来进行数据库的管理。基于WEB的MySQL体积小、速度快、成本低,能够及时处理上千万条记录,初步满足和支持大型的数据库高并发的读写和高效率读写等要求。

4.2.2 数据库概念设计

概念模型用于对信息世界建模,并与指定的数据库管理系统分离。它有助于将真实世界的事物抽象为适合于数据库管理系统的数据库模型。人们往往把现实世界抽象成信息世界,再把信息世界变成机器世界。也就是说,将现实世界的目标抽象成独立于专用计算机软件和专用数据库管理系统的信息结构的数据模型,然后将物理模型转化为适合电子计算机的数据库管理系统。事实上,数据模型是从现实世界到机器世界的中间层。

信息世界的基本要素包括实体和关联。实体(entity) 客观存在并可相互区别的事物称为实体。实体可以是实际的人、事或物,还可以是抽象化的概念或联络。以下是对部分主要的关键实体E-R如下:

用户信息E-R图如下图4-2所示。

图4-2用户信息E-R图

医生信息E-R图如下图4-3所示。

图4-3医生信息E-R图

在线交流E-R图如下图4-4所示。

图4-4在线交流E-R图

报告信息E-R图如下图4-5所示。

图4-5报告信息E-R图

便民医疗服务小程序总体E-R图如下图4-5所示。

图4-5便民医疗服务小程序总体E-R图

4.2.3 数据表设计

本管理系统的数据表的设计根据管理过程中的具体流程所需,方便了管理员对数据进行新增、删除、修改和搜索的操作。

4.2.4 数据表的建立

系统使用MySQL工具对数据库进行操作,它有着简便的数据库管理操作以及强大的数据处理能力。以下是数据表的建立情况:

4-1菜单

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

menujson

longtext

4294967295

菜单

4-2科室

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

keshi

varchar

200

科室

4-3预约挂号

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

keshi

varchar

200

科室

tupian

longtext

4294967295

图片

jiuzhenshijian

varchar

200

就诊时间

guahaofei

double

挂号费

shuliang

int

数量

yuyuexuzhi

varchar

200

预约须知

4-4健康日记

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

biaoti

varchar

200

标题

neirong

longtext

4294967295

内容

xiangqing

longtext

4294967295

详情

jilushijian

datetime

记录时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

userid

bigint

用户id

4-5医疗知识评论表

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

refid

bigint

关联表id

userid

bigint

用户id

avatarurl

longtext

4294967295

头像

nickname

varchar

200

用户名

content

longtext

4294967295

评论内容

reply

longtext

4294967295

回复内容

4-6配置文件

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

name

varchar

100

配置参数名称

value

varchar

100

配置参数值

4-7token表

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

userid

bigint

用户id

username

varchar

100

用户名

tablename

varchar

100

表名

role

varchar

100

角色

token

varchar

200

密码

addtime

timestamp

新增时间

CURRENT_TIMESTAMP

expiratedtime

timestamp

过期时间

CURRENT_TIMESTAMP

4-8报告信息

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

jianchaxiangmu

varchar

200

检查项目

jianchabaogao

longtext

4294967295

检查报告

baogaojieguo

longtext

4294967295

报告结果

baogaojianjie

varchar

200

报告简介

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

userid

bigint

用户id

4-9知识类型

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

zhishileixing

varchar

200

知识类型

4-10在线交流

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

zixunneirong

longtext

4294967295

咨询内容

tupian

longtext

4294967295

图片

zixunshijian

datetime

咨询时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

shhf

longtext

4294967295

回复内容

userid

bigint

用户id

4-11健康体检

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

tijianxiangmu

varchar

200

体检项目

tijianfenlei

varchar

200

体检分类

tijiantupian

longtext

4294967295

体检图片

tijiandidian

varchar

200

体检地点

tijianfeiyong

double

体检费用

tijianliucheng

longtext

4294967295

体检流程

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

4-12用户

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yonghuzhanghao

varchar

200

用户账号

yonghumima

varchar

200

用户密码

yonghuxingming

varchar

200

用户姓名

touxiang

longtext

4294967295

头像

xingbie

varchar

200

性别

shoujihaoma

varchar

200

手机号码

4-13医生

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yishengzhanghao

varchar

200

医生账号

yishengmima

varchar

200

医生密码

yishengxingming

varchar

200

医生姓名

zhaopian

longtext

4294967295

照片

xingbie

varchar

200

性别

lianxidianhua

varchar

200

联系电话

shanzhanglingyu

varchar

200

擅长领域

keshi

varchar

200

科室

4-14hpv疫苗预约

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yimiaobianhao

varchar

200

疫苗编号

yimiaomingcheng

varchar

200

疫苗名称

yimiaoleixing

varchar

200

疫苗类型

picihao

varchar

200

批次号

shengchanriqi

varchar

200

生产日期

baozhiqi

varchar

200

保质期

shengchanchangshang

varchar

200

生产厂商

yuyueshijian

datetime

预约时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

xingbie

varchar

200

性别

4-15医疗知识

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

zhishibiaoti

varchar

200

知识标题

zhishileixing

varchar

200

知识类型

fengmian

longtext

4294967295

封面

shipin

longtext

4294967295

视频

zhishijianjie

longtext

4294967295

知识简介

zhishineirong

longtext

4294967295

知识内容

storeupnum

int

收藏数量

4-16hpv疫苗

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yimiaobianhao

varchar

200

疫苗编号

yimiaomingcheng

varchar

200

疫苗名称

yimiaoleixing

varchar

200

疫苗类型

picihao

varchar

200

批次号

tupian

longtext

4294967295

图片

shuliang

int

数量

shengchanriqi

date

生产日期

baozhiqi

varchar

200

保质期

shengchanchangshang

varchar

200

生产厂商

storeupnum

int

收藏数量

jiezhongliucheng

longtext

4294967295

接种流程

fuzuoyong

longtext

4294967295

副作用

4-17新冠疫苗预约

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yimiaobianhao

varchar

200

疫苗编号

yimiaomingcheng

varchar

200

疫苗名称

picihao

varchar

200

批次号

shengchanriqi

varchar

200

生产日期

baozhiqi

varchar

200

保质期

shengchanchangshang

varchar

200

生产厂商

yuyueshijian

datetime

预约时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

xingbie

varchar

200

性别

4-18挂号

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yuyuebianhao

varchar

200

预约编号

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

keshi

varchar

200

科室

guahaofei

double

挂号费

shuliang

varchar

200

挂号数量

yuyueshijian

datetime

预约时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

shoujihaoma

varchar

200

手机号码

ispay

varchar

200

是否支付

4-19体检预约

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

tijianxiangmu

varchar

200

体检项目

tijianfenlei

varchar

200

体检分类

tijiandidian

varchar

200

体检地点

tijianfeiyong

double

体检费用

yuyueshijian

datetime

预约时间

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

ispay

varchar

200

是否支付

4-20新冠疫苗

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

yimiaobianhao

varchar

200

疫苗编号

yimiaomingcheng

varchar

200

疫苗名称

picihao

varchar

200

批次号

tupian

longtext

4294967295

图片

shuliang

int

数量

shengchanriqi

date

生产日期

baozhiqi

varchar

200

保质期

shengchanchangshang

varchar

200

生产厂商

storeupnum

int

收藏数量

jiezhongliucheng

longtext

4294967295

接种流程

fuzuoyong

longtext

4294967295

副作用

4-21体检分类

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

tijianfenlei

varchar

200

体检分类

4-22管理员

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

username

varchar

200

用户名

password

varchar

200

密码

role

varchar

200

角色

4-23体检报告

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

tijianxiangmu

varchar

200

体检项目

tijianfenlei

varchar

200

体检分类

tijianbaogao

longtext

4294967295

体检报告

baogaoshijian

datetime

报告时间

tijianshuoming

varchar

200

体检说明

yonghuzhanghao

varchar

200

用户账号

yonghuxingming

varchar

200

用户姓名

tijianjieguo

longtext

4294967295

体检结果

yishengzhanghao

varchar

200

医生账号

yishengxingming

varchar

200

医生姓名

4-24我的收藏

字段名称

类型

长度

字段说明

主键

默认值

id

bigint

主键

  主键

addtime

timestamp

创建时间

CURRENT_TIMESTAMP

refid

bigint

refid

tablename

varchar

200

表名

name

varchar

200

名称

picture

longtext

4294967295

图片

type

varchar

200

类型(1:收藏,21:赞,22:踩,31:竞拍参与,41:关注)

inteltype

varchar

200

推荐类型

remark

varchar

200

备注

userid

bigint

用户id

5  系统实现

5.1用户微信端模块实现

游客打开微信小程序的网址后,首先看到的就是微信小程序首页界面在这里,游客能够看到便民医疗服务小程序导航条显示首页、医疗知识、预约挂号、我的,如图5-1所示。

                

图5-1微信小程序首页界面图

   

当用户进入微信小程序进行相关操作前必须注册登录在注册页面填写用户账号、密码、确认密码、头像、手机号码信息然后点击注册,如图5-2所示。

                 

图5-2用户注册界面图

用户登录用户登录页面通过填写账号、密码完成登录,如图5-3所示。

                  

图5-3用户登录界面图

用户点击预约挂号在预约挂号页面的搜索栏输入医生姓名,进行搜索,然后可以查看医生账号、医生姓名、科室、图片、就诊时间、挂号费、数量等信息如有需要点击挂号等详情操作,如图5-4所示。 

                

图5-4预约挂号界面图

主要代码

// pages/edit/edit.js
const {
detail,
option,
update,
add,
list,
    follow,
    faceMatch,
    session,
    rubbish,
    baiduIdentify
} = require("../../api/index.js")

const des = require('../../utils/des.js')
const utils = require("../../utils/index.js")

Page({

/**
* 页面的初始数据
*/
data: {
    baseURL:'',
    sessionReadArr:[],

detailList: null,
id: "",
cross:"",
ruleForm:{},
userid:getApp().globalData.userInfo.id,
userInfo:getApp().globalData.userInfo,
ro:{
},

    yuyuebianhao:"",
    yishengzhanghao:"",
    yishengxingming:"",
    keshi:"",
    guahaofei:"",
shuliang: '1',
    yuyueshijian:"请选择时间",
showyuyueshijian:false,
    yonghuzhanghao:"",
    yonghuxingming:"",
    shoujihaoma:"",
},


/**
* 生命周期函数--监听页面加载
*/
async onLoad(options) {
    let userid
    if(!this.data.userid){
        let nowTable = wx.getStorageSync("nowTable");
        const res = await session(nowTable)
        getApp().globalData.userInfo=res?.data
        userid = res?.data.id
    }
    let baseURL =wx.getStorageSync('baseURL') + '/'
const id = getApp().globalData.detailId
    this.setData({
        userid,
        refid:id,
        baseURL
    })
//人脸识别


let  ro=this.data.ro
if(options?.cross){
var obj = wx.getStorageSync('crossObj');
for (var o in obj){
if(o=='yuyuebianhao'){
this.setData({
  'ruleForm.yuyuebianhao' : obj[o],
})
ro.yuyuebianhao = true;
continue;
}
if(o=='yishengzhanghao'){
this.setData({
  'ruleForm.yishengzhanghao' : obj[o],
})
ro.yishengzhanghao = true;
continue;
}
if(o=='yishengxingming'){
this.setData({
  'ruleForm.yishengxingming' : obj[o],
})
ro.yishengxingming = true;
continue;
}
if(o=='keshi'){
this.setData({
  'ruleForm.keshi' : obj[o],
})
ro.keshi = true;
continue;
}
if(o=='guahaofei'){
this.setData({
  'ruleForm.guahaofei' : obj[o],
})
ro.guahaofei = true;
continue;
}
if(o=='shuliang'){
this.setData({
  'ruleForm.shuliang' : obj[o],
})
ro.shuliang = true;
continue;
}
if(o=='yuyueshijian'){
this.setData({
  'ruleForm.yuyueshijian' : obj[o],
})
ro.yuyueshijian = true;
continue;
}
if(o=='yonghuzhanghao'){
this.setData({
  'ruleForm.yonghuzhanghao' : obj[o],
})
ro.yonghuzhanghao = true;
continue;
}
if(o=='yonghuxingming'){
this.setData({
  'ruleForm.yonghuxingming' : obj[o],
})
ro.yonghuxingming = true;
continue;
}
if(o=='shoujihaoma'){
this.setData({
  'ruleForm.shoujihaoma' : obj[o],
})
ro.shoujihaoma = true;
continue;
}
}
  let  statusColumnName=wx.getStorageSync('statusColumnName');
    statusColumnName=statusColumnName.replace('[',"").replace(']',"");
    this.setData({
        ro,
        cross:options?.cross,
        statusColumnName
    })
}

if(id){
// 如果上一级页面传递了id,获取改id数据信息
const   data=getApp().globalData.detailList


}else {
    this.setData({
yuyuebianhao: this.getUUID(),
    })
}



// ss读取
let sessionReadArr=[]
    let yonghuzhanghao= getApp().globalData.userInfo.yonghuzhanghao
    ro.yonghuzhanghao=true
    this.setData({
            yonghuzhanghao,
    })
    sessionReadArr.push('yonghuzhanghao')
    let yonghuxingming= getApp().globalData.userInfo.yonghuxingming
    ro.yonghuxingming=true
    this.setData({
            yonghuxingming,
    })
    sessionReadArr.push('yonghuxingming')
    let shoujihaoma= getApp().globalData.userInfo.shoujihaoma
    ro.shoujihaoma=true
    this.setData({
            shoujihaoma,
    })
    sessionReadArr.push('shoujihaoma')
ro.shuliang=true

this.setData({
cross:options?.cross,
ro,
id,
 sessionReadArr

})




},

getUUID () {
return new Date().getTime();
},
onUnload: function () {
console.log('页面被卸载,执行销毁操作');
},
onShow() {
},





























































onyuyueshijianTap(){
this.setData({
    showyuyueshijian: true,
})
},
yuyueshijianTap(e) {
this.setData({
    yuyueshijian: e.detail.data
})

},






































async submit() {
    let that = this
    var query = wx.createSelectorQuery();







if(this.data.yuyueshijian=="请选择预约时间"){
this.setData({
        yuyueshijian:""
})
}





    const baseURL = wx.getStorageSync('baseURL') + "/"
    const regex = new RegExp(baseURL, "g");
const obj={
    yuyuebianhao: this.data. yuyuebianhao,
    yishengzhanghao: this.data. yishengzhanghao,
    yishengxingming: this.data. yishengxingming,
    keshi: this.data. keshi,
    guahaofei: this.data. guahaofei,
    shuliang: this.data. shuliang,
    yuyueshijian: this.data. yuyueshijian,
    yonghuzhanghao: this.data. yonghuzhanghao,
    yonghuxingming: this.data. yonghuxingming,
    shoujihaoma: this.data. shoujihaoma,
    ispay: this.data. ispay,
}
const detailId= getApp().globalData.detailId
const tableName= `guahao`

//跨表计算判断
    var obj2;
    var  ruleForm=obj
    obj2 = ruleForm
    this.data.refid==""? ruleForm['refid']= getApp().globalData.detailId:""
    ruleForm['userid']=getApp().globalData.userInfo.id
    var userInfo=getApp().globalData.userInfo
obj2 = wx.getStorageSync('crossObj');
var table = wx.getStorageSync('crossTable');
const targetshuliang_6 = ruleForm.shuliang ? ruleForm.shuliang : this.data.shuliang;
if((parseFloat(obj2[targetshuliang_6]) - parseFloat(ruleForm[targetshuliang_6])) < 0){
wx.showToast({
    icon: "none",
    title: '挂号数量不足',
});
return;
}


const sessionReadArr=this.data.sessionReadArr
const phonePattern = /^\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}$/;
const mobilePattern = /^(?:\+?86)?1[3-9]\d{9}$/;
const emailPattern = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/;
const idPattern = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}[\dxX]$/;
const urlPattern = /^(http|https):\/\/[\w\-]+(\.[\w\-]+)+[/#?]?.*$/;







































































































    //更新跨表属性
    var crossuserid;
    var crossrefid;
    var crossoptnum;

    if(this.data.cross) {
        wx.setStorageSync('crossCleanType', true);
        var statusColumnName = wx.getStorageSync('statusColumnName');
        var statusColumnValue = wx.getStorageSync('statusColumnValue');
        if (statusColumnName != '') {
                obj2 = wx.getStorageSync('crossObj');
            if (!statusColumnName.startsWith("[")) {
                for (var o in obj2) {
                    if (statusColumnName.includes(o)){
                        obj2[o] = statusColumnValue;
                    }

                }
                var table = wx.getStorageSync('crossTable');
obj2.shuliang
obj2.shuliang - this.data.shuliang
                 await update(table, obj2)
            } else {

                crossuserid =getApp().globalData.userInfo.id
                crossrefid =  this.data.id
                crossoptnum = wx.getStorageSync('statusColumnName');
                crossoptnum = crossoptnum.replace(/\[/, "").replace(/\]/, "");
                            }
        }
    }
    this.data.cross ? (crossrefid = this.data.id, crossuserid =this.data.userid) : ""

        if(crossrefid && crossuserid) {
            ruleForm['crossuserid'] = this.data.userid
            ruleForm['crossrefid'] =this.data.id

            this.setData({
                ruleForm
            })
            let params = {
                page: 1,
                limit: 10,
                crossuserid: crossuserid,
                crossrefid: crossrefid,
            }
                        const tips = wx.getStorageSync('tips')
            let corssRes = await list(`guahao`, params)
            crossoptnum = wx.getStorageSync('statusColumnName');
            crossoptnum = crossoptnum.match(/\d+/g);
            if (corssRes.data.total >= parseInt(crossoptnum)) {
                wx.showToast({
                    icon: "none",
                    title: tips,
                })
                                wx.removeStorageSync('crossCleanType');
                return ;
            }
            else {


//跨表计算











obj2 = wx.getStorageSync('crossObj');
var table = wx.getStorageSync('crossTable');
    obj2.shuliang
    obj2.shuliang - this.data.shuliang
await update(table, obj2)
if (ruleForm.id) {
await update(`guahao`, ruleForm)
}
else {
await add(`guahao`, ruleForm)
            }
        }


        }
        else {


//跨表计算
obj2 = wx.getStorageSync('crossObj');
var table = wx.getStorageSync('crossTable');
obj2.shuliang
obj2.shuliang - this.data.shuliang
await update(table, obj2)
if (ruleForm.id) {
await update(`guahao`, ruleForm)
}
else {
await add(`guahao`, ruleForm)
            }
        }
getApp().globalData.editorContent=''
wx.showToast({
title: '提交成功',
icon: "none"
})
    const preId = getApp().globalData.detailId

if(table){
    let res = await detail(table, preId)
if(res.code==0){
    getApp().globalData.detailList = res.data
}

}



            wx.navigateBack({
                delta: 1,
                complete: () => {
                    // 触发事件通知,传递需要更新的数据
                    const pages = getCurrentPages();
                    if (pages.length >= 1) {
                        const prePage = pages[pages.length - 1];
                        prePage.onLoad(); //
                    }
                }
            })













 },

onHide() {

},

/**
* 生命周期函数--监听页面卸载
*/
onUnload() {

},


/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {

},

/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {

},

/**
* 用户点击右上角分享
*/
onShareAppMessage() {

}
})

用户点击我的页面,在我的页面可以对我的收藏、在线交流、报告信息、挂号、健康日记、hpv疫苗预约、新冠疫苗预约、健康体检管理等信息,进行详细操作,如图5-5所示。

            

   图5-5我的界面图

5.2管理员服务端模块实现

管理员登录,在登录页面选择需要登录的角色,在正确输入用户名和密码后,点击登录操作;如图5-6所示。                               

图5-6管理员登录界面

管理员进入系统主页面,主要功能包括对首页、在线交流管理、报告信息管理、预约挂号管理、健康日记管理、hpv疫苗管理、健康体检管理、用户管理、新冠疫苗管理、医疗知识管理、管理员管理等进行操作。如5-7所示

5-7管理员主界面

用户信息功能在视图层(view层)进行交互,比如点击“新增”按钮或填写用户信息表单。这些用户信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如搜索、新增或删除用户信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便用户信息功能可以看到最新的信息或相应的操作反馈。在用户信息的输入栏中输入用户账号进行搜索,可以查看到用户详细信息,并根据需要进行修改或者删除等操作如图5-8所示。

图5-8用户界面图

医生信息功能在视图层(view层)进行交互,比如点击“新增”按钮或填写医生信息表单。这些医生信息动作被视图层捕获并作为请求发送给相应的控制器层(control1er层)。控制器接收到这些请求后,调用服务层(service层)以执行相关的业务逻辑,例如验证输入数据的有效性和与数据库的交互。服务层处理完这些逻辑后,进一步与数据访问对象层(DAO层)交互,后者负责具体的数据操作如搜索、新增或删除医生信息,并将操作结果返回给控制器。最终,控制器根据这些结果更新视图层,以便医生信息功能可以看到最新的信息或相应的操作反馈。在医生信息的输入栏中输入医生账号进行搜索,可以查看到医生详细信息,并根据需要进行修改或者删除等操作如图5-9所示。

图5-9医生界面图

管理员点击在线交流,在在线交流页面输入医生账号、医生姓名、图片、咨询时间、用户账号、用户姓名、回复等信息,进行搜索或者删除在线交流操作,如图5-10所示。

图5-10在线交流界面图

主要代码:


<template>
	<div>
		<div class="app-contain">
			<div class="list_search_view">
				<el-form :model="searchQuery" class="search_form" >
					<div class="search_view">
						<div class="search_label">
							医生账号:
						</div>
						<div class="search_box">
							<el-select
								class="search_sel"
								clearable
								v-model="searchQuery.yishengzhanghao" 
								placeholder="医生账号"
								>
								<el-option v-for="item in yishengzhanghaoLists" :label="item" :value="item"></el-option>
							</el-select>
						</div>
					</div>
					<div class="search_btn_view">
						<el-button class="search_btn" type="primary" @click="searchClick()" size="small">搜索</el-button>
					</div>
				</el-form>
				<br>
				<div class="btn_view">
					<el-button type="success" @click="addClick" v-if="btnAuth('zaixianjiaoliu','新增')">新增</el-button>
					<el-button  v-if=" btnAuth('zaixianjiaoliu','查看')" type="info"  :disabled="selRows.length==1?false:true" @click="infoClick(null)">详情</el-button>
					<el-button type="primary" :disabled="selRows.length==1?false:true" @click="editClick" v-if=" btnAuth('zaixianjiaoliu','修改')">修改</el-button>
					<el-button type="danger" :disabled="selRows.length?false:true" @click="delClick(null)"  v-if="btnAuth('zaixianjiaoliu','删除')">删除</el-button>
				</div>
			</div>
			<br>
			<el-table
				v-loading="listLoading"
				border 
				:stripe='true'
				@selection-change="handleSelectionChange" 
				ref="table"
				v-if="btnAuth('zaixianjiaoliu','查看')"
				:data="list"
				@row-click="listChange">
				<el-table-column :resizable='true' align="left" header-align="center" type="selection" width="55" />
				<el-table-column label="序号" width="70" :resizable='true' :sortable='true' align="left" header-align="center">
					<template #default="scope">{{ scope.$index + 1}}</template>
				</el-table-column>
				<el-table-column
					 :resizable='true' 
					 :sortable='true' 
					 align="left" 
					 header-align="center"
					label="医生账号">
					<template #default="scope">
						{{scope.row.yishengzhanghao}}
					</template>
				</el-table-column>
				<el-table-column
					 :resizable='true' 
					 :sortable='true' 
					 align="left" 
					 header-align="center"
					label="医生姓名">
					<template #default="scope">
						{{scope.row.yishengxingming}}
					</template>
				</el-table-column>
				<el-table-column label="图片" width="120" :resizable='true' :sortable='true' align="left" header-align="center">
					<template #default="scope">
						<div v-if="scope.row.tupian">
							<el-image v-if="scope.row.tupian.substring(0,4)=='http'" preview-teleported
								:preview-src-list="[scope.row.tupian.split(',')[0]]"
								:src="scope.row.tupian.split(',')[0]" style="width:100px;height:100px"></el-image>
							<el-image v-else preview-teleported
								:preview-src-list="[$config.url+scope.row.tupian.split(',')[0]]"
								:src="$config.url+scope.row.tupian.split(',')[0]" style="width:100px;height:100px">
							</el-image>
						</div>
						<div v-else>无图片</div>
					</template>
				</el-table-column>
				<el-table-column
					 :resizable='true' 
					 :sortable='true' 
					 align="left" 
					 header-align="center"
					label="咨询时间">
					<template #default="scope">
						{{scope.row.zixunshijian}}
					</template>
				</el-table-column>
				<el-table-column
					 :resizable='true' 
					 :sortable='true' 
					 align="left" 
					 header-align="center"
					label="用户账号">
					<template #default="scope">
						{{scope.row.yonghuzhanghao}}
					</template>
				</el-table-column>
				<el-table-column
					 :resizable='true' 
					 :sortable='true' 
					 align="left" 
					 header-align="center"
					label="用户姓名">
					<template #default="scope">
						{{scope.row.yonghuxingming}}
					</template>
				</el-table-column>
				<el-table-column label="回复" :resizable='true' :sortable='true' align="left" header-align="center">
					<template #default="scope">
						{{scope.row.shhf}}
					</template>
				</el-table-column>
				<el-table-column label="审核" v-if="btnAuth('zaixianjiaoliu','审核')" :resizable='true' :sortable='true' align="left" header-align="center">
					<template #default="scope">
						<el-button type="text" @click="approvalClick(scope.row)">回复</el-button>
					</template>
				</el-table-column>
				<el-table-column label="操作" width="300" :resizable='true' :sortable='true' align="left" header-align="center">
					<template #default="scope">
						<el-button type="info" v-if=" btnAuth('zaixianjiaoliu','查看')" @click="infoClick(scope.row.id)">详情</el-button>
					</template>
				</el-table-column>
			</el-table>
			<el-pagination 
				background
				:layout="layouts.join(',')"
				:total="total" 
				:page-size="listQuery.limit"
				prev-text="<"
				next-text=">"
				:hide-on-single-page="true"
				:style='{"padding":"0","margin":"20px 0 0","whiteSpace":"nowrap","color":"#333","textAlign":"center","width":"100%","fontWeight":"500"}'
				@size-change="sizeChange"
				@current-change="currentChange" 
				@prev-click="prevClick"
				@next-click="nextClick"  />
		</div>
		<formModel ref="formRef" @formModelChange="formModelChange"></formModel>
		<Approval ref="approvalRef" :tableName="tableName" @shChange="searchClick()"></Approval>
	</div>
</template>
<script setup>
	import axios from 'axios'
	import {
		reactive,
		ref,
		getCurrentInstance,
		nextTick,
		onMounted,
		watch,
	} from 'vue'
	import {
		useRoute,
		useRouter
	} from 'vue-router'
	import {
		ElMessageBox
	} from 'element-plus'
	const context = getCurrentInstance()?.appContext.config.globalProperties;
	import formModel from './formModel.vue'
	
	//基础信息
	const tableName = 'zaixianjiaoliu'
	const formName = '在线交流'
	const route = useRoute()
	//基础信息
	onMounted(()=>{
	})
	//列表数据
	const list = ref(null)
	const table = ref(null)
	const listQuery = ref({
		page: 1,
		limit: 20,
		sort: 'id',
		order: 'desc'
	})
	const searchQuery = ref({})
	const selRows = ref([])
	const listLoading = ref(false)
	const listChange = (row) =>{
		nextTick(()=>{
			table.value.clearSelection()
			table.value.toggleRowSelection(row)
		})
	}
	//列表
	const getList = () => {
		listLoading.value = true
		let params = JSON.parse(JSON.stringify(listQuery.value))
		params['sort'] = 'id'
		params['order'] = 'desc'
		if(searchQuery.value.yishengzhanghao&&searchQuery.value.yishengzhanghao!=''){
			params['yishengzhanghao'] = searchQuery.value.yishengzhanghao
		}
		context?.$http({
			url: `${tableName}/page`,
			method: 'get',
			params: params
		}).then(res => {
			listLoading.value = false
			list.value = res.data.data.list
			total.value = Number(res.data.data.total)
		})
	}
	//删
	const delClick = (id) => {
		let ids = ref([])
		if (id) {
			ids.value = [id]
		} else {
			if (selRows.value.length) {
				for (let x in selRows.value) {
					ids.value.push(selRows.value[x].id)
				}
			} else {
				return false
			}
		}
		ElMessageBox.confirm(`是否删除选中${formName}`, '提示', {
			confirmButtonText: '是',
			cancelButtonText: '否',
			type: 'warning',
		}).then(() => {
			context?.$http({
				url: `${tableName}/delete`,
				method: 'post',
				data: ids.value
			}).then(res => {
				context?.$toolUtil.message('删除成功', 'success',()=>{
					getList()
				})
			})
		})
	}
	//多选
	const handleSelectionChange = (e) => {
		selRows.value = e
	}
	//列表数据
	//分页
	const total = ref(0)
	const layouts = ref(["total","prev","pager","next","jumper"])
	const sizeChange = (size) => {
		listQuery.value.limit = size
		getList()
	}
	const currentChange = (page) => {
		listQuery.value.page = page
		getList()
	}
	const prevClick = () => {
		listQuery.value.page = listQuery.value.page - 1
		getList()
	}
	const nextClick = () => {
		listQuery.value.page = listQuery.value.page + 1
		getList()
	}
	//分页
	//权限验证
	const btnAuth = (e,a)=>{
		return context?.$toolUtil.isAuth(e,a)
	}
	//搜索
	const yishengzhanghaoLists = ref([])
	const getyishengzhanghaoLists = () => {
		context?.$http({
			url: 'option/yisheng/yishengzhanghao',
			method:'get'
		}).then(res=>{
			yishengzhanghaoLists.value = res.data.data
		})
	}
	getyishengzhanghaoLists()
	const searchClick = () => {
		listQuery.value.page = 1
		getList()
	}
	//表单
	const formRef = ref(null)
	const formModelChange=()=>{
		searchClick()
	}
	const addClick = ()=>{
		formRef.value.init()
	}
	const editClick = ()=>{
		if(selRows.value.length){
			formRef.value.init(selRows.value[0].id,'edit')
		}
	}
	
	const infoClick = (id=null)=>{
		if(id){
			formRef.value.init(id,'info')
		}
		else if(selRows.value.length){
			formRef.value.init(selRows.value[0].id,'info')
		}
	}
	// 表单
	// 预览文件
	const preClick = (file) =>{
		if(!file){
			context?.$toolUtil.message('文件不存在','error')
		}
		window.open(context?.$config.url + file)
		// const a = document.createElement('a');
		// a.style.display = 'none';
		// a.setAttribute('target', '_blank');
		// file && a.setAttribute('download', file);
		// a.href = context?.$config.url + file;
		// document.body.appendChild(a);
		// a.click();
		// document.body.removeChild(a);
	}
	// 下载文件
	const download = (file) => {
		if(!file){
			context?.$toolUtil.message('文件不存在','error')
		}
		let arr = file.replace(new RegExp('file/', "g"), "")
		axios.get((location.href.split(context?.$config.name).length>1 ? location.href.split(context?.$config.name)[0] :'') + context?.$config.name + '/file/download?fileName=' + arr, {
			headers: {
				token: context?.$toolUtil.storageGet('Token')
			},
			responseType: "blob"
		}).then(({
			data
		}) => {
			const binaryData = [];
			binaryData.push(data);
			const objectUrl = window.URL.createObjectURL(new Blob(binaryData, {
				type: 'application/pdf;chartset=UTF-8'
			}))
			const a = document.createElement('a')
			a.href = objectUrl
			a.download = arr
			// a.click()
			// 下面这个写法兼容火狐
			a.dispatchEvent(new MouseEvent('click', {
				bubbles: true,
				cancelable: true,
				view: window
			}))
			window.URL.revokeObjectURL(data)
		})
	}

	//审核
	import Approval from '@/components/common/approval.vue'
	const approvalRef = ref(null)
	const approvalClick = (row) => {
		let params = {
			id:row.id,
			yishengzhanghao: row.yishengzhanghao,
			yishengxingming: row.yishengxingming,
			zixunneirong: row.zixunneirong,
			tupian: row.tupian,
			zixunshijian: row.zixunshijian,
			yonghuzhanghao: row.yonghuzhanghao,
			yonghuxingming: row.yonghuxingming,
			shhf: row.shhf,
			userid: row.userid,
		}
		nextTick(() => {
			approvalRef.value.approvalClick(params ,2)
		})
	}

	//初始化
	const init = () => {
		getList()
	}
	init()
</script>
<style lang="scss" scoped>
	
	// 操作盒子
	.list_search_view {
		margin: 0 0 20px;
		// 搜索盒子
		.search_form {
			display: flex;
			align-items: center;
			// 子盒子
			.search_view {
				margin: 0 14px 0 0;
				display: flex;
				align-items: center;
				// 搜索label
				.search_label {
					margin: 0 10px 0 0;
					color: #787878;
					font-weight: 500;
					display: inline-block;
					font-size: 14px;
					line-height: 40px;
					height: 40px;
				}
				// 搜索item
				.search_box {
					display: flex;
					width: calc(100% - 100px);
					// 下拉框
					:deep(.search_sel) {
						border: 0px solid #ddd;
						border-radius: 20px;
						padding: 0 10px;
						background: #fff;
						width: 100%;
						line-height: 36px;
						box-sizing: border-box;
						//去掉默认样式
						.select-trigger{
							height: 100%;
							.el-input{
								height: 100%;
								.el-input__wrapper{
									border: none;
									box-shadow: none;
									background: none;
									border-radius: 0;
									height: 100%;
									padding: 0;
								}
								.is-focus {
									box-shadow: none !important;
								}
							}
						}
					}
				}
			}
			// 搜索按钮盒子
			.search_btn_view {
				width: 20%;
				display: flex;
				padding: 0 20px;
				// 搜索按钮
				.search_btn {
					border: 0;
					cursor: pointer;
					border-radius: 4px;
					padding: 0 24px;
					box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
					outline: 4px solid #EAF5FF;
					color: #2C2C2C;
					background: #96C6EE;
					width: auto;
					font-size: 14px;
					height: 40px;
				}
				// 搜索按钮-悬浮
				.search_btn:hover {
					background: rgba(150, 198, 238, 0.5);
				}
			}
		}
		//头部按钮盒子
		.btn_view {
			margin: 20px 0;
			display: flex;
			// 其他
			:deep(.el-button--default){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 其他-悬浮
			:deep(.el-button--default:hover){
				background: rgba(150, 198, 238, 0.5);
			}
			// 新增
			:deep(.el-button--success){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 新增-悬浮
			:deep(.el-button--success:hover){
				background: rgba(150, 198, 238, 0.5);
			}
			// 修改
			:deep(.el-button--primary){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 修改-悬浮
			:deep(.el-button--primary:hover){
				background: rgba(150, 198, 238, 0.5);
			}
			// 详情
			:deep(.el-button--info){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 详情-悬浮
			:deep(.el-button--info:hover){
				background: rgba(150, 198, 238, 0.5);
			}
			// 删除
			:deep(.el-button--danger){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 删除-悬浮
			:deep(.el-button--danger:hover){
				background: rgba(150, 198, 238, 0.5);
			}
			// 统计
			:deep(.el-button--warning){
				border: none;
				border-radius: 4px;
				padding: 0 24px;
				box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
				outline: 4px solid #EAF5FF;
				color: #2C2C2C;
				background: #96C6EE;
				width: auto;
				font-size: 14px;
				height: 30px;
			}
			// 统计-悬浮
			:deep(.el-button--warning:hover){
				background: rgba(150, 198, 238, 0.5);
			}
		}
	}
	// 表格样式
	.el-table {
		border-radius: 10px;
		padding: 0;
		width: 100%;
		border-color: #eee;
		border-width: 0;
		border-style: solid;
		:deep(.el-table__header-wrapper) {
			thead {
				color: rgba(98, 184, 255, 1);
				background: #fff;
				font-weight: 500;
				width: 100%;
				tr {
					background: #fff;
					th {
						padding: 12px 0;
						border-color: #eee;
						border-width: 0;
						border-style: solid;
						text-align: left;
						.cell {
							padding: 0 10px;
							word-wrap: normal;
							word-break: break-all;
							white-space: normal;
							font-weight: bold;
							display: inline-block;
							vertical-align: middle;
							width: 100%;
							line-height: 24px;
							position: relative;
							text-overflow: ellipsis;
						}
					}
				}
			}
		}
		:deep(.el-table__body-wrapper) {
			tbody {
				width: 100%;
				tr {
					background: #fff;
					td {
						padding: 12px 0;
						color: #999;
						background: #fff;
						border-color: #eee;
						border-width: 0;
						border-style: solid;
						text-align: left;
						.cell {
							padding: 6px 10px;
							overflow: hidden;
							word-break: break-all;
							white-space: normal;
							line-height: 24px;
							text-overflow: ellipsis;
							// 编辑
							.el-button--primary {
								border: none;
								border-radius: 4px;
								padding: 0 24px;
								box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
								outline: 4px solid #EAF5FF;
								margin: 8px;
								color: #2c2c2c;
								background: #96C6EE;
								width: auto;
								font-size: 14px;
								height: 30px;
							}
							// 编辑-悬浮
							.el-button--primary:hover {
								background: rgba(150, 198, 238, 0.5);
							}
							// 详情
							.el-button--info {
								border: none;
								border-radius: 4px;
								padding: 0 24px;
								box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
								outline: 4px solid #EAF5FF;
								margin: 8px;
								color: #2c2c2c;
								background: #96C6EE;
								width: auto;
								font-size: 14px;
								height: 30px;
							}
							// 详情-悬浮
							.el-button--info:hover {
								background: rgba(150, 198, 238, 0.5);
							}
							// 删除
							.el-button--danger {
								border: none;
								border-radius: 4px;
								padding: 0 24px;
								box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
								outline: 4px solid #EAF5FF;
								margin: 8px;
								color: #2c2c2c;
								background: #96C6EE;
								width: auto;
								font-size: 14px;
								height: 30px;
							}
							// 删除-悬浮
							.el-button--danger:hover {
								background: rgba(150, 198, 238, 0.5);
							}
							// 跨表
							.el-button--success {
								border: none;
								border-radius: 4px;
								padding: 0 24px;
								box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
								outline: 4px solid #EAF5FF;
								margin: 8px;
								color: #2c2c2c;
								background: #96C6EE;
								width: auto;
								font-size: 14px;
								height: 30px;
							}
							// 跨表-悬浮
							.el-button--success:hover {
								background: rgba(150, 198, 238, 0.5);
							}
							// 操作
							.el-button--warning {
								border: none;
								border-radius: 4px;
								padding: 0 24px;
								box-shadow: inset 0px 4px 10px 0px rgba(147,147,147,0.302);
								outline: 4px solid #EAF5FF;
								margin: 8px;
								color: #2c2c2c;
								background: #96C6EE;
								width: auto;
								font-size: 14px;
								height: 30px;
							}
							// 操作-悬浮
							.el-button--warning:hover {
								background: rgba(150, 198, 238, 0.5);
							}
						}
					}
				}
				tr.el-table__row--striped {
					td {
						background: rgba(239, 241, 243, 1);
					}
				}
				tr:hover {
					td {
						padding: 12px 0;
						color: #fff;
						background: rgba(98, 184, 255, 1);
						border-color: #eee;
						border-width: 0;
						border-style: solid;
						text-align: left;
					}
				}
			}
		}
	}
	// 分页器
	.el-pagination {
		// 总页码
		:deep(.el-pagination__total) {
			margin: 0 10px 0 0;
			color: #666;
			font-weight: 400;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			height: 28px;
		}
		// 上一页
		:deep(.btn-prev) {
			border: none;
			border-radius: 2px;
			padding: 0;
			margin: 0 5px;
			color: #666;
			background: #f4f4f5;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			min-width: 35px;
			height: 28px;
		}
		// 下一页
		:deep(.btn-next) {
			border: none;
			border-radius: 2px;
			padding: 0;
			margin: 0 5px;
			color: #666;
			background: #f4f4f5;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			min-width: 35px;
			height: 28px;
		}
		// 上一页禁用
		:deep(.btn-prev:disabled) {
			border: none;
			cursor: not-allowed;
			border-radius: 2px;
			padding: 0;
			margin: 0 5px;
			color: #C0C4CC;
			background: #f4f4f5;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			height: 28px;
		}
		// 下一页禁用
		:deep(.btn-next:disabled) {
			border: none;
			cursor: not-allowed;
			border-radius: 2px;
			padding: 0;
			margin: 0 5px;
			color: #C0C4CC;
			background: #f4f4f5;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			height: 28px;
		}
		// 页码
		:deep(.el-pager) {
			padding: 0;
			margin: 0;
			display: inline-block;
			vertical-align: top;
			// 数字
			.number {
				cursor: pointer;
				padding: 0 4px;
				margin: 0 5px;
				color: #666;
				display: inline-block;
				vertical-align: top;
				font-size: 13px;
				line-height: 28px;
				border-radius: 2px;
				background: #f4f4f5;
				text-align: center;
				min-width: 30px;
				height: 28px;
			}
			// 数字悬浮
			.number:hover {
				cursor: pointer;
				padding: 0 4px;
				margin: 0 5px;
				color: #fff;
				display: inline-block;
				vertical-align: top;
				font-size: 13px;
				line-height: 28px;
				border-radius: 2px;
				background: linear-gradient(133deg, #9CC8EB 0%, #61B7FE 100%);
				text-align: center;
				min-width: 30px;
				height: 28px;
			}
			// 选中
			.number.is-active {
				cursor: default;
				padding: 0 4px;
				margin: 0 5px;
				color: #FFF;
				display: inline-block;
				vertical-align: top;
				font-size: 13px;
				line-height: 28px;
				border-radius: 2px;
				background: linear-gradient(133deg, #9CC8EB 0%, #61B7FE 100%);
				text-align: center;
				min-width: 30px;
				height: 28px;
			}
		}
		// sizes
		:deep(.el-pagination__sizes) {
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			height: 28px;
			.el-select {
				border: 1px solid #DCDFE6;
				cursor: pointer;
				padding: 0;
				color: #606266;
				display: inline-block;
				font-size: 13px;
				line-height: 28px;
				border-radius: 3px;
				outline: 0;
				background: #FFF;
				width: 100%;
				text-align: center;
				height: 28px;
			}
		}
		// 跳页
		:deep(.el-pagination__jump) {
			margin: 0 0 0 24px;
			color: #606266;
			display: inline-block;
			vertical-align: top;
			font-size: 13px;
			line-height: 28px;
			height: 28px;
			// 输入框
			.el-input {
				border: 1px solid #DCDFE6;
				cursor: pointer;
				padding: 0 3px;
				color: #606266;
				display: inline-block;
				font-size: 14px;
				line-height: 28px;
				border-radius: 3px;
				outline: 0;
				background: #FFF;
				width: 100%;
				text-align: center;
				height: 28px;
				//去掉默认样式
				.el-input__wrapper{
					border: none;
					box-shadow: none;
					background: none;
					border-radius: 0;
					height: 100%;
					padding: 0;
				}
				.is-focus {
					box-shadow: none !important;
				}
			}
		}
	}
</style>

管理员点击报告信息,在报告信息页面的对检查项目、检查报告、报告简介、用户账号、用户姓名、医生账号、医生姓名等信息,进行搜索或者删除报告信息操作,如图5-11所示。

图5-11报告信息界面图

管理员点击挂号,在挂号页面对预约编号、医生账号、医生姓名、科室、挂号费、挂号数量、预约时间、用户账号、用户姓名、手机号码、支付状态等信息,进行搜索或者删除挂号操作,如图5-12所示。

图5-12挂号界面图

大家点赞、收藏、关注、评论啦  其他的定制服务  下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者


http://www.kler.cn/news/342332.html

相关文章:

  • springmvc直接访问 上下文路径 302 后路径更改并跳转源码解析
  • 【系统架构设计师】案例专题三:数据库系统考点梳理
  • 图像分割恢复方法
  • AI智能体:共塑企业变革新纪元,引领未来无限潜能
  • Hessian 序列化
  • Java面试题——第十篇
  • Midjourney中文版:解锁你的创意之旅
  • [红队apt]CHM电子书攻击/电子教程攻击
  • 微软确认Word离奇Bug 命名不当会导致文件被删
  • 塔吊识别数据集 yolo格式 共5076张图片 已划分好训练验证 txt格式 yolo可直接使用
  • VAS1800Q奇力科技线性芯片电荷泵热处理
  • set有哪些实现类?
  • 洗衣店管理革命:Spring Boot订单系统
  • 最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)
  • 现货黄金价格走势图策略分析 先看“势”
  • 鸿蒙NEXT开发-页面路由(基于最新api12稳定版)
  • Excel中使用SQL语句的四种方法
  • 走进异常类的世界,自定义业务异常类实现指南
  • 多jdk版本环境下,jenkins系统设置需指定JAVA_HOME环境变量
  • AI 概念大杂烩