手机销售信息系统测试与收尾报告_第1页
手机销售信息系统测试与收尾报告_第2页
手机销售信息系统测试与收尾报告_第3页
手机销售信息系统测试与收尾报告_第4页
手机销售信息系统测试与收尾报告_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、信息系统分析与设计第5次实验手机销售系统测试与收尾报告项目组员: 实验时间:2015年5月20日实验地点:主楼B112室目 录第1章 测试指导思想及方案.31.1指导思想.31.2测试方案.31.2.1测试的过程及组织.41.2.2明确开发过程中各类文档.41.2.3合理划分测试阶段.41.2.4代码审查.41.2.5单元测试.41.2.6集成测试.51.2.7验收测试.51.3测试方案的应用.5第2章 部分功能测试结果.62.1用户界面窗体设计测试.62.2文本框的测试.6第3章 谈数据安全与压缩.73.1数据库的安全问题.73.1.1 Access数据库的存储隐患.73.1.2 Acces

2、s数据库的解密隐患.73.1.3源代码的安全隐患.83.1.4程序设计中的安全隐患.83.2数据库的压缩技术.9第4章 总结.94.1总结.94.2问题与展望.94.2.1界面不够美观.94.2.2购物车功能尚不完善.10附件:程序部分源代码.10在线手机销售系统开发完毕到投入使用之前,需要进行一系列系统集成和确认测试。软件测试的根本目的应该是找出软件中存在的漏洞和问题,而开发人员往往不容易找出自己的程序中存在的漏洞和问题,所以从理论上讲,系统的测试工作应该由专业测试人员进行。第1章 测试指导思想及方案1.1 指导思想针对本系统测试人员是开发者本人这一特点,本系统测试工作的指导思想以白盒测试方

3、法为主,局部辅以黑盒测试方法。白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。相对的,黑盒测试方法是在已知系统结构的前提下,通过来测试系统每个功能是否都能正常运行并达到预期结果。在测试时将程序看作一个不能打开的黑盒子,在完全部考虑程序内部结构盒内部特性的情况下,在接口进行测试。

4、1.2 测试方案从软件的生存周期看,测试往往指对程序的测试,这样做的优点是被测对象明确,测试的可操作性相对较强。但是,由于测试的依据是规格说明书、设计文档和使用说明书,如果设计有错误,测试的质量就难以保证。即使测试后发现是设计的错误,这时,修改的代价是相当昂贵的。因此,较理想的做法应该是对软件的开发过程,按软件工程各阶段形成的结果,分别进行严格的审查。为了确保软件的质量,对图1的过程应进行严格的管理。虽然测试是在实现且经验证后进行的,实际上,测试的准备工作在分析和设计阶段就开始了。 1.2.1 测试的过程及组织当设计工作完成以后,就应该着手测试的准备工作了,编写在线手机销售系统测试大纲,明确测

5、试的内容和测试通过的准则,设计完整合理的测试用例,以便系统实现后进行全面测试。1.2.2 明确开发过程中各类文档进一步理解在线手机销售系统在开发过程中生成的有关资料,包括规格说明、设计文档、使用说明书及在设计过程中形成的测试大纲、测试内容及测试的通过准则,全面熟悉系统,编写测试计划,设计测试用例,作好测试前的准备工作。1.2.3 合理划分测试阶段为了保证测试的质量,将测试过程进行划分,针对在线手机销售系统的特点,将测试过程划分为代码审查、单元测试、集成测试和验收测试四个阶段。1.2.4 代码审查一般的软件测试应该进行代码会审。代码会审是由一组人通过阅读、讨论和争议对程序进行静态分析的过程。会审

6、小组由组长,23名程序设计和测试人员及程序员组成。会审小组在充分阅读待审程序文本、控制流程图及有关要求、规范等文件基础上,召开代码会审会,程序员逐句讲解程序的逻辑,并展开热烈的讨论甚至争议,以揭示错误的关键所在。针对本系统的开发特点,开发者本人再一次对所编写代码进行审查,并将其讲解给周围同学。实践证明,当再一次进行阅读和讲解时,确实可以发现许多自己原来没有发现的错误。1.2.5 单元测试单元测试集中在检查本系统设计的最小单位模块上,通过测试发现实现该模块的实际功能与定义该模块的功能说明不符合的情况,以及编码的错误。由于模块规模小、功能单一、逻辑简单,加之测试人员就是系统的开发人员,对于该模块的

