Access手机销售系统设计如何设计

> 微信公众平台开发模式自定义菜单开发指南
微信公众平台开发模式自定义菜单开发指南
开发者获取使用凭证()后,可以使用该凭证对公众账号的自定义菜单进行创建、查询和删除等操作。 自定义菜单接口可实现以下类型按钮:
click(点击事件):
用户点击click类型按钮后,微信服务器会通过推送点击事件给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值进行。
创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后,再次关注,则可以看到创建后的效果。
通过POST一个特定结构体,实现在微信客户端创建自定义菜单。
http请求方式:POST
&button&:[
&type&:&click&,
&name&:&今日歌曲&,
&key&:&V1001_TODAY_MUSIC&
&type&:&click&,
&name&:&歌手简介&,
&key&:&V1001_TODAY_SINGER&
&name&:&菜单&,
&sub_button&:[
&type&:&click&,
&name&:&hello word&,
&key&:&V1001_HELLO_WORLD&
&type&:&click&,
&name&:&赞一下我们&,
&key&:&V1001_GOOD&
创建后效果:
按钮数组,按钮个数应为1~3个
sub_button
子按钮数组,按钮个数应为1~5个
按钮类型,目前有click类型
按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节
类型为click必须
按钮KEY值,用于推送,不超过128字节
正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}
错误的Json返回结果
{"errcode":40018,"errmsg":"invalid button name size"}
查询当前使用的自定义菜单结构。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"click","name":"hello word","key":"V1001_HELLO_WORLD","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}
取消当前使用的自定义菜单。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}
请先确保公众账号已经拥有接口调用权限。
默认每个公众帐号都不能超过下面的频率限制。 当超出调用接口频率限制,调用对应接口将会收到如下错误信息:
{"errcode":45009,"errmsg":"api freq out of limit"}
接口调用频率限制
200(次/天)
100(次/天)
1000(次/天)
100(次/天)
返回码说明
不合法的凭证类型
不合法的OpenID
不合法的媒体文件类型
不合法的文件类型
不合法的文件大小
不合法的媒体文件id
不合法的消息类型
不合法的图片文件大小
不合法的语音文件大小
不合法的视频文件大小
不合法的缩略图文件大小
不合法的APPID
不合法的access_token
不合法的access_token
不合法的菜单类型
不合法的按钮个数
不合法的按钮个数
不合法的按钮名字长度
不合法的按钮KEY长度
不合法的按钮URL长度
不合法的菜单版本号
不合法的子菜单级数
不合法的子菜单按钮个数
不合法的子菜单按钮类型
不合法的子菜单按钮名字长度
不合法的子菜单按钮KEY长度
不合法的子菜单按钮URL长度
不合法的自定义菜单使用用户
缺少access_token参数
缺少appid参数
缺少refresh_token参数
缺少secret参数
缺少多媒体文件数据
缺少media_id参数
缺少子菜单数据
access_token超时
需要GET请求
需要POST请求
需要HTTPS请求
多媒体文件为空
POST的数据包为空
图文消息内容为空
多媒体文件大小超过限制
消息内容超过限制
标题字段超过限制
描述字段超过限制
链接字段超过限制
图片链接字段超过限制
语音播放时间超过限制
图文消息超过限制
接口调用超过限制
创建菜单个数超过限制
不存在媒体数据
不存在的菜单版本
不存在的菜单数据
解析JSON/XML内容错误总浏览数:2442
总下载量:16
总成交量:9
phone.bak[1.71MB]
phone.LDF[576KB]
phone.mdf[2.25MB]
MvcPagerSearch
EntityFramework.dll[765KB]
MvcPagerSearch.dll[74KB]
MvcPagerSearch.pdb[175KB]
glyphicons-halflings-white.png[8KB]
glyphicons-halflings.png[12KB]
3.jpg[689B]
5s.jpg[3KB]
arrow.png[1KB]
bluebg.png[3KB]
bluebg2.jpg[2KB]
blueleftbg.jpg[461B]
bluemidbg.jpg[413B]
bluerightbg.jpg[532B]
bodybg.jpg[422B]
gong.jpg[25KB]
ico-email.png[649B]
ico-fax.png[564B]
ico-med-1.png[6KB]
ico-med-2.png[6KB]
ico-med-3.png[7KB]
ico-med-4.png[7KB]
ico-phone.png[723B]
ico-support.png[3KB]
ico-terms.png[5KB]
ico-twitter.png[834B]
ico-website.png[589B]
ico1.png[3KB]
ico2.png[4KB]
ico3.png[4KB]
ico4.png[2KB]
ico5.png[5KB]
ico6.png[4KB]
J@O7)Q`~MWX4HEP)VIELQ%F.jpg[6KB]
logo.jpg[5KB]
mac.jpg[1KB]
mainbanner.jpg[49KB]
mi3.jpg[7KB]
more_bg.gif[1KB]
mx3.jpg[6KB]
news_bg.gif[178B]
photo-about.jpg[19KB]
photo-contact.jpg[23KB]
pic1.jpg[3KB]
pic2.jpg[3KB]
piccontainerbg.jpg[3KB]
product1.jpg[3KB]
product1.png[16KB]
product2.png[12KB]
product3.png[21KB]
product4.png[19KB]
projectimg1.jpg[10KB]
projectimg2.jpg[17KB]
projectimg3.jpg[9KB]
s4.jpg[5KB]
verticalline.jpg[366B]
WB.jpg[38KB]
window.jpg[1KB]
ui-bg_flat_0_aaaaaa_40x100.png[180B]
ui-bg_flat_75_ffffff_40x100.png[178B]
ui-bg_glass_55_fbf9ee_1x400.png[120B]
ui-bg_glass_65_ffffff_1x400.png[105B]
ui-bg_glass_75_dadada_1x400.png[111B]
ui-bg_glass_75_e6e6e6_1x400.png[110B]
ui-bg_glass_95_fef1ec_1x400.png[119B]
ui-bg_highlight-soft_75_cccccc_1x100.png[101B]
ui-icons_x240.png[4KB]
ui-icons_2e83ff_256x240.png[4KB]
ui-icons_x240.png[4KB]
ui-icons_x240.png[4KB]
ui-icons_cd0a0a_256x240.png[4KB]
Controllers
Extensions
Phone.dbml[7KB]
Phone.dbml.layout[4KB]
Models.Phone.designer.cs.dll[27KB]
CSC1618.tmp[848B]
DesignTimeResolveAssemblyReferences.cache[46KB]
DesignTimeResolveAssemblyReferencesInput.cache[38KB]
MvcPagerSearch.dll[74KB]
MvcPagerSearch.pdb[175KB]
Phone.csprojResolveAssemblyReference.cache[62KB]
Models.Phone.designer.cs.dll[27KB]
DesignTimeResolveAssemblyReferencesInput.cache[38KB]
Properties
My97DatePicker
img.gif[1KB]
bg.jpg[307B]
img.gif[1KB]
datePicker.gif[1KB]
img.gif[1KB]
Thumbs.db[5KB]
bg.jpg[307B]
img.gif[1KB]
datePicker.gif[1KB]
Thumbs.db[3KB]
Create.cshtml[1KB]
Edit.cshtml[1KB]
Index.cshtml[1KB]
IndexTable.cshtml[1KB]
Create.cshtml[1KB]
Index.cshtml[1KB]
IndexTable.cshtml[1KB]
Create.cshtml[5KB]
Edit.cshtml[5KB]
Index.cshtml[3KB]
IndexTable.cshtml[2KB]
Error.cshtml[265B]
_Layout.cshtml[1KB]
chakan.cshtml[5KB]
Create.cshtml[5KB]
Index.cshtml[2KB]
IndexTable.cshtml[2KB]
Manager.cshtml[1KB]
ManagerTable.cshtml[2KB]
UserSearch
alertPwd.cshtml[2KB]
Create.cshtml[4KB]
Edit.cshtml[3KB]
Index.cshtml[1KB]
IndexTable.cshtml[2KB]
login.cshtml[3KB]
Create.cshtml[6KB]
Index.cshtml[1KB]
IndexTable.cshtml[2KB]
_ViewStart.cshtml[55B]
Phone.csproj.user[1KB]
EntityFramework.4.1.10331.0
EntityFramework.dll[765KB]
EntityFramework.4.1.10331.0.nupkg[447KB]
EntityFramework.4.1.10331.0.nuspec[872B]
jQuery.1.5.1
jQuery.1.5.1.nupkg[105KB]
jQuery.1.5.1.nuspec[1KB]
bined.1.8.11
ui-bg_flat_0_aaaaaa_40x100.png[180B]
ui-bg_flat_75_ffffff_40x100.png[178B]
ui-bg_glass_55_fbf9ee_1x400.png[120B]
ui-bg_glass_65_ffffff_1x400.png[105B]
ui-bg_glass_75_dadada_1x400.png[111B]
ui-bg_glass_75_e6e6e6_1x400.png[110B]
ui-bg_glass_95_fef1ec_1x400.png[119B]
ui-bg_highlight-soft_75_cccccc_1x100.png[101B]
ui-icons_x240.png[4KB]
ui-icons_2e83ff_256x240.png[4KB]
ui-icons_x240.png[4KB]
ui-icons_x240.png[4KB]
ui-icons_cd0a0a_256x240.png[4KB]
bined.1.8.11.nupkg[208KB]
bined.1.8.11.nuspec[1KB]
jQuery.Validation.1.8.0
jQuery.Validation.1.8.0.nupkg[34KB]
jQuery.Validation.1.8.0.nuspec[1KB]
jQuery.vsdoc.1.5.1
jQuery.vsdoc.1.5.1.nupkg[75KB]
jQuery.vsdoc.1.5.1.nuspec[1KB]
Modernizr.1.7
Modernizr.1.7.nupkg[20KB]
Modernizr.1.7.nuspec[1KB]
TestEFQuery
DesignTimeResolveAssemblyReferencesInput.cache[5KB]
Properties
from.gif[4KB]
Phone.sln[1KB]
最新Asp.Net源码下载.url[125B]
源码介绍
大类名称:
适合人群:
开发工具:
源码大小:3.39MB
版本:1.00
开发语言:
相关网址:
源码指数:
上架时间:
全能化手机销售售后管理系统源码功能介绍:& & 本手机售后管理系统采用B/S 模式设计的网上管理系统,本手机售后管理系统采用目前比较流行的linq to sql数据访问技术,并将每个数据库表的字段和操作封装到类中,从而成功地将面向对象的程序设计思想应用到数据库应用程序设计中。这也是本系统的特色和优势。本系统的功能涉及的模块有以下:& & 基本信息的添加、修改、删除和查询,包括手机品牌、类型信息。& & 销售信息添加、修改、删除。& & 员工信息的添加、修改、删除。& & 售后信息添加加、修改、删除。& & 任务信息添加加、修改、删除。& & 库存信息添加加、修改、删除。& & 手机品牌信息添加加、修改、删除。& & 部门管理维修信息的添加、修改、删除和查询。& & 手机售后管理,销售管理、 库存管理 、售后管理、任务管理、等操作。& & 本项目是基于.NET框架下的MVC应用程序,开发语言为c#,结构为三层(数据访问层、业务逻辑层、显示层)。通过B\S模式及各个模块见的连接实现用户和数据库的数据交互。本系统主要分为销售管理、售后管理、任务管理、库存管理、手机品牌、部门管理、员工信息这7大模块,在每一个达模块之下又细分为若干小模块,以实现系统的各项功能。注意:& & 开发环境为Visual Studio 2010,数据库为SQL Server 2008r2,数据库文件在DB_51aspx文件夹中附加就行。& & 管理员用户名密码均是:51aspx
责任编辑:zyw
举报源码
购买记录
源码评论
请输入验证码
评论列表
暂无评论 &
活跃于:&&&08-22 09:09:40
通过率:&&&16 / 46 = 35%
源码名称:
全能化手机销售售后管理系统源码
源码名称:
全能化手机销售售后管理系统源码
举报理由:
功能不完整
程序不开源
举报说明:
联系方式:
联系电话:
北京市海淀区中关村鼎好大厦A座二层 邮编:100080
Floor 2nd,Dinghao Building,Zhongguancun,Beijing,China,100080
常见技术问题手机销售信息系统,测试与收尾报告
您的位置: →
手机销售信息系统,测试与收尾报告
信息系统分析与设计
手机销售系统测试与收尾
项目组员:
实验时间:日 实验地点:主楼B112室
第1章 测试指导及方案.................................3
1.1指导思想.............................................3
1.2测试方案.............................................3
1.2.1测试的过程及组织.................................4
1.2.2明确开发过程中各类文档...........................4
1.2.3合理划分测试阶段.................................4
1.2.4代码审查.........................................4
1.2.5单元测试.........................................4
1.2.6集成测试.........................................5
1.2.7验收测试.........................................5
1.3测试方案的应用.......................................5
第2章 部分功能测试结果...................................6
2.1用户界面窗体设计测试.................................6
2.2文本框的测试.........................................6
第3章 谈数据安全与压缩...................................7
3.1数据库的安全问题.....................................7
3.1.1 Access数据库的存储隐患..........................7
3.1.2 Access数据库的解密隐患..........................7
3.1.3源代码的安全隐患.................................8
3.1.4程序设计中的安全隐患 ...........................8
3.2数据库的压缩技术.....................................9
第4章 ...............................................9
4.1总结.................................................9
4.2问题与展望...........................................9
4.2.1界面不够美观.....................................9
4.2.2购物车功能尚不完善..............................10
附件:程序部分源代码.........................................10
在线手机销售系统开发完毕到投入使用之前,需要进行一系列系统集成和确认测试。软件测试的根本目的应该是找出软件中存在的漏洞和问题,而开发人员往往不容易找出自己的程序中存在的漏洞和问题,所以从理论上讲,系统的测试工作应该由专业测试人员进行。
测试指导思想及方案
1.1 指导思想
针对本系统测试人员是开发者本人这一特点,本系统测试工作的指导思想以白盒测试方法为主,局部辅以黑盒测试方法。
白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。相对的,黑盒测试方法是在已知系统结构的前提下,通过来测试系统每个功能是否都能正常运行并达到预期结果。在测试时将程序看作一个不能打开的黑盒子,在完全部考虑程序内部结构盒内部特性的情况下,在接口进行测试。
1.2 测试方案
从软件的生存周期看,测试往往指对程序的测试,这样做的优点是被测对象明确,测试的可操作性相对较强。但是,由于测试的依据是规格说明书、设计文档和使用说明书,如果设计有错误,测试的质量就难以保证。即使测试后发现是设计的错误,这时,修改的代价是相当昂贵的。因此,较理想的做法应该是对软件的开发过程,按软件工程各阶段形成的结果,分别进行严格的审查。
为了确保软件的质量,对图1的过程应进行严格的管理。虽然测试是在实现且经验证后进行的,实际上,测试的准备工作在分析和设计阶段就开始了。
1.2.1 测试的过程及组织
当设计工作完成以后,就应该着手测试的准备工作了,编写在线手机销售系统测试大纲,明确测试的内容和测试通过的准则,设计完整合理的测试用例,以便系统实现后进行全面测试。
1.2.2 明确开发过程中各类文档
进一步理解在线手机销售系统在开发过程中生成的有关资料,包括规格说明、设计文档、使用说明书及在设计过程中形成的测试大纲、测试内容及测试的通过准则,全面熟悉系统,编写测试,设计测试用例,作好测试前的准备工作。
1.2.3 合理划分测试阶段
为了保证测试的质量,将测试过程进行划分,针对在线手机销售系统的特点,将测试过程划分为代码审查、单元测试、集成测试和验收测试四个阶段。
1.2.4 代码审查
一般的软件测试应该进行代码会审。代码会审是由一组人通过阅读、讨论和争议对程序进行静态分析的过程。会审小组由组长,2~3名程序设计和测试人员及程序员组成。会审小组在充分阅读待审程序文本、控制流程图及有关要求、规范等文件基础上,召开代码会审会,程序员逐句讲解程序的逻辑,并展开热烈的讨论甚至争议,以揭示错误的关键所在。
针对本系统的开发特点,开发者本人再一次对所编写代码进行审查,并将其讲解给周围同学。实践证明,当再一次进行阅读和讲解时,确实可以发现许多自己原来没有发现的错误。
1.2.5 单元测试
单元测试集中在检查本系统设计的最小单位――模块上,通过测试发现实现该模块的实际功能与定义该模块的功能说明不符合的情况,以及编码的错误。由于模块规模小、功能单一、逻辑简单,加之测试人员就是系统的开发人员,对于该模块的I/O条件和模块的逻辑结构都非常清楚,可以采用采用结构测试(白盒法)的用例,尽可能达到彻底测试,然后辅之以功能测试(黑盒法)的用例,使
之对任何合理和不合理的输入都能鉴别和响应。高可靠性的模块是组成可靠系统的坚实基础。
1.2.6 集成测试
集成测试是将模块按照设计要求组装起来同时进行测试,主要目标是发现与接口有关的问题。如用户资料数据穿过接口时可能丢失;一个模块与另一个模块可能有由于疏忽的问题而造成有害影响;把子功能组合起来可能不产生预期的主功能;个别看起来是可以接受的误差可能积累到不能接受的程度;全程数据结构可能有错误等。
1.2.7 验收测试
验收测试的目的是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
经过上述的测试过程对软件进行测试后,软件基本满足开发的要求,测试宣告结束,经验收后,软件可投入使用。
1.3 测试方案的应用
因为本系统的测试人员是开发者本人,所以对于程序的代码等相当熟悉。在设计在线手机销售系统的单元测试时,测试人员将白盒测试方法和黑盒测试方法结合起来运用。先用白盒测试法分析模块的逻辑结构,提出一批测试用例,然后根据模块的功能用黑盒测试法进行补充。
集成测试及其后的测试阶段,本系统采用了黑盒测试方法。其策略包括:
(1) 用边值分析法和(或)等价分类法提出基本的测试用例;
(2) 用猜测法补充新的测试用例,重复前一步操作。
部分功能测试结果
在黑盒测试方法的指导思想下,通过大量用例对在线手机销售系统进行了测试。测试过程中发现了一部分设计上的漏洞及时进行了修改。由于篇幅有限,现特将本系统部分功能测试用例摘录如下:
2.1 用户界面窗体设计测试
窗体大小。大小要合适,控件布局合理;
缩放窗体。窗体上的控件应随窗体的大小变化而变化;
显示分辨率。必须在不同的分辨率的情况下测试程序的显示是否正常。 经过测试,发现系统用户界面窗体的大小在大部分台式机和笔记本电脑显示器上效果不一。后经分析发现,开发使用的笔记本电脑系宽屏设计,因此造成了一般尺寸的台式机显示器显示不正常的现象。及时修改页面大小可以修正此问题。其他功能未发现异常.
2.2 文本框的测试
输入正常的字母或数字;
输入超长字符。例如在“名称”框中输入超过允许边界个数的字符,假设最多25个字符,尝试输入 26个字符,检查程序能否正确处理;
输入默认值,空白,空格;
若只允许输入字母,尝试输入数字;反之;尝试输入字母;
利用复制,粘贴等操作强制输入程序不允许的输入数据;
输入特殊字符集,例如,NUL及\n等;
输入超过文本框长度的字符或文本,检查所输入的内容是否正常显示; 输入不符合格式的数据,检查程序是否正常校验,如,程序要求输入年月日格式为yy/mm/dd,实际输入yyyy/mm/dd,程序应该给出错误提示;
经过测试,系统在文本框输入功能中表现正常,在出现异常输入时能够及时报错并提醒用户重新输入。
谈数据安全与压缩
Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统,由于具有操作简单、界面友好等特点,具有较大的用户群体。因此ASP+Access成为许多中小型网上应用系统的首选方案。但ASP+Access解决方案在为我们带来便捷的同时,也带来了不容忽视的安全问题。
3.1 数据库的安全问题
ASP+Access解决方案的主要安全隐患来自Access数据库的安全性,其次在于ASP网页设计过程中的安全漏洞。
3.1.1 Access数据库的存储隐患
在ASP+Access应用系统中,如果获得或者猜到Access数据库的存储路径和数据库名,则该数据库就可以被下载到本地。例如:对于手机销售商店的Access数据库,人们一般命名为Shop.mdb、store.mdb等,而存储的路径一般为“URL/database”或干脆放在根目录(“URL/”)下。这样,只要在浏览器地址栏中敲入地址:“URL/database/store.mdb”,就可以轻易地把store.mdb下载到本地的机器中。
3.1.2 Access数据库的解密隐患
由于Access数据库的加密机制非常简单,所以即使数据库设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行异或来形成一个加密串,并将其存储在*.mdb文件中从地址“&H42”开始的区域内。由于异或操作的特点是“经过两次异或就恢复原值”,因此,用这一密钥与*.mdb文件中的加密串进行第二次异或操作,就可以轻松地得到Access数据库的密码。基于这种原理,可以很容易地编制出解密程序。
由此可见,无论是否设置了数据库密码,只要数据库被下载,其信息就没有任何安全性可言了。
3.1.3 源代码的安全隐患
由于ASP程序采用的是非编译性语言,这大大降低了程序源代码的安全性。任何人只要进入站点,就可以获得源代码,从而造成ASP应用程序源代码的泄露。
3.1.4 程序设计中的安全隐患
ASP代码利用表单(form)实现与用户交互的功能,而相应的内容会反映在浏览器的地址栏中,如果不采用适当的安全措施,只要记下这些内容,就可以绕过验证直接进入某一页面。例如在浏览器中敲入“??page.asp?x=1”,即可不经过表单页面直接进入满足“x=1”条件的页面。因此,在设计验证或注册页面时,必须采取特殊措施来避免此类问题的发生。
由于Access数据库加密机制过于简单,因此,如何有效地防止Access数据库被下载,就成了提高ASP+Access解决方案安全性的重中之重。我们可以采用以下方法来提高安全性:
(1)非常规命名法
防止数据库被找到的简便方法是为Access数据库文件起一个复杂的非常规名字,并把它存放在多层目录下。例如,对于网上书店的数据库文件,不要简单地命名为“book.mdb”或“store.mdb”,而是要起个非常规的名字,例如:faq19jhsvzbal.mdb,再把它放在如./akkjj16t/kjhgb661/acd/avccx55 之类的深层目录下。这样,对于一些通过猜的方式得到Access数据库文件名的非法访问方法起到了有效的阻止作用。
(2)使用ODBC数据源
在ASP程序设计中,应尽量使用ODBC数据源,不要把数据库名直接写在程序中,否则,数据库名将随ASP源代码的失密而一同失密。例如:
DBPath = Server.MapPath(“./akkjj16t/
kjhgb661/acd/avccx55/faq19jhsvzbal.mdb ”)
conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,数据库也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了,如: conn.open “ODBC-DSN名”
3.2 据库的压缩技术
随着用户的增加和网站的运行,数据库占用会越来越大,而频繁的对数据库的增加、删除等操作,也会产生记录碎片,浪费空间,影响数据库的查询速度。对于数据库的压缩,第一种方法是采用纯编程的方式对数据库进行压缩处理,这种方法实用性强,效果明显,但专业性要求较高,复杂度高。第二种方法是采用软件方法对数据库进行处理。此外,还可以对大型数据库采用分项存储的方法减少数据库的空间,提高数据库使用效率。
总结与展望
本系统设计并使现一个在线手机销售网站的模型。本网站采用了流行的三层架构,通过将整个系统分为不同的逻辑模块,大大降低了应用程序系统开发和维护的成本,提高了系统模块的复用性,同时使系统的可扩展性大大提高。由于ASP自身的优点,本网站对系统的要求较低,兼容性很好,为网站的推广使用提供了便利和可能。
在线手机销售系统的开发过程中,通过对ASP技术的学习和运用,我充分到了ASP技术在系统移植方面出众的优点以及它的无限魅力。ASP技术正在不同的方式影响者企业、个人和开发人员。对于个人,ASP技术将网络商店变得更加普遍的同时也更加个性化。对于企业和网站开发人员,ASP技术让开发变得更加简便和实用,与传统开发方法相比执行效率也更高,它将改变企业的销售模式,使IT真正成为企业成功的重要因素。
4.2 问题与展望
4.2.1 界面不够美观
从直观的角度讲,在线手机销售系统的界面还不够美观。由于时间关系,本人掌握的素材有限。同时,对于DreamWeaver8这款功能强大的软件我的掌握程
度尚浅,本系统中并没有能够完全发挥出它的强大功能,把图形化界面做到美轮美奂。在今后还应该注意积累素材,不断修改,让界面趋于完美。
4.2.2 购物车功能尚不完善
购物车模块的实现使本系统的一大亮点,但针对这个模块,本系统实现的仅仅是基本的收录和保存的简单功能。在理想的购物车模块中,还应该具有产品追踪的功能,对于用户来讲应该随时掌握购物车中收录的产品的实时价格以及动态比较等等。对于管理员来说,应该可以统计用户购物车中产品的分类作为销售统计的辅助材料,为更准确的定位销售方向做支撑材料。
本系统中诸如以上的功能尚不完善的地方还有不少,相信在今后不断的开发和维护过程中,系统的功能会一步步趋于完善,真正做到购销双方都得心应手。
附件:程序部分源代码
src-base-action:
package com.shxt.base.
import java.util.M
import javax.servlet.ServletC
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.apache.struts2.interceptor.ServletRequestA
import org.apache.struts2.interceptor.ServletResponseA
import org.apache.struts2.interceptor.SessionA
import org.apache.struts2.util.ServletContextA
import com.opensymphony.xwork2.ActionS
public class BaseAction extends ActionSupport implements SessionAware,
ServletRequestAware, ServletResponseAware, ServletContextAware { protected Map&String, Object& protected HttpServletR 10
protected HttpServletR protected ServletContext servletC public void setSession(Map&String, Object& session) {
} public void setServletRequest(HttpServletRequest request) {
} public void setServletResponse(HttpServletResponse response) {
} public void setServletContext(ServletContext servletContext) {
} /*** 提示信息使用*/ protected S /*** success
error * 标识*/ protected S public String getFlag() {
} public void setFlag(String flag) {
} public String getMessage() {
} public void setMessage(String message) {
} 11 this.session
= this.request = this.response = this.servletContext = servletC this.flag = this.message =
/*** 跳转到JSP资源的访问路径 */ protected String toJ public String getToJsp() {
} public void setToJsp(String toJsp) {
} /*** 跳转到Action资源的访问路径*/ protected String toA public String getToAction() {
} public void setToAction(String toAction) {
} /**重定向到JSP页面*/ protected String REDIRECT = &redirect&; /**请求转发到JSP页面*/ protected String DISPATCHER = &dispatcher&; /**请求转发到Action*/ protected String CHAIN = &chain&; /**重定向到Action*/ protected String REDIRECTACTION = &redirectAction&; /**跳转到JSON数据*/ protected String JSON = &json&; protected Object jsonR public Object getJsonResult() {
} 12 return toJ this.toJsp = toJ return toA this.toAction = toA return jsonR
} public void setJsonResult(Object jsonResult) {
} this.jsonResult = jsonR
src-base-dao-basedaoimpl:
package com.shxt.base.
import java.util.L
import javax.annotation.R
import org.hibernate.Q
import org.hibernate.SQLQ
import org.hibernate.S
import org.hibernate.SessionF
import org.hibernate.T
import org.springframework.stereotype.R
import com.shxt.base.utils.AliasToBeanResultT public class BaseDaoImpl implements IBaseDao {
/** 声明SessionFactory */ private SessionFactory sessionF public void setSessionFactory(SessionFactory sessionFactory) {
} public Session getSession() {
} public void delete(Class&?& clz, Integer id) {
} public void delete(Object obj) {
this.getSession().delete(obj); 13 this.sessionFactory = sessionF return sessionFactory.getCurrentSession(); this.getSession().delete(this.getSession().get(clz, id));
} 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(String hql, Object arg) {
} public Object query(String hql) {
} public void save(Object obj) { 14 return this.getSession().get(clz, id); return this.getSession().load(clz, id); Query query = this.getSession().createQuery(hql); query = this.setParameters(query, args); return query.list(); return this.list(hql, new Object[] { arg }); return this.list(hql, null); Query query = this.getSession().createQuery(hql); query = this.setParameters(query, args); return query.uniqueResult(); return this.query(hql, new Object[] { arg }); return this.query(hql, null);
} this.getSession().save(obj); public void update(Object obj) {
} 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) {
Query query = this.getSession().createQuery(hql); query = this.setParameters(query, args); // 分页设置 query.setFirstResult(
(pageBean.getPageNow() - 1) * pageBean.getPageSize()) .setMaxResults(pageBean.getPageSize()); this.updateHql(hql, null); this.updateHql(hql, new Object[] { arg }); Query query = this.getSession().createQuery(hql); query = this.setParameters(query, args); query.executeUpdate(); this.getSession().update(obj); // 结果集存到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(); // 存到PageBean当中 pageBean.setTotalCount(totalCount); // 获取总页数 Long totalPage = totalCount % pageBean.getPageSize() == 0 ? totalCount
/ pageBean.getPageSize() : totalCount / pageBean.getPageSize() + 1; // 存到PageBean当中 pageBean.setTotalPage(totalPage); return pageB public PageBean find(String hql, Object arg, PageBean pageBean) {
} public PageBean find(String hql, PageBean pageBean) {
} private Query setParameters(Query query, Object[] args) {
} /*** 判断是否是HQL语句,针对HQL语句和SQL语句,变成Count(*) 提供if (args != null && args.length & 0) {
} for (int i = 0; i & args. i++) {
} query.setParameter(i, args[i]); return this.find(hql, null, pageBean); return this.find(hql, new Object[] { arg }, pageBean); 效率
* @param hql
* @param isHql 16
* @return */ private String getCountHql(String hql, boolean isHql) {
} public List&?& listSQL(String sql, Object[] args, Class&?& clazz,
} public List&?& listSQL(String sql, Object arg, Class&?& clazz,
boolean hasEntity) { 17 // 1、获取from前面的字符串 String f = hql.substring(0, hql.indexOf(&from&)); // 2、将from前面的字符串替换为select count(*) if (f.equals(&&)) {
hql = &select count(*) & + } else {
} // 3、将fetch替换为&&,因为抓取查询不能使用count(*) if (isHql) {
} hql = hql.replace(&fetch&, & &); hql = hql.replace(f, &select count(*) &);
boolean hasEntity) { SQLQuery query = this.getSession().createSQLQuery(sql); query = (SQLQuery) this.setParameters(query, args); if (hasEntity) {// 如果true,说明有相应的映射文件或者注解
query.addEntity(clazz); } else {// DTO
} return query.list(); query.setResultTransformer(new AliasToBeanResultTransformer(clazz)); return this.listSQL(sql, new Object[] { arg }, clazz, hasEntity);
} } public List&?& listSQL(String sql, Class&?& clazz, boolean hasEntity) {
} return this.listSQL(sql, null, clazz, hasEntity);
src-base-dao-ibasedao:
package com.shxt.base.
import java.util.L
public interface IBaseDao {
public void save(Object obj); public void update(Object obj); public void delete(Class&?& clz, Integer 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(String 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 , PageBean 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-pagebean:
package com.shxt.base.
import java.util.L
public class PageBean {
/**每页显示条数*/ private Integer pageSize = 10; /**当前页*/ private Integer pageNow = 1; /**总页数*/ private Long totalP /**总记录数*/ private Long totalC /**数据*/ private List&?& public Integer getPageSize() {
} public void setPageSize(Integer pageSize) {
} public Integer getPageNow() {
} public void setPageNow(Integer pageNow) {
this.pageNow = pageN 19 return pageS this.pageSize = pageS return pageN
} } public Long getTotalPage() {
} public void setTotalPage(Long totalPage) {
} public Long getTotalCount() {
} public void setTotalCount(Long totalCount) {
} public List&?& getDatas() {
} public void setDatas(List&?& datas) {
} this.datas = this.totalCount = totalC return totalC this.totalPage = totalP return totalP
src-base-filter-sessionfilter: package com.shxt.base.
import java.io.IOE
import java.io.PrintW
import javax.servlet.F
import javax.servlet.FilterC import javax.servlet.FilterC import javax.servlet.ServletE import javax.servlet.ServletR
import javax.servlet.ServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
public class SessionFilter implements Filter {
public void destroy() {
} public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request = (HttpServletRequest) HttpServletResponse response = (HttpServletResponse) //获取请求的路径 String path = request.getServletPath();// /shxt/adsfafds.action chain.doFilter(request, response); //排除不监控的路径
if(path.endsWith(&login.jsp&)||path.endsWith(&loginLoginAction.action&)){////
chain.doFilter(request, response); }else{
//判断httpsession HttpSession session = request.getSession(); if(session.getAttribute(&session_user_id&)!=null){
chain.doFilter(request, response); }else{
response.setContentType(&text/charset=UTF-8&); PrintWriter out = response.getWriter(); //执行JS代码 out.write(&&script type='text/javascript'&alert('请登录
21 ');window.top.location.href='&+request.getContextPath()+&/jsp/login.jsp';&/script&&);
} out.flush(); out.close(); public void init(FilterConfig arg0) throws ServletException {
} // TODO Auto-generated method stub
src-base-service-baseservice:
package com.shxt.base.
import javax.annotation.R
import org.springframework.stereotype.S import com.shxt.base.dao.IBaseD
public class BaseService {
} protected IBaseDao baseD public void setBaseDao(IBaseDao baseDao) {
} this.baseDao = baseD
src-base-utils- AliasToBeanResultTransformer: package com.shxt.base.
import java.lang.reflect.F
import java.util.L
import org.hibernate.HibernateE
import org.hibernate.property.ChainedPropertyA import org.hibernate.property.PropertyA
import org.hibernate.property.PropertyAccessorF
import org.hibernate.property.S
import org.hibernate.transform.ResultT
public class AliasToBeanResultTransformer implements ResultTransformer {
} public Object transformTuple(Object[] tuple, String[] aliases) {
if (setters == null) {// 首先初始化,取得目标POJO类的所有SETTER
PropertyAccessorFactory.getPropertyAccessor(resultClass, null), PropertyAccessorFactory.getPropertyAccessor(&field&) }); private static final long serialVersionUID = 1L; private final Class&?& resultC private Setter[] private PropertyAccessor propertyA public AliasToBeanResultTransformer(Class&?& resultClass) {
if (resultClass == null)
throw new IllegalArgumentException(&resultClass cannot be null&); this.resultClass = resultC propertyAccessor = new ChainedPropertyAccessor(new PropertyAccessor[] 方法
setters = new Setter[aliases.length]; for (int i = 0; i & aliases. i++) {
String alias = aliases[i]; if (alias != null) {
// 我的逻辑主要是在getSetterByColumnName方法里面,其它都是HIBERNATE的另一个类中COPY的
// 这里填充所需要的SETTER方法 setters[i] = getSetterByColumnName(alias); 23
} } result = resultClass.newInstance(); // 这里使用SETTER方法填充POJO对象 for (int i = 0; i & aliases. i++) {
} if (setters[i] != null) {
} setters[i].set(result, tuple[i], null); } catch (InstantiationException e) {
throw new HibernateException(&Could not instantiate resultclass: &
+ resultClass.getName()); } catch (IllegalAccessException e) {
} throw new HibernateException(&Could not instantiate resultclass: &
+ resultClass.getName()); public List transformList(List collection) {
} // 根据数据库字段名在POJO查找JAVA属性名,参数就是数据库字段名,如: USER_ID
private Setter getSetterByColumnName(String alias) {
// 取得POJO所有属性名 Field[] fields = resultClass.getDeclaredFields(); if (fields == null || fields.length == 0) {
throw new RuntimeException(&实体& + resultClass.getName() + &不含
任何属性&);
} // 把字段名中所有的下杠去除 // String proName = alias.replaceAll(&_&, &&).toLowerCase(); String proName = alias.toLowerCase(); for (Field field : fields) {
} throw new RuntimeException(
&找不到数据库字段 :&
+ alias + & 对应的POJO属性或其getter方法,比如数据库字段为// 去除下杠的字段名如果和属性名对得上,就取这个SETTER方法 if (field.getName().toLowerCase().equals(proName)) {
} return propertyAccessor.getSetter(resultClass, field.getName()); USER_ID或USERID,那么JAVA属性应为userId&);
src-base-utils- MD5Helper:
package com.shxt.base.
import java.security.MessageD
import java.security.MessageD
public class MD5Helper {
// MD5加码。32位 public static String MD5(String inStr) {
MessageDigest md5 = try {
md5 = MessageDigest.getInstance(&MD5&); 25 } catch (Exception e) {
} System.out.println(e.toString()); e.printStackTrace(); return &&; char[] charArray = inStr.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i = 0; i & charArray. i++)
byteArray[i] = (byte) charArray[i]; byte[] md5Bytes = md5.digest(byteArray); StringBuffer hexValue = new StringBuffer(); for (int i = 0; i & md5Bytes. i++) {
} int val = ((int) md5Bytes[i]) & 0 if (val & 16)
hexValue.append(&0&); hexValue.append(Integer.toHexString(val));
} return hexValue.toString(); // 可逆的加密算法 public static String KL(String inStr) {
26 // String s = new String(inStr); char[] a = inStr.toCharArray(); for (int i = 0; i & a. i++) {
} String s = new String(a); a[i] = (char) (a[i] ^ 't');
} // 加密后解密 public static String JM(String inStr) {
} // 测试主函数 public static void main(String args[]) {
} String s = new String(&123456&); System.out.println(&原始:& + s); System.out.println(&MD5后:& + MD5(s)); System.out.println(&MD5后再加密:& + KL(MD5(s))); System.out.println(&解密为MD5后的:& + JM(KL(MD5(s)))); char[] a = inStr.toCharArray(); for (int i = 0; i & a. i++) {
} String k = new String(a); a[i] = (char) (a[i] ^ 't');
src-model-person:
package com.shxt.
import javax.persistence.C import javax.persistence.E
import javax.persistence.GeneratedV import javax.persistence.Id;
import javax.persistence.T @Entity
@Table(name=&person&)
public class Person {
private I 27
} private S @Id @GeneratedValue public Integer getId() {
} public void setId(Integer id) {
} @Column(name=&user_name&, length=32) public String getName() {
} public void setName(String name) {
this.name = this.id =
手机销售信息系统,测试与收尾报告相关文章
《》由(在点网)整理提供,版权归原作者、原出处所有。
Copyright &
All Rights Reserved.}

我要回帖

更多关于 销售系统设计 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信