Giter Club home page Giter Club logo

stylefeng / guns Goto Github PK

View Code? Open in Web Editor NEW
3.8K 208.0 1.6K 19.79 MB

Guns基于SpringBoot 2,致力于做更简洁的后台管理系统,完美整合springmvc + shiro + mybatis-plus + beetl!Guns项目代码简洁,注释丰富,上手容易,同时Guns包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架!

License: Apache License 2.0

Java 100.00%
gun beetl mybatis spring-boot springmvc-shiro-mybatis jwt mybatis-plus guns rest-api rest

guns's People

Contributors

18idc avatar akwangl avatar andychen93 avatar barca-lf avatar chenjinlong111111 avatar dony15 avatar guigui30000 avatar hanxiaodao avatar lee97 avatar lin6585121 avatar q18idc avatar shuqiteng avatar stylefeng avatar wison-j avatar wq404 avatar wuganzhi avatar xiaoweiming avatar xixiaowi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

guns's Issues

JS 为何要加密

assets/common/module/admin.js,
assets/common/js/common.js
不明白为何要加密?

关于guns日志方面的一些建议

现有情况:

目前项目的后台部分使用的是guns框架,在业务日志方面体验并不是很好,

  1. 对于添加、删除方面不能完全显示相关数据,及XXXDict未配置的情况下会出现null=1、null=XXX部门)
  2. 而且每一次都要写XXXDict可以说是很麻烦了。

改进建议:

项目目前已经将1部分自修改了,
关于2部分,建议采用以数据库中COMMENT部分作为XXXDict中的中文名称,COMMENT为(性别,0为男,1为女),则以性别为中文名(以第一个逗号前部分为显示的中文名),除了配置过的字段外,其他默认采用数据库中的COMMENT。

Unnecessary subquery in DeptMapper.list

The following query defined in DeptMapper.xml is not optimal:

    <select id="list" resultType="map">
        select
...
        from sys_dept where 1 = 1
