Explorar el Código

商品编辑
修改自定义数据权限选择树

qxp hace 5 años
padre
commit
350e3d5f93
Se han modificado 17 ficheros con 615 adiciones y 163 borrados
  1. 1 1
      dgtly-admin/src/main/java/com/dgtly/web/controller/system/SysDeptController.java
  2. 1 1
      dgtly-admin/src/main/java/com/dgtly/web/controller/system/SysUserController.java
  3. 22 2
      dgtly-goods/dgtly-goods-admin/src/main/java/com/dgtly/goods/controller/GoodsInfoController.java
  4. 19 55
      dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/add.html
  5. 469 71
      dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/edit.html
  6. 7 4
      dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/info.html
  7. 7 0
      dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsAttributeMapper.java
  8. 8 0
      dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsColorMapper.java
  9. 1 1
      dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsInfoMapper.java
  10. 8 0
      dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsSizeMapper.java
  11. 50 25
      dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/service/impl/GoodsInfoServiceImpl.java
  12. 3 0
      dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsAttributeMapper.xml
  13. 4 0
      dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsColorMapper.xml
  14. 3 0
      dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsSizeMapper.xml
  15. 2 1
      dgtly-member/dgtly-member-api/src/main/java/com/dgtly/member/controller/CaptchaController.java
  16. 3 1
      dgtly-member/dgtly-member-api/src/main/java/com/dgtly/member/controller/MemberInfoController.java
  17. 7 1
      dgtly-system/src/main/java/com/dgtly/system/service/impl/SysDeptServiceImpl.java

+ 1 - 1
dgtly-admin/src/main/java/com/dgtly/web/controller/system/SysDeptController.java

@@ -191,7 +191,7 @@ public class SysDeptController extends BaseController
     {
         SysUser user = ShiroUtils.getSysUser();
         SysDept dept = new SysDept();
-        dept.setCompanyId(user.getCompanyId());
+
         List<Ztree> ztrees = deptService.selectDeptTree(dept);
         return ztrees;
     }

+ 1 - 1
dgtly-admin/src/main/java/com/dgtly/web/controller/system/SysUserController.java

@@ -73,7 +73,7 @@ public class SysUserController extends BaseController
     public TableDataInfo list(SysUser user)
     {
         SysUser localUser = ShiroUtils.getSysUser();
-        user.setCompanyId(localUser.getCompanyId());
+
         startPage();
         List<SysUser> list = userService.selectUserList(user);
         return getDataTable(list);

+ 22 - 2
dgtly-goods/dgtly-goods-admin/src/main/java/com/dgtly/goods/controller/GoodsInfoController.java

@@ -3,6 +3,7 @@ package com.dgtly.goods.controller;
 import java.awt.*;
 import java.util.List;
 
+import com.dgtly.common.core.text.Convert;
 import com.dgtly.common.exception.BusinessException;
 import com.dgtly.common.utils.StringUtils;
 import com.dgtly.common.utils.file.FileUploadUtils;
@@ -93,13 +94,12 @@ public class GoodsInfoController extends BaseController
     public String add(ModelMap mmp)
     {
         Boolean isSystemUser = false;
-        SysCompany sysCompany;
         /*判断是否是系统内部人员*/
         if(ShiroUtils.getCompanyId()==Long.parseLong(configService.selectConfigByKey("sys.company.id"))){
             isSystemUser=true;
         }
 
-        sysCompany = sysCompanyService.selectSysCompanyById(ShiroUtils.getCompanyId());
+        SysCompany sysCompany = sysCompanyService.selectSysCompanyById(ShiroUtils.getCompanyId());
         mmp.addAttribute("sysCompany",sysCompany);
         mmp.addAttribute("isSystemUser",isSystemUser);
 
@@ -135,8 +135,18 @@ public class GoodsInfoController extends BaseController
     @GetMapping("/edit/{id}")
     public String edit(@PathVariable("id") Long id, ModelMap mmap)
     {
+        Boolean isSystemUser = false;
+        /*判断是否是系统内部人员*/
+        if(ShiroUtils.getCompanyId()==Long.parseLong(configService.selectConfigByKey("sys.company.id"))){
+            isSystemUser=true;
+        }
+
+        SysCompany sysCompany = sysCompanyService.selectSysCompanyById(ShiroUtils.getCompanyId());
+        mmap.put("sysCompany",sysCompany);
+        mmap.put("isSystemUser",isSystemUser);
         GoodsInfo goodsInfo = goodsInfoService.selectGoodsInfoById(id);
         mmap.put("goodsInfo", goodsInfo);
+        mmap.put("slideshows",Convert.toStrArray(goodsInfo.getSlideshow()));
         return prefix + "/edit";
     }
 
@@ -149,6 +159,16 @@ public class GoodsInfoController extends BaseController
     @ResponseBody
     public AjaxResult editSave(GoodsInfo goodsInfo)
     {
+        if(StringUtils.isNotEmpty(goodsInfo.getCover())){
+            //获取base64文件后缀
+            String houzhui = goodsInfo.getCover().split(";")[0].split("\\/")[1];
+            //获取base64值
+            String base64 = goodsInfo.getCover().substring( goodsInfo.getCover().indexOf(",") + 1);
+
+            //base64转文件 并返回展示url
+            String fileUrl = FileUploadUtils.base64ToFile(base64,FileUploadUtils.getDefaultBaseDir()+"/content",System.currentTimeMillis()+"."+houzhui);
+            goodsInfo.setCover(fileUrl);
+        }
         return toAjax(goodsInfoService.updateGoodsInfo(goodsInfo));
     }
 

+ 19 - 55
dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/add.html

@@ -7,8 +7,17 @@
     <th:block th:include="include :: jasny-bootstrap-css" />
     <style type="text/css">
         .slideshow_span{
-            max-width: 200px; max-height: 200px; float: left;margin-right: 10px;
+            width: 140px;
+            height: 140px;
+            float: left;
+            margin-right: 10px;
+            position: relative;
         }
+        .img-slideshow{
+            max-width:100%;
+            max-height:100%
+        }
+
     </style>
 
 </head>
@@ -64,7 +73,7 @@
 
                             </div>
                             <input type="file" id="input-slideshow-add" style="display: none;" onchange="upload_slideshow()"/>
-                            <div class="thumbnail slideshow_span" style="width:70px; font-size: 40px;color: black; text-align: center" id="btn-slideshow-add" >
+                            <div class="thumbnail slideshow_span" style="width:70px;height: 70px; font-size: 40px;color: black; text-align: center" id="btn-slideshow-add" >
                                 <i class="fa fa-plus"></i>
                             </div>
                         </div>
@@ -139,17 +148,6 @@
                 </div>
             </div>
             <div class="row">
-                <div class="col-sm-6">
-                    <div class="form-group ">
-                        <label class="col-sm-2 control-label"><span style="color: red; ">*</span>上架标志:</label>
-                        <div class="col-sm-8">
-                            <div class="radio-box" th:each="dict : ${@dict.getType('goods_putaway')}">
-                                <input type="radio" th:id="${dict.dictCode}" name="putawayFlag" th:value="${dict.dictValue}" th:checked="${dict.default}">
-                                <label th:for="${dict.dictCode}" th:text="${dict.dictLabel}"></label>
-                            </div>
-                        </div>
-                    </div>
-                </div>
                 <div class="col-sm-6">
                     <div class="form-group">
                         <label class="col-sm-2 control-label"><span style="color: red; ">*</span>单重:</label>
@@ -282,47 +280,7 @@
                 }
             });
         }
