1.店铺信息编辑

  • 编写shopDao
    //更新店铺信息 返回1成功 -1失败int updateShop(Shop shop);//通过shopid查询店铺Shop queryByShopId(long shopId);
  • 编写shopDao.xml 通过定义resultMap来实现数据库中所需数据一一注入。使用SQL92语法进行多表查询。
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tian.dao.ShopDao"><resultMap id="shopMap" type="com.tian.pojo.Shop"><id column="shop_id" property="shopId"/><result column="shop_name" property="shopName"/><result column="shop_desc" property="shopDesc"/><result column="shop_addr" property="shopAddr"/><result column="phone" property="phone"/><result column="shop_img" property="shopImg"/><result column="priority" property="priority"/><result column="create_time" property="createTime"/><result column="last_edit_time" property="lastEditTime"/><result column="enable_status" property="enableStatus"/><result column="advice" property="advice"/><association property="area" column="area_id" javaType="com.tian.pojo.Area"><id column="area_id" property="areaId"/><result column="area_name" property="areaName"/></association><association property="shopCategory" column="shop_category_id" javaType="com.tian.pojo.ShopCategory"><id column="shop_category_id" property="shopCategoryId"/><result column="shop_category_name" property="shopCategoryName"/></association><association property="owner" column="user_id" javaType="com.tian.pojo.PersonInfo"><id column="user_id" property="userId"/><result column="name" property="name"/></association></resultMap><insert id="insertShop" useGeneratedKeys="true" keyColumn="shop_id" keyProperty="shopId">INSERT INTO o2o.tb_shop( owner_id, area_id, shop_category_id, shop_name, shop_desc, shop_addr, phone, shop_img, priority, create_time, last_edit_time, enable_status, advice)values (#{owner.userId}, #{area.areaId}, #{shopCategory.shopCategoryId}, #{shopName},#{shopDesc}, #{shopAddr}, #{phone}, #{shopImg}, #{priority}, #{createTime}, #{lastEditTime},#{enableStatus},#{advice})</insert><update id="updateShop" parameterType="com.tian.pojo.Shop">update o2o.tb_shop<set><if test="shopName!=null">shop_name=#{shopName},</if><if test="shopDesc!=null">shop_desc=#{shopDesc},</if><if test="shopAddr!=null">shop_addr=#{shopAddr},</if><if test="phone!=null">phone=#{phone},</if><if test="shopImg!=null">shop_img=#{shopImg},</if><if test="priority!=null">priority=#{priority},</if><if test="lastEditTime!=null">last_edit_time=#{lastEditTime},</if><if test="enableStatus!=null">enable_status=#{enableStatus},</if><if test="advice!=null">advice=#{advice},</if><if test="area!=null">area_id=#{area.areaId},</if><if test="shopCategory!=null">shop_category_id=#{shopCategory.shopCategoryId}</if></set>where shop_id=#{shopId}</update><select id="queryByShopId" resultMap="shopMap" parameterType="Long">SELECTs.shop_id,s.shop_name,s.shop_desc,s.shop_addr,s.phone,s.shop_img,s.priority,s.create_time,s.last_edit_time,s.enable_status,s.advice,a.area_id,a.area_name,sc.shop_category_id,sc.shop_category_nameFROMo2o.tb_shop s,o2o.tb_shop_category sc,o2o.tb_area aWHEREs.area_id=a.area_idANDs.shop_category_id=sc.shop_category_idANDs.shop_id = #{shopId}</select>
</mapper>
  • 编写shopService
//修改shopShopExecution modifyShop(Shop shop, InputStream shopImgInputStream,String fileName) throws ShopOperationException;//通过id找到shopShop getByShopId(long shopId);
  • 编写shopServiceImpl
package com.tian.service.impl;import com.tian.controller.shopadmin.ShopManagementController;
import com.tian.dao.ShopDao;
import com.tian.dto.ShopExecution;
import com.tian.enums.ShopStateEnum;
import com.tian.exceptions.ShopOperationException;
import com.tian.pojo.Shop;
import com.tian.service.ShopService;
import com.tian.util.ImageUtil;
import com.tian.util.PathUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.io.File;
import java.io.InputStream;
import java.util.Date;@Service
public class ShopServiceImpl implements ShopService {@Autowiredprivate ShopDao shopDao;@Override@Transactional  //该注解声明了这是sql中的事务方法 当抛出RuntimeException时该方法执行的数据库操作会被回滚掉public ShopExecution addShop(Shop shop, File shopImg) {if (shop==null){return new ShopExecution(ShopStateEnum.NULL_SHOP);}else {//判断是否具有店铺初始信息(未完成)try {//附初始值shop.setEnableStatus(0);shop.setCreateTime(new Date());shop.setLastEditTime(new Date());int effectedNum = shopDao.insertShop(shop);//当店铺创建失败就会抛出异常if (effectedNum<=0){throw new ShopOperationException("店铺创建失败");}else {if (shopImg != null){//存储图片try {addShopImg(shop,shopImg);}catch (Exception e){throw new ShopOperationException("addShopImg error:"+e.getMessage());}//更新店铺的图片地址effectedNum = shopDao.updateShop(shop);if (effectedNum<=0){throw new ShopOperationException("更新图片地址失败");}return new ShopExecution(ShopStateEnum.CHECK,shop);}}}catch (Exception e){throw new ShopOperationException("addShop error:"+e.getMessage());}}return new ShopExecution(ShopStateEnum.INNER_ERROR);}@Transactional@Overridepublic ShopExecution modifyShop(Shop shop, InputStream shopImgInputStream, String fileName) throws ShopOperationException {if (shop == null||shop.getShopId()==null){return new ShopExecution(ShopStateEnum.NULL_SHOP);}else {try {//1.判断是否需要处理图片if (shopImgInputStream!=null && fileName!=null && !"".equals(fileName)){Shop tempShop = shopDao.queryByShopId(shop.getShopId());if (tempShop.getShopImg()!=null){ImageUtil.deleteFileOrPath(tempShop.getShopImg());}//处理图片流File file = new File(fileName);ShopManagementController.inputStreamToFile(shopImgInputStream,file);addShopImg(shop,file);}//2.更新店铺信息shop.setLastEditTime(new Date());int effectedNum = shopDao.updateShop(shop);if (effectedNum <= 0 ){return new ShopExecution(ShopStateEnum.INNER_ERROR);}else {shop = shopDao.queryByShopId(shop.getShopId());return new ShopExecution(ShopStateEnum.SUCCESS,shop);}}catch (Exception e){throw new ShopOperationException("修改信息出错"+e.getMessage());}}}@Overridepublic Shop getByShopId(long shopId) {return shopDao.queryByShopId(shopId);}private void addShopImg(Shop shop, File shopImg) {//获取shop图片目录的相对值路径String dest = PathUtil.getShopImagePath(shop.getShopId());String shopImgAddr = ImageUtil.generateThumbnail(shopImg,dest);shop.setShopImg(shopImgAddr);}
}
  • 编写删除文件的工具方法
 //一旦修改图片就会将原先的图片删除掉 storePath是文件路径还是目录路径,如果是文件则删除该文件,如果是目录则删除该目录下的所有文件public static void deleteFileOrPath(String storePath){File fileOrPath = new File(storePath);if (fileOrPath.exists()){if (fileOrPath.isDirectory()){File files[] = fileOrPath.listFiles();for (File file : files) {file.delete();}}fileOrPath.delete();}}
  • 测试shopDao
@Testpublic void testQueryShopById(){long shopId = 29L;Shop shop = shopDao.queryByShopId(shopId);System.out.println(shop);}
  • 测试shopService
 @Testpublic void testUpdateShop() throws ShopOperationException, FileNotFoundException {Shop shop = shopService.getByShopId(29L);shop.setShopName("凯飞店");File shopImg = new File("F:\\学习资料\\美女图片\\2021031707550769.jpeg");InputStream is = new FileInputStream(shopImg);ShopExecution shopExecution = shopService.modifyShop(shop, is, "2021031707550769.jpeg");System.out.println(shopExecution.getShop());}

2.前后端交互实现

  • 配置后端controller层。
@RequestMapping(value = "/modifyshop",method = RequestMethod.POST)@ResponseBody //声明自动转化为jsonprivate Map<String,Object> modifyShop(HttpServletRequest request){Map<String,Object> modelMap = new HashMap<>();//判断验证码是否正确if (!CodeUtil.checkVerifyCode(request)){modelMap.put("success",false);modelMap.put("errMsg","输入了错误的验证码");return modelMap;}//1.接受并转化相应的参数,包括店铺信息以及图片信息String shopStr = HttpServletRequestUtil.getString(request, "shopStr");ObjectMapper mapper = new ObjectMapper();Shop shop = null;try {shop=mapper.readValue(shopStr,Shop.class);} catch (Exception e) {modelMap.put("success",false);modelMap.put("errMsg",e.getMessage());return modelMap;}//获取spring能够处理的CommonsMultipartFileCommonsMultipartFile shopImg = null;//创建解析器CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());//通过解析器判断当前的reques中是否存在图片流,如无流直接返回错误信息if (commonsMultipartResolver.isMultipart(request)){MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");}//2.修改店铺信息if (shop != null && shop.getShopId()!=null){PersonInfo owner = new PersonInfo();File shopImgFile = new File(PathUtil.getImgBasePath()+ ImageUtil.getRandomFileName()+shopImg.getOriginalFilename());try {shopImgFile.createNewFile();} catch (IOException e) {modelMap.put("success",false);modelMap.put("errMsg",e.getMessage());return modelMap;}ShopExecution se = null;try {if (shopImg == null){se = shopService.modifyShop(shop,null,null);}else {se = shopService.modifyShop(shop,shopImg.getInputStream(),shopImgFile.getName());}if (se.getState() == ShopStateEnum.SUCCESS.getState()){modelMap.put("success",true);}else {modelMap.put("success",false);modelMap.put("errMsg",se.getStateInfo());}} catch (IOException e) {throw new ShopOperationException("图片修改出错"+e.getMessage());}return modelMap;}else {modelMap.put("success",false);modelMap.put("errMsg","请输入店铺信息");return modelMap;}}
 @RequestMapping(value = "/getshopbyid",method = RequestMethod.GET)@ResponseBodyprivate Map<String,Object> getShopById(HttpServletRequest request){Map<String,Object> modelMap = new HashMap<>();Long shopId = HttpServletRequestUtil.getLong(request,"shopId");if (shopId>-1){try {Shop shop = shopService.getByShopId(shopId);List<Area> areaList = areaService.getAreaList();modelMap.put("shop",shop);modelMap.put("areaList",areaList);modelMap.put("success",true);}catch (Exception e){modelMap.put("success",false);modelMap.put("errMsg",e.toString());}}else {modelMap.put("success",false);modelMap.put("errMsg","empty shopId");}return modelMap;}
  • 设置前端js代码,从而实现代码的复用。
//根据传递过来的key进行匹配 通过正则表达式 匹配出合适的参数名,返回参数中的值
function getQueryString(name){let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");let r = window.location.search.substring(1).match(reg);if (r != null){return decodeURIComponent(r[2]);}return '';
}

$(function (){let shopId = getQueryString('shopId');let isEdit = shopId?true:false;let initUrl = '/shop/getshopinitinfo';let registerShopUrl = '/shopadmin/registershop';let shopInfoUrl ='/shop/getshopbyid?shopId='+shopId;let editShopUrl = '/shopadmin/modifyshop';if (!isEdit){getShopInitInfo();}else {getShopInfo(shopId);}function getShopInfo(shopId){$.getJSON(shopInfoUrl,function (data){if (data.success){let shop = data.shop;$('#shop-name').val(shop.shopName);$('#shop-addr').val(shop.shopAddr);$('#shop-phone').val(shop.phone);$('#shop-desc').val(shop.shopDesc);let shopCategory = '<option data-id="'+shop.shopCategory.shopCategoryId+'"selected>'+shop.shopCategory.shopCategoryName + '</option>';let tempAreaHtml ='';data.areaList.map(function (item,index){tempAreaHtml += '<option data-id="'+item.areaId+'">'+item.areaName+'</option>';});$('#shop-category').html(shopCategory);$('#shop-category').attr('disabled','disabled');$('#area').html(tempAreaHtml);$('#area option[data-id="'+shop.area.areaId+'"]').attr('selected','selected');}});}function getShopInitInfo(){$.getJSON(initUrl,function (data){//当返回的json中success属性为true时执行下一步if (data.success){let tempHtml = '';let tempAreaHtml = '';//从JSON中获取数据商铺类型信息data.shopCategoryList.map(function (item,index){tempHtml += '<option data-id="'+item.shopCategoryId+'">'+item.shopCategoryName+'</option>';});//从JSON中获取区域信息data.areaList.map(function (item,index){tempAreaHtml += '<option data-id="' +item.areaId+'">'+item.areaName+'</option>';});//在指定id后插入数据$('#shop-category').html(tempHtml);$('#area').html(tempAreaHtml);}});}//当点击提交后触发监听事件$('#submit').click(function (){//将前端数据封装let shop = {};if (isEdit){shop.shopId=shopId;}shop.shopName = $('#shop-name').val();shop.shopAddr = $('#shop-addr').val();shop.phone = $('#shop-phone').val();shop.shopDesc = $('#shop-desc').val();shop.shopCategory={shopCategoryId:$('#shop-category').find('option').not(function (){return !this.selected;}).data('id')};shop.area={areaId:$('#area').find('option').not(function (){return !this.selected;}).data('id')};let shopImg = $('#shop-img')[0].files[0];let fromData = new FormData();fromData.append('shopImg',shopImg);fromData.append('shopStr',JSON.stringify(shop));//验证码let verifyCodeActual = $('#j_captcha').val();if (!verifyCodeActual){$.toast('请输入验证码');return;}fromData.append('verifyCodeActual',verifyCodeActual);//使用ajax来向后端传递数据$.ajax({url:(isEdit?editShopUrl:registerShopUrl),type:'POST',data:fromData,contentType:false,processData: false,cache:false,success:function (data){if (data.success){$.toast('提交成功!');}else {$.toast('提交失败!'+data.errMsg);}}})});
})

小结:在js代码中我们可以通过url携带的参数的不同来动态的实现页面的复用,在mybatis中我们可以通过设置resultMap标签来实现多表查询数据的注入。在sql语句中如果出现了相同的列名,那么就必须取别名否则无法显示第二次出现的列的数据。

电商项目(Day06)相关推荐

  1. JavaEE大型分布式电商项目 上海淘淘商城 29期

    上海29期_张志君老师_淘淘商城_大型分布式电商项目 JavaEE大型分布式电商项目 淘淘商城 29期 需要的加qq:350226234,备注:程序员学习视频 ==================== ...

  2. mysql 电商项目(一)

    mysql 电商项目 - MySQL数据库开发规范 1.数据库基本设计规范 2.索引设计规范    3.数据库字段设计规范 4.数据库SQL开发规范 5.数据库操作行为规范 转载于:https://w ...

  3. Java项目:网上电商项目(前后端分离+java+vue+Springboot+ssm+mysql+maven+redis)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 本系统功能包括: 一款基于Springboot+Vue的电商项目,前后端分离项目,前台后台都有,前台商品展示购买,购物车分类, ...

  4. 推荐几个9月爆火的 GitHub 电商项目 赶紧收藏

    原文链接:https://mp.weixin.qq.com/s/pBZR6n8gxl19LAIBsH6XPg 逛逛GitHub. 每天推荐一个好玩的 GitHub 开源项目. 01. 新蜂电商 第一个 ...

  5. python电商项目源码_Python Django(WEB电商项目构建)

    (坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...

  6. 从头开始 启动开源电商项目jShop

    从头开始 启动开源电商项目jShop 1. 引言 干了三年C#, 有了转Java 的念想,所以尝试学习一下java web,java语法本身和C#没有太多的差别,所以打算看看开源的java项目,开源的 ...

  7. 大型电商项目3.0实战+支付宝、微信支付项目实战

    须知:视频来源网络,侵权请联系删除! 大型电商项目3.0实战 获取方式 扫描下面二维码回复:A110 支付宝.微信支付项目实战 获取方式 扫描下面二维码回复:A106

  8. 大数据 互联网架构阶段 电商项目简介

    电商项目简介 零.目录 电商项目特点 电商项目技术难点 电商项目简介 开发工具 电商项目架构 开发环境 一.电商项目特点 分布式 数十台服务器,甚至百台.千台.万台,包括:Nigix负载均衡集群.To ...

  9. 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目

    简介: 技术架构 项目是采用目前比较流行的 SpringBoot/SpringCloudAlibaba构建新零售微服务电商项目,从项目中台架构技术选型.模块设计.基础设施的构建.分布式解决方 案.互联 ...

  10. [Vue.js]实战 -- 电商项目(一)

    项目目录 项目概述 项目初始化 登录/退出功能 主页布局 用户管理模块 权限管理模块 分类管理模块 参数管理模块 商品管理模块 订单管理模块 数据统计模块 项目概述 电商项目基本业务概述 电商后台管理 ...

最新文章

  1. 机器学习中的precision, recall, accuracy, F值,ROC曲线
  2. Google CEO Sundar Pichai :“谷歌最大的威胁就是自身的成功”
  3. LayoutInflater.Factory 妙用
  4. 【Groovy】集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )
  5. 物体检测轻松上手:精度与速度实现兼得
  6. SAP Fiori Elements - how is sap-label annotation inserted to odata request
  7. 巨量引擎2021食品饮料行业白皮书
  8. 将字符串转为16进制数_C语言中的进制互转与数值和字符串互转的混搭玩法
  9. Java中方法和数组
  10. MySQL 忘记Root密码
  11. mysql 每日新增表分区
  12. 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法
  13. Day2 python基础
  14. 突破灰色按钮原理讲解
  15. 杭电acm题库 1001 统计气球问题
  16. 群晖系统如何布置php_群晖系统上如何切换PHP版本
  17. C语言小案例_微信小程序开发(教学大纲) | 附视频
  18. 包容普通的父亲和母亲
  19. R语言--模型的定阶、估计和显著性检验
  20. 机器学习科研助手总结

热门文章

  1. C++之标准错误流(cerr)和标准日志流(clog)
  2. 玩NBA2K14多出一个盘符,里头和游戏所在盘符内容相同
  3. 二十六个英文字母金子塔
  4. 如何修改微信小程序里面的导航栏内容
  5. 宝付解读第三方支付平台将要发生的变化
  6. 关于Busybox对interfaces文件的解析过程
  7. 设计模式-观察者模式练习
  8. 东财计算机综合复试题目,关于东财复试的一些经验
  9. javaweb的在线鲜花商城源码(购电商系统)
  10. NETGEAR网件RAX50/AX5400修改WiFi地区(解锁中国区)