first commit

master
强子烨 4 years ago
parent 2015f480fc
commit 1ab2112eb6
  1. 6
      java/cloud/.gitignore
  2. 20
      java/cloud/api/pom.xml
  3. 15
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/FileApi.java
  4. 19
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/RecordApi.java
  5. 18
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/StockApi.java
  6. 14
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/system/DepartmentApi.java
  7. 14
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/system/ResourceApi.java
  8. 7
      java/cloud/api/src/main/java/cn/toesbieya/jxc/api/system/RoleApi.java
  9. 45
      java/cloud/common/pom.xml
  10. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/config/FastJsonConfigFactory.java
  11. 34
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/config/RedisConfig.java
  12. 12
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/constant/DocConstant.java
  13. 18
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/constant/SessionConstant.java
  14. 23
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/constant/SocketConstant.java
  15. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/enumeration/DataScopeEnum.java
  16. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/enumeration/GeneralStatusEnum.java
  17. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/enumeration/ResourceTypeEnum.java
  18. 7
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/exception/JsonResultException.java
  19. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizDoc.java
  20. 25
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizDocHistory.java
  21. 16
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizDocSub.java
  22. 12
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizPurchaseInbound.java
  23. 12
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizPurchaseInboundSub.java
  24. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizPurchaseOrder.java
  25. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizPurchaseOrderSub.java
  26. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizSellOrder.java
  27. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizSellOrderSub.java
  28. 13
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizSellOutbound.java
  29. 12
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizSellOutboundSub.java
  30. 25
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/BizStock.java
  31. 26
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/Msg.java
  32. 14
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/MsgState.java
  33. 23
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/RecAttachment.java
  34. 23
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/RecLoginHistory.java
  35. 25
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/RecUserAction.java
  36. 14
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/StatFinishOrder.java
  37. 13
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/StatProfitGoods.java
  38. 16
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/StatProfitTotal.java
  39. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysCategory.java
  40. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysCustomer.java
  41. 14
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysDepartment.java
  42. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysRegion.java
  43. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysResource.java
  44. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysRole.java
  45. 19
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysSupplier.java
  46. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/entity/SysUser.java
  47. 9
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/BaseSearch.java
  48. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/DepartmentVo.java
  49. 83
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/R.java
  50. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/ResourceVo.java
  51. 21
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/SocketEventVo.java
  52. 16
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/SocketOfflineVo.java
  53. 17
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/StockOutboundVo.java
  54. 20
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/StockSearch.java
  55. 15
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/StockSearchResult.java
  56. 27
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/model/vo/UserVo.java
  57. 53
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/DateUtil.java
  58. 176
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/RedisUtil.java
  59. 57
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/SessionUtil.java
  60. 29
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/SpringUtil.java
  61. 72
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/Util.java
  62. 36
      java/cloud/common/src/main/java/cn/toesbieya/jxc/common/util/WebSocketUtil.java
  63. 6
      java/cloud/common/src/main/resources/script/increase_and_expire.lua
  64. 42
      java/cloud/gateway/pom.xml
  65. 13
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/GatewayApplication.java
  66. 19
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/config/GatewayConfig.java
  67. 14
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/config/RateConfig.java
  68. 66
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/config/ResourceConfig.java
  69. 138
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/config/RouteConfig.java
  70. 13
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/controller/FallbackController.java
  71. 107
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/filter/SecurityFilter.java
  72. 68
      java/cloud/gateway/src/main/java/cn/toesbieya/jxc/gateway/filter/SentinelFilter.java
  73. 20
      java/cloud/gateway/src/main/resources/bootstrap.yml
  74. 24
      java/cloud/nacos-config/jxc-common-database.yml
  75. 12
      java/cloud/nacos-config/jxc-common-redis.yml
  76. 66
      java/cloud/nacos-config/jxc-gateway.yml
  77. 2
      java/cloud/nacos-config/jxc-web-account.yml
  78. 4
      java/cloud/nacos-config/jxc-web-doc.yml
  79. 11
      java/cloud/nacos-config/jxc-web-file.yml
  80. 4
      java/cloud/nacos-config/jxc-web-message.yml
  81. 2
      java/cloud/nacos-config/jxc-web-record.yml
  82. 2
      java/cloud/nacos-config/jxc-web-statistic.yml
  83. 2
      java/cloud/nacos-config/jxc-web-stock.yml
  84. 4
      java/cloud/nacos-config/jxc-web-system.yml
  85. 6
      java/cloud/nacos-config/jxc-websocket.yml
  86. 151
      java/cloud/pom.xml
  87. 34
      java/cloud/schedule/pom.xml
  88. 16
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/ScheduleApplication.java
  89. 45
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/config/ExecutorConfig.java
  90. 33
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/mapper/StatisticMapper.java
  91. 106
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/task/DocTask.java
  92. 63
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/task/SessionTask.java
  93. 116
      java/cloud/schedule/src/main/java/cn/toesbieya/jxc/schedule/task/StatisticTask.java
  94. 14
      java/cloud/schedule/src/main/resources/bootstrap.yml
  95. 100
      java/cloud/schedule/src/main/resources/mapper/Statistic.xml
  96. 20
      java/cloud/web/file/pom.xml
  97. 11
      java/cloud/web/file/src/main/java/cn/toesbieya/jxc/file/FileApplication.java
  98. 16
      java/cloud/web/file/src/main/java/cn/toesbieya/jxc/file/config/QiniuConfig.java
  99. 45
      java/cloud/web/file/src/main/java/cn/toesbieya/jxc/file/config/QiniuProperty.java
  100. 54
      java/cloud/web/file/src/main/java/cn/toesbieya/jxc/file/config/QiniuTemplate.java
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,6 +0,0 @@
/target/
/.idea/
*.iml
.mvn
mvnw
*.cmd

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jxc</artifactId>
<groupId>cn.toesbieya</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api</artifactId>
<dependencies>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>common</artifactId>
</dependency>
</dependencies>
</project>

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.api;
import java.util.List;
public interface FileApi {
String getToken();
void delete(String key);
void deleteBatch(String... key);
default void deleteBatch(List<String> key) {
deleteBatch(key.toArray(new String[0]));
}
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.api;
import cn.toesbieya.jxc.common.model.entity.RecAttachment;
import cn.toesbieya.jxc.common.model.entity.RecLoginHistory;
import cn.toesbieya.jxc.common.model.entity.RecUserAction;
import java.util.List;
public interface RecordApi {
List<RecAttachment> getAttachmentByPid(String pid);
void handleAttachment(List<RecAttachment> upload, List<String> delete);
void delAttachmentByPid(String pid);
void insertLoginHistory(RecLoginHistory vo);
void insertUserAction(RecUserAction vo);
}

@ -1,18 +0,0 @@
package cn.toesbieya.jxc.api;
import cn.toesbieya.jxc.common.model.entity.BizStock;
import cn.toesbieya.jxc.common.model.vo.StockOutboundVo;
import cn.toesbieya.jxc.common.model.vo.StockSearch;
import cn.toesbieya.jxc.common.model.vo.StockSearchResult;
import java.util.List;
public interface StockApi {
List<StockSearchResult> getByCondition(StockSearch vo);
List<BizStock> getDetail(String cids);
void inbound(List<BizStock> list);
void outbound(List<StockOutboundVo> list);
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.api.system;
import cn.toesbieya.jxc.common.model.entity.SysUser;
import cn.toesbieya.jxc.common.model.vo.DepartmentVo;
import java.util.Set;
public interface DepartmentApi {
//获取用户的数据范围(部门ID集合),返回null说明无需限制
Set<Integer> getUserDataScope(SysUser user);
//获取带有全名的部门
DepartmentVo getById(int id);
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.api.system;
import cn.toesbieya.jxc.common.model.entity.SysResource;
import cn.toesbieya.jxc.common.model.entity.SysRole;
import java.util.List;
public interface ResourceApi {
//获取已启用的数据接口列表
List<SysResource> getEnableApi();
//获取角色的权限列表,包含admin权限
List<SysResource> getResourceByRole(SysRole role);
}

@ -1,7 +0,0 @@
package cn.toesbieya.jxc.api.system;
import cn.toesbieya.jxc.common.model.entity.SysRole;
public interface RoleApi {
SysRole getRoleById(Integer roleId);
}

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jxc</artifactId>
<groupId>cn.toesbieya</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.config;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
public class FastJsonConfigFactory {
public static FastJsonConfig defaultConfig() {
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
SerializerFeature.WriteMapNullValue, // 是否输出值为null的字段
SerializerFeature.WriteDateUseDateFormat,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.DisableCircularReferenceDetect // 禁用循环引用
);
return config;
}
}

@ -1,34 +0,0 @@
package cn.toesbieya.jxc.common.config;
import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
FastJsonRedisSerializer<Object> fastJsonRedisSerializer = new FastJsonRedisSerializer<>(Object.class);
fastJsonRedisSerializer.setFastJsonConfig(FastJsonConfigFactory.defaultConfig());
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置值(value)的序列化采用FastJsonRedisSerializer。
redisTemplate.setValueSerializer(fastJsonRedisSerializer);
redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setDefaultSerializer(fastJsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

@ -1,12 +0,0 @@
package cn.toesbieya.jxc.common.constant;
public interface DocConstant {
//更新单据ID时的redis锁的键
String UPDATE_DOC_LOCK_KEY = "UPDATE_DOC";
//单据ID的redis缓存的键
String DOC_TYPE_REDIS_KEY = "DOC_ID";
//单据类型
String[] DOC_TYPE = {"CGDD", "CGRK", "CGTH", "XSDD", "XSCK", "XSTH"};
}

@ -1,18 +0,0 @@
package cn.toesbieya.jxc.common.constant;
public interface SessionConstant {
//session过期时间,单位秒
long EXPIRE = 3600 * 8;
//存储用户信息的键的前缀
String REDIS_NAMESPACE = "sessions:";
//key过期事件的前缀
String REDIS_EXPIRE_TOPIC_PREFIX = "__keyspace@0__:";
//http headers中token的字段名
String TOKEN_KEY = "X-Token";
//区别无活动用户的时间间隔,单位秒
long NO_ACTION_INTERVAL = 1800;
}

@ -1,23 +0,0 @@
package cn.toesbieya.jxc.common.constant;
public interface SocketConstant {
//web-socket服务端订阅的redis主题名称
String REDIS_EVENT_TOPIC_SEND = "socket-event-send";
//指定用户
int REDIS_EVENT_SPECIFIC = 0;
//广播
int REDIS_EVENT_BROADCAST = 1;
//登出
int REDIS_EVENT_LOGOUT = 2;
//存放于redis中的在线用户的ID集合的键
String REDIS_ONLINE_USER = "socket:online-user";
//存放于redis中的离线用户的离线时间的键
String REDIS_OFFLINE_USER = "socket:offline-user";
//登出事件
String EVENT_LOGOUT = "logout";
//新消息事件
String EVENT_NEW_MESSAGE = "new-message";
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.enumeration;
public enum DataScopeEnum {
ALL(1), SELF(2), SPECIFIC(3);
private final int code;
DataScopeEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.enumeration;
public enum GeneralStatusEnum {
DISABLED(0), ENABLED(1);
private final int code;
GeneralStatusEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.enumeration;
public enum ResourceTypeEnum {
ROOT(0), FOLDER(1), LEAF(2), API(3);
private final int code;
ResourceTypeEnum(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

@ -1,7 +0,0 @@
package cn.toesbieya.jxc.common.exception;
public class JsonResultException extends RuntimeException {
public JsonResultException(String message) {
super(message);
}
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class BizDoc implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private Integer cid;
private String cname;
private Long ctime;
private Integer vid;
private String vname;
private Long vtime;
private Integer status;
private String remark;
}

@ -1,25 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BizDocHistory implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String pid;
private Integer type;
private Integer uid;
private String uname;
private Integer statusBefore;
private Integer statusAfter;
private Long time;
private String info;
}

@ -1,16 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class BizDocSub implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String pid;
private Integer cid;
private String cname;
private BigDecimal num;
}

@ -1,12 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseInbound extends BizDoc {
private String pid;
}

@ -1,12 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseInboundSub extends BizDocSub {
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.math.BigDecimal;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
public class BizPurchaseOrder extends BizDoc {
private Integer sid;
private String sname;
private Integer finish;
private Long ftime;
private BigDecimal total;
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.math.BigDecimal;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizPurchaseOrderSub extends BizDocSub {
private BigDecimal price;
private BigDecimal remainNum;
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.math.BigDecimal;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOrder extends BizDoc {
private Integer customerId;
private String customerName;
private Integer finish;
private Long ftime;
private BigDecimal total;
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.math.BigDecimal;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOrderSub extends BizDocSub {
private BigDecimal price;
private BigDecimal remainNum;
}

@ -1,13 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOutbound extends BizDoc {
private String pid;
}

@ -1,12 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class BizSellOutboundSub extends BizDocSub {
private Integer sid;
}

@ -1,25 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BizStock implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer cid;
private String cname;
private BigDecimal num;
private BigDecimal price;
private Long ctime;
private String cgrkid;
private String cgddid;
}

@ -1,26 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class Msg implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String title;
private String content;
private Integer type;
private Integer cid;
private String cname;
private Long ctime;
private Integer pid;
private String pname;
private Long ptime;
private Integer wid;
private String wname;
private Long wtime;
private Integer status;
private boolean broadcast = false;
private String recipient;
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class MsgState implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer mid;
private Integer uid;
private Long time;
}

@ -1,23 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RecAttachment implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String pid;
private String name;
private Long time;
private Integer sort;
private String url;
private Long size;
}

@ -1,23 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecLoginHistory implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Integer uid;
private String uname;
private String ip;
private String address;
private boolean login = false;
private Long time;
}

@ -1,25 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RecUserAction implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Integer uid;
private String uname;
private String url;
private String ip;
private Long time;
private String action;
private String error;
private boolean success = false;
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class StatFinishOrder implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer purchase;
private Integer sell;
private Long time;
}

@ -1,13 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class StatProfitGoods extends StatProfitTotal {
private Integer cid;
private String cname;
}

@ -1,16 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class StatProfitTotal implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private BigDecimal purchase;
private BigDecimal sell;
private BigDecimal profit;
private Long time;
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysCategory implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer pid;
private String name;
private boolean leaf = false;
private Long ctime;
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysCustomer implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String address;
private String linkman;
private String linkphone;
private String region;
private boolean enable = false;
private Long ctime;
private String remark;
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysDepartment implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer pid;
private String name;
private boolean enable = false;
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysRegion implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String pid;
private String name;
private String fullname;
private int level;
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysResource implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer pid;
private Integer type;
private String name;
private String path;
private String component;
private String meta;
private boolean admin = false;
private boolean enable = true;
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import cn.toesbieya.jxc.common.enumeration.DataScopeEnum;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysRole implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private Integer cid;
private String cname;
private Long ctime;
private boolean enable = false;
private int scope = DataScopeEnum.ALL.getCode();
private String departmentId;
private String resourceId;
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysSupplier implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private String address;
private String linkman;
private String linkphone;
private String region;
private boolean enable = false;
private Long ctime;
private String remark;
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class SysUser implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String loginName;
private String nickName;
private String pwd;
private Integer role;
private String avatar;
private Long ctime;
private boolean admin = false;
private boolean enable = false;
private Integer dept;
}

@ -1,9 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.Data;
@Data
public class BaseSearch {
private Integer page;
private Integer pageSize;
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import cn.toesbieya.jxc.common.model.entity.SysDepartment;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class DepartmentVo extends SysDepartment {
String fullname;
public DepartmentVo(SysDepartment parent) {
BeanUtils.copyProperties(parent, this);
}
}

@ -1,83 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class R implements Serializable {
private static final long serialVersionUID = 1L;
//返回码,200表示成功,其他表示失败
private int status;
//返回的信息
private String msg;
//返回的数据
private Object data;
public R(int status) {
this.status = status;
}
public R(int status, String msg) {
this.status = status;
this.msg = msg;
}
public R(int status, Object data) {
this.status = status;
this.data = data;
}
public static R success() {
return new R(200);
}
public static R success(String msg) {
return new R(200, msg);
}
public static R success(Object data) {
return new R(200, data);
}
public static R success(String msg, Object data) {
return new R(200, msg, data);
}
public static R fail(String msg) {
return new R(500, msg);
}
public static R notfound() {
return new R(404, "请求地址不存在");
}
public static R requireLogin() {
return new R(401, "请登录后重试");
}
public static R noPermission() {
return new R(403, "没有权限进行该操作");
}
public static R overload() {
return new R(503, "当前请求的人数过多,请稍后重试");
}
public static R tooManyRequest() {
return new R(429, "操作过于频繁,请稍后重试");
}
public boolean isSuccess() {
return this.status == 200;
}
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import cn.toesbieya.jxc.common.model.entity.SysResource;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class ResourceVo extends SysResource {
private String fullname;
public ResourceVo(SysResource parent) {
BeanUtils.copyProperties(parent, this);
}
}

@ -1,21 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import cn.toesbieya.jxc.common.constant.SocketConstant;
import lombok.Data;
import java.util.List;
@Data
public class SocketEventVo {
//事件类型
private int type = SocketConstant.REDIS_EVENT_SPECIFIC;
//事件名称
private String event;
//发送对象的id集合
private List<Integer> to;
//数据包
private Object data;
}

@ -1,16 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SocketOfflineVo {
//用户ID
private Integer uid;
//断开时间
private Long time;
}

@ -1,17 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class StockOutboundVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private BigDecimal num;
}

@ -1,20 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class StockSearch extends BaseSearch implements Serializable {
private static final long serialVersionUID = 1L;
private String ids;
private String cids;
private Long startTime;
private Long endTime;
private String cgddids;
private String cgrkids;
}

@ -1,15 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
@Data
public class StockSearchResult implements Serializable {
private static final long serialVersionUID = 1L;
private Integer cid;
private String cname;
private BigDecimal totalNum;
private BigDecimal totalPrice;
}

@ -1,27 +0,0 @@
package cn.toesbieya.jxc.common.model.vo;
import cn.toesbieya.jxc.common.model.entity.SysUser;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.beans.BeanUtils;
import java.util.Set;
@Data
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class UserVo extends SysUser {
private String token;
private String roleName;
private String deptName;
private boolean online = false;
private Set<Integer> departmentIds;
private Set<Integer> resourceIds;
public UserVo(SysUser parent) {
BeanUtils.copyProperties(parent, this);
}
}

@ -1,53 +0,0 @@
package cn.toesbieya.jxc.common.util;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
public class DateUtil {
public static final DateTimeFormatter defaultFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String dateFormat() {
return dateFormat(null, null);
}
public static String dateFormat(Long time) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(time), ZoneId.systemDefault());
return dateFormat(localDateTime, null);
}
public static String dateFormat(LocalDateTime time) {
return dateFormat(time, null);
}
public static String dateFormat(DateTimeFormatter formatter) {
return dateFormat(null, formatter);
}
public static String dateFormat(LocalDateTime time, DateTimeFormatter formatter) {
LocalDateTime t = time == null ? LocalDateTime.now() : time;
DateTimeFormatter f = formatter == null ? defaultFormatter : formatter;
return t.format(f);
}
//获取今日零点的时间戳
public static long getTimestampNow() {
long currentTimestamps = System.currentTimeMillis();
return currentTimestamps - (currentTimestamps + 60 * 60 * 8 * 1000) % (60 * 60 * 24 * 1000);
}
//获取n天前零点的时间戳
public static long getTimestampBeforeNow(int before) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DATE, -before);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime().getTime();
}
}

@ -1,176 +0,0 @@
package cn.toesbieya.jxc.common.util;
import com.google.common.io.ByteStreams;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import java.io.Closeable;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class RedisUtil {
private static String INCREMENT_AND_EXPIRE_SCRIPT;
private static RedisTemplate<String, Object> redisTemplate;
private static StringRedisTemplate stringRedisTemplate;
static {
try {
INCREMENT_AND_EXPIRE_SCRIPT = new String(ByteStreams.toByteArray(new ClassPathResource("/script/increase_and_expire.lua").getInputStream()));
}
catch (IOException e) {
e.printStackTrace();
}
}
@Autowired
public RedisUtil(RedisTemplate<String, Object> redisTemplate, StringRedisTemplate stringRedisTemplate) {
RedisUtil.redisTemplate = redisTemplate;
RedisUtil.stringRedisTemplate = stringRedisTemplate;
}
public static Set<String> keys(String match) {
return redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> result = new HashSet<>();
Cursor<byte[]> cursor =
connection.scan(
new ScanOptions
.ScanOptionsBuilder()
.match(match)
.count(2000)
.build()
);
while (cursor.hasNext()) {
result.add(new String(cursor.next()));
}
return result;
});
}
public static boolean exist(String key) {
Boolean result = redisTemplate.hasKey(key);
return result != null && result;
}
public static void del(String... keys) {
redisTemplate.delete(Arrays.asList(keys));
}
public static long incrAndExpire(String key, int time) {
RedisScript<Long> redisScript = new DefaultRedisScript<>(INCREMENT_AND_EXPIRE_SCRIPT, Long.class);
Long result = redisTemplate.execute(redisScript, Collections.singletonList(key), time);
return result == null ? 0 : result;
}
public static Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public static void set(String key, Object value) {
redisTemplate.opsForValue().set(key, value);
}
public static void set(String key, Object value, long expire) {
redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
}
public static Object hget(String key, String field) {
return redisTemplate.opsForHash().get(key, field);
}
public static Map<Object, Object> hgetAll(String key) {
return redisTemplate.opsForHash().entries(key);
}
public static void hset(String key, String field, Object value) {
redisTemplate.opsForHash().put(key, field, value);
}
public static void hdel(String key, Object... fields) {
redisTemplate.opsForHash().delete(key, fields);
}
public static List<Object> hmget(String key, String... field) {
return redisTemplate.opsForHash().multiGet(key, Arrays.asList(field));
}
public static void hmset(String key, Map<String, Object> map) {
redisTemplate.opsForHash().putAll(key, map);
}
public static long sadd(String key, Object... members) {
Long result = redisTemplate.opsForSet().add(key, members);
return result == null ? 0 : result;
}
public static void srem(String key, Object... members) {
redisTemplate.opsForSet().remove(key, members);
}
public static long scard(String key) {
Long result = redisTemplate.opsForSet().size(key);
return result == null ? 0 : result;
}
public static Set<Object> smembers(String key) {
Set<Object> result = redisTemplate.opsForSet().members(key);
return result == null ? Collections.emptySet() : result;
}
public static <T> T execute(RedisScript<T> script, List<String> keys, Object... args) {
return redisTemplate.execute(script, keys, args);
}
public static RedisTemplate<String, Object> getRedisTemplate() {
return redisTemplate;
}
public static StringRedisTemplate getStringRedisTemplate() {
return stringRedisTemplate;
}
public static class Locker implements Closeable {
private final String key;
private final String value;
private final long expire;
public Locker(String key) {
this.key = "lock:" + key;
this.value = String.valueOf(System.currentTimeMillis());
this.expire = 300;
}
@Override
public void close() {
this.unlock();
}
public boolean lock() {
String LOCK_LUA_SCRIPT = "return redis.call('set',KEYS[1],ARGV[1],'EX',ARGV[2],'NX')";
RedisScript<Boolean> redisScript = new DefaultRedisScript<>(LOCK_LUA_SCRIPT, Boolean.class);
Boolean result = redisTemplate.execute(redisScript, Collections.singletonList(key), value, expire);
return result != null;
}
public void unlock() {
String UNLOCK_LUA_SCRIPT = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return false end";
RedisScript<Boolean> redisScript = new DefaultRedisScript<>(UNLOCK_LUA_SCRIPT, Boolean.class);
Boolean result = redisTemplate.execute(redisScript, Collections.singletonList(key), value);
if (result == null || !result) {
log.error("redis锁释放失败,key:{},value:{}", key, value);
}
}
}
}

