美文网首页
guns框架使用日记

guns框架使用日记

作者: Kenny_Yu | 来源:发表于2018-09-09 10:30 被阅读0次

    如果要使用日期类型

    需要在html最下面script中写入

    <script>

        laydate.render({

                elem:'#控件id'

        });

    </script>

    添加数据功能

    数据库id要为bigint类型

    实体类的id添加下面注释

    @TableId(value ="id", type = IdType.ID_WORKER) 就可以自动生成id

    删除功能

    首先获取选取的行 然后在行[0]获取id  再根据这个id传给后台进行删除 传入时id为String类型  后台需要将他转为Long类型

    修改功能

        还是首先获取选取的行 然后在行[0]获取id,然后将这个id传给后台跳转页面的接口,根据这个id可以动态生成页面,生成的页面数据就是选中的数据,然后修改后提交给后台,通过input id="id" value="${item.id}" type="hidden"传入id

    前台日历时间和后台数据库时间不一致

    修改后台yml配置文件的连接数据库url     serverTimezone=Hongkong

    面对不同开发环境可以通过

    ---来进行分割  这是spring profiles的功能

    Wrapper初步理解

        首先controller层查询数据后必须是List<Map<String,Object>>或者Map<String,Object>类型,然后给自定义的一个Wrapper包装

        自定义的Wrapper要继承extends BaseControllerWarpper  然后构造函数中

    public UserWarpper(List> list) {

        super(list);

    }  让父类去处理

        然后重写warpTheMap的方法,自己进行包装

    比如

    map.put("sexName", ConstantFactory.me().getSexName((Integer) map.get("sex")));

    sexName:经过包装后的Map Key

    sex:数据库列的名字,通过这个名字去字典查找相应的值

    在IConstaantFactory接口类中写这个获取值的方法

    然后在ConstaantFactory类中写实现刚刚的那个方法,在这个方法中调用

    return getDictsByName("性别", sex);  意思就是在字典中查找对应的值

    第一个参数写类型,第二个参数写的是值 比如 性别:1  然后就能返回相应的中文字段了

    创建一个字典映射类

    目前好像只用在日志记录中

    创建一个类如UserDict 继承 AbstractDictMap

    重写他的init方法 在里面写

    put(字段名,对用中文名中文)

    initBeWrapped方法

    用于存放些某些需要字典翻译的字段名

    如:

    putFieldWrapperMethodName(sex,getSexName)

    因为 sex 1对应男 2对应女 这种字段就需写在initBeWrapped中

    业务日志功能

    在Controller层中添加

    @BussinessLog注解(value="业务名称",key="用来唯一标识,当一个不能标识的时候可以填两个",dict="UserDict,class") 字典用于查找某些值对应的中文名称

    key的值和UserDict里面的属性值想对应

    GUNS中使用SWAGGER

    只需要在控制层里面得方法中添加@ApiOperation("添加订单")注解就可以了

    @RequestParam 对应得paramType="querry"

    @PathVariable 对应得paramType="path"

    @RequestBody 对应得paramType="body"

    获取登陆用户信息

    ShiroUser user = ShiroKit.getUser();


    @Permission

    不加参数就是按正常权限来看能否访问

    这个正常权限是检测你请求的路径有没有你的权限

    @Permission(参数)

    里面的参数是什么就是什么角色可以访问

    就是角色管理里面的别名

    如果想自定义权限 需要在Const接口类中添加常量


    ${tips!}

    tips是后端model传入的值 在前台页面如果为空则不显示 

    Guns框架使用的表单验证是写在js的  用的是bootstrapValidator.js

    第一步

    在info.js中

    InfoDlg中

    :validateFields: {

        account: {

            validators: {

                notEmpty: {

                    message:'账户不能为空'

                                   }

                                  }

                           }

    }

    添加需要验证的字段

    第二步:

    /**

    * 验证数据是否为空

    */

    MyOrderInfoDlg.validate =function () {

    $('#MyOrderInfoForm').data("bootstrapValidator").resetForm();

        $('#MyOrderInfoForm').bootstrapValidator('validate');

        return $("#MyOrderInfoForm").data('bootstrapValidator').isValid();

    };

    MyOrderInfoForm:是需验证表单的id

    第三步:

    在ajax请求中

    if (!this.validate()) {

    return;

    }

    开启验证

    第四步:

    $(function() {

    Feng.initValidator("MyOrderInfoForm", MyOrderInfoDlg.validateFields);

    });

    初始化验证

    https://blog.csdn.net/asd245025733/article/details/78061577?locationNum=7&fps=1

    这个博客说明了各种验证的方法.

    想使用不同模板

    重新创建一个模板文件  重新创建一个TemplateEngine类 修改对应的模板路径

    最后在AbstractGeneratorConfig的doGunsGeneration方法中将GunsTemplateEngine改为你自己的模板引擎

    动态查询功能

    1.在html页面中增加输入框

    如:

    <div class="col-sm-3">

        <#NameCon id="goodsid" name="订单id" />

    </div>

    2.在js文件下的search方法中获取输入框对应的值

    如:

    queryData['goodsid'] =$("#goodsid").val();

    3.在后台方面,在控制层参数上添加@RequestParam(required =false) String goodsid获取对应的值

    4.新建一个实体Wrapper对象

    如:

    EntityWrapper myOrderEntityWrapper=new EntityWrapper<>();

    5.判断每个查询条件是否为空,若不为空则:

    myOrderEntityWrapper.like("id",goodsid);

    6.最后返回查询数据

    return secondService.selectList(myOrderEntityWrapper);

    数据范围

    myOrderEntityWrapper.in("deptid",ShiroKit.getDeptDataScope());

    思路:前台不传入deptid,后台获取当前用户的deptid

    test.setDeptid(ShiroKit.getUser().deptId);就可以了

    事务

    事务的四个特性

    原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。

    一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。

    隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。

    持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。

    隔离性

    如果不考虑隔离性产生的三种后果:

    1.脏读:在一个事务中,读取了另一个未提交事务中的数据.

    2.不可重复读:一个事务范围内多次查询,返回了不同数据值(由于在查询间隔被另一个事务修改了)

    3.幻读:一个事务批量修改表中的所有数据,这时另一个事务往表里新增了一条记录,导致第一个事务发现修改完之后落了一条,就跟产生幻觉一样.

    Mysql提供的四种隔离级别

    isolation=Isolation.DEFAULT

    Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

    Repeatable read (可重复读):可避免脏读、不可重复读的发生(默认的隔离级别) 。(默认)

    Read committed (读已提交):可避免脏读的发生。

    Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    然级别越高,执行效率就越低。

    传播行为

    propagation=Propagation.REQUIRED

    当事务方法被另一个事务方法调用时,须指定事务应该如何传播。

    事务的传播行为:

    PROPAGATION_REQUIRED--表示当前方法必须运行在事务中。如果当前事务存在,方法将会在该事务中运行。否则,会启动一个新的事务(默认)

    PROPAGATION_SUPPORTS--表示当前方法不需要事务,但是如果存在当前事务的话,那么该方法会在这个事务中运行,如果当前没有事务,就以非事务方式执行。

    PROPAGATION_MANDATORY--表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常。

    PROPAGATION_REQUIRES_NEW--表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起。

    PROPAGATION_NOT_SUPPORTED--表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起。

    PROPAGATION_NEVER--表示当前方法不应该运行在事务上下文中。如果当前正有一个事务在运行,则会抛出异常

    PROPAGATION_NESTED--一个事务内部嵌套事务的执行不会影响外部事务,但外部事务的执行要影响内部

    REST框架使用流程

        先访问auth接口获得随机字符串和token

        客户端通过这个随机字符串当作盐先将要发送的数据转化为json,在进行base64加密,在进行md5加密获得对象和签名.

        客户端再访问hello接口,在body当中传入刚刚生成的object和sign  要以raw和json的形式发送,在请求头上

    添加Authorization:Bearer+刚刚从auth获取的token值

    例如:Bearer eyJhbGciOiJIUzUxMiJ9.eyJyYW5kb21LZXkiOiIzbmhhZ20iLCJzdWIiOiJhZG1pbiIsImV4cCI6MTUzNzg3NzM3OCwiaWF0IjoxNTM3MjcyNTc4fQ.slc5CDGe1Py6Ieo86fpQHlEIQhX8Um3la4z6OnJxVDQHCd_QATMbwvG_ORqJpx3UEFX10g7EJpzdKEC3Y9cI4g

    和Content-Type:application/json

    就验证成功了

    相关文章

      网友评论

          本文标题:guns框架使用日记

          本文链接:https://www.haomeiwen.com/subject/csgcgftx.html