-        /*****表单校验***********/
-        $("#form-user-edit").validate({
-            onkeyup: false,
-            rules:{
 
-                price:{
-                    required:true,
-                    isPhone:true,
-                    remote: {
-                        url: ctx + "system/user/checkPhoneUnique",
-                        type: "post",
-                        dataType: "json",
-                        data: {
-                            "userId": function() {
-                                return $("#userId").val();
-                            },
-                            "phonenumber": function() {
-                                return $.common.trim($("#phonenumber").val());
-                            }
-                        },
-                        dataFilter: function (data, type) {
-                            return $.validate.unique(data);
-                        }
-                    }
-                },
-            },
-            messages: {
-                "userName": {
-                    required: "请输入用户名称",
-                },
-                "email": {
-                    required: "请输入邮箱",
-                    remote: "Email已经存在"
-                },
-                "phonenumber":{
-                    required: "请输入手机号码",
-                    remote: "手机号码已经存在"
-                }
-            },
-            focusCleanup: true
-        });
         /*********************提交*********************************/
         function submitHandler() {
 
@@ -450,7 +408,7 @@
             var htmlStr='';
             htmlStr+='<tr><td class="input-group" style="padding: 0">';
             htmlStr+='  <input name="goodsSizes['+sizeIndex+'].size" class="form-control required" type="text" required>'
-            htmlStr+='<span class="input-group-addon"><i class="fa fa-remove remove"></i></span>'
+            htmlStr+='  <span class="input-group-addon"><i class="fa fa-remove remove"></i></span>'
             htmlStr+='</td></tr>';
             sizeIndex++
             $("#tbody-size").append(htmlStr)
@@ -474,7 +432,6 @@
 
         /*******************轮播图添加图片************************/
         $("#btn-slideshow-add").click(function(){
-
             $("#input-slideshow-add").click();
         })
         function  upload_slideshow(){
@@ -495,6 +452,8 @@
                         var htmlStr='';
                         htmlStr+='<div class="thumbnail slideshow_span" >'+
                             '   <img class="img-slideshow" src="'+result.data.fileName+'">' +
+                            '   <a class="close-link" style="position: absolute;right: 3%; top: 0;"' +
+                            '       onclick="remove_slideshow(this)"><i class="fa fa-times"></i></a>'+
                             '</div>'
                         $("#div-slideshow-list").append(htmlStr);
                     } else {
@@ -506,6 +465,11 @@
                 }
             });
         }
+        function remove_slideshow(self){
+            console.log(self)
+            var _this = $(self).parent();
+            _this.remove();
+        }
     </script>
 </body>
 </html>

+ 469 - 71
dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/edit.html

@@ -1,115 +1,513 @@
 <!DOCTYPE html>
 <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
 <head>
-    <th:block th:include="include :: header('修改商品基础详情')" />
+    <th:block th:include="include :: header('新增商品基础详情')" />
+    <th:block th:include="include :: summernote-css" />
     <th:block th:include="include :: datetimepicker-css" />