@ -1,57 +0,0 @@
package cn.toesbieya.jxc.common.util;
import cn.toesbieya.jxc.common.model.entity.SysUser;
import cn.toesbieya.jxc.common.model.vo.UserVo;
import com.alibaba.fastjson.JSONObject;
import cn.toesbieya.jxc.common.constant.SessionConstant;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class SessionUtil {
//token中的连接符
private static final String tokenSeparator = "-*-";
public static void remove(String token) {
if (StringUtils.isEmpty(token)) return;
RedisUtil.del(SessionConstant.REDIS_NAMESPACE + token);
}
public static void save(UserVo user) {
String token = user.getToken();
if (StringUtils.isEmpty(token)) return;
RedisUtil.set(SessionConstant.REDIS_NAMESPACE + token, user, SessionConstant.EXPIRE);
}
public static UserVo get(String token) {
if (StringUtils.isEmpty(token)) return null;
JSONObject o = (JSONObject) RedisUtil.get(SessionConstant.REDIS_NAMESPACE + token);
if (o == null) return null;
return JSONObject.toJavaObject(o, UserVo.class);
}
public static UserVo get(HttpServletRequest request) {
String token = request.getHeader(SessionConstant.TOKEN_KEY);
return get(token);
}
public static String generateToken(SysUser user) {
return user.getId() + tokenSeparator + Util.UUID();
}
public static Integer getUidFromToken(String token) {
if (StringUtils.isEmpty(token)) {
return null;
}
String[] arr = token.split(tokenSeparator);
return arr.length > 1 ? Integer.valueOf(arr[0]) : null;
}
}

