LegendShop是基于JAVA编程语言开发的开源电子商务软件,采用Hibernate、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工程的包结构分析
LegendShop的包结构的详细分析如下: 1 Resource 放置配置文件的地方 2 Config 放置系统配置文件的地方 2.1.1 common.properties 图片保存路径 2.1.2 global.properties 项目版本 2.1.3 jdbc.properties 数据库连接 3 i18n 国际化语言包 4 spring 4.1 legendshop 4.1.1 plugins 插件,系统在启动时会启动系统已有的插件 4.1.1.1 core 4.1.1.1.1 applicationContext-core-service.xml 核心的服务配置 4.1.1.1.2 captcha-context.xml 验证码服务配置 4.1.1.2 group 团购 4.1.1.2.1 applicationContext-group-service.xml 团购相关的服务 4.1.1.3 security 系统安全框架,采用命令模式实现,流程为Delegate->Processor->Command->Dao 业务代理->处理者->命令处理器->Dao 4.1.1.3.1 applicationContext-command.xml 命令处理器配置 4.1.1.3.2 applicationContext-dao.xml Security Dao配置 4.1.1.3.3 applicationContext-processor.xml Security Processor配置 4.1.1.3.4 applicationContext-service.xml业务代理配置 4.1.1.4 applicationContext-business-plugins.xml 主业务系统插件配置 4.1.1.5 applicationContext-core-plugins.xml 核心插件配置 4.1.1.6 applicationContext-group-plugins.xml 团购插件配置 4.1.1.7 applicationContext-security-plugins.xml 安全框架插件配置 4.1.2 applicationContext-aop.xml 系统面向切面的配置 4.1.3 applicationContext-cache.xml 缓存配置,采用spring3.1 cache + Ehcache 4.1.4 applicationContext-db.xml 数据库相关配置 4.1.5 applicationContext-dwr.xml DWR相关配置,DWR是一个Ajax框架 4.1.6 applicationContext-event.xml 事件配置 4.1.7 applicationContext-quartz.xml 系统定时器配置 4.1.8 applicationContext-search.xml 高级搜索配置,采用Lucence 4.1.9 applicationContext-security.xml Security安全配置 4.1.10 applicationContext-service.xml 服务配置 4.1.11 applicationContext-util.xml 工具类配置 4.2 applicationContext.xml Spring配置文件入口 4.3 applicationContext-mvc.xml Spring MVC配置文件 5 sql 5.1 bizSQL.dal.xml 业务系统动态SQL配置文件 5.2 productSQL.dal.xml 团购系统动态SQL配置文件 6 META-INF 6.1 legendshop-biz-tags.tld 业务相关自定义标签 6.2 legendshop-tags.tld 系统相关自定义标签 6.3 DAL.cfg.xml 系统SQL配置 6.4 displaytag_zh_CN.properties displaytag中文语言资源 6.5 displaytag.properties displaytag英文语言资源 6.6 ehcache.xml 缓存配置 6.7 ext_stopword.dic Lucence分词配置文件 6.8 fckeditor.properties FckEditor富文本编辑器属性配置 6.9 freemarker.properties Freemarker配置文件 6.10 IKAnalyzer.cfg.xml IKAnalyzer配置文件,高级搜索用 6.11 QQWry.dat IP地址数据库 7 Java 7.1 com.legendshop.business 主业务系统模块 7.2 com.legendshop.command.framework Java Command FrameWork(JCF)框架 7.3 com.legendshop.core 核心业务模块 7.4 com.legendshop.event 事件机制模块 7.5 com.legendshop.group 团购模块 7.6 com.legendshop.model 实体对象 7.7 com.legendshop.permission 权限管理模块,采用JCF框架实现 7.8 com.legendshop.search 高级搜索模块,采用Lucence实现 7.9 com.legendshop.spi Service Provider Interface 公用服务提供接口模块 7.10 com.legendshop.util 工具类模块
五.业务流程分析
LegendShop采用Spring MVC + Hibernate进行业务逻辑开发,为了支持多模板,采用Spring MVC返回字符串方式和Apache Tiles的动态匹配方式来路由到不同的页面,用户可于商城级别选择模板。
Spring MVC框架结构
package com.legendshop.business.controller; /** * 购物车控制器。. */ @Controller ①ß 将UserController变成一个Handler @RequestMapping("/basket") ②ß指定控制器映射的URL public class BasketController extends BaseController { /** The basket service. */ @Autowired private BasketService basketService; @RequestMapping("/query") ③ß处理方法对应的URL,相对于②处的URL public String query(HttpServletRequest request, HttpServletResponse response) { String prodId = request.getParameter("prodId"); return getBasket(request, response, Long.parseLong(prodId)); } ..... return PathResolver.getPath(request, TilesPage.PAGE_CASH); } 以上地址即为http://localhost/basket/query.htm, 可以根据URL规则在controller中搜索“/basket”找到逻辑入口点。 系统启动自动扫描com.**.controller"所有的包,并加入spring的applicationcontext。配置如下: <!-- 自动搜索@Controller标注的类 --> <context:component-scan base-package="com.**.controller" /> LegendShop支持2种视图: <bean id="viewResolver1" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/pages" /> <property name="suffix" value=".jsp"></property> <property name="order" value="2"></property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.tiles2.TilesView</value> </property> <property name="order" value="1"></property> </bean>
对于spring返回的字符串,Spring会优先采用TilesView进行匹配,如果匹配不到就找JstlView进行匹配,如果找不到页面则会抛出page not found的错误。
目前LegendShop的页面类型分为5类,可在PageDefinition中找到其对应的定义。
/** 前端页面. */ public final int FRONT_PAGE = 1; /** 后端页面. */ public final int BACK_PAGE = 2; /** Apache TILES 定义. */ public final int TILES = 3; /** The FORWARD Action. */ public final int FOWARD = 4; /** The REDIRECT Action. */ 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”中查看对应的页面位置。
<definition name="cash.*" template="/pages/frontend/{1}/topFrame.jsp"> <put-attribute name="main" value="/pages/frontend/{1}/cash.jsp" /> </definition> “cash.*”中的星号将会用“default”值代替,那{1}的值变为“default”,最终的结果为: template="/pages/frontend/default/topFrame.jsp" 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页面定义
afterOperation.jsp 操作成功后跳转的页面 afterUserUpdate.jsp 更新成功后跳转的页面 all.jsp 高级搜索首页 allnews.jsp 所有新闻列表 basket.jsp 购物车页面 bought.jsp 已经购买的产品列表 buy.jsp 购物车相关页面 cash.jsp 收银台 cashsave.jsp 收银台相关页面 copy.jsp 下方版权信息 copyAll.jsp 搜索页面的下方版权信息,内容要比copy.jsp少一些 error.html 显示错误信息页面 friendlink.jsp 友情链接 gallery.jsp 图片库 header.jsp 最上方的包括首页,论坛等链接信息 hoton.jsp 热门产品列表 hotsale.jsp 热销产品列表 hotview.jsp 热门产品列表 index.jsp B2C商城首页 league.jsp 商家联盟 leaveword.jsp 用户留言 login.jsp 用户登录 loginHint.jsp 用户登录提示 myaccount.jsp 我的帐号 newestProduct.jsp 最新产品 newproducts.jsp 新产品 news.jsp 新闻页面 notice.jsp 公告页面 openShop.jsp 是否开店页面 order.jsp 订单 prodpics.jsp 产品图片 productDetail.jsp 产品详细信息 recommend.jsp 产品推荐 reg.jsp 用户注册 resetpassword.jsp 重置密码 right.jsp 产品详细页面 saveto.jsp 保存订单页面 searchall.jsp 高级搜索首页 searchTopFrame.jsp 高级搜索的顶部文件,内容较top.jsp少 shopContact.jsp 店铺详细信息 smallsort.jsp 二级分类,三级分类产品列表 sort.jsp 一级分类产品列表,Tiles框架页面 sub.jsp 订单订购页面 top.jsp 系统顶部页面 topAll.jsp 高级搜索的顶部页面,top.jsp化简版 topFrame.jsp Tiles框架页面 topnews.jsp 首页新闻列表 topsort.jsp 首页产品分类列表 topsortnews.jsp 首页新闻列表 updateMyAccount.jsp 更新我的帐号 views.jsp 产品详细页面,包括其他页面 visitedHistory.jsp 查看历史
七.LegendShop的标签
用法可以参考tags.jsp.
Tags 名称 用法 示例
国际化
com.legendshop.core.tag.I18nTag(i18n) 支持无参数和有参数两种,根据Locale从对应的文件拿到记录 支持参数嵌套,例如message:user.name 1. 无参数 <ls:i18n key="user.name"/> 2. 有参数,动态参数名,start with message: will replace with locale message <ls:i18n key="errors.minlength" name="message:user.name" length="8"/>
地址化简器
com.legendshop.core.tag.URLTag(url) 主动加上前后缀:ContextPath + address + WEB_SUFFIX <a href="<ls:url address='/index'/>" target="blank">首页</a>
资源定位器
com.legendshop.core.tag.TemplateResourceTag(templateResource) 资源定位器,主要针对css js 图片等资源 <img src="<ls:templateResource item='/img/addtocart.jpg'/>" />
系统配置读取
com.legendshop.core.tag.SettingsTag(settings) 用于显示系统参数配置 <ls:settings key="USE_SCORE" >USE_SCORE is true</ls:settings>
权限管理
com.legendshop.core.tag.AuthorizeActionTag(auth) 权限管理 <ls:auth ifAnyGranted="F_VIEW_ALL_DATA">have access right F_VIEW_ALL_DATA</ls:auth>
选择框
com.legendshop.core.tag.OptionGroupTag(optionGroup) 选择框 <select id="status" name="status"> <ls:optionGroup type="select" required="true" cache="true" beanName="SHOP_STATUS" selectedValue="${bean.status}"/> </select> com.legendshop.business.tag.SortTag(sort) 获取产品分类 <lb:sort var="sort" loadAll="true" sortType="P"> com.legendshop.business.tag.ShopDetailTag(ShopDetailTag) 获取商城详细信息并放入http request中 <lb:shopDetail var="shopDetail" /> com.legendshop.core.tag.CurrentShopTag 获取当前商城名称 <lb:currentShop /> com.legendshop.core.tag.CurrentUserTag 获取当前用户名称 <lb:currentUser />
用法:
在JSP页面中导入:
<%@ 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,
处理类位于com.legendshop.core.tag.*