统一扣费系统毕业设计说明书.doc

上传人:爱问知识人 文档编号:3291014 上传时间:2019-08-08 格式:DOC 页数:46 大小:3.24MB
返回 下载 相关 举报
统一扣费系统毕业设计说明书.doc_第1页
第1页 / 共46页
统一扣费系统毕业设计说明书.doc_第2页
第2页 / 共46页
统一扣费系统毕业设计说明书.doc_第3页
第3页 / 共46页
统一扣费系统毕业设计说明书.doc_第4页
第4页 / 共46页
统一扣费系统毕业设计说明书.doc_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《统一扣费系统毕业设计说明书.doc》由会员分享,可在线阅读,更多相关《统一扣费系统毕业设计说明书.doc(46页珍藏版)》请在三一文库上搜索。

1、中北大学2009届毕业设计说明书1 引言1.1 背景与意义统一扣费是指,由信誉好、规模大的第三方在线购物平台为一些小网站或个人做代理,将他们的产品发布在自己站内,并为其实施代理扣费的营销模式1。这样的第三方购物平台从表面上看起来和普通的购物网站没有多大区别,但本质上它是在为别人销售产品,它的盈利点不在于销售产品的利润,而在于它所代理的客户的“代理费”。自21世纪以来,我们进入了一个信息化时代,互联网在人们的生产生活中的作用越来越大。利用网络作为载体从事营利性经济活动的大小企业与个人多如牛毛,大家无疑都看重了互联网作为营销阵地所具有的得天独厚的优势。以网上销售为例,商家没有库存压力、经营成本低、

2、经营规模不受场地限制,与传统营销模式相比将会具有更强的竞争力2。但与此同时,互联网的高度开放性使得潜在客户的注意力难以集中到自己的站点上,只有那些拥有足够资金来做广告宣传与推广的商家才有可能抢占先机,首先被人注意3。而对于刚刚起步的小企业或者在资金上无法与企业匹敌的个人来说,被浏览互联网的用户注意到的机会微乎其微。 在这样的劣势之下,将自己的产品和服务发布在一个公众效益好的代理式的统一扣费网站,将是一个比较好的解决方案。如果再考虑到网上购物的安全性的话,统一扣费网站的营利空间将会更大。由于网上购物的特殊性,安全性一直是消费者和企业都在顾虑和致力解决的问题。目前常见的解决方案就是在付款环节采用担

3、保交易的方法,或者间接的利用银行提供的安全认证服务4。但目前国内的第三方支付平台往往是自己开发自己使用,如淘宝和支付宝,腾讯和财务通,担保交易市场并不成熟。消费者也总是愿意去大网站买东西,对小规模、信誉难以保证的小网站和个人网店不屑一顾5。这也正是统一扣费网站的优势所在。它可以凭借自己的雄厚资金将第三方支付系统的服务集成进来,消费者自然就会消除购物安全和信誉方面的顾虑。统一扣费系统是为自己的加盟商家发布商品的平台,同时要吸引消费者选购商品,其完善的功能、友好的交互界面、强大便捷的后台管理等因素直接决定了整个营销流程的成功与否。1.2 系统设计思想本系统采用目前业界做web项目时广泛使用的MVC

4、架构进行设计,完全具有运行平台和操作系统无关性,能在不同种类的服务器上运行。这样的设计确保了系统运行的稳定性和高效性,及充分考虑到了功能的可扩展性,为将来系统的进一步更新升级铺平了道路。表现层:客户端采用HTML、Javascript、CSS等技术,实现客户端良好的交互界面。服务器端采用JSP和Servlet技术,负责处理用户的输入和向用户的输出,并根据业务逻辑层反馈信息动态生成页面内容。控制层:当客户端发送一个*.do的请求时,由struts的核心控制器拦截,调用业务层方法,然后根据其执行结果及具体参数转到下一张页面。业务逻辑层:商业逻辑层是服务器端表示层和数据层之间的纽带,它以JDBC访问

