diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f26bda4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,38 @@
+HELP.md
+target/
+.DS_
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+*.mvn
+/logger/
+!**/logger/**
+*mvnw*
+*/logger/*
+
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000..fb07f4d
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,57 @@
+stages:
+ # 构建
+ - build
+ - webhook
+
+build:
+ image: maven:3.6.3-openjdk-8
+ stage: build
+ only:
+ - main
+ - develop
+ before_script:
+ - echo '
+ '$PWD'.m2
+
+
+ nexus
+ nexus_public
+ 9SZ4KXFvGt9N7kRU
+
+
+ ' > $HOME/.m2/settings.xml
+
+ artifacts:
+ name: stock-market.war
+ expire_in: 1 day
+ paths:
+ - ./target/stock-market.war
+ script:
+ - echo ">>>>>>Start Building<<<<<<"
+ - pwd
+ - java -version
+ - mvn -v
+ - mvn clean install -Dmaven.test.skip=true
+ - ls
+ #- apt-get install -y curl
+ #- curl --max-time 20 http://43.128.20.12:11113/api/webhook/justpull?project=api\&setenv_file=alpha.sh\&publish_env=alpha
+ - echo ">>>>>>Finish Building<<<<<<"
+webhook:
+ stage: webhook
+ #tags:
+ # - gz
+ only:
+ - main
+ - develop
+ script:
+ - echo ">>>>>>Start Deploy<<<<<<"
+ - ls
+ - apt-get update
+ - apt-get install -y curl
+ - curl --max-time 30 http://43.139.146.165:11113/api/webhook/justpull?project=market\&setenv_file=alpha.sh\&publish_env=alpha\&shell=deploy-alpha.sh
+ - echo ">>>>>>Start Deploy Finish<<<<<<"
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..24199f9
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,256 @@
+
+ 4.0.0
+ war
+
+ cn.qutaojing
+ qutaojing-micro-pom
+ 0.0.1-SNAPSHOT
+
+
+
+ registry.cn-hangzhou.aliyuncs.com
+ 1.8
+ 1.8
+ MMdd-HHmm
+
+ cn.stock
+ market
+ 股票行情
+ 股票行情
+
+
+ org.springframework.boot
+ spring-boot-starter-tomcat
+ provided
+
+
+ cn.qutaojing
+ qutaojing-common
+ 0.0.2-SNAPSHOT
+
+
+ com.squareup.okhttp3
+ okhttp
+
+
+
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.9
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-mongodb
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ com.google.zxing
+ core
+ 3.4.0
+
+
+
+
+ io.netty
+ netty-all
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ com.github.pagehelper
+ pagehelper
+ 4.1.0
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.7.0
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.7.0
+
+
+
+ com.alibaba
+ easyexcel
+ 2.2.6
+
+
+ com.github.xiaoymin
+ swagger-bootstrap-ui
+ 1.9.6
+
+
+
+
+ com.xuxueli
+ xxl-job-core
+ 2.2.0
+
+
+
+ com.aliyun.oss
+ aliyun-sdk-oss
+ 2.5.0
+
+
+
+ com.aliyun
+ dysmsapi20170525
+ 2.0.9
+
+
+ com.squareup.okhttp3
+ okhttp
+
+
+
+
+
+ com.squareup.okhttp3
+ okhttp
+
+
+
+
+ joda-time
+ joda-time
+ 2.3
+
+
+
+ com.belerweb
+ pinyin4j
+ 2.5.1
+
+
+
+ com.tencentcloudapi
+ tencentcloud-sdk-java
+ 3.1.322
+
+
+
+ com.aliyun
+ cloudauth20200618
+ 1.0.5
+
+
+
+ com.aliyun
+ cloudauth20190307
+ 1.0.7
+
+
+
+
+ org.jsoup
+ jsoup
+ 1.15.2
+
+
+
+
+ stock-market
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.3.1
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+ com.mysema.maven
+ apt-maven-plugin
+ 1.1.3
+
+
+
+ process
+
+
+ src/main/generated
+ com.querydsl.apt.jpa.JPAAnnotationProcessor
+
+
+
+
+
+
+
+
+
+ nexus
+ https://nexus.duofu88.com/repository/maven-public/
+
+ true
+
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QCityPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QCityPO.java
new file mode 100644
index 0000000..b3f51fc
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QCityPO.java
@@ -0,0 +1,57 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QCityPO is a Querydsl query type for CityPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QCityPO extends EntityPathBase {
+
+ private static final long serialVersionUID = -1922934307L;
+
+ public static final QCityPO cityPO = new QCityPO("cityPO");
+
+ public final StringPath cityCode = createString("cityCode");
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final StringPath latitude = createString("latitude");
+
+ public final StringPath levelType = createString("levelType");
+
+ public final StringPath longitude = createString("longitude");
+
+ public final StringPath name = createString("name");
+
+ public final StringPath parentId = createString("parentId");
+
+ public final StringPath path = createString("path");
+
+ public final StringPath remark = createString("remark");
+
+ public final StringPath shortName = createString("shortName");
+
+ public final StringPath zipCode = createString("zipCode");
+
+ public QCityPO(String variable) {
+ super(CityPO.class, forVariable(variable));
+ }
+
+ public QCityPO(Path extends CityPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QCityPO(PathMetadata metadata) {
+ super(CityPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QCounter.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QCounter.java
new file mode 100644
index 0000000..b4e09d0
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QCounter.java
@@ -0,0 +1,47 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QCounter is a Querydsl query type for Counter
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QCounter extends EntityPathBase {
+
+ private static final long serialVersionUID = 690984745L;
+
+ public static final QCounter counter = new QCounter("counter");
+
+ public final NumberPath count = createNumber("count", Long.class);
+
+ public final DateTimePath createTime = createDateTime("createTime", java.util.Date.class);
+
+ public final StringPath fkId = createString("fkId");
+
+ public final StringPath k = createString("k");
+
+ public final StringPath type = createString("type");
+
+ public final DateTimePath updateTime = createDateTime("updateTime", java.util.Date.class);
+
+ public QCounter(String variable) {
+ super(Counter.class, forVariable(variable));
+ }
+
+ public QCounter(Path extends Counter> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QCounter(PathMetadata metadata) {
+ super(Counter.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QDic.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QDic.java
new file mode 100644
index 0000000..1657c83
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QDic.java
@@ -0,0 +1,41 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QDic is a Querydsl query type for Dic
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QDic extends EntityPathBase {
+
+ private static final long serialVersionUID = -1801755605L;
+
+ public static final QDic dic = new QDic("dic");
+
+ public final DateTimePath createTime = createDateTime("createTime", java.util.Date.class);
+
+ public final StringPath k = createString("k");
+
+ public final StringPath val = createString("val");
+
+ public QDic(String variable) {
+ super(Dic.class, forVariable(variable));
+ }
+
+ public QDic(Path extends Dic> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QDic(PathMetadata metadata) {
+ super(Dic.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QJsonInfoPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QJsonInfoPO.java
new file mode 100644
index 0000000..266e8cd
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QJsonInfoPO.java
@@ -0,0 +1,45 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QJsonInfoPO is a Querydsl query type for JsonInfoPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QJsonInfoPO extends EntityPathBase {
+
+ private static final long serialVersionUID = 537860584L;
+
+ public static final QJsonInfoPO jsonInfoPO = new QJsonInfoPO("jsonInfoPO");
+
+ public final DateTimePath createAt = createDateTime("createAt", java.util.Date.class);
+
+ public final StringPath ext = createString("ext");
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final StringPath type = createString("type");
+
+ public final DateTimePath updateAt = createDateTime("updateAt", java.util.Date.class);
+
+ public QJsonInfoPO(String variable) {
+ super(JsonInfoPO.class, forVariable(variable));
+ }
+
+ public QJsonInfoPO(Path extends JsonInfoPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QJsonInfoPO(PathMetadata metadata) {
+ super(JsonInfoPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QRealtimePO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QRealtimePO.java
new file mode 100644
index 0000000..fa06b13
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QRealtimePO.java
@@ -0,0 +1,51 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QRealtimePO is a Querydsl query type for RealtimePO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QRealtimePO extends EntityPathBase {
+
+ private static final long serialVersionUID = -677602211L;
+
+ public static final QRealtimePO realtimePO = new QRealtimePO("realtimePO");
+
+ public final NumberPath amounts = createNumber("amounts", Integer.class);
+
+ public final NumberPath averagePrice = createNumber("averagePrice", Double.class);
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final NumberPath price = createNumber("price", Double.class);
+
+ public final NumberPath rates = createNumber("rates", Double.class);
+
+ public final StringPath stockCode = createString("stockCode");
+
+ public final StringPath time = createString("time");
+
+ public final NumberPath volumes = createNumber("volumes", Integer.class);
+
+ public QRealtimePO(String variable) {
+ super(RealtimePO.class, forVariable(variable));
+ }
+
+ public QRealtimePO(Path extends RealtimePO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QRealtimePO(PathMetadata metadata) {
+ super(RealtimePO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteArticlePO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteArticlePO.java
new file mode 100644
index 0000000..323dc56
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteArticlePO.java
@@ -0,0 +1,61 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QSiteArticlePO is a Querydsl query type for SiteArticlePO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QSiteArticlePO extends EntityPathBase {
+
+ private static final long serialVersionUID = -38085285L;
+
+ public static final QSiteArticlePO siteArticlePO = new QSiteArticlePO("siteArticlePO");
+
+ public final DateTimePath addTime = createDateTime("addTime", java.util.Date.class);
+
+ public final StringPath artCnt = createString("artCnt");
+
+ public final StringPath artImg = createString("artImg");
+
+ public final StringPath artSummary = createString("artSummary");
+
+ public final StringPath artTitle = createString("artTitle");
+
+ public final StringPath artType = createString("artType");
+
+ public final StringPath author = createString("author");
+
+ public final NumberPath hitTimes = createNumber("hitTimes", Integer.class);
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final NumberPath isShow = createNumber("isShow", Integer.class);
+
+ public final StringPath sourceId = createString("sourceId");
+
+ public final StringPath spiderUrl = createString("spiderUrl");
+
+ public final NumberPath views = createNumber("views", Integer.class);
+
+ public QSiteArticlePO(String variable) {
+ super(SiteArticlePO.class, forVariable(variable));
+ }
+
+ public QSiteArticlePO(Path extends SiteArticlePO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QSiteArticlePO(PathMetadata metadata) {
+ super(SiteArticlePO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteNewsPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteNewsPO.java
new file mode 100644
index 0000000..9d6eb24
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QSiteNewsPO.java
@@ -0,0 +1,61 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QSiteNewsPO is a Querydsl query type for SiteNewsPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QSiteNewsPO extends EntityPathBase {
+
+ private static final long serialVersionUID = 525777388L;
+
+ public static final QSiteNewsPO siteNewsPO = new QSiteNewsPO("siteNewsPO");
+
+ public final DateTimePath addTime = createDateTime("addTime", java.util.Date.class);
+
+ public final StringPath content = createString("content");
+
+ public final StringPath description = createString("description");
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final StringPath imgurl = createString("imgurl");
+
+ public final DateTimePath showTime = createDateTime("showTime", java.util.Date.class);
+
+ public final StringPath sourceId = createString("sourceId");
+
+ public final StringPath sourceName = createString("sourceName");
+
+ public final NumberPath status = createNumber("status", Integer.class);
+
+ public final StringPath title = createString("title");
+
+ public final NumberPath type = createNumber("type", Integer.class);
+
+ public final DateTimePath updateTime = createDateTime("updateTime", java.util.Date.class);
+
+ public final NumberPath views = createNumber("views", Integer.class);
+
+ public QSiteNewsPO(String variable) {
+ super(SiteNewsPO.class, forVariable(variable));
+ }
+
+ public QSiteNewsPO(Path extends SiteNewsPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QSiteNewsPO(PathMetadata metadata) {
+ super(SiteNewsPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/db/po/QSysLogPO.java b/src/main/generated/cn/stock/market/infrastructure/db/po/QSysLogPO.java
new file mode 100644
index 0000000..742df59
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/db/po/QSysLogPO.java
@@ -0,0 +1,63 @@
+package cn.stock.market.infrastructure.db.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QSysLogPO is a Querydsl query type for SysLogPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QSysLogPO extends EntityPathBase {
+
+ private static final long serialVersionUID = -2037818903L;
+
+ public static final QSysLogPO sysLogPO = new QSysLogPO("sysLogPO");
+
+ public final StringPath actionType = createString("actionType");
+
+ public final StringPath content = createString("content");
+
+ public final DateTimePath createAt = createDateTime("createAt", java.util.Date.class);
+
+ public final StringPath ext = createString("ext");
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final StringPath module = createString("module");
+
+ public final StringPath operatorId = createString("operatorId");
+
+ public final StringPath operatorName = createString("operatorName");
+
+ public final StringPath operatorPhone = createString("operatorPhone");
+
+ public final StringPath roleType = createString("roleType");
+
+ public final NumberPath storeId = createNumber("storeId", Integer.class);
+
+ public final StringPath title = createString("title");
+
+ public final StringPath uniqueId = createString("uniqueId");
+
+ public final DateTimePath updateAt = createDateTime("updateAt", java.util.Date.class);
+
+ public QSysLogPO(String variable) {
+ super(SysLogPO.class, forVariable(variable));
+ }
+
+ public QSysLogPO(Path extends SysLogPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QSysLogPO(PathMetadata metadata) {
+ super(SysLogPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QSiteSettingPO.java b/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QSiteSettingPO.java
new file mode 100644
index 0000000..c9e4d71
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QSiteSettingPO.java
@@ -0,0 +1,39 @@
+package cn.stock.market.infrastructure.stockdb.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QSiteSettingPO is a Querydsl query type for SiteSettingPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QSiteSettingPO extends EntityPathBase {
+
+ private static final long serialVersionUID = -51441337L;
+
+ public static final QSiteSettingPO siteSettingPO = new QSiteSettingPO("siteSettingPO");
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final StringPath marketServerList = createString("marketServerList");
+
+ public QSiteSettingPO(String variable) {
+ super(SiteSettingPO.class, forVariable(variable));
+ }
+
+ public QSiteSettingPO(Path extends SiteSettingPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QSiteSettingPO(PathMetadata metadata) {
+ super(SiteSettingPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QStockPO.java b/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QStockPO.java
new file mode 100644
index 0000000..5dd97b5
--- /dev/null
+++ b/src/main/generated/cn/stock/market/infrastructure/stockdb/po/QStockPO.java
@@ -0,0 +1,61 @@
+package cn.stock.market.infrastructure.stockdb.po;
+
+import static com.querydsl.core.types.PathMetadataFactory.*;
+
+import com.querydsl.core.types.dsl.*;
+
+import com.querydsl.core.types.PathMetadata;
+import javax.annotation.Generated;
+import com.querydsl.core.types.Path;
+
+
+/**
+ * QStockPO is a Querydsl query type for StockPO
+ */
+@Generated("com.querydsl.codegen.EntitySerializer")
+public class QStockPO extends EntityPathBase {
+
+ private static final long serialVersionUID = -1246401708L;
+
+ public static final QStockPO stockPO = new QStockPO("stockPO");
+
+ public final DateTimePath addTime = createDateTime("addTime", java.util.Date.class);
+
+ public final NumberPath id = createNumber("id", Integer.class);
+
+ public final NumberPath increaseRatio = createNumber("increaseRatio", java.math.BigDecimal.class);
+
+ public final NumberPath isLock = createNumber("isLock", Integer.class);
+
+ public final NumberPath isShow = createNumber("isShow", Integer.class);
+
+ public final NumberPath spreadRate = createNumber("spreadRate", java.math.BigDecimal.class);
+
+ public final StringPath stockCode = createString("stockCode");
+
+ public final StringPath stockGid = createString("stockGid");
+
+ public final StringPath stockName = createString("stockName");
+
+ public final StringPath stockPlate = createString("stockPlate");
+
+ public final StringPath stockSpell = createString("stockSpell");
+
+ public final NumberPath stockState = createNumber("stockState", Integer.class);
+
+ public final StringPath stockType = createString("stockType");
+
+ public QStockPO(String variable) {
+ super(StockPO.class, forVariable(variable));
+ }
+
+ public QStockPO(Path extends StockPO> path) {
+ super(path.getType(), path.getMetadata());
+ }
+
+ public QStockPO(PathMetadata metadata) {
+ super(StockPO.class, metadata);
+ }
+
+}
+
diff --git a/src/main/java/cn/stock/market/StockMarketLaunch.java b/src/main/java/cn/stock/market/StockMarketLaunch.java
new file mode 100644
index 0000000..446cab2
--- /dev/null
+++ b/src/main/java/cn/stock/market/StockMarketLaunch.java
@@ -0,0 +1,72 @@
+package cn.stock.market;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
+import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
+import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+
+import com.alibaba.fastjson.JSON;
+
+import cn.hutool.http.HttpGlobalConfig;
+import cn.qutaojing.common.utils.MdcUtil;
+import cn.stock.market.domain.basic.entity.SiteSetting;
+import cn.stock.market.domain.basic.repository.SiteSettingRepository;
+import lombok.extern.slf4j.Slf4j;
+
+@SpringBootApplication(exclude = {
+ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class,
+ RedisAutoConfiguration.class,
+// RedissonAutoConfiguration.class, RedisAutoConfiguration.class
+})
+@Slf4j
+@ComponentScan(basePackages = { "cn.stock" })
+public class StockMarketLaunch implements CommandLineRunner {
+
+ public static void main(String[] args) {
+ HttpGlobalConfig.setTimeout(45000);
+ SpringApplication.run(StockMarketLaunch.class, args);
+ }
+
+ @Autowired
+ private Environment env;
+ @Override
+ public void run(String... args) throws Exception {
+ MDC.put(MdcUtil.TRACE_ID, MdcUtil.getTraceId());
+ log.info("StockMarketLaunch RUNNING....");
+
+ String marketDomain = env.getProperty("market.domain");
+ if(StringUtils.isNotBlank(marketDomain)) {
+ log.info("发现marketDomain: {}", marketDomain);
+ SiteSetting siteSetting = SiteSettingRepository.of().get();
+ if(siteSetting == null) {
+ log.info("找不到siteSetting信息, 无法设置");
+ } else {
+ log.info("设置前: {}", JSON.toJSONString(siteSetting));
+ boolean flag = siteSetting.checkAndAddIfNoExists(marketDomain);
+ if(! flag) {
+ SiteSettingRepository.of().saveAndFlush(siteSetting);
+ log.info("已经设置: {}....", JSON.toJSONString(siteSetting));
+ } else {
+ log.info("包含, 跳过....");
+ }
+ }
+ }
+ }
+
+// @Bean
+// public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
+// TomcatServletWebServerFactory tomcatServletWebServerFactory = new TomcatServletWebServerFactory();
+// tomcatServletWebServerFactory.addConnectorCustomizers((Connector connector) -> {
+// connector.setProperty("relaxedPathChars", "\"{\\}^`{|}[|]");
+// connector.setProperty("relaxedQueryChars", "\"{\\}^`{|}[|]");
+// });
+// return tomcatServletWebServerFactory;
+// }
+}
\ No newline at end of file
diff --git a/src/main/java/cn/stock/market/StockMarketServletInitializer.java b/src/main/java/cn/stock/market/StockMarketServletInitializer.java
new file mode 100644
index 0000000..ff94185
--- /dev/null
+++ b/src/main/java/cn/stock/market/StockMarketServletInitializer.java
@@ -0,0 +1,11 @@
+package cn.stock.market;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+public class StockMarketServletInitializer extends SpringBootServletInitializer {
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
+ return builder.sources(StockMarketLaunch.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/application/CommonApis.java b/src/main/java/cn/stock/market/application/CommonApis.java
new file mode 100644
index 0000000..b20ffee
--- /dev/null
+++ b/src/main/java/cn/stock/market/application/CommonApis.java
@@ -0,0 +1,78 @@
+package cn.stock.market.application;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.function.Function;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ag.utils.CollectionUtils;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import cn.qutaojing.common.utils.SpringUtils;
+import cn.stock.market.constant.StockSource;
+import cn.stock.market.domain.basic.entity.Stock;
+import cn.stock.market.domain.basic.repository.StockRepository;
+import cn.stock.market.dto.model.StockCode;
+import cn.stock.market.dto.model.StockDetail;
+import cn.stock.market.dto.model.StockVO;
+import cn.stock.market.infrastructure.api.AStockApis;
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+public class CommonApis {
+
+ public StockDetail aStockDetail(String code) {
+ return AStockApis.qq(code);
+ }
+
+ public StockVO stockDetail(StockCode code) {
+ Map map = stockDetailMap(Lists.newArrayList(code));
+ return map.get(code.getCode());
+ }
+
+ public List aStockDetail(List code) {
+ return AStockApis.qq(code);
+ }
+
+ public Map stockDetailMap(List code) {
+ Function> func = (source) -> {
+ return code.stream()
+ .filter(val -> val != null && source == val.getSource())
+ .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(StockCode::getCode))), ArrayList::new));
+ };
+
+ List aList = func.apply(StockSource.A);
+// List hkList = func.apply(StockSource.HK);
+// List usList = func.apply(StockSource.US);
+
+ Map map = Maps.newHashMap();
+ Collector> collectorMap = Collectors.toMap(StockVO::getCode, Function.identity(), (u,v) -> { return v;}, HashMap::new);
+
+ Map stockMap = StockRepository.of().cacheCodeMap();
+
+ if(CollectionUtils.isNotEmpty(aList)) {
+ Map m = aStockDetail(Lists.transform(aList, val -> val.getCode()))
+ .stream()
+ .map(val -> StockVO.from(val, stockMap.get(val.getCode())))
+ .collect(collectorMap);
+
+ map.putAll(m);
+ }
+
+ return map;
+ }
+
+ public static CommonApis of() {
+ return SpringUtils.getBean(CommonApis.class);
+ }
+}
diff --git a/src/main/java/cn/stock/market/application/Counters.java b/src/main/java/cn/stock/market/application/Counters.java
new file mode 100644
index 0000000..d4fb86e
--- /dev/null
+++ b/src/main/java/cn/stock/market/application/Counters.java
@@ -0,0 +1,198 @@
+//package cn.stock.market.application;
+//
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.concurrent.TimeUnit;
+//import java.util.stream.Collectors;
+//
+//import org.apache.commons.lang.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.data.redis.core.RedisTemplate;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import com.ag.utils.CollectionUtils;
+//import com.ag.utils.NumberUtils;
+//import com.google.common.base.Joiner;
+//import com.google.common.collect.Maps;
+//import com.querydsl.core.types.dsl.CaseBuilder;
+//import com.querydsl.core.types.dsl.CaseBuilder.Cases;
+//import com.querydsl.core.types.dsl.NumberExpression;
+//import com.querydsl.jpa.impl.JPAUpdateClause;
+//
+//import cn.qutaojing.common.utils.DslUtils;
+//import cn.qutaojing.common.utils.SpringUtils;
+//import cn.stock.market.infrastructure.db.po.Counter;
+//import cn.stock.market.infrastructure.db.repo.CounterRepo;
+//import cn.stock.market.infrastructure.db.po.QCounter;
+//import lombok.extern.slf4j.Slf4j;
+//
+///**
+// * 计数器
+// *
+// * @author xlfd
+// * @email xlfd@gmail.com
+// * @version 1.0
+// * @created Apr 22, 2021 4:21:07 PM
+// */
+//@Service
+//@SuppressWarnings("rawtypes")
+//@Slf4j
+//public class Counters {
+// public static final String TYPE_USER = "USER";
+// public static final String TYPE_SYS = "SYS";
+//
+// /**
+// * 用户购买商品
+// */
+// public static final String USER_BUY_GOODS_COUNT_TMP = "USER_BUY_GOODS_COUNT_%s_%s";
+// public static final String USER_EVERYDAY_BUY_GOODS_COUNT_TMP = "USER_EVERYDAY_BUY_GOODS_COUNT_%s_%s_%s";
+// public static final String USER_STORE_BUY_COUNT_TMP = "USER_STORE_BUY_COUNT_%s_%s_%s";
+//
+// static final long EXPIRE_SEC = 60 * 60 * 24; // 默认一天
+// @Autowired RedisTemplate redisTemplate;
+// @Autowired CounterRepo repo;
+//
+// String COUNTER_OPERCOUNT_MAP = "counter::opercount::map";
+// String COUNTER_MAP_PRE = "counter::count::";
+//
+// @SuppressWarnings("unchecked")
+// public long getCount(String k) {
+// Object obj = redisTemplate.opsForValue().get(key(k));
+// if(obj != null) {
+// if(obj instanceof Number) {
+// return ((Number) obj).longValue();
+// } else {
+// log.error("获取的到值{}非数字类型, 删除", obj);
+// redisTemplate.delete(key(k));
+// }
+// }
+//
+// Counter counter = repo.findById(k).orElse(null);
+// if(counter != null) {
+// redisTemplate.opsForValue().set(key(k), counter.getCount(), EXPIRE_SEC, TimeUnit.SECONDS);
+// return counter.getCount();
+// }
+//
+// return 0;
+// }
+//
+// String key(String k) {
+// return COUNTER_MAP_PRE + k;
+// }
+//
+// /**
+// * 返回add后的值
+// * @return
+// */
+// @SuppressWarnings("unchecked")
+// public long add(String k, long delta, String type, String fkId) {
+// String key = key(k);
+// if (redisTemplate.hasKey(key)) {
+// Long increment = redisTemplate.opsForValue().increment(key, delta);
+//
+// if(redisTemplate.opsForHash().hasKey(COUNTER_OPERCOUNT_MAP, key)) {
+// redisTemplate.opsForHash().increment(COUNTER_OPERCOUNT_MAP, key, 1);
+// } else {
+// redisTemplate.opsForHash().putIfAbsent(COUNTER_OPERCOUNT_MAP, key, 1);
+// }
+// return increment == null ? 0 : increment.longValue();
+// }
+//
+// Counter counter = repo.findById(k).orElse(null);
+// if(counter != null) {
+// counter.setCount(counter.getCount() + delta);
+// } else {
+// counter = Counter.builder()
+// .k(k)
+// .count(delta)
+// .type(type)
+// .fkId(fkId)
+// .build();
+// }
+// repo.save(counter);
+// redisTemplate.opsForValue().set(key, counter.getCount(), EXPIRE_SEC, TimeUnit.SECONDS);
+// return counter.getCount();
+// }
+//
+// @SuppressWarnings("unchecked")
+// public List getStockOperList() {
+// Map