@ -1,29 +0,0 @@
package cn.toesbieya.jxc.common.util;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.util.StringUtils;
public class SpringUtil {
private static final ExpressionParser parser = new SpelExpressionParser();
/**
* el表达式解析
*
* @param el 表达式
* @param names 参数名称数组
* @param args 参数数组
*/
public static Object spell(String el, String[] names, Object[] args) {
if (StringUtils.isEmpty(el)) {
return null;
}
EvaluationContext context = new StandardEvaluationContext();
for (int i = 0; i < args.length; i++) {
context.setVariable(names[i], args[i]);
}
return parser.parseExpression(el).getValue(context);
}
}

@ -1,72 +0,0 @@
package cn.toesbieya.jxc.common.util;
import org.springframework.util.StringUtils;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class Util {
public static String UUID() {
return UUID.randomUUID().toString();
}
public static List<Integer> str2List(String string) {
if (StringUtils.isEmpty(string)) {
return Collections.emptyList();
}
return Arrays.stream(string.split(","))
.map(i -> Integer.parseInt(i.trim()))
.collect(Collectors.toList());
}
public static String str2Hex(String s) {
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
}
return new String(baKeyword, StandardCharsets.ISO_8859_1);
}
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-+]?[\\d]*$");
return pattern.matcher(str).matches();
}
public static String exception2Str(Exception e) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
printWriter.close();
return stringWriter.toString();
}
public static <T> T find(Iterable<T> list, Predicate<T> predicate) {
for (T t : list) {
if (predicate.test(t)) return t;
}
return null;
}
public static <T> int findIndex(Iterable<T> list, Predicate<T> predicate) {
int i = -1;
if (list == null) return i;
for (T t : list) {
i++;
if (predicate.test(t)) return i;
}
return -1;
}
public static <T> boolean some(Iterable<T> list, Predicate<T> predicate) {
int index = findIndex(list, predicate);
return index > -1;
}
}

