博客网站的分析与设计.doc_第1页
博客网站的分析与设计.doc_第2页
博客网站的分析与设计.doc_第3页
博客网站的分析与设计.doc_第4页
博客网站的分析与设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

博客网站系统的分析与设计-基于Struts2+Hibernate框架一、需求描述有三种用户:1.普通用户(游客)能够使用网站查看博文和相册。浏览方式有三种,浏览所有,按类别浏览,按条件浏览。2.注册用户(会员)可以启用自己的博客。可以登录,密码忘记可以找回。登录用户可以对自己的博客进行管理,可以管理博文分类,博文、相册管理以及进入他人博客发表评论。3.管理员用户,可以对用户管理,可以浏览,删除用户。二、用例分析三、功能设计博客网站的模块划分表模块名子功能描述博客模块激活博客登录用户可以激活博客设置博客对博客标题和Logo设计用户模块用户登录凭验证后用户名、密码登录系统用户注册填写详细资料后成为正式注册用户找回密码通过E-mail找回密码个人设置登录后可修改个人注册资料分类模块浏览分类以列表方式列出所有分类博文分类管理浏览、添加、修改、删除博文分类博文模块浏览所有博文列出所有博文,分页显示按类别浏览博文按类别查询博文,分页显示查询博文按标题进行模糊查询,分页显示查看博文按ID查看博文详细信息,更新浏览次数,分页显示博文管理分页浏览,发表、修改、删除博文评论模块浏览博文评论列出当前博文的所有评论发表评论登录用户对他人博文发表评论博文评论管理在自己的博客中,浏览评论,删除评论相册模块浏览相册以分页的方式浏览博客的照片查看照片查看照片的详细内容相册管理在自己的博客中,分页浏览相片图册,上传、删除图片四、数据库设计数据库名 :db六张表:博客db_blog,用户db_user,博文分类db_category,博文db_article,评论db_review,相册db_picture创建数据库的脚本如下:create database db;use db;create table db_blog(blog_id INT AUTO_INCREMENT PRIMARY KEY,blog_title varchar(50) not null,blog_logo varchar(50) not null);create table db_user(user_id INT AUTO_INCREMENT PRIMARY KEY,blog_id int unique references db_blog(blog_id),user_name varchar(30) not null,user_pwd varchar(20) not null,user_sex varchar(2) not null,user_email varchar(50) not null,user_picture BLOB,user_basicInfo text);create table db_category(category_id INT AUTO_INCREMENT PRIMARY KEY,blog_id int not null references db_blog(blog_id),category_title varchar(50) not null);create table db_article(article_id INT AUTO_INCREMENT PRIMARY KEY,category_id int not null references db_category(category_id),article_title varchar(200) not null,article_content text not null,article_datetime timestamp not null,article_acessNum int not null default 0,article_reviewNum int not null default 0);create table db_review(review_id INT AUTO_INCREMENT PRIMARY KEY,article_id int not null references db_article(article_id),review_content text not null,review_datetime timestamp not null,user_id int not null references db_user(user_id) );create table db_picture(picture_id INT AUTO_INCREMENT PRIMARY KEY,blog_id int not null references db_blog(blog_id),picture_title varchar(50) not null,picture_profile varchar(200) not null,picture_accessNum int not null default 0);五、程序结构设计(文件夹和类包规划)视图层article(博文),blog(博客),category(博文分类),common(公共),css(样式表),images(图像),picture(相册),review(评论),script(脚本),upfiles(上传文件),user(用户),rixin.me.blog.tag(自定义标签包)控制层rixin.me.blog.action(控制类包)业务逻辑层rixin.me.blog.service(业务逻辑实现类包)rixin.me.blog.iservice(业务逻辑接口包)mon(一些公共类包)rixin.me.blog.model(数据模型实体类包)数据访问层rixin.me.blog.dao(数据访问层实现类包)rixin.me.blog.idao(数据访问层接口包)数据库MySQL5.5六、数据模型设计1.用户数据模型类User2.博客数据模型类Blog3.博文数据模型类Article4.博文分类数据模型类Category5.评论数据模型类Review6.相册数据模型类Picture(类的定义参见rixin.me.blog.model包)七、数据访问层接口设计1.分页集合接口PList(定义在mon包)2.数据访问层基接口IBaseDao3.用户数据访问接口IUserDao4.博客数据访问接口IBlogDao5.博文分类数据访问接口ICategoryDao6.博文数据访问接口IArticleDao7.评论数据访问接口IReviewDao8.相册数据访问接口IPictureDao详细设计参见rixin.me.blog.idao包八、业务逻辑层接口设计1.自定义用户异常类MyException(定义在mon包)2.用户业务逻辑接口IUserService3.博客业务逻辑接口IBlogService4.博文分类业务逻辑接口ICategoryService5.博文业务逻辑接口IArticleService6.评论业务逻辑接口IReviewService7.相册业务逻辑接口IPictureService详细设计参见rixin.me.blog.iservice包九、页面的整体布局1.Div分布效果图2.基本结构网页3.基本CSS样式表在css文件夹下建立all.css样式表。4.优化界面结构在WEB-INF文件夹下建立三个jsp片段文件top.jspf、sidebar.jspf、footer.jspf定义网站的顶部、左侧栏和底部。在此基础上优化index.jsp首页结构。(参见源代码)十、数据层设计1.使用连接池连接数据库打开myblog项目,在META-INF文件夹下建立context.xml文件。文件内容如下: 这是为项目配置数据源。接下来,把mysql-connector-java-5.1.15-bin.jar这个MySQL数据库的Jdbc驱动包放到WEB-INFlib目录下。(这个是必须的,发布网站时用)2.设计访问数据库的辅助类MySQLHelper.java,实现数据库的连接功能和释放资源功能。放到mon包。技术要点:(1) 采用JNDI技术获得DataSource对象。生成DataSource对象的工厂为mons.dbcp.BasicDataSourceFactory。(2) 使用javax.naming包中的Context接口,调用lookup方法检索数据源对象。(3) 通过JNDI查找数据源,本项目的JNDI为java:comp/env/jdbc/db。Tomcat提供的JNDI必须绑定前缀java:comp/env。package mon;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import javax.naming.Context;import javax.naming.InitialContext;import javax.sql.DataSource;import java.sql.PreparedStatement;public class MySQLHelper /建立到数据库的链接public static Connection connect() try Context ctx=new InitialContext();DataSource ds=(DataSource)ctx.lookup(java:comp/env/jdbc/db);Connection con=ds.getConnection();return con; catch (Exception ex) return null;/关闭结果数据集public static void closeResult(ResultSet rs) try rs.close();catch (SQLException e) /关闭预处理命令集public static void closePreparedStatement(PreparedStatement ps) try ps.close();catch (SQLException e) /关闭链接public static void closeConnection(Connection con) try con.close();catch(SQLException e) 3.分页工具类设计技术要点:(1)分页工具类命名为PageList,该类实现PList接口,包含两个属性pageBar和pageNumBar,分别用于存放普通分页棒和数字分页棒。(2)setPage()传递分页参数(记录总数,页大小,页号,网址),生成分页棒;getPageBar()和getPageNumBar()分别用于返回普通分页棒和数字分页棒。详细设计参见mon包中的PageList类的实现。4.博客数据访问类设计BlogDao.java技术要点:(1) 每个方法都先调用MySQLHelper类的connect( )方法建立连接,然后建立预处理对象。(2) 通过预处理对象的executeUpdate()方法实现数据更新,通过预处理对象的executeQuery()方法实现数据查询。设计步骤:(1) 在rixin.me.blog.dao包中建立类BlogDao类(2) 使BlogDao类实现IBlogDao接口,即在类名后添加:implements IBlogDao(3) 这时,类的前面出现红色感叹号,单击红色感叹号,在出现的列表中,选择【实现所有抽象方法】,这样方法结构将自动添加到类中。(4) 编写每个方法的代码。最后类的代码参见rixin.me.blog.dao包。5.类似的在rixin.me.blog.dao包中实现CategoryDao类。6.类似的在rixin.me.blog.dao包中实现ArticleDao类。(可以使用存储过程查询博文)7.类似的在rixin.me.blog.dao包中实现ReviesDao类。8.类似的在rixin.me.blog.dao包中实现PictureDao类。9. 与ArticleDao类相似,在 rixin.me.blog.dao包中实现UserDao类。(图像的存储采用大对象存取)十一、用工厂模式设计业务逻辑层为了减少各层之间的耦合,采用工厂模式来建立对象。按照这种模式,使用对象的类不由自己来建立对象,而是由一个工厂类来建立对象。以业务逻辑层为例,业务逻辑层需要使用数据访问层对象,但在业务逻辑类中不直接建立数据访问类对象,而是使用工厂类建立数据访问对象。工厂类的主要原理是:在配置文件中描述实例,工厂类使用反射机制建立对象。本博客网站系统中的业务逻辑类全部使用工厂类建立数据访问类对象。具体步骤如下:1.建立属性文件。在WEB-INF/lib文件夹下,建立配置文件perties。内容如下:blogDao=rixin.me.blog.dao.BlogDaouserDao=rixin.me.blog.dao.UserDaocategoryDao=rixin.me.blog.dao.CategoryDaoarticleDao=rixin.me.blog.dao.ArticleDaoreviewDao=rixin.me.blog.dao.ReviewDaopictureDao=rixin.me.blog.dao.PictureDaoblogService=rixin.me.blog.service.BlogServiceuserService=rixin.me.blog.service.UserServicecategoryService=rixin.me.blog.service.CategoryServicearticleService=rixin.me.blog.service.ArticleServicereviewService=rixin.me.blog.service.ReviewServicepictureService=rixin.me.blog.service.PictureService2.定义一个类Config,该类只包含一个静态变量,变量的类型为Properties,用于存放从配置文件中读取的数据。在mon包下建立类Config,代码参见包。3.建立一个Servlet,并配置load-on-startup使其能在项目启动时自动启动,该Servlet的功能是读取配置文件perties,将数据存放到Cp中。在mon下建立StartServlet。代码参见包中源文件。StartServlet的配置在web.xml文件中,如下: StartSmon.StartServlet0 StartServlet /StartServlet4.在mon包下建立工厂类MyFactory。代码参见包。5.在rixin.me.blog.service包下建立用户业务逻辑类UserService。代码参见包。6.在rixin.me.blog.service包下建立博客业务逻辑类BlogService。代码参见包。7.在rixin.me.blog.service包下建立博文分类业务逻辑类CategoryService。代码参见包。8.在rixin.me.blog.service包下建立博文业务逻辑类ArticleService。代码参见包。9.在rixin.me.blog.service包下建立评论业务逻辑类ReviewService。代码参见包。10.在rixin.me.blog.service包下建立相册业务逻辑类PictureService。代码参见包。十二、控制层设计控制层主要用来接收用户请求,根据用户请求调用业务层,并将获得的结果转发给视图。控制层是MVC框架中非常重要的一层。Servlet是控制层实现的核心技术。一些基本的Servlet知识我们已在第2章、第3章介绍。本部分重点实践如何处理多请求,过滤器、状态跟踪和侦听器,以及实现文件上传和下载。技术要点如下:(1)如何用一个Servlet处理多个请求;(2)使用过滤器解决编码转换问题;(3)利用状态跟踪和侦听器实现统计访问人数和在线人数;(4)利用SmartUpload实现文件上传和下载1.博文分类控制层(1)在rixin.me.blog.action包中建立Servlet,命名CategoryAction,代码详见包。(2)在category文件夹建立博文分类管理的网页categoryManage.jsp。(3)在category文件夹建立添加博文分类的网页categoryAdd.jsp。(4)在category文件夹建立修改博文分类的网页categoryEdit.jsp。2.设计一个编码过滤器浏览器默认使用utf-8编码方式来发送数据。如果整个网站统一使用utf-8编码,就不会出现乱码。但如果使用汉字编码,就涉及编码转换。技术要点:(1) 在web.xml文件为过滤器指定一个参数encoding,用于指定编码方式。 EncodingFilter EncodingFilter mon.EncodingFilter encoding gbk EncodingFilter /* (2)在mon包下建立一个过滤器EncodingFilter。在过滤器的doFilter()方法中调用request对象的setCharacterEncoding()方法设置编码方式。3.状态跟踪与侦听器。统计访问人数和在线人数。技术要点:(1)将访问人数和在线人数保存在上下文环境对象中。(2)使用一个上下文侦听器初始化访问人数和在线人数。为了能使网站停止时不丢失访问人数,contextDestroyed()方法中把访问人数保存到磁盘文件中,在contextInitialized()方法读取文件获得访问人数。(3)使用一个会话侦听器修改访问人数和在线人数。当一个会话建立时,访问人数和在线人数均增加1;当一个会话结束时,在线人数减1。步骤如下:(1)在mon包创建上下文侦听器InitUserNumListener类。(2)在在mon包创建上会话侦听器UserEnterListener类。(3)在WEB-INF/jspf文件夹找到footer.jspf,增加访问人数和在线人数显示。4.用户控制层实现用户的登录、注册、个人设置、形象照片显示、激活博客等功能。其中用户形象照片在注册时不直接添加,而是在个人设置时提交。技术要点:(1)登录、注册类似于实验九(2)个人设置需要提交用户照片,照片数据存储到数据库中,利用SmartUpload组件。通过com.jspsmart.upload.File的getBinaryData()方法获得字节数据。需要下载SmartUpload组件,放到WEB-INF/lib目录下。(3)激活博客需要的照片,照片以文件的方式保存在服务器中,因此也要使用SmartUpload组件。通过com.jspsmart.upload.File的saveAs()方法进行保存。步骤如下:(1)在rixin.me.blog.action包下建立用户控制类UserAction,代码详见包。(2)在rixin.me.blog.action包下建立博客控制类BlogAction,代码详见包。5.在user文件夹下建立登录网页login.html。6.把生成验证码图像的Servlet放到mon包。SecurityCodeServlet.java7.在user文件夹下建立注册网页register.html。8.在user文件夹下建立找回密码网页findPwd.html。9.在user文件夹下建立个人设置网页userEdit.jsp。10.在blog文件夹下建立激活博客网页activateBlog.jsp。11.修改WEB-INF/jspf文件夹下的sidebar.jspf文件,使其能显示博主照片。十三、视图层设计要点:自定义标签的设计原理与应用在博客网站中定义博文分类标签EL表达式与JSTL标签实现博客网站中的博文管理功能1.设计博客网站的博文分类标签(1)创建标签库描述文件WEB-INF/tlds/mytaglib.tld(2)创建标签处理类rixin.me.blog.tag包下,CategoryListTagHandler(3)在sidebar.jspf中使用标签。2.其他以此类推,使用JSTL标签库结合EL表达式实现视图层的设计。十四、基于Struts2框架的设计Struts框架的优点:(1) 支持MVC模式,结构清晰,使开发者只关注业务逻辑的实现;(2) Struts提供的标签库可提高开发效率;(3) 通过一个配置文件,可把握系统各部分之间的联系,便于系统的后期维护;(4) 提供Exception处理机制;(5) 提供数据库连接池管理;(6) 支持国际化(I18N)博客项目的Struts2配置:(1) 将这些个包部署到WEB-INF/lib目录下。(2) 在web.xml中加入如下Struts2核心控制器(过滤器)的配置。 struts2org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 *.action struts2 *.jspStruts2的MVC原理简述如下:以用户登录程序为例,来分析Struts2的执行流程。(1) 当表单提交的时候,请求路径User.action;(2) Web.xml中的StrutsPrepareAndExecuteFilter过滤器开始执行,因为它的过滤路径为“*.action”;(3) StrutsPrepareAndExecuteFilter首先做一些清理工作,然后其内部代码根据请求路径User.action到struts.xml中找到name为User的action,找到后首先执行action中配置的拦截器(Interceptor)(如果有的话),然后实例化action对应的类,再用表单的参数去填充实例的属性(调用set方法),调用execute( )方法;(4) 执行execute( )方法,根据返回的字符串在struts.xml中找到对应的页面,转发到该页面;JSP页面上可以使用Struts2标签库来访问Action中的属性。总结:Struts2的MVC结构实现原理如下:模型(Model)是由业务对象实现的,控制(Controler)由Action来实现,视图(View)由JSP页面构成,可以和控制交互;核心过滤器StrutsPrepareAndExecuteFilter起到总控作用;在执行控制前,可以通过拦截器Interceptor执行附加的代码逻辑。如上图所示。下面我们用这个框架对博客系统的控制层和视图层做些改进:1.使用Struts2实现博客网站的用户登录。步骤如下:(1)数据访问层和业务逻辑层不变(2)设计用户控制类StrutsUserAction,代码参见rinxin.me.blog.action包。(3)配置struts2。在src包下,建立struts2的配置文件struts.xml。(4)修改user文件夹下的登录页login.html。只修改表单的action如下 action=/myblog/StrutsUserAction.action。2.实现客户登录和注册验证(使用配置文件验证)技术要点:(1) 在rixin.me.blog.action包下建立两个验证文件。文件名分别为UserAction_Login_Validation.xml和UserAction_Register_Validation.xml。(2) 修改StrutsUserAction继承ActionSupport类。(3) 在struts.xml中配置名称为input的结果。(具体步骤略)3.实现登录界面的国际化。(步骤略)4.实现博客网站的相册管理技术要点:(1) 使用struts2的Action作为控制类,利用struts2的文件上传功能取代前面的SmartUpload组件。(2) 利用struts2文件上传拦截器限定上传文件类型。设计步骤如下:(1) 设计相册的Action类PictureAction,放到rixin.me.blog.action包下。(2) 在struts.xml中加入如下Action配置。 image/jpeg,image/gif 2097152 /picture/pictureList.jsp?blogId=$blogId /picture/pictureManage.jsp?blogId=$blogId /Picture_manage.action?blogId=$blogId /picture/pictureAdd.jsp (3) 在picture文件夹建立相册管理JSP网页pictureManage.jsp。(4) 在picture文件夹建立上传照片JSP网页pictureAdd.jsp。(5) 在picture文件夹建立相册浏览JSP网页pictureList.jsp。(6) 在资源文件中增加如下信息定义,用于上传文件时不被允许或过大时显示的提示信息。(7) 测试设计结果。相册管理页http:/localhost:8080/myblog/Picture_manage.action?blogId=1;相册浏览页http:/localhost:8080/myblog/picture/Picture_list.action?blogId=1上传照片页http:/localhost:8080/myblog/picture/pictureAdd.jsp?blogId=1Struts框架总结:Struts框架是一个开源MVC框架,具有模块化、灵活性、重用性等优点。核心过滤器在Struts2中起总控作用。Struts2.1.3版本之后主要使用StrutsPrepareAndExecuteFilter作为核心过滤器,需要在web.xml中配置。perties是应用程序给出的属性配置文件,可以通过这个文件设置属性,以修改perties中定义的默认值;struts.xml是struts的核心配置文件,可以配置常量、action、package、result、拦截器等。Struts中的Action属于控制层,他可以是任何的Java对象,也可以继承ActionSupport来实现Action,默认调用方法是execute( )。如果用JavaBeans封装数据,可以实现ModelDriven接口,或采用属性驱动方式,后者比较灵活。Action中可以通过ActionContext或ServletActionContext来获得Web对象。Struts支持各种视图技术,例如JSP、JSF、XML等。默认的是JSP。 通过result的type来配置。Struts2提供了两种数据验证方法,一种是使用validate( )方法,另一种是配置验证。Struts2提供了大量的标签,可以用来简化界面设计。Struts2支持国际化程序设计、允许自定义拦截器、提供文件上传等功能。十五、基于Hibernate改造博客系统的数据访问层Hibernate 是一个非常流行的开源的易于配置和运行的基于 Java 的对象-关系映射(JORM) 引擎. 它提供了很丰富的功能包括: a.多种映射策略 b.可迁移的持久化c.单个对象映射到多个表d.支持集合 e.多态关联f.可自定义的 SQL 查询Hibernate 使用Java编写, 是高可配置的软件包, 可以通过两种配置文件格式来进行配置. 第一种配置文件名字为 hibernate.cfg.xml. 在启动时, Hibernate 查询这个 XML 里面的属性来进行操作, 例如数据库连接字符串和密码, 数据库方言(database dialect), 以及映射文件位置等. Hibernate 在类路径中查找这个文件. 第二种配置文件是映射描述文件(文件扩展名为 *.hbm), 它来指示 Hibernate 如何来将特定的 Java 类和一个或者多个数据库表格中的数据进行映射. MyEclipse 提供了工具来处理这两种配置文件, 并且可以将它们和你对数据库和 Hibernate 映射的 Java 类的修改进行同步.Hibernate 可以用在任何需要将 Java 对象和数据库表格中的数据进行移动的 Java 应用中. 因此, 它在开发两层和三层的 J2EE 应用中很有用. 向你的应用中集成 Hibernate 包括:a.向你的项目中安装 Hibernate 核心类和依赖的 JAR 类库b.创建 hibernate.cfg.xml 文件来描述如何访问你的数据库c.为每个持久化 Java 类创建单独的映射描述文件应用Hibernate的一般步骤:(1) 导入类库,即将Hibernate所需的JAR包复制到WEB-INF/lib目录下。(2) 创建Hibernate的配置文件。(3) 利用开发工具从数据库创建出响应的实体对象及其ORM映射文件。(4) 利用Hibernate API访问数据库,对数据进行操作。Hibernate API介绍:(1) Configuration Hibernate的入口,负责Hibernate初始化时加载配置文件信息,加载指定的映射文件到内存,最后创建一个SessionFactory对象。(2) SessionFactory 负责创建Session实例。每个SessionFactory类的实例对应一个数据库。每个数据库最好只创建一个SessionFactory实例,在初始化时完成,是线程安全的,可以被应用的多个线程共享。(3) Session Hibernate持久化的基础,他负责管理所有与持久化相关的操作。例如数据库的存取、事务的管理和对象的生命周期等。它不是线程安全的。应避免多个线程共享同一个Session;可以为每个请求分配一个Session,在每次请求过程中及时创建和销毁Session实例,减少资源消耗。(4) Query和Criteria 负责Hibernate查询操作。Query实例封装了HQL(Hibernate Query Language)。HQL与SQL有些类似,只是HQL是面向对象的,它操作的是持久化类的类名和该类的属性名,而SQL操作的是表名和字段名。Criteria完全封装了字符串形式的查询语句,它比Query要面向对象,它更适合动态查询。具体改造步骤如下:1. 选中myblog项目,在MyEclipse中为项目添加Hibernate支持。在src包中生成配置文件hibernate.cfg.xml,在src包中创建rixin.me.blog.Hibernate包,存放生成的HibernateSessionFactory类。生成的配置文件如下: org.hibernate.dialect.MySQLDialect jdbc:mysql:/localhost:3306/db root nicetomeetyou com.mysql.jdbc.Driver MySQLBlog 2. 在rixin.me.blog.Hibernate包下自动生成的SessionFactory如下:package rixin.me.blog.Hibernate;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.cfg.Configuration;public class HibernateSessionFactory private static String CONFIG_FILE_LOCATION = /hibernate.cfg.xml;private static final ThreadLocal threadLocal = new ThreadLocal(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION;static try configuration.configure(configFile);sessionFactory = configuration.buildSessionFactory(); catch (Exception e) System.err.println(% Error Creating SessionFactory %);e.printStackTrace(); private HibernateSessionFactory() public static Session getSession() throws HibernateException Session session = (Session) threadLocal.get();if (session = null | !session.isOpen() if (sessionFactory = null) rebuildSessionFac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论