当前位置: 首页 > news >正文

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)

客户管理模块

  • 0.用户定位功能
    • 0.1 需求
    • 0.2 接口分析
    • 0.3 接口开发
      • Controller层开发
      • Service层开发
  • 1.我的地址簿功能
    • 1.1 需求
    • 1.2 数据库设计
    • 1.3 新增地址簿
      • 1.3.1 接口设计
      • 1.3.2 接口开发
        • Controller层开发
        • Service层开发
        • 测试功能
    • 1.4 地址簿查询
      • 1.4.1 接口设计
      • 1.4.2 接口开发
        • Controller层开发
        • Service层开发
        • 功能测试
    • 1.4 地址簿编辑
      • 1.4.1 需求
        • 1.4.2 根据地址薄id查询地址薄
          • 接口分析
          • Controller
        • 1.4.3 修改地址薄信息
          • 接口分析
          • Controller
          • Service层开发
        • 1.4.4 功能测试
    • 1.5 地址簿删除
      • 1.5.1 接口设计
      • 1.5.2 接口开发
        • Controller层开发
    • 1.6 设置/取消默认地址
      • 1.6.1 接口分析
      • 1.6.2 接口开发
        • Controller层开发
        • Service层开发
      • 1.6.3 功能测试
    • 1.7 获取默认地址接口
      • 1.7.1 接口分析
      • 1.7.2 接口设计
        • Controller层开发
        • Service层开发
  • 2.我的账户设置
    • 2.1 需求
    • 2.1 机构端设置银行账号
      • 2.1.1 新增或更新银行账号信息
        • 2.1.1.0 数据库表设计
        • 2.1.1.1 接口分析
        • 2.1.1.2 接口开发
          • Controller层开发
          • Service层开发
        • 2.1.1.3 功能测试
      • 2.1.2 查询银行账号信息
        • 2.1.2.1 接口分析
        • 2.1.2.2 接口开发
          • Controller层开发
    • 2.2 服务端设置银行账号
      • 2.2.1 服务端新增/更新银行账户
        • 2.2.1.1 接口分析
        • 2.2.1.2 接口开发
          • Controller层开发
        • 2.2.1.3 功能测试
      • 2.2.2 服务端获取当前用户银行账号接口
        • 2.2.2.1 接口分析
        • 2.2.2.2 接口开发
          • Controller层开发
        • 2.2.2.3 功能测试
  • 3.机构/服务人员认证模块
    • 3.1 需求
      • 3.1.1 服务端认证
      • 3.1.2 机构端认证
      • 3.1.1 运营端审核认证
    • 3.2 服务端提交认证
      • 3.2.0 服务人员认证审核表设计
      • 3.2.1 接口设计
      • 3.2.2 接口开发
        • Controller层开发
        • Service层开发
      • 3.2.3 功能测试
      • 3.2.4 服务人员查询认证驳回原因设计
        • 接口分析
        • Controller层
        • Service层
    • 3.3 机构端提交认证
      • 3.3.1 表设计
      • 3.3.2 接口设计
      • 3.3.3 接口开发
        • Controller层开发
        • Service层开发
      • 3.3.4 功能测试
      • 3.3.5 查询最新的驳回原因
        • 接口分析
        • 接口设计
          • Controller层
          • Service层
  • 4.运营端审核认证模块
    • 4.1 需求
    • 4.1审核服务人员
      • 4.1.1 分页查询审核信息
        • 4.1.1.1 接口分析
        • 4.1.1.2 接口开发
          • Controller层
          • Service层
        • 4.1.1.3 功能测试
      • 4.1.2 审核信息
        • 4.1.2.1 接口分析
        • 4.1.2.2 接口开发
          • Controller层
          • Service层
    • 4.2 审核机构人员
      • 4.2.1 分页查询审核信息
        • 2.2.1.1 接口分析
        • 2.2.1.2 接口开发
          • Controller层
          • Service层
      • 4.2.2 审核信息
        • 4.2.2.1接口分析
        • 4.2.2.2 接口开发
          • Controller层
          • Service层

0.用户定位功能

0.1 需求

用户端在小程序认证通过后会自动进行定位,也可以在首页手动定位,定位成功后用户在查询家政服务项目时会根据定位的城市查询该城市有哪些服务项目。
手动定位过程如下图:
在这里插入图片描述
点击下图箭头位置进行手动定位。
在这里插入图片描述
定位成功再次进入首页发现位置变为新地址

小程序端的定位是通过手机的定位模块进行定位,定位成功获取经纬度坐标,平台根据经纬度坐标请求地图服务获取经纬度坐标对应的具体位置。
在这里插入图片描述

小程序首先通过微信提供的方法拿到经纬度坐标,然后请求后端获取具体的位置,后端会请求高德地图根据经纬度获取具体的城市信息。

0.2 接口分析

当用户进入小程序后,批准小程序获取位置,则会发出以下请求:
在这里插入图片描述
后端会请求高德地图根据经纬度获取具体的cityCode

0.3 接口开发

Controller层开发

@RestController
@RequestMapping("/inner/map")
@Api(tags = "内部接口 - 地图服务相关接口")
public class InnerMapController implements MapApi {@Resourceprivate MapService mapService;@Override@GetMapping("/getLocationByAddress")@ApiOperation("根据地址查询经纬度")@ApiImplicitParams({@ApiImplicitParam(name = "address", value = "地址", required = true, dataTypeClass = String.class)})public LocationResDTO getLocationByAddress(@RequestParam("address") String address) {String location = mapService.getLocationByAddress(address);return new LocationResDTO(location);}
}

Service层开发

首先就是存一下经纬度以及高德开发api的key,其中高德开发者key存在了nacos配置中心中,之后调用高德api获取到cityCode进行返回即可:
在这里插入图片描述

    public String getLocationByAddress(String address) {Map<String, Object> params = new HashMap();params.put("address", address);params.put("key", this.amapProperties.getKey());String jsonStr = HttpRequest.get("https://restapi.amap.com/v3/geocode/geo?").form(params).execute().body();JSONObject jsonObject = JSONUtil.parseObj(jsonStr);JSONArray geocodes = JSONUtil.parseArray(jsonObject.get("geocodes"));Object location = JSONUtil.parseObj(geocodes.get(0)).get("location");return location.toString();}

1.我的地址簿功能

1.1 需求

用户下单时需要选择服务地址(相当于收货地址),在“我的”–》“我的地址”界面维护地址簿信息。
在这里插入图片描述
点击“我的地址”即可进入地址簿管理界面
因此,需要完成以下功能:

  • 新增地址簿
  • 地址簿编辑
  • 地址簿删除
  • 地址簿查询
  • 批量删除
  • 设置默认地址

1.2 数据库设计

create table `jzo2o-customer`.address_book
(id          bigint                             not null comment '主键'constraint `PRIMARY`primary key,user_id     bigint                             not null comment '用户id',name        varchar(255)                       not null comment '名称',phone       varchar(255)                       not null comment '电话',province    varchar(255)                       not null comment '省份',city        varchar(255)                       not null comment '市级',county      varchar(255)                       not null comment '区/县',address     varchar(255)                       not null comment '详细地址',lon         double(10, 5)                      null comment '经度',lat         double(10, 5)                      null comment '纬度',is_default  int      default 0                 not null comment '是否为默认地址,0:否,1:是',is_deleted  int      default 0                 not null comment '是否已删除,0:未删除,1:已删除',create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',create_by   bigint                             null comment '创建者',update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',update_by   bigint                             null comment '更新者'
)

1.3 新增地址簿

1.3.1 接口设计

接口路径:POST/customer/consumer/address-book
请求数据类型 application/json
在这里插入图片描述在这里插入图片描述

1.3.2 接口开发