5、数据层,并将数据封装成JavaBean传递给服务器端表示层。商业逻辑层用于处理商务逻辑和计算,并实现安全、事务、日志等功能。数据持久层:使用Hibernate实现数据库层实际的数据存储和检索,并保证数据完整性和安全性。 其中业务逻辑层和数据持久层可以合起来称为模型层,这样总体上整个系统就形成了MVC的三层结构6。采用MVC结构的优点是各逻辑层既相互独立又紧密联系任何一层的改动都不会影响到其它逻辑层的工作,同时系统采用面向对象的模块化设计和开放式J2EE系统结构,因此具有高度的可扩展升级性、集成性(与第三方)、可移植性(运行平台,数据库)、可配置性(工作流程系统参数)、可维护性(运行故障时易于调

6、试和维护)7。2 应用技术及开发平台介绍2.1 技术介绍下面对开发web项目时常用的技术及设计方法做一些简要介绍: 2.1.1 B/S软件体系结构B/S结构(Browser/Server,浏览器/服务器模式)统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用8。B/S结构与C/S结构相比,主要特点有:维护和升级方式简单,软件系统的改进和升级只需要针对服务器进行,大量节省人力、物力、时间和费用;使用B/S架构的应用软件的客户端,只需安装浏览器即可,无需关心服务器使用什么样的系统或数据库,这就使得成本降低,配置可以更加灵活9。2.1.2 JavaEE和 web项目开