+    <th:block th:include="include :: jasny-bootstrap-css" />
+    <style type="text/css">
+        .slideshow_span{
+            width: 140px;
+            height: 140px;
+            float: left;
+            margin-right: 10px;
+            position: relative;
+        }
+        .img-slideshow{
+            max-width:100%;
+            max-height:100%
+        }
+
+    </style>
+
 </head>
 <body class="white-bg">
-    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
-        <form class="form-horizontal m" id="form-info-edit" th:object="${goodsInfo}">
-            <input name="id" th:field="*{id}" type="hidden">
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">商品名称:</label>
-                <div class="col-sm-8">
-                    <input name="name" th:field="*{name}" class="form-control" type="text" required>
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+    <form class="form-horizontal m" id="form-info-add"  th:object="${goodsInfo}">
+        <input name="id" th:value="*{id}" type="hidden">
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>商品名称:</label>
+                    <div class="col-sm-8">
+                        <input name="name" class="form-control required" type="text" required th:field="*{name}">
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">所属商户id:</label>
-                <div class="col-sm-8">
-                    <input name="companyId" th:field="*{companyId}" class="form-control" type="text" required>
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>一口价:</label>
+                    <div class="col-sm-8">
+                        <input name="price" class="form-control number" type="text"  th:field="*{price}" required>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">所属类型id:</label>
-                <div class="col-sm-8">
-                    <input name="typeId" th:field="*{typeId}" class="form-control" type="text" required>
+        </div>
+        <!--封面和轮播图-->
+        <div class="row">
+            <div class="col-sm-3">
+                <div class="form-group">
+                    <input id="input_cover" name="cover" type="hidden"/>
+                    <label class="col-sm-4 control-label"><span style="color: red; ">*</span>封面图:</label>
+                    <div class="col-sm-8">
+                        <div class="fileinput fileinput-new" data-provides="fileinput">
+                            <div class="fileinput-new thumbnail" style="width: 140px; height: 140px;">
+                                 <img id="img-cover" th:src="@{*{cover}}">
+                            </div>
+                            <div id="fmz" class="fileinput-preview fileinput-exists thumbnail" style="max-width: 400px; max-height: 300px;">
+
+                            </div>
+                            <div>
+                                <span class="btn btn-white btn-file"><span class="fileinput-new">选择图片</span><span class="fileinput-exists">更改</span><input type="file"></span>
+                                <a href="#" class="btn btn-white fileinput-exists" data-dismiss="fileinput">清除</a>
+                            </div>
+                        </div>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">一口价:</label>
-                <div class="col-sm-8">
-                    <input name="price" th:field="*{price}" class="form-control" type="text">
+            <div class="col-sm-8">
+                <div class="form-group">
+                    <input id="input_slideshow" name="slideshow" type="hidden" th:field="*{slideshow}"/>
+                    <label class="col-sm-1 control-label">轮播图:</label>
+                    <div class="col-sm-11">
+                        <div id="div-slideshow-list" th:each="item,it:${slideshows}">
+                            <div class="thumbnail slideshow_span" >
+                               <img class="img-slideshow" th:src="${item}">
+                               <a class="close-link" style="position: absolute;right: 3%; top: 0;"
+                                   onclick="remove_slideshow(this)"><i class="fa fa-times"></i></a>
+                            </div>
+                        </div>
+                        <input type="file" id="input-slideshow-add" style="display: none;" onchange="upload_slideshow()"/>
+                        <div class="thumbnail slideshow_span" style="width:70px;height: 70px; font-size: 40px;color: black; text-align: center" id="btn-slideshow-add" >
+                            <i class="fa fa-plus"></i>
+                        </div>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">封面图片:</label>
-                <div class="col-sm-8">
-                    <textarea name="cover" class="form-control">[[*{cover}]]</textarea>
+        </div>
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <input name="typeId" type="hidden" id="input_typeId"  th:field="*{typeId}">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>所属分类:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group">
+                            <input name="typeName" onclick="selectTypeTree()" th:field="*{typeName}"
+                                   id="input_typeTreeName" type="text" placeholder="请选择所属分类"
+                                   class="form-control required" readonly="readonly" required>
+                            <span class="input-group-addon"><i class="fa fa-search"></i></span>
+                        </div>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">轮播图,号分隔:</label>
-                <div class="col-sm-8">
-                    <textarea name="slideshow" class="form-control">[[*{slideshow}]]</textarea>
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <input name="companyId" type="hidden" id="input_companyId" th:value="${sysCompany.id}">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>所属商户:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group">
+                            <input name="companyName" onclick="selectCompanyList()" id="input_companyTreeName" type="text" placeholder="请选择所属商户"
+                                   th:value="${sysCompany.companyName}"  class="form-control required" th:disabled="@{!${isSystemUser}}" required>
+                            <span class="input-group-addon"><i class="fa fa-search"></i></span>
+                        </div>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">编辑器生成的详细描述html:</label>
-                <div class="col-sm-8">
-                    <textarea name="des" class="form-control" required>[[*{des}]]</textarea>
+        </div>
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>生产地点:</label>
+                    <div class="col-sm-8">
+                        <textarea name="producedAddress" class="form-control required" required>[[*{producedAddress}]]</textarea>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">配送方式:</label>
-                <div class="col-sm-8">
-                    <textarea name="delivery" class="form-control">[[*{delivery}]]</textarea>
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>仓库地址:</label>
+                    <div class="col-sm-8">
+                        <textarea name="warehouseAddress" class="form-control required" required>[[*{warehouseAddress}]]</textarea>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">生产日期:</label>
-                <div class="col-sm-8">
-                    <div class="input-group date">
-                        <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
-                        <input name="producedTime" th:value="${#dates.format(goodsInfo.producedTime, 'yyyy-MM-dd')}" class="form-control" placeholder="yyyy-MM-dd" type="text">
+        </div>
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group ">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>生产日期:</label>
+                    <div class="col-sm-8">
+                        <div class="input-group date">
+                            <span class="input-group-addon"><i class="fa fa-calendar"></i></span>
+                            <input name="producedTime" class="form-control required" placeholder="yyyy-MM-dd"
+                                   th:value="${#dates.format(goodsInfo.producedTime, 'yyyy-MM-dd')}" type="text" required>
+                        </div>
                     </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">生产地点:</label>