7、I/O条件和模块的逻辑结构都非常清楚,可以采用采用结构测试(白盒法)的用例,尽可能达到彻底测试,然后辅之以功能测试(黑盒法)的用例,使之对任何合理和不合理的输入都能鉴别和响应。高可靠性的模块是组成可靠系统的坚实基础。1.2.6 集成测试集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如用户资料数据穿过接口时可能丢失;一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。 1.2.7 验收测试验收测试的目的是向未来的用户表明系统能够像预定要求那

8、样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。经过上述的测试过程对软件进行测试后,软件基本满足开发的要求,测试宣告结束,经验收后,软件可投入使用。1.3 测试方案的应用因为本系统的测试人员是开发者本人,所以对于程序的代码等相当熟悉。在设计在线手机销售系统的单元测试时,测试人员将白盒测试方法和黑盒测试方法结合起来运用。先用白盒测试法分析模块的逻辑结构,提出一批测试用例,然后根据模块的功能用黑盒测试法进行补充。集成测试及其后的测试阶段,本系统采用了

9、黑盒测试方法。其策略包括:(1) 用边值分析法和(或)等价分类法提出基本的测试用例;(2) 用猜测法补充新的测试用例,重复前一步操作。第2章 部分功能测试结果在黑盒测试方法的指导思想下,通过大量用例对在线手机销售系统进行了测试。测试过程中发现了一部分设计上的漏洞及时进行了修改。由于篇幅有限,现特将本系统部分功能测试用例摘录如下:2.1 用户界面窗体设计测试窗体大小。大小要合适,控件布局合理;缩放窗体。窗体上的控件应随窗体的大小变化而变化;显示分辨率。必须在不同的分辨率的情况下测试程序的显示是否正常。经过测试,发现系统用户界面窗体的大小在大部分台式机和笔记本电脑显示器上效果不一。后经分析发现,开

10、发使用的笔记本电脑系宽屏设计,因此造成了一般尺寸的台式机显示器显示不正常的现象。及时修改页面大小可以修正此问题。其他功能未发现异常.2.2 文本框的测试输入正常的字母或数字;输入超长字符。例如在“名称”框中输入超过允许边界个数的字符,假设最多25个字符,尝试输入 26个字符,检查程序能否正确处理;输入默认值,空白,空格;若只允许输入字母,尝试输入数字;反之;尝试输入字母;利用复制,粘贴等操作强制输入程序不允许的输入数据;输入特殊字符集,例如,NUL及n等;输入超过文本框长度的字符或文本,检查所输入的内容是否正常显示;输入不符合格式的数据,检查程序是否正常校验,如,程序要求输入年月日格式为yy/

11、mm/dd,实际输入yyyy/mm/dd,程序应该给出错误提示;经过测试,系统在文本框输入功能中表现正常,在出现异常输入时能够及时报错并提醒用户重新输入。第3章 谈数据安全与压缩Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统,由于具有操作简单、界面友好等特点,具有较大的用户群体。因此ASPAccess成为许多中小型网上应用系统的首选方案。但ASPAccess解决方案在为我们带来便捷的同时,也带来了不容忽视的安全问题。3.1 数据库的安全问题ASPAccess解决方案的主要安全隐患来自Access数据库的安全性,其次在于ASP网页设计过程中的安全漏洞。3.1.1 Acces

12、s数据库的存储隐患 在ASPAccess应用系统中,如果获得或者猜到Access数据库的存储路径和数据库名,则该数据库就可以被下载到本地。例如:对于手机销售商店的Access数据库,人们一般命名为Shop.mdb、store.mdb等,而存储的路径一般为“URL/database”或干脆放在根目录(“URL/”)下。这样,只要在浏览器地址栏中敲入地址:“URL/database/store.mdb”,就可以轻易地把store.mdb下载到本地的机器中。 3.1.2 Access数据库的解密隐患 由于Access数据库的加密机制非常简单,所以即使数据库设置了密码,解密也很容易。该数据库系统通过将

13、用户输入的密码与某一固定密钥进行异或来形成一个加密串,并将其存储在.mdb文件中从地址“H42”开始的区域内。由于异或操作的特点是“经过两次异或就恢复原值”,因此,用这一密钥与.mdb文件中的加密串进行第二次异或操作,就可以轻松地得到Access数据库的密码。基于这种原理,可以很容易地编制出解密程序。 由此可见,无论是否设置了数据库密码,只要数据库被下载,其信息就没有任何安全性可言了。3.1.3 源代码的安全隐患由于ASP程序采用的是非编译性语言,这大大降低了程序源代码的安全性。任何人只要进入站点,就可以获得源代码,从而造成ASP应用程序源代码的泄露。 3.1.4 程序设计中的安全隐患 ASP

