Browse Source

add:swagger / add:jboot wechat demo / 优化代码

Rlax 8 years ago
parent
commit
8e12986bdd

+ 2 - 2
README.md

@@ -9,7 +9,7 @@
 ### 技术选型
 
  - 核心框架:jboot 1.2.8
- - 模版引擎:jfinal enjoy 
+ - 模版引擎:jfinal 3.3
  - 注册中心:consul/zookeeper
  - RPC:motan/dubbo
  - RPC治理:motan-manager
@@ -18,7 +18,7 @@
  - 容错隔离:hystrix
  - 调用监控:hystrix-dashboard
  - 链路跟踪:zipkin
- - 页面ui:layui
+ - 页面ui:layui 2.2.5
 
 ### 模块说明
 

+ 3 - 3
jboot-admin-base/src/main/java/io/jboot/admin/base/interceptor/BusinessExceptionInterceptor.java

@@ -3,8 +3,8 @@ package io.jboot.admin.base.interceptor;
 import com.jfinal.aop.Interceptor;
 import com.jfinal.aop.Invocation;
 import io.jboot.admin.base.common.RestResult;
-import io.jboot.admin.base.web.base.BaseController;
 import io.jboot.exception.JbootException;
+import io.jboot.web.controller.JbootController;
 
 /**
  * 业务异常拦截器
@@ -28,8 +28,8 @@ public class BusinessExceptionInterceptor implements Interceptor {
 		try {
 			inv.invoke();
 		} catch (JbootException e) {
-			if (inv.getTarget() instanceof BaseController) {
-				BaseController controller = inv.getTarget();
+			if (inv.getTarget() instanceof JbootController) {
+				JbootController controller = inv.getTarget();
 
 				if (controller.isAjaxRequest()) {
 					RestResult<String> restResult = new RestResult<String>();

+ 3 - 3
jboot-admin-base/src/main/java/io/jboot/admin/base/interceptor/NotNullParaInterceptor.java

@@ -4,9 +4,9 @@ import com.jfinal.aop.Interceptor;
 import com.jfinal.aop.Invocation;
 import com.jfinal.core.Controller;
 import io.jboot.admin.base.common.RestResult;
-import io.jboot.admin.base.web.base.BaseController;
 import io.jboot.utils.ArrayUtils;
 import io.jboot.utils.StringUtils;
+import io.jboot.web.controller.JbootController;
 
 import java.lang.reflect.Method;
 
@@ -59,8 +59,8 @@ public class NotNullParaInterceptor implements Interceptor {
         }
 
         Controller controller = inv.getController();
-        if (controller instanceof BaseController) {
-            BaseController jc = (BaseController) controller;
+        if (controller instanceof JbootController) {
+            JbootController jc = (JbootController) controller;
             if (jc.isAjaxRequest()) {
                 jc.renderJson(RestResult.buildError("参数["+param+"]不可为空"));
                 return;

+ 2 - 2
jboot-admin-service/jboot-admin-service-provider/src/main/resources/jboot.properties

@@ -25,7 +25,7 @@ jboot.cron4jFile=cron4j.properties
 #type default undertow (support:undertow)
 jboot.server.type=undertow
 jboot.server.host=
-jboot.server.port=9002
+jboot.server.port=9001
 jboot.server.contextPath=
 #---------------------------------------------------------------------------------#
 
@@ -67,7 +67,7 @@ jboot.rpc.registryUserName
 jboot.rpc.registryPassword
 #rpc service config
 jboot.rpc.host=127.0.0.1
-jboot.rpc.defaultPort=9013
+jboot.rpc.defaultPort=9011
 jboot.rpc.defaultGroup=system-service
 jboot.rpc.defaultVersion=1.0
 jboot.rpc.proxy

+ 9 - 1
jboot-admin/src/main/java/io/jboot/admin/config/JfinalConfigListener.java

@@ -8,6 +8,8 @@ import com.jfinal.config.Routes;
 import com.jfinal.ext.handler.ContextPathHandler;
 import com.jfinal.json.JFinalJsonFactory;
 import com.jfinal.template.Engine;
+import com.jfinal.weixin.sdk.api.ApiConfig;
+import com.jfinal.weixin.sdk.api.ApiConfigKit;
 import io.jboot.Jboot;
 import io.jboot.admin.base.captcha.CaptchaCache;
 import io.jboot.admin.base.common.AppInfo;
@@ -22,6 +24,7 @@ import io.jboot.server.ContextListeners;
 import io.jboot.server.JbootServer;
 import io.jboot.server.Servlets;
 import io.jboot.server.listener.JbootAppListenerBase;
+import io.jboot.wechat.JbootWechatConfig;
 
 /**
  * jfinal config
@@ -36,7 +39,6 @@ public class JfinalConfigListener extends JbootAppListenerBase {
         constants.setError404View("/template/404.html");
         constants.setError500View("/template/500.html");
         constants.setRenderFactory(new AppRenderFactory());
-        constants.setJsonFactory(new JFinalJsonFactory());
     }
 
     @Override
@@ -72,6 +74,12 @@ public class JfinalConfigListener extends JbootAppListenerBase {
 
     @Override
     public void onJFinalStarted() {
+        JbootWechatConfig wechatConfig = Jboot.config(JbootWechatConfig.class);
+        ApiConfig apiConfig = new ApiConfig();
+        apiConfig.setAppId(wechatConfig.getAppId());
+        apiConfig.setAppSecret(wechatConfig.getAppSecret());
+        apiConfig.setToken(wechatConfig.getToken());
+        ApiConfigKit.putApiConfig(apiConfig);
     }
 
     @Override

+ 8 - 0
jboot-admin/src/main/java/io/jboot/admin/controller/system/ResController.java

@@ -15,8 +15,13 @@ import io.jboot.admin.service.entity.model.Res;
 import io.jboot.admin.service.entity.status.system.ResStatus;
 import io.jboot.admin.support.auth.AuthUtils;
 import io.jboot.admin.validator.system.ResValidator;
+import io.jboot.component.swagger.ParamType;
 import io.jboot.core.rpc.annotation.JbootrpcService;
 import io.jboot.web.controller.annotation.RequestMapping;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 
 import java.util.*;
 
@@ -27,6 +32,7 @@ import java.util.*;
  *
  */
 @RequestMapping("/system/res")
