苍穹外卖开发心得(上):https://developer.aliyun.com/article/1548478
微信小程序
https://mp.weixin.qq.com/cgi-bin/wx?token=&lang=zh_CN
本套教程需要再详情中将基础库改为2.7以下版本
- 防止请求发送不出去
拦截器配置
registry.addInterceptor(jwtTokenAdminInterceptor) // 要拦截的网址 .addPathPatterns("/user/**") // 要排除的网址 .excludePathPatterns("/user/user/login")
配置类注解 @Configuration
开发的顺序
开发新增接口时注意这个新增是不是需要查询别的东西之类的,如果需要,那将很难进行测试
分页查询PageHelper
在进行数据库查询前,调用 PageHelper.startPage(pageNum, pageSize)
方法来开启分页功能。其中,pageNum
表示页码,pageSize
表示每页显示的记录数。执行完查询操作后,会自动进行分页,无需手动处理。
使用reids来进行缓存数据
/** * 根据分类id查询菜品 * * @param categoryId * @return */ // @GetMapping("/list") // @ApiOperation("根据分类id查询菜品") // public Result<List<DishVO>> list(Long categoryId) { // Dish dish = new Dish(); // dish.setCategoryId(categoryId); // dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 // // List<DishVO> list = dishService.listWithFlavor(dish); // // return Result.success(list); // } /* 进行接口改造,使得能存放进redis中 */ @GetMapping("/list") @ApiOperation("根据分类id查询菜品") public Result<List<DishVO>> list(Long categoryId) { // 构造redis中的key dish_分类id String key="dish_"+categoryId; // 先查找redis中是否存在菜品数据 此处数据类型和存放进去的数据类型一致 List<DishVO> list =(List<DishVO>) redisTemplate.opsForValue().get(key); if (list!=null &&list.size()>0){ // 直接返回内容无需查询数据库 return Result.success(list); } Dish dish = new Dish(); dish.setCategoryId(categoryId); dish.setStatus(StatusConstant.ENABLE);//查询起售中的菜品 /* 如果不存在,查询数据库,将查询道德数据放入reids中 */ list = dishService.listWithFlavor(dish); redisTemplate.opsForValue().set(key,list); return Result.success(list); }
增删改查启停售都需要清除缓存
@PostMapping @ApiOperation("新增菜品") public Result<String> save(@RequestBody DishDTO dishDTO){ log.info("新增菜品:{}", dishDTO); dishService.saveWithFlavor(dishDTO); return Result.success(); }
/* 清理缓存数据 */ String key ="dish_"+dishDTO.getCategoryId();
Spring Cache
- 一个款框架,能便捷的实现缓存功能还能便捷的切换基础
/* spel表达式来动态获取key */ @PostMapping // @CachePut(cacheNames="userCache",key="#user.id") //如果使用spring cache缓存数据,key的生成:userCache::abc】 // @CachePut(cacheNames="userCache",key="#result.id") // @CachePut(cacheNames="userCache",key="#p0.id") // @CachePut(cacheNames="userCache",key="#a0.id") // @CachePut(cacheNames="userCache",key="#root.args[0].id") public User save(@RequestBody User user){ userMapper.insert(user); return user; }
程序入口
- 在这里进行配置
使用静态方法来管理当前数据
- 需求:购物车删除菜品的时候需要知道这个人的id,新增菜品的时候也是这样,不同人有不同的id,这时候将id用静态方法来管理获得,比较合适
编写类似一下的工具类
package com.sky.context; public class BaseContext { public static ThreadLocal<Long> threadLocal = new ThreadLocal<>(); public static void setCurrentId(Long id) { threadLocal.set(id); } public static Long getCurrentId() { return threadLocal.get(); } public static void removeCurrentId() { threadLocal.remove(); } }
使用内网穿透工具将本地ip映射到网络上
Spring Task
- 一个定时处理
cron表达式
- 日和周两个有一个就好,因为会比较容易冲突
- 可是使用生成器自动生成
使用的方式:
一、在启动类上面加上
@EnableScheduling//开启任务调度
项目的用户下单需求分析
- 下单后一直没有支付,每隔一分钟去检查一次订单的情况
- 派送完成但用户一直没有点击收到订单,这种情况打烊后一段时间去检查订单的情况
Apache ECharts
- 一个功能强大灵活易用的数据可视化工具
Apache POI
- 一个处理office各种文件格式中的开源项目
- 遇到创建的表格比较复杂的时候可以先把表格样式弄出来
前端开发
## 使用vue-cli脚手架来创建工程
Vue的基本复习
- 插值的用法
<template> <div class="hello"> <h1>{{ name }}</h1> <h1>{{ age > 40 ? '老奶' : '青年' }}</h1> </div> </template> <script> export default { data() { return { name: '张三', age: '30' } } } </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped></style> //上面的标题会变成下面的张三,而另一个年龄会变成老年。如此做判断的
属性绑定
- 这种时候想要展示data区域的name属性的值,需要使用属性绑定
简写
事件绑定
双向绑定
条件渲染
跨域问题
- 配置代理后需要重启服务才能生效
axios统一调用方式发送请求
Vue-Router
- vue是单页面路由,根据浏览器的路径不同,使用不同的视图组件替换这个页面内容
- 也可是使用npm install vue-router来实现路由功能
- 现在index中定义路由表,然后在页面中分别有路由视图组件,路由连接
- 路由有标签式和编程式两种方式来跳转
编程式
404处理
//这样能实现访问不存在资源的时候显示404 { path: '/404', component: () => import('../views/404View.vue') }, { path: '*', redirect: '/404' }
嵌套路由
- 如果直接访问/c页面就显示相应的页面
使用重定向进行默认设置
vuex
- 管理需要共享的数据
- 使用这个功能的标志是多了store这个文件夹
**步骤一:**index中创建方法后,
步骤二: 在mutations中定义的函数因为不能直接调用,所以必须通过以下方式来调用
调用异步请求
- 如图,在vuex中定义请求后要如何调用起来
- 注意会有代理问题
TypeScript
- 指定取值的范围
本文作者https://blog.csdn.net/qq_61654952?spm=1000.2115.3001.5343
- 编译成js后,会变成方法
[外链图片转存中…(img-EhKxU8Vm-1712314231766)]
- 如果直接访问/c页面就显示相应的页面
使用重定向进行默认设置
[外链图片转存中…(img-bwnjzw3H-1712314231767)]
vuex
- 管理需要共享的数据
[外链图片转存中…(img-vaX7q7Ey-1712314231767)]
[外链图片转存中…(img-okxEjIki-1712314231768)]
- 使用这个功能的标志是多了store这个文件夹
[外链图片转存中…(img-zQiJk4w6-1712314231768)]
[外链图片转存中…(img-susgEZlQ-1712314231768)]
**步骤一:**index中创建方法后,
[外链图片转存中…(img-PRr357Aq-1712314231768)]
步骤二: 在mutations中定义的函数因为不能直接调用,所以必须通过以下方式来调用
[外链图片转存中…(img-kP6I4NaE-1712314231768)]
[外链图片转存中…(img-VdyhpKXT-1712314231769)]
调用异步请求
[外链图片转存中…(img-m66u91rp-1712314231769)]
[外链图片转存中…(img-JIJwhaio-1712314231769)]
- 如图,在vuex中定义请求后要如何调用起来
- 注意会有代理问题
TypeScript
[外链图片转存中…(img-rBvk9sui-1712314231770)]
[外链图片转存中…(img-vlfMABWM-1712314231770)]
[外链图片转存中…(img-7doQuGPt-1712314231770)]
- 指定取值的范围
[外链图片转存中…(img-B1tSYwZq-1712314231770)]
[外链图片转存中…(img-egRQsefR-1712314231771)]
[外链图片转存中…(img-2qouvsDY-1712314231771)]
- 编译成js后,会变成方法
[外链图片转存中…(img-YV5FsncG-1712314231771)]
[外链图片转存中…(img-jiyUC6fr-1712314231772)]