-                <div class="col-sm-8">
-                    <textarea name="producedAddress" class="form-control">[[*{producedAddress}]]</textarea>
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>配送方式:</label>
+                    <div class="col-sm-8">
+                        <input name="delivery"  class="form-control required" placeholder="请输入配送方式" type="text" required  th:field="*{delivery}">
+                    </div>
                 </div>
             </div>
-            <div class="form-group">
-                <label class="col-sm-3 control-label">供货仓库地址:</label>
-                <div class="col-sm-8">
-                    <textarea name="warehouseAddress" class="form-control">[[*{warehouseAddress}]]</textarea>
+        </div>
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"><span style="color: red; ">*</span>单重:</label>
+                    <div class="col-sm-8">
+                        <input name="weight" class="form-control" type="text" required th:field="*{weight}">
+                    </div>
+                </div>
+            </div>
+        </div>
+        <!--规格和颜色-->
+        <div class="row">
+            <div class="col-sm-6">
+                <div class="form-group ">
+                    <label class="col-sm-2 control-label"></label>
+                    <div class="col-sm-6">
+                        <table class="table table-bordered table-striped">
+                            <thead>
+                            <tr style="background-color: #1ab394;color: white;">
+                                <th >规格</th>
+                            </tr>
+                            </thead>
+                            <tbody id="tbody-size" >
+                                <tr th:each="item,it:*{goodsSizes}">
+                                    <td class="input-group" style="padding: 0">
+                                    <input th:attr="name='goodsSizes['+${it.index}+'].size'" th:value="${item.size}" class="form-control required" type="text" required>
+                                    <span class="input-group-addon"><i class="fa fa-remove remove"></i></span>
+                                </td></tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="col-sm-2">
+                        <a class="btn btn-white btn-bitbucket" id="btn-size-add">
+                            <i class="fa fa-plus"></i>
+                        </a>
+                    </div>
+                </div>
+            </div>
+            <div class="col-sm-6">
+                <div class="form-group">
+                    <label class="col-sm-2 control-label"></label>
+                    <div class="col-sm-6">
+                        <table class="table table-bordered table-striped">
+                            <thead>
+                            <tr style="background-color: #1ab394;color: white;">
+                                <th >颜色</th>
+                            </tr>
+                            </thead>
+                            <tbody id="tbody-color" >
+                                <tr th:each="item,it:*{goodsColors}">
+                                    <td class="input-group" style="padding: 0">
+                                        <input th:attr="name='goodsColors['+${it.index}+'].color'" th:value="${item.color}" class="form-control required" type="text" required>
+                                        <span class="input-group-addon"><i class="fa fa-remove remove"></i></span>
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <div class="col-sm-2">
+                        <a class="btn btn-white btn-bitbucket" id="btn-color-add">
+                            <i class="fa fa-plus"></i>
+                        </a>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">单重:</label>
-                <div class="col-sm-8">
-                    <input name="weight" th:field="*{weight}" class="form-control" type="text">
+        </div>
+        <!--动态属性-->
+        <div class="row" >
+            <div class="form-group">
+                <label class="col-sm-1 control-label"><span style="color: red; ">*</span>属性:</label>
+                <div class="col-sm-10">
+                    <div class="panel panel-primary">
+                        <div class="panel-heading">
+                            <h5>动态属性列表(选择分类后加载)</h5>
+                        </div>
+                        <div class="panel-body">
+                            <div class="row" id="div_area">
+                                <div class="col-sm-6"  th:each="item,it:*{goodsAttributes}">
+                                    <div class="form-group">
+                                        <label class="col-sm-2 control-label"><span style="color: red; ">*</span>[[${item.attributeName}]]:</label>
+                                        <div class="col-sm-8">
+                                            <input th:attr="name='goodsAttributes['+${it.index}+'].attributeId'"
+                                                   th:value="${item.attributeId}"  class="form-control" type="hidden">
+                                            <input th:attr="name='goodsAttributes['+${it.index}+'].attributeName'"
+                                                   th:value="${item.attributeName}" class="form-control" type="hidden">
+                                            <input th:attr="name='goodsAttributes['+${it.index}+'].value'"
+                                                   th:value="${item.value}" class="form-control required" type="text" required>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
                 </div>
             </div>