+@Api(description = "资源管理接口文档", basePath = "/system/res", tags = "res")
 public class ResController extends BaseController {
 
     @JbootrpcService
@@ -217,6 +223,7 @@ public class ResController extends BaseController {
     /**
      * res表格数据
      */
+    @ApiOperation(value = "表格数据", httpMethod = "GET", notes = "resData")
     public void resData() {
         int pageNumber = getParaToInt("pageNumber", 1);
         int pageSize = getParaToInt("pageSize", 30);
@@ -233,6 +240,7 @@ public class ResController extends BaseController {
     /**
      * 系统顶部菜单
      */
+    @ApiOperation(value = "顶部菜单", httpMethod = "GET", notes = "menuTop")
     public void menuTop() {
         List<Res> list = resService.findTopMenuByUserName(AuthUtils.getLoginUser().getName());
 

+ 38 - 0
jboot-admin/src/main/java/io/jboot/admin/controller/wechat/UserController.java

@@ -0,0 +1,38 @@
+package io.jboot.admin.controller.wechat;
+
+import com.jfinal.kit.JsonKit;
+import com.jfinal.weixin.sdk.api.ApiResult;
+import io.jboot.web.controller.annotation.RequestMapping;
+import io.jboot.wechat.controller.JbootWechatController;
+
+/**
+ *
+ * @author Rlax
+ *
+ */
+@RequestMapping("/wechat/user")
+public class UserController extends JbootWechatController {
+
+    /**
+     * index
+     */
+    public void index() {
+        String userJson = (String) getSessionAttr(SESSION_WECHAT_USER_JSON);
+        System.out.println(userJson);
+        renderJson(userJson);
+    }
+
+    @Override
+    public Object doGetUserByOpenId(String openid) {
+        // 根据自己需求扩展,可以根据openId 得到内部用户
+        System.out.println(openid);
+        return null;
+    }
+
+    @Override
+    public Object doSaveOrUpdateUserByApiResult(ApiResult apiResult) {
+        // 根据自己需求扩展,比如保存微信用户信息,与内部用户做关联
+        System.out.println(JsonKit.toJson(apiResult));
+        return apiResult;
+    }
+}

+ 34 - 0
jboot-admin/src/main/java/io/jboot/admin/controller/wechat/WeixinMsgController.java

@@ -0,0 +1,34 @@
+package io.jboot.admin.controller.wechat;
+
+import com.jfinal.weixin.sdk.jfinal.MsgControllerAdapter;
+import com.jfinal.weixin.sdk.msg.in.InTextMsg;
+import com.jfinal.weixin.sdk.msg.in.event.InFollowEvent;
+import com.jfinal.weixin.sdk.msg.in.event.InMenuEvent;
+import com.jfinal.weixin.sdk.msg.out.OutTextMsg;
+import io.jboot.web.controller.annotation.RequestMapping;
+
+@RequestMapping("/wechat/msg")
+public class WeixinMsgController extends MsgControllerAdapter {
+
+    /**
+     * 处理接收到的关注/取消关注事件
+     */
+    @Override
+    protected void processInFollowEvent(InFollowEvent inFollowEvent) {
+        OutTextMsg outMsg = new OutTextMsg(inFollowEvent);
+        outMsg.setContent("欢迎关注!");
+        render(outMsg);
+    }
+
+    @Override
+    protected void processInTextMsg(InTextMsg inTextMsg) {
+        renderOutTextMsg("感谢您的关注!小编已经收到您的消息,并将尽快通过微信与您取得联系。");
+    }
+
+    @Override
+    protected void processInMenuEvent(InMenuEvent inMenuEvent) {
+
+    }
+
+}
+

+ 25 - 1
jboot-admin/src/main/resources/jboot.properties

@@ -75,6 +75,19 @@ jboot.rpc.serialization=fst
 #---------------------------------------------------------------------------------#
 
 #---------------------------------------------------------------------------------#
+# swagger config
+jboot.swagger.path=/swaggerui
+jboot.swagger.title=jboot-admin API
+jboot.swagger.description=jboot-admin API
+jboot.swagger.version=1.0
+jboot.swagger.termsOfService=https://gitee.com/rlaxuc/jboot-admin
+jboot.swagger.contactEmail=rlaxuc@gmail.com
+jboot.swagger.contactName=Rlax
+jboot.swagger.contactUrl=https://gitee.com/rlaxuc/jboot-admin
+jboot.swagger.host=127.0.0.1:8888
+#---------------------------------------------------------------------------------#
+
+#---------------------------------------------------------------------------------#
 jboot.config.remoteEnable=false
 jboot.config.remoteUrl
 #作为配置中心
@@ -106,4 +119,15 @@ jboot.mq.redis.port=6379
 jboot.mq.redis.password=123456
 jboot.mq.redis.channel=message-channel
 jboot.mq.redis.database=0
-#---------------------------------------------------------------------------------#
+#---------------------------------------------------------------------------------#
+
+#---------------------------------------------------------------------------------#
+# wechat config
+jboot.wechat.debug=true
+jboot.wechat.appId=__your___appId________
+jboot.wechat.appSecret=____your___appSecret_____
+jboot.wechat.token=123456
+jboot.wechat.partner=
+jboot.wechat.paternerKey=
+jboot.wechat.cert=
+#---------------------------------------------------------------------------------#

+ 5 - 0
jboot-admin/src/main/resources/shiro.ini

@@ -73,8 +73,13 @@ character=io.jboot.admin.base.plugin.shiro.CharacterEncodingFilter
 /postLogin =  anon
 /favicon.ico = anon
 
+#doc
+/swaggerui/** = anon
+
 ##API
 /hystrix.stream = anon
 /metrics = anon
 /test = anon
+/wechat/**  =anon
+
 /**= character,authc

BIN
jboot-admin/src/main/resources/swaggerui/favicon-16x16.png


BIN
jboot-admin/src/main/resources/swaggerui/favicon-32x32.png


+ 94 - 0
jboot-admin/src/main/resources/swaggerui/index.html

@@ -0,0 +1,94 @@
+<!-- HTML for static distribution bundle build -->
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <title>Swagger UI</title>
+  <link rel="stylesheet" type="text/css" href="./swagger-ui.css" >
+  <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" />
+  <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" />
+  <style>
+    html
+    {
+      box-sizing: border-box;
+      overflow: -moz-scrollbars-vertical;
+      overflow-y: scroll;
+    }
+    *,
+    *:before,
+    *:after
+    {
+      box-sizing: inherit;
+    }
+
+    body {
+      margin:0;
+      background: #fafafa;
+    }
+  </style>
+</head>
+
+<body>
+
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
+  <defs>
+    <symbol viewBox="0 0 20 20" id="unlocked">
+          <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="locked">
+      <path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="close">
+      <path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="large-arrow">
+      <path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 20 20" id="large-arrow-down">
+      <path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z"/>
+    </symbol>
+
+
+    <symbol viewBox="0 0 24 24" id="jump-to">
+      <path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z"/>
+    </symbol>
+
+    <symbol viewBox="0 0 24 24" id="expand">
+      <path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z"/>
+    </symbol>
+
+  </defs>
+</svg>
+
+<div id="swagger-ui"></div>
+
+<script src="./swagger-ui-bundle.js"> </script>
+<script src="./swagger-ui-standalone-preset.js"> </script>
+<script>
+window.onload = function() {
+  
+  // Build a system
+  const ui = SwaggerUIBundle({
+    url: "http://petstore.swagger.io/v2/swagger.json",
+    dom_id: '#swagger-ui',
+    deepLinking: true,
+    presets: [
+      SwaggerUIBundle.presets.apis,
+      SwaggerUIStandalonePreset
+    ],
+    plugins: [
+      SwaggerUIBundle.plugins.DownloadUrl
+    ],
+    layout: "StandaloneLayout"
+  })
+
+  window.ui = ui
+}
+</script>
+</body>
+
+</html>

+ 60 - 0
jboot-admin/src/main/resources/swaggerui/oauth2-redirect.html

@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en-US">
+<body onload="run()">
+</body>
+</html>
+<script>
+    'use strict';
+    function run () {
+        var oauth2 = window.opener.swaggerUIRedirectOauth2;
+        var sentState = oauth2.state;
+        var redirectUrl = oauth2.redirectUrl;
+        var isValid, qp, arr;
+
+        if (/code|token|error/.test(window.location.hash)) {
+            qp = window.location.hash.substring(1);
+        } else {
+            qp = location.search.substring(1);
+        }
+
+        arr = qp.split("&")
+        arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';})
+        qp = qp ? JSON.parse('{' + arr.join() + '}',
+                function (key, value) {
+                    return key === "" ? value : decodeURIComponent(value)
+                }
+        ) : {}
+
+        isValid = qp.state === sentState
+
+        if ((
+          oauth2.auth.schema.get("flow") === "accessCode"||
+          oauth2.auth.schema.get("flow") === "authorizationCode"
+        ) && !oauth2.auth.code) {
+            if (!isValid) {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "warning",
+                    message: "Authorization may be unsafe, passed state was changed in server Passed state wasn't returned from auth server"
+                });
+            }
+
+            if (qp.code) {
+                delete oauth2.state;
+                oauth2.auth.code = qp.code;
+                oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl});
+            } else {
+                oauth2.errCb({
+                    authId: oauth2.auth.name,
+                    source: "auth",
+                    level: "error",
+                    message: "Authorization failed: no accessCode received from the server"
+                });
+            }
+        } else {
+            oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl});
+        }
+        window.close();
+    }
+</script>

File diff suppressed because it is too large
+ 125 - 0
jboot-admin/src/main/resources/swaggerui/swagger-ui-bundle.js


File diff suppressed because it is too large
+ 13 - 0
jboot-admin/src/main/resources/swaggerui/swagger-ui-standalone-preset.js


File diff suppressed because it is too large
+ 2 - 0
jboot-admin/src/main/resources/swaggerui/swagger-ui.css


File diff suppressed because it is too large
+ 8 - 0
jboot-admin/src/main/resources/swaggerui/swagger-ui.js