07-整合阿里云oss&用户认证&就诊人CRUD&平台统一管理用户

Posted 型男一枚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了07-整合阿里云oss&用户认证&就诊人CRUD&平台统一管理用户相关的知识,希望对你有一定的参考价值。

一、整合oss

1、注册开通阿里云oss

进入oss控制台传送门

点击创建对应的bucketl


进入我们创建的bucket列表

2、获取我们必须的参数

  1. 地域节点Endpoint
  2. AccessKey ID与AccessKey Secret

3、进入JavaSDK学习使用上传文件

传送门

(1)引入依赖

JAVA8依赖

<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

JAVA9及其以上的依赖

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>

(3)文件上传(流式文件上传)

我们选择流式文件上传

// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
String endpoint = "yourEndpoint";
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = "yourAccessKeyId";
String accessKeySecret = "yourAccessKeySecret";

// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

// 填写本地文件的完整路径。如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
InputStream inputStream = new FileInputStream("D:\\\\localpath\\\\examplefile.txt");
// 依次填写Bucket名称(例如examplebucket)和Object完整路径(例如exampledir/exampleobject.txt)。Object完整路径中不能包含Bucket名称。
ossClient.putObject("examplebucket", "exampledir/exampleobject.txt", inputStream);

// 关闭OSSClient。
ossClient.shutdown();

4、项目整合OSS

(1)创建OSS模块,用来专门完成文件上传服务

(2)创建controller

@RestController
@RequestMapping("/api/oss/file")
public class FileApiController {
    @Autowired
    private FileService fileService;

    @ApiOperation("/")
    @PostMapping("/fileUpload")
    public Result fileUpload(@RequestPart MultipartFile file) {
        String imagesUrl = fileService.upload(file);
        return Result.ok(imagesUrl);
    }
}

(3)service层

需要注意的我们为了访问我们上传的文件名字存在重复,解决方案为,获取当前上传的文件的名字,我们使用UUID生产一个字符串与我们文件名字拼接在一起,形成一个新的文件名字,此外我们又进一步操作,获取当天的时间日期数据,按照年月日创建我们的文件夹存放我们的上传文件,进一步减少重复。
获取时间日期格式使用的是时间日期工具类,之后返回我们的文件保存路劲url。

