基于Spring4+SpringMVC+Hibernate5的燃气进销存管理系统
资源下载地址:https://download.csdn.net/download/sheziqiong/85639395
资源下载地址:https://download.csdn.net/download/sheziqiong/85639395
目录
一、系统展示 2
1.登录页面 2
2.admin 登录后的主页 2
3.菜单管理 3
4.角色管理 > 新增角色 3
5.用户管理 4
6.添加商品 4
7.仓库管理 5
8.供应商管理 5
9.采购订单管理 6
10.采购订单导出 6
11.库存查看 7
12.采购统计 7
二、系统需求分析 8
1.问题分析 8
2.系统模块结构 8
3.系统总体流程 9
三、开发环境简介 10
1.maven 10
2.Intellij IDEA 11
3.ExtJs 11
四、底层架构设计 11
1.规范 12
1.1 基础规范 12
1.2 代码规范 12
2.架构设计 13
2.1 模块结构 13
2.2 依赖管理 16
2.3 类结构 29
五、数据库与实体设计 56
六、系统功能实现 57
1.创建工程 58
2.系统配置 66
3.模块分层 75
3.1lyyzoo-gpss-base 75
3.2lyyzoo-gpss-web 76
3.3 静态资源文件 77
3.4 JSP 文件 78
3.4 登录实现举例 81
七、系统的调试与部署 92
1.测试 92
2.部署 93
一、系统展示
1.登录页面

2.admin 登录后的主页

3.菜单管理

4.角色管理 > 新增角色

5.用户管理

6.添加商品

7.仓库管理

8.供应商管理

9.采购订单管理

10.采购订单导出

11.库存查看

12.采购统计

二、系统需求分析
上面简单的展示了完成后的系统测试截图,你可以下载 war 包部署到自己的 Tomcat 上看,下面开始进入正文。
开发一个(简单)系统,我想首要做的就是进行系统需求分析,弄清楚你为什么要做这个系统,这个系统有哪些功能模块,每个功能具体实现些什么功能。
当然,我这里的主要目的是完成毕业设计,交出毕业论文。但我并没有简单的只是为了完成一个毕业设计而去开发这个系统。主要想法是以开发这套进销存管理系统为例,详细说明一个系统从确认需求、技术选型、架构设计、系统实现到测试部署的整个开发过程。综合运用自己平时所学的知识、技术,及实习获得的经验等,去完整且较好的实现一个系统。搭建一个基础系统框架,形成一定规范,以后在此基础上做开发,可以省去很多诸如搭建框架、加入依赖、配置等工作。
这次开发所做的主要工作及意义如下:
- ① 学会站在用户的角度分析用户需求,完成需求分析设计等。
- ② 熟练使用各种类相关开发、设计工具,及开源软件。
- ③ 熟练掌握 Spring+SpringMVC+Hibernate+ExtJs 的开发技术。
- ④ 熟练使用 maven 构建工具。
- ⑤ 站在企业的角度,试着搭建自己的一个底层基础框架。
- ⑥ 建立完整的燃气管进销存管理系统,进行测试并分析结果。
- ⑦ 将系统部署到互联网上,以实现真正的 Web 应用。
1.问题分析
首先,对系统进行需求分析,首先需要了解的就是什么是进销存系统,进销存系统也称为供应链管理系统,最基本的内容就是采购、库存、销售、退货管理。进销存系统是对企业生产经营中采购、入库、销售进行跟踪管理,从采购单开始,到商品入库,商品销售出库,每一步都跟踪记录。有效解决企业的分销管理等业务问题。那么燃气管进销存系统有何不同呢,其实进销存系统已经具备了一般商品的进销存功能,燃气管就是一种商品。以此为出发点,开始着手设计系统功能模块。
2.系统模块结构
系统分为 6 大模块,分别是基础设置、采购管理、销售管理、库存管理、统计分析、系统管理。系统设置的角色有 admin、采购员、销售员、库存管理员等。
系统模块结构(使用 xmind 设计):

3.系统总体流程
系统的一个整体流程,从初次使用开始,系统设置一个超级管理员(admin),拥有系统的所有权限。admin 登录系统,设置角色(系统管理员,采购员,销售员,库存管理员),分配对应的权限。然后进入用户管理,录入系统用户。一般管理员登录系统,录入基础数据;采购员需要录入供应商,采购单,退货单;销售员则需录入销售单,退货单。库存管理员就需要在库存管理中进行采购审核和销售审核,采购审核通过则商品入库,增加库存;销售审核通过则商品出库,减少库存。管理员还可以查看每月的采购统计和销售统计。
系统总体流程(使用 visio 设计):