Controller层开发
@RestController("consumerAddressBookController")
@RequestMapping("/consumer/address-book")
@Api(tags = "用户端 - 地址薄相关接口")
public class AddressBookCotroller {@Autowiredprivate IAddressBookService addressBookService;@RequestMapping("/address-book")@ApiOperation("地址薄新增")public void add(@RequestBody AddressBookUpsertReqDTO addressBookUpsertReqDTO){IAddressBookService.add(addressBookUpsertReqDTO);}
}
Service层开发

大概业务逻辑就是:

  • 从Threadlocal中获取userId
  • 若请求中该新增地址设为默认,则取消之前的默认地址
  • 拼接地址
  • 写入数据库

取消之前的默认地址如下:

    /*** 取消默认地址* @param userId*/private void cancelDefault(Long userId) {lambdaUpdate().eq(AddressBook::getId,userId).set(AddressBook::getIsDefault,0).update();}

Service层代码:

    /*** 新增地址簿* @param addressBookUpsertReqDTO*/@Overridepublic void add(AddressBookUpsertReqDTO addressBookUpsertReqDTO){//1.从Threadlocal中获取当前用户idLong userId = UserContext.currentUserId();//2.如果新增中设为默认地址,取消其他默认地址if (1 == addressBookUpsertReqDTO.getIsDefault()) {cancelDefault(userId);}AddressBook addressBook = BeanUtil.toBean(addressBookUpsertReqDTO, AddressBook.class);addressBook.setId(userId);//3.组装详细地址String completeAddress = addressBookUpsertReqDTO.getProvince() +addressBookUpsertReqDTO.getCity() +addressBookUpsertReqDTO.getCounty() +addressBookUpsertReqDTO.getAddress();//4.如果请求体中没有经纬度,需要调用第三方api根据详细地址获取经纬度if(ObjectUtils.isEmpty(addressBookUpsertReqDTO.getLocation())){//调用高德接口获得经纬度LocationResDTO locationDto = mapApi.getLocationByAddress(completeAddress);//经纬度(字符串格式:经度,纬度),经度在前,纬度在后String location = locationDto.getLocation();addressBookUpsertReqDTO.setLocation(location);}if(StringUtils.isNotEmpty(addressBookUpsertReqDTO.getLocation())) {// 经度addressBook.setLon(NumberUtils.parseDouble(addressBookUpsertReqDTO.getLocation().split(",")[0]));// 纬度addressBook.setLat(NumberUtils.parseDouble(addressBookUpsertReqDTO.getLocation().split(",")[1]));}addressBookService.save(addressBook);}
测试功能

输入信息:
在这里插入图片描述
请求正常被收到并且处理:
在这里插入图片描述
数据库也插入了:
在这里插入图片描述

1.4 地址簿查询

1.4.1 接口设计

接口路径:GET/customer/consumer/address-book/page
请求数据类型 application/x-www-form-urlencoded
在这里插入图片描述
在这里插入图片描述

1.4.2 接口开发

Controller层开发
    @GetMapping("/page")@ApiOperation("地址薄分页查询")public PageResult<AddressBookResDTO> page(AddressBookPageQueryReqDTO addressBookPageQueryReqDTO){return addressBookService.page(addressBookPageQueryReqDTO);}
Service层开发
    /*** 地址簿分页查询* @param addressBookPageQueryReqDTO* @return*/@Overridepublic PageResult<AddressBookResDTO> page(AddressBookPageQueryReqDTO addressBookPageQueryReqDTO) {Page<AddressBook> page = PageUtils.parsePageQuery(addressBookPageQueryReqDTO, AddressBook.class);LambdaQueryWrapper<AddressBook> lambdaQueryWrapper = Wrappers.lambdaQuery(AddressBook.class).eq(AddressBook::getUserId, UserContext.currentUserId());Page<AddressBook> page1 = addressBookService.page(page, lambdaQueryWrapper);return PageUtils.toPage(page1, AddressBookResDTO.class);}
功能测试

在这里插入图片描述

1.4 地址簿编辑

1.4.1 需求

实现点击编辑按钮,应该首先显示出当前地址信息,之后修改后数据写回数据库,因此,这个功能包含两部分:

  • 根据地址薄id查询信息
  • 修改地址薄
1.4.2 根据地址薄id查询地址薄
接口分析

接口路径:GET/customer/consumer/address-book/{id}在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Controller
    @GetMapping("/#{id}")@ApiOperation("地址薄详情")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "地址薄id", required = true, dataTypeClass = Long.class)})public AddressBookResDTO detail(@PathVariable("id") Long id){AddressBook addressBook = addressBookService.getById(id);return BeanUtil.toBean(addressBook, AddressBookResDTO.class);}
1.4.3 修改地址薄信息
接口分析

接口路径:PUT/customer/consumer/address-book/{id}
请求数据类型 application/json
在这里插入图片描述
在这里插入图片描述

Controller
    @PutMapping("/{id}")@ApiOperation("地址薄修改")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "地址薄id", required = true, dataTypeClass = Long.class)})public void update(@PathVariable("id") Long id,@RequestBody AddressBookUpsertReqDTO addressBookUpsertReqDTO){addressBookService.update(id,addressBookUpsertReqDTO);}
