`

SPA数据管理工具的设计

阅读更多
       事先声明,这篇设计也是因为编辑时间较长,被JAVAEYE给拦截了。这个是实现后的设计文档。

       背景:
       SPA以及相关基础数据导出是产品的一个附加功能组件,能够将系统的SPA以及相关数据导入导出到安装在其它平台上,实现SPA的导入导出。
      
       解决问题:
      
        主要有两个:
       1.    数据库中数据的导入导出。
       由于SPA的数据导出到新数据库的时候,原来的数据即时存在的话,也要进行删除,因此,就是直接的数据导入导出的问题。

       2.  和数据库相关文件的导入导出问题。
       由于SPA中有很多表和很多文件相关联,那么一项处理要求就是将SPA相关联的文件备份出来,然后导入到对应系统的相应目录下。由于不需要保留目标平台的数据,因此,这方面的处理就简单了,直接将系统文件备份出来,覆盖到目标目录就可以了。
不牵涉到改变文件名的问题。

       总体来讲,要解决的问题和之前的预想相比,要简单了很多。   

       设计方案:
       1.  hibernate +dom4jSession + XML + XPATH+ANT来完成数据库的备份。将数据库的数据通过Hibernate的配置文件,转换为XML的实体,存储在XML文件中。
      
xml 代码
 
  1. <class  
  2.         name="Baseline"  
  3.         table="baseline"  
  4.         node = "Baseline"  
  5.     >  
  6.         <id  
  7.             name="Id"  
  8.             type="integer"  
  9.             column="ID"  
  10.             node = "@Id"  
  11.         >  
  12.             <generator class="org.hibernate.id.IncrementGenerator"/>  
  13.         <!---->id>  
  14.   
  15.         <property  
  16.             name="UserMetricsId"  
  17.             column="USER_METRICS_ID"  
  18.             type="integer"  
  19.             not-null="false"  
  20.             node = "UserMetricsId"  
  21.             length="11"  
  22.         />  
  23. ……  
        在隐射文件里面,通过配置node节点,定义这个实体对应的xml文件应该是什么样的。我这里的定义很简单。dingy定义类为node="BaseLine"元素,id定义为@Id属性,属性也转换为下级的元素节点。
        在xml中,就是
xml 代码
 
  1. <BaseLine Id="">  
  2.    <UserMetricsId>8<!---->UserMetricsId>  
  3. <!---->BaseLine>  
        在Hibernate中,将实体转换为实体,比较方便,主要的操作是取得Session的时候,用EntityMode.DOM4J的方式去取得。返回得到Element列表,怎么将Element组装成Document就不用多讲了。
     
java 代码
  1.  session = sessionFactory.openSession();    
  2. dom4jSession = session.getSession(EntityMode.DOM4J);   
  3. dom4jSession.createQuery(xpath).list();  

   
    在导入回去的时候,相当好办。
java 代码
  1. dom4jSession.replicate(className, node,ReplicationMode.OVERWRITE);  
       这是将该node更新回数据库,更新方式是覆盖已有的数据,如果存在的话:)
什么叫覆盖已有?就是数据库ID相同的记录,直接覆盖就OK了。

    2. 文件的导入导出
   
    将xml文件压缩为一个文件,其它的各类文件分别也压缩为多个文件,然后统一添加到一个大的压缩文件中。导出的步骤相反。分为两步:
    a.  需要借助Ant的Zip和Expand API。
   
java 代码。
 
  1. private void zipFiles(File destFile, String dataPath, List includeFiles) {  
  2.         Project project = new Project();  
  3.         Zip zip = new Zip();  
  4.         zip.setProject(project);  
  5.         zip.setTaskName("default");  
  6.         zip.setDestFile(destFile);  
  7.         FileSet fs = new FileSet();  
  8.         fs.setDir(new File(dataPath));  
  9.         if(includeFiles!=null && includeFiles.size()>0){  
  10.             for (Iterator iter = includeFiles.iterator(); iter.hasNext();) {  
  11.                 String element = (String) iter.next();  
  12.                 fs.setIncludes(element);  
  13.             }  
  14.         }          
  15.         zip.addFileset(fs);  
  16.         zip.setCompress(true);  
  17.         zip.setEncoding("GBK");  
  18.         zip.execute();  
  19. }  
  
java 代码
 
  1. /** 
  2.  * 将源文件unzip到目的文件,覆盖安装。
  3.  * @param srcFile    
  4.  * @param destFile 
  5.  */  
  6. public void unzipFile(File srcFile, File destFile){  
  7.     Project project = new Project();  
  8.        Expand expand = new Expand();  
  9.        expand.setProject(project);  
  10.        expand.setSrc(srcFile);  
  11.        expand.setEncoding("GBK");  
  12.        expand.setOverwrite(true);  
  13.        expand.setDest(destFile);  
  14.        expand.execute();  
  15. }  


    b.  在压缩文件中添加Entry,以及解析Entry,需要用到JAVA提供的文件压缩API。
     
java 代码
 
  1.     
  2. public void compressFile(File file,String entryName) throws IOException{  
  3.         zos.putNextEntry(new ZipEntry(entryName));        
  4.         BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file));  
  5.         int n = 0;  
  6.         while (n != -1) {  
  7.             n = bis.read();  
  8.             if (n != -1) {  
  9.                 zos.write(n);  
  10.                 }  
  11.             }  
  12.         bis.close();  
  13.         zos.closeEntry();  
  14.     }  
    这个名字其实起得不好。compressFile也是压缩之意,这里的意思是将file添加到Zip的一个入口。

    相应的,unCompressFile方法是:
   
java 代码
 
  1. public void unCompress(ZipFile zipFile, String entryName, File destFile) throws IOException{  
  2.     ZipEntry ze = zipFile.getEntry(entryName);  
  3.     if(ze!=null){  
  4.          BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(ze));  
  5.             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));  
  6.             int n = 0;  
  7.             while (n != -1) {  
  8.                 n = bis.read();  
  9.                 if (n != -1) {  
  10.                     bos.write(n);  
  11.                 }  
  12.             }  
  13.             bos.close();  
  14.             bis.close();  
  15.     }  
  16. }  

    后记:该程序是在前人程序的基础上开发的,据说是之前的牛人写的程序。即便这样,要理解别人的程序还是很难的。特别象我这样,想要理解程序的来龙去脉的时候,更显得艰难。我在不停的Refactor中前行,才能摸清楚程序的意思。
       只有维护的时候,才想到如果有一份需求和设计文档就好了。这个完全不是设计文档,也不是程序的流程。思之,想之……

      














分享到:
评论

相关推荐

    MF00859-thinkphp美容SPA管理源码.zip

    9. **后台管理**:提供给管理员的后台界面,便于管理各项业务数据。 【源码学习】 对于学习者而言,这个源码包是一个了解ThinkPHP框架实际应用和美容SPA业务逻辑的好教材。通过阅读和分析源代码,可以深入理解如何...

    SPA-采购管理

    采购凭证的主要目的是为了记录和管理采购过程中的数据。 四、采购视图的主记录 采购视图的主记录是指采购处理的主要记录,包括物料主数据、供应商主数据、采购主数据等。采购主数据包括采购信息记录、货源清单、...

    基于PHP的美容院SPA会员管理系统.zip

    总的来说,这个基于PHP的美容院SPA会员管理系统结合了Web开发技术、数据库管理和业务流程,为美容院提供了一个全面的客户关系管理工具。它不仅能帮助美容院优化运营,提高服务质量,还能提升客户满意度,促进业务...

    SPA会所网站源码

    【SPA会所网站源码】是一个基于PHP编程...总的来说,这个SPA会所网站源码为创建专业且功能完善的在线服务平台提供了基础,通过适当的定制和维护,可以成为一个有效的工具,帮助SPA会所在数字化时代提升业务和客户体验。

    SPA初级教程

    学习如何使用Redux(对于React)、Vuex(对于Vue)或其他状态管理工具来组织和管理应用状态是提高代码可维护性的重要环节。 6. **构建工具**:为了优化SPA的开发流程和部署,熟悉使用Webpack或Parcel等构建工具是...

    主流数据可视化工具介绍:帆软FineBI

    最后,FineBI被定义为自助式BI分析工具,它结合了前端的用户界面设计和后端的数据管理功能。它不仅支持前端的数据分析操作,还提供了数据管理、企业级管控等后端功能。这种自助式分析的方式意味着业务人员和IT人员都...

    前端开源库-lws-spa

    同时,对RESTful API设计的理解也很关键,因为SPA通常与后端通过API进行数据交互。 总之,`lws-spa`是前端开发者利用LWS搭建SPA应用的一个实用工具,它简化了轻量级服务器与SPA架构的整合过程。通过深入研究`lws-...

    single-spa-no-single-spa-layout.zip

    在不依赖single-spa的情况下,通过合理的代码分割、路由设计、状态管理和组件封装,我们依然可以构建出具有模块化特性的React单页应用。这种方案更加灵活,可以根据项目的具体需求进行定制,同时也降低了对第三方库...

    SPA单页面开发方式DEMO

    - 数据管理方便:可以利用前端状态管理,如Redux或Vuex,进行数据流控制。 - 适合复杂应用:对于大型应用,SPA可以组织更有序的代码结构。 - **缺点:** - 初始加载时间长:由于需要加载大量JavaScript代码,...

    一个基于vue做前端,后端用java提供API的前后端分离的SPA后台管理功能.zip

    综上所述,这个项目利用Vue.js和Java实现了前后端分离的SPA后台管理系统,通过高效的API通信,实现了灵活的数据交互和管理功能。开发者可以通过学习和理解这个项目,提升在前端框架Vue.js和后端Java服务开发方面的...

    SPAQ快速设置SPA的模板

    - **React、Vue或Angular**:这些是常见的前端框架,它们提供了构建SPA的强大工具,如组件化、虚拟DOM和生命周期管理。 - **ES6+语法**:在SPA开发中广泛使用,包括箭头函数、类、模板字符串等,提高了代码可读性和...

    基于vue全家桶实现的SPA商城

    - **状态管理**:Vuex是Vue的状态管理模式和库,用于集中管理应用的状态,提供统一的接口进行数据操作。 - **模块化**:Vuex支持将状态分成多个模块,每个模块有自己的state、mutations、actions和getters。 - **...

    react-adminonrest使用React和MaterialDesign在REST服务之上构建管理SPA的前端框架

    `react-admin-on-rest`是一个基于React和Material Design的前端框架,专门用于构建针对RESTful API的管理界面的单页应用(SPA)。它为开发者提供了丰富的功能,使得快速构建功能完备的后台管理系统变得简单高效。 *...

    美容spa 新都会水疗会所桑拿管理系统方案.doc

    新都会水疗会所的桑拿管理系统是一套专为美容SPA和水疗行业设计的信息技术解决方案。它集成了多种功能模块,包括钟房管理、收银、技师调度、消费记录和营销策略等,以全面覆盖日常运营的各项需求。该系统不仅有助于...

    毕业设计vue+node.js+mysql校园二手交易网(SPA).zip

    5. 管理员模块:后台管理,包括用户管理、商品审核、数据统计等。 安全方面,需考虑防止SQL注入、XSS攻击等,使用 Helmet 库强化服务器的安全设置,同时使用HTTPS协议确保数据传输安全。 此外,项目的部署和运维也...

    spa200504.zip

    1. **前后端分离**:这是一种现代Web开发架构,前端负责用户界面和交互,后端处理业务逻辑和数据管理。通过API接口进行通信,使得前后端可以独立开发和部署,提高开发效率。 2. **页面局部加载**:这是SPA的核心...

    网页课程设计&毕业设计_漂亮幻灯大图spa美容会所网站模板4877.zip

    设计师可能需要用到Photoshop或其他图像编辑工具来优化图片大小、质量,确保在保持视觉吸引力的同时不影响网站加载速度。 5. 数据库管理:如果网站提供预约服务,那么就需要一个数据库来存储用户信息和预约记录。这...

    基于vue20生态的后台管理系统spa

    本文将深入探讨一个基于Vue2.0生态的后台管理系统SPA,解析其核心技术栈,包括Vue、vue-resource、vue-router、vuex、element-ui、webpack以及npm,以此揭示此类系统的设计理念与实现细节。 首先,Vue.js是整个系统...

    前端项目-single-spa.zip

    - 前后端分离带来的复杂性:数据流和状态管理变得更加复杂,需要借助如Redux或Vuex等工具。 **总结** "前端项目-single-spa.zip"是一个基于single-spa框架的前端项目,它实现了多应用程序在单一页面上的集成。通过...

Global site tag (gtag.js) - Google Analytics