Browse Source

区分模块,按需加载

master
许孟阳 3 years ago
parent
commit
bab88d266c
  1. 2
      java/pom.xml
  2. 22
      java/src/main/java/vip/xumy/admin/AdminApplocation.java
  3. 20
      java/src/main/java/vip/xumy/admin/bmap/BMapInitializer.java
  4. 75
      java/src/main/java/vip/xumy/admin/bmap/controller/BMapController.java
  5. 45
      java/src/main/java/vip/xumy/admin/bmap/controller/ImageController.java
  6. 38
      java/src/main/java/vip/xumy/admin/bmap/mapper/ICityLocateMapper.java
  7. 46
      java/src/main/java/vip/xumy/admin/bmap/mapper/ILoadWorkMapper.java
  8. 29
      java/src/main/java/vip/xumy/admin/bmap/pojo/CityLocate.java
  9. 31
      java/src/main/java/vip/xumy/admin/bmap/pojo/DownWorker.java
  10. 40
      java/src/main/java/vip/xumy/admin/bmap/pojo/Point.java
  11. 105
      java/src/main/java/vip/xumy/admin/bmap/pojo/WorkContext.java
  12. 45
      java/src/main/java/vip/xumy/admin/bmap/service/CityLocateService.java
  13. 71
      java/src/main/java/vip/xumy/admin/bmap/service/LoadWorkService.java
  14. 40
      java/src/main/java/vip/xumy/admin/bmap/util/BMapTool.java
  15. 241
      java/src/main/java/vip/xumy/admin/bmap/util/DownloadWorker.java
  16. 20
      java/src/main/java/vip/xumy/admin/sys/conf/SysInitializer.java
  17. 49
      java/src/main/java/vip/xumy/admin/sys/controller/ConfigController.java
  18. 9
      java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java
  19. 12
      java/src/main/java/vip/xumy/admin/sys/controller/LogController.java
  20. 22
      java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java
  21. 39
      java/src/main/java/vip/xumy/admin/sys/controller/SysPublicContoller.java
  22. 18
      java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java
  23. 26
      java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java
  24. 19
      java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java
  25. 46
      java/src/main/java/vip/xumy/admin/sys/mapper/IDictTypeMapper.java
  26. 41
      java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java
  27. 28
      java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java
  28. 6
      java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java
  29. 6
      java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java
  30. 8
      java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java
  31. 14
      java/src/main/java/vip/xumy/admin/sys/service/ConfigService.java
  32. 60
      java/src/main/java/vip/xumy/admin/sys/service/DictionaryService.java
  33. 31
      java/src/main/java/vip/xumy/admin/sys/service/IConfigService.java
  34. 35
      java/src/main/java/vip/xumy/admin/sys/service/IDictionaryService.java
  35. 23
      java/src/main/java/vip/xumy/admin/sys/service/ILogService.java
  36. 24
      java/src/main/java/vip/xumy/admin/sys/service/IUserItemService.java
  37. 12
      java/src/main/java/vip/xumy/admin/sys/service/LogService.java
  38. 21
      java/src/main/java/vip/xumy/admin/sys/service/UserItemService.java
  39. 33
      java/src/main/java/vip/xumy/admin/um/conf/PermissionInteceptor.java
  40. 25
      java/src/main/java/vip/xumy/admin/um/conf/UMInitializer.java
  41. 9
      java/src/main/java/vip/xumy/admin/um/conf/UMWebMvcConfigurer.java
  42. 2
      java/src/main/java/vip/xumy/admin/um/controller/PageController.java
  43. 21
      java/src/main/java/vip/xumy/admin/um/controller/PublicContoller.java
  44. 4
      java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java
  45. 104
      java/src/main/java/vip/xumy/admin/verify/conf/BaseConfigurer.java
  46. 37
      java/src/main/java/vip/xumy/admin/verify/conf/LoginInteceptor.java
  47. 25
      java/src/main/java/vip/xumy/admin/verify/conf/VerifyInitializer.java
  48. 52
      java/src/main/java/vip/xumy/admin/verify/controller/PublicController.java
  49. 24
      java/src/main/java/vip/xumy/admin/verify/mapper/IUserMapper.java
  50. 24
      java/src/main/java/vip/xumy/admin/verify/pojo/User.java
  51. 23
      java/src/main/java/vip/xumy/admin/verify/service/UserService.java
  52. 4
      java/src/main/resources/application.properties
  53. 77
      java/src/main/resources/mapper/sys/IActionLogMapper.xml
  54. 66
      java/src/main/resources/mapper/sys/IConfigMapper.xml
  55. 153
      java/src/main/resources/mapper/sys/IDictionaryMapper.xml
  56. 95
      java/src/main/resources/mapper/sys/IUserItemMapper.xml

2
java/pom.xml

@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
</parent>
<groupId>vip.xumy.admin</groupId>
<artifactId>xumy_admin</artifactId>
<version>0.0.1</version>
<version>1.2.0</version>
<name>admin</name>
<description>xumy-admin</description>
<packaging>jar</packaging>

22
java/src/main/java/vip/xumy/admin/AdminApplocation.java

@ -1,28 +1,18 @@ @@ -1,28 +1,18 @@
package vip.xumy.admin;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import vip.xumy.admin.sys.conf.SysInitializer;
import vip.xumy.admin.um.conf.UMInitializer;
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = "vip.xumy", useDefaultFilters = true)
@MapperScan("vip.xumy.admin.**.mapper")
public class AdminApplocation extends SpringBootServletInitializer {
public class AdminApplocation {
public static void main(String[] args) {
SpringApplication.run(AdminApplocation.class);
Class<?>[] arr = new Class<?>[] {UMInitializer.class, SysInitializer.class};
SpringApplication.run(arr,args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(AdminApplocation.class);
}
}

20
java/src/main/java/vip/xumy/admin/bmap/BMapInitializer.java

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
package vip.xumy.admin.bmap;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = "vip.xumy.admin.bmap", useDefaultFilters = true)
@MapperScan("vip.xumy.admin.bmap.mapper")
public class BMapInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(BMapInitializer.class);
}
}

75
java/src/main/java/vip/xumy/admin/bmap/controller/BMapController.java

@ -0,0 +1,75 @@ @@ -0,0 +1,75 @@
package vip.xumy.admin.bmap.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
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;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import vip.xumy.admin.bmap.pojo.CityLocate;
import vip.xumy.admin.bmap.pojo.DownWorker;
import vip.xumy.admin.bmap.pojo.WorkContext;
import vip.xumy.admin.bmap.service.CityLocateService;
import vip.xumy.admin.bmap.service.LoadWorkService;
import vip.xumy.admin.bmap.util.DownloadWorker;
import vip.xumy.core.pojo.com.AjaxResponse;
import vip.xumy.core.pojo.com.PageResponse;
/**
* @author:mengyxu
* @date:2021年10月25日
*/
@RestController
@RequestMapping("bmap")
public class BMapController {
@Autowired
private CityLocateService cityLocateService;
@Autowired
private LoadWorkService loadWorkService;
@Autowired
private DownloadWorker worker;
@GetMapping("city/list")
public PageResponse<CityLocate> list(CityLocate example){
Page<CityLocate> pages = PageHelper.startPage(example.getPage(), example.getSize());
List<CityLocate> list = cityLocateService.list(example);
PageResponse<CityLocate> rsp = new PageResponse<>();
rsp.setRows(list);
rsp.setTotal(pages.getTotal());
return rsp;
}
@PostMapping("work/add")
public AjaxResponse add(@RequestBody WorkContext context) throws Exception {
loadWorkService.add(context);
return new AjaxResponse(true, "添加下载任务成功");
}
@GetMapping("work/history")
public PageResponse<DownWorker> workHistory(int page, int size){
Page<DownWorker> pages = PageHelper.startPage(page, size);
List<DownWorker> list = loadWorkService.history();
PageResponse<DownWorker> rsp = new PageResponse<>();
rsp.setRows(list);
rsp.setTotal(pages.getTotal());
return rsp;
}
@GetMapping("work/wait")
public List<DownWorker> waitWork(){
return loadWorkService.waitList();
}
@GetMapping("working")
public WorkContext working(){
return worker.getContext();
}
}

45
java/src/main/java/vip/xumy/admin/bmap/controller/ImageController.java

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
package vip.xumy.admin.bmap.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import lombok.extern.log4j.Log4j2;
/**
* @author:mengyxu
* @date:2020年4月16日
*/
@Log4j2
@Controller
@RequestMapping("image")
public class ImageController {
@Value("${image.bmap.maptile}")
private String filePath;
@RequestMapping(value = "tile/{b}/{d}/{a}", produces = MediaType.IMAGE_PNG_VALUE)
@ResponseBody
public byte[] getImage(@PathVariable("b") String b, @PathVariable("d") String d, @PathVariable("a") String a)
throws IOException {
String path = filePath + "/" + b + "/" + d + "/" + a;
File file = new File(path);
if (!file.exists()) {
log.warn("找不到目标文件:" + path);
file = new File(filePath, "0.png");
}
try (FileInputStream input = new FileInputStream(file);) {
byte[] bytes = new byte[input.available()];
input.read(bytes);
return bytes;
}
}
}

38
java/src/main/java/vip/xumy/admin/bmap/mapper/ICityLocateMapper.java

@ -0,0 +1,38 @@ @@ -0,0 +1,38 @@
package vip.xumy.admin.bmap.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.bmap.pojo.CityLocate;
/**
* @author:mengyxu
* @date:2021年10月25日
*/
@Mapper
public interface ICityLocateMapper {
static final String BASE_COLUMN = "id, name, level, parent, max_lng, min_lng, max_lat, min_lat, count, space";
@Insert({ "<script>", "INSERT INTO bmap_city_location ( ", BASE_COLUMN, " ) VALUES ",
"<foreach collection='list' item='item' separator=','>",
"(NULL, #{item.name}, #{item.level}, #{item.parent}, #{item.maxLng}, #{item.minLng}, #{item.maxLat}, #{item.minLat}, #{item.count}, #{item.space}) ",
"</foreach>", "</script>" })
void saveBatch(List<CityLocate> cityInfos);
@Select({ "<script>", "SELECT ", BASE_COLUMN, " FROM bmap_city_location ", "<where>",
"<if test='id != null'> AND id = #{id} </if>", "<if test='level != null'> AND level = #{level} </if>",
"<if test='name != null'> AND name = #{name} </if>",
"<if test='parent != null'> AND parent = #{parent} </if>",
"<if test='partName != null'> AND name like CONCAT('%',#{partName},'%') </if>", "</where>", "</script>" })
List<CityLocate> list(CityLocate example);
@Update({ "UPDATE bmap_city_location SET max_lng = #{maxLng}, min_lng = #{minLng}, max_lat = #{maxLat}, ",
"min_lat = #{minLat}, count = #{count}, space = #{space} WHERE id = #{id}" })
void update(CityLocate cityInfo);
}