-            <div class="form-group">    
-                <label class="col-sm-3 control-label">上架标志:</label>
-                <div class="col-sm-8">
-                    <input name="putawayFlag" th:field="*{putawayFlag}" class="form-control" type="text" required>
+        </div>
+        <br/>
+        <div class="row">
+            <div class="form-group">
+                <label class="col-sm-1 control-label"><span style="color: red; ">*</span>描述:</label>
+                <div class="col-sm-10">
+                    <input id="input_des" name="des" type="hidden" th:field="*{des}" required>
+                    <div class="summernote"></div>
                 </div>
             </div>
-        </form>
-    </div>
-    <th:block th:include="include :: footer" />
-    <th:block th:include="include :: datetimepicker-js" />
-    <script type="text/javascript">
-        var prefix = ctx + "system/info";
-        $("#form-info-edit").validate({
+        </div>
+    </form>
+</div>
+<th:block th:include="include :: footer" />
+<th:block th:include="include :: summernote-js" />
+<th:block th:include="include :: datetimepicker-js" />
+<th:block th:include="include :: jasny-bootstrap-js" />
+<script type="text/javascript">
+    var isSystemUser = [[${isSystemUser}]];
+    var prefix = ctx + "goods/info"
+    var sizeIndex=([[${goodsInfo.goodsSizes.size()}]])?[[${goodsInfo.goodsSizes.size()}]]:0;
+    var colorIndex=([[${goodsInfo.goodsColors.size()}]])?[[${goodsInfo.goodsColors.size()}]]:0;
+    $(function(){
+
+        var content = $("#input_des").val();
+        $('.summernote').summernote('code', content);
+
+        $('.summernote').summernote({
+            placeholder: '请输入内容',
+            height : 192,
+            lang : 'zh-CN',
+            followingToolbar: false,
+            callbacks: {
+                onImageUpload: function (files) {
+                    sendFile(files[0], this);
+                }
+            }
+        });
+        $("#form-info-add").validate({
             focusCleanup: true
         });
 
-        function submitHandler() {
-            if ($.validate.form()) {
-                $.operate.save(prefix + "/edit", $('#form-info-edit').serialize());
-            }
-        }
+        $('.remove').on('click',function(){
+            $(this).parent().parent().parent('tr').remove();
+        });
+
+
+        /*******************规格表格动态添加值*********************************************/
+        $("#btn-size-add").on('click',function(){
+            var htmlStr='';
+            htmlStr+='<tr><td class="input-group" style="padding: 0">';
+            htmlStr+='  <input name="goodsSizes['+sizeIndex+'].size" class="form-control required" type="text" required>'
+            htmlStr+='  <span class="input-group-addon"><i class="fa fa-remove remove"></i></span>'
+            htmlStr+='</td></tr>';
+            sizeIndex++
+            $("#tbody-size").append(htmlStr)
+
+        })
+        /*******************颜色表格动态添加值*********************************************/
+        $("#btn-color-add").on('click',function(){
+            var htmlStr='';
+            htmlStr+='<tr><td class="input-group" style="padding: 0">';
+            htmlStr+='  <input name="goodsColors['+colorIndex+'].color" class="form-control required" type="text" required>'
+            htmlStr+='  <span class="input-group-addon"><i class="fa fa-remove remove"></i></span>'
+            htmlStr+='</td></tr>';
+            colorIndex++
+            $("#tbody-color").append(htmlStr);
+
+        })
+
+        /*******************轮播图添加图片************************/
+        $("#btn-slideshow-add").on('click',function(){
+            $("#input-slideshow-add").click();
+        })
 
         $("input[name='producedTime']").datetimepicker({
             format: "yyyy-mm-dd",
             minView: "month",
             autoclose: true
         });
-    </script>
+    })
+
+    /*********************提交*********************************/
+    function submitHandler() {
+
+        if ($.validate.form()) {
+            /*遍历轮播图*/
+            var obj = $("img[class='img-slideshow']")
+            var srcStr ='';
+            if(obj.length>0){
+                for(var i =0;i<obj.length;i++){
+                    srcStr += $(obj[i]).attr('src');
+                    srcStr += ',';
+                }
+                srcStr =  srcStr.substr(0,srcStr.length-1)
+                $("#input_slideshow").val(srcStr);
+            }
+            var sHTML = $('.summernote').summernote('code');
+            $("#input_des").val(sHTML);
+            if(sHTML==undefined||sHTML==''){
+                $.modal.alertWarning("请添加商品描述");
+                return;
+            }
+            var file = $('#fmz').find('img').attr('src');
+
+            if(file != undefined){
+                $('#input_cover').val(file);
+            }
+            $.operate.save(prefix + "/edit", $('#form-info-add').serialize());
+        }else{
+            $.modal.alertError("表单填写有误,请重新填写后提交");
+        }
+    }
+
+    /************************上传文件******************************/
+    function sendFile(file, obj) {
+        var data = new FormData();
+        data.append("file", file);
+        $.ajax({
+            type: "POST",
+            url: ctx + "common/upload",
+            data: data,
+            cache: false,
+            contentType: false,
+            processData: false,
+            dataType: 'json',
+            success: function(result) {
+                if (result.code == web_status.SUCCESS) {
+                    $(obj).summernote('editor.insertImage', result.data.url, result.data.fileName);
+                } else {
+                    $.modal.alertError(result.msg);
+                }
+            },
+            error: function(error) {
+                $.modal.alertWarning("图片上传失败。");
+            }
+        });
+    }
+
+    /******************选择分类树**********************************/
+    function selectTypeTree() {
+        var typeId = "0";
+        var url = ctx + "goods/type/selectTypeTree/" + typeId;
+        var options1 = {
+            title: '选择商品类型',
+            width: "380",
+            url: url,
+            callBack: selectType
+        };
+        $.modal.openOptions(options1);
+    }
+    function selectType(index, layero){
+        var tree = layero.find("iframe")[0].contentWindow.$._tree;
+        var body = layer.getChildFrame('body', index);
+        $("#input_typeId").val(body.find('#treeId').val());
+        $("#input_typeTreeName").val(body.find('#treeName').val());
+        getTypyAttributu($("#input_typeId").val());
+        layer.close(index);
+    }
+    /**********************获取分类信息****************************/
+    function getTypyAttributu(id){
+        console.log(id)
+        $.ajax({
+            type: "POST",
+            url: ctx + "goods/type/getInfo/"+id,
+            contentType: false,
+            cache: false,
+            dataType: 'json',
+            success: function(result) {
+                if (result.code == web_status.SUCCESS) {
+                    resolverType(result.data)
+                } else {
+                    $.modal.alertError(result.msg);
+                }
+            },
+            error: function(error) {
+                $.modal.alertWarning("获取分类属性失败!");
+            }
+        });
+    }
+    /************************解析分类属性类表***************************/
+    function resolverType(goodsType){
+        $("#div_area").html("");
+        var objs = goodsType.goodsTypeAttributes;
+        var len= objs.length;
+        var str ="";
+        for (i = 0; i < len; i++) {
+            str += ' <div class="col-sm-6">' +
+                '                    <div class="form-group">' +
+                '                        <label class="col-sm-2 control-label"><span style="color: red; ">*</span>'+objs[i].attributeName+':</label>' +
+                '                        <div class="col-sm-8">' +
+                '                            <input name="goodsAttributes['+i+'].attributeId" class="form-control" type="hidden" value="'+objs[i].id+'" >' +
+                '                            <input name="goodsAttributes['+i+'].attributeName" class="form-control" type="hidden" value="'+objs[i].attributeName+'" >' +
+                '                            <input name="goodsAttributes['+i+'].value" class="form-control required" type="text" required>' +
+                '                        </div>' +
+                '                    </div>' +
+                '                </div>'
+        }
+        $("#div_area").html(str);
+    }
+
+    /******************选择商户列表**********************************/
+    function selectCompanyList() {
+        if(!isSystemUser){
+            return
+        }
+        var url = ctx + "company/tree";
+        var options2 = {
+            title: '选择商户',
+            width: "700",
+            url: url,
+            callBack: selectCompany
+        };
+        $.modal.openOptions(options2);
+    }
+    function selectCompany(index, layero){
+        var body = layer.getChildFrame('body', index);
+        $("#input_companyId").val(body.find('#treeId').val());
+        $("#input_companyTreeName").val(body.find('#treeName').val());
+        layer.close(index);
+    }
+
+
+    function  upload_slideshow(){
+        if ($("#input-slideshow-add").val() == '') {
+            return;
+        }var data = new FormData();
+        data.append('file', document.getElementById('input-slideshow-add').files[0]);
+        $.ajax({
+            url:ctx+"common/upload",
+            type:"post",
+            data: data,
+            cache: false,
+            contentType: false,
+            processData: false,
+            dataType: 'json',
+            success: function(result) {
+                if (result.code == web_status.SUCCESS) {
+                    var htmlStr='';
+                    htmlStr+='<div class="thumbnail slideshow_span" >'+
+                        '   <img class="img-slideshow" src="'+result.data.fileName+'">' +
+                        '   <a class="close-link" style="position: absolute;right: 3%; top: 0;"' +
+                        '       onclick="remove_slideshow(this)"><i class="fa fa-times"></i></a>'+
+                        '</div>'
+                    $("#div-slideshow-list").append(htmlStr);
+                } else {
+                    $.modal.alertError(result.msg);
+                }
+            },
+            error:function(result) {
+                alert("上传失败")
+            }
+        });
+    }
+    function remove_slideshow(self){
+        console.log(self)
+        var _this = $(self).parent();
+        _this.remove();
+    }
+</script>
 </body>
 </html>

+ 7 - 4
dgtly-goods/dgtly-goods-admin/src/main/resources/templates/goods/info/info.html

@@ -131,14 +131,17 @@
                         if(!isSystemUser){
                             if(row.putawayFlag=="0"){
                                 actions.push('<a class="btn btn-success btn-xs ' + putawayFlag + '" onclick="putaway('+row.id+',1)" shiro:hasPermission="goods:info:putaway"><i class="fa fa-edit"></i> 上架</a> ');
+                                actions.push('<a class="btn btn-warning btn-xs ' + editFlag + '"   href="javascript:void(0)" onclick="$.operate.editFull('+row.id+')" shiro:hasPermission="goods:info:putaway"><i class="fa fa-edit"></i> 编辑</a> ');
+                                actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '"  onclick="$.operate.remove(\'' + row.id + '\')" shiro:hasPermission="goods:info:remove"><i class="fa fa-remove"></i>删除</a> ');
                             }else if(row.putawayFlag=="1"){
                                 actions.push('<a class="btn btn-warning btn-xs ' + putawayFlag + '" onclick="putaway('+row.id+',0)" shiro:hasPermission="goods:info:putaway"><i class="fa fa-download"></i> 下架</a> ');
+                                actions.push('<a class="btn btn-primary btn-xs " shiro:hasPermission="goods:info:putaway"><i class="fa fa-edit"></i>查看详情</a> ');
                             }
-                            if(row.putawayFlag!=1){
-                                actions.push('<a class="btn btn-danger btn-xs ' + removeFlag + '"  onclick="$.operate.remove(\'' + row.id + '\')" shiro:hasPermission="goods:info:remove"><i class="fa fa-remove"></i>删除</a> ');
-                            }
+
+                        }else{
+                            actions.push('<a class="btn btn-primary btn-xs " shiro:hasPermission="goods:info:putaway"><i class="fa fa-edit"></i>查看详情</a> ');
                         }
-                        actions.push('<a class="btn btn-primary btn-xs " shiro:hasPermission="goods:info:putaway"><i class="fa fa-edit"></i>查看详情</a> ');
+
                         return actions.join('');
                     }
                 }]

