今日思考,完成一个基于BS结构的工艺品销售系统项目,需要实现哪些功能?
此类项目常见描述如下:
随着计算机和网络等技术的不断发展,以及电子商务的广泛应用,企业能够在更大的范围内建立跨地域甚至全球化的市场。工艺品行业供应链的特点有:以销售/品牌企业为核心;市场需求变化很快;面向订单生产;供应链周期短;产品信息管理复杂;全球化的生态系统。面对市场日益加剧的竞争环境,我国工艺品企业加快发展电子商务和信息化步伐是必然走势,这将有利于企业增加外贸渠道,降低交易成本,简化商务过程和缩短生产周期。
SSM(MYECLIPSE)框架及其适合本类项目,使用MVC的思想可以极大程度减少重复工作量。和SSM(MYECLIPSE)框架最配的开发工具是MYECLIPSE。MYECLIPSE集成了大量插件,可以更好的使用SSM(MYECLIPSE)进行项目的开发,使得项目开发时事半功倍。
通过对基于BS结构的工艺品销售系统系统的仔细分析,可以得出基于BS结构的工艺品销售系统系统是一个 后台项目。
在这样一个项目中,系统的登录角色是必不可少的,对每个登录角色设置账号、密码。以确保系统可以正常登录使用。SSM(MYECLIPSE)项目中包含的登录角色有管理员。
为了完成系统的功能需要为产品设置订单表,记录订单信息。在订单表中定义了两者的关联关系,其中订单的名字与产品的mingzi字段对应、订单的价格与产品的jiage字段对应
。
总结得出该系统所有数据为:管理员(admin)、用户(yonghu)、产品(chanpin)、订单(dingdan)、运输(yunshu)
管理员表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 管理员id username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码 quanxian | VARCHAR(255) | | 权限
用户表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 用户id xingming | VARCHAR(255) | | 姓名 nianling | VARCHAR(255) | | 年龄 xingbie | VARCHAR(255) | | 性别 username | VARCHAR(255) | | 账号 password | VARCHAR(255) | | 密码
产品表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 产品id zhonglei | VARCHAR(255) | | 种类 guige | VARCHAR(255) | | 规格 jiage | VARCHAR(255) | | 价格 shuliang | VARCHAR(255) | | 数量 mingzi | VARCHAR(255) | | 名字 jieshao | VARCHAR(255) | | 介绍
订单表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 订单id mingzi | VARCHAR(255) | | 名字 jiage | VARCHAR(255) | | 价格 shuliang | VARCHAR(255) | | 数量 dizhi | VARCHAR(255) | | 地址 xingming | VARCHAR(255) | | 姓名 lianxifangshi | VARCHAR(255) | | 联系方式
运输表
字段名 | 类型 | 属性 | 描述 id | INT(11) | PRIMARY KEY | 运输id shifadi | VARCHAR(255) | | 始发地 tujing | VARCHAR(255) | | 途径 shijian | VARCHAR(255) | | 时间
package org.mypro.front; import java.io.File; import java.io.IOException; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; import javax.jms.Session; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.mypro.dao.ChanpinMapper; import org.mypro.entity.Chanpin; import org.mypro.entity.ChanpinExample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartFile; @Controller @RequestMapping(value = "/") public class ChanpinController { private static final Log logger = LogFactory.getLog(ChanpinController.class); @Autowired private ChanpinMapper chanpindao; //定义方法tianjiachanpin,响应页面tianjiachanpin请求 @RequestMapping(value = "tianjiachanpin") public String tianjiachanpin(HttpServletRequest request, HttpServletResponse response,HttpSession session,String backurl) { logger.debug("ChanpinController.tianjiachanpin ......"); if(backurl != null && backurl.indexOf("tianjiachanpin.action") == -1){ return "forward:/" + backurl; } return "tianjiachanpin"; } @RequestMapping(value = "tianjiachanpinact") public String tianjiachanpinact(HttpServletRequest request,HttpSession session, HttpServletResponse response,Chanpin chanpin,String backurl) throws IOException { logger.debug("ChanpinController.tianjiachanpinact ......"); chanpindao.insert(chanpin); request.setAttribute("message", "添加产品成功"); if(backurl != null && backurl.indexOf("tianjiachanpinact.action") == -1){ return "forward:/" + backurl; } //返回tianjiachanpin方法 return "forward:/tianjiachanpin.action"; } //定义chanpinguanli方法响应页面请求 @RequestMapping(value = "chanpinguanli") public String chanpinguanli(HttpServletRequest request,HttpSession session, HttpServletResponse response,String backurl) { logger.debug("ChanpinController.chanpinguanli ......"); ChanpinExample example = new ChanpinExample(); List chanpinall = chanpindao.selectByExample(example); request.setAttribute("chanpinall", chanpinall); if(backurl != null && backurl.indexOf("chanpinguanli.action") == -1){ return "forward:/" + backurl; } return "chanpinguanli"; } // 定义 chanpinchakan方法 @RequestMapping(value = "chanpinchakan") public String chanpinchakan(HttpServletRequest request,HttpSession session, HttpServletResponse response,String backurl) { logger.debug("ChanpinController.chanpinchakan ......"); ChanpinExample example = new ChanpinExample(); List chanpinall = chanpindao.selectByExample(example); request.setAttribute("chanpinall", chanpinall); if(backurl != null && backurl.indexOf("chanpinchakan.action") == -1){ return "forward:/" + backurl; } return "chanpinchakan"; } // 定义 xiugaichanpin方法 @RequestMapping(value = "xiugaichanpin") public String xiugaichanpin(HttpServletRequest request, HttpServletResponse response,HttpSession session,int id,String backurl){ logger.debug("ChanpinController.xiugaichanpin ......"); Chanpin chanpin = chanpindao.selectByPrimaryKey(id); request.setAttribute("chanpin", chanpin); if(backurl != null && backurl.indexOf("xiugaichanpin.action") == -1){ return "forward:/" + backurl; } return "xiugaichanpin"; } // 定义xiugaichanpinact处理产品修改 @RequestMapping(value = "xiugaichanpinact") public String xiugaichanpinact(HttpServletRequest request, HttpServletResponse response,Chanpin chanpin,HttpSession session,String backurl) throws IOException { logger.debug("ChanpinController.xiugaichanpinact ......"); chanpindao.updateByPrimaryKeySelective(chanpin); request.setAttribute("message", "修改产品信息成功"); if(backurl != null && backurl.indexOf("xiugaichanpinact.action") == -1){ return "forward:/" + backurl; } return "forward:/chanpinguanli.action"; } // 定义shanchuchanpin,处理删除产品 @RequestMapping(value = "shanchuchanpin") public String shanchuchanpin(HttpServletRequest request, HttpServletResponse response,HttpSession session,int id,String backurl){ logger.debug("ChanpinController.shanchuchanpin ......"); chanpindao.deleteByPrimaryKey(id); request.setAttribute("message", "删除产品成功"); if(backurl != null && backurl.indexOf("shanchuchanpin.action") == -1){ return "forward:/" + backurl; } return "forward:/chanpinguanli.action"; } // 定义sousuochanpin方法,处理搜索操作 @RequestMapping(value = "sousuochanpin") public String sousuochanpin(HttpServletRequest request, HttpServletResponse response,HttpSession session,String search,String backurl) { logger.debug("ChanpinController.sousuochanpin ......"); ChanpinExample example = new ChanpinExample(); ChanpinExample.Criteria criteria = example.createCriteria(); if(search != null){ criteria.andZhongleiLike("%" + search + "%"); } List chanpinall = chanpindao.selectByExample(example); request.setAttribute("chanpinall", chanpinall); if(backurl != null && backurl.indexOf("sousuochanpin.action") == -1){ return "forward:/" + backurl; } return "sousuochanpin"; } // 定义ChanpinpinglunMapper@RequestMapping (value = "chanpinxiangqing") public String chanpinxiangqing(HttpServletRequest request,HttpSession session, HttpServletResponse response,int id,String backurl) {logger. debug("ChanpinController.chanpinxiangqing ......");Chanpin chanpin = chanpindao.selectByPrimaryKey(id);request. setAttribute("chanpin", chanpin); if(backurl != null && backurl.indexOf("chanpinxiangqing.action") == -1){ return "forward:/" + backurl; } return "chanpinxiangqing"; } // 上传文件图片等 public String uploadUtile(MultipartFile file, HttpServletRequest request) throws IOException { // 根据当前时间生成时间字符串 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS"); String res = sdf.format(new Date()); // uploads文件夹位置 String rootPath = request.getSession().getServletContext().getRealPath("resource/uploads/"); // 原始名称 String originalFileName = file.getOriginalFilename(); // 新文件名 String newFileName = "sliver" + res + originalFileName.substring(originalFileName.lastIndexOf(".")); // 创建年月文件夹 Calendar date = Calendar.getInstance(); File dateDirs = new File(date.get(Calendar.YEAR) + File.separator + (date.get(Calendar.MONTH)+1)); // 新文件 File newFile = new File(rootPath + File.separator + dateDirs + File.separator + newFileName); // 判断目标文件所在目录是否存在 if( !newFile.getParentFile().exists()) { // 如果目标文件所在的目录不存在,则创建父目录newFile. getParentFile().mkdirs(); } System.out.println(newFile); // 将内存中的数据写入磁盘file. transferTo(newFile); // 完整的url String fileUrl = date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH)+1) + "/" + newFileName; return fileUrl; }}
查询运输模块:
在浏览器中进入运输查询页面时,此时浏览器的地址栏为yunshuguanli.action,该地址将响应yunshuController类中的yunshuguanli,在该方法中,通过selectByexample方法获取所有的运输信息,并将该信息保存到request中,在页面进行循环展示。该部分核心代码如下:
生成运输样例类,通过example定义查询条件 YunshuExample example = new YunshuExample();
通过yunshudao的selectByExample方法查询出所有的运输信息 List yunshuall = yunshudao.selectByExample(example);
将运输信息,保存到request中,在页面通过foreach方法进行展示 request.setAttribute("yunshuall", yunshuall);
返回运输管理界面
return "forward:/yunshuguanli.action";
删除运输模块:
在页面中通过a标签,shanchuyunshu?id=将id传入到后台中,通过shanchuyunshu接收运输id。使用deleteByid的方法
删除该运输,完成删除操作。定义删除成功提示信息,删除运输成功,并保存到request中,该部分代码如下:
通过yunshudao的删除方法根据id删除对应的运输 yunshudao.deleteByPrimaryKey(id);
将删除运输成功信息,保存到request的message中,在页面中给出用户提示 request.setAttribute("message", "删除运输成功");
返回运输管理界面
return "forward:/yunshuguanli.action";