Bläddra i källkod

增加话费抽奖记录

xiehui 4 år sedan
förälder
incheckning
2ba4af826e

+ 21 - 0
common-tools/pom.xml

@@ -59,6 +59,27 @@
             <groupId>commons-codec</groupId>
             <artifactId>commons-codec</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-mapper-asl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 5 - 2
common-tools/src/main/java/cn/org/spring/common/cache/Cache.java

@@ -1,6 +1,7 @@
 package cn.org.spring.common.cache;
 
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 public interface Cache {
 
@@ -44,7 +45,9 @@ public interface Cache {
      * @param value
      * @param expiration
      */
-    void set(String key, Object value, Integer expiration);
+    void set(String key, Object value, Long expiration);
+
+    void set(String key, Object value, Long expiration, TimeUnit timeUnit);
 
     /**
      * 返回key所关联的字符串值
@@ -61,7 +64,7 @@ public interface Cache {
      * @param key
      * @param expire
      */
-    Boolean expire(String key, int expire);
+    Boolean expire(String key, Long expire);
 
 
     /**

+ 64 - 0
pom.xml

@@ -31,6 +31,14 @@
         <org.projectlombok.version>1.18.0</org.projectlombok.version>
         <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
         <fastjson.version>1.2.62</fastjson.version>
+        <pagehelper.boot.version>1.3.0</pagehelper.boot.version>
+        <mybatis.version>2.0.1</mybatis.version>
+        <mysql.version>8.0.22</mysql.version>
+        <log4j.version>1.2.17</log4j.version>
+        <druid.version>1.1.22</druid.version>
+        <jackson.version>2.10.0</jackson.version>
+        <jackson.mapper.version>1.9.13</jackson.mapper.version>
+        <joda.version>2.3</joda.version>
     </properties>
 
 
@@ -71,6 +79,62 @@
                 <version>2.6</version>
             </dependency>
 
+            <!-- pagehelper 分页插件 -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.boot.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.mybatis.spring.boot</groupId>
+                <artifactId>mybatis-spring-boot-starter</artifactId>
+                <version>${mybatis.version}</version>
+            </dependency>
+
+            <!-- Mysql驱动包 -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>log4j</groupId>
+                <artifactId>log4j</artifactId>
+                <version>${log4j.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-annotations</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.fasterxml.jackson.core</groupId>
+                <artifactId>jackson-databind</artifactId>
+                <version>${jackson.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.codehaus.jackson</groupId>
+                <artifactId>jackson-mapper-asl</artifactId>
+                <version>${jackson.mapper.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>joda-time</groupId>
+                <artifactId>joda-time</artifactId>
+                <version>${joda.version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 

+ 28 - 0
spring-wechars/pom.xml

@@ -66,6 +66,34 @@
             <version>5.6.5</version>
         </dependency>
 
+        <!-- pagehelper 分页插件 -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!--mybatis-->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- Mysql驱动包 -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>log4j</groupId>
+            <artifactId>log4j</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 2 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/WeCharApplication.java

@@ -1,6 +1,7 @@
 package cn.org.spring.wechar;
 
 
+import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
@@ -13,6 +14,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
  * @Description:
  */
 @SpringBootApplication
+@MapperScan("cn.org.spring.wechar.**.mapper")
 public class WeCharApplication {
     public static void main(String[] args) {
         SpringApplication.run(WeCharApplication.class);

+ 64 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/config/DruidConfig.java

@@ -0,0 +1,64 @@
+package cn.org.spring.wechar.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: 谢辉
+ * @date: 2021/5/19
+ * @email: xieh_mail@163.com
+ * @description:
+ * @modifiedBy:
+ * @version: 1.0
+ */
+
+@Configuration
+public class DruidConfig {
+    //指定加载appliction.yml文件里面的spring.datasource开头的
+    // DruidDataSource类里面的属性与appliction.yml文件里面的spring.datasource开头的对应映射
+    @ConfigurationProperties(prefix = "spring.datasource")
+    @Bean
+    public DataSource druid() {
+        return new DruidDataSource();
+    }
+
+    //配置Druid的监控
+    //1、配置一个管理后台的Servlet
+    @Bean
+    public ServletRegistrationBean statViewServlet() {
+        ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+        Map<String, String> initParams = new HashMap<>();
+
+        initParams.put("loginUsername", "admin");
+        initParams.put("loginPassword", "123456");
+        initParams.put("allow", "");//默认就是允许所有访问
+        initParams.put("deny", "");
+
+        bean.setInitParameters(initParams);
+        return bean;
+    }
+
+
+    //2、配置一个web监控的filter
+    @Bean
+    public FilterRegistrationBean webStatFilter() {
+        FilterRegistrationBean bean = new FilterRegistrationBean();
+        bean.setFilter(new WebStatFilter());
+        Map<String, String> initParams = new HashMap<>();
+        initParams.put("exclusions", "*.js,*.css,/druid/*");
+        bean.setInitParameters(initParams);
+        bean.setUrlPatterns(Arrays.asList("/*"));
+        return bean;
+    }
+}

+ 1 - 1
spring-wechars/src/main/java/cn/org/spring/wechar/config/WebConfig.java

@@ -29,7 +29,7 @@ public class WebConfig implements WebMvcConfigurer {
         InterceptorRegistration registration = registry.addInterceptor(loginUserInterceptor);
         System.out.println("loginUserInterceptor:" + loginUserInterceptor);
         registration.addPathPatterns("/**");
-        registration.excludePathPatterns("/**/weChar","/**/weChar/getCode","/**/index","/**/login","/static/**");
+        registration.excludePathPatterns("/**/weChar","/**/weChar/getCode","/**/index","/**/login","/static/**","/druid/*","/favicon.ico");
     }
 
 

+ 42 - 5
spring-wechars/src/main/java/cn/org/spring/wechar/controller/PrizeController.java

@@ -1,14 +1,22 @@
 package cn.org.spring.wechar.controller;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.org.spring.common.util.StringUtil;
 import cn.org.spring.wechar.bean.Result;
+import cn.org.spring.wechar.utils.CacheUtil;
 import cn.org.spring.wechar.utils.PrizeRandomUtil;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CookieValue;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author: 谢辉
@@ -22,6 +30,9 @@ import java.util.Map;
 @RequestMapping("/v1/prize")
 public class PrizeController {
 
+    @Autowired
+    CacheUtil cacheUtil;
+
     // String 可以为任意类型 也可以自定义类型
     static Map<String, Integer> keyChanceMap = new HashMap<String, Integer>();
 
@@ -39,11 +50,37 @@ public class PrizeController {
      * @return
      */
     @GetMapping("/getTelCharge")
-    public Result getTelCharge() {
-        String result = PrizeRandomUtil.chanceSelect(keyChanceMap);
-        if (StringUtil.isEmpty(result)) {
-            result = "0";
+    public Result getTelCharge(@CookieValue(value = "wechat-token") String userId) {
+        if (StringUtils.isEmpty(userId)) {
+            return Result.fail("获取用户信息失败");
+        }
+        Boolean exists = cacheUtil.exists("lottery:" + userId);
+        if (exists) {
+            return Result.fail("一天只能抽取一次,请您明天再来~~~");
+        } else {
+            String result = PrizeRandomUtil.chanceSelect(keyChanceMap);
+            if (StringUtil.isEmpty(result)) {
+                result = "0";
+            }
+            long currentTime = System.currentTimeMillis();
+            long diff = timeDiff(currentTime);
+            if (diff > 0) {
+                cacheUtil.set("lottery:" + userId, result + ":" + currentTime, diff, TimeUnit.MILLISECONDS);
+            }
+            return Result.ok(result);
         }
-        return Result.ok(result);
+    }
+
+
+    /**
+     * 获取当前时间和当天结束的时间差
+     *
+     * @param currentTimeMillis 单位毫秒
+     * @return 时间差
+     */
+    private long timeDiff(long currentTimeMillis) {
+        DateTime dateTime = DateUtil.endOfDay(new Date());
+        long endDayOfMillis = dateTime.getTime();
+        return (endDayOfMillis - currentTimeMillis);
     }
 }

+ 43 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/prize/entity/RecTelPrize.java

@@ -0,0 +1,43 @@
+package cn.org.spring.wechar.prize.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: 谢辉
+ * @date: 2021/5/19
+ * @email: xieh_mail@163.com
+ * @description:
+ * @modifiedBy:
+ * @version: 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RecTelPrize {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 奖品金额
+     */
+    private BigDecimal money;
+
+    /**
+     * 奖品描述
+     */
+    private String prizedesc;
+
+    /**
+     * 中奖概率
+     */
+    private Long probability;
+}

+ 21 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/prize/entity/RecTelPrizeRecord.java

@@ -0,0 +1,21 @@
+package cn.org.spring.wechar.prize.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author: 谢辉
+ * @date: 2021/5/19
+ * @email: xieh_mail@163.com
+ * @description: 话费抽奖记录表
+ * @modifiedBy:
+ * @version: 1.0
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RecTelPrizeRecord {
+}

+ 15 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/prize/mapper/RecTelPrizeMapper.java

@@ -0,0 +1,15 @@
+package cn.org.spring.wechar.prize.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: 谢辉
+ * @date: 2021/5/19
+ * @email: xieh_mail@163.com
+ * @description: 话费奖品
+ * @modifiedBy:
+ * @version: 1.0
+ */
+@Mapper
+public interface RecTelPrizeMapper {
+}

+ 15 - 0
spring-wechars/src/main/java/cn/org/spring/wechar/prize/mapper/RecTelPrizeRecordMapper.java

@@ -0,0 +1,15 @@
+package cn.org.spring.wechar.prize.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: 谢辉
+ * @date: 2021/5/19
+ * @email: xieh_mail@163.com
+ * @description: 用户话费抽奖记录
+ * @modifiedBy:
+ * @version: 1.0
+ */
+@Mapper
+public interface RecTelPrizeRecordMapper {
+}

+ 7 - 2
spring-wechars/src/main/java/cn/org/spring/wechar/utils/CacheUtil.java

@@ -58,17 +58,22 @@ public class CacheUtil implements Cache {
     }
 
     @Override
-    public void set(String key, Object value, Integer expiration) {
+    public void set(String key, Object value, Long expiration) {
         redisTemplate.opsForValue().set(key, value, expiration, TimeUnit.SECONDS);
     }
 
+    @Override
+    public void set(String key, Object value, Long expiration, TimeUnit timeUnit) {
+        redisTemplate.opsForValue().set(key, value, expiration, timeUnit);
+    }
+
     @Override
     public Object get(String key) {
         return redisTemplate.opsForValue().get(key);
     }
 
     @Override
-    public Boolean expire(String key, int expire) {
+    public Boolean expire(String key, Long expire) {
         return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
     }
 

+ 42 - 0
spring-wechars/src/main/resources/application-druid.yml

@@ -0,0 +1,42 @@
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
+    url: jdbc:mysql://192.168.2.52:3306/recharge?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+    username: root
+    password: root
+    #   数据源其他配置
+    initialSize: 5
+    minIdle: 5
+    maxActive: 20
+    maxWait: 60000
+    timeBetweenEvictionRunsMillis: 60000
+    minEvictableIdleTimeMillis: 300000
+    validationQuery: SELECT 1 FROM DUAL
+    testWhileIdle: true
+    testOnBorrow: false
+    testOnReturn: false
+    poolPreparedStatements: true
+    #   配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
+    filters: stat,wall,log4j
+    maxPoolPreparedStatementPerConnectionSize: 20
+    useGlobalDataSourceStat: true
+    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
+    # 合并多个DruidDataSource的监控数据
+    #useGlobalDataSourceStat: true
+
+# MyBatis配置
+mybatis:
+  # 搜索指定包别名
+  typeAliasesPackage: cn.org.spring.**.entity
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  reasonable: true
+  supportMethodsArguments: true
+  params: count=countSql

+ 2 - 0
spring-wechars/src/main/resources/application.yml

@@ -9,6 +9,8 @@ we-char:
 spring:
   application:
     name: spring-wechar
+  profiles:
+    active: druid
   rabbitmq:
     host: 127.0.0.1
     port: 5672

+ 5 - 0
spring-wechars/src/main/resources/mapper/RecTelPrizeMapper.xml

@@ -0,0 +1,5 @@
+<?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="cn.org.spring.wechar.prize.mapper.RecTelPrizeMapper" >
+
+</mapper>

+ 5 - 0
spring-wechars/src/main/resources/mapper/RecTelPrizeRecordMapper.xml

@@ -0,0 +1,5 @@
+<?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="cn.org.spring.wechar.prize.mapper.RecTelPrizeRecordMapper" >
+
+</mapper>

+ 15 - 0
spring-wechars/src/main/resources/mybatis/mybatis-config.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+	
+	<settings>
+		<setting name="cacheEnabled"             value="true" />  <!-- 全局映射器启用缓存 -->
+		<setting name="useGeneratedKeys"         value="true" />  <!-- 允许 JDBC 支持自动生成主键 -->
+		<setting name="defaultExecutorType"      value="REUSE" /> <!-- 配置默认的执行器 -->
+		<setting name="logImpl"                  value="SLF4J" /> <!-- 指定 MyBatis 所用日志的具体实现 -->
+		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>  驼峰式命名 -->
+	</settings>
+	
+</configuration>