后端(10.24~11.14)"/>
【开发日记】微信小程序后端(10.24~11.14)
后端框架采用SpringBoot,MyBatis做数据库连接,数据库为MySQL
一. 获取openid
参考微信开发者文档
- client接口
@FeignClient(name="mini",url="")
public interface MiniClient {/*** 小程序通过code获取openid接口* @param appid* @param secret* @param js_code* @param grant_type* @return*/@GetMapping("sns/jscode2session")String getOpenId(@RequestParam("appid") String appid,@RequestParam("secret") String secret,@RequestParam("js_code") String js_code,@RequestParam("grant_type") String grant_type);
}
- service层(CodeMsg是封装好的工具类)
@Service
public class TestServiceImpl implements TestService {Logger logger = LoggerFactory.getLogger(this.getClass());@Autowiredprivate MiniClient miniClient;@Value("${sng.appid}")private String appid;@Value("${sng.appsecret}")private String appsecret;/*** 获取用户openid* @param code* @return*/@Overridepublic Object getTestOpenid(String code) {try {if(!StringUtil.isNullOrEmpty(code)) {String res = miniClient.getOpenId(appid, appsecret, code, "authorization_code");// 处理一段接收的json数据JSONObject r = JSONObject.parseObject(res);// 获取openid的值Object rr = r.get("openid");return CodeMsg.successJson(0, rr);}return CodeMsg.successJson(1, "输入的code为空值");}catch (Exception e){logger.error("获取openid失败:"+e);return CodeMsg.errorJson(1,"获取openid失败:"+e);}}}
二. 多次新增/跟新数据表,加事务
- 回滚 @Transactional
保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。
加在service层,在return前手动抛出。
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
注意点:(回滚失效原因)
回滚中嵌套的service方法不可以加try catch,嵌套的方法也不可以加@Transactional注解
- 加锁 synchronized
锁变量,class_id一样,依次执行。不需要考虑释放逻辑,考虑效率。
synchronized ( apply_each.getClass_id() ){ ... }
三. 返回嵌套list
在实体类中存放需要嵌套的list,如:在lv表中嵌套Clas
- domain层
@Data
public class Lv {private String name;private String id;private List<Clas> cls;public Lv() {}
}
- service层,多层的话就再在外面套一层for循环
List<Lv> lvs = signDao.getLvByCourse(...);
...
for (Lv lv_list : lvs) {List<Clas> cls = signDao.getClass(course_id,lv_id);lv_list.setCls(cls);
}
四. 数据校验
例如判空校验,放在代码最前端,并在单独定义一个方法集中校验(checkApplyData)
// 1、数据校验JSONObject check_res = this.checkApplyData(bm);if(check_res.getIntValue("code") == 1){return CodeMsg.errorJson(1,check_res.getString("msg"));}
private JSONObject checkApplyData(Bm bm){int code = 0;String msg = "";if(bm.getList().size() == 0){code = 1;msg = "请至少选择一门课程!";} else if (StringUtil.isNullOrEmpty(bm.getStudent_name())) {code = 1;msg = "学生姓名不可为空!";} ...return CodeMsgmonJson(code,null,msg);}
五. 身份证号正则匹配/UUID()
if (!StringUtil.isNullOrEmpty(idcard)) {// 身份证号正则匹配String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";boolean matches = idcard.matches(regularExpression);//判断第18位校验值if (matches) {//设置学生id为UUID()student.setId(UUID.randomUUID().toString());Integer isAdd = userDao.addStuByIdcard(student);if(isAdd > 0) {return CodeMsg.successJson(0, student);}return CodeMsg.errorJson(1,"插入失败");}}
六. 各种tips
- CollectionUtils提供了集合相等的判断工具方法isEqualCollection,只要确保两个集合非空可以直接使用该方法来判断集合相等,不用考虑顺序。
List<Integer> list1 = Arrays.asList(1, 2, 3, 3);
List<Integer> list2 = Arrays.asList(3, 1, 3, 2);
//List<String> list=Arrays.asList("2001","2002");
System.out.println(CollectionUtils.isEqualCollection(list1, list2)); //true
- LinkedHashMap:HashMap和双向链表合二为一,增加了时间和空间上的开销,但是它通过维护一个额外的双向链表保证了迭代顺序。迭代顺序可以是插入顺序,也可以是访问顺序。
List<LinkedHashMap> list= midDao.getBmMessage();
- try里抛出异常,catch中捕获
throw new Exception("审核失败");
SQL语句:
- 在idea中引用字符串:在双引号里包裹单引号
" where a1.id='2001' "
- union all:对两个结果集进行并集操作,包括重复行,不进行排序
- select语句中判断条件
select id,(case when `disable` > 0 then 1 else 0 end) `disable`
- 查询数据库最新一条时间
order by create_time desc
limit 1
git代码上传
git add .
git commit -m '写了哪些代码'
git push
git代码拉取
git pull
总结:一些业务代码写的比较冗余,查询数据库太多,需要后续优化
更多推荐
【开发日记】微信小程序后端(10.24~11.14)
发布评论