+ 7 - 0
dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsAttributeMapper.java

@@ -46,4 +46,11 @@ public interface GoodsAttributeMapper
      * @return
      */
     public int insertGoodsAttributeList(@Param("list") List<GoodsAttribute> list, @Param("goodsId") Long goodsId);
+    /**
+     * 根据商品id删除
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteGoodsAttributeByGoodsId(Long goodsId);
 }

+ 8 - 0
dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsColorMapper.java

@@ -30,4 +30,12 @@ public interface GoodsColorMapper
      * @return 结果
      */
     public int insertGoodsColorList(@Param("list") List<GoodsColor> list, @Param("goodsId") Long goodsId);
+
+    /**
+     * 根据商品id删除
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteGoodsColorByGoodsId(Long goodsId);
 }

+ 1 - 1
dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsInfoMapper.java

@@ -91,5 +91,5 @@ public interface GoodsInfoMapper
      * @auther: qxp
      * @date: 2020/3/3 10:43
      */
-    List<GoodsInfo> selectGoodsInfoByIds(String ids);
+    List<GoodsInfo> selectGoodsInfoByIds(String[] ids);
 }

+ 8 - 0
dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/mapper/GoodsSizeMapper.java

@@ -29,4 +29,12 @@ public interface GoodsSizeMapper
      * @return 结果
      */
     public int insertGoodsSizeList(@Param("list") List<GoodsSize> list, @Param("goodsId") Long goodsId);
