LegendShop是基于JAVA编程语言开发的开源电子商务软件,采用Spring/Spring MVC等开源技术和自主框架技术开发。
1、LegendShop采用HTML伪静态生成技术和多级缓存技术,使得系统的响应速度和负载能力得到极大的提升。
2、LegendShop是采用MVC架构开发的电子商务平台,使得用户在系统风格修改方面也能得心应手。
3、采用AJAX、Jquery等技术,在系统的易用性和实用性方面都得到了空前的突破,真正达到了只要会打字就能够建设专业水准的电子商务平台。
4、支持多操作系统(如: Windows、Linux、Solaris等),有利于网店系统的部署与迁移。
5、支持SEO优化,帮助您顺利进行搜索引擎营销,以达到提升产品销量和品牌形象的目的。
6、LegendShop通过与支付宝等多家网银支付公司合作为用户实现最佳无接缝支付功能。
7、支持产品的动态属性动态参数,适合各种商品销售。
8、支持动态属性,能在运行是改变商城的运行模式。
9、支持国际化功能,支持多国语言,适合做外贸性生意。
10、支持全文搜索,用户可以查询所有的商城的商品信息。
11、支持多个地域协同销售,是个类似淘宝商城的微型商城系统。

二. 应用特征
2.1    多用户支持
一般的网上商城只是支持单个卖家发布产品,只是少数大型的B2C/C2C的大型网站例如淘宝/易趣等等才会支持多个卖家同时发布产品,但淘宝上已经有几十 上百万的卖家在上面做生意,如果在这些卖家中突围而出?如何跟其他商家进行差异化服务?是摆在淘宝等商家面前的一个难题。LegendShop也是支持多个卖家同时发布产品的网购平台,也可以理解为一个小型的“淘宝”的雏形,适用于那些想要打自己品牌的商家或者连锁店,或者用来跟淘宝等 进行配合销售。


2.2    良好的系统扩展性
LegendShop支持多种多种产品销售,每种产品都有固有属性和动态属性二种。而LegendShop采用JCF的代码生成工具进行后台的业务开发,对新需求的反应速度非常的快。


2.3    多国语言支持
整个系统基于UTF8编码,目前LegendShop前端已经实现对中文和英文的支持。如果有扩展需要,只要增加对应的语言包即可实现该语言的支持。适合外贸等将生意做到国外去的行业。

2.4    多模板支持
由于LegendShop的用户是面向不同的行业,因此对风格上会提出不同的要求。系统采用css和js来控制这个LegendShop前端的页面展示,用户可以在店铺管理中定制某种风格或者轮流使用所有的风格,以给客户带来新鲜感。


三.系统构架


运行环境:(操作系统:Windows/Linux/FreeBSD、WEB服务器:Tomcat 6.0以上、JDK 1.6以上 、数据库:MySQL 5.1/Oracle/SQL Server)
系统类型:B/S系统
操作系统:支持Linux、Unix、FreeBSD、Windows 2000/2003/XP等操作系统
数 据 库:支持MySQL、Oracle、SqlServer、Access等常见数据库
系统架构:MVC构架
主体框架:Spring、Spring MVC、Hibernate
安全框架:Spring Security
缓存框架:Ehcache
模板框架:Freemarker
全文检索:lucene
中文分词:IKAnalyzer
页面框架:Jquery
四 LegendShop工程的包结构分析

Java代码
  1. LegendShop的包结构的详细分析如下:
  2. 1 Resource
  3. 放置配置文件的地方
  4. 2 Config
  5. 放置系统配置文件的地方
  6. 2.1.1 common.properties 图片保存路径
  7. 2.1.2 global.properties  项目版本
  8. 2.1.3 jdbc.properties   数据库连接
  9. 3 i18n 国际化语言包
  10. 4 spring
  11. 4.1 legendshop
  12. 4.1.1 plugins 插件,系统在启动时会启动系统已有的插件
  13. 4.1.1.1 core
  14. 4.1.1.1.1 applicationContext-core-service.xml 核心的服务配置
  15. 4.1.1.1.2 captcha-context.xml 验证码服务配置
  16. 4.1.1.2 group 团购
  17. 4.1.1.2.1 applicationContext-group-service.xml 团购相关的服务
  18. 4.1.1.3 security 系统安全框架,采用命令模式实现,流程为Delegate->Processor->Command->Dao
  19. 业务代理->处理者->命令处理器->Dao
  20. 4.1.1.3.1 applicationContext-command.xml  命令处理器配置
  21. 4.1.1.3.2 applicationContext-dao.xml Security Dao配置
  22. 4.1.1.3.3 applicationContext-processor.xml Security Processor配置
  23. 4.1.1.3.4 applicationContext-service.xml业务代理配置
  24. 4.1.1.4 applicationContext-business-plugins.xml 主业务系统插件配置
  25. 4.1.1.5 applicationContext-core-plugins.xml 核心插件配置
  26. 4.1.1.6 applicationContext-group-plugins.xml  团购插件配置
  27. 4.1.1.7 applicationContext-security-plugins.xml 安全框架插件配置
  28. 4.1.2 applicationContext-aop.xml  系统面向切面的配置
  29. 4.1.3 applicationContext-cache.xml 缓存配置,采用spring3.1 cache + Ehcache
  30. 4.1.4 applicationContext-db.xml 数据库相关配置
  31. 4.1.5 applicationContext-dwr.xml DWR相关配置,DWR是一个Ajax框架
  32. 4.1.6 applicationContext-event.xml 事件配置
  33. 4.1.7 applicationContext-quartz.xml     系统定时器配置
  34. 4.1.8 applicationContext-search.xml     高级搜索配置,采用Lucence
  35. 4.1.9 applicationContext-security.xml    Security安全配置
  36. 4.1.10 applicationContext-service.xml 服务配置
  37. 4.1.11 applicationContext-util.xml      工具类配置
  38. 4.2 applicationContext.xml               Spring配置文件入口
  39. 4.3 applicationContext-mvc.xml    Spring MVC配置文件
  40. 5 sql
  41. 5.1 bizSQL.dal.xml  业务系统动态SQL配置文件
  42. 5.2 productSQL.dal.xml   团购系统动态SQL配置文件
  43. 6 META-INF
  44. 6.1 legendshop-biz-tags.tld   业务相关自定义标签
  45. 6.2 legendshop-tags.tld       系统相关自定义标签
  46. 6.3 DAL.cfg.xml            系统SQL配置
  47. 6.4 displaytag_zh_CN.properties  displaytag中文语言资源
  48. 6.5 displaytag.properties        displaytag英文语言资源
  49. 6.6 ehcache.xml               缓存配置
  50. 6.7 ext_stopword.dic            Lucence分词配置文件
  51. 6.8 fckeditor.properties           FckEditor富文本编辑器属性配置
  52. 6.9 freemarker.properties        Freemarker配置文件
  53. 6.10 IKAnalyzer.cfg.xml          IKAnalyzer配置文件,高级搜索用
  54. 6.11 QQWry.dat               IP地址数据库
  55. 7 Java
  56. 7.1 com.legendshop.business    主业务系统模块
  57. 7.2 com.legendshop.command.framework   Java Command FrameWork(JCF)框架
  58. 7.3 com.legendshop.core    核心业务模块
  59. 7.4 com.legendshop.event    事件机制模块
  60. 7.5 com.legendshop.group     团购模块
  61. 7.6 com.legendshop.model     实体对象
  62. 7.7 com.legendshop.permission  权限管理模块,采用JCF框架实现
  63. 7.8 com.legendshop.search      高级搜索模块,采用Lucence实现
  64. 7.9 com.legendshop.spi   Service Provider Interface 公用服务提供接口模块
  65. 7.10 com.legendshop.util     工具类模块


五.业务流程分析
LegendShop采用Spring MVC + Hibernate进行业务逻辑开发,为了支持多模板,采用Spring MVC返回字符串方式和Apache Tiles的动态匹配方式来路由到不同的页面,用户可于商城级别选择模板。

点击查看原始大小图片

Spring MVC框架结构

Java代码
  1. package com.legendshop.business.controller;
  2. /**
  3. * 购物车控制器。.
  4. */
  5. @Controller ①ß 将UserController变成一个Handler
  6. @RequestMapping("/basket")    ②ß指定控制器映射的URL
  7. public class BasketController extends BaseController {
  8. /** The basket service. */
  9. @Autowired
  10. private BasketService basketService;
  11. @RequestMapping("/query") ③ß处理方法对应的URL,相对于②处的URL
  12. public String query(HttpServletRequest request, HttpServletResponse response) {
  13. String prodId = request.getParameter("prodId");
  14. return getBasket(request, response, Long.parseLong(prodId));
  15. }
  16. .....
  17. return PathResolver.getPath(request, TilesPage.PAGE_CASH);
  18. }
  19. 以上地址即为http://localhost/basket/query.htm, 可以根据URL规则在controller中搜索“/basket”找到逻辑入口点。
  20. 系统启动自动扫描com.**.controller"所有的包,并加入spring的applicationcontext。配置如下:
  21. package="com.**.controller" />
  22. LegendShop支持2种视图:
  23. "viewResolver1"
  24. class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  25. "viewClass"
  26. value="org.springframework.web.servlet.view.JstlView" />
  27. "prefix" value="/pages" />
  28. "suffix" value=".jsp">
  29. "order" value="2">
  30. "viewResolver"
  31. class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  32. "viewClass">
  33. org.springframework.web.servlet.view.tiles2.TilesView
  34. "order" value="1">


对于spring返回的字符串,Spring会优先采用TilesView进行匹配,如果匹配不到就找JstlView进行匹配,如果找不到页面则会抛出page not found的错误。
目前LegendShop的页面类型分为5类,可在PageDefinition中找到其对应的定义。


Java代码
  1. /** 前端页面. */
  2. public final int FRONT_PAGE = 1;
  3. /** 后端页面. */
  4. public final int BACK_PAGE = 2;
  5. /** Apache TILES 定义. */
  6. public final int TILES = 3;
  7. /** The FORWARD Action. */
  8. public final int FOWARD = 4;
  9. /** The REDIRECT Action. */
  10. public final int REDIRECT = 5;


1) 对于前端页面的计算公式是:"/frontend" + 模板名称, 如果商城没有指定模板则采用默认值。
例如,return PathResolver.getPath(request, FrontPage.ALL);
返回的字符串为 “/frontend/default/all”,根据JstlView的配置,可以得出该前端页面的位置为:
/pages/frontend/default/all.jsp
2) 对于后段页面的计算公式是:"/backend" + 模板名称, 如果商城没有指定模板则采用默认值。
例如, return PathResolver.getPath(request, BackPage.SHOP_DETAIL_EDIT_PAGE);
返回的字符串为“/backend /default/shopDetail/shopDetail,可以得出该后端页面的位置为:
/pages/backend/default/shopDetail/shopDetail.jsp

3) 对于动作类页面的计算公式是:pathValue + template
例如, return PathResolver.getPath(request, TilesPage.PAGE_CASH);
返回的字符串“cash.default”,cash.是Tiles的页面名称,default是模板名称。可到Tiles的定义文件“tiles-definitions.xml”中查看对应的页面位置。

Java代码
  1. "cash.*" template="/pages/frontend/{1}/topFrame.jsp">
  2. "main" value="/pages/frontend/{1}/cash.jsp" />
  3. “cash.*”中的星号将会用“default”值代替,那{1}的值变为“default”,最终的结果为:
  4. template="/pages/frontend/default/topFrame.jsp"
  5. value="/pages/frontend/default/cash.jsp"



4) 对于动作类页面的计算公式是actionType + pathValue + WEB_SUFFIX(.htm)
actionType可以是“direct:”和“forward:”。
例如,return PathResolver.getPath(request, FowardPage.INDEX_QUERY);
返回的字符串为“forward:/index”,可以得知该动作会forward到一个叫”/index”的动作,可以在controller中搜索该动作的入口点。


六. LegendShop页面定义

Html代码
  1. afterOperation.jsp 操作成功后跳转的页面
  2. afterUserUpdate.jsp 更新成功后跳转的页面
  3. all.jsp 高级搜索首页
  4. allnews.jsp 所有新闻列表
  5. basket.jsp 购物车页面
  6. bought.jsp 已经购买的产品列表
  7. buy.jsp 购物车相关页面
  8. cash.jsp 收银台
  9. cashsave.jsp 收银台相关页面
  10. copy.jsp 下方版权信息
  11. copyAll.jsp 搜索页面的下方版权信息,内容要比copy.jsp少一些
  12. error.html 显示错误信息页面
  13. friendlink.jsp 友情链接
  14. gallery.jsp 图片库
  15. header.jsp 最上方的包括首页,论坛等链接信息
  16. hoton.jsp 热门产品列表
  17. hotsale.jsp 热销产品列表
  18. hotview.jsp 热门产品列表
  19. index.jsp B2C商城首页
  20. league.jsp 商家联盟
  21. leaveword.jsp 用户留言
  22. login.jsp 用户登录
  23. loginHint.jsp 用户登录提示
  24. myaccount.jsp 我的帐号
  25. newestProduct.jsp 最新产品
  26. newproducts.jsp 新产品
  27. news.jsp 新闻页面
  28. notice.jsp 公告页面
  29. openShop.jsp 是否开店页面
  30. order.jsp 订单
  31. prodpics.jsp 产品图片
  32. productDetail.jsp 产品详细信息
  33. recommend.jsp 产品推荐
  34. reg.jsp 用户注册
  35. resetpassword.jsp 重置密码
  36. right.jsp 产品详细页面
  37. saveto.jsp 保存订单页面
  38. searchall.jsp 高级搜索首页
  39. searchTopFrame.jsp 高级搜索的顶部文件,内容较top.jsp少
  40. shopContact.jsp 店铺详细信息
  41. smallsort.jsp 二级分类,三级分类产品列表
  42. sort.jsp 一级分类产品列表,Tiles框架页面
  43. sub.jsp 订单订购页面
  44. top.jsp 系统顶部页面
  45. topAll.jsp 高级搜索的顶部页面,top.jsp化简版
  46. topFrame.jsp Tiles框架页面
  47. topnews.jsp 首页新闻列表
  48. topsort.jsp 首页产品分类列表
  49. topsortnews.jsp 首页新闻列表
  50. updateMyAccount.jsp 更新我的帐号
  51. views.jsp 产品详细页面,包括其他页面
  52. visitedHistory.jsp 查看历史



七.LegendShop的标签
用法可以参考tags.jsp.
Tags 名称 用法 示例
国际化

Java代码
  1. com.legendshop.core.tag.I18nTag(i18n) 支持无参数和有参数两种,根据Locale从对应的文件拿到记录
  2. 支持参数嵌套,例如message:user.name
  3. 1. 无参数
  4. "user.name"/>
  5. 2. 有参数,动态参数名,start with message: will replace with locale message
  6. "errors.minlength" name="message:user.name" length="8"/>


地址化简器

Java代码
  1. com.legendshop.core.tag.URLTag(url) 主动加上前后缀:ContextPath + address + WEB_SUFFIX "" target="blank">首页


资源定位器

Java代码
  1. com.legendshop.core.tag.TemplateResourceTag(templateResource) 资源定位器,主要针对css js 图片等资源 "" />


系统配置读取

Java代码
  1. com.legendshop.core.tag.SettingsTag(settings) 用于显示系统参数配置 "USE_SCORE" >USE_SCORE is true


权限管理

Java代码
  1. com.legendshop.core.tag.AuthorizeActionTag(auth) 权限管理 "F_VIEW_ALL_DATA">have access right F_VIEW_ALL_DATA


选择框

Java代码
  1. com.legendshop.core.tag.OptionGroupTag(optionGroup) 选择框 "status" name="status"> "select" required="true" cache="true" beanName="SHOP_STATUS" selectedValue="${bean.status}"/> com.legendshop.business.tag.SortTag(sort) 获取产品分类 "sort" loadAll="true" sortType="P"> com.legendshop.business.tag.ShopDetailTag(ShopDetailTag) 获取商城详细信息并放入http request中 "shopDetail" /> com.legendshop.core.tag.CurrentShopTag 获取当前商城名称 com.legendshop.core.tag.CurrentUserTag 获取当前用户名称 用法: 在JSP页面中导入:Java代码<%@ taglib uri="http://www.legendesign.net/tags" prefix="ls"%> <%@ taglib uri="http://www.legendesign.net/biz" prefix="lb"%> 具体定义可以参考legendshop-tags.tld和legendshop-biz-tags.tld,