实名认证&挂号订单&就诊人管理&管理员对就诊人管理

这篇博客介绍了如何使用阿里云OSS服务进行文件上传,包括通过UUID防止文件重名,按日期创建文件夹,以及上传文件的步骤。同时,详细阐述了用户认证过程,包括前端表单提交到阿里云OSS,后端处理认证信息并更新数据库的操作。此外,还涉及到了就诊人管理功能,包括增删改查操作以及数据字典的远程调用,以及管理员对就诊人的管理、用户锁定解锁和审批流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上传文件

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查询的条件,查询符合要求的待认证数据回显

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值