三、开发环境简介
需求确定了,就要进入具体的开发阶段,首先确定开发这个系统综合用到哪些技术、开发工具等。
简单说下这个系统的开发环境:
- 开发平台:windows 8.1
- Java 版本:JDK 1.8
- 项目管理工具:Maven
- 开发工具:Intellij IDEA
- 数据库:MySQL 5.1
- 服务器:Tomcat 8.5
- 开发框架:Spring4 + SpringMVC + Hibernate5
- 前端框架:ExtJs 4.2 + JSP
- 建模工具:PowerDesigner、Visio
1.maven
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。它提供了中央仓库,能帮我们自动下载构件和第三方的开源类库。你只需要在你的项目中以坐标的方式依赖一个 jar 包,maven 就会自动从中央仓库下载,并同时下载这个 jar 包所依赖的其他 jar 包,以及可以下载源码进行阅读。使用 maven 后每个 jar 包本身只在本地仓库中保存一份,极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。同时 maven 可以替我们自动的将当前 jar 包所依赖的其他所有 jar 包全部导入进来,无需人工参与,节约了大量的时间和精力。使用 maven,只需要一条简单的命令,就可以自动完成清理、编译、测试、打包、部署的整个过程。我们的项目一般会分为开发环境和生产环境,不同环境对应不同的配置文件,使用 maven,你就可以配置两个环境,打包的时候指定运行的环境,就可以将对应的配置文件替换,以此减少手工操作及可能带来的失误操作等。
2.Intellij IDEA
IDEA 是 Java 语言开发的集成环境,Intellij 被公认为最好的 Java 开发工具之一。IDEA 在代码自动提示、重构、调试、各类版本工具(maven、SVN 等)整合等方面都是比较强的。本人是在实习期间转用 idea 开发的,之前一直使用 eclipse,相比 eclipse,idea 在调试、代码自动提示等方面更显优势。项目在 idea 中有一个更友好的目录结构,尤其是多工程项目。当然,eclipse 比 idea 更容易上手,使用 idea 可以提高你的开发速度,但前提是你需要记住大量的快捷键。使用 idea 的调试功能,比如,你只需要按快捷键 Alt+F8,然后输入表达式,就可以快速求值;在调试的时候,idea 会在变量的后面以不同的颜色显示变量的值,你就可以很清楚的知道调试的每一步,非常方便。使用好 IDEA 能在很大程度上提高我们的开发速度。
3.ExtJs
ExtJs 可以用来开发富客户端的 AJAX 应用,是用 JavaScript 写的与后台技术无关的前端 AJAX 框架,主要用于创建前端用户界面,拥有强大的数据处理功能,以及图表统计等。同时,ExtJs 拥有很多个性化的主题供你选择,是开发后台管理系统的一个不错的选择。
四、底层架构设计
在进行进销存系统的设计和编码之前,首先设计一个自己的底层框架,这个底层框架在之后可以作为其它具体项目开发的一个基础,从而不必每次开发项目时,都去做很多重复的工作。这个底层框架主要包括一个开发的规范,以及一些通用的工具类等,更重要的是分类别引入各个框架,如 Spring、Hibernate、各个配置文件等。同时,如果以后在开发中,增加的一些新功能,还可以往这个底层中添加,不断的去完善。
1.规范
在进行框架设计之前,为了使软件开发过程顺畅、提高代码的可靠性,可读性和可维护性等,首先需要确定的就是开发规范了,俗话说,没有规矩不成方圆,软件开发亦是如此。下面列出一些简单的需要遵守的规范。
1.1 基础规范
首先需要遵守的是一些基础规范。一般来说,公司会将域名作为所有命名的一个基础,比如文件名、包名等等。因此我申请了一个域名[www.lyyzoo.com]作为个人域名。然后将 D:/lyyzoo-repo 作为开发的根目录,即个人代码仓库,以后所有的项目都会建到这个目录下。所有的项目开发使用 maven 来管理项目,因此目录结构是标准的 maven 规范目录。
maven 约定的目录结构:

1.2 代码规范
① 命名
- 所有的命名需要见名之意,尽量保证通过变量名得知变量的含义,需要注释的地方尽量添加注释。
- 包命名全小写,通过域名倒写 + 模块的形式,如:com.lyyzoo.service
- 类命名采用 Pascal 名法,大写字母开头,每个单词首字母大写。
- 方法名采用 Camel 命名法,小写字母开头,每个单词首字母小写;getter 和 setter 使用 Lombok 自动生成,只需添加@Data 注解即可。
- 变量名采用 Camel 命名法,小写字母开头,每个单词首字母大写。变量名不宜过长,可采用首字母缩写的形式,但要见名之意。
- 常量名全大写,每个单词之间使用”_”分隔。
② 分层
项目以功能模块划分,不同项目建立不同的工程,使用 maven 的依赖进行管理。包的基本分层有 controller(控制层)、service(业务层)、dao(数据访问层)、entity(模型层)。
2.架构设计
2.1 模块结构
整个项目的底层着重是一些通用的、基础的东西,整合到一起,以便于以后重用。首先,创建一个名为 lyyzoo 的 maven 工程,lyyzoo 将作为底层的根目录。lyyzoo 下有两个主要的子模块,分别为 lyyzoo-base 和 lyyzoo-starter,lyyzoo-base 是基础模块,用于一些简单的 Java 及 JavaEE 程序;lyyzoo-starter 则是 JavaEE 相关,会依赖于 lyyzoo-base,同时引入了 Spring、Hibernate 等第三方框架。然后在各个模块中添加具体的子模块。以后开发中需要用到哪个模块,在依赖中添加那个模块即可。
底层模块结构图:

以下是各个 POM 之间的关系:
①lyyzoo > pom.xml

②lyyzoo-base > pom.xml

③lyyzoo-starter > pom.xml

2.2 依赖管理
结构建好后,就需要进行一些详细的依赖配置工作了,lyyzoo 是所有模块的父类,所以在 lyyzoo 中需要添加公用的属性、依赖管理、maven 插件等。
首先将所有的版本号提出来,放到里,这样一旦需要切换到另一个版本时,就可以只改个版本号就达到目的了。其中列出了一些属性如下:包括底层的版本、Java 版本、Spring、Hibernate 的版本等等。

1.0-SNAPSHOT 1.8 ${java.version} ${java.version} UTF-8 1.16.14 1.7.7 1.1.3 5.1.38 0.9.5.2 4.12 3.1.0 4.2.6.RELEASE 1.7.3 1.7.3 5.0.1.Final 1.0.0.Final
接着,引入依赖管理,在 lyyzoo 中引入其它项目将会用到的所有三方 jar 包的依赖,所有的依赖都添加到中,这样就可以方便的管理所有的 jar 包了。下面列出引入的一部分 jar 包,其它的可参考源码。
① 首先需要引入 lyyzoo 下的其它模块,如 lyyzoo-base-core、lyyzoo-starter-base 等模块。

com.lyyzoo lyyzoo-base-core ${lyyzoo.version}
com.lyyzoo lyyzoo-base-data ${lyyzoo.version}
com.lyyzoo lyyzoo-starter-base ${lyyzoo.version}
com.lyyzoo lyyzoo-starter-jpa ${lyyzoo.version}
②JDBC 相关,相关 jar 包有 c3p0,用于作数据库连接池;MySQL 驱动包;dbutils,对 JDBC 进行了简单的封装,使用起来简单方便。

com.mchange c3p0 ${c3p0.version}
mysql mysql-connector-java ${mysql.version}
commons-dbutils commons-dbutils 1.5
③ 日志相关:

org.slf4j slf4j-api ${slf4j.version}
ch.qos.logback logback-classic ${logback.version}
org.slf4j log4j-over-slf4j ${slf4j.version}
④Spring 相关,包括了 Spring aop、Spring mvc 等。

org.springframework spring-aop ${spring.version}
org.springframework spring-aspects ${spring.version}
org.springframework spring-beans ${spring.version}
org.springframework spring-context ${spring.version}
org.springframework spring-context-support ${spring.version}
org.springframework spring-core ${spring.version}
org.springframework spring-jdbc ${spring.version}
org.springframework spring-jms ${spring.version}
org.springframework spring-orm ${spring.version}
org.springframework spring-tx ${spring.version}
org.springframework spring-web ${spring.version}
org.springframework spring-webmvc ${spring.version}
⑤hibernate 相关:

org.hibernate hibernate-c3p0 ${hibernate.version}
org.hibernate.common hibernate-commons-annotations ${hibernate.version}
org.hibernate hibernate-core ${hibernate.version}
org.hibernate hibernate-entitymanager ${hibernate.version}
所有的依赖添加好后,就需要为各个子模块添加具体的依赖了,根据每个子模块的功能,添加相关的依赖,而不是将所有的依赖一次性加入。这样我们就可以根据自己开发的项目的需要,添加模块依赖,而不是一次性加入所有 jar 包,避免冗余,增大项目的体积。下面以 lyyzoo-base-data 和 lyyzoo-starter-jpa 为例说明。
lyyzoo-base-data 模块是基础数据相关,主要与数据库打交道,那么就需要引入 MySQL 驱动、数据库连接池 c3p0 等,pom.xml 如下:

