Merge branch '68-ping-conf' into 'dev'
Resolve "Ping конференции в списке конференций" Closes #68 See merge request romanov73/ng-tracker!69
This commit is contained in:
commit
88ec35faa0
@ -56,6 +56,8 @@ public class ConferenceController {
|
||||
@GetMapping("/dashboard")
|
||||
public void getDashboard(ModelMap modelMap) {
|
||||
modelMap.put("conferences", conferenceService.findAllActiveDto());
|
||||
|
||||
conferenceService.setChartData(modelMap); // example
|
||||
}
|
||||
|
||||
@GetMapping("/conference")
|
||||
@ -132,6 +134,15 @@ public class ConferenceController {
|
||||
return CONFERENCE_PAGE;
|
||||
}
|
||||
|
||||
@PostMapping(value = "/conference", params = "pingConference")
|
||||
public String ping(@Valid ConferenceDto conferenceDto, Errors errors) throws IOException {
|
||||
if (errors.hasErrors()) {
|
||||
return CONFERENCE_PAGE;
|
||||
}
|
||||
conferenceService.ping(conferenceDto);
|
||||
return CONFERENCE_PAGE;
|
||||
}
|
||||
|
||||
@ModelAttribute("allParticipation")
|
||||
public List<ConferenceUser.Participation> getAllParticipation() {
|
||||
return conferenceService.getAllParticipations();
|
||||
|
@ -35,7 +35,7 @@ public class Conference extends BaseEntity {
|
||||
|
||||
private String url;
|
||||
|
||||
private int ping;
|
||||
private int ping = 0;
|
||||
|
||||
@Column(name = "begin_date")
|
||||
@Temporal(TemporalType.TIMESTAMP)
|
||||
|
@ -1,6 +1,7 @@
|
||||
package ru.ulstu.conference.repository;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
@ -19,4 +20,8 @@ public interface ConferenceRepository extends JpaRepository<Conference, Integer>
|
||||
|
||||
@Query("SELECT case when count(c) > 0 then true else false end FROM Conference c JOIN c.papers p WHERE p.id = :paperId")
|
||||
boolean isPaperAttached(@Param("paperId") Integer paperId);
|
||||
|
||||
@Modifying
|
||||
@Query("UPDATE Conference c SET c.ping = (c.ping + 1) WHERE c.id = :id")
|
||||
int updatePingConference(@Param("id") Integer id);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.data.domain.Sort;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.ui.ModelMap;
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.conference.model.ConferenceDto;
|
||||
import ru.ulstu.conference.model.ConferenceFilterDto;
|
||||
@ -12,6 +13,7 @@ import ru.ulstu.conference.repository.ConferenceRepository;
|
||||
import ru.ulstu.deadline.service.DeadlineService;
|
||||
import ru.ulstu.paper.model.Paper;
|
||||
import ru.ulstu.paper.service.PaperService;
|
||||
import ru.ulstu.ping.service.PingService;
|
||||
import ru.ulstu.user.model.User;
|
||||
import ru.ulstu.user.service.UserService;
|
||||
|
||||
@ -33,17 +35,20 @@ public class ConferenceService {
|
||||
private final DeadlineService deadlineService;
|
||||
private final PaperService paperService;
|
||||
private final UserService userService;
|
||||
private final PingService pingService;
|
||||
|
||||
public ConferenceService(ConferenceRepository conferenceRepository,
|
||||
ConferenceUserService conferenceUserService,
|
||||
DeadlineService deadlineService,
|
||||
PaperService paperService,
|
||||
UserService userService) {
|
||||
UserService userService,
|
||||
PingService pingService) {
|
||||
this.conferenceRepository = conferenceRepository;
|
||||
this.conferenceUserService = conferenceUserService;
|
||||
this.deadlineService = deadlineService;
|
||||
this.paperService = paperService;
|
||||
this.userService = userService;
|
||||
this.pingService = pingService;
|
||||
}
|
||||
|
||||
public ConferenceDto getExistConferenceById(Integer id) {
|
||||
@ -151,7 +156,6 @@ public class ConferenceService {
|
||||
conference.setTitle(conferenceDto.getTitle());
|
||||
conference.setDescription(conferenceDto.getDescription());
|
||||
conference.setUrl(conferenceDto.getUrl());
|
||||
conference.setPing(0);
|
||||
conference.setBeginDate(conferenceDto.getBeginDate());
|
||||
conference.setEndDate(conferenceDto.getEndDate());
|
||||
conference.getPapers().clear();
|
||||
@ -188,4 +192,36 @@ public class ConferenceService {
|
||||
public boolean isAttachedToConference(Integer paperId) {
|
||||
return conferenceRepository.isPaperAttached(paperId);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void ping(ConferenceDto conferenceDto) throws IOException {
|
||||
pingService.addPing(findOne(conferenceDto.getId()));
|
||||
conferenceRepository.updatePingConference(conferenceDto.getId());
|
||||
}
|
||||
|
||||
public Conference findOne(Integer conferenceId) {
|
||||
return conferenceRepository.findOne(conferenceId);
|
||||
}
|
||||
|
||||
public void setChartData(ModelMap modelMap) {
|
||||
//first, add the regional sales
|
||||
Integer northeastSales = 17089;
|
||||
Integer westSales = 10603;
|
||||
Integer midwestSales = 5223;
|
||||
Integer southSales = 10111;
|
||||
|
||||
modelMap.addAttribute("northeastSales", northeastSales);
|
||||
modelMap.addAttribute("southSales", southSales);
|
||||
modelMap.addAttribute("midwestSales", midwestSales);
|
||||
modelMap.addAttribute("westSales", westSales);
|
||||
|
||||
//now add sales by lure type
|
||||
List<Integer> inshoreSales = Arrays.asList(4074, 3455, 4112);
|
||||
List<Integer> nearshoreSales = Arrays.asList(3222, 3011, 3788);
|
||||
List<Integer> offshoreSales = Arrays.asList(7811, 7098, 6455);
|
||||
|
||||
modelMap.addAttribute("inshoreSales", inshoreSales);
|
||||
modelMap.addAttribute("nearshoreSales", nearshoreSales);
|
||||
modelMap.addAttribute("offshoreSales", offshoreSales);
|
||||
}
|
||||
}
|
||||
|
73
src/main/java/ru/ulstu/ping/model/Ping.java
Normal file
73
src/main/java/ru/ulstu/ping/model/Ping.java
Normal file
@ -0,0 +1,73 @@
|
||||
package ru.ulstu.ping.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.core.model.BaseEntity;
|
||||
import ru.ulstu.user.model.User;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.Table;
|
||||
import javax.persistence.Temporal;
|
||||
import javax.persistence.TemporalType;
|
||||
import java.util.Date;
|
||||
|
||||
@Entity
|
||||
@Table(name = "ping")
|
||||
public class Ping extends BaseEntity {
|
||||
@Temporal(value = TemporalType.TIMESTAMP)
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date date;
|
||||
|
||||
@ManyToOne(optional = false)
|
||||
@JoinColumn(name = "users_id")
|
||||
private User user;
|
||||
|
||||
@ManyToOne(optional = false)
|
||||
@JoinColumn(name = "conference_id")
|
||||
private Conference conference;
|
||||
|
||||
public Ping() {
|
||||
}
|
||||
|
||||
public Ping(Date date, User user) {
|
||||
this.date = date;
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public Ping(@JsonProperty("id") Integer id,
|
||||
@JsonProperty("date") Date date,
|
||||
@JsonProperty("user") User user,
|
||||
@JsonProperty("conference") Conference conference) {
|
||||
setId(id);
|
||||
this.date = date;
|
||||
this.user = user;
|
||||
this.conference = conference;
|
||||
}
|
||||
|
||||
public Date getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setDate(Date date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public Conference getConference() {
|
||||
return conference;
|
||||
}
|
||||
|
||||
public void setConference(Conference conference) {
|
||||
this.conference = conference;
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package ru.ulstu.ping.repository;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import ru.ulstu.ping.model.Ping;
|
||||
|
||||
public interface PingRepository extends JpaRepository<Ping, Integer> {
|
||||
}
|
30
src/main/java/ru/ulstu/ping/service/PingService.java
Normal file
30
src/main/java/ru/ulstu/ping/service/PingService.java
Normal file
@ -0,0 +1,30 @@
|
||||
package ru.ulstu.ping.service;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import ru.ulstu.conference.model.Conference;
|
||||
import ru.ulstu.ping.model.Ping;
|
||||
import ru.ulstu.ping.repository.PingRepository;
|
||||
import ru.ulstu.user.service.UserService;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Date;
|
||||
|
||||
@Service
|
||||
public class PingService {
|
||||
private final PingRepository pingRepository;
|
||||
private final UserService userService;
|
||||
|
||||
public PingService(PingRepository pingRepository,
|
||||
UserService userService) {
|
||||
this.pingRepository = pingRepository;
|
||||
this.userService = userService;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void addPing(Conference conference) throws IOException {
|
||||
Ping newPing = new Ping(new Date(), userService.getCurrentUser());
|
||||
newPing.setConference(conference);
|
||||
pingRepository.save(newPing);
|
||||
}
|
||||
}
|
28
src/main/resources/db/changelog-20190424_000000-schema.xml
Normal file
28
src/main/resources/db/changelog-20190424_000000-schema.xml
Normal file
@ -0,0 +1,28 @@
|
||||
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
|
||||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
|
||||
<changeSet author="vova" id="20190424_000000-1">
|
||||
<createTable tableName="ping">
|
||||
<column name="id" type="integer">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="date" type="timestamp">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="users_id" type="integer">
|
||||
<constraints nullable="false"/>
|
||||
</column>
|
||||
<column name="conference_id" type="integer"/>
|
||||
<column name="version" type="integer"/>
|
||||
</createTable>
|
||||
<addPrimaryKey columnNames="id" constraintName="pk_ping" tableName="ping"/>
|
||||
<addForeignKeyConstraint baseTableName="ping" baseColumnNames="users_id"
|
||||
constraintName="fk_ping_users_id" referencedTableName="users"
|
||||
referencedColumnNames="id"/>
|
||||
<addForeignKeyConstraint baseTableName="ping" baseColumnNames="conference_id"
|
||||
constraintName="fk_ping_conference_id" referencedTableName="conference"
|
||||
referencedColumnNames="id"/>
|
||||
</changeSet>
|
||||
|
||||
</databaseChangeLog>
|
@ -33,4 +33,5 @@
|
||||
<include file="db/changelog-20190419_000000-schema.xml"/>
|
||||
<include file="db/changelog-20190421_000000-schema.xml"/>
|
||||
<include file="db/changelog-20190422_000000-schema.xml"/>
|
||||
<include file="db/changelog-20190424_000000-schema.xml"/>
|
||||
</databaseChangeLog>
|
@ -91,6 +91,16 @@ body {
|
||||
border-right: 1px solid #ced4da;
|
||||
}
|
||||
|
||||
#ping-button[disabled=disabled] {
|
||||
background-color: #ced4da;
|
||||
border-color: #c2c5c7;
|
||||
}
|
||||
|
||||
#ping-button[disabled=disabled]:hover {
|
||||
background-color: #737475 !important;
|
||||
border-color: #5d5e5f !important;
|
||||
}
|
||||
|
||||
#take-part[disabled=disabled] {
|
||||
background-color: #ced4da;
|
||||
border-color: #c2c5c7;
|
||||
@ -178,6 +188,22 @@ body {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.note-1 {
|
||||
background-color: #bfffce;
|
||||
}
|
||||
|
||||
.note-2 {
|
||||
background-color: #eaffb4;
|
||||
}
|
||||
|
||||
.note-3 {
|
||||
background-color: #fff69f;
|
||||
}
|
||||
|
||||
.note-4 {
|
||||
background-color: #ff9973;
|
||||
}
|
||||
|
||||
@media (max-width: 1199px) and (min-width: 768px){
|
||||
.paper-control {
|
||||
display: block!important;
|
||||
|
@ -121,7 +121,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group d-flex justify-content-end">
|
||||
<div class="form-group d-flex justify-content-between flex-wrap">
|
||||
<!--<input type="hidden" th:value="*{ping}" th:name="ping"/>-->
|
||||
<input id="ping-button" class="btn btn-primary"
|
||||
type="submit" name="pingConference" value="Ping участникам"
|
||||
th:disabled="*{id == null ? 'true' : 'false'}"/>
|
||||
<input type="hidden" th:value="*{disabledTakePart}" th:name="disabledTakePart"/>
|
||||
<input id="take-part" class="btn btn-primary"
|
||||
type="submit" name="takePart" value="Принять участие"
|
||||
|
@ -4,6 +4,7 @@
|
||||
layout:decorator="default" xmlns:th="">
|
||||
<head>
|
||||
<link rel="stylesheet" type="text/css" href="../css/conference.css"/>
|
||||
<script src="https://code.highcharts.com/highcharts.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div layout:fragment="content">
|
||||
@ -21,8 +22,127 @@
|
||||
<div th:replace="conferences/fragments/confDashboardFragment :: confDashboard(conference=${conference})"/>
|
||||
</th:block>
|
||||
</div>
|
||||
<hr/>
|
||||
<!--chart example-->
|
||||
<nav>
|
||||
<div class="nav nav-tabs" id="nav-tab" role="tablist">
|
||||
<a class="nav-item nav-link active" id="nav-main-tab" data-toggle="tab"
|
||||
href="#nav-stat1" role="tab" aria-controls="nav-stat1" aria-selected="true">Стат1</a>
|
||||
<a class="nav-item nav-link" id="nav-latex-tab" data-toggle="tab"
|
||||
href="#nav-stat2" role="tab" aria-controls="nav-stat2" aria-selected="false">Стат2</a>
|
||||
</div>
|
||||
</nav>
|
||||
<div class="tab-content" id="nav-tabContent">
|
||||
<div class="tab-pane fade show active" id="nav-stat1" role="tabpanel"
|
||||
aria-labelledby="nav-main-tab">
|
||||
<div id="salesByType" style="width:100%; height:400px;"></div>
|
||||
</div>
|
||||
<div class="tab-pane fade" id="nav-stat2" role="tabpanel"
|
||||
aria-labelledby="nav-profile-tab">
|
||||
<div id="salesByRegion" style="width:100%; height:400px;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<!--chart example-->
|
||||
</div>
|
||||
</section>
|
||||
<script th:inline="javascript">
|
||||
/*<![CDATA[*/
|
||||
|
||||
// chart example
|
||||
$(function () {
|
||||
Highcharts.setOptions({
|
||||
lang: {
|
||||
decimalPoint: '.',
|
||||
thousandsSep: ','
|
||||
}
|
||||
});
|
||||
|
||||
drawSalesByTypeChart();
|
||||
drawSalesByRegionChart();
|
||||
});
|
||||
|
||||
|
||||
function drawSalesByRegionChart() {
|
||||
var salesByRegionChart = Highcharts.chart('salesByRegion', {
|
||||
chart: {
|
||||
type: 'pie',
|
||||
margin: 40
|
||||
},
|
||||
title: {
|
||||
text: 'Sales by Region'
|
||||
},
|
||||
tooltip: {
|
||||
pointFormat: "${point.y:,.0f}"
|
||||
},
|
||||
plotOptions: {
|
||||
pie: {
|
||||
allowPointSelect: true,
|
||||
depth: 35
|
||||
}
|
||||
},
|
||||
series: [{
|
||||
name: 'Regions',
|
||||
colorByPoint:true,
|
||||
data: [{
|
||||
name: 'Northeast',
|
||||
y: /*[[${northeastSales}]]*/ 0
|
||||
},{
|
||||
name: 'South',
|
||||
y: /*[[${southSales}]]*/ 0
|
||||
},{
|
||||
name: 'Midwest',
|
||||
y: /*[[${midwestSales}]]*/ 0
|
||||
},{
|
||||
name: 'West',
|
||||
y: /*[[${westSales}]]*/ 0
|
||||
}]
|
||||
}]
|
||||
});
|
||||
}
|
||||
|
||||
function drawSalesByTypeChart() {
|
||||
var salesByTypeChart = Highcharts.chart('salesByType', {
|
||||
chart: {
|
||||
type: 'column',
|
||||
margin: 75
|
||||
},
|
||||
title: {
|
||||
text: 'Sales by Lure Type'
|
||||
},
|
||||
xAxis: {
|
||||
categories: ['May', 'June', 'July']
|
||||
},
|
||||
yAxis: {
|
||||
title: {
|
||||
text: 'Sales (US $)'
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
pointFormat: "${point.y:,.0f}"
|
||||
},
|
||||
plotOptions: {
|
||||
column: {
|
||||
depth: 60,
|
||||
stacking: true,
|
||||
grouping: false,
|
||||
groupZPadding: 10
|
||||
}
|
||||
},
|
||||
series: [{
|
||||
name: 'Inshore',
|
||||
data: /*[[${inshoreSales}]]*/ []
|
||||
}, {
|
||||
name: 'Nearshore',
|
||||
data: /*[[${nearshoreSales}]]*/ []
|
||||
}, {
|
||||
name: 'Offshore',
|
||||
data: /*[[${offshoreSales}]]*/ []
|
||||
}]
|
||||
});
|
||||
}
|
||||
/*]]>*/
|
||||
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -4,12 +4,13 @@
|
||||
<meta charset="UTF-8"/>
|
||||
</head>
|
||||
<body>
|
||||
<div th:fragment="confDashboard (conference)" class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3 dashboard-card">
|
||||
<div th:fragment="confDashboard (conference)" th:class="@{'col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3 dashboard-card ' +
|
||||
${conference.ping == 0 ? '' :
|
||||
conference.ping < 5 ? 'note-1' :
|
||||
conference.ping < 10 ? 'note-2' :
|
||||
conference.ping < 15 ? 'note-3' : 'note-4'} + ''}">
|
||||
<div class="row">
|
||||
<div class="col-2">
|
||||
|
||||
</div>
|
||||
<div class="col col-10 text-right">
|
||||
<div class="col text-right">
|
||||
<p th:if="${conference.url!=null and conference.url!=''}"><a target="_blank" th:href="${conference.url}"><i
|
||||
class="fa fa-external-link fa-1x"
|
||||
aria-hidden="true"></i></a></p>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<div class="col-12 col-sm-12 col-md-12 col-lg-4 col-xl-3">
|
||||
<a href="./conference?id=0" class="btn btn-light toolbar-button">
|
||||
<i class="fa fa-plus-circle" aria-hidden="true"></i>
|
||||
Новая конференцию</a>
|
||||
Новая конференция</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -107,6 +107,7 @@
|
||||
}
|
||||
/*]]>*/
|
||||
|
||||
|
||||
</script>
|
||||
<th:block layout:fragment="scripts">
|
||||
</th:block>
|
||||
|
@ -256,6 +256,7 @@
|
||||
var lid = $("#leaderId option:selected").val();
|
||||
$("#authors [value='" + lid + "']").attr("disabled", "disabled");
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
Loading…
Reference in New Issue
Block a user