+
+    /**
+     * 根据商品id删除
+     *
+     * @param ids 需要删除的数据ID
+     * @return 结果
+     */
+    int deleteGoodsSizeByGoodsId(Long goodsId);
 }

+ 50 - 25
dgtly-goods/dgtly-goods-common/src/main/java/com/dgtly/goods/service/impl/GoodsInfoServiceImpl.java

@@ -71,30 +71,8 @@ public class GoodsInfoServiceImpl implements IGoodsInfoService
     {
         goodsInfo.setCreateTime(DateUtils.getNowDate());
         int num = goodsInfoMapper.insertGoodsInfo(goodsInfo);
-        if(goodsInfo.getGoodsAttributes()!=null&&goodsInfo.getGoodsAttributes().size()>0)
-        {
-            List<GoodsAttribute> goodsAttributeList = goodsInfo.getGoodsAttributes();
-            int i = goodsAttributeMapper.insertGoodsAttributeList(goodsAttributeList,goodsInfo.getId());
-            if (i!=goodsAttributeList.size()){
-                throw  new RuntimeException("插入商品属性数量不符");
-            }
-        }
-        if(goodsInfo.getGoodsColors()!=null&&goodsInfo.getGoodsColors().size()>0)
-        {
-            List<GoodsColor> goodsColorList = goodsInfo.getGoodsColors();
-            int i = goodsColorMapper.insertGoodsColorList(goodsColorList,goodsInfo.getId());
-            if (i!=goodsColorList.size()){
-                throw  new RuntimeException("插入商品颜色数量不符");
-            }
-        }
-        if(goodsInfo.getGoodsSizes()!=null&&goodsInfo.getGoodsSizes().size()>0)
-        {
-            List<GoodsSize> goodsSizeList = goodsInfo.getGoodsSizes();
-            int i = goodsSizeMapper.insertGoodsSizeList(goodsSizeList,goodsInfo.getId());
-            if (i!=goodsSizeList.size()){
-                throw  new RuntimeException("插入商品规格数量不符");
-            }
-        }
+        /*处理 属性 颜色 规格等数据*/
+        handleAttributeSizeColor(goodsInfo);
         return num;
     }
 
@@ -105,9 +83,13 @@ public class GoodsInfoServiceImpl implements IGoodsInfoService
      * @return 结果
      */
     @Override
+    @Transactional
     public int updateGoodsInfo(GoodsInfo goodsInfo)
     {
         goodsInfo.setUpdateTime(DateUtils.getNowDate());
+        /*处理 属性 颜色 规格等数据*/
+        handleAttributeSizeColor(goodsInfo);
+
         return goodsInfoMapper.updateGoodsInfo(goodsInfo);
     }
 
