电力
项目
分析
笔记
购置计划:由购置设备的员工申请设备购买计划,领导审核后,完成对设备的购置 *导入,购置(正式购买设备),计划顺延(延迟设备的购买时间)设备管理:管理系统中所有的设备信息,包括所有分公司(总公司),*导出设置、导出(导出报表)设备校准和检修:*监控设备的运行,根据校准和检修的周期,定期进行校准和检修的管理,填写报告,并进行管理,上报报表需求:所有设备的管理,每个设备型号的使用说明,都以电子版的形式录入,相应的设备管理人员,会下载,看一下相应的设备管理,类似电力图书馆。管理员:文件上传,下载业务人员:查询(支持高级查询)和下载 *lucene全文检索需求:每个分公司都会管理很多站点,每个站点都负责每个区域电力使用情况站点基本信息:管理每个分公司站点的信息运行情况:查看所有站点的运行情况,和维护方案,汇总站点的运行,并统计出故障时长维护情况:*维护计划:用来维护站点的计划,每个站点在同一维护之前,先要指定一个计划(审核过程)*工程师在维护的过程中,填写维护报告(故障原因,解决方案)监测中心建筑物信息管理:管理监测中心所有建筑物。包括房屋建筑,道路,围墙等建筑物信息和各个建筑物的维修信息。用户管理:完成对登录用户的管理,并可以支持对用户评定附件信息角色管理:用户、角色、权限的分配(授权)运行监控:日常工作,用来监控当前站点和设备的运行数据字典:贯穿系统所有的数据项的加载,动态维护JBPM工作流用来审核系统中所有的业务功能一个审核 *设备购置计划 *站点维护计划 *费用保险.开发完成之后*完成分布式管理*每个分公司国家电网,都会按照该系统,用来管理分公司下的设备和站点的运行监控 *每个分公司都能管理分公司下的设备信息用户管理:完成对登录用户的管理,并可以支持对用户评定附件信息角色管理:用户、角色、权限的分配(授权)运行监控:日常工作,用来监控当前站点和设备的运行数据字典:贯穿系统所有的数据项的加载,动态维护上报北京(导入)*看到所有上海(导出)深圳(导出)海南(导出)开发完成之后*完成分布式管理*每个分公司国家电网,都会按照该系统,用来管理分公司下的设备和站点的运行监控 *每个分公司都能管理分公司下的设备信息购置计划:由购置设备的员工申请设备购买计划,领导审核后,完成对设备的购置 *导入,购置(正式购买设备),计划顺延(延迟设备的购买时间)设备管理:管理系统中所有的设备信息,包括所有分公司(总公司),*导出设置、导出(导出报表)设备校准和检修:*监控设备的运行,根据校准和检修的周期,定期进行校准和检修的管理,填写报告,并进行管理,上报报表需求:所有设备的管理,每个设备型号的使用说明,都以电子版的形式录入,相应的设备管理人员,会下载,看一下相应的设备管理,类似电力图书馆。管理员:文件上传,下载业务人员:查询(支持高级查询)和下载 *lucene全文检索需求:每个分公司都会管理很多站点,每个站点都负责每个区域电力使用情况站点基本信息:管理每个分公司站点的信息运行情况:查看所有站点的运行情况,和维护方案,汇总站点的运行,并统计出故障时长维护情况:*维护计划:用来维护站点的计划,每个站点在同一维护之前,先要指定一个计划(审核过程)*工程师在维护的过程中,填写维护报告(故障原因,解决方案)监测中心建筑物信息管理:管理监测中心所有建筑物。包括房屋建筑,道路,围墙等建筑物信息和各个建筑物的维修信息。用户管理:完成对登录用户的管理,并可以支持对用户评定附件信息角色管理:用户、角色、权限的分配(授权)运行监控:日常工作,用来监控当前站点和设备的运行数据字典:贯穿系统所有的数据项的加载,动态维护用户管理:完成对登录用户的管理,并可以支持对用户评定附件信息角色管理:用户、角色、权限的分配(授权)运行监控:日常工作,用来监控当前站点和设备的运行数据字典:贯穿系统所有的数据项的加载,动态维护用来审核系统中所有的业务功能一个审核 *设备购置计划 *站点维护计划 *费用保险.开发完成之后*完成分布式管理*每个分公司国家电网,都会按照该系统,用来管理分公司下的设备和站点的运行监控 *每个分公司都能管理分公司下的设备信息开发完成之后*完成分布式管理*每个分公司国家电网,都会按照该系统,用来管理分公司下的设备和站点的运行监控 *每个分公司都能管理分公司下的设备信息上海(导出)深圳(导出)海南(导出)视图层控制层Struts2+Spring3+Hibernate3MVC结构*struts2struts2*springMVCclass ElecTextAction extends ActionSupport public String save()return save;*jsp*html*image*js*cssstruts.xml *负责项目URL地址的转发!*struts创建的Action对象与spring整合web.xml*struts2的核心过滤器*监听器,web容器启动spring模型驱动属性驱动类型转换interface IElecTextService void saveElecText(ElecText elecText);class ElecTextService implements IElecTextService void saveElecText(ElecText elecText)/注入Dao,调用Dao 的方法 ;事务控制:*spring的声明式事务处理 *在Service层添加Transcational控制层class ElecTextAction extends ActionSupport public String save()return save;struts.xml *负责项目URL地址的转发!*struts创建的Action对象与spring整合web.xml*struts2的核心过滤器*监听器,web容器启动spring类型转换拦截器*实现各种类型转换VO(值对象)PO(持久化对象)struts1(servlet)保存:将VO转换成POstruts2直接将PO当做VO用业务层interface IElecTextService void saveElecText(ElecText elecText);class ElecTextService implements IElecTextService void saveElecText(ElecText elecText)/注入Dao,调用Dao 的方法 ;事务控制:*spring的声明式事务处理 *在Service层添加TranscationalDao层class ElecTextDao implements IElecTextDao extends CommonDaoImplinterface ICommonDao void save(T entity);void update(T entity);class CommonDaoImpl implements IICommonDao void save(T entity).;void update(T entity).;spring容器:*创建Action,Service,Dao的对象(IOC)*每层进行注入(DI)*声明式事务处理(AOP)电力项目(注解方式)*创建Action,Service,Dao的对象(IOC)*Controller,Service,Repository,Commponent*每层进行注入(DI)*Resource*声明式事务处理(AOP)电力项目(配置文件)*创建Action,Service,Dao的对象(IOC)*每层进行注入(DI)*声明式事务处理(AOP)*声明事务管理器Dao中使用hibernate模板?注解如何入住hibernate模板呢interface IElecTextDao extends ICommonDao*每个持久化对象都会对应一个Dao,都有操作单表的CRUD*抽取一个公用Dao(CommonDao)Dao层class ElecTextDao implements IElecTextDao extends CommonDaoImplinterface ICommonDao void save(T entity);void update(T entity);spring容器:*创建Action,Service,Dao的对象(IOC)*每层进行注入(DI)*声明式事务处理(AOP)电力项目(注解方式)*创建Action,Service,Dao的对象(IOC)*Controller,Service,Repository,Commponent*每层进行注入(DI)*Resource*声明式事务处理(AOP)电力项目(配置文件)*创建Action,Service,Dao的对象(IOC)*每层进行注入(DI)*声明式事务处理(AOP)*声明事务管理器Dao中使用hibernate模板?注解如何入住hibernate模板呢持久层(hibernate)ElecText.javaElecText.javaElecText.hbm.xmlhibernate.cfg.xmlinterface IElecTextDao extends ICommonDao*每个持久化对象都会对应一个Dao,都有操作单表的CRUD*抽取一个公用Dao(CommonDao)数据库创建数据库itcast1128Elec持久层(hibernate)ElecText.javaElecText.javaElecText.hbm.xmlhibernate.cfg.xml张测试名称测试备注张测试备注home.jspleft.jspmid=aa pid=0mid=ab pid=aatree.jsmenuDate.jsjson数据相对路径./表示上级目录,目的就是去掉url路径访问的/system的namespace分析设计需求:*业务人员在当天按照每个时间段,录入该设备和站点管理的分公司的设备和站点的运行情况 *运行监控的数据实时数据*录入情况之后,在系统的首页要进行显示数据库设计:主键ID 站点运行情况 设备运行情况 创建时间在录入数据的时候,有2种设计方案第一种设计方案主键ID 站点运行情况 设备运行情况 创建时间1 9点正常 9点正常 2014-11-29 9:00:002 10点正常 10点不正常(昌平)2014-11-29 10:00:00操作:*每个时间段都需要新增数据(save的方法)问题:越积累越多实现一个定时器(spring得调度器Quartz)每天22点30清空数据 数据库设计:主键ID 站点运行情况 设备运行情况 创建时间操作:1:查询数据库运行监控表的数据,返回惟一ElecCommonMsg2:将ElecCommonMsg对象压入栈顶,支持表单回显操作:1:查询数据库运行监控表的数据,返回List,用来判断数据是否存在如果数据存在:*组织PO对象,执行update操作如果数据不存在:*组织PO对象,执行save操作首页显示操作1:查询数据库运行监控表的数据,返回惟一ElecCommonMsg2:将ElecCommonMsg对象压入栈顶,支持表单回显js实现:每隔10分钟刷新一次 *js的定时器需求:*业务人员在当天按照每个时间段,录入该设备和站点管理的分公司的设备和站点的运行情况 *运行监控的数据实时数据*录入情况之后,在系统的首页要进行显示数据库设计:主键ID 站点运行情况 设备运行情况 创建时间第第二二种种设设计计方方案案主键ID站点运行情况设备运行情况创建时间19点正常9点正常2014-11-29 9:00:0010点正常10点不正常(昌平)2014-11-29 10:00:00操作:*实现表单回显*每个时间段,不是向数据库新增数据,而是更新数据(update)问题:无9点正常10点正常9点正常10点不正常(昌平)数据库设计:主键ID 站点运行情况 设备运行情况 创建时间在录入数据的时候,有2种设计方案第一种设计方案主键ID 站点运行情况 设备运行情况 创建时间1 9点正常 9点正常 2014-11-29 9:00:002 10点正常 10点不正常(昌平)2014-11-29 10:00:00操作:*每个时间段都需要新增数据(save的方法)问题:越积累越多实现一个定时器(spring得调度器Quartz)每天22点30清空数据 创建数据库表9点正常10点不正常(昌平)重定向操作:1:查询数据库运行监控表的数据,返回惟一ElecCommonMsg2:将ElecCommonMsg对象压入栈顶,支持表单回显操作:1:查询数据库运行监控表的数据,返回List,用来判断数据是否存在如果数据存在:*组织PO对象,执行update操作如果数据不存在:*组织PO对象,执行save操作首页显示操作1:查询数据库运行监控表的数据,返回惟一ElecCommonMsg2:将ElecCommonMsg对象压入栈顶,支持表单回显js实现:每隔10分钟刷新一次 *js的定时器第第二二种种设设计计方方案案主键ID站点运行情况设备运行情况创建时间19点正常9点正常2014-11-29 9:00:0010点正常10点不正常(昌平)2014-11-29 10:00:00操作:*实现表单回显*每个时间段,不是向数据库新增数据,而是更新数据(update)问题:无使用:第一步第二步第三步如果数据显示不下,显示其中的一部分数据,其他数据通过鼠标的选择,显示全部支持:控制数据的隐藏和显示如果数据显示不下,显示其中的一部分数据,其他数据通过鼠标的选择,显示全部支持:控制数据的隐藏和显示showText.css第一步:第二步JS控制文本域输入字符串的大小 *防止输入的字符串过大,超过数据库表字段的最大限制,报错只对文本域有效JS控制文本域输入字符串的大小 *防止输入的字符串过大,超过数据库表字段的最大限制,报错只对文本域有效分析:操作标签表格上传图片 表情flash文本编辑器在项目中应用*监控系统*通知、公告系统*网站1:大文本字段Bolb和Clob(流)2 2:截截串串存存取取(设设计计理理念念)Ckeditor不支持文件上传配合CkFinder插件使用文本编辑器在项目中应用*监控系统*通知、公告系统*网站1:大文本字段Bolb和Clob(流)2 2:截截串串存存取取(设设计计理理念念)Ckeditor不支持文件上传配合CkFinder插件使用没有百分比纯JS开启2个线程10%如果i=15Session存放10获取Session存放10开启2个线程10%数据库设计数据字典的作用一:贯穿系统的所有数据项,开发过程中,动态的维护系统数据项二:保证数据的录入安全,业务表使用数据字典的时候,存放的是数据项的编号,而不是数据项的值三:方便系统的统计用户表:主键ID 用户姓名 登录名 性别 所属单位1 刘备 liubei 1 2数据字典操作的特点(注意):1:数据类型,数据项的编号和数据项的值不能为空2:数据类型一致的情况下,数据项的编号和数据项的值不能出现重复的3:数据项的编号为了方便排序,数据项的编号应该采用Integer类型数据字典的作用一:贯穿系统的所有数据项,开发过程中,动态的维护系统数据项二:保证数据的录入安全,业务表使用数据字典的时候,存放的是数据项的编号,而不是数据项的值三:方便系统的统计*没有选择类型列表 类型名称是可见的*此时【保存】表示新增一种数据类型*选择类型列表 类型名称是不可见的*此时【保存】表示在已有的类型上进行编辑和修改总结:此时添加和删除执行的是js,只有保存才执行数据库操作:*1:查询数据库中已有的数据类型,返回List集合,遍历到页面的下拉菜单中SELECT DISTINCT o.keyword FROM elec_systemddl o*没有选择类型列表类类型型名名称称是是可可见见的的*此时【保存】表示新增一种数据类型*选择类型列表类类型型名名称称是是不不可可见见的的*此时【保存】表示在已有的类型上进行编辑和修改没有选择类型列表选择类型列表dictionaryIndex.jspdictionaryEdit.jsp操作:1:获取类型列表的值,keyword2:使用数据类型作为条件,查询数据字典,返回List*没有选择类型列表类型名称是可见的*此此时时【保保存存】表表示示新新增增一一种种数数据据类类型型操作:1:获取类型列表的值,keyword2:使用数据类型作为条件,查询数据字典,返回List提交表单Form2*选择类型列表类型名称是不可见的*此此时时【保保存存】表表示示在在已已有有的的类类型型上上进进行行编编辑辑和和修修改改总结:此时保存应该执行不同的业务逻辑*利用传递标标识识来判断的执行的业务逻辑hidden:存放数据类型操作:1:获取页面传递的参数2:获取判断业务逻辑的标识(new和add)如果typeflag=new:新增一种新的数据类型 *遍历页面传递过来的数据项的名称,组织PO对象,执行保存 如果typeflag=add:在已有的数据类型基础上进行编辑和修改 *使用数据类型,查询该数据类型对应的list,删除list *遍历页面传递过来的数据项的名称,组织PO对象,执行保存动态维护数据字典的作用一:贯穿系统的所有数据项,开发过程中,动态的维护系统数据项二:保证数据的录入安全,业务表使用数据字典的时候,存放的是数据项的编号,而不是数据项的值三:方便系统的统计用户表:主键ID 用户姓名 登录名 性别 所属单位1 刘备 liubei 1 2超级管理员管理数据字典的作用一:贯穿系统的所有数据项,开发过程中,动态的维护系统数据项二:保证数据的录入安全,业务表使用数据字典的时候,存放的是数据项的编号,而不是数据项的值三:方便系统的统计数据字典操作的特点(注意):1:数据类型,数据项的编号和数据项的值不能为空2:数据类型一致的情况下,数据项的编号和数据项的值不能出现重复的3:数据项的编号为了方便排序,数据项的编号应该采用Integer类型*没有选择类型列表 类型名称是可见的*此时【保存】表示新增一种数据类型*选择类型列表 类型名称是不可见的*此时【保存】表示在已有的类型上进行编辑和修改总结:此时添加和删除执行的是js,只有保存才执行数据库操作:*1:查询数据库中已有的数据类型,返回List集合,遍历到页面的下拉菜单中SELECT DISTINCT o.keyword FROM elec_systemddl o*没有选择类型列表类类型型名名称称是是可可见见的的*此时【保存】表示新增一种数据类型*选择类型列表类类型型名名称称是是不不可可见见的的*此时【保存】表示在已有的类型上进行编辑和修改表单:Form1表单:Form2操作:1:获取类型列表的值,keyword2:使用数据类型作为条件,查询数据字典,返回List操作:1:获取类型列表的值,keyword2:使用数据类型作为条件,查询数据字典,返回List*没有选择类型列表类型名称是可见的*此此时时【保保存存】表表示示新新增增一一种种数数据据类类型型Form1Form2*选择类型列表类型名称是不可见的*此此时时【保保存存】表表示示在在已已有有的的类类型型上上进进行行编编辑辑和和修修改改总结:此时保存应该执行不同的业务逻辑*利用传递标标识识来判断的执行的业务逻辑hidden:存放数据类型重定向3条操作:1:获取页面传递的参数2:获取判断业务逻辑的标识(new和add)如果typeflag=new:新增一种新的数据类型 *遍历页面传递过来的数据项的名称,组织PO对象,执行保存 如果typeflag=add:在已有的数据类型基础上进行编辑和修改 *使用数据类型,查询该数据类型对应的list,删除list *遍历页面传递过来的数据项的名称,组织PO对象,执行保存先使用数据类型,删除2条数据在新增3条数据*数据字典的主键和其他表是没有主外键的约束的用户信息路径的使用:用于下载附件信息当使用数据字典的时候,需要数据的转换,多了很多的sql语句(优化)操作:1:加载数据类型是所属单位的数据字典的集合,遍历在页面的下拉菜单中2:组织页面中传递的查询条件,查询用户表,返回List3:数据字典的转换 *使用数据类型和数据项的编号,查询数据字典,获取数据项的值操作:1:加载数据字典,用来遍历性别,职位,所属单位,是否在职List二级联动!操作:(使用struts2的方式)1:获取所属单位下的数据项的值 2:使用该值作为数据类型,查询对应数据字典的值,返回List 3:将List转换成json的数组,将List集合放置到栈顶现在的做法:*导导入入插插件件包包*改变struts.xml:*将List集合数据,或者是Object对象,放置到栈栈顶顶List集合转换成json数组Object对象转换成json对象*通过Action方法的返回值,指定返回json的信息,改变struts.xmlListddlCode:1,ddlName:上海浦东电力公司,itemname:null,keyword:上海,keywordname:null,seqID:54,typeflag:null,ddlCode:2,ddlName:上海闸北电力公司,itemname:null,keyword:上海,keywordname:null,seqID:55,typeflag:null,ddlCode:3,ddlName:上海徐汇电力公司,itemname:null,keyword:上海,keywordname:null,seqID:56,typeflag:null现在的做法:*导导入入插插件件包包*改变struts.xml:*将List集合数据,或者是Object对象,放置到栈栈顶顶List集合转换成json数组Object对象转换成json对象*通过Action方法的返回值,指定返回json的信息,改变struts.xml想个办法:只需要ddlCode和ddlName改变:paramd+.ddlCode,d+.ddlNamename=includePropertiesd+.ddlCode,d+.ddlNameddlCode:1,ddlName:深圳福田电力公司,ddlCode:2,ddlName:深圳龙岗电力公司,ddlCode:3,ddlName:深圳南山电力公司鼠标失去焦点时,页面会进行校验。ddlCode:1,ddlName:上海浦东电力公司,itemname:null,keyword:上海,keywordname:null,seqID:54,typeflag:null,ddlCode:2,ddlName:上海闸北电力公司,itemname:null,keyword:上海,keywordname:null,seqID:55,typeflag:null,ddlCode:3,ddlName:上海徐汇电力公司,itemname:null,keyword:上海,keywordname:null,seqID:56,typeflag:null使用ajax校验(后台校验)*不刷新页面操作:/1:获取登录名/2:判断登录名是否出现重复,返回一个标识message属性*message=1:表示登录名为空,不可以保存*message=2:表示登录名在数据库中已经存在,不可以保存*message=3message=3:表表示示登登录录名名在在数数据据库库中中不不存存在在,可可以以保保存存address:null,birthday:null,contactTel:null,elecUserFiles:,email:null,isDuty:null,jctID:null,jctUnitID:null,logonName:liubei,logonPwd:null,message:2message:2,mobile:null,offDutyDate:null,onDutyDate:null,onDutyDateBegin:null,onDutyDateEnd:null,postID:null,remark:null,sexID:null,userID:null,userName:null只对ElecUser的message属性json化resulttype=jsonparammessagename=includePropertiesmessagemessage:2使用data.message *要求:直接使用data即可:只对ElecUser的message属性json化resulttype=jsonparammessagename=includePropertiesmessage用户表附件表操作:1:遍历多个附件,组织附件的PO对象,完成文件上传,保存用户的附件(多条数据),建立附件表和用户表的关联关系 2:组织PO对象,保存用户(1条数据)用户ID不要传递路径传递文件ID操作:1:使用用户ID,查询对象ElecUser对象,支持表单回显2:将ElecUser对象放置到栈顶,页面使用struts2的标签支持回显3:加载数据字典,用来遍历性别,职位,所属单位,是否在职4:二级联动的表单回显javaweb1:使用文件ID,查询用户文件表,获取到路径path2:使用路径path,查找到对应的文件,转化成InputStream *填写下载文件的头部信息(不用记)3:从响应对象Response中获取输出流OutputStream4:将输入流的数据读取,写到输出流中struts2*结果类型:1:使用文件ID,查询用户文件表,获取到路径path2:使用路径path,查找到对应的文件,转化成InputStream3:将输入流放置到栈顶重定向操作1:如果有附件,完成保存附件信息,并文件上传2:使用ID,更新用户信息(update)传递用户ID操作:获取获取ID,String userID,如果是多个值,struts2默认采用,的形式 1:删除该用户对应的文件 2:删除该用户对应的用户附件表数据 3:删除用户表的信息一个用户对应多个附件:*用户表和附件表就是一个多的关系数据表:维护数据安全 方案一:在每个表中创建 *创建人,创建时间 *修改人,修改时间 方案二:日志表是否删除(isDelete):假删除 方案一 *执行的不是delete,而是update 新增用户:默认isDelete=0 查询没有删除的用户。Where isDelte=0 删除用户:设置isDelete=1 查询删除的用户。Where isDelte=1 方案二:*日志表?当使用数据字典的时候,需要数据的转换,多了很多的sql语句(优化)操作:1:加载数据类型是所属单位的数据字典的集合,遍历在页面的下拉菜单中2:组织页面中传递的查询条件,查询用户表,返回List3:数据字典的转换 *使用数据类型和数据项的编号,查询数据字典,获取数据项的值之前:1:jsonlib 2:JsonArray(json数组)JsonObject(json对象).toString():返回json格式的字符串 3:页面 eval():将字符串转换成json的对象二级联动!操作:(使用struts2的方式)1:获取所属单位下的数据项的值 2:使用该值作为数据类型,查询对应数据字典的值,返回List 3:将List转换成json的数组,将List集合放置到栈顶现在的做法:*导导入入插插件件包包*改变struts.xml:*将List集合数据,或者是Object对象,放置到栈栈顶顶List集合转换成json数组Object对象转换成json对象*通过Action方法的返回值,指定返回json的信息,改变struts.xml页面的json数据现在的做法:*导导入入插插件件包包*改变struts.xml:*将List集合数据,或者是Object对象,放置到栈栈顶顶List集合转换成json数组Object对象转换成json对象*通过Action方法的返回值,指定返回json的信息,改变struts.xmlddlCode:1,ddlName:上海浦东电力公司,itemname:null,keyword:上海,keywordname:null,seqID:54,typeflag:null,ddlCode:2,ddlName:上海闸北电力公司,itemname:null,keyword:上海,keywordname:null,seqID:55,typeflag:null,ddlCode:3,ddlName:上海徐汇电力公司,itemname:null,keyword:上海,keywordname:null,seqID:56,typeflag:nullddlCode:1,ddlName:上海浦东电力公司,itemname:null,keyword:上海,keywordname:null,seqID:54,typeflag:null,ddlCode:2,ddlName:上海闸北电力公司,itemname:null,keyword:上海,keywordname:null,seqID:55,typeflag:null,ddlCode:3,ddlName:上海徐汇电力公司,itemname:null,keyword:上海,keywordname:null,seqID:56,typeflag:null想个办法:只需要ddlCode和ddlName改变:paramd+.ddlCode,d+.ddlNamename=includePropertiesd+.ddlCode,d+.ddlName使用ajax校验(后台校验)*不刷新页面操作:/1:获取登录名/2:判断登录名是否出现重复,返回一个标识message属性*message=1:表示登录名为空,不可以保存*message=2:表示登录名在数据库中已经存在,不可以保存*message=3message=3:表表示示登登录录名名在在数数据据库库中中不不存存在在,可可以以保保存存只对ElecUser的message属性json化resulttype=jsonparammessagename=includePropertiesmessageclose.jsp关闭子页面,刷新父页面只对ElecUser的message属性json化resulttype=jsonparammessagename=includePropertiesmessage使用data.message *要求:直接使用data即可:操作:1:遍历多个附件,组织附件的PO对象,完成文件上传,保存用户的附件(多条数据),建立附件表和用户表的关联关系 2:组织PO对象,保存用户(1条数据)附件打开保存关闭close.jspjavaweb1:使用文件ID,查询用户文件表,获取到路径path2:使用路径path,查找到对应的文件,转化成InputStream *填写下载文件的头部信息(不用记)3:从响应对象Response中获取输出流OutputStream4:将输入流的数据读取,写到输出流中struts2*结果类型:1:使用文件ID,查询用户文件表,获取到路径path2:使用路径path,查找到对应的文件,转化成InputStream3:将输入流放置到栈顶关闭子页面刷新父页面操作1:如果有附件,完成保存附件信息,并文件上传2:使用ID,更新用户信息(update)操作:获取获取ID,String userID,如果是多个值,struts2默认采用,的形式 1:删除该用户对应的文件 2:删除该用户对应的用户附件表数据 3:删除用户表的信息数据表:维护数据安全 方案一:在每个表中创建 *创建人,创建时间 *修改人,修改时间 方案二:日志表是否删除(isDelete):假删除 方案一 *执行的不是delete,而是update 新增用户:默认isDelete=0 查询没有删除的用户。Where isDelte=0 删除用户:设置isDelete=1 查询删除的用户。Where isDelte=1 方案二:*日志表绝对路径相对路径upload20141201用户管理DSFSDFSFDE#$#$RDSDFSDFSDF.pptmd5的密码加密授权:对用户、角色、权限的分配权限控制*细颗粒权限控制用户权限角色用户主键ID 用户名402895ef4a0a4f55014a0a5021af0001 刘备402895ef4a090afb014a0910b22c0003 诸葛亮数据库表设计角色1:系统管理员2:高级管理员总结:用户和角色是多对多的关系角色和权限是多对多的关系用户表主键ID 用户名402895ef4a0a4f55014a0a5021af0001 刘备402895ef4a090afb014a0910b22c0003 诸葛亮用户角色关联表用户ID 角色ID402895ef4a0a4f55014a0a5021af0001 1402895ef4a090afb014a0910b22c0003 1402895ef4a090afb014a0910b22c0003 2ztree角色表角色ID 角色名称1:系统管理员2:高级管理员权限表mid(权限ID)pid(父权限ID)name(名称)icon(图标)target(显示区域)url(地址)isParent(是否是父级节点)isMenu(是否是菜单)aa 0 技术设施维护管理ab aa 仪器设备管理ac aa 设备校准检修角色权限关联表角色ID mid(权限ID)pid(父权限ID)1 aa 01 ab aa.用户角色关联表用户ID 角色ID402895ef4a0a4f55014a0a5021af0001 1402895ef4a090afb014a0910b22c0003 1402895ef4a090afb014a0910b22c0003 2json数据分析,权限的集合应该如何查询和遍历返回List存放所有的tr,也就是pid=0的集合,父集合组织List,查询每个pid=0的子的集合,将子的结合存放到父的集合中操作:一:查询系统中所有的角色二:查询系统中所有的权限操作:/获取roleID一:使用当前角色ID,查询系统中所有的权限,并显示(匹配)1:查询系统中所有的权限List,父权限用于遍历tr,父权限对应的子集合,用来遍历td2:使用角色ID,组织查询条件,查询角色权限关联表,返回List3:匹配,向ElecPopedom对象中设置flag属性值的操作*如果匹配成功,设置1*如果匹配不成功,设置2添加一个标识,判断页面的复选框是否被选中,该标识要放置到ElecPopedom对象中flag=1:选中flag=2:没有被选中二:使用当前角色ID,查询系统中所有的用户,并显示(匹配)1:查询系统中所有的用户ListList2:使用角色ID,查询角色对象,返回ElecRole对象,通过Set集合获取当用户具有的角色3:匹配,向ElecUser对象中设置flag属性值的操作*如果匹配成功,设置1*如果匹配不成功,设置2添加一个标识,判断页面的复选框是否被选中,该标识要放置到ElecUser对象中flag=1:选中flag=2:没有被选中操作:/获取到角色ID/获取到权限的主键数组(格式pid_mid,例如0_aa)/获取到用户ID数组一:操作角色权限关联表1:使用角色ID,组织查询条件,查询角色权限关联表,返回List2:删除之前的数据List3:遍历权限主键ID的数组,组织PO对象,执行保存二:操作用户角色关联表1:使用角色ID,查询角色对象ElecRole,获取到该角色对应的用户的Set集合2:解除Set集合的关联关系(删除中间表)3:遍历用户ID的数组,重新建立Set集合的关联关系hidden:roleID操作:/获取roleID一:使用当前角色ID,查询系统中所有的权限,并显示(匹配)1:查询系统中所有的权限List,父权限用于遍历tr,父权限对应的子集合,用来遍历td2:使用角色ID,组织查询条件,查询角色权限关联表,返回L