介绍做素食的网站,江阴网站建设培训,网站建设域名注册熊掌号,在线制作简历的网站软件开发整体介绍
软件开发流程 角色分工 软件环境 苍穹外卖
项目介绍
定位#xff1a;专门为餐饮企业定制的一款软件产品 技术选型 前端环境搭建
阅读readme文档
nginx.exe放入无中文目录运行并启动
后端环境搭建
项目结构 Nginx反向代理
优点 配置
Nginx反向代理 负… 软件开发整体介绍
软件开发流程 角色分工 软件环境 苍穹外卖
项目介绍
定位专门为餐饮企业定制的一款软件产品 技术选型 前端环境搭建
阅读readme文档
nginx.exe放入无中文目录运行并启动
后端环境搭建
项目结构 Nginx反向代理
优点 配置
Nginx反向代理 负载均衡 Nginx负载均衡策略 完善登录功能 导入接口文档
使用Apifox或者Yapi导入管理层和用户层的json接口文档 Swagger
介绍 使用方式 Swagger和Yapi 常用注解 公共字段自动填充 项目完成技术整理
做了三周。。。 开始的比较迟了。。
整理一下
分页查询 Controller返回PageResult Service PageHelper.startPage(页码每页记录数) 封装PageResult并返回公共字段自动填充 对于insert、update操作类型可以使用切面进行统一拦截mapper并自动填充注解 实现思路枚举、注解、AOP、反射
自定义注解AutoFill用于标识需要进行公共字段自动填充的方法自定义切面类AutoFillAspect统一拦截加入了AutoFill注解的方法通过反射为公共字段赋值在Mapper方法上加入AutoFill注解具体步骤 创建annotationAutoFill 加注解 Target(ElementType.METHOD)//指定注解只能加在方法上Retention(RetentionPolicy.RUNTIME) 通过枚举方式指定加注解的当前数据库操作类型
public interface AutoFill {//数据库操作类型UPDATEINSERTOperationType value();
} 切面类aspect.AutoFillAspect--自定义切面实现公共字段自动填充 加入注解
Aspect //定义切面
Component //Bean 指定切入点autoFillPointCut
Pointcut(execution(* com.sky.mapper.*.*(..)) annotation(com.sky.annotation.AutoFill))
public void autoFillPointCut(){} execution(所有返回类型 包.类.方法.(匹配参数类型)) 加入AutoFill注解annotation(自定义注解) 前置通知通知中给公共字段赋值 注解Before(autoFillPointCut()) 例子
Before(autoFillPointCut())public void autoFill(JoinPoint joinPoint){log.info(开始进行公共字段自动填充...);//获取当前被拦截的方法上的数据库操作类型MethodSignature signature (MethodSignature) joinPoint.getSignature();//方法签名对象AutoFill annotation signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType operationType annotation.value();//获得数据库操作类型//获取到当前被拦截的方法的参数--实体对象Object[] args joinPoint.getArgs();if (args null || args.length 0){return;}Object entity args[0];//准备赋值的数据LocalDateTime now LocalDateTime.now();Long currentId BaseContext.getCurrentId();//根据当前不同的操作类型为对应的属性赋值if (operationType OperationType.INSERT){//为四个公共字段赋值try {Method setCreateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_TIME,LocalDateTime.class);Method setCreateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER, Long.class);Method setUpdateTime entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_TIME, LocalDateTime.class);Method setUpdateUser entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER, Long.class);//通过反射为对象属性赋值setCreateTime.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdateTime.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}} JoinPoint joinPoint 在AOP中我们知道描述切面的术语有通知advice切点pointcut连接点join point。 连接点joinPoint就是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。切面代码可以利用这些点插入到应用的正常流程之中并添加新的行为。 这个类的主要作用就是可以让我们在Advice中获取被增强方法相关的所有信息。通过JoinPoint可以获取被代理方法的各种信息如方法参数方法所在类的class对象然后执行反射操作 getSignature()返回一个 Signature 对象此接口通常用于跟踪或记录应用程序以获取有关连接点的反射信息
redis 设置店铺状态 Spring Data Redis 导入maven 配置数据源application.yml redis:port: 8080 host: localhostdatabase: 0 编写配置类创建RedisTemplate对象
Configuration
Slf4j
public class RedisConfiguration {Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {log.info(开始创建redis模版对象...);RedisTemplate redisTemplate new RedisTemplate();//设置redis的连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory);//设置redis key的序列化器redisTemplate.setKeySerializer(new StringRedisSerializer());return redisTemplate;}
} 通过RedisTemplate对象操作Redis
ValueOperations valueOperations redisTemplate.opsForValue();
Integer status (Integer) valueOperations.get(KEY);
cpolar实现内网穿透获得临时网址 cmd进入cpolar.exe所在文件夹执行cpolar.exe http 80Spring Cache 缓存 启动类加入注解EnableCachingCacheable在方法执行前查看是否有缓存对应的数据如果有直接返回数据如果没有调用方法获取数据返回并缓存起来。CacheEvict将一条或多条数据从缓存中删除。CachePut将方法的返回值放到缓存中EnableCaching开启缓存注解功能 (cacheNames , key #user.id)cacheNames 指定要放到哪个名字的缓存key #result.id:result 表示返回值#p0.id或#a0.id或#root.args[0].id表示第一个参数的 id allEntries true选定所有键
Spring Task 定时任务处理
启动类加入注解EnableScheduling -- 开启任务调度task类编写定时任务处理方法方法前编写cron表达式表示多久触发一次方法 /*** 处理超时订单的方法*/Scheduled(cron 0 * * * * ?)//每分钟触发一次public void processTimeoutOrder(){log.info(定时处理超时订单{}, LocalDateTime.now());//查找超时订单LocalDateTime time LocalDateTime.now().plusMinutes(-15);//select * from orders where status ? and order_time (当前时间 - 15分钟)ListOrders ordersList orderMapper.getByStatusAndOrderTimeLT(Orders.PENDING_PAYMENT, time);}
WebSocket 实现双向交互 websocket约定了一个通信的规范通过一个握手的机制客户端和服务器之间能建立一个类似tcp的连接从而方便它们之间的通信 在websocket出现之前web交互一般是基于http协议的短连接或者长连接 websocket是一种全新的协议不属于http无状态协议协议名为wsApache POI 执行文件导出 使用POI写入数据Apache POIstream好用呢