@@ -179,6 +161,49 @@ public class GoodsInfoServiceImpl implements IGoodsInfoService
      */
     @Override
     public List<GoodsInfo> selectGoodsInfoByIds(String ids) {
-        return goodsInfoMapper.selectGoodsInfoByIds(ids);
+        return goodsInfoMapper.selectGoodsInfoByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * @descption: 用于更新或插入 商品属性、颜色、规格
+     * @param:
+     * @return:
+     * @auther: qxp
+     * @date: 2020/3/3 10:43
+     */
+    @Transactional
+    public void handleAttributeSizeColor(GoodsInfo goodsInfo){
+
+        goodsAttributeMapper.deleteGoodsAttributeByGoodsId(goodsInfo.getId());
+        if(goodsInfo.getGoodsAttributes()!=null&&goodsInfo.getGoodsAttributes().size()>0)
+        {
+            List<GoodsAttribute> goodsAttributeList = goodsInfo.getGoodsAttributes();
+            int i = goodsAttributeMapper.insertGoodsAttributeList(goodsAttributeList,goodsInfo.getId());
+            if (i!=goodsAttributeList.size()){
+                throw  new RuntimeException("插入商品属性数量不符");
+            }
+        }
+
+        goodsColorMapper.deleteGoodsColorByGoodsId(goodsInfo.getId());
+        if(goodsInfo.getGoodsColors()!=null&&goodsInfo.getGoodsColors().size()>0)
+        {
+            List<GoodsColor> goodsColorList = goodsInfo.getGoodsColors();
+            int i = goodsColorMapper.insertGoodsColorList(goodsColorList,goodsInfo.getId());
+            if (i!=goodsColorList.size()){
+                throw  new RuntimeException("插入商品颜色数量不符");
+            }
+        }
+
+        goodsSizeMapper.deleteGoodsSizeByGoodsId(goodsInfo.getId());
+        if(goodsInfo.getGoodsSizes()!=null&&goodsInfo.getGoodsSizes().size()>0)
+        {
+            List<GoodsSize> goodsSizeList = goodsInfo.getGoodsSizes();
+            int i = goodsSizeMapper.insertGoodsSizeList(goodsSizeList,goodsInfo.getId());
+            if (i!=goodsSizeList.size()){
+                throw  new RuntimeException("插入商品规格数量不符");
+            }
+        }
     }
+
+
 }

+ 3 - 0
dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsAttributeMapper.xml

@@ -63,5 +63,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{id}
         </foreach>
     </delete>
+    <delete id="deleteGoodsAttributeByGoodsId" parameterType="Long">
+        delete from goods_attribute where goods_id =#{goods_id}
+    </delete>
     
 </mapper>

+ 4 - 0
dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsColorMapper.xml

@@ -52,5 +52,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </insert>
 
+    <delete id="deleteGoodsColorByGoodsId" parameterType="Long">
+        delete from goods_color where goods_id =#{goods_id}
+    </delete>
+
 
 </mapper>

+ 3 - 0
dgtly-goods/dgtly-goods-common/src/main/resources/mapper/goods/GoodsSizeMapper.xml

@@ -40,6 +40,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
         </foreach>
     </insert>
+    <delete id="deleteGoodsSizeByGoodsId" parameterType="Long">
+        delete from goods_size where goods_id =#{goods_id}
+    </delete>
 
     
 </mapper>

+ 2 - 1
dgtly-member/dgtly-member-api/src/main/java/com/dgtly/member/controller/CaptchaController.java

@@ -68,7 +68,8 @@ public class CaptchaController extends BaseController
                 bi = captchaProducer.createImage(capStr);
             }*/
             session.setAttribute(Constants.KAPTCHA_SESSION_KEY, code);
-            System.out.println("注册sessionId:"+session.getId());
+            logger.info("获取验证码sessionId:"+session.getId());
+
             out = response.getOutputStream();
             ImageIO.write(bi, "jpg", out);
             out.flush();

+ 3 - 1
dgtly-member/dgtly-member-api/src/main/java/com/dgtly/member/controller/MemberInfoController.java

@@ -91,7 +91,9 @@ public class MemberInfoController extends ApiBaseController {
        //获取验证码
         HttpSession httpSession = getSession();
         String key = httpSession.getAttribute(Constants.KAPTCHA_SESSION_KEY)+"";
-
+        logger.info("登录是sessionId:"+httpSession.getId());
+        logger.info("登录sessionCode:"+key);
+        logger.info("登录ValidateCode:"+memberInfo.getValidateCode());
         if(null != key && key.equals(memberInfo.getValidateCode())){
             MemberInfo memberInfo1 = iMemberInfoService.memberLogin(memberInfo);
             if(memberInfo1 == null){

+ 7 - 1
dgtly-system/src/main/java/com/dgtly/system/service/impl/SysDeptServiceImpl.java

@@ -63,11 +63,17 @@ public class SysDeptServiceImpl implements ISysDeptService
      * @return 部门列表(数据权限)
      */
     @Override
+    @DataScope(deptAlias = "d")
     public List<Ztree> roleDeptTreeData(SysRole role)
     {
         Long roleId = role.getRoleId();
         List<Ztree> ztrees = new ArrayList<Ztree>();
-        List<SysDept> deptList = selectDeptList(new SysDept());
+        /*处理 注解添加的DataScope代码 传递一下*/
+        SysDept sysDept = new SysDept();
+        sysDept.setParams(role.getParams());
+
+        List<SysDept> deptList = deptMapper.selectDeptList(sysDept);
+
         if (StringUtils.isNotNull(roleId))
         {
             List<String> roleDeptList = deptMapper.selectRoleDeptTree(roleId);