7 mesiacov pred
rodič
commit
29e4f3acb2

+ 28 - 4
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/product/controller/ProdController.java

@@ -5,8 +5,10 @@ import com.xingxi.common.core.controller.BaseController;
 import com.xingxi.common.core.domain.AjaxResult;
 import com.xingxi.common.core.page.TableDataInfo;
 import com.xingxi.common.enums.BusinessType;
+import com.xingxi.common.enums.EProdStatus;
 import com.xingxi.common.utils.poi.ExcelUtil;
 import com.xingxi.master.product.domain.Prod;
+import com.xingxi.web.controller.master.product.domain.ProdVo;
 import com.xingxi.web.controller.master.product.service.IProdVoService;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.stereotype.Controller;
@@ -42,9 +44,9 @@ public class ProdController extends BaseController {
     @RequiresPermissions("master:product:list")
     @PostMapping("/list")
     @ResponseBody
-    public TableDataInfo list(Prod prod) {
+    public TableDataInfo list(ProdVo prodVo) {
         startPage();
-        List<Prod> list = prodVoService.selectProdList(prod);
+        List<ProdVo> list = prodVoService.selectProdVoList(prodVo);
         return getDataTable(list);
     }
 
@@ -86,8 +88,8 @@ public class ProdController extends BaseController {
     @RequiresPermissions("master:product:edit")
     @GetMapping("/edit/{id}")
     public String edit(@PathVariable("id") Long id, ModelMap mMap) {
-        Prod prod = prodVoService.selectProdById(id);
-        mMap.put("prod", prod);
+        ProdVo prodVo = prodVoService.selectProdVoById(id);
+        mMap.put("prodVo", prodVo);
         return prefix + "/edit";
     }
 
@@ -112,4 +114,26 @@ public class ProdController extends BaseController {
     public AjaxResult remove(String ids) {
         return toAjax(prodVoService.logicDeleteProdByIds(ids));
     }
+
+    /**
+     * 审核商品
+     */
+    @RequiresPermissions("master:product:approve")
+    @PostMapping("/approve")
+    @ResponseBody
+    public AjaxResult approve(Prod prod) {
+        prod.setProdStatus(EProdStatus.APPROVED.getVal());
+        return toAjax(prodVoService.updateProd(prod));
+    }
+
+    /**
+     * 审核商品
+     */
+    @RequiresPermissions("master:product:approve")
+    @PostMapping("/reject")
+    @ResponseBody
+    public AjaxResult reject(Prod prod) {
+        prod.setProdStatus(EProdStatus.REJECTED.getVal());
+        return toAjax(prodVoService.updateProd(prod));
+    }
 }

+ 8 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/product/mapper/ProdVoMapper.java

@@ -1,5 +1,6 @@
 package com.xingxi.web.controller.master.product.mapper;
 
+import com.xingxi.master.designer.domain.Designer;
 import com.xingxi.master.product.domain.ProdClass;
 import com.xingxi.master.product.mapper.ProdMapper;
 import com.xingxi.web.controller.master.product.domain.ProdVo;
@@ -37,4 +38,11 @@ public interface ProdVoMapper extends ProdMapper {
      * @return 商品分类列表
      */
     List<ProdClass> selectProdClassList();
+
+    /**
+     * 查询设计师列表
+     *
+     * @return 设计师列表
+     */
+    List<Designer> selectDesignerList();
 }

+ 6 - 1
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/controller/master/product/service/impl/ProdCommonService.java

@@ -1,5 +1,6 @@
 package com.xingxi.web.controller.master.product.service.impl;
 
+import com.xingxi.master.designer.domain.Designer;
 import com.xingxi.master.product.domain.ProdClass;
 import com.xingxi.web.controller.master.product.mapper.ProdVoMapper;
 import org.springframework.stereotype.Component;
@@ -20,7 +21,11 @@ public class ProdCommonService {
         this.prodVoMapper = prodVoMapper;
     }
 
-    public List<ProdClass> getProdClasses(){
+    public List<ProdClass> getProdClasses() {
         return prodVoMapper.selectProdClassList();
     }
+
+    public List<Designer> getDesigners() {
+        return prodVoMapper.selectDesignerList();
+    }
 }

+ 9 - 5
08.src/Xingxi/xingxi-admin/src/main/resources/mapper/ProdVoMapper.xml

@@ -15,13 +15,13 @@
         <result property="createTime"           column="createTime"         />
         <result property="updateUser"           column="updateUser"         />
         <result property="updateTime"           column="updateTime"         />
-        <result property="prodClass"            column="prodClass"          />
+        <result property="prodClass"            column="className"          />
         <result property="ipName"               column="ipName"             />
         <result property="designerName"         column="designerName"       />
     </resultMap>
 
     <sql id="selectProdVo">
-        select id
+        select m_prod.id
              , m_prod.prodClassId
              , m_prod.prodName
              , m_prod.ipId
@@ -40,7 +40,7 @@
 
     <select id="selectProdVoList" parameterType="ProdVo" resultMap="ProdResult">
         <include refid="selectProdVo"/>
-        <where>  
+        <where>
             <if test="prodClassId != null "> and m_prod.prodClassId = #{prodClassId}</if>
             <if test="prodName != null  and prodName != ''"> and m_prod.prodName like concat('%', #{prodName}, '%')</if>
             <if test="ipId != null "> and ipId = #{ipId}</if>
@@ -49,7 +49,7 @@
             <if test="prodStatus != null  and prodStatus != ''"> and m_prod.prodStatus = #{prodStatus}</if>
             <if test="thirdIdConfirmFlag != null  and thirdIdConfirmFlag != ''"> and m_prod.thirdIdConfirmFlag = #{thirdIdConfirmFlag}</if>
             <if test="delFlag != null  and delFlag != ''"> and m_prod.delFlag = #{delFlag}</if>
-            <if test="className != null  and className != ''"> and m_prod_class.className like concat('%', #{className}, '%')</if>
+            <if test="prodClass != null  and prodClass != ''"> and m_prod_class.className like concat('%', #{prodClass}, '%')</if>
             <if test="designerName != null  and designerName != ''"> and m_designer.designerName like concat('%', #{designerName}, '%')</if>
             <if test="ipName != null  and ipName != ''"> and m_ipinfo.ipName like concat('%', #{ipName}, '%')</if>
         </where>
@@ -57,10 +57,14 @@
     
     <select id="selectProdVoById" parameterType="Long" resultMap="ProdResult">
         <include refid="selectProdVo"/>
-        where id = #{id}
+        where m_prod.id = #{id}
     </select>
 
     <select id="selectProdClassList" parameterType="String" resultType="ProdClass">
         select * from m_prod_class where delFlag = '0'
     </select>
+
+    <select id="selectDesignerList" parameterType="String" resultType="Designer">
+        select * from m_designer where delFlag = '0'
+    </select>
 </mapper>

+ 1 - 3
08.src/Xingxi/xingxi-admin/src/main/resources/static/ruoyi/js/common.js

@@ -2,13 +2,11 @@
  * 通用方法封装处理
  * Copyright (c) 2019 ruoyi 
  */
-
 var startLayDate;
 var endLayDate;
 var isScrollToTop = parent.isScrollToTop;
 
 $(function() {
-	
     // 回到顶部绑定
     if ($.fn.toTop !== undefined) {
         $('#scroll-up').toTop();
@@ -36,7 +34,7 @@ $(function() {
 	
     // 取消回车自动提交表单
     $(document).on("keypress", ":input:not(textarea):not([type=submit])", function(event) {
-        if (event.keyCode == 13) {
+        if (event.keyCode === 13) {
             event.preventDefault();
         }
     });

+ 1 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/templates/include.html

@@ -36,6 +36,7 @@
     <script th:src="@{/ajax/libs/iCheck/icheck.min.js?v=1.0.3}"></script>
 	<script th:src="@{/ajax/libs/layer/layer.min.js?v=3.7.0}"></script>
 	<script th:src="@{/ajax/libs/layui/layui.min.js?v=2.8.18}"></script>
+	<!-- 共通插件 -->
 	<script th:src="@{/ruoyi/js/common.js?v=4.7.9}"></script>
 	<script th:src="@{/ruoyi/js/ry-ui.js?v=4.7.9}"></script>
 </div>

+ 92 - 2
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prod/add.html

@@ -2,6 +2,9 @@
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
 <head>
     <th:block th:include="include :: header('新增推荐商品')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+    <th:block th:include="include :: summernote-css" />
 </head>
 <body class="white-bg">
     <div class="wrapper wrapper-content animated fadeInRight ibox-content">
@@ -10,7 +13,7 @@
                 <div class="form-group">
                     <label class="col-sm-3 control-label">商品分类:</label>
                     <div class="col-sm-8">
-                        <select name="prodClass" class="form-control m-b" th:with="prodClasses=${@product.getProdClasses()}" >
+                        <select name="prodClassId" class="form-control" th:with="prodClasses=${@product.getProdClasses()}" >
                             <option value="">所有</option>
                             <option th:each="prodClass : ${prodClasses}" th:text="${prodClass.className}" th:value="${prodClass.prodClassId}"></option>
                         </select>
@@ -36,18 +39,105 @@
                     </div>
                 </div>
             </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">设计师:</label>
+                    <div class="col-sm-8">
+                        <select name="designerId" class="form-control m-b" th:with="designers=${@product.getDesigners()}" th:field="*{designerId}" >
+                            <option value="">所有</option>
+                            <option th:each="designer : ${designers}" th:text="${designer.designerName}" th:value="${designer.id}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商品描述:</label>
+                    <div class="col-sm-10" style="margin-left: 80px;">
+                        <div class="summernote" style="border: red;" id="summernote"></div>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <input type="button" onclick="test()">
+            </div>
         </form>
     </div>
     <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <th:block th:include="include :: summernote-js" />
     <script th:inline="javascript">
         var prefix = ctx + "master/product/prod"
         $("#form-prod-add").validate({
             focusCleanup: true
         });
 
+        $(document).ready(function () {
+            // 富文本框
+            $(".summernote").summernote({
+                lang: 'zh-CN',
+                callbacks:{
+                    onImageUpload: function (files) {
+                        var fileSize = 0;
+                        fileSize = files[0].size;
+                        fileSize=Math. round( fileSize/1024*100)/100;
+
+                        if(fileSize>2048){
+                            layer.msg('上传文件不得大于2M,请重新上传。', {time: 3000, icon:6});
+                            return false;
+                        }
+
+                        if (!/image\/\w+/.test(files[0].type)) {
+                            layer.msg('上传的不是图片文件,请重新上传。', {time: 3000, icon:6});
+                            return false;
+                        }
+
+                        var formData = new FormData();
+                        formData.append('imageFile', files[0]);
+                        $.ajax({
+                            url : ctx + "common/upload/file/image",
+                            type : 'POST',
+                            data : formData,
+                            processData : false,
+                            contentType : false,
+                            success : function(result) {
+                                $('.summernote').summernote('insertImage', result.imageUrl);
+                            },error:function(){
+                                $.modal.alertError("上传失败");
+                            }
+                        });
+                    }
+                },
+                height: 600,
+                toolbar: [
+                    ['style', ['fontname', 'bold', 'italic', 'underline', 'clear']],
+                    ['font', ['strikethrough', 'superscript', 'subscript']],
+                    ['fontsize', ['fontsize', 'undo', 'redo']],
+                    ['color', ['color']],
+                    ['para', ['ul', 'ol', 'paragraph']],
+                    ['height', ['height']],
+                    ['insert', ['picture', 'table']],
+                    ['search', ['findnreplace', 'changecolor']]
+                ],
+            });
+        });
+
         function submitHandler() {
             if ($.validate.form()) {
-                $.operate.save(prefix + "/add", $('#form-prod-add').serialize());
+                var form = document.getElementById("form-prod-add");
+                var formData = new FormData(form);
+                formData.append("description", $('#summernote').summernote('code'));
+                $.ajax({
+                    url: prefix + "/add",
+                    data: formData,
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    success: function(result) {
+                        $.operate.successCallback(result);
+                    }
+                });
             }
         }
     </script>

+ 100 - 9
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prod/edit.html

@@ -2,47 +2,138 @@
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
 <head>
     <th:block th:include="include :: header('修改推荐商品')" />
+    <th:block th:include="include :: select2-css" />
+    <th:block th:include="include :: bootstrap-select-css" />
+    <th:block th:include="include :: summernote-css" />
 </head>
 <body class="white-bg">
     <div class="wrapper wrapper-content animated fadeInRight ibox-content">
-        <form class="form-horizontal m" id="form-prod-edit" th:object="${tSuggestProd}">
+        <form class="form-horizontal m" id="form-prod-edit" th:object="${prodVo}">
             <input name="id" th:field="*{id}" type="hidden">
             <div class="col-xs-12">
                 <div class="form-group">
-                    <label class="col-sm-3 control-label">商品ID:</label>
+                    <label class="col-sm-3 control-label">商品分类:</label>
                     <div class="col-sm-8">
-                        <input name="prodId" th:field="*{prodId}" class="form-control" type="text">
+                        <select name="prodClassId" class="form-control" th:with="prodClasses=${@product.getProdClasses()}" th:field="*{prodClassId}" >
+                            <option value="">所有</option>
+                            <option th:each="prodClass : ${prodClasses}" th:text="${prodClass.className}" th:value="${prodClass.prodClassId}"></option>
+                        </select>
                     </div>
                 </div>
             </div>
             <div class="col-xs-12">
                 <div class="form-group">
-                    <label class="col-sm-3 control-label">顺序:</label>
+                    <label class="col-sm-3 control-label">商品名称:</label>
                     <div class="col-sm-8">
-                        <input name="sort" th:field="*{sort}" class="form-control" type="text">
+                        <input name="prodName" class="form-control" type="text" th:field="*{prodName}">
                     </div>
                 </div>
             </div>
             <div class="col-xs-12">
                 <div class="form-group">
-                    <label class="col-sm-3 control-label">删除标志:</label>
+                    <label class="col-sm-3 control-label">文创名称:</label>
                     <div class="col-sm-8">
-                        <input name="delFlag" th:field="*{delFlag}" class="form-control" type="text">
+                        <select name="ipId" class="form-control m-b" th:with="ipInfos=${@ipInfo.getIpInfos()}" th:field="*{ipId}" >
+                            <option value="">所有</option>
+                            <option th:each="ipInfo : ${ipInfos}" th:text="${ipInfo.ipName}" th:value="${ipInfo.ipId}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">设计师:</label>
+                    <div class="col-sm-8">
+                        <select name="designerId" class="form-control m-b" th:with="designers=${@product.getDesigners()}" th:field="*{designerId}" >
+                            <option value="">所有</option>
+                            <option th:each="designer : ${designers}" th:text="${designer.designerName}" th:value="${designer.id}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label">商品描述:</label>
+                    <div class="col-sm-10" style="margin-left: 80px">
+                        <div class="summernote" style="border: red;" id="summernote"></div>
                     </div>
                 </div>
             </div>
         </form>
     </div>
     <th:block th:include="include :: footer" />
+    <th:block th:include="include :: select2-js" />
+    <th:block th:include="include :: bootstrap-select-js" />
+    <th:block th:include="include :: summernote-js" />
     <script th:inline="javascript">
-        var prefix = ctx + "system/prod";
+        var prefix = ctx + "master/product/prod"
+        $(".summernote").summernote({
+            lang: 'zh-CN',
+            callbacks:{
+                onImageUpload: function (files) {
+                    var fileSize = 0;
+                    fileSize = files[0].size;
+                    fileSize=Math. round( fileSize/1024*100)/100;
+
+                    if(fileSize>2048){
+                        layer.msg('上传文件不得大于2M,请重新上传。', {time: 3000, icon:6});
+                        return false;
+                    }
+
+                    if (!/image\/\w+/.test(files[0].type)) {
+                        layer.msg('上传的不是图片文件,请重新上传。', {time: 3000, icon:6});
+                        return false;
+                    }
+
+                    var formData = new FormData();
+                    formData.append('imageFile', files[0]);
+                    $.ajax({
+                        url : ctx + "common/upload/file/image",
+                        type : 'POST',
+                        data : formData,
+                        processData : false,
+                        contentType : false,
+                        success : function(result) {
+                            $('.summernote').summernote('insertImage', result.imageUrl);
+                        },error:function(){
+                            $.modal.alertError("上传失败");
+                        }
+                    });
+                }
+            },
+            height: 600,
+            toolbar: [
+                ['style', ['fontname', 'bold', 'italic', 'underline', 'clear']],
+                ['font', ['strikethrough', 'superscript', 'subscript']],
+                ['fontsize', ['fontsize', 'undo', 'redo']],
+                ['color', ['color']],
+                ['para', ['ul', 'ol', 'paragraph']],
+                ['height', ['height']],
+                ['insert', ['picture', 'table']],
+                ['search', ['findnreplace', 'changecolor']]
+            ],
+        });
+        $('.summernote').summernote('code', [[${prodVo.description}]]);
+
         $("#form-prod-edit").validate({
             focusCleanup: true
         });
 
         function submitHandler() {
             if ($.validate.form()) {
-                $.operate.save(prefix + "/edit", $('#form-prod-edit').serialize());
+                var form = document.getElementById("form-prod-edit");
+                var formData = new FormData(form);
+                formData.append("description", $('#summernote').summernote('code'));
+                $.ajax({
+                    url: prefix + "/edit",
+                    data: formData,
+                    type: "post",
+                    processData: false,
+                    contentType: false,
+                    success: function(result) {
+                        $.operate.successCallback(result);
+                    }
+                });
             }
         }
     </script>

+ 28 - 8
08.src/Xingxi/xingxi-admin/src/main/resources/templates/master/product/prod/prod.html

@@ -75,8 +75,11 @@
     <th:block th:include="include :: footer" />
     <script th:inline="javascript">
         var editFlag = [[${@permission.hasPermi('master:product:prod:edit')}]];
-        var removeFlag = [[${@permission.hasPermi('master:product:prod:add:remove')}]];
+        var removeFlag = [[${@permission.hasPermi('master:product:prod:remove')}]];
+        var approveFlag = [[${@permission.hasPermi('master:product:prod:approve')}]];
         var prefix = ctx + "master/product/prod";
+        var prodStatuses = [[${@dict.getType('prod_status')}]];
+        console.log(prodStatuses)
 
         $(function() {
             var options = {
@@ -104,20 +107,25 @@
                         title: '设计师名称'
                     },
                     {
-                        field: 'prodDesc',
-                        title: '商品描述'
-                    },
-                    {
                         field: 'prodStatus',
-                        title: '商品状态'
+                        title: '商品状态',
+                        formatter: function (value, row, index) {
+                            return $.table.selectDictLabel(prodStatuses, value);
+                        }
                     },
                     {
                         title: '操作',
                         align: 'center',
                         formatter: function(value, row, index) {
                             var actions = [];
-                            actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
-                            actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                            if (row.prodStatus === 'SAVED') {
+                                actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                                actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a> ');
+                            }
+                            if (row.prodStatus === 'SUBMITTED') {
+                                actions.push('<a class="btn btn-warning btn-xs ' + approveFlag + '" href="javascript:void(0)" onclick="approve(\'' + row.id + '\')"><i class="fa fa-thumbs-o-up"></i>审核</a> ');
+                                actions.push('<a class="btn btn-warning btn-xs ' + approveFlag + '" href="javascript:void(0)" onclick="reject(\'' + row.id + '\')"><i class="fa fa-thumbs-o-down"></i>驳回</a>');
+                            }
                             return actions.join('');
                         }
                     }
@@ -125,6 +133,18 @@
             };
             $.table.init(options);
         });
+
+        function approve(id) {
+            $.modal.confirm("确认同意该商品的申请吗?", function() {
+                $.operate.post(prefix + "/approve", {"id": id});
+            });
+        }
+
+        function reject(id) {
+            $.modal.confirm("确认驳回该商品的申请吗?", function() {
+                $.operate.post(prefix + "/reject/", {"id": id});
+            });
+        }
     </script>
 </body>
 </html>

+ 22 - 0
08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/EProdStatus.java

@@ -0,0 +1,22 @@
+package com.xingxi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @program: xingxi
+ * @description: prod status
+ * @author: dong
+ * @create: 2020-01-12 19:40
+ */
+@AllArgsConstructor
+@Getter
+public enum EProdStatus {
+    SAVED("SAVED", "已保存"),
+    DELETED("DELETED", "已删除"),
+    SUBMITTED("SUBMITTED", "已提交"),
+    APPROVED("APPROVED", "审核通过"),
+    REJECTED("REJECTED", "已驳回");
+    private String val;
+    private String desc;
+}