PLF 5 лет назад
Родитель
Сommit
ae4210c716
22 измененных файлов с 1726 добавлено и 14 удалено
  1. 2 3
      src/main/java/com/caimei/modules/club/controller/CmOperationUserController.java
  2. 221 0
      src/main/java/com/caimei/modules/products/controller/CmMallOrganizeProductsController.java
  3. 180 0
      src/main/java/com/caimei/modules/products/controller/CmMallProductsClassifyController.java
  4. 31 0
      src/main/java/com/caimei/modules/products/dao/CmMallOrganizeProductsDao.java
  5. 27 0
      src/main/java/com/caimei/modules/products/dao/CmMallProductsClassifyDao.java
  6. 247 0
      src/main/java/com/caimei/modules/products/entity/CmMallOrganizeProducts.java
  7. 97 0
      src/main/java/com/caimei/modules/products/entity/CmMallPageModules.java
  8. 114 0
      src/main/java/com/caimei/modules/products/entity/CmMallProductsClassify.java
  9. 30 0
      src/main/java/com/caimei/modules/products/service/CmMallOrganizeProductsService.java
  10. 21 0
      src/main/java/com/caimei/modules/products/service/CmMallProductsClassifyService.java
  11. 94 0
      src/main/java/com/caimei/modules/products/service/impl/CmMallOrganizeProductsServiceImpl.java
  12. 71 0
      src/main/java/com/caimei/modules/products/service/impl/CmMallProductsClassifyServiceImpl.java
  13. 2 2
      src/main/java/com/caimei/modules/shiro/auth/AuthFilter.java
  14. 33 0
      src/main/java/com/caimei/modules/shiro/auth/ShiroConfig.java
  15. 8 8
      src/main/java/com/caimei/modules/shiro/controller/ShiroController.java
  16. 1 1
      src/main/java/com/caimei/modules/shiro/service/impl/ShiroServiceImpl.java
  17. 195 0
      src/main/java/com/caimei/utils/AppUtils.java
  18. 4 0
      src/main/resources/dev/application-dev.yml
  19. 232 0
      src/main/resources/mapper/CmMallOrganizeProductsMapper.xml
  20. 108 0
      src/main/resources/mapper/CmMallProductsClassifyMapper.xml
  21. 4 0
      src/main/resources/prod/application-prod.yml
  22. 4 0
      src/main/resources/test/application-test.yml

+ 2 - 3
src/main/java/com/caimei/modules/club/controller/CmOperationUserController.java

@@ -14,14 +14,13 @@ import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.thymeleaf.util.StringUtils;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.Date;
 import java.util.List;
 import java.util.Random;
