浏览代码

基础接口

zzf 1 年之前
父节点
当前提交
915be005d3
共有 52 个文件被更改,包括 1988 次插入9 次删除
  1. 103 3
      build.gradle
  2. 37 0
      src/main/java/com/zzys/lightting/base/model/BaseEntity.java
  3. 4 0
      src/main/java/com/zzys/lightting/base/package-info.java
  4. 18 0
      src/main/java/com/zzys/lightting/base/repository/BaseRepository.java
  5. 76 0
      src/main/java/com/zzys/lightting/base/rest/BaseController.java
  6. 46 0
      src/main/java/com/zzys/lightting/config/CorsConfig.java
  7. 24 0
      src/main/java/com/zzys/lightting/config/Properties.java
  8. 107 0
      src/main/java/com/zzys/lightting/config/RedisConfig.java
  9. 98 0
      src/main/java/com/zzys/lightting/config/SwaggerConfig.java
  10. 77 0
      src/main/java/com/zzys/lightting/filter/JWTInterceptor.java
  11. 52 0
      src/main/java/com/zzys/lightting/filter/JWTInterceptorConfig.java
  12. 79 0
      src/main/java/com/zzys/lightting/filter/UserCheckInterceptor.java
  13. 33 0
      src/main/java/com/zzys/lightting/music/dao/model/MusicInfo.java
  14. 29 0
      src/main/java/com/zzys/lightting/music/dao/model/MusicType.java
  15. 32 0
      src/main/java/com/zzys/lightting/music/dao/model/TypeInfo.java
  16. 7 0
      src/main/java/com/zzys/lightting/music/dao/repository/MusicRepository.java
  17. 13 0
      src/main/java/com/zzys/lightting/music/dao/repository/MusicTypeRepository.java
  18. 7 0
      src/main/java/com/zzys/lightting/music/dao/repository/TypeRepository.java
  19. 73 0
      src/main/java/com/zzys/lightting/music/rest/MusicController.java
  20. 47 0
      src/main/java/com/zzys/lightting/music/rest/TypeController.java
  21. 16 0
      src/main/java/com/zzys/lightting/music/service/MusicService.java
  22. 13 0
      src/main/java/com/zzys/lightting/music/service/MusicTypeService.java
  23. 11 0
      src/main/java/com/zzys/lightting/music/service/TypeService.java
  24. 60 0
      src/main/java/com/zzys/lightting/music/service/impl/MusicServiceImpl.java
  25. 34 0
      src/main/java/com/zzys/lightting/music/service/impl/MusicTypeServiceImpl.java
  26. 29 0
      src/main/java/com/zzys/lightting/music/service/impl/TypeServiceImpl.java
  27. 32 0
      src/main/java/com/zzys/lightting/template/dao/model/TemplateInfo.java
  28. 30 0
      src/main/java/com/zzys/lightting/template/dao/model/TemplateMusicInfo.java
  29. 9 0
      src/main/java/com/zzys/lightting/template/dao/repository/TemplateMusicRepository.java
  30. 11 0
      src/main/java/com/zzys/lightting/template/dao/repository/TemplateRepository.java
  31. 57 0
      src/main/java/com/zzys/lightting/template/rest/TemplateController.java
  32. 34 0
      src/main/java/com/zzys/lightting/template/rest/TemplateMusicController.java
  33. 10 0
      src/main/java/com/zzys/lightting/template/service/TemplateMusicService.java
  34. 13 0
      src/main/java/com/zzys/lightting/template/service/TemplateService.java
  35. 27 0
      src/main/java/com/zzys/lightting/template/service/impl/TemplateMusicServiceImpl.java
  36. 34 0
      src/main/java/com/zzys/lightting/template/service/impl/TemplateServiceImpl.java
  37. 49 0
      src/main/java/com/zzys/lightting/user/dao/model/UserInfo.java
  38. 37 0
      src/main/java/com/zzys/lightting/user/dao/model/UserPhotoInfo.java
  39. 8 0
      src/main/java/com/zzys/lightting/user/dao/repository/UserPhotoRepository.java
  40. 10 0
      src/main/java/com/zzys/lightting/user/dao/repository/UserRepository.java
  41. 145 0
      src/main/java/com/zzys/lightting/user/rest/UserController.java
  42. 15 0
      src/main/java/com/zzys/lightting/user/service/UserPhotoService.java
  43. 15 0
      src/main/java/com/zzys/lightting/user/service/UserService.java
  44. 29 0
      src/main/java/com/zzys/lightting/user/service/impl/UserPhotoServiceImpl.java
  45. 42 0
      src/main/java/com/zzys/lightting/user/service/impl/UserServiceImpl.java
  46. 11 0
      src/main/java/com/zzys/lightting/utils/Constant.java
  47. 28 0
      src/main/java/com/zzys/lightting/utils/HttpStatus.java
  48. 72 0
      src/main/java/com/zzys/lightting/utils/JWTUtil.java
  49. 62 0
      src/main/java/com/zzys/lightting/utils/Result.java
  50. 59 0
      src/main/java/com/zzys/lightting/utils/WechatDecryptDataUtil.java
  51. 24 0
      src/main/resources/application.properties
  52. 0 6
      src/main/resources/static/index.html

+ 103 - 3
build.gradle

