码云地址:校医院后台管理系统
0.关于hibernate逆向生成实体映射时找不到项目,进入项目的.settings文件夹,打开org.eclipse.wst.common.project.facet.core.xml,加上一行代码:<installed facet="me.hibernate" version="5.1"/> 问题解决。
改jdbc URL中的数据库名没有效果,是因为它是根据你在逆向生成实体映射时所用的数据库为标准的。
事务read-only问题,在hibernate事务管理中,你在service中写的方法,被hibernate列为了只读属性,只能从数据库中读取数据,不能进行增加和更新和删除操作。
<!-- 定义事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 声明式容器事务管理 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="remove*" propagation="REQUIRED" /> <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到 --> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <aop:config expose-proxy="true"> <!-- 只对业务逻辑层实施事务 --> <aop:pointcut id="txPointcut" expression="execution(* com.gxuwz.business.service..*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" /> </aop:config>
2.JSONArray是数组,JSONObject是对象,layui的表格方法渲染需要的是JSONObject。
3.form.on()表单监听中的ajax请求不执行,虽然加载了jquery ,但是jquey是加载到layui里面的,要用layui.jquery.ajax({}),也可在layui.use里面 $ = layui.jquery
4.在线反编译http://www.javadecompilers.com/
5.页面ajax请求进行信息验证,action返回值为布尔值,struts无法处理。这时将布尔值构造为JSON数据返回。
6,.ajax请求返回数据类型定义为json时,action中需把待返回的JSON数据通过toString转为字符串,再通过struts返回类型type为json
的<resulr>返给前台。还要将得到的数据转换成json类型 var item = eval("("+data+")"),接着通过item.properties调用属性,注意:
此属性前台页面输出不了,但能正常进行逻辑判断操作,boolean值是这样,其它属性还不了解。
7.layer弹出层,简单使用。
//学号已存在弹出层 function stuIdExist(){ layer.open({ content: '<div style="padding: 20px 100px;">'+ "此学号已经有了喔" +'</div>' ,btn: '朕知道啦' ,btnAlign: 'c' //按钮居中 ,shade: 0 //不显示遮罩 ,yes: function(){ layer.closeAll(); } }); }
8.form.on表单监听,可以拦截表单的跳转,但执行了其内的ajax的逻辑后想通过return true放行表单跳转没效果。
最后用了这个土方法 location.href = "<%=path%>/biz/Student_studentList.action";
9.table动态表格如何对后台获取的数据进行处理再渲染出来呢
使用templet - 自定义列模板--http://www.layui.com/doc/modules/table.html#templet
注意是 templet,不是代码提示出来的template~巨坑。
10.使用hibernate逆向生成实体类时,报错An internal error occurred during: "Generating Artifacts".
Path must include project and resource name: /
这时找到工程下的 .myhibernatedata里的字段改为configFile=/model/trunk/src/hibernate.cfg.xml,随便填都行,我的项目里就没有hibernate.cfg.xml这个文件。
11.layui日期时间控件 获取到的时间手动转为标准格式(1998-11-05)后返回回台系统会默认又转为CST格式(Sat Jun 16 05:50:19 CST 2018)咋破
在后台加工处理得了
12.同时有模糊查询和时间段查询时,一下这样写她会迁就模糊查询
from Student where stuId like 'a' or stuName like 'b' and date between starttime and endtime
改成这样就行了 from Student where (stuId like 'a' or stuName like 'b') and date between starttime and endtime
13.父页面调用layer.open方法打开一个子页面iframe执行了保存修改方法后,这样子关闭窗口并返回父页面
var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引 parent.layer.close(index); //再执行关闭当前iframe页面 parent.location.reload();//刷新父页面
14.表单监听 form.on方法后面一定要有个 return false;来阻止表单跳转,不然中间的方法就不执行了,比如$.ajax({})异步方法。
15.权限表sys_right如果为空,security会拦截全部url。如果不为空,则只会拦截表里的resource_path配置的url。
因为项目涉及到多角色访问对方所辖的数据信息范围,为了方便,用同一个页面展示数据给管理者和查询者使用,这时不能只单单给一种资源配置一个权限manager,而是对这个资源权限进行更细的划分,继续细分为增、删、查、改四个权限。这样会导致表数据繁杂,但目前为止我还没想到更好的方法。
16.角色-权限表中的 ****Manager和****Consult在main.jsp只是用来区分管理者和查询者菜单的区别显示,并没有对之后的增删改操作有影响。因为没给管理者配置 ****Consult权限,无论是管理者还是查询者,在进入某个资源的查询页面时,这时要求****Manager和****Consult的路径为****_openList.action。
17.<a>标签的控制隐藏显示通过style="display:none"
18.通过struts的bean传值时(非模型驱动)需要将对象定义为成员变量,不需要实例化但要提供get/set方法。切记:且在页面的属性加上对象前缀。(页面可直接接值)
19.如果给input标签设置了disable不可编辑,后台也不会接收到值。设置为readonly就得了。
20.按钮设定onclick=fun() 如果fun定义在layui.use(){}中会找不到的。但用$的时候要放在layui.use里
21.巧用layer弹窗的yes回调方法,实现父窗口与iframe之间的简单数据传输。点击详情
22.数据模板中 d为对应行数据
<script type="text/html" id="switchTpll"> <input type="checkbox" name="{{d.medName}}" value="{{d.medId}}" lay-skin="switch" lay-text="抓取|未抓取" lay-filter="selected" {{ d.id == 10006 ? 'checked' : '' }}></script>
23.获取input的value 使用id选择器 $(#id).val()
24.
选取药品时,表格使用.render方法级渲染,操作项使用数据模板,这时只需这样监听form.on('checkbox(selected)', function(obj){}抓取操作即可,每个抓取状态将对应每种药品。
但数量模块也是使用数据模板导入,如果给其设id(唯一),则全部的药品将会对应第一个数量块。
解决:
<!-- input的id根据药品编号来设置,以便获取 --><script type="text/html" id="count"> <input id={{d.medId}} onblur="test(value, {{d.medId}})" value="1" class="layui-input" type="text" lay-filter="counted" onkeyup="value=value.replace(/[^\d]/g,'') " ng-pattern="/[^a-zA-Z]"></script>
每行药品数据对应一个用药品编号来设置数量输入框,这时表单在监听点击抓取时,form.on('checkbox(selected)', function(obj){},会根据抓取传来的obj获取药品编号,接着用编号去获取对应的数量框。var count = $("#"+obj.value+"").val();
25.Jquery给一个标签添加属性方法 $("#"+obj.value+"").attr("readonly","true");
26.jQuery根据元素值删除数组元素的方法
var arr = ['a','b','c','d']; arr.splice($.inArray('c',arr),1); alert(arr);
27.layui表单初始赋值时,el表达式要用单引或双引号括起来,其调用属性要加对象前缀。
28.使用table方法级渲染时,在请求的数据接口数据返回时可能不包含table中全部需要渲染的值,这时给特定的字段设置templet: function(data)里返回return相应值即可完成渲染。(data为对应行数据对象)注意:这时候EL表达式需要单引号
29.
<result name="JsonObject" type="json"> <param name="root">JsonData</param> </result>
当通过struts返回type为Json时,其它格式的数据将被过滤掉,前台接收不到。
30.读取Json数据某个值 1. var data = json.key 2. var data = json[''+key+''],注意 是两个单引号!
31.table.reload(id, option)表格重载用到的id是table.render中的id,不是table标签中的Id
32.后台返回Date为json对象时,Js通过以下方法转换成2018/5/20格式。
var date = new Date(d.treatDate.time).toLocaleDateString();
33.在layui.use里使用EL表达式要加单引号
34.时间对象先转成时间戳再转为可显示时间,d.treatDate.time为时间戳
toLocaleDateString()以本地时间区表示,并根据本地规则格式化 yyyy-MM-dd
var date = new Date(d.treatDate.time).toLocaleDateString()
35.table.render({ id: 'testReload' }) 表格渲染中定义的Id目前只发现在表格重载时用得上
表格监听 table.on('tool(?)'), function(obj){ ?里填的是表格定义的lay-filter
var event = obj.event; //可获取是哪个单元格的点击事件
var data = obj.data; //obj为当前行的DOM对象,通过obj.data取得当前行数据
//更新表格指定field的值
obj.update({
regId: '1111',
regName: '哈哈哈'
});
//遍历Json数据方法
layui.each(recipeList, function(index, item){
//index为索引,item为对应值
}
}
36.表单监听 form.on('submit(?)',function(data)}{ }); 外面填事件名,radio、checkbox、select等,表格监听也是table.on(),表格监听有特殊,如果想对表格内全部单元格监听,可填'tool(?)',?为对应表格的lay-filter。获得当前行索引号
var tr = obj.tr; //获得当前行 tr 的DOM对象
var trNum = Number($(tr).attr("data-index"))+1;//这里是当前行号