课程标签管理 课程分类管理 上传功能实现 登陆日志功能实现

sale
tianea 3 years ago
parent ec45764eb7
commit c320b6e938

@ -33,7 +33,12 @@
<version>3.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.16</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>

@ -22,4 +22,6 @@ public class SystemUtil {
}
public static final String PIC_PATH = getProperty("pic_path");
public static final String PIC_RESOURCE_URL= getProperty("pic_recourse_url");
}

@ -0,0 +1,14 @@
package com.tz.platform.common.core.enmus;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum ClientTypeEnum {
MOBILE(0,"手机"), PC(1,"PC");
private Integer code;
private String desc;
}

@ -0,0 +1,83 @@
package com.tz.platform.common.core.tools;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
public class VerificationCodeUtil {
private VerificationCodeUtil() {
}
private static final int width = 57;// 图像宽度
private static final int height = 21;// 图像高度
public static String create(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 定义输出格式
response.setContentType("image/jpeg");
ServletOutputStream out = response.getOutputStream();
// 准备缓冲图像,不支持表单
BufferedImage bimg = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
Random r = new Random();
// 获取图形上下文环境
Graphics gc = bimg.getGraphics();
// 设定背景色并进行填充
gc.setColor(getRandColor(200, 250));
gc.fillRect(0, 0, width, height);
// 设置图形上下文环境字体
gc.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// 随机产生200条干扰线条使图像中的认证码不易被其他分析程序探测到
gc.setColor(getRandColor(160, 200));
for (int i = 0; i < 200; i++) {
int x1 = r.nextInt(width);
int y1 = r.nextInt(height);
int x2 = r.nextInt(15);
int y2 = r.nextInt(15);
gc.drawLine(x1, y1, x1 + x2, y1 + y2);
}
// 随机产生100个干扰点使图像中的验证码不易被其他分析程序探测到
gc.setColor(getRandColor(120, 240));
for (int i = 0; i < 100; i++) {
int x = r.nextInt(width);
int y = r.nextInt(height);
gc.drawOval(x, y, 0, 0);
}
// 随机产生4个数字的验证码
String rs = "";
String rn = "";
for (int i = 0; i < 4; i++) {
rn = String.valueOf(r.nextInt(10));
rs += rn;
gc.setColor(new Color(20 + r.nextInt(110), 20 + r.nextInt(110), 20 + r.nextInt(110)));
gc.drawString(rn, 13 * i + 1, 16);
}
// 释放图形上下文环境
gc.dispose();
request.getSession().setAttribute("randomCode", rs);
ImageIO.write(bimg, "jpeg", out);
out.flush();
out.close();
return rs;
}
private static Color getRandColor(int fc, int bc) {
Random r = new Random();
if (fc > 255) {
fc = 255;
}
if (bc > 255) {
bc = 255;
}
int red = fc + r.nextInt(bc - fc);// 红
int green = fc + r.nextInt(bc - fc);// 绿
int blue = fc + r.nextInt(bc - fc);// 蓝
return new Color(red, green, blue);
}
}

@ -1 +1,2 @@
pic_path=/Volumes/Lexar/www/pic
pic_path=/Volumes/Lexar/www/pic/
pic_recourse_url=http://localhost:8899/pic/

