> 文档中心 > 杨校老师项目之基于SSM企业物流快递配送管理系统

杨校老师项目之基于SSM企业物流快递配送管理系统


1. 获取代码:

添加博主微信获取,备注来源:
mryang511688

2. 项目描述

基于SSM框架开发的企业物流(快递)配送管理平台。

3.功能简介

在这里插入图片描述

4. 技术栈:

Jsp + SSM + MySQL + LayUI + Bootstrap

5. 运行环境

IntelliJ IDEA/Eclipse + MySQL5.7+ JDK1.8 + Maven3.5.4 + Tomcat9.0

6.前台界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7. 后台界面

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8. 代码展示

package cn.javabs.logistics.entity.common;import java.math.BigDecimal;import org.springframework.stereotype.Component;import cn.javabs.logistics.entity.admin.Enterprise;import cn.javabs.logistics.entity.admin.GoodsType;/** * 货物实体类 *  * @author Mryang * */@Componentpublic class Goods {public static final int NAME_MAX_LENGTH = 18;// 名称最大长度public static final int AMOUNT_MAX_VALUE = 1000000;// 可出售数量最大值public static final int ADDRESS_MAX_LENGTH = 50;// 地址最大长度public static final int SYNOPSIS_MAX_LENGTH = 50;// 简介最大长度public static final int NOT_SELLING = 0;// 暂停售卖public static final int IS_SELLING = 1;// 正在售卖private Long id;// idprivate String name;// 名称private String number;// 编号private Long goodsTypeId;// 货物类型idprivate int amount;// 可出售数量private int waitingQuantity = 0;// 待发货数量private BigDecimal price;// 售价private Long enterpriseId;// 企业idprivate int status;// 状态private String photo;// 图片private String address;// 发货地址private String synopsis;// 简介private GoodsType goodsType;// 分类private Enterprise enterprise;// 企业private String details;// 详情public String getDetails() {return details;}public void setDetails(String details) {this.details = details;}public Enterprise getEnterprise() {return enterprise;}public void setEnterprise(Enterprise enterprise) {this.enterprise = enterprise;}public GoodsType getGoodsType() {return goodsType;}public void setGoodsType(GoodsType goodsType) {this.goodsType = goodsType;}public String getSynopsis() {return synopsis;}public void setSynopsis(String synopsis) {this.synopsis = synopsis;}public String getPhoto() {return photo;}public void setPhoto(String photo) {this.photo = photo;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public Long getGoodsTypeId() {return goodsTypeId;}public void setGoodsTypeId(Long goodsTypeId) {this.goodsTypeId = goodsTypeId;}public int getAmount() {return amount;}public void setAmount(int amount) {this.amount = amount;}public int getWaitingQuantity() {return waitingQuantity;}public void setWaitingQuantity(int waitingQuantity) {this.waitingQuantity = waitingQuantity;}public BigDecimal getPrice() {return price;}public void setPrice(BigDecimal price) {this.price = price;}public Long getEnterpriseId() {return enterpriseId;}public void setEnterpriseId(Long enterpriseId) {this.enterpriseId = enterpriseId;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "Goods [id=" + id + ", name=" + name + ", number=" + number + ", goodsTypeId=" + goodsTypeId+ ", amount=" + amount + ", waitingQuantity=" + waitingQuantity + ", price=" + price + ", enterpriseId="+ enterpriseId + ", status=" + status + ", photo=" + photo + ", address=" + address + ", synopsis="+ synopsis + ", goodsType=" + goodsType + ", enterprise=" + enterprise + "]";}}
  • 8.2 货物的controller控制器
package cn.javabs.logistics.controller.admin;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringUtils;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.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.multipart.MultipartFile;import org.springframework.web.servlet.ModelAndView;import cn.javabs.logistics.bean.LoginTypeEnum;import cn.javabs.logistics.bean.PrefixEnum;import cn.javabs.logistics.entity.admin.Enterprise;import cn.javabs.logistics.entity.common.Goods;import cn.javabs.logistics.page.admin.Page;import cn.javabs.logistics.service.admin.EnterpriseService;import cn.javabs.logistics.service.admin.GoodsTypeService;import cn.javabs.logistics.service.common.GoodsService;import cn.javabs.logistics.util.StringUtil;import net.sf.json.JSONObject;@Controller@RequestMapping("/admin/goods")public class GoodsController {@Autowiredprivate GoodsService goodsService;@Autowiredprivate GoodsTypeService goodsTypeService;@Autowiredprivate EnterpriseService enterpriseService;/** * 列表页面 * * @param model * @return */@RequestMapping(value = "/list", method = RequestMethod.GET)public ModelAndView list(ModelAndView model, HttpServletRequest request) {Map<String, Object> queryMap = new HashMap<String, Object>();model.addObject("goodsTypeList", goodsTypeService.findList(queryMap));Object loginType = request.getSession().getAttribute("loginType");if ((Integer) loginType == LoginTypeEnum.ENTERPRISE.getCode()) {Enterprise loginEnterprise = (Enterprise) request.getSession().getAttribute("admin");Enterprise enterprise = enterpriseService.findById(loginEnterprise.getId());model.addObject("address", enterprise.getAddress());} else {model.addObject("address", "");}model.setViewName("goods/list");return model;}/** * 获取列表 * * @param page * @param name * @return */@RequestMapping(value = "/list", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> getList(Page page, HttpServletRequest request,@RequestParam(name = "name", required = false, defaultValue = "") String name,@RequestParam(name = "number", required = false, defaultValue = "") String number,@RequestParam(name = "goodsTypeId", required = false) Long goodsTypeId) {Map<String, Object> ret = new HashMap<>();Map<String, Object> queryMap = new HashMap<String, Object>();Object loginType = request.getSession().getAttribute("loginType");if ((Integer) loginType == LoginTypeEnum.ENTERPRISE.getCode()) {Enterprise enterprise = (Enterprise) request.getSession().getAttribute("admin");queryMap.put("enterpriseId", enterprise.getId());}queryMap.put("name", name);queryMap.put("number", number);queryMap.put("goodsTypeId", goodsTypeId);queryMap.put("offset", page.getOffset());queryMap.put("pageSize", page.getRows());ret.put("rows", goodsService.findList(queryMap));ret.put("total", goodsService.getTotal(queryMap));return ret;}/** * 添加货物 *  * @param goods * @param request * @return */@RequestMapping(value = "/add", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> add(Goods goods, HttpServletRequest request) {Map<String, String> ret = new HashMap<String, String>();Object loginType = request.getSession().getAttribute("loginType");if ((Integer) loginType != LoginTypeEnum.ENTERPRISE.getCode()) {ret.put("type", "error");ret.put("msg", "请登录企业用户!");return ret;}if (judge(goods, ret)) {return ret;}if (goods.getAmount() < 1 || goods.getAmount() > Goods.AMOUNT_MAX_VALUE) {ret.put("type", "error");ret.put("msg", "数量需在1~" + Goods.AMOUNT_MAX_VALUE + "之间!");return ret;}Enterprise enterprise = (Enterprise) request.getSession().getAttribute("admin");goods.setEnterpriseId(enterprise.getId());String number = StringUtil.generateSn(PrefixEnum.GOODS.getValue());goods.setNumber(number);if (goodsService.add(goods) <= 0) {ret.put("type", "error");ret.put("msg", "添加失败!");return ret;}ret.put("type", "success");ret.put("msg", "添加成功!");return ret;}/** * 编辑 *  * @param goods * @return */@RequestMapping(value = "/edit", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> edit(Goods goods, HttpServletRequest request) {Map<String, String> ret = new HashMap<String, String>();Object loginType = request.getSession().getAttribute("loginType");if ((Integer) loginType != LoginTypeEnum.ENTERPRISE.getCode()) {ret.put("type", "error");ret.put("msg", "请登录企业用户!");return ret;}if (judge(goods, ret)) {return ret;}if (goodsService.edit(goods) <= 0) {ret.put("type", "error");ret.put("msg", "编辑失败!");return ret;}ret.put("type", "success");ret.put("msg", "编辑成功!");return ret;}/** * 批量删除 *  * @param ids * @return */@RequestMapping(value = "/delete", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> delete(String ids) {Map<String, String> ret = new HashMap<String, String>();if (StringUtils.isEmpty(ids)) {ret.put("type", "error");ret.put("msg", "选择要删除的数据!");return ret;}if (ids.contains(",")) {ids = ids.substring(0, ids.length() - 1);}try {if (goodsService.delete(ids) <= 0) {ret.put("type", "error");ret.put("msg", "删除失败!");return ret;}} catch (Exception e) {ret.put("type", "error");ret.put("msg", "所选择数据中有数据存在关联数据,无法删除!");return ret;}ret.put("type", "success");ret.put("msg", "删除成功!");return ret;}// 判断private boolean judge(Goods goods, Map<String, String> ret) {if (goods == null) {ret.put("type", "error");ret.put("msg", "请填写正确的信息!");return true;}if (goods.getGoodsTypeId() == null) {ret.put("type", "error");ret.put("msg", "请选择分类!");return true;}if (StringUtils.isEmpty(goods.getPhoto())) {ret.put("type", "error");ret.put("msg", "请上传货物图片!");return true;}if (StringUtils.isEmpty(goods.getName())) {ret.put("type", "error");ret.put("msg", "请填写名称!");return true;}if (goods.getName().length() > Goods.NAME_MAX_LENGTH) {ret.put("type", "error");ret.put("msg", "名称最多为" + Goods.NAME_MAX_LENGTH + "位!");return true;}if (StringUtils.isEmpty(goods.getAddress())) {ret.put("type", "error");ret.put("msg", "请填写发货地址!");return true;}if (goods.getAddress().length() > Goods.ADDRESS_MAX_LENGTH) {ret.put("type", "error");ret.put("msg", "地址最多为" + Goods.ADDRESS_MAX_LENGTH + "位!");return true;}return false;}@RequestMapping(value = "/addAmount", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> addAmount(Goods goods) {Map<String, String> ret = new HashMap<String, String>();if (goods == null) {ret.put("type", "error");ret.put("msg", "请填写正确的信息!");return ret;}if (goods.getAmount() < 1 || goods.getAmount() > Goods.AMOUNT_MAX_VALUE) {ret.put("type", "error");ret.put("msg", "数量需在1~" + Goods.AMOUNT_MAX_VALUE + "之间!");return ret;}Goods byId = goodsService.findById(goods.getId());byId.setAmount(byId.getAmount() + goods.getAmount());if (goodsService.addAmount(byId) <= 0) {ret.put("type", "error");ret.put("msg", "数量添加失败,请联系管理员!");return ret;}ret.put("type", "success");ret.put("msg", "添加成功!");return ret;}@RequestMapping(value = "/editDetails", method = RequestMethod.POST)@ResponseBodypublic Map<String, String> editDetails(Goods goods) {Map<String, String> ret = new HashMap<String, String>();if (goods == null) {ret.put("type", "error");ret.put("msg", "请填写正确的信息!");return ret;}if (goodsService.editDetails(goods) <= 0) {ret.put("type", "error");ret.put("msg", "详情操作失败!");return ret;}ret.put("type", "success");ret.put("msg", "操作成功!");return ret;}/** * 富文本kindedit的图片上传 *  * @param request * @param response * @param imgFile * @throws IOException */@ResponseBody@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)public void uploadFile(HttpServletRequest request, HttpServletResponse response,@RequestParam("imgFile") MultipartFile imgFile) throws IOException {response.setContentType("application/json; charset=UTF-8");JSONObject obj = new JSONObject();/* Map obj = new HashMap(); */obj.put("error", 0);String massage = null;PrintWriter out = response.getWriter();// 判断文件类型是否是图片String originalFilename = imgFile.getOriginalFilename();// 获取文件后缀String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());if (!"jpg,jpeg,gif,png".toUpperCase().contains(suffix.toUpperCase())) {massage = "图片格式不正确,请选择jpg,jpeg,gif,png格式的图片!";out.write("图片格式不正确,请选择jpg,jpeg,gif,png格式的图片!");obj.put("error", 1);}if (imgFile.getSize() / 1024 > 1024 * 1024 * 1024) {massage = "图片大小不能超过10M!";out.write("图片大小不能超过10M");obj.put("error", 1);}String savePath = request.getServletContext().getRealPath("/") + "/resources/upload/";// 准备保存文件File filePath = new File(savePath);if (!filePath.exists()) {// 若不存在文件夹,则创建一个文件夹filePath.mkdir();}String filename = new Date().getTime() + "." + suffix;try {imgFile.transferTo(new File(savePath + filename));} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}int error = (Integer) obj.get("error");if (error == 0) {obj.put("url", request.getServletContext().getContextPath() + "/resources/upload/" + filename);} else {obj.put("message", massage);}out.println(obj.toString());}}
  • 8.3 货物的业务逻辑接口
package cn.javabs.logistics.service.common;import java.util.List;import java.util.Map;import org.springframework.stereotype.Service;import cn.javabs.logistics.entity.common.Goods;import cn.javabs.logistics.entity.common.Orders;import cn.javabs.logistics.entity.common.Person;/** * 货物Service */@Servicepublic interface GoodsService {public Goods findById(Long id);// 根据id查找public int add(Goods goods);// 添加public int edit(Goods goods);// 编辑public int delete(String ids);// 删除public List<Goods> findList(Map<String, Object> queryMap);public int getTotal(Map<String, Object> queryMap);public int addAmount(Goods goods);// 添加货物数量public List<Goods> findSendingList(Map<String, Object> queryMap);// 查询出售中的列表public int findSendingTotal(Map<String, Object> queryMap);// 查询数量public int editDetails(Goods goods);// 编辑详情public int buyGoods(Goods goods, Person person, Orders orders);}
  • 8.4 货物的业务逻辑接口的实现类
package cn.javabs.logistics.service.common.impl;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import cn.javabs.logistics.dao.admin.EnterpriseDao;import cn.javabs.logistics.dao.common.GoodsDao;import cn.javabs.logistics.dao.common.OrdersDao;import cn.javabs.logistics.dao.common.PersonDao;import cn.javabs.logistics.entity.admin.Enterprise;import cn.javabs.logistics.entity.common.Goods;import cn.javabs.logistics.entity.common.Orders;import cn.javabs.logistics.entity.common.Person;import cn.javabs.logistics.service.common.GoodsService;/** * 货物Service */@Servicepublic class GoodsServiceImpl implements GoodsService {@Autowiredprivate GoodsDao goodsDao;@Autowiredprivate PersonDao personDao;@Autowiredprivate EnterpriseDao enterpriseDao;@Autowiredprivate OrdersDao ordersDao;@Overridepublic Goods findById(Long id) {return goodsDao.findById(id);}@Overridepublic int add(Goods goods) {return goodsDao.add(goods);}@Overridepublic int edit(Goods goods) {return goodsDao.edit(goods);}@Overridepublic int delete(String ids) {return goodsDao.delete(ids);}@Overridepublic List<Goods> findList(Map<String, Object> queryMap) {return goodsDao.findList(queryMap);}@Overridepublic int getTotal(Map<String, Object> queryMap) {return goodsDao.getTotal(queryMap);}@Overridepublic int addAmount(Goods goods) {return goodsDao.addAmount(goods);}@Overridepublic List<Goods> findSendingList(Map<String, Object> queryMap) {// TODO Auto-generated method stubreturn goodsDao.findSendingList(queryMap);}@Overridepublic int findSendingTotal(Map<String, Object> queryMap) {return goodsDao.findSendingTotal(queryMap);}@Overridepublic int editDetails(Goods goods) {// TODO Auto-generated method stubreturn goodsDao.editDetails(goods);}/** * 购买商品 *  * @param goods * @param person * @param order * @return */@Override@Transactionalpublic int buyGoods(Goods goods, Person person, Orders orders) {// 前台用户修改余额person.setBalance(person.getBalance().subtract(orders.getPrice()));personDao.editBalance(person);// 货物对应的企业修改余额Enterprise enterprise = enterpriseDao.findById(goods.getEnterpriseId());enterprise.setBalance(enterprise.getBalance().add(orders.getPrice()));enterpriseDao.editBalance(enterprise);ordersDao.add(orders);goods.setAmount(goods.getAmount() - orders.getQuantity());goods.setWaitingQuantity(goods.getWaitingQuantity() + orders.getQuantity());return goodsDao.editAmountAndWaitingQuantity(goods);}}
  • 8.5 货物的数据持久层的接口
package cn.javabs.logistics.dao.common;import java.util.List;import java.util.Map;import org.springframework.stereotype.Repository;import cn.javabs.logistics.entity.common.Goods;@Repositorypublic interface GoodsDao {public Goods findById(Long id);// 根据id查找public int add(Goods goods);// 添加public int edit(Goods goods);// 编辑public int delete(String ids);// 删除public List<Goods> findList(Map<String, Object> queryMap);public int getTotal(Map<String, Object> queryMap);public int addAmount(Goods goods);// 添加货物数量public List<Goods> findSendingList(Map<String, Object> queryMap);// 查询出售中货物public int findSendingTotal(Map<String, Object> queryMap);// 查询数量public int editDetails(Goods goods);// 编辑详情public int editAmountAndWaitingQuantity(Goods goods);// 购买后对数量进行修改public int editWaitingQuantity(Goods goods);// 修改待发货数量}
  • 8.6 货物的数据持久层的接口的映射文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="cn.javabs.logistics.dao.common.GoodsDao">        <select id="findById" parameterType="Long" resultType="Goods">select * from goods where id = #{id}</select>        <insert id="add" parameterType="Goods">insert into goods(id,name,number,goodsTypeId,amount,waitingQuantity,price,enterpriseId,status,photo,address,synopsis)values(null,#{name},#{number},#{goodsTypeId},#{amount},#{waitingQuantity},#{price},#{enterpriseId},#{status},#{photo},#{address},#{synopsis})</insert>        <update id="addAmount" parameterType="Goods">update goods set amount = #{amount} where id = #{id}</update>    <update id="editWaitingQuantity" parameterType="Goods">update goods set waitingQuantity=#{waitingQuantity} where id = #{id}</update>        <update id="edit" parameterType="Goods">update goods set name = #{name},goodsTypeId=#{goodsTypeId},price = #{price},status= #{status},photo=#{photo},address=#{address},synopsis=#{synopsis} where id = #{id}</update>        <update id="editAmountAndWaitingQuantity" parameterType="Goods">update goods set amount=#{amount},waitingQuantity=#{waitingQuantity} where id = #{id}</update>    <update id="editDetails" parameterType="Goods">update goods set details=#{details} where id = #{id}</update>        <delete id="delete" parameterType="String">delete from goods where id in(${value})</delete>        <select id="findList" parameterType="Map" resultType="Goods"> select * from goods where 1 = 1 <if test="name != null">     and name like '%${name}%' </if> <if test="goodsTypeId != null">     and goodsTypeId = #{goodsTypeId} </if> <if test="number != null">     and number like '%${number}%' </if> <if test="enterpriseId != null">     and enterpriseId = #{enterpriseId} </if> <if test="offset != null and pageSize != null">     limit #{offset},#{pageSize} </if>    </select>        <select id="getTotal" parameterType="Map" resultType="Integer"> select count(*) from goods where 1 = 1 <if test="name != null">     and name like '%${name}%' </if> <if test="enterpriseId != null">     and enterpriseId = ${enterpriseId} </if>    </select>    <select id="findSendingTotal" parameterType="Map" resultType="Integer"> select count(*) from goods where 1 = 1 <if test="status != null">     and status = #{status}  </if> <if test="name != null">     and name like '%${name}%' </if> <if test="goodsTypeId != null">     and goodsTypeId = #{goodsTypeId} </if>    </select>    <select id="findSendingList" parameterType="Map" resultMap="ResultMap"> select g.*,t.name tName,e.username eUsername from (goods g left join goods_type t on g.goodsTypeId = t.id)  LEFT JOIN enterprise e on g.enterpriseId = e.id where 1 = 1 <if test="status != null">     and g.status = #{status} </if> <if test="name != null">     and g.name like '%${name}%' </if> <if test="goodsTypeId != null">     and g.goodsTypeId = #{goodsTypeId} </if> order by g.id desc <if test="offset != null and pageSize != null">     limit #{offset},#{pageSize} </if>    </select> <resultMap type="Goods" id="ResultMap">    <id property="id" column="id"/><result column="name" property="name"/><result column="number" property="number"/><result column="goodsTypeId" property="goodsTypeId"/><result column="amount" property="amount"/><result column="price" property="price"/><result column="enterpriseId" property="enterpriseId"/><result column="photo" property="photo"/><result column="address" property="address"/><result column="synopsis" property="synopsis"/><association property="goodsType" column="goodsType"javaType="GoodsType" resultMap="goodsTypeResult"/><association property="enterprise" column="enterprise"javaType="Enterprise" resultMap="enterpriseResult"/>    </resultMap> <resultMap type="GoodsType" id="goodsTypeResult"><result column="tName" property="name"/></resultMap><resultMap type="Enterprise" id="enterpriseResult"><result column="eUsername" property="username"/><result column="address" property="address"/></resultMap></mapper>

作者: 杨校

出处: https://mryang.blog.csdn.net

有意源码研究Wx-Me:mryang511688

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询