目录

  • 一、就诊人管理需求和接口开发
    • 1、需求
    • 2、就诊人管理接口
  • 二、就诊人管理前端整合
    • 1、封装api请求
    • 2、就诊人列表
    • 3、就诊人添加与修改
    • 4、就诊人详情与删除
  • 三、平台用户管理-用户列表
    • 1、用户列表接口
    • 2、用户列表前端整合
  • 四、平台用户管理-用户锁定
  • 五、平台用户管理-用户详情
    • 1、用户详情接口
  • 六、用户认证列表
    • 1、用户认证列表接口
    • 2、用户认证列表前端
  • 七、用户认证审批![在这里插入图片描述](https://img-blog.csdnimg.cn/375e9cdb8d9c4ee7aca9f7c3355c2333.png)
    • 1、用户认证审批接口
    • 2、用户认证审批前端

一、就诊人管理需求和接口开发

1、需求

预约下单需要选择就诊人,因此我们要实现就诊人管理,就诊人管理其实就是要实现一个完整的增删改查

2、就诊人管理接口

(1)引入依赖

<dependencies><dependency><groupId>com.donglin</groupId><artifactId>service_cmn_client</artifactId><version>0.0.1-SNAPSHOT</version></dependency>
</dependencies>

(2)添加PatientMapper

public interface PatientMapper extends BaseMapper<Patient> {}

(3)添加PatientService
前端需要这个类型,这里用了openfeign,远程调用cmn服务器

public interface PatientService extends IService<Patient> {List<Patient> findAll(String token);Patient getPatient(Long id);
}

(4)添加PatientServiceImpl

@Service
public class PatientServiceImpl extends ServiceImpl<PatientMapper, Patient> implements PatientService {@Autowiredprivate DictFeignClient dictFeignClient;@Overridepublic List<Patient> findAll(@RequestHeader String token) {Long userId = JwtHelper.getUserId(token);QueryWrapper<Patient> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",userId);List<Patient> patients = baseMapper.selectList(queryWrapper);patients.stream().forEach(item->{this.packagePatient(item);});return patients;}@Overridepublic Patient getPatient(Long id) {Patient patients = baseMapper.selectById(id);this.packagePatient(patients);return patients;}private void packagePatient(Patient item) {item.getParam().put("certificatesTypeString",dictFeignClient.getNameByValue(Long.parseLong(item.getCertificatesType())));item.getParam().put("provinceString",dictFeignClient.getNameByValue(Long.parseLong(item.getProvinceCode())));item.getParam().put("cityString",dictFeignClient.getNameByValue(Long.parseLong(item.getCityCode())));item.getParam().put("districtString",dictFeignClient.getNameByValue(Long.parseLong(item.getDistrictCode())));}
}

(5)添加PatientController

@RestController
@RequestMapping("/user/userinfo/patient")
public class PatientController {@Autowiredprivate PatientService patientService;//获取就诊人列表@GetMapping("/all")public R findAll(@RequestHeader String token) {List<Patient> list = patientService.findAll(token);return R.ok().data("list",list);}//添加就诊人@PostMapping("/save")public R savePatient(@RequestBody Patient patient, @RequestHeader String token) {//获取当前登录用户idLong userId = JwtHelper.getUserId(token);patient.setUserId(userId);patientService.save(patient);return R.ok();}//根据id获取就诊人信息,修改就诊人信息时回显@GetMapping("detail/{id}")public R getPatient(@PathVariable Long id) {Patient patient = patientService.getPatient(id);return R.ok().data("patient",patient);}//修改就诊人@PostMapping("/update")public R updatePatient(@RequestBody Patient patient) {patientService.updateById(patient);return R.ok();}//删除就诊人@DeleteMapping("/remove/{id}")public R removePatient(@PathVariable Long id) {patientService.removeById(id);return R.ok();}
}

二、就诊人管理前端整合

1、封装api请求

创建api/patient.js

import request from '@/utils/request'const api_name = `/user/userinfo/patient`export default {//就诊人列表findList() {return request({url: `${api_name}/all`,method: `get`})},//根据id查询就诊人信息getById(id) {return request({url: `${api_name}/detail/${id}`,method: 'get'})
},//添加就诊人信息save(patient) {return request({url: `${api_name}/save`,method: 'post',data: patient})},//修改就诊人信息updateById(patient) {return request({url: `${api_name}/update`,method: 'post',data: patient})},//删除就诊人信息removeById(id) {return request({url: `${api_name}/remove/${id}`,method: 'delete'})}
}

2、就诊人列表


创建pages/patient/index.vue

<template><!-- header --><div class="nav-container page-component"><!--左侧导航 #start --><div class="nav left-nav"><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/user'">实名认证 </span></div><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/order'"> 挂号订单 </span></div><div class="nav-item selected"><span class="v-link selected dark" onclick="javascript:window.location='/patient'"> 就诊人管理 </span></div><div class="nav-item "><span class="v-link clickable dark"> 修改账号信息 </span></div><div class="nav-item "><span class="v-link clickable dark"> 意见反馈 </span></div></div><!-- 左侧导航 #end --><!-- 右侧内容 #start --><div class="page-container"><div class="personal-patient"><div class="header-wrapper"><div class="title"> 就诊人管理</div></div><div class="content-wrapper"><el-card class="patient-card" shadow="always" v-for="item in patientList" :key="item.id"><div slot="header" class="clearfix"><div><span class="name">{{ item.name }}</span><span>{{ item.certificatesNo }} {{ item.param.certificatesTypeString }}</span><div  class="detail" @click="show(item.id)"> 查看详情 <span  class="iconfont"></span></div></div></div><div class="card SELF_PAY_CARD"><div class="info"><span class="type">{{ item.isInsure == 0 ? '自费' : '医保'}}</span><span class="card-no">{{ item.certificatesNo }}</span><span class="card-view">{{ item.param.certificatesTypeString }}</span></div><span class="operate"></span></div><div class="card"><div class="text bind-card"></div></div></el-card><div class="item-add-wrapper v-card clickable" @click="add()"><div class=""><div>+ 添加就诊人</div></div></div></div></div></div><!-- 右侧内容 #end --></div><!-- footer -->
</template>
<script>
import '~/assets/css/hospital_personal.css'
import '~/assets/css/hospital.css'
import '~/assets/css/personal.css'import patientApi from '@/api/patient'export default {data() {return {patientList: []}},mounted() {this.findPatientList()},methods: {findPatientList() {patientApi.findList().then(response => {this.patientList = response.data.listconsole.log(this.patientList)})},add() {window.location.href = '/patient/add'},show(id) {window.location.href = '/patient/show?id=' + id}}}
</script>
<style>.header-wrapper .title {font-size: 16px;margin-top: 0;}.content-wrapper {margin-left: 0;}.patient-card .el-card__header .detail{font-size: 14px;}
</style>

3、就诊人添加与修改

添加/pages/patient/add.vue组件

<template><!-- header --><div class="nav-container page-component"><!--左侧导航 #start --><div class="nav left-nav"><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/user'">实名认证 </span></div><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/order'"> 挂号订单 </span></div><div class="nav-item selected"><span class="v-link selected dark" onclick="javascript:window.location='/patient'"> 就诊人管理 </span></div><div class="nav-item "><span class="v-link clickable dark"> 修改账号信息 </span></div><div class="nav-item "><span class="v-link clickable dark"> 意见反馈 </span></div></div><!-- 左侧导航 #end --><!-- 右侧内容 #start --><div class="page-container"><div class="personal-patient"><div class="header-wrapper"><div class="title"> 添加就诊人</div></div><div><div class="sub-title"><div class="block"></div>就诊人信息</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left" ref="patient" :rules="validateRules"><el-form-item prop="name" label="姓名:"><el-input v-model="patient.name" placeholder="请输入真实姓名全称" class="input v-input"/></el-form-item><el-form-item prop="certificatesType" label="证件类型:"><el-select v-model="patient.certificatesType" placeholder="请选择证件类型" class="v-select patient-select"><el-optionv-for="item in certificatesTypeList":key="item.value":label="item.name":value="item.value"></el-option></el-select></el-form-item><el-form-item prop="certificatesNo" label="证件号码:"><el-input v-model="patient.certificatesNo" placeholder="请输入证件号码" class="input v-input"/></el-form-item><el-form-item prop="sex" label="性别:"><el-radio-group v-model="patient.sex"><el-radio :label="1">男</el-radio><el-radio :label="0">女</el-radio></el-radio-group></el-form-item><el-form-item prop="birthdate" label="出生日期:"><el-date-pickerv-model="patient.birthdate"class="v-date-picker"type="date"placeholder="选择日期"></el-date-picker></el-form-item><el-form-item prop="phone" label="手机号码:"><el-input v-model="patient.phone" placeholder="请输入手机号码" maxlength="11" class="input v-input"/></el-form-item></el-form></div><div class="sub-title"><div class="block"></div>建档信息(完善后部分医院首次就诊不排队建档)</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left" ref="patient" :rules="validateRules"><el-form-item prop="isMarry" label="婚姻状况:"><el-radio-group v-model="patient.isMarry"><el-radio :label="0">未婚</el-radio><el-radio :label="1">已婚</el-radio></el-radio-group></el-form-item><el-form-item prop="isInsure" label="自费/医保:"><el-radio-group v-model="patient.isInsure"><el-radio :label="0">自费</el-radio><el-radio :label="1">医保</el-radio></el-radio-group></el-form-item><el-form-item prop="addressSelected" label="当前住址:"><el-cascaderref="selectedShow"v-model="patient.addressSelected"class="v-address":props="props"></el-cascader></el-form-item><el-form-item prop="address" label="详细地址:"><el-input v-model="patient.address" placeholder="应公安机关要求,请填写现真实住址" class="input v-input"/></el-form-item></el-form></div><div class="sub-title"><div class="block"></div>联系人信息(选填)</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left"><el-form-item prop="contactsName" label="姓名:"><el-input v-model="patient.contactsName" placeholder="请输入联系人姓名全称" class="input v-input"/></el-form-item><el-form-item prop="contactsCertificatesType" label="证件类型:"><el-select v-model="patient.contactsCertificatesType" placeholder="请选择证件类型" class="v-select patient-select"><el-optionv-for="item in certificatesTypeList":key="item.value":label="item.name":value="item.value"></el-option></el-select></el-form-item><el-form-item prop="contactsCertificatesNo" label="证件号码:"><el-input v-model="patient.contactsCertificatesNo" placeholder="请输入联系人证件号码" class="input v-input"/></el-form-item><el-form-item prop="contactsPhone" label="手机号码:"><el-input v-model="patient.contactsPhone" placeholder="请输入联系人手机号码" class="input v-input"/></el-form-item></el-form></div></div><div  class="bottom-wrapper"><div  class="button-wrapper"><div class="v-button" @click="saveOrUpdate()">{{ submitBnt }}</div></div></div></div></div><!-- 右侧内容 #end --></div><!-- footer -->
</template>
<script>
import '~/assets/css/hospital_personal.css'
import '~/assets/css/hospital.css'
import '~/assets/css/personal.css'import dictApi from '@/api/yygh/dict'
import patientApi from '@/api/yygh/patient'const defaultForm = {name: '',certificatesType: '',certificatesNo: '',sex: 1,birthdate: '',phone: '',isMarry: 0,isInsure: 0,provinceCode: '',cityCode: '',districtCode: '',addressSelected: null,address: '',contactsName: '',contactsCertificatesType: '',contactsCertificatesNo: '',contactsPhone: '',param: {}
}
export default {data() {return {patient: defaultForm,certificatesTypeList: [],props: {lazy: true,async lazyLoad (node, resolve) {const { level } = node//异步获取省市区dictApi.findByParentId(level ? node.value : '86').then(response => {let list= response.data.listlet provinceList = list.map((item, i) => {return {value: item.id,label: item.name,leaf: node.level == 2 ? true : false,//可控制显示几级}})resolve && resolve(provinceList)})}},submitBnt: '保存',validateRules: {name: [{ required: true, trigger: 'blur', message: '必须输入' }],certificatesType: [{ required: true, trigger: 'blur', message: '必须输入' }],certificatesNo: [{ required: true, trigger: 'blur', message: '必须输入' }],birthdate: [{ required: true, trigger: 'blur', message: '必须输入' }],phone: [{ required: true, trigger: 'blur', message: '必须输入' }],addressSelected: [{ required: true, trigger: 'blur', message: '必须输入' }],address: [{ required: true, trigger: 'blur', message: '必须输入' }]}}},created() {this.init();},mounted() {if (this.$route.query.id) {setTimeout(()=>{this.$refs.selectedShow.presentText = this.patient.param.provinceString + '/' + this.patient.param.cityString + '/' +this.patient.param.districtString //"北京市/市辖区/西城区";// 首次手动复制// this.$refs.selectedShow.value = '110000/110100/110102';},1000)}},methods: {init() {if (this.$route.query.id) {const id = this.$route.query.idthis.fetchDataById(id)} else {// 对象拓展运算符:拷贝对象,而不是赋值对象的引用this.patient = { ...defaultForm }}this.getDict()},fetchDataById(id) {patientApi.getById(id).then(response => {this.patient = response.data.patient//添加默认值this.patient.addressSelected = [this.patient.provinceCode, this.patient.cityCode, this.patient.districtCode]})},getDict() {dictApi.findByDictCode("CertificatesType").then(response => {this.certificatesTypeList = response.data.list})},saveOrUpdate() {this.$refs.patient.validate(valid => {if (valid) {//地址处理if(this.patient.addressSelected.length == 3) {this.patient.provinceCode = this.patient.addressSelected[0]this.patient.cityCode = this.patient.addressSelected[1]this.patient.districtCode = this.patient.addressSelected[2]}if (!this.patient.id) {this.saveData()} else {this.updateData()}}})},// 新增saveData() {if(this.submitBnt == '正在提交...') {this.$message.info('重复提交')return}this.submitBnt = '正在提交...'patientApi.save(this.patient).then(response => {this.$message.success("提交成功")window.location.href = '/patient'}).catch(e => {this.submitBnt = '保存'})},// 根据id更新记录updateData() {if(this.submitBnt == '正在提交...') {this.$message.info('重复提交')return}this.submitBnt = '正在提交...'patientApi.updateById(this.patient).then(response => {this.$message.success("提交成功")window.location.href = '/patient'}).catch(e => {this.submitBnt = '保存'})}}
}
</script>
<style>.header-wrapper .title {font-size: 16px;margin-top: 0;}.sub-title {margin-top: 0;}.bottom-wrapper{padding: 0;margin: 0;}.bottom-wrapper .button-wrapper{margin-top: 0;}
</style>

4、就诊人详情与删除

添加/pages/patient/show.vue组件

<template><!-- header --><div class="nav-container page-component"><!--左侧导航 #start --><div class="nav left-nav"><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/user'">实名认证 </span></div><div class="nav-item "><span class="v-link clickable dark" onclick="javascript:window.location='/order'"> 挂号订单 </span></div><div class="nav-item selected"><span class="v-link selected dark" onclick="javascript:window.location='/patient'"> 就诊人管理 </span></div><div class="nav-item "><span class="v-link clickable dark"> 修改账号信息 </span></div><div class="nav-item "><span class="v-link clickable dark"> 意见反馈 </span></div></div><!-- 左侧导航 #end --><!-- 右侧内容 #start --><div class="page-container"><div class="personal-patient"><div class="header-wrapper"><div class="title"> 添加就诊人</div></div><div><div class="sub-title"><div class="block"></div>就诊人信息</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left" ref="patient" :rules="validateRules"><el-form-item prop="name" label="姓名:"><el-input v-model="patient.name" placeholder="请输入真实姓名全称" class="input v-input"/></el-form-item><el-form-item prop="certificatesType" label="证件类型:"><el-select v-model="patient.certificatesType" placeholder="请选择证件类型" class="v-select patient-select"><el-optionv-for="item in certificatesTypeList":key="item.value":label="item.name":value="item.value"></el-option></el-select></el-form-item><el-form-item prop="certificatesNo" label="证件号码:"><el-input v-model="patient.certificatesNo" placeholder="请输入证件号码" class="input v-input"/></el-form-item><el-form-item prop="sex" label="性别:"><el-radio-group v-model="patient.sex"><el-radio :label="1">男</el-radio><el-radio :label="0">女</el-radio></el-radio-group></el-form-item><el-form-item prop="birthdate" label="出生日期:"><el-date-pickerv-model="patient.birthdate"class="v-date-picker"type="date"placeholder="选择日期"></el-date-picker></el-form-item><el-form-item prop="phone" label="手机号码:"><el-input v-model="patient.phone" placeholder="请输入手机号码" maxlength="11" class="input v-input"/></el-form-item></el-form></div><div class="sub-title"><div class="block"></div>建档信息(完善后部分医院首次就诊不排队建档)</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left" ref="patient" :rules="validateRules"><el-form-item prop="isMarry" label="婚姻状况:"><el-radio-group v-model="patient.isMarry"><el-radio :label="0">未婚</el-radio><el-radio :label="1">已婚</el-radio></el-radio-group></el-form-item><el-form-item prop="isInsure" label="自费/医保:"><el-radio-group v-model="patient.isInsure"><el-radio :label="0">自费</el-radio><el-radio :label="1">医保</el-radio></el-radio-group></el-form-item><el-form-item prop="addressSelected" label="当前住址:"><el-cascaderref="selectedShow"v-model="patient.addressSelected"class="v-address":props="props"></el-cascader></el-form-item><el-form-item prop="address" label="详细地址:"><el-input v-model="patient.address" placeholder="应公安机关要求,请填写现真实住址" class="input v-input"/></el-form-item></el-form></div><div class="sub-title"><div class="block"></div>联系人信息(选填)</div><div class="content-wrapper"><el-form :model="patient" label-width="110px" label-position="left"><el-form-item prop="contactsName" label="姓名:"><el-input v-model="patient.contactsName" placeholder="请输入联系人姓名全称" class="input v-input"/></el-form-item><el-form-item prop="contactsCertificatesType" label="证件类型:"><el-select v-model="patient.contactsCertificatesType" placeholder="请选择证件类型" class="v-select patient-select"><el-optionv-for="item in certificatesTypeList":key="item.value":label="item.name":value="item.value"></el-option></el-select></el-form-item><el-form-item prop="contactsCertificatesNo" label="证件号码:"><el-input v-model="patient.contactsCertificatesNo" placeholder="请输入联系人证件号码" class="input v-input"/></el-form-item><el-form-item prop="contactsPhone" label="手机号码:"><el-input v-model="patient.contactsPhone" placeholder="请输入联系人手机号码" class="input v-input"/></el-form-item></el-form></div></div><div  class="bottom-wrapper"><div  class="button-wrapper"><div class="v-button" @click="saveOrUpdate()">{{ submitBnt }}</div></div></div></div></div><!-- 右侧内容 #end --></div><!-- footer -->
</template>
<script>
import '~/assets/css/hospital_personal.css'
import '~/assets/css/hospital.css'
import '~/assets/css/personal.css'import dictApi from '@/api/dict'
import patientApi from '@/api/patient'const defaultForm = {name: '',certificatesType: '',certificatesNo: '',sex: 1,birthdate: '',phone: '',isMarry: 0,isInsure: 0,provinceCode: '',cityCode: '',districtCode: '',addressSelected: null,address: '',contactsName: '',contactsCertificatesType: '',contactsCertificatesNo: '',contactsPhone: '',param: {}
}
export default {data() {return {patient: defaultForm,certificatesTypeList: [],props: {lazy: true,async lazyLoad (node, resolve) {const { level } = node//异步获取省市区dictApi.getChildList(level ? node.value : '86').then(response => {let list= response.data.itemslet provinceList = list.map((item, i) => {return {value: item.id,label: item.name,leaf: node.level == 2 ? true : false,//可控制显示几级}})//作用:将当前元素的子元素列表都挂在到当前元素下边resolve && resolve(provinceList)})}},submitBnt: '保存',validateRules: {name: [{ required: true, trigger: 'blur', message: '必须输入' }],certificatesType: [{ required: true, trigger: 'blur', message: '必须输入' }],certificatesNo: [{ required: true, trigger: 'blur', message: '必须输入' }],birthdate: [{ required: true, trigger: 'blur', message: '必须输入' }],phone: [{ required: true, trigger: 'blur', message: '必须输入' }],addressSelected: [{ required: true, trigger: 'blur', message: '必须输入' }],address: [{ required: true, trigger: 'blur', message: '必须输入' }]}}},created() {this.init();},mounted() {if (this.$route.query.id) {setTimeout(()=>{this.$refs.selectedShow.presentText = this.patient.param.provinceString + '/' + this.patient.param.cityString + '/' +this.patient.param.districtString //"北京市/市辖区/西城区";// 首次手动复制// this.$refs.selectedShow.value = '110000/110100/110102';},1000)}},methods: {init() {if (this.$route.query.id) {const id = this.$route.query.idthis.fetchDataById(id)} else {// 对象拓展运算符:拷贝对象,而不是赋值对象的引用this.patient = { ...defaultForm }}this.getDict()},fetchDataById(id) {patientApi.getById(id).then(response => {this.patient = response.data.patient//添加默认值this.patient.addressSelected = [this.patient.provinceCode, this.patient.cityCode, this.patient.districtCode]})},getDict() {dictApi.getChildList(20000).then(response => {this.certificatesTypeList = response.data.items})},saveOrUpdate() {this.$refs.patient.validate(valid => {if (valid) {//地址处理if(this.patient.addressSelected.length == 3) {this.patient.provinceCode = this.patient.addressSelected[0]this.patient.cityCode = this.patient.addressSelected[1]this.patient.districtCode = this.patient.addressSelected[2]}if (!this.patient.id) {this.saveData()  //添加} else {this.updateData()   //修改}}})},// 新增saveData() {if(this.submitBnt == '正在提交...') {this.$message.info('重复提交')return}this.submitBnt = '正在提交...'patientApi.save(this.patient).then(response => {this.$message.success("提交成功")window.location.href = '/patient'}).catch(e => {this.submitBnt = '保存'})},// 根据id更新记录updateData() {if(this.submitBnt == '正在提交...') {this.$message.info('重复提交')return}this.submitBnt = '正在提交...'patientApi.updateById(this.patient).then(response => {this.$message.success("提交成功")window.location.href = '/patient'}).catch(e => {this.submitBnt = '保存'})}}
}
</script>
<style>.header-wrapper .title {font-size: 16px;margin-top: 0;}.sub-title {margin-top: 0;}.bottom-wrapper{padding: 0;margin: 0;}.bottom-wrapper .button-wrapper{margin-top: 0;}
</style>

三、平台用户管理-用户列表

前面我们完成了用户登录、用户认证与就诊人,现在我们需要把这些信息在我们的平台管理系统中进行统一管理

1、用户列表接口

(1)添加UserInfoService接口

    //用户列表(条件查询带分页)Page<UserInfo> getUserInfoPage(Long pageNum, Long limit, UserInfoQueryVo userInfoQueryVo);

(2)添加UserInfoServiceImpl实现

    @Overridepublic Page<UserInfo> getUserInfoPage(Long pageNum, Long limit, UserInfoQueryVo userInfoQueryVo) {Page<UserInfo> page = new Page<>(pageNum,limit);QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();String name = userInfoQueryVo.getKeyword(); //用户名称Integer status = userInfoQueryVo.getStatus();//用户状态Integer authStatus = userInfoQueryVo.getAuthStatus(); //认证状态String createTimeBegin = userInfoQueryVo.getCreateTimeBegin(); //开始时间String createTimeEnd = userInfoQueryVo.getCreateTimeEnd(); //结束时间//对条件值进行非空判断QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();if(!StringUtils.isEmpty(name)) {wrapper.like("name",name).or().eq("phone",userInfoQueryVo.getKeyword());}if(!StringUtils.isEmpty(status)) {wrapper.eq("status",status);}if(!StringUtils.isEmpty(authStatus)) {wrapper.eq("auth_status",authStatus);}if(!StringUtils.isEmpty(createTimeBegin)) {wrapper.ge("create_time",createTimeBegin);}if(!StringUtils.isEmpty(createTimeEnd)) {wrapper.le("create_time",createTimeEnd);}Page<UserInfo> page1 = baseMapper.selectPage(page, wrapper);page1.getRecords().stream().forEach(item->{this.packageUserInfo(item);});return page1;}private void packageUserInfo(UserInfo item) {//处理认证状态编码item.getParam().put("authStatusString",AuthStatusEnum.getStatusNameByStatus(item.getAuthStatus()));//处理用户状态 0  1  intValue()转换成int类型String statusString = item.getStatus().intValue()==0 ?"锁定" : "正常";item.getParam().put("statusString",statusString);}}

(3)添加AdminUserInfoController方法

@RestController
@RequestMapping("/admin/userinfo")
public class AdminUserInfoController {@Autowiredprivate UserInfoService userInfoService;//用户列表(条件查询带分页)@GetMapping("{pageNum}/{limit}")public R getUserInfoPage(@PathVariable Long pageNum,@PathVariable Long limit,UserInfoQueryVo userInfoQueryVo) {Page<UserInfo> page = userInfoService.getUserInfoPage(pageNum,limit,userInfoQueryVo);return R.ok().data("total",page.getTotal()).data("list",page.getRecords());}
}

2、用户列表前端整合

(1)添加用户管理路由
在 src/router/index.js 文件添加路由
alt+shift+f格式化

  {path: '/user',component: Layout,redirect: '/user/userInfo/list',name: 'userInfo',meta: { title: '用户管理', icon: 'table' },alwaysShow: true,children: [{path: 'userInfo/list',name: '用户列表',component: () => import('@/views/yygh/userInfo/list'),meta: { title: '用户列表', icon: 'table' }}]},

(2)封装api请求
创建/api/userinfo.js

import request from '@/utils/request'const api_name = '/admin/userinfo'export default {getPageList(pageNum, limit, searchObj) {return request({url: `${api_name}/${pageNum}/${limit}`,method: 'get',params: searchObj})}
}

(3)添加列表页面
创建views/yygh/userInfo/list.vue

<template><div class="app-container"><!--查询表单--><el-form  :inline="true" class="demo-form-inline"><el-form-item><el-input v-model="searchObj.keyword" placeholder="姓名/手机"/></el-form-item><el-form-item  label="创建时间"><el-date-pickerv-model="searchObj.createTimeBegin"type="datetime"placeholder="选择开始时间"value-format="yyyy-MM-dd HH:mm:ss"default-time="00:00:00"/></el-form-item>至<el-form-item><el-date-pickerv-model="searchObj.createTimeEnd"type="datetime"placeholder="选择截止时间"value-format="yyyy-MM-dd HH:mm:ss"default-time="00:00:00"/></el-form-item><el-button type="primary" icon="el-icon-search" @click="fetchData()">查询</el-button><el-button type="default" @click="resetData()">清空</el-button></el-form><!-- 列表 --><el-tablev-loading="listLoading":data="list"stripestyle="width: 100%"><el-table-columnlabel="序号"width="70"align="center"><template slot-scope="scope">{{ (page - 1) * limit + scope.$index + 1 }}</template></el-table-column><el-table-column prop="phone" label="手机号"/><el-table-column prop="nickName" label="昵称"/><el-table-column prop="name" label="姓名"/><el-table-column label="状态" prop="param.statusString"/><el-table-column label="认证状态" prop="param.authStatusString"/><el-table-column prop="createTime" label="创建时间"/><el-table-column label="操作" width="200" align="center"></el-table-column></el-table><!-- 分页组件 --><el-pagination:current-page="page":total="total":page-size="limit":page-sizes="[5, 10, 20, 30, 40, 50, 100]"style="padding: 30px 0; text-align: center;"layout="sizes, prev, pager, next, jumper, ->, total, slot"@current-change="fetchData"@size-change="changeSize"/></div>
</template>
<script>
import userInfoApi from '@/api/userinfo'
export default {// 定义数据data() {return {listLoading: true, // 数据是否正在加载list: null, // banner列表total: 0, // 数据库中的总记录数page: 1, // 默认页码limit: 10, // 每页记录数searchObj: {} // 查询表单对象}},// 当页面加载时获取数据created() {this.fetchData()},methods: {// 调用api层获取数据库中的数据fetchData(page = 1) {console.log('翻页。。。' + page)// 异步获取远程数据(ajax)this.page = pageuserInfoApi.getPageList(this.page, this.limit, this.searchObj).then(response => {this.list = response.data.listthis.total = response.data.total// 数据加载并绑定成功this.listLoading = false})},// 当页码发生改变的时候changeSize(size) {console.log(size)this.limit = sizethis.fetchData(1)},// 重置查询表单resetData() {console.log('重置查询表单')this.searchObj = {}this.fetchData()}}
}
</script>

四、平台用户管理-用户锁定

1、用户锁定接口
(1)添加UserInfoService接口和实现

/*** 用户锁定* @param userId
* @param status 0:锁定 1:正常*/
void lock(Long userId, Integer status);//实现方法
@Override
public void lock(Long userId, Integer status) {if(status.intValue() == 0 || status.intValue() == 1) {UserInfo userInfo = this.getById(userId);userInfo.setStatus(status);//baseMapper.updateById(userInfo);this.updateById(userInfo);}
}

(2)添加UserController方法

@ApiOperation(value = "锁定")
@GetMapping("lock/{userId}/{status}")
public R lock(@PathVariable("userId") Long userId,@PathVariable("status") Integer status){userInfoService.lock(userId, status);return R.ok();
}

2、用户锁定前端整合
(1)封装api方法
在api/userinfo.js添加方法

    lock(id, status) {return request({url: `${api_name}/lock/${id}/${status}`,method: 'get'})}

(2)在用户列表页面添加组件

            <el-table-column label="操作" width="200" align="center"><template slot-scope="scope"><el-button v-if="scope.row.status == 1" type="primary" size="mini" @click="lock(scope.row.id, 0)">锁定</el-button><el-button v-if="scope.row.status == 0" type="danger" size="mini" @click="lock(scope.row.id, 1)">取消锁定</el-button></template></el-table-column>

(3)在页面列表页面添加方法

    // 锁定lock(id, status) {this.$confirm("确定该操作吗?", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",}).then(() => {// promise// 点击确定,远程调用ajaxreturn userInfoApi.lock(id, status);}).then((response) => {this.fetchData(this.page);if (response.code) {this.$message({type: "success",message: "操作成功!",});}});},

五、平台用户管理-用户详情

详情展示用户信息、用户就诊人信息

1、用户详情接口

(1)添加UserInfoService接口

    Map<String, Object> show(Long userId);

(2)添加UserInfoServiceImpl实现
PatientServiceImpl

    @Autowiredprivate PatientService patientService;@Overridepublic Map<String, Object> show(Long userId) {UserInfo userInfo = baseMapper.selectById(userId);QueryWrapper<Patient> queryWrapper = new QueryWrapper<>();queryWrapper.eq("user_id",userId);List<Patient> patients = patientService.selectList(queryWrapper);Map<String,Object> map = new HashMap<>();map.put("userInfo",userInfo);map.put("patients",patients);return map;}
    @Overridepublic List<Patient> selectList(QueryWrapper<Patient> queryWrapper) {List<Patient> patients = baseMapper.selectList(queryWrapper);patients.stream().forEach(item->{this.packagePatient(item);});return patients;}private void packagePatient(Patient item) {item.getParam().put("certificatesTypeString",dictFeignClient.getNameByValue(Long.parseLong(item.getCertificatesType())));String provinceString = dictFeignClient.getNameByValue(Long.parseLong(item.getProvinceCode()));String cityString = dictFeignClient.getNameByValue(Long.parseLong(item.getCityCode()));String districtString = dictFeignClient.getNameByValue(Long.parseLong(item.getDistrictCode()));item.getParam().put("provinceString",provinceString);item.getParam().put("cityString",cityString);item.getParam().put("districtString",districtString);item.getParam().put("fullAddress",provinceString+cityString+districtString);}
}

(3)添加AdminUserInfoController方法

    //用户详情@GetMapping("show/{userId}")public R show(@PathVariable Long userId) {Map<String,Object> map = userInfoService.show(userId);return R.ok().data(map);}

2、用户详情前端
(1)添加路由

      {path: 'userInfo/show/:id',name: '用户查看',component: () => import('@/views/yygh/userInfo/show'),meta: { title: '用户查看' },hidden: true}

(2)封装api方法
在api/userinfo.js添加

    //用户详情show(id) {return request({url: `${api_name}/show/${id}`,method: 'get'})}

(3)修改列表组件,添加查看按钮

              <router-link :to="'/user/userInfo/show/'+scope.row.id"><el-button type="primary" size="mini">查看</el-button></router-link>

(4)添加详情页面
添加/views/yygh/userInfo/show.vue组件

<template><div class="app-container"><h4>用户信息</h4><table class="table table-striped table-condenseda table-bordered" width="100%"><tbody><tr><th width="15%">手机号</th><td width="35%"><b>{{ userInfo.phone }}</b></td><th width="15%">用户姓名</th><td width="35%">{{ userInfo.name }}</td></tr><tr><th>状态</th><td>{{ userInfo.status == 0 ? '锁定' : '正常' }}</td><th>注册时间</th><td>{{ userInfo.createTime }}</td></tr></tbody></table><h4>认证信息</h4><table class="table table-striped table-condenseda table-bordered" width="100%"><tbody><tr><th width="15%">姓名</th><td width="35%"><b>{{ userInfo.name }}</b></td><th width="15%">证件类型</th><td width="35%">{{ userInfo.certificatesType }}</td></tr><tr><th>证件号</th><td>{{ userInfo.certificatesNo }}</td><th>证件图片</th><td><img :src="userInfo.certificatesUrl" width="80px"></td></tr></tbody></table><h4>就诊人信息</h4><el-tablev-loading="listLoading":data="patientList"stripestyle="width: 100%"><el-table-columnlabel="序号"width="70"align="center"><template slot-scope="scope">{{ scope.$index + 1 }}</template></el-table-column><el-table-column prop="name" label="姓名"/><el-table-column prop="param.certificatesTypeString" label="证件类型"/><el-table-column prop="certificatesNo" label="证件编号"/><el-table-column label="性别"><template slot-scope="scope">{{ scope.row.sex == 1 ? '男' : '女' }}</template></el-table-column><el-table-column prop="birthdate" label="出生年月"/><el-table-column prop="phone" label="手机"/><el-table-column label="是否结婚"><template slot-scope="scope">{{ scope.row.isMarry == 1 ? '时' : '否' }}</template></el-table-column><el-table-column prop="param.fullAddress" label="地址"/><el-table-column prop="createTime" label="注册时间"/></el-table><br><el-row><el-button  @click="back">返回</el-button></el-row></div>
</template>
<script>
import userInfoApi from '@/api/userinfo'
export default {// 定义数据data() {return {id: this.$route.params.id,userInfo: {}, // 会员信息patientList: [] // 就诊人列表}},// 当页面加载时获取数据created() {this.fetchDataById()},methods: {// 根据id查询会员记录fetchDataById() {userInfoApi.show(this.id).then(response => {this.userInfo = response.data.userInfothis.patientList = response.data.patients})},back() {window.history.back(-1)   //从哪儿来,回哪去}}
}
</script>

六、用户认证列表

1、用户认证列表接口

用户认证列表接口与用户列表一致,只是默认加了一个认证状态搜索条件:authStatus

2、用户认证列表前端

(1)添加路由

      {path: 'userInfo/authList',name: '认证审批列表',component: () =>import('@/views/yygh/userInfo/authList'),meta: { title: '认证审批列表', icon: 'table' }}

(2)添加用户认证列表页面
添加/views/yygh/userInfo/authList.vue组件

<template><div class="app-container"><!--查询表单--><el-form :inline="true" class="demo-form-inline"><el-form-item><el-input v-model="searchObj.keyword" placeholder="姓名/手机"/></el-form-item><el-form-item label="创建时间"><el-date-pickerv-model="searchObj.createTimeBegin"type="datetime"placeholder="选择开始时间"value-format="yyyy-MM-dd HH:mm:ss"default-time="00:00:00"/></el-form-item>至<el-form-item><el-date-pickerv-model="searchObj.createTimeEnd"type="datetime"placeholder="选择截止时间"value-format="yyyy-MM-dd HH:mm:ss"default-time="00:00:00"/></el-form-item><el-button type="primary" icon="el-icon-search" @click="fetchData()">查询</el-button><el-button type="default" @click="resetData()">清空</el-button></el-form><!-- 列表 --><el-tablev-loading="listLoading":data="list"stripestyle="width: 100%"><el-table-columnlabel="序号"width="70"align="center"><template slot-scope="scope">{{ (page - 1) * limit + scope.$index + 1 }}</template></el-table-column><el-table-column prop="name" label="姓名"/><el-table-column prop="certificatesType" label="证件类型"/><el-table-column prop="certificatesNo" label="证件号"/><el-table-column prop="createTime" label="创建时间"/><el-table-column label="操作" width="250" align="center"><template slot-scope="scope"><router-link :to="'/user/userInfo/show/'+scope.row.id"><el-button type="primary" size="mini">查看</el-button></router-link></template></el-table-column></el-table><!-- 分页组件 --><el-pagination:current-page="page":total="total":page-size="limit":page-sizes="[5, 10, 20, 30, 40, 50, 100]"style="padding: 30px 0; text-align: center;"layout="sizes, prev, pager, next, jumper, ->, total, slot"@current-change="fetchData"@size-change="changeSize"/></div>
</template>
<script>
import userInfoApi from '@/api/userinfo'export default {// 定义数据
data() {return {listLoading: true, // 数据是否正在加载list: null, // banner列表total: 0, // 数据库中的总记录数page: 1, // 默认页码limit: 10, // 每页记录数searchObj: {authStatus: 1} // 查询表单对象}
},// 当页面加载时获取数据
created() {this.fetchData()
},methods: {// 调用api层获取数据库中的数据fetchData(page = 1) {console.log('翻页。。。' + page)// 异步获取远程数据(ajax)this.page = pageuserInfoApi.getPageList(this.page, this.limit, this.searchObj).then(response => {this.list = response.data.listthis.total = response.data.total// 数据加载并绑定成功this.listLoading = false})},// 当页码发生改变的时候changeSize(size) {console.log(size)this.limit = sizethis.fetchData(1)},// 重置查询表单resetData() {console.log('重置查询表单')this.searchObj = {}this.fetchData()}}
}
</script>

七、用户认证审批

1、用户认证审批接口

(1)添加UserInfoService接口

    void approval(Long userId, Integer authStatus);

(2)添加UserInfoServiceImpl实现

    //认证审批  2通过  -1不通过@Overridepublic void approval(Long userId, Integer authStatus) {if(authStatus.intValue()==2 || authStatus.intValue()==-1) {UserInfo userInfo = baseMapper.selectById(userId);userInfo.setAuthStatus(authStatus);baseMapper.updateById(userInfo);}}

(3)添加UserController方法

    //认证审批@GetMapping("approval/{userId}/{authStatus}")public R approval(@PathVariable Long userId,@PathVariable Integer authStatus) {userInfoService.approval(userId,authStatus);return R.ok();}

2、用户认证审批前端

(1)封装api方法

    //认证审批approval(id, authStatus) {return request({url: `${api_name}/approval/${id}/${authStatus}`,method: 'get'})}

(2)用户认证列表页面添加审批按钮

          <el-button type="primary" size="mini" @click="approval(scope.row.id, 2)">通过</el-button><el-button type="danger" size="mini" @click="approval(scope.row.id, -1)">不通过</el-button>

(3)添加调用方法

    // 审批approval(id, authStatus) {// debuggerthis.$confirm("确定该操作吗?", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",}).then(resp => {userInfoApi.approval(id, authStatus).then((resp) => {this.$message.success("操作成功");this.fetchData();})})},

尚医通 (二十)就诊人用户管理 | 平台用户管理相关推荐

  1. 尚医通 (三十六) --------- 微信支付

    目录 一.微信支付介绍 二.微信支付开发 1. api 接口 2. 前端 3. 处理支付结果 三.取消预约 1. 需求描述 2. 开发微信退款接口 3. 前端 一.微信支付介绍 A.微信扫码支付申请 ...

  2. 尚医通 (十九)用户认证

    目录 一.对象存储OSS 1.开通"对象存储OSS"服务 2.创建Bucket 3.上传默认头像 4.创建RAM用户 5.使用SDK 二.后端集成OSS 1.新建云存储微服务 2. ...

  3. 尚医通 (三十五) --------- 预约下单

    目录 一.预约下单前端 1. 封装 api 请求 2. 页面修改 二.后端逻辑 1. 需求分析 2. 搭建 service-order 模块 3. 添加订单基础类 4. 封装 Feign 调用获取就诊 ...

  4. 尚医通 (十八)微信登录

    目录 一.生成微信登录二维码 1.准备工作 2.后端开发service_user 3.前端显示登录二维码 4.二维码出现不了进行调试 二.开发微信扫描回调 1.准备工作 2.后台开发 3.前台开发 三 ...

  5. 尚医通 (二) --------- MyBatis Plus 详解

    目录 一.简介 二.创建并初始化数据库 三.确认 idea 配置 四.创建项目 五.编写代码 六.主键策略 1. 插入操作 2. MP 的主键策略 七.自动填充和乐观锁 1. 更新操作 2. 自动填充 ...

  6. 尚医通(十五)医院排班管理

    目录 一.医院排班管理需求 1.页面效果 2.接口分析 二.科室列表(接口) 1.添加service接口和实现 2.添加DepartmentController方法 三.科室列表(前端) 1.添加隐藏 ...

  7. 尚医通-阿里云短信服务(二十九)

    目录: (1)前台用户系统-手机登录-阿里云短信服务介绍 (2)手机登录-整合短信服务 (3)整合短信发送服务测试 (1)前台用户系统-手机登录-阿里云短信服务介绍 现在使用阿里云完成短信服务:注册登 ...

  8. 尚医通_第12章_用户平台首页数据

    尚医通_第12章_用户平台首页数据 文章目录 尚医通_第12章_用户平台首页数据 第一节.首页静态数据整合 一.首页静态数据整合 1.添加静态资源 2.修改页面布局 第二节.首页数据显示功能 一.首页 ...

  9. 尚医通项目101-123:前台用户系统、登录注册、邮箱登录

    开始时间:2022-05-30 课程链接:课程链接:[尚医通] 前端页面 需要完成医院等级.地区查询.医院列表.医院名称模糊查询等功能 按等级查询 按地区查询 模糊查询 并能跳转到具体详情页面 跳转到 ...

最新文章

  1. 手把手教你搭建一个学习Python好看的 Jupyter 环境
  2. Linux下如何执行Shell脚本
  3. word2016公式自动编号
  4. 匹配中文字符的正则表达式: [/u4e00-/u9fa5]
  5. 素数判定算法 MILLER RABIN
  6. Android 8.0学习(31)---Android 8.0 中的 ART 功能改进
  7. 新浪微博OAuth2.0 VS OAuth1.0 主要区别总结
  8. win7如何设置wifi热点_win7台式机如何设置IP地址为固定的IP地址?
  9. Citrix入门教程,之windows server2008 r2安装
  10. java调用考勤机_zkteco iface702 中控考勤机java开发步骤一---连接考勤机
  11. 系统垃圾清理bat文件
  12. JavaScript “use strict“(严格模式)
  13. Unity3D+moba+技能指示器(二)
  14. 程序 数列求和 c语言,[编程入门]有规律的数列求和-题解(C语言代码)
  15. 如何根据vin码查询_汽车VIN码是什么,怎么查询Vin码?
  16. 定制嵌入式主板需要考虑的功能
  17. 用html3d静态相册带音乐,3D立体动态相册(带背景音乐)HTML+CSS脚本
  18. 学计算机大学累不累_大学学计算机专业的体验重点在最后!
  19. oracle中exp中query,exp中query参数使用
  20. 理财领域各种“潜规则”

热门文章

  1. 怎么让搜狗收录-如何加快搜狗收录
  2. 如何将PDF转换成Excel表格?这两种方法超实用
  3. 拼多多参谋在什么地方?多多参谋的作用是什么?
  4. 搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 -
  5. 实习第一天——网宿报到日
  6. 雷军卸任小米软件技术公司董事长;微软洽谈向 OpenAI 投资 100 亿美元;Windows 7 彻底退出历史舞台|极客头条
  7. 惠普103a打印机芯片清零_惠普M104a打印机的粉盒CF218A,芯片怎么取下来啊
  8. 小知识(3) 解决谷歌翻译问题(浏览器/IDEA)
  9. Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
  10. python实时股票数据折线图_股票分笔成交数据导出,python实时股票数据