JAVA平台系统的开发方法及相关技术.doc_第1页
JAVA平台系统的开发方法及相关技术.doc_第2页
JAVA平台系统的开发方法及相关技术.doc_第3页
JAVA平台系统的开发方法及相关技术.doc_第4页
JAVA平台系统的开发方法及相关技术.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

装订线毕业论文(说明书)图2-2 Spring的特性图4-10 站点流程图车辆查询流程图如图4-11所示:图4-11用户查询流程图4.3.6 监控管理监控车辆管理可以让用户在线的查看这个车辆的所有数据,并显示为车辆运行图。图4-12用户查询流程图监控数据查询流程图如图4-13所示:图4-13 用户查询流程图4.4本章小结本章详细描述了系统的软件详细设计,包含了系统的软件框架,软件的程序结构图,以及系统的各个模块的数据流程图。第5章 软件的开发与实现5.1 数据设计5.1.1 车辆表格设计车辆信息:包括车牌号、车辆类型、车辆类型、车辆状态、所属线路。表5-1车辆表字段名数据类型含义说明空值情况车辆IDint车辆的ID号自增主键车牌号nvarchar (10)车牌号非空车辆类型nvarchar (10)车辆的类型非空车辆状态nvarchar (10)车辆的使用类型非空所属线路int车辆在城市中属于哪条线路可为空5.1.2 站点表格设计站点信息:包括站点名称、站点状态。表5-2站点表字段名数据类型含义说明空值情况站点IDint站点的ID号自增主键站点名称nvarchar (10)站点名称非空站点状态nvarchar (10)站点的类型非空5.1.3 设备表格设计设备信息:设备名称、设备类型、设备参数、设备个数。表5-3设备表字段名数据类型含义说明空值情况设备IDint设备的ID号自增主键设备名称nvarchar (10)设备的名称非空设备类型nvarchar (10)设备的类型非空设备参数nvarchar (10)设备的参数可为空设备个数int设备的个数可为空5.1.4权限表格设计设备信息:权限名称、权限类型。表5-4权限表字段名数据类型含义说明空值情况权限IDint权限的ID号自增主键权限名称nvarchar (10)权限的名称非空权限类型nvarchar (10)权限的类型非空5.1.5 用户表格设计用户信息:包括姓名、性别、所属部门、工作岗位、身份证号码、联系电话、家庭住址。表5-5用户表字段名数据类型含义说明空值情况用户IDint用户的ID号自增主键姓名nvarchar (10)用户的姓名非空密码nvarchar (10)用户的密码非空性别nvarchar (10)用户的性别非空所属部门nvarchar (10)用户的所属部门可为空工作岗位nvarchar (10)用户的工作岗位可为空身份证号码nvarchar (10)用户的身份证号码可为空联系电话nvarchar (10)用户的联系电话可为空住址nvarchar (10)用户的住址可为空权限int对应的权限可为空5.2 GPRS数据获取本系统用java来收发AT指令控制GPRS CDMA,本文通过串口连接GPRS收发模块,具体的代码如下:1 获取串行端口COM2 portId = CommPortIdentifier.getPortIdentifier(COM2); sPort = (SerialPort) portId.open(commsms, 1000);2 设置串口通讯参数sPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);3 初始化方法public boolean init() portList = CommPortIdentifier.getPortIdentifiers();/ 遍历端口while (portList.hasMoreElements() portId = (CommPortIdentifier) portList.nextElement();/ 串行端口if (portId.getPortType() = CommPortIdentifier.PORT_SERIAL) System.out.println(portId.getName(); / 端口号if (portId.getName().equals(COM3) try serialPort = (SerialPort) portId.open(this.getClass().getName(), 5000);/ / 添加端口事件监听 serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); catch (PortInUseException e) e.printStackTrace(); return false; catch (TooManyListenersException e) return false;try is = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); br = new BufferedReader(new InputStreamReader(is); / 初始化串口 serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); System.out.println(端口COM3初始化成功); outputStream.write(ATr.getBytes(); System.out.println(is.read(); return true; catch (IOException e) return false; catch (UnsupportedCommOperationException e) return false; return false;4 发送方法public bool send_msg(string msg) try outputStream = serialPort.getOutputStream(); outputStream.write(msg.getBytes(); System.out.println(is.read(); return true; catch (IOException e) return false; catch (UnsupportedCommOperationException e) return false; return true;5 获取消息public string read_msg() String msg; try inStream = serialPort.getInputStream(); inStream.write(msg); System.out.println(msg); catch (IOException e) msg=null; catch (UnsupportedCommOperationException e) msg=null; return msg;5.3 SSH框架移植5.3.1 系统Model层实现1类UserBean:包名com.carsystem.model类名数据库表名UserBean.javaTB_USEROR映射文件UserBean.hbm.xml字段名private Integer userId;private String userName;private String userPassword;private String userSex;private String userDepartment;private String userJob;private String userIdentity;private String userPhone;private String userAddress;private String userRight;USER_IDUSER_NAMEUSER_PASSWORDUSER_SEXUSER_DEPARTMENTUSER_JOBUSER_IDENTITYUSER_PHONEUSER_ADDRESSUSER_RIGHT方法public void setUserId(Integer adminId);public Integer getUserId();public void setUserName(String userName);public String getUserName();public void setUserPassword(String userPassword);public String getUserPassword();public void setUserSex(String userSex);public String getUserSex();public void setUserDepartment(String userDepartment);public String getUserDepartment();public void setUserJob(String userJob);public String getUserJob();public void setUserIdentity(String userIdentity);public String getUserIdentity();public void setUserPhone(String userPhone);public String getUserPhone();public void setUserAddress(String userAddress);public String getUserAddress();public void setUserRight(String userRight);public String getUserRight();2类RightBean包名com.carsystem.model类名 数据库表名RightBean.javaTB_RIGHTOR映射文件RightBean.hbm.xml字段名private Integer rightId;private String rightName;private String rightType;RIGHT_IDRIGHT_NAMERIGHT_TYPE方法public Integer getRightId();public void setRightId(Integer rightId);public String getRightName();public void setRightName(String rightName) ;public String getRightType();public void setRightType(String rightType);3类EquipmentBean:包名com.carsystem.model类名 数据库表名EquipmentBean.javaTB_EQUIPMENTOR映射文件EquipmentBean.hbm.xml字段名private Integer equipmentId;private String equipmentName;private String equipmentType;private String equipmentPara;private int equipmenNum;EQUIPMENT_IDEQUIPMENT_NAMEEQUIPMENT_TYPEEQUIPMENT_PARAEQUIPMENT_NUM方法public Integer getEquipmentId() ;public void setEquipmentId(Integer equipmentId);public String getEquipmentName();public void setEquipmentName(String equipmentName) ;public String getEquipmentType();public void setEquipmentType(String equipmentType) ;public String getEquipmenPara();public void setEquipmenttParaString equipmentPara) ;public Integer getEquipmentNum() ;public void setEquipmentNum(Integer equipmentNum);4类SiteBean包名com.carsystem.model类名 数据库表名SiteBean.java TB_SITEOR映射文件SiteBean.hbm.xml字段名private Integer siteId;private String siteName;private String siteType;SITE_IDSITE_NAMESITE_TYPE方法public Integer getSiteId() ;public void setSiteId(Integer siteId);public String getSiteName() ;public void setSiteName(String siteName) ;public String getSiteType() ;public void setSiteType(String siteType) ;5类CarBean包名com.carsystem.model类名 数据库表名CarBean.javaTB_CAROR映射文件CarBean.hbm.xml字段名private Integer carId;private Strring carIdentity;private String cartType;private String carState;private Integer carLine;CAR_IDCAR_IDENTITYCAR_TYPECAR_STATECAR_LINE方法public Integer getCarId();public void setCarId(Integer carId) ;public String getCarIdentity();public void setCarIdentity(String carIdentity) ;public String getCarType();public void setCarType(String carType);public String getCarState();public void setCarState(String carState);public Integer getCarLine();public void setCarLine(Integer carLine) ;5.3.2系统数据访问对象DAO层实现DAO层中实现的接口和公共的类接口:IBaseHibernateDAO接口名IBaseHibernateDAO方法public Session getSession()DAO层中用到的公共类:BaseHibernateDAO类名BaseHibernateDAO (实现IBaseHibernateDAO接口)方法public Session getSession()1类UserBeanDAO:类名UserBeanDAO(继承于 BaseHibernateDAO)主要的方法public void save(UserBeantransientInstance);public void delete(UserBean persistentInstance);public UserBean findById(java.lang.Integer id);public List findByProperty(String propertyName, Object value);public List findAll();功能描述通过这个类实现对数据库的操作,可以通过相应的方法实现数据的增删改查。2类RightBeanDAO:类名RightBeanDAO(继承于 BaseHibernateDAO)主要的方法public void save(RightBeantransientInstance);public void delete(RightBean persistentInstance);public RightBeanfindById(java.lang.Integer id);public List findByProperty(String propertyName, Object value);public List findAll();功能描述通过这个类实现对数据库的操作,可以通过相应的方法实现数据的增删改查。3类EquipmentBeanDAO类名EquipmentBeanDAO(继承于 BaseHibernateDAO)主要的方法public void save(EquipmentBeantransientInstance);public void delete(EquipmentBeanpersistentInstance);public EquipmentBeanfindById(java.lang.Integer id);public List findByProperty(String propertyName, Object value);public List findAll();功能描述通过这个类实现对数据库的操作,可以通过相应的方法实现数据的增删改查。4类SiteBeanDAO类名SiteBeanDAO(继承于 BaseHibernateDAO)主要的方法public void save(SiteBeantransientInstance);public void delete(SiteBeanpersistentInstance);public SiteBeanfindById(java.lang.Integer id);public List findByProperty(String propertyName, Object value);public List findAll();功能描述通过这个类实现对数据库的操作,可以通过相应的方法实现数据的增删改查。5类CarBeanDAO:类名CarBeanDAO(继承于 BaseHibernateDAO)主要的方法public void save(CarBeantransientInstance);public void delete(CarBeanpersistentInstance);public CarBeanfindById(java.lang.Integer id);public List findByProperty(String propertyName, Object value);public List findAll();功能描述通过这个类实现对数据库的操作,可以通过相应的方法实现数据的增删改查。5.3.3系统中的ACTION类1类AccountAction:主要方法和相应的功能:public ActionForward signin(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)账号登陆页面,点击进入,登陆到系统public ActionForward reSignin(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)进入重新登陆页面public ActionForward exit(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)退出本系统2类AccountManageAction:主要方法和相应功能:public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)列出用户信息。public ActionForward doInfoModify(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)对用户的基本信息进行修改。public ActionForward doPasswordModify(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)用户修改密码。3类RightAction:主要方法和相应的功能:public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)列出所有权限数据。public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)增加权限数据。public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)删除权限数据。public ActionForward doMod(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)修改权限数据。4类EquipmentAction:主要方法和相应的功能:public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)列出相应的设备数据,若有传入设备参数则列出某个设备的信息。public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)增加设备数据。public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)删除设备数据。public ActionForward domod(ActionMapping mapping, ActionFormform,HttpServletRequest request, HttpServletResponse response)修改设备数据,根据传入的设备ID。5类SiteAction:主要的方法和相应的功能:public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)列出所有站点数据,若传入站点参数则列出某个站点的信息。public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)增加站点数据。public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)删除站点数据。public ActionForward domod(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)修改站点数据。6类CarAction:主要方法和相应的功能:public ActionForward view(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)列出车辆信息,若有车辆参数传入则列出相应车辆的信息。public ActionForward add(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)增加车辆数据。public ActionForward delete(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)删除车辆数据。public ActionForward domod(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)修改车辆数据。5.3.4 持久层Hibernate实现1 创建并配置Hibernate映射文件 在进行struts层的功能开发之前,我们需要基于Hibernate开发底层的DAO层。我们将分2个步骤进行开发。1. 创建Hibernate的持久化类和映射文件,并在applicationContext.xml中进行配置;2. 开发并配置Hibernate DAO层UserDAO.java、RightDAO.java、EquipmentDAO.java、SiteDAO.java、CarDAO.java。这是Hibernate层开发的第一步,使用MyEclipse的工具Database Explorer来自动创建Hibernate的持久化类和映射文件,对应的数据库分别为user、right、equipment、site、car表。最后生成的类文件包括:1. 持久化类的抽象类:AbstractUser.java、AbstractRight.java、AbstractEquipment.java、AbstractSite.java、AbstractCar.java;2. 持久化类:User.java、Right.java、Equipment.java、Site.java、Car.java;3. 映射文件:User.hbm.xml、Right.hbm.xml、Equipment.hbm.xml、Site.hbm.xml、SchCaredule.hbm.xml。需要在applicationContext.xml中注册该映射文件。2 开发并配置Hibernate DAO层 到目前为止,系统已经具备了Hibernate的基础访问功能,下面我们要开发Hibernate DAO层,使用HibernateTemplate实现对数据表的增、删、改、查的操作,包括如下三步:1. 定义接口类:AbstractUser.java、AbstractRight.java、AbstractEquipment.java、AbstractSite.java、AbstractCar.java;2. 开发实现类:User.java、Right.java、Equipment.java、Site.java、Car.java;3. 在applicationContext.xml中配置DAO及其代理。5.3.5 控制层Struts实现1 开发Struts核心流程代码 在以上经过对Hibernate持久化类、映射文件和DAO类的开发,已经具备了数据层的功能代码,下面我们就要开发Struts层的代码,来调用该数据层实现数据库的操作。要进行Struts层的功能开发,我们需要分4个步骤进行。1. 开发Struts核心流程代码,包括LoginForm.java和LoginAction.java、UserForm.java和UserAction.java、RightForm.java和RightAction.java、EquipmentForm.java和EquipmentAction.java、SiteForm.java和SiteAction.java、CarForm.java和CarAction.java、SuperviseForm.java和SuperviseAction.java及配置;2. 开发JSP页面原型,包括数据列表页面login.jsp、user.jsp、right.jsp、equipment.jsp、site.jsp、car.jsp;增加页面supervise.jsp,user_add.jsp、right_add.jsp、equipment_add.jsp、site_add.jsp、car_add.jsp;修改页面user_edit.jsp、right_edit.jsp、equipment_edit.jsp、site_edit.jsp、car_edit.jsp;并进行页面文字的国际化和样式修饰;3. 增加表单校验功能。主要修改增加页面、修改页面和表单类;4. 调用DAO类操作数据库。修改Actiono类调用DAO类中的函数,进行数据库的关联。接下来实现的是通讯录的请求处理流程的配置和类代码。实现的步骤包括如下:1. 新建并配置表单类:配置元素,并开发AddressForm.java表单类;2. 在struts-config.xml中添加请求配置:配置元素,并委托给Spring进行管理;3. 在applicationContext.xml中添加请求代理:配置与相匹配的元素,接收Struts的委托;4. 在applicationContext.xml中添加日志拦截:为请求地址添加日志拦截器;5. 开发Action类原型功能:设计Action类的请求处理函数,这里的函数现在还只是空架子,只能够进行页面的流转,没有实际的功能,目的是为了在开发完JSP页面后能够进行页面的流转。2 开发JSP页面原型 在上面配置了、及元素,并编写了表单类和Action类的原型代码,现在要开发JSP页面,将页面的链接地址、表单请求指向,由Struts和Spring来将该请求转发到Action类的函数中,实现整个页面的流转。实现的步骤如下:1. 在frame.jsp中添加一个新的菜单:该菜单是通讯录模块的入口,负责进入通讯录的列表页面;2. 开发数据列表页面:新建一个通讯录的HTML列表页,该页面提供增加、修改、删除的按钮,负责跳转到不同的页面;3. 开发增加页面:新建新增通讯录的HTML表单页,负责添加通讯录;4. 开发修改页面:新建修改通讯录的HTML表单页,负责修改通讯录;5. 进行页面文字的国际化:将以上3个JSP页面中的中文文字提取出来,在资源文件中为这些文字定义国际化标签,并在JSP页面中引用这些标签,实现页面文字的国际化显示;6. 定义页面样式表stytle.css:新建一个样式表文件stytle.css,为以上3个JSP页面定义几个样式表以美化页面。3 增加表单校验功能 经过以上两步的开发,在重启Tomcat后,进入此模块,此时的页面都可以进行正常的流转了,只不过显示的数据都还是假的数据,没有经过数据的校验,以及数据库的交互。在这里要首先来进一步完善JSP页面的表单验证功能,包括如下的步骤:1. 为增加页面和修改页面表单增加长度限制;2. 为表单类添加校验功能;3. 为增加页面和修改页面添加错误标签;4. 为增加页面和修改页面维持表单输入。5. 其中后面的3个部分是Struts的表单校验技术所完成的功能。4 调用DAO组件操作数据库 现在JSP页面、表单类的代码都已经开发完善了,接下来需要修改Action类中的请求处理函数,来调用Hibernate层的DAO类,实现与数据库的交互。主要包括以下几个功能:1. 显示列表页面数据;2. 实现增加功能;3. 实现修改功能;4. 实现删除功能。5.3.6 业务层Spring实现 Spring提供的HibernateTemplate是对Hibernate功能的封装,通过封装的代码实现Spring IoC容器的有机结合。要使用HibernateTemplate进行开发,需要在Bean配置文件中添加一系列的组件,这些组件相互注入。由此,我们共需要配置如下的7个Bean组件。1. dataSource:为sessionFactory提供数据源;2. sessionFactory:Hibernate管理工厂,为DAO为的事务管理策略对象transactionManager提供SessionFactory;3. transactionManager:为DAO类的事务管理策略对象DAOProxy提供事务管理器对象;4. DAO类:为DAO提供POJO类;利用被注入的数据源,定义一系列的业务操作函数,使用JdbcTemplate来操作POJO类,实现对数据库的操作;5. DAOProxy:DAO的事务管理策略对象,该对象规定了DAO的管理策略,因此它需要注入DAO作为被管理的对象。进行事务管理也需要提供事务管理器,因此也需要注入transactionManager作为事务管理器;6. Action类:该类是响应处理类,负责调用DAO函数即可实现数据库的访问,而对于DAO的访问都将在DAOProxy的监管之下。这些Bean组件的注入过程如图5-1所示:图5-1 Bean注入过程图1 数据源配置 开发数据库代码的第一步,就是配置与数据的连接。配置的过程很简单,只需要在applicationContext.xml中添加一个名称为dataSource的,指向的类为DBCP的数据源类,并指定4个数据参数。1. driverClassName:指定数据库连接的驱动org.gjt.mm.mysql.Driver;2. url:指定数据库连接的URL地址jdbc:mysql:/localhost:3306/MyOA;3. username:指定访问数据库的用户名root;4. password:指定访问数据库的密码(为空)。2 配置SessionFactory 配置SessionFactory对象,为DAO层提供Hibernate的数据库连接对象。其中需要注入上面配置的dataSource对象。3 配置事务为SessionFactory对象增加事务配置事件,并注入上面配置的SessionFactory对象。4 配置DAO组件在这里我们先对上面开发的基于HibernateTemplate的DAO类配置Bean对象,并为该对象注入SessionFactory对象。5 配置DAO事务 为上面配置的DAO对象配置事务组件,使得对DAO类的访问都在Spring的事务监管之下。该组件需要注入上面配置的事务对象transactionManager、DAO对象,并配置事务管理的策略。5.4功能实现5.4.1系统管理功能实现1 登录功能 系统创建了登录界面,用户在界面中输入用户名和密码就可以成功的登录系统,还可以选择自动登录。图5-2 系统登录界面2 修改密码 用户可以通过进去修改密码界面,输入用户名和旧密码以及新密码等信息后提交,系统在完成提交到数据后,回复成功界面。图5-3 系统修改密码界面3 寻找密码 在用户忘记登录密码后,可以通过输入用户名后回答问题,系统跟数据库中的记录比较后,回复密码给用户。图5-4 系统寻找密码界面5.4.2 设备管理功能实现1 设备查询 用户可以在系统的设备界面中通过设备名称或者设备类型查询到相应的设备.如果没有输入,系统会展示所有的设备信息。图5-5 设备查询界面2 设备管理 用户可以在系统设备管理界面中,通过设备ID,修改设备的名称,类型,数量等信息。图5-6 设备修改界面2 设备增加 用户可以在系统设备增加界面中,通过输入设备ID,设备名称,设备类型,设备数量等信息,创建相应的设备信息。图5-7 增加设备界面5.4.3 用户管理功能实现1 用户信息 用户可以在系统的用户界面中通过点击详细信息按钮,进入如下界面,展示了用户的详细信息。图5-8 用户详细信息界面2 增加用户 用户可以在系统的增加用户界面中通过输入用户的姓名,性别,年龄,职务,家庭住址等信息创建一个新的用户。图5-9 增加用户界面3 查询用户 用户可以在系统的用户查询界面中通过性别,年龄,使用车型等查询到相应的用户如果没有输入,系统会展示所有的用户信息。图5-10 查询用户界面5.4.4 站点管理功能实现1 站点查询 用户可以在系统的站点界面中通过站点名称或者站点类型查询到相应的站点.如果没有输入,系统会展示所有的站点信息。图5-11 查询站点界面2 站点增加 用户可以在系统的站点增加界面中通过输入站点名称或者站点类型创建相应的站点信息。图5-12 增加站点界面3 修改站点用户可以在系统的站点修改界面中修改站点名称或者站点

温馨提示

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

评论

0/150

提交评论