@Service
public class FileServiceImpl implements FileService {
    @Override
    public String upload(MultipartFile file) {
        // 1、判断文件是否为空,以及文件类型检验,检验通过进行数据的存储

        // 2、文件效验通过,进行文件上传操作
        // 获取常量值
        String endpoint = ConstantOssPropertiesUtils.EDNPOINT;
        String accessKeyId = ConstantOssPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstantOssPropertiesUtils.SECRECT;
        String bucket = ConstantOssPropertiesUtils.BUCKET;

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建文件输出流
        InputStream inputStream = null;
        try {
            // 获取文件流
            inputStream = file.getInputStream();
            String filename = file.getOriginalFilename();
            // 给文件名字添加一个随机的UUID防止名字一样
            filename = UUID.randomUUID().toString() + filename;
            // 设置保存文件在oss的路径
            // 按照当前日期设置文件的保存路径,进一步防止文件名字一样
            String timeUrl = new DateTime().toString("yyyy/MM/dd");
            String savePath = timeUrl + "/" + filename;
            // 上传
            ossClient.putObject(bucket, savePath, inputStream);
            // 拼接文件的访问url地址
            String url = "https://" + bucket + "." + endpoint + "/" + savePath;
            //返回
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
            try {
                // 关闭文件输出流
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    }
}

(4)将我们必要的参数保存在配置文件中读取

(5)创建工具类,读取配置文件内容

@Component
public class ConstantOssPropertiesUtils implements InitializingBean {

    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;

    @Value("${aliyun.oss.secret}")
    private String secret;

    @Value("${aliyun.oss.bucket}")
    private String bucket;

    public static String EDNPOINT;
    public static String ACCESS_KEY_ID;
    public static String SECRECT;
    public static String BUCKET;

    @Override
    public void afterPropertiesSet() throws Exception {
        EDNPOINT = endpoint;
        ACCESS_KEY_ID = accessKeyId;
        SECRECT = secret;
        BUCKET = bucket;
    }
}

二、用户认证

1、分析

用户登录成功后都要进行身份认证,认证通过后才可以预约挂号 认证过程:用户填写信息(姓名、证件类型、证件号码和证件照片)==> 平台审批
用户认证设计接口:
1、提交认证 2、上传证件图片 3、获取提交认证信息

其实就是对我们登录之后信息的完善,使用微信,手机号登录其实我们都只保存了用户手机号,昵称等等,关于身份证,其他信息我们都没有保存,所以我们后续的认证就是一个update操作,根据我们提供的vo参数进行更新,我们从我们token中获取当前正在登录(发起请求的用户)的id,更具id’,获取先关的信息,更新操作。

2、userinfo表设计

3、数据传递的VO类

@Data
@ApiModel(description="会员认证对象")
public class UserAuthVo {

    @ApiModelProperty(value = "用户姓名")
    @TableField("name")
    private String name;

    @ApiModelProperty(value = "证件类型")
    @TableField("certificates_type")
    private String certificatesType;

    @ApiModelProperty(value = "证件编号")
    @TableField("certificates_no")
    private String certificatesNo;

    @ApiModelProperty(value = "证件路径")
    @TableField("certificates_url")
    private String certificatesUrl;

}

4、contoller层

接受我们传递过来的Vo实体类,调用service完成信息的更新,完成认证

 @ApiOperation(value = "根据token进行用户认证")
    @PostMapping("auth/userAuth")
    public Result userAuth(@RequestBody UserAuthVo userAuthVo, HttpServletRequest request) {
        userInfoService.userAuth(userAuthVo, AuthContextHolder.getUserId(request));
        return Result.ok();
    }

5、service层

@Override
    public void userAuth(UserAuthVo userAuthVo, Long userId) {
        // 更具Id获取到用户信息
        UserInfo userInfo = baseMapper.selectById(userId);
        // 对用户信息进行添加操作
        // 认证人姓名
        userInfo.setName(userAuthVo.getName());
        // 其他认证信息
        userInfo.setCertificatesType(userAuthVo.getCertificatesType());
        userInfo.setCertificatesNo(userAuthVo.getCertificatesNo());
        userInfo.setCertificatesUrl(userAuthVo.getCertificatesUrl());
        // 设置用户的状态 认证状态(0:未认证 1:认证中 2:认证成功 -1:认证失败)
        userInfo.setAuthStatus(AuthStatusEnum.AUTH_RUN.getStatus());
        baseMapper.updateById(userInfo);
    }

三、救诊人CRUD

1、分析

每个用户都可以添加几个就诊人,比如说,儿子可以添加爸爸,妈妈的就诊信息,挂号时,可以选择给谁挂号,就这些操作,增删改查就诊人

2、就诊人实体类分析

3、获取就诊人

横简单,但是有一个注意点,就是我们需要对参数完成包装,因为之前我们做的,需要对我们证件类型,位置信息,通过查询字典获取对应的实际值,保存到参数中,用户获取信息,凸显出有一个额外map属性的重要性

3.1、获取就诊人列表

(1)controller

 @ApiOperation(value = "获取就诊人列表")
    @GetMapping("/auth/findAll")
    public Result findAll(HttpServletRequest request) {
        Long userId = AuthContextHolder.getUserId(request);
        List<Patient> patientList = patientService.findAllByUserId(userId);
        return Result.ok(patientList);
    }

(2)service

 @Override
    public List<Patient> findAllByUserId(Long userId) {
        QueryWrapper<Patient> wrapper = new QueryWrapper();
        wrapper.eq("user_id", userId);
        List<Patient> patientList = baseMapper.selectList(wrapper);
        patientList.stream().forEach(item -> {
            this.setParam(item);
        });
        return patientList;
    }

(3)包装参数的方法

private Patient setParam(Patient patient) {
        //根据证件类型编码,获取证件类型具体指
        Result certificatesType = dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(), patient.getCertificatesType());//联系人证件
        //联系人证件类型(练习人证件可有可无)
        if (StringUtils.isEmpty(patient.getContactsCertificatesType())) {
            patient.getParam().put("contactsCertificatesTypeString", "");
        } else {
            Result contactsCertificatesType = dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(), patient.getContactsCertificatesType());
            patient.getParam().put("contactsCertificatesTypeString", contactsCertificatesType.getData());
        }
        //省
        Result province = dictFeignClient.getName(patient.getProvinceCode());
        //市
        Result city = dictFeignClient.getName(patient.getCityCode());
        //区
        Result district = dictFeignClient.getName(patient.getDistrictCode());
        // 参数封装
        patient.getParam().put("certificatesTypeString", certificatesType.getData());
        patient.getParam().put("provinceString", province.getData());
        patient.getParam().put("cityString", city.getData());
        patient.getParam().put("districtString", district.getData());
        patient.getParam().put("fullAddress", (String) province.getData() + (String) city.getData() + (String) district.getData() + patient.getAddress());
        return patient;
    }

3.2、更具就诊人Id获取对应的信息

@ApiOperation(value = "获取就诊人信息")
    @GetMapping("/auth/get/{id}")
    public Result getPatient(@PathVariable Long id) {
        Patient patient = patientService.getPatientById(id);
        return Result.ok(patient);
    }

@Override
    public Patient getPatientById(Long id) {
        Patient patient = baseMapper.selectById(id);
        this.setParam(patient);
        return patient;
    }

4、删改增(mp一步完成)

@ApiOperation(value = "添加用户")
    @PostMapping("/auth/save")
    public Result savePatient(@RequestBody Patient patient, HttpServletRequest request) {
        Long userId = AuthContextHolder.getUserId(request);
        patient.setUserId(userId);
        patientService.save(patient);
        return Result.ok();
    }

    @ApiOperation(value = "删除用户的的救诊人")
    @DeleteMapping("/auth/remove/{id}")
    public Result deletePatient(@PathVariable Long id) {
        patientService.removeById(id);
        return Result.ok();
    }

    @ApiOperation(value = "更改救诊人信息")
    @PutMapping("/auth/update")
    public Result update(@RequestBody Patient patient) {
        patientService.updateById(patient);
        return Result.ok();
    }

四、平台统一管理用户,效验认证

1、分析

我们平台对我们当前用户进行一个统一的认证和管理

  1. 显示出所有的用户列表
  2. 查看该用户的详情信息
  3. 锁定与解锁该用户
  4. 获取所有没有认证通过的列表
  5. 认证用户是否通过

2、操作(简单不在详细赘述)

(1)controller

@ApiDay06_项目整合阿里云OSS和Excel导入分类

在线教育_Day06_项目整合阿里云OSS和Excel导入分类

SpringBoot整合阿里云OSS

06-手机登录&token生成&容联云短信验证&用户认证和网关整合(网关做统一权限认证)

交友项目自动装配模块封装阿里云发送短信&Oss对象存储&百度云人脸识别

linux本地远程上传&下载阿里云oss的shell脚本实现方法