46
java/src/main/java/vip/xumy/admin/bmap/mapper/ILoadWorkMapper.java

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
package vip.xumy.admin.bmap.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.bmap.pojo.DownWorker;
import vip.xumy.admin.bmap.pojo.WorkContext;
/**
* @author:mengyxu
* @date:2021年10月26日
*/
@Mapper
public interface ILoadWorkMapper {
static final String INSERT_COLUMN = "city, city_name, add_time, status, min_zom, max_zom, total";
@Select({ "<script>", "SELECT * FROM bmap_load_work ", "<where>",
"<if test='cityName != null'> AND city_name like CONCAT('%',#{cityName},'%') </if>",
"<if test='id != null'> AND id = #{id} </if>", "<if test='city != null'> AND city = #{city} </if>",
"<if test='status != null'> AND status = #{status} </if>", "</where>", "ORDER BY add_time DESC",
"</script>" })
List<DownWorker> list(DownWorker example);
@Insert({ "<script>", "INSERT INTO bmap_load_work ( ", INSERT_COLUMN, " ) VALUES ",
"<foreach collection='list' item='item' separator=','>",
"(#{item.city}, #{item.cityName}, NOW(), 0, #{item.minZom}, #{item.maxZom}, #{item.total}) ", "</foreach>",
"</script>" })
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
void saveBatch(List<WorkContext> context);
@Insert({ "<script>", "INSERT INTO bmap_load_work ( ", INSERT_COLUMN, " ) VALUES ",
"(#{city}, #{cityName}, NOW(), 0, #{minZom}, #{maxZom}, #{total}) ", "</script>" })
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
void save(WorkContext context);
@Update({ "UPDATE bmap_load_work SET start_time = #{startTime}, end_time = #{endTime}, status = #{status}, ",
"`exist` = #{exist}, success = #{success}, fail = #{fail}, result = #{result} WHERE id = #{id}" })
void update(DownWorker context);
}

29
java/src/main/java/vip/xumy/admin/bmap/pojo/CityLocate.java

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
package vip.xumy.admin.bmap.pojo;
import lombok.Getter;
import lombok.Setter;
import vip.xumy.core.pojo.base.BasePageParam;
/**
* @author:mengyxu
* @date:2021年10月25日
*/
@Setter
@Getter
public class CityLocate extends BasePageParam {
private Integer id;
private String name;
private Integer level;
private Integer parent;
private String maxLng;
private String minLng;
private String maxLat;
private String minLat;
private Integer count;
private Long space;
private String partName;
}

31
java/src/main/java/vip/xumy/admin/bmap/pojo/DownWorker.java

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
package vip.xumy.admin.bmap.pojo;
import lombok.Getter;
import lombok.Setter;
/**
* @author:mengyxu
* @date:2021年10月26日
*/
@Setter
@Getter
public class DownWorker {
private Integer id;
private Integer city;
private String cityName;
private String addTime;
private String startTime;
private String endTime;
private int status;
private Integer result;
protected int total = 0;
protected int success = 0;
protected int fail = 0;
protected int exist = 0;
protected int minZom = 1;
protected int maxZom = 19;
}

40
java/src/main/java/vip/xumy/admin/bmap/pojo/Point.java

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
package vip.xumy.admin.bmap.pojo;
import lombok.Getter;
import lombok.Setter;
/**
* @author:mengyxu
* @date:2020年4月28日
*/
@Setter
@Getter
public class Point {
private int x;
private int y;
private int z;
private double lan;
private double lat;
public Point(String lan, String lat) {
super();
this.lan = Double.parseDouble(lan);
this.lat = Double.parseDouble(lat);
}
public Point(double lan, double lat) {
super();
this.lan = lan;
this.lat = lat;
}
public Point(int x, int y, int z) {
super();
this.x = x;
this.y = y;
this.z = z;
}
}

105
java/src/main/java/vip/xumy/admin/bmap/pojo/WorkContext.java

@ -0,0 +1,105 @@ @@ -0,0 +1,105 @@
package vip.xumy.admin.bmap.pojo;
import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.Future;
import lombok.Getter;
import lombok.Setter;
import vip.xumy.admin.bmap.util.BMapTool;
/**
* @author:mengyxu
* @date:2021年10月26日
*/
@Setter
@Getter
public class WorkContext extends DownWorker {
private long start;
private Set<Future<?>> futures = new HashSet<>();
private Future<?> submit;
private Point leftBottom;
private Point rightTop;
public void setCityInfo(CityLocate city) {
super.setCity(city.getId());
super.setCityName(city.getName());
this.leftBottom = new Point(city.getMinLng(), city.getMinLat());
this.rightTop = new Point(city.getMaxLng(), city.getMaxLat());
this.callTotal();
}
private void callTotal() {
for (int z = minZom; z <= maxZom; z++) {
leftBottom.setZ(z);
rightTop.setZ(z);
BMapTool.callXY(leftBottom);
BMapTool.callXY(rightTop);
total += ((rightTop.getX() - leftBottom.getX() + 1) * (rightTop.getY() - leftBottom.getY() + 1));
}
}
public void addFuture(Future<?> future) {
futures.add(future);
}
public void success() {
super.success++;
}
public void fail() {
super.fail++;
}
public void exist() {
super.exist++;
}
public String status() {
return MessageFormat.format("瓦片总数:{0},下载成功:{1},已存在:{2},下载失败:{3}", total, success, exist, fail);
}
public int getSize() {
Iterator<Future<?>> iter = futures.iterator();
while (iter.hasNext()) {
Future<?> future = (Future<?>) iter.next();
if (future.isDone() || future.isCancelled()) {
iter.remove();
}
}
return futures.size();
}
public boolean started() {
return submit != null;
}
public boolean isDone() {
if (submit == null) {
return false;
}
return submit != null && submit.isDone() && getSize() == 0;
}
public long getUsed() {
return System.currentTimeMillis() - start;
}
public long getUse() {
int i = success + fail;
if (i == 0) {
return 0;
}
int l = total - i - exist;
double x = l * 1.0 / i;
long used = System.currentTimeMillis() - start;
return (long) (used * x);
}
}

45
java/src/main/java/vip/xumy/admin/bmap/service/CityLocateService.java