@@ -60,7 +59,7 @@ public class CmOperationUserController {
      */
     @ResponseBody
     @RequestMapping(value = "save", method = RequestMethod.POST)
-    public JsonModel save(CmOperationUser cmOperationUser, Model model, RedirectAttributes redirectAttributes) {
+    public JsonModel save(@RequestBody CmOperationUser cmOperationUser) {
         JsonModel jsonModel = JsonModel.newInstance();
         //判断该运营人手机号是否已存在
         List<CmOperationUser> listBuyBindMobile1 = cmOperationUserService.findListBuyBindMobile(cmOperationUser);

+ 221 - 0
src/main/java/com/caimei/modules/products/controller/CmMallOrganizeProductsController.java

@@ -0,0 +1,221 @@
+package com.caimei.modules.products.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.caimei.modules.club.entity.Page;
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallPageModules;
+import com.caimei.modules.products.entity.CmMallProductsClassify;
+import com.caimei.modules.products.service.CmMallOrganizeProductsService;
+import com.caimei.modules.products.service.CmMallProductsClassifyService;
+import com.caimei.utils.JsonModel;
+import com.github.pagehelper.PageHelper;
+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.ResponseBody;
+import org.thymeleaf.util.StringUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 小程序商城商品Controller
+ *
+ * @author lijun
+ * @version 2019-12-04
+ */
+@Controller
+@RequestMapping(value = "/product/cmMallOrganizeProducts")
+public class CmMallOrganizeProductsController {
+
+    @Autowired
+    private CmMallOrganizeProductsService cmMallOrganizeProductsService;
+    @Autowired
+    private CmMallProductsClassifyService cmMallProductsClassifyService;
+
+    /**
+     * 去商品列表页面(全部页面)
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "toProductList")
+    public JsonModel toProductList(CmMallOrganizeProducts cmMallOrganizeProducts, Page page) {
+        Map<String, Object> map = new HashMap();
+        Page<CmMallOrganizeProducts> organizeProductsPage = cmMallOrganizeProductsService.findPage(page, cmMallOrganizeProducts);
+        //商品分类下拉数据
+        List<CmMallProductsClassify> listByEffective = cmMallProductsClassifyService.findListByEffective(cmMallOrganizeProducts.getOrganizeID());
+        map.put("organizeProductsPage", organizeProductsPage);
+        map.put("listByEffective", listByEffective);
+        return JsonModel.newInstance().success(map);
+    }
+
+    /**
+     * 商品模块列表
+     */
+    @ResponseBody
+    @RequestMapping("/module")
+    public JsonModel findAllModule(Integer organizeID) {
+        List<CmMallPageModules> mallPageModulesList = cmMallOrganizeProductsService.findAllModule(organizeID);
+        return JsonModel.newInstance().success(mallPageModulesList);
+    }
+
+    /**
+     * 编辑回显
+     */
+    @ResponseBody
+    @RequestMapping(value = "toEditProductInfo")
+    public JsonModel toEditProductInfo(Integer id) {
+        //获取商品分类列表
+        Map<String, Object> map = new HashMap();
+        CmMallOrganizeProducts organizeProducts = cmMallOrganizeProductsService.get(id);
+        List<CmMallProductsClassify> listByEffective = cmMallProductsClassifyService.findListByEffective(organizeProducts.getOrganizeID());
+        map.put("organizeProducts", organizeProducts);
+        map.put("listByEffective", listByEffective);
+        return JsonModel.newInstance().success(map);
+    }
+
+    /**
+     * 编辑保存
+     *
+     * @param cmMallOrganizeProducts
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "saveEditProductInfo")
+    public JsonModel saveEditProductInfo(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        JsonModel jsonModel = JsonModel.newInstance();
+        try {
+            cmMallOrganizeProducts.setUpdateTime(new Date());
+            cmMallOrganizeProductsService.updateProductInfo(cmMallOrganizeProducts);
+            return jsonModel.success("修改成功", "");
+        } catch (Exception e) {
+            return jsonModel.error("修改失败");
+        }
+    }
+
+    /**
+     * 上下架商品
+     *
+     * @param id 商品id
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "switchLine")
+    public JsonModel switchLine(Integer id) {
+        CmMallOrganizeProducts organizeProducts = cmMallOrganizeProductsService.get(id);
+        if (organizeProducts.getValidFlag().equals("1")) {
+            //下线商品
+            organizeProducts.setPreferredProduct("0");
+            organizeProducts.setCommonlyProduct("0");
+            organizeProducts.setPreferentialProduct("0");
+            organizeProducts.setValidFlag("2");
+        } else {
+            //上线商品
+            organizeProducts.setValidFlag("1");
+        }
+        cmMallOrganizeProductsService.updateValidFlag(organizeProducts);
+        return JsonModel.newInstance().success();
+    }
+
+    /**
+     * 批量更新排序值
+     *
+     * @param newProducSorttList (商品id-排序值,...)
+     * @return
+     */
+    @RequestMapping(value = "batchSaveSort")
+    @ResponseBody
+    public JsonModel batchSaveSort(String newProducSorttList, Integer modules) {
+        JsonModel jsonModel = JsonModel.newInstance();
+        try {
+            String[] newPageLists = newProducSorttList.split(",");
+            for (String list : newPageLists) {
+                String[] split = list.split("-");
+                if (split.length == 1 || split.length < 1) {
+                    String id = split[0];
+                    String sort = null;
+                    cmMallOrganizeProductsService.saveSort(modules, sort, id);
+                } else {
+                    String id = split[0];
+                    String sort = split[1];
+                    if (CmMallProductsClassifyController.isInteger(sort)) {
+                        if (StringUtils.equals("0", sort)) {
+                            return jsonModel.error("排序值只能填写大于等于1的整数");
+                        }
+                        cmMallOrganizeProductsService.saveSort(modules, sort, id);
+                    } else {
+                        return jsonModel.error("排序值只能为数字");
+                    }
+                }
+            }
+            return jsonModel.success("更新排序成功", "");
+        } catch (Exception e) {
+            return jsonModel.error("更新排序失败");
+        }
+    }
+
+    /**
+     * 添加商品数据
+     *
+     * @param cmMallOrganizeProducts
+     * @param page                   分页数据
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "toAddProduct1")
+    public JsonModel toAddProduct1(CmMallOrganizeProducts cmMallOrganizeProducts, Page page) {
+        //获取采美所有商品
+        Map<String, Object> map = new HashMap();
+        PageHelper.startPage(page.getIndex(), page.getPageSize());
+        List<CmMallOrganizeProducts> listBuyMall = cmMallOrganizeProductsService.findListBuyMall(cmMallOrganizeProducts);
+        //获取商品分类列表
+        List<CmMallProductsClassify> listByEffective = cmMallProductsClassifyService.findListByEffective(cmMallOrganizeProducts.getOrganizeID());
+        map.put("listBuyMall", listBuyMall);
+        map.put("listByEffective", listByEffective);
+        return JsonModel.newInstance().success(map);
+    }
+
+    /**
+     * 添加商品
+     *
+     * @param cmMallOrganizeProducts
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "saveAddProductInfo")
+    public JsonModel saveAddProductInfo(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        JsonModel jsonModel = JsonModel.newInstance();
+        try {
+            JSONArray parse = (JSONArray) JSON.parse(cmMallOrganizeProducts.getItemsList());
+            if (null != parse && parse.size() > 0) {
+                for (int j = 0; j < parse.size(); j++) {
+                    String productID = (String) parse.get(j);//获取商品ID
+                    CmMallOrganizeProducts cop = new CmMallOrganizeProducts();
+                    cop.setId(Integer.valueOf(productID));
+                    cmMallOrganizeProductsService.updateProductInfo1(cop);
+                }
+            }
+            return jsonModel.success("添加成功", "");
+        } catch (Exception e) {
+            return jsonModel.error("添加失败");
+        }
+    }
+
+    /**
+     * //取消模块内商品
+     *
+     * @param cmMallOrganizeProducts
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "canncelProduct")
+    public JsonModel canncelProduct(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        cmMallOrganizeProducts.setUpdateTime(new Date());
+        cmMallOrganizeProductsService.canncelPreferredProduct(cmMallOrganizeProducts);
+        return JsonModel.newInstance().success();
+    }
+}

+ 180 - 0
src/main/java/com/caimei/modules/products/controller/CmMallProductsClassifyController.java

@@ -0,0 +1,180 @@
+package com.caimei.modules.products.controller;
+
+import com.caimei.modules.club.entity.Page;
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallProductsClassify;
+import com.caimei.modules.products.service.CmMallOrganizeProductsService;
+import com.caimei.modules.products.service.CmMallProductsClassifyService;
+import com.caimei.utils.JsonModel;
+import com.github.pagehelper.PageHelper;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.thymeleaf.expression.Maps;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * 小程序商品分类Controller
+ *
+ * @author lijun
+ * @version 2019-12-03
+ */
+@Controller
+@RequestMapping(value = "/product/cmMallProductsClassify")
+public class CmMallProductsClassifyController {
+
+    @Autowired
+    private CmMallProductsClassifyService cmMallProductsClassifyService;
+    @Autowired
+    private CmMallOrganizeProductsService cmMallOrganizeProductsService;
+
+    /**
+     * 商品分类列表
+     */
+    @ResponseBody
+    @RequestMapping(value = {"list"})
+    public JsonModel list(CmMallProductsClassify cmMallProductsClassify, Page page) {
+        PageHelper.startPage(page.getIndex(), page.getPageSize());
+        List<CmMallProductsClassify> productsClassifyList = cmMallProductsClassifyService.findList(cmMallProductsClassify);
+        Page<CmMallProductsClassify> classifyPage = new Page<>(productsClassifyList);
+        return JsonModel.newInstance().success(classifyPage);
+    }
+
+    /**
+     * 编辑回显
+     *
+     * @param id
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "form")
+    public JsonModel form(Integer id) {
+        CmMallProductsClassify mallProductsClassify = cmMallProductsClassifyService.get(id);
+        return JsonModel.newInstance().success(mallProductsClassify);
+    }
+
+    /**
+     * 编辑,保存
+     *
+     * @param cmMallProductsClassify
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "save")
+    public JsonModel save(CmMallProductsClassify cmMallProductsClassify) {
+        JsonModel jsonModel = JsonModel.newInstance();
+        //保存商品名字不能重复
+        List<CmMallProductsClassify> productsClassifyListByName = cmMallProductsClassifyService.getProductsClassifyListByName(cmMallProductsClassify);
+        if (CollectionUtils.isNotEmpty(productsClassifyListByName) && productsClassifyListByName.size() > 0) {
+            return jsonModel.error("分类名称不能重复");
+        }
+        //判断该商品是是否选择的是停用,如果停用判断该分类下是否存在商品
+        if (StringUtils.equals("2", cmMallProductsClassify.getStatus())) {
+            CmMallOrganizeProducts cmMallOrganizeProducts = new CmMallOrganizeProducts();
+            cmMallOrganizeProducts.setOrganizeID(cmMallProductsClassify.getOrganizeID());
+            cmMallOrganizeProducts.setClassifyID(String.valueOf(cmMallProductsClassify.getId()));
+            List<CmMallOrganizeProducts> list1 = cmMallOrganizeProductsService.findList(cmMallOrganizeProducts);
+            if (CollectionUtils.isNotEmpty(list1)) {
+                return jsonModel.error("该分类中还存在商品,请把该分类的商品转移到别的分类后,再停用该分类");
+            }
+        }
+
+        Date date = new Date();
+        if (cmMallProductsClassify.getId() == null) {//是新增
+            cmMallProductsClassify.setAddTime(date);
+            cmMallProductsClassify.setDelFlag("0");
+        }
+        cmMallProductsClassify.setUpdateTime(date);
+        /*//修改图片全路径
+        ImageUploadInfo saveImageSerivce = new ImageUploadInfo();
+        String photoServer = Global.getConfig("photoServer");
+        String classifyImage = cmMallProductsClassify.getClassifyImage();
+        if (StringUtils.isNotBlank(classifyImage) && !classifyImage.startsWith("http:") && !classifyImage.startsWith("https:")) {
+            classifyImage = Encodes.urlDecode(classifyImage);
+            String realPath = UploadImageUtils.getAbsolutePath(classifyImage);
+            int pointerIndex = realPath.lastIndexOf(".");
+            try {
+                saveImageSerivce = UploadUtils.saveImageSerivce(realPath, pointerIndex, realPath);
+                cmMallProductsClassify.setClassifyImage(photoServer + saveImageSerivce.getSource());
+            } catch (Exception e) {
+                logger.error("图片上传错误:" + e.toString(), e);
+            }
+        }*/
+        cmMallProductsClassifyService.save(cmMallProductsClassify);
+        return jsonModel.success();
+    }
+
+    /**
+     * 启用,关闭
+     *
+     * @param id 分类id
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "switchClassify")
+    public JsonModel switchClassify(Integer id) {
+        CmMallProductsClassify mallProductsClassify = cmMallProductsClassifyService.get(id);
+        if (mallProductsClassify.getStatus().equals("1")) {
+            mallProductsClassify.setStatus("2");//1启用,2停用
+        } else {
+            mallProductsClassify.setStatus("1");//1启用,2停用
+        }
+        mallProductsClassify.setUpdateTime(new Date());
+        cmMallProductsClassifyService.updateStatus(mallProductsClassify);//更新会所表数据
+        return JsonModel.newInstance().success();
+    }
+
+    /**
+     * 批量更新排序值
+     *
+     * @param newProducSorttList (分类id-排序值,...)
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "batchSaveSort")
+    public JsonModel batchSaveSort(String newProducSorttList) {
+        JsonModel jsonModel = JsonModel.newInstance();
+        try {
+            String[] newPageLists = newProducSorttList.split(",");
+            for (String list : newPageLists) {
+                String[] split = list.split("-");
+                if (split.length == 1 || split.length < 1) {
+                    return jsonModel.error("排序值不能为空!");
+                }
+                String s = split[1];//判断是否是数字,或者为空
+                if (StringUtils.isNotEmpty(s)) {
+                    if (isInteger(s)) {
+                        if (StringUtils.equals("0", s)) {
+                            return jsonModel.error("排序值只能填写大于等于1的整数");
+                        }
+                        String id = split[0];
+                        String sort = split[1];
+                        cmMallProductsClassifyService.saveSort(sort, id);
+                    } else {
+                        return jsonModel.error("排序值只能为数字");
+                    }
+                } else {
+                    return jsonModel.error("排序值不能为空!");
+                }
+            }
+            return jsonModel.success("更新排序成功", "");
+        } catch (Exception e) {
+            return jsonModel.error("更新排序失败");
+        }
+    }
+
+    public static boolean isInteger(String str) {
+        Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
+        return pattern.matcher(str).matches();
+    }
+}

+ 31 - 0
src/main/java/com/caimei/modules/products/dao/CmMallOrganizeProductsDao.java

@@ -0,0 +1,31 @@
+package com.caimei.modules.products.dao;
+
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallPageModules;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface CmMallOrganizeProductsDao {
+    List<CmMallOrganizeProducts> findList(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    List<CmMallPageModules> findAllModule(Integer organizeID);
+
+    void updateProductInfo(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    CmMallOrganizeProducts get(Integer id);
+
+    void updateValidFlag(CmMallOrganizeProducts organizeProducts);
+
+    void saveSort(@Param("modules") Integer modules, @Param("sort") String sort, @Param("id") String id);
+
+    List<CmMallOrganizeProducts> findListBuyMall(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    List<Integer> getAllExistsProductList(Integer modules);
+
+    void updateProductInfo1(CmMallOrganizeProducts cop);
+
+    void canncelPreferredProduct(CmMallOrganizeProducts cmMallOrganizeProducts);
+}

+ 27 - 0
src/main/java/com/caimei/modules/products/dao/CmMallProductsClassifyDao.java

@@ -0,0 +1,27 @@
+package com.caimei.modules.products.dao;
+
+import com.caimei.modules.products.entity.CmMallProductsClassify;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface CmMallProductsClassifyDao {
+
+    List<CmMallProductsClassify> findList(CmMallProductsClassify cmMallProductsClassify);
+
+    CmMallProductsClassify get(Integer id);
+
+    List<CmMallProductsClassify> getProductsClassifyListByName(CmMallProductsClassify cmMallProductsClassify);
+
+    void insert(CmMallProductsClassify cmMallProductsClassify);
+
+    void update(CmMallProductsClassify cmMallProductsClassify);
+
+    void updateStatus(CmMallProductsClassify mallProductsClassify);
+
+    void saveSort(@Param("sort") String sort, @Param("id") String id);
+
+    List<CmMallProductsClassify> findListByEffective(String organizeID);
+}

+ 247 - 0
src/main/java/com/caimei/modules/products/entity/CmMallOrganizeProducts.java

@@ -0,0 +1,247 @@
+package com.caimei.modules.products.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.hibernate.validator.constraints.Length;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 小程序商城商品Entity
+ *
+ * @author lijun
+ * @version 2019-12-04
+ */
+public class CmMallOrganizeProducts implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private Integer id;
+    private String classifyID;        // 对应cm_mall_products_classify商品分类表id
+    private String organizeID;        // 组织ID,具体对应cm_mall_organize表ID
+    private String productID;        // 商品ID,具体对应product表
+    private String normalPrice;        // 市场价
+    private String costPrice;        // 成本价
+    private String retailPrice;        // 售价
+    private String minBuyNumber;        // 最小起订量
+    private String preferredProduct;        // 是否是优选商品:0不是优选,1优选商品
+    private String commonlyProduct;        // 是否是常用商品:0不是常用,1常用商品
+    private String preferentialProduct;        // 是否是星范精品:0不是特惠,1星范精品商品
+    private String validFlag;        // 商品状态,1已上架,2已下架
+    private String preferredProductSort;        //(优选排序)排序默认为空,排序优先级1最高,空最后
+    private String commonlyProductSort;        //(常用排序)排序默认为空,排序优先级1最高,空最后
+    private String preferentialProductSort;        //(精品排序)排序默认为空,排序优先级1最高,空最后
+    private Date addTime;        // 添加时间
+    private Date updateTime;        // 更新时间
+    private Integer modules;     //第几个模块
+
+    //非小程序商城商品信息
+    private String mainImage;//商品图片
+    private String productName;//商品名称
+    private String shopName;//供应商名称
+    private String productClassifyName;//商品分类名字
+
+    private String itemsList;//添加商品字符串
+    private String existsFlag;//是否已存在小程序商品中 1已存在,其他都为不存在
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Length(min = 0, max = 11, message = "对应cm_mall_products_classify商品分类表id长度必须介于 0 和 11 之间")
+    public String getClassifyID() {
+        return classifyID;
+    }
+
+    public void setClassifyID(String classifyID) {
+        this.classifyID = classifyID;
+    }
+
+    @Length(min = 0, max = 11, message = "组织ID,具体对应cm_mall_organize表ID长度必须介于 0 和 11 之间")
+    public String getOrganizeID() {
+        return organizeID;
+    }
+
+    public void setOrganizeID(String organizeID) {
+        this.organizeID = organizeID;
+    }
+
+    @Length(min = 0, max = 11, message = "商品ID,具体对应product表长度必须介于 0 和 11 之间")
+    public String getProductID() {
+        return productID;
+    }
+
+    public void setProductID(String productID) {
+        this.productID = productID;
+    }
+
+    public String getNormalPrice() {
+        return normalPrice;
+    }
+
+    public void setNormalPrice(String normalPrice) {
+        this.normalPrice = normalPrice;
+    }
+
+    public String getCostPrice() {
+        return costPrice;
+    }
+
+    public void setCostPrice(String costPrice) {
+        this.costPrice = costPrice;
+    }
+
+    public String getRetailPrice() {
+        return retailPrice;
+    }
+
+    public void setRetailPrice(String retailPrice) {
+        this.retailPrice = retailPrice;
+    }
+
+    @Length(min = 0, max = 11, message = "最小起订量长度必须介于 0 和 11 之间")
+    public String getMinBuyNumber() {
+        return minBuyNumber;
+    }
+
+    public void setMinBuyNumber(String minBuyNumber) {
+        this.minBuyNumber = minBuyNumber;
+    }
+
+    @Length(min = 0, max = 1, message = "是否是优选商品:0不是优选,1优选商品长度必须介于 0 和 1 之间")
+    public String getPreferredProduct() {
+        return preferredProduct;
+    }
+
+    public void setPreferredProduct(String preferredProduct) {
+        this.preferredProduct = preferredProduct;
+    }
+
+    @Length(min = 0, max = 1, message = "是否是常用商品:0不是常用,1常用商品长度必须介于 0 和 1 之间")
+    public String getCommonlyProduct() {
+        return commonlyProduct;
+    }
+
+    public void setCommonlyProduct(String commonlyProduct) {
+        this.commonlyProduct = commonlyProduct;
+    }
+
+    @Length(min = 0, max = 1, message = "是否是星范精品:0不是特惠,1星范精品商品长度必须介于 0 和 1 之间")
+    public String getPreferentialProduct() {
+        return preferentialProduct;
+    }
+
+    public void setPreferentialProduct(String preferentialProduct) {
+        this.preferentialProduct = preferentialProduct;
+    }
+
+    @Length(min = 0, max = 2, message = "商品状态,1已上架,2已下架长度必须介于 0 和 2 之间")
+    public String getValidFlag() {
+        return validFlag;
+    }
+
+    public void setValidFlag(String validFlag) {
+        this.validFlag = validFlag;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getMainImage() {
+        return mainImage;
+    }
+
+    public void setMainImage(String mainImage) {
+        this.mainImage = mainImage;
+    }
+
+    public String getProductName() {
+        return productName;
+    }
+
+    public void setProductName(String productName) {
+        this.productName = productName;
+    }
+
+    public String getShopName() {
+        return shopName;
+    }
+
+    public void setShopName(String shopName) {
+        this.shopName = shopName;
+    }
+
+    public String getProductClassifyName() {
+        return productClassifyName;
+    }
+
+    public void setProductClassifyName(String productClassifyName) {
+        this.productClassifyName = productClassifyName;
+    }
+
+    public String getPreferredProductSort() {
+        return preferredProductSort;
+    }
+
+    public void setPreferredProductSort(String preferredProductSort) {
+        this.preferredProductSort = preferredProductSort;
+    }
+
+    public String getCommonlyProductSort() {
+        return commonlyProductSort;
+    }
+
+    public void setCommonlyProductSort(String commonlyProductSort) {
+        this.commonlyProductSort = commonlyProductSort;
+    }
+
+    public String getPreferentialProductSort() {
+        return preferentialProductSort;
+    }
+
+    public void setPreferentialProductSort(String preferentialProductSort) {
+        this.preferentialProductSort = preferentialProductSort;
+    }
+
+    public String getItemsList() {
+        return itemsList;
+    }
+
+    public void setItemsList(String itemsList) {
+        this.itemsList = itemsList;
+    }
+
+    public String getExistsFlag() {
+        return existsFlag;
+    }
+
+    public void setExistsFlag(String existsFlag) {
+        this.existsFlag = existsFlag;
+    }
+
+    public Integer getModules() {
+        return modules;
+    }
+
+    public void setModules(Integer modules) {
+        this.modules = modules;
+    }
+}

+ 97 - 0
src/main/java/com/caimei/modules/products/entity/CmMallPageModules.java

@@ -0,0 +1,97 @@
+package com.caimei.modules.products.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class CmMallPageModules implements Serializable {
+    private Integer id;
+    private Integer organizeID;//组织ID
+    private String organizeName;//组织名称
+    private String firstModulesName;//模块一名称
+    private String secondModulesName;//模块二名称
+    private String thirdModulesName;//模块三名称
+    private String firstModulesImage;//模块一图片
+    private String secondModulesImage;//模块二图片
+    private Date addTime;//添加时间
+    private Date updateTime;//修改时间
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getOrganizeID() {
+        return organizeID;
+    }
+
+    public void setOrganizeID(Integer organizeID) {
+        this.organizeID = organizeID;
+    }
+
+    public String getOrganizeName() {
+        return organizeName;
+    }
+
+    public void setOrganizeName(String organizeName) {
+        this.organizeName = organizeName;
+    }
+
+    public String getFirstModulesName() {
+        return firstModulesName;
+    }
+
+    public void setFirstModulesName(String firstModulesName) {
+        this.firstModulesName = firstModulesName;
+    }
+
+    public String getSecondModulesName() {
+        return secondModulesName;
+    }
+
+    public void setSecondModulesName(String secondModulesName) {
+        this.secondModulesName = secondModulesName;
+    }
+
+    public String getThirdModulesName() {
+        return thirdModulesName;
+    }
+
+    public void setThirdModulesName(String thirdModulesName) {
+        this.thirdModulesName = thirdModulesName;
+    }
+
+    public String getFirstModulesImage() {
+        return firstModulesImage;
+    }
+
+    public void setFirstModulesImage(String firstModulesImage) {
+        this.firstModulesImage = firstModulesImage;
+    }
+
+    public String getSecondModulesImage() {
+        return secondModulesImage;
+    }
+
+    public void setSecondModulesImage(String secondModulesImage) {
+        this.secondModulesImage = secondModulesImage;
+    }
+
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+}

+ 114 - 0
src/main/java/com/caimei/modules/products/entity/CmMallProductsClassify.java

@@ -0,0 +1,114 @@
+package com.caimei.modules.products.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.hibernate.validator.constraints.Length;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 小程序商品分类Entity
+ *
+ * @author lijun
+ * @version 2019-12-03
+ */
+public class CmMallProductsClassify implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private Integer id;
+    private String organizeID;        // 分类归属组织ID,具体对应cm_mall_organize表ID
+    private String classifyName;        // 分类名称
+    private String classifyImage;        // 分类图标
+    private String sort;        // 排序
+    private String status;        // 状态:1启用,2停用
+    private Date addTime;        // 添加时间
+    private Date updateTime;        // 更新时间
+    private String containsProduct;//是否包含商品,1包含商品,其它为不包含商品
+    private String delFlag;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    @Length(min = 0, max = 11, message = "分类归属组织ID,具体对应cm_mall_organize表ID长度必须介于 0 和 11 之间")
+    public String getOrganizeID() {
+        return organizeID;
+    }
+
+    public void setOrganizeID(String organizeID) {
+        this.organizeID = organizeID;
+    }
+
+    @Length(min = 0, max = 20, message = "分类名称长度必须介于 0 和 20 之间")
+    public String getClassifyName() {
+        return classifyName;
+    }
+
+    public void setClassifyName(String classifyName) {
+        this.classifyName = classifyName;
+    }
+
+    public String getClassifyImage() {
+        return classifyImage;
+    }
+
+    public void setClassifyImage(String classifyImage) {
+        this.classifyImage = classifyImage;
+    }
+
+    @Length(min = 0, max = 11, message = "排序长度必须介于 0 和 11 之间")
+    public String getSort() {
+        return sort;
+    }
+
+    public void setSort(String sort) {
+        this.sort = sort;
+    }
+
+    @Length(min = 0, max = 1, message = "状态:1启用,2停用长度必须介于 0 和 1 之间")
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getContainsProduct() {
+        return containsProduct;
+    }
+
+    public void setContainsProduct(String containsProduct) {
+        this.containsProduct = containsProduct;
+    }
+
+    public String getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag) {
+        this.delFlag = delFlag;
+    }
+}

+ 30 - 0
src/main/java/com/caimei/modules/products/service/CmMallOrganizeProductsService.java

@@ -0,0 +1,30 @@
+package com.caimei.modules.products.service;
+
+import com.caimei.modules.club.entity.Page;
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallPageModules;
+
+import java.util.List;
+
+public interface CmMallOrganizeProductsService {
+
+    List<CmMallOrganizeProducts> findList(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    Page<CmMallOrganizeProducts> findPage(Page page, CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    List<CmMallPageModules> findAllModule(Integer organizeID);
+
+    void updateProductInfo(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    CmMallOrganizeProducts get(Integer id);
+
+    void updateValidFlag(CmMallOrganizeProducts organizeProducts);
+
+    void saveSort(Integer modules, String sort, String id);
+
+    List<CmMallOrganizeProducts> findListBuyMall(CmMallOrganizeProducts cmMallOrganizeProducts);
+
+    void updateProductInfo1(CmMallOrganizeProducts cop);
+
+    void canncelPreferredProduct(CmMallOrganizeProducts cmMallOrganizeProducts);
+}

+ 21 - 0
src/main/java/com/caimei/modules/products/service/CmMallProductsClassifyService.java

@@ -0,0 +1,21 @@
+package com.caimei.modules.products.service;
+
+import com.caimei.modules.products.entity.CmMallProductsClassify;
+
+import java.util.List;
+
+public interface CmMallProductsClassifyService {
+    List<CmMallProductsClassify> findList(CmMallProductsClassify cmMallProductsClassify);
+
+    CmMallProductsClassify get(Integer id);
+
+    List<CmMallProductsClassify> getProductsClassifyListByName(CmMallProductsClassify cmMallProductsClassify);
+
+    void save(CmMallProductsClassify cmMallProductsClassify);
+
+    void updateStatus(CmMallProductsClassify mallProductsClassify);
+
+    void saveSort(String sort, String id);
+
+    List<CmMallProductsClassify> findListByEffective(String organizeID);
+}

+ 94 - 0
src/main/java/com/caimei/modules/products/service/impl/CmMallOrganizeProductsServiceImpl.java

@@ -0,0 +1,94 @@
+package com.caimei.modules.products.service.impl;
+
+import com.caimei.modules.club.entity.Page;
+import com.caimei.modules.products.dao.CmMallOrganizeProductsDao;
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallPageModules;
+import com.caimei.modules.products.service.CmMallOrganizeProductsService;
+import com.caimei.utils.AppUtils;
+import com.github.pagehelper.PageHelper;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CmMallOrganizeProductsServiceImpl implements CmMallOrganizeProductsService {
+    @Autowired
+    private CmMallOrganizeProductsDao cmMallOrganizeProductsDao;
+    @Value("${malladmin.domain}")
+    private String domain;
+
+    @Override
+    public List<CmMallOrganizeProducts> findList(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        return cmMallOrganizeProductsDao.findList(cmMallOrganizeProducts);
+    }
+
+    @Override
+    public Page<CmMallOrganizeProducts> findPage(Page page, CmMallOrganizeProducts cmMallOrganizeProducts) {
+        PageHelper.startPage(page.getIndex(), page.getPageSize());
+        List<CmMallOrganizeProducts> organizeProductsDaoList = cmMallOrganizeProductsDao.findList(cmMallOrganizeProducts);
+        if (CollectionUtils.isNotEmpty(organizeProductsDaoList)) {
+            for (CmMallOrganizeProducts c : organizeProductsDaoList) {
+                c.setMainImage(AppUtils.getProductImageURL(c.getMainImage(), 0, domain));
+            }
+        }
+        Page<CmMallOrganizeProducts> organizeProductsPage = new Page<>(organizeProductsDaoList);
+        return organizeProductsPage;
+    }
+
+    @Override
+    public List<CmMallPageModules> findAllModule(Integer organizeID) {
+        return cmMallOrganizeProductsDao.findAllModule(organizeID);
+    }
+
+    @Override
+    public void updateProductInfo(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        cmMallOrganizeProductsDao.updateProductInfo(cmMallOrganizeProducts);
+    }
+
+    @Override
+    public CmMallOrganizeProducts get(Integer id) {
+        return cmMallOrganizeProductsDao.get(id);
+    }
+
+    @Override
+    public void updateValidFlag(CmMallOrganizeProducts organizeProducts) {
+        cmMallOrganizeProductsDao.updateValidFlag(organizeProducts);
+    }
+
+    @Override
+    public void saveSort(Integer modules, String sort, String id) {
+        cmMallOrganizeProductsDao.saveSort(modules, sort, id);
+    }
+
+    @Override
+    public List<CmMallOrganizeProducts> findListBuyMall(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        List<CmMallOrganizeProducts> listBuyMall = cmMallOrganizeProductsDao.findListBuyMall(cmMallOrganizeProducts);
+        List<Integer> allExistsProductList = cmMallOrganizeProductsDao.getAllExistsProductList(cmMallOrganizeProducts.getModules());
+        if (CollectionUtils.isNotEmpty(listBuyMall)) {
+            for (CmMallOrganizeProducts c : listBuyMall) {
+                c.setMainImage(AppUtils.getProductImageURL(c.getMainImage(), 0, domain));
+                if (CollectionUtils.isNotEmpty(allExistsProductList)) {
+                    boolean contains = allExistsProductList.contains(c.getId());
+                    if (contains) {
+                        c.setExistsFlag("1");
+                    }
+                }
+            }
+        }
+        return listBuyMall;
+    }
+
+    @Override
+    public void updateProductInfo1(CmMallOrganizeProducts cop) {
+        cmMallOrganizeProductsDao.updateProductInfo1(cop);
+    }
+
+    @Override
+    public void canncelPreferredProduct(CmMallOrganizeProducts cmMallOrganizeProducts) {
+        cmMallOrganizeProductsDao.canncelPreferredProduct(cmMallOrganizeProducts);
+    }
+}

+ 71 - 0
src/main/java/com/caimei/modules/products/service/impl/CmMallProductsClassifyServiceImpl.java

@@ -0,0 +1,71 @@
+package com.caimei.modules.products.service.impl;
+
+import com.caimei.modules.products.dao.CmMallProductsClassifyDao;
+import com.caimei.modules.products.entity.CmMallOrganizeProducts;
+import com.caimei.modules.products.entity.CmMallProductsClassify;
+import com.caimei.modules.products.service.CmMallOrganizeProductsService;
+import com.caimei.modules.products.service.CmMallProductsClassifyService;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CmMallProductsClassifyServiceImpl implements CmMallProductsClassifyService {
+    @Autowired
+    private CmMallProductsClassifyDao cmMallProductsClassifyDao;
+    @Autowired
+    private CmMallOrganizeProductsService cmMallOrganizeProductsService;
+
+    @Override
+    public List<CmMallProductsClassify> findList(CmMallProductsClassify cmMallProductsClassify) {
+        List<CmMallProductsClassify> classifyList = cmMallProductsClassifyDao.findList(cmMallProductsClassify);
+        if (null != classifyList && classifyList.size() > 0) {
+            for (CmMallProductsClassify c : classifyList) {
+                CmMallOrganizeProducts cmMallOrganizeProducts = new CmMallOrganizeProducts();
+                cmMallOrganizeProducts.setOrganizeID(c.getOrganizeID());
+                cmMallOrganizeProducts.setClassifyID(String.valueOf(c.getId()));
+                List<CmMallOrganizeProducts> list1 = cmMallOrganizeProductsService.findList(cmMallOrganizeProducts);
+                if (CollectionUtils.isNotEmpty(list1)) {
+                    c.setContainsProduct("1");//是否包含商品,1包含商品,其它为不包含商品
+                }
+            }
+        }
+        return classifyList;
+    }
+
+    @Override
+    public CmMallProductsClassify get(Integer id) {
+        return cmMallProductsClassifyDao.get(id);
+    }
+
+    @Override
+    public List<CmMallProductsClassify> getProductsClassifyListByName(CmMallProductsClassify cmMallProductsClassify) {
+        return cmMallProductsClassifyDao.getProductsClassifyListByName(cmMallProductsClassify);
+    }
+
+    @Override
+    public void save(CmMallProductsClassify cmMallProductsClassify) {
+        if (cmMallProductsClassify.getId() == null) {
+            cmMallProductsClassifyDao.insert(cmMallProductsClassify);
+        } else {
+            cmMallProductsClassifyDao.update(cmMallProductsClassify);
+        }
+    }
+
+    @Override
+    public void updateStatus(CmMallProductsClassify mallProductsClassify) {
+        cmMallProductsClassifyDao.updateStatus(mallProductsClassify);
+    }
+
+    @Override
+    public void saveSort(String sort, String id) {
+        cmMallProductsClassifyDao.saveSort(sort, id);
+    }
+
+    @Override
+    public List<CmMallProductsClassify> findListByEffective(String organizeID) {
+        return cmMallProductsClassifyDao.findListByEffective(organizeID);
+    }
+}

+ 2 - 2
src/main/java/com/caimei/modules/shiro/auth/AuthFilter.java

@@ -73,7 +73,7 @@ public class AuthFilter extends AuthenticatingFilter {
             HttpServletResponse httpResponse = (HttpServletResponse) response;
             httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
             httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());
-            httpResponse.setCharacterEncoding("GBK");
+            httpResponse.setCharacterEncoding("UTF-8");
             Map<String, Object> result = new HashMap<>();
             result.put("status", "-1");
             result.put("msg", "未登录,请登录");
@@ -98,7 +98,7 @@ public class AuthFilter extends AuthenticatingFilter {
             //处理登录失败的异常
             Throwable throwable = e.getCause() == null ? e : e.getCause();
             Map<String, Object> result = new HashMap<>();
-            result.put("status", "400");
+            result.put("status", "-1");
             result.put("msg", "登陆失败--onLoginFailure");
             String json = JSON.toJSONString(result);
             httpResponse.getWriter().print(json);

+ 33 - 0
src/main/java/com/caimei/modules/shiro/auth/ShiroConfig.java

@@ -4,8 +4,12 @@ import org.apache.shiro.spring.LifecycleBeanPostProcessor;
 import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
 import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
 import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
 
 import javax.servlet.Filter;
 import java.util.HashMap;
@@ -59,4 +63,33 @@ public class ShiroConfig {
         advisor.setSecurityManager(securityManager);
         return advisor;
     }
+
+    @Bean
+    public FilterRegistrationBean corsFilter() {
+        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        final CorsConfiguration config = new CorsConfiguration();
+        // 允许cookies跨域
+        config.setAllowCredentials(true);
+        // #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
+        config.addAllowedOrigin("*");
+        // #允许访问的头信息,*表示全部
+        config.addAllowedHeader("*");
+        // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
+        config.setMaxAge(18000L);
+        // 允许提交请求的方法,*表示全部允许
+        config.addAllowedMethod("OPTIONS");
+        config.addAllowedMethod("HEAD");
+        config.addAllowedMethod("GET");
+        config.addAllowedMethod("PUT");
+        config.addAllowedMethod("POST");
+        config.addAllowedMethod("DELETE");
+        config.addAllowedMethod("PATCH");
+        source.registerCorsConfiguration("/**", config);
+
+        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
+        // 设置监听器的优先级
+        bean.setOrder(0);
+
+        return bean;
+    }
 }

+ 8 - 8
src/main/java/com/caimei/modules/shiro/controller/ShiroController.java

@@ -5,10 +5,9 @@ import com.caimei.modules.shiro.entity.CmMallAdminUser;
 import com.caimei.modules.shiro.service.ShiroService;
 import com.caimei.utils.JsonModel;
 import com.caimei.utils.MD5Util;
+import com.caimei.utils.TokenEncryptUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 @RestController
@@ -22,13 +21,13 @@ public class ShiroController {
     /**
      * 登录
      */
-    @GetMapping("/login")
-    public JsonModel login(String account, String password, Integer organizeID) throws Exception {
+    @PostMapping("/login")
+    public JsonModel login(@RequestBody CmMallAdminUser adminUser) throws Exception {
         JsonModel jsonModel = JsonModel.newInstance();
         //用户信息
-        CmMallAdminUser user = shiroService.findByUsername(account, organizeID);
+        CmMallAdminUser user = shiroService.findByUsername(adminUser.getAccount(), adminUser.getOrganizeID());
         //账号不存在、密码错误
-        if (user == null || !user.getPassword().equals(MD5Util.MD5(password))) {
+        if (user == null || !user.getPassword().equals(MD5Util.MD5(adminUser.getPassword()))) {
             return jsonModel.error("账号或密码有误");
         } else {
             //生成token
@@ -44,7 +43,8 @@ public class ShiroController {
 
     @GetMapping("/info")
     public JsonModel info(String token) {
-        String[] tokens = token.split("#,#");
+        String decoded = TokenEncryptUtils.decoded(token);
+        String[] tokens = decoded.split("#,#");
         //用户信息
         CmMallAdminUser user = shiroService.findByUserId(Integer.valueOf(tokens[1]));
         return JsonModel.newInstance().success(user);

+ 1 - 1
src/main/java/com/caimei/modules/shiro/service/impl/ShiroServiceImpl.java

@@ -27,7 +27,7 @@ public class ShiroServiceImpl implements ShiroService {
     @Override
     public String createToken(CmMallAdminUser user) throws Exception {
         // 获取当前时间戳(10位整数)
-        int time = (int) (System.currentTimeMillis() / 1000 + 3600);
+        int time = (int) (System.currentTimeMillis() / 1000 + 3600*12);
         String token = TokenEncryptUtils.encoded(time + "#,#" + user.getId() + "#,#" + user.getPassword());
         return token;
     }

+ 195 - 0
src/main/java/com/caimei/utils/AppUtils.java

@@ -0,0 +1,195 @@
+/**
+ *
+ */
+package com.caimei.utils;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.struts2.ServletActionContext;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Random;
+
+/**
+ * @author 王永煌
+ * @date 2015年6月29日
+ * @time 下午1:17:07
+ * @version 1.0
+ * @company Shenzhen Caimei Information Technology Co., LTD
+ * @license Copyright © 2014 CAIMEI365.com All Rights Reserved.
+ */
+public class AppUtils {
+
+	public static String getImageURL(String dirName, String src, String domain) {
+		return getImageURL(dirName, src, 0,domain);
+	}
+
+	/***
+	 * 获取图片地址
+	 *
+	 * @param src
+	 *            保存在数据库中的图片文件名
+	 * @param type
+	 *            图片的前缀 (如 type = 200 那么则获取的图片是 200_XXX的图片)
+	 * @param dirName
+	 *            图片保存的文件夹名 如 (league)
+	 * @param domain
+	 * 			   加上域名拼成完整路径
+	 * @return
+	 */
+	public static String getImageURL(String dirName, String src, int type, String domain) {
+
+
+		//正式环境 域名 http --- https处理
+		if (domain != null && !"".equals(domain) && domain.startsWith("http:") && domain.toLowerCase().lastIndexOf("test")== -1 && domain.toLowerCase().lastIndexOf("localhost")== -1) {
+			domain = domain.replace("http:", "https:");
+		}
+
+		//正式环境 图片地址 http --- https处理
+		if(src != null && src.startsWith("https:")){
+			//非正式环境 使用http
+			if (domain !=null && !"".equals(domain) && domain.toLowerCase().lastIndexOf("test")>-1 || domain.toLowerCase().lastIndexOf("localhost")>-1){
+				src = src.replace("https:","http:");
+			}
+			return src;
+		}
+
+		//正式环境 图片地址  http --- https处理
+		if(src != null && src.startsWith("http:")){
+			//非正式环境 使用http
+			if (domain !=null && !"".equals(domain) && domain.toLowerCase().lastIndexOf("test")==-1 && domain.toLowerCase().lastIndexOf("localhost")==-1){
+				src = src.replace("http:","https:");
+			}
+			return src;
+		}
+		type = 0 ;
+		dirName = dirName.trim();
+		if (dirName == null) dirName = "";
+		if(src == null || src.equalsIgnoreCase("null")) src = "";
+		if (src.indexOf(",") > 0) {
+			String tmp = src;
+			src = tmp.substring(0, tmp.indexOf(","));
+		}
+		String image = "/public/3.0/img/default/none.jpg";
+		if (dirName.equals("user")) {
+			image = "/public/3.0/img/default/HeaderImg.png";
+		} else if (dirName.equals("club")) {
+			image = "/public/3.0/img/default/default_club.jpg";
+		} else if (dirName.equals("shopLogo")) {
+			image = "/public/3.0/img/default/suppliver.jpg";
+		}else if (dirName.equals("caiMeiImage")) {
+			image = "/public/3.0/img/default/caiMeiImage.jpg";
+		}else {
+			image = "/public/3.0/img/default/none.jpg";
+		}
+		if (src != null && !src.equals("")) {
+			if (type != 0 || dirName.equals("product")) {
+				src = src.replace("\\", "/");
+				String srcActual = src;
+				String subDirName = "";
+				int index = src.lastIndexOf("/");
+
+				if (index != -1) {
+					subDirName = src.substring(0, index + 1);
+					srcActual = src.substring(index + 1);
+				}
+				boolean b = src.startsWith("/uploadFile");
+				if(b){
+					image = src;
+				}else{
+					image = "/uploadFile/" + dirName + "/" + subDirName
+							+ (type == 0 ? "" : type + "_") + srcActual;
+				}
+			} else {
+				boolean b = src.startsWith("/uploadFile");
+				if(b){
+					image = src;
+				}else{
+					image = "/uploadFile/" + dirName + "/" + src;
+				}
+			}
+		}else {
+			if(StringUtils.isEmpty(image)) {
+				image = "/public/3.0/img/default/none.jpg";
+			}
+		}
+		return domain + image;
+	}
+
+	public static String getProductImageURL(String image, int type, String domain) {
+//		//https不需要任何过滤
+//		if(image != null && image.startsWith("https:")){
+//			return image;
+//		}
+//
+//		if(image != null && image.startsWith("http:")){
+//			//如果是http:开头则转换为https:(适应https环境)
+//			image = image.replace("http:","https:");
+//			return image;
+//		}
+		if (image == null) {
+			return getImageURL("product", "", type, domain);
+		}
+		return getImageURL("product", image, type, domain);
+	}
+
+	public static String getRandomString(int i) {
+		String s = "23456789ABCDEFGHIJKLMNPQRSTUVWXYZ";
+		String s1 = "";
+		Random random = new Random();
+		for (int j = 0; j < i; j++) {
+			String s2 = (new StringBuilder(String.valueOf(s.charAt(random
+					.nextInt(s.length()))))).toString();
+			s1 = (new StringBuilder(String.valueOf(s1))).append(s2).toString();
+		}
+
+		return s1;
+	}
+
+	public static String generateActivateMessage(String newActivateCode) {
+
+		return "尊敬的采美用户,您的手机短信验证码为:" + newActivateCode;
+	}
+
+	/**
+	 * 随机生成8位大写字母与数字组成的字符串
+	 * @return
+	 */
+	public static String generateRandomCode() {
+		// 8位允许字母与数字的字符串
+		return RandomStringUtils.random(8, true, true).toUpperCase();
+	}
+
+	/**
+	 * 随机生成指定位数字母与数字组成的字符串
+	 * @param length 长度
+	 * @return
+	 */
+	public static String generateRandomCode(int length) {
+		// 允许字母与数字的字符串
+		return RandomStringUtils.random(length, true, true);
+	}
+
+	public static String getClusterRequestIPInfo() {
+		HttpServletRequest appRequest = ServletActionContext.getRequest();
+		if (appRequest.getHeader("X-Real-IP") != null) {
+			return appRequest.getHeader("X-Real-IP");
+		}
+		return appRequest.getRemoteAddr();
+	}
+
+	/**
+	 * 根据商品ID是否展示商品价格
+	 * @param productID
+	 * @return
+	 */
+	public static boolean showPrice(Integer productID){
+		int [] ints={3625,3621,3594,3525,3519,3626,3327,3325,3324,3323,3322,3321,3313,3311,3316,3312,3317,3320,3319,3584,3524,1444,1047,3518,3441,3433};
+		for (int i:ints) {
+			if(productID==i){
+				return false;
+			}
+		}
+		return true;
+	}
+}

+ 4 - 0
src/main/resources/dev/application-dev.yml

@@ -40,3 +40,7 @@ logging:
   file: E:/caimei-mall-admin/catalina.out
   level: debug
 
+#自定义配置
+malladmin:
+  domain: https://www.caimei365.com
+

+ 232 - 0
src/main/resources/mapper/CmMallOrganizeProductsMapper.xml

@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei.modules.products.dao.CmMallOrganizeProductsDao">
+    <sql id="cmMallOrganizeProductsColumns">
+		a.id AS "id",
+		a.classifyID AS "classifyID",
+		a.organizeID AS "organizeID",
+		a.productID AS "productID",
+		a.normalPrice AS "normalPrice",
+		a.costPrice AS "costPrice",
+		a.retailPrice AS "retailPrice",
+		a.minBuyNumber AS "minBuyNumber",
+		a.preferredProduct AS "preferredProduct",
+		a.commonlyProduct AS "commonlyProduct",
+		a.preferentialProduct AS "preferentialProduct",
+		a.validFlag AS "validFlag",
+		a.preferredProductSort AS "preferredProductSort",
+		a.commonlyProductSort AS "commonlyProductSort",
+		a.preferentialProductSort AS "preferentialProductSort",
+		a.addTime AS "addTime",
+		a.updateTime AS "updateTime",
+		a.delFlag AS "delFlag",
+		p.mainImage AS "mainImage",
+		p.name AS "productName",
+		s.name AS "shopName",
+		cmpc.classifyName AS "productClassifyName"
+	</sql>
+
+    <sql id="cmMallOrganizeProductsJoins">
+		LEFT JOIN product p on p.productID = a.productID
+		LEFT JOIN shop s on s.shopID = p.shopID
+		LEFT JOIN cm_mall_products_classify cmpc on cmpc.id = a.classifyID
+	</sql>
+
+    <select id="findList" resultType="com.caimei.modules.products.entity.CmMallOrganizeProducts">
+        SELECT
+        <include refid="cmMallOrganizeProductsColumns"/>
+        FROM cm_mall_organize_products a
+        <include refid="cmMallOrganizeProductsJoins"/>
+        <where>
+
+            <if test="id != null and id != ''">
+                AND a.id = #{id}
+            </if>
+            <if test="productID != null and productID != ''">
+                AND a.productID = #{productID}
+            </if>
+            <if test="organizeID != null and organizeID != ''">
+                AND a.organizeID = #{organizeID}
+            </if>
+            <if test="classifyID != null and classifyID != ''">
+                AND a.classifyID = #{classifyID}
+            </if>
+            <if test="preferredProduct != null and preferredProduct !=  '' and preferredProduct == 1">
+                AND a.preferredProduct = 1
+            </if>
+            <if test="preferredProduct != null and preferredProduct !=  '' and preferredProduct == 0">
+                AND (a.preferredProduct = 0 OR a.preferredProduct is NULL)
+            </if>
+            <if test="commonlyProduct != null and commonlyProduct != '' and commonlyProduct == 1 ">
+                AND a.commonlyProduct = 1
+            </if>
+            <if test="commonlyProduct != null and commonlyProduct != '' and commonlyProduct == 0 ">
+                AND (a.commonlyProduct = 0 OR a.commonlyProduct is NULL )
+            </if>
+            <if test="preferentialProduct != null and preferentialProduct != '' and preferentialProduct == 1">
+                AND a.preferentialProduct = 1
+            </if>
+            <if test="preferentialProduct != null and preferentialProduct != '' and preferentialProduct == 0">
+                AND (a.preferentialProduct = 0 or a.preferentialProduct is NULL)
+            </if>
+            <if test="validFlag != null and validFlag != ''">
+                AND a.validFlag = #{validFlag}
+            </if>
+            <if test="productName != null and productName != ''">
+                AND p.name LIKE concat('%',#{productName},'%')
+            </if>
+            <if test="shopName != null and shopName != ''">
+                AND s.name LIKE concat('%',#{shopName},'%')
+            </if>
+        </where>
+            ORDER BY a.addTime DESC,a.id DESC
+    </select>
+
+    <select id="findAllModule" resultType="com.caimei.modules.products.entity.CmMallPageModules" parameterType="int">
+        SELECT
+          *
+        FROM
+          cm_mall_page_modules
+        WHERE
+          organizeID = #{organizeID}
+    </select>
+
+    <update id="updateProductInfo">
+		UPDATE cm_mall_organize_products SET
+		classifyID = #{classifyID},
+		normalPrice = #{normalPrice},
+		costPrice = #{costPrice},
+		retailPrice = #{retailPrice},
+		minBuyNumber = #{minBuyNumber},
+		updateTime = #{updateTime}
+		WHERE id = #{id}
+	</update>
+
+    <select id="get" resultType="com.caimei.modules.products.entity.CmMallOrganizeProducts">
+        SELECT
+        <include refid="cmMallOrganizeProductsColumns"/>
+        FROM cm_mall_organize_products a
+        <include refid="cmMallOrganizeProductsJoins"/>
+        WHERE a.id = #{id}
+    </select>
+
+    <update id="updateValidFlag">
+        UPDATE cm_mall_organize_products SET
+        <if test="preferredProduct != null and preferredProduct != ''">
+            preferredProduct = #{preferredProduct},
+        </if>
+        <if test="commonlyProduct != null and commonlyProduct != ''">
+            commonlyProduct = #{commonlyProduct},
+        </if>
+        <if test="preferentialProduct != null and preferentialProduct != ''">
+            preferentialProduct = #{preferentialProduct},
+        </if>
+        validFlag = #{validFlag},
+        updateTime = #{updateTime}
+        WHERE id = #{id}
+    </update>
+
+    <update id="saveSort">
+		UPDATE cm_mall_organize_products SET
+		<if test="modules == 1">
+            preferredProductSort = #{preferredProductSort}
+        </if>
+        <if test="modules == 2">
+            preferentialProductSort = #{preferentialProductSort}
+        </if>
+        <if test="modules == 3">
+            commonlyProductSort = #{commonlyProductSort}
+        </if>
+		WHERE id = #{id}
+	</update>
+
+    <select id="findListBuyMall" resultType="com.caimei.modules.products.entity.CmMallOrganizeProducts">
+        SELECT
+        <include refid="cmMallOrganizeProductsColumns"/>
+        FROM cm_mall_organize_products a
+        <include refid="cmMallOrganizeProductsJoins"/>
+        <where>
+
+            <if test="id != null and id != ''">
+                AND a.id = #{id}
+            </if>
+            <if test="productID != null and productID != ''">
+                AND a.productID = #{productID}
+            </if>
+            <if test="organizeID != null and organizeID != ''">
+                AND a.organizeID = #{organizeID}
+            </if>
+            <if test="classifyID != null and classifyID != ''">
+                AND a.classifyID = #{classifyID}
+            </if>
+            <if test="preferredProduct != null and preferredProduct != ''">
+                AND a.preferredProduct = #{preferredProduct}
+            </if>
+            <if test="commonlyProduct != null and commonlyProduct != ''">
+                AND a.commonlyProduct = #{commonlyProduct}
+            </if>
+            <if test="preferentialProduct != null and preferentialProduct != ''">
+                AND a.preferentialProduct = #{preferentialProduct}
+            </if>
+            <if test="productName != null and productName != ''">
+                AND p.name LIKE concat('%',#{productName},'%')
+            </if>
+            <if test="shopName != null and shopName != ''">
+                AND s.name LIKE concat('%',#{shopName},'%')
+            </if>
+            AND a.validFlag = 1
+        </where>
+            ORDER BY a.addTime DESC,a.id DESC
+    </select>
+
+    <select id="getAllExistsProductList" resultType="Integer">
+		SELECT
+		a.id
+		FROM cm_mall_organize_products a
+		WHERE a.delFlag = 0
+		<if test="modules == 1">
+            and a.preferredProduct = 1
+        </if>
+        <if test="modules == 2">
+            and a.preferentialProduct = 1
+        </if>
+        <if test="modules == 3">
+            and a.commonlyProduct = 1
+        </if>
+	</select>
+
+    <update id="updateProductInfo1">
+		UPDATE cm_mall_organize_products SET
+        <if test="modules == 1">
+            preferredProduct = 1,
+        </if>
+        <if test="modules == 2">
+            preferentialProduct = 1,
+        </if>
+        <if test="modules == 3">
+            commonlyProduct = 1,
+        </if>
+		updateTime = #{updateTime}
+		WHERE id = #{id}
+	</update>
+
+    <update id="canncelPreferredProduct">
+		UPDATE cm_mall_organize_products SET
+        <if test="modules == 1">
+            preferredProduct = 0,
+            preferredProductSort = null,
+        </if>
+        <if test="modules == 2">
+            preferentialProduct = 0,
+            preferentialProductSort = null,
+        </if>
+        <if test="modules == 3">
+            commonlyProduct = 0,
+            commonlyProductSort = null,
+        </if>
+		updateTime = #{updateTime}
+		WHERE id = #{id}
+	</update>
+</mapper>

+ 108 - 0
src/main/resources/mapper/CmMallProductsClassifyMapper.xml

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.caimei.modules.products.dao.CmMallProductsClassifyDao">
+    <sql id="cmMallProductsClassifyColumns">
+		a.id AS "id",
+		a.organizeID AS "organizeID",
+		a.classifyName AS "classifyName",
+		a.classifyImage AS "classifyImage",
+		a.sort AS "sort",
+		a.status AS "status",
+		a.addTime AS "addTime",
+		a.updateTime AS "updateTime",
+		a.delFlag AS "delFlag"
+	</sql>
+
+    <select id="findList" resultType="com.caimei.modules.products.entity.CmMallProductsClassify">
+        SELECT
+        <include refid="cmMallProductsClassifyColumns"/>
+        FROM cm_mall_products_classify a
+        <where>
+            a.organizeID = #{organizeID}
+            AND a.delFlag = 0
+        </where>
+            ORDER BY -sort DESC,a.addTime DESC,a.id DESC
+    </select>
+
+    <select id="get" resultType="com.caimei.modules.products.entity.CmMallProductsClassify">
+        SELECT
+        <include refid="cmMallProductsClassifyColumns"/>
+        FROM cm_mall_products_classify a
+        WHERE a.id = #{id}
+        AND a.delFlag = 0
+    </select>
+
+    <select id="getProductsClassifyListByName" resultType="com.caimei.modules.products.entity.CmMallProductsClassify">
+        SELECT
+        <include refid="cmMallProductsClassifyColumns"/>
+        FROM cm_mall_products_classify a
+        <where>
+            a.classifyName = #{classifyName}
+            <if test="id != null and id != ''">
+                AND a.id != #{id}
+            </if>
+        </where>
+        AND a.delFlag = 0
+    </select>
+
+    <insert id="insert" parameterType="com.caimei.modules.products.entity.CmMallProductsClassify"  keyProperty="id" useGeneratedKeys="true">
+		INSERT INTO cm_mall_products_classify(
+			organizeID,
+			classifyName,
+			classifyImage,
+			sort,
+			status,
+			addTime,
+			updateTime,
+			delFlag
+		) VALUES (
+			#{organizeID},
+			#{classifyName},
+			#{classifyImage},
+			#{sort},
+			#{status},
+			#{addTime},
+			#{updateTime},
+			#{delFlag}
+		)
+	</insert>
+
+    <update id="update">
+		UPDATE cm_mall_products_classify SET
+			organizeID = #{organizeID},
+			classifyName = #{classifyName},
+			classifyImage = #{classifyImage},
+			sort = #{sort},
+			status = #{status},
+			addTime = #{addTime},
+			updateTime = #{updateTime}
+		WHERE id = #{id}
+	</update>
+
+    <update id="updateStatus">
+		UPDATE cm_mall_products_classify SET
+		status = #{status},
+		updateTime = #{updateTime}
+		WHERE id = #{id}
+	</update>
+
+    <update id="saveSort">
+		UPDATE cm_mall_products_classify SET
+		sort = #{sort}
+		WHERE id = #{id}
+	</update>
+
+	<!--获取启用且未被删除的商品分类-->
+	<select id="findListByEffective" resultType="com.caimei.modules.products.entity.CmMallProductsClassify">
+		SELECT
+		<include refid="cmMallProductsClassifyColumns"/>
+		FROM cm_mall_products_classify a
+		<where>
+			a.organizeID = #{organizeID}
+			AND a.status = 1
+		</where>
+		AND a.delFlag = 0
+	</select>
+</mapper>

+ 4 - 0
src/main/resources/prod/application-prod.yml

@@ -41,3 +41,7 @@ pagehelper:
 logging:
   file: /mnt/newdatadrive/data/runtime/tomcat-instance/caimei-mall-admin/catalina.out
   level: debug
+
+#自定义配置
+malladmin:
+  domain: https://www.caimei365.com

+ 4 - 0
src/main/resources/test/application-test.yml

@@ -40,3 +40,7 @@ pagehelper:
 logging:
   file: /mnt/newdatadrive/data/runtime/tomcat-instance/caimei-mall-admin/catalina.out
   level: debug
+
+#自定义配置
+malladmin:
+  domain: https://www-b.caimei365.com