SpringBoot pom配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
<!-- MyBatis-Plus代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--<optional>true</optional>-->
</dependency>
<!--<!– nacos配置中心 –>-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.4.1</version>
<scope>compile</scope>
</dependency>
<!--分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
配置-新
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.24</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- MyBatis-Plus代码生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- END Swagger -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
WebConfig
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfig extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("/upload/**").addResourceLocations("file:d:/server/upload/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
SwaggerConfig
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()).build()
.globalOperationParameters(getParameterList());
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("lovo商城系统API文档")
.description("lovo商城的接口文档")
.version("1.0")
.build();
}
/**
* 添加header参数
* @return
*/
private List getParameterList(){
ParameterBuilder tokenParam = new ParameterBuilder();
List params = new ArrayList();
tokenParam.name("token").description("令牌")
.modelRef(new ModelRef("string"))
.parameterType("header")
.required(false).build();
params.add(tokenParam.build());
return params;
}
}
RedisConfig
@Configuration
public class RedisConfig {
/**
* redisTemplate 序列化默认使用的jdkSerializeable
* 所以在这里使用自定义的序列化类
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置key的序列化规则和value的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
RedisUtil
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
public RedisUtil(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
* @return
*/
public boolean expire(String key,long time){
try {
if(time>0){
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据key 获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
public long getExpire(String key){
return redisTemplate.getExpire(key,TimeUnit.SECONDS);
}
/**
* 判断key是否存在
* @param key 键
* @return true 存在 false不存在
*/
public boolean hasKey(String key){
try {
return redisTemplate.hasKey(key);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除缓存
* @param key 可以传一个值 或多个
*/
@SuppressWarnings("unchecked")
public void del(String ... key){
if(key!=null&&key.length>0){
if(key.length==1){
redisTemplate.delete(key[0]);
}else{
redisTemplate.delete(CollectionUtils.arrayToList(key));
}
}
}
//============================String=============================
/**
* 普通缓存获取
* @param key 键
* @return 值
*/
public Object get(String key){
return key==null?null:redisTemplate.opsForValue().get(key);
}
/**
* 普通缓存放入
* @param key 键
* @param value 值
* @return true成功 false失败
*/
public boolean set(String key,Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
* @return true成功 false 失败
*/
public boolean set(String key,Object value,long time){
try {
if(time>0){
redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
}else{
set(key, value);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 递增
* @param key 键
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta){
if(delta<0){
throw new RuntimeException("递增因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, delta);
}
/**
* 递减
* @param key 键
* @param delta 要减少几(小于0)
* @return
*/
public long decr(String key, long delta){
if(delta<0){
throw new RuntimeException("递减因子必须大于0");
}
return redisTemplate.opsForValue().increment(key, -delta);
}
//================================Map=================================
/**
* HashGet
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
public Object hget(String key,String item){
return redisTemplate.opsForHash().get(key, item);
}
/**
* 获取hashKey对应的所有键值
* @param key 键
* @return 对应的多个键值
*/
public Map<Object,Object> hmget(String key){
return redisTemplate.opsForHash().entries(key);
}
/**
* HashSet
* @param key 键
* @param map 对应多个键值
* @return true 成功 false 失败
*/
public boolean hmset(String key, Map<String,Object> map){
try {
redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* HashSet 并设置时间
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String,Object> map, long time){
try {
redisTemplate.opsForHash().putAll(key, map);
if(time>0){
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key 键
* @param item 项
* @param value 值
* @return true 成功 false失败
*/
public boolean hset(String key,String item,Object value) {
try {
redisTemplate.opsForHash().put(key, item, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key 键
* @param item 项
* @param value 值
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true 成功 false失败
*/
public boolean hset(String key,String item,Object value,long time) {
try {
redisTemplate.opsForHash().put(key, item, value);
if(time>0){
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 删除hash表中的值
* @param key 键 不能为null
* @param item 项 可以使多个 不能为null
*/
public void hdel(String key, Object... item){
redisTemplate.opsForHash().delete(key,item);
}
/**
* 判断hash表中是否有该项的值
* @param key 键 不能为null
* @param item 项 不能为null
* @return true 存在 false不存在
*/
public boolean hHasKey(String key, String item){
return redisTemplate.opsForHash().hasKey(key, item);
}
/**
* hash递增 如果不存在,就会创建一个 并把新增后的值返回
* @param key 键
* @param item 项
* @param by 要增加几(大于0)
* @return
*/
public double hincr(String key, String item,double by){
return redisTemplate.opsForHash().increment(key, item, by);
}
/**
* hash递减
* @param key 键
* @param item 项
* @param by 要减少记(小于0)
* @return
*/
public double hdecr(String key, String item,double by){
return redisTemplate.opsForHash().increment(key, item,-by);
}
//============================set=============================
/**
* 根据key获取Set中的所有值
* @param key 键
* @return
*/
public Set<Object> sGet(String key){
try {
return redisTemplate.opsForSet().members(key);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 根据value从一个set中查询,是否存在
* @param key 键
* @param value 值
* @return true 存在 false不存在
*/
public boolean sHasKey(String key,Object value){
try {
return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将数据放入set缓存
* @param key 键
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSet(String key, Object...values) {
try {
return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 将set数据放入缓存
* @param key 键
* @param time 时间(秒)
* @param values 值 可以是多个
* @return 成功个数
*/
public long sSetAndTime(String key,long time,Object...values) {
try {
Long count = redisTemplate.opsForSet().add(key, values);
if(time>0) {
expire(key, time);
}
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取set缓存的长度
* @param key 键
* @return
*/
public long sGetSetSize(String key){
try {
return redisTemplate.opsForSet().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 移除值为value的
* @param key 键
* @param values 值 可以是多个
* @return 移除的个数
*/
public long setRemove(String key, Object ...values) {
try {
Long count = redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
//===============================list=================================
/**
* 获取list缓存的内容
* @param key 键
* @param start 开始
* @param end 结束 0 到 -1代表所有值
* @return
*/
public List<Object> lGet(String key, long start, long end){
try {
return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 获取list缓存的长度
* @param key 键
* @return
*/
public long lGetListSize(String key){
try {
return redisTemplate.opsForList().size(key);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过索引 获取list中的值
* @param key 键
* @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推
* @return
*/
public Object lGetIndex(String key,long index){
try {
return redisTemplate.opsForList().index(key, index);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 将list放入缓存
* @param key 键
* @param value 值
* @return
*/
public boolean lSet(String key, Object value) {
try {
redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key 键
* @param value 值
* @param time 时间(秒)
* @return
*/
public boolean lSet(String key, Object value, long time) {
try {
redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key 键
* @param value 值
* @return
*/
public boolean lSet(String key, List<Object> value) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 将list放入缓存
* @param key 键
* @param value 值
* @param time 时间(秒)
* @return
*/
public boolean lSet(String key, List<Object> value, long time) {
try {
redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
expire(key, time);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 根据索引修改list中的某条数据
* @param key 键
* @param index 索引
* @param value 值
* @return
*/
public boolean lUpdateIndex(String key, long index,Object value) {
try {
redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 移除N个值为value
* @param key 键
* @param count 移除多少个
* @param value 值
* @return 移除的个数
*/
public long lRemove(String key,long count,Object value) {
try {
Long remove = redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 获取有过期时间的自增长ID
* @param key
* @param expireTime
* @return
*/
public long generate(String key, Date expireTime) {
RedisAtomicLong counter = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
Long expire = counter.getExpire();
if(expire==-1){
counter.expireAt(expireTime);
}
return counter.incrementAndGet();
}
/**
* 外部获取ID的方法
* @return
*/
public String generateOrderId() {
//生成id为当前日期(yyMMddHHmmss)+6位(从000000开始不足位数补0)
LocalDateTime now = LocalDateTime.now();
String orderIdPrefix = getOrderIdPrefix(now);//生成yyyyMMddHHmmss
String orderId = orderIdPrefix+String.format("%1$06d", generate(orderIdPrefix,getExpireAtTime(now)));
return orderId;
}
public static String getOrderIdPrefix(LocalDateTime now){
return now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
}
public Date getExpireAtTime(LocalDateTime now){
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = now.plusSeconds(20);
ZonedDateTime zdt = localDateTime.atZone(zoneId);
Date date = Date.from(zdt.toInstant());
return date;
}
}
MybatisConfig
@Configuration
@MapperScan("com.project.*.dao")
public class MyBatisConfig {
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
-------------------------------------------------------------
@Configuration
@ComponentScan(basePackageClasses = MybatisConfig.class)
@EnableTransactionManagement
@MapperScan("com.project.mapper")
public class MybatisConfig {
@Bean
public DataSource getDateSource() {
DruidAbstractDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:6789/shopDB?characterEncoding=utf-8&allowMultiQueries=true");
dataSource.setUsername("root");
dataSource.setPassword("lovo");
dataSource.setMaxActive(100);
dataSource.setMinIdle(20);
dataSource.setMaxWait(1000);
return dataSource;
}
@Bean
public SqlSessionFactoryBean getFactoryBean() {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(this.getDateSource());
factoryBean.setConfigLocation(new ClassPathResource("mybatis.cfg.xml"));
return factoryBean;
}
@Bean
public TransactionManager getTransactionManager() {
DataSourceTransactionManager trans = new DataSourceTransactionManager(this.getDateSource());
return trans;
}
}
CodeGenerator
public class CodeGenerator {
private static String moduleName;
/**
* <p>
* 读取控制台内容
* </p>
*/
public static String scanner(String tip) {
Scanner scanner = new Scanner(System.in);
StringBuilder help = new StringBuilder();
help.append("请输入" + tip + ":");
System.out.println(help.toString());
if (scanner.hasNext()) {
String ipt = scanner.next();
if (StringUtils.isNotBlank(ipt)) {
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip + "!");
}
public static void main(String[] args) {
moduleName = scanner("模块名");
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setServiceName("I%sService");
gc.setMapperName("I%sDAO");
gc.setEntityName("%sBean");
gc.setOutputDir(projectPath + "/"+moduleName+"/src/main/java");
gc.setAuthor("bdk");
gc.setOpen(false);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://asbdk.com:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("lovo");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
// pc.setModuleName(scanner("模块名"));
pc.setParent("com.lovo");
pc.setMapper("dao");
pc.setEntity("dto");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
// String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/"+moduleName+"/src/main/resources/com/lovo/dao/"
+ tableInfo.getMapperName() + StringPool.DOT_XML;
}
});
/*
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
checkDir("调用默认方法创建的目录,自定义目录用");
if (fileType == FileType.MAPPER) {
// 已经生成 mapper 文件判断存在,不想重新生成返回 false
return !new File(filePath).exists();
}
// 允许生成模板文件
return true;
}
});
*/
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setControllerMappingHyphenStyle(false);
// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父类
// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
// 写于父类中的公共字段
strategy.setSuperEntityColumns("id");
strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
strategy.setControllerMappingHyphenStyle(true);
// strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
// mpg.setTemplateEngine(new Voli());
mpg.execute();
}
}
MQUtil
@Component
public class MQUtil {
@Resource
private RabbitTemplate rabbitTemplate;
/**
* 发送消息给交换机,并指定对应的路由键和消息内容
*
* @param exchangeName
* @param routingKey
* @param message
*/
public void send(String exchangeName, String routingKey, Object message) {
this.rabbitTemplate.convertAndSend(exchangeName, routingKey, message);
}
public void ack(Message message, Channel channel) {
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e) {
e.printStackTrace();
}
}
public void nack(Message message, Channel channel) {
try {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
MQ
@Configuration
@EnableRabbit
public class GoodsToBackMQ {
@Bean
public Exchange directgoodsToBackExchange(){
//创建交换机
return ExchangeBuilder.directExchange("direct.front.goodsAdd.exchange").durable(true).build();
}
//添加商品消息队列,传递GoodsDto,里面有goodsCode,goodsSaleprice
@Bean
public Queue directgoodsAddQueue(){
//创建消息队列
return new Queue("direct.front.goodsAdd.queue");
}
@Bean
public Binding directgoodsAddExchangeQueueBinding(){
//将交换机和消息队列绑定
return BindingBuilder.bind(directgoodsAddQueue()).to(directgoodsToBackExchange()).with("direct_front_goodsAdd_rk").noargs();
}
//查询所有库存,传递pageNO
@Bean
public Queue directgoodsFindAllQueue(){
//创建消息队列
return new Queue("direct.front.goodsFindAll.queue");
}
@Bean
public Binding directgoodsFindAllExchangeQueueBinding(){
return BindingBuilder.bind(directgoodsFindAllQueue()).to(directgoodsToBackExchange()).with("direct_front_goodsFindAll_rk").noargs();
}
}
WebApplicationConfig
@Configuration
@EnableWebMvc
@Import(MybatisConfig.class)
public class WebApplicationConfig implements WebMvcConfigurer {
@Resource
private RequestMappingHandlerAdapter adapter;
//设置响应信息编码集
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
StringHttpMessageConverter stringHttpMessageConverter = (StringHttpMessageConverter) converters.get(1);
stringHttpMessageConverter.setDefaultCharset(Charset.forName("utf-8"));
}
//提供静态资源的支持
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/html/**").addResourceLocations("classpath:/static/html/");
}
//注册类型转换器
@PostConstruct
public void addConversionConfig() {
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) adapter
.getWebBindingInitializer();
if (initializer.getConversionService() != null) {
GenericConversionService converService = (GenericConversionService) initializer.getConversionService();
converService.addConverter(new LocalDateTypeChange());
}
}
}
日期类型转换器
/**
* 类型转换器
*/
public class LocalDateTypeChange implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String s) {
if(s != null && s.matches("\\d{4}-\\d{2}-\\d{2}")){
return LocalDate.parse(s);
}
return null;
}
}
mybatis-plus dao
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lovo.bean.ReviewBean;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface IReviewDao extends BaseMapper<ReviewBean> {
List selectAll();
void updateScore(@Param("id") int id, @Param("num") int num);
void addUserReview(@Param("userId") int userId, @Param("reviewId") int reviewId);
void delUserReview(@Param("userId") int userId, @Param("reviewId") int reviewId);
}
mybatis-plus iservice
import com.baomidou.mybatisplus.extension.service.IService;
import com.lovo.bean.ReviewBean;
import java.util.List;
public interface IReviewService extends IService<ReviewBean> {
List selectAll();
void updateScore(int id, int num);
void addUserReview(int userId, int reviewId);
void delUserReview(int userId, int reviewId);
}
mybatis-plus serviceImpl
@Service
public class ReviewServiceImpl extends ServiceImpl<IReviewDao, ReviewBean> implements IReviewService {
@Resource
private IReviewDao reviewDao;
}
Mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.project.desk.dao.ISatisticsDAO">
<resultMap id="CountMap" type="SatisticsBean">
<result property="name" column="snap_name"></result>
<result property="num" column="num"></result>
<result property="orderMoney" column="money"></result>
</resultMap>
<select id="findAllSatistcsnum" resultMap="CountMap">
SELECT gs.`snap_name`, SUM(oi.`money`) money,SUM(oi.`num`) num FROM
sc_orderInfo oi JOIN sc_goodsSnapshot gs ON oi.`snap_code`=gs.snap_code
<if test="startorderInfoCreate != null">
and oi.`order_info_create` >= #{startorderInfoCreate}
</if>
<if test="endorderInfoCreate != null">
<![CDATA[
and oi.`order_info_create` <= #{endorderInfoCreate}
]]>
</if>
<if test="snapType != null and snapType !=''">
and gs.snap_type =#{snapType}
</if>
and oi.`order_info_state` != '已退货'
GROUP BY gs.`snap_name`
</select>
</mapper>
application.yml
server:
port: 8080
logging:
level:
root: info
spring:
datasource:
url: jdbc:mysql://47.108.185.142:3306/quanxian?characterEncoding=utf-8&useSSL=false
username: root
password: lovo
type: com.alibaba.druid.pool.DruidDataSource
redis:
database: 0
host: 47.108.185.142
port: 6379
jedis:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 2000
mybatis-plus:
type-aliases-package: com.lovo.bean
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../jquery-3.2.1.min.js"></script>
<script src="../jquery.query.js"></script>
<script src="../layui/layui.js"></script>
<script src="js/myOrder.js"></script>
<link href="../layui/css/layui.css" rel="stylesheet">
</head>
<body>
<div class="layui-container">
<table class="layui-table">
<thead>
<tr><th>订单号</th><th>订单总价</th><th>订单状态</th><th>下单时间</th><th>订单详情</th></tr>
</thead>
<tbody id="orderData"></tbody>
</table>
<div id="cutPageDiv"></div>
<a class="layui-btn layui-btn-warm" href="../index.html">返回首页</a>
</div>
</body>
</html>
js
$(function () {
findAllByUserId(1);
})
function findAllByUserId(pageNO) {
var userId = $.query.get("userId");
$.post("/order/findAllByUserId","pageNO="+pageNO+"&userId="+userId,function (OrderList) {
var str = "";
for(var i=0;i<OrderList.list.length;i++){
var obj = OrderList.list[i];
str += `<tr><td>${obj.id}</td>
<td>${obj.price}</td>
<td>${obj.state}</td>
<td>${obj.createDate}</td>
<td><a class="layui-btn layui-btn-normal"
href="/html/customer/orderInfo.html?id=${obj.id}">查看详情</a></td></tr>`;
}
$("#orderData").html(str);
if(pageNO == 1){
layui.use('laypage', function(){
var laypage = layui.laypage;
//执行一个laypage实例
laypage.render({
elem: 'cutPageDiv', //注意,这里的 test1 是 ID,不用加 # 号
count: OrderList.total, //数据总数,从服务端得到
limit:OrderList.pageSize,
jump:function (obj,first) {
if(!first){
findAllByUserId(obj.curr)
}
}
})
})
};
})
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-3.2.1.min.js"></script>
<script src="jquery.query.js"></script>
<script src="layui/layui.js"></script>
<script src="js/index.js"></script>
<link href="layui/css/layui.css" rel="stylesheet">
</head>
<body>
<div class="layui-container">
<span id="loginInfoDiv"></span>
<a href="javascript:showShopCar()" class="layui-btn layui-btn-normal">查看购物车</a>
<a href="javascript:myOrder()" class="layui-btn layui-btn-normal">我的订单</a>
<form id="searchForm" class="layui-form">
<div class="layui-row">
<div class="layui-col-md4">
商品名:<input class="layui-input" type="text" name="name">
</div>
<div class="layui-col-md4">
生产起始日期:<input class="layui-input" type="text" name="startDate">
</div>
<div class="layui-col-md4">
生产结束日期:<input class="layui-input" type="text" name="endDate">
</div>
<div class="layui-col-md4">
<input class="layui-btn layui-btn-warm" type="button" value="搜索" onclick="findByItem(1)">
</div>
</div>
</form>
<div id="productDiv" style="height: 400px" class="layui-row"></div>
<div id="cutPageDiv"></div>
</div>
</body>
</html>
index.js
$(function () {
findByItem(1);
$.post("/user/getUser",null,function (info) {
var obj = JSON.parse(info);
if(obj == null){
$("#loginInfoDiv").html("你好,请先<a href='/html/login.html' class='lauiy-btn layui-btn-warm'>登陆</a>")
}else {
$("#loginInfoDiv").html("您好,"+obj.name);
}
})
})
function findByItem(pageNO) {
$.post("/product/findByItem",$("#searchForm").serialize()+"&pageNO="+pageNO,function (pageObj) {
var str = "";
for(var i=0;i<pageObj.list.length;i++){
var obj = pageObj.list[i];
str += `<div class='layui-col-md4' style="text-align: center">
<img src="/html/productImg/${obj.imgPath}" width="200" height="260"><br>
${obj.name}<br>
单价:${obj.price}<br>
已售出:${obj.saleNum}<br>
<a class="layui-btn layui-btn-primary"
href="/html/customer/shopCar.html?id=${obj.id}">购买</a>
</div>`;
}
$("#productDiv").html(str);
if(pageNO == 1){
layui.use('laypage', function(){
var laypage = layui.laypage;
//执行一个laypage实例
laypage.render({
elem: 'cutPageDiv', //注意,这里的 test1 是 ID,不用加 # 号
count: pageObj.total, //数据总数,从服务端得到
limit:pageObj.pageSize,
jump:function (obj,first) {
if(!first){
findByItem(obj.curr)
}
}
})
})
};
})
}
function showShopCar() {
$.post("/user/getUser",null,function (info) {
var obj = JSON.parse(info);
if(obj != null){
location.href="/html/customer/shopCar.html";
}else {
location.href="/html/login.html";
}
})
}
function myOrder() {
$.post("/user/getUser",null,function (info) {
var obj = JSON.parse(info);
if(obj != null){
location.href="/html/customer/myOrder.html?userId="+obj.id;
}else {
location.href="/html/login.html"
}
})
}