上传文件
MultipartFile 流操作 flie.getInputStream()
- 按照阿里云oss的上传文件的模板,采取流上传的方式,先创建oosclient实例,然后flie.getInputStream()
- 为了保证上传文件不会重名,生成uuid和文件名进行拼接,
- 按照当前日期,创建文件夹,上传到创建文件夹里面
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 上传文件流。
InputStream inputStream = file.getInputStream();
String fileName = file.getOriginalFilename();
//生成随机唯一值,使用uuid,添加到文件名称里面
String uuid = UUID.randomUUID().toString().replaceAll("-","");
fileName = uuid+fileName;
//按照当前日期,创建文件夹,上传到创建文件夹里面
// 2021/02/02/01.jpg
String timeUrl = new DateTime().toString("yyyy/MM/dd");
fileName = timeUrl+"/"+fileName;
//调用方法实现上传
ossClient.putObject(bucketName, fileName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//上传之后文件路径
// https://yygh-atguigu.oss-cn-beijing.aliyuncs.com/01.jpg
String url = "https://"+bucketName+"."+endpoint+"/"+fileName;
//返回
return url;
用户认证
在前端中写好阿里云oss的上传地址,用户认证的表单提交时,会将照片提交到阿里云oss中,表单提交时,调用saveUserAuah方法,将前端表单数据通过saveUserAuth接口调用后端userAuth方法将认证的信息存入本地。
具体的来说:
- controller会通过request的token获取当前用户id
- service层根据id查到对应的信息,然后设置用户的表单中的信息,最后更新到数据库中.
//用户认证
@Override
public void userAuth(Long userId, UserAuthVo userAuthVo) {
//根据用户id查询用户信息
UserInfo userInfo = baseMapper.selectById(userId);
//设置认证信息
//认证人姓名
userInfo.setName(userAuthVo.getName());
//其他认证信息
userInfo.setCertificatesType(userAuthVo.getCertificatesType());
userInfo.setCertificatesNo(userAuthVo.getCertificatesNo());
userInfo.setCertificatesUrl(userAuthVo.getCertificatesUrl());
userInfo.setAuthStatus(AuthStatusEnum.AUTH_RUN.getStatus());
//进行信息更新
baseMapper.updateById(userInfo);
}
预约挂号页面调整(_hoscode.vue)
如果要预约挂号,我们必须要认证通过后才可以,所以我们在预约挂号前要做认证判断,如果没有认证通过,则跳转到认证页面。通过authStatus 属性进行判断,等于2就是认证通过。
//判断用户是否完成认证
userInfoApi.getUserInfo().then((response) => {
let authStatus = response.data.authStatus;
// 状态为2认证通过
if (!authStatus || authStatus != 2) {
window.location.href = "/user";
return;
}
});
就诊人管理
需求分析
流程分析:假如我byy拿手机号或者微信扫码登录成功以后,然后通过实名认证,我byy也有许多patient,为了方便和byy相关的就诊人挂号,所以开发一个就诊人管理功能,实现查看认证用户所有就诊人,就诊人详情,增删改就诊人信息功能。
预约下单需要选择就诊人,因此我们要实现就诊人管理,前端就诊人管理其实就是要实现一个完整的增删改查
- 获取就诊人列表 @GetMapping(“auth/findAll”) 这里的patient涉及到数据字典的信息,要想得到完整的信息,就要进行远程调用数据字典packPatient方法,获得本人和本人的认证用户的证件类型(身份证还是户口本),获得省市区信息
@Override
public List<Patient> findAllUserId(Long userId) {
//根据userid查询所有就诊人信息列表
QueryWrapper<Patient> wrapper = new QueryWrapper<>();
wrapper.eq("user_id",userId);
List<Patient> patientList = baseMapper.selectList(wrapper);
//通过远程调用,得到编码对应具体内容,查询数据字典表内容
patientList.stream().forEach(item -> {
//其他参数封装
this.packPatient(item);
});
return patientList;
}
//Patient对象里面其他参数封装
private Patient packPatient(Patient patient) {
//根据证件类型编码,获取证件类型具体值
String certificatesTypeString =
dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(), patient.getCertificatesType());//联系人证件
//联系人证件类型(非user本人)
String contactsCertificatesTypeString =
dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(),patient.getContactsCertificatesType());
//省
String provinceString = dictFeignClient.getName(patient.getProvinceCode());
//市
String cityString = dictFeignClient.getName(patient.getCityCode());
//区
String districtString = dictFeignClient.getName(patient.getDistrictCode());
patient.getParam().put("certificatesTypeString", certificatesTypeString);
patient.getParam().put("contactsCertificatesTypeString", contactsCertificatesTypeString);
patient.getParam().put("provinceString", provinceString);
patient.getParam().put("cityString", cityString);
patient.getParam().put("districtString", districtString);
patient.getParam().put("fullAddress", provinceString + cityString + districtString + patient.getAddress());
return patient;
}
- 添加就诊人@PostMapping(“auth/save”)
- 根据id获取就诊人信息 @GetMapping(“auth/get/{id}”),前端中做信息回显
- 修改就诊人 @PostMapping(“auth/update”)
- 删除就诊人 @DeleteMapping(“auth/remove/{id}”)
就诊人管理前端
- 就诊人列表 index.vue
- 添加就诊人 add.vue
- 就诊人详情 show.vue
在user/index.vue中,经过实名认证后会有就诊人管理的功能,点击会采用固定路由跳转到patient/index.vue中,在patient.vue中调用后端接口。
管理员对就诊人管理
后台管理员显示用户列表(条件查询带分页)
效果:
service-user的controller/UserController
//后台管理员显示用户列表(条件查询带分页)
@GetMapping("{page}/{limit}")
public Result list(@PathVariable Long page,
@PathVariable Long limit,
UserInfoQueryVo userInfoQueryVo) {
Page<UserInfo> pageParam = new Page<>(page,limit);
IPage<UserInfo> pageModel =
userInfoService.selectPage(pageParam,userInfoQueryVo);
return Result.ok(pageModel);
}
前端部分:
- 要对应到vue-admin-template-master先在src/api中新建userInfo.js,
- 然后去router/index.js中添加路由,
- 在views视图中新建user/userInfo/list.vue。
用户锁定和解锁
@Override
public void lock(Long userId, Integer status) {
if(status.intValue() == 0 || status.intValue() == 1) {
UserInfo userInfo = this.getById(userId);
userInfo.setStatus(status);
this.updateById(userInfo);
}
}
管理员得到用户详情信息
根据id查到user的信息和所有patient信息,注意要调用packageUserInfo把状态数字转成对应的汉字
查询用户和认证信息时baseMapper.selectById,而查询认证用户的就诊人则是patientService.findAllUserId()方法
@Override
public Map<String, Object> show(Long userId) {
Map<String,Object> map = new HashMap<>();
//根据userid查询用户信息
UserInfo userInfo = this.packageUserInfo(baseMapper.selectById(userId));
map.put("userInfo",userInfo);
//根据userid查询就诊人信息
List<Patient> patientList = patientService.findAllUserId(userId);
map.put("patientList",patientList);
return map;
}
用户认证列表
authStatus 认证审批 2通过 -1不通过,根据id得到useInfo,然后传入authStatus更新
//认证审批 2通过 -1不通过
@Override
public void approval(Long userId, Integer authStatus) {
if(authStatus.intValue()==2 || authStatus.intValue()==-1) {
UserInfo userInfo = baseMapper.selectById(userId);
userInfo.setAuthStatus(authStatus);
baseMapper.updateById(userInfo);
}
}
按钮
<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>
审批方法
// 审批
approval(id, authStatus) {
// debugger
this.$confirm("确定该操作吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
// promise
// 点击确定,远程调用ajax
return userInfoApi.approval(id, authStatus);
})
.then((response) => {
this.fetchData(this.page);
if (response.code) {
this.$message({
type: "success",
message: "操作成功!",
});
}
});
},
审批逻辑
点击通过,authStatus状态变为2,并且会从认证用户列表中消失,这是因为在认证列表页面中,我们要获取待认证的用户进行显示,即authStatus==1的用户,所以提前给authStatus设默认值为1,调用getPageList:后台管理员显示用户列表(条件查询带分页),将authStatus=1作为UserInfoQueryVo查询的条件,查询符合要求的待认证数据回显