@ -1,36 +0,0 @@
package cn.toesbieya.jxc.common.util;
import cn.toesbieya.jxc.common.model.vo.SocketEventVo;
import cn.toesbieya.jxc.common.constant.SocketConstant;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class WebSocketUtil {
//获取在线用户的总数
public static long getOnlineUserNum() {
return RedisUtil.scard(SocketConstant.REDIS_ONLINE_USER);
}
//获取所有在线用户的id集合
public static Set<Integer> getOnlineUserIds() {
Set<Object> result = RedisUtil.smembers(SocketConstant.REDIS_ONLINE_USER);
return result.stream().map(e -> (Integer) e).collect(Collectors.toSet());
}
//发送消息
public static void sendEvent(SocketEventVo vo) {
RedisUtil.getRedisTemplate().convertAndSend(SocketConstant.REDIS_EVENT_TOPIC_SEND, vo);
}
//登出
public static void sendLogoutEvent(List<Integer> to, String msg) {
SocketEventVo vo = new SocketEventVo();
vo.setEvent(SocketConstant.EVENT_LOGOUT);
vo.setTo(to);
vo.setData(msg);
sendEvent(vo);
}
}

@ -1,6 +0,0 @@
local current
current = redis.call("incr", KEYS[1])
if tonumber(current) == 1 then
redis.call("expire", KEYS[1], ARGV[1])
end
return current

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jxc</artifactId>
<groupId>cn.toesbieya</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gateway</artifactId>
<dependencies>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>common</artifactId>
</dependency>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>-->
</dependencies>
</project>

@ -1,13 +0,0 @@
package cn.toesbieya.jxc.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication(scanBasePackages = "cn.toesbieya.jxc")
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}

@ -1,19 +0,0 @@
package cn.toesbieya.jxc.gateway.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.Set;
@Component
@ConfigurationProperties("spring.cloud.gateway")
@Data
public class GatewayConfig {
private Set<String> whitelist = new HashSet<>();
private String dataId = "jxc-gateway.yml";
private String group = "DEFAULT_GROUP";
}

@ -1,14 +0,0 @@
package cn.toesbieya.jxc.gateway.config;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;
@Configuration
public class RateConfig {
@Bean
public KeyResolver urlKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().value());
}
}

