From 5c86fdc0b8e3fb2713163139453149d6da30f5f1 Mon Sep 17 00:00:00 2001
From: tianea <tianxyy80@gmail.com>
Date: Wed, 6 Apr 2022 23:49:00 +0800
Subject: [PATCH] =?UTF-8?q?docker=20=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 front/src/components/footer.vue               |   6 +-
 front/src/router/index.js                     |   1 -
 front/src/views/competition/ranking.vue       |   4 +-
 front/src/views/competition/second.vue        |  65 ++++++---
 front/src/views/login/index.vue               |  14 +-
 front/src/views/member/index.vue              |   2 +-
 front/src/views/system/exam.vue               |   3 +-
 front/src/views/system/index.vue              |   6 -
 .../src/main/resources/logback-tz.xml         |   2 +-
 .../src/main/resources/system.properties      |   2 +-
 tz/common/common-service/pom.xml              |   8 +-
 tz/competition/competition-service/Dockerfile |   8 ++
 .../api/ApiCompetitionRankingController.java  |  21 ++-
 .../competitiion/api/biz/ApiRankingBiz.java   |  99 ++++++++++++++
 .../competitiion/api/dto/RankingDTO.java      | 128 +++++++++++++++++-
 .../competitiion/job/CompetitionJob.java      |   4 +-
 .../job/biz/CompetitionJobBiz.java            |   4 +
 .../competitiion/job/biz/RankingBiz.java      |  88 ++++++++----
 .../pc/CompetitionController.java             |   5 +
 .../competitiion/pc/biz/PCCompetitionBiz.java |  20 ++-
 .../com/tz/platform/entity/Competition.java   |   5 -
 .../com/tz/platform/juejin/JueJinApi.java     |  11 +-
 .../repository/CompetitionMemberDao.java      |   9 ++
 .../tz/platform/repository/RankingDao.java    |   1 +
 .../src/main/resources/bootstrap.yml          |   2 +-
 tz/competition/pom.xml                        |  10 +-
 tz/docker-compose.yml                         |  96 +++++++++++++
 tz/exam/exam-service/Dockerfile               |   8 ++
 tz/exam/exam-service/pom.xml                  |  10 ++
 .../src/main/resources/bootstrap.yml          |   5 -
 tz/gateway/Dockerfile                         |   8 ++
 tz/gateway/pom.xml                            |  16 +--
 tz/pom.xml                                    |  14 +-
 tz/system/system-service/Dockerfile           |   8 ++
 tz/system/system-service/pom.xml              |   9 ++
 .../platform/system/api/SystemController.java |  17 +++
 .../tz/platform/system/api/biz/SystemBiz.java |  18 +++
 tz/upload/upload-service/Dockerfile           |   8 ++
 tz/upload/upload-service/pom.xml              |  11 ++
 tz/user/user-service/Dockerfile               |   8 ++
 tz/user/user-service/pom.xml                  |  10 ++
 .../user/api/UserLoginController.java         |   9 ++
 .../user/api/biz/ApiUserLoginBiz.java         |  18 +++
 .../user/auth/biz/AuthUserInfoBiz.java        |   6 +-
 .../tz/platform/user/chunzhen/IPSeeker.java   |  27 +++-
 .../user/pc/PcUserInfoController.java         |   5 +
 .../platform/user/pc/biz/PcUserInfoBiz.java   |  33 +++++
 .../com/tz/platform/user/pc/vo/UserVO.java    |   1 +
 .../src/main/resources/bootstrap.yml          |   2 +-
 49 files changed, 755 insertions(+), 120 deletions(-)
 create mode 100644 tz/competition/competition-service/Dockerfile
 create mode 100644 tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/ApiRankingBiz.java
 create mode 100644 tz/docker-compose.yml
 create mode 100644 tz/exam/exam-service/Dockerfile
 create mode 100644 tz/gateway/Dockerfile
 create mode 100644 tz/system/system-service/Dockerfile
 create mode 100644 tz/system/system-service/src/main/java/com/tz/platform/system/api/SystemController.java
 create mode 100644 tz/system/system-service/src/main/java/com/tz/platform/system/api/biz/SystemBiz.java
 create mode 100644 tz/upload/upload-service/Dockerfile
 create mode 100644 tz/user/user-service/Dockerfile

diff --git a/front/src/components/footer.vue b/front/src/components/footer.vue
index ac6e51a..d5a5bc5 100644
--- a/front/src/components/footer.vue
+++ b/front/src/components/footer.vue
@@ -4,7 +4,7 @@
              天择金融模拟交易平台版权所有   备案号:87654321
         </div>
         <div class="tz-ma">
-            <b-img class="d-block" src="/static/image/ma.jpg" />
+            <b-img class="d-block" src="/static/image/ma.png" />
         </div>
     </div>
 </template>
@@ -27,4 +27,8 @@
     display: flex;
     justify-content: center;
 }
+.tz-ma>img{
+    width: 5rem;
+    height: 5rem;
+}
 </style>
