From d8ddbf27288a45c15266958575ffe82cc2ccda9d Mon Sep 17 00:00:00 2001 From: zsvg <8680782@qq.com> Date: Sun, 19 Jun 2022 11:24:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=A7=E9=87=8F=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/module/de/supp/cate/DeSuppCate.java | 1 + .../module/de/supp/cate/DeSuppCateApi.java | 23 +- .../module/de/supp/cate/DeSuppCateRepo.java | 1 + .../de/supp/cate/DeSuppCateService.java | 5 +- .../app/module/de/supp/main/DeSuppAtt.java | 17 +- .../module/de/supp/main/DeSuppContact.java | 1 + .../app/module/de/supp/main/DeSuppMain.java | 76 +-- .../module/de/supp/main/DeSuppMainApi.java | 9 +- .../module/de/supp/main/DeSuppMainRepo.java | 1 + .../de/supp/main/DeSuppMainService.java | 1 + .../java/vboot/core/common/api/PageData.java | 1 + .../main/java/vboot/core/common/api/R.java | 1 + .../java/vboot/core/common/dao/BaseSqler.java | 5 +- .../java/vboot/core/common/dao/CacheDao.java | 3 +- .../java/vboot/core/common/dao/Dsqler.java | 1 + .../java/vboot/core/common/dao/Isqler.java | 1 + .../java/vboot/core/common/dao/JdbcDao.java | 2 +- .../java/vboot/core/common/dao/Sqler.java | 1 + .../java/vboot/core/common/dao/Usqler.java | 1 + .../core/common/entity/BaseCateEntity.java | 3 +- .../vboot/core/common/entity/BaseEntity.java | 2 +- .../core/common/entity/BaseMainEntity.java | 3 + .../java/vboot/core/common/init/AssInit.java | 5 +- .../core/common/init/DbInitListener.java | 10 +- .../vboot/core/common/init/SysApiCache.java | 22 - .../vboot/core/common/init/SysApiInit.java | 68 ++- .../vboot/core/common/init/SysOrgInit.java | 7 +- .../vboot/core/common/init/SysPortalInit.java | 14 +- .../java/vboot/core/common/pojo/Zconn.java | 5 +- .../java/vboot/core/common/pojo/ZidName.java | 2 +- .../java/vboot/core/common/pojo/Zinp.java | 1 + .../java/vboot/core/common/pojo/Ztree.java | 1 + .../core/common/service/BaseCateService.java | 1 + .../core/common/service/BaseMainService.java | 1 + .../core/common/service/BaseService.java | 1 + .../module/ass/coge/form/AssCogeForm.java | 2 - .../module/ass/coge/table/AssCogeTable.java | 2 - .../module/ass/dict/data/AssDictData.java | 2 - .../module/ass/dict/main/AssDictMain.java | 1 - .../module/sys/api/main/SysApiMainHand.java | 56 -- .../module/sys/portal/main/SysPortalMain.java | 2 - .../module/sys/portal/role/SysPortalRole.java | 2 - .../vboot/core/security/SecurityConfig.java | 4 +- .../vboot/core/security/authc/AuthcApi.java | 65 +-- .../security/authc/AuthcFailedHandler.java | 1 + .../core/security/authc/AuthcOrgHandler.java | 57 +++ .../security/authc/AuthcPortalHandler.java | 270 ++++++++++ .../core/security/authc/AuthcService.java | 482 +++--------------- .../core/security/authz/AuthzApiData.java | 24 + .../security/authz/AuthzDeniedHandler.java | 1 + .../core/security/authz/AuthzFilter.java | 1 + .../core/security/authz/AuthzHandler.java | 55 +- .../core/security/authz/JwtFilterAdapter.java | 5 +- .../vboot/core/security/authz/JwtHandler.java | 9 +- .../vboot/core/security/pojo/LoginVo.java | 1 + .../java/vboot/core/security/pojo/UserDo.java | 1 + .../{common/init => security/pojo}/Yapi.java | 8 +- .../{common/init => security/pojo}/Yurl.java | 3 +- .../java/vboot/core/security/pojo/Zmenu.java | 1 + .../java/vboot/core/security/pojo/Zmeta.java | 1 + .../vboot/core/security/pojo/Zportal.java | 1 + .../java/vboot/core/security/pojo/Zuser.java | 5 +- .../java/vboot/core/xutil/lang/XjsonUtil.java | 148 ++++-- .../extend/module/oa/doc/main/OaDocMain.java | 2 - .../module/oa/flow/main/OaFlowMain.java | 2 - .../module/oa/flow/temp/OaFlowTemp.java | 1 - .../extend/module/oa/test/one/OaTestOne.java | 2 - .../extend/module/oa/test/two/OaTestTwo.java | 3 - 68 files changed, 803 insertions(+), 714 deletions(-) delete mode 100644 vboot-core/src/main/java/vboot/core/common/init/SysApiCache.java delete mode 100644 vboot-core/src/main/java/vboot/core/module/sys/api/main/SysApiMainHand.java create mode 100644 vboot-core/src/main/java/vboot/core/security/authc/AuthcOrgHandler.java create mode 100644 vboot-core/src/main/java/vboot/core/security/authc/AuthcPortalHandler.java create mode 100644 vboot-core/src/main/java/vboot/core/security/authz/AuthzApiData.java rename vboot-core/src/main/java/vboot/core/{common/init => security/pojo}/Yapi.java (59%) rename vboot-core/src/main/java/vboot/core/{common/init => security/pojo}/Yurl.java (68%) diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCate.java b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCate.java index 5b11194..6b5369b 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCate.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCate.java @@ -6,6 +6,7 @@ import vboot.core.common.entity.BaseCateEntity; import javax.persistence.*; +//供应商分类 @Entity @Getter @Setter diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateApi.java b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateApi.java index 5ecd5e3..b539cc3 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateApi.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateApi.java @@ -5,10 +5,10 @@ import org.springframework.web.bind.annotation.*; import vboot.core.common.api.R; import vboot.core.common.dao.Sqler; import vboot.core.common.pojo.Ztree; -import vboot.core.module.mon.log.oper.Oplog; import java.util.List; +//供应商分类接口 @RestController @RequestMapping("de/supp/cate") public class DeSuppCateApi { @@ -17,19 +17,19 @@ public class DeSuppCateApi { //获取除自身及子节点外的分类 @GetMapping("treez") - public R getTreez(String name,String id) { - List list = service.tier2Choose(table,id,name); + public R getTreez(String name, String id) { + List list = service.tier2Choose(table, id, name); return R.ok(list); } - //获取所有分类 + //获取所有分类-用于分类选择下拉框 @GetMapping("treea") public R getTreea(String name) { - List list = service.findTreeList(table,name); + List list = service.findTreeList(table, name); return R.ok(list); } - // + //获取分类treeTable数据 @GetMapping("tree") public R getTree(String name) { Sqler sqler = new Sqler(table); @@ -41,6 +41,7 @@ public class DeSuppCateApi { return R.ok(list); } + //获取分类分页数据 @GetMapping public R get(String name) { Sqler sqler = new Sqler(table); @@ -49,19 +50,25 @@ public class DeSuppCateApi { return R.ok(service.findPageData(sqler)); } + //获取单个分类详细信息 @GetMapping("one/{id}") - public R getOne(@PathVariable String id) {return R.ok(service.findOne(id)); } + public R getOne(@PathVariable String id) { + return R.ok(service.findOne(id)); + } + //新增供应商分类 @PostMapping public R post(@RequestBody DeSuppCate main) { return R.ok(service.insert(main)); } + //更新供应商分类 @PutMapping public R put(@RequestBody DeSuppCate main) { - return R.ok(service.update(main,table)); + return R.ok(service.update(main, table)); } + //删除供应商分类 @DeleteMapping("{ids}") public R delete(@PathVariable String[] ids) { return R.ok(service.delete(ids)); diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateRepo.java b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateRepo.java index 2aa14e4..61b4b9b 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateRepo.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateRepo.java @@ -2,6 +2,7 @@ package vboot.app.module.de.supp.cate; import org.springframework.data.jpa.repository.JpaRepository; +//供应商分类JPA仓储 public interface DeSuppCateRepo extends JpaRepository { diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateService.java b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateService.java index 48309cf..7d02cf3 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateService.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/cate/DeSuppCateService.java @@ -9,11 +9,14 @@ import vboot.core.common.service.BaseCateService; import javax.annotation.PostConstruct; import java.util.List; +//供应商分类服务 @Service public class DeSuppCateService extends BaseCateService { + //获取分类treeTable数据 public List findTree(Sqler sqler) { - List list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(), new BeanPropertyRowMapper<>(DeSuppCate.class)); + List list = jdbcDao.getTp().query(sqler.getSql(), sqler.getParams(), + new BeanPropertyRowMapper<>(DeSuppCate.class)); return buildByRecursive(list); } diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppAtt.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppAtt.java index ea78197..1657667 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppAtt.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppAtt.java @@ -7,33 +7,34 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Transient; +//供应商附件---主记录OneToMany @Entity @Data public class DeSuppAtt { @Id @Column(length = 32) - private String id; + private String id;//主键 @Column(length = 32) - private String addre; + private String addre;//存储地址 @Column(length = 128) - private String pname; + private String pname;//文件前缀名 @Column(length = 128) - private String sname; + private String sname;//文件后缀名 @Column(length = 16) - private String zsize; + private String zsize;//文件大小 @Transient - private String zimg; + private String zimg;//图片缩略图 @Column(length = 256) - private String name; + private String name;//文件全名 @Column(length = 256) - private String link; + private String link;//文件链接地址 } diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppContact.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppContact.java index af7ebff..5e535ab 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppContact.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppContact.java @@ -6,6 +6,7 @@ import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; +//供应商联系人---主记录OneToMany @Data @Entity public class DeSuppContact { diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMain.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMain.java index 48fcfff..e030d06 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMain.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMain.java @@ -9,11 +9,53 @@ import javax.persistence.*; import java.util.ArrayList; import java.util.List; +//供应商主信息 @Entity @Getter @Setter public class DeSuppMain extends BaseMainEntity { + //关联分类表示例 + @Column(length = 32) + private String catid;//供应商分类 + + //流水号示例 + @Column(length = 32) + private String senum;//流水号 + + //数据字典示例 + @Column(length = 32) + private String level;//供应商资质 + + //ManyToOne示例 + @ManyToOne + @JoinColumn(name = "opman") + private SysOrg opman;//经办人 + + //ManyToMany示例 + @ManyToMany + @JoinTable(name = "de_supp_viewer", joinColumns = {@JoinColumn(name = "mid")}, + inverseJoinColumns = {@JoinColumn(name = "oid")}) + private List viewers;//可查看者 + + //ManyToMany示例 + @ManyToMany + @JoinTable(name = "de_supp_editor", joinColumns = {@JoinColumn(name = "mid")}, + inverseJoinColumns = {@JoinColumn(name = "oid")}) + private List editors;//可编辑者 + + //OneToMany示例 + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "maiid") + @OrderBy("ornum ASC") + private List contacts = new ArrayList<>();//联系人 + + //附件示例 + @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "maiid") + private List atts = new ArrayList<>();//附件 + + //地址选择示例,可根据实际情况存想要的字段 //--------地址相关信息------<<< private String addre;//完整地址 @@ -35,38 +77,4 @@ public class DeSuppMain extends BaseMainEntity { @Column(length = 32) private String addis;//区 //--------地址相关信息------>>> - - @Column(length = 32) - private String catid;//供应商分类 - - @Column(length = 32) - private String senum;//流水号 - - private String notes;//备注 - - @Column(length = 32) - private String level;//供应商资质 - - @ManyToOne - @JoinColumn(name = "opman") - private SysOrg opman;//经办人 - - @ManyToMany - @JoinTable(name = "de_supp_viewer", joinColumns = {@JoinColumn(name = "mid")}, - inverseJoinColumns = {@JoinColumn(name = "oid")}) - private List viewers;//可查看者 - - @ManyToMany - @JoinTable(name = "de_supp_editor", joinColumns = {@JoinColumn(name = "mid")}, - inverseJoinColumns = {@JoinColumn(name = "oid")}) - private List editors;//可编辑者 - - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "maiid") - @OrderBy("ornum ASC") - private List contacts = new ArrayList<>();//联系人 - - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "maiid") - private List atts = new ArrayList<>();//附件 } diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainApi.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainApi.java index 7335e11..3bab79d 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainApi.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainApi.java @@ -7,11 +7,12 @@ import org.springframework.web.bind.annotation.*; import vboot.core.module.ass.num.main.AssNumMainService; import vboot.core.module.mon.log.oper.Oplog; +//供应商主信息接口 @RestController @RequestMapping("de/supp/main") public class DeSuppMainApi { - @Oplog("查询供应商") + @Oplog("查询供应商分页数据") @GetMapping public R get(String name) { Sqler sqler = new Sqler("de_supp_main"); @@ -20,23 +21,27 @@ public class DeSuppMainApi { return R.ok(service.findPageData(sqler)); } + @Oplog("查询供应商单个详情") @GetMapping("one/{id}") public R getOne(@PathVariable String id) { DeSuppMain main = service.findOne(id); return R.ok(main); } + @Oplog("新增供应商") @PostMapping public R post(@RequestBody DeSuppMain main) { - main.setSenum(numService.getNum("SUPP")); + main.setSenum(numService.getNum("SUPP"));//设置供应商流水号 return R.ok(service.insert(main)); } + @Oplog("更新供应商") @PutMapping public R put(@RequestBody DeSuppMain main) { return R.ok(service.update(main)); } + @Oplog("删除供应商") @DeleteMapping("{ids}") public R delete(@PathVariable String[] ids) { return R.ok(service.delete(ids)); diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainRepo.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainRepo.java index 759b57a..154dc4f 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainRepo.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainRepo.java @@ -2,6 +2,7 @@ package vboot.app.module.de.supp.main; import org.springframework.data.jpa.repository.JpaRepository; +//供应商JPA仓储 public interface DeSuppMainRepo extends JpaRepository { diff --git a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainService.java b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainService.java index e09a420..fe63bdb 100644 --- a/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainService.java +++ b/vboot-application/src/main/java/vboot/app/module/de/supp/main/DeSuppMainService.java @@ -6,6 +6,7 @@ import vboot.core.common.service.BaseMainService; import javax.annotation.PostConstruct; +//供应商服务 @Service public class DeSuppMainService extends BaseMainService { diff --git a/vboot-core/src/main/java/vboot/core/common/api/PageData.java b/vboot-core/src/main/java/vboot/core/common/api/PageData.java index efbe942..80d3c89 100644 --- a/vboot-core/src/main/java/vboot/core/common/api/PageData.java +++ b/vboot-core/src/main/java/vboot/core/common/api/PageData.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; +//分页数据返回用VO @Data @AllArgsConstructor @NoArgsConstructor diff --git a/vboot-core/src/main/java/vboot/core/common/api/R.java b/vboot-core/src/main/java/vboot/core/common/api/R.java index 109d3a7..8b90cf9 100644 --- a/vboot-core/src/main/java/vboot/core/common/api/R.java +++ b/vboot-core/src/main/java/vboot/core/common/api/R.java @@ -3,6 +3,7 @@ package vboot.core.common.api; import java.util.ArrayList; import java.util.HashMap; +//Rest Result结果返回 public class R extends HashMap { private static final long serialVersionUID = 1L; diff --git a/vboot-core/src/main/java/vboot/core/common/dao/BaseSqler.java b/vboot-core/src/main/java/vboot/core/common/dao/BaseSqler.java index a13072a..7a1a394 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/BaseSqler.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/BaseSqler.java @@ -2,11 +2,12 @@ package vboot.core.common.dao; import java.sql.SQLException; -public abstract class BaseSqler { + +//增删改SqlHelper的基类 为多个增删改时提供方便的统一处理 +public abstract class BaseSqler { public abstract String getSql() throws SQLException; - public abstract Object[] getParams(); } diff --git a/vboot-core/src/main/java/vboot/core/common/dao/CacheDao.java b/vboot-core/src/main/java/vboot/core/common/dao/CacheDao.java index d2a1996..abe0be5 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/CacheDao.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/CacheDao.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.TimeUnit; +//缓存Dao @Component public class CacheDao { @@ -18,8 +19,6 @@ public class CacheDao { } - //============================String============================= - /** * 普通缓存获取 * diff --git a/vboot-core/src/main/java/vboot/core/common/dao/Dsqler.java b/vboot-core/src/main/java/vboot/core/common/dao/Dsqler.java index ace609d..21fa516 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/Dsqler.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/Dsqler.java @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +//删除用的SqlHelper 配合JdbcTemplate使用 public class Dsqler extends BaseSqler{ private String deleteClause = ""; private String whereClause = ""; diff --git a/vboot-core/src/main/java/vboot/core/common/dao/Isqler.java b/vboot-core/src/main/java/vboot/core/common/dao/Isqler.java index 734a6ba..fb6cd91 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/Isqler.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/Isqler.java @@ -3,6 +3,7 @@ package vboot.core.common.dao; import java.util.ArrayList; import java.util.List; +//插入用的SqlHelper 配合JdbcTemplate使用 public class Isqler extends BaseSqler { private String insertClause = ""; diff --git a/vboot-core/src/main/java/vboot/core/common/dao/JdbcDao.java b/vboot-core/src/main/java/vboot/core/common/dao/JdbcDao.java index 47c8626..35da5e9 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/JdbcDao.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/JdbcDao.java @@ -75,7 +75,7 @@ public class JdbcDao { ztree.setPid(rs.getString("pid")); return ztree; }); - return XjsonUtil.buildByRecursive(list); + return XjsonUtil.buildTreeByRecursive(list); } diff --git a/vboot-core/src/main/java/vboot/core/common/dao/Sqler.java b/vboot-core/src/main/java/vboot/core/common/dao/Sqler.java index 355bbc7..76c2c1f 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/Sqler.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/Sqler.java @@ -7,6 +7,7 @@ import vboot.core.security.pojo.Zuser; import java.util.ArrayList; import java.util.List; +//查询用的SqlHelper 配合JdbcTemplate使用 public class Sqler { private String fromClause = ""; diff --git a/vboot-core/src/main/java/vboot/core/common/dao/Usqler.java b/vboot-core/src/main/java/vboot/core/common/dao/Usqler.java index 8cb65de..1552ea9 100644 --- a/vboot-core/src/main/java/vboot/core/common/dao/Usqler.java +++ b/vboot-core/src/main/java/vboot/core/common/dao/Usqler.java @@ -4,6 +4,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +//更新用的SqlHelper 配合JdbcTemplate使用 public class Usqler extends BaseSqler { private String updateClause = ""; diff --git a/vboot-core/src/main/java/vboot/core/common/entity/BaseCateEntity.java b/vboot-core/src/main/java/vboot/core/common/entity/BaseCateEntity.java index 6c093aa..f3cbfe7 100644 --- a/vboot-core/src/main/java/vboot/core/common/entity/BaseCateEntity.java +++ b/vboot-core/src/main/java/vboot/core/common/entity/BaseCateEntity.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +//分类Entity基类,可实现无限多级的树结构 @MappedSuperclass @Getter @Setter @@ -30,7 +31,7 @@ public class BaseCateEntity { @Transient protected List children = new ArrayList<>(); //子元素 - //----------------------norm标准属性----------------------- + //----------------------通用属性----------------------- @Column(length = 100) protected String name;//名称 diff --git a/vboot-core/src/main/java/vboot/core/common/entity/BaseEntity.java b/vboot-core/src/main/java/vboot/core/common/entity/BaseEntity.java index a442058..f537862 100644 --- a/vboot-core/src/main/java/vboot/core/common/entity/BaseEntity.java +++ b/vboot-core/src/main/java/vboot/core/common/entity/BaseEntity.java @@ -7,12 +7,12 @@ import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.MappedSuperclass; +//简单Entity基类,仅提供id与name字段,如有租户需求,可加租户ID。 @MappedSuperclass @Getter @Setter public class BaseEntity { - @Id @Column(length = 32) protected String id; diff --git a/vboot-core/src/main/java/vboot/core/common/entity/BaseMainEntity.java b/vboot-core/src/main/java/vboot/core/common/entity/BaseMainEntity.java index 0ad2c53..63fdf3e 100644 --- a/vboot-core/src/main/java/vboot/core/common/entity/BaseMainEntity.java +++ b/vboot-core/src/main/java/vboot/core/common/entity/BaseMainEntity.java @@ -8,6 +8,7 @@ import lombok.Setter; import javax.persistence.*; import java.util.Date; +//主数据Entity基类,提供通用的字段 @MappedSuperclass @Getter @Setter @@ -50,4 +51,6 @@ public class BaseMainEntity { protected Date uptim;//更新时间 + protected String notes;//备注 + } diff --git a/vboot-core/src/main/java/vboot/core/common/init/AssInit.java b/vboot-core/src/main/java/vboot/core/common/init/AssInit.java index 3f97fc1..8bd49e1 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/AssInit.java +++ b/vboot-core/src/main/java/vboot/core/common/init/AssInit.java @@ -16,6 +16,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +//辅助数据初始化 @Component public class AssInit { @@ -24,10 +25,9 @@ public class AssInit { initDict(); } + //流水号初始化 private void initNum() { List numList = new ArrayList<>(); -// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); -// String cudat=dateFormat.format(new Date()); AssNumMain suppNum = new AssNumMain(); suppNum.setId("SUPP"); suppNum.setName("供应商流水号"); @@ -67,6 +67,7 @@ public class AssInit { } + //数据字典初始化 private void initDict() { List dictList = new ArrayList<>(); diff --git a/vboot-core/src/main/java/vboot/core/common/init/DbInitListener.java b/vboot-core/src/main/java/vboot/core/common/init/DbInitListener.java index b38078e..d1dfbd3 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/DbInitListener.java +++ b/vboot-core/src/main/java/vboot/core/common/init/DbInitListener.java @@ -8,22 +8,21 @@ import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.ContextRefreshedEvent; +//数据库初始化监听器 @Configuration @Slf4j public class DbInitListener implements ApplicationListener { - @Value("${app.init.type}") private String INIT_TYPE; - /** - * 首次数据库生成后,初始化组织架构,菜单,权限角色,接口等信息 - */ + + //首次数据库生成后,初始化组织架构,菜单,权限角色,接口等信息 @Override public void onApplicationEvent(ContextRefreshedEvent event) { try { if (!userDao.existsById("sa")) { System.out.println("首次启动系统,正在进行数据库初始化,请耐心等待。"); - if("demo".equals(INIT_TYPE)){ + if ("demo".equals(INIT_TYPE)) { sysOrgInit.initCorp(); System.out.println("1.1 初始化部门完毕"); sysOrgInit.initUser(); @@ -65,5 +64,4 @@ public class DbInitListener implements ApplicationListener GET1_APIS=new ArrayList<>(); - - public static List GET2_APIS=new ArrayList<>(); - - public static List POST_APIS=new ArrayList<>(); - - public static List PUT_APIS=new ArrayList<>(); - - public static List DELETE_APIS=new ArrayList<>(); - - public static List PATCH_APIS=new ArrayList<>(); - - public static int AUTHPOS=0; - -} diff --git a/vboot-core/src/main/java/vboot/core/common/init/SysApiInit.java b/vboot-core/src/main/java/vboot/core/common/init/SysApiInit.java index ad5dc91..592f227 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/SysApiInit.java +++ b/vboot-core/src/main/java/vboot/core/common/init/SysApiInit.java @@ -5,15 +5,25 @@ import org.springframework.web.bind.annotation.*; import vboot.core.common.dao.JdbcDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import vboot.core.security.authz.AuthzApiData; +import vboot.core.security.pojo.Yapi; +import vboot.core.security.pojo.Yurl; import java.lang.reflect.Method; import java.util.*; +/** + * API接口初始化,每次修改代码重启后,都会从代码搜集比对需要认证的请求URL,生成唯一的权限码存入数据库 + * 并将最新的需要认证的Url根据Method分类放到公共内存,用于用户每次请求时获取权限码做权限认证 + */ @Component public class SysApiInit { protected void initApi() { + //扫描Controller中的所有Mapping方法,得到需要认证的URL集合 List codeUrlList = getScanList(); + + //从数据库获取所有已存的URL集合 List dbUrlList = jdbcDao.findStringList("select id from sys_api_main"); //收集最大权限位及最大权限位的最大权限码 @@ -25,7 +35,8 @@ public class SysApiInit { pos = Integer.parseInt(String.valueOf(maxMap.get("pos"))); code = Long.parseLong(String.valueOf(maxMap.get("code"))); } - //比较两个list得到insertList + + //比较两个集合,计算得到需要插入数据库的insertList与需要更新数据库的updateList List insertList = new ArrayList(); List updateList = new ArrayList(); for (Yurl yurl : codeUrlList) { @@ -36,8 +47,7 @@ public class SysApiInit { break; } } - //插入 - if (!flag) { + if (!flag) {//插入 if (yurl.getType() == null) { Object[] objects = new Object[7]; objects[0] = yurl.getId(); @@ -83,42 +93,45 @@ public class SysApiInit { // objects[5] = 1; // } // } - //更新数据库 + + //批量插入与更新数据库 String initSql = "UPDATE sys_api_main SET avtag=0"; String updateSql = "UPDATE sys_api_main SET pid=?,type=?,avtag=1 WHERE id=?"; String insertSql = "INSERT INTO sys_api_main(id,pid,pos,code,url,type,crtim,avtag) VALUES(?,?,?,?,?,?,?,1)"; jdbcDao.update(initSql); jdbcDao.batch(updateSql, updateList); jdbcDao.batch(insertSql, insertList); - SysApiCache.AUTHPOS = pos; + AuthzApiData.AUTHPOS = pos; + //初始化所有用户权限 String updateUserSql = "update sys_org_user set retag=0"; jdbcDao.update(updateUserSql); - //将所有要求认证的权限放入application - String g1permSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id not like '%}:get'"; - SysApiCache.GET1_APIS = getPerms(g1permSql); - String g2permSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id like '%}:get'"; - SysApiCache.GET2_APIS = getPerms(g2permSql); + //将所有要求认证的Url分Method放入内存,用于每次请求时的权限校验 + String g1ApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id not like '%}:get'"; + AuthzApiData.GET1_APIS = findDbApis(g1ApiSql); - String postUrlSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='post'"; - SysApiCache.POST_APIS = getPerms(postUrlSql); + String g2ApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='get' and id like '%}:get'"; + AuthzApiData.GET2_APIS = findDbApis(g2ApiSql); - String putUrlSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='put'"; - SysApiCache.PUT_APIS = getPerms(putUrlSql); + String postApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='post'"; + AuthzApiData.POST_APIS = findDbApis(postApiSql); - String deleteUrlSql = "SELECT url,pos,code from sys_api_main where avtag= 1 and type='delete'"; - SysApiCache.DELETE_APIS = getPerms(deleteUrlSql); + String putApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='put'"; + AuthzApiData.PUT_APIS = findDbApis(putApiSql); - String patchUrlSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='patch'"; - SysApiCache.PATCH_APIS = getPerms(patchUrlSql); + String deleteApiSql = "SELECT url,pos,code from sys_api_main where avtag= 1 and type='delete'"; + AuthzApiData.DELETE_APIS = findDbApis(deleteApiSql); + + String patchApiSql = "SELECT url,pos,code from sys_api_main where avtag=1 and type='patch'"; + AuthzApiData.PATCH_APIS = findDbApis(patchApiSql); } + //扫描Controller中的所有Mapping方法,得到需要认证的URL集合 private List getScanList() { List list = new ArrayList<>(); Set> classes = ClassScanner.scanPackage("vboot"); - for (Class clazz : classes) { RequestMapping requestMapping = clazz.getAnnotation(RequestMapping.class); if (requestMapping != null) { @@ -131,7 +144,7 @@ public class SysApiInit { if (!classUrl.startsWith("/")) { classUrl = "/" + classUrl; } - if(topUrl.getId().contains("-")){ + if (topUrl.getId().contains("-")) { topUrl.setPid(topUrl.getId().split("-")[0]); } topUrl.setUrl(classUrl); @@ -156,6 +169,7 @@ public class SysApiInit { list.add(yurl); continue; } + PostMapping postMapping = method.getAnnotation(PostMapping.class); if (postMapping != null) { Yurl yurl = new Yurl(); @@ -174,6 +188,7 @@ public class SysApiInit { list.add(yurl); continue; } + PutMapping putMapping = method.getAnnotation(PutMapping.class); if (putMapping != null) { Yurl yurl = new Yurl(); @@ -192,6 +207,7 @@ public class SysApiInit { list.add(yurl); continue; } + DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class); if (deleteMapping != null) { Yurl yurl = new Yurl(); @@ -211,7 +227,7 @@ public class SysApiInit { list.add(yurl); continue; } -// + PatchMapping patchMapping = method.getAnnotation(PatchMapping.class); if (patchMapping != null) { Yurl yurl = new Yurl(); @@ -235,22 +251,24 @@ public class SysApiInit { } } } - Set rootSet = new HashSet<>(); + //设置请求URL的root根目录,方便后面API权限分配 + Set rootSet = new HashSet<>(); for (Yurl yurl : list) { - if(yurl.getType()==null&&yurl.getPid()!=null){ + if (yurl.getType() == null && yurl.getPid() != null) { rootSet.add(yurl.getPid()); } } for (String str : rootSet) { - Yurl yurl=new Yurl(); + Yurl yurl = new Yurl(); yurl.setId(str); list.add(yurl); } return list; } - private List getPerms(String sql) { + //获取数据库请求的通用方法 + private List findDbApis(String sql) { return jdbcDao.getTp().query(sql, (rs, rowNum) -> { Yapi yperm = new Yapi(); String url = rs.getString("url"); diff --git a/vboot-core/src/main/java/vboot/core/common/init/SysOrgInit.java b/vboot-core/src/main/java/vboot/core/common/init/SysOrgInit.java index 821b313..3db2030 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/SysOrgInit.java +++ b/vboot-core/src/main/java/vboot/core/common/init/SysOrgInit.java @@ -13,10 +13,10 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; +//组织架构初始化,可根据application.properties的app.init.type配置生成不同的基础数据 @Component public class SysOrgInit { - //公司及子公司初始化 protected void initCorp() throws Exception { List deptList = new ArrayList<>(); @@ -159,6 +159,7 @@ public class SysOrgInit { } + //用户初始化 protected void initUser() { List userList = new ArrayList<>(); initUser(userList,"刘", "liu", "LIU"); @@ -174,6 +175,7 @@ public class SysOrgInit { userService.insertAll(userList); } + //用户初始化具体实现 private void initUser(List userList,String name, String id, String pid) { SysOrgUser user0 = new SysOrgUser(); user0.setId(id+"lao"); @@ -212,7 +214,7 @@ public class SysOrgInit { } } - + //多层级部门与用户初始化 protected void initZsf() { SysOrgDept dept1 = new SysOrgDept(); @@ -249,6 +251,7 @@ public class SysOrgInit { userService.insert(user4); } + //管理员初始化,正式项目一般只初始化这个就够了,上面的都是演示数据 protected void initSa() { SysOrgUser user = new SysOrgUser(); user.setId("sa"); diff --git a/vboot-core/src/main/java/vboot/core/common/init/SysPortalInit.java b/vboot-core/src/main/java/vboot/core/common/init/SysPortalInit.java index bce255a..406a558 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/SysPortalInit.java +++ b/vboot-core/src/main/java/vboot/core/common/init/SysPortalInit.java @@ -7,10 +7,11 @@ import vboot.core.module.sys.portal.main.SysPortalMainService; import vboot.core.module.sys.portal.menu.SysPortalMenu; import vboot.core.module.sys.portal.menu.SysPortalMenuService; - +//系统门户与菜单初始化 @Component public class SysPortalInit { + //门户初始化 protected void initPortal() { SysPortalMain sysPortalMain=new SysPortalMain(); sysPortalMain.setId("sys"); @@ -25,6 +26,7 @@ public class SysPortalInit { mainService.save(sysPortalMain2); } + //管理员门户的菜单初始化 protected void initSysMenu() { SysPortalMenu home = new SysPortalMenu(); home.setId("Home"); @@ -40,6 +42,7 @@ public class SysPortalInit { home.setPorid("sys"); menuService.insert(home); + //-----------------系统管理-------------------- SysPortalMenu menu1 = new SysPortalMenu(); menu1.setId("Sys"); menu1.setName("系统管理"); @@ -134,7 +137,7 @@ public class SysPortalInit { menu112a.setType("M"); menu112a.setPorid("sys"); menuService.insert(menu112a); -// + SysPortalMenu menu113 = new SysPortalMenu(); menu113.setId("SysOrgPost"); menu113.setName("岗位管理"); @@ -679,7 +682,7 @@ public class SysPortalInit { menu371.setPorid("sys"); menuService.insert(menu371); - //-----------------OA办公-------------------- + //-----------------应用中心-------------------- SysPortalMenu menu4 = new SysPortalMenu(); menu4.setId("Oa"); menu4.setName("应用中心"); @@ -823,7 +826,7 @@ public class SysPortalInit { menu413b.setPorid("sys"); menuService.insert(menu413b); - //DEMO + //-----------------DEMO-------------------- SysPortalMenu menu8 = new SysPortalMenu(); menu8.setId("De"); menu8.setName("Demo"); @@ -889,6 +892,7 @@ public class SysPortalInit { } + //营销门户的菜单初始化 protected void initSaMenu() { SysPortalMenu home = new SysPortalMenu(); home.setId("Sa-Home"); @@ -934,8 +938,6 @@ public class SysPortalInit { menu11.setType("M"); menu11.setPorid("sa"); menuService.insert(menu11); - - } @Autowired diff --git a/vboot-core/src/main/java/vboot/core/common/pojo/Zconn.java b/vboot-core/src/main/java/vboot/core/common/pojo/Zconn.java index 154c684..3c61f77 100644 --- a/vboot-core/src/main/java/vboot/core/common/pojo/Zconn.java +++ b/vboot-core/src/main/java/vboot/core/common/pojo/Zconn.java @@ -1,11 +1,10 @@ package vboot.core.common.pojo; - - import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +//数据库连接Pojo @Data @AllArgsConstructor @NoArgsConstructor @@ -18,8 +17,6 @@ public class Zconn { private String passcode; - - public String getSid() { if(isMysql()) diff --git a/vboot-core/src/main/java/vboot/core/common/pojo/ZidName.java b/vboot-core/src/main/java/vboot/core/common/pojo/ZidName.java index db6754d..1619322 100644 --- a/vboot-core/src/main/java/vboot/core/common/pojo/ZidName.java +++ b/vboot-core/src/main/java/vboot/core/common/pojo/ZidName.java @@ -1,6 +1,6 @@ package vboot.core.common.pojo; - +//基础pojo,只有id与name属性 public class ZidName { private String id; diff --git a/vboot-core/src/main/java/vboot/core/common/pojo/Zinp.java b/vboot-core/src/main/java/vboot/core/common/pojo/Zinp.java index 9b78063..23d95a4 100644 --- a/vboot-core/src/main/java/vboot/core/common/pojo/Zinp.java +++ b/vboot-core/src/main/java/vboot/core/common/pojo/Zinp.java @@ -2,6 +2,7 @@ package vboot.core.common.pojo; import java.util.List; +//id,name,pid简单属性pojo,也可变化加入children组成树形pojo public class Zinp { private String id; private String name; diff --git a/vboot-core/src/main/java/vboot/core/common/pojo/Ztree.java b/vboot-core/src/main/java/vboot/core/common/pojo/Ztree.java index 6546d4e..ad68f87 100644 --- a/vboot-core/src/main/java/vboot/core/common/pojo/Ztree.java +++ b/vboot-core/src/main/java/vboot/core/common/pojo/Ztree.java @@ -7,6 +7,7 @@ import lombok.Data; import java.util.List; import java.util.Map; +//树形pojo @Data public class Ztree { private String id; diff --git a/vboot-core/src/main/java/vboot/core/common/service/BaseCateService.java b/vboot-core/src/main/java/vboot/core/common/service/BaseCateService.java index b83d59d..f4ee78d 100644 --- a/vboot-core/src/main/java/vboot/core/common/service/BaseCateService.java +++ b/vboot-core/src/main/java/vboot/core/common/service/BaseCateService.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +//分类Service基类,提供分类Entity增删改查的通用方法 @Transactional(rollbackFor = Exception.class) public abstract class BaseCateService { diff --git a/vboot-core/src/main/java/vboot/core/common/service/BaseMainService.java b/vboot-core/src/main/java/vboot/core/common/service/BaseMainService.java index 071fc24..3ae68aa 100644 --- a/vboot-core/src/main/java/vboot/core/common/service/BaseMainService.java +++ b/vboot-core/src/main/java/vboot/core/common/service/BaseMainService.java @@ -14,6 +14,7 @@ import java.util.Date; import java.util.List; import java.util.Map; +//主数据Service基类,提供主数据Entity增删改查的通用方法 @Transactional(rollbackFor = Exception.class) public abstract class BaseMainService { diff --git a/vboot-core/src/main/java/vboot/core/common/service/BaseService.java b/vboot-core/src/main/java/vboot/core/common/service/BaseService.java index 5ba44cf..3dcd99f 100644 --- a/vboot-core/src/main/java/vboot/core/common/service/BaseService.java +++ b/vboot-core/src/main/java/vboot/core/common/service/BaseService.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; +//简单表Service基类,提供简单Entity增删改查的通用方法 @Transactional(rollbackFor = Exception.class) public abstract class BaseService { diff --git a/vboot-core/src/main/java/vboot/core/module/ass/coge/form/AssCogeForm.java b/vboot-core/src/main/java/vboot/core/module/ass/coge/form/AssCogeForm.java index 38cde21..3873935 100644 --- a/vboot-core/src/main/java/vboot/core/module/ass/coge/form/AssCogeForm.java +++ b/vboot-core/src/main/java/vboot/core/module/ass/coge/form/AssCogeForm.java @@ -13,8 +13,6 @@ import java.util.List; @Setter public class AssCogeForm extends BaseMainEntity { - private String notes; - @Lob private String vform; } diff --git a/vboot-core/src/main/java/vboot/core/module/ass/coge/table/AssCogeTable.java b/vboot-core/src/main/java/vboot/core/module/ass/coge/table/AssCogeTable.java index fba4107..67f47ca 100644 --- a/vboot-core/src/main/java/vboot/core/module/ass/coge/table/AssCogeTable.java +++ b/vboot-core/src/main/java/vboot/core/module/ass/coge/table/AssCogeTable.java @@ -22,8 +22,6 @@ public class AssCogeTable extends BaseMainEntity { @Column(length = 64) private String remark;//表描述 - private String notes;//备注 - @Column(length = 64) private String mode;//生成模式 diff --git a/vboot-core/src/main/java/vboot/core/module/ass/dict/data/AssDictData.java b/vboot-core/src/main/java/vboot/core/module/ass/dict/data/AssDictData.java index af45b74..15589eb 100644 --- a/vboot-core/src/main/java/vboot/core/module/ass/dict/data/AssDictData.java +++ b/vboot-core/src/main/java/vboot/core/module/ass/dict/data/AssDictData.java @@ -13,8 +13,6 @@ import javax.persistence.Entity; @Setter public class AssDictData extends BaseMainEntity { - private String notes;//备注 - @Column(length = 32) private String code;//编码 diff --git a/vboot-core/src/main/java/vboot/core/module/ass/dict/main/AssDictMain.java b/vboot-core/src/main/java/vboot/core/module/ass/dict/main/AssDictMain.java index 1f81bb2..76a2a27 100644 --- a/vboot-core/src/main/java/vboot/core/module/ass/dict/main/AssDictMain.java +++ b/vboot-core/src/main/java/vboot/core/module/ass/dict/main/AssDictMain.java @@ -12,7 +12,6 @@ import javax.persistence.Entity; @Setter public class AssDictMain extends BaseMainEntity { - private String notes; private Integer ornum; diff --git a/vboot-core/src/main/java/vboot/core/module/sys/api/main/SysApiMainHand.java b/vboot-core/src/main/java/vboot/core/module/sys/api/main/SysApiMainHand.java deleted file mode 100644 index 276a398..0000000 --- a/vboot-core/src/main/java/vboot/core/module/sys/api/main/SysApiMainHand.java +++ /dev/null @@ -1,56 +0,0 @@ -package vboot.core.module.sys.api.main; - -import org.springframework.stereotype.Component; -import vboot.core.common.init.SysApiCache; -import vboot.core.security.pojo.Zuser; - -@Component -public class SysApiMainHand { - - public boolean hasPerm(Zuser zuser, String method,String url){ - if(zuser.isAdmin()){ - return true; - } - boolean flag=false; - if("GET".equals(method)){ - for (int i = 0; i < SysApiCache.GET1_APIS.size(); i++) { - if(SysApiCache.GET1_APIS.get(i).getUrl().equals(url)){ - flag = zuser.hasPerm(SysApiCache.GET1_APIS.get(i).getPos(), SysApiCache.GET1_APIS.get(i).getCode()); - break; - } - } - if(!flag){ - String frontUrl=url.substring(0,url.lastIndexOf("/")); - for (int i = 0; i < SysApiCache.GET2_APIS.size(); i++) { - if(SysApiCache.GET2_APIS.get(i).getUrl().equals(frontUrl)){ - flag = zuser.hasPerm(SysApiCache.GET2_APIS.get(i).getPos(), SysApiCache.GET2_APIS.get(i).getCode()); - break; - } - } - } - }else if("POST".equals(method)){ - for (int i = 0; i < SysApiCache.POST_APIS.size(); i++) { - if(SysApiCache.POST_APIS.get(i).getUrl().equals(url)){ - flag = zuser.hasPerm(SysApiCache.POST_APIS.get(i).getPos(), SysApiCache.POST_APIS.get(i).getCode()); - break; - } - } - }else if("PUT".equals(method)){ - for (int i = 0; i < SysApiCache.PUT_APIS.size(); i++) { - if(SysApiCache.PUT_APIS.get(i).getUrl().equals(url)){ - flag = zuser.hasPerm(SysApiCache.PUT_APIS.get(i).getPos(), SysApiCache.PUT_APIS.get(i).getCode()); - break; - } - } - }else if("DELETE".equals(method)){ - String frontUrl=url.substring(0,url.lastIndexOf("/")); - for (int i = 0; i < SysApiCache.DELETE_APIS.size(); i++) { - if(SysApiCache.DELETE_APIS.get(i).getUrl().equals(frontUrl)){ - flag = zuser.hasPerm(SysApiCache.DELETE_APIS.get(i).getPos(), SysApiCache.DELETE_APIS.get(i).getCode()); - break; - } - } - } - return flag; - } -} diff --git a/vboot-core/src/main/java/vboot/core/module/sys/portal/main/SysPortalMain.java b/vboot-core/src/main/java/vboot/core/module/sys/portal/main/SysPortalMain.java index db1c335..3ea4348 100644 --- a/vboot-core/src/main/java/vboot/core/module/sys/portal/main/SysPortalMain.java +++ b/vboot-core/src/main/java/vboot/core/module/sys/portal/main/SysPortalMain.java @@ -15,8 +15,6 @@ public class SysPortalMain extends BaseMainEntity { private Integer ornum; - private String notes; - @ManyToMany @JoinTable(name = "sys_portal_main_viewer", joinColumns = {@JoinColumn(name = "mid")}, inverseJoinColumns = {@JoinColumn(name = "oid")}) diff --git a/vboot-core/src/main/java/vboot/core/module/sys/portal/role/SysPortalRole.java b/vboot-core/src/main/java/vboot/core/module/sys/portal/role/SysPortalRole.java index 68b501b..19a8d4a 100644 --- a/vboot-core/src/main/java/vboot/core/module/sys/portal/role/SysPortalRole.java +++ b/vboot-core/src/main/java/vboot/core/module/sys/portal/role/SysPortalRole.java @@ -25,8 +25,6 @@ public class SysPortalRole extends BaseMainEntity @Column(length = 32) private String label; - private String notes; - //拥有的菜单 @ManyToMany @JoinTable(name = "sys_portal_role_menu", diff --git a/vboot-core/src/main/java/vboot/core/security/SecurityConfig.java b/vboot-core/src/main/java/vboot/core/security/SecurityConfig.java index febba54..30fd347 100644 --- a/vboot-core/src/main/java/vboot/core/security/SecurityConfig.java +++ b/vboot-core/src/main/java/vboot/core/security/SecurityConfig.java @@ -20,6 +20,7 @@ import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import java.util.Arrays; import java.util.Collections; +//Spring Security的配置 @Configuration @RequiredArgsConstructor public class SecurityConfig extends WebSecurityConfigurerAdapter { @@ -60,10 +61,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); + //可限制域名 // if (environment.acceptsProfiles(Profiles.of("dev"))) { // configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3100")); // } else { -// configuration.setAllowedOrigins(Collections.singletonList("https://uaa.imooc.com")); +// configuration.setAllowedOrigins(Collections.singletonList("http://zsvg.com")); // } // configuration.setAllowedOrigins(Collections.singletonList("http://localhost:3100")); configuration.setAllowedOrigins(Collections.singletonList("*")); diff --git a/vboot-core/src/main/java/vboot/core/security/authc/AuthcApi.java b/vboot-core/src/main/java/vboot/core/security/authc/AuthcApi.java index 8c4daf4..b0be7bc 100644 --- a/vboot-core/src/main/java/vboot/core/security/authc/AuthcApi.java +++ b/vboot-core/src/main/java/vboot/core/security/authc/AuthcApi.java @@ -28,36 +28,21 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; - +//认证API:主要包含登录登出、token刷新、菜单获取、用户信息获取 @RestController public class AuthcApi { + //登录 @PostMapping("/login") - public R login(@Valid @RequestBody LoginVo loginVo, HttpServletRequest request) throws IOException, ClassNotFoundException { -// System.out.println("开始登录"); + public R login(@Valid @RequestBody LoginVo loginVo, HttpServletRequest request) { //1.登录验证 UserDo userDo = null; - try { - userDo = jdbcDao.getTp().queryForObject("select id,name,pacod,retag from sys_org_user where usnam=? and avtag=1", - new Object[]{loginVo.getUsername()}, new BeanPropertyRowMapper<>(UserDo.class)); - } catch (DataAccessException ignored) { - - } - - boolean passFlag = false; - if (userDo != null) { - String encodePassword = DigestUtils.md5DigestAsHex(("abc" + loginVo.getPassword() + "xyz").getBytes());//数据库密码验证 - if (encodePassword.equals(userDo.getPacod())) { - passFlag = true; - } else { - //passFlag = ldapHandler.authenticate(loginVo.getUsername(), loginVo.getPassword());//AD域密码验证 - } - } + boolean passFlag = authcService.check(userDo, loginVo); if (!passFlag) { return R.build(402, "账号不存在或密码错误"); } - //2.初始化用户信息,获取菜单与权限 + //2.创建accessToken与refreshToken String atokenUUID = IdUtil.simpleUUID(); String atoken = jwtHandler.createTokenByUuid(atokenUUID); String rtoken = jwtHandler.createTokenByUuid(loginVo.getUsername());//需要加密下 @@ -66,18 +51,18 @@ public class AuthcApi { backMap.put("token", atoken); backMap.put("rtoken", rtoken); + //3.初始化用户信息,获取门户,菜单与按钮 Zuser zuser = new Zuser(userDo.getId(), userDo.getName(), loginVo.getUsername()); - authcService.initZuser(zuser, userDo, backMap);//初始化用户 + authcService.initZuser(zuser, userDo, backMap); //这个方法非常重要 + redisHandler.set("online-key:" + atokenUUID, zuser, appConfig.getJwt().getAtime());//默认8小时过期 - redisHandler.set("online-key:"+atokenUUID, zuser, appConfig.getJwt().getAtime());//默认8小时过期 - - //3.异步方式记录登录日志 - monLogLoginService.save("online-key:"+atokenUUID,zuser,request); + //4.异步方式记录登录日志 + monLogLoginService.save("online-key:" + atokenUUID, zuser, request); return R.ok(backMap); - } + //token刷新 @GetMapping("/rtoken") public R rtoken(@PathParam("token2") String token2) { System.out.println("token2=" + token2); @@ -92,40 +77,38 @@ public class AuthcApi { return R.ok(backMap); } + //登出 @GetMapping("/logout") public R logout(Authentication auth) { return R.ok(); } + //获取用户信息 @GetMapping("/getUserInfo") public R getUserInfo(Authentication auth, HttpServletRequest request) { Zuser zuser = (Zuser) auth.getPrincipal(); - //monLogLoginService.save(zuser,request); return R.ok(zuser); } + //获取菜单树 @GetMapping("/getMenuList") public R getMenuList(String porid, Authentication auth, HttpServletRequest request) { - if(auth==null){ - //System.out.println("登录过期"); - return R.build(401,"登录过期"); + if (auth == null) { + return R.build(401, "登录过期"); } Map backMap = new HashMap<>(); Zuser zuser = (Zuser) auth.getPrincipal(); - UserDo userDo = jdbcDao.getTp().queryForObject("select id,name,pacod,retag from sys_org_user where id=? and avtag=1", - new Object[]{zuser.getId()}, new BeanPropertyRowMapper<>(UserDo.class)); - if(XstrUtil.isBlank(porid)){ + UserDo userDo = jdbcDao.getTp().queryForObject("select id,name,pacod,retag from sys_org_user where id=? and avtag=1", + new Object[]{zuser.getId()}, new BeanPropertyRowMapper<>(UserDo.class)); + if (XstrUtil.isBlank(porid)) { authcService.initZuser(zuser, userDo, backMap); - }else{ - authcService.initZuser2(zuser, backMap,porid); + } else { + authcService.switchPortal(zuser, backMap, porid); } -// monLogLoginService.save(zuser,request); - return R.ok(backMap); } - @Autowired private AuthcService authcService; @@ -138,17 +121,11 @@ public class AuthcApi { @Autowired private JwtHandler jwtHandler; - @Autowired - private LdapHandler ldapHandler; - @Autowired private JdbcDao jdbcDao; @Autowired private MonLogLoginService monLogLoginService; - @Autowired - private SysOrgUserService userService; - } diff --git a/vboot-core/src/main/java/vboot/core/security/authc/AuthcFailedHandler.java b/vboot-core/src/main/java/vboot/core/security/authc/AuthcFailedHandler.java index c009057..fb706e9 100644 --- a/vboot-core/src/main/java/vboot/core/security/authc/AuthcFailedHandler.java +++ b/vboot-core/src/main/java/vboot/core/security/authc/AuthcFailedHandler.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +//认证失败后的处理 @Component public class AuthcFailedHandler implements AuthenticationEntryPoint { diff --git a/vboot-core/src/main/java/vboot/core/security/authc/AuthcOrgHandler.java b/vboot-core/src/main/java/vboot/core/security/authc/AuthcOrgHandler.java new file mode 100644 index 0000000..c64f62f --- /dev/null +++ b/vboot-core/src/main/java/vboot/core/security/authc/AuthcOrgHandler.java @@ -0,0 +1,57 @@ +package vboot.core.security.authc; + +import cn.hutool.core.util.StrUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import vboot.core.common.dao.JdbcDao; +import vboot.core.security.pojo.UserDo; + +import java.util.List; + +//服务于认证Service,提供组织架构相关逻辑处理 +@Component +public class AuthcOrgHandler { + + //获取组织架构可用集 + public String findConds(UserDo duser) { + StringBuilder conds = new StringBuilder(); + //1. conds拼接父级id + if (StrUtil.isNotBlank(duser.getTier())) { + String[] pidArr = duser.getTier().split("x"); + for (int i = pidArr.length - 1; i >= 0; i--) { + if (!"".equals(pidArr[i])) { + conds.append("'").append(pidArr[i]).append("',"); + } + } + } else { + conds = new StringBuilder("'" + duser.getId() + "',"); + } + //2. conds拼接岗位id + List postList = findPostList(duser.getId()); + for (String str : postList) { + conds.append("'").append(str).append("',"); + } + conds = new StringBuilder(conds.substring(0, conds.length() - 1));//优化 + //3. conds拼接群组id + List groupList = findGroupList(conds.toString()); + for (String str : groupList) { + conds.append(",'").append(str).append("'"); + } + return conds.toString(); + } + + //获取组织架构岗位id集合 + private List findPostList(String uid) { + String sql = "select pid as id from sys_org_post_org where oid=?"; + return jdbcDao.findStringList(sql, uid); + } + + //获取组织架构群组id集合 + private List findGroupList(String conds) { + String sql = "select DISTINCT gid as id from sys_org_group_org where oid in (" + conds + ")"; + return jdbcDao.findStringList(sql); + } + + @Autowired + private JdbcDao jdbcDao; +} diff --git a/vboot-core/src/main/java/vboot/core/security/authc/AuthcPortalHandler.java b/vboot-core/src/main/java/vboot/core/security/authc/AuthcPortalHandler.java new file mode 100644 index 0000000..9eae2d6 --- /dev/null +++ b/vboot-core/src/main/java/vboot/core/security/authc/AuthcPortalHandler.java @@ -0,0 +1,270 @@ +package vboot.core.security.authc; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.stereotype.Component; +import vboot.core.common.dao.JdbcDao; +import vboot.core.security.pojo.Zmenu; +import vboot.core.security.pojo.Zmeta; +import vboot.core.security.pojo.Zportal; + +import java.util.ArrayList; +import java.util.List; + +//服务于认证Service,提供门户及菜单相关逻辑处理 +@Component +public class AuthcPortalHandler { + + //获取门户集合 + public List findPortalList(String conds) { + String sql = "select distinct m.name,m.id from sys_portal_main m inner join sys_portal_role r on r.porid=m.id" + + " inner join sys_portal_role_org ro on ro.rid=r.id where m.avtag=1 and ro.oid in (" + conds + ") order by m.ornum"; + return jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Zportal.class)); + } + + //获取菜单集合 + public List findMenuList(String conds, List portalList, String porid) { + String portals = ""; + for (Zportal zportal : portalList) { + portals += "'" + zportal.getId() + "',"; + } + portals = portals.substring(0, portals.length() - 1); + + //1.获取目录集合 + String direSql = "select m.porid,m.shtag,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m where m.type = 'D' and m.porid in (" + portals + ") and m.avtag=1 order by m.ornum"; + List direList = jdbcDao.getTp().query(direSql, (rs, rowNum) -> { + Zmenu zmenu = new Zmenu(); + zmenu.setType("D"); + zmenu.setId(rs.getString("id")); + zmenu.setPorid(rs.getString("porid")); + zmenu.setPid(rs.getString("pid")); + zmenu.setPerm(rs.getString("perm")); + zmenu.setName(rs.getString("code")); + zmenu.setPath(rs.getString("path")); + zmenu.setComponent(rs.getString("comp")); + Zmeta zmeta = new Zmeta(); + zmeta.setTitle(rs.getString("name")); + zmeta.setOrderNo(rs.getInt("ornum")); + zmeta.setIsHide(!rs.getBoolean("shtag")); + if (!porid.equals(rs.getString("porid"))) { + zmeta.setIsHide(true); + } + zmeta.setIcon(rs.getString("icon")); + zmenu.setMeta(zmeta); + return zmenu; + }); + + //2.获取菜单集合 + String sql = "select distinct m.porid,m.shtag,m.type,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m inner join sys_portal_role_menu rm on rm.mid=m.id inner join sys_portal_role_org ru on ru.rid=rm.rid where m.type = 'M' and m.porid in (" + portals + ") and m.avtag=1 and ru.oid in (" + conds + ") order by m.ornum"; + List list = jdbcDao.getTp().query(sql, (rs, rowNum) -> { + Zmenu zmenu = new Zmenu(); + zmenu.setId(rs.getString("id")); + zmenu.setType("M"); + zmenu.setPorid(rs.getString("porid")); + zmenu.setPid(rs.getString("pid")); + zmenu.setPerm(rs.getString("perm")); + zmenu.setName(rs.getString("code")); + zmenu.setPath(rs.getString("path")); + zmenu.setComponent(rs.getString("comp")); + Zmeta zmeta = new Zmeta(); + zmeta.setTitle(rs.getString("name")); + zmeta.setIsHide(!rs.getBoolean("shtag")); + if (!porid.equals(rs.getString("porid"))) { + zmeta.setIsHide(true); + } + zmeta.setOrderNo(rs.getInt("ornum")); + zmeta.setIcon(rs.getString("icon")); + zmenu.setMeta(zmeta); + return zmenu; + }); + + //3.将菜单装载到目录 + List shouldAddlist1 = new ArrayList<>(); + for (Zmenu zdire : direList) { + for (Zmenu zmenu : list) { + if (zdire.getId().equals(zmenu.getPid())) { + shouldAddlist1.add(zdire); + break; + } + } + } + + List shouldAddlist2 = new ArrayList<>(); + for (Zmenu zdire : direList) { + for (Zmenu zshould : shouldAddlist1) { + if (zshould.getPid() != null) { + if (zdire.getId().equals(zshould.getPid())) { + shouldAddlist2.add(zdire); + break; + } + } + } + } + + List shouldAddlist3 = new ArrayList<>(); + for (Zmenu zdire : direList) { + for (Zmenu zshould : shouldAddlist2) { + if (zshould.getPid() != null) { + if (zdire.getId().equals(zshould.getPid())) { + shouldAddlist3.add(zdire); + break; + } + } + } + } + list.addAll(shouldAddlist1); + list.addAll(shouldAddlist2); + list.addAll(shouldAddlist3); + if (list.size() == 0) { + return findNoPowerMenuList(); + } + if (portalList.size() == 1) { + return list; + } + + //4.如果存在多个门户,则要进一步处理。 + //去除其他门户相同name或path的菜单 + List backList = new ArrayList<>(); + for (Zmenu zmenu : list) { + if (porid.equals(zmenu.getPorid())) { + backList.add(zmenu); + } + } + for (Zmenu zmenu : list) { + if (!porid.equals(zmenu.getPorid())) { + boolean flag = false; + for (Zmenu backMenu : backList) { + if (backMenu.getName().equals(zmenu.getName()) || backMenu.getPath().equals(zmenu.getPath())) { + flag = true; + break; + } + } + if (!flag) { + backList.add(zmenu); + } + } + } + return backList; + } + + //获取所有门户列表,管理员用 + public List findAllPortalList() { + String sql = "select id,name from sys_portal_main where avtag=1 order by ornum"; + return jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Zportal.class)); + } + + //获取管理员门户的菜单,管理员用 + public List findSysMenuList(String porid) { + String sql = "select m.porid,m.shtag,m.type,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m where m.avtag=1 order by m.ornum"; + List list = jdbcDao.getTp().query(sql, (rs, rowNum) -> { + Zmenu zmenu = new Zmenu(); + zmenu.setId(rs.getString("id")); + zmenu.setPorid(rs.getString("porid")); + zmenu.setPid(rs.getString("pid")); + zmenu.setPerm(rs.getString("perm")); + zmenu.setType(rs.getString("type")); + zmenu.setName(rs.getString("code")); + zmenu.setPath(rs.getString("path")); + zmenu.setComponent(rs.getString("comp")); + Zmeta zmeta = new Zmeta(); + zmeta.setIsHide(!rs.getBoolean("shtag")); + if (!porid.equals(rs.getString("porid"))) { + zmeta.setIsHide(true); + } + zmeta.setTitle(rs.getString("name")); + zmeta.setOrderNo(rs.getInt("ornum")); + zmeta.setIcon(rs.getString("icon")); + zmenu.setMeta(zmeta); + return zmenu; + }); + //去除其他门户相同name或path的菜单 + List backList = new ArrayList<>(); + for (Zmenu zmenu : list) { + if (porid.equals(zmenu.getPorid())) { + backList.add(zmenu); + } + } + for (Zmenu zmenu : list) { + if (!porid.equals(zmenu.getPorid())) { + boolean flag = false; + for (Zmenu backMenu : backList) { + if (backMenu.getName().equals(zmenu.getName()) || backMenu.getPath().equals(zmenu.getPath())) { + flag = true; + break; + } + } + if (!flag) { + backList.add(zmenu); + } + } + } + return backList; + } + + //如果用户没有菜单授权,则返回一个未授权的菜单 + public List findNoPowerMenuList() { + List list = new ArrayList<>(); + Zmenu zmenu = new Zmenu(); + zmenu.setType("M"); + zmenu.setId("Home"); + zmenu.setName("Home"); + zmenu.setPath("/home"); + zmenu.setComponent("/home/noPower"); + Zmeta zmeta = new Zmeta(); + zmeta.setTitle("未授权"); + zmeta.setOrderNo(0); + zmeta.setIsHide(false); + zmeta.setIcon("ele-Lock"); + zmenu.setMeta(zmeta); + list.add(zmenu); + return list; + } + + //使用递归方法建树 + public List buildByRecursive(List nodes) + { + List list = new ArrayList<>(); + for (Zmenu node : nodes) { + if (node.getPid() == null) + { + list.add(findChildrenByTier(node, nodes)); + } + else + { + boolean flag = false; + for (Zmenu node2 : nodes) { + if (node.getPid().equals(node2.getId())) + { + flag = true; + break; + } + } + if (!flag) + { + list.add(findChildrenByTier(node, nodes)); + } + } + } + return list; + } + + //递归查找子节点 + private Zmenu findChildrenByTier(Zmenu node, List nodes) + { + for (Zmenu item : nodes) { + if (node.getId().equals(item.getPid())) + { + if (node.getChildren() == null) + { + node.setChildren(new ArrayList<>()); + } + node.getChildren().add(findChildrenByTier(item, nodes)); + } + } + return node; + } + + @Autowired + private JdbcDao jdbcDao; + +} diff --git a/vboot-core/src/main/java/vboot/core/security/authc/AuthcService.java b/vboot-core/src/main/java/vboot/core/security/authc/AuthcService.java index d8bbe75..f990ce3 100644 --- a/vboot-core/src/main/java/vboot/core/security/authc/AuthcService.java +++ b/vboot-core/src/main/java/vboot/core/security/authc/AuthcService.java @@ -1,11 +1,12 @@ package vboot.core.security.authc; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.util.DigestUtils; import vboot.core.common.dao.JdbcDao; -import vboot.core.common.init.SysApiCache; -import vboot.core.common.init.Yapi; +import vboot.core.security.authz.AuthzApiData; +import vboot.core.security.pojo.Yapi; import vboot.core.security.pojo.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,47 +16,75 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +//认证Service @Service @Transactional(rollbackFor = Exception.class) public class AuthcService { + //校验密码是否正确 + public boolean check(UserDo userDo,LoginVo loginVo){ + try { + userDo = jdbcDao.getTp().queryForObject( + "select id,name,pacod,retag from sys_org_user where usnam=? and avtag=1", + new Object[]{loginVo.getUsername()}, new BeanPropertyRowMapper<>(UserDo.class)); + } catch (DataAccessException ignored) { + + } + + boolean passFlag = false; + if (userDo != null) { + //前台传入的登录密码做加盐MD5加密 + String encodePassword = DigestUtils.md5DigestAsHex(("abc" + loginVo.getPassword() + "xyz").getBytes()); + //比较数据里的加盐密码是否相同 + if (encodePassword.equals(userDo.getPacod())) { + passFlag = true; + } else { + //如数据库校验不通过,可尝试其他方式校验,比如下面的AD域密码验证校验 + //passFlag = ldapHandler.authenticate(loginVo.getUsername(), loginVo.getPassword()); + } + } + return passFlag; + } + + //初始化用户 + //查询用户组织架构可用集,门户列表,菜单树,API权限集 + //查询完后做缓存,下次查询直接通过缓存查询 public void initZuser(Zuser zuser, UserDo userDo, Map backMap) { - if (!userDo.getRetag()) { + //判断是否已经初始化过了,如已初始化,则可走缓存路线 + if (!userDo.getRetag()) {//数据库按步骤路线 //1.获取用户所有的组织架构集:conds - String conds = findConds(userDo); + String conds = orgHandler.findConds(userDo); zuser.setConds(conds); //2.根据组织架构集conds查询前台菜单集:menus List menuList; List portalList; if (zuser.isAdmin()) { - portalList = findAllPortalList(); - menuList = findSysMenuList(portalList.get(0).getId()); + portalList = portalHandler.findAllPortalList(); + menuList = portalHandler.findSysMenuList(portalList.get(0).getId()); } else { - portalList = findPortalList(zuser.getConds()); + portalList = portalHandler.findPortalList(zuser.getConds()); if (portalList != null && portalList.size() > 0) { - menuList = findMenuList(zuser.getConds(), portalList, portalList.get(0).getId()); + menuList = portalHandler.findMenuList(zuser.getConds(), portalList, portalList.get(0).getId()); } else { - menuList = findNoPowerMenuList(); + menuList = portalHandler.findNoPowerMenuList(); } } //3.根据组织架构集conds查询前台按钮集:btns - // 设置zuser的权限集(位与代码方式的权限集) - List btnList = findBtnList(zuser); + List btnList = findBtnList(zuser);//附加功能:设置zuser的权限集 //4.设置前台返回数据 - menuList = buildByRecursive(menuList); + menuList = portalHandler.buildByRecursive(menuList); backMap.put("portals", portalList); backMap.put("menus", menuList); backMap.put("btns", btnList); backMap.put("zuser", zuser); - //5.更新用户,序列化保存数据,使下次这些数据可直接从数据库取 - updateUser(zuser, menuList, btnList, portalList); - System.out.println("通过数据库"); - - } else { + //5.更新用户,序列化保存数据,使下次这些数据可直接从缓存表读取 + updateUser(zuser, portalList, menuList, btnList); + //System.out.println("通过数据库"); + } else {//缓存路线,可扩展成redis方式 String sql = "select conds,menus,btns,perms,portals from sys_org_user_cache where id=?"; Map map = jdbcDao.findMap(sql, zuser.getId()); zuser.setConds((String) map.get("conds")); @@ -84,400 +113,54 @@ public class AuthcService { backMap.put("portals", portalList); backMap.put("btns", btnArr); backMap.put("zuser", zuser); - System.out.println("通过缓存"); + //System.out.println("通过缓存"); } - -// //初始化数据库user -// String perms = ""; -// for (int i = 0; i < permSum.length; i++) { -// perms += permSum[i] + ";"; -// } -// if (!perms.equals("")) { -// perms = perms.substring(0, perms.length() - 1); -// } else { -// perms = "0"; -// } -// updatePerson(perms, conds, id); -// zuser = new Zuser(id, "" + orgInfo.get("name"), sysOrgUser.getUsnam(), permSum, conds); -// zuser.setAdmin(XuserUtil.isAdmin(sysOrgUser.getUsnam())); -// zuser.setWatag(sysOrgUser.getWatag()); -// } else { -// String[] permArr = sysOrgUser.getPerms().split(";"); -// long[] permSum = new long[permArr.length]; -// for (int i = 0; i < permArr.length; i++) { -// permSum[i] = Long.parseLong(permArr[i]); -// } -// zuser = new Zuser(id, "" + orgInfo.get("name"), "" + sysOrgUser.getUsnam(), permSum, sysOrgUser.getConds()); -// zuser.setAdmin(XuserUtil.isAdmin(sysOrgUser.getUsnam())); -// zuser.setWatag(sysOrgUser.getWatag()); -// } -// return zuser; - - } - public void initZuser2(Zuser zuser, Map backMap, String porid) { - //2.根据组织架构集conds查询前台菜单集:menus + //切换门户,根据门户id,设置菜单 + public void switchPortal(Zuser zuser, Map backMap, String porid) { + //1.根据组织架构集conds查询前台菜单集:menus List menuList; List portalList; if (zuser.isAdmin()) { - portalList = findAllPortalList(); - menuList = findSysMenuList(porid); + portalList = portalHandler.findAllPortalList(); + menuList = portalHandler.findSysMenuList(porid); } else { - portalList = findPortalList(zuser.getConds()); + portalList = portalHandler.findPortalList(zuser.getConds()); if (portalList != null && portalList.size() > 0) { - menuList = findMenuList(zuser.getConds(), portalList, porid); + menuList = portalHandler.findMenuList(zuser.getConds(), portalList, porid); } else { - menuList = findNoPowerMenuList(); + menuList = portalHandler.findNoPowerMenuList(); } } - //4.设置前台返回数据 - menuList = buildByRecursive(menuList); + //2.设置前台返回数据 + menuList = portalHandler.buildByRecursive(menuList); backMap.put("portals", portalList); backMap.put("menus", menuList); } -// private void calcPerms(Zuser zuser,){ -// //查询权限集合 -// Integer posSum = SysPermApiService.AUTHPOS + 1;//取出最大权限位 -// long[] permSum = new long[posSum]; -//// -// List zpermList = getPermList(conds); -// for (Zperm zperm : zpermList) { -// for (int i = 0; i < posSum; i++) { -// if (i == zperm.getPos()) { -// permSum[i] = permSum[i] + zperm.getCode(); -// } -// } -// } -// } - - private void setPerms(Zuser zuser, List zmenus) { - + //获取用户信息 + @Transactional(readOnly = true) + public Zuser getUser(String username) { + Map map = jdbcDao.getTp().queryForMap("select u.id,u.name from sys_org_user u where u.usnam=? and u.avtag=1", username); + Zuser user = new Zuser(); + user.setId((String) map.get("id")); + user.setName((String) map.get("name")); + return user; } - private String findConds(UserDo duser) { - StringBuilder conds = new StringBuilder(); - //1. conds拼接父级id - if (StrUtil.isNotBlank(duser.getTier())) { - String[] pidArr = duser.getTier().split("x"); - for (int i = pidArr.length - 1; i >= 0; i--) { - if (!"".equals(pidArr[i])) { - conds.append("'").append(pidArr[i]).append("',"); - } - } - } else { - conds = new StringBuilder("'" + duser.getId() + "',"); - } - //2. conds拼接岗位id - List postList = findPostList(duser.getId()); - for (String str : postList) { - conds.append("'").append(str).append("',"); - } - conds = new StringBuilder(conds.substring(0, conds.length() - 1));//优化 - //3. conds拼接群组id - List groupList = findGroupList(conds.toString()); - for (String str : groupList) { - conds.append(",'").append(str).append("'"); - } - return conds.toString(); - } + //获取前台按钮集合,设置用户API权限集 + private List findBtnList(Zuser zuser) { + List btnList = new ArrayList<>(); - - private List findPostList(String uid) { - String sql = "select pid as id from sys_org_post_org where oid=?"; - return jdbcDao.findStringList(sql, uid); - } - - private List findGroupList(String conds) { - String sql = "select DISTINCT gid as id from sys_org_group_org where oid in (" + conds + ")"; - return jdbcDao.findStringList(sql); - } - - public List findPortalList(String conds) { - String sql = "select distinct m.name,m.id from sys_portal_main m inner join sys_portal_role r on r.porid=m.id" + - " inner join sys_portal_role_org ro on ro.rid=r.id where m.avtag=1 and ro.oid in (" + conds + ") order by m.ornum"; - return jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Zportal.class)); - } - - public List findMenuList(String conds, List portalList, String porid) { - String portals = ""; - for (Zportal zportal : portalList) { - portals += "'" + zportal.getId() + "',"; - } - portals = portals.substring(0, portals.length() - 1); - - String direSql = "select m.porid,m.shtag,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m where m.type = 'D' and m.porid in (" + portals + ") and m.avtag=1 order by m.ornum"; - List direList = jdbcDao.getTp().query(direSql, (rs, rowNum) -> { - Zmenu zmenu = new Zmenu(); - zmenu.setType("D"); - zmenu.setId(rs.getString("id")); - zmenu.setPorid(rs.getString("porid")); - zmenu.setPid(rs.getString("pid")); - zmenu.setPerm(rs.getString("perm")); - zmenu.setName(rs.getString("code")); - zmenu.setPath(rs.getString("path")); - zmenu.setComponent(rs.getString("comp")); - Zmeta zmeta = new Zmeta(); - zmeta.setTitle(rs.getString("name")); - zmeta.setOrderNo(rs.getInt("ornum")); - zmeta.setIsHide(!rs.getBoolean("shtag")); - if (!porid.equals(rs.getString("porid"))) { - zmeta.setIsHide(true); - } - zmeta.setIcon(rs.getString("icon")); - zmenu.setMeta(zmeta); - return zmenu; - }); - - String sql = "select distinct m.porid,m.shtag,m.type,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m inner join sys_portal_role_menu rm on rm.mid=m.id inner join sys_portal_role_org ru on ru.rid=rm.rid where m.type = 'M' and m.porid in (" + portals + ") and m.avtag=1 and ru.oid in (" + conds + ") order by m.ornum"; - - List list = jdbcDao.getTp().query(sql, (rs, rowNum) -> { - Zmenu zmenu = new Zmenu(); - zmenu.setId(rs.getString("id")); - zmenu.setType("M"); - zmenu.setPorid(rs.getString("porid")); - zmenu.setPid(rs.getString("pid")); - zmenu.setPerm(rs.getString("perm")); - zmenu.setName(rs.getString("code")); - zmenu.setPath(rs.getString("path")); - zmenu.setComponent(rs.getString("comp")); - Zmeta zmeta = new Zmeta(); - zmeta.setTitle(rs.getString("name")); - zmeta.setIsHide(!rs.getBoolean("shtag")); - if (!porid.equals(rs.getString("porid"))) { - zmeta.setIsHide(true); - } - zmeta.setOrderNo(rs.getInt("ornum")); - zmeta.setIcon(rs.getString("icon")); - zmenu.setMeta(zmeta); - return zmenu; - }); - - List shouldAddlist1 = new ArrayList<>(); - for (Zmenu zdire : direList) { - for (Zmenu zmenu : list) { - if (zdire.getId().equals(zmenu.getPid())) { - shouldAddlist1.add(zdire); - break; - } - } - } - - List shouldAddlist2 = new ArrayList<>(); - for (Zmenu zdire : direList) { - for (Zmenu zshould : shouldAddlist1) { - if (zshould.getPid() != null) { - if (zdire.getId().equals(zshould.getPid())) { - shouldAddlist2.add(zdire); - break; - } - } - } - } - - List shouldAddlist3 = new ArrayList<>(); - for (Zmenu zdire : direList) { - for (Zmenu zshould : shouldAddlist2) { - if (zshould.getPid() != null) { - if (zdire.getId().equals(zshould.getPid())) { - shouldAddlist3.add(zdire); - break; - } - } - } - } - list.addAll(shouldAddlist1); - list.addAll(shouldAddlist2); - list.addAll(shouldAddlist3); - if (list.size() == 0) { - return findNoPowerMenuList(); - } - if (portalList.size() == 1) { - return list; - } - //去除其他门户相同name或path的菜单 - List backList = new ArrayList<>(); - for (Zmenu zmenu : list) { - if (porid.equals(zmenu.getPorid())) { - backList.add(zmenu); - } - } - for (Zmenu zmenu : list) { - if (!porid.equals(zmenu.getPorid())) { - boolean flag = false; - for (Zmenu backMenu : backList) { - if (backMenu.getName().equals(zmenu.getName()) || backMenu.getPath().equals(zmenu.getPath())) { - flag = true; - break; - } - } - if (!flag) { - backList.add(zmenu); - } - } - } - return backList; - } - - public List findAllPortalList() { - String sql = "select id,name from sys_portal_main where avtag=1 order by ornum"; - return jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Zportal.class)); - } - - - public List findSysMenuList(String porid) { -// String sql = "select m.shtag,m.type,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m where m.porid='sys' and m.avtag=1 order by m.ornum"; - String sql = "select m.porid,m.shtag,m.type,m.name,m.code,m.path,m.icon,m.comp,m.ornum,m.id,m.pid,m.perm from sys_portal_menu m where m.avtag=1 order by m.ornum"; - List list = jdbcDao.getTp().query(sql, (rs, rowNum) -> { - Zmenu zmenu = new Zmenu(); - zmenu.setId(rs.getString("id")); - zmenu.setPorid(rs.getString("porid")); - zmenu.setPid(rs.getString("pid")); - zmenu.setPerm(rs.getString("perm")); - zmenu.setType(rs.getString("type")); - zmenu.setName(rs.getString("code")); - zmenu.setPath(rs.getString("path")); - zmenu.setComponent(rs.getString("comp")); - Zmeta zmeta = new Zmeta(); - zmeta.setIsHide(!rs.getBoolean("shtag")); - if (!porid.equals(rs.getString("porid"))) { - zmeta.setIsHide(true); - } - zmeta.setTitle(rs.getString("name")); - zmeta.setOrderNo(rs.getInt("ornum")); - zmeta.setIcon(rs.getString("icon")); - zmenu.setMeta(zmeta); - return zmenu; - }); - //去除其他门户相同name或path的菜单 - List backList = new ArrayList<>(); - for (Zmenu zmenu : list) { - if (porid.equals(zmenu.getPorid())) { - backList.add(zmenu); - } - } - for (Zmenu zmenu : list) { - if (!porid.equals(zmenu.getPorid())) { - boolean flag = false; - for (Zmenu backMenu : backList) { - if (backMenu.getName().equals(zmenu.getName()) || backMenu.getPath().equals(zmenu.getPath())) { - flag = true; - break; - } - } - if (!flag) { - backList.add(zmenu); - } - } - } - return backList; - } - - public List findNoPowerMenuList() { - List list = new ArrayList<>(); - Zmenu zmenu = new Zmenu(); - zmenu.setType("M"); - zmenu.setId("Home"); - zmenu.setName("Home"); - zmenu.setPath("/home"); - zmenu.setComponent("/home/noPower"); - Zmeta zmeta = new Zmeta(); - zmeta.setTitle("未授权"); - zmeta.setOrderNo(0); - zmeta.setIsHide(false); - zmeta.setIcon("ele-Lock"); - zmenu.setMeta(zmeta); - list.add(zmenu); - return list; - } - - -// //使用递归方法建树 -// private List buildTree(List treeNodes) { -// List trees = new ArrayList<>(); -// for (Zmenu treeNode : treeNodes) { -// if (treeNode.getPid() == null) { -// trees.add(recTree(treeNode, treeNodes)); -// } -// } -// return trees; -// } -// -// -// //递归查找子节点 -// private Zmenu recTree(Zmenu treeNode, List treeNodes) { -// for (Zmenu it : treeNodes) { -// if (treeNode.getId().equals(it.getPid())) { -// if (treeNode.getChildren() == null) { -// treeNode.setChildren(new ArrayList<>()); -// } -// treeNode.getChildren().add(recTree(it, treeNodes)); -// } -// } -// return treeNode; -// } - - - //使用递归方法建树 - private List buildByRecursive(List nodes) - { - List list = new ArrayList<>(); - for (Zmenu node : nodes) { - if (node.getPid() == null) - { - list.add(findChildrenByTier(node, nodes)); - } - else - { - boolean flag = false; - for (Zmenu node2 : nodes) { - if (node.getPid().equals(node2.getId())) - { - flag = true; - break; - } - } - if (!flag) - { - list.add(findChildrenByTier(node, nodes)); - } - } - } - return list; - } - - //递归查找子节点 - private Zmenu findChildrenByTier(Zmenu node, List nodes) - { - for (Zmenu item : nodes) { - if (node.getId().equals(item.getPid())) - { - if (node.getChildren() == null) - { - node.setChildren(new ArrayList<>()); - } - node.getChildren().add(findChildrenByTier(item, nodes)); - } - } - return node; - } - - - private List findYapiList(String conds) { String sql = "select distinct m.id url,m.pos,m.code from sys_api_main m " + "inner join sys_api_role_api rm on rm.mid=m.id " + "inner join sys_api_role_org ru on ru.rid=rm.rid " + - "where m.avtag=1 and ru.oid in (" + conds + ") and code<>0"; - return jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Yapi.class)); - } + "where m.avtag=1 and ru.oid in (" + zuser.getConds() + ") and code<>0"; + List apiList = jdbcDao.getTp().query(sql, new BeanPropertyRowMapper<>(Yapi.class)); - - private List findBtnList(Zuser zuser) { - List btnList = new ArrayList<>(); - List apiList = findYapiList(zuser.getConds()); - int posSum = SysApiCache.AUTHPOS + 1; + int posSum = AuthzApiData.AUTHPOS + 1; long[] permArr = new long[posSum]; for (Yapi api : apiList) { for (int i = 0; i < posSum; i++) { @@ -491,8 +174,8 @@ public class AuthcService { return btnList; } - - private void updateUser(Zuser zuser, List menuList, List btnList, List portalList) { + //缓存用户门户、菜单、按钮到缓存表 + private void updateUser(Zuser zuser, List portalList, List menuList, List btnList) { String menus = JSON.toJSONString(menuList); String portals = JSON.toJSONString(portalList); @@ -517,22 +200,17 @@ public class AuthcService { } String retagSql = "update sys_org_user set retag=1 where id=?"; jdbcDao.update(retagSql, zuser.getId()); - } + @Autowired + private AuthcOrgHandler orgHandler; - @Transactional(readOnly = true) - public Zuser getUser(String username) { - Map map = jdbcDao.getTp().queryForMap("select u.id,u.name from sys_org_user u where u.usnam=? and u.avtag=1", username); - Zuser user = new Zuser(); - user.setId((String) map.get("id")); - user.setName((String) map.get("name")); - return user; - } - + @Autowired + private AuthcPortalHandler portalHandler; @Autowired private JdbcDao jdbcDao; - +// @Autowired +// private LdapHandler ldapHandler; } diff --git a/vboot-core/src/main/java/vboot/core/security/authz/AuthzApiData.java b/vboot-core/src/main/java/vboot/core/security/authz/AuthzApiData.java new file mode 100644 index 0000000..b80f379 --- /dev/null +++ b/vboot-core/src/main/java/vboot/core/security/authz/AuthzApiData.java @@ -0,0 +1,24 @@ +package vboot.core.security.authz; + +import vboot.core.security.pojo.Yapi; + +import java.util.ArrayList; +import java.util.List; + +//所有需要认证API(URL)的内存快照,根据请求method分类,用于快速找到请求URL的权限码 +public class AuthzApiData { + + public static List GET1_APIS = new ArrayList<>(); + + public static List GET2_APIS = new ArrayList<>(); + + public static List POST_APIS = new ArrayList<>(); + + public static List PUT_APIS = new ArrayList<>(); + + public static List DELETE_APIS = new ArrayList<>(); + + public static List PATCH_APIS = new ArrayList<>(); + + public static int AUTHPOS = 0; +} diff --git a/vboot-core/src/main/java/vboot/core/security/authz/AuthzDeniedHandler.java b/vboot-core/src/main/java/vboot/core/security/authz/AuthzDeniedHandler.java index 6e04780..f2d9163 100644 --- a/vboot-core/src/main/java/vboot/core/security/authz/AuthzDeniedHandler.java +++ b/vboot-core/src/main/java/vboot/core/security/authz/AuthzDeniedHandler.java @@ -15,6 +15,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Optional; +//授权拒绝时候的处理 @Component public class AuthzDeniedHandler implements AccessDeniedHandler { diff --git a/vboot-core/src/main/java/vboot/core/security/authz/AuthzFilter.java b/vboot-core/src/main/java/vboot/core/security/authz/AuthzFilter.java index 20e884d..54a2345 100644 --- a/vboot-core/src/main/java/vboot/core/security/authz/AuthzFilter.java +++ b/vboot-core/src/main/java/vboot/core/security/authz/AuthzFilter.java @@ -15,6 +15,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +//授权过滤器 @Slf4j public class AuthzFilter extends OncePerRequestFilter { diff --git a/vboot-core/src/main/java/vboot/core/security/authz/AuthzHandler.java b/vboot-core/src/main/java/vboot/core/security/authz/AuthzHandler.java index 540e126..15ffcb5 100644 --- a/vboot-core/src/main/java/vboot/core/security/authz/AuthzHandler.java +++ b/vboot-core/src/main/java/vboot/core/security/authz/AuthzHandler.java @@ -1,13 +1,12 @@ package vboot.core.security.authz; -import org.springframework.beans.factory.annotation.Autowired; -import vboot.core.module.sys.api.main.SysApiMainHand; import vboot.core.security.pojo.Zuser; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; +//权限校验处理器 @Component public class AuthzHandler { @@ -24,11 +23,55 @@ public class AuthzHandler { if("/getMenuList".equals(uri)||"/getUserInfo".equals(uri)){ return true; } - return apiHand.hasPerm(zuser, method, uri); - + return checkPerm(zuser, method, uri); } - @Autowired - private SysApiMainHand apiHand; + private boolean checkPerm(Zuser zuser, String method,String url){ + if(zuser.isAdmin()){ + return true; + } + boolean flag=false; + //根据method分类快速定位到请求url的权限码,再通过二进制&计算快速校验用户是否有权限 + if("GET".equals(method)){ + for (int i = 0; i < AuthzApiData.GET1_APIS.size(); i++) { + if(AuthzApiData.GET1_APIS.get(i).getUrl().equals(url)){ + flag = zuser.hasPerm(AuthzApiData.GET1_APIS.get(i).getPos(), AuthzApiData.GET1_APIS.get(i).getCode()); + break; + } + } + if(!flag){ + String frontUrl=url.substring(0,url.lastIndexOf("/")); + for (int i = 0; i < AuthzApiData.GET2_APIS.size(); i++) { + if(AuthzApiData.GET2_APIS.get(i).getUrl().equals(frontUrl)){ + flag = zuser.hasPerm(AuthzApiData.GET2_APIS.get(i).getPos(), AuthzApiData.GET2_APIS.get(i).getCode()); + break; + } + } + } + }else if("POST".equals(method)){ + for (int i = 0; i < AuthzApiData.POST_APIS.size(); i++) { + if(AuthzApiData.POST_APIS.get(i).getUrl().equals(url)){ + flag = zuser.hasPerm(AuthzApiData.POST_APIS.get(i).getPos(), AuthzApiData.POST_APIS.get(i).getCode()); + break; + } + } + }else if("PUT".equals(method)){ + for (int i = 0; i < AuthzApiData.PUT_APIS.size(); i++) { + if(AuthzApiData.PUT_APIS.get(i).getUrl().equals(url)){ + flag = zuser.hasPerm(AuthzApiData.PUT_APIS.get(i).getPos(), AuthzApiData.PUT_APIS.get(i).getCode()); + break; + } + } + }else if("DELETE".equals(method)){ + String frontUrl=url.substring(0,url.lastIndexOf("/")); + for (int i = 0; i < AuthzApiData.DELETE_APIS.size(); i++) { + if(AuthzApiData.DELETE_APIS.get(i).getUrl().equals(frontUrl)){ + flag = zuser.hasPerm(AuthzApiData.DELETE_APIS.get(i).getPos(), AuthzApiData.DELETE_APIS.get(i).getCode()); + break; + } + } + } + return flag; + } } diff --git a/vboot-core/src/main/java/vboot/core/security/authz/JwtFilterAdapter.java b/vboot-core/src/main/java/vboot/core/security/authz/JwtFilterAdapter.java index d58abe6..f7e788b 100644 --- a/vboot-core/src/main/java/vboot/core/security/authz/JwtFilterAdapter.java +++ b/vboot-core/src/main/java/vboot/core/security/authz/JwtFilterAdapter.java @@ -7,15 +7,16 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +//授权过滤器适配器 @RequiredArgsConstructor public class JwtFilterAdapter extends SecurityConfigurerAdapter { private final JwtHandler jwtHandler; + private final RedisHandler redisHandler; - @Override - public void configure(HttpSecurity http) throws Exception { + public void configure(HttpSecurity http) { AuthzFilter jwtFilter = new AuthzFilter(jwtHandler, redisHandler); http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class); } diff --git a/vboot-core/src/main/java/vboot/core/security/authz/JwtHandler.java b/vboot-core/src/main/java/vboot/core/security/authz/JwtHandler.java index 8211924..34ea40c 100644 --- a/vboot-core/src/main/java/vboot/core/security/authz/JwtHandler.java +++ b/vboot-core/src/main/java/vboot/core/security/authz/JwtHandler.java @@ -16,6 +16,7 @@ import javax.servlet.http.HttpServletRequest; import java.security.Key; import java.util.ArrayList; +//Jwt处理器 @Component public class JwtHandler implements InitializingBean { @@ -50,12 +51,8 @@ public class JwtHandler implements InitializingBean { } public String createTokenByUuid(String uuid) { -// System.out.println("uuidz:" + uuid); - return jwtBuilder - .setId(uuid) - .claim("username", uuid) - .setSubject(uuid) - .compact(); + return jwtBuilder.setId(uuid).claim("username", uuid) + .setSubject(uuid).compact(); } diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/LoginVo.java b/vboot-core/src/main/java/vboot/core/security/pojo/LoginVo.java index c2b9401..e48b015 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/LoginVo.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/LoginVo.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; import java.io.Serializable; +//用户名与密码VO,登录时用到 @Data @NoArgsConstructor @AllArgsConstructor diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/UserDo.java b/vboot-core/src/main/java/vboot/core/security/pojo/UserDo.java index 8d70e07..02561fa 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/UserDo.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/UserDo.java @@ -2,6 +2,7 @@ package vboot.core.security.pojo; import lombok.Data; +//数据库用户信息,登录时用到 @Data public class UserDo { diff --git a/vboot-core/src/main/java/vboot/core/common/init/Yapi.java b/vboot-core/src/main/java/vboot/core/security/pojo/Yapi.java similarity index 59% rename from vboot-core/src/main/java/vboot/core/common/init/Yapi.java rename to vboot-core/src/main/java/vboot/core/security/pojo/Yapi.java index 0e68914..f5891d5 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/Yapi.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Yapi.java @@ -1,15 +1,15 @@ -package vboot.core.common.init; +package vboot.core.security.pojo; import lombok.Data; import java.io.Serializable; +//api pojo:存储URL,权限位与权限码 @Data -public class Yapi implements Serializable -{ +public class Yapi implements Serializable { private static final long serialVersionUID = 7712491509249951764L; - private int pos; + private int pos; private long code; diff --git a/vboot-core/src/main/java/vboot/core/common/init/Yurl.java b/vboot-core/src/main/java/vboot/core/security/pojo/Yurl.java similarity index 68% rename from vboot-core/src/main/java/vboot/core/common/init/Yurl.java rename to vboot-core/src/main/java/vboot/core/security/pojo/Yurl.java index 597044b..9c818ee 100644 --- a/vboot-core/src/main/java/vboot/core/common/init/Yurl.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Yurl.java @@ -1,7 +1,8 @@ -package vboot.core.common.init; +package vboot.core.security.pojo; import lombok.Data; +//url扫描收集时是用到的pojo @Data public class Yurl { private String id ; diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/Zmenu.java b/vboot-core/src/main/java/vboot/core/security/pojo/Zmenu.java index 63f8673..d21b428 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/Zmenu.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Zmenu.java @@ -7,6 +7,7 @@ import lombok.Data; import java.io.Serializable; import java.util.List; +//前台返回菜单 @Data public class Zmenu implements Serializable { private static final long serialVersionUID = 1L; diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/Zmeta.java b/vboot-core/src/main/java/vboot/core/security/pojo/Zmeta.java index 1727208..aa69560 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/Zmeta.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Zmeta.java @@ -4,6 +4,7 @@ import lombok.Data; import java.io.Serializable; +//前台返回菜单meta信息 @Data public class Zmeta implements Serializable { private static final long serialVersionUID = 1L; diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/Zportal.java b/vboot-core/src/main/java/vboot/core/security/pojo/Zportal.java index 86d6e73..6ec6959 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/Zportal.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Zportal.java @@ -2,6 +2,7 @@ package vboot.core.security.pojo; import lombok.Data; +//前台返回门户 @Data public class Zportal { private String id; diff --git a/vboot-core/src/main/java/vboot/core/security/pojo/Zuser.java b/vboot-core/src/main/java/vboot/core/security/pojo/Zuser.java index d30d1c8..342fc0d 100644 --- a/vboot-core/src/main/java/vboot/core/security/pojo/Zuser.java +++ b/vboot-core/src/main/java/vboot/core/security/pojo/Zuser.java @@ -9,6 +9,7 @@ import java.io.Serializable; import java.util.Collection; import java.util.List; +//用户pojo,前台与后台都会用到,前台用于获取用户信息,后台存在redis里,用于获取用户信息及权限校验 @Data public class Zuser implements UserDetails, Serializable { @@ -18,7 +19,7 @@ public class Zuser implements UserDetails, Serializable { private String name;//用户姓名 - private Boolean watag; + private Boolean watag;//前台通知是否查看过的标记 private String usnam;//用户名 @@ -60,7 +61,7 @@ public class Zuser implements UserDetails, Serializable { isAdmin = admin; } - + //权限校验 public boolean hasPerm(int pos, long code) { if (isAdmin()) { return true; diff --git a/vboot-core/src/main/java/vboot/core/xutil/lang/XjsonUtil.java b/vboot-core/src/main/java/vboot/core/xutil/lang/XjsonUtil.java index 91d3856..de85c17 100644 --- a/vboot-core/src/main/java/vboot/core/xutil/lang/XjsonUtil.java +++ b/vboot-core/src/main/java/vboot/core/xutil/lang/XjsonUtil.java @@ -8,63 +8,129 @@ import java.util.List; public class XjsonUtil { - - //使用递归方法建树 - public static List buildByRecursive(List treeNodes) { - List trees = new ArrayList<>(); - for (Ztree treeNode : treeNodes) { - if (treeNode.getPid()==null) { - trees.add(findChildrenByTier(treeNode,treeNodes)); + public static List buildTreeByRecursive(List nodes) { + List list = new ArrayList<>(); + for (Ztree node : nodes) { + if (node.getPid() == null) { + list.add(findTreeChildrenByTier(node, nodes)); + } else { + boolean flag = false; + for (Ztree node2 : nodes) { + if (node.getPid().equals(node2.getId())) { + flag = true; + break; + } + } + if (!flag) { + list.add(findTreeChildrenByTier(node, nodes)); + } } } - return trees; + return list; } - - //递归查找子节点 - public static Ztree findChildrenByTier(Ztree treeNode, List treeNodes) { -// treeNode.setChildren(new ArrayList<>()); - for (Ztree it : treeNodes) { - if(treeNode.getId().equals(it.getPid())) { - if (treeNode.getChildren() == null) { - treeNode.setChildren(new ArrayList<>()); + private static Ztree findTreeChildrenByTier(Ztree node, List nodes) { + for (Ztree item : nodes) { + if (node.getId().equals(item.getPid())) { + if (node.getChildren() == null) { + node.setChildren(new ArrayList<>()); } - treeNode.getChildren().add(findChildrenByTier(it,treeNodes)); + node.getChildren().add(findTreeChildrenByTier(item, nodes)); } } - return treeNode; + return node; } - // - public static List inpToTree(List inpList) { - List trees = new ArrayList<>(); - for (Zinp zinp : inpList) { - if (zinp.getPid()==null) { - trees.add(findChildrenByTree(zinp,inpList)); - } - } - return trees; - } - - - public static Ztree findChildrenByTree(Zinp zinp, List zinpList) { -// treeNode.setChildren(new ArrayList<>()); - Ztree ztree =new Ztree(); - ztree.setId(zinp.getId()); - ztree.setName(zinp.getName()); - for (Zinp it : zinpList) { - if(zinp.getId().equals(it.getPid())) { - if (ztree.getChildren() == null) { - ztree.setChildren(new ArrayList<>()); +// //使用递归方法建树 + public static List buildInpByRecursive(List nodes) { + List list = new ArrayList<>(); + for (Zinp node : nodes) { + if (node.getPid() == null) { + list.add(findInpChildrenByTier(node, nodes)); + } else { + boolean flag = false; + for (Zinp node2 : nodes) { + if (node.getPid().equals(node2.getId())) { + flag = true; + break; + } + } + if (!flag) { + list.add(findInpChildrenByTier(node, nodes)); } - ztree.getChildren().add(findChildrenByTree(it,zinpList)); } } - return ztree; + return list; } +// +// +// //递归查找子节点 + private static Zinp findInpChildrenByTier(Zinp node, List nodes) { + for (Zinp item : nodes) { + if (node.getId().equals(item.getPid())) { + if (node.getChildren() == null) { + node.setChildren(new ArrayList<>()); + } + node.getChildren().add(findInpChildrenByTier(item, nodes)); + } + } + return node; + } + + +// //使用递归方法建树 +// public static List buildByRecursive(List treeNodes) { +// List trees = new ArrayList<>(); +// for (Ztree treeNode : treeNodes) { +// if (treeNode.getPid()==null) { +// trees.add(findChildrenByTier(treeNode,treeNodes)); +// } +// } +// return trees; +// } +// +// //递归查找子节点 +// public static Ztree findChildrenByTier(Ztree treeNode, List treeNodes) { +//// treeNode.setChildren(new ArrayList<>()); +// for (Ztree it : treeNodes) { +// if(treeNode.getId().equals(it.getPid())) { +// if (treeNode.getChildren() == null) { +// treeNode.setChildren(new ArrayList<>()); +// } +// treeNode.getChildren().add(findChildrenByTier(it,treeNodes)); +// } +// } +// return treeNode; +// } + +// public static List inpToTree(List inpList) { +// List trees = new ArrayList<>(); +// for (Zinp zinp : inpList) { +// if (zinp.getPid()==null) { +// trees.add(findChildrenByTree(zinp,inpList)); +// } +// } +// return trees; +// } +// +// private static Ztree findChildrenByTree(Zinp zinp, List zinpList) { +//// treeNode.setChildren(new ArrayList<>()); +// Ztree ztree =new Ztree(); +// ztree.setId(zinp.getId()); +// ztree.setName(zinp.getName()); +// for (Zinp it : zinpList) { +// if(zinp.getId().equals(it.getPid())) { +// if (ztree.getChildren() == null) { +// ztree.setChildren(new ArrayList<>()); +// } +// ztree.getChildren().add(findChildrenByTree(it,zinpList)); +// } +// } +// return ztree; +// } } diff --git a/vboot-extend/src/main/java/vboot/extend/module/oa/doc/main/OaDocMain.java b/vboot-extend/src/main/java/vboot/extend/module/oa/doc/main/OaDocMain.java index 4bfe43d..31d77b4 100644 --- a/vboot-extend/src/main/java/vboot/extend/module/oa/doc/main/OaDocMain.java +++ b/vboot-extend/src/main/java/vboot/extend/module/oa/doc/main/OaDocMain.java @@ -11,7 +11,5 @@ import javax.persistence.Entity; @Setter public class OaDocMain extends BaseMainEntity { - private String notes; - } \ No newline at end of file diff --git a/vboot-extend/src/main/java/vboot/extend/module/oa/flow/main/OaFlowMain.java b/vboot-extend/src/main/java/vboot/extend/module/oa/flow/main/OaFlowMain.java index 4d2a4ad..2c77cb2 100644 --- a/vboot-extend/src/main/java/vboot/extend/module/oa/flow/main/OaFlowMain.java +++ b/vboot-extend/src/main/java/vboot/extend/module/oa/flow/main/OaFlowMain.java @@ -21,8 +21,6 @@ public class OaFlowMain extends BaseMainEntity { @Column(length = 32) private String protd;//全局流程模板ID - private String notes; - @Lob private String zform; diff --git a/vboot-extend/src/main/java/vboot/extend/module/oa/flow/temp/OaFlowTemp.java b/vboot-extend/src/main/java/vboot/extend/module/oa/flow/temp/OaFlowTemp.java index 2a74bc7..74959ce 100644 --- a/vboot-extend/src/main/java/vboot/extend/module/oa/flow/temp/OaFlowTemp.java +++ b/vboot-extend/src/main/java/vboot/extend/module/oa/flow/temp/OaFlowTemp.java @@ -14,7 +14,6 @@ public class OaFlowTemp extends BaseMainEntity { private Integer ornum; - private String notes; private String protd;//全局流程模板ID diff --git a/vboot-extend/src/main/java/vboot/extend/module/oa/test/one/OaTestOne.java b/vboot-extend/src/main/java/vboot/extend/module/oa/test/one/OaTestOne.java index d34fcef..7ceaee8 100644 --- a/vboot-extend/src/main/java/vboot/extend/module/oa/test/one/OaTestOne.java +++ b/vboot-extend/src/main/java/vboot/extend/module/oa/test/one/OaTestOne.java @@ -11,6 +11,4 @@ import javax.persistence.*; @Setter public class OaTestOne extends BaseMainEntity { - private String notes;//备注 - } \ No newline at end of file diff --git a/vboot-extend/src/main/java/vboot/extend/module/oa/test/two/OaTestTwo.java b/vboot-extend/src/main/java/vboot/extend/module/oa/test/two/OaTestTwo.java index 597b464..f25b565 100644 --- a/vboot-extend/src/main/java/vboot/extend/module/oa/test/two/OaTestTwo.java +++ b/vboot-extend/src/main/java/vboot/extend/module/oa/test/two/OaTestTwo.java @@ -11,8 +11,5 @@ import javax.persistence.Entity; @Setter public class OaTestTwo extends BaseMainEntity { - //备注 - private String notes; - } \ No newline at end of file