@@ -1,4 +1,12 @@
+buildscript {
+    ext {
+//        queryDslVersion = '4.2.1'
+        queryDslVersion = '5.0.0'
+        lombokVersion = '1.18.12'
+    }
+}
 plugins {
+
     id 'org.springframework.boot' version '2.6.13'
     id 'io.spring.dependency-management' version '1.0.15.RELEASE'
     id 'java'
@@ -13,10 +21,102 @@ repositories {
 }
 
 dependencies {
-    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
+    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
     implementation 'org.springframework.boot:spring-boot-starter-web'
-    runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
-    testImplementation 'org.springframework.boot:spring-boot-starter-test'
+    compileOnly 'org.projectlombok:lombok'
+    annotationProcessor 'org.projectlombok:lombok'
+//	testImplementation 'org.springframework.boot:spring-boot-starter-test'
+////	classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.10"
+//	// https://mvnrepository.com/artifact/com.querydsl/querydsl-apt
+//	compile group: 'com.querydsl', name: 'querydsl-apt', version: '4.2.1'
+    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation
+    implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.3'
+
+//	// https://mvnrepository.com/artifact/org.springframework.data/spring-data-commons
+//	compile group: 'org.springframework.data', name: 'spring-data-commons', version: '2.4.1'
+    // https://mvnrepository.com/artifact/mysql/mysql-connector-java
+    implementation 'mysql:mysql-connector-java:8.0.21'
+
+//	compile group: 'com.querydsl', name: 'querydsl-jpa', version: '4.2.1'
+//	compile group: 'com.querydsl', name: 'querydsl-apt', version: '4.2.1'
+    // QueryDSL
+    implementation("com.querydsl:querydsl-core:${queryDslVersion}")
+    implementation("com.querydsl:querydsl-jpa:${queryDslVersion}")
+    //关键地方(记得开启annotationProcessor)
+    annotationProcessor("com.querydsl:querydsl-apt:${queryDslVersion}:jpa",
+            "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.2.Final",
+            "javax.annotation:javax.annotation-api:1.3.2",
+            "org.projectlombok:lombok")
+
+    // Lombok(记得安装IDEA插件)
+    compileOnly "org.projectlombok:lombok:${lombokVersion}"
+    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
+    implementation("org.projectlombok:lombok:${lombokVersion}")
+    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test
+    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.3'
+
+    // https://mvnrepository.com/artifact/com.alibaba/fastjson
+    implementation 'com.alibaba:fastjson:1.2.83'
+    // https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml
+    implementation 'org.apache.poi:poi-ooxml:3.17'
+
+    // https://mvnrepository.com/artifact/commons-lang/commons-lang
+    implementation 'commons-lang:commons-lang:2.6'
+
+    implementation group: 'io.springfox', name: 'springfox-boot-starter', version: '3.0.0'
+
+    // https://mvnrepository.com/artifact/io.swagger/swagger-annotations
+    implementation group: 'io.swagger', name: 'swagger-annotations', version: '1.5.22'
+    implementation group: 'io.swagger', name: 'swagger-models', version: '1.5.22'
+
+    // https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload
+    implementation group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
+    // https://mvnrepository.com/artifact/com.github.qcloudsms/qcloudsms
+    implementation group: 'com.github.qcloudsms', name: 'qcloudsms', version: '1.0.6'
+    // https://mvnrepository.com/artifact/cn.keking.project/kk-anti-reptile
+    implementation group: 'cn.keking.project', name: 'kk-anti-reptile', version: '1.0.0-RELEASE'
+    // https://mvnrepository.com/artifact/com.belerweb/pinyin4j
+    implementation group: 'com.belerweb', name: 'pinyin4j', version: '2.5.1'
+    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket
+    implementation 'org.springframework.boot:spring-boot-starter-websocket:2.5.5'
+    //https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket
+    //implementation 'org.java-websocket:Java-WebSocket:1.3.0'
+    // https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket
+    implementation 'org.java-websocket:Java-WebSocket:1.5.1'
+    //https://github.com/auth0/java-jwt
+    // 添加jwt
+    implementation 'com.auth0:java-jwt:3.18.2'
+    // https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter
+    implementation group: 'com.alibaba', name: 'druid-spring-boot-starter', version: '1.2.9'
+    // https://mvnrepository.com/artifact/junit/junit
+    testImplementation group: 'junit', name: 'junit', version: '4.13.2'
+    // https://mvnrepository.com/artifact/io.github.fanyong920/jvppeteer
+    implementation "io.github.fanyong920:jvppeteer:1.1.5"
+
+    // https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on
+    implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
+
+
+
+
+    //wxpay
+    // https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk
+    //implementation group: 'com.github.wxpay', name: 'wxpay-sdk', version: '0.0.3'
+
+    implementation 'com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.4.7'
+
+    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-configuration-processor
+    implementation group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: '2.6.8'
+
+    // https://mvnrepository.com/artifact/com.google.code.gson/gson
+    implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
+
+    // https://mvnrepository.com/artifact/cn.hutool/hutool-all
+    implementation group: 'cn.hutool', name: 'hutool-all', version: '5.7.18'
+
+    //redis
+    // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
+    implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.6.3'
 }
 
 tasks.named('test') {

+ 37 - 0
src/main/java/com/zzys/lightting/base/model/BaseEntity.java

@@ -0,0 +1,37 @@
+package com.zzys.lightting.base.model;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import org.hibernate.annotations.GenericGenerator;
+import org.springframework.data.jpa.domain.support.AuditingEntityListener;
+
+import javax.persistence.*;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * @author zzf
+ * @description:
+ * @date 2021/1/18 19:13
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@EntityListeners({AuditingEntityListener.class})
+@MappedSuperclass
+public class BaseEntity implements Serializable {
+    @Getter
+    @Id
+    @GenericGenerator(name = "jpa-uuid", strategy = "uuid")
+    @GeneratedValue(generator = "jpa-uuid")
+    @Column(name = "id", columnDefinition = "varchar(36) COMMENT '数据ID'")
+    @NotNull(groups = Update.class)
+    private String id;
+
+    public @interface Update {
+    }
+}

+ 4 - 0
src/main/java/com/zzys/lightting/base/package-info.java

@@ -0,0 +1,4 @@
+package com.zzys.lightting.base;
+/**
+ * 基础信息
+ */

+ 18 - 0
src/main/java/com/zzys/lightting/base/repository/BaseRepository.java

@@ -0,0 +1,18 @@
+package com.zzys.lightting.base.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.querydsl.QuerydslPredicateExecutor;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import java.io.Serializable;
+
+/**
+ * @author zzf
+ * @description:
+ * @date 2021/1/18 19:17
+ */
+@NoRepositoryBean
+public interface BaseRepository<T, PK extends Serializable> extends JpaRepository<T, PK>, JpaSpecificationExecutor, QuerydslPredicateExecutor<T> {
+
+}

+ 76 - 0
src/main/java/com/zzys/lightting/base/rest/BaseController.java

@@ -0,0 +1,76 @@
+package com.zzys.lightting.base.rest;
+
+
+import com.zzys.lightting.utils.HttpStatus;
+import com.zzys.lightting.utils.Result;
+
+/**
+ * @author zzf
+ * @description:
+ * @date 2021/1/18 19:20
+ */
+public class BaseController {
+    protected static final String PAGE_NUM = "pageNum";
+
+    protected static final String PAGE_SIZE = "pageSize";
+
+    protected Result success() {
+        return success(null, "成功");
+    }
+
+    protected static <T> Result<T> success(T data) {
+        return success(data, "成功");
+    }
+
+    protected static <T> Result<T> success(T data, String message) {
+        if (null == data) {
+            return new Result<>(HttpStatus.SUCCESS, message);
+        }
+        return new Result<>(HttpStatus.SUCCESS, message, data);
+    }
+
+    protected static <T> Result<T> success(String code,T data, String message) {
+        if (null == data) {
+            return new Result<>(code, message);
+        }
+        return new Result<>(code, message, data);
+    }
+
+    protected Result fail() {
+        return fail(null, "失败");
+    }
+
+    protected static <T> Result<T> fail(T data) {
+        return fail(data, "失败");
+    }
+
+    protected static <T> Result<T> fail(String message) {
+        return new Result<>(HttpStatus.RUNTIME_EXCEPTION, message);
+    }
+
+    protected static <T> Result<T> fail(String code ,T data ,String message){
+        if(data == null)
+            return new Result<>(code,message);
+        else
+            return new Result<>(code,message,data);
+    }
+
+    protected static <T> Result<T> fail(T data, String message) {
+        if (null == data) {
+            return new Result<>(HttpStatus.RUNTIME_EXCEPTION, message);
+        }
+        return new Result<>(HttpStatus.RUNTIME_EXCEPTION, message, data);
+    }
+
+    protected Result failBadRequest() {
+        return failBadRequest(null, "参数异常");
+    }
+
+    protected static <T> Result<T> failBadRequest(T data) {
+        return failBadRequest(null, "参数异常");
+    }
+
+    protected static <T> Result<T> failBadRequest(T data, String message) {
+        return new Result<>(org.springframework.http.HttpStatus.BAD_REQUEST.value() + "", message, data);
+    }
+}

+ 46 - 0
src/main/java/com/zzys/lightting/config/CorsConfig.java

@@ -0,0 +1,46 @@
+package com.zzys.lightting.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@Configuration
+public class CorsConfig {
+
+    private CorsConfiguration buildConfig() {
+
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.setAllowCredentials(true);
+        /*corsConfiguration.addAllowedOrigin("http://localhost:8080"); // 允许任何域名使用
+        corsConfiguration.addAllowedOrigin("http://10.113.233.26:8080");
+        corsConfiguration.addAllowedOrigin("http://192.168.42.21:8080");
+        corsConfiguration.addAllowedOrigin("http://cognitive.wistcm.com/");*/
+//        corsConfiguration.addAllowedOrigin("*");
+        corsConfiguration.addAllowedOriginPattern("*");
+        corsConfiguration.addAllowedHeader("*"); // 允许任何头
+        corsConfiguration.addAllowedMethod("*"); // 允许任何方法(post、get等)
+        return corsConfiguration;
+
+        /*CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.setAllowCredentials(true);
+        // 设置setAllowCredentials = true后就不能设置为*了,要设置具体的
+        corsConfiguration.addAllowedOrigin("http://10.113.233.26:8080");
+        corsConfiguration.addAllowedOrigin("http://localhost:8080");
+        // 允许任何头
+        corsConfiguration.addAllowedHeader("*");
+        // 允许任何方法(post、get等)
+        corsConfiguration.addAllowedMethod("*");
+        return corsConfiguration;*/
+    }
+
+    @Bean
+    public CorsFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        // 对接口配置跨域设置
+        source.registerCorsConfiguration("/**", buildConfig());
+        return new CorsFilter(source);
+    }
+
+}

+ 24 - 0
src/main/java/com/zzys/lightting/config/Properties.java

@@ -0,0 +1,24 @@
+package com.zzys.lightting.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @Author:zzf
+ * @Date:2022/7/5:18:15
+ * @Description:
+ */
+@Component
+@ConfigurationProperties(prefix = "redis-config")
+
+public class Properties {
+    private final Map<String, Duration> initCaches = new HashMap<>();
+    public Map<String ,Duration> getInitCache(){
+
+        return initCaches;
+    }
+}

+ 107 - 0
src/main/java/com/zzys/lightting/config/RedisConfig.java

@@ -0,0 +1,107 @@
+package com.zzys.lightting.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Description:Redis缓存时间、序列化、反序列化等配置
+ * @Author: zsf
+ * @Date: 2022/7/1
+ */
+@Configuration
+@EnableCaching
+@Slf4j
+@Profile("!lan")
+public class RedisConfig extends CachingConfigurerSupport {
+    @Autowired
+    private Properties properties;
+
+    @Bean
+    public CacheManager cacheManager(RedisConnectionFactory factory) {
+        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration
+                .defaultCacheConfig()
+                .entryTtl(Duration.ofDays(1))
+                .disableCachingNullValues()//不允许缓存空值
+                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer()));
+        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory);
+        Set<String> cacheNames = new HashSet<>();
+        ConcurrentHashMap<String, RedisCacheConfiguration> cacheConfig = new ConcurrentHashMap<>();
+
+        properties.getInitCache().forEach((key, value) -> {
+            cacheNames.add(key);
+            cacheConfig.put(key,cacheConfiguration.entryTtl(value));
+        });
+        /*return RedisCacheManager
+                .builder(RedisCacheWriter.nonLockingRedisCacheWriter(factory))
+                .cacheDefaults(cacheConfiguration)
+                .transactionAware()
+                .build();*/
+        return RedisCacheManager.builder(redisCacheWriter)
+                .cacheDefaults(cacheConfiguration)
+                .initialCacheNames(cacheNames)
+                .withInitialCacheConfigurations(cacheConfig)
+                .build();
+    }
+
+
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
+        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+        // 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
+
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        // 使用StringRedisSerializer来序列化和反序列化redis的key值
+        redisTemplate.setKeySerializer(stringRedisSerializer);
+
+        // hash的key也采用String的序列化方式
+        redisTemplate.setHashKeySerializer(stringRedisSerializer);
+        // hash的value序列化方式采用jackson
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
+        redisTemplate.afterPropertiesSet();
+        return redisTemplate;
+    }
+
+    /**
+     * 配置Jackson2JsonRedisSerializer序列化策略
+     */
+    @Bean
+    public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
+        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+        ObjectMapper objectMapper = new ObjectMapper();
+
+        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+
+        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
+        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+
+        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
+        return jackson2JsonRedisSerializer;
+    }
+}