4.0.0 com.lyyzoo lyyzoo-base 1.0-SNAPSHOT lyyzoo-base-data ${project.artifactId} jar commons-dbutils commons-dbutils mysql mysql-connector-java com.mchange c3p0 com.lyyzoo lyyzoo-base-test test
lyyzoo-starter-jpa 是 Java 持久化相关,所以主要引入 hibernate 相关的依赖,同时,starter-jpa 会依赖 base-data 及 starter-base,pom.xml 如下:

4.0.0 com.lyyzoo lyyzoo-starter 1.0-SNAPSHOT lyyzoo-starter-jpa ${project.artifactId} jar com.lyyzoo lyyzoo-base-data com.lyyzoo lyyzoo-starter-base org.hibernate hibernate-c3p0 org.hibernate.common hibernate-commons-annotations org.hibernate hibernate-core org.hibernate hibernate-ehcache org.hibernate.javax.persistence hibernate-jpa-2.1-api org.hibernate hibernate-validator com.lyyzoo lyyzoo-starter-test test
2.3 类结构
有了前面的基础之后,接下来进行重点的类结构设计。底层需要做的最重要的工作就是将一些通用的类抽象出来,以便于以后重用,从而提高开发效率。例如返回结果和分页类的封装、通用的工具类、JDBC 相关的操作等。
说明一下,整个底层很大一部分是从之前实习的公司(这个就不说了)直接拿过来的,有些则更改了。相信我拿取的这部分代码并不会涉及机密问题,不用于商业用途,仅仅只是学习,应该没多大问题。
(1) lyyzoo-base-core
lyyzoo-base-core 目录结构:

lyyzoo-base-core 是基础核心,封装了返回结果和加入了一些常用的工具类。
com.lyyzoo.bean 包下封装了 BaseBean 和 Result,BaseBean 是 Bean 类的一个基础类,实现了序列化,重写了 toString()方法,如下:

package com.lyyzoo.bean;import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;import java.io.Serializable;/*** BaseBean 实现序列化 ** @author bojiangzhou* @date 2017-03-27*/
public abstract class BaseBean implements Serializable {/*** ToStringBuilder – 用于辅助实现Object.toString()方法
*/public String toString() {return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);}}
Result 则封装了返回的结果,这里主要与 ExtJs 相对应,ExtJs 进行 AJAX 请求时,返回 success=true,会进入 success()方法;返回 success=false,会进入 failure()方法。同时,封装了返回消息、标识、错误信息等,便于前端拿到相应数据。

package com.lyyzoo.bean;import lombok.Data;import java.util.Map;/*** 封装返回结果** @author bojiangzhou* @date 2017-03-27*/
@Data
public class Result extends BaseBean {private static final long serialVersionUID = 1L;/*** 成功标志*/public boolean success;/*** 返回标示*/public Integer code;/*** 相关消息*/public String msg;/*** 相关数据*/public Object data;/*** 错误详细*/public Map errors;public Result() {}public Result(boolean success) {this.success = success;}public Result(boolean success, Integer code, Object data, String msg) {this(success);this.code = code;this.data = data;this.msg = msg;}public Result(Integer code, Map errors, String msg) {this.success = false;this.code = code;this.errors = errors;this.msg = msg;}public boolean isSuccess() {return this.success;}public boolean hasErrors() {if (this.errors != null && this.errors.size() > 0) {return true;}return false;}
}
其它的主要是一些工具类,例如 Arrays 继承了 org.apache.commons.lang3.ArrayUtils,使得 Arrays 具有了丰富的操作集合的工具。再如 Dates,Dates 里封装了大量的对日期操作的方法,比如格式化日期、获取某个日期当天的开始时间和结束时间等。
(2) lyyzoo-starter-base
lyyzoo-starter-base 目录结构:

lyyzoo-starter-base 是 Web 应用程序的一个基础,主要封装了基础实体类以及 spring-base 和日志的配置。实体的顶层是 AbstractEntity,AbstractEntity 继承 BaseBean。AbstractEntity 重写了 equals 和 hashCode 方法,主要做的处理是,如果两个实体的 id 相同也算这两个对象为同一个对象。代码如下:

package com.lyyzoo.data.entity;import com.lyyzoo.bean.BaseBean;import java.io.Serializable;/*** 抽象实体类 重写equals和hashCode方法** @author bojiangzhou* @date 2017-03-28*/
@SuppressWarnings("serial")
public abstract class AbstractEntity extends BaseBean implements Serializable {public abstract ID getId();@Overridepublic boolean equals(Object obj) {if (null == obj) {return false;}if (this == obj) {return true;}if (!getClass().equals(obj.getClass())) {return false;}AbstractEntity> that = (AbstractEntity>) obj;return null == this.getId() ? false : this.getId().equals(that.getId());}@Overridepublic int hashCode() {int hashCode = 17;hashCode += null == getId() ? 0 : getId().hashCode() * 31;return hashCode;}}
BaseEntity 则继承 AbstractEntity,BaseEntity 作为其它实体的父类存在,BaseEntity 定义了主键 ID 的生成策略。代码如下:

package com.lyyzoo.data.entity;import lombok.Data;import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;/*** 统一定义id的entity基类.* * 抽象实体基类,提供统一的ID,和相关的基本功能* */
@Data
@MappedSuperclass
@SuppressWarnings("serial")
public abstract class BaseEntity extends AbstractEntity {/*** id 字段*/@Idprotected Long id;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)public Long getId() {return this.id;}public void setId(Long id) {this.id = id;}
}
spring-base.xml 是基础配置,主要配置了扫描系统的配置文件、注解等。

Spring Base Config
(3) lyyzoo-starter-jpa
lyyzoo-starter-jpa 目录结构:

lyyzoo-starter-jpa 集成了持久化相关的操作,配置等。
首先需要做持久化相关的配置(spring-base-jpa.xml),如数据源、SessionFactory、事务管理等。数据源使用 c3p0,数据源相关配置如数据库驱动、地址等写到到配置文件中。配置 Hibernate SessionFactory 的同时,增加了 JdbcTemplate。事务管理器使用 Hibernate 的事务管理。总的配置如下:

Spring Jpa ${hibernate.dialect} ${hibernate.show.sql} ${hibernate.hbm2ddl.auto} com.lyyzoo.*.entity
然后在 com.lyyzoo.data.domain 包下,Page 封装了分页相关的属性,如当前页数据、页码、每页大小、总页数等。com.lyyzoo.data.util 包下,Sqls 封装了操作 SQL 语句的工具,比如根据传入的查询语句,返回查询总数的 SQL 语句。在 com.lyyzoo.data.jdbc 包下,JdbcTemplateSupport 封装了比较复杂的查询,比如根据传入的参数、分页条件等,自动查询数据、总数并封装到 Page 里返回。com.lyyzoo.data.dao 包下,SimpleDao 封装了基于 Hibernate SessionFactory 的简单的增删改查操作,如 save(),get()等方法。dao 包下,BaseDao 继承 SimpleDao,并代理了 JdbcTemplateSupport,使得 BaseDao 具有 SimpleDao 和 JdbcTemplateSupport 的功能,BaseDao 则作为其它 dao 的一个父类存在。最后,在 com.lyyzoo.service 包下,BaseService 代理了 BaseDao,进行了进一步的封装,BaseService 是其它 service 类的父类,其它 service 就可以直接调用 save、get、page 等内置方法。
(4) lyyzoo-starter-web
lyyzoo-starter-web 自然跟 Web 相关,在 com.lyyzoo.web 包下,BaseController 作为 controller 类的父类,主要封装了返回结果集等信息。还有 Web 相关配置,如视图解析器等内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xmlns:beans="http://www.springframework.org/schema/beans"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:task="http://www.springframework.org/schema/task"xmlns:util="http://www.springframework.org/schema/util"xmlns:jee="http://www.springframework.org/schema/jee"xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:tool="http://www.springframework.org/schema/tool"xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsdhttp://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsdhttp://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd"><description>Spring Web</description><!-- 加载config.properties --><context:property-placeholder location="classpath*:/config/*.properties" file-encoding="UTF-8" /><!-- 扫描Controller以及ControllerAdvice --><context:component-scan base-package="com.lyyzoo" use-default-filters="false"><context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/><context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/></context:component-scan><!-- 静态资源映射 --><mvc:resources location="/static/" mapping="/static/**"/><!-- 容器默认的DefaultServletHandler处理 所有静态内容与无RequestMapping处理的URL--><mvc:default-servlet-handler /><!-- 支持@Controller注解 --><mvc:annotation-driven /><!-- 视图解析器 --><bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/view"/><property name="suffix" value=".jsp"/></bean></beans>
(5) 类结构图
类结构图参考《底层类结构.vsd》

资源下载地址:https://download.csdn.net/download/sheziqiong/85639395
资源下载地址:https://download.csdn.net/download/sheziqiong/85639395
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