@ -1,66 +0,0 @@
package cn.toesbieya.jxc.gateway.config;
import cn.toesbieya.jxc.api.system.ResourceApi;
import cn.toesbieya.jxc.common.model.entity.SysResource;
import cn.toesbieya.jxc.common.model.vo.UserVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Slf4j
public class ResourceConfig implements CommandLineRunner {
private final static ConcurrentHashMap<String, SysResource> urlMap = new ConcurrentHashMap<>(256);
private final static ConcurrentHashMap<String, SysResource> adminUrlMap = new ConcurrentHashMap<>(16);
@Reference
private ResourceApi resourceApi;
public static boolean authority(UserVo user, String url) {
boolean isAdmin = user.isAdmin();
SysResource r = adminUrlMap.get(url);
//访问admin权限的资源时,需要用户是admin并且该权限已启用
if (r != null) {
return r.isEnable() && isAdmin;
}
if (isAdmin) return true;
r = urlMap.get(url);
//权限表中无记录的资源放行
if (r == null) return true;
//未启用时拦截
if (!r.isEnable()) return false;
//根据用户权限判断
Set<Integer> ids = user.getResourceIds();
return ids != null && ids.contains(r.getId());
}
@Override
public void run(String... args) {
Instant start = Instant.now();
List<SysResource> resources = resourceApi.getEnableApi();
for (SysResource p : resources) {
String path = p.getPath();
if (p.isAdmin()) {
adminUrlMap.put(path, p);
}
else urlMap.put(path, p);
}
Instant end = Instant.now();
log.info("权限资源加载完成,耗时:{}毫秒", ChronoUnit.MILLIS.between(start, end));
}
}

@ -1,138 +0,0 @@
package cn.toesbieya.jxc.gateway.config;
import cn.toesbieya.jxc.gateway.filter.SecurityFilter;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Component;
import org.yaml.snakeyaml.Yaml;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.stream.Collectors;
@Component
@Slf4j
public class RouteConfig implements ApplicationEventPublisherAware {
@Value("${spring.cloud.nacos.config.server-addr}")
private String NACOS_SERVER_ADDR;
private GatewayConfig config;
private RouteDefinitionWriter writer;
private ApplicationEventPublisher publisher;
@PostConstruct
public void addListener() throws NacosException {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, NACOS_SERVER_ADDR);
ConfigService configService = NacosFactory.createConfigService(properties);
configService.addListener(config.getDataId(), config.getGroup(), new Listener() {
@Override
public Executor getExecutor() {
return null;
}
@Override
@SuppressWarnings("unchecked")
public void receiveConfigInfo(String configInfo) {
Yaml yaml = new Yaml();
Map<String, Object> config = yaml.load(configInfo);
config = (Map<String, Object>) config.get("spring");
config = (Map<String, Object>) config.get("cloud");
config = (Map<String, Object>) config.get("gateway");
SecurityFilter.updateWhitelist((List<String>) config.get("whitelist"));
List<Map<String, Object>> routes = (List<Map<String, Object>>) config.get("routes");
if (routes == null) return;
List<RouteDefinition> list =
routes
.stream()
.map(map -> {
RouteDefinition route = new RouteDefinition();
route.setId((String) map.get("id"));
route.setUri(URI.create((String) map.get("uri")));
List<String> predicates = (List<String>) map.get("predicates");
if (predicates != null) {
route.setPredicates(
predicates
.stream()
.map(PredicateDefinition::new)
.collect(Collectors.toList())
);
}
List<String> filters = (List<String>) map.get("filters");
if (filters != null) {
route.setFilters(
filters
.stream()
.map(FilterDefinition::new)
.collect(Collectors.toList())
);
}
return route;
})
.collect(Collectors.toList());
update(list);
//SentinelFilter.registerRules(list);
}
});
}
private void update(List<RouteDefinition> routes) {
if (routes == null) return;
routes.forEach(route -> {
this.writer.delete(Mono.just(route.getId()));
writer.save(Mono.just(route)).subscribe();
});
this.publisher.publishEvent(new RefreshRoutesEvent(this));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
@Autowired
public void setWriter(RouteDefinitionWriter writer) {
this.writer = writer;
}
@Autowired
public void setGatewayProperties(GatewayConfig config) {
this.config = config;
}
}

@ -1,13 +0,0 @@
package cn.toesbieya.jxc.gateway.controller;
import cn.toesbieya.jxc.common.model.vo.R;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
public class FallbackController {
@RequestMapping("fallback")
@ResponseBody
public R fallback() {
return R.fail("服务异常");
}
}

@ -1,107 +0,0 @@
package cn.toesbieya.jxc.gateway.filter;
import cn.toesbieya.jxc.common.model.vo.R;
import cn.toesbieya.jxc.common.model.vo.UserVo;
import cn.toesbieya.jxc.gateway.config.GatewayConfig;
import cn.toesbieya.jxc.gateway.config.ResourceConfig;
import com.alibaba.fastjson.JSON;
import cn.toesbieya.jxc.common.constant.SessionConstant;
import cn.toesbieya.jxc.common.util.SessionUtil;
import cn.toesbieya.jxc.common.util.Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.PathContainer;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.util.pattern.PathPattern;
import org.springframework.web.util.pattern.PathPatternParser;
import reactor.core.publisher.Mono;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import static org.springframework.http.server.PathContainer.parsePath;
@Component
@Slf4j
public class SecurityFilter {
private GatewayConfig gatewayConfig;
private static final PathPatternParser pathPatternParser = new PathPatternParser();
private static List<PathPattern> whitelistPatterns = new ArrayList<>();
@Bean
@Order(-1)
public GlobalFilter globalFilter() {
updateWhitelist(gatewayConfig.getWhitelist());
return ((exchange, chain) -> {
String requestUrl = exchange.getRequest().getURI().getPath();
PathContainer path = parsePath(requestUrl);
//放行白名单内的url
if (Util.some(whitelistPatterns, pattern -> pattern.matches(path))) {
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
String token = exchange.getRequest().getHeaders().getFirst(SessionConstant.TOKEN_KEY);
UserVo user = SessionUtil.get(token);
//未登录
if (user == null) {
return responseJSON(response, R.requireLogin());
}
//没有权限
if (!ResourceConfig.authority(user, requestUrl)) {
log.warn("权限拦截,访问路径:{},用户:{}", requestUrl, user.getNickName());
return responseJSON(response, R.noPermission());
}
return chain.filter(exchange);
});
}
private Mono<Void> responseJSON(ServerHttpResponse response, R result) {
byte[] bytes = JSON.toJSONString(result).getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bytes);
response.setStatusCode(HttpStatus.OK);
response.getHeaders().add("Content-Type", "application/json; charset=utf-8");
return response.writeWith(Mono.just(buffer));
}
public static void updateWhitelist(Collection<String> list) {
if (list == null) {
whitelistPatterns = new ArrayList<>();
return;
}
whitelistPatterns =
list
.stream()
.map(pathPatternParser::parse)
.collect(Collectors.toList());
}
@Autowired
public void setGatewayProperties(GatewayConfig gatewayConfig) {
this.gatewayConfig = gatewayConfig;
}
}