Service层开发
    @Overridepublic void update(Long id, AddressBookUpsertReqDTO addressBookUpsertReqDTO) {//1.判断是否取消默认if(addressBookUpsertReqDTO.getIsDefault() == 1){cancelDefault(id);}AddressBook addressBook = BeanUtil.toBean(addressBookUpsertReqDTO, AddressBook.class);addressBook.setId(id);//调用第三方,根据地址获取经纬度坐标String completeAddress = addressBookUpsertReqDTO.getProvince() +addressBookUpsertReqDTO.getCity() +addressBookUpsertReqDTO.getCounty() +addressBookUpsertReqDTO.getAddress();//远程请求高德获取经纬度LocationResDTO locationDto = mapApi.getLocationByAddress(completeAddress);//经纬度(字符串格式:经度,纬度),经度在前,纬度在后String location = locationDto.getLocation();if(StringUtils.isNotEmpty(location)) {// 经度addressBook.setLon(NumberUtils.parseDouble(locationDto.getLocation().split(",")[0]));// 纬度addressBook.setLat(NumberUtils.parseDouble(locationDto.getLocation().split(",")[1]));}addressBookMapper.updateById(addressBook);}
1.4.4 功能测试

首先点击了编辑:
在这里插入图片描述
之后开始编辑并且确定:
在这里插入图片描述
功能已经实现:
在这里插入图片描述

1.5 地址簿删除

1.5.1 接口设计

接口路径:DELETE/customer/consumer/address-book/batch
在这里插入图片描述
在这里插入图片描述

1.5.2 接口开发

Controller层开发

实现比较简单,直接在controller调用mp的方法即可:

    @DeleteMapping("/batch")@ApiOperation("地址薄批量删除")@ApiImplicitParam(name = "ids", value = "地址薄id列表", required = true, dataTypeClass = List.class)public void batch(@RequestBody List<Long> ids){addressBookService.removeByIds(ids);}

1.6 设置/取消默认地址

1.6.1 接口分析

接口路径:PUT/customer/consumer/address-book/default
请求数据类型 application/x-www-form-urlencoded
在这里插入图片描述
在这里插入图片描述

1.6.2 接口开发

Controller层开发
    @PutMapping("/default")@ApiOperation("地址薄设为默认/取消默认")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "地址薄id", required = true, dataTypeClass = Long.class),@ApiImplicitParam(name = "flag", value = "是否为默认地址,0:否,1:是", required = true, dataTypeClass = Integer.class)})public void updateDefaultStatus(@NotNull(message = "id不能为空") @RequestParam("id") Long id,@NotNull(message = "状态值不能为空") @RequestParam("flag") Integer flag) {//当前登录用户idLong userId = UserContext.currentUserId();addressBookService.updateDefaultStatus(userId,id, flag);}
Service层开发
    /*** 设置/取消默认地址* @param userId* @param id* @param flag*/@Overridepublic void updateDefaultStatus(Long userId, Long id, Integer flag) {if (1 == flag) {//如果设默认地址,先把其他地址取消默认cancelDefault(userId);}AddressBook addressBook = new AddressBook();addressBook.setId(id);addressBook.setIsDefault(flag);addressBookMapper.updateById(addressBook);}

1.6.3 功能测试

一开始:
在这里插入图片描述
之后我们李浩111设为默认地址:
在这里插入图片描述
功能测试成功

1.7 获取默认地址接口

在下单界面先获取当前用户的默认地址,如果有默认地址则直接显示在页面中,因此需要提前设计好这个接口

1.7.1 接口分析

接口路径:GET/customer/consumer/address-book/defaultAddress
请求数据类型 application/x-www-form-urlencoded
请求参数:无
在这里插入图片描述
在这里插入图片描述

1.7.2 接口设计

Controller层开发
    @GetMapping("/defaultAddress")@ApiOperation("获取默认地址")public AddressBookResDTO defaultAddress(){return addressBookService.defaultAddress();}
Service层开发
    /*** 获取默认地址信息* @return*/@Overridepublic AddressBookResDTO defaultAddress() {LambdaQueryWrapper<AddressBook> lambdaQueryWrapper = Wrappers.lambdaQuery(AddressBook.class);lambdaQueryWrapper.eq(AddressBook::getUserId,UserContext.currentUserId()).eq(AddressBook::getIsDefault,1);AddressBook addressBook = addressBookMapper.selectOne(lambdaQueryWrapper);return BeanUtil.toBean(addressBook,AddressBookResDTO.class);}

2.我的账户设置

2.1 需求

需要完成以下功能:

  • 服务端设置银行卡
  • 机构端设置银行卡
  • 新增或者更新以上设置的银行卡
  • 获取银行卡信息的接口

本模块在维护银行账户信息时需要上传银行卡照片,本项目的图片服务器使用阿里的OSS存储。

2.1 机构端设置银行账号

2.1.1 新增或更新银行账号信息

2.1.1.0 数据库表设计
CREATE TABLE `bank_account` (`id` bigint DEFAULT NULL COMMENT '服务人员/机构id',`type` int DEFAULT NULL COMMENT '类型,2:服务人员,3:服务机构',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '户名',`bank_name` varchar(50) DEFAULT NULL COMMENT '银行名称',`province` varchar(50) DEFAULT NULL COMMENT '省',`city` varchar(50) DEFAULT NULL COMMENT '市',`district` varchar(50) DEFAULT NULL COMMENT '区',`branch` varchar(50) DEFAULT NULL COMMENT '网点',`account` varchar(50) DEFAULT NULL COMMENT '银行账号',`account_certification` varchar(100) DEFAULT NULL COMMENT '开户证明',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
)
2.1.1.1 接口分析

接口路径:POST/customer/agency/bank-account
请求类型:application/json
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.1.2 接口开发
Controller层开发
@RestController("agencyBankAccountController")
@RequestMapping("/agency/bank-account")
@Api(tags = "机构端 - 银行账户信息相关接口")
public class BankAccountController {@Autowiredprivate IBankAccountService bankAccountService;@PostMapping@ApiOperation("新增或更新银行账号信息")public void queryByServeProviderId(@RequestBody BankAccountUpsertReqDTO bankAccountUpsertReqDTO){CurrentUserInfo currentUserInfo = UserContext.currentUser();bankAccountUpsertReqDTO.setId(currentUserInfo.getId());bankAccountUpsertReqDTO.setType(currentUserInfo.getUserType());bankAccountService.queryAndUpdate(bankAccountUpsertReqDTO);}
}
Service层开发
public class BankAccountServiceImpl extends ServiceImpl<BankAccountMapper, BankAccount> implements IBankAccountService {/*** 更新或新增银行账户* @param bankAccountUpsertReqDTO*/@Overridepublic void queryAndUpdate(BankAccountUpsertReqDTO bankAccountUpsertReqDTO) {BankAccount bankAccount = BeanUtil.toBean(bankAccountUpsertReqDTO, BankAccount.class);super.saveOrUpdate(bankAccount);}
}
2.1.1.3 功能测试

点击账户设置,之后填好信息:
在这里插入图片描述
点击提交:
在这里插入图片描述
在这里插入图片描述
功能测试成功

2.1.2 查询银行账号信息

2.1.2.1 接口分析

接口路径:GET/customer/worker/bank-account/currentUserBankAccount
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.1.2.2 接口开发
Controller层开发
    @GetMapping("/currentUserBankAccount")@ApiOperation("获取当前用户银行账号")public BankAccountResDTO queryCurrentUserBankAccount() {BankAccount bankAccount = bankAccountService.getById(UserContext.currentUserId());return BeanUtil.toBean(bankAccount, BankAccountResDTO.class);}

2.2 服务端设置银行账号

2.2.1 服务端新增/更新银行账户

2.2.1.1 接口分析

接口路径:POST/customer/worker/bank-account
请求类型:application/json
在这里插入图片描述
在这里插入图片描述

2.2.1.2 接口开发
Controller层开发
@RestController("workerBankAccountController")
@RequestMapping("/worker/bank-account")
@Api(tags = "服务端 - 银行账户信息相关接口")
public class BankAccountController {@Autowiredprivate IBankAccountService bankAccountService;@PostMapping@ApiOperation("新增或更新银行账号信息")public void queryByServeProviderId(@RequestBody BankAccountUpsertReqDTO bankAccountUpsertReqDTO){CurrentUserInfo currentUserInfo = UserContext.currentUser();bankAccountUpsertReqDTO.setId(currentUserInfo.getId());bankAccountUpsertReqDTO.setType(currentUserInfo.getUserType());bankAccountService.queryAndUpdate(bankAccountUpsertReqDTO);}
}
2.2.1.3 功能测试

填入银行账户信息:
在这里插入图片描述
点击提交:
在这里插入图片描述
在这里插入图片描述
功能测试成功

2.2.2 服务端获取当前用户银行账号接口

2.2.2.1 接口分析

接口路径:GET/customer/worker/bank-account/currentUserBankAccount
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.2.2 接口开发
Controller层开发
    @PostMapping("/currentUserBankAccount")@ApiOperation("查询银行账户信息")public BankAccountResDTO queryCurrentUserBankAccount(){BankAccount bankAccount = bankAccountService.getById(UserContext.currentUserId());return BeanUtil.toBean(bankAccount,BankAccountResDTO.class);}
2.2.2.3 功能测试

当我们提交了一次服务端账户信息后,再次点击账户信息:
在这里插入图片描述
在这里插入图片描述
此功能处理成功

3.机构/服务人员认证模块

3.1 需求

3.1.1 服务端认证

当服务端的服务者注册成功账户,并登录后,会强制进行实名认证:
在这里插入图片描述
点击去认证:
在这里插入图片描述

3.1.2 机构端认证

当新注册的机构账户进行登录后:
在这里插入图片描述
再点击资质认证:
在这里插入图片描述

3.1.1 运营端审核认证

在这里插入图片描述

3.2 服务端提交认证

3.2.0 服务人员认证审核表设计

认证审核表:

CREATE TABLE `worker_certification_audit` (`id` bigint NOT NULL COMMENT '主键',`serve_provider_id` bigint DEFAULT NULL COMMENT '服务人员id',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',`id_card_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '身份证号',`front_img` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '身份证正面',`back_img` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '身份证反面',`certification_material` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '证明资料',`audit_status` int DEFAULT '0' COMMENT '审核状态,0:未审核,1:已审核',`auditor_id` bigint DEFAULT NULL COMMENT '审核人id',`auditor_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '审核人姓名',`audit_time` datetime DEFAULT NULL COMMENT '审核时间',`certification_status` int DEFAULT '1' COMMENT '认证状态,1:认证中,2:认证成功,3认证失败',`reject_reason` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '驳回原因',`create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
)

认证表:

create table worker_certification
(id                     bigint   default 0                 not null comment '服务人员id'primary key,name                   varchar(50)                        null comment '姓名',id_card_no             varchar(50)                        null comment '身份证号',front_img              varchar(100)                       null comment '身份证正面',back_img               varchar(100)                       null comment '身份证反面',certification_material varchar(100)                       null comment '证明资料',certification_status   int      default 0                 not null comment '认证状态,0:初始态,1:认证中,2:认证成功,3认证失败',certification_time     datetime                           null comment '认证时间',create_time            datetime default CURRENT_TIMESTAMP not null comment '创建时间',update_time            datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间'
)

3.2.1 接口设计

接口路径:POST/customer/worker/worker-certification-audit
请求数据类型: application/json
请求参数:
在这里插入图片描述
响应参数:
在这里插入图片描述

3.2.2 接口开发

Controller层开发
@RestController("workerWorkerCertificationAuditController")
@RequestMapping("/worker/worker-certification-audit")
@Api(tags = "服务端人员认证接口")
public class workerWorkerCertificationAuditController {@Autowiredprivate WorkCertificationAuditService workCertificationAuditService;@PostMapping@ApiOperation("提交认证申请")public void auditCertification(@RequestBody WorkerCertificationAuditResDTO workerCertificationAuditResDTO){workerCertificationAuditResDTO.setServeProviderId(UserContext.currentUserId());workCertificationAuditService.applyCertification(workerCertificationAuditResDTO);}
}
Service层开发
@Service
public class WorkCertificationAuditServiceImpl extends ServiceImpl<WorkerCertificationAuditMapper,WorkerCertificationAudit> implements WorkCertificationAuditService {@Autowiredprivate WorkerCertificationAuditMapper workerCertificationAuditMapper;@Autowiredprivate IWorkerCertificationService workerCertificationService;/*** 服务人员提交申请* @param workerCertificationAuditResDTO*/@Overridepublic void applyCertification(WorkerCertificationAuditResDTO workerCertificationAuditResDTO) {WorkerCertificationAudit workerCertificationAudit = BeanUtil.toBean(workerCertificationAuditResDTO, WorkerCertificationAudit.class);//默认未审核workerCertificationAudit.setAuditStatus(0);workerCertificationAuditMapper.insert(workerCertificationAudit);//查询认证状态并且将认证信息存入认证表中Long serveProviderId = workerCertificationAuditResDTO.getServeProviderId();WorkerCertification workerCertification = workerCertificationService.getById(serveProviderId);if(ObjectUtil.isNotEmpty(workerCertification)){//不为空说明之前审核过,只需要修改为审核中即可workerCertification.setCertificationStatus(CertificationStatusEnum.PROGRESSING.getStatus());workerCertificationService.updateById(workerCertification);}else{//为空则说明第一次审核,需要将审核信息存入表中WorkerCertification workerCertification1 = new WorkerCertification();workerCertification1.setCertificationStatus(CertificationStatusEnum.PROGRESSING.getStatus());workerCertification1.setId(serveProviderId);workerCertificationService.save(workerCertification1);}}
}

3.2.3 功能测试

服务端新建账号后点击实名:
在这里插入图片描述
点击提交:
在这里插入图片描述
在这里插入图片描述
功能完成

3.2.4 服务人员查询认证驳回原因设计

接口分析

接口路径:GET/customer/worker/worker-certification-audit/rejectReason
请求数据类型: application/x-www-form-urlencoded
请求参数:

响应参数:
[图片]

Controller层
    @GetMapping("/rejectReason")@ApiOperation("服务人员查询驳回原因")public RejectReasonResDTO queryRejectReason(){return workCertificationAuditService.queryRejectReason();}
Service层
    /*** 查询驳回理由* @return*/@Overridepublic RejectReasonResDTO queryRejectReason() {LambdaQueryWrapper<WorkerCertificationAudit> queryWrapper = Wrappers.lambdaQuery(WorkerCertificationAudit.class);queryWrapper.eq(WorkerCertificationAudit::getServeProviderId, UserContext.currentUserId()).orderByDesc(WorkerCertificationAudit::getCreateTime).last("limit 1");WorkerCertificationAudit workerCertificationAudit = workerCertificationAuditMapper.selectOne(queryWrapper);return new RejectReasonResDTO(workerCertificationAudit.getRejectReason());}

3.3 机构端提交认证

3.3.1 表设计

认证信息提交表:

CREATE TABLE `agency_certification_audit` (`id` bigint NOT NULL COMMENT '主键',`serve_provider_id` bigint DEFAULT NULL COMMENT '机构id',`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '企业名称',`id_number` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '统一社会信用代码',`legal_person_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '法人姓名',`legal_person_id_card_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '法人身份证号',`business_license` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '营业执照',`audit_status` int NOT NULL DEFAULT '0' COMMENT '审核状态,0:未审核,1:已审核',`auditor_id` bigint DEFAULT NULL COMMENT '审核人id',`auditor_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '审核人姓名',`audit_time` datetime DEFAULT NULL COMMENT '审核时间',`certification_status` int NOT NULL DEFAULT '1' COMMENT '认证状态,1:认证中,2:认证成功,3:认证失败',`reject_reason` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '驳回原因',`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',PRIMARY KEY (`id`)
) 

认证信息表:

create table agency_certification
(id                      bigint auto_increment comment '机构id'primary key,name                    varchar(50)                        null comment '企业名称',id_number               varchar(50)                        null comment '统一社会信用代码',legal_person_name       varchar(50)                        null comment '法人姓名',legal_person_id_card_no varchar(50)                        null comment '法人身份证号',business_license        varchar(100)                       null comment '营业执照',certification_status    int      default 0                 not null comment '认证状态,0:初始态,1:认证中,2:认证成功,3认证失败',certification_time      datetime                           null comment '认证时间',create_time             datetime default CURRENT_TIMESTAMP not null comment '创建时间',update_time             datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间'
)

3.3.2 接口设计

接口路径:POST/customer/agency/agency-certification-audit
请求数据类型: application/json
在这里插入图片描述
在这里插入图片描述

3.3.3 接口开发

Controller层开发
@RestController("AgencyCertificationAuditController")
@RequestMapping("/agency/agency-certification-audit")
@Api("机构端认证审核相关接口")
public class AgencyCertificationAuditController {@Autowiredprivate IAgencyCertificationAuditService applyCertification;@PostMapping@ApiOperation("提交认证申请")public void auditCertification(@RequestBody AgencyCertificationAuditAddReqDTO agencyCertificationAuditAddReqDTO) {agencyCertificationAuditAddReqDTO.setServeProviderId(UserContext.currentUserId());applyCertification.applyCertification(agencyCertificationAuditAddReqDTO);}
}
Service层开发
    /*** 机构端提交认证申请* @param agencyCertificationAuditAddReqDTO*/@Overridepublic void applyCertification(AgencyCertificationAuditAddReqDTO agencyCertificationAuditAddReqDTO) {AgencyCertificationAudit agencyCertificationAudit = BeanUtil.toBean(agencyCertificationAuditAddReqDTO, AgencyCertificationAudit.class);baseMapper.insert(agencyCertificationAudit);//查询认证记录Long serveProviderId = agencyCertificationAudit.getServeProviderId();AgencyCertification agencyCertification = agencyCertificationService.getById(serveProviderId);if(ObjectUtil.isNotEmpty(agencyCertification)){//不是第一次认证agencyCertification.setCertificationStatus(CertificationStatusEnum.PROGRESSING.getStatus());agencyCertificationService.updateById(agencyCertification);}else{//是第一次认证AgencyCertification agencyCertification1 = new AgencyCertification();agencyCertification1.setCertificationStatus(CertificationStatusEnum.PROGRESSING.getStatus());agencyCertification1.setId(serveProviderId);agencyCertificationService.save(agencyCertification1);}}

3.3.4 功能测试

点击认证之后输入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
功能开发完成

3.3.5 查询最新的驳回原因

接口分析

接口路径:GET/customer/agency/agency-certification-audit/rejectReason
请求数据类型: application/x-www-form-urlencoded
请求参数:

响应参数:
在这里插入图片描述

接口设计
Controller层
    @GetMapping("/rejectReason")@ApiOperation("查询最新的驳回原因")public RejectReasonResDTO queryCurrentUserLastRejectReason() {return applyCertification.queryCurrentUserLastRejectReason();}
Service层
    /*** 机构端查询最新驳回原因* @return*/@Overridepublic RejectReasonResDTO queryCurrentUserLastRejectReason() {LambdaQueryWrapper<AgencyCertificationAudit> queryWrapper = Wrappers.<AgencyCertificationAudit>lambdaQuery().eq(AgencyCertificationAudit::getServeProviderId, UserContext.currentUserId()).orderByDesc(AgencyCertificationAudit::getCreateTime).last("limit 1");AgencyCertificationAudit agencyCertificationAudit = baseMapper.selectOne(queryWrapper);return new RejectReasonResDTO(agencyCertificationAudit.getRejectReason());}

4.运营端审核认证模块

4.1 需求

运营端管理员需要在后台申请服务人员/机构的认证申请,可以驳回或者通过,驳回后,其可以继续申请,大概就是这样

4.1审核服务人员

4.1.1 分页查询审核信息

4.1.1.1 接口分析

接口路径:GET/customer/operation/worker-certification-audit/page
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1.1.2 接口开发
Controller层
@RestController("operationWorkerCertificationAuditController")
@RequestMapping("/operation/worker-certification-audit")
@Api(tags = "运营端 - 服务端认证审核接口")
public class WorkerCertificationAuditController {@Autowiredprivate WorkCertificationAuditService workCertificationAuditService;@GetMapping("/page")@ApiOperation("服务人员认证信息分页查询")public PageResult<WorkerCertificationAuditResDTO> page(WorkerCertificationAuditPageQueryReqDTO workerCertificationAuditPageQueryReqDTO){return workCertificationAuditService.pageQuery(workerCertificationAuditPageQueryReqDTO);}
}
Service层
    /*** 服务人员认证的分页查询* @param workerCertificationAuditPageQueryReqDTO* @return*/@Overridepublic PageResult<WorkerCertificationAuditResDTO> pageQuery(WorkerCertificationAuditPageQueryReqDTO workerCertificationAuditPageQueryReqDTO) {Page<WorkerCertificationAudit> workerCertificationAuditPage = PageUtils.parsePageQuery(workerCertificationAuditPageQueryReqDTO, WorkerCertificationAudit.class);LambdaQueryWrapper<WorkerCertificationAudit> queryWrapper = Wrappers.lambdaQuery(WorkerCertificationAudit.class);queryWrapper.like(ObjectUtil.isNotEmpty(workerCertificationAuditPageQueryReqDTO.getName()), WorkerCertificationAudit::getName, workerCertificationAuditPageQueryReqDTO.getName()).eq(ObjectUtil.isNotEmpty(workerCertificationAuditPageQueryReqDTO.getIdCardNo()), WorkerCertificationAudit::getIdCardNo, workerCertificationAuditPageQueryReqDTO.getIdCardNo()).eq(ObjectUtil.isNotEmpty(workerCertificationAuditPageQueryReqDTO.getAuditStatus()), WorkerCertificationAudit::getAuditStatus, workerCertificationAuditPageQueryReqDTO.getAuditStatus()).eq(ObjectUtil.isNotEmpty(workerCertificationAuditPageQueryReqDTO.getCertificationStatus()), WorkerCertificationAudit::getCertificationStatus, workerCertificationAuditPageQueryReqDTO.getCertificationStatus());Page<WorkerCertificationAudit> workerCertificationAuditPage1 = baseMapper.selectPage(workerCertificationAuditPage, queryWrapper);return PageUtils.toPage(workerCertificationAuditPage1,WorkerCertificationAuditResDTO.class);}
4.1.1.3 功能测试

在这里插入图片描述

4.1.2 审核信息

4.1.2.1 接口分析

PUT/customer/operation/worker-certification-audit/audit/{id}
在这里插入图片描述
在这里插入图片描述

4.1.2.2 接口开发
Controller层
@PutMapping("/audit/{id}")@ApiOperation("审核服务人员认证信息")@ApiImplicitParams({@ApiImplicitParam(name = "id",value = "认证申请id",required = true,dataTypeClass = Long.class)})public void auditCertification(@PathVariable("id") Long id, CertificationAuditReqDTO certificationAuditReqDTO){workCertificationAuditService.auditCertification(id,certificationAuditReqDTO);}
Service层
    /*** 审核服务人员信息* @param id* @param certificationAuditReqDTO*/@Override@Transactionalpublic void auditCertification(Long id, CertificationAuditReqDTO certificationAuditReqDTO) {CurrentUserInfo currentUserInfo = UserContext.currentUser();LambdaUpdateWrapper<WorkerCertificationAudit> updateWrapper = Wrappers.lambdaUpdate(WorkerCertificationAudit.class);updateWrapper.eq(WorkerCertificationAudit::getId,id).set(WorkerCertificationAudit::getAuditStatus,1).set(WorkerCertificationAudit::getAuditorId,currentUserInfo.getId()).set(WorkerCertificationAudit::getAuditorName,currentUserInfo.getName()).set(WorkerCertificationAudit::getAuditTime, LocalDateTime.now()).set(WorkerCertificationAudit::getCertificationStatus,certificationAuditReqDTO.getCertificationStatus()).set(ObjectUtil.isNotEmpty(certificationAuditReqDTO.getRejectReason()),WorkerCertificationAudit::getRejectReason,certificationAuditReqDTO.getRejectReason());super.update(updateWrapper);}

4.2 审核机构人员

4.2.1 分页查询审核信息

2.2.1.1 接口分析

接口路径:GET/customer/operation/agency-certification-audit/page
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.1.2 接口开发
Controller层
@RestController("operationAgencyCertificationAuditController")
@RequestMapping("/operation/agency-certification-audit")
@Api(tags = "运营端 - 机构认证审核相关接口")
public class AgencyCertificationAuditController {@Resourceprivate IAgencyCertificationAuditService agencyCertificationAuditService;@GetMapping("/page")@ApiOperation("机构认证审核信息分页查询")public PageResult<AgencyCertificationAuditResDTO> page(AgencyCertificationAuditPageQueryReqDTO agencyCertificationAuditPageQueryReqDTO) {return agencyCertificationAuditService.pageQuery(agencyCertificationAuditPageQueryReqDTO);}}
Service层
/*** 审核服务人员信息* @param id* @param certificationAuditReqDTO*/@Override@Transactionalpublic void auditCertification(Long id, CertificationAuditReqDTO certificationAuditReqDTO) {//1.更新申请记录CurrentUserInfo currentUserInfo = UserContext.currentUser();LambdaUpdateWrapper<WorkerCertificationAudit> updateWrapper = Wrappers.lambdaUpdate(WorkerCertificationAudit.class);updateWrapper.eq(WorkerCertificationAudit::getId,id).set(WorkerCertificationAudit::getAuditStatus,1).set(WorkerCertificationAudit::getAuditorId,currentUserInfo.getId()).set(WorkerCertificationAudit::getAuditorName,currentUserInfo.getName()).set(WorkerCertificationAudit::getAuditTime, LocalDateTime.now()).set(WorkerCertificationAudit::getCertificationStatus,certificationAuditReqDTO.getCertificationStatus()).set(ObjectUtil.isNotEmpty(certificationAuditReqDTO.getRejectReason()),WorkerCertificationAudit::getRejectReason,certificationAuditReqDTO.getRejectReason());super.update(updateWrapper);//2.更新认证信息,如果认证成功,需要将各认证属性也更新WorkerCertificationAudit workerCertificationAudit = baseMapper.selectById(id);WorkerCertificationUpdateDTO workerCertificationUpdateDTO = new WorkerCertificationUpdateDTO();workerCertificationUpdateDTO.setId(workerCertificationAudit.getServeProviderId());workerCertificationUpdateDTO.setCertificationStatus(certificationAuditReqDTO.getCertificationStatus());if (ObjectUtil.equal(CertificationStatusEnum.SUCCESS.getStatus(), certificationAuditReqDTO.getCertificationStatus())) {//如果认证成功,需要更新服务人员/机构名称serveProviderService.updateNameById(workerCertificationAudit.getServeProviderId(), workerCertificationAudit.getName());workerCertificationUpdateDTO.setName(workerCertificationAudit.getName());workerCertificationUpdateDTO.setIdCardNo(workerCertificationAudit.getIdCardNo());workerCertificationUpdateDTO.setFrontImg(workerCertificationAudit.getFrontImg());workerCertificationUpdateDTO.setBackImg(workerCertificationAudit.getBackImg());workerCertificationUpdateDTO.setCertificationMaterial(workerCertificationAudit.getCertificationMaterial());workerCertificationUpdateDTO.setCertificationTime(workerCertificationAudit.getAuditTime());}workerCertificationService.updateById(workerCertificationUpdateDTO);}

4.2.2 审核信息

4.2.2.1接口分析
4.2.2.2 接口开发
Controller层
    @PutMapping("/audit/{id}")@ApiOperation("审核机构认证信息")@ApiImplicitParams({@ApiImplicitParam(name = "id", value = "认证申请id", required = true, dataTypeClass = Long.class)})public void auditCertification(@PathVariable("id") Long id, CertificationAuditReqDTO certificationAuditReqDTO) {agencyCertificationAuditService.auditCertification(id, certificationAuditReqDTO);}
Service层
    /*** 审核机构认证信息* @param id* @param certificationAuditReqDTO*/@Overridepublic void auditCertification(Long id, CertificationAuditReqDTO certificationAuditReqDTO) {CurrentUserInfo currentUserInfo = UserContext.currentUser();LambdaUpdateWrapper<AgencyCertificationAudit> updateWrapper = Wrappers.<AgencyCertificationAudit>lambdaUpdate().eq(AgencyCertificationAudit::getId, id).set(AgencyCertificationAudit::getAuditStatus, EnableStatusEnum.ENABLE.getStatus()).set(AgencyCertificationAudit::getAuditorId, currentUserInfo.getId()).set(AgencyCertificationAudit::getAuditorName, currentUserInfo.getName()).set(AgencyCertificationAudit::getAuditTime, LocalDateTime.now()).set(AgencyCertificationAudit::getCertificationStatus, certificationAuditReqDTO.getCertificationStatus()).set(ObjectUtil.isNotEmpty(certificationAuditReqDTO.getRejectReason()), AgencyCertificationAudit::getRejectReason, certificationAuditReqDTO.getRejectReason());super.update(updateWrapper);//更新认证信息,如果认证成功,需要将各认证属性也更新AgencyCertificationAudit agencyCertificationAudit = baseMapper.selectById(id);AgencyCertificationUpdateDTO agencyCertificationUpdateDTO = new AgencyCertificationUpdateDTO();agencyCertificationUpdateDTO.setId(agencyCertificationAudit.getServeProviderId());agencyCertificationUpdateDTO.setCertificationStatus(certificationAuditReqDTO.getCertificationStatus());if (ObjectUtil.equal(CertificationStatusEnum.SUCCESS.getStatus(), certificationAuditReqDTO.getCertificationStatus())) {//如果认证成功,需要更新服务人员/机构名称serveProviderService.updateNameById(agencyCertificationAudit.getServeProviderId(), agencyCertificationAudit.getName());agencyCertificationUpdateDTO.setName(agencyCertificationAudit.getName());agencyCertificationUpdateDTO.setIdNumber(agencyCertificationAudit.getIdNumber());agencyCertificationUpdateDTO.setLegalPersonName(agencyCertificationAudit.getLegalPersonName());agencyCertificationUpdateDTO.setLegalPersonIdCardNo(agencyCertificationAudit.getLegalPersonIdCardNo());agencyCertificationUpdateDTO.setBusinessLicense(agencyCertificationAudit.getBusinessLicense());agencyCertificationUpdateDTO.setCertificationTime(agencyCertificationAudit.getAuditTime());}agencyCertificationService.updateByServeProviderId(agencyCertificationUpdateDTO);}

相关文章:

小熊家务帮day8-day9 客户管理模块2 (用户定位,地址簿,实名认证,银行卡信息上传等功能)

客户管理模块 0.用户定位功能0.1 需求0.2 接口分析0.3 接口开发Controller层开发Service层开发 1.我的地址簿功能1.1 需求1.2 数据库设计1.3 新增地址簿1.3.1 接口设计1.3.2 接口开发Controller层开发Service层开发测试功能 1.4 地址簿查询1.4.1 接口设计1.4.2 接口开发Control…...

amis 事件动作 和 行为按钮 常用用法

行为按钮 action &#xff08;仅是对click事件的处理&#xff09; actionType&#xff1a;这是 action 最核心的配置&#xff0c;来指定该 action 的作用类型&#xff0c;支持&#xff1a;ajax、link、url、drawer、dialog、confirm、cancel、prev、next、copy、close。 Butt…...

4K高刷显示器 - 蚂蚁电竞ANT27VU

可以毫不夸张地说&#xff0c;每一局游戏最终能够取得胜利&#xff0c;实际上都与一套极为优秀的电竞 PC 有着紧密的关联&#xff0c;因为其能够提供强大的性能支持与流畅的体验。同样的道理&#xff0c;一套优秀的电竞 PC 若想发挥出最佳的效果&#xff0c;那也都离不开一台能…...

图解支付系统的渠道路由设计

大家好&#xff0c;我是隐墨星辰&#xff0c;今天和大家聊聊渠道路由设计。 这篇文章主要讲清楚&#xff1a;渠道路由是什么&#xff0c;为什么需要渠道路由&#xff0c;渠道路由的几种形态&#xff0c;一个简洁而实用的基于规则的渠道路由设计。 注&#xff1a;有些公司称渠…...

Leecode---347:输出前k个高频元素(使用unordered_map)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 思路&#xff1a; 三步&#xff1a; 1、用map来记录每个元素出现的次数 2、按map中的值大小排序&#xff0c;先让其有序&#xff0c;再逆…...

k8s ceph(静态pvc)

1.在 Kubernetes 节点上安装ceph-common 包。这个包包含了连接到 Ceph 集群所需的工具和库。可以使用以下命令在每个节点上安装&#xff1a; sudo apt-get install ceph-common2.在 Kubernetes 中创建一个 Secret 对象&#xff0c;用于存储连接到 Ceph 集群所需的密钥和配置信息…...

Qt QScript 之 C++/JavaScript相互调用

文章目录 Qt Script什么是ECMAScriptQt 中JavaScriptclass 详解Basic UsageQObject对脚本引擎可用使用信号槽connect 三种模式访问属性, 子对象使c++对象可用于用Qt Script编写的脚本C++ 类成员函数可用于脚本C++ 类属性可用于脚本对脚本中的c++对象信号的反应函数对象和本机函…...

可能会引起空指针

PreparedStatement preparedStatement null; preparedStatement conn.prepareStatement(sql); 如果直接下面这个可能会赋值给空指针 因为要在try{}和catch{}里面都用,所以要定义在try外面为null //如果只是测试,可以PreparedStatement preparedStatement conn.prepareSta…...

Linux input输入子系统

Linux input 更多内容可以查看我的github Linux输入子系统框架 Linux输入子系统由驱动层、核心层、事件处理层三部分组成。 驱动层&#xff1a;输入设备的具体驱动程序&#xff0c;负责与具体的硬件设备进行交互&#xff0c;并将底层的硬件输入转化为统一的事件形式&#xff…...

dataworks调度参数

概述 调度参数是DataWorks任务调度时使用的参数&#xff0c;调度参数会根据任务调度的业务时间及调度参数的取值格式自动替换取值&#xff0c;实现在任务调度时间内参数的动态取值。 调度参数通过赋值方式分为自定义参数&#xff08;推荐&#xff09;和系统内置变量两大类。 …...

JavaScript第五讲:事件,条件循环语句,错误处理

前言 在编程的世界里&#xff0c;事件、条件和循环语句、以及错误处理是构建任何复杂程序或应用的基石。无论是开发一个简单的网页交互&#xff0c;还是构建一个庞大的企业级系统&#xff0c;这些基础概念都扮演着至关重要的角色。今天星途将通过这篇文章&#xff0c;分别深入…...

BrainGPT1,一个帮你b站点歌放视频的多模态多轮对话模型

BrainGPT1&#xff0c;一个帮你b站点歌放视频的多模态多轮对话模型 返回论文目录 项目地址 模型地址 作者&#xff1a;华东师范大学&#xff0c;计算机科学与技术学院&#xff0c;智能教育研究院的小怪兽会微笑。 介绍 BrainGPT1是一个工具调用多轮对话模型&#xff0c;与G…...

带DSP音效处理D类数字功放TAS5805M中文资料

国产替代D类数字功放中文资料访问下方链接 ACM8628 241W立体声182W单通道数字功放中文寄存器表 内置DSP多种音频处理效果ACM8628M-241W立体声或182W单通道数字功放 1 特性 具有增强处理能力和低功率损耗的 TAS5805M 23W、无电感器、数字输入、立体声、闭环 D 类音频放大器 …...

java中BigDecimal的比较

BigDecimal是Java中的一个类&#xff0c;位于java.math包中&#xff0c;它提供了任意精度的有符号十进制数字的表示&#xff0c;以及对这些数字进行算术运算的方法 BigDecimal的主要用途包括&#xff1a; 1.金融计算&#xff1a;金融领域对数值的精度要求非常高&#xff0c;使…...

张大哥笔记:你卖什么,就反着来卖

普通人打工的一生&#xff0c;就是努力工作&#xff0c;买房&#xff0c;买车&#xff0c;送孩子上好的学校&#xff0c;为了孩子不要输在起跑线上&#xff0c;拼命报各种补习班等&#xff0c;这些都是普通人认为的主流价值观文化&#xff0c;也造就了一批批的赚钱机器&#xf…...

Nginx(openresty) 开启gzip压缩功能 提高web网站传输速度

1 开启nginx gzip压缩后&#xff0c;网页的图片&#xff0c;css、js等静态资源的大小会减少&#xff0c;节约带宽&#xff0c;提高传输效率&#xff0c;给用户快的体验,给用户更好的体验. 2 安装 #centos 8.5 yum install gzip 3 配置 #建议统一配置在http段 vim /usr/loca…...

nn.Embedding使用

nn.Embedding使用 Embedding.weight会从标准正态分布中初始化成大小为&#xff08;num_embeddings, embedding_dim&#xff09;的矩阵 PE矩阵的作用就是替换这个标准正态分布 input中的标号表示从矩阵对应行获取权重来表示单词 # 1.设置embedding结构 max_seq_len 1000 # 句…...

Qt6 mathgl数学函数绘图

1. 程序环境 Qt6.5.1, mingw11.2mathgl 8.0.1: https://sourceforge.net/projects/mathgl/,推荐下载mathgl-8.0.LGPL-mingw.win64.7z,Windows环境尝试自己编译mathgl会缺失一些库,补充完整也可以自己编译,路径"D:\mathgl-8.0.LGPL-mingw.win64\bin"添加至系统环境…...

Nginx配置文件中静态资源文件禁止通过目录查看

Nginx配置文件中静态资源文件禁止通过目录查看 nginx作为文件服务器访问静态资源时&#xff0c;默认是可以通过目录路径查看该目录下的所有文件的&#xff0c;这样会被检查出漏洞&#xff0c;容易造成静态资源泄露。 方案 location /images {autoindex off;autoindex_exact_…...

力扣Hot100-有效的括号(栈stack)

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…...

Android下HWC以及drm_hwcomposer普法(上)

Android下HWC以及drm_hwcomposer普法(上) 引言 按摩得全套&#xff0c;错了&#xff0c;做事情得全套&#xff0c;普法分析也是如此。drm_hwcomposer如果对Android图形栈有一定研究的童鞋们应该知道它是Android提供的一个的图形后端合成处理HAL模块的实现。但是在分析这个之前…...

OpenCV学习 基础图像操作(十七):泛洪与分水岭算法

原理 泛洪填充算法和分水岭算法是图像处理中的两种重要算法&#xff0c;主要用于区域分割&#xff0c;但它们的原理和应用场景有所不同&#xff0c;但是他们的基础思想都是基于区域迭代实现的区域之间的划分。 泛洪算法 泛洪填充算法&#xff08;Flood Fill&#xff09;是一…...

Docker基础命令(三)

同步docker容器中的时间和本地时间一致 背景: 在很多时候, 训练模型的时候, 记录的log日志中标记的时间和实际的时间不一致, 往往是容器时间和本地时间不一致照成的. 方案 场景一: 正在运行的容器&#xff0c;可以宿主机直接执行命令给某个容器同步时间 #方法1 直接在宿主机…...

Python的第三方库OS库

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;OS/SHUTIL 的方法描述&#x1f680;OS/SHUTIL…...

两个数相加减高级实现

不使用实现两数相加 #include <stdio.h> int plus(int a, int b) {int sum0,addication0;while(b!0){sum a^b;addication (a&b)<<1;a sum;b addication;}return a; }不使用-实现两数相减 #include <stdio.h> int sub(int a, int b) {int sum0,abdc…...

小白跟做江科大32单片机之对射式红外传感器计次

原理部分 1中断示意图&#xff0c;中断会打断主函数的执行&#xff0c;终端执行完成之后再返回主函数继续执行 2.STM32中断 这些灰色的是内核中断 这些白色的是普通中断 3.NVIC统一管理中断&#xff0c;每个中断通道都拥有16个可编程的优先等级&#xff0c;可对优先级进行分组…...

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…...

新游启航 失落的方舟台服注册指南 一文教会你方舟台服注册

新游启航&#xff01;失落的方舟台服注册指南&#xff01;一文教会你方舟台服注册 失落的方舟作为本月最受期待游戏之一&#xff0c;在上线之际许多玩家已经有点急不可待了。这款游戏是由开发商Smile gate开发的一款MMORPG类型游戏&#xff0c;这款游戏的基本玩法与其他MMORPG…...

运维开发详解

运维开发&#xff08;DevOps&#xff09;是开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;的结合&#xff0c;旨在通过自动化和协作提高软件开发和交付的效率、速度和可靠性。DevOps强调文化、实践和工具的融合&#xff0c;以实现持续集成&…...

英伟达(NVIDIA)H100性能及应用场景

英伟达H100是一款性能强大的GPU芯片&#xff0c;其关键性能参数和应用领域可以归纳如下&#xff1a; 一、性能参数 架构&#xff1a;H100采用了新一代的Hopper架构&#xff0c;拥有高达1.8万亿次/秒的张量处理能力和高达840 TFLOPS的FP8张量性能。CUDA核心数&#xff1a;H100…...

充电宝怎么选?充电宝目前什么牌子质量好耐用?盘点好用充电宝

充电宝怎么选&#xff1f;是不是很多朋友在选充电宝上非常的纠结&#xff1f;在买充电宝上面还是非常有讲究的&#xff01;市面上的充电宝虽然多&#xff0c;但是不排除很多存在安全隐患的&#xff0c;如果稍微没有挑选好充电宝的话&#xff0c;买来的充电宝极大可能是存在非常…...

智能视频监控技术为游泳馆安全护航,助力安全管理新升级

随着社会的进步和科技的发展&#xff0c;视频监控技术在各行各业的应用越来越广泛。游泳馆作为公共场所&#xff0c;每天都会有大量的游泳者进出。在这样的环境中&#xff0c;有时难免会发生一些意外事故&#xff0c;如溺水、摔倒等。因此&#xff0c;视频监控建设的必要性尤为…...

Windows通过cmd运行快速启动应用

Windows如何通过cmd运行快速启动应用&#xff1f; 在Windows操作系统中&#xff0c;可以通过配置环境变量的方式将文件的路径配置到环境变量的path中&#xff0c;配置完成后可以在cmd中输入对应的应用名称即可启动应用&#xff0c;具体操作如下&#xff1a; 1. 添加应用程序路径…...

271 基于matlab的可调Q因子小波变换故障诊断

基于matlab的可调Q因子小波变换故障诊断&#xff0c;可用在轴承、齿轮、活塞等故障诊断中&#xff0c;程序中包含了原始TQWT工具箱和轴承振动信号信号的谱包络的求取。通过仿真数据、实际轴承数据说明了方法的效果。程序已调通&#xff0c;可直接运行。 271 可调Q因子小波变换 …...

吴恩达深度学习个人笔记

1. 上一个视频提到的房地产领域,我们不就使用了一个普遍标准神经网络架构吗 而对于图像识别处理问题,我们则要使用卷积神经网络(Convolution Neural Network),即CNN。 对于序列数据,例如音频,有一个时间组件,随着时间的推移,音频被播放出来, 所以音频是最自然的表…...

Spring的依赖注入DI

调用构造器方法注入: 需要有对应匹配的构造器 不然出现异常No matching constructor Spring构造器注入有三种不同方式 name :按照参数名称 <bean id"stu" class"com.xja.bean.Student"> <constructor-arg name"name" value"rk&…...

Java 获取和修改期日与时间的各种操作方法

LocalDateTime获取当地日期和时间 import java.time.LocalDateTime; /*LocalDateTime.now() 获取当前时间*/ public class LocalDateTimeDemo {public static void main(String[] args) {LocalDateTime time1 LocalDateTime.now();System.out.println(time1);//2024-06-01T13…...

【ubuntu20】--- 定时同步文件

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Linux命令】--- 多核压缩命令大全&…...

网吧|基于SprinBoot+vue的网吧管理系统(源码+数据库+文档)

网吧管理系统 目录 基于SprinBootvue的网吧管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2 网管功能模块 3 会员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…...

[C/C++] -- Libcurl开发

libcurl 是一个功能强大的 C 语言库&#xff0c;用于实现各种网络传输协议的客户端功能。它是 Curl 工具的核心&#xff0c;并提供了一个简单、灵活、高效的 API&#xff0c;允许开发人员在他们的应用程序中轻松地执行网络操作。 以下是 libcurl 的一些主要特点和功能&#xf…...

Streamsets-JDBC模式使用更新时间字段数据同步

StreamSets的开源地址&#xff1a;https://github.com/streamsets/datacollector-oss Streamsets官网地址&#xff1a;https://streamsets.com/ Streamsets文档地址&#xff1a;https://docs.streamsets.com/portal/datacollector/3.16.x/help/index.html 我又来写Streamsets了…...

Nodejs-- 网络编程

网络编程 构建tcp服务 TCP tcp全名为传输控制协议。再osi模型中属于传输层协议。 tcp是面向连接的协议&#xff0c;在传输之前需要形成三次握手形成会话 只有会话形成了&#xff0c;服务端和客户端才能想发送数据&#xff0c;在创建会话的过程中&#xff0c;服务端和客户…...

React@16.x(14)context 举例 - Form 表单

目录 1&#xff0c;目标2&#xff0c;实现2.1&#xff0c;index.js2.2&#xff0c;context.js2.2&#xff0c;Form.Input2.3&#xff0c;Form.Button 3&#xff0c;使用 1&#xff0c;目标 上篇文章说到&#xff0c;context 上下文一般用于第3方组件库&#xff0c;因为使用场景…...

十几款基于ChatGPT的免费神器,每个都是王炸!

十几款基于ChatGPT的免费神器&#xff0c;每个都是王炸&#xff01; 1、ChatGPT ChatGPT非常强大&#xff0c;但注册需要魔法和国外的手机号&#xff0c;大部分人都没法使用。还好有一些基于API开发的体验版&#xff0c;我收集了一些可以直接使用的站点分享给大家&#xff0c…...

devicemotion 或者 deviceorientation在window.addEventListener 事件中不生效,没有输出内容

问题&#xff1a;devicemotion 或者 deviceorientation 在window.addEventListener 事件中不生效&#xff0c;没有输出内容 原因&#xff1a; 1、必须在Https协议下才可使用 2、必须用户手动点击click事件中调用 &#xff0c;进行权限申请 源码&#xff1a; <!DOCTYPE h…...

java单元测试如何断言异常

​ 在junit单元测试中&#xff0c;我们可以使用 org.junit.Assert.assertThrows 包下的 assertThrows() 方法 这个方法返回了一个泛型的异常 public static <T extends Throwable> assertThrows(Class<T> expectedType, Executable executable)​ 假设我们有以下…...

C语言| n的阶乘相加

逻辑性较强&#xff0c;建议记住。 分析思路&#xff1a; 假如n4&#xff1a;m m * i; sum sum m; 1&#xff09;当i1时&#xff0c;m1, sum1。 2&#xff09;当i2时&#xff0c;m12, sum112。 3&#xff09;当i3时&#xff0c;m123, sum112123。 4&#xff09;当i4时&…...

cwiseMax、cwiseMin函数

一、cwiseMax含义 cwiseMax是Eigen库中的一个函数&#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数&#xff0c;但是可以同时处理多个元素&#xff0c;且支持矩阵和向量。 举例&#xff1a; 例如&#xff0c;对于两个向量a和b&#xff0c;cwiseMax…...

【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php

在Apache运行thinkphp5.1时&#xff0c;发现系统默认生成的.htaccess不生效。 首先先查看怎么修改伪静态 1、修改Apache的配置文件 在Apache的安装目录下&#xff0c;打开config/httpd.conf。 搜索rewrite.so&#xff0c;将前面的#删掉&#xff0c;表示开启URL重写功能 2、…...

缓冲字符流

BufferedReader/BufferedWriter增加了缓存机制&#xff0c;大大提高了读写文本文件的效率。 字符输入缓冲流 BufferedReader是针对字符输入流的缓冲流对象&#xff0c;提供了更方便的按行读取的方法&#xff1a;readLine();在使用字符流读取文本文件时&#xff0c;我们可以使…...