尚医通 (二十)就诊人用户管理 | 平台用户管理
目录
- 一、就诊人管理需求和接口开发
- 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. api 接口 2. 前端 3. 处理支付结果 三.取消预约 1. 需求描述 2. 开发微信退款接口 3. 前端 一.微信支付介绍 A.微信扫码支付申请 ...
- 尚医通 (十九)用户认证
目录 一.对象存储OSS 1.开通"对象存储OSS"服务 2.创建Bucket 3.上传默认头像 4.创建RAM用户 5.使用SDK 二.后端集成OSS 1.新建云存储微服务 2. ...
- 尚医通 (三十五) --------- 预约下单
目录 一.预约下单前端 1. 封装 api 请求 2. 页面修改 二.后端逻辑 1. 需求分析 2. 搭建 service-order 模块 3. 添加订单基础类 4. 封装 Feign 调用获取就诊 ...
- 尚医通 (十八)微信登录
目录 一.生成微信登录二维码 1.准备工作 2.后端开发service_user 3.前端显示登录二维码 4.二维码出现不了进行调试 二.开发微信扫描回调 1.准备工作 2.后台开发 3.前台开发 三 ...
- 尚医通 (二) --------- MyBatis Plus 详解
目录 一.简介 二.创建并初始化数据库 三.确认 idea 配置 四.创建项目 五.编写代码 六.主键策略 1. 插入操作 2. MP 的主键策略 七.自动填充和乐观锁 1. 更新操作 2. 自动填充 ...
- 尚医通(十五)医院排班管理
目录 一.医院排班管理需求 1.页面效果 2.接口分析 二.科室列表(接口) 1.添加service接口和实现 2.添加DepartmentController方法 三.科室列表(前端) 1.添加隐藏 ...
- 尚医通-阿里云短信服务(二十九)
目录: (1)前台用户系统-手机登录-阿里云短信服务介绍 (2)手机登录-整合短信服务 (3)整合短信发送服务测试 (1)前台用户系统-手机登录-阿里云短信服务介绍 现在使用阿里云完成短信服务:注册登 ...
- 尚医通_第12章_用户平台首页数据
尚医通_第12章_用户平台首页数据 文章目录 尚医通_第12章_用户平台首页数据 第一节.首页静态数据整合 一.首页静态数据整合 1.添加静态资源 2.修改页面布局 第二节.首页数据显示功能 一.首页 ...
- 尚医通项目101-123:前台用户系统、登录注册、邮箱登录
开始时间:2022-05-30 课程链接:课程链接:[尚医通] 前端页面 需要完成医院等级.地区查询.医院列表.医院名称模糊查询等功能 按等级查询 按地区查询 模糊查询 并能跳转到具体详情页面 跳转到 ...
最新文章
- 手把手教你搭建一个学习Python好看的 Jupyter 环境
- Linux下如何执行Shell脚本
- word2016公式自动编号
- 匹配中文字符的正则表达式: [/u4e00-/u9fa5]
- 素数判定算法 MILLER RABIN
- Android 8.0学习(31)---Android 8.0 中的 ART 功能改进
- 新浪微博OAuth2.0 VS OAuth1.0 主要区别总结
- win7如何设置wifi热点_win7台式机如何设置IP地址为固定的IP地址?
- Citrix入门教程,之windows server2008 r2安装
- java调用考勤机_zkteco iface702 中控考勤机java开发步骤一---连接考勤机
- 系统垃圾清理bat文件
- JavaScript “use strict“(严格模式)
- Unity3D+moba+技能指示器(二)
- 程序 数列求和 c语言,[编程入门]有规律的数列求和-题解(C语言代码)
- 如何根据vin码查询_汽车VIN码是什么,怎么查询Vin码?
- 定制嵌入式主板需要考虑的功能
- 用html3d静态相册带音乐,3D立体动态相册(带背景音乐)HTML+CSS脚本
- 学计算机大学累不累_大学学计算机专业的体验重点在最后!
- oracle中exp中query,exp中query参数使用
- 理财领域各种“潜规则”
热门文章
- 怎么让搜狗收录-如何加快搜狗收录
- 如何将PDF转换成Excel表格?这两种方法超实用
- 拼多多参谋在什么地方?多多参谋的作用是什么?
- 搞定各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 -
- 实习第一天——网宿报到日
- 雷军卸任小米软件技术公司董事长;微软洽谈向 OpenAI 投资 100 亿美元;Windows 7 彻底退出历史舞台|极客头条
- 惠普103a打印机芯片清零_惠普M104a打印机的粉盒CF218A,芯片怎么取下来啊
- 小知识(3) 解决谷歌翻译问题(浏览器/IDEA)
- Qt开发之路59---QPushButton的pressed,released,clicked,toggled响应的区别
- python实时股票数据折线图_股票分笔成交数据导出,python实时股票数据