猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,变身猿人找到工作不是问题。还等什么呢?关注公号,取基础代码,一起实战吧。
上几个章节,猿人君教会了你如何去实现前台类目的后台管理功能,今天我们一起来学习,如何实现承运商管理。
功能概览
承运商管理的功能虽然相对简单,主要用于维护供应商的一些基础信息,为之后要实现的运费模板提供数据支撑,是运费计算的基础信息。承运商管理功能,主要提供承运商信息列表以及新增/修改/启用/停用承运商功能。
数据库设计
基于之前的设计文章,我们可以快速的整理承运商的基本信息,并落地为数据库表,如上图所示。
后端功能实现
承运商管理的功能相对传统,提供新增/修改/删除/停用/启用/分页列表的功能。
值得注意的是,删除功能,我们是通过状态位来做的逻辑删除。之前有新手朋友似乎不明白什么是逻辑删除的含义,这里猿人君就稍微提这么一句了。所谓物理删除通常指的是通过delete语句删除表里的数据(其实并没有真正的物理掉,先不深究了),而逻辑删除又叫业务删除,通过给与数据一个“删除”状态,在之后的访问中,不访问删除状态的数据就可以了。
/** * Copyright(c) 2004-2020 pangzi * com.pz.basic.mall.controller.freight.MallLogisticsController.java */package com.pz.basic.mall.controller.freight; import com.pz.basic.mall.domain.base.Result;import com.pz.basic.mall.domain.base.enums.DataStatusEnum;import com.pz.basic.mall.domain.freight.MallLogistics;import com.pz.basic.mall.domain.freight.query.QueryMallLogistics;import com.pz.basic.mall.service.freight.MallLogisticsService;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * * @author pangzi * @date 2020-06-22 20:47:27 * * */@RestController@RequestMapping("/logistics")public class MallLogisticsController { private MallLogisticsService mallLogisticsService; public void setMallLogisticsService(MallLogisticsService mallLogisticsService) { this.mallLogisticsService = mallLogisticsService; } /** * 新增物流供应商 * @param mallLogistics * @return */ @RequestMapping("/addMallLogistics") public Result addMallLogistics(@RequestBody MallLogistics mallLogistics){ try{ return mallLogisticsService.addMallLogistics(mallLogistics); }catch(Exception e){ e.printStackTrace(); return new Result(false); } } /** * 修改物流供应商 * @param mallLogistics * @return */ @RequestMapping("/updateMallLogistics") public Result updateMallLogistics(@RequestBody MallLogistics mallLogistics){ try{ return mallLogisticsService.updateMallLogisticsById(mallLogistics); }catch(Exception e){ e.printStackTrace(); return new Result(false); } } /** * 启用物流供应商 * @param mallLogistics * @return */ @RequestMapping("/enableMallLogistics") public Result enableMallLogistics(@RequestBody MallLogistics mallLogistics){ try{ MallLogistics modifiedData =new MallLogistics (); modifiedData.setId(mallLogistics.getId()); modifiedData.setStatus(DataStatusEnum.STATUS_ENABLE.getStatusValue()); return mallLogisticsService.updateMallLogisticsById(modifiedData); }catch(Exception e){ e.printStackTrace(); return new Result(false); } } /** * 停用物流供应商 * @param mallLogistics * @return */ @RequestMapping("/disableMallLogistics") public Result disableMallLogistics(@RequestBody MallLogistics mallLogistics){ try{ MallLogistics modifiedData =new MallLogistics (); modifiedData.setId(mallLogistics.getId()); modifiedData.setStatus(DataStatusEnum.STATUS_DISABLE.getStatusValue()); return mallLogisticsService.updateMallLogisticsById(modifiedData); }catch(Exception e){ e.printStackTrace(); return new Result(false); } } /** * 删除物流供应商 * @param mallLogistics * @return */ @RequestMapping("/deleteMallLogistics") public Result deleteMallLogistics(@RequestBody MallLogistics mallLogistics){ try{ MallLogistics modifiedData =new MallLogistics (); modifiedData.setId(mallLogistics.getId()); modifiedData.setStatus(DataStatusEnum.STATUS_DELETED.getStatusValue()); return mallLogisticsService.updateMallLogisticsById(modifiedData); }catch(Exception e){ e.printStackTrace(); return new Result(false); } } /** * 分页返回物流供应商列表 * @param queryMallLogistics * @return */ @RequestMapping("/findByPage") public Result> findByPage(@RequestBody QueryMallLogistics queryMallLogistics){ return mallLogisticsService.getMallLogisticssByPage(queryMallLogistics); } }
考虑到很多朋友编写mapper文件比较困难,这个章节的mapper就先给到你吧,不过做人不要太懒了,domain 和dao 以及service的实现,还是自己动手搞一下吧。
<?xml version="1.0" encoding="UTF-8" ?>id,logistics_code,logistics_name,logistics_icon,logistics_url,logistics_remark,freight_limit,custom_fee_limit,custom_time_limit,show_limit,status,create_user,modify_user,created,modifiedstatus>-1and id = #{id}and logistics_code = #{logisticsCode}and logistics_name = #{logisticsName}and logistics_icon = #{logisticsIcon}and logistics_url = #{logisticsUrl}and logistics_remark = #{logisticsRemark}and freight_limit = #{freightLimit}and custom_fee_limit = #{customFeeLimit}and custom_time_limit = #{customTimeLimit}and show_limit = #{showLimit}and status = #{status}and create_user = #{createUser}and modify_user = #{modifyUser}and created = #{created}and modified = #{modified}and logistics_name like concat(#{logisticsNameLike},'%')and logistics_code like concat(#{logisticsCodeLike},'%')selectfrom mall_logisticsselectfrom mall_logisticsLIMIT #{startRow},#{pageSize}selectfrom mall_logisticswhere id = #{id}delete from mall_logisticswhere id = #{id}delete from mall_logisticsINSERT INTOmall_logistics(id,logistics_code,logistics_name,logistics_icon,logistics_url,logistics_remark,freight_limit,custom_fee_limit,custom_time_limit,show_limit,status,create_user,modify_user,created,modified)VALUES(#{id},#{logisticsCode},#{logisticsName},#{logisticsIcon},#{logisticsUrl},#{logisticsRemark},#{freightLimit},#{customFeeLimit},#{customTimeLimit},#{showLimit},#{status},#{createUser},#{modifyUser},#{created},#{modified})SELECT @@IDENTITY AS IDinsert into mall_logisticsid,logistics_code,logistics_name,logistics_icon,logistics_url,logistics_remark,freight_limit,custom_fee_limit,custom_time_limit,show_limit,status,create_user,modify_user,created,modified,#{id},#{logisticsCode},#{logisticsName},#{logisticsIcon},#{logisticsUrl},#{logisticsRemark},#{freightLimit},#{customFeeLimit},#{customTimeLimit},#{showLimit},#{status},#{createUser},#{modifyUser},now(),now(),SELECT @@IDENTITY AS IDselect count(*) from mall_logisticsupdate mall_logisticslogistics_code = #{logisticsCode},logistics_name = #{logisticsName},logistics_icon = #{logisticsIcon},logistics_url = #{logisticsUrl},logistics_remark = #{logisticsRemark},freight_limit = #{freightLimit},custom_fee_limit = #{customFeeLimit},custom_time_limit = #{customTimeLimit},show_limit = #{showLimit},status = #{status},create_user = #{createUser},modify_user = #{modifyUser},created = #{created},modified=now(),where id = #{id}
前端功能实现
功能的实现,主要还是基于element-ui来实现的。这里提几个关键的点,最后也会把源代码给到你的。
列表展示:
主要是通过el-table组件实现的,属性data用于绑定需要展现的数据。需要你定义和操作。
新增/编辑弹框
弹框展示的标题和展示,通过页面定义的数据来控制。
表单中的下拉选项,通过el-select组件来实现。
注意使用的v-for指令,以及你需要在页面上定义你的选项数据。
关键点已经都告诉你了,最后,将页面的源码送你吧,不过还是希望你仅仅作为参考,自己动手去实现一次。