Skip to content

Commit

Permalink
Refactor-iteration-v2-without-block-chain merge to release (#133)
Browse files Browse the repository at this point in the history
* refactor: 用户权限、身份、组关系重构

* refactor: 用户权限、身份、组关系重构,新增一些工具类

* refactor: 用户权限、身份、组关系重构,新增一些工具类

* refactor: 合并po与entity,复原删除的原始代码,优化项目包结构

* feat: 新增公告栏功能;
perf: dc汇总表格新增两列.

* feat: 新增实习期功能;
perf: 优化公告栏功能.

* docs: 新增测试sql脚本.

* docs: 更新测试sql脚本.

* fix: 改进实习申请添加逻辑.

* fix: 修改po_entity类威entity.

* fix: 修改po_entity类为entity.

* fix: 修改Dockerfile.

* fix: 修复绩效申请失效bug.
  • Loading branch information
GLaxky committed Sep 12, 2023
1 parent 0096a32 commit 141dfba
Show file tree
Hide file tree
Showing 248 changed files with 3,849 additions and 736 deletions.
34 changes: 30 additions & 4 deletions Dockerfile
@@ -1,8 +1,34 @@
#FROM openjdk:11
#MAINTAINER LiXiaoKang 191250075@smail.nju.edu.cn
#WORKDIR /ROOT
#ADD ./target/dingtalk-0.0.1-SNAPSHOT.jar /ROOT/
#ENV LD_LIBRARY_PATH /usr/lib
#ENV PROFILES="prod"
#EXPOSE 8080
#ENTRYPOINT ["sh", "-c", "java -jar dingtalk-0.0.1-SNAPSHOT.jar --spring.profiles.active=$PROFILES"]

# First stage: complete build environment
FROM maven:3.6.3-jdk-11-slim AS builder
WORKDIR /code
COPY . /code
# add pom.xml and source code
ADD ./pom.xml /code/pom.xml
ADD ./src /code/src
# package jar
COPY ./settings.xml /root/.m2/settings.xml
RUN mvn package -DskipTests

# Second stage: minimal runtime environment
FROM openjdk:11
MAINTAINER zhanyeye zhanyeye@qq.com
WORKDIR /ROOT
ADD ./target/dingtalk-0.0.1-SNAPSHOT.jar /ROOT/
WORKDIR /app
# Change TimeZone
# RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
LABEL maintainer="191250075@smail.nju.edu.cn"
# copy jar from the first stage
COPY --from=builder /code/target/dingtalk-2.0.1-SNAPSHOT.jar /app/app.jar

ENV LD_LIBRARY_PATH /usr/lib
ENV PROFILES="prod"
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java -jar dingtalk-0.0.1-SNAPSHOT.jar --spring.profiles.active=$PROFILES"]
# run jar
ENTRYPOINT ["sh", "-c", "java -jar /app/app.jar --spring.profiles.active=$PROFILES"]
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -88,7 +88,7 @@
</tbody>
</table>

+ 钉钉SDK的封装 👉 :[com.softeng.dingtalk.api](https://github.com/nju-softeng/dingtalk-app-server/tree/main/src/main/java/com/softeng/dingtalk/api)
+ 钉钉SDK的封装 👉 :[com.softeng.dingtalk.dingApi](https://github.com/nju-softeng/dingtalk-app-server/tree/main/src/main/java/com/softeng/dingtalk/api)
+ 项目前端代码 👉 :[dingtalk-app-web](https://github.com/nju-softeng/dingtalk-app-web)

### 注意事项
Expand Down
4 changes: 2 additions & 2 deletions pom.xml
Expand Up @@ -10,7 +10,7 @@
</parent>
<groupId>com.softeng</groupId>
<artifactId>dingtalk</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>2.0.1-SNAPSHOT</version>
<name>dingtalk</name>
<description>Demo project for dingtalk mini program</description>

Expand Down Expand Up @@ -182,7 +182,7 @@
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.0.0</version>
<version>3.0.5</version>
</dependency>

<dependency>
Expand Down
14 changes: 14 additions & 0 deletions settings.xml
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>

</settings>
4 changes: 2 additions & 2 deletions src/main/java/com/softeng/dingtalk/DingtalkApplication.java
@@ -1,7 +1,7 @@
package com.softeng.dingtalk;

import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import com.softeng.dingtalk.repository.impl.CustomizedRepositoryImpl;
import com.softeng.dingtalk.dao.repository.impl.CustomizedRepositoryImpl;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
Expand All @@ -13,7 +13,7 @@
@EnableCaching
@EnableScheduling
@SpringBootApplication
@MapperScan("com.softeng.dingtalk.mapper")
@MapperScan("com.softeng.dingtalk.dao.mapper")
@EnableJpaRepositories(repositoryBaseClass = CustomizedRepositoryImpl.class)
public class DingtalkApplication {

Expand Down
21 changes: 5 additions & 16 deletions src/main/java/com/softeng/dingtalk/aspect/ACBlockchainAspect.java
@@ -1,28 +1,17 @@
package com.softeng.dingtalk.aspect;


import com.alibaba.fastjson.JSON;
import com.softeng.dingtalk.entity.AcRecord;
import com.softeng.dingtalk.fabric.FabricManager;
import com.softeng.dingtalk.repository.AcRecordRepository;
import com.softeng.dingtalk.dao.repository.AcRecordRepository;
import com.softeng.dingtalk.service.SystemService;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.hyperledger.fabric.sdk.exception.CryptoException;
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
import org.hyperledger.fabric.sdk.exception.TransactionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

@ConditionalOnExpression("${blockchain.service.enable:true}")
Expand All @@ -37,16 +26,16 @@ public class ACBlockchainAspect {
boolean isCreate=false;
//FabricManager manager=FabricManager.obtain();
public static List timeCostList=new ArrayList<>();
@Pointcut("execution(* com.softeng.dingtalk.repository.AcRecordRepository.save(..))")
@Pointcut("execution(* com.softeng.dingtalk.dao.repository.AcRecordRepository.save(..))")
public void saveRecord(){
}

@Pointcut("execution(* com.softeng.dingtalk.repository.AcRecordRepository.deleteAll(..))")
@Pointcut("execution(* com.softeng.dingtalk.dao.repository.AcRecordRepository.deleteAll(..))")
public void deleteRecordList(){
}

@Pointcut("execution(* com.softeng.dingtalk.repository.AcRecordRepository.saveAll(..)) ||" +
"execution(* com.softeng.dingtalk.repository.AcRecordRepository.saveBatch(..))")
@Pointcut("execution(* com.softeng.dingtalk.dao.repository.AcRecordRepository.saveAll(..)) ||" +
"execution(* com.softeng.dingtalk.dao.repository.AcRecordRepository.saveBatch(..))")
public void saveRecordList(){
}

Expand Down
17 changes: 17 additions & 0 deletions src/main/java/com/softeng/dingtalk/aspect/AccessPermission.java
@@ -0,0 +1,17 @@
package com.softeng.dingtalk.aspect;

import com.softeng.dingtalk.enums.PermissionEnum;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* 指定权限通行
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AccessPermission {
PermissionEnum value();
}
28 changes: 28 additions & 0 deletions src/main/java/com/softeng/dingtalk/aspect/AuthAspect.java
@@ -0,0 +1,28 @@
package com.softeng.dingtalk.aspect;

import com.softeng.dingtalk.component.UserContextHolder;
import com.softeng.dingtalk.exception.CustomExceptionEnum;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Aspect
@Component
public class AuthAspect {

@Resource
private UserContextHolder userContextHolder;

@Before("@annotation(accessPermission)")
public void checkPermission(AccessPermission accessPermission) {
for (Integer permissionId : userContextHolder.getUserContext().getPermissionIds()) {
if (accessPermission.value().getCode() == permissionId) {
return;
}
}
CustomExceptionEnum.ACCESS_DENIED.throwWithMessage("需要权限:" + accessPermission.value().getName());
}

}

This file was deleted.

72 changes: 58 additions & 14 deletions src/main/java/com/softeng/dingtalk/component/Timer.java
@@ -1,27 +1,23 @@
package com.softeng.dingtalk.component;

import com.softeng.dingtalk.api.MessageApi;
import com.softeng.dingtalk.constant.LocalUrlConstant;
import com.softeng.dingtalk.entity.*;
import com.softeng.dingtalk.component.dingApi.MessageApi;
import com.softeng.dingtalk.dao.repository.*;
import com.softeng.dingtalk.enums.Position;
import com.softeng.dingtalk.repository.AcRecordRepository;
import com.softeng.dingtalk.repository.ExternalPaperRepository;
import com.softeng.dingtalk.repository.InternalPaperRepository;
import com.softeng.dingtalk.repository.VoteRepository;
import com.softeng.dingtalk.service.InitService;
import com.softeng.dingtalk.service.SystemService;
import com.softeng.dingtalk.service.VoteService;
import com.softeng.dingtalk.service.WeeklyReportService;
import com.softeng.dingtalk.enums.PracticeStateEnum;
import com.softeng.dingtalk.entity.*;
import com.softeng.dingtalk.service.*;
import com.softeng.dingtalk.utils.stuNumUtils.StuNumParser;
import com.softeng.dingtalk.utils.stuNumUtils.StuNumParserFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.transaction.Transactional;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author zhanyeye
Expand Down Expand Up @@ -54,6 +50,11 @@ public class Timer {
@Autowired
SystemService systemService;

@Resource
private PracticeRepository practiceRepository;
@Resource
private UserRepository userRepository;

/**
* 每周周日23点扫描一次,给当天还未提交周报的博士、硕士发送提醒消息
*/
Expand All @@ -67,9 +68,9 @@ public void weeklyReportAndPerformanceFillingReminder() {
* 每周一凌晨2点扫描一次,查询周日一整天没有提交周报的博士、硕士,每人扣 1 ac
*/
@Scheduled(cron = "0 0 2 ? * MON")
public void deductedPointsUnsubmittedWeeklyReport() {
public void deductedPointsUnSubmittedWeeklyReport() {
log.info(LocalDate.now() + " 定时扫描扣分");
systemService.manulDeductedPointsUnsubmittedWeeklyReport(LocalDate.now().minusDays(1));
systemService.manualDeductedPointsUnSubmittedWeeklyReport(LocalDate.now().minusDays(1));
}

//每天凌晨扫描一次,会议的AC结算
Expand Down Expand Up @@ -174,4 +175,47 @@ private String startVoteInfo(String title, LocalDateTime dateTime) {
return " #### 投票 \n ##### 论文: " + title + " \n 截止时间: " + dateTime.toLocalTime().toString();
}


// @Scheduled(cron = "0/20 * * * * ?")
// public void test() {
// log.info(LocalDate.now() + "test");
// }

/**
* 每天凌晨一点根据审核通过的实习申请修改对应用户的工作状态
*/
@Scheduled(cron = "0 0 1 * * ?")
public void editWorkState() {
log.info("每天凌晨一点根据审核通过的实习申请修改对应用户的工作状态");
List<Practice> practiceList = practiceRepository.findAllByStateEquals(PracticeStateEnum.ACCEPTED.getValue());
LocalDate cur = LocalDate.now();
practiceList.forEach(practice -> {
LocalDate start = practice.getStart();
LocalDate end = practice.getEnd();
User user = practice.getUser();
user.setWorkState((cur.isAfter(start) || cur.isEqual(start)) && (cur.isBefore(end) || cur.isEqual(end)));
userRepository.save(user);
});
}

/**
* 每年8月1日凌晨两点进行用户职位的变更
*/
@Scheduled(cron = "0 0 2 1 8 ?")
public void updateUserPosition() {
log.info("每年8月1日进行用户职位的变更");
userRepository.findAllValidUser()
.stream()
// 筛选出设置了学号的用户
.filter((user -> user.getStuNum() != null))
.forEach((user -> {
// 排除教师用户
if(user.getPosition() == Position.TEACHER) return;
StuNumParser parser= StuNumParserFactory.generateParser(user.getStuNum().length());
assert parser != null;
user.setPosition(parser.parse(user.getStuNum()));
userRepository.save(user);
}));
}

}

0 comments on commit 141dfba

Please sign in to comment.