@ -0,0 +1,45 @@ @@ -0,0 +1,45 @@
package vip.xumy.admin.bmap.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import vip.xumy.admin.bmap.mapper.ICityLocateMapper;
import vip.xumy.admin.bmap.pojo.CityLocate;
/**
* @author:mengyxu
* @date:2021年10月25日
*/
@Service
public class CityLocateService {
@Autowired
private ICityLocateMapper cityLocateMapper;
public List<CityLocate> list(CityLocate example) {
return cityLocateMapper.list(example);
}
public CityLocate get(Integer id) {
CityLocate example = new CityLocate();
example.setId(id);
List<CityLocate> list = cityLocateMapper.list(example);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
public CityLocate get(String name) {
CityLocate example = new CityLocate();
example.setName(name);
List<CityLocate> list = cityLocateMapper.list(example);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
}

71
java/src/main/java/vip/xumy/admin/bmap/service/LoadWorkService.java

@ -0,0 +1,71 @@ @@ -0,0 +1,71 @@
package vip.xumy.admin.bmap.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vip.xumy.admin.bmap.mapper.ILoadWorkMapper;
import vip.xumy.admin.bmap.pojo.CityLocate;
import vip.xumy.admin.bmap.pojo.DownWorker;
import vip.xumy.admin.bmap.pojo.WorkContext;
import vip.xumy.admin.bmap.util.DownloadWorker;
import vip.xumy.core.exception.CoreException;
/**
* @author:mengyxu
* @date:2021年10月26日
*/
@Service
public class LoadWorkService {
@Autowired
private ILoadWorkMapper loadWorkMapper;
@Autowired
private CityLocateService cityLocateService;
@Autowired
private DownloadWorker worker;
public List<DownWorker> history() {
DownWorker example = new WorkContext();
example.setStatus(2);
return loadWorkMapper.list(example);
}
public List<DownWorker> waitList() {
DownWorker example = new WorkContext();
example.setStatus(0);
return loadWorkMapper.list(example);
}
public DownWorker working() {
DownWorker example = new WorkContext();
example.setStatus(1);
List<DownWorker> list = loadWorkMapper.list(example);
if (list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
@Transactional
public void add(WorkContext context) throws Exception {
Integer cityId = context.getCity();
if (cityId == null) {
throw new CoreException("请选择城市");
}
CityLocate city = cityLocateService.get(cityId);
if (city == null) {
throw new CoreException("未录入该城市对应经纬度,添加失败");
}
context.setCityInfo(city);
loadWorkMapper.save(context);
worker.addTask(context);
}
public void update(DownWorker context) {
loadWorkMapper.update(context);
}
}

40
java/src/main/java/vip/xumy/admin/bmap/util/BMapTool.java

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
package vip.xumy.admin.bmap.util;
import vip.xumy.admin.bmap.pojo.Point;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年4月28日
*/
public class BMapTool {
private static final double[][] BV = new double[][]{
new double[]{-0.0015702102444, 111320.7020616939, 1704480524535203L, -10338987376042340L, 26112667856603880L, -35149669176653700L, 26595700718403920L, -10725012454188240L, 1800819912950474L, 82.5},
new double[]{8.277824516172526E-4, 111320.7020463578, 6.477955746671607E8, -4.082003173641316E9, 1.077490566351142E10, -1.517187553151559E10, 1.205306533862167E10, -5.124939663577472E9, 9.133119359512032E8, 67.5},
new double[]{0.00337398766765, 111320.7020202162, 4481351.045890365, -2.339375119931662E7, 7.968221547186455E7, -1.159649932797253E8, 9.723671115602145E7, -4.366194633752821E7, 8477230.501135234, 52.5},
new double[]{0.00220636496208, 111320.7020209128, 51751.86112841131, 3796837.749470245, 992013.7397791013, -1221952.21711287, 1340652.697009075, -620943.6990984312, 144416.9293806241, 37.5},
new double[]{-3.441963504368392E-4, 111320.7020576856, 278.2353980772752, 2485758.690035394, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5},
new double[]{-3.218135878613132E-4, 111320.7020701615, 0.00369383431289, 823725.6402795718, 0.46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, 0.37238884252424, 7.45}
};
public static void callXY(Point p) {
double lan = fix(p.getLan(), -180, 180);
double lat = fix(p.getLat(), -89.999999, 89.999999);
int idx = 5 - (int) Math.abs(lat/15);
double[] b = BV[idx];
Double c = b[0] + b[1] * Math.abs(lan);
double d = Math.abs(lat) / b[9];
double e = b[2] + b[3] * d + b[4] * d * d + b[5] * d * d * d + b[6] * d * d * d * d + b[7] * d * d * d * d * d + b[8] * d * d * d * d * d * d;
c *= (lan < 0 ? -1 : 1);
e *= (lan < 0 ? -1 : 1);
double x = Math.floor(c * Math.pow(2, p.getZ() - 18));
double y = Math.floor(e * Math.pow(2, p.getZ() - 18));
p.setX((int)Math.floor(x / 256));
p.setY((int)Math.floor(y / 256));
}
private static double fix(double a, double b, double c) {
return Math.min(Math.max(a, b), c);
}
}

241
java/src/main/java/vip/xumy/admin/bmap/util/DownloadWorker.java

@ -0,0 +1,241 @@ @@ -0,0 +1,241 @@
package vip.xumy.admin.bmap.util;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
import vip.xumy.admin.bmap.pojo.DownWorker;
import vip.xumy.admin.bmap.pojo.Point;
import vip.xumy.admin.bmap.pojo.WorkContext;
import vip.xumy.admin.bmap.service.LoadWorkService;
import vip.xumy.core.utils.DateUtil;
/**
* @author:mengyxu
* @date:2020年4月10日
*/
@Log4j2
@Component
@EnableScheduling
public class DownloadWorker {
private static final LinkedBlockingQueue<Point> queue = new LinkedBlockingQueue<>(1000);
private static final ExecutorService executor = Executors.newFixedThreadPool(100);
private static final LinkedBlockingQueue<WorkContext> works = new LinkedBlockingQueue<>(500);
private static final String urlFromat = "http://{0}.bdimg.com/tile/?qt=vtile&x={1}&y={2}&z={3}&styles=pl";
private static final String[] MAP_HOSTS = { "maponline0", "maponline1", "maponline2", "maponline3" };
@Value("${image.bmap.maptile}")
private String path;
@Value("${bmap.download.size}")
private int size;
@Autowired
public void setWorkService(LoadWorkService workService) {
this.workService = workService;
this.init();
}
private LoadWorkService workService;
@Getter
private WorkContext context;
private Lock lockS = new ReentrantLock();
private Lock lockF = new ReentrantLock();
private Lock lockE = new ReentrantLock();
public void init() {
DownWorker working = workService.working();
if (working != null) {
working.setStatus(2);
working.setResult(2);
workService.update(working);
}
List<DownWorker> waitList = workService.waitList();
if (waitList == null || waitList.isEmpty()) {
return;
}
for (int i = waitList.size(); i > 0; i--) {
DownWorker worker = waitList.get(i - 1);
WorkContext context = new WorkContext();
BeanUtils.copyProperties(worker, context);
try {
works.put(context);
} catch (InterruptedException e) {
context.setStatus(2);
context.setResult(3);
workService.update(context);
}
}
}
public void addTask(WorkContext context) throws InterruptedException {
works.put(context);
}
@Scheduled(cron = "${bmap.download.work.cron}")
public void createWorker() throws InterruptedException {
if (context == null) {
if (!works.isEmpty()) {
context = works.take();
;
} else {
return;
}
} else if (context.isDone()) {
context.setEndTime(DateUtil.format(new Date(), DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS));
context.setStatus(2);
context.setResult(1);
workService.update(context);
if (!works.isEmpty()) {
context = works.take();
;
} else {
context = null;
return;
}
}
addCaller();
addWorker(size - context.getSize());
log.debug(context.status());
}
private void addCaller() {
if (context.started()) {
return;
}
Future<?> submit = executor.submit(() -> {
context.setStartTime(DateUtil.format(new Date(), DateUtil.FORMAT19_LINE_YYYYMMDDHHMMSS));
context.setStart(System.currentTimeMillis());
context.setStatus(1);
workService.update(context);
log.info(context.getCityName() + "-submit线程开始");
Point leftBottom = context.getLeftBottom();
Point rightTop = context.getRightTop();
long start = System.currentTimeMillis();
for (int z = context.getMinZom(); z <= context.getMaxZom(); z++) {
leftBottom.setZ(z);
rightTop.setZ(z);
BMapTool.callXY(leftBottom);
BMapTool.callXY(rightTop);
log.debug(MessageFormat.format("Z:{0},X:{1}-{2},Y:{3}-{4}", z, leftBottom.getX(), rightTop.getX(),
leftBottom.getY(), rightTop.getY()));
for (int x = leftBottom.getX(); x <= rightTop.getX(); x++) {
for (int y = leftBottom.getY(); y <= rightTop.getY(); y++) {
Point p = new Point(x, y, z);
try {
queue.put(p);
} catch (InterruptedException e) {
fail(p);
}
}
}
}
long time = (System.currentTimeMillis() - start) / 1000;
log.info(context.getCityName() + "-submit线程结束,耗时" + time + "秒,速度约"
+ (context.getTotal() - context.getExist() - 1000) / time + "个/秒");
});
context.setSubmit(submit);
}
private void addWorker(int size) {
for (int i = 0; i < size; i++) {
Future<?> future = executor.submit(() -> {
while (!queue.isEmpty()) {
try {
Point point = queue.take();
if (!downLoad(point)) {
fail(point);
}
} catch (InterruptedException e) {
log.error("download failed", e);
}
}
System.out.println(Thread.currentThread().getName() + "下载线程结束");
});
context.addFuture(future);
}
}
private boolean downLoad(Point point) {
int z = point.getZ();
int x = point.getX();
int y = point.getY();
File file = new File(path + "/" + z + "/" + x + "/" + y + ".png");
if (file.exists()) {
exist();
return true;
}
new File(file.getParent()).mkdirs();
int idx = Math.abs(x + y) % MAP_HOSTS.length;
String urlStr = MessageFormat.format(urlFromat, MAP_HOSTS[idx], x + "", y + "", z);
URL url;
try {
url = new URL(urlStr);
} catch (MalformedURLException e) {
log.error("download failed:" + e.getMessage());
return false;
}
try (InputStream is = url.openConnection().getInputStream();
FileOutputStream os = new FileOutputStream(file);) {
byte[] buf = new byte[1024 * 20];
int bytesRead;
while ((bytesRead = is.read(buf)) > 0) {
os.write(buf, 0, bytesRead);
}
os.flush();
success();
return true;
} catch (ConnectException | FileNotFoundException e) {
log.error(e.getMessage());
file.delete();
return false;
} catch (Exception e) {
log.error("download failed", e);
file.delete();
return false;
}
}
private void success() {
lockS.lock();
context.success();
lockS.unlock();
}
private void fail(Point p) {
lockF.lock();
context.fail();
lockF.unlock();
}
private void exist() {
lockE.lock();
context.exist();
lockE.unlock();
}
}

20
java/src/main/java/vip/xumy/admin/sys/conf/SysInitializer.java

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
package vip.xumy.admin.sys.conf;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = "vip.xumy.admin.sys,vip.xumy.core", useDefaultFilters = true)
@MapperScan("vip.xumy.admin.sys.mapper")
public class SysInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SysInitializer.class);
}
}

49
java/src/main/java/vip/xumy/admin/sys/controller/ConfigController.java

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
package vip.xumy.admin.sys.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import vip.xumy.admin.sys.pojo.SysConfig;
import vip.xumy.admin.sys.service.ConfigService;
import vip.xumy.core.pojo.com.AjaxResponse;
import vip.xumy.core.pojo.com.PageResponse;
/**
* Do not use for any commercial purposes without permission
*
* @author: mengyxu
* @date: 2022年1月4日
*/
@RestController
@RequestMapping("sys/config")
public class ConfigController {
@Autowired
private ConfigService configService;
@GetMapping
public PageResponse<SysConfig> list(SysConfig example) {
Page<SysConfig> pages = PageHelper.startPage(example.getPage(), example.getSize());
List<SysConfig> list = configService.queryByExample(example);
PageResponse<SysConfig> rsp = new PageResponse<>();
rsp.setRows(list);
rsp.setTotal(pages.getTotal());
return rsp;
}
@PutMapping
public AjaxResponse update(@RequestBody SysConfig sysConfig) {
configService.update(sysConfig);
return new AjaxResponse(true, "修改成功");
}
}

9
java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java