@ -1,68 +0,0 @@
package cn.toesbieya.jxc.gateway.filter;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SentinelFilter {
/*private GatewayProperties gatewayProperties;
private final List<ViewResolver> viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
public SentinelFilter(ObjectProvider<List<ViewResolver>> viewResolversProvider,
ServerCodecConfigurer serverCodecConfigurer) {
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public GlobalFilter sentinelGatewayFilter() {
return new SentinelGatewayFilter();
}
@PostConstruct
public void init() {
registerRules(gatewayProperties.getRoutes());
GatewayCallbackManager.setBlockHandler(
(exchange, t) ->
ServerResponse
.status(HttpStatus.OK)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.body(fromObject(R.tooManyRequest()))
);
}
public static void registerRules(List<RouteDefinition> routes) {
Set<GatewayFlowRule> rules = new HashSet<>();
routes.forEach(route -> {
String id = route.getId();
rules.add(new GatewayFlowRule(id).setCount(100));
rules.add(
new GatewayFlowRule(id)
.setCount(1)
.setParamItem(
new GatewayParamFlowItem()
.setParseStrategy(SentinelGatewayConstants.PARAM_PARSE_STRATEGY_CLIENT_IP)
)
);
});
GatewayRuleManager.register2Property(new DynamicSentinelProperty<>(rules));
}
@Autowired
public void setGatewayProperties(GatewayProperties gatewayProperties) {
this.gatewayProperties = gatewayProperties;
}*/
}

@ -1,20 +0,0 @@
spring:
application:
name: jxc-gateway
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
shared-configs:
- data-id: jxc-common-redis.yml
file-extension: yml
discovery:
server-addr: 127.0.0.1:8848
dubbo:
registry:
address: nacos://127.0.0.1:8848
cloud:
subscribed-services: jxc-web-system

@ -1,24 +0,0 @@
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/repo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
username:
password:
mybatis-plus:
mapper-locations:
- classpath*:/mapper/**/*.xml
configuration:
local-cache-scope: STATEMENT
cache-enabled: false
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: false
db-config:
id-type: NONE
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql

@ -1,12 +0,0 @@
spring:
redis:
host: localhost
port: 6379
password:
timeout: 3000
lettuce:
pool:
max-idle: 500
min-idle: 50
max-active: 2000
max-wait: 1000

@ -1,66 +0,0 @@
server:
port: 8081
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lowerCaseServiceId: true
default-filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒处理多少个请求
redis-rate-limiter.burstCapacity: 20 # 一秒钟内完成的最大请求数
key-resolver: #{@urlKeyResolver}
routes:
- id: jxc-web-account
uri: lb://jxc-web-account
predicates:
- Path=/account/**
- id: jxc-web-doc
uri: lb://jxc-web-doc
predicates:
- Path=/doc/**
- id: jxc-web-file
uri: lb://jxc-web-file
predicates:
- Path=/file/**
- id: jxc-web-message
uri: lb://jxc-web-message
predicates:
- Path=/message/**
- id: jxc-web-record
uri: lb://jxc-web-record
predicates:
- Path=/record/**
- id: jxc-web-statistic
uri: lb://jxc-web-statistic
predicates:
- Path=/statistic/**
- id: jxc-web-stock
uri: lb://jxc-web-stock
predicates:
- Path=/stock/**
- id: jxc-web-system
uri: lb://jxc-web-system
predicates:
- Path=/system/**
whitelist:
- /test/**
- /account/login
- /account/logout
- /account/register
- /account/checkLoginName
- /account/checkNickName

@ -1,4 +0,0 @@
server:
port: 8001
servlet:
context-path: /doc

@ -1,11 +0,0 @@
server:
port: 8002
qiniu:
access-key:
secret-key:
bucket:
#七牛的临时上传凭证的有效期,单位秒
token-expires: 3600
#七牛的临时上传凭证的redis键名
redis-cache-key: qiniu-token

@ -1,4 +0,0 @@
server:
port: 8003
servlet:
context-path: /message

@ -1,4 +0,0 @@
server:
port: 8007
servlet:
context-path: /system

@ -1,6 +0,0 @@
socket:
#hostname: 172.24.52.184
hostname: localhost
port: 12580
max-frame-payload-length: 1048576
max-http-content-length: 1048576

@ -1,151 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>gateway</module>
<module>web</module>
<module>websocket</module>
<module>schedule</module>
<module>api</module>
</modules>
<groupId>cn.toesbieya</groupId>
<artifactId>jxc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>jxc</name>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<mybatis-plus.version>3.3.2</mybatis-plus.version>
<pagehelper.version>1.2.12</pagehelper.version>
<socketio.version>1.7.18</socketio.version>
<guava.version>29.0-jre</guava.version>
<fastjson.version>1.2.60</fastjson.version>
<qiniu.version>[7.2.0, 7.2.99]</qiniu.version>
<easyexcel.version>2.2.5</easyexcel.version>
</properties>
<dependencies>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--基础模块-->
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>web-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>api</artifactId>
<version>${project.version}</version>
</dependency>
<!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>-->
<!--SpringCloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!--websocket-->
<dependency>
<groupId>com.corundumstudio.socketio</groupId>
<artifactId>netty-socketio</artifactId>
<version>${socketio.version}</version>
</dependency>
<!--工具类-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>${qiniu.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

@ -1,34 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>jxc</artifactId>
<groupId>cn.toesbieya</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>shedule</artifactId>
<dependencies>
<dependency>
<groupId>cn.toesbieya</groupId>
<artifactId>common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
</dependencies>
</project>

@ -1,16 +0,0 @@
package cn.toesbieya.jxc.schedule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication(scanBasePackages = "cn.toesbieya.jxc")
@MapperScan("cn.toesbieya.jxc.schedule.mapper")
public class ScheduleApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(ScheduleApplication.class)
.web(WebApplicationType.NONE)
.run(args);
}
}

@ -1,45 +0,0 @@
package cn.toesbieya.jxc.schedule.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
@Slf4j
public class ExecutorConfig implements AsyncConfigurer {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (ex, method, params) -> {
log.error("异步线程执行失败。方法:[{}],异常信息[{}] : ", method, ex.getMessage(), ex);
};
}
//定时任务线程池
@Bean
public Executor scheduledExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
//核心线程数
threadPoolTaskExecutor.setCorePoolSize(3);
//是否回收空闲线程
threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);
//最大线程数
threadPoolTaskExecutor.setMaxPoolSize(5);
//配置等待队列大小
threadPoolTaskExecutor.setQueueCapacity(2);
//配置线程池前缀
threadPoolTaskExecutor.setThreadNamePrefix("scheduled-");
//拒绝策略
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
threadPoolTaskExecutor.initialize();
return threadPoolTaskExecutor;
}
}

@ -1,33 +0,0 @@
package cn.toesbieya.jxc.schedule.mapper;
import cn.toesbieya.jxc.common.model.entity.StatFinishOrder;
import cn.toesbieya.jxc.common.model.entity.StatProfitGoods;
import cn.toesbieya.jxc.common.model.entity.StatProfitTotal;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.util.List;
public interface StatisticMapper {
boolean checkDailyFinishOrderExist(@Param("time") long time);
boolean checkDailyProfitExist(@Param("time") long time);
int insertFinishOrder(StatFinishOrder param);
int insertProfitTotal(StatProfitTotal param);
int insertProfitGoodsBatch(@Param("list") List<StatProfitGoods> list);
BigDecimal getPurchaseOrderDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> getPurchaseOrderDailyProfitGoods(@Param("start") long start, @Param("end") long end);
Integer getPurchaseOrderLastDayFinishOrderNum();
BigDecimal getSellOrderDailyTotalPurchasePrice(@Param("start") Long start, @Param("end") Long end);
List<StatProfitGoods> getSellOrderDailyProfitGoods(@Param("start") long start, @Param("end") long end);
Integer getSellOrderLastDayFinishOrderNum();
}

@ -1,106 +0,0 @@
package cn.toesbieya.jxc.schedule.task;
import cn.toesbieya.jxc.common.constant.DocConstant;
import cn.toesbieya.jxc.common.util.DateUtil;
import cn.toesbieya.jxc.common.util.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.DependsOn;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
@DependsOn("redisUtil")
public class DocTask implements CommandLineRunner {
@Override
public void run(String... args) {
template("初始化单据ID", 0);
}
//每天零点重置单据ID的值
@Async("scheduledExecutor")
@Scheduled(cron = "1 0 0 */1 * ?")
public void autoRefreshDocId() {
template("定时更新单据ID", 1);
}
//启动时初始化单据ID
private void initDocId() {
String[] fields = new String[DocConstant.DOC_TYPE.length + 1];
fields[0] = "date";
System.arraycopy(DocConstant.DOC_TYPE, 0, fields, 1, fields.length - 1);
List<Object> result = RedisUtil.hmget(DocConstant.DOC_TYPE_REDIS_KEY, fields);
long now = DateUtil.getTimestampNow();
//日期不是今天时,更新全部
Object firstItem = result.get(0);
if (null == firstItem || now != (long) firstItem) {
updateAllDoc(now);
log.info("更新【{}】种单据ID成功", DocConstant.DOC_TYPE.length);
return;
}
//判断是否有新增的单据类型,有则更新
int updateNum = 0;
Map<String, Object> update = new HashMap<>();
int resultSize = result.size();
for (int i = 1; i < resultSize; i++) {
if (result.get(i) == null) {
updateNum++;
update.put(DocConstant.DOC_TYPE[i - 1], 1);
}
}
if (updateNum > 0) {
RedisUtil.hmset(DocConstant.DOC_TYPE_REDIS_KEY, update);
log.info("更新增加的单据【{}】种", updateNum);
}
}
//每种单据的值置为1
private void updateAllDoc(long now) {
Map<String, Object> map = new HashMap<>();
map.put("date", now);
for (String v : DocConstant.DOC_TYPE) {
map.put(v, 1);
}
RedisUtil.hmset(DocConstant.DOC_TYPE_REDIS_KEY, map);
}
//模板
private void template(String action, int type) {
Instant start = Instant.now();
String lockKey = DocConstant.UPDATE_DOC_LOCK_KEY;
try (RedisUtil.Locker locker = new RedisUtil.Locker(lockKey)) {
if (!locker.lock()) {
log.error("{}失败,获取锁【{}】失败", action, lockKey);
return;
}
if (type == 0) {
initDocId();
}
else {
updateAllDoc(DateUtil.getTimestampNow());
}
log.info("{}成功,耗时:{}毫秒", action, ChronoUnit.MILLIS.between(start, Instant.now()));
}
catch (Exception e) {
log.error("{}失败", action, e);
}
}
}

