3.2 项目技术栈分析
使用了哪些云服务:
对象存储服务 COS —— 存储司机实名认证的身份证和驾驶证照片
人脸识别 AiFace —— 每天司机接单前的身份核实,并且具备静态活体检测功能
人员库管理 face-lib —— 云端存储司机注册时候的人脸模型,用于身份比对使用
数据万象 CI —— 用于监控大家录音文本内容,判断是否包含暴力和色情
OCR 证件识别插件 —— 用于 OCR,识别和扫描身份证、驾驶证的信息
微信同声传译插件 —— 把文字合成语音,播报订单。把录音转换成文本,用于安全监控
路线规划插件 —— 用于规划司机下班回家的线路,或小程序订单显示的路线
地图选点插件 —— 用于小程序上面地图选点操作
腾讯位置服务 —— 路线规划,定位导航,里程和时间预估
技术栈分析:
QLExpress 规则引擎,计算预估费用,取消费用等
Quartz 定时器,销毁过期未接单订单,定时自动分账等等
Phoenix HBase数据存储
GEO GPS分区定位计算
SaToken 认证与授权框架
3.3 运行华夏代驾初始化项目
1. 修改common 项目中的 application-common.yml 文件中,小程序id secret 等。
2. 启动 TM 节点。
3. 启动其他子程序。
4. 子系统运行不起来,检查 端口号冲突、配置信息错误、Java环境错误。
3.4 例子代码
SELECT CAST( id AS CHAR ) AS id FROM tb_driver
@Slf4j //日志注解
HashMap tempParam = new HashMap(){{ put("openId", openId) }}
//司机需提交的注册信息,建一个 Form 类 作为类型,对请求参数进行校验和判断
//xxServiceImpl 层加事务
//在 SaToken 上面执行登录,实际上就是缓存 userId,然后才有资格拿到令牌
StpUtil.login( driverId )
//生成 Token 令牌字符串(已加密)
String token = StpUtil.getTokenInfo().getTokenValue()
return R.ok().put("token", token)
//验证登录注解
@SaCheckLogin
long userId = Convert.toLong(r.get("userId"))
int xx = Convert.toInt()
3.9 例子代码
//swagger代码:
@Tag(name="CosController", description="对象存储web接口")
@Operation(summary="上传文件")
@Schema(description="xxx")
//Controller注解:
@Valid
@RequestBody
@Params("xx")
//微信公众平台内添加 OCR插件:设置 -> 第三方设置 -> 插件管理
//微信同声传译、腾讯位置服务 城市选择器、地图选点、路线规划
//manifest.json文件:
"plugins": {
"ocr-plugin": {
"version": "3.0.6",
"provider": "wx4418e3e031e551be"
}
"其他插件也如此"
}
//有Form类的概念,封装网络请求参数,注解如下:
@Data
@NotNull(message="xxx")
@Min(value=1, message="xxx")
@Pattern(regexp="xxx", message="xxx")
@NotBlank(message="xxx")
@Range(min=1, max=12, message="xxx")
@NotEmpty(message="xxx")
3.15 开通活体检测,甄别真实注册司机 (一)
1. 开通人脸识别:https://cloud.tencent.com/product/facerecognition
2. 新建人员库
3. 向人员库上传司机面部照片:https://cloud.tencent.com/document/api/867/45014
4. 在 common 子系统中 application-common.yml 文件中,添加信息
tencent:
cloud:
...
...
face:
groupName: hxds
region: ap-beijing
//使用时
@Value("${tencent.cloud.face.region}")
5. 编码
3.17 例子代码
//SQL语句中:MySQL数字类型查询速度比字符串类型速度快
//返回前端不能是 bigint 类型,要是 char 类型
CAST( id AS CHAR ) AS id
//SQL语句
CAST( w.balance AS CHAR ) AS balance
//汇总函数
COUNT(id) AS orders
//不能返回空
IFNULL( SUM(real_fee), 0) AS income
//浮点类型数据库数据 返回给前端会丢失精度,转成字符类型好点
IFNULL( SUM(TIMESTAMPDIFF( HOUR, end_time, start_time)), 0) AS xxx
timestampdiff(YEAR, drcard_issue_date, NOW()) AS `year`
DATE_FORMAT( create_time, '%Y-%m-%d') AS createTime
<if test="status != null">
AND `status` = #{status}
</if>
LIMIT #{start}, #{length}
HashMap result = driverDao.login(openId)
... ...
result.replace("archive", archive)
long driverId = MapUtil.getLong(map, "id");
StpUtil.login(driverId);
String token = StpUtil.getTokenInfo().getTokenValue();
byte realAuth = Byte.parseByte(MapUtil.getStr(map, "realAuth"));
JSONObject summary = JSONUtil.parseObj(MapUtil.getStr(result, "xx"));
HashMap map = (HashMap) r.get("result");
HashMap map = JSONUtil.parseObj(settings).toBean(HashMap.class)
ArrayList<HashMap> list = null
list = new ArrayList<>()
//把前端传来的Form转成Map,Map传给Dao层
Map param = BeanUtil.beanToMap(form);
//讲师自己封装了一个PageUtils
//经过Http后,要这样
HashMap map = (HashMap) r.get("result");
PageUtils pageUtils = BeanUtil.toBean(map, PageUtils.class)
@SaCheckPermission( value={"ROOT", "DRIVER:SELECT"}, mode=SaMode.OR)
//gateway子服务application.yml文件中
routes:
-id: bff-driver
uri: lb://bff-driver
predicates:
-Path=/hxds-driver/**
filters:
-StripPrefix=1
-id: hxds-mis-api
uri: lb://hxds-mis-api
predicates:
-Path=/hxds-mis-api/**
filters:
-StripPrefix=1
腾讯云对象存储服务有一个“生成预签名URL”功能,可以对云端文件生成临时外网URL地址,并且含有签名字符串,预签名URL的文档:https://cloud.tencent.com/document/product/436/35217。签名有过期时间。
//时间定为 5分钟后
Date expiration = DateUtil.offsetMinute( new Date(), 5)