...
        <if test="deptId != null and deptId != ''">
            and (dept_id = #{deptId} or dept_id in ( select dept_id from sys_dept where pids like CONCAT('%$[', #{deptId}, '$]%') escape '$' ))
        </if>
        order by sort ASC
    </select>

The sub-query could be eliminated and changes to a predicate on pids.

and (dept_id = #{deptId} or pids like CONCAT('%$[', #{deptId}, '$]%') escape '$')

关于 PermissionAop.doPermission 抛出javax.naming.NoPermissionException 异常 问题

`
//检查指定角色
boolean result = check.check(permissions);
if (result) {
return point.proceed();
} else {
throw new NoPermissionException();
}

`
抛出的 NoPermissionException 为: javax.naming.NoPermissionException
其继承关系树为javax.naming.NoPermissionException->NamingSecurityException->NamingException->Exception
而在GlobalExceptionHandler 中没有找到对改异常的统一处理操作

同时UndeclaredThrowableException 并非与 上面关系树 有上下关系
/** * 无权访问该资源异常 */ @ExceptionHandler(UndeclaredThrowableException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) @ResponseBody public ErrorResponseData credentials(UndeclaredThrowableException e) { getRequest().setAttribute("tip", "权限异常"); log.error("权限异常!", e); return new ErrorResponseData(BizExceptionEnum.NO_PERMITION.getCode(), BizExceptionEnum.NO_PERMITION.getMessage()); }

关于 aop 中 throw NoPermissionException 的处理 how?
请指教!

Unnecessary subquery in MenuMapper.selectMenus

The following query defined in MenuMapper.xml is not optimal:

    <select id="selectMenus" resultType="map">
        select
        <include refid="Base_Column_List"/>
        from sys_menu
...
        <if test="menuId != null and menuId != 0">
            and (menu_id = #{menuId} or menu_id in ( select menu_id from sys_menu where pcodes like CONCAT('%$[', #{code}, '$]%') escape '$' ))
        </if>
    </select>

The sub-query could be eliminated and changes to a predicate on pcodes.

and (menu_id = #{menuId} or pcodes like CONCAT('%$[', #{code}, '$]%') escape '$' )

多数据源 sqlsession not registered

Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6d555337] was not registered for synchronization because synchronization is not active JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@26425897] will not be managed by Spring JsqlParserCountOptimize sql=select notice_id AS "noticeId", title AS "title", content AS "content", create_time AS "createTime", create_user AS "createUser", update_time AS "updateTime", update_user AS "updateUser" from sys_notice order by create_time DESC Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6d555337]

请问这个需要修改哪些配置 @stylefeng

bootstrap-table-object.js中增加参数sortName用于设置排序列

/**

  • 初始化 BootStrap Table 的封装

  • 约定:toolbar的id为 (bstableId + "Toolbar")

  • @author fengshuonan
    */
    (function () {
    var BSTable = function (bstableId, url, columns) {
    this.btInstance = null; //jquery和BootStrapTable绑定的对象
    this.bstableId = bstableId;
    this.url = Feng.ctxPath + url;
    this.method = "post";
    this.paginationType = "server"; //默认分页方式是服务器分页,可选项"client"
    this.toolbarId = bstableId + "Toolbar";
    this.columns = columns;
    this.height = 665; //默认表格高度665
    this.data = {};
    this.queryParams = {}; // 向后台传递的自定义参数
    this.sortName; //设置排序列
    };

    BSTable.prototype = {
    /**
    * 初始化bootstrap table
    /
    init: function () {
    var tableId = this.bstableId;
    var me = this;
    this.btInstance =
    $('#' + tableId).bootstrapTable({
    contentType: "application/x-www-form-urlencoded",
    url: this.url, //请求地址
    method: this.method, //ajax方式,post还是get
    ajaxOptions: { //ajax请求的附带参数
    data: this.data
    },
    toolbar: "#" + this.toolbarId,//顶部工具条
    striped: true, //是否显示行间隔色
    cache: false, //是否使用缓存,默认为true
    pagination: true, //是否显示分页(

    sortName:this.sortName,
    sortable: true, //是否启用排序
    sortOrder: "desc", //排序方式
    pageNumber: 1, //初始化加载第一页,默认第一页
    pageSize: 14, //每页的记录行数(
    pageList: [14, 50, 100], //可供选择的每页的行数(

    queryParamsType: 'limit', //默认值为 'limit' ,在默认情况下 传给服务端的参数为:offset,limit,sort
    queryParams: function (param) {
    return $.extend(me.queryParams, param);
    }, // 向后台传递的自定义参数
    sidePagination: this.paginationType, //分页方式:client客户端分页,server服务端分页(*)
    search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端
    strictSearch: true, //设置为 true启用 全匹配搜索,否则为模糊搜索
    showColumns: true, //是否显示所有的列
    showRefresh: true, //是否显示刷新按钮
    minimumCountColumns: 2, //最少允许的列数
    clickToSelect: true, //是否启用点击选中行
    searchOnEnterKey: true, //设置为 true时,按回车触发搜索方法,否则自动触发搜索方法
    columns: this.columns, //列数组
    pagination: true, //是否显示分页条
    height: this.height,
    icons: {
    refresh: 'glyphicon-repeat',
    toggle: 'glyphicon-list-alt',
    columns: 'glyphicon-list'
    },
    iconSize: 'outline'
    });
    return this;
    },
    /**
    * 向后台传递的自定义参数
    * @param param
    /
    setQueryParams: function (param) {
    this.queryParams = param;
    },
    /
    *
    * 设置分页方式:server 或者 client
    /
    setPaginationType: function (type) {
    this.paginationType = type;
    },
    /
    *
    * 设置排序列名
    */
    setSortName: function (sortName) {
    this.sortName = sortName;
    },

     /**
      * 设置ajax post请求时候附带的参数
      */
     set: function (key, value) {
         if (typeof key == "object") {
             for (var i in key) {
                 if (typeof i == "function")
                     continue;
                 this.data[i] = key[i];
             }
         } else {
             this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
         }
         return this;
     },
    
     /**
      * 设置ajax post请求时候附带的参数
      */
     setData: function (data) {
         this.data = data;
         return this;
     },
    
     /**
      * 清空ajax post请求参数
      */
     clear: function () {
         this.data = {};
         return this;
     },
    
     /**
      * 刷新 bootstrap 表格
      * Refresh the remote server data,
      * you can set {silent: true} to refresh the data silently,
      * and set {url: newUrl} to change the url.
      * To supply query params specific to this request, set {query: {foo: 'bar'}}
      */
     refresh: function (parms) {
         if (typeof parms != "undefined") {
             this.btInstance.bootstrapTable('refresh', parms);
         } else {
             this.btInstance.bootstrapTable('refresh');
         }
     }
    

    };

    window.BSTable = BSTable;

}());

根目录的pom.xml依赖的顺序是否写错了?

根目录pom.xml的大部分依赖都写在spring-boot-dependencies之后,根据官网描述的

To achieve the same result, you need to add an entry in the dependencyManagement of your project before the spring-boot-dependencies entry.

放在后面应该不生效了吧

Unnecessary inner join for MenuMapper.getMenusByRoleIds

The following query defined in MenuMapper.xml is not optimal:

    <select id="getMenusByRoleIds" resultType="cn.stylefeng.guns.base.pojo.node.MenuNode">
        SELECT
        m1.menu_id AS id,
        m1.code AS code,
        m1.icon AS icon,
        (
        CASE
        WHEN (m2.menu_id = 0 OR m2.menu_id IS NULL) THEN
        0
        ELSE
        m2.menu_id
        END
        ) AS "parentId",
        m1.name as name,
        m1.url as url,
        m1.levels as levels,
        m1.menu_flag as ismenu,
        m1.system_type as systemType,
        m1.sort as num
        FROM
        sys_menu m1
        LEFT join sys_menu m2 ON m1.pcode = m2.code
        INNER JOIN (
        SELECT
        menu_id
        FROM
        sys_menu
        WHERE
        menu_id IN (
        SELECT
        menu_id
        FROM
        sys_relation rela
        WHERE
        rela.role_id IN
        <foreach collection="list" index="index" item="i" open="(" separator="," close=")">
            #{i}
        </foreach>
        )
        ) m3 ON m1.menu_id = m3.menu_id
        where m1.menu_flag = 'Y'
        order by levels,m1.sort asc
    </select>

The INNER JOIN for m3 is unnecessary and could be optimized out to the following:

    <select id="getMenusByRoleIds" resultType="cn.stylefeng.guns.base.pojo.node.MenuNode">
        SELECT
        m1.menu_id AS id,
        m1.code AS code,
        m1.icon AS icon,
        (
        CASE
        WHEN (m2.menu_id = 0 OR m2.menu_id IS NULL) THEN
        0
        ELSE
        m2.menu_id
        END
        ) AS "parentId",
        m1.name as name,
        m1.url as url,
        m1.levels as levels,
        m1.menu_flag as ismenu,
        m1.system_type as systemType,
        m1.sort as num
        FROM
        sys_menu m1
        LEFT join sys_menu m2 ON m1.pcode = m2.code
        where m1.menu_flag = 'Y' and
        m1.menu_id IN (
            SELECT menu_id FROM sys_relation rela WHERE rela.role_id IN
                <foreach collection="list" index="index" item="i" open="(" separator="," close=")">
                    #{i}
                </foreach>
        )
        order by levels,m1.sort asc
    </select>

二次开发问题。

其实感觉项目还是有问题的,假如我要开发一个博客模块,后台要维护博客模块,前台要rest api做服务,那么我的模块怎么放啊?难道rest模块和admin模块都要拷贝一份dao service ..的业务代码吗?

beetl定界符怎么配置的?

  • 我看模板里用的定界符是“@”,在哪配置的啊,yml里只配置了 resource-auto-check
  • 其他的Java配置文件中也没有找到

navbar 层级

左边的navbar 是不是最多不能超过三层,我这边超过三层的都不显示。

Controller里如何使用beetl

自己试着在controller用FileResourceLoader加载了html模板文件,在java端template.binding("xxx", "xxxx"),但是在html不能使用${xxx}来引用,报错为xxx变量未定义,求解

请修改Shiro反序列化漏洞

@Bean public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) { CookieRememberMeManager manager = new CookieRememberMeManager(); manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA==")); manager.setCookie(rememberMeCookie); return manager; }
此处将秘钥硬编码进去
http://www.sohu.com/a/284726504_727010

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.