@ -1,9 +1,12 @@
package com.tz.platform.feign.exam.vo;
import com.tz.platform.common.core.vo.Answer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class QuestionVo {
private Long id;
private Long courseId;

@ -7,7 +7,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableFeignClients(basePackages = "com.tz.platform.feign")
public class ExamApplication {
public static void main(String[] args) {
SpringApplication.run(ExamApplication.class,args);

@ -31,5 +31,5 @@ public class Course implements Serializable {
private List<CourseTag> courseTag;
@Type(type = "json")
@Column(columnDefinition = "json" )
private CouseCat couseCat;
private CourseCat couseCat;
}

@ -0,0 +1,15 @@
package com.tz.platform.entity;
import lombok.Data;
import javax.persistence.*;
@Entity
@Data
@Table(indexes = {@Index(columnList = "name")})
public class CourseCat {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String name;
}

@ -0,0 +1,27 @@
package com.tz.platform.exam.pc;
import com.tz.platform.common.core.base.BaseController;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.exam.pc.biz.PCQuestionBiz;
import com.tz.platform.exam.pc.dto.QuestionDTO;
import com.tz.platform.feign.exam.vo.QuestionVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/pc/question")
public class PCQuestionController extends BaseController {
@Autowired
private PCQuestionBiz pcQuestionBiz;
@GetMapping(value = "list/{pageNo}")
public Result<QuestionDTO> listQuestion(@PathVariable("pageNo") Integer pageNO){
return pcQuestionBiz.list(pageNO);
}
@PostMapping(value = "add")
public Result<String> addQuestion(@RequestBody QuestionVo questionVo){
return pcQuestionBiz.add(questionVo);
}
}

@ -0,0 +1,43 @@
package com.tz.platform.exam.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.entity.Question;
import com.tz.platform.exam.pc.dto.QuestionDTO;
import com.tz.platform.feign.exam.vo.QuestionVo;
import com.tz.platform.repository.QuestionDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.List;
@Component
public class PCQuestionBiz {
@Autowired
private QuestionDao questionDao;
public Result<QuestionDTO> list(Integer pageNo){
QuestionDTO questionDTO = new QuestionDTO();
Pageable pageable = PageRequest.of(pageNo,20);
Page<Question> questions = questionDao.findAll(pageable);
return Result.success(questionDTO.setQuestions(questions));
}
public Result<String> add(QuestionVo questionVo){
if(!StringUtils.hasText(questionVo.getAnalysis())){
return Result.error("解析不能为空");
}
if(!StringUtils.hasText(questionVo.getCourseName())){
return Result.error("标题不能为空");
}
if(!StringUtils.hasText(questionVo.getStem())){
return Result.error("题干不能为空");
}
return Result.success("success");
}
}

@ -0,0 +1,14 @@
package com.tz.platform.exam.pc.dto;
import com.tz.platform.entity.Question;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.domain.Page;
import java.io.Serializable;
@Data
@Accessors(chain = true)
public class QuestionDTO implements Serializable {
Page<Question> questions;
}

@ -0,0 +1,25 @@
package com.tz.platform.exam.pc.vo;
import com.tz.platform.common.core.vo.Answer;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class QuestionVO {
private Long id;
private Long courseId;
private String courseName;
private Long levelId;
private String levelName;
private Long questionType;
private String title;
private Long score;
private Integer type;
private String stem;
private String stemImg;
private Long creatorId;
List<Answer> answerList;
private String analysis;
private List<Integer> answerId;
}

@ -0,0 +1,35 @@
package com.tz.platform.pc;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.pc.biz.PCCourseCatBiz;
import com.tz.platform.pc.dto.CourseCatDTO;
import com.tz.platform.pc.vo.CourseCatVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/pc/course/cat")
public class CourseCateController {
@Autowired
private PCCourseCatBiz pcCourseCatBiz;
@GetMapping(value = "list")
public Result<CourseCatDTO> list(){
return pcCourseCatBiz.list();
}
@PostMapping(value = "add")
public Result<Long> add(@RequestBody CourseCatVO courseCatVO){
return pcCourseCatBiz.add(courseCatVO);
}
@PostMapping(value = "update")
public Result<String> update(@RequestBody CourseCatVO courseCatVO){
return pcCourseCatBiz.update(courseCatVO);
}
@PostMapping(value = "delete")
public Result<String> delete(@RequestBody CourseCatVO courseCatVO){
return pcCourseCatBiz.delete(courseCatVO);
}
}

@ -0,0 +1,35 @@
package com.tz.platform.pc;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.pc.biz.PCCourseTagBiz;
import com.tz.platform.pc.dto.CourseTagDTO;
import com.tz.platform.pc.vo.CourseTagVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(value = "/pc/course/tag")
public class PCCourseTagController {
@Autowired
private PCCourseTagBiz pcCourseTagBiz;
@GetMapping(value = "list")
public Result<CourseTagDTO> list(){
return pcCourseTagBiz.list();
}
@PostMapping(value = "add")
public Result<Long> add(@RequestBody CourseTagVO courseCatVO){
return pcCourseTagBiz.add(courseCatVO);
}
@PostMapping(value = "update")
public Result<String> update(@RequestBody CourseTagVO courseCatVO){
return pcCourseTagBiz.update(courseCatVO);
}
@PostMapping(value = "delete")
public Result<String> delete(@RequestBody CourseTagVO courseCatVO){
return pcCourseTagBiz.delete(courseCatVO);
}
}

@ -0,0 +1,57 @@
package com.tz.platform.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.entity.CourseCat;
import com.tz.platform.pc.dto.CourseCatDTO;
import com.tz.platform.pc.vo.CourseCatVO;
import com.tz.platform.repository.CourseCatDao;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
public class PCCourseCatBiz {
@Autowired
private CourseCatDao courseCatDao;
public Result<CourseCatDTO> list(){
CourseCatDTO courseCatDTO = new CourseCatDTO();
courseCatDTO.setList(courseCatDao.findAll());
return Result.success(courseCatDTO);
}
public Result<Long> add(CourseCatVO courseCatVO){
if(StringUtils.isEmpty(courseCatVO.getName())){
return Result.error("分类名不能为空");
}
CourseCat courseCat = courseCatDao.getByName(courseCatVO.getName());
if(courseCat!=null){
return Result.error("分类已存在");
}
courseCat = new CourseCat();
courseCat.setName(courseCatVO.getName());
courseCat = courseCatDao.save(courseCat);
return Result.success(courseCat.getId());
}
public Result<String> update(CourseCatVO courseCatVO){
if(courseCatVO.getId() == null){
return Result.error("分类ID不能为空");
}
if(StringUtils.isEmpty(courseCatVO.getName())){
return Result.error("分类名不能为空");
}
CourseCat courseCat = new CourseCat();
BeanUtils.copyProperties(courseCatVO,courseCat);
courseCatDao.save(courseCat);
return Result.success("success");
}
public Result<String> delete(CourseCatVO courseCatVO){
courseCatDao.deleteById(courseCatVO.getId());
return Result.success("success");
}
}

@ -0,0 +1,57 @@
package com.tz.platform.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.common.core.tools.BeanUtils;
import com.tz.platform.entity.CourseTag;
import com.tz.platform.pc.dto.CourseTagDTO;
import com.tz.platform.pc.vo.CourseTagVO;
import com.tz.platform.repository.CourseTagDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
@Component
public class PCCourseTagBiz {
@Autowired
public CourseTagDao courseTagDao;
public Result<CourseTagDTO> list(){
CourseTagDTO courseCatDTO = new CourseTagDTO();
courseCatDTO.setList(courseTagDao.findAll());
return Result.success(courseCatDTO);
}
public Result<Long> add(CourseTagVO courseCatVO){
if(StringUtils.isEmpty(courseCatVO.getName())){
return Result.error("标签名不能为空");
}
CourseTag courseCat = courseTagDao.getByName(courseCatVO.getName());
if(courseCat!=null){
return Result.error("分类已存在");
}
courseCat = new CourseTag();
courseCat.setName(courseCatVO.getName());
courseCat = courseTagDao.save(courseCat);
return Result.success(courseCat.getId());
}
public Result<String> update(CourseTagVO courseCatVO){
if(courseCatVO.getId() == null){
return Result.error("标签ID不能为空");
}
if(StringUtils.isEmpty(courseCatVO.getName())){
return Result.error("标签名不能为空");
}
CourseTag courseCat = BeanUtils.copyProperties(courseCatVO,CourseTag.class);
courseTagDao.save(courseCat);
return Result.success("success");
}
public Result<String> delete(CourseTagVO courseCatVO){
courseTagDao.deleteById(courseCatVO.getId());
return Result.success("success");
}
}

@ -0,0 +1,14 @@
package com.tz.platform.pc.dto;
import com.tz.platform.entity.CourseCat;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
public class CourseCatDTO implements Serializable {
List<CourseCat> list;
}

@ -0,0 +1,12 @@
package com.tz.platform.pc.dto;
import com.tz.platform.entity.CourseTag;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class CourseTagDTO implements Serializable {
List<CourseTag> list;
}

@ -0,0 +1,11 @@
package com.tz.platform.pc.vo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class CourseCatVO {
private Long id;
private String name;
}

@ -0,0 +1,9 @@
package com.tz.platform.pc.vo;
import lombok.Data;
@Data
public class CourseTagVO {
private Long id;
private String name;
}

@ -0,0 +1,11 @@
package com.tz.platform.repository;
import com.tz.platform.entity.CourseCat;
import com.tz.platform.entity.CourseTag;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CourseCatDao extends JpaRepository<CourseCat,Long> {
CourseCat getByName(String name);
}

@ -6,4 +6,5 @@ import org.springframework.stereotype.Repository;
@Repository
public interface CourseTagDao extends JpaRepository<CourseTag,Long> {
CourseTag getByName(String name);
}

@ -1,10 +1,14 @@
package com.tz.platform.repository;
import com.tz.platform.entity.Question;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface QuestionDao extends JpaRepository<Question,Long> {
Question getById(Long id);
Page<Question> findAll(Pageable pageable);
}

@ -17,7 +17,6 @@ import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.factory.rewrite.CachedBodyOutputMessage;
import org.springframework.cloud.gateway.support.BodyInserterContext;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.HttpHeaders;
@ -53,12 +52,17 @@ public class TzGlobalFilter implements GlobalFilter , Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
String ip = getRemoteIp(request);
String uri = request.getPath().value();
if (uri.contains("/callback")) {
// 第三方回调接口,不鉴权
return chain.filter(exchange);
}
if(uri.contains("login")){
return request(exchange, chain, modifiedBody(exchange));
}
if (uri.contains("/api")) {
// 路径存在关键词:/api不鉴权
return chain.filter(exchange);
@ -79,7 +83,7 @@ public class TzGlobalFilter implements GlobalFilter , Ordered {
// 更新时间,使用户菜单不过期
// stringRedisTemplate.opsForValue().set(RedisPreEnum.ADMINI_MENU.getCode().concat(userNo.toString()), tk, 1, TimeUnit.HOURS);
}
return request(exchange, chain, modifiedBody(exchange, userNo));
return request(exchange, chain, modifiedBody(exchange,USERNO, userNo));
}
// 校验用户是否有权限
@ -96,6 +100,26 @@ public class TzGlobalFilter implements GlobalFilter , Ordered {
return false;
}
/**
* PC
* @param request
* @return
*/
public String getDevice(ServerHttpRequest request) {
String requestHeader = request.getHeaders().getFirst("user-agent");
String[] deviceArray = new String[] {"android","mac os","windows phone"};
if(requestHeader==null) {
return "PC";
}
requestHeader = requestHeader.toLowerCase();
for (String device:deviceArray) {
if(requestHeader.indexOf(device)!=-1) {
return "MOBILE";
}
}
return "PC";
}
private String getRemoteIp(ServerHttpRequest request){
HttpHeaders headers = request.getHeaders();
String ip = headers.getFirst("x-forwarded-for");
@ -126,8 +150,30 @@ public class TzGlobalFilter implements GlobalFilter , Ordered {
return ip;
}
private Mono<String> modifiedBody(ServerWebExchange serverWebExchange){
String device = getDevice(serverWebExchange.getRequest());
String ip = getRemoteIp(serverWebExchange.getRequest());
MediaType mediaType = serverWebExchange.getRequest().getHeaders().getContentType();
ServerRequest serverRequest = ServerRequest.create(serverWebExchange, HandlerStrategies.withDefaults().messageReaders());
return serverRequest.bodyToMono(String.class).flatMap(body -> {
JSONObject bodyJson;
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(mediaType)) {
Map<String, Object> bodyMap = decodeBody(body);
bodyJson = JSONUtil.parseObj(bodyMap);
} else {
bodyJson = JSONUtil.parseObj(body);
}
if (ObjectUtil.isNotNull(device)) {
bodyJson.set("client", device);
}
if(ObjectUtil.isNotEmpty(ip)){
bodyJson.set("ip", ip);
}
return Mono.just(JSONUtil.toJsonStr(bodyJson));
});
}
private Mono<String> modifiedBody(ServerWebExchange serverWebExchange, Long userNo) {
private Mono<String> modifiedBody(ServerWebExchange serverWebExchange,String name, Object value) {
MediaType mediaType = serverWebExchange.getRequest().getHeaders().getContentType();
ServerRequest serverRequest = ServerRequest.create(serverWebExchange, HandlerStrategies.withDefaults().messageReaders());
@ -139,8 +185,8 @@ public class TzGlobalFilter implements GlobalFilter , Ordered {
} else {
bodyJson = JSONUtil.parseObj(body);
}
if (ObjectUtil.isNotNull(userNo)) {
bodyJson.set(USERNO, userNo);
if (ObjectUtil.isNotNull(value)) {
bodyJson.set(name, value);
}
return Mono.just(JSONUtil.toJsonStr(bodyJson));
});

@ -15,6 +15,7 @@
<module>competition</module>
<module>system</module>
<module>exam</module>
<module>upload</module>
</modules>
<properties>

@ -0,0 +1,11 @@
package com.tz.platform.feign;
import com.tz.platform.feign.vo.StudentLevelVo;
import org.springframework.cloud.openfeign.FeignClient;
import java.util.List;
@FeignClient(value = "tz-system-service")
public interface IFeignStudentLevel {
List<StudentLevelVo> list();
}

@ -0,0 +1,11 @@
package com.tz.platform.feign.vo;
import lombok.Data;
import java.io.Serializable;
@Data
public class StudentLevelVo implements Serializable {
private Integer id;
private String name;
}

@ -32,5 +32,11 @@
<groupId>com.tz</groupId>
<artifactId>system-feign</artifactId>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

@ -1,18 +1,23 @@
package com.tz.platform.entity;
import com.vladmihalcea.hibernate.type.json.JsonStringType;
import lombok.Data;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
@Entity
@Data
@TypeDef(name = "json", typeClass = JsonStringType.class)
public class Region implements Serializable {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
private String name;
@Type(type = "json")
@Column(columnDefinition = "json" )
private List<String> province;
}

@ -9,9 +9,12 @@ import javax.persistence.Id;
@Entity
@Data
public class CouseCat {
public class StudentLevel {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
}

@ -0,0 +1,9 @@
package com.tz.platform.repository;
import com.tz.platform.entity.StudentLevel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface StudentLevelDao extends JpaRepository<StudentLevel,Integer> {
}

@ -0,0 +1,16 @@
package com.tz.platform.system.feign;
import com.tz.platform.feign.IFeignStudentLevel;
import com.tz.platform.feign.vo.StudentLevelVo;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class FeignStudentLevelController implements IFeignStudentLevel {
@Override
public List<StudentLevelVo> list() {
return null;
}
}

@ -1,8 +1,42 @@
package com.tz.platform.system.feign;
import com.tz.platform.common.core.base.BaseController;
import com.tz.platform.feign.IFeignSysMenu;
import com.tz.platform.feign.qo.SysMenuQO;
import com.tz.platform.feign.vo.SysMenuVO;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class FeignSystemMenuController extends BaseController {
public class FeignSystemMenuController extends BaseController implements IFeignSysMenu {
@Override
public List<SysMenuVO> list(SysMenuQO qo) {
return null;
}
@Override
public int save(SysMenuQO qo) {
return 0;
}
@Override
public int deleteById(Long id) {
return 0;
}
@Override
public int updateById(SysMenuQO qo) {
return 0;
}
@Override
public SysMenuVO getById(Long id) {
return null;
}
@Override
public List<String> listByUserAndMenu(Long userNo) {
return null;
}
}

@ -0,0 +1,24 @@
package com.tz.platform.system.feign.biz;
import com.tz.platform.entity.StudentLevel;
import com.tz.platform.feign.vo.StudentLevelVo;
import com.tz.platform.repository.StudentLevelDao;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class FeignStudentLevelBiz {
@Autowired
private StudentLevelDao studentLevelDao;
public List<StudentLevelVo> list(){
List<StudentLevelVo> rs= new ArrayList<>();
List<StudentLevel> studentLevels = studentLevelDao.findAll();
BeanUtils.copyProperties(studentLevels,rs);
return rs;
}
}

@ -0,0 +1,21 @@
package com.tz.platform.system.pc;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.system.pc.biz.PCMenuBiz;
import com.tz.platform.system.pc.dto.MenuDTO;
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.RestController;
@RestController
@RequestMapping(value = "/pc/menu")
public class PCMenuController {
@Autowired
private PCMenuBiz pcMenuBiz;
@GetMapping(value = "menu")
public Result<MenuDTO> listMenu(){
return pcMenuBiz.listMenu();
}
}

@ -0,0 +1,20 @@
package com.tz.platform.system.pc;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.system.pc.bo.ProvinceBO;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/pc/system")
public class PcSystemController {
@PostMapping(value = "province/add")
public Result<String> addProvice(@RequestBody ProvinceBO provinceBO){
return Result.success("success");
}
}

@ -0,0 +1,28 @@
package com.tz.platform.system.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.entity.Menu;
import com.tz.platform.repository.MenuDao;
import com.tz.platform.system.pc.dto.MenuDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
@Component
public class PCMenuBiz {
@Autowired
private MenuDao menuDao;
public Result<MenuDTO> listMenu(){
List<Menu> menuList = menuDao.findAll();
List<Menu> parent = menuList.stream().filter(menu->menu.getParentId()==0).collect(Collectors.toList());
MenuDTO menuDTO = new MenuDTO();
parent.forEach(menu -> {
List<Menu> child = menuList.stream().filter(menu1 -> menu1.getParentId() == menu.getId()).collect(Collectors.toList());
});
return Result.success(menuDTO);
}
}

@ -0,0 +1,22 @@
package com.tz.platform.system.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.entity.Province;
import com.tz.platform.repository.ProvinceDao;
import com.tz.platform.system.pc.bo.ProvinceBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PCProvinceBiz {
@Autowired
private ProvinceDao provinceDao;
public Result<String> addProvince(ProvinceBO provinceBO){
Province province = new Province();
province.setName(provinceBO.getName());
return Result.success("success");
}
}

@ -0,0 +1,8 @@
package com.tz.platform.system.pc.bo;
import lombok.Data;
@Data
public class ProvinceBO {
private String name;
}

@ -0,0 +1,14 @@
package com.tz.platform.system.pc.dto;
import com.tz.platform.entity.Menu;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
@Data
@Accessors(chain = true)
public class MenuDTO implements Serializable {
List<Menu> menuList;
}

@ -1,5 +1,5 @@
server:
port: 50013
port: 50014
spring:
application:
name: tz-system-service
@ -15,3 +15,5 @@ spring:
file-extension: yaml
discovery:
namespace: ${spring.profiles.active}
main:
allow-bean-definition-overriding: true

@ -0,0 +1,11 @@
package com.tz.platform.repository;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class ProvinceRepositoryTest {
public void addPronviceTest(){
}
}

@ -0,0 +1,26 @@
package com.tz.platform.repository;
import com.tz.platform.entity.Region;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@SpringBootTest
public class RegionRepositoryTest {
@Autowired
private RegionDao regionDao;
@Test
public void regionSaveTest(){
Region region = new Region();
region.setName("华中地区");
List<String> provinces = new ArrayList<>();
provinces.addAll(Arrays.asList("湖北省","河南省","湖南省"));
region.setProvince(provinces);
regionDao.save(region);
}
}

@ -1,5 +1,5 @@
server:
port: 50013
port: 50014
spring:
application:
name: tz-system-service
@ -15,3 +15,5 @@ spring:
file-extension: yaml
discovery:
namespace: ${spring.profiles.active}
main:
allow-bean-definition-overriding: true

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>platform</artifactId>
<groupId>com.tz</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>upload</artifactId>
<packaging>pom</packaging>
<modules>
<module>upload-feign</module>
<module>upload-service</module>
</modules>
</project>

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>upload</artifactId>
<groupId>com.tz</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>upload-feign</artifactId>
</project>

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>upload</artifactId>
<groupId>com.tz</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>upload-service</artifactId>
<dependencies>
<dependency>
<groupId>com.tz</groupId>
<artifactId>common-core</artifactId>
</dependency>
<dependency>
<groupId>com.tz</groupId>
<artifactId>common-service</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,13 @@
package com.tz.platform;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class UploadServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UploadServiceApplication.class,args);
}
}

@ -0,0 +1,20 @@
package com.tz.platform.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
@Entity
@Data
public class Image {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String path;
private String url;
private Date createTime;
}

@ -0,0 +1,40 @@
package com.tz.platform.image.pc.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.common.core.config.SystemUtil;
import com.tz.platform.entity.Image;
import com.tz.platform.image.pc.dto.ImageDTO;
import com.tz.platform.repository.ImageDao;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Date;
@Component
public class PCImageBiz {
@Autowired
private ImageDao imageDao;
public Result<ImageDTO> uploadImg(MultipartFile multipartFile,int w,int h){
ImageDTO imageDTO = new ImageDTO();
Image image = new Image();
String fileName = System.currentTimeMillis()+"";
try {
Thumbnails.of(multipartFile.getResource().getInputStream()).size(w,h).outputFormat("png").toFile(SystemUtil.PIC_PATH+fileName);
} catch (IOException e) {
e.printStackTrace();
return Result.error("上传失败");
}
image.setCreateTime(new Date());
image.setPath(SystemUtil.PIC_PATH+fileName+".png");
image.setUrl(SystemUtil.PIC_RESOURCE_URL+fileName+".png");
imageDao.save(image);
BeanUtils.copyProperties(image,imageDTO);
return Result.success(imageDTO);
}
}

@ -0,0 +1,13 @@
package com.tz.platform.image.pc.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
public class ImageDTO implements Serializable {
private String url ;
private Long id;
private String path;
}

@ -1,9 +1,9 @@
package com.tz.platform.repository;
import com.tz.platform.entity.CourseTag;
import com.tz.platform.entity.Image;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CousreCatDao extends JpaRepository<CourseTag,Long> {
public interface ImageDao extends JpaRepository<Image,Long> {
}

@ -0,0 +1,19 @@
server:
port: 50015
spring:
application:
name: tz-upload-service
profiles:
active: dev
cloud:
nacos:
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
config:
namespace: ${spring.profiles.active}
file-extension: yaml
discovery:
namespace: ${spring.profiles.active}
main:
allow-bean-definition-overriding: true

@ -9,8 +9,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class Application {
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
SpringApplication.run(UserServiceApplication.class,args);
}
}

@ -0,0 +1,23 @@
package com.tz.platform.entity;
import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.util.Date;
@Data
@Entity
public class LoginLog {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private Date loginDate;
private String ip;
private String clientType;
private String location;
private Integer loginStatus;
}

@ -0,0 +1,9 @@
package com.tz.platform.repository;
import com.tz.platform.entity.LoginLog;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface LoginLogDao extends JpaRepository<LoginLog,Long> {
}

@ -15,6 +15,9 @@ public interface UserDao extends JpaRepository<User,Long> {
*/
User findByMobile(String mobile);
User getById(Long id);
/**
*
* @param username

@ -1,42 +0,0 @@
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.entity.User;
import com.tz.platform.repository.UserDao;
import com.tz.platform.user.api.biz.ApiUserInfoBiz;
import com.tz.platform.user.api.bo.UserLoginPasswordBO;
import com.tz.platform.user.api.dto.UserInfoDTO;
import com.tz.platform.user.api.dto.UserLoginDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping(path = "/api/user")
public class UserInfoController extends BaseController {
@Autowired
UserDao userDao;
@Autowired
ApiUserInfoBiz apiUserInfoBiz;
@PostMapping(path = "login")
public Result<UserLoginDTO> loginPassword(@RequestBody UserLoginPasswordBO userLoginPasswordBO){
log(userLoginPasswordBO);
return apiUserInfoBiz.loginPassword(userLoginPasswordBO);
}
@GetMapping(path = "info")
public Result<UserInfoDTO> info(){
UserInfoDTO userInfoDTO = new UserInfoDTO();
userInfoDTO.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
userInfoDTO.setName("管理员");
return Result.success(userInfoDTO);
}
}

@ -0,0 +1,25 @@
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.user.api.biz.ApiUserLoginBiz;
import com.tz.platform.user.api.bo.UserLoginPasswordBO;
import com.tz.platform.user.api.dto.UserLoginDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/user/login")
public class UserLoginController extends BaseController {
@Autowired
private ApiUserLoginBiz apiUserLoginBiz;
@PostMapping(path = "password")
public Result<UserLoginDTO> loginPassword(@RequestBody UserLoginPasswordBO userLoginPasswordBO){
return apiUserLoginBiz.loginPassword(userLoginPasswordBO);
}
}

@ -89,46 +89,5 @@ public class ApiUserInfoBiz {
/**
*
* @param userLoginPasswordBO
* @return
*/
public Result<UserLoginDTO> loginPassword(UserLoginPasswordBO userLoginPasswordBO){
if (StringUtils.isEmpty(userLoginPasswordBO.getUsername())) {
return Result.error("用户名不能为空");
}
if (StringUtils.isEmpty(userLoginPasswordBO.getPassword())) {
return Result.error("密码不能为空");
}
// 密码错误次数校验
// 用户校验
User user = userDao.getByUsername(userLoginPasswordBO.getUsername());
if (null == user) {
return Result.error("账号或者密码不正确");
}
// 密码校验
if (!DigestUtil.sha1Hex(user.getMobileSalt() + userLoginPasswordBO.getPassword()).equals(user.getMobilePsw())) {
// 放入缓存,错误次数+1
return Result.error("账号或者密码不正确");
}
// 登录日志
// loginLog(user.getUserNo(), userLoginPasswordBO.getClientId(), LoginStatusEnum.SUCCESS, userLoginPasswordBO.getIp());
UserLoginDTO dto = new UserLoginDTO();
dto.setUserNo(user.getId());
dto.setUsername(user.getUsername());
dto.setToken(JWTUtil.create(user.getId(), JWTUtil.DATE));
// 登录成功,存入缓存,单点登录使用
// redisTemplate.opsForValue().set(dto.getUserNo().toString(), dto.getToken(), 1, TimeUnit.DAYS);
return Result.success(dto);
}
}

@ -0,0 +1,82 @@
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.enmus.LoginStatusEnum;
import com.tz.platform.common.core.tools.JWTUtil;
import com.tz.platform.entity.LoginLog;
import com.tz.platform.entity.User;
import com.tz.platform.repository.LoginLogDao;
import com.tz.platform.repository.UserDao;
import com.tz.platform.user.api.bo.UserLoginPasswordBO;
import com.tz.platform.user.api.dto.UserLoginDTO;
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.Date;
@Component
public class ApiUserLoginBiz {
@Autowired
private UserDao userDao;
@Autowired
private LoginLogDao loginLogDao;
@Autowired
private RedisTemplate redisTemplate;
/**
*
* @param userLoginPasswordBO
* @return
*/
public Result<UserLoginDTO> loginPassword(UserLoginPasswordBO userLoginPasswordBO){
if (StringUtils.isEmpty(userLoginPasswordBO.getUsername())) {
return Result.error("用户名不能为空");
}
if (StringUtils.isEmpty(userLoginPasswordBO.getPassword())) {
return Result.error("密码不能为空");
}
// 密码错误次数校验
// 用户校验
User user = userDao.getByUsername(userLoginPasswordBO.getUsername());
if (null == user) {
return Result.error("账号或者密码不正确");
}
// 密码校验
if (!DigestUtil.sha1Hex(user.getMobileSalt() + userLoginPasswordBO.getPassword()).equals(user.getMobilePsw())) {
// 放入缓存,错误次数+1
return Result.error("账号或者密码不正确");
}
// 登录日志
loginLog(LoginStatusEnum.SUCCESS, userLoginPasswordBO.getIp(),user.getUsername(), userLoginPasswordBO.getClient());
UserLoginDTO dto = new UserLoginDTO();
dto.setUserNo(user.getId());
dto.setUsername(user.getUsername());
dto.setToken(JWTUtil.create(user.getId(), JWTUtil.DATE));
// 登录成功,存入缓存,单点登录使用
// redisTemplate.opsForValue().set(dto.getUserNo().toString(), dto.getToken(), 1, TimeUnit.DAYS);
return Result.success(dto);
}
private void loginLog(LoginStatusEnum loginStatusEnum, String ip,String username,String clientType){
LoginLog loginLog = new LoginLog();
loginLog.setIp(ip);
loginLog.setUsername(username);
loginLog.setLoginDate(new Date());
loginLog.setClientType(clientType);
loginLog.setLoginStatus(loginStatusEnum.getCode());
loginLogDao.save(loginLog);
}
}

@ -24,4 +24,6 @@ public class UserLoginPasswordBO implements Serializable {
private String password;
private String ip;
private String client;
}

@ -0,0 +1,28 @@
package com.tz.platform.user.auth;
import com.tz.platform.common.core.base.BaseController;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.repository.UserDao;
import com.tz.platform.user.auth.biz.AuthUserInfoBiz;
import com.tz.platform.user.auth.dto.AuthUserInfoDTO;
import com.tz.platform.user.auth.vo.UserInfoVo;
import jdk.nashorn.internal.objects.annotations.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(path = "/auth/user")
public class UserInfoController extends BaseController {
@Autowired
UserDao userDao;
@Autowired
AuthUserInfoBiz authUserInfoBiz;
@PostMapping(path = "info")
public Result<AuthUserInfoDTO> info(@RequestBody UserInfoVo userInfoVo){
return authUserInfoBiz.info(userInfoVo.getUserNo());
}
}

@ -0,0 +1,26 @@
package com.tz.platform.user.auth.biz;
import com.tz.platform.common.core.base.Result;
import com.tz.platform.entity.User;
import com.tz.platform.repository.UserDao;
import com.tz.platform.user.auth.dto.AuthUserInfoDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class AuthUserInfoBiz {
@Autowired
private UserDao userDao;
public Result<AuthUserInfoDTO> info(Long userNo){
AuthUserInfoDTO authUserInfoDTO = new AuthUserInfoDTO();
log.info(userNo+"");
User user =userDao.getById(userNo);
BeanUtils.copyProperties(user,authUserInfoDTO);
return Result.success(authUserInfoDTO);
}
}

@ -0,0 +1,17 @@
package com.tz.platform.user.auth.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
public class AuthUserInfoDTO implements Serializable {
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "头像")
private String avatar;
}

@ -0,0 +1,10 @@
package com.tz.platform.user.auth.vo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class UserInfoVo {
private Long userNo;
}

@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class FeignUserController implements IFeignUser {
@ -22,4 +24,9 @@ public class FeignUserController implements IFeignUser {
public UserVo getByMobile(@PathVariable(value = "mobile") String mobile){
return feignUserBiz.getByMobile(mobile);
}
@Override
public int batchInser(List<UserVo> userVoList) {
return 0;
}
}

@ -0,0 +1,4 @@
package com.tz.platform.user.pc.biz;
public class PCUserLoginBiz {
}
Loading…
Cancel
Save