diff --git a/ds-base/dsBase.iml b/ds-base/dsBase.iml new file mode 100644 index 00000000..69dd4625 --- /dev/null +++ b/ds-base/dsBase.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dsBase/src/main/java/com/dsideal/base/LoginPerson/Controller/LoginPersonController.java b/dsBase/src/main/java/com/dsideal/base/LoginPerson/Controller/LoginPersonController.java index bc19f3e8..a2994965 100644 --- a/dsBase/src/main/java/com/dsideal/base/LoginPerson/Controller/LoginPersonController.java +++ b/dsBase/src/main/java/com/dsideal/base/LoginPerson/Controller/LoginPersonController.java @@ -2,7 +2,6 @@ package com.dsideal.base.LoginPerson.Controller; import com.alibaba.fastjson.JSONObject; import com.dsideal.base.BaseApplication; -import com.dsideal.base.Const.RetBean; import com.dsideal.base.Interceptor.*; import com.dsideal.base.LoginPerson.Model.LoginPersonModel; import com.dsideal.base.Util.*; @@ -15,6 +14,8 @@ import com.jfinal.plugin.activerecord.Page; import com.jfinal.plugin.activerecord.Record; import java.io.File; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; @SuppressWarnings("unchecked") @@ -23,9 +24,30 @@ public class LoginPersonController extends Controller { LoginPersonModel model = new LoginPersonModel(); @Before({POST.class}) - public void doLogin(String username, String password, String platform) { + public void doLogin(String username, String password, String platform, int forVue) { JSONObject jo = model.doLogin(username, password, platform, getResponse()); - renderJson(jo); + if (forVue == 0) { + renderJson(jo); + } else { + boolean success = jo.getBoolean("success"); + String msg = jo.getString("message"); + if (!success) { + renderJson(RetKit.renderFail(msg)); + return; + } + int identity_id = jo.getInteger("identity_id"); + String person_id = jo.getString("person_id"); + String bureau_id = jo.getString("bureau_id"); + String person_name = jo.getString("person_name"); + String jwt = jo.getString("jwt"); + Map map = new HashMap<>(); + map.put("identity_id", identity_id); + map.put("person_id", person_id); + map.put("bureau_id", bureau_id); + map.put("person_name", person_name); + map.put("jwt", jwt); + renderJson(RetKit.renderSuccess(msg, map)); + } } @Before({GET.class}) @@ -34,7 +56,7 @@ public class LoginPersonController extends Controller { CookieUtil.remove(getRequest(), getResponse(), "person_id"); CookieUtil.remove(getRequest(), getResponse(), "bureau_id"); CookieUtil.remove(getRequest(), getResponse(), "token"); - redirect("/html/login.html"); + renderJson(CommonUtil.returnMessageJson(true, "退出登录成功!")); } /** diff --git a/dsBase/src/main/java/com/dsideal/base/LoginPerson/Model/LoginPersonModel.java b/dsBase/src/main/java/com/dsideal/base/LoginPerson/Model/LoginPersonModel.java index e7585332..7118eaab 100644 --- a/dsBase/src/main/java/com/dsideal/base/LoginPerson/Model/LoginPersonModel.java +++ b/dsBase/src/main/java/com/dsideal/base/LoginPerson/Model/LoginPersonModel.java @@ -333,7 +333,7 @@ public class LoginPersonModel { //去掉限制 RedisKit.del(PassWordKey); //防止用户攻击修改Cookie - Map _map = new HashMap(); + Map _map = new HashMap(); _map.put("identity_id", loginMap.get("identity_id")); _map.put("person_id", loginMap.get("person_id")); _map.put("bureau_id", loginMap.get("bureau_id")); diff --git a/dsBase/src/main/java/com/dsideal/base/Util/CommonUtil.java b/dsBase/src/main/java/com/dsideal/base/Util/CommonUtil.java index 228e77c1..a4ad020c 100644 --- a/dsBase/src/main/java/com/dsideal/base/Util/CommonUtil.java +++ b/dsBase/src/main/java/com/dsideal/base/Util/CommonUtil.java @@ -284,7 +284,6 @@ public class CommonUtil { } - /** * 功能:验证是否为手机号 * 作者:吴缤 @@ -402,16 +401,6 @@ public class CommonUtil { return false; } - /*** - * delete CRLF; delete empty line ;delete blank lines - * - * @param input - * @return - */ - private static String deleteCRLFOnce(String input) { - return input.replaceAll("((\r\n)|\n)[\\s\t ]*(\\1)+", "$1"); - } - public static boolean checkPass(String pass) { //注释掉必须要有符号这个要求:&& pass.matches(".*[~!@#$%^&*\\.?]{1,}.*") @@ -426,5 +415,4 @@ public class CommonUtil { String base64Rule = "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$"; return Pattern.matches(base64Rule, str); } - } diff --git a/dsBase/src/main/java/com/dsideal/base/Util/RetKit.java b/dsBase/src/main/java/com/dsideal/base/Util/RetKit.java new file mode 100644 index 00000000..5bf1c77b --- /dev/null +++ b/dsBase/src/main/java/com/dsideal/base/Util/RetKit.java @@ -0,0 +1,100 @@ +package com.dsideal.base.Util; + +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RetKit { + + /** + * 按VUE的要求返回List数据格式 + *

+ * data: Map + */ + public static Map renderSuccess(List list) { + return renderSuccess(null, list, null, 0, 0, 0); + } + public static Map renderSuccess(String msg, List list) { + return renderSuccess(msg, list, null, 0, 0, 0); + } + public static Map renderSuccess(Page page) { + return renderSuccess(null, page.getList(), "list", page.getPageNumber(), page.getPageSize(), page.getTotalRow()); + } + + public static Map renderSuccess(String msg, Page page, String dataName) { + return renderSuccess(msg, page.getList(), dataName, page.getPageNumber(), page.getPageSize(), page.getTotalRow()); + } + + public static Map renderSuccess(String msg, Map map) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + rMap.put("data", map); + return rMap; + } + + public static Map renderSuccess(cn.hutool.json.JSONArray jsonArray) { + return renderSuccess(null, jsonArray); + } + + public static Map renderSuccess(String msg, cn.hutool.json.JSONArray jsonArray) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + rMap.put("data", jsonArray); + return rMap; + } + + public static Map renderSuccess(String msg, List list, String dataName, int pageNum, int pageSize, int total) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + if (StrKit.isBlank(dataName)) { + //没有List的名称,直接把list放到data中,[]数组形式 + rMap.put("data", list); + } else { + //有List的名称,则把list放到data中,也需要把list的 size()做为一个属性,放到data上的count属性中 + Map _map = new HashMap<>(); + _map.put(dataName, list); + _map.put("total", list.size()); + if (pageNum > 0) { + _map.put("pageNum", pageNum); + } + if (pageSize > 0) { + _map.put("pageSize", pageSize); + } + if (total > 0) { + _map.put("total", total); + } + rMap.put("data", _map); + } + + return rMap; + } + + public static Map renderFail(String msg) { + return renderFail(msg, null); + } + + public static Map renderFail(String msg, Map map) { + Map rMap = new HashMap<>(); + rMap.put("code", 500); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + if (map != null) { + rMap.put("data", map); + } + return rMap; + } +} diff --git a/dsGw/src/main/java/com/dsideal/gw/Bean/RetBean.java b/dsGw/src/main/java/com/dsideal/gw/Bean/RetBean.java index 2bad20d8..da6aeb79 100644 --- a/dsGw/src/main/java/com/dsideal/gw/Bean/RetBean.java +++ b/dsGw/src/main/java/com/dsideal/gw/Bean/RetBean.java @@ -1,6 +1,5 @@ package com.dsideal.gw.Bean; -import com.alibaba.fastjson.JSONObject; import lombok.Getter; import lombok.Setter; @@ -16,20 +15,17 @@ public class RetBean { */ private int code; private String msg; - private JSONObject data; - public static final Integer SUCCESS = 200; public static final Integer ERROR = 500; public static final Integer OVERDUE = 401; public static final Integer TIMEOUT = 30000; - public RetBean(int code, String msg, JSONObject data) { + public RetBean(int code, String msg) { this.code = code; this.msg = msg; - this.data = data; - } - public String toJsonString() { - return JSONObject.toJSONString(this); } + public String toString() { + return "{\"code\":" + code + ",\"msg\":\"" + msg + "\"}"; + } } diff --git a/dsGw/src/main/java/com/dsideal/gw/Handler/RouterHandler.java b/dsGw/src/main/java/com/dsideal/gw/Handler/RouterHandler.java index 3a11d2b7..fa55bacc 100644 --- a/dsGw/src/main/java/com/dsideal/gw/Handler/RouterHandler.java +++ b/dsGw/src/main/java/com/dsideal/gw/Handler/RouterHandler.java @@ -1,6 +1,5 @@ package com.dsideal.gw.Handler; -import com.alibaba.fastjson.JSONObject; import com.dsideal.gw.Bean.RetBean; import com.dsideal.gw.GwApplication; import com.dsideal.gw.Util.CommonUtil; @@ -39,32 +38,14 @@ public class RouterHandler extends Handler { * 功能:输出JSON文本串 * * @param res - * @param jo */ - public void renderJson(HttpServletResponse res, JSONObject jo) { + public void renderJson(HttpServletResponse res, String body) { res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Cache-Control", "no-cache"); res.setCharacterEncoding("UTF-8"); res.setContentType("application/json"); try { - RetBean ret; - String msg = ""; - if (jo.containsKey("msg")) { - msg = jo.getString("msg"); - jo.remove("msg"); - } else if (jo.containsKey("message")) { - msg = jo.getString("message"); - jo.remove("message"); - } - - if (jo.getBoolean("success")) { - jo.remove("success"); - ret = new RetBean(RetBean.SUCCESS, msg, jo); - } else { - jo.remove("success"); - ret = new RetBean(RetBean.ERROR, msg, jo); - } - res.getWriter().println(ret.toJsonString()); + res.getWriter().println(body); res.getWriter().flush(); } catch (IOException e) { throw new RuntimeException(e); @@ -79,13 +60,9 @@ public class RouterHandler extends Handler { if (response.body() != null) { responseBody = response.body().string(); } - JSONObject jo = JSONObject.parseObject(responseBody); - renderJson(res, jo); + renderJson(res, responseBody); } else { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "请求失败!"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "请求失败!").toString()); } } @@ -160,16 +137,13 @@ public class RouterHandler extends Handler { if (req.getHeader("Authorization") != null) { String jwtToken = req.getHeader("Authorization"); Claims claims = JwtUtil.getClaims(jwtToken); - if (claims == null) { + if (claims != null) { canPass = true; } } } if (!canPass) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "登录已过期,请重新登录!"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "登录已过期,请重新登录!").toString()); isHandled[0] = true; //停止filter return; } @@ -182,20 +156,14 @@ public class RouterHandler extends Handler { //action名称 String action = servletPath.substring(xie2 + 1); if (xie1 == -1 || xie2 == -1) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "输入的字符串格式不正确,没有找到两个 '/'。"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "输入的字符串格式不正确,没有找到两个 '/'。").toString()); isHandled[0] = true; //停止filter return; } String prefix = servletPath.substring(xie1 + 1, xie2); // 截取两个 '/' 之间的内容 if (!GwApplication.routeList.containsKey(prefix)) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", prefix + "前缀没有找到合适的路由表,请检查是否请求正确!"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, prefix + "前缀没有找到合适的路由表,请检查是否请求正确!").toString()); isHandled[0] = true; //停止filter return; } @@ -209,10 +177,7 @@ public class RouterHandler extends Handler { MultipartRequest mp = new MultipartRequest(req); List files = mp.getFiles(); if (files.isEmpty()) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "没有上传文件!"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "没有上传文件!").toString()); isHandled[0] = true;//停止filter return; } @@ -235,10 +200,7 @@ public class RouterHandler extends Handler { isHandled[0] = true;//停止filter return; } catch (Exception e) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "请求失败!" + e); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "请求失败!" + e).toString()); isHandled[0] = true;//停止filter return; } @@ -263,10 +225,7 @@ public class RouterHandler extends Handler { isHandled[0] = true;//停止filter return; } catch (IOException e) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "请求失败!" + e); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "请求失败!" + e).toString()); isHandled[0] = true;//停止filter return; } @@ -292,20 +251,14 @@ public class RouterHandler extends Handler { isHandled[0] = true;//停止filter return; } catch (IOException e) { - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "请求失败!" + e); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "请求失败!" + e).toString()); isHandled[0] = true;//停止filter return; } } //4、其它的OPTIONS - JSONObject jo = new JSONObject(); - jo.put("success", false); - jo.put("message", "系统只支持GET,POST,其它的OPTIONS不支持!文件上传请使用S3协议进行直传,不通过JAVA处理,JAVA只处理授权!"); - renderJson(res, jo); + renderJson(res, new RetBean(RetBean.ERROR, "系统只支持GET,POST,其它的OPTIONS不支持!文件上传请使用S3协议进行直传,不通过JAVA处理,JAVA只处理授权!").toString()); //停止filter isHandled[0] = true; } diff --git a/dsGw/target/classes/application_ali.yaml b/dsGw/target/classes/application_ali.yaml new file mode 100644 index 00000000..7604cfe6 --- /dev/null +++ b/dsGw/target/classes/application_ali.yaml @@ -0,0 +1,23 @@ +# 上传文件的临时路径 +uploadTempPath: /tmp +# JWT +SECRET: ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM +# 生成Token的密码 +CookieMd5SingPwd: DsideaL4r5t6y7u + +# 路由 +route: + # 基础数据 + dsBase: + url: http://ds-base:8001 + # 资源库 + dsRes: + url: http://ds-res:8002 + +# 白名单 +whitelist: + # 全局变量获取 + - /dsBase/global/getGlobalValueByKey + # 登录 + - /dsBase/loginPerson/doLogin + diff --git a/dsRes.iml b/dsRes.iml new file mode 100644 index 00000000..0c5c4d56 --- /dev/null +++ b/dsRes.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/dsRes/src/main/java/com/dsideal/resource/Base/Controller/BaseController.java b/dsRes/src/main/java/com/dsideal/resource/Base/Controller/BaseController.java new file mode 100644 index 00000000..43d98a13 --- /dev/null +++ b/dsRes/src/main/java/com/dsideal/resource/Base/Controller/BaseController.java @@ -0,0 +1,26 @@ +package com.dsideal.resource.Base.Controller; + +import com.dsideal.resource.Base.Model.BaseModel; +import com.dsideal.resource.Util.RetKit; +import com.jfinal.core.Controller; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.List; + +public class BaseController extends Controller { + BaseModel bm = new BaseModel(); + + /** + * 功能:获取学段列表 + */ + public void getStageList() { + List list = bm.getStageList(); + Page page=new Page<>(); + page.setList(list); + page.setPageSize(20); + page.setTotalRow(list.size()); + page.setPageNumber(1); + renderJson(RetKit.renderSuccess(page)); + } +} diff --git a/dsRes/src/main/java/com/dsideal/resource/Base/Model/BaseModel.java b/dsRes/src/main/java/com/dsideal/resource/Base/Model/BaseModel.java new file mode 100644 index 00000000..6e58c750 --- /dev/null +++ b/dsRes/src/main/java/com/dsideal/resource/Base/Model/BaseModel.java @@ -0,0 +1,16 @@ +package com.dsideal.resource.Base.Model; + +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; +import java.util.List; + +public class BaseModel { + /** + * 功能:获取学段列表 + * @return + */ + public List getStageList(){ + String sql="select * from t_dm_stage order by stage_id"; + return Db.find(sql); + } +} diff --git a/dsBase/src/main/java/com/dsideal/base/Const/RetBean.java b/dsRes/src/main/java/com/dsideal/resource/Const/RetBean.java similarity index 90% rename from dsBase/src/main/java/com/dsideal/base/Const/RetBean.java rename to dsRes/src/main/java/com/dsideal/resource/Const/RetBean.java index b145ad35..acd5e0aa 100644 --- a/dsBase/src/main/java/com/dsideal/base/Const/RetBean.java +++ b/dsRes/src/main/java/com/dsideal/resource/Const/RetBean.java @@ -1,4 +1,4 @@ -package com.dsideal.base.Const; +package com.dsideal.resource.Const; import com.alibaba.fastjson.JSONObject; import lombok.Getter; diff --git a/dsRes/src/main/java/com/dsideal/resource/Controller/IndexController.java b/dsRes/src/main/java/com/dsideal/resource/Index/IndexController.java similarity index 77% rename from dsRes/src/main/java/com/dsideal/resource/Controller/IndexController.java rename to dsRes/src/main/java/com/dsideal/resource/Index/IndexController.java index 4cb493c5..c7e668fe 100644 --- a/dsRes/src/main/java/com/dsideal/resource/Controller/IndexController.java +++ b/dsRes/src/main/java/com/dsideal/resource/Index/IndexController.java @@ -1,4 +1,4 @@ -package com.dsideal.resource.Controller; +package com.dsideal.resource.Index; import com.jfinal.core.Controller; diff --git a/dsRes/src/main/java/com/dsideal/resource/Menu/Controller/MenuController.java b/dsRes/src/main/java/com/dsideal/resource/Menu/Controller/MenuController.java new file mode 100644 index 00000000..2fb6b630 --- /dev/null +++ b/dsRes/src/main/java/com/dsideal/resource/Menu/Controller/MenuController.java @@ -0,0 +1,39 @@ +package com.dsideal.resource.Menu.Controller; + +import cn.hutool.json.JSONUtil; +import com.dsideal.resource.Menu.Model.MenuModel; +import com.dsideal.resource.Util.CommonUtil; +import com.dsideal.resource.Util.JwtUtil; +import com.dsideal.resource.Util.RetKit; +import com.jfinal.aop.Before; +import com.jfinal.core.Controller; +import com.jfinal.ext.interceptor.GET; +import io.jsonwebtoken.Claims; + +import java.util.List; + +public class MenuController extends Controller { + MenuModel mm = new MenuModel(); + + /** + * 功能:获取人员可以看到的菜单 + */ + @Before({GET.class}) + public void getPersonMenu() { + //当前登录的人员是谁? + String token = getRequest().getHeader("Authorization"); + if (token == null) { + renderJson(RetKit.renderFail("JWT token 为空,无法解析人员信息,请重新登录!")); + return; + } + Claims claims = JwtUtil.getClaims(token); + int identity_id = Integer.parseInt(claims.get("identity_id").toString()); + String person_id = claims.get("person_id").toString(); + + //所有菜单 + List menuList = mm.fetchMenu(160); + renderJson(RetKit.renderSuccess(JSONUtil.parseArray(menuList))); + + //后续需要根据人员角色菜单关系,去掉不可见菜单 + } +} diff --git a/dsRes/src/main/java/com/dsideal/resource/Menu/GetVueMenu.java b/dsRes/src/main/java/com/dsideal/resource/Menu/GetVueMenu.java deleted file mode 100644 index d067cd35..00000000 --- a/dsRes/src/main/java/com/dsideal/resource/Menu/GetVueMenu.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.dsideal.resource.Menu; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.jfinal.kit.Prop; -import com.jfinal.plugin.activerecord.ActiveRecordPlugin; -import com.jfinal.plugin.activerecord.Db; -import com.jfinal.plugin.hikaricp.HikariCpPlugin; -import com.dsideal.resource.Plugin.YamlProp; -import com.jfinal.plugin.activerecord.Record; -import lombok.Getter; -import lombok.Setter; - -import java.util.ArrayList; -import java.util.List; - -public class GetVueMenu { - //子类1:菜单 - @Getter - @Setter - public static class Menu { - private String path; - private String name; - private String component; - private Meta meta; - private List

children=new ArrayList<>(); - } - //子类2:LinkMeta - @Getter - @Setter - public static class Meta { - private String icon; - private String title; - private String isLink; - private boolean isHide; - private boolean isFull; - private boolean isAffix; - private boolean isKeepAlive; - } - public static GetVueMenu gm=new GetVueMenu(); - public static void main(String[] args) throws JsonProcessingException { - String configFile = "application_dev.yaml"; - Prop PropKit = new YamlProp(configFile); - HikariCpPlugin hp = new HikariCpPlugin(PropKit.get("mysql.jdbcUrl"), PropKit.get("mysql.user"), - PropKit.get("mysql.password").trim(), PropKit.get("mysql.driverClassName")); - hp.start(); - // 配置ActiveRecord插件 - ActiveRecordPlugin arp = new ActiveRecordPlugin(hp); - arp.start(); - - List rootMenu = gm.fetchMenu(-1); // 从父ID为-1开始递归 - //输出JSON格式 - ObjectMapper mapper = new ObjectMapper(); - String json = mapper.writeValueAsString(rootMenu.getFirst()); - - //去掉children为空的节点 - JsonNode root = mapper.readTree(json); - removeEmptyChildren(root); - String cleanedJson = mapper.writeValueAsString(root); - System.out.println(cleanedJson); - } - - /** - * 功能:递归删除JSON中children为空的节点 - * - * @param node - */ - private static void removeEmptyChildren(JsonNode node) { - if (node.isObject()) { - ObjectNode objectNode = (ObjectNode) node; - if (objectNode.has("children")) { - JsonNode children = objectNode.get("children"); - if (children.isArray() && ((ArrayNode) children).isEmpty()) { - objectNode.remove("children"); - } else if (children.isArray()) { - ArrayNode arrayNode = (ArrayNode) children; - for (int i = 0; i < arrayNode.size(); i++) { - removeEmptyChildren(arrayNode.get(i)); - } - } - } - } - } - - /** - * 功能:递归获取菜单 - * - * @param parent_id 父节点ID - * @return 此父节点下所有的子菜单 - */ - private List fetchMenu(int parent_id) { - String sql = "select * from t_base_menu where parent_id = ?"; - List list = Db.find(sql, parent_id); - List res = new ArrayList<>(); - - for (Record rs : list) { - if (rs == null) return null; - Menu sMenu = new Menu(); - String url = rs.getStr("url"); - sMenu.setPath(url); - sMenu.setName(rs.getStr("menu_name")); - sMenu.setComponent(url); - - Meta meta = new Meta(); - meta.setIcon(rs.getStr("icon")); - meta.setTitle(rs.getStr("menu_name")); - meta.setIsLink(""); - meta.setHide(false); - - if (rs.get("is_full") == null || rs.getInt("is_full") == 0) { - meta.setFull(false); - } else { - meta.setFull(true); - } - meta.setAffix(true); - meta.setKeepAlive(true); - sMenu.setMeta(meta); - // 递归查找子菜单 - List childMenu = fetchMenu(rs.getInt("menu_id")); - sMenu.setChildren(childMenu); - res.add(sMenu); - } - return res; - } -} diff --git a/dsRes/src/main/java/com/dsideal/resource/Menu/Model/MenuModel.java b/dsRes/src/main/java/com/dsideal/resource/Menu/Model/MenuModel.java new file mode 100644 index 00000000..0403e503 --- /dev/null +++ b/dsRes/src/main/java/com/dsideal/resource/Menu/Model/MenuModel.java @@ -0,0 +1,80 @@ +package com.dsideal.resource.Menu.Model; + +import com.jfinal.plugin.activerecord.Db; +import com.jfinal.plugin.activerecord.Record; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +public class MenuModel { + //子类1:菜单 + @Getter + @Setter + public static class Menu { + private String path; + private String component; + private Meta meta; + private List children = new ArrayList<>(); + } + + //子类2:LinkMeta + @Getter + @Setter + public static class Meta { + private String icon; + private String title; + private String isLink; + private boolean isHide; + private boolean isFull; + private boolean isAffix; + private String name; + private boolean isKeepAlive; + } + + /** + * 功能:递归获取菜单 + * + * @param parent_id 父节点ID + * @return 此父节点下所有的子菜单 + */ + public List fetchMenu(int parent_id) { + String sql = "select * from t_base_menu where parent_id = ? order by sort_id"; + List list = Db.find(sql, parent_id); + List res = new ArrayList<>(); + + for (Record rs : list) { + if (rs == null) return null; + Menu sMenu = new Menu(); + String url = rs.getStr("url"); + sMenu.setPath(url); + + sMenu.setComponent(url); + + Meta meta = new Meta(); + meta.setIcon(rs.getStr("icon")); + meta.setTitle(rs.getStr("menu_name")); + meta.setIsLink(""); + meta.setHide(false); + meta.setName(rs.getStr("menu_name")); + meta.setAffix(false); + if (rs.getStr("menu_name").equals("首页")) { + meta.setAffix(true); + } + if (rs.get("is_full") == null || rs.getInt("is_full") == 0) { + meta.setFull(false); + } else { + meta.setFull(true); + } + + meta.setKeepAlive(true); + sMenu.setMeta(meta); + // 递归查找子菜单 + List childMenu = fetchMenu(rs.getInt("menu_id")); + sMenu.setChildren(childMenu); + res.add(sMenu); + } + return res; + } +} diff --git a/dsRes/src/main/java/com/dsideal/resource/ResApplication.java b/dsRes/src/main/java/com/dsideal/resource/ResApplication.java index a282e208..f2ec1bdc 100644 --- a/dsRes/src/main/java/com/dsideal/resource/ResApplication.java +++ b/dsRes/src/main/java/com/dsideal/resource/ResApplication.java @@ -1,7 +1,9 @@ package com.dsideal.resource; -import com.dsideal.resource.Controller.IndexController; +import com.dsideal.resource.Base.Controller.BaseController; +import com.dsideal.resource.Index.IndexController; import com.dsideal.resource.Interceptor.*; +import com.dsideal.resource.Menu.Controller.MenuController; import com.dsideal.resource.Plugin.YamlProp; import com.dsideal.resource.Util.FileUtil; import com.dsideal.resource.Util.LogBackLogFactory; @@ -57,6 +59,10 @@ public class ResApplication extends JFinalConfig { public void configRoute(Routes me) { //默认页面 me.add("/", IndexController.class); + //菜单 + me.add("/menu", MenuController.class); + //资源基础管理 + me.add("/base", BaseController.class); } @Override diff --git a/dsRes/src/main/java/com/dsideal/resource/Util/CommonUtil.java b/dsRes/src/main/java/com/dsideal/resource/Util/CommonUtil.java index 9af55160..c24ba5dd 100644 --- a/dsRes/src/main/java/com/dsideal/resource/Util/CommonUtil.java +++ b/dsRes/src/main/java/com/dsideal/resource/Util/CommonUtil.java @@ -284,7 +284,6 @@ public class CommonUtil { } - /** * 功能:验证是否为手机号 * 作者:吴缤 @@ -427,4 +426,5 @@ public class CommonUtil { return Pattern.matches(base64Rule, str); } + } diff --git a/dsRes/src/main/java/com/dsideal/resource/Util/RetKit.java b/dsRes/src/main/java/com/dsideal/resource/Util/RetKit.java new file mode 100644 index 00000000..9e299d4a --- /dev/null +++ b/dsRes/src/main/java/com/dsideal/resource/Util/RetKit.java @@ -0,0 +1,100 @@ +package com.dsideal.resource.Util; + +import com.jfinal.kit.StrKit; +import com.jfinal.plugin.activerecord.Page; +import com.jfinal.plugin.activerecord.Record; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RetKit { + + /** + * 按VUE的要求返回List数据格式 + *

+ * data: Map + */ + public static Map renderSuccess(List list) { + return renderSuccess(null, list, null, 0, 0, 0); + } + public static Map renderSuccess(String msg, List list) { + return renderSuccess(msg, list, null, 0, 0, 0); + } + public static Map renderSuccess(Page page) { + return renderSuccess(null, page.getList(), "list", page.getPageNumber(), page.getPageSize(), page.getTotalRow()); + } + + public static Map renderSuccess(String msg, Page page, String dataName) { + return renderSuccess(msg, page.getList(), dataName, page.getPageNumber(), page.getPageSize(), page.getTotalRow()); + } + + public static Map renderSuccess(String msg, Map map) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + rMap.put("data", map); + return rMap; + } + + public static Map renderSuccess(cn.hutool.json.JSONArray jsonArray) { + return renderSuccess(null, jsonArray); + } + + public static Map renderSuccess(String msg, cn.hutool.json.JSONArray jsonArray) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + rMap.put("data", jsonArray); + return rMap; + } + + public static Map renderSuccess(String msg, List list, String dataName, int pageNum, int pageSize, int total) { + Map rMap = new HashMap<>(); + rMap.put("code", 200); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + if (StrKit.isBlank(dataName)) { + //没有List的名称,直接把list放到data中,[]数组形式 + rMap.put("data", list); + } else { + //有List的名称,则把list放到data中,也需要把list的 size()做为一个属性,放到data上的count属性中 + Map _map = new HashMap<>(); + _map.put(dataName, list); + _map.put("total", list.size()); + if (pageNum > 0) { + _map.put("pageNum", pageNum); + } + if (pageSize > 0) { + _map.put("pageSize", pageSize); + } + if (total > 0) { + _map.put("total", total); + } + rMap.put("data", _map); + } + + return rMap; + } + + public static Map renderFail(String msg) { + return renderFail(msg, null); + } + + public static Map renderFail(String msg, Map map) { + Map rMap = new HashMap<>(); + rMap.put("code", 500); + if (!StrKit.isBlank(msg)) { + rMap.put("msg", msg); + } + if (map != null) { + rMap.put("data", map); + } + return rMap; + } +} diff --git a/dsRes/src/main/resource/Start.sh b/dsRes/src/main/resource/Start.sh new file mode 100644 index 00000000..25b5b05d --- /dev/null +++ b/dsRes/src/main/resource/Start.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# 容器名称 +CONTAINER_NAME=dsRes + +# 登录镜像仓库 +docker login --username=东师黄海 registry.cn-hangzhou.aliyuncs.com --password DsideaL4r5t6y7u +# 镜像名称 +IMAGE_NAME=registry.cn-hangzhou.aliyuncs.com/dsideal/ds_base:dev_20240924140624 + +# 删除容器 +docker rm -f ${CONTAINER_NAME} + +# 运行容器 +docker run -d --network=host --name "${CONTAINER_NAME}" \ +--privileged=true --env WORKING_ENV=dev -w /home -p 8002:8002 -v "$PWD/logs:/home/logs" --restart=always "${IMAGE_NAME}" + +# 查看日志 +docker logs -f --tail 500 "${CONTAINER_NAME}" diff --git a/dsRes/target/classes/SetMinioDownload.json b/dsRes/target/classes/SetMinioDownload.json new file mode 100644 index 00000000..5955e673 --- /dev/null +++ b/dsRes/target/classes/SetMinioDownload.json @@ -0,0 +1,18 @@ +{ + "Version": "2012-10-17", + "Statement": [{ + "Effect": "Allow", + "Principal": { + "AWS": ["*"] + }, + "Action": ["s3:GetBucketLocation", "s3:ListBucket"], + "Resource": ["arn:aws:s3:::dsideal"] + }, { + "Effect": "Allow", + "Principal": { + "AWS": ["*"] + }, + "Action": ["s3:GetObject"], + "Resource": ["arn:aws:s3:::dsideal/*"] + }] +} \ No newline at end of file diff --git a/dsRes/target/classes/Start.sh b/dsRes/target/classes/Start.sh new file mode 100644 index 00000000..25b5b05d --- /dev/null +++ b/dsRes/target/classes/Start.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# 容器名称 +CONTAINER_NAME=dsRes + +# 登录镜像仓库 +docker login --username=东师黄海 registry.cn-hangzhou.aliyuncs.com --password DsideaL4r5t6y7u +# 镜像名称 +IMAGE_NAME=registry.cn-hangzhou.aliyuncs.com/dsideal/ds_base:dev_20240924140624 + +# 删除容器 +docker rm -f ${CONTAINER_NAME} + +# 运行容器 +docker run -d --network=host --name "${CONTAINER_NAME}" \ +--privileged=true --env WORKING_ENV=dev -w /home -p 8002:8002 -v "$PWD/logs:/home/logs" --restart=always "${IMAGE_NAME}" + +# 查看日志 +docker logs -f --tail 500 "${CONTAINER_NAME}" diff --git a/dsRes/target/classes/application_ali.yaml b/dsRes/target/classes/application_ali.yaml new file mode 100644 index 00000000..0af87d49 --- /dev/null +++ b/dsRes/target/classes/application_ali.yaml @@ -0,0 +1,31 @@ +# 上传文件的临时路径 +uploadTempPath: /tmp +# JWT +SECRET: ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM +# 生成Token的密码 +CookieMd5SingPwd: DsideaL4r5t6y7u + +mysql: + # 数据库信息 + driverClassName: com.mysql.cj.jdbc.Driver + user: ylt + password: Ycharge666 + jdbcUrl : jdbc:mysql://rm-bp1ux6tuk49er80t9.mysql.rds.aliyuncs.com:3306/ds_db?useUnicode=true&characterEncoding=UTF-8 + + +redis: + ip: r-bp14c1p5j5lkpw1jc2.redis.rds.aliyuncs.com + port: 6379 + password: Ycharge666 + +# ============================================================== +jwt: + # 生成Token的密码 + CookieMd5SingPwd: DsideaL4r5t6y7u + +excel: + # 导出excel 的模板配置路径 + excelExportTemplatePathSuffix: /ExcelExportTemplate/ + # 导入excel 的模板配置路径 + ExcelImportTemplatePathSuffix: /ExcelImportTemplate/ + diff --git a/dsRes/target/classes/application_dev.yaml b/dsRes/target/classes/application_dev.yaml new file mode 100644 index 00000000..7673bd7f --- /dev/null +++ b/dsRes/target/classes/application_dev.yaml @@ -0,0 +1,28 @@ +# 上传文件的临时路径 +uploadTempPath: c:/Windows/Temp +# JWT +SECRET: ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM +# 生成Token的密码 +CookieMd5SingPwd: DsideaL4r5t6y7u + +mysql: + # 数据库信息 + driverClassName: com.mysql.cj.jdbc.Driver + user: root + password: DsideaL147258369 + jdbcUrl : jdbc:mysql://10.10.14.210:22066/ds_db?rewriteBatchedStatements=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + + +redis: + ip: 10.10.14.210 + port: 18890 + password: + +# ============================================================== + +excel: + # 导出excel 的模板配置路径 + excelExportTemplatePathSuffix: /ExcelExportTemplate/ + # 导入excel 的模板配置路径 + ExcelImportTemplatePathSuffix: /ExcelImportTemplate/ + diff --git a/dsRes/target/classes/application_pro.yaml b/dsRes/target/classes/application_pro.yaml new file mode 100644 index 00000000..c7378e3a --- /dev/null +++ b/dsRes/target/classes/application_pro.yaml @@ -0,0 +1,28 @@ +# 上传文件的临时路径 +uploadTempPath: /tmp +# JWT +SECRET: ZXZnZWVr5b+r5LmQ5L2g55qE5Ye66KGM +# 生成Token的密码 +CookieMd5SingPwd: DsideaL4r5t6y7u + +mysql: + # 数据库信息 + driverClassName: com.mysql.cj.jdbc.Driver + user: root + password: DsideaL147258369 + jdbcUrl : jdbc:mysql://10.10.14.210:22066/ds_db?rewriteBatchedStatements=true&useUnicode=true&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai + + +redis: + ip: 10.10.14.210 + port: 18890 + password: + +# ============================================================== + +excel: + # 导出excel 的模板配置路径 + excelExportTemplatePathSuffix: /ExcelExportTemplate/ + # 导入excel 的模板配置路径 + ExcelImportTemplatePathSuffix: /ExcelImportTemplate/ + diff --git a/dsRes/target/classes/log4j.properties b/dsRes/target/classes/log4j.properties new file mode 100644 index 00000000..625cca1e --- /dev/null +++ b/dsRes/target/classes/log4j.properties @@ -0,0 +1,12 @@ +log4j.rootLogger=WARN, console +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.conversionPattern=%5p [%t] (%F:%L) - %m%n + +log4j.appender.mq=org.apache.rocketmq.logappender.log4j.RocketmqLog4jAppender +log4j.appender.mq.Topic=TOPIC_MEIWEI_SMS_NOTICE_TEST +log4j.appender.mq.Tag=PID_MEIWEI_SMS_RETRY_TIMEOUT +log4j.appender.mq.ProducerGroup=meiwei-producer-retry +log4j.appender.mq.NameServerAddress=127.0.0.1:9876;127.0.0.1:9877 +log4j.appender.mq.layout=org.apache.log4j.PatternLayout +log4j.appender.mq.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-4r [%t] (%F:%L) % \ No newline at end of file diff --git a/dsRes/target/classes/logback.xml b/dsRes/target/classes/logback.xml new file mode 100644 index 00000000..2c24fb65 --- /dev/null +++ b/dsRes/target/classes/logback.xml @@ -0,0 +1,39 @@ + + + + + + + + + %date{yyyy-MM-dd HH:mm:ss.SSS} %boldYellow([%thread]) %highlight(%-5level) %boldGreen(%logger{40}) + - %msg%n + + + + + + ${LOG_HOME}/dsBase.log + + + ${LOG_HOME}/dsBase.log.%d{yyyy-MM-dd}.log + + 30 + + + + %date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} - %msg%n + + + + 100MB + + + + + + + + + + \ No newline at end of file diff --git a/dsRes/target/classes/logo.txt b/dsRes/target/classes/logo.txt new file mode 100644 index 00000000..b48587cd --- /dev/null +++ b/dsRes/target/classes/logo.txt @@ -0,0 +1,11 @@ + + $$\ $$$$$$$\ + $$ | $$ __$$\ + $$$$$$$ | $$$$$$$\ $$ | $$ | $$$$$$\ $$$$$$$\ +$$ __$$ |$$ _____|$$$$$$$ |$$ __$$\ $$ _____| +$$ / $$ |\$$$$$$\ $$ __$$< $$$$$$$$ |\$$$$$$\ +$$ | $$ | \____$$\ $$ | $$ |$$ ____| \____$$\ +\$$$$$$$ |$$$$$$$ |$$ | $$ |\$$$$$$$\ $$$$$$$ | + \_______|\_______/ \__| \__| \_______|\_______/ + +power by http://patorjk.com/software/taag/ \ No newline at end of file diff --git a/dsRes/target/classes/undertow_dev.properties b/dsRes/target/classes/undertow_dev.properties new file mode 100644 index 00000000..f3c54a2e --- /dev/null +++ b/dsRes/target/classes/undertow_dev.properties @@ -0,0 +1,34 @@ +# true 值支持热加载 +undertow.devMode=true +undertow.port=8002 +undertow.host=0.0.0.0 + +# 目录名称 +undertow.contextPath=/dsRes + +# 设定I/O线程数. +server.undertow.io-threads=8 + +# 设定工作线程数 +server.undertow.worker-threads=60 + +# 查询当前某程序的线程或进程数 +# yum install psmisc -y +# ps -e | grep java | awk '{print $1} +# pstree -p 15453 | wc -l + +# gzip 压缩开关 +undertow.gzip.enable=true +# 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度,9 拥有最高压缩率 +undertow.gzip.level=-1 +# 触发压缩的最小内容长度 +undertow.gzip.minLength=1024 + +# 开启access日志 +server.undertow.accesslog.enabled=true +server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms) + +# ssl 开启时,是否开启 http2。检测该配置是否生效在 chrome 地址栏中输入: chrome://net-internals/#http2 +#undertow.http2.enable=true + +#http://www.jfinal.com/doc/1-4 diff --git a/dsRes/target/classes/undertow_pro.properties b/dsRes/target/classes/undertow_pro.properties new file mode 100644 index 00000000..f3c54a2e --- /dev/null +++ b/dsRes/target/classes/undertow_pro.properties @@ -0,0 +1,34 @@ +# true 值支持热加载 +undertow.devMode=true +undertow.port=8002 +undertow.host=0.0.0.0 + +# 目录名称 +undertow.contextPath=/dsRes + +# 设定I/O线程数. +server.undertow.io-threads=8 + +# 设定工作线程数 +server.undertow.worker-threads=60 + +# 查询当前某程序的线程或进程数 +# yum install psmisc -y +# ps -e | grep java | awk '{print $1} +# pstree -p 15453 | wc -l + +# gzip 压缩开关 +undertow.gzip.enable=true +# 配置压缩级别,默认值 -1。 可配置 1 到 9。 1 拥有最快压缩速度,9 拥有最高压缩率 +undertow.gzip.level=-1 +# 触发压缩的最小内容长度 +undertow.gzip.minLength=1024 + +# 开启access日志 +server.undertow.accesslog.enabled=true +server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms) + +# ssl 开启时,是否开启 http2。检测该配置是否生效在 chrome 地址栏中输入: chrome://net-internals/#http2 +#undertow.http2.enable=true + +#http://www.jfinal.com/doc/1-4 diff --git a/操作文档/5、k8s集群.md b/操作文档/5、k8s集群.md index 579b5654..42339dcf 100644 --- a/操作文档/5、k8s集群.md +++ b/操作文档/5、k8s集群.md @@ -838,5 +838,12 @@ kubectl delete rs +``` +$kubectl create secret docker-registry \ +registry-secret-smokelee.com \ +--docker-server=registry.i.smokelee.com:5000 \ +--docker-username=opuser --docker-password=123 +``` +