+ 98 - 0
src/main/java/com/zzys/lightting/config/SwaggerConfig.java

@@ -0,0 +1,98 @@
+package com.zzys.lightting.config;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
+import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfig {
+    /**
+     * 创建API应用
+     * apiInfo() 增加API相关信息
+     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
+     * 本例采用指定扫描的包路径来定义指定要建立API的目录。
+     *
+     * @return
+     */
+
+
+    //再定义一个Docket
+    @Bean
+    public Docket desertsApi2() {
+        return new Docket(DocumentationType.OAS_30)
+                .apiInfo(apiInfo("Swagger3.0", "1.0"))
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.zzys.lightting"))
+                .paths(PathSelectors.any())
+                .build()
+                .groupName("light-ting")
+                .enable(true);
+    }
+
+    /**
+     * 创建该API的基本信息(这些基本信息会展现在文档页面中)
+     * 访问地址:http://ip:port/swagger-ui.html
+     *
+     * @return
+     */
+    private ApiInfo apiInfo(String title, String version) {
+        return new ApiInfoBuilder()
+                .title(title)
+                .description("api信息")
+                .contact(new Contact("Develoven", "", "develoven@163.com"))
+                .termsOfServiceUrl("")
+                .version(version)
+                .build();
+    }
+
+    @Bean
+    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
+        return new BeanPostProcessor() {
+
+            @Override
+            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
+                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
+                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
+                }
+                return bean;
+            }
+
+            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
+                List<T> copy = mappings.stream()
+                        .filter(mapping -> mapping.getPatternParser() == null)
+                        .collect(Collectors.toList());
+                mappings.clear();
+                mappings.addAll(copy);
+            }
+
+            @SuppressWarnings("unchecked")
+            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
+                try {
+                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
+                    field.setAccessible(true);
+                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
+                } catch (IllegalArgumentException | IllegalAccessException e) {
+                    throw new IllegalStateException(e);
+                }
+            }
+        };
+    }
+}

+ 77 - 0
src/main/java/com/zzys/lightting/filter/JWTInterceptor.java

@@ -0,0 +1,77 @@
+package com.zzys.lightting.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.auth0.jwt.exceptions.AlgorithmMismatchException;
+import com.auth0.jwt.exceptions.SignatureVerificationException;
+import com.auth0.jwt.exceptions.TokenExpiredException;
+import com.zzys.lightting.utils.JWTUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+
+/**
+ * @author lpf
+ * @description:
+ * @date 2021/12/2821:48
+ */
+@Slf4j
+@Component
+public class JWTInterceptor implements HandlerInterceptor {
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        HashMap<String, Object> resultJson = new HashMap<>();
+        String uri = request.getRequestURI();
+        log.info("请求uri:" + uri);
+        //获取请求头token
+        try {
+            String token = request.getHeader("Authorization");
+            if(StringUtils.isEmpty(token)) {
+                resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+                resultJson.put("msg", "无效签名信息");
+                String s = JSON.toJSONString(resultJson);
+                response.setContentType("application/json;charset=UTF-8");
+                response.getWriter().println(s);
+                return false;
+            }
+            String[] len = token.split(" ");
+            if (len.length >1){
+                token = len[1];//以空格划分Bearer token,获取token
+                JWTUtil.verify(token);//验证令牌
+                return true; //放行
+            } else if (len.length==1) {
+                token = len[0];//以空格划分Bearer token,获取token
+                JWTUtil.verify(token);//验证令牌
+                return true; //放行
+            } else {
+                resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+                resultJson.put("msg", "无效签名信息");
+            }
+
+        } catch (SignatureVerificationException e) {
+            e.printStackTrace();
+            resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg", "无效签名信息");
+        } catch (AlgorithmMismatchException e) {
+            e.printStackTrace();
+            resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg", "token算法不一致");
+        }catch (TokenExpiredException e){
+            e.printStackTrace();
+            resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg", "token已过期,请重新获取");
+        } catch (Exception e) {
+            e.printStackTrace();
+            resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg", "登录状态失效,请重新登录");
+        }
+        String s = JSON.toJSONString(resultJson);
+        response.setContentType("application/json;charset=UTF-8");
+        response.getWriter().println(s);
+        return false;
+    }
+}

+ 52 - 0
src/main/java/com/zzys/lightting/filter/JWTInterceptorConfig.java