@ -12,20 +12,21 @@ import com.github.pagehelper.Page; @@ -12,20 +12,21 @@ import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.admin.sys.service.IDictionaryService;
import vip.xumy.admin.sys.service.DictionaryService;
import vip.xumy.core.exception.CoreException;
import vip.xumy.core.pojo.com.AjaxResponse;
import vip.xumy.core.pojo.com.PageResponse;
/**
* Ownership belongs to the company author:mengyxu date:2019年12月6日
* @author:mengyxu
* @date:2019年12月6日
*/
@RestController
@RequestMapping("admin/dict")
@RequestMapping("dict")
public class DictionaryController {
@Autowired
private IDictionaryService distService;
private DictionaryService distService;
@RequestMapping(value = "list", method = RequestMethod.GET)
public PageResponse<Dictionary> queryDistList(Dictionary example) {

12
java/src/main/java/vip/xumy/admin/sys/controller/LogController.java

@ -11,22 +11,22 @@ import com.github.pagehelper.Page; @@ -11,22 +11,22 @@ import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import vip.xumy.admin.sys.pojo.ActionLog;
import vip.xumy.admin.sys.service.ILogService;
import vip.xumy.admin.sys.service.LogService;
import vip.xumy.core.pojo.com.PageResponse;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月5日
/**
* @author:mengyxu
* @date:2019年12月5日
*/
@RestController
@RequestMapping("admin")
public class LogController {
@Autowired
private ILogService LogService;
private LogService LogService;
@RequestMapping(value = "log/action", method = RequestMethod.GET)
public PageResponse<ActionLog> queryActionLogList(ActionLog example){
public PageResponse<ActionLog> queryActionLogList(ActionLog example) {
Page<ActionLog> pages = PageHelper.startPage(example.getPage(), example.getSize());
List<ActionLog> list = LogService.queryActionLog(example);
PageResponse<ActionLog> rsp = new PageResponse<>();

22
java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java

@ -19,45 +19,45 @@ import vip.xumy.core.pojo.BufferResult; @@ -19,45 +19,45 @@ import vip.xumy.core.pojo.BufferResult;
import vip.xumy.core.pojo.com.AjaxResponse;
import vip.xumy.core.pojo.com.Cache;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月13日
/**
* @author:mengyxu
* @date:2019年12月13日
*/
@Log4j2
@RestController
@RequestMapping("admin/memory")
@RequestMapping("memory")
public class MemoryController {
@RequestMapping("buffer/list")
public List<BufferResult> getBufferList(HttpServletRequest request){
public List<BufferResult> getBufferList(HttpServletRequest request) {
log.info("查询缓存列表,当前登陆用户:" + LoginUtil.getUserId(request));
List<BufferResult> list = new ArrayList<>();
Map<String, Cache> buffer = GlobalBuffer.getBuffer();
for(String key : buffer.keySet()) {
for (String key : buffer.keySet()) {
list.add(new BufferResult(key, buffer.get(key)));
}
return list;
}
@RequestMapping("buffer/clean")
public AjaxResponse cleanBuffer(HttpServletRequest request){
public AjaxResponse cleanBuffer(HttpServletRequest request) {
log.info("清空失效缓存,当前登陆用户:" + LoginUtil.getUserId(request));
GlobalBuffer.cleanCache();
return new AjaxResponse(true, "清空失效缓存成功");
}
@RequestMapping(value = "buffer/delete", method = RequestMethod.POST)
public AjaxResponse deleteBuffer(@RequestBody BufferResult buffer, HttpServletRequest request){
public AjaxResponse deleteBuffer(@RequestBody BufferResult buffer, HttpServletRequest request) {
String key = buffer.getKey();
log.info("删除缓存:"+key+",当前登陆用户:" + LoginUtil.getUserId(request));
log.info("删除缓存:" + key + ",当前登陆用户:" + LoginUtil.getUserId(request));
GlobalBuffer.removeCache(key);
return new AjaxResponse(true, "删除缓存成功");
}
@RequestMapping(value = "buffer/delay", method = RequestMethod.POST)
public AjaxResponse delayBuffer(@RequestBody BufferResult buffer, HttpServletRequest request) throws CoreException{
log.info("修改缓存失效时间:"+buffer.getKey()+",当前登陆用户:" + LoginUtil.getUserId(request));
public AjaxResponse delayBuffer(@RequestBody BufferResult buffer, HttpServletRequest request) throws CoreException {
log.info("修改缓存失效时间:" + buffer.getKey() + ",当前登陆用户:" + LoginUtil.getUserId(request));
GlobalBuffer.setLoseTime(buffer.getKey(), buffer.getLoseTime());
return new AjaxResponse(true, "修改缓存失效时间成功");
}

39
java/src/main/java/vip/xumy/admin/sys/controller/SysPublicContoller.java

@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
package vip.xumy.admin.sys.controller;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.admin.sys.service.DictionaryService;
/**
* @author:mengyxu
* @date:2019年10月21日
*/
@RestController
@RequestMapping("public")
public class SysPublicContoller {
@Value("${version.num:3.0.0}")
private String versionNum;
@Autowired
private DictionaryService dictService;
@RequestMapping(value = "get/dict", method = RequestMethod.POST)
public Map<String, List<Dictionary>> getDictionarys(@RequestBody String[] codes) {
return dictService.getDicts(codes);
}
@RequestMapping(value = "version")
public String getVersionNum() {
return versionNum;
}
}

18
java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java

@ -10,39 +10,39 @@ import org.springframework.web.bind.annotation.RequestMethod; @@ -10,39 +10,39 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import vip.xumy.admin.sys.pojo.UserItem;
import vip.xumy.admin.sys.service.IUserItemService;
import vip.xumy.admin.sys.service.UserItemService;
import vip.xumy.admin.utils.LoginUtil;
import vip.xumy.core.pojo.com.AjaxResponse;
import vip.xumy.core.utils.StringUtil;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年3月18日
/**
* @author:mengyxu
* @date:2020年3月18日
*/
@RestController
@RequestMapping("public/item")
public class UserItemController {
@Autowired
private IUserItemService itemService;
private UserItemService itemService;
@RequestMapping(value = "list", method = RequestMethod.GET)
public List<UserItem> queryList(UserItem example, HttpServletRequest request){
public List<UserItem> queryList(UserItem example, HttpServletRequest request) {
String userId = LoginUtil.getUserId(request);
if(StringUtil.isEmpty(userId)) {
if (StringUtil.isEmpty(userId)) {
return null;
}
example.setUserId(userId);
Integer page = example.getPage();
Integer size = example.getSize();
if(page != null && size != null) {
if (page != null && size != null) {
example.setLimitStart((page - 1) * size);
}
return itemService.queryByExample(example);
}
@RequestMapping(value = "read", method = RequestMethod.POST)
public AjaxResponse queryList(Integer id, HttpServletRequest request){
public AjaxResponse queryList(Integer id, HttpServletRequest request) {
itemService.read(id);
return new AjaxResponse(true, null);
}

26
java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java

@ -2,19 +2,39 @@ package vip.xumy.admin.sys.mapper; @@ -2,19 +2,39 @@ package vip.xumy.admin.sys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import vip.xumy.admin.sys.pojo.ActionLog;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年2月13日
/**
* @author:mengyxu
* @date:2020年2月13日
*/
@Mapper
public interface IActionLogMapper {
static final String BASE_COLUMN = "id, type, module, user_id, login_ip, time, context";
@Select({ "<script>", "SELECT * FROM sys_action_log ", "<where>",
"<if test='type != null'> AND type = #{type} </if>",
"<if test='module != null'> AND module = #{module} </if>",
"<if test='userId != null'> AND user_id like CONCAT('%',#{userId},'%') </if>",
"<if test='context != null'> AND context like CONCAT('%',#{context},'%') </if>",
"<if test='startTime != null'> AND time >= #{startTime} </if>",
"<if test='endTime != null'> AND #{endTime} > time </if>", "</where>", "ORDER BY time DESC", "</script>" })
List<ActionLog> queryByExample(ActionLog example);
@Insert({ "INSERT INTO BusinessLog ( ", BASE_COLUMN, " ) VALUES ",
"(#{id}, {type}, #{module}, #{userId}, #{loginIp}, #{time}, #{context})" })
void insert(ActionLog log);
@Insert({ "<script>", "INSERT INTO BusinessLog ( ", BASE_COLUMN, " ) VALUES ",
"<foreach collection='list' item='log' separator=','>",
"(#{log.id}, {log.type}, #{log.module}, #{log.userId}, #{log.loginIp}, #{log.time}, #{log.context}) ",
"</foreach>", "</script>" })
void insertBatch(List<ActionLog> logs);
}

19
java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java

@ -2,15 +2,32 @@ package vip.xumy.admin.sys.mapper; @@ -2,15 +2,32 @@ package vip.xumy.admin.sys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.sys.pojo.SysConfig;
/**
* @author:mengyxu
* @date:2019年12月6日
*/
@Mapper
public interface IConfigMapper {
@Select({ "SELECT cfg_value FROM sys_config WHERE cfg_key = #{cfgKey} AND cfg_status != 'I'" })
public String queryValueByKey(String cfgKey);
@Select({ "<script>", "SELECT * FROM sys_config ", "<where>",
"<if test='cfgKey != null'> AND cfg_key = #{cfgKey} </if>",
"<if test='cfgStatus != null'> AND cfg_status = #{cfgStatus} </if>",
"<if test='cfgName != null'> AND cfg_name like CONCAT('%',#{cfgName},'%') </if>", "</where>",
"ORDER BY update_time DESC", "</script>" })
public List<SysConfig> queryByExample(SysConfig example);
@Update({ "UPDATE sys_config SET cfg_name = #{cfgName}, cfg_value = #{cfgValue}, cfg_desc = #{cfgDesc}, ",
"cfg_status = #{cfgStatus}, update_time = NOW(), update_user = #{updateUser} WHERE cfg_key = #{cfgKey}" })
public void update(SysConfig sysConfig);
}

46
java/src/main/java/vip/xumy/admin/sys/mapper/IDictTypeMapper.java

@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
package vip.xumy.admin.sys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.sys.pojo.Dictionary;
/**
* @author:mengyxu
* @date:2019年12月6日
*/
@Mapper
public interface IDictTypeMapper {
@Results(id = "typeRM", value = { @Result(property = "code", column = "type_code"),
@Result(property = "name", column = "type_name"), @Result(property = "desc", column = "type_desc"),
@Result(property = "status", column = "type_status"),
@Result(property = "children", column = "{parent=type_code}", javaType = List.class, many = @Many(select = "com.sprt.admin.sys.mapper.IDictionaryMapper.queryDict")) })
@Select({ "<script>", "SELECT * FROM dict_type ", "<where>",
"<if test='code != null'> AND type_code = #{code} </if>",
"<if test='name != null'> AND type_name like CONCAT('%',#{name},'%') </if>",
"<if test='status != null'> AND type_status = #{status} </if>", "</where>", "ORDER BY type_name ASC",
"</script>" })
List<Dictionary> queryType(Dictionary example);
@Insert({
"INSERT INTO dict_type (type_code, type_name, type_desc, type_status) VALUES (#{code}, #{name}, #{desc}, #{status})" })
void insertType(Dictionary type);
@Update({
"UPDATE dict_type SET type_name = #{name}, type_desc = #{desc}, type_status = #{status} WHERE type_code = #{code}" })
void updateType(Dictionary type);
@Delete({ "DELETE FROM dict_type WHERE type_code = #{code}" })
void deleteType(String code);
}

41
java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java

@ -2,28 +2,45 @@ package vip.xumy.admin.sys.mapper; @@ -2,28 +2,45 @@ package vip.xumy.admin.sys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.core.pojo.com.Entry;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月6日
/**
* @author:mengyxu
* @date:2019年12月6日
*/
@Mapper
public interface IDictionaryMapper {
List<Dictionary> queryType(Dictionary example);
@Results(id = "dictRM", value = { @Result(property = "id", column = "dict_id"),
@Result(property = "code", column = "dict_code"), @Result(property = "name", column = "dict_name"),
@Result(property = "desc", column = "dict_desc"), @Result(property = "parent", column = "dict_parent"),
@Result(property = "status", column = "dict_status") })
@Select({ "<script>", "SELECT * FROM dictionary ", "<where>", "<if test='id != null'> AND dict_id = #{id} </if>",
"<if test='parent != null'> AND dict_parent = #{parent} </if>",
"<if test='status != null'> AND dict_status = #{status} </if>", "</where>", "ORDER BY dict_id ASC",
"</script>" })
List<Dictionary> queryDict(Dictionary example);
void insertType(Dictionary type);
@Insert({ "INSERT INTO dictionary VALUES(#{id}, #{code}, #{name}, #{desc}, #{parent}, #{status})" })
void insertDict(Dictionary dist);
void updateType(Dictionary type);
@Update({ "UPDATE dictionary SET dict_code = #{code}, dict_name = #{name}, dict_desc = #{desc},",
"dict_parent = #{parent}, dict_status = #{status} WHERE dict_id = #{id}" })
void updateDict(Dictionary dist);
void deleteType(String code);
@Delete({ "DELETE FROM dictionary WHERE dict_parent = #{parent}" })
void deleteDicts(String parent);
void deleteDict(Integer id);
List<Entry<String, String>> queryProvince();
List<Entry<String, String>> queryCity(String parent);
List<Entry<String, String>> queryCounty(String parent);
@Delete({ "DELETE FROM dictionary WHERE dict_id = #{id}" })
void deleteDict(Integer id);
}

28
java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java

@ -2,21 +2,43 @@ package vip.xumy.admin.sys.mapper; @@ -2,21 +2,43 @@ package vip.xumy.admin.sys.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.sys.pojo.UserItem;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年3月17日
/**
* @author:mengyxu
* @date:2020年3月17日
*/
@Mapper
public interface IUserItemMapper {
static final String BASE_COLUMN = "id,user_id,item_name,item_desc,item_type,item_flag,add_user,add_time,status";
@Select({ "<script>", "SELECT * FROM sys_user_item ", "<where>", "<if test='id != null'> AND id = #{id} </if>",
"<if test='userId != null'> AND user_id = #{userId} </if>",
"<if test='itemType != null'> AND item_type = #{itemType} </if>",
"<if test='itemFlag != null'> AND item_flag = #{itemFlag} </if>",
"<if test='addUser != null'> AND add_user = #{addUser} </if>",
"<if test='status != null'> AND status = #{status} </if>", "</where>", "ORDER BY status ASC, add_time DESC",
"<if test='limitStart != null'> LIMIT #{limitStart},#{size} </if>", "</script>" })
List<UserItem> queryByExample(UserItem example);
@Insert({ "INSERT INTO sys_user_item (", BASE_COLUMN, ") VALUES ",
"(#{id}, {userId}, #{itemName}, #{itemDesc}, #{itemType}, #{itemFlag}, #{addUser}, #{addTime}, '0')" })
void insert(UserItem item);
@Insert({ "<script>", "INSERT INTO sys_user_item (", BASE_COLUMN, ") VALUES ",
"<foreach collection='list' item='item' separator=','>",
"(#{item.id}, {item.userId}, #{item.itemName}, #{item.itemDesc}, #{item.itemType}, ",
"#{item.itemFlag}, #{item.addUser}, #{item.addTime}, '0') ", "</foreach>", "</script>" })
void insertBatch(List<UserItem> items);
@Update({ "UPDATE sys_user_item SET status = #{status} WHERE id = #{id}" })
void update(UserItem item);
}

6
java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java

@ -4,9 +4,9 @@ import lombok.Getter; @@ -4,9 +4,9 @@ import lombok.Getter;
import lombok.Setter;
import vip.xumy.core.pojo.base.BasePeriod;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年2月13日
/**
* @author:mengyxu
* @date:2020年2月13日
*/
@Setter

6
java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java

@ -6,9 +6,9 @@ import lombok.Getter; @@ -6,9 +6,9 @@ import lombok.Getter;
import lombok.Setter;
import vip.xumy.core.pojo.base.BasePageParam;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月6日
/**
* @author:mengyxu
* @date:2019年12月6日
*/
@Setter

8
java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java

@ -9,14 +9,14 @@ import lombok.Setter; @@ -9,14 +9,14 @@ import lombok.Setter;
import vip.xumy.core.pojo.base.BasePageParam;
import vip.xumy.core.utils.DateUtil;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年3月17日
/**
* @author:mengyxu
* @date:2020年3月17日
*/
@Setter
@Getter
public class UserItem extends BasePageParam{
public class UserItem extends BasePageParam {
private Integer id;
private String userId;

14
java/src/main/java/vip/xumy/admin/sys/service/impl/ConfigService.java → java/src/main/java/vip/xumy/admin/sys/service/ConfigService.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.sys.service.impl;
package vip.xumy.admin.sys.service;
import java.util.List;
@ -7,15 +7,13 @@ import org.springframework.stereotype.Service; @@ -7,15 +7,13 @@ import org.springframework.stereotype.Service;
import vip.xumy.admin.sys.mapper.IConfigMapper;
import vip.xumy.admin.sys.pojo.SysConfig;
import vip.xumy.admin.sys.service.IConfigService;
import vip.xumy.core.utils.StringUtil;
@Service
public class ConfigService implements IConfigService {
public class ConfigService {
@Autowired
private IConfigMapper cfgMapper;
@Override
public String queryValueByKey(String cfgKey) {
return cfgMapper.queryValueByKey(cfgKey);
}
@ -26,7 +24,6 @@ public class ConfigService implements IConfigService { @@ -26,7 +24,6 @@ public class ConfigService implements IConfigService {
* @param defValue
* @return
*/
@Override
public long getLongConfig(String key, long defValue) {
String value = queryValueByKey(key);
@ -43,7 +40,6 @@ public class ConfigService implements IConfigService { @@ -43,7 +40,6 @@ public class ConfigService implements IConfigService {
* @param defValue
* @return
*/
@Override
public Integer getIntConfig(String key, Integer defValue) {
String value = queryValueByKey(key);
@ -54,7 +50,6 @@ public class ConfigService implements IConfigService { @@ -54,7 +50,6 @@ public class ConfigService implements IConfigService {
}
}
@Override
public String getStringConfig(String key, String defValue) {
String value = queryValueByKey(key);
@ -66,17 +61,14 @@ public class ConfigService implements IConfigService { @@ -66,17 +61,14 @@ public class ConfigService implements IConfigService {
}
@Override
public List<SysConfig> queryPageByExample(SysConfig example) {
public List<SysConfig> queryByExample(SysConfig example) {
return cfgMapper.queryByExample(example);
}
@Override
public void update(SysConfig sysConfig) {
cfgMapper.update(sysConfig);
}
@Override
public void updateCfg(String key, String value, String userId) {
SysConfig cfg = get(key);
if(cfg != null) {

60
java/src/main/java/vip/xumy/admin/sys/service/impl/DictionaryService.java → java/src/main/java/vip/xumy/admin/sys/service/DictionaryService.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.sys.service.impl;
package vip.xumy.admin.sys.service;
import java.util.HashMap;
import java.util.List;
@ -8,62 +8,58 @@ import org.springframework.beans.factory.annotation.Autowired; @@ -8,62 +8,58 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vip.xumy.admin.sys.mapper.IDictTypeMapper;
import vip.xumy.admin.sys.mapper.IDictionaryMapper;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.admin.sys.service.IDictionaryService;
import vip.xumy.core.exception.CoreException;
import vip.xumy.core.pojo.com.Entry;
import vip.xumy.core.utils.StringUtil;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月6日
/**
* @author:mengyxu
* @date:2019年12月6日
*/
@Service
public class DictionaryService implements IDictionaryService {
public class DictionaryService {
@Autowired
private IDictionaryMapper dictMapper;
@Autowired
private IDictTypeMapper dictTypeMapper;
@Override
public List<Dictionary> queryType(Dictionary example) {
return dictMapper.queryType(example);
return dictTypeMapper.queryType(example);
}
@Override
public void save(Dictionary dict) {
if(StringUtil.isEmpty(dict.getParent())) {
dictMapper.insertType(dict);
}else {
if (StringUtil.isEmpty(dict.getParent())) {
dictTypeMapper.insertType(dict);
} else {
dictMapper.insertDict(dict);
}
}
@Override
public void update(Dictionary dict) {
if(StringUtil.isEmpty(dict.getParent())) {
dictMapper.updateType(dict);
}else {
if (StringUtil.isEmpty(dict.getParent())) {
dictTypeMapper.updateType(dict);
} else {
dictMapper.updateDict(dict);
}
}
@Override
@Transactional
public void delete(Dictionary dict) throws CoreException {
public void delete(Dictionary dict) throws CoreException{
Integer id = dict.getId();
String code = dict.getCode();
if(id != null) {
if (id != null) {
dictMapper.deleteDict(id);
}else {
dictMapper.deleteType(code);
} else {
dictTypeMapper.deleteType(code);
dictMapper.deleteDicts(code);
}
}
@Override
public Map<String, List<Dictionary>> getDicts(String[] codes) {
if(codes == null || codes.length == 0) {
if (codes == null || codes.length == 0) {
return null;
}
Map<String, List<Dictionary>> map = new HashMap<>();
@ -73,7 +69,6 @@ public class DictionaryService implements IDictionaryService { @@ -73,7 +69,6 @@ public class DictionaryService implements IDictionaryService {
return map;
}
@Override
public List<Dictionary> getDict(String code) {
Dictionary example = new Dictionary();
example.setStatus("A");
@ -81,19 +76,4 @@ public class DictionaryService implements IDictionaryService { @@ -81,19 +76,4 @@ public class DictionaryService implements IDictionaryService {
return dictMapper.queryDict(example);
}
@Override
public List<Entry<String, String>> queryProvince() {
return dictMapper.queryProvince();
}
@Override
public List<Entry<String, String>> queryCity(String parent) {
return dictMapper.queryCity(parent);
}
@Override
public List<Entry<String, String>> queryCounty(String parent) {
return dictMapper.queryCounty(parent);
}
}

31
java/src/main/java/vip/xumy/admin/sys/service/IConfigService.java

@ -1,31 +0,0 @@ @@ -1,31 +0,0 @@
package vip.xumy.admin.sys.service;
import java.util.List;
import vip.xumy.admin.sys.pojo.SysConfig;
public interface IConfigService {
public String queryValueByKey(String cfgKey);
/**
* Query the configuration by the key.
* Return the default value as provided if no item found.
* @param cfgKey
* @param defaultVal
* @return
*/
String getStringConfig(String cfgKey, String defaultVal);
long getLongConfig(String key, long defValue);
Integer getIntConfig(String key, Integer defValue);
public List<SysConfig> queryPageByExample(SysConfig example);
public void update(SysConfig sysConfig);
public void updateCfg(String key, String value, String userId);
}

35
java/src/main/java/vip/xumy/admin/sys/service/IDictionaryService.java

@ -1,35 +0,0 @@ @@ -1,35 +0,0 @@
package vip.xumy.admin.sys.service;
import java.util.List;
import java.util.Map;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.core.exception.CoreException;
import vip.xumy.core.pojo.com.Entry;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月6日
*/
public interface IDictionaryService {
List<Dictionary> queryType(Dictionary example);
void save(Dictionary dist);
void update(Dictionary dist);
void delete(Dictionary dict) throws CoreException;
Map<String, List<Dictionary>> getDicts(String[] codes);
List<Dictionary> getDict(String code);
List<Entry<String, String>> queryProvince();
List<Entry<String, String>> queryCity(String parent);
List<Entry<String, String>> queryCounty(String parent);
}

23
java/src/main/java/vip/xumy/admin/sys/service/ILogService.java

@ -1,23 +0,0 @@ @@ -1,23 +0,0 @@
package vip.xumy.admin.sys.service;
import java.util.List;
import java.util.Map;
import vip.xumy.admin.sys.pojo.ActionLog;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年12月5日
*/
public interface ILogService {
List<ActionLog> queryActionLog(ActionLog example);
void insertActionLog(ActionLog log);
void insertActionLogs(List<ActionLog> logs);
Map<String, String> getTypeMap();
}

24
java/src/main/java/vip/xumy/admin/sys/service/IUserItemService.java

@ -1,24 +0,0 @@ @@ -1,24 +0,0 @@
package vip.xumy.admin.sys.service;
import java.util.List;
import vip.xumy.admin.sys.pojo.UserItem;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年3月17日
*/
public interface IUserItemService {
List<UserItem> queryByExample(UserItem example);
void save(UserItem item);
void save(List<UserItem> items);
void read(Integer id);
void dealWith(Integer id);
}

12
java/src/main/java/vip/xumy/admin/sys/service/impl/LogService.java → java/src/main/java/vip/xumy/admin/sys/service/LogService.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.sys.service.impl;
package vip.xumy.admin.sys.service;
import java.util.HashMap;
import java.util.List;
@ -10,8 +10,6 @@ import org.springframework.stereotype.Service; @@ -10,8 +10,6 @@ import org.springframework.stereotype.Service;
import vip.xumy.admin.sys.mapper.IActionLogMapper;
import vip.xumy.admin.sys.pojo.ActionLog;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.admin.sys.service.IDictionaryService;
import vip.xumy.admin.sys.service.ILogService;
import vip.xumy.core.golbal.GlobalBuffer;
import vip.xumy.core.pojo.com.Cache;
@ -21,29 +19,25 @@ import vip.xumy.core.pojo.com.Cache; @@ -21,29 +19,25 @@ import vip.xumy.core.pojo.com.Cache;
*/
@Service
public class LogService implements ILogService {
public class LogService {
private static final String MAP_BUFFER_KEY = "log_type_mapping";
@Autowired
private IActionLogMapper actionLogMapper;
@Autowired
private IDictionaryService dictService;
private DictionaryService dictService;
@Override
public List<ActionLog> queryActionLog(ActionLog example) {
return actionLogMapper.queryByExample(example);
}
@Override
public void insertActionLog(ActionLog log) {
actionLogMapper.insert(log);
}
@Override
public void insertActionLogs(List<ActionLog> logs) {
actionLogMapper.insertBatch(logs);
}
@Override
public Map<String, String> getTypeMap() {
Cache cache = GlobalBuffer.getCache(MAP_BUFFER_KEY);
if(Cache.isEmpty(cache)) {

21
java/src/main/java/vip/xumy/admin/sys/service/impl/UserItemService.java → java/src/main/java/vip/xumy/admin/sys/service/UserItemService.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.sys.service.impl;
package vip.xumy.admin.sys.service;
import java.util.List;
@ -7,34 +7,33 @@ import org.springframework.stereotype.Service; @@ -7,34 +7,33 @@ import org.springframework.stereotype.Service;
import vip.xumy.admin.sys.mapper.IUserItemMapper;
import vip.xumy.admin.sys.pojo.UserItem;
import vip.xumy.admin.sys.service.IUserItemService;
/** Ownership belongs to the company
* author:mengyxu
* date:2020年3月17日
/**
* @author:mengyxu
* @date:2020年3月17日
*/
@Service
public class UserItemService implements IUserItemService {
public class UserItemService {
@Autowired
private IUserItemMapper itemMapper;
@Override
public List<UserItem> queryByExample(UserItem example) {
return itemMapper.queryByExample(example);
}
@Override
public void save(UserItem item) {
itemMapper.insert(item);
}
@Override
public void save(List<UserItem> items) {
itemMapper.insertBatch(items);
}
@Override
public void read(Integer id) {
UserItem item = new UserItem();
item.setId(id);
@ -42,7 +41,7 @@ public class UserItemService implements IUserItemService { @@ -42,7 +41,7 @@ public class UserItemService implements IUserItemService {
itemMapper.update(item);
}
@Override
public void dealWith(Integer id) {
UserItem item = new UserItem();
item.setId(id);

33
java/src/main/java/vip/xumy/admin/conf/PermissionInteceptor.java → java/src/main/java/vip/xumy/admin/um/conf/PermissionInteceptor.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.conf;
package vip.xumy.admin.um.conf;
import java.util.List;
@ -20,7 +20,8 @@ import vip.xumy.core.utils.StringUtil; @@ -20,7 +20,8 @@ import vip.xumy.core.utils.StringUtil;
/**
* 权限验证拦截器
* @author v_mengyxu
*
* @author mengyxu
*
*/
@Log4j2
@ -33,23 +34,23 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -33,23 +34,23 @@ public class PermissionInteceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
log.debug("Permission interceptor : preHandle ...");
response.setContentType("application/json;charset:UTF-8");
//获取此次请求需要的权限
// 获取此次请求需要的权限
String path = request.getServletPath();
try {
verifyPath(path);
//return if start with /public
if(isPublicResource(path)){
// return if start with /public
if (isPublicResource(path)) {
return true;
}
List<String> resourceCodes = getResourceCodes(path);
String userId = getLogonUser(request);
//判断用户是否拥有该权限
// 判断用户是否拥有该权限
getPermissionCode(userId, resourceCodes);
} catch (CoreException e){
} catch (CoreException e) {
log.warn(e.getMessage());
response.getWriter().write(JSON.toJSONString(new AjaxResponse(false, e.getMessage())));
return false;
@ -60,14 +61,15 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -60,14 +61,15 @@ public class PermissionInteceptor implements HandlerInterceptor {
/**
* Lookup the login user from request/session.
*
* @param request
* @return
* @throws CrsPermissionException if no "loginid" found.
*/
private String getLogonUser(HttpServletRequest request) throws CoreException {
//获取用户id
// 获取用户id
String userName = LoginUtil.getUserNameAndRefresh(request);
if(userName == null){
if (userName == null) {
throw new CoreException("session timeout");
}
return userName;
@ -75,11 +77,12 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -75,11 +77,12 @@ public class PermissionInteceptor implements HandlerInterceptor {
/**
* Verify if it is null or empty.
*
* @param path
* @throws CrsMvcException if path is null or empty.
*/
private void verifyPath(String path) throws CoreException {
if(StringUtil.isEmpty(path)){
if (StringUtil.isEmpty(path)) {
throw new CoreException("It is an empty request path");
}
}
@ -95,7 +98,7 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -95,7 +98,7 @@ public class PermissionInteceptor implements HandlerInterceptor {
String resourcePath = path.substring(1);
List<String> resCodes = validationService.queryCodeByContent(resourcePath);
if(resCodes == null || resCodes.isEmpty()){
if (resCodes == null || resCodes.isEmpty()) {
throw new CoreException("no permission for " + resourcePath);
}
@ -104,6 +107,7 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -104,6 +107,7 @@ public class PermissionInteceptor implements HandlerInterceptor {
/**
* Verify if it an public resource.
*
* @param path
* @return
*/
@ -113,19 +117,20 @@ public class PermissionInteceptor implements HandlerInterceptor { @@ -113,19 +117,20 @@ public class PermissionInteceptor implements HandlerInterceptor {
/**
* Get the match resource code by user.
*
* @param userId
* @param resCodes
* @return
* @throws CrsPermissionException if no resource code found.
*/
private String getPermissionCode(String userId, List<String> resCodes) throws CoreException{
private String getPermissionCode(String userId, List<String> resCodes) throws CoreException {
for (String resCode : resCodes) {
if (validationService.havePermission(userId, resCode)){
if (validationService.havePermission(userId, resCode)) {
return resCode;
}
}
//No permission match.
// No permission match.
throw new CoreException("no permission");
}
}

25
java/src/main/java/vip/xumy/admin/um/conf/UMInitializer.java

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
package vip.xumy.admin.um.conf;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = "com.sprt.admin.um", useDefaultFilters = true)
@MapperScan("com.sprt.admin.um.mapper")
public class UMInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(UMInitializer.class);
}
}

9
java/src/main/java/vip/xumy/admin/conf/BaseSprtWebMvcConfigurer.java → java/src/main/java/vip/xumy/admin/um/conf/UMWebMvcConfigurer.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin.conf;
package vip.xumy.admin.um.conf;
import java.util.ArrayList;
import java.util.Iterator;
@ -18,19 +18,20 @@ import com.alibaba.fastjson.serializer.SerializerFeature; @@ -18,19 +18,20 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import vip.xumy.admin.sys.service.ILogService;
import vip.xumy.admin.sys.service.LogService;
import vip.xumy.admin.utils.BaseLogUtil;
import vip.xumy.admin.utils.LoginUtil;
@Configuration
public class BaseSprtWebMvcConfigurer implements WebMvcConfigurer {
public class UMWebMvcConfigurer implements WebMvcConfigurer {
@Autowired
private PermissionInteceptor permissionInteceptor;
@Autowired
public void setLogService(ILogService logService) {
public void setLogService(LogService logService) {
BaseLogUtil.logService = logService;
}
@Autowired
public void setEnvironment(Environment env) {
String timeout = env.getProperty("timeout.login.token", "30");

2
java/src/main/java/vip/xumy/admin/PageController.java → java/src/main/java/vip/xumy/admin/um/controller/PageController.java

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
package vip.xumy.admin;
package vip.xumy.admin.um.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;

21
java/src/main/java/vip/xumy/admin/PublicContoller.java → java/src/main/java/vip/xumy/admin/um/controller/PublicContoller.java

@ -1,18 +1,14 @@ @@ -1,18 +1,14 @@
package vip.xumy.admin;
package vip.xumy.admin.um.controller;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import vip.xumy.admin.sys.pojo.Dictionary;
import vip.xumy.admin.sys.service.IDictionaryService;
import vip.xumy.admin.um.pojo.Permission;
import vip.xumy.admin.um.service.IPermissionService;
import vip.xumy.admin.um.service.IRolePermissionService;
@ -20,9 +16,9 @@ import vip.xumy.admin.utils.LoginUtil; @@ -20,9 +16,9 @@ import vip.xumy.admin.utils.LoginUtil;
import vip.xumy.core.exception.CoreException;
import vip.xumy.core.pojo.com.Entry;
/** Ownership belongs to the company
* author:mengyxu
* date:2019年10月21日
/**
* @author:mengyxu
* @date:2019年10月21日
*/
@RestController
@RequestMapping("public")
@ -32,8 +28,6 @@ public class PublicContoller { @@ -32,8 +28,6 @@ public class PublicContoller {
private IRolePermissionService roleService;
@Autowired
private IPermissionService perService;
@Autowired
private IDictionaryService dictService;
@RequestMapping(value = "role/map", method = RequestMethod.GET)
public List<Entry<String, String>> queryRoleMaps() {
@ -41,7 +35,7 @@ public class PublicContoller { @@ -41,7 +35,7 @@ public class PublicContoller {
}
@RequestMapping(value = "per/list", method = RequestMethod.GET)
public List<Permission> queryPermissionTree(HttpServletRequest request) throws CoreException{
public List<Permission> queryPermissionTree(HttpServletRequest request) throws CoreException {
return perService.queryPermissionTree(false);
}
@ -52,9 +46,4 @@ public class PublicContoller { @@ -52,9 +46,4 @@ public class PublicContoller {
return perService.myPermissions(userName, parentContent);
}
@RequestMapping(value = "get/dict", method = RequestMethod.POST)
public Map<String, List<Dictionary>> getDictionarys(@RequestBody String[] codes) {
return dictService.getDicts(codes);
}
}

4
java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java

@ -6,12 +6,12 @@ import javax.servlet.http.HttpServletRequest; @@ -6,12 +6,12 @@ import javax.servlet.http.HttpServletRequest;
import lombok.extern.log4j.Log4j2;
import vip.xumy.admin.sys.pojo.ActionLog;
import vip.xumy.admin.sys.service.ILogService;
import vip.xumy.admin.sys.service.LogService;
import vip.xumy.core.utils.StringUtil;
@Log4j2
public class BaseLogUtil {
public static ILogService logService;
public static LogService logService;
protected BaseLogUtil() {
// Add a protected constructor to hide the implicit public one.

104
java/src/main/java/vip/xumy/admin/verify/conf/BaseConfigurer.java

@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
package vip.xumy.admin.verify.conf;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
@Configuration
public class BaseConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInteceptor loginInteceptor;
/**
* 跨域支持
*
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedHeaders("*").allowCredentials(true).allowedMethods("*")
.maxAge(3600 * 24);
}
/**
* 登录拦截器
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> patterns = new ArrayList<>();
patterns.add("/");
patterns.add("/um/**");
patterns.add("/public/**");
patterns.add("/css/**");
patterns.add("/fonts/**");
patterns.add("/js/**");
patterns.add("/image/**");
patterns.add("/*.html");
patterns.add("/*.ico");
registry.addInterceptor(loginInteceptor).addPathPatterns("/**").excludePathPatterns(patterns);
WebMvcConfigurer.super.addInterceptors(registry);
}
/**
* 默认JSON解析器从Jackson改为FastJson
*
* @param registry
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Iterator<HttpMessageConverter<?>> iterator = converters.iterator();
while (iterator.hasNext()) {
HttpMessageConverter<?> converter = iterator.next();
if (converter instanceof MappingJackson2HttpMessageConverter) {
iterator.remove();
}
}
// 升级最新版本需加======解决报错:Content-Type' cannot contain wildcard type '*
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
List<MediaType> supportedMediaTypes = new ArrayList<>();
supportedMediaTypes.add(MediaType.APPLICATION_JSON);
supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML);
supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
supportedMediaTypes.add(MediaType.APPLICATION_PDF);
supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML);
supportedMediaTypes.add(MediaType.APPLICATION_XML);
supportedMediaTypes.add(MediaType.IMAGE_GIF);
supportedMediaTypes.add(MediaType.IMAGE_JPEG);
supportedMediaTypes.add(MediaType.IMAGE_PNG);
supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM);
supportedMediaTypes.add(MediaType.TEXT_HTML);
supportedMediaTypes.add(MediaType.TEXT_MARKDOWN);
supportedMediaTypes.add(MediaType.TEXT_PLAIN);
supportedMediaTypes.add(MediaType.TEXT_XML);
fastConverter.setSupportedMediaTypes(supportedMediaTypes);
// 2、添加fastjson的配置信息,比如 是否要格式化返回json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 3、在convert中添加配置信息.
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4、将convert添加到converters当中.
converters.add(fastConverter);
}
}

37
java/src/main/java/vip/xumy/admin/verify/conf/LoginInteceptor.java

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
package vip.xumy.admin.verify.conf;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import com.alibaba.fastjson.JSON;
import lombok.extern.log4j.Log4j2;
import vip.xumy.admin.verify.controller.PublicController;
import vip.xumy.core.pojo.com.AjaxResponse;
/**
* 权限验证拦截器
* @author v_mengyxu
*
*/
@Log4j2
@Component
public class LoginInteceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//判断是否登录
Object user = request.getSession().getAttribute(PublicController.KEY);
if(user == null) {
log.debug("Login interceptor : preHandle ...");
response.setContentType("application/json;charset:UTF-8");
response.getWriter().write(JSON.toJSONString(new AjaxResponse(false, "session timeout")));
return false;
}
return true;
}
}

25
java/src/main/java/vip/xumy/admin/verify/conf/VerifyInitializer.java

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
package vip.xumy.admin.verify.conf;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(value = "vip.xumy.admin.verify", useDefaultFilters = true)
@MapperScan("vip.xumy.admin.verify.mapper")
public class VerifyInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(VerifyInitializer.class);
}
}

52
java/src/main/java/vip/xumy/admin/verify/controller/PublicController.java

@ -0,0 +1,52 @@ @@ -0,0 +1,52 @@
package vip.xumy.admin.verify.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import vip.xumy.admin.verify.pojo.User;
import vip.xumy.admin.verify.service.UserService;
import vip.xumy.core.pojo.com.AjaxResponse;
/**
* @author:mengyxu
* @date:2020年10月28日
*/
@RestController
@RequestMapping("public")
public class PublicController {
public final static String KEY = "user";
@Autowired
private UserService userService;
@RequestMapping(value = "login", method = RequestMethod.POST)
public AjaxResponse login(@RequestBody User param, HttpServletRequest request) {
User user = userService.login(param);
if (user == null) {
return new AjaxResponse(false, "登录失败,用户名或密码错误");
}
request.getSession().setAttribute(KEY, user);
return new AjaxResponse(true, "登录成功");
}
@RequestMapping(value = "logout", method = RequestMethod.GET)
public AjaxResponse logout(HttpServletRequest request) {
request.getSession().removeAttribute(KEY);
return new AjaxResponse(true, "登出成功");
}
@RequestMapping(value = "info", method = RequestMethod.GET)
public User login(HttpServletRequest request) {
Object user = request.getSession().getAttribute(KEY);
if (user == null) {
return null;
}
return (User) user;
}
}

24
java/src/main/java/vip/xumy/admin/verify/mapper/IUserMapper.java

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
package vip.xumy.admin.verify.mapper;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import vip.xumy.admin.verify.pojo.User;
/**
* @author:mengyxu
* @date:2020年10月28日
*/
public interface IUserMapper {
@Select({ "SELECT * FROM user WHERE user_id = #{userId} AND password = #{password}" })
@Results({ @Result(property = "userId", column = "user_id") })
User login(User param);
@Update({ "UPDATE user SET password = #{newPwd} WHERE user_id = #{userId} AND password = #{password}" })
int updatePassword(User param);
}

24
java/src/main/java/vip/xumy/admin/verify/pojo/User.java

@ -0,0 +1,24 @@ @@ -0,0 +1,24 @@
package vip.xumy.admin.verify.pojo;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Getter;
import lombok.Setter;
/**
* @author:mengyxu
* @date:2020年10月28日
*/
@Setter
@Getter
public class User {
private String userId;
private String name;
@JSONField(serialize = false)
private String password;
private String desc;
private String permission;
}

23
java/src/main/java/vip/xumy/admin/verify/service/UserService.java

@ -0,0 +1,23 @@ @@ -0,0 +1,23 @@
package vip.xumy.admin.verify.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import vip.xumy.admin.verify.mapper.IUserMapper;
import vip.xumy.admin.verify.pojo.User;
/**
* @author:mengyxu
* @date:2020年10月31日
*/
@Service
public class UserService {
@Autowired
private IUserMapper userMapper;
public User login(User param) {
return userMapper.login(param);
}
}

4
java/src/main/resources/application.properties

@ -21,7 +21,9 @@ spring.datasource.testOnReturn=false @@ -21,7 +21,9 @@ spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=false
mybatis.mapper-locations= classpath*:mapper/**/*.xml
mybatis.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
#mybatis.configuration.log-impl= org.apache.ibatis.logging.stdout.StdOutImpl
#开启mybatis驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
pagehelper.helperDialect=mysql
pagehelper.reasonable=true

77
java/src/main/resources/mapper/sys/IActionLogMapper.xml

@ -1,77 +0,0 @@ @@ -1,77 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="vip.xumy.admin.sys.mapper.IActionLogMapper">
<sql id="base_column">
id,type,module,user_id,login_ip,time,context
</sql>
<resultMap type="vip.xumy.admin.sys.pojo.ActionLog" id="logRM">
<id column="id" property="id"/>
<result column="type" property="type"/>
<result column="module" property="module"/>
<result column="user_id" property="userId"/>
<result column="login_ip" property="loginIp"/>
<result column="time" property="time"/>
<result column="context" property="context"/>
</resultMap>
<select id="queryByExample" parameterType="vip.xumy.admin.sys.pojo.ActionLog" resultMap="logRM">
SELECT
<include refid="base_column"/>
FROM
sys_action_log
<where>
<if test="type != null and type != ''">
AND type = #{type}
</if>
<if test="module != null and module != ''">
AND module = #{module}
</if>
<if test="userId != null and userId != ''">
AND user_id like CONCAT('%',#{userId},'%')
</if>
<if test="context != null and context != ''">
AND context like CONCAT('%',#{context},'%')
</if>
<if test="startTime != null and startTime != ''">
AND time >= #{startTime}
</if>
<if test="endTime != null and endTime != ''">
AND #{endTime} > time
</if>
</where>
ORDER BY time DESC
</select>
<insert id="insert" parameterType="vip.xumy.admin.sys.pojo.ActionLog">
INSERT INTO sys_action_log
(<include refid="base_column"/>)
VALUES (
#{id},
#{type},
#{module},
#{userId},
#{loginIp},
#{time},
#{context}
)
</insert>
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO BusinessLog
(<include refid="base_column"/>)
VALUES
<foreach collection="list" item="log" separator=",">
(
#{log.id},
#{log.type},
#{log.module},
#{log.userId},
#{log.loginIp},
#{log.time},
#{log.context}
)
</foreach>
</insert>
</mapper>

66
java/src/main/resources/mapper/sys/IConfigMapper.xml

@ -1,66 +0,0 @@ @@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="vip.xumy.admin.sys.mapper.IConfigMapper">
<sql id="baseColumn">
cfg_key,
cfg_name,
cfg_value,
cfg_type,
cfg_desc,
cfg_status,
update_time,
update_user
</sql>
<resultMap type="vip.xumy.admin.sys.pojo.SysConfig" id="cfgResultMap">
<result column="cfg_key" property="cfgKey"/>
<result column="cfg_name" property="cfgName"/>
<result column="cfg_value" property="cfgValue"/>
<result column="cfg_type" property="cfgType"/>
<result column="cfg_desc" property="cfgDesc"/>
<result column="cfg_status" property="cfgStatus"/>
<result column="update_time" property="updateTime"/>
<result column="update_user" property="updateUser"/>
</resultMap>
<select id="queryValueByKey" parameterType="java.lang.String" resultType="java.lang.String">
SELECT cfg_value FROM sys_config WHERE cfg_key = #{cfgKey} AND cfg_status != 'I'
</select>
<select id="queryByExample" parameterType="vip.xumy.admin.sys.pojo.SysConfig" resultMap="cfgResultMap">
SELECT
<include refid="baseColumn"/>
FROM
sys_config
<where>
<if test="cfgKey != null and cfgKey !=''">
AND cfg_key = #{cfgKey}
</if>
<if test="cfgStatus != null and cfgStatus !=''">
AND cfg_status = #{cfgStatus}
</if>
<if test="cfgName != null and cfgName !=''">
AND cfg_name like CONCAT('%',#{cfgName},'%')
</if>
</where>
</select>
<update id="update" parameterType="vip.xumy.admin.sys.pojo.SysConfig">
UPDATE
sys_config
SET
cfg_name = #{cfgName},
cfg_value = #{cfgValue},
cfg_desc = #{cfgDesc},
cfg_status = #{cfgStatus},
update_time = NOW(),
update_user = #{updateUser}
WHERE
cfg_key = #{cfgKey}
</update>
</mapper>

153
java/src/main/resources/mapper/sys/IDictionaryMapper.xml

@ -1,153 +0,0 @@ @@ -1,153 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="vip.xumy.admin.sys.mapper.IDictionaryMapper">
<sql id="typeColumn">
type_code,
type_name,
type_desc,
type_status
</sql>
<sql id="dictColumn">
dict_id,
dict_code,
dict_name,
dict_desc,
dict_parent,
dict_status
</sql>
<resultMap type="vip.xumy.admin.sys.pojo.Dictionary" id="typeRM">
<result column="type_code" property="key"/>
<result column="type_code" property="code"/>
<result column="type_name" property="name"/>
<result column="type_desc" property="desc"/>
<result column="type_status" property="status"/>
<collection property="children" column="{parent=type_code}" select="queryDict"/>
</resultMap>
<resultMap type="vip.xumy.admin.sys.pojo.Dictionary" id="dictRM">
<id column="dict_id" property="id"/>
<result column="dict_id" property="key"/>
<result column="dict_code" property="code"/>
<result column="dict_name" property="name"/>
<result column="dict_desc" property="desc"/>
<result column="dict_parent" property="parent"/>
<result column="dict_status" property="status"/>
</resultMap>
<select id="queryType" resultMap="typeRM" parameterType="vip.xumy.admin.sys.pojo.Dictionary">
SELECT
<include refid="typeColumn"/>
FROM
sys_dict_type
<where>
<if test="code != null and code != ''">
AND type_code = #{code}
</if>
<if test="name != null and name != ''">
AND type_name like CONCAT('%',#{name},'%')
</if>
<if test="status != null and status != ''">
AND type_status = #{status}
</if>
</where>
ORDER BY type_name ASC
</select>
<select id="queryDict" resultMap="dictRM" parameterType="vip.xumy.admin.sys.pojo.Dictionary">
SELECT
<include refid="dictColumn"/>
FROM
sys_dictionary
<where>
<if test="id != null">
AND dict_id = #{id}
</if>
<if test="parent != null and parent != ''">
AND dict_parent = #{parent}
</if>
<if test="status != null and status != ''">
AND dict_status = #{status}
</if>
</where>
ORDER BY dict_id ASC
</select>
<insert id="insertDict" parameterType="vip.xumy.admin.sys.pojo.Dictionary" >
INSERT INTO sys_dictionary
(<include refid="dictColumn"></include>)
VALUES
(
#{id},
#{code},
#{name},
#{desc},
#{parent},
#{status}
)
</insert>
<insert id="insertType" parameterType="vip.xumy.admin.sys.pojo.Dictionary">
INSERT INTO sys_dict_type
(<include refid="typeColumn"></include>)
VALUES
(
#{code},
#{name},
#{desc},
#{status}
)
</insert>
<update id="updateDict" parameterType="vip.xumy.admin.sys.pojo.Dictionary">
UPDATE sys_dictionary SET
dict_code = #{code},
dict_name = #{name},
dict_desc = #{desc},
dict_parent = #{parent},
dict_status = #{status}
WHERE
dict_id = #{id}
</update>
<update id="updateType" parameterType="vip.xumy.admin.sys.pojo.Dictionary">
UPDATE sys_dict_type SET
type_name = #{name},
type_desc = #{desc},
type_status = #{status}
WHERE
type_code = #{code}
</update>
<delete id="deleteType" parameterType="java.lang.String">
DELETE FROM sys_dict_type WHERE type_code = #{code}
</delete>
<delete id="deleteDict" parameterType="java.lang.Integer">
DELETE FROM sys_dictionary WHERE dict_id = #{id}
</delete>
<delete id="deleteDicts" parameterType="java.lang.String">
DELETE FROM sys_dictionary WHERE dict_parent = #{parent}
</delete>
<select id="queryProvince" resultType="vip.xumy.core.pojo.com.Entry">
select code as 'key', name as 'value' from province
</select>
<select id="queryCity" resultType="vip.xumy.core.pojo.com.Entry" parameterType="java.lang.String">
select code as 'key', name as 'value' from city where provinceCode = #{parent}
</select>
<select id="queryCounty" resultType="vip.xumy.core.pojo.com.Entry" parameterType="java.lang.String">
select countycode as 'key', countyname as 'value' from county where cityCode = #{parent}
</select>
</mapper>

95
java/src/main/resources/mapper/sys/IUserItemMapper.xml

@ -1,95 +0,0 @@ @@ -1,95 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="vip.xumy.admin.sys.mapper.IUserItemMapper">
<sql id="base_column">
id,user_id,item_name,item_desc,item_type,item_flag,add_user,add_time,status
</sql>
<resultMap type="vip.xumy.admin.sys.pojo.UserItem" id="itemRM">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="item_name" property="itemName"/>
<result column="item_desc" property="itemDesc"/>
<result column="item_type" property="itemType"/>
<result column="item_flag" property="itemFlag"/>
<result column="add_user" property="addUser"/>
<result column="add_time" property="addTime"/>
<result column="status" property="status"/>
</resultMap>
<select id="queryByExample" parameterType="vip.xumy.admin.sys.pojo.UserItem" resultMap="itemRM">
SELECT
<include refid="base_column"/>
FROM
sys_user_item
<where>
<if test="id != null and id != ''">
AND id = #{id}
</if>
<if test="userId != null and userId != ''">
AND user_id = #{userId}
</if>
<if test="itemType != null and itemType != ''">
AND item_type = #{itemType}
</if>
<if test="itemFlag != null and itemFlag != ''">
AND item_flag = #{itemFlag}
</if>
<if test="addUser != null and addUser != ''">
AND add_user = #{addUser}
</if>
<if test="status != null">
AND status = #{status}
</if>
</where>
ORDER BY status ASC, add_time DESC
<if test="limitStart != null">
LIMIT #{limitStart},#{size}
</if>
</select>
<insert id="insert" parameterType="vip.xumy.admin.sys.pojo.UserItem">
INSERT INTO sys_user_item
(<include refid="base_column"/>)
VALUES (
#{id},
#{userId},
#{itemName},
#{itemDesc},
#{itemType},
#{itemFlag},
#{addUser},
#{addTime},
'0'
)
</insert>
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO sys_user_item
(<include refid="base_column"/>)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.id},
#{item.userId},
#{item.itemName},
#{item.itemDesc},
#{item.itemType},
#{item.itemFlag},
#{item.addUser},
#{item.addTime},
'0'
)
</foreach>
</insert>
<update id="update" parameterType="vip.xumy.admin.sys.pojo.UserItem">
UPDATE sys_user_item
SET
status = #{status}
WHERE
id = #{id}
</update>
</mapper>
Loading…
Cancel
Save