docker 文件

sale
tianea 3 years ago
parent 1fbf694f7f
commit 5c86fdc0b8

@ -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>

@ -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')

@ -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>

@ -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 {
@ -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,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)
}
}
},
drawRanking(id){
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'
}

@ -18,8 +18,8 @@ export default {
data(){
return {
user: {
username:'2020096911',
password:'abc123ddd'
username:'',
password:''
},
msg: ''
}
@ -60,6 +60,8 @@ export default {
display: flex;
justify-content: flex-end;
align-items: center;
height: 100%;
width: 100%;
}
.tz-login-box{
box-shadow: 0 0 0 5px #7dbffb;

@ -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{

@ -247,7 +247,8 @@ export default {
console.log(res)
if(res.code == 200){
alert("考试得分"+res.data.score)
}else{
alert(res.msg)
}
})
},

@ -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()

@ -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">

@ -1,3 +1,3 @@
pic_path=/Volumes/Lexar/www/pic/
pic_path=/users/root/www/pic/
pic_recourse_url=/pic/
initPwd=tz2022

@ -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>

@ -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"]

@ -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());
}
}

@ -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);
}
}

@ -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;
}

@ -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);

@ -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);
}
}
}

@ -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,6 +166,37 @@ 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
@ -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;
}
}

@ -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);
}
}

@ -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("操作失败");
}
}

@ -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")

@ -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);

@ -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);
}

@ -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);
}

@ -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:

@ -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>

@ -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

@ -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"]

@ -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>

@ -23,11 +23,6 @@ spring:
redis:
repositories:
enabled: false
devtools:
restart:
enabled: true
livereload:
port: 35736
main:
allow-bean-definition-overriding: true
logging:

@ -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"]

@ -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>

@ -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>

@ -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"]

@ -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>

@ -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");
}
}

@ -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");
}
}

@ -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"]

@ -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>

@ -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"]

@ -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>

@ -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();
}
}

@ -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");
}
}

@ -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("手机不能为空");
}

@ -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

@ -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);
}
}

@ -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("无该用户信息");

@ -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;

@ -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:

Loading…
Cancel
Save