@@ -0,0 +1,52 @@
+package com.zzys.lightting.filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author lpf
+ * @description:
+ * @date 2021/12/2822:06
+ */
+@Configuration
+public class JWTInterceptorConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private UserCheckInterceptor userCheckInterceptor;
+
+    @Autowired
+    private JWTInterceptor jwtInterceptor;
+
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //定义排除swagger访问的路径配置
+        String[] swaggerExcludes = new String[]{"/swagger-ui/index.html", "/swagger-resources/**", "/csrf", "/webjars/**"};
+        String[] systemApi = new String[]{"/user/login","/user/blogin"};
+        registry.addInterceptor(jwtInterceptor)
+                .addPathPatterns("/**")
+                .excludePathPatterns("/", "/index**", "/error")
+                .excludePathPatterns(systemApi)
+                .excludePathPatterns(swaggerExcludes)
+                .excludePathPatterns("/favicon.ico")
+                .excludePathPatterns("/druid/**")
+                .excludePathPatterns("/static/**");//排除静态资源
+        registry.addInterceptor(userCheckInterceptor)
+                .addPathPatterns("/**")
+                .excludePathPatterns("/", "/index.html", "/error")
+                .excludePathPatterns(systemApi)
+                .excludePathPatterns(swaggerExcludes)
+                .excludePathPatterns("/favicon.ico")
+                .excludePathPatterns("/druid/**")
+                .excludePathPatterns("/static/**");//排除静态资源
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("/static/**")
+                .addResourceLocations("classpath:/static/");
+    }
+}

+ 79 - 0
src/main/java/com/zzys/lightting/filter/UserCheckInterceptor.java

@@ -0,0 +1,79 @@
+package com.zzys.lightting.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.zzys.lightting.user.dao.model.UserInfo;
+import com.zzys.lightting.user.service.UserService;
+import com.zzys.lightting.utils.JWTUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+
+/**
+ * @author lpf
+ * @description:
+ * @date 2021/01/20 16:54
+ */
+@Slf4j
+@Component
+public class UserCheckInterceptor implements HandlerInterceptor {
+    @Autowired
+    private UserService userService;
+
+
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        HashMap<String, Object> resultJson = new HashMap<>();
+        String uri = request.getRequestURI();
+        //获取请求头token
+        String token = request.getHeader("Authorization");
+        String[] len = token.split(" ");
+        if (len.length >1){
+            token = len[1];
+            JWTUtil.verify(token);
+        } else if (len.length==1) {
+            token = len[0];
+            JWTUtil.verify(token);
+        }
+        //token = token.split(" ")[1];//以空格划分Bearer token,获取token
+        //JWTUtil.verify(token);//验证令牌
+        //从请求头中获取token
+        DecodedJWT verify = JWTUtil.verify(token);
+
+        String type = verify.getClaim("type").asString();
+        String userId = verify.getClaim("userId").asString();
+        boolean flag = true;
+
+        UserInfo userInfo = this.userService.findById(userId);
+//        UserInfo userInfo = this.userService.getOne(userId);
+        if (userInfo == null) {
+            flag = false;
+            resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg", "账户已被删除,请联系管理员");
+        }else {
+            if(!userInfo.getId().equals(verify.getClaim("userId").asString())){
+                resultJson.put("code", HttpServletResponse.SC_UNAUTHORIZED);
+                resultJson.put("msg", "账户已被删除,请联系管理员");
+                String s = JSON.toJSONString(resultJson);
+                response.setContentType("application/json;charset=UTF-8");
+                response.getWriter().println(s);
+            }
+        }
+
+
+        if(!flag){
+            resultJson.put("code",HttpServletResponse.SC_UNAUTHORIZED);
+            resultJson.put("msg","未授权");
+            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
+            return false;
+        }
+
+
+        return true; //放行
+    }
+}

+ 33 - 0
src/main/java/com/zzys/lightting/music/dao/model/MusicInfo.java

@@ -0,0 +1,33 @@
+package com.zzys.lightting.music.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:11:42
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_music_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_music_info", comment = "音乐表")
+@DynamicUpdate
+public class MusicInfo extends BaseEntity {
+    @Column(name = "name",columnDefinition = "varchar(50) not null comment '名称'")
+    private String name;
+
+    @Column(name = "author",columnDefinition = "varchar(50) comment '作者'")
+    private String author;
+
+
+}

+ 29 - 0
src/main/java/com/zzys/lightting/music/dao/model/MusicType.java

@@ -0,0 +1,29 @@
+package com.zzys.lightting.music.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:14:52
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_music_type_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_music_type_info", comment = "音乐-分类关联表")
+@DynamicUpdate
+public class MusicType extends BaseEntity {
+    @Column(name = "music_id",columnDefinition = "varchar(50) not null comment '音乐id'")
+    private String musicId;
+    @Column(name = "type_id",columnDefinition = "varchar(50) not null comment '分类id'")
+    private String typeId;
+}

+ 32 - 0
src/main/java/com/zzys/lightting/music/dao/model/TypeInfo.java

@@ -0,0 +1,32 @@
+package com.zzys.lightting.music.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:09:33
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_type_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_type_info", comment = "音乐分类表")
+@DynamicUpdate
+public class TypeInfo extends BaseEntity {
+
+    @Column(name = "name",columnDefinition = "varchar(50) not null comment '名称'")
+    private String name;
+
+    @Column(name = "sort",columnDefinition = "int not null comment '序号'")
+    private int sort;
+}

+ 7 - 0
src/main/java/com/zzys/lightting/music/dao/repository/MusicRepository.java

@@ -0,0 +1,7 @@
+package com.zzys.lightting.music.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.music.dao.model.MusicInfo;
+
+public interface MusicRepository extends BaseRepository<MusicInfo,String> {
+}

+ 13 - 0
src/main/java/com/zzys/lightting/music/dao/repository/MusicTypeRepository.java

@@ -0,0 +1,13 @@
+package com.zzys.lightting.music.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.music.dao.model.MusicType;
+
+import java.util.List;
+
+public interface MusicTypeRepository extends BaseRepository<MusicType,String> {
+    void deleteByMusicId(String id);
+
+
+    List<String> findMusicIdByTypeId(String typeId);
+}

+ 7 - 0
src/main/java/com/zzys/lightting/music/dao/repository/TypeRepository.java

@@ -0,0 +1,7 @@
+package com.zzys.lightting.music.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.music.dao.model.TypeInfo;
+
+public interface TypeRepository extends BaseRepository<TypeInfo,String> {
+}

+ 73 - 0
src/main/java/com/zzys/lightting/music/rest/MusicController.java