@ -1,63 +0,0 @@
package cn.toesbieya.jxc.schedule.task;
import cn.toesbieya.jxc.common.constant.SessionConstant;
import cn.toesbieya.jxc.common.constant.SocketConstant;
import cn.toesbieya.jxc.common.model.vo.SocketOfflineVo;
import cn.toesbieya.jxc.common.util.RedisUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.DependsOn;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Set;
@Component
@Slf4j
@DependsOn("redisUtil")
public class SessionTask implements CommandLineRunner {
@Override
public void run(String... args) {
cleanSession();
}
@Async("scheduledExecutor")
@Scheduled(cron = "0 */10 * * * ?")
public void autoCleanSession() {
cleanSession();
}
//清理session中未活动的用户
private void cleanSession() {
try {
long now = System.currentTimeMillis();
//获取所有用户session
Set<String> sessionKeys = RedisUtil.keys(SessionConstant.REDIS_NAMESPACE + "*");
//获取离线情况 (k:sessionKey,v:SocketOfflineVo)
Map<Object, Object> offlineMap = RedisUtil.hgetAll(SocketConstant.REDIS_OFFLINE_USER);
//移除无活动时间超出限定的用户
sessionKeys.forEach(sessionKey -> {
Object obj = offlineMap.get(sessionKey);
if (obj != null) {
SocketOfflineVo offlineVo = ((JSONObject) obj).toJavaObject(SocketOfflineVo.class);
if (now > offlineVo.getTime() + SessionConstant.NO_ACTION_INTERVAL) {
//删除session
RedisUtil.del(sessionKey);
//删除离线表信息
RedisUtil.hdel(SocketConstant.REDIS_OFFLINE_USER, sessionKey);
}
}
});
}
catch (Exception e) {
log.error("清理session失败", e);
}
}
}

@ -1,116 +0,0 @@
package cn.toesbieya.jxc.schedule.task;
import cn.toesbieya.jxc.common.model.entity.StatFinishOrder;
import cn.toesbieya.jxc.common.model.entity.StatProfitGoods;
import cn.toesbieya.jxc.common.model.entity.StatProfitTotal;
import cn.toesbieya.jxc.common.util.DateUtil;
import cn.toesbieya.jxc.schedule.mapper.StatisticMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
@Slf4j
public class StatisticTask implements CommandLineRunner {
@Resource
private StatisticMapper mapper;
@Override
public void run(String... args) throws Exception {
autoStat();
}
//每天零点统计信息
@Async("scheduledExecutor")
@Scheduled(cron = "1 0 0 */1 * ?")
public void autoStat() {
log.info("开始统计信息...");
long lastDay = DateUtil.getTimestampBeforeNow(1);
long today = DateUtil.getTimestampNow();
//检查是否已统计过昨日已完成的订单数
if (!mapper.checkDailyFinishOrderExist(lastDay)) {
Integer lastDayPurchaseOrderFinish = mapper.getPurchaseOrderLastDayFinishOrderNum();
Integer lastDaySellOrderFinish = mapper.getSellOrderLastDayFinishOrderNum();
StatFinishOrder param = new StatFinishOrder();
param.setPurchase(lastDayPurchaseOrderFinish);
param.setSell(lastDaySellOrderFinish);
param.setTime(lastDay);
mapper.insertFinishOrder(param);
}
//检查是否已统计过昨日的采购额、销售额、毛利
if (!mapper.checkDailyProfitExist(lastDay)) {
//昨日各个商品的采购额、销售额
List<StatProfitGoods> purchaseProfitGoods = mapper.getPurchaseOrderDailyProfitGoods(lastDay, today);
List<StatProfitGoods> sellProfitGoods = mapper.getSellOrderDailyProfitGoods(lastDay, today);
//昨日的采购总额、销售总额
BigDecimal totalPurchase = new BigDecimal(0);
BigDecimal totalSell = new BigDecimal(0);
//根据商品分类计算
Map<Integer, StatProfitGoods> map = new HashMap<>(sellProfitGoods.size());
for (StatProfitGoods p : sellProfitGoods) {
map.put(p.getCid(), p);
}
for (StatProfitGoods p : purchaseProfitGoods) {
p.setTime(lastDay);
Integer cid = p.getCid();
BigDecimal purchase = p.getPurchase();
totalPurchase = totalPurchase.add(purchase);
StatProfitGoods s = map.get(cid);
if (s != null) {
BigDecimal sell = s.getSell();
totalSell = totalSell.add(sell);
p.setSell(sell);
p.setProfit(sell.subtract(purchase));
map.remove(cid);
}
else {
p.setSell(new BigDecimal(0));
p.setProfit(p.getSell().subtract(purchase));
}
}
for (StatProfitGoods s : map.values()) {
s.setTime(lastDay);
s.setPurchase(new BigDecimal(0));
BigDecimal sell = s.getSell();
s.setProfit(sell);
totalSell = totalSell.add(sell);
purchaseProfitGoods.add(s);
}
BigDecimal totalProfit = totalSell.subtract(totalPurchase);
StatProfitTotal statProfitTotal = new StatProfitTotal();
statProfitTotal.setPurchase(totalPurchase);
statProfitTotal.setSell(totalSell);
statProfitTotal.setProfit(totalProfit);
statProfitTotal.setTime(lastDay);
mapper.insertProfitTotal(statProfitTotal);
if (!purchaseProfitGoods.isEmpty()) {
mapper.insertProfitGoodsBatch(purchaseProfitGoods);
}
}
log.info("结束统计信息...");
}
}