14、代码利用表单(form)实现与用户交互的功能,而相应的内容会反映在浏览器的地址栏中,如果不采用适当的安全措施,只要记下这些内容,就可以绕过验证直接进入某一页面。例如在浏览器中敲入“page.asp?x=1”,即可不经过表单页面直接进入满足“x=1”条件的页面。因此,在设计验证或注册页面时,必须采取特殊措施来避免此类问题的发生。由于Access数据库加密机制过于简单,因此,如何有效地防止Access数据库被下载,就成了提高ASPAccess解决方案安全性的重中之重。我们可以采用以下方法来提高安全性:(1)非常规命名法 防止数据库被找到的简便方法是为Access数据库文件起一个复杂的非常规名字,并

15、把它存放在多层目录下。例如,对于网上书店的数据库文件,不要简单地命名为“book.mdb”或“store.mdb”,而是要起个非常规的名字,例如:faq19jhsvzbal.mdb,再把它放在如./akkjj16t/kjhgb661/acd/avccx55 之类的深层目录下。这样,对于一些通过猜的方式得到Access数据库文件名的非法访问方法起到了有效的阻止作用。 (2)使用ODBC数据源在ASP程序设计中,应尽量使用ODBC数据源,不要把数据库名直接写在程序中,否则,数据库名将随ASP源代码的失密而一同失密。例如:DBPath = Server.MapPath(“./akkjj16t/ kj

16、hgb661/acd/avccx55/faq19jhsvzbal.mdb ”) conn.Open “driver=Microsoft Access Driver (.mdb);dbq=” DBPath 可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,数据库也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了,如: conn.open “ODBCDSN名” 3.2 据库的压缩技术随着用户的增加和网站的运行,数据库占用会越来越大,而频繁的对数据库的增加、删除等操作,也会产生记录碎片,浪费空间,影响数据库的查询速度。对于数据库的压缩,第一种方法是采用纯编程的方式对

17、数据库进行压缩处理,这种方法实用性强,效果明显,但专业性要求较高,复杂度高。第二种方法是采用软件方法对数据库进行处理。此外,还可以对大型数据库采用分项存储的方法减少数据库的空间,提高数据库使用效率。第4章 总结与展望4.1 总结本系统设计并使现一个在线手机销售网站的模型。本网站采用了流行的三层架构,通过将整个系统分为不同的逻辑模块,大大降低了应用程序系统开发和维护的成本,提高了系统模块的复用性,同时使系统的可扩展性大大提高。由于ASP自身的优点,本网站对系统的要求较低,兼容性很好,为网站的推广使用提供了便利和可能。在线手机销售系统的开发过程中,通过对ASP技术的学习和运用,我充分体会到了ASP

18、技术在系统移植方面出众的优点以及它的无限魅力。ASP技术正在不同的方式影响者企业、个人和开发人员。对于个人,ASP技术将网络商店变得更加普遍的同时也更加个性化。对于企业和网站开发人员,ASP技术让开发变得更加简便和实用,与传统开发方法相比执行效率也更高,它将改变企业的销售模式,使IT真正成为企业成功的重要因素。4.2 问题与展望4.2.1 界面不够美观从直观的角度讲,在线手机销售系统的界面还不够美观。由于时间关系,本人掌握的素材有限。同时,对于DreamWeaver8这款功能强大的软件我的掌握程度尚浅,本系统中并没有能够完全发挥出它的强大功能,把图形化界面做到美轮美奂。在今后还应该注意积累素材

19、,不断修改,让界面趋于完美。4.2.2 购物车功能尚不完善购物车模块的实现使本系统的一大亮点,但针对这个模块,本系统实现的仅仅是基本的收录和保存的简单功能。在理想的购物车模块中,还应该具有产品追踪的功能,对于用户来讲应该随时掌握购物车中收录的产品的实时价格以及动态比较等等。对于管理员来说,应该可以统计用户购物车中产品的分类作为销售统计的辅助材料,为更准确的定位销售方向做支撑材料。本系统中诸如以上的功能尚不完善的地方还有不少,相信在今后不断的开发和维护过程中,系统的功能会一步步趋于完善,真正做到购销双方都得心应手。附件:程序部分源代码src-base-action:package com.shx

20、t.base.action;import java.util.Map;import javax.servlet.ServletContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import erceptor.ServletRequestAware;import erceptor.ServletResponseAware;import org.apache.str

