This commit is contained in:
zengtao01
2024-07-11 10:39:13 +08:00
parent d92fcaf326
commit 25f780154c
18 changed files with 580 additions and 8 deletions

View File

@ -83,5 +83,7 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_NOT_COMPLETE = new ErrorCode(1_004_099_009, "订单未完成");
ErrorCode NEED_ADD_USER = new ErrorCode(1_007_901_004, "请先添加人员");
ErrorCode ADMIN_CARD_NOT_EXISTS = new ErrorCode(1_007_901_005, "管理员卡不存在");
ErrorCode APP_UP_NOT_EXISTS = new ErrorCode(1_007_902_001, "app更新不存在");
}

View File

@ -0,0 +1,99 @@
package cn.iocoder.yudao.module.member.controller.admin.appup;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.AppUpPageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.AppUpRespVO;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.AppUpSaveReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.appup.AppUpDO;
import cn.iocoder.yudao.module.member.service.appup.AppUpService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - app更新")
@RestController
@RequestMapping("/member/app-up")
@Validated
public class AppUpController {
@Resource
private AppUpService appUpService;
@PostMapping("/create")
@Operation(summary = "创建app更新")
//@PreAuthorize("@ss.hasPermission('member:app-up:create')")
public CommonResult<Long> createAppUp(@Valid @RequestBody AppUpSaveReqVO createReqVO) {
return success(appUpService.createAppUp(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新app更新")
//@PreAuthorize("@ss.hasPermission('member:app-up:update')")
public CommonResult<Boolean> updateAppUp(@Valid @RequestBody AppUpSaveReqVO updateReqVO) {
appUpService.updateAppUp(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除app更新")
@Parameter(name = "id", description = "编号", required = true)
//@PreAuthorize("@ss.hasPermission('member:app-up:delete')")
public CommonResult<Boolean> deleteAppUp(@RequestParam("id") Long id) {
appUpService.deleteAppUp(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得app更新")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
//@PreAuthorize("@ss.hasPermission('member:app-up:query')")
public CommonResult<AppUpRespVO> getAppUp(@RequestParam("id") Long id) {
AppUpDO appUp = appUpService.getAppUp(id);
return success(BeanUtils.toBean(appUp, AppUpRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得app更新分页")
//@PreAuthorize("@ss.hasPermission('member:app-up:query')")
public CommonResult<PageResult<AppUpRespVO>> getAppUpPage(@Valid AppUpPageReqVO pageReqVO) {
PageResult<AppUpDO> pageResult = appUpService.getAppUpPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AppUpRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出app更新 Excel")
//@PreAuthorize("@ss.hasPermission('member:app-up:export')")
@OperateLog(type = EXPORT)
public void exportAppUpExcel(@Valid AppUpPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AppUpDO> list = appUpService.getAppUpPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "app更新.xls", "数据", AppUpRespVO.class,
BeanUtils.toBean(list, AppUpRespVO.class));
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.member.controller.admin.appup.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - app更新分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AppUpPageReqVO extends PageParam {
@Schema(description = "版本号")
private String version;
@Schema(description = "更新方式", example = "2")
private String type;
@Schema(description = "老版本号")
private String oldVersion;
@Schema(description = "老版本号")
private String remarks;
@Schema(description = "更新内容")
private String content;
@Schema(description = "文件路径", example = "https://www.iocoder.cn")
private String fileUrl;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.member.controller.admin.appup.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - app更新 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppUpRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12047")
@ExcelProperty("编号")
private Long id;
@Schema(description = "版本号")
@ExcelProperty("版本号")
private String version;
@Schema(description = "更新方式", example = "2")
@ExcelProperty("更新方式")
private String type;
@Schema(description = "老版本号")
@ExcelProperty("老版本号")
private String oldVersion;
@Schema(description = "老版本号")
@ExcelProperty("老版本号")
private String remarks;
@Schema(description = "更新内容")
@ExcelProperty("更新内容")
private String content;
@Schema(description = "文件路径", example = "https://www.iocoder.cn")
@ExcelProperty("文件路径")
private String fileUrl;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.member.controller.admin.appup.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - app更新新增/修改 Request VO")
@Data
public class AppUpSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12047")
private Long id;
@Schema(description = "版本号")
private String version;
@Schema(description = "更新方式", example = "2")
private String type;
@Schema(description = "老版本号")
private String oldVersion;
@Schema(description = "老版本号")
private String remarks;
@Schema(description = "更新内容")
private String content;
@Schema(description = "文件路径", example = "https://www.iocoder.cn")
private String fileUrl;
}

View File

@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
import cn.iocoder.yudao.module.member.service.card.CardService;
import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService;
@ -64,6 +65,8 @@ public class MemberUserController {
private MemberGroupService memberGroupService;
@Resource
private MemberPointRecordService memberPointRecordService;
@Resource
private CardService cardService;
@PutMapping("/update")
@Operation(summary = "更新会员用户")
@ -104,7 +107,14 @@ public class MemberUserController {
@PreAuthorize("@ss.hasPermission('member:user:query')")
public CommonResult<MemberUserRespVO> getUser(@RequestParam("id") Long id) {
MemberUserDO user = memberUserService.getUser(id);
return success(MemberUserConvert.INSTANCE.convert03(user));
MemberUserRespVO memberUserRespVO = MemberUserConvert.INSTANCE.convert03(user);
//if(StringUtils.isNotEmpty(memberUserRespVO.getFaceId())){
// FaceVo faceData = cardService.getFaceData(memberUserRespVO.getFaceId());
// System.out.println(faceData.toString());
// //memberUserRespVO.setFaceData(faceData);
//}
return success(memberUserRespVO);
}
@GetMapping("/page")
@ -115,7 +125,6 @@ public class MemberUserController {
if (CollUtil.isEmpty(pageResult.getList())) {
return success(PageResult.empty());
}
// 处理用户标签返显
Set<Long> tagIds = pageResult.getList().stream()
.map(MemberUserDO::getTagIds)
@ -129,7 +138,14 @@ public class MemberUserController {
// 处理用户分组返显
List<MemberGroupDO> groups = memberGroupService.getGroupList(
convertSet(pageResult.getList(), MemberUserDO::getGroupId));
return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups));
PageResult<MemberUserRespVO> memberUserRespVOPageResult = MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups);
//memberUserRespVOPageResult.getList().forEach(vo ->{
// if(StringUtils.isNotEmpty(vo.getFaceId())){
// Blob faceData = cardService.getFaceData(vo.getFaceId());
// vo.setFaceData(faceData);
// }
//});
return success(memberUserRespVOPageResult);
}
@GetMapping("/heat")
@Operation(summary = "获得会员热量分析")

View File

@ -51,4 +51,9 @@ public class MemberUserRespVO extends MemberUserBaseVO {
@Schema(description = "绑定卡号")
private String cardId;
@Schema(description = "绑定卡号")
private String faceId;
private Byte[] faceData;
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.member.controller.app.card.vo;
import lombok.Data;
import lombok.ToString;
/**
* @author zt
* @description <description class purpose>
* @since 2024/7/10
*/
@Data
@ToString
public class FaceVo {
private Long userId;
private String featureValue;
}

View File

@ -12,7 +12,7 @@ public class AppMemberUserUpdateReqVO {
private String nickname;
@Schema(description = "头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/x.png")
@URL(message = "头像必须是 URL 格式")
//@URL(message = "头像必须是 URL 格式")
private String avatar;
@Schema(description = "性别", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.member.dal.dataobject.appup;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* app更新 DO
*
* @author 管理员
*/
@TableName("member_app_up")
@KeySequence("member_app_up_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AppUpDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 版本号
*/
private String version;
/**
* 更新方式
*/
private String type;
/**
* 老版本号
*/
private String oldVersion;
/**
* 老版本号
*/
private String remarks;
/**
* 更新内容
*/
private String content;
/**
* 文件路径
*/
private String fileUrl;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.member.dal.mysql.appup;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.appup.AppUpDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.*;
/**
* app更新 Mapper
*
* @author 管理员
*/
@Mapper
public interface AppUpMapper extends BaseMapperX<AppUpDO> {
default PageResult<AppUpDO> selectPage(AppUpPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AppUpDO>()
.eqIfPresent(AppUpDO::getVersion, reqVO.getVersion())
.eqIfPresent(AppUpDO::getType, reqVO.getType())
.eqIfPresent(AppUpDO::getOldVersion, reqVO.getOldVersion())
.eqIfPresent(AppUpDO::getRemarks, reqVO.getRemarks())
.eqIfPresent(AppUpDO::getContent, reqVO.getContent())
.eqIfPresent(AppUpDO::getFileUrl, reqVO.getFileUrl())
.betweenIfPresent(AppUpDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AppUpDO::getId));
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.CardPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardMonthVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -50,4 +51,6 @@ public interface CardMapper extends BaseMapperX<CardDO> {
List<CardDO> selectMoneyList(List<Long> list);
FaceVo getFaceData(String faceId);
}

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.member.service.appup;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.appup.AppUpDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* app更新 Service 接口
*
* @author 管理员
*/
public interface AppUpService {
/**
* 创建app更新
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createAppUp(@Valid AppUpSaveReqVO createReqVO);
/**
* 更新app更新
*
* @param updateReqVO 更新信息
*/
void updateAppUp(@Valid AppUpSaveReqVO updateReqVO);
/**
* 删除app更新
*
* @param id 编号
*/
void deleteAppUp(Long id);
/**
* 获得app更新
*
* @param id 编号
* @return app更新
*/
AppUpDO getAppUp(Long id);
/**
* 获得app更新分页
*
* @param pageReqVO 分页查询
* @return app更新分页
*/
PageResult<AppUpDO> getAppUpPage(AppUpPageReqVO pageReqVO);
}

View File

@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.member.service.appup;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.module.member.controller.admin.appup.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.appup.AppUpDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.dal.mysql.appup.AppUpMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.*;
/**
* app更新 Service 实现类
*
* @author 管理员
*/
@Service
@Validated
public class AppUpServiceImpl implements AppUpService {
@Resource
private AppUpMapper appUpMapper;
@Override
public Long createAppUp(AppUpSaveReqVO createReqVO) {
// 插入
AppUpDO appUp = BeanUtils.toBean(createReqVO, AppUpDO.class);
appUpMapper.insert(appUp);
// 返回
return appUp.getId();
}
@Override
public void updateAppUp(AppUpSaveReqVO updateReqVO) {
// 校验存在
validateAppUpExists(updateReqVO.getId());
// 更新
AppUpDO updateObj = BeanUtils.toBean(updateReqVO, AppUpDO.class);
appUpMapper.updateById(updateObj);
}
@Override
public void deleteAppUp(Long id) {
// 校验存在
validateAppUpExists(id);
// 删除
appUpMapper.deleteById(id);
}
private void validateAppUpExists(Long id) {
if (appUpMapper.selectById(id) == null) {
throw exception(APP_UP_NOT_EXISTS);
}
}
@Override
public AppUpDO getAppUp(Long id) {
return appUpMapper.selectById(id);
}
@Override
public PageResult<AppUpDO> getAppUpPage(AppUpPageReqVO pageReqVO) {
return appUpMapper.selectPage(pageReqVO);
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.controller.admin.card.vo.CardSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RechargeVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardMonthVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import javax.validation.Valid;
@ -88,4 +89,6 @@ public interface CardService {
AppCardMonthVO getMonthMoney(Long userId,String flag, String time);
Boolean rechargeByAdmin(RechargeVO vo);
FaceVo getFaceData(String faceId);
}

View File

@ -11,11 +11,11 @@ import cn.iocoder.yudao.module.member.controller.admin.card.vo.CardSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.card.vo.RechargeVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardMonthVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.AppCardPageReqVO;
import cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo;
import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO;
import cn.iocoder.yudao.module.member.dal.mysql.card.CardMapper;
import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import cn.iocoder.yudao.module.member.service.user.MemberUserService;
import cn.iocoder.yudao.module.member.util.MemberConstants;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
@ -47,9 +47,6 @@ public class CardServiceImpl implements CardService {
@Resource
private CardMapper cardMapper;
@Resource
private MemberUserService userService;
@Resource
private MemberGroupMapper memberGroupMapper;
@ -227,4 +224,9 @@ public class CardServiceImpl implements CardService {
//批量添加
return cardMapper.insertBatch(addList);
}
public FaceVo getFaceData(String faceId){
return cardMapper.getFaceData(faceId);
}
}

View File

@ -0,0 +1,80 @@
package cn.iocoder.yudao.module.member.service.card;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* className:ConvertBlobTypeHandler
*
* 自定义typehandler解决mybatis存储blob字段后出现乱码的问题
* 配置mapper.xml
* <result typeHandler="cn.ffcs.drive.common.util.ConvertBlobTypeHandler"/>
*
* @author pengyh
* @version 1.0.0
* @date 2014-07-09 11:15:23
*
*/
public class ConvertBlobTypeHandler extends BaseTypeHandler<String> {
//###指定字符集
private static final String DEFAULT_CHARSET = "utf-8";
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
String parameter, JdbcType jdbcType) throws SQLException {
ByteArrayInputStream bis;
try {
//###把String转化成byte流
bis = new ByteArrayInputStream(parameter.getBytes(DEFAULT_CHARSET));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Blob Encoding Error!");
}
ps.setBinaryStream(i, bis, parameter.length());
}
@Override
public String getNullableResult(ResultSet rs, String columnName)
throws SQLException {
Blob blob = rs.getBlob(columnName);
byte[] returnValue = null;
if (null != blob) {
returnValue = blob.getBytes(1, (int) blob.length());
}
try {
//###把byte转化成string
return new String(returnValue, DEFAULT_CHARSET);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Blob Encoding Error!");
}
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
Blob blob = cs.getBlob(columnIndex);
byte[] returnValue = null;
if (null != blob) {
returnValue = blob.getBytes(1, (int) blob.length());
}
try {
return new String(returnValue, DEFAULT_CHARSET);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Blob Encoding Error!");
}
}
@Override
public String getNullableResult(ResultSet arg0, int arg1)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -21,4 +21,13 @@
on uc.user_id = mc.user_id and uc.create_time = mc.create_time
</select>
<resultMap type="cn.iocoder.yudao.module.member.controller.app.card.vo.FaceVo" id="face">
<id column="user_id" property="userId"/>
<result column="feature_value" property="featureValue" typeHandler="cn.iocoder.yudao.module.member.service.card.ConvertBlobTypeHandler"/>
</resultMap>
<select id="getFaceData" resultMap="face">
select * from user_face where user_id = #{faceId};
</select>
</mapper>