@ -1,14 +0,0 @@
spring:
application:
name: jxc-schedule
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yml
shared-configs:
- data-id: jxc-common-database.yml
- data-id: jxc-common-redis.yml
discovery:
server-addr: 127.0.0.1:8848

@ -1,100 +0,0 @@
<?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.toesbieya.jxc.schedule.mapper.StatisticMapper">
<select id="checkDailyFinishOrderExist" resultType="java.lang.Boolean">
select count(0)
from stat_finish_order
where time = #{time}
</select>
<select id="checkDailyProfitExist" resultType="java.lang.Boolean">
select count(0)
from stat_profit_total
where time = #{time}
</select>
<insert id="insertFinishOrder" parameterType="cn.toesbieya.jxc.common.model.entity.StatFinishOrder">
insert into stat_finish_order (purchase, sell, time)
values (#{purchase}, #{sell}, #{time})
</insert>
<insert id="insertProfitTotal" parameterType="cn.toesbieya.jxc.common.model.entity.StatProfitTotal">
insert into stat_profit_total (purchase, sell, profit, time)
values (#{purchase}, #{sell}, #{profit}, #{time})
</insert>
<insert id="insertProfitGoodsBatch" keyColumn="id" keyProperty="id"
parameterType="cn.toesbieya.jxc.common.model.entity.StatProfitGoods"
useGeneratedKeys="true">
insert into stat_profit_goods
(cid, purchase, sell, profit, time)
values
<foreach collection="list" item="item" separator=",">
(#{item.cid}, #{item.purchase}, #{item.sell}, #{item.profit}, #{item.time})
</foreach>
</insert>
<select id="getPurchaseOrderDailyTotalPurchasePrice" resultType="java.math.BigDecimal">
select ifnull(sum(total), 0) total
from biz_purchase_order
where status = 2
<if test="start != null">
and vtime <![CDATA[ >= ]]> #{start}
</if>
<if test="end != null">
and vtime <![CDATA[ <= ]]> #{end}
</if>
</select>
<select id="getPurchaseOrderLastDayFinishOrderNum" resultType="java.lang.Integer">
select count(0)
from biz_purchase_order
where status = 2
and finish = 2
and ftime between unix_timestamp(cast(sysdate() as date) - interval 1 day) * 1000 and unix_timestamp(cast(sysdate() as date)) * 1000
</select>
<select id="getPurchaseOrderDailyProfitGoods" resultType="cn.toesbieya.jxc.common.model.entity.StatProfitGoods">
select t1.*,
t2.name cname
from (select a.cid,
ifnull(sum(a.num * a.price), 0) purchase
from biz_purchase_order_sub a
join biz_purchase_order b on a.pid = b.id
where b.vtime between #{start} and #{end}
group by a.cid) t1
join sys_category t2 on t1.cid = t2.id
</select>
<select id="getSellOrderDailyTotalPurchasePrice" resultType="java.math.BigDecimal">
select ifnull(sum(total), 0) total
from biz_sell_order
where status = 2
<if test="start != null">
and vtime <![CDATA[ >= ]]> #{start}
</if>
<if test="end != null">
and vtime <![CDATA[ <= ]]> #{end}
</if>
</select>
<select id="getSellOrderLastDayFinishOrderNum" resultType="java.lang.Integer">
select count(0)
from biz_sell_order
where status = 2
and finish = 2
and ftime between unix_timestamp(cast(sysdate() as date) - interval 1 day) * 1000 and unix_timestamp(cast(sysdate() as date)) * 1000
</select>
<select id="getSellOrderDailyProfitGoods" resultType="cn.toesbieya.jxc.common.model.entity.StatProfitGoods">
select t1.*,
t2.name cname
from (select a.cid,
ifnull(sum(a.num * a.price), 0) sell
from biz_sell_order_sub a
join biz_sell_order b on a.pid = b.id
where b.vtime between #{start} and #{end}
group by a.cid) t1
join sys_category t2 on t1.cid = t2.id
</select>
</mapper>

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>web</artifactId>
<groupId>cn.toesbieya</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>file</artifactId>
<dependencies>
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
</dependency>
</dependencies>
</project>

@ -1,11 +0,0 @@
package cn.toesbieya.jxc.file;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = "cn.toesbieya.jxc")
public class FileApplication {
public static void main(String[] args) {
SpringApplication.run(FileApplication.class, args);
}
}

@ -1,16 +0,0 @@
package cn.toesbieya.jxc.file.config;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
@Configuration
@EnableConfigurationProperties(QiniuProperty.class)
@DependsOn("redisUtil")
public class QiniuConfig {
@Bean
public QiniuTemplate qiniuTemplate(QiniuProperty property) {
return new QiniuTemplate(property);
}
}

@ -1,45 +0,0 @@
package cn.toesbieya.jxc.file.config;
import com.qiniu.storage.Region;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@Data
@ConfigurationProperties("qiniu")
@RefreshScope
public class QiniuProperty {
private String accessKey;
private String secretKey;
private String bucket;
//机房区域,默认为自动
private QiniuRegion region = QiniuRegion.auto;
//临时上传凭证的有效期,单位秒
private Integer tokenExpire = 3600;
//临时上传凭证的redis键名
private String redisCacheKey = "qiniu-token";
enum QiniuRegion {
auto(Region.autoRegion()),
huadong(Region.huadong()),
huabei(Region.huabei()),
huanan(Region.huanan()),
beimei(Region.beimei()),
xinjiapo(Region.xinjiapo());
private final Region region;
QiniuRegion(Region region) {
this.region = region;
}
public Region getRegion() {
return this.region;
}
}
}

@ -1,54 +0,0 @@
package cn.toesbieya.jxc.file.config;
import cn.toesbieya.jxc.common.util.RedisUtil;
import com.qiniu.common.QiniuException;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.util.Auth;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class QiniuTemplate {
private final QiniuProperty property;
private final Auth auth;
private final BucketManager bucketManager;
public QiniuTemplate(QiniuProperty property) {
this.property = property;
this.auth = Auth.create(property.getAccessKey(), property.getSecretKey());
this.bucketManager = new BucketManager(this.auth, new Configuration(property.getRegion().getRegion()));
}
public String getToken() {
String key = property.getRedisCacheKey();
String token = (String) RedisUtil.get(key);
if (token == null) {
token = auth.uploadToken(property.getBucket());
RedisUtil.set(key, token, property.getTokenExpire());
}
return token;
}
public void delete(String key) {
try {
bucketManager.delete(property.getBucket(), key);
}
catch (QiniuException e) {
log.info("七牛云删除单个文件失败,{}", e.getMessage());
}
}
public void deleteBatch(String... key) {
BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();
batchOperations.addDeleteOp(property.getBucket(), key);
try {
bucketManager.batch(batchOperations);
}
catch (QiniuException e) {
log.info("七牛云批量删除文件失败,{}", e.getMessage());
}
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save