@@ -0,0 +1,73 @@
+package com.zzys.lightting.music.rest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zzys.lightting.base.rest.BaseController;
+import com.zzys.lightting.music.dao.model.MusicInfo;
+import com.zzys.lightting.music.dao.model.MusicType;
+import com.zzys.lightting.music.service.MusicService;
+import com.zzys.lightting.music.service.MusicTypeService;
+import com.zzys.lightting.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:14:41
+ * @Description:
+ */
+@Slf4j
+@RestController
+@RequestMapping("/music")
+@Api(tags = "音乐管理")
+public class MusicController extends BaseController {
+
+
+    @Autowired
+    private MusicService service;
+
+    @Autowired
+    private MusicTypeService typeService;
+    @PostMapping("/save")
+    @ApiOperation(value = "保存-新增/修改",notes = "name:名称;author:作者;typeId:分类id")
+    public Result save(@RequestBody String json){
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        MusicInfo music = new MusicInfo();
+        music.setName(jsonObject.getString("name"));
+        music.setAuthor(jsonObject.getString("author"));
+        music= this.service.save(music);
+        MusicType type = new MusicType();
+        type.setTypeId(jsonObject.getString("typeId"));
+        type.setMusicId(music.getId());
+        this.typeService.save(type);
+        return success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("删除-id")
+    public Result delete(@PathVariable String id){
+        this.typeService.deleteByMusicId(id);
+        this.service.deleteById(id);
+        return success();
+    }
+
+    @GetMapping("/findAll")
+    @ApiOperation("查询全部")
+    public Result findAll(){
+        List<MusicInfo> musicInfos = this.service.findAll();
+        return success(musicInfos);
+    }
+
+    @GetMapping("/find/{typeId}/{pageNum}/{pageSize}")
+    public Result findByType(@PathVariable String typeId, @PathVariable int pageNum, @PathVariable int pageSize){
+        List<String> musicIdList = this.typeService.findMusicIdByTypeId(typeId);
+        Page<MusicInfo> musicInfos = this.service.findByIds(musicIdList,pageNum,pageSize);
+        return success(musicInfos);
+    }
+
+}

+ 47 - 0
src/main/java/com/zzys/lightting/music/rest/TypeController.java

@@ -0,0 +1,47 @@
+package com.zzys.lightting.music.rest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zzys.lightting.base.rest.BaseController;
+import com.zzys.lightting.music.dao.model.TypeInfo;
+import com.zzys.lightting.music.service.TypeService;
+import com.zzys.lightting.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:09:40
+ * @Description:
+ */
+@Slf4j
+@RestController
+@RequestMapping("/type")
+@Api(tags = "音乐分类管理")
+public class TypeController extends BaseController {
+
+    @Autowired
+    private TypeService typeService;
+
+    @ApiOperation(value = "保存:新增/更新",notes = "name:名称;order:序号")
+    @PostMapping("/save")
+    public Result save(@RequestBody String json){
+        JSONObject.parseObject(json).toJavaObject(TypeInfo.class);
+        return success();
+    }
+
+    @ApiOperation("查询")
+    @GetMapping("/find")
+    public Result find(){
+        return success(this.typeService.findAll());
+    }
+
+    @ApiOperation("删除")
+    @DeleteMapping("/delete/{id}")
+    public Result delete(@PathVariable String id){
+        this.typeService.deleteById(id);
+        return success();
+    }
+}

+ 16 - 0
src/main/java/com/zzys/lightting/music/service/MusicService.java

@@ -0,0 +1,16 @@
+package com.zzys.lightting.music.service;
+
+import com.zzys.lightting.music.dao.model.MusicInfo;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+public interface MusicService {
+    MusicInfo save(MusicInfo music);
+
+    void deleteById(String id);
+
+    List<MusicInfo> findAll();
+
+    Page<MusicInfo> findByIds(List<String> musicIdList,int pageNum,int pageSize);
+}

+ 13 - 0
src/main/java/com/zzys/lightting/music/service/MusicTypeService.java

@@ -0,0 +1,13 @@
+package com.zzys.lightting.music.service;
+
+import com.zzys.lightting.music.dao.model.MusicType;
+
+import java.util.List;
+
+public interface MusicTypeService {
+    void save(MusicType type);
+
+    void deleteByMusicId(String id);
+
+    List<String> findMusicIdByTypeId(String typeId);
+}

+ 11 - 0
src/main/java/com/zzys/lightting/music/service/TypeService.java

@@ -0,0 +1,11 @@
+package com.zzys.lightting.music.service;
+
+import com.zzys.lightting.music.dao.model.TypeInfo;
+
+import java.util.List;
+
+public interface TypeService {
+    List<TypeInfo> findAll();
+
+    void deleteById(String id);
+}

+ 60 - 0
src/main/java/com/zzys/lightting/music/service/impl/MusicServiceImpl.java

@@ -0,0 +1,60 @@
+package com.zzys.lightting.music.service.impl;
+
+import com.zzys.lightting.music.dao.model.MusicInfo;
+import com.zzys.lightting.music.dao.repository.MusicRepository;
+import com.zzys.lightting.music.service.MusicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:14:42
+ * @Description:
+ */
+@Service
+public class MusicServiceImpl implements MusicService {
+    @Autowired
+    private MusicRepository repository;
+    @Override
+    public MusicInfo save(MusicInfo music) {
+        return this.repository.save(music);
+    }
+
+    @Override
+    public void deleteById(String id) {
+        this.repository.deleteById(id);
+    }
+
+    @Override
+    public List<MusicInfo> findAll() {
+        return this.repository.findAll();
+    }
+
+    @Override
+    public Page<MusicInfo> findByIds(List<String> musicIdList,int pageNum,int pageSize) {
+        if(pageNum == 0){
+            pageNum =1;
+        }
+        if(pageSize == 0){
+            pageSize = 10;
+        }
+        Specification<MusicInfo> specification = (root, query, criteriaBuilder) -> {
+          List<Predicate> predicateList = new ArrayList<>();
+          predicateList.add(root.get("musicId").in(predicateList));
+          query.where(criteriaBuilder.and(predicateList.toArray(new Predicate[0])));
+          query.orderBy(criteriaBuilder.asc(root.get("order")));
+          return query.getRestriction();
+        };
+        return this.repository.findAll(specification, PageRequest.of(pageNum-1,pageSize));
+    }
+}

+ 34 - 0
src/main/java/com/zzys/lightting/music/service/impl/MusicTypeServiceImpl.java

@@ -0,0 +1,34 @@
+package com.zzys.lightting.music.service.impl;
+
+import com.zzys.lightting.music.dao.model.MusicType;
+import com.zzys.lightting.music.dao.repository.MusicTypeRepository;
+import com.zzys.lightting.music.service.MusicTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:14:58
+ * @Description:
+ */
+@Service
+public class MusicTypeServiceImpl implements MusicTypeService {
+    @Autowired
+    private MusicTypeRepository repository;
+    @Override
+    public void save(MusicType type) {
+        this.repository.save(type);
+    }
+
+    @Override
+    public void deleteByMusicId(String id) {
+        this.repository.deleteByMusicId(id);
+    }
+
+    @Override
+    public List<String> findMusicIdByTypeId(String typeId) {
+        return this.repository.findMusicIdByTypeId(typeId);
+    }
+}

+ 29 - 0
src/main/java/com/zzys/lightting/music/service/impl/TypeServiceImpl.java

@@ -0,0 +1,29 @@
+package com.zzys.lightting.music.service.impl;
+
+import com.zzys.lightting.music.dao.model.TypeInfo;
+import com.zzys.lightting.music.dao.repository.TypeRepository;
+import com.zzys.lightting.music.service.TypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:09:43
+ * @Description:
+ */
+@Service
+public class TypeServiceImpl implements TypeService {
+    @Autowired
+    private TypeRepository repository;
+    @Override
+    public List<TypeInfo> findAll() {
+        return this.repository.findAll();
+    }
+
+    @Override
+    public void deleteById(String id) {
+        this.repository.deleteById(id);
+    }
+}

+ 32 - 0
src/main/java/com/zzys/lightting/template/dao/model/TemplateInfo.java

@@ -0,0 +1,32 @@
+package com.zzys.lightting.template.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:08
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_template_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_template_info", comment = "用户音乐模板表")
+@DynamicUpdate
+public class TemplateInfo extends BaseEntity {
+    @Column(name = "user_id",columnDefinition = "varchar(50) not null comment '用户id'")
+    private String userId;
+
+    @Column(name = "name",columnDefinition = "varchar(50) not null comment '模板名称'")
+    private String name;
+
+}

+ 30 - 0
src/main/java/com/zzys/lightting/template/dao/model/TemplateMusicInfo.java

@@ -0,0 +1,30 @@
+package com.zzys.lightting.template.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:20
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_template_music_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_template_music_info", comment = "音乐模板表")
+@DynamicUpdate
+public class TemplateMusicInfo extends BaseEntity {
+    @Column(name = "template_id",columnDefinition = "varchar(50) not null comment '模板id'")
+    private String templateId;
+
+    @Column(name = "music_id",columnDefinition = "varchar(50) not null comment '音乐id'")
+    private String musicId;
+}

+ 9 - 0
src/main/java/com/zzys/lightting/template/dao/repository/TemplateMusicRepository.java

@@ -0,0 +1,9 @@
+package com.zzys.lightting.template.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.template.dao.model.TemplateMusicInfo;
+
+public interface TemplateMusicRepository extends BaseRepository<TemplateMusicInfo,String> {
+    void deleteByTemplateId(String id);
+
+}

+ 11 - 0
src/main/java/com/zzys/lightting/template/dao/repository/TemplateRepository.java

@@ -0,0 +1,11 @@
+package com.zzys.lightting.template.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.template.dao.model.TemplateInfo;
+
+import java.util.List;
+
+public interface TemplateRepository extends BaseRepository<TemplateInfo,String> {
+
+    List<TemplateInfo> findByUserId(String userId);
+}

+ 57 - 0
src/main/java/com/zzys/lightting/template/rest/TemplateController.java

@@ -0,0 +1,57 @@
+package com.zzys.lightting.template.rest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zzys.lightting.base.rest.BaseController;
+import com.zzys.lightting.template.dao.model.TemplateInfo;
+import com.zzys.lightting.template.service.TemplateMusicService;
+import com.zzys.lightting.template.service.TemplateService;
+import com.zzys.lightting.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:38
+ * @Description:
+ */
+@Slf4j
+@RestController
+@RequestMapping("/template")
+@Api(tags = "模板管理")
+public class TemplateController extends BaseController {
+
+    @Autowired
+    private TemplateService service;
+    @Autowired
+    private TemplateMusicService templateMusicService;
+    @PostMapping("/save")
+    @ApiOperation(value = "保存",notes = "name:模板名称;userId:用户id")
+    public Result save(@RequestBody String json){
+        TemplateInfo templateInfo = JSONObject.parseObject(json).toJavaObject(TemplateInfo.class);
+        this.service.save(templateInfo);
+        return success();
+    }
+
+    @DeleteMapping("/delete/{id}")
+    @ApiOperation("删除-id")
+    public Result delete(@PathVariable String id){
+        templateMusicService.deleteByTemplateId(id);
+        this.service.deleteById(id);
+        return success();
+    }
+
+    @GetMapping("/find/{userId}")
+    @ApiOperation("查询-userId")
+    public Result findByUserId(@PathVariable String userId){
+        List<TemplateInfo> templateInfoList = this.service.findByUserId(userId);
+        return success(templateInfoList);
+    }
+
+
+
+}

+ 34 - 0
src/main/java/com/zzys/lightting/template/rest/TemplateMusicController.java

@@ -0,0 +1,34 @@
+package com.zzys.lightting.template.rest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zzys.lightting.base.rest.BaseController;
+import com.zzys.lightting.template.dao.model.TemplateMusicInfo;
+import com.zzys.lightting.template.service.TemplateMusicService;
+import com.zzys.lightting.utils.Result;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:37
+ * @Description:
+ */
+@Slf4j
+@RestController
+@RequestMapping("/templateMusic")
+@Api(tags = "模板-音乐管理")
+public class TemplateMusicController extends BaseController {
+
+    @Autowired
+    private TemplateMusicService service;
+
+    public Result save(@RequestBody String json){
+        TemplateMusicInfo info = JSONObject.parseObject(json).toJavaObject(TemplateMusicInfo.class);
+        info = this.service.save(info);
+        return success(info);
+    }
+}

+ 10 - 0
src/main/java/com/zzys/lightting/template/service/TemplateMusicService.java

@@ -0,0 +1,10 @@
+package com.zzys.lightting.template.service;
+
+import com.zzys.lightting.template.dao.model.TemplateMusicInfo;
+
+public interface TemplateMusicService {
+    void deleteByTemplateId(String id);
+
+
+    TemplateMusicInfo save(TemplateMusicInfo info);
+}

+ 13 - 0
src/main/java/com/zzys/lightting/template/service/TemplateService.java

@@ -0,0 +1,13 @@
+package com.zzys.lightting.template.service;
+
+import com.zzys.lightting.template.dao.model.TemplateInfo;
+
+import java.util.List;
+
+public interface TemplateService {
+    void save(TemplateInfo templateInfo);
+
+    void deleteById(String id);
+
+    List<TemplateInfo> findByUserId(String userId);
+}

+ 27 - 0
src/main/java/com/zzys/lightting/template/service/impl/TemplateMusicServiceImpl.java

@@ -0,0 +1,27 @@
+package com.zzys.lightting.template.service.impl;
+
+import com.zzys.lightting.template.dao.model.TemplateMusicInfo;
+import com.zzys.lightting.template.dao.repository.TemplateMusicRepository;
+import com.zzys.lightting.template.service.TemplateMusicService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:27
+ * @Description:
+ */
+@Service
+public class TemplateMusicServiceImpl implements TemplateMusicService {
+
+    @Autowired
+    private TemplateMusicRepository repository;
+    @Override
+    public void deleteByTemplateId(String id) {
+        this.repository.deleteByTemplateId(id);
+    }
+    @Override
+    public TemplateMusicInfo save(TemplateMusicInfo info) {
+        return this.repository.save(info);
+    }
+}

+ 34 - 0
src/main/java/com/zzys/lightting/template/service/impl/TemplateServiceImpl.java

@@ -0,0 +1,34 @@
+package com.zzys.lightting.template.service.impl;
+
+import com.zzys.lightting.template.dao.model.TemplateInfo;
+import com.zzys.lightting.template.dao.repository.TemplateRepository;
+import com.zzys.lightting.template.service.TemplateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:16:27
+ * @Description:
+ */
+@Service
+public class TemplateServiceImpl implements TemplateService {
+    @Autowired
+    private TemplateRepository repository;
+    @Override
+    public void save(TemplateInfo templateInfo) {
+        this.repository.save(templateInfo);
+    }
+
+    @Override
+    public void deleteById(String id) {
+        this.repository.deleteById(id);
+    }
+
+    @Override
+    public List<TemplateInfo> findByUserId(String userId) {
+        return this.findByUserId(userId);
+    }
+}

+ 49 - 0
src/main/java/com/zzys/lightting/user/dao/model/UserInfo.java

@@ -0,0 +1,49 @@
+package com.zzys.lightting.user.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.DynamicUpdate;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/22:11:07
+ * @Description:
+ */
+@Entity
+@Data
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_user_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_user_info", comment = "用户信息表")
+@DynamicUpdate
+public class UserInfo extends BaseEntity {
+
+    @ApiModelProperty("手机号")
+    @Column(name = "phone",columnDefinition = "varchar(12) NOT NULL COMMENT '手机号'")
+    private String phone;
+
+    @Column(name = "name",columnDefinition = "varchar(10) NULL COMMENT '昵称'")
+    private String name;
+
+
+    @Column(name = "open_id",columnDefinition = " varchar(50) NULL COMMENT '微信openId'")
+    private String openId;
+
+    @Column(name = "type",columnDefinition = " varchar(10) NULL COMMENT '用户类型 0-普通用户 1-管理端用户'")
+    private String type;
+
+
+    @Column(name = "password",columnDefinition = "varchar(32) COMMENT '密码,管理端用户'")
+    private String password;
+
+    @Transient
+    private String photoPath;
+}

+ 37 - 0
src/main/java/com/zzys/lightting/user/dao/model/UserPhotoInfo.java

@@ -0,0 +1,37 @@
+package com.zzys.lightting.user.dao.model;
+
+import com.zzys.lightting.base.model.BaseEntity;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @Description:用户头像关联表
+ * @Author: mimang
+ * @Date: 2023/4/24
+ */
+@Entity
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Table(name = "lt_user_photo_info")
+@org.hibernate.annotations.Table(appliesTo = "lt_user_photo_info", comment = "用户头像")
+public class UserPhotoInfo extends BaseEntity {
+
+    @Column(name = "path", columnDefinition = "varchar(36)   COMMENT '路径'")
+    private String path;
+
+    @Column(name = "user_id", columnDefinition = "varchar(36)   COMMENT '用户ID'")
+    private String userId;
+
+
+    @Column(name = "create_time", columnDefinition = "varchar(20)   COMMENT '创建时间'")
+    private String createTime;
+
+    @Column(name = "update_time", columnDefinition = "varchar(20)   COMMENT '更新时间'")
+    private String updateTime;
+}

+ 8 - 0
src/main/java/com/zzys/lightting/user/dao/repository/UserPhotoRepository.java

@@ -0,0 +1,8 @@
+package com.zzys.lightting.user.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.user.dao.model.UserPhotoInfo;
+
+public interface UserPhotoRepository extends BaseRepository<UserPhotoInfo,String> {
+    UserPhotoInfo findByUserId(String userId);
+}

+ 10 - 0
src/main/java/com/zzys/lightting/user/dao/repository/UserRepository.java

@@ -0,0 +1,10 @@
+package com.zzys.lightting.user.dao.repository;
+
+import com.zzys.lightting.base.repository.BaseRepository;
+import com.zzys.lightting.user.dao.model.UserInfo;
+
+public interface UserRepository extends BaseRepository<UserInfo,String> {
+    UserInfo findByOpenId(String openid);
+
+    UserInfo findByNameAndPassword(String userName, String password);
+}

+ 145 - 0
src/main/java/com/zzys/lightting/user/rest/UserController.java

@@ -0,0 +1,145 @@
+package com.zzys.lightting.user.rest;
+
+import com.alibaba.fastjson.JSONObject;
+import com.zzys.lightting.base.rest.BaseController;
+import com.zzys.lightting.user.dao.model.UserInfo;
+import com.zzys.lightting.user.dao.model.UserPhotoInfo;
+import com.zzys.lightting.user.service.UserPhotoService;
+import com.zzys.lightting.user.service.UserService;
+import com.zzys.lightting.utils.Constant;
+import com.zzys.lightting.utils.JWTUtil;
+import com.zzys.lightting.utils.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.spec.InvalidParameterSpecException;
+import java.util.Arrays;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/22:11:32
+ * @Description:
+ */
+@Slf4j
+@RestController
+@RequestMapping("/user")
+@Api(tags = "用户管理")
+public class UserController extends BaseController {
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private UserPhotoService userPhotoService;
+
+    @Value("${weixin.appid}")
+    private String appid;
+
+    @Value("${weixin.secret}")
+    private String secret;
+
+    @ApiOperation("快速登录")
+    @PostMapping(value = "/login")
+    public Result login(@RequestBody String json) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidParameterSpecException, BadPaddingException, NoSuchProviderException, InvalidKeyException {
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        String encryptedData = jsonObject.getString("encryptedData");
+        String iv = jsonObject.getString("iv");
+        String code = jsonObject.getString("code");
+        String photoPath = jsonObject.getString("photoPath");
+        String userName = jsonObject.getString("userName");
+        RestTemplate restTemplate = new RestTemplate();
+        UserPhotoInfo userPhotoEntity ;
+        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
+        ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
+        jsonObject = JSONObject.parseObject(responseEntity.getBody());
+        int errcode = jsonObject.getIntValue("errcode");
+        if(errcode == 40029){
+            return fail(null,"临时code无效!");
+        }else if(errcode == 45011){
+            return fail(null,"调用太频繁,请稍后再试!");
+        } else if (errcode == 40226) {
+            return fail(null,"高风险等级用户,小程序登录拦截!");
+        } else if (errcode == -1) {
+            return fail(null,"系统繁忙");
+        }
+        UserInfo userInfo = userService.findByOpenId(jsonObject.getString("openid"));
+        //用户存在
+        if(userInfo != null){
+            userPhotoEntity = userPhotoService.findByUserId(userInfo.getId());
+            if(userPhotoEntity!=null){
+                userPhotoEntity.setPath(photoPath);
+                userInfo.setPhotoPath(photoPath);
+            }
+        }else {//新用户
+            userInfo = new UserInfo();
+            userInfo.setPhone(getPhoneNumber(encryptedData,jsonObject,iv));
+            userInfo.setOpenId(jsonObject.getString("openid"));
+            userInfo.setType(Constant.USER_TYPE_C);
+            userPhotoEntity = new UserPhotoInfo();
+            userPhotoEntity.setPath(photoPath);
+        }
+        userInfo.setName(userName);
+        userInfo = this.userService.save(userInfo);
+        userPhotoEntity.setUserId(userInfo.getId());
+        this.userPhotoService.save(userPhotoEntity);
+        JSONObject resultJson = new JSONObject();
+        resultJson.put("userInfo",userInfo);
+        resultJson.put("userPhoto",userPhotoEntity);
+        resultJson.put("token", JWTUtil.generateToken(userInfo));
+        return success(resultJson,"登录成功");
+    }
+    @ApiOperation(value = "管理端登录",notes = "userName:用户名;password:密码")
+    @PostMapping("/blogin")
+    public Result blogin(@RequestBody String json){
+        JSONObject jsonObject = JSONObject.parseObject(json);
+        UserInfo userInfo = this.userService.login(jsonObject.getString("userName"),jsonObject.getString("password"));
+        if(userInfo == null){
+            return fail("用户名或密码错误");
+        }else {
+            return success(JWTUtil.generateToken(userInfo));
+        }
+    }
+
+    String getPhoneNumber(String encryptedData,JSONObject jsonObject,String iv) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
+        encryptedData = encryptedData.replaceAll(" ","+");
+        byte[] dataByte = org.bouncycastle.util.encoders.Base64.decode(encryptedData);
+        byte[] keyByte = org.bouncycastle.util.encoders.Base64.decode(jsonObject.getString("session_key"));
+        byte[] ivByte = org.bouncycastle.util.encoders.Base64.decode(iv);
+        int base = 16;
+        if(keyByte.length%base!=0){
+            int groups = keyByte.length/base+1;
+            byte[] temp = new byte[groups*base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(keyByte,0,temp,0,keyByte.length);
+            keyByte = temp;
+        }
+        // 初始化
+        Security.addProvider(new BouncyCastleProvider());
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+        SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+        AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+        parameters.init(new IvParameterSpec(ivByte));
+        cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
+        byte[] resultByte = cipher.doFinal(dataByte);
+        if (null != resultByte && resultByte.length > 0) {
+            String result = new String(resultByte, StandardCharsets.UTF_8);
+           return  JSONObject.parseObject(result).getString("phoneNumber");
+        }
+        return null;
+    }
+}

+ 15 - 0
src/main/java/com/zzys/lightting/user/service/UserPhotoService.java

@@ -0,0 +1,15 @@
+package com.zzys.lightting.user.service;
+
+
+import com.zzys.lightting.user.dao.model.UserPhotoInfo;
+
+/**
+ * @Description:用户头像接口
+ * @Author: mimang
+ * @Date: 2023/4/24
+ */
+public interface UserPhotoService {
+    UserPhotoInfo findByUserId(String userId);
+
+    UserPhotoInfo save(UserPhotoInfo entity);
+}

+ 15 - 0
src/main/java/com/zzys/lightting/user/service/UserService.java

@@ -0,0 +1,15 @@
+package com.zzys.lightting.user.service;
+
+import com.zzys.lightting.user.dao.model.UserInfo;
+import com.zzys.lightting.utils.Result;
+
+public interface UserService {
+
+    UserInfo findByOpenId(String openid);
+
+    UserInfo save(UserInfo userInfo);
+
+    UserInfo findById(String userId);
+
+    UserInfo login(String userName, String password);
+}

+ 29 - 0
src/main/java/com/zzys/lightting/user/service/impl/UserPhotoServiceImpl.java

@@ -0,0 +1,29 @@
+package com.zzys.lightting.user.service.impl;
+
+import com.zzys.lightting.user.dao.model.UserPhotoInfo;
+import com.zzys.lightting.user.dao.repository.UserPhotoRepository;
+import com.zzys.lightting.user.service.UserPhotoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/24:09:16
+ * @Description:
+ */
+@Service
+public class UserPhotoServiceImpl implements UserPhotoService {
+    @Autowired
+    private UserPhotoRepository repository;
+
+
+    @Override
+    public UserPhotoInfo findByUserId(String userId) {
+        return this.repository.findByUserId(userId);
+    }
+
+    @Override
+    public UserPhotoInfo save(UserPhotoInfo entity) {
+        return this.repository.save(entity);
+    }
+}

+ 42 - 0
src/main/java/com/zzys/lightting/user/service/impl/UserServiceImpl.java

@@ -0,0 +1,42 @@
+package com.zzys.lightting.user.service.impl;
+
+import com.zzys.lightting.user.dao.model.UserInfo;
+import com.zzys.lightting.user.dao.repository.UserRepository;
+import com.zzys.lightting.user.service.UserPhotoService;
+import com.zzys.lightting.user.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/22:11:34
+ * @Description:
+ */
+@Service
+public class UserServiceImpl implements UserService {
+    @Autowired
+    UserRepository userRepository;
+    @Autowired
+    UserPhotoService userPhotoService;
+ 
+
+    @Override
+    public UserInfo findByOpenId(String openid) {
+        return this.userRepository.findByOpenId(openid);
+    }
+
+    @Override
+    public UserInfo save(UserInfo userInfo) {
+        return this.userRepository.save(userInfo);
+    }
+
+    @Override
+    public UserInfo findById(String userId) {
+        return userRepository.findById(userId).orElse(null);
+    }
+
+    @Override
+    public UserInfo login(String userName, String password) {
+        return this.userRepository.findByNameAndPassword(userName,password);
+    }
+}

+ 11 - 0
src/main/java/com/zzys/lightting/utils/Constant.java

@@ -0,0 +1,11 @@
+package com.zzys.lightting.utils;
+
+/**
+ * @Author:zzf
+ * @Date:2024/5/23:08:50
+ * @Description:
+ */
+public class Constant {
+    public static final String USER_TYPE_C = "0";//C端用户
+    public static final String USER_TYPE_B = "1";//B端用户
+}

+ 28 - 0
src/main/java/com/zzys/lightting/utils/HttpStatus.java

@@ -0,0 +1,28 @@
+package com.zzys.lightting.utils;
+
+
+/**
+ * 状态码
+ * @author zsy
+ */
+public interface HttpStatus {
+    /**
+     * 返回成功
+     */
+    String SUCCESS = "200";
+
+    /**
+     * 运行时返回异常未查询到相应对象时返回或对象已存在时
+     */
+    String RUNTIME_EXCEPTION = "2001";
+
+    /**
+     * 服务器内部错误
+     */
+    String SERVER_EXCEPTION = "500100";
+
+    /**
+     * 输入参数为空
+     */
+    String PARAMETER_ISNULL = "500101";
+}

+ 72 - 0
src/main/java/com/zzys/lightting/utils/JWTUtil.java

@@ -0,0 +1,72 @@
+package com.zzys.lightting.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.zzys.lightting.user.dao.model.UserInfo;
+
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author lpf
+ * @description:
+ * @date 2021/12/2820:18
+ */
+public class JWTUtil {
+
+    //密钥签名
+    private static final String SING = "xVWGEYTPF1hjnFt$HDZ0f^iet^^q@hZv";
+
+    /**
+     * 生成Token header.payload.sing
+     */
+    public static String getToken(Map<String, String> map) {
+
+        Calendar instance = Calendar.getInstance();
+        //5天后过期
+        instance.add(Calendar.DATE, 5);
+        //创建jwtBuilder
+        JWTCreator.Builder builder = JWT.create();
+        //将参数放进去
+        map.forEach(builder::withClaim);
+        String token = builder.withExpiresAt(instance.getTime())//指定过期时间
+                .sign(Algorithm.HMAC256(SING));//添加签名
+        return token;
+    }
+
+    /**
+     * 生成token 外部系统使用,仅两小时有效
+     * @param userInfo
+     * @return
+     */
+    public static String generateToken(UserInfo userInfo){
+        HashMap<String, String> payload = new HashMap<>();
+        payload.put("userPhone", userInfo.getPhone());
+        payload.put("userId", userInfo.getId());
+        payload.put("name", userInfo.getName());
+        payload.put("password",userInfo.getPassword());
+        Calendar instance = Calendar.getInstance();
+        //2小时后过期
+        instance.add(Calendar.HOUR, 2);
+        //创建jwtBuilder
+        JWTCreator.Builder builder = JWT.create();
+        //将参数放进去
+        payload.forEach(builder::withClaim);
+        String token = builder.withExpiresAt(instance.getTime())
+                .sign(Algorithm.HMAC256(SING));
+        return token;
+    }
+
+    /**
+     * 验证token,并获取信息
+     *
+     * @return
+     */
+    public static DecodedJWT verify(String token) {
+        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
+    }
+
+}

+ 62 - 0
src/main/java/com/zzys/lightting/utils/Result.java

@@ -0,0 +1,62 @@
+package com.zzys.lightting.utils;
+
+/**
+ * @author zzf
+ * @description:
+ * @date 2021/1/18 19:27
+ */
+
+public class Result<T> {
+    /**
+     * 状态码
+     */
+    private String code;
+
+    /**
+     * 信息
+     */
+    private String msg;
+
+    /**
+     * 返回数据
+     */
+    private T data;
+
+    public Result(String code, String msg, T data) {
+        this.code = code;
+        this.msg = msg;
+        this.data = data;
+    }
+
+    public Result() {
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+    public Result(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+}

+ 59 - 0
src/main/java/com/zzys/lightting/utils/WechatDecryptDataUtil.java

@@ -0,0 +1,59 @@
+package com.zzys.lightting.utils;
+
+
+import com.alibaba.fastjson.JSONObject;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.AlgorithmParameters;
+import java.security.Security;
+import java.util.Arrays;
+
+/**
+ * @author lpf
+ * @description:
+ * @date 24/10/2021下午4:39
+ */
+public class WechatDecryptDataUtil {
+
+    //解析电话号码
+    public static JSONObject getPhoneNumber(String session_key, String encryptedData, String iv) {
+
+        // 这个是为了前端传过来可能会有转义字符变成空所以替换
+        String s = encryptedData.replaceAll(" ", "+");
+        byte[] dataByte = org.bouncycastle.util.encoders.Base64.decode(s);
+        // 加密秘钥
+        byte[] keyByte = org.bouncycastle.util.encoders.Base64.decode(session_key);
+        // 偏移量
+        byte[] ivByte = org.bouncycastle.util.encoders.Base64.decode(iv);
+        try {
+            // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+            int base = 16;
+            if (keyByte.length % base != 0) {
+                int groups = keyByte.length / base + 1;
+                byte[] temp = new byte[groups * base];
+                Arrays.fill(temp, (byte) 0);
+                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
+                keyByte = temp;
+            }
+            // 初始化
+            Security.addProvider(new BouncyCastleProvider());
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
+            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
+            parameters.init(new IvParameterSpec(ivByte));
+            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
+            byte[] resultByte = cipher.doFinal(dataByte);
+            if (null != resultByte && resultByte.length > 0) {
+                String result = new String(resultByte, StandardCharsets.UTF_8);
+                return JSONObject.parseObject(result);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 24 - 0
src/main/resources/application.properties

@@ -1,3 +1,27 @@
 # 应用服务 WEB 访问端口
 server.port=8080
+server.address=0.0.0.0
+#server.ssl.key-store= classpath:dcbt.jue-ming.com.jks
+#server.ssl.key-store-password=j1jtwul7ly4s
+#server.ssl.key-store-type=JKS
+server.tomcat.connection-timeout=60000
+spring.datasource.url=jdbc:mysql://localhost:3306/light_ting?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
+spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.username=root
+spring.datasource.password=123456
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.jpa.show-sql=true
+spring.jpa.hibernate.ddl-auto=update
+spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
+spring.jpa.properties.hibernate.format_sql = true
+spring.jpa.open-in-view=false
 
+spring.servlet.multipart.enabled=true
+spring.servlet.multipart.file-size-threshold=0
+spring.servlet.multipart.max-file-size= 100MB
+spring.servlet.multipart.max-request-size=1000MB
+
+weixin.appid=wxf9cf2808608b6781
+weixin.secret=ba57e40f25dd0a3a7fa5b12feadf2863
+
+spring.mvc.pathmatch.matching-strategy=ant_path_matcher

+ 0 - 6
src/main/resources/static/index.html

@@ -1,6 +0,0 @@
-<html>
-<body>
-<h1>hello word!!!</h1>
-<p>this is a html page</p>
-</body>
-</html>