7、发的相关技术Servlet是java语言用于开发B/S结构应用程序的基本技术,可使程序的业务逻辑和显示逻辑都放在服务器端运行10。Servlet可在特定服务器环境下接受客户端(浏览器)请求,对其处理后把响应结果重新发送给客户端。Jsp(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准11。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。它具有如下优势:一次编写,到处运行;跨平台支持;强大的可伸缩性;多样化和功能强大的开发工具支持。Struts是一个为开发基于模

8、型(Model)视图(View)控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Java Servlet和JSP构建Web应用的一项非常有用的技术12。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,因而吸引了众多的开发人员的关注。2.1.3 MVC设计模式MVC模式是”Model-View-Controller”的缩写,中文翻译为模式-视图-控制器13。MVC应用程序总是由这三个部分组成:Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自

9、动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己14。2.1.4 Spring技术Spring是一个开源框架,被认为是最有前途的开源框架之一14。它是由RodJohnson创建的,她的诞生是为了简化企业级系统的开发,Spring是一种轻量级的容器,并且是非入侵式的,用Spring开发的系统中的类不需要依赖Spring中的类,不需要容器支持(当然Spring本身是一个容器),而且Spring的大小和运行开支都很微量。一般来说,如果系统不需要分布计算或者声明式事务支持那么Spring是一个更好的选择。Spring的核心就是两个概念,反向控制(

10、IOC),面向切面编程(AOP)15。IOC:IOC的全称是InversionofControl,中文翻译反向控制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查找需要的对象,是主动的,而Spring是把依赖的对象注入给相应的类,是被动的,所以称之为“反向”。AOP:AOP全称是Aspect-OrientedProgramming,中文翻译是面向方面的编程或者面向切面的编程,现在的系统往往强调减小模块之间的耦合度,AOP技术就是用来帮助实现这一目标的。2.1.5 Hibernate技术Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松16。运行

11、时,Hibernate读取映射文档,然后动态构建Java类,以便管理数据库与Java之间的转换。在Hibernate中有一个简单而直观的API,用于对数据库所表示的对象执行查询。要修改这些对象,(一般情况下)只需在程序中与它们进行交互,然后告诉Hibernate保存修改即可。类似地,创建新对象也很简单;只需以常规方式创建它们,然后告诉Hibernate有关它们的信息,这样就能在数据库中保存它们。2.2 开发平台开发环境:windows xp操作系统,JDK 6.0,JavaEE 5.0,tomcat 6.0服务器,Oracle 10g数据库IDE:MyEclipse 6.5(集成了许多优秀的插

12、件,使编码更便捷,web项目更易于管理)其他开发工具:sqlplus, Rational Rose, plsqldev等2.3 运行环境浏览器:Mozilla FixFox(使用其他浏览器可能会发生错误)Web服务器:tomcat 6.0数据库:Oracle 10g3 需求分析3.1 设计目标3.1.1 业务需求统一扣费系统的主要客户群其实不是在本网站购物的普通用户,而是提供产品的加盟商家,所以该系统的产品应该有一个标识,可以标志其来自哪个客户站点或个人网店,并可以对其进行管理。其次要实现在线购物的功能,使得用户可以在网站内反复挑选、斟酌要买的商品,并可以设置商品数量、支付渠道、付款方式、送货

13、方式等信息。确认购买后可以查看提交过的订单内容和当前状态。然后要能够对购物中涉及到的实体进行方便而完善的管理,如对产品、用户、订单等实体进行增删改查等。3.1.2 基本要求使系统界面友好,易于操作。把业务逻辑尽量封装起来,不要让用户参与过多不必要的逻辑判断。程序简洁,可读性强,结构合理。尽量降低层与层之间的耦合,使代码依赖性降低,可移植性和通用性增强。3.2 功能模块3.2.1 系统边界对需求进行进一步分析,可以初步确定本系统的边界,即对客户站点来说,它是源点(产品来自客户站点),而像银行这样的系统则相当于汇点,用户订单中有关费用的信息最终要发送到银行(本系统中的支付渠道)进行处理。对这两个实

14、体,在系统设计时可以维护它们的引用,使得系统内部实体与外部实体能够更加合理的关联起来。3.2.2 功能模块从以上的需求分析来看,除核心业务外,系统的功能可以划分为后台管理和自服务两大部分。普通用户进入自己的账户后可以进行的操作就属于自服务,如查看、修改个人信息,查看自己提交过的历史订单等。而后台管理是为系统管理员提供的一个平台,用来管理系统的主要业务模块。当实体确定以后,后台管理的对象将会更加明确。下图3.1显示了本系统的边界及功能模块:图3.1 系统边界及功能模块3.3 系统用例用例图可以帮助我们进一步确定系统到底要实现什么功能。用例图由角色(Actor)和用例(Usecase)组成,每个用

15、例代表一个功能,一个用例可以有多个子用例,角色就是这些功能的使用者,角色可以是人,也可以是调用本系统的其他系统17。从以上的功能模块分析来看,系统中至少有两个角色:普通用户和系统管理员,普通用户是核心业务(购买)和自服务的使用者,管理员是后台管理的使用者。具体的角色用例关系如图3.2、图3.3所示:图3.2 普通用户用例图图3.3 系统管理员用例图4 系统设计4.1 系统结构本系统从软件设计角度可划分为数据持久层、业务逻辑层、控制层和表现层,即所谓的MVC结构。之所以要把程序分成多层,无非是要使代码更易于维护和管理,同时增强可扩展性。良好的程序结构设计首先应该符合开闭原则,即对代码的增加“开”

16、,对修改和删除“闭”。其次要降低代码的冗余,提高通用性,即符合被称作“Dont repeat yourself”的原则。4.2 实体模型从需求分析阶段的分析可以确定业务对象模型,也就实体模型,实体是指程序中那些与数据库表有对应关系的类。由于数据库设计是有严格规定的,所以与之对应的实体的属性也应是有依据的。经过系统用例和时序流程的分析,现在已经可以确定本系统中涉及到的类及实体:用户User,订单Order,订单项Item,支付渠道PayChannel,产品Product,客户站点(货源)ClientSite,产品类型ProductType,管理员Admin。类图及类间关系如图4.1:图4.1 系

17、统类图用户、产品和订单是基本实体,要进行购物就必须有这些可供操作的对象存在。产品类型、支付渠道、客户站点则是以上的基本实体要引用的辅助性实体。图5中每个类都列出了其主要属性,它们都有一个共同属性id,用来和数据库表的主键id对应。图中的虚线箭头表示关联关系,如Order指向User,表示Order与User关联,某个订单必定属于某个用户。图中的关联关系都为一对多关系。在实际运用中一对多关系经常出现,有时甚至会把一个多对多关系拆分成两个一对多关系。如本系统中的Order和Product就是多对多关系,这是很显然的。但是为了数据库设计和编码简单,就另引入一个实体Item。4.3 数据库设计数据库设

18、计在一个信息管理系统中的地位非常重要,良好的设计可以提供数据存取效率、简化数据管段应设计数据库的理和维护,并使数据库保持安全和完整。数据库设计几乎贯穿了软件设计的整个过程。在需求分析阶段应该分析客户的业务和数据处理需求,概要设计阶E-R模型图,确认需求信息的正确和完整。详细设计阶段应将E-R图转换为多张表,进行逻辑设计,并应用数据库设计的三大范式进行审核。代码编写阶段应选择具体数据库进行物理实现,并编写代码实现前端应用。4.3.1 数据库概念设计用户的需求具体体现在各种信息的提供、保存、更新和查询,这就要求数据库结构能充分满足各种信息的输出和输入。本系统涉及到了众多实体,对这些实体的增删改查分

19、布到了用户和管理员的各个用例中。将E-R图转换为关系模型实际上就是要将实体、实体的属性和实体之间的联系转化为关系模式,这种转换一般遵循如下原则18:一个实体型转换为一个关系模式。实体的属性就是关系的属性。实体的码就是关系的码。一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。一个1:1联系可以转换为一个独立的关系模式,也可以与任

20、意一端对应的关系模式合并。三个或三个以上实体间的一个多元联系转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性。而关系的码为各实体码的组合。同一实体集的实体间的联系,即自联系,也可按上述1:1、1:n和m:n三种情况分别处理。具有相同码的关系模式可合并。为了进一步提高数据库应用系统的性能,通常以规范化理论为指导,还应该适当地修改、调整数据模型的结构,这就是数据模型的优化。确定数据依赖。消除冗余的联系。确定各关系模式分别属于第几范式。确定是否要对它们进行合并或分解。一般来说将关系分解为3NF的标准,即表内的每一个值都只能被表达一次;表内的每一行都应该被唯一的标识

21、(有唯一键)。表内不应该存储依赖于其他键的非键信息。根据以上规则,订单和产品本为m:n 关系,而在关系数据库中无法直接表现多对多关系,通常的做法是另建一张表,成为外键表,用来维护两个外键列,分别指向订单和产品,这两列联合唯一。但这张表通常是不对应实体的,只是在表中还含有其他属性时,外键表才会对应程序中的实体。这里的Item就是这样的中间性的实体。4.3.2 数据库逻辑结构设计此阶段应收集基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为后面的具体设计打下基础。经过对整个购物流程、产品入库、订单提交中数据流动做分析,确定了在各个阶段需要的数据类型,其中有很多是表示状态或日期的。最终

22、设计的表的详细信息如下(以下数据类型可能只在oracle中有效):表4.1 sc_user表列名字段类型长度是否为空说明idusernamerealnamepasswordaddresscellphonefindQuefindKeyintegervarchar2Varchar2varchar2varchar2varchar2varchar2varchar23230301535154040not nullnot null主键唯一约束(无)(无)(无)(无)密码找回问题密码找回答案表4.2 sc_order表列名字段类型长度是否为空说明idstatuscostmadeDateu_idpc_idin

23、tegervarchar2numberdateintegerinteger3213232not nullnot null主键约束:Y 或 N(无)(无)外键,用户外键,支付渠道表4.3 sc_paychannel表列名字段类型长度是否为空说明idnameexchange_limitdescrintegervarchar2number(12,2)date322030not null主键(无)交易限额(无)表4.4 sc_item表列名字段类型长度是否为空说明idcountcosto_idp_idintegerintegernumberintegerinteger32203032not null主

24、键产品数量本项小计外键,订单外键,产品表4.5 sc_product表列名字段类型长度是否为空说明idnamepricedescriptionClient_priceImg_pathClient_product_idClient_producttype_idt_idcs_idintegervarchar2Number(12,2)varchar2Number(12,2)varchar2integerintegerintegerinteger321002563220not null主键(无)(无)(无)(无)(无)(无)(无)外键,产品类型外键,客户站点表4.6 sc_clientsite表列名字

25、段类型长度是否为空说明idnameurlenterDatekeywordclassintegervarchar2varchar2datevarchar2integer3240254032not null主键(无)客户站点网址录入系统日期关键字,描述级别表4.7 sc_producttype表列名字段类型长度是否为空说明idnameintegervarchar23215not null主键(无)表4.8 sc_admin表列名字段类型长度是否为空说明idUsernamepasswordRoleintegervarchar2varchar2Varchar232301515not nullNot n

26、ullNot null主键(无)(无)角色下图4.2展示了各个实体所对应的表及其关系:图4.2 表及表间关系设计逻辑结构应该选择最适于描述与表达相应概念结构的数据模型,然后选择最合适的DBMS。本系统功能类似于大型的网上购物商城,如果业务扩展,对数据库的存取量和频率将会成倍提高,所以一开始就使用一流的数据库将有利于之后的发展。本系统拟采用Oracle数据库10g。4.3.3 数据库实施该阶段应使用DBMS提供的语言(如SQL/PL),根据逻辑设计和物理设计的结果建立数据库,组织数据入库。数据库操作有很多方便的软件可以使用,如sqlplus、plsqldev、PowerDesigner等,可以方

27、便的建表、插入数据等,甚至是生成大量的测试数据,供排序、分页等程序测试使用。 首先在oracle中创建用户,sql语句如下:Create user javauser Identified by 123456Default tablespace usersTemorary tablespace temp;在oracle中创建用户需要指定默认表空间和临时表空间,这是oracle独有的,目的是把该用户下创建的表分离在不同的空间中,防止重名,类似于java中用包名来保证每个包中的类名不重复,而不同包内可以出现重复类。 然后基于上文对表的设计,可使用类似下面列出的sql语句建表:create table

28、 sc_order(id integer constraint sc_order_id_pk primary key,status varchar2(1) constraint sc_order_status_nn not null constraint sc_order_status_ck check(status in(N,Y),cost number ,made_date date,u_id integer constraint sc_order_uid_fk references sc_user(id),pc_id integer constraint sc_order_cid_fk

29、references sc_paychannel(id);create sequence sc_order_seq start with 3010001;本系统将使用Oracle提供的序列sequence来为表生成主键,所以每张表对应一个sequece。另外由于多个表之间有相互参照关系,所以建表时应注意先建父表(被引用的表),再建子表。 最后可以使用类似下面的sql语句在数据库中插入测试数据:insert into sc_producttype values(sc_producttype_seq.nextval,书籍杂志);insert into sc_producttype values(s

30、c_producttype_seq.nextval,电子产品);insert into sc_producttype values(sc_producttype_seq.nextval,生活用品);commit;其中主键是用序列的下一个值来赋值的。最后不要忘了用commit命令提交事务,表示把刚才用DML语句插入的数据真正的写到数据库中。5 系统实现及功能介绍本章首先介绍系统实现的技术细节和运行原理,所谓“知其所以然”,同时作为一个说明文档,使日后对系统作维护和功能扩展时能很快理清思路。接着会介绍一下系统的业务功能及使用方法、注意事项等,为系统的使用者做一个初步指导。5.1 Hibernate

31、实现数据持久层上文已经详细陈述了本系统中的实体及数据库表,数据持久层的主要功能就是完成ORM(Object-Relation Mapping),即将程序中的对象插入、更新为某张表的一条记录,或把数据库中的记录查询出来、组装成对象。本系统在数据持久层采用Hibernate技术,在配置文件可定义对象与表的映射关系,如对象名-表名、对象id-主键id、普通业务属性名-列名、关系属性-外键列,以及级联方式、主键生成策略等信息。一般要为每个实体做一份配置。下面是一份配置文件示例:文件Order.hbm.xml :sc_order_seq 文件Item.htm.xml :sc_item_seq 从以上配置

32、文件中可以看出,Order 和 Item是一对多关系,外键在Item表中,外键列为o_id。另外主键都是由sequence生成的。如果项目中只用Hibernate,没有与Spring整合,那么Hibernate将在hibernate.cfg.xml中配置数据源,然后用类似下面的代码段得到Session:SessionFactory factory= new Configuration().configure().buildSessionFactory();Session session=factory.openSession();接着就可以进行增删改查操作了。这里不属于这种情况,这一点会在Sp

33、ring与Hibernate整合部分再做介绍。5.2 Struts实现MVC流程调度5.2.1 Struts实现MVC基本原理本系统的主体结构是MVC,struts就是一款优秀的MVC框架。Struts1.2的工作原理如下:Struts的前端控制器ActionServlet会负责截取客户端格式*.do的请求,并把请求参数封装到ActionForm中,然后根据*代表的内容把请求分发到相应的action,去执行其excute()方法,执行完毕后根据配置返回到mapping.findForward(“”);的实参指定的页面。这就是由struts调度的一次请求的完整过程。图5.1为struts经典实现

34、的时序图:图5.1 struts 流程调度时序图之所以称struts为MVC框架,是因为从整体上看,struts在程序中充当的是控制器的角色:首先接待View层的请求,分析后分发到相应的Action,也称后端控制器,在Action中继续调用Model层的业务方法,最后根据返回结果转到相应页面,回到了View层。要想使用struts,我们要做的就是:继承Action,实现自己的业务调用,然后做一些配置即可。Struts对业务代码的侵入性较弱,可以称作是一个优秀的框架,尤其是不久前做了版本更新后。5.2.2 在程序中运用struts要使用struts构建程序的框架,首先应该把struts相关的ja

35、r包放到tomcat的lib目录下,并在项目的classpath下配好struts的编译时依赖。下面以产品Product为例说明接下来要做的几步配置或编码:在Web.xml 中配置struts前端控制器(ActionServlet) action org.apache.struts.action.ActionServlet config/WEB-INF/struts-config.xml 2 action *.do 编写程序继承struts提供的Action和Form类,form中要对每个属性都提供get()和set()方法,action中按特定的方法签名写自己的具体实现,本系统中大部分Act

36、ion都是继承的MappingDispatchAction类(与经典实现不同)。代码节选如下:public class ProductForm extends ActionForm/属性名与Product完全相同,数据类型出现基本类型、封装类型和Stringprivate Integer id;private String name;private double price;private double clientPrice;private String imgPath;private String description;private Integer clientProductId;pr

37、ivate Integer clientProductTypeId;private Integer productTypeId;private Integer clientSiteId;public Integer getId() return id;public void setId(Integer id) this.id = id;public String getName() return name;public void setName(String name) this.name = name;public double getClientPrice() return clientP

38、rice;public void setClientPrice(double clientPrice) this.clientPrice = clientPrice;/其他get()和set()方法不再列出public class ProductAction extends MappingDispatchActionprivate ProductBiz productBiz;/维护biz的引用,方便调用其方法private ProductTypeBiz productTypeBiz;private ClientSiteBiz clientSiteBiz;public ProductBiz ge

39、tProductBiz() return productBiz;public void setProductBiz(ProductBiz productBiz) this.productBiz = productBiz;/其他get()和set()不再列出public ActionForward addProduct(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response)tryProductForm pf=(ProductForm)form;Product p=

40、new Product();BeanUtils.copyProperties(p, pf);Integer productTypeId=Integer.parseInt(request.getParameter(productTypeId);ProductType pt=productTypeBiz.getById(productTypeId);p.setProductType(pt);Integer clientSiteId=Integer.parseInt(request.getParameter(clientSiteId);ClientSite cs=clientSiteBiz.getById(clientSiteId);p.setClientSite(cs);productBiz.save(p);request.setAttribute(insertedProduct, p);System.out.println(-产品ac

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1