手记

hospital课设遇到的问题汇总

码云地址:校医院后台管理系统

项目演示:校医院后台管理系统

用maven把项目打包war放置tomcat,tomcat运行成功,一打开主页就报错

在myeclipse中的tomcat运行没有错

项目中jdk用的是8,系统的是10,把10改为8即可。

1.挂号员添加学生挂号信息,且状态暂时置为待诊疗状态

2.医师选择已经挂号的学生进行诊疗,此时学生挂号状态置为诊疗中状态,学生诊疗状态为待处方状态

3.医师选择已经开诊疗单的学生进行开处方操作(对每条诊疗单可开多次处方,每张处方有对应的药品信息),此时学生诊疗状态置为吃药状态

4.医师选择已开处方单的学生,进行是否治疗痊愈判断操作(治愈或未治愈)。

当诊疗单所开的处方单(可能多张)都未能治愈时,学生挂号状态置为治疗失败状态,学生诊疗单状态置为治疗失败状态,此时可继续为其开处方单,相应状态即会随之改变;

当诊疗单所开的处方单(可能多张)中最后一张处方单为治愈状态时,视为治疗完成。学生挂号状态置为治疗完成状态,学生诊疗单状态置为治疗完成状态。且让其进入缴费阶段;

5.为学生的某条挂号添加治疗标准费用记录;

6.进入缴费界面可查询学生所需的药品费用以及治疗标准费用,点击缴费按钮可为按需缴纳制定金额;


spring security大体流程

1、当Web服务器启动时,通过Web.xml中对于Spring Security的配置,加载过滤器链,那么在加载MyFilterSecurityInterceptor类时,会注入MyInvocationSecurityMetadataSourceService、MyUserDetailsService、MyAccessDecisionManager类。


    2、该MyInvocationSecurityMetadataSourceService类在执行时会提取数据库中所有的用户权限,形成权限列表;

并循环该权限列表,通过每个权限再从数据库中提取出该权限所对应的资源列表,并将资源(URL)作为key,权限列表作为value,形成Map结构的数据。


    3、当用户登录时,AuthenticationManager进行响应,通过用户输入的用户名和密码,然后再根据用户定义的密码算法和盐值等进行计算并和数据库比对,

当正确时通过验证。此时MyUserDetailsService进行响应,根据用户名从数据库中提取该用户的权限列表,组合成UserDetails供Spring Security使用。


    4、当用户点击某个功能时,触发MyAccessDecisionManager类,该类通过decide方法对用户的资源访问进行拦截。

用户点击某个功能时,实际上是请求某个URL或Action, 无论.jsp也好,.action或.do也好,在请求时无一例外的表现为URL。

还记得第2步时那个Map结构的数据吗? 若用户点击了"login.action"这个URL之后,那么这个URL就跟那个Map结构的数据中的key对比,若两者相同,

则根据该url提取出Map结构的数据中的value来,这说明:若要请求这个URL,必须具有跟这个URL相对应的权限值。这个权限有可能是一个单独的权限,

也有可能是一个权限列表,也就是说,一个URL有可能被多种权限访问。


    那好,我们在MyAccessDecisionManager类的decide这个方法里,将通过URL取得的权限列表进行循环,然后跟第3步中登录的用户所具有的权限进行比对,若相同,则表明该用户具有访问该资源的权利。 不大明白吧?  简单地说, 在数据库中我们定义了访问“LOGIN”这个URL必须是具有ROLE_ADMIN权限的人来访问,那么,登录用户恰恰具有该ROLE_ADMIN权限,两者的比对过程中,就能够返回TRUE,可以允许该用户进行访问。就这么简单!


    不过在第2步的时候,一定要注意,MyInvocationSecurityMetadataSoruceService类的loadResourceDefine()方法中,形成以URL为key,权限列表为value的Map时,

要注意key和Value的对应性,避免Value的不正确对应形成重复,这样会导致没有权限的人也能访问到不该访问到的资源。

还有getAttributes()方法,要有 url.indexOf("?")这样的判断,要通过判断对URL特别是Action问号之前的部分进行匹配,防止用户请求的带参数的URL与你数据库中定义的URL不匹配,造成访问拒绝!


  0.关于hibernate逆向生成实体映射时找不到项目,进入项目的.settings文件夹,打开org.eclipse.wst.common.project.facet.core.xml,加上一行代码:<installed facet="me.hibernate" version="5.1"/> 问题解决。

  改jdbc URL中的数据库名没有效果,是因为它是根据你在逆向生成实体映射时所用的数据库为标准的。

  1. 事务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.按钮设定=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;//这里是当前行号

37.表单select下拉框 js为其赋值

38.暂定:在处方单点击治疗完成后马上根据挂号编号新增一条缴费数据,包含药品费和治疗标准费,标准费这时可有可无。如果在治疗没完成时添加标准费的话,这时没有缴费数据给其塞进。所以在添加标准费时,筛选出已完成治疗的挂号编号进行操作。

39.update修改时实体明明id不为空,但调用模板update时报错

org.springframework.dao.InvalidDataAccessApiUsageException: The given object has a null identifier

那是因为你各层调用时把数据搞空了

0人推荐
随时随地看视频
慕课网APP