\ No newline at end of file
diff --git a/front/src/router/index.js b/front/src/router/index.js
index ffe2efb..8e12134 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -50,7 +50,6 @@ export default router
 router.beforeEach((to,from,next) =>{
    let userInfo = getInfo()
    if(!!userInfo){
-    
      if((!userInfo.complete)&&to.path!='/member'){
        alert("请完善个人信息!")
        next('/member')
diff --git a/front/src/views/competition/ranking.vue b/front/src/views/competition/ranking.vue
index 378c434..d61cdda 100644
--- a/front/src/views/competition/ranking.vue
+++ b/front/src/views/competition/ranking.vue
@@ -20,7 +20,7 @@
             <div class="tz-sub-tab">
                 <div :class=" rankingId ==1? 'ranking-selected':''" @click="rankingId =1">
                     <b-img src="/static/image/icon_ranking_1.png"/>
-                    综全排行榜
+                    综合排行榜
                 </div>
                 <div :class=" rankingId ==2? 'ranking-selected':''" @click="rankingId =2">
                      <b-img src="/static/image/icon_ranking_2.png"/>
@@ -40,7 +40,7 @@
             </div>
             <div class="tz-table-container">
                 <div class="tz-table-filter">
-                    <span>日期</span><b-datepicker /><span>检索</span><b-input class="tz-filter-input" placeholder="用户名/所属院校" /> <b-button class="tz-table-button">查询</b-button><b-button class="tz-table-button">导出</b-button>
+                    <span>检索</span><b-input class="tz-filter-input" placeholder="用户名/所属院校" /> <b-button class="tz-table-button">查询</b-button><b-button class="tz-table-button">导出</b-button>
                 </div>
                 <div class="table-header">
                     <div>
diff --git a/front/src/views/competition/second.vue b/front/src/views/competition/second.vue
index 8a67c65..4cf751f 100644
--- a/front/src/views/competition/second.vue
+++ b/front/src/views/competition/second.vue
@@ -86,7 +86,7 @@
                         </div>
                     </div>
                 </b-col>
-                <b-col sm>
+                <b-col v-if="competition.type == 1" sm>
                      <div class="tz-panel">
                         <div>
                             <div>
@@ -115,7 +115,7 @@
                         </div>
                     </div>
                 </b-col>
-                <b-col sm>
+                <b-col v-if="competition.type == 1" sm>
                      <div class="tz-panel">
                         <div>
                             <div class="tz-bg-yellow">
@@ -203,6 +203,8 @@ import * as echarts from 'echarts'
 import * as competitionApi from '@/api/competition'
 import { getInfo } from '@/utils/auth'
 import * as memberApi from '@/api/member'
+import * as rankingApi from '@/api/ranking'
+
 export default {
     data(){
         return {
@@ -230,7 +232,7 @@ export default {
             this.compId = this.$route.query.id
         }
         this.userInfo = getInfo()
-        
+
     },
     watch:{
         competition:function(nv){
@@ -243,10 +245,7 @@ export default {
             this.stageId = this.competition.stageList[0].id
             this.loadData()
         }        
-        this.draw("personalRatio")
-        this.draw("teamRatio")
-        this.drawRanking("personalRanking")
-        this.drawRanking("teamRanking")
+    
     },
     methods:{
         listPosition(){
@@ -256,6 +255,14 @@ export default {
                     this.positionList = res.data
                 }
             })
+            rankingApi.listAll(this.compId,this.stageId ).then(res=>{
+                if(res.code == 200){
+                    this.draw("personalRatio",res.data.list)
+                    this.draw("teamRatio",res.data.list)
+                    this.drawRanking("personalRanking",res.data.list)
+                    this.drawRanking("teamRanking",res.data.list)
+                }
+            })
         },
         getMemberInfo(){
             memberApi.getMemberInfo(this.compId,this.stageId).then(res=>{
@@ -273,6 +280,7 @@ export default {
             this.getCurrentStage(id)
             this.loadData()
         },
+        
         numberFixed(num){           
             if(typeof num == 'number'){
                 return num.toFixed(3)
@@ -288,18 +296,24 @@ export default {
                 this.currentStage = stage
             }
         },
-        draw(id){
-            let base = +new Date(1968, 9, 3);
-            let oneDay = 24 * 3600 * 1000;
+        draw(id,rankList){
+            let title = ''
+            if(id == 'personalRatio'){
+                title = "个人收益率";
+            }else{
+                title = '团队收益率';
+            }
             let date = [];
             let data = [Math.random() * 300];
             let data2 = [Math.random() * 300]
-            for (let i = 1; i < 20000; i++) {
-                var now = new Date((base += oneDay));
+            for (let i = 0; i < rankList.length; i++) {
+                let tmp = rankList[i]
+                var now = new Date(tmp.updateTime);
                 date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
-                data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
-                data2.push(Math.round((Math.random() - 0.5) * 20 + data2[i - 1]));
+                data.push(tmp.pnlRatio);
+                data2.push(tmp.baseRatio);
             }
+            console.log(date,data,data2)
             let option = {
             tooltip: {
                 trigger: 'axis',
@@ -332,7 +346,7 @@ export default {
             ],
             series: [
                 {
-                name: '个人收益率',
+                name: title,
                 type: 'line',
                 symbol: 'none',
                 sampling: 'lttb',
@@ -388,21 +402,32 @@ export default {
                 }
                 this.teamCharts.setOption(option)
             }
-            
-           
         },
-        drawRanking(id){
+        drawRanking(id,rankList){
+            let xData = []
+            let yData = []
+            for(var i = 0;i<rankList.length;i++){
+                let tmp = rankList[i]
+                xData.push(tmp.updateTime)
+                if(id == 'personalRanking'){
+                    yData.push(tmp.personalRank)
+                }else{
+                    yData.push(tmp.teamRank)
+                }
+                
+            }
+            
            let option = {
                 xAxis: {
                     type: 'category',
-                    data: ['2015', '2016', '2017', '2018', '2019', '2020', '2021']
+                    data: xData
                 },
                 yAxis: {
                     type: 'value'
                 },
                 series: [
                     {
-                    data: [150, 230, 224, 218, 135, 147, 260],
+                    data: yData,
                     type: 'line',
                     color: '#faa7c1'
                     }
diff --git a/front/src/views/login/index.vue b/front/src/views/login/index.vue
index 256e251..b1b839c 100644
--- a/front/src/views/login/index.vue
+++ b/front/src/views/login/index.vue
@@ -18,8 +18,8 @@ export default {
     data(){
         return {
             user: {
-                username:'2020096911',
-                password:'abc123ddd'
+                username:'',
+                password:''
             },
             msg: ''
         }
@@ -54,12 +54,14 @@ export default {
     background-image: url('/static/image/login_bg.jpg');
     background-size: cover;
     min-height: 1080px;
-   
+
 }
 .tz-login-container{
-     display: flex;
-     justify-content: flex-end;
-     align-items: center;
+    display: flex;
+    justify-content: flex-end;
+    align-items: center;
+    height: 100%;
+    width: 100%;
 }
 .tz-login-box{
     box-shadow: 0 0 0 5px #7dbffb;
diff --git a/front/src/views/member/index.vue b/front/src/views/member/index.vue
index ea391e4..249b8a5 100644
--- a/front/src/views/member/index.vue
+++ b/front/src/views/member/index.vue
@@ -154,7 +154,7 @@ export default {
         saveInfo(){
             memberApi.saveInfo(this.userInfo).then(res => {
                 if(res.data){
-                    this.userInfo.compele = true
+                    this.userInfo.complete = true
                     setInfo(this.userInfo)
                     alert("操作成功")
                 }else{
diff --git a/front/src/views/system/exam.vue b/front/src/views/system/exam.vue
index 951369b..292ea02 100644
--- a/front/src/views/system/exam.vue
+++ b/front/src/views/system/exam.vue
@@ -247,7 +247,8 @@ export default {
                 console.log(res)
                 if(res.code == 200){
                     alert("考试得分"+res.data.score)
-
+                }else{
+                     alert(res.msg)
                 }
             })
         },
diff --git a/front/src/views/system/index.vue b/front/src/views/system/index.vue
index 109f51f..50cdb19 100644
--- a/front/src/views/system/index.vue
+++ b/front/src/views/system/index.vue
@@ -450,13 +450,7 @@ export default {
             })
         }
     },
-    mounted(){
-       this.$nextTick(function(){
-           this.drawRanking()
-       })
-    },
     updated(){
-        console.log(this.tabId)
         if(this.tabId == 0 ){
             this.$nextTick(()=>{
                 this.drawRanking()
diff --git a/tz/common/common-core/src/main/resources/logback-tz.xml b/tz/common/common-core/src/main/resources/logback-tz.xml
index b3e806c..298fee5 100644
--- a/tz/common/common-core/src/main/resources/logback-tz.xml
+++ b/tz/common/common-core/src/main/resources/logback-tz.xml
@@ -23,7 +23,7 @@
     </springProfile>
 
     <!-- 生产环境 -->
-    <springProfile name="prod">
+    <springProfile name="pro">
         <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
             <file>${FILE_PATH}/warn</file>
             <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
diff --git a/tz/common/common-core/src/main/resources/system.properties b/tz/common/common-core/src/main/resources/system.properties
index 0739e26..9b25591 100644
--- a/tz/common/common-core/src/main/resources/system.properties
+++ b/tz/common/common-core/src/main/resources/system.properties
@@ -1,3 +1,3 @@
-pic_path=/Volumes/Lexar/www/pic/
+pic_path=/users/root/www/pic/
 pic_recourse_url=/pic/
 initPwd=tz2022
\ No newline at end of file
diff --git a/tz/common/common-service/pom.xml b/tz/common/common-service/pom.xml
index 954a27e..7d9165f 100644
--- a/tz/common/common-service/pom.xml
+++ b/tz/common/common-service/pom.xml
@@ -23,10 +23,10 @@
         </dependency>
 
         <!-- sentinel -->
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba.cloud</groupId>-->
+<!--            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
+<!--        </dependency>-->
 
 
         <dependency>
diff --git a/tz/competition/competition-service/Dockerfile b/tz/competition/competition-service/Dockerfile
new file mode 100644
index 0000000..e9c9d2a
--- /dev/null
+++ b/tz/competition/competition-service/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmx128M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=dev"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-competition.jar /competition-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /competition-service.jar $RUN_ARGS"]
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/ApiCompetitionRankingController.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/ApiCompetitionRankingController.java
index ccfc8ee..75b1233 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/ApiCompetitionRankingController.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/ApiCompetitionRankingController.java
@@ -1,10 +1,29 @@
 package com.tz.platform.competitiion.api;
 
+import com.tz.platform.common.core.base.BaseController;
+import com.tz.platform.common.core.base.Result;
+import com.tz.platform.competitiion.api.biz.ApiRankingBiz;
+import com.tz.platform.competitiion.api.dto.ListRankingDTO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 @RestController
 @RequestMapping(value = "/api/competition/ranking")
-public class ApiCompetitionRankingController {
+public class ApiCompetitionRankingController extends BaseController {
 
+    @Autowired
+    private ApiRankingBiz rankingBiz;
+
+    @GetMapping(value = "list")
+    public Result<ListRankingDTO> listRank(@RequestParam("compId") Long cmpId, @RequestParam("stageId") Integer stageId,@RequestParam("orderBy") String sort,@RequestParam("direct") Integer direct,String date){
+        return rankingBiz.list(cmpId,stageId,sort,direct,date);
+    }
+
+    @GetMapping(value = "listAll")
+    public Result<ListRankingDTO> listAll(@RequestParam("compId") Long cmpId, @RequestParam("stageId") Integer stageId){
+        return rankingBiz.listAll(cmpId,stageId,getUserNo());
+    }
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/ApiRankingBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/ApiRankingBiz.java
new file mode 100644
index 0000000..bc7ad73
--- /dev/null
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/biz/ApiRankingBiz.java
@@ -0,0 +1,99 @@
+package com.tz.platform.competitiion.api.biz;
+
+import com.tz.platform.common.core.base.Result;
+import com.tz.platform.common.core.tools.BeanUtils;
+import com.tz.platform.competitiion.api.dto.ListRankingDTO;
+import com.tz.platform.competitiion.api.dto.RankingDTO;
+import com.tz.platform.entity.Competition;
+import com.tz.platform.entity.Ranking;
+import com.tz.platform.repository.CompetitionDao;
+import com.tz.platform.repository.RankingDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class ApiRankingBiz
+{
+
+    @Autowired
+    private RedisTemplate<String,Object> template;
+
+    @Autowired
+    private CompetitionDao competitionDao;
+
+    @Autowired
+    private RankingDao rankingDao;
+
+    public Result<ListRankingDTO> list(Long compId,Integer stageId,String sort,Integer direct,String date){
+
+        Competition competition = competitionDao.getById(compId);
+
+        String key = "rankList_"+compId+"_"+stageId+"_"+date;
+        Object rankList = template.opsForValue().get(key);
+
+        List<Ranking> rankingList = null;
+        if(rankList == null){
+            if(StringUtils.isEmpty(date)){
+                rankingList = rankingDao.findAllByCompIdAndStageIdAndUpdateTime(compId,stageId,competition.getUpdateRankDate());
+            }else{
+                rankingList = rankingDao.findAllByCompIdAndStageIdAndUpdateTime(compId,stageId,date);
+            }
+            if(rankingList!=null){
+                template.opsForValue().set(key,rankingList,30, TimeUnit.MINUTES);
+            }
+        }else{
+            rankingList = (List<Ranking>) rankList;
+        }
+
+        Collections.sort(rankingList, (o1, o2) -> {
+            if(StringUtils.isEmpty(sort)){
+                Integer r1 = o1.getPersonalRank();
+                Integer r2 = o2.getPersonalRank();
+                if(r1 == null){
+                    r1 = 0;
+                }
+                if(r2 == null){
+                    r2 = 0;
+                }
+                if(direct == 0){
+                    return  r1 - r2;
+                }else{
+                    return r2 - r1;
+                }
+            }
+            return 0;
+        });
+
+        ListRankingDTO dto = new ListRankingDTO();
+        List<RankingDTO> rankingDTOList = BeanUtils.copyProperties(rankingList,RankingDTO.class);
+        dto.setTotal(rankingDTOList.size());
+        dto.setList(rankingDTOList);
+        return Result.success(dto);
+    }
+
+    public Result<ListRankingDTO> listAll(Long compId,Integer stageId,Long userNo){
+        String key = "rankList_"+compId+"_"+stageId+"_"+userNo;
+        Object rankList = template.opsForValue().get(key);
+        List<Ranking> rankingList = null;
+        if(rankList == null){
+            rankingList = rankingDao.findAllByCompIdAndStageIdAndUserNo(compId,stageId,userNo);
+
+            if(rankingList!=null&&rankingList.size()>0){
+                template.opsForValue().set(key,rankingList,30, TimeUnit.MINUTES);
+            }
+        }else{
+            rankingList = (List<Ranking>) rankList;
+        }
+        ListRankingDTO dto = new ListRankingDTO();
+        List<RankingDTO> rankingDTOList = BeanUtils.copyProperties(rankingList,RankingDTO.class);
+        dto.setTotal(rankingDTOList.size());
+        dto.setList(rankingDTOList);
+        return Result.success(dto);
+    }
+}
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/RankingDTO.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/RankingDTO.java
index 361bd13..d3fe5a2 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/RankingDTO.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/api/dto/RankingDTO.java
@@ -2,7 +2,133 @@ package com.tz.platform.competitiion.api.dto;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
-public class RankingDTO {
+public class RankingDTO implements Serializable {
+    private String id;
+
+
+    private String accountId;
+    /**
+     * 总资产
+     */
+    private Double nav;
+
+    /**
+     * 可用资产
+     */
+    private Double available;
+
+    /**
+     * 市值
+     */
+    private Double marketValue;
+
+    /**
+     * 累计盈亏
+     */
+    private Double profitLoss;
+
+    /**
+     * 累计手续费
+     */
+    private Double cumCommission;
+
+    /**
+     * 浮动盈亏
+     */
+    private Double fpnl;
+
+    /**
+     * 累计收益率
+     */
+    private Double pnlRatio;
+
+    /**
+     * 基准收益率
+     */
+    private Double baseRatio;
+
+    /**
+     * 团队收益率
+     */
+    private Double teamRatio;
+
+    /**
+     * 个人排名
+     */
+    private Integer personalRank;
+
+
+    /**
+     * 团队排名
+     */
+    private Integer teamRank;
+
+    /**
+     * 最大回测
+     */
+    private Double maxDrawdown;
+
+    /**
+     * 卡玛比率
+     */
+    private Double calmarRatio;
+
+    /**
+     * 夏普比率
+     */
+    private Double sharpRatio;
+
+    /**
+     * 开仓次数
+     */
+    private Integer openCount;
+
+    /**
+     * 平仓次数
+     */
+    private Integer closeCount;
+
+    /**
+     * 年化收益率
+     */
+    private Double pnlRatioAnnual;
+
+    /**
+     *胜率
+     */
+    private Double winRatio;
+
+    private Long userNo;
+    private Long compId;
+    private Integer stageId;
+    private Integer teamId;
+
+    private String name;
+    private String teamName;
+    private String school;
+    private Integer levelId;
+    private Integer regionId;
+
+    /**
+     * 综合得分
+     */
+    private Double combineScore;
+
+    /**
+     * 团队综合得分
+     */
+    private Double teamCombineScore;
+
+    /**
+     * 交易得分
+     */
+    private Double financeScore;
 
+    /**
+     * 更新时间
+     */
+    private String updateTime;
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java
index eea6c5b..7faeb39 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/CompetitionJob.java
@@ -57,8 +57,8 @@ public class CompetitionJob {
     /**
      * 每天零晨2点执行
      */
-    @Scheduled(cron = "0 0 2 1 * ?")
-//    @Scheduled(cron = "10 * * * * ?")
+//    @Scheduled(cron = "0 0 2 1 * ?")
+    @Scheduled(cron = "5 * * * * ?")
     public void fetchRanking(){
         String jobName = "rankingJob";
         boolean lock = lock(jobName,ms);
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java
index 4f7f957..d786a6f 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/CompetitionJobBiz.java
@@ -103,6 +103,10 @@ public class CompetitionJobBiz {
             competition.setCurrentStageName(current.getName());
             competition.setStatus(1);
             competitionDao.updateStatus(competition.getId(),1,current.getName(),current.getId());
+        }else{
+            if(competition.getEndTime().getTime()<now){
+                competitionDao.updateStatus(competition.getId(),2,"无赛段",0);
+            }
         }
     }
 
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java
index 766940e..92675cc 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/job/biz/RankingBiz.java
@@ -1,5 +1,6 @@
 package com.tz.platform.competitiion.job.biz;
 
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.tz.platform.common.core.tools.DateUtil;
@@ -42,6 +43,8 @@ public class RankingBiz {
         List<Competition> competitionList = competitionDao.findAllByStatus(1);
         String endTime = DateUtil.format(new Date());
         String now = DateUtil.format(new Date());
+        Map<String,Integer> reportMap = listReport(jueJinApi);
+
         competitionList.forEach(competition -> {
             try {
                 CompetitionTask currentTask = taskDao.getByCompetitionIdAndStageId(competition.getId(), competition.getCurrentStage());
@@ -51,49 +54,44 @@ public class RankingBiz {
                 List<Ranking> rankingList = new ArrayList<>();
                 memberList.forEach(member -> {
                     if (StringUtils.hasText(member.getAccountId())) {
-                        String jsonStr = jueJinApi.createReport(member.getAccountId(), endTime);
-                        if(StringUtils.isEmpty(jsonStr)){
-                            return;
-                        }
-                        JSONObject jsonObject = JSONUtil.parseObj(jsonStr);
-                        if(jsonObject.containsKey("report_id")){
-                            Integer reportId =jsonObject.getInt("report_id");
+                        if(reportMap.containsKey(member.getAccountId())){
+                            Integer reportId =reportMap.get(member.getAccountId());
 //                            memberDao.updateReportId(member.getUserId(),currentTask.getStageId(),currentTask.getCompetitionId(),reportId);
                             member.setReportId(reportId);
                             String contentStr = jueJinApi.getReport(reportId.toString());
-
                             JSONObject rankingObj = JSONUtil.parseObj(contentStr);
                             if(rankingObj.containsKey("data")){
                                 JSONObject dataObj = (JSONObject)rankingObj.getJSONArray("data").get(0);
                                 JSONObject cashObj =dataObj.getJSONObject("cash");
+                                if(cashObj.size() == 0 ) {return;}
                                 //可用资金
-                                Double available = cashObj.getDouble("available");
+                                Double available = getOV(cashObj,"available",member.getAvailableFounds());  // cashObj.getDouble("available");
                                 //累计手续费
-                                Double cumCommission = cashObj.getDouble("cum_commission");
+                                Double cumCommission = getOV(cashObj,"cum_commission",member.getCommission());  //cashObj.getDouble("cum_commission");
                                 //浮动盈亏
-                                Double fpnl = cashObj.getDouble("fpnl");
+                                Double fpnl = getOV(cashObj,"fpnl",0D);//cashObj.getDouble("fpnl");
                                 //收益
-                                Double pnl = cashObj.getDouble("pnl");
+                                Double pnl =getOV(cashObj,"pnl",0D); // cashObj.getDouble("pnl");
                                 //总资产
-                                Double nav = cashObj.getDouble("nav");
+                                Double nav =getOV(cashObj,"nav",member.getTotalFounds()) ;// cashObj.getDouble("nav");
 
                                 JSONObject indicatorObj = dataObj.getJSONObject("indicator");
                                 //累计收益率
-                                Double pnlRatio = indicatorObj.getDouble("pnl_ratio");
+                                Double pnlRatio = getOV(indicatorObj,"pnl_ratio",0D); //indicatorObj.getDouble("pnl_ratio");
                                 //年化收益率
-                                Double pnlRatioAnnual = indicatorObj.getDouble("pnl_ratio_annual");
+                                Double pnlRatioAnnual = getOV(indicatorObj,"pnl_ratio_annual",0D);  //indicatorObj.getDouble("pnl_ratio_annual");
                                 //夏普比例
-                                Double sharpRatio = indicatorObj.getDouble("sharp_ratio");
+                                Double sharpRatio =getOV(indicatorObj,"sharp_ratio",0D);  //indicatorObj.getDouble("sharp_ratio");
                                 //卡玛比例
-                                Double calmarRatio = indicatorObj.getDouble("calmar_ratio");
+                                Double calmarRatio =getOV(indicatorObj,"calmar_ratio",0D); //indicatorObj.getDouble("calmar_ratio");
                                 //最大回测
-                                Double maxDrawdown = indicatorObj.getDouble("max_drawdown");
+                                Double maxDrawdown = getOV(indicatorObj,"max_drawdown",0D);  //indicatorObj.getDouble("max_drawdown");
                                 //开仓次数
-                                Integer openCount = indicatorObj.getInt("open_count");
+                                Integer openCount = getOV(indicatorObj,"open_count",member.getOpenCount()); //indicatorObj.getInt("open_count");
                                 //平仓次数
-                                Integer closeCount = indicatorObj.getInt("close_count");
+                                Integer closeCount = getOV(indicatorObj,"close_count",member.getCloseCount()); //indicatorObj.getInt("close_count");
                                 //胜率
-                                Double winRatio = indicatorObj.getDouble("win_ratio");
+                                Double winRatio = getOV(indicatorObj,"win_ratio",0D);   //indicatorObj.getDouble("win_ratio");
                                 if(member.getHighestRatio() == null){
                                     member.setHighestRatio(pnlRatio);
                                 }
@@ -103,7 +101,7 @@ public class RankingBiz {
                                     member.setHighestRatio(maxRatio);
                                 }
                                 Ranking ranking = new Ranking();
-                                ranking.setUserNo(member.getId().longValue());
+                                ranking.setUserNo(member.getUserId());
                                 ranking.setCompId(competition.getId());
                                 ranking.setName(member.getName());
                                 ranking.setSchool(member.getSchool());
@@ -168,13 +166,44 @@ public class RankingBiz {
         });
     }
 
+
+    public Map<String,Integer> listReport(JueJinApi jueJinApi){
+
+        Map<String,Integer> reportMap = new HashMap<>();
+        for(int i = 1;i<10000; i++){
+            String content = jueJinApi.listReport(i,100);
+            JSONObject resObj = JSONUtil.parseObj(content);
+            if(resObj.containsKey("data")){
+                JSONArray jsonArray = resObj.getJSONArray("data");
+                jsonArray.forEach(jObj ->{
+                    JSONObject reportObj = (JSONObject) jObj;
+                    String key  = reportObj.getStr("account_id");
+                    Integer value = reportObj.getJSONObject("report").getInt("report_id");
+                    reportMap.put(key,value);
+                });
+            }else{
+                break;
+            }
+        }
+        return reportMap;
+    }
+
+    private <T> T getOV(JSONObject jsonObject,String key,T dv){
+        if(jsonObject.containsKey(key)){
+            Object v = jsonObject.get(key);
+            T rs = (T)v;
+            return rs;
+        }
+       return dv;
+    }
+
     /**
      * 排名
      * @param rankingList
      * @param task
      */
     private void computeRanking(List<Ranking> rankingList ,CompetitionTask task){
-        Map<Integer,List<Ranking>> map =  rankingList.stream().collect(Collectors.groupingBy(Ranking::getTeamId));
+        Map<Integer,List<Ranking>> map = rankingList.stream().collect(Collectors.groupingBy(Ranking::getTeamId));
         map.forEach((k,v)->{
             Double teamRatio = v.stream().mapToDouble((r)-> {
               Double t =   r.getProfitLoss();
@@ -195,16 +224,22 @@ public class RankingBiz {
             v.forEach(ranking -> {
                 ranking.setTeamRatio(teamRatio);
                 ranking.setTeamCombineScore(teamCombineScore);
+
             });
         });
         rankingList.sort(Comparator.comparing(Ranking::getFinanceScore));
         for(int i = 0;i<rankingList.size();i++){
-            rankingList.get(i).setPersonalRank(i+1);
+            int rank = i + 1;
+            Ranking ranking = rankingList.get(i);
+            ranking.setPersonalRank(rank);
+            memberDao.updatePersonalRank(ranking.getUserNo(),ranking.getStageId(),ranking.getCompId(),rank);
         }
         rankingList.sort(Comparator.comparing(Ranking::getTeamCombineScore));
         for(int i =0;i<rankingList.size();i++){
-            rankingList.get(i).setTeamRank(i+1);
-
+            int rank = i + 1;
+            Ranking ranking = rankingList.get(i);
+            ranking.setTeamRank(rank);
+            memberDao.updateTeamRank(ranking.getUserNo(),ranking.getStageId(),ranking.getCompId(),rank);
         }
         rankingDao.saveAll(rankingList);
     }
@@ -233,5 +268,4 @@ public class RankingBiz {
         double score = task.getFinanceBasePower() +(userRatio - baseRatio) /(maxUserRatio -baseRatio)* task.getFinanceProfitPower();
         return score;
     }
-
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/CompetitionController.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/CompetitionController.java
index 7e2dd96..be2b565 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/CompetitionController.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/CompetitionController.java
@@ -44,4 +44,9 @@ public class CompetitionController {
         return biz.get(vo);
     }
 
+    @PostMapping(value = "send")
+    public Result<String> changeStatus(@RequestBody CompetitionVO vo){
+        return  biz.send(vo);
+    }
+
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/biz/PCCompetitionBiz.java b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/biz/PCCompetitionBiz.java
index 8a8af45..291da96 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/biz/PCCompetitionBiz.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/competitiion/pc/biz/PCCompetitionBiz.java
@@ -97,10 +97,28 @@ public class PCCompetitionBiz {
         return  Result.success(dto);
     }
 
-    public Result<CompetitionDTO> get(@RequestBody CompetitionVO vo){
+    public Result<CompetitionDTO> get(CompetitionVO vo){
         Competition competition = competitionDao.getById(vo.getId());
         CompetitionDTO dto = new CompetitionDTO();
         BeanUtils.copyProperties(competition,dto);
         return Result.success(dto);
     }
+
+
+    public Result<String> send(CompetitionVO vo){
+       Competition competition =  competitionDao.getById(vo.getId());
+       if(competition == null){
+           return Result.error("大赛不存在");
+       }
+       if(competition.getStatus() == -1){
+           int rs =   competitionDao.updateStatus(vo.getId(),0);
+           if(rs>0){
+               return Result.success("发布成功");
+           }
+       }else{
+           return Result.error("大赛已发布");
+       }
+
+       return Result.error("操作失败");
+    }
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Competition.java b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Competition.java
index 2dea061..05653d0 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Competition.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/entity/Competition.java
@@ -31,13 +31,9 @@ public class Competition {
     private Integer teamCount;
     private String updateRankDate;
     private boolean enableSignup;
-    @Column(columnDefinition = "TIMESTAMP")
     private Date startTime;
-    @Column(columnDefinition = "TIMESTAMP")
     private Date endTime;
-    @Column(columnDefinition = "TIMESTAMP")
     private Date signupStartTime;
-    @Column(columnDefinition = "TIMESTAMP")
     private Date signupEndTime;
 
     @Type(type = "json")
@@ -45,7 +41,6 @@ public class Competition {
     private List<Stage> stageList;
     private Integer currentStage;
     private String currentStageName;
-    @Column(columnDefinition = "TIMESTAMP")
     private Date createTime;
     @Type(type = "json")
     @Column(columnDefinition = "json")
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java b/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java
index d9ae0b4..cd55fe6 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/juejin/JueJinApi.java
@@ -98,6 +98,12 @@ public class JueJinApi {
         return content;
     }
 
+    public String listReport(Integer pageNo,Integer pageSize){
+        String url = baseUrl +"/api/v1/reports?page="+pageNo+"&size="+pageSize;
+        String content = HttpUtil.get(url,headers);
+        return  content;
+    }
+
     /**
      * 基准收益率
      * @return
@@ -190,7 +196,6 @@ public class JueJinApi {
     public static void main(String[] args) {
         JueJinApi api = new JueJinApi();
         String accountId = "2e41a913-9dc1-11ec-89b3-00163e0e6ad0";
-
         String zhangSan1Qihuo = "0cfc7894-9f4e-11ec-bf20-00163e0e6ad0";
         String zhangSan1GuPiao = "";
         String start = "2022-03-07";
@@ -201,9 +206,9 @@ public class JueJinApi {
 //        api.deleteAccount("4811913f-9dba-11ec-89b3-00163e0e6ad0");
 //        api.getCashInfo("2e41a913-9dc1-11ec-89b3-00163e0e6ad0");
 //        api.test();
-//        api.createReport(accountId,"report"+ System.currentTimeMillis());
+        api.createReport(accountId,"report"+ System.currentTimeMillis());
 //         api.getCashInfo(accountId);
-        api.getReport("2794345");
+        api.getReport("14892159");
 //        api.getStockInfo("SHSE.600547,SHSE.603160");
 //        api.getProfit("2022-03-11","2022-03-15");
 //        api.getHeavy(accountId,start,end);
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java
index 8dc7841..7797d60 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/CompetitionMemberDao.java
@@ -53,4 +53,13 @@ public interface CompetitionMemberDao extends JpaRepository<CompetitionMember,In
     @Query(value = "update competition_member set highest_ratio=:ratio where user_id=:userNo and stage_id=:stageId and competition_id=:compId",nativeQuery = true)
     int updateHighestRatio(@Param("userNo") Long userNo,@Param("stageId") Integer stageId,@Param("compId") Long comId,  @Param("ratio") Double ratio);
 
+
+    @Modifying
+    @Query(value = "update competition_member set personal_rank=:rank where user_id=:userNo and stage_id=:stageId and competition_id=:compId",nativeQuery = true)
+    int updatePersonalRank(@Param("userNo") Long userNo,@Param("stageId") Integer stageId,@Param("compId") Long comId,  @Param("rank") Integer rank);
+
+    @Modifying
+    @Query(value = "update competition_member set team_rank=:rank where user_id=:userNo and stage_id=:stageId and competition_id=:compId",nativeQuery = true)
+    int updateTeamRank(@Param("userNo") Long userNo,@Param("stageId") Integer stageId,@Param("compId") Long comId,  @Param("rank") Integer rank);
+
 }
diff --git a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java
index fcb2fd4..a1c39d8 100644
--- a/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java
+++ b/tz/competition/competition-service/src/main/java/com/tz/platform/repository/RankingDao.java
@@ -9,4 +9,5 @@ import java.util.List;
 @Repository
 public interface RankingDao extends JpaRepository<Ranking,String> {
     List<Ranking> findAllByCompIdAndStageIdAndUpdateTime(Long compId,Integer stageId,String updateTime);
+    List<Ranking> findAllByCompIdAndStageIdAndUserNo(Long compId,Integer stageId,Long userNo);
 }
diff --git a/tz/competition/competition-service/src/main/resources/bootstrap.yml b/tz/competition/competition-service/src/main/resources/bootstrap.yml
index 4d94314..7ad082f 100644
--- a/tz/competition/competition-service/src/main/resources/bootstrap.yml
+++ b/tz/competition/competition-service/src/main/resources/bootstrap.yml
@@ -10,7 +10,7 @@ spring:
     active: dev
   cloud:
     nacos:
-      server-addr: 127.0.0.1:8848
+      server-addr: 172.19.255.105:8848
       username: nacos
       password: nacos
       config:
diff --git a/tz/competition/pom.xml b/tz/competition/pom.xml
index 2afaa3b..825eefc 100644
--- a/tz/competition/pom.xml
+++ b/tz/competition/pom.xml
@@ -14,7 +14,15 @@
     <modules>
         <module>competition-service</module>
     </modules>
-
+    <build>
+        <finalName>tianze-competition</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 
 
 
diff --git a/tz/docker-compose.yml b/tz/docker-compose.yml
new file mode 100644
index 0000000..2f816c5
--- /dev/null
+++ b/tz/docker-compose.yml
@@ -0,0 +1,96 @@
+version: "3.0"
+services:
+  tianze-upload:
+    build:
+      context: ./upload/upload-service
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:upload
+    container_name: upload
+    restart: always
+    volumes:
+      - /tmp/logs/upload:/root/tianze/logs/upload
+      - /root/tianze/www/pic/:/users/root/www/pic/
+    networks:
+      - tianze
+    ports:
+      - "50015:50015"
+  tianze-user:
+    build:
+      context: ./user/user-service
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:user
+    container_name: user
+    restart: always
+    volumes:
+      - /tmp/logs/user:/root/tianze/logs/user
+    networks:
+      - tianze
+    ports:
+      - "50011:50011"
+  tianze-system:
+    build:
+      context: ./system/system-service
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:system
+    container_name: system
+    restart: always
+    volumes:
+      - /tmp/logs/system:/root/tianze/logs/system
+    networks:
+      - tianze
+    ports:
+      - "50014:50014"
+  tianze-gateway:
+    build:
+      context: ./gateway
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:gateway
+    container_name: gateway
+    restart: always
+    volumes:
+      - /tmp/logs/gateway:/root/tianze/logs/gateway
+    networks:
+      - tianze
+    ports:
+      - "50010:50010"
+  tianze-exam:
+    build:
+      context: ./exam/exam-service
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:exam
+    container_name: exam
+    restart: always
+    volumes:
+      - /tmp/logs/exam:/root/tianze/logs/exam
+    networks:
+      - tianze
+    ports:
+      - "50013:50013"
+  tianze-competition:
+    build:
+      context: ./competition/competition-service
+      args:
+        JAVA_OPTS: '-Xmn256M -Xmx1024M'
+        RUN_ARGS: '--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848'
+    image: alient/tianze:competition
+    container_name: competition
+    restart: always
+    volumes:
+      - /tmp/logs/competition:/root/tianze/logs/competition
+    networks:
+      - tianze
+    ports:
+      - "50012:50012"
+networks:
+  tianze:
+    driver: bridge
\ No newline at end of file
diff --git a/tz/exam/exam-service/Dockerfile b/tz/exam/exam-service/Dockerfile
new file mode 100644
index 0000000..d7a18fc
--- /dev/null
+++ b/tz/exam/exam-service/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmx128M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=dev"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-exam.jar /exam-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /exam-service.jar $RUN_ARGS"]
diff --git a/tz/exam/exam-service/pom.xml b/tz/exam/exam-service/pom.xml
index 60291c0..8e8a8ec 100644
--- a/tz/exam/exam-service/pom.xml
+++ b/tz/exam/exam-service/pom.xml
@@ -45,4 +45,14 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <finalName>tianze-exam</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/tz/exam/exam-service/src/main/resources/bootstrap.yml b/tz/exam/exam-service/src/main/resources/bootstrap.yml
index cb2de6d..ce61352 100644
--- a/tz/exam/exam-service/src/main/resources/bootstrap.yml
+++ b/tz/exam/exam-service/src/main/resources/bootstrap.yml
@@ -23,11 +23,6 @@ spring:
     redis:
       repositories:
         enabled: false
-  devtools:
-    restart:
-      enabled: true
-    livereload:
-      port: 35736
   main:
     allow-bean-definition-overriding: true
 logging:
diff --git a/tz/gateway/Dockerfile b/tz/gateway/Dockerfile
new file mode 100644
index 0000000..da1695c
--- /dev/null
+++ b/tz/gateway/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmn256M -Xmx1024M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-gateway.jar /gateway-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /gateway-service.jar $RUN_ARGS"]
diff --git a/tz/gateway/pom.xml b/tz/gateway/pom.xml
index 1ef409a..2cb7590 100644
--- a/tz/gateway/pom.xml
+++ b/tz/gateway/pom.xml
@@ -29,10 +29,10 @@
         </dependency>
 
         <!-- sentinel -->
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba.cloud</groupId>-->
+<!--            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.alibaba.csp</groupId>
             <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
@@ -64,18 +64,12 @@
     </dependencies>
 
     <build>
-        <finalName>app-gateway</finalName>
+        <finalName>tianze-gateway</finalName>
         <plugins>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
             </plugin>
-            <plugin>
-                <groupId>org.sonarsource.scanner.maven</groupId>
-                <artifactId>sonar-maven-plugin</artifactId>
-            </plugin>
         </plugins>
     </build>
-
-
 </project>
\ No newline at end of file
diff --git a/tz/pom.xml b/tz/pom.xml
index eb8ad81..29efdf4 100644
--- a/tz/pom.xml
+++ b/tz/pom.xml
@@ -124,15 +124,11 @@
 <!--                </plugin>-->
 
                 <!-- https://github.com/spotify/dockerfile-maven -->
-<!--                <plugin>-->
-<!--                    <groupId>com.spotify</groupId>-->
-<!--                    <artifactId>dockerfile-maven-plugin</artifactId>-->
-<!--                    <version>1.4.13</version>-->
-<!--                    <configuration>-->
-<!--                        <repository>harbor.roncoo.com/library/${project.artifactId}</repository>-->
-<!--                        <tag>${project.version}</tag>-->
-<!--                    </configuration>-->
-<!--                </plugin>-->
+                <plugin>
+                    <groupId>com.spotify</groupId>
+                    <artifactId>dockerfile-maven-plugin</artifactId>
+                    <version>1.4.13</version>
+                </plugin>
             </plugins>
         </pluginManagement>
     </build>
diff --git a/tz/system/system-service/Dockerfile b/tz/system/system-service/Dockerfile
new file mode 100644
index 0000000..4abb76d
--- /dev/null
+++ b/tz/system/system-service/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmx128M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=dev"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-system.jar /system-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /system-service.jar $RUN_ARGS"]
diff --git a/tz/system/system-service/pom.xml b/tz/system/system-service/pom.xml
index 3a48cca..d3fad08 100644
--- a/tz/system/system-service/pom.xml
+++ b/tz/system/system-service/pom.xml
@@ -39,4 +39,13 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
+    <build>
+        <finalName>tianze-system</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
diff --git a/tz/system/system-service/src/main/java/com/tz/platform/system/api/SystemController.java b/tz/system/system-service/src/main/java/com/tz/platform/system/api/SystemController.java
new file mode 100644
index 0000000..d775eb6
--- /dev/null
+++ b/tz/system/system-service/src/main/java/com/tz/platform/system/api/SystemController.java
@@ -0,0 +1,17 @@
+package com.tz.platform.system.api;
+
+import com.tz.platform.common.core.base.Result;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/system")
+public class SystemController {
+
+    @GetMapping(value = "init")
+    public Result<String> init(){
+
+        return Result.success("success");
+    }
+}
diff --git a/tz/system/system-service/src/main/java/com/tz/platform/system/api/biz/SystemBiz.java b/tz/system/system-service/src/main/java/com/tz/platform/system/api/biz/SystemBiz.java
new file mode 100644
index 0000000..4f69952
--- /dev/null
+++ b/tz/system/system-service/src/main/java/com/tz/platform/system/api/biz/SystemBiz.java
@@ -0,0 +1,18 @@
+package com.tz.platform.system.api.biz;
+
+import com.tz.platform.common.core.base.Result;
+import com.tz.platform.feign.user.IFeignUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SystemBiz {
+
+    @Autowired
+    private IFeignUser feignUser;
+
+    public Result<String> initSystem(){
+
+      return Result.success("success");
+    }
+}
diff --git a/tz/upload/upload-service/Dockerfile b/tz/upload/upload-service/Dockerfile
new file mode 100644
index 0000000..beff982
--- /dev/null
+++ b/tz/upload/upload-service/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmx128M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=dev"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-upload.jar /upload-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /upload-service.jar $RUN_ARGS"]
diff --git a/tz/upload/upload-service/pom.xml b/tz/upload/upload-service/pom.xml
index 188a631..aa2c558 100644
--- a/tz/upload/upload-service/pom.xml
+++ b/tz/upload/upload-service/pom.xml
@@ -22,4 +22,15 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <finalName>tianze-upload</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+
 </project>
\ No newline at end of file
diff --git a/tz/user/user-service/Dockerfile b/tz/user/user-service/Dockerfile
new file mode 100644
index 0000000..bb38c53
--- /dev/null
+++ b/tz/user/user-service/Dockerfile
@@ -0,0 +1,8 @@
+FROM daocloud.io/library/java:8-jre-alpine
+MAINTAINER tianze
+ARG JAVA_OPTS="-Xmx128M"
+ENV JAVA_OPTS=$JAVA_OPTS
+ARG RUN_ARGS="--spring.profiles.active=pro --spring.cloud.nacos.server-addr=172.19.255.105:8848"
+ENV RUN_ARGS=$RUN_ARGS
+ADD target/tianze-user.jar /user-service.jar
+ENTRYPOINT ["sh","-c","java $JAVA_OPTS -jar /user-service.jar $RUN_ARGS"]
diff --git a/tz/user/user-service/pom.xml b/tz/user/user-service/pom.xml
index 29cce23..c5cd744 100644
--- a/tz/user/user-service/pom.xml
+++ b/tz/user/user-service/pom.xml
@@ -38,4 +38,14 @@
 
     </dependencies>
 
+    <build>
+        <finalName>tianze-user</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/api/UserLoginController.java b/tz/user/user-service/src/main/java/com/tz/platform/user/api/UserLoginController.java
index 5b326ae..c9ba288 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/api/UserLoginController.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/api/UserLoginController.java
@@ -2,9 +2,12 @@ package com.tz.platform.user.api;
 
 import com.tz.platform.common.core.base.BaseController;
 import com.tz.platform.common.core.base.Result;
+import com.tz.platform.feign.user.vo.UserVo;
 import com.tz.platform.user.api.biz.ApiUserLoginBiz;
 import com.tz.platform.user.api.bo.UserLoginPasswordBO;
 import com.tz.platform.user.api.dto.UserLoginDTO;
+import com.tz.platform.user.pc.biz.PcUserInfoBiz;
+import com.tz.platform.user.pc.vo.UserVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -15,6 +18,7 @@ public class UserLoginController extends BaseController {
     @Autowired
     private ApiUserLoginBiz apiUserLoginBiz;
 
+
     @PostMapping(path = "password")
     public Result<UserLoginDTO> loginPassword(@RequestBody UserLoginPasswordBO userLoginPasswordBO){
         return apiUserLoginBiz.loginPassword(userLoginPasswordBO);
@@ -24,4 +28,9 @@ public class UserLoginController extends BaseController {
     public Result<String> loginOut(){
         return apiUserLoginBiz.loginOut(getUserNo());
     }
+
+    @GetMapping(path = "default")
+    public Result<String> addDefaultUser(){
+        return apiUserLoginBiz.addDefaultAdmin();
+    }
 }
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/api/biz/ApiUserLoginBiz.java b/tz/user/user-service/src/main/java/com/tz/platform/user/api/biz/ApiUserLoginBiz.java
index fe24f9f..348ebd5 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/api/biz/ApiUserLoginBiz.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/api/biz/ApiUserLoginBiz.java
@@ -2,9 +2,12 @@ package com.tz.platform.user.api.biz;
 
 import cn.hutool.crypto.digest.DigestUtil;
 import com.tz.platform.common.core.base.Result;
+import com.tz.platform.common.core.config.SystemUtil;
 import com.tz.platform.common.core.enmus.LoginStatusEnum;
+import com.tz.platform.common.core.enmus.UserTypeEnum;
 import com.tz.platform.common.core.tools.DateUtil;
 import com.tz.platform.common.core.tools.JWTUtil;
+import com.tz.platform.common.core.tools.StrUtil;
 import com.tz.platform.entity.LoginLog;
 import com.tz.platform.entity.User;
 import com.tz.platform.repository.LoginLogDao;
@@ -112,4 +115,19 @@ public class ApiUserLoginBiz {
         loginLogDao.updateLoginOut(userNo);
         return  Result.success("success");
     }
+
+    public Result<String> addDefaultAdmin(){
+        User user = new User();
+        user.setId(1L);
+        user.setName("管理员");
+        user.setUsername("admin");
+        user.setGmtCreate(new Date());
+        user.setMobileSalt(StrUtil.get32UUID());
+        user.setMobilePsw(DigestUtil.sha1Hex(user.getMobileSalt() +SystemUtil.INIT_PASSWORD));
+        user.setGmtModified(new Date());
+        user.setUserType(UserTypeEnum.ADMIN.getCode());
+        userDao.save(user);
+        return Result.success("success");
+    }
+
 }
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/auth/biz/AuthUserInfoBiz.java b/tz/user/user-service/src/main/java/com/tz/platform/user/auth/biz/AuthUserInfoBiz.java
index c6f92da..0cc985b 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/auth/biz/AuthUserInfoBiz.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/auth/biz/AuthUserInfoBiz.java
@@ -30,9 +30,9 @@ public class AuthUserInfoBiz {
     }
 
     public Result<Boolean> complete(EditUserVO vo){
-        if(StringUtils.isEmpty(vo.getEmail())){
-            return  Result.error("邮箱不能为空");
-        }
+//        if(StringUtils.isEmpty(vo.getEmail())){
+//            return  Result.error("邮箱不能为空");
+//        }
         if(StringUtils.isEmpty(vo.getMobile())){
             return Result.error("手机不能为空");
         }
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/chunzhen/IPSeeker.java b/tz/user/user-service/src/main/java/com/tz/platform/user/chunzhen/IPSeeker.java
index f26df30..6e8e7ac 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/chunzhen/IPSeeker.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/chunzhen/IPSeeker.java
@@ -1,7 +1,12 @@
 package com.tz.platform.user.chunzhen;
 
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ClassPathResource;
+
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.RandomAccessFile;
 import java.nio.ByteOrder;
 import java.nio.MappedByteBuffer;
@@ -10,8 +15,9 @@ import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
 
+@Slf4j
 public class IPSeeker {
-    private static final String IP_FILE = IPSeeker.class.getResource("/QQWry.DAT").toString().substring(5);
+
 
     // 一些固定常量,比如记录长度等等
     private static final int IP_RECORD_LENGTH = 7;
@@ -43,14 +49,17 @@ public class IPSeeker {
         buf = new byte[100];
         b4 = new byte[4];
         b3 = new byte[3];
+        String IP_FILE = "";
         try {
-            ipFile = new RandomAccessFile(IP_FILE, "r");
+            ClassPathResource resource = new ClassPathResource("QQWry.DAT");
+            IP_FILE = resource.getPath();
+            ipFile = new RandomAccessFile(resource.getFile(), "r");
         } catch (FileNotFoundException e) {
-            System.out.println(IPSeeker.class.getResource("/QQWry.DAT").toString());
-            System.out.println(IP_FILE);
-            System.out.println("IP地址信息文件没有找到,IP显示功能将无法使用");
+            log.error("chunzheng file read err:{}",IP_FILE);
             ipFile = null;
 
+        } catch (IOException e) {
+            e.printStackTrace();
         }
         // 如果打开文件成功,读取文件头信息
         if(ipFile != null) {
@@ -67,6 +76,14 @@ public class IPSeeker {
             }
         }
     }
+    private String streamToString(InputStream inputHtml) throws IOException {
+        StringBuffer out = new StringBuffer();
+        byte[] b = new byte[4096];
+        for (int n; (n = inputHtml.read(b)) != -1;) {
+            out.append(new String(b, 0, n));
+        }
+        return out.toString();
+    }
 
     /** *//**
      * @return  单一实例
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/PcUserInfoController.java b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/PcUserInfoController.java
index 4ec9f68..41f73b3 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/PcUserInfoController.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/PcUserInfoController.java
@@ -46,4 +46,9 @@ public class PcUserInfoController extends BaseController {
     public Result<Long> addUser(@RequestBody UserVO vo){
         return pcUserInfoBiz.saveUser(vo);
     }
+
+    @PostMapping(value = "addAdmin")
+    public Result<Long> addAdmin(@RequestBody UserVO vo){
+        return pcUserInfoBiz.addAdmin(vo);
+    }
 }
\ No newline at end of file
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/biz/PcUserInfoBiz.java b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/biz/PcUserInfoBiz.java
index 5fa9cc5..6d7226a 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/biz/PcUserInfoBiz.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/biz/PcUserInfoBiz.java
@@ -6,6 +6,7 @@ import com.tz.platform.common.core.config.SystemUtil;
 import com.tz.platform.common.core.enmus.UserTypeEnum;
 import com.tz.platform.common.core.tools.StrUtil;
 import com.tz.platform.entity.User;
+import com.tz.platform.feign.user.vo.UserVo;
 import com.tz.platform.repository.UserDao;
 import com.tz.platform.user.pc.bo.UserPageBO;
 import com.tz.platform.user.pc.dto.UserDTO;
@@ -146,6 +147,38 @@ public class PcUserInfoBiz {
         return  Result.success(user.getId());
     }
 
+
+    public Result<Long> addAdmin(UserVO vo){
+        if(StringUtils.isEmpty(vo.getUsername())){
+            return Result.error("用户名不能为空");
+        }
+
+        User creator = userDao.getById(vo.getUserNo());
+        User user =userDao.getById(vo.getId());
+        if(vo.getId()== null||user == null){
+            user = new User();
+            user.setUsername(vo.getUsername());
+            user.setGmtCreate(new Date());
+        }
+        if(StringUtils.hasText(vo.getPassword())){
+            user.setMobileSalt(StrUtil.get32UUID());
+            user.setMobilePsw(DigestUtil.sha1Hex(user.getMobileSalt() +vo.getPassword()));
+        }else{
+            user.setMobileSalt(StrUtil.get32UUID());
+            user.setMobilePsw(DigestUtil.sha1Hex(user.getMobileSalt() + SystemUtil.INIT_PASSWORD));
+        }
+
+        user.setName(vo.getName());
+        user.setMobile(vo.getMobile());
+        user.setGmtModified(new Date());
+        user.setUserType(UserTypeEnum.ADMIN.getCode());
+        if(user.getUserType().equals(UserTypeEnum.ADMIN.getCode())&&creator.getUserType()!=3){
+            return Result.error("无权添加用户");
+        }
+        user =  userDao.save(user);
+        return  Result.success(user.getId());
+    }
+
     public Result<String> deleteUser(UserVO vo){
         if(vo.getId()==null){
             return Result.error("无该用户信息");
diff --git a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/vo/UserVO.java b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/vo/UserVO.java
index 64d926f..1e6103e 100644
--- a/tz/user/user-service/src/main/java/com/tz/platform/user/pc/vo/UserVO.java
+++ b/tz/user/user-service/src/main/java/com/tz/platform/user/pc/vo/UserVO.java
@@ -8,6 +8,7 @@ public class UserVO {
     private Long id;
     private String studentNo;
     private String password;
+    private String username;
     private String name;
     private String school;
     private String mobile;
diff --git a/tz/user/user-service/src/main/resources/bootstrap.yml b/tz/user/user-service/src/main/resources/bootstrap.yml
index 7cc30ee..ddfbd24 100644
--- a/tz/user/user-service/src/main/resources/bootstrap.yml
+++ b/tz/user/user-service/src/main/resources/bootstrap.yml
@@ -7,7 +7,7 @@ spring:
     active: dev
   cloud:
     nacos:
-      server-addr: 127.0.0.1:8848
+      server-addr: 172.19.255.105:8848
       username: nacos
       password: nacos
       config: