文章目录

  • 概述
  • 结构
  • Service层接口及其实现类
  • 单元测试
  • Github地址

概述

既然是商铺编辑,肯定要根据入参shopId获取shop信息,然后用户在客户端修改店铺信息后,提交到后台更新商铺信息。

所以同样的对于Service层来讲 有2个方法 (DAO层也有对应的两个方法,只不过updateShop我们复用了)

  • Shop getShopById(long shopId);

  • ShopExecution modifyShop(Shop shop, InputStream shopFileInputStream, String fileName) throws ShopOperationException;


结构


Service层接口及其实现类

com.artisan.o2o.service.ShopService 接口新增两个接口方法如下

/*** * * @Title: getShopById* * @Description: 根据shopId查询商铺* * @param shopId* @return* * @return: Shop*/Shop getShopById(long shopId);/*** * * @Title: modifyShop* * @Description: 编辑商铺信息* * @param shop* @param shopFileInputStream* @param fileName* @return* * @return: ShopExecution*/ShopExecution modifyShop(Shop shop, InputStream shopFileInputStream, String fileName) throws ShopOperationException;

com.artisan.o2o.service.impl.ShopServiceImpl.java实现类

@Overridepublic Shop getShopById(long shopId) {return shopDao.selectShopById(shopId);}@Override@Transactionalpublic ShopExecution modifyShop(Shop shop, InputStream shopFileInputStream, String fileName) throws ShopOperationException {if (shop == null || shop.getShopId() == null) {return new ShopExecution(ShopStateEnum.NULL_SHOP_INFO);}else{try {// 1. 判断是否需要处理图片if (shopFileInputStream != null && fileName != null && !"".equals(fileName)) {// 1.1 删除掉旧的图片// 查询入参shop对应数据库表中的shopImg路径Shop tempShop = shopDao.selectShopById(shop.getShopId());if (tempShop != null) {// 删除就的缩略图ImageUtil.deleteStorePath(tempShop.getShopImg());}// 1.2 用新的图片生成缩略图addShopImg(shop, shopFileInputStream, fileName);}// 2. 更新店铺信息// 2.1 更新一些必要属性shop.setLastEditTime(new Date());// 2.2 更新店铺int effectedNum = shopDao.updateShop(shop);if (effectedNum <= 0) {throw new ShopOperationException(ShopStateEnum.INNER_ERROR.getStateInfo());}return new ShopExecution(ShopStateEnum.SUCCESS, shop);} catch (Exception e) {e.printStackTrace();throw new ShopOperationException("modify shop error:" + e.getMessage());}}}

因为用户有可能更新图片,其中为了删除旧的文件或者目录,com.artisan.o2o.util.ImageUtil.java 新增了工具类

/*** * * @Title: deleteStorePath* * @Description: 判断storePath是否为目录,为目录的话删掉目录下的所有文件,否则删掉文件* * @param storePath* * @return: void*/public static void deleteStorePath(String storePath) {File fileOrMenu = new File(FileUtil.getImgBasePath() + storePath);if (fileOrMenu != null) {if (fileOrMenu.isDirectory()) {File[] files = fileOrMenu.listFiles();for (int i = 0; i < files.length; i++) {files[i].delete();}}fileOrMenu.delete();}}

单元测试

@Testpublic void testModifyShop() {Shop shop = new Shop();Area area = new Area();ShopCategory shopCategory = new ShopCategory();shop.setShopId(28L);area.setAreaId(2);shopCategory.setShopCategoryId(2L);shop.setArea(area);shop.setShopCategory(shopCategory);shop.setShopName("Modify咖啡店");shop.setShopDesc("Modify小工匠的咖啡店");shop.setShopAddr("Modify-NanJing");shop.setPhone("123456");shop.setPriority(78);File shopFile = new File("D:/o2o/artisan.jpg");ShopExecution se = null;InputStream ins = null;try {ins = new FileInputStream(shopFile);se = shopService.modifyShop(shop, ins, shopFile.getName());} catch (FileNotFoundException e) {e.printStackTrace();}Assert.assertEquals(ShopStateEnum.SUCCESS.getState(), se.getState());}

运行符合预期。

控制台日志

Creating a new SqlSession
Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@3fed2870] will be managed by Spring
==>  Preparing: SELECT s.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_name FROM tb_shop s, tb_area a, tb_shop_category sc WHERE s.area_id = a.area_id AND s.shop_category_id = sc.shop_category_id AND s.shop_id = ?
==> Parameters: 28(Long)
<==    Columns: shop_id, shop_name, shop_desc, shop_addr, phone, shop_img, priority, create_time, last_edit_time, enable_status, advice, area_id, area_name, shop_category_id, shop_category_name
<==        Row: 28, Modify咖啡店, Modify小工匠的咖啡店, Modify-NanJing, 123456, \upload\item\shopImage\28\2018060301211217157.jpg, 78, 2018-05-28 23:13:37.0, 2018-06-03 01:21:14.0, 0, null, 1, 北京, 1, 咖啡奶茶
<==      Total: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6] from current transaction
==>  Preparing: update tb_shop SET shop_name=?, shop_desc=?, shop_addr=?, phone=?, shop_img=?, priority=?, last_edit_time=?, area_id=?, shop_category_id=? where shop_id = ?
==> Parameters: Modify咖啡店(String), Modify小工匠的咖啡店(String), Modify-NanJing(String), 123456(String), \upload\item\shopImage\28\2018060301223045572.jpg(String), 78(Integer), 2018-06-03 01:22:31.968(Timestamp), 2(Integer), 2(Long), 28(Long)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]
Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]
Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]
Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61544ae6]

库表字段正常

旧的图片被删除,新的图片OK


Github地址

代码地址: https://github.com/yangshangwei/o2o

实战SSM_O2O商铺_18【商铺编辑】Service层开发相关推荐

  1. SpringBoot实现Java高并发秒杀系统之Service层开发(二)

    继上一篇文章:SpringBoot实现Java高并发秒杀系统之DAO层开发 我们创建了SpringBoot项目并熟悉了秒杀系统的表设计,下面我们将讲解一下秒杀系统的核心部分:Service业务层的开发 ...

  2. Spring整合Mybatis之DAO层、Service层开发

    3. Spring整合Mybatis编程DAO层开发 1. 项目引入相关依赖spring mybatis mysql mybatis-spring druid2. 编写spring.xml整合:spr ...

  3. 校园O2O商铺平台-店铺注册Service层和Controller层

    店铺注册之Service层的实现 正在更新 店铺注册功能之Controller层的实现 正在更新 店铺注册功能之Controller层的改造 正在更新

  4. 淘淘商城第54讲——商品搜索之service层开发

    首先我们在taotao-search-interface工程的SearchService接口中声明一个根据搜索条件去查询搜索结果的方法,如下图所示. 然后我们在taotao-search-servic ...

  5. 实战SSM_O2O商铺_22【商铺列表】Service层开发

    文章目录 概述 ShopService接口新增接口方法 ShopServie接口实现类 分页工具类 单元测试 Github地址 概述 ShopService接口中仅需要定义一个接口方法,在该接口方法的 ...

  6. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  7. 实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现

    文章目录 概述 Service接口 Service接口实现类 单元测试 Github地址 概述 在完成了 Dao层的部分之后,顺其自然的我们来到了Service层,需要调用Dao层提供的操作数据库的方 ...

  8. 实战SSM_O2O商铺_34【商品】商品编辑之Controller层的实现

    文章目录 概述 ProductController 单元测试 Github地址 概述 在完成了 实战SSM_O2O商铺_33[商品]商品编辑之Service层的实现之后,我们继续来实现Controll ...

  9. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现

    文章目录 概述 Dao层接口 ProductDao#selectProductById ProductDao#updateProduct ProductImgDao#deleteProductImgB ...

最新文章

  1. ONAP — 边缘自动化方案
  2. java中等待所有线程都执行结束
  3. 深入理解yield from语法
  4. 在Linux上使用AFL对Stagefright进行模糊测试
  5. shell 变量定义使用
  6. 少年,看你异于常人,有空花2小时来参加有3000人的源码共读嘛~
  7. mongodb数据库常用指令
  8. cass绘制围墙lisp_CASS中用LISP完成高程值的可视化处理
  9. 华为实习日记——第三十七天
  10. 制作QQ背景音乐链接
  11. java获取kafka topic
  12. 通过比赛整理出的8条Numpy实用技巧【你知道如何频数统计和按某列进行排序么?】...
  13. python ipados_macOS Big Sur 正式发布并已开放下载,支持原生运行 iOS 和 iPadOS App
  14. [精品毕设]基于Python实现的飞机票销售系统订票系统
  15. 人教版数学课本插画暴露出的问题
  16. 用表格做出的阴影扇形图
  17. VMware中kali2022通过物理机代理上网(桥接模式)
  18. ARM开发板配置rzsz
  19. dropwizard常用属性注解
  20. mount不是很熟悉 转载文章了解下 转自http://forum.ubuntu.org.cn/viewtopic.php?f=120t=257333...

热门文章

  1. cas跨域单点登录原理_CAS实现SSO单点登录原理
  2. JETSON NANO 查看 CUDA 版本:NVCC -V 报错:BASH: NVCC: 未找到命令
  3. mongodb 初次查询慢 加载索引
  4. tensorflow 风格迁移二
  5. 希尔排序的基本原理及实现
  6. python爬虫基础(二)~工具包: 下载包requests、urllib和解析包BeautifulSoup(bs4)、lxml.etree.xpath
  7. 文巾解题 面试题 01.04. 回文排列
  8. 数字图像处理---有关特征提取的相关概念
  9. android获取连接wifi名称,android 获取当前连接WIFI名称的有关问题
  10. 新手入门深度学习 | 3-1:数据管道Dataset