21、erceptor.SessionAware;import org.apache.struts2.util.ServletContextAware;import com.opensymphony.xwork2.ActionSupport;public class BaseAction extends ActionSupport implements SessionAware,ServletRequestAware, ServletResponseAware, ServletContextAware protected Map session;protected HttpServl

22、etRequest request;protected HttpServletResponse response;protected ServletContext servletContext;public void setSession(Map session) this.session = session;public void setServletRequest(HttpServletRequest request) this.request = request;public void setServletResponse(HttpServletResponse response) th

23、is.response = response;public void setServletContext(ServletContext servletContext) this.servletContext = servletContext;/* 提示信息使用*/protected String message;/* success error * 标识*/protected String flag;public String getFlag() return flag;public void setFlag(String flag) this.flag = flag;public Strin

24、g getMessage() return message;public void setMessage(String message) this.message = message;/* 跳转到JSP资源的访问路径 */protected String toJsp;public String getToJsp() return toJsp;public void setToJsp(String toJsp) this.toJsp = toJsp;/* 跳转到Action资源的访问路径*/protected String toAction;public String getToAction()

25、 return toAction;public void setToAction(String toAction) this.toAction = toAction;/*重定向到JSP页面*/protected String REDIRECT = redirect;/*请求转发到JSP页面*/protected String DISPATCHER = dispatcher;/*请求转发到Action*/protected String CHAIN = chain;/*重定向到Action*/protected String REDIRECTACTION = redirectAction;/*跳

26、转到JSON数据*/protected String JSON = json;protected Object jsonResult;public Object getJsonResult() return jsonResult;public void setJsonResult(Object jsonResult) this.jsonResult = jsonResult;src-base-dao-basedaoimpl:package com.shxt.base.dao;import java.util.List;import javax.annotation.Resource;impor

27、t org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.springframework.stereotype.Repository;import com.shxt.base.utils.AliasToBeanResultTransformer;public class BaseDaoImpl implements IBaseDao

28、/* 声明SessionFactory */private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sessionFactory) this.sessionFactory = sessionFactory;public Session getSession() return sessionFactory.getCurrentSession();public void delete(Class clz, Integer id) this.getSession().delete(this.

29、getSession().get(clz, id);public void delete(Object obj) this.getSession().delete(obj);public Object get(Class clz, Integer id) return this.getSession().get(clz, id);public Object load(Class clz, Integer id) return this.getSession().load(clz, id);public List list(String hql, Object args) Query query

30、 = this.getSession().createQuery(hql);query = this.setParameters(query, args);return query.list();public List list(String hql, Object arg) return this.list(hql, new Object arg );public List list(String hql) return this.list(hql, null);public Object query(String hql, Object args) Query query = this.g

31、etSession().createQuery(hql);query = this.setParameters(query, args);return query.uniqueResult();public Object query(String hql, Object arg) return this.query(hql, new Object arg );public Object query(String hql) return this.query(hql, null);public void save(Object obj) this.getSession().save(obj);p

32、ublic void update(Object obj) this.getSession().update(obj);public void updateHql(String hql, Object args) Query query = this.getSession().createQuery(hql);query = this.setParameters(query, args);query.executeUpdate();public void updateHql(String hql, Object arg) this.updateHql(hql, new Object arg )

33、;public void updateHql(String hql) this.updateHql(hql, null);public PageBean find(String hql, Object args, PageBean pageBean) Query query = this.getSession().createQuery(hql);query = this.setParameters(query, args);/ 分页设置query.setFirstResult(pageBean.getPageNow() - 1) * pageBean.getPageSize().setMax

34、Results(pageBean.getPageSize();/ 结果集存到PageBean中pageBean.setDatas(query.list();/ 获取总记录数String count_hql = this.getCountHql(hql, true);Query countQuery = this.getSession().createQuery(count_hql);countQuery = this.setParameters(countQuery, args);/ 总记录数Long totalCount = (Long) countQuery.uniqueResult();

35、/ 存到PageBean当中pageBean.setTotalCount(totalCount);/ 获取总页数Long totalPage = totalCount % pageBean.getPageSize() = 0 ? totalCount/ pageBean.getPageSize() : totalCount / pageBean.getPageSize()+ 1;/ 存到PageBean当中pageBean.setTotalPage(totalPage);return pageBean;public PageBean find(String hql, Object arg, P

36、ageBean pageBean) return this.find(hql, new Object arg , pageBean);public PageBean find(String hql, PageBean pageBean) return this.find(hql, null, pageBean);private Query setParameters(Query query, Object args) if (args != null & args.length 0) for (int i = 0; i args.length; i+) query.setParameter(i

37、, argsi);return query;/* 判断是否是HQL语句,针对HQL语句和SQL语句,变成Count(*) 提供效率 * param hql * param isHql * return */private String getCountHql(String hql, boolean isHql) / 1、获取from前面的字符串String f = hql.substring(0, hql.indexOf(from);/ 2、将from前面的字符串替换为select count(*)if (f.equals() hql = select count(*) + hql; else

38、 hql = hql.replace(f, select count(*) );/ 3、将fetch替换为,因为抓取查询不能使用count(*)if (isHql) hql = hql.replace(fetch, );return hql;public List listSQL(String sql, Object args, Class clazz,boolean hasEntity) SQLQuery query = this.getSession().createSQLQuery(sql);query = (SQLQuery) this.setParameters(query, arg

39、s);if (hasEntity) / 如果true,说明有相应的映射文件或者注解query.addEntity(clazz); else / DTOquery.setResultTransformer(new AliasToBeanResultTransformer(clazz);return query.list();public List listSQL(String sql, Object arg, Class clazz,boolean hasEntity) return this.listSQL(sql, new Object arg , clazz, hasEntity);pub

40、lic List listSQL(String sql, Class clazz, boolean hasEntity) return this.listSQL(sql, null, clazz, hasEntity);src-base-dao-ibasedao:package com.shxt.base.dao;import java.util.List;public interface IBaseDao public void save(Object obj);public void update(Object obj);public void delete(Class clz, Inte

41、ger id);public void delete(Object obj);public Object get(Class clz, Integer id);public Object load(Class clz, Integer id);public List list(String hql, Object args);public List list(String hql, Object arg);public List list(String hql);public Object query(String hql, Object args);public Object query(S

42、tring hql, Object arg);public Object query(String hql);public void updateHql(String hql, Object args);public void updateHql(String hql, Object arg);public void updateHql(String hql);public PageBean find(String hql , Object args , PageBean pageBean);public PageBean find(String hql , Object arg , Page

43、Bean pageBean);public PageBean find(String hql , PageBean pageBean);public List listSQL(String sql, Object args, Class clazz, boolean hasEntity);public List listSQL(String sql, Object arg, Class clazz, boolean hasEntity);public List listSQL(String sql, Class clazz, boolean hasEntity);src-base-dao-pa

44、gebean:package com.shxt.base.dao;import java.util.List;public class PageBean /*每页显示条数*/private Integer pageSize = 10;/*当前页*/private Integer pageNow = 1;/*总页数*/private Long totalPage ;/*总记录数*/private Long totalCount ;/*数据*/private List datas;public Integer getPageSize() return pageSize;public void se

45、tPageSize(Integer pageSize) this.pageSize = pageSize;public Integer getPageNow() return pageNow;public void setPageNow(Integer pageNow) this.pageNow = pageNow;public Long getTotalPage() return totalPage;public void setTotalPage(Long totalPage) this.totalPage = totalPage;public Long getTotalCount() r

46、eturn totalCount;public void setTotalCount(Long totalCount) this.totalCount = totalCount;public List getDatas() return datas;public void setDatas(List datas) this.datas = datas;src-base-filter-sessionfilter:package com.shxt.base.filter;import java.io.IOException;import java.io.PrintWriter;import jav

47、ax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.

48、servlet.http.HttpSession;public class SessionFilter implements Filter public void destroy() / TODO Auto-generated method stubpublic void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException HttpServletRequest request = (HttpServletRequest)req;Http

49、ServletResponse response = (HttpServletResponse)resp;/获取请求的路径String path = request.getServletPath();/ /shxt/adsfafds.actionchain.doFilter(request, response);/排除不监控的路径/if(path.endsWith(login.jsp)|path.endsWith(loginLoginAction.action)/不监控/chain.doFilter(request, response);/else/判断httpsession/HttpSess

50、ion session = request.getSession();/if(session.getAttribute(session_user_id)!=null)/chain.doFilter(request, response);/else/response.setContentType(text/html;charset=UTF-8);/PrintWriter out = response.getWriter();/执行JS代码/out.write(alert(请登录);window.top.location.href=+request.getContextPath()+/jsp/login.jsp;);/out.flush();/out.close();/public void init(FilterConfig arg0) throws ServletException / TODO Auto-generated method stubsrc-base-service-baseservice:package com.sh

温馨提示

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

评论

0/150

提交评论