diff --git a/java/pom.xml b/java/pom.xml index b08d583..ca3d33b 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -9,7 +9,7 @@ vip.xumy.admin xumy_admin - 0.0.1 + 1.2.0 admin xumy-admin jar diff --git a/java/src/main/java/vip/xumy/admin/AdminApplocation.java b/java/src/main/java/vip/xumy/admin/AdminApplocation.java index 33c4f85..8444c7b 100644 --- a/java/src/main/java/vip/xumy/admin/AdminApplocation.java +++ b/java/src/main/java/vip/xumy/admin/AdminApplocation.java @@ -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); - } - } diff --git a/java/src/main/java/vip/xumy/admin/bmap/BMapInitializer.java b/java/src/main/java/vip/xumy/admin/bmap/BMapInitializer.java new file mode 100644 index 0000000..b977007 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/BMapInitializer.java @@ -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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/controller/BMapController.java b/java/src/main/java/vip/xumy/admin/bmap/controller/BMapController.java new file mode 100644 index 0000000..dae543c --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/controller/BMapController.java @@ -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 list(CityLocate example){ + Page pages = PageHelper.startPage(example.getPage(), example.getSize()); + List list = cityLocateService.list(example); + PageResponse 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 workHistory(int page, int size){ + Page pages = PageHelper.startPage(page, size); + List list = loadWorkService.history(); + PageResponse rsp = new PageResponse<>(); + rsp.setRows(list); + rsp.setTotal(pages.getTotal()); + return rsp; + } + + @GetMapping("work/wait") + public List waitWork(){ + return loadWorkService.waitList(); + } + + @GetMapping("working") + public WorkContext working(){ + return worker.getContext(); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/controller/ImageController.java b/java/src/main/java/vip/xumy/admin/bmap/controller/ImageController.java new file mode 100644 index 0000000..41443f7 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/controller/ImageController.java @@ -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; + } + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/mapper/ICityLocateMapper.java b/java/src/main/java/vip/xumy/admin/bmap/mapper/ICityLocateMapper.java new file mode 100644 index 0000000..70c17f2 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/mapper/ICityLocateMapper.java @@ -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({ "" }) + void saveBatch(List cityInfos); + + @Select({ "" }) + List 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); + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/mapper/ILoadWorkMapper.java b/java/src/main/java/vip/xumy/admin/bmap/mapper/ILoadWorkMapper.java new file mode 100644 index 0000000..1e315d8 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/mapper/ILoadWorkMapper.java @@ -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({ "" }) + List list(DownWorker example); + + @Insert({ "" }) + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") + void saveBatch(List context); + + @Insert({ "" }) + @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); + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/pojo/CityLocate.java b/java/src/main/java/vip/xumy/admin/bmap/pojo/CityLocate.java new file mode 100644 index 0000000..b464b67 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/pojo/CityLocate.java @@ -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; + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/pojo/DownWorker.java b/java/src/main/java/vip/xumy/admin/bmap/pojo/DownWorker.java new file mode 100644 index 0000000..e865f3b --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/pojo/DownWorker.java @@ -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; + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/pojo/Point.java b/java/src/main/java/vip/xumy/admin/bmap/pojo/Point.java new file mode 100644 index 0000000..ef31dc8 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/pojo/Point.java @@ -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; + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/pojo/WorkContext.java b/java/src/main/java/vip/xumy/admin/bmap/pojo/WorkContext.java new file mode 100644 index 0000000..1168137 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/pojo/WorkContext.java @@ -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> 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> 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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/service/CityLocateService.java b/java/src/main/java/vip/xumy/admin/bmap/service/CityLocateService.java new file mode 100644 index 0000000..a40df69 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/service/CityLocateService.java @@ -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 list(CityLocate example) { + return cityLocateMapper.list(example); + } + + public CityLocate get(Integer id) { + CityLocate example = new CityLocate(); + example.setId(id); + List 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 list = cityLocateMapper.list(example); + if (list == null || list.isEmpty()) { + return null; + } + return list.get(0); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/service/LoadWorkService.java b/java/src/main/java/vip/xumy/admin/bmap/service/LoadWorkService.java new file mode 100644 index 0000000..f677a24 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/service/LoadWorkService.java @@ -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 history() { + DownWorker example = new WorkContext(); + example.setStatus(2); + return loadWorkMapper.list(example); + } + + public List waitList() { + DownWorker example = new WorkContext(); + example.setStatus(0); + return loadWorkMapper.list(example); + } + + public DownWorker working() { + DownWorker example = new WorkContext(); + example.setStatus(1); + List 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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/util/BMapTool.java b/java/src/main/java/vip/xumy/admin/bmap/util/BMapTool.java new file mode 100644 index 0000000..fbb9925 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/util/BMapTool.java @@ -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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/bmap/util/DownloadWorker.java b/java/src/main/java/vip/xumy/admin/bmap/util/DownloadWorker.java new file mode 100644 index 0000000..37de0d7 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/bmap/util/DownloadWorker.java @@ -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 queue = new LinkedBlockingQueue<>(1000); + private static final ExecutorService executor = Executors.newFixedThreadPool(100); + private static final LinkedBlockingQueue 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 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(); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/sys/conf/SysInitializer.java b/java/src/main/java/vip/xumy/admin/sys/conf/SysInitializer.java new file mode 100644 index 0000000..146a108 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/sys/conf/SysInitializer.java @@ -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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/ConfigController.java b/java/src/main/java/vip/xumy/admin/sys/controller/ConfigController.java new file mode 100644 index 0000000..3c6f241 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/sys/controller/ConfigController.java @@ -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 list(SysConfig example) { + Page pages = PageHelper.startPage(example.getPage(), example.getSize()); + List list = configService.queryByExample(example); + PageResponse 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, "修改成功"); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java b/java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java index 92f12ed..840c9a3 100644 --- a/java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java +++ b/java/src/main/java/vip/xumy/admin/sys/controller/DictionaryController.java @@ -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 queryDistList(Dictionary example) { diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/LogController.java b/java/src/main/java/vip/xumy/admin/sys/controller/LogController.java index 715afcf..4b569f1 100644 --- a/java/src/main/java/vip/xumy/admin/sys/controller/LogController.java +++ b/java/src/main/java/vip/xumy/admin/sys/controller/LogController.java @@ -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 queryActionLogList(ActionLog example){ + public PageResponse queryActionLogList(ActionLog example) { Page pages = PageHelper.startPage(example.getPage(), example.getSize()); List list = LogService.queryActionLog(example); PageResponse rsp = new PageResponse<>(); diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java b/java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java index fb4f53c..1f0d011 100644 --- a/java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java +++ b/java/src/main/java/vip/xumy/admin/sys/controller/MemoryController.java @@ -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 getBufferList(HttpServletRequest request){ + public List getBufferList(HttpServletRequest request) { log.info("查询缓存列表,当前登陆用户:" + LoginUtil.getUserId(request)); List list = new ArrayList<>(); Map 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, "修改缓存失效时间成功"); } diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/SysPublicContoller.java b/java/src/main/java/vip/xumy/admin/sys/controller/SysPublicContoller.java new file mode 100644 index 0000000..faca5bb --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/sys/controller/SysPublicContoller.java @@ -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> getDictionarys(@RequestBody String[] codes) { + return dictService.getDicts(codes); + } + + @RequestMapping(value = "version") + public String getVersionNum() { + return versionNum; + } + +} diff --git a/java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java b/java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java index 5fad88f..ce94bb5 100644 --- a/java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java +++ b/java/src/main/java/vip/xumy/admin/sys/controller/UserItemController.java @@ -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 queryList(UserItem example, HttpServletRequest request){ + public List 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); } diff --git a/java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java b/java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java index d97eeaa..55eeff1 100644 --- a/java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java +++ b/java/src/main/java/vip/xumy/admin/sys/mapper/IActionLogMapper.java @@ -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({ "" }) List queryByExample(ActionLog example); - + + @Insert({ "INSERT INTO BusinessLog ( ", BASE_COLUMN, " ) VALUES ", + "(#{id}, {type}, #{module}, #{userId}, #{loginIp}, #{time}, #{context})" }) void insert(ActionLog log); - + + @Insert({ "" }) void insertBatch(List logs); } diff --git a/java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java b/java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java index c43700c..35514a2 100644 --- a/java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java +++ b/java/src/main/java/vip/xumy/admin/sys/mapper/IConfigMapper.java @@ -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({ "" }) public List 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); - } diff --git a/java/src/main/java/vip/xumy/admin/sys/mapper/IDictTypeMapper.java b/java/src/main/java/vip/xumy/admin/sys/mapper/IDictTypeMapper.java new file mode 100644 index 0000000..1ebefd5 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/sys/mapper/IDictTypeMapper.java @@ -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({ "" }) + List 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); + +} diff --git a/java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java b/java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java index 0aae91b..4584fa3 100644 --- a/java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java +++ b/java/src/main/java/vip/xumy/admin/sys/mapper/IDictionaryMapper.java @@ -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 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({ "" }) List 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); + + @Delete({ "DELETE FROM dictionary WHERE dict_id = #{id}" }) void deleteDict(Integer id); - - List> queryProvince(); - List> queryCity(String parent); - List> queryCounty(String parent); } diff --git a/java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java b/java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java index 4e195f9..ad4bdcc 100644 --- a/java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java +++ b/java/src/main/java/vip/xumy/admin/sys/mapper/IUserItemMapper.java @@ -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({ "" }) List 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({ "" }) void insertBatch(List items); - + + @Update({ "UPDATE sys_user_item SET status = #{status} WHERE id = #{id}" }) void update(UserItem item); } diff --git a/java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java b/java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java index 628e22e..c53890a 100644 --- a/java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java +++ b/java/src/main/java/vip/xumy/admin/sys/pojo/ActionLog.java @@ -4,15 +4,15 @@ 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 @Getter public class ActionLog extends BasePeriod { - + private Integer id; private String type; private String module; diff --git a/java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java b/java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java index bb58289..59f695c 100644 --- a/java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java +++ b/java/src/main/java/vip/xumy/admin/sys/pojo/Dictionary.java @@ -6,15 +6,15 @@ 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 @Getter public class Dictionary extends BasePageParam { - + private String key; private Integer id; private String code; @@ -22,7 +22,7 @@ public class Dictionary extends BasePageParam { private String desc; private String parent; private String status; - + private List children; - + } diff --git a/java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java b/java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java index 9d3c412..b599bb0 100644 --- a/java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java +++ b/java/src/main/java/vip/xumy/admin/sys/pojo/UserItem.java @@ -9,15 +9,15 @@ 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; private String itemName; diff --git a/java/src/main/java/vip/xumy/admin/sys/service/impl/ConfigService.java b/java/src/main/java/vip/xumy/admin/sys/service/ConfigService.java similarity index 86% rename from java/src/main/java/vip/xumy/admin/sys/service/impl/ConfigService.java rename to java/src/main/java/vip/xumy/admin/sys/service/ConfigService.java index 82a68c7..579a91e 100644 --- a/java/src/main/java/vip/xumy/admin/sys/service/impl/ConfigService.java +++ b/java/src/main/java/vip/xumy/admin/sys/service/ConfigService.java @@ -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; 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 { * @param defValue * @return */ - @Override public long getLongConfig(String key, long defValue) { String value = queryValueByKey(key); @@ -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 { } } - @Override public String getStringConfig(String key, String defValue) { String value = queryValueByKey(key); @@ -66,17 +61,14 @@ public class ConfigService implements IConfigService { } - @Override - public List queryPageByExample(SysConfig example) { + public List 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) { diff --git a/java/src/main/java/vip/xumy/admin/sys/service/impl/DictionaryService.java b/java/src/main/java/vip/xumy/admin/sys/service/DictionaryService.java similarity index 54% rename from java/src/main/java/vip/xumy/admin/sys/service/impl/DictionaryService.java rename to java/src/main/java/vip/xumy/admin/sys/service/DictionaryService.java index 32914bd..d40b9b7 100644 --- a/java/src/main/java/vip/xumy/admin/sys/service/impl/DictionaryService.java +++ b/java/src/main/java/vip/xumy/admin/sys/service/DictionaryService.java @@ -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; 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 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> getDicts(String[] codes) { - if(codes == null || codes.length == 0) { + if (codes == null || codes.length == 0) { return null; } Map> map = new HashMap<>(); @@ -73,7 +69,6 @@ public class DictionaryService implements IDictionaryService { return map; } - @Override public List getDict(String code) { Dictionary example = new Dictionary(); example.setStatus("A"); @@ -81,19 +76,4 @@ public class DictionaryService implements IDictionaryService { return dictMapper.queryDict(example); } - @Override - public List> queryProvince() { - return dictMapper.queryProvince(); - } - - @Override - public List> queryCity(String parent) { - return dictMapper.queryCity(parent); - } - - @Override - public List> queryCounty(String parent) { - return dictMapper.queryCounty(parent); - } - } diff --git a/java/src/main/java/vip/xumy/admin/sys/service/IConfigService.java b/java/src/main/java/vip/xumy/admin/sys/service/IConfigService.java deleted file mode 100644 index fc7ad5d..0000000 --- a/java/src/main/java/vip/xumy/admin/sys/service/IConfigService.java +++ /dev/null @@ -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 queryPageByExample(SysConfig example); - - public void update(SysConfig sysConfig); - - public void updateCfg(String key, String value, String userId); - - -} diff --git a/java/src/main/java/vip/xumy/admin/sys/service/IDictionaryService.java b/java/src/main/java/vip/xumy/admin/sys/service/IDictionaryService.java deleted file mode 100644 index 997c764..0000000 --- a/java/src/main/java/vip/xumy/admin/sys/service/IDictionaryService.java +++ /dev/null @@ -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 queryType(Dictionary example); - - void save(Dictionary dist); - - void update(Dictionary dist); - - void delete(Dictionary dict) throws CoreException; - - Map> getDicts(String[] codes); - - List getDict(String code); - - List> queryProvince(); - - List> queryCity(String parent); - - List> queryCounty(String parent); - -} diff --git a/java/src/main/java/vip/xumy/admin/sys/service/ILogService.java b/java/src/main/java/vip/xumy/admin/sys/service/ILogService.java deleted file mode 100644 index aac76fb..0000000 --- a/java/src/main/java/vip/xumy/admin/sys/service/ILogService.java +++ /dev/null @@ -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 queryActionLog(ActionLog example); - - void insertActionLog(ActionLog log); - - void insertActionLogs(List logs); - - Map getTypeMap(); - -} diff --git a/java/src/main/java/vip/xumy/admin/sys/service/IUserItemService.java b/java/src/main/java/vip/xumy/admin/sys/service/IUserItemService.java deleted file mode 100644 index a069967..0000000 --- a/java/src/main/java/vip/xumy/admin/sys/service/IUserItemService.java +++ /dev/null @@ -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 queryByExample(UserItem example); - - void save(UserItem item); - - void save(List items); - - void read(Integer id); - - void dealWith(Integer id); - -} diff --git a/java/src/main/java/vip/xumy/admin/sys/service/impl/LogService.java b/java/src/main/java/vip/xumy/admin/sys/service/LogService.java similarity index 82% rename from java/src/main/java/vip/xumy/admin/sys/service/impl/LogService.java rename to java/src/main/java/vip/xumy/admin/sys/service/LogService.java index 3f83211..46c46c4 100644 --- a/java/src/main/java/vip/xumy/admin/sys/service/impl/LogService.java +++ b/java/src/main/java/vip/xumy/admin/sys/service/LogService.java @@ -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; 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; */ @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 queryActionLog(ActionLog example) { return actionLogMapper.queryByExample(example); } - @Override public void insertActionLog(ActionLog log) { actionLogMapper.insert(log); } - @Override public void insertActionLogs(List logs) { actionLogMapper.insertBatch(logs); } - @Override public Map getTypeMap() { Cache cache = GlobalBuffer.getCache(MAP_BUFFER_KEY); if(Cache.isEmpty(cache)) { diff --git a/java/src/main/java/vip/xumy/admin/sys/service/impl/UserItemService.java b/java/src/main/java/vip/xumy/admin/sys/service/UserItemService.java similarity index 74% rename from java/src/main/java/vip/xumy/admin/sys/service/impl/UserItemService.java rename to java/src/main/java/vip/xumy/admin/sys/service/UserItemService.java index c64bf9b..4fcadc4 100644 --- a/java/src/main/java/vip/xumy/admin/sys/service/impl/UserItemService.java +++ b/java/src/main/java/vip/xumy/admin/sys/service/UserItemService.java @@ -1,4 +1,4 @@ -package vip.xumy.admin.sys.service.impl; +package vip.xumy.admin.sys.service; import java.util.List; @@ -7,42 +7,41 @@ 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 queryByExample(UserItem example) { return itemMapper.queryByExample(example); } - @Override + public void save(UserItem item) { itemMapper.insert(item); } - @Override + public void save(List items) { itemMapper.insertBatch(items); } - @Override + public void read(Integer id) { UserItem item = new UserItem(); item.setId(id); item.setStatus(1); itemMapper.update(item); } + - @Override public void dealWith(Integer id) { UserItem item = new UserItem(); item.setId(id); diff --git a/java/src/main/java/vip/xumy/admin/conf/PermissionInteceptor.java b/java/src/main/java/vip/xumy/admin/um/conf/PermissionInteceptor.java similarity index 85% rename from java/src/main/java/vip/xumy/admin/conf/PermissionInteceptor.java rename to java/src/main/java/vip/xumy/admin/um/conf/PermissionInteceptor.java index 3b3be56..38f9f04 100644 --- a/java/src/main/java/vip/xumy/admin/conf/PermissionInteceptor.java +++ b/java/src/main/java/vip/xumy/admin/um/conf/PermissionInteceptor.java @@ -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; /** * 权限验证拦截器 - * @author v_mengyxu + * + * @author mengyxu * */ @Log4j2 @@ -28,46 +29,47 @@ import vip.xumy.core.utils.StringUtil; public class PermissionInteceptor implements HandlerInterceptor { @Autowired private IPermissionValidationService validationService; - + @Override 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 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; } - + return true; } /** * 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 { /** * 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"); } } @@ -93,17 +96,18 @@ public class PermissionInteceptor implements HandlerInterceptor { */ private List getResourceCodes(String path) throws CoreException { String resourcePath = path.substring(1); - + List resCodes = validationService.queryCodeByContent(resourcePath); - if(resCodes == null || resCodes.isEmpty()){ + if (resCodes == null || resCodes.isEmpty()) { throw new CoreException("no permission for " + resourcePath); } - + return resCodes; } /** * Verify if it an public resource. + * * @param path * @return */ @@ -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 resCodes) throws CoreException{ + private String getPermissionCode(String userId, List 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"); } } diff --git a/java/src/main/java/vip/xumy/admin/um/conf/UMInitializer.java b/java/src/main/java/vip/xumy/admin/um/conf/UMInitializer.java new file mode 100644 index 0000000..4f5904a --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/um/conf/UMInitializer.java @@ -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); + } + +} + + + + diff --git a/java/src/main/java/vip/xumy/admin/conf/BaseSprtWebMvcConfigurer.java b/java/src/main/java/vip/xumy/admin/um/conf/UMWebMvcConfigurer.java similarity index 95% rename from java/src/main/java/vip/xumy/admin/conf/BaseSprtWebMvcConfigurer.java rename to java/src/main/java/vip/xumy/admin/um/conf/UMWebMvcConfigurer.java index fef38c8..f7e1d62 100644 --- a/java/src/main/java/vip/xumy/admin/conf/BaseSprtWebMvcConfigurer.java +++ b/java/src/main/java/vip/xumy/admin/um/conf/UMWebMvcConfigurer.java @@ -1,4 +1,4 @@ -package vip.xumy.admin.conf; +package vip.xumy.admin.um.conf; import java.util.ArrayList; import java.util.Iterator; @@ -18,26 +18,27 @@ 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"); LoginUtil.timeout = Integer.parseInt(timeout); LoginUtil.domain = env.getProperty("login.token.domain"); } - + /** * 跨域支持 * diff --git a/java/src/main/java/vip/xumy/admin/PageController.java b/java/src/main/java/vip/xumy/admin/um/controller/PageController.java similarity index 97% rename from java/src/main/java/vip/xumy/admin/PageController.java rename to java/src/main/java/vip/xumy/admin/um/controller/PageController.java index 40f8b72..57b8909 100644 --- a/java/src/main/java/vip/xumy/admin/PageController.java +++ b/java/src/main/java/vip/xumy/admin/um/controller/PageController.java @@ -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; diff --git a/java/src/main/java/vip/xumy/admin/PublicContoller.java b/java/src/main/java/vip/xumy/admin/um/controller/PublicContoller.java similarity index 71% rename from java/src/main/java/vip/xumy/admin/PublicContoller.java rename to java/src/main/java/vip/xumy/admin/um/controller/PublicContoller.java index 3c38563..57424d0 100644 --- a/java/src/main/java/vip/xumy/admin/PublicContoller.java +++ b/java/src/main/java/vip/xumy/admin/um/controller/PublicContoller.java @@ -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,41 +16,34 @@ 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") public class PublicContoller { - + @Autowired private IRolePermissionService roleService; @Autowired private IPermissionService perService; - @Autowired - private IDictionaryService dictService; - + @RequestMapping(value = "role/map", method = RequestMethod.GET) public List> queryRoleMaps() { return roleService.queryRoleMaps(); } - + @RequestMapping(value = "per/list", method = RequestMethod.GET) - public List queryPermissionTree(HttpServletRequest request) throws CoreException{ + public List queryPermissionTree(HttpServletRequest request) throws CoreException { return perService.queryPermissionTree(false); } - + @RequestMapping(value = "my/action/per") public List queryMyActionPermissions(HttpServletRequest request) throws CoreException { String userName = LoginUtil.getUserId(request); String parentContent = LoginUtil.getParentContent(request); return perService.myPermissions(userName, parentContent); } - - @RequestMapping(value = "get/dict", method = RequestMethod.POST) - public Map> getDictionarys(@RequestBody String[] codes) { - return dictService.getDicts(codes); - } - + } diff --git a/java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java b/java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java index c5299d2..34dd808 100644 --- a/java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java +++ b/java/src/main/java/vip/xumy/admin/utils/BaseLogUtil.java @@ -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. diff --git a/java/src/main/java/vip/xumy/admin/verify/conf/BaseConfigurer.java b/java/src/main/java/vip/xumy/admin/verify/conf/BaseConfigurer.java new file mode 100644 index 0000000..0160208 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/conf/BaseConfigurer.java @@ -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 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> converters) { + Iterator> 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 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); + } + +} diff --git a/java/src/main/java/vip/xumy/admin/verify/conf/LoginInteceptor.java b/java/src/main/java/vip/xumy/admin/verify/conf/LoginInteceptor.java new file mode 100644 index 0000000..473ca0f --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/conf/LoginInteceptor.java @@ -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; + } + +} diff --git a/java/src/main/java/vip/xumy/admin/verify/conf/VerifyInitializer.java b/java/src/main/java/vip/xumy/admin/verify/conf/VerifyInitializer.java new file mode 100644 index 0000000..7cceef4 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/conf/VerifyInitializer.java @@ -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); + } + +} + + + + diff --git a/java/src/main/java/vip/xumy/admin/verify/controller/PublicController.java b/java/src/main/java/vip/xumy/admin/verify/controller/PublicController.java new file mode 100644 index 0000000..8c31bf0 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/controller/PublicController.java @@ -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; + } + +} diff --git a/java/src/main/java/vip/xumy/admin/verify/mapper/IUserMapper.java b/java/src/main/java/vip/xumy/admin/verify/mapper/IUserMapper.java new file mode 100644 index 0000000..cc14cec --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/mapper/IUserMapper.java @@ -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); + +} diff --git a/java/src/main/java/vip/xumy/admin/verify/pojo/User.java b/java/src/main/java/vip/xumy/admin/verify/pojo/User.java new file mode 100644 index 0000000..a9aeb58 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/pojo/User.java @@ -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; + +} diff --git a/java/src/main/java/vip/xumy/admin/verify/service/UserService.java b/java/src/main/java/vip/xumy/admin/verify/service/UserService.java new file mode 100644 index 0000000..55cb809 --- /dev/null +++ b/java/src/main/java/vip/xumy/admin/verify/service/UserService.java @@ -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); + } + +} diff --git a/java/src/main/resources/application.properties b/java/src/main/resources/application.properties index 5f7b862..4283f65 100644 --- a/java/src/main/resources/application.properties +++ b/java/src/main/resources/application.properties @@ -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 diff --git a/java/src/main/resources/mapper/sys/IActionLogMapper.xml b/java/src/main/resources/mapper/sys/IActionLogMapper.xml deleted file mode 100644 index 0c3d0c9..0000000 --- a/java/src/main/resources/mapper/sys/IActionLogMapper.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - id,type,module,user_id,login_ip,time,context - - - - - - - - - - - - - - - - INSERT INTO sys_action_log - () - VALUES ( - #{id}, - #{type}, - #{module}, - #{userId}, - #{loginIp}, - #{time}, - #{context} - ) - - - INSERT INTO BusinessLog - () - VALUES - - ( - #{log.id}, - #{log.type}, - #{log.module}, - #{log.userId}, - #{log.loginIp}, - #{log.time}, - #{log.context} - ) - - - - \ No newline at end of file diff --git a/java/src/main/resources/mapper/sys/IConfigMapper.xml b/java/src/main/resources/mapper/sys/IConfigMapper.xml deleted file mode 100644 index 0142ec4..0000000 --- a/java/src/main/resources/mapper/sys/IConfigMapper.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - cfg_key, - cfg_name, - cfg_value, - cfg_type, - cfg_desc, - cfg_status, - update_time, - update_user - - - - - - - - - - - - - - - - - - - - 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} - - - diff --git a/java/src/main/resources/mapper/sys/IDictionaryMapper.xml b/java/src/main/resources/mapper/sys/IDictionaryMapper.xml deleted file mode 100644 index 5b1da52..0000000 --- a/java/src/main/resources/mapper/sys/IDictionaryMapper.xml +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - type_code, - type_name, - type_desc, - type_status - - - - dict_id, - dict_code, - dict_name, - dict_desc, - dict_parent, - dict_status - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO sys_dictionary - () - VALUES - ( - #{id}, - #{code}, - #{name}, - #{desc}, - #{parent}, - #{status} - ) - - - - INSERT INTO sys_dict_type - () - VALUES - ( - #{code}, - #{name}, - #{desc}, - #{status} - ) - - - - UPDATE sys_dictionary SET - dict_code = #{code}, - dict_name = #{name}, - dict_desc = #{desc}, - dict_parent = #{parent}, - dict_status = #{status} - WHERE - dict_id = #{id} - - - - UPDATE sys_dict_type SET - type_name = #{name}, - type_desc = #{desc}, - type_status = #{status} - WHERE - type_code = #{code} - - - - DELETE FROM sys_dict_type WHERE type_code = #{code} - - - - DELETE FROM sys_dictionary WHERE dict_id = #{id} - - - - DELETE FROM sys_dictionary WHERE dict_parent = #{parent} - - - - - - - - - diff --git a/java/src/main/resources/mapper/sys/IUserItemMapper.xml b/java/src/main/resources/mapper/sys/IUserItemMapper.xml deleted file mode 100644 index bee381d..0000000 --- a/java/src/main/resources/mapper/sys/IUserItemMapper.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - id,user_id,item_name,item_desc,item_type,item_flag,add_user,add_time,status - - - - - - - - - - - - - - - - - - INSERT INTO sys_user_item - () - VALUES ( - #{id}, - #{userId}, - #{itemName}, - #{itemDesc}, - #{itemType}, - #{itemFlag}, - #{addUser}, - #{addTime}, - '0' - ) - - - - INSERT INTO sys_user_item - () - VALUES - - ( - #{item.id}, - #{item.userId}, - #{item.itemName}, - #{item.itemDesc}, - #{item.itemType}, - #{item.itemFlag}, - #{item.addUser}, - #{item.addTime}, - '0' - ) - - - - - UPDATE sys_user_item - SET - status = #{status} - WHERE - id = #{id} - - - \ No newline at end of file