From 6699cdfa0ebf67724e018264b53d8c6e07e92e58 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 22 Sep 2021 10:01:57 +0800
Subject: [PATCH] 20210922
---
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java | 6
src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java | 136 +++++
src/main/resources/templates/febs/views/modules/product/categoryAdd.html | 2
src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java | 92 +++
src/main/resources/templates/febs/views/modules/product/categoryUpdate.html | 124 ++++
src/main/resources/templates/febs/views/modules/product/categoryList.html | 25
pom.xml | 6
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java | 35 +
src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsCategoryVo.java | 18
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java | 3
src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html | 28 -
src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml | 7
src/main/resources/mapper/modules/MallGoodsMapper.xml | 32 +
src/main/resources/templates/febs/views/modules/goods/goodsAdd.html | 299 +++++++++++
src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsVo.java | 35 +
src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsSkuDto.java | 24
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java | 3
src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html | 328 ++++++++++++
src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java | 16
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java | 27 +
src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java | 46 +
src/main/java/cc/mrbird/febs/common/utils/OssUtils.java | 32 +
src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java | 10
src/main/resources/templates/febs/views/modules/goods/goodsList.html | 179 ++++++
24 files changed, 1,463 insertions(+), 50 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3ca16cf..b71dc83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,10 +22,16 @@
<swagger.ui>2.9.2</swagger.ui>
<tomcat.version>9.0.31</tomcat.version>
<hutool.version>5.3.1</hutool.version>
+ <aliyun-oss.version>3.8.0</aliyun-oss.version>
</properties>
<dependencies>
<dependency>
+ <groupId>com.aliyun.oss</groupId>
+ <artifactId>aliyun-sdk-oss</artifactId>
+ <version>${aliyun-oss.version}</version>
+ </dependency>
+ <dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
diff --git a/src/main/java/cc/mrbird/febs/common/utils/OssUtils.java b/src/main/java/cc/mrbird/febs/common/utils/OssUtils.java
new file mode 100644
index 0000000..e9c1420
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/common/utils/OssUtils.java
@@ -0,0 +1,32 @@
+package cc.mrbird.febs.common.utils;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import lombok.extern.slf4j.Slf4j;
+import sun.misc.BASE64Decoder;
+
+import java.io.ByteArrayInputStream;
+
+@Slf4j
+public class OssUtils {
+
+ private static String END_POINT = "https://oss-cn-hangzhou.aliyuncs.com";
+ private static String ACCESS_KEY_ID = "LTAI4GBuydqbJ5bTsDP97Lpd";
+ private static String ACCESS_KEY_SECRET = "vbCjQtPxABWjqtUlQfzjlA0qAY96fh";
+ private static String bucket_name = "https://excoin.oss-cn-hangzhou.aliyuncs.com";
+
+ public static boolean uploadFileWithBase64(String base64, String pathName) {
+ ByteArrayInputStream stream = null;
+ try {
+ OSS ossClient = new OSSClientBuilder().build(END_POINT, ACCESS_KEY_ID,ACCESS_KEY_SECRET);
+ BASE64Decoder decoder = new BASE64Decoder();
+ byte[] bytes = decoder.decodeBuffer(base64);
+ stream = new ByteArrayInputStream(bytes);
+ ossClient.putObject("excoin", pathName, stream);
+ return true;
+ } catch (Exception e) {
+ log.error("#上传失败:{}#", e);
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java
new file mode 100644
index 0000000..83fffc1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallGoodsController.java
@@ -0,0 +1,92 @@
+package cc.mrbird.febs.mall.controller;
+
+
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.common.utils.OssUtils;
+import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
+import cc.mrbird.febs.mall.entity.MallGoods;
+import cc.mrbird.febs.mall.entity.MallGoodsCategory;
+import cc.mrbird.febs.mall.service.IAdminMallGoodsService;
+import cn.hutool.core.util.IdUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Encoder;
+
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/goods")
+public class AdminMallGoodsController extends BaseController {
+
+ private final IAdminMallGoodsService adminMallGoodsService;
+
+ /**
+ * 图片上传
+ * @return
+ */
+ @PostMapping(value = "/uploadFileBase64")
+ @ControllerEndpoint(operation = "图片上传", exceptionMessage = "上传失败")
+ public Map<String,Object> uploadFileBase64(@RequestBody @Validated MultipartFile file) {
+ if (file.isEmpty()) {
+ new FebsResponse().message("上传文件为空");
+ }
+
+ //文件加密
+ BASE64Encoder base64Encoder =new BASE64Encoder();
+ String base64EncoderImg = null;
+ try {
+ base64EncoderImg = base64Encoder.encode(file.getBytes());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ String imageFuffix = ".png";
+ String imageNames = System.currentTimeMillis() + IdUtil.simpleUUID() + imageFuffix;
+ String imageName = "uploadeFile/" + imageNames;
+ OssUtils.uploadFileWithBase64(base64EncoderImg, imageName);
+ String bucket_name ="https://excoin.oss-cn-hangzhou.aliyuncs.com";
+ String url = bucket_name + "/" + imageName;
+
+ Map<String,Object> map = new HashMap<String,Object>();
+ Map<String,Object> map2 = new HashMap<String,Object>();
+ map.put("code",0);//0表示成功,1失败
+ map.put("msg","上传成功");//提示消息
+ map.put("data",map2);
+ map2.put("src",url);//图片url
+ map2.put("title",imageNames);//图片名称,这个会显示在输入框里
+ return map;
+ }
+
+ /**
+ * 商品列表
+ * @param mallGoods
+ * @param request
+ * @return
+ */
+ @GetMapping("goodsList")
+ public FebsResponse getGoodsList(MallGoods mallGoods, QueryRequest request) {
+ Map<String, Object> data = getDataTable(adminMallGoodsService.getCategoryListInPage(mallGoods, request));
+ return new FebsResponse().success().data(data);
+ }
+
+ /**
+ * 商品-新增
+ */
+ @PostMapping("addMallGoods")
+ @ControllerEndpoint(operation = " 商品-新增", exceptionMessage = "新增失败")
+ public FebsResponse addMallGoods(@RequestBody @Valid AddMallGoodsDto addMallGoodsDto) {
+ return adminMallGoodsService.addMallGoods(addMallGoodsDto);
+ }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java
index 1cc8936..fe7a54e 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsCategoryController.java
@@ -3,16 +3,25 @@
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
+import cc.mrbird.febs.mall.service.IAdminMallMemberService;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
+import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
+import cc.mrbird.febs.mall.vo.MallMemberVo;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller("categoryView")
@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/product")
@RequiredArgsConstructor
public class ViewMallGoodsCategoryController extends BaseController {
+
+ private final IAdminMallGoodsCategoryService mallGoodsCategoryService;
/**
* 商品分类列表
@@ -25,9 +34,27 @@
}
+ /**
+ * 商品分类-新增
+ * @return
+ */
@GetMapping("categoryAdd")
@RequiresPermissions("categoryAdd:add")
public String helpCenterAdd() {
return FebsUtil.view("modules/product/categoryAdd");
}
+
+ /**
+ * 商品分类-详情
+ * @param id
+ * @param model
+ * @return
+ */
+ @GetMapping("categoryUpdate/{id}")
+ @RequiresPermissions("categoryUpdate:update")
+ public String detail(@PathVariable long id, Model model) {
+ AdminMallGoodsCategoryVo data = mallGoodsCategoryService.getMallGoodsCategoryInfoById(id);
+ model.addAttribute("member", data);
+ return FebsUtil.view("modules/product/categoryUpdate");
+ }
}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java
new file mode 100644
index 0000000..2f30889
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallGoodsController.java
@@ -0,0 +1,46 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller("goodsView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/goods")
+@RequiredArgsConstructor
+public class ViewMallGoodsController extends BaseController {
+
+ /**
+ * 商品列表
+ * @return
+ */
+ @GetMapping("goodsList")
+ @RequiresPermissions("goodsList:view")
+ public String categoryList() {
+ return FebsUtil.view("modules/goods/goodsList");
+ }
+
+ /**
+ * 商品-新增
+ * @return
+ */
+ @GetMapping("goodsAdd")
+ @RequiresPermissions("goodsAdd:add")
+ public String helpCenterAdd() {
+ return FebsUtil.view("modules/goods/goodsAddNew");
+ }
+
+ /**
+ * 商品-新增
+ * @return
+ */
+ @GetMapping("goodsAddNew")
+ @RequiresPermissions("goodsAddNew:add")
+ public String goodsAddNew() {
+ return FebsUtil.view("modules/goods/goodsAddNew");
+ }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java
new file mode 100644
index 0000000..cbabf33
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsDto.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "AddMallGoodsDto", description = "参数接收类")
+public class AddMallGoodsDto {
+
+ private String goodsNo;
+
+ private String goodsName;
+
+ private List<AddMallGoodsSkuDto> addMallGoodsSkuDtos;
+
+ private String goodsIntrodution;
+
+ private String unit;
+
+ private String thumb;
+
+ private String goodsDetails;
+
+ private Integer isSale;
+
+ private String originalPrice;
+
+ private String presentPrice;
+
+ private Long categoryId;
+
+ private Integer isHot;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsSkuDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsSkuDto.java
new file mode 100644
index 0000000..308ab52
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AddMallGoodsSkuDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "AddMallGoodsSkuDto", description = "参数接收类")
+public class AddMallGoodsSkuDto {
+
+ private String skuName;
+
+ private String skuImage;
+
+ private Integer stock;
+
+ private Integer skuVolume;
+
+ private String originalPrice;
+
+ private String presentPrice;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java
index f735576..116636a 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsCategoryMapper.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
import cc.mrbird.febs.mall.vo.MallGoodsCategoryVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -22,4 +23,6 @@
List<MallGoodsCategory> selectCategoryListByParentId(@Param("id") Long id);
List<MallGoodsCategory> selectRecommendCategoryList();
+
+ AdminMallGoodsCategoryVo getMallGoodsCategoryInfoById(@Param("id")long id);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
index 275006c..6340e58 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
@@ -2,14 +2,22 @@
import cc.mrbird.febs.mall.dto.MallGoodsQueryDto;
import cc.mrbird.febs.mall.entity.MallGoods;
-import cc.mrbird.febs.mall.entity.MallGoodsCategory;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
import cc.mrbird.febs.mall.vo.MallGoodsListVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
public interface MallGoodsMapper extends BaseMapper<MallGoods> {
IPage<MallGoodsListVo> selectMallGoodsListQueryInPage(@Param("record") MallGoodsQueryDto queryDto, Page<MallGoodsListVo> page);
+
+ IPage<AdminMallGoodsVo> selectMallGoodsInPage(Page<AdminMallGoodsVo> page, @Param("record")MallGoods mallGoods);
+
+ Integer selectMallGoodsCountByGoodsName(@Param("goodsName")String goodsName);
+
+ Integer selectMallGoodsCountByGoodsNo(@Param("goodsNo")String goodsNo);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java
index 561d6fb..c0deb97 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsCategoryService.java
@@ -3,6 +3,7 @@
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.entity.QueryRequest;
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
import cc.mrbird.febs.system.entity.Role;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -16,4 +17,6 @@
FebsResponse addCategory(MallGoodsCategory mallGoodsCategory);
List<MallGoodsCategory> getCategorys(MallGoodsCategory mallGoodsCategory);
+
+ AdminMallGoodsCategoryVo getMallGoodsCategoryInfoById(long id);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java
new file mode 100644
index 0000000..97df00b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallGoodsService.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
+import cc.mrbird.febs.mall.entity.MallGoods;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface IAdminMallGoodsService extends IService<MallGoods> {
+
+ IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request);
+
+ FebsResponse addMallGoods(AddMallGoodsDto addMallGoodsDto);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java
index 0fdcdf7..2b4b187 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsCategoryService.java
@@ -5,6 +5,7 @@
import cc.mrbird.febs.mall.entity.MallGoodsCategory;
import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper;
import cc.mrbird.febs.mall.service.IAdminMallGoodsCategoryService;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@@ -67,4 +68,9 @@
return mallGoodsCategorys;
}
+ @Override
+ public AdminMallGoodsCategoryVo getMallGoodsCategoryInfoById(long id) {
+ return mallGoodsCategoryMapper.getMallGoodsCategoryInfoById(id);
+ }
+
}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java
new file mode 100644
index 0000000..1712fff
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallGoodsService.java
@@ -0,0 +1,136 @@
+package cc.mrbird.febs.mall.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.AddMallGoodsDto;
+import cc.mrbird.febs.mall.dto.AddMallGoodsSkuDto;
+import cc.mrbird.febs.mall.entity.MallGoods;
+import cc.mrbird.febs.mall.entity.MallGoodsCategory;
+import cc.mrbird.febs.mall.entity.MallGoodsSku;
+import cc.mrbird.febs.mall.entity.MallGoodsStyle;
+import cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper;
+import cc.mrbird.febs.mall.mapper.MallGoodsMapper;
+import cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper;
+import cc.mrbird.febs.mall.mapper.MallGoodsStyleMapper;
+import cc.mrbird.febs.mall.service.IAdminMallGoodsService;
+import cc.mrbird.febs.mall.vo.AdminMallGoodsVo;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AdminMallGoodsService extends ServiceImpl<MallGoodsMapper, MallGoods> implements IAdminMallGoodsService {
+
+ private final MallGoodsCategoryMapper mallGoodsCategoryMapper;
+ private final MallGoodsMapper mallGoodsMapper;
+ private final MallGoodsSkuMapper mallGoodsSkuMapper;
+ private final MallGoodsStyleMapper mallGoodsStyleMapper;
+
+ @Override
+ public IPage<AdminMallGoodsVo> getCategoryListInPage(MallGoods mallGoods, QueryRequest request) {
+ Page<AdminMallGoodsVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+ IPage<AdminMallGoodsVo> adminMallGoodsVos = this.baseMapper.selectMallGoodsInPage(page, mallGoods);
+ return adminMallGoodsVos;
+ }
+
+ @Override
+ public FebsResponse addMallGoods(AddMallGoodsDto addMallGoodsDto) {
+ String goodsName = addMallGoodsDto.getGoodsName();
+ if(StrUtil.isEmpty(goodsName)){
+ return new FebsResponse().fail().message("商品名称不能为空");
+ }
+ Integer mallGoodsByGoodsName = mallGoodsMapper.selectMallGoodsCountByGoodsName(goodsName);
+ if(mallGoodsByGoodsName > 0){
+ return new FebsResponse().fail().message("商品名称不能重复");
+ }
+ String goodsNo = addMallGoodsDto.getGoodsNo();
+ if(StrUtil.isEmpty(goodsNo)){
+ return new FebsResponse().fail().message("商品编号不能为空");
+ }
+ Integer mallGoodsByGoodsNo = mallGoodsMapper.selectMallGoodsCountByGoodsNo(goodsNo);
+ if(mallGoodsByGoodsNo > 0){
+ return new FebsResponse().fail().message("商品编号不能重复");
+ }
+ Long categoryId = addMallGoodsDto.getCategoryId();
+ if(ObjectUtil.isEmpty(categoryId)){
+ return new FebsResponse().fail().message("商品分类不能为空");
+ }
+ //新增商品
+ MallGoods mallGoods = new MallGoods();
+ mallGoods.setGoodsNo(addMallGoodsDto.getGoodsNo());
+ mallGoods.setGoodsName(addMallGoodsDto.getGoodsName());
+ mallGoods.setGoodsIntrodution(addMallGoodsDto.getGoodsIntrodution());
+ mallGoods.setUnit(addMallGoodsDto.getUnit());
+ mallGoods.setThumb(addMallGoodsDto.getThumb());
+ mallGoods.setGoodsDetails(addMallGoodsDto.getGoodsDetails());
+ mallGoods.setOriginalPrice(addMallGoodsDto.getOriginalPrice());
+ mallGoods.setCategoryId(addMallGoodsDto.getCategoryId());
+ mallGoods.setPresentPrice(addMallGoodsDto.getPresentPrice());
+ mallGoods.setIsHot(addMallGoodsDto.getIsHot());
+ mallGoods.setIsSale(2);
+ mallGoodsMapper.insert(mallGoods);
+
+ List<AddMallGoodsSkuDto> addMallGoodsSkuDtos = addMallGoodsDto.getAddMallGoodsSkuDtos();
+ if(CollUtil.isNotEmpty(addMallGoodsSkuDtos)){
+ for(AddMallGoodsSkuDto addMallGoodsSkuDto : addMallGoodsSkuDtos){
+ //新增样式
+ MallGoodsStyle mallGoodsStyle = new MallGoodsStyle();
+ mallGoodsStyle.setName(addMallGoodsSkuDto.getSkuName());
+ mallGoodsStyle.setGoodsId(mallGoods.getId());
+ mallGoodsStyleMapper.insert(mallGoodsStyle);
+
+ //新增商品规格
+ MallGoodsSku mallGoodsSku = new MallGoodsSku();
+ mallGoodsSku.setSkuName(addMallGoodsSkuDto.getSkuName());
+ mallGoodsSku.setSkuImage(addMallGoodsSkuDto.getSkuImage());
+ mallGoodsSku.setStock(addMallGoodsSkuDto.getStock());
+ mallGoodsSku.setSkuVolume(addMallGoodsSkuDto.getSkuVolume());
+ mallGoodsSku.setOriginalPrice(new BigDecimal(addMallGoodsSkuDto.getOriginalPrice()));
+ mallGoodsSku.setPresentPrice(new BigDecimal(addMallGoodsSkuDto.getPresentPrice()));
+ mallGoodsSku.setStyleId(mallGoodsStyle.getId());
+ mallGoodsSku.setGoodsId(mallGoods.getId());
+ mallGoodsSkuMapper.insert(mallGoodsSku);
+ }
+ }
+
+ return new FebsResponse().success().message("操作成功");
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsCategoryVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsCategoryVo.java
new file mode 100644
index 0000000..de093f8
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsCategoryVo.java
@@ -0,0 +1,18 @@
+package cc.mrbird.febs.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "AdminMallGoodsCategoryVo", description = "信息返回类")
+public class AdminMallGoodsCategoryVo {
+
+ private Long id;
+
+ private String name;
+
+ private Long parentId;
+
+ private Integer isRecommend;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsVo.java
new file mode 100644
index 0000000..efdefca
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminMallGoodsVo.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "AdminMallGoodsVo", description = "信息返回类")
+public class AdminMallGoodsVo {
+
+ private Long id;
+
+ private String goodsName;
+
+ private String goodsNo;
+
+ private String goodsIntrodution;
+
+ private String unit;
+
+ private String thumb;
+
+ private String goodsDetails;
+
+ private Integer isSale;
+
+ private String originalPrice;
+
+ private String presentPrice;
+
+ private Long categoryId;
+
+ private Integer isHot;
+
+ private Integer saleVolume;
+}
diff --git a/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml b/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml
index 84161bb..0305092 100644
--- a/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml
+++ b/src/main/resources/mapper/modules/MallGoodsCategoryMapper.xml
@@ -3,7 +3,7 @@
<mapper namespace="cc.mrbird.febs.mall.mapper.MallGoodsCategoryMapper">
<select id="selectCategoryListInPage" resultType="cc.mrbird.febs.mall.entity.MallGoodsCategory">
- SELECT m.name,b.name parentName,m.is_comand isComand
+ SELECT m.id,m.name,b.name parentName,m.is_recommend isComand
FROM mall_goods_category m
left join mall_goods_category b on m.parent_id = b.id
<where>
@@ -57,4 +57,9 @@
select * from mall_goods_category
where parent_id=0 and is_recommend = 1
</select>
+
+ <select id="getMallGoodsCategoryInfoById" resultType="cc.mrbird.febs.mall.vo.AdminMallGoodsCategoryVo">
+ select * from mall_goods_category
+ where id=#{id}
+ </select>
</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallGoodsMapper.xml b/src/main/resources/mapper/modules/MallGoodsMapper.xml
index 85a4ea2..a745732 100644
--- a/src/main/resources/mapper/modules/MallGoodsMapper.xml
+++ b/src/main/resources/mapper/modules/MallGoodsMapper.xml
@@ -30,4 +30,36 @@
</where>
order by a.created_time desc
</select>
+
+ <select id="selectMallGoodsInPage" resultType="cc.mrbird.febs.mall.vo.AdminMallGoodsVo">
+ select
+ a.id,
+ a.goods_name,
+ a.goods_no,
+ a.goods_introdution,
+ a.unit,
+ a.thumb,
+ a.goods_details,
+ a.is_sale,
+ a.original_price,
+ a.present_price,
+ a.is_hot
+ from mall_goods a
+ <where>
+ <if test="record != null">
+ <if test="record.goodsName != null and record.goodsName != ''">
+ and a.goods_name like CONCAT('%', CONCAT(#{record.goodsName}, '%'))
+ </if>
+ </if>
+ </where>
+ order by a.created_time desc
+ </select>
+
+ <select id="selectMallGoodsCountByGoodsName" resultType="java.lang.Integer">
+ select count(id) from mall_goods a where a.goods_name = #{goodsName}
+ </select>
+
+ <select id="selectMallGoodsCountByGoodsNo" resultType="java.lang.Integer">
+ select count(id) from mall_goods a where a.goods_no = #{goodsNo}
+ </select>
</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAdd.html b/src/main/resources/templates/febs/views/modules/goods/goodsAdd.html
new file mode 100644
index 0000000..30bee82
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/goods/goodsAdd.html
@@ -0,0 +1,299 @@
+<style>
+ #goods-add {
+ padding: 20px 25px 25px 0;
+ }
+
+ #goods-add .layui-treeSelect .ztree li a, .ztree li span {
+ margin: 0 0 2px 3px !important;
+ }
+ #goods-add #data-permission-tree-block {
+ border: 1px solid #eee;
+ border-radius: 2px;
+ padding: 3px 0;
+ }
+ #goods-add .layui-treeSelect .ztree li span.button.switch {
+ top: 1px;
+ left: 3px;
+ }
+ .layui-upload-img{
+ max-width: 300px;
+ }
+
+</style>
+<div class="layui-fluid" id="goods-add">
+ <form class="layui-form" action="" lay-filter="user-add-form">
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">商品名称:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">商品编号:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsNo" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">所属分类:</label>
+ <div class="layui-input-block">
+ <select name="categoryId"
+ xm-select-direction="down"
+ xm-select="user-add-goods"
+ xm-select-skin="default">
+ </select>
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">单位:</label>
+ <div class="layui-input-block">
+ <input type="text" name="unit" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label">原价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="originalPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">现价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="presentPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">商品介绍:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label">规格:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" id="attrName">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <button type="button" class="layui-btn" id="test3" >添加</button>
+ </div>
+ </div>
+ <div id="attrWrap"></div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label febs-form-item-require">缩略图:</label>
+ <div class="layui-input-block">
+ <div class="layui-upload">
+ <button type="button" class="layui-btn" id="test2">上传</button>
+ <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+ <div class="layui-upload-list" id="demo2"></div>
+ </blockquote>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item febs-hide">
+ <label class="layui-form-label febs-form-item-require">缩略图链接:</label>
+ <div class="layui-input-block">
+ <input type="text" id="thumb" name="thumb" autocomplete="off" class="layui-input" readonly>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label febs-form-item-require">商品详情:</label>
+ <div class="layui-input-block">
+ <textarea id="lay_edit" lay-verify="goodsDetails" name = "goodsDetails" class="layui-textarea"></textarea>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">是否热卖:</label>
+ <div class="layui-input-block">
+ <input type="radio" name="isHot" value="1" title="是" >
+ <input type="radio" name="isHot" value="2" title="否" checked="">
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item febs-hide">
+ <button class="layui-btn" lay-submit="" lay-filter="goods-add-form-submit" id="submit"></button>
+ </div>
+ </form>
+</div>
+
+<script data-th-inline="javascript">
+ layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','layedit','upload'], function () {
+ var $ = layui.jquery,
+ febs = layui.febs,
+ layer = layui.layer,
+ formSelects = layui.formSelects,
+ treeSelect = layui.treeSelect,
+ form = layui.form,
+ laydate = layui.laydate,
+ eleTree = layui.eleTree,
+ member = [[${member}]],
+ $view = $('#goods-add'),
+ layedit = layui.layedit,
+ upload = layui.upload,
+ validate = layui.validate;
+
+ form.render();
+ laydate.render({
+ elem: '#febs-form-group-date'
+ });
+
+ formSelects.render();
+
+ formSelects.config('user-add-goods', {
+ searchUrl: ctx + 'admin/goodsCategory/categorys',
+ response: {
+ statusCode: 200
+ },
+ beforeSuccess: function (id, url, searchVal, result) {
+ var data = result.data;
+ var tranData = [];
+ for (var i = 0; i < data.length; i++) {
+ tranData.push({
+ name: data[i].name,
+ value: data[i].id
+ })
+ }
+ result.data = tranData;
+ return result;
+ },
+ success: function () {
+ // formSelects.value('user-add-goods', result.id);
+ },
+ error: function (id, url, searchVal, err) {
+ console.error(err);
+ febs.alert.error('获取分类列表失败');
+ }
+ });
+
+ //普通图片上传
+ upload.render({
+ elem: '#skuImg'
+ ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+ ,before: function(obj){
+ //预读本地文件示例,不支持ie8
+ obj.preview(function(index, file, result){
+ $('#skuImgs').attr('src', result); //图片链接(base64)
+ });
+ }
+ ,done: function(res){
+ febs.alert.success(res.data.src);
+ $("#skuImage").val(res.data.src);
+ }
+ });
+
+ //多图片上传
+ upload.render({
+ elem: '#test2'
+ ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+ ,multiple: true
+ ,before: function(obj){
+ //预读本地文件示例,不支持ie8
+ obj.preview(function(index, file, result){
+ $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img">')
+ });
+ }
+ ,done: function(res){
+ var thumbs = $("#thumb").val();
+ if(thumbs == ''){
+ $("#thumb").val(res.data.src);
+ }else{
+ $("#thumb").val(thumbs + ',' + res.data.src);
+ }
+ // alert($("#thumb").val());
+ }
+ });
+
+ layedit.set({ //设置图片接口
+ uploadImage: {
+ url: 'admin/goods/uploadFileBase64', //接口url
+ type: 'post',
+ }
+ });
+ //创建一个编辑器
+ var index = layedit.build('lay_edit',{
+ height: 300
+ });
+ //提交时把值同步到文本域中
+ form.verify({
+ //content富文本域中的lay-verify值
+ goodsDetails: function(value) {
+ return layedit.sync(index);
+ }
+ });
+
+ form.on('submit(goods-add-form-submit)', function (data) {
+ febs.post(ctx + 'admin/goodsCategory/addCategory', data.field, function () {
+ layer.closeAll();
+ febs.alert.success('新增成功');
+ $('#febs-user').find('#reset').click();
+ });
+ return false;
+ });
+ $('#test3').on('click', function (){
+ var index = $("#attrWrap").children().length;
+ $('#attrWrap').append(`
+ <div class="layui-row layui-col-space10 layui-form-item item">
+ <div class="layui-col-lg2">
+ <label class="layui-form-label">` + $('#attrName').val() + `:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-row layui-col-lg2">
+ <label class="layui-form-label">图片:</label>
+ <div class="layui-input-block">
+ <div class="layui-upload">
+ <button type="button" class="layui-btn" id="skuImg">上传</button>
+ <input type="text" id="skuImage" name="skuImage" autocomplete="off" class="layui-input" readonly>
+ </div>
+ </div>
+ </div>
+ <div class="layui-col-lg2">
+ <label class="layui-form-label">库存:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-col-lg2">
+ <label class="layui-form-label">销售数量:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-col-lg2">
+ <label class="layui-form-label">原价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-col-lg2">
+ <label class="layui-form-label">现价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-col-lg2">
+ <button type="button" class="layui-btn del-attr-btn" data-index="` + index +`">删除</button>
+ </div>
+ </div>
+ `)
+ })
+ $("#attrWrap").on("click",".del-attr-btn",function(){
+ console.log(this)
+ console.log($(this).index())
+ console.log($(this).attr('data-index'))
+ var index = $(this).attr('data-index')
+ $($("#attrWrap").find(".item")[index].remove());
+ });
+
+ });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
new file mode 100644
index 0000000..856c33a
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/goods/goodsAddNew.html
@@ -0,0 +1,328 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-goods" lay-title="新增商品">
+ <div class="layui-row febs-container">
+ <div class="layui-col-md12">
+ <div class="layui-card">
+ <div class="layui-card-body febs-table-full">
+ <div class="layui-fluid" id="goods-add">
+ <form class="layui-form" action="" lay-filter="goods-add-form">
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">商品名称:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsName" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">商品编号:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsNo" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">所属分类:</label>
+ <div class="layui-input-block">
+ <select name="categoryId"
+ lay-verify="required"
+ xm-select-direction="down"
+ xm-select="user-add-goods"
+ xm-select-skin="default">
+ </select>
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">单位:</label>
+ <div class="layui-input-block">
+ <input type="text" name="unit" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">原价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="originalPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <label class="layui-form-label febs-form-item-require">现价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="presentPrice" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">商品介绍:</label>
+ <div class="layui-input-block">
+ <input type="text" name="goodsIntrodution" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label">规格:</label>
+ <div class="layui-input-block">
+ <input type="text" name="addMallGoodsSkuDtos" autocomplete="off" class="layui-input" id="attrName">
+ </div>
+ </div>
+ <div class="layui-col-lg6">
+ <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test3" >添加</button>
+ </div>
+ </div>
+ <div id="attrWrap"></div>
+
+ <div class="layui-form-item">
+ <label class="layui-form-label">缩略图:</label>
+ <div class="layui-input-block">
+ <div class="layui-upload">
+ <button type="button" class="layui-btn layui-btn-normal layui-btn-xs" id="test2">上传</button>
+ <blockquote class="layui-elem-quote layui-quote-nm" style="margin-top: 10px;">
+ <div class="layui-upload-list" id="demo2"></div>
+ </blockquote>
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item febs-hide">
+ <label class="layui-form-label">缩略图链接:</label>
+ <div class="layui-input-block">
+ <input type="text" id="thumb" name="thumb" autocomplete="off" class="layui-input" readonly>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label">商品详情:</label>
+ <div class="layui-input-block">
+ <textarea id="lay_edit" lay-verify="goodsDetails" name = "goodsDetails" class="layui-textarea"></textarea>
+ </div>
+ </div>
+ <div class="layui-row layui-col-space10 layui-form-item">
+ <div class="layui-col-lg6">
+ <label class="layui-form-label">是否热卖:</label>
+ <div class="layui-input-block">
+ <input type="radio" name="isHot" value="1" title="是" >
+ <input type="radio" name="isHot" value="2" title="否" checked="">
+ </div>
+ </div>
+ </div>
+ <div class="layui-form-item" style="text-align:center">
+ <button class="layui-btn" lay-submit="" lay-filter="goods-add-form-submit" id="submit">保存</button>
+ <button class="layui-btn" lay-submit="" lay-filter="goods-add-form-cancel" id="cancel">取消</button>
+ </div>
+ </form>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<!-- 表格操作栏 end -->
+<script data-th-inline="javascript">
+ layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate','layedit','upload'], function () {
+ var $ = layui.jquery,
+ febs = layui.febs,
+ layer = layui.layer,
+ formSelects = layui.formSelects,
+ treeSelect = layui.treeSelect,
+ form = layui.form,
+ laydate = layui.laydate,
+ eleTree = layui.eleTree,
+ member = [[${member}]],
+ $view = $('#goods-add'),
+ layedit = layui.layedit,
+ upload = layui.upload,
+ validate = layui.validate;
+
+ form.render();
+ laydate.render({
+ elem: '#febs-form-group-date'
+ });
+
+ formSelects.render();
+
+ formSelects.config('user-add-goods', {
+ searchUrl: ctx + 'admin/goodsCategory/categorys',
+ response: {
+ statusCode: 200
+ },
+ beforeSuccess: function (id, url, searchVal, result) {
+ var data = result.data;
+ var tranData = [];
+ for (var i = 0; i < data.length; i++) {
+ tranData.push({
+ name: data[i].name,
+ value: data[i].id
+ })
+ }
+ result.data = tranData;
+ return result;
+ },
+ success: function () {
+ // formSelects.value('user-add-goods', result.id);
+ },
+ error: function (id, url, searchVal, err) {
+ console.error(err);
+ febs.alert.error('获取分类列表失败');
+ }
+ });
+ //多图片上传
+ upload.render({
+ elem: '#test2'
+ ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+ ,multiple: true
+ ,before: function(obj){
+ //预读本地文件示例,不支持ie8
+ obj.preview(function(index, file, result){
+ $('#demo2').append('<img src="'+ result +'" alt="'+ file.name +'" class="layui-upload-img">')
+ });
+ }
+ ,done: function(res){
+ var thumbs = $("#thumb").val();
+ if(thumbs == ''){
+ $("#thumb").val(res.data.src);
+ }else{
+ $("#thumb").val(thumbs + ',' + res.data.src);
+ }
+ // alert($("#thumb").val());
+ }
+ });
+
+ layedit.set({ //设置图片接口
+ uploadImage: {
+ url: 'admin/goods/uploadFileBase64', //接口url
+ type: 'post',
+ }
+ });
+ //创建一个编辑器
+ var index = layedit.build('lay_edit',{
+ height: 300
+ });
+ //提交时把值同步到文本域中
+ form.verify({
+ //content富文本域中的lay-verify值
+ goodsDetails: function(value) {
+ return layedit.sync(index);
+ }
+ });
+
+ $('#test3').on('click', function (){
+ var index = $("#attrWrap").children().length;
+ $('#attrWrap').append(`
+ <div class="layui-form-item item">
+ <div style="float:left" >
+ <input type="text" name="skuName` + index + `" autocomplete="off" class="layui-input" value="` + $('#attrName').val() + `" readonly >
+ </div>
+ <div style="float:left" >
+ <label class="layui-form-label">图片:</label>
+ <div class="layui-input-block">
+ <div class="layui-upload">
+ <button type="button" class="layui-btn layui-btn-normal layui-btn-xs sku-img" id="` + index + `">上传</button>
+ <input type="text" id="skuImage` + index +`" name="skuImage` + index + `" autocomplete="off"
+ class="layui-input">
+ </div>
+ </div>
+ </div>
+ <div style="float:left" >
+ <label class="layui-form-label">库存:</label>
+ <div class="layui-input-block">
+ <input type="text" name="stock` + index +`" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div style="float:left" >
+ <label class="layui-form-label">销售数量:</label>
+ <div class="layui-input-block">
+ <input type="text" name="skuVolume` + index +`" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div style="float:left" >
+ <label class="layui-form-label">原价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="originalPrice` + index +`" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div style="float:left" >
+ <label class="layui-form-label">现价:</label>
+ <div class="layui-input-block">
+ <input type="text" name="presentPrice` + index + `" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div style="float:left" >
+ <button type="button" class="layui-btn del-attr-btn" data-index="` + index +`">删除</button>
+ </div>
+ </div>
+ `)
+ //普通图片上传
+ upload.render({
+ elem: '.sku-img'
+ ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+ ,done: function(res){
+ febs.alert.success(res.data.src);
+ var cid = this.item.attr('id');
+ $('#skuImgPreview' + cid).attr('src', res.data.src);
+ $('#skuImage'+cid).val(res.data.src);
+ }
+ });
+ });
+ upload.render({
+ elem: '.sku-img'
+ ,url: ctx + 'admin/goods/uploadFileBase64' //改成您自己的上传接口
+ ,done: function(res){
+ febs.alert.success(res.data.src);
+ var cid = this.item.attr('id');
+ $('#skuImgPreview' + cid).attr('src', res.data.src);
+ $('#skuImage'+cid).val(res.data.src);
+ }
+ });
+ $("#attrWrap").on("click",".del-attr-btn",function(){
+ // console.log(this)
+ // console.log($(this).index())
+ // console.log($(this).attr('data-index'))
+ var index = $(this).attr('data-index')
+ $($("#attrWrap").find(".item")[index].remove());
+ });
+ form.on('submit(goods-add-form-submit)', function (data) {
+ let skuArrs = [];
+ var skuArr = $("#attrWrap").find(".item");
+ for(var i = 0;i < skuArr.length;i++){
+ skuArrs.push({
+ skuName: $("input[name='skuName" + i + "']").val(),
+ skuImage: $("input[name='skuImage" + i + "']").val(),
+ stock: $("input[name='stock" + i + "']").val(),
+ skuVolume: $("input[name='skuVolume" + i + "']").val(),
+ originalPrice:$("input[name='originalPrice" + i + "']").val(),
+ presentPrice: $("input[name='presentPrice" + i + "']").val()
+ })
+ }
+ // console.log(skuArrs)
+ data.field.addMallGoodsSkuDtos = skuArrs;
+ // console.log(data.field)
+ $.ajax({
+ 'url':ctx + 'admin/goods/addMallGoods',
+ 'type':'post',
+ 'dataType':'json',
+ 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式
+ 'traditional': true,//ajax传递数组必须添加属性
+ 'data':JSON.stringify(data.field),
+ 'success':function (data) {
+ if(data.code==0){
+ febs.alert.success(data.message);
+ var index = parent.layer.getFrameIndex(window.name);
+ parent.layer.close(index);
+ }else{
+ febs.alert.warn(data.message);
+ }
+ },
+ 'error':function () {
+ febs.alert.warn('服务器繁忙');
+ }
+ })
+ return false;
+ });
+
+ // $('cancel').on('click', function () {
+ // var currentUrl = window.location.hash.replace('#', '');
+ // febs.view.tab.del(currentUrl);
+ // febs.view.tab.change("/modules/goods/goodsList/");
+ // });
+
+ });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/goods/goodsList.html b/src/main/resources/templates/febs/views/modules/goods/goodsList.html
new file mode 100644
index 0000000..7b040b9
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/goods/goodsList.html
@@ -0,0 +1,179 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-goods" lay-title="商品列表">
+ <div class="layui-row febs-container">
+ <div class="layui-col-md12">
+ <div class="layui-card">
+ <div class="layui-card-body febs-table-full">
+ <form class="layui-form layui-table-form" lay-filter="user-table-form">
+ <div class="layui-row">
+ <div class="layui-col-md10">
+ <div class="layui-form-item">
+ <div class="layui-inline">
+ <div class="layui-input-inline">
+ <input type="text" placeholder="名称" name="goodsName" autocomplete="off" class="layui-input">
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+ <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="add">
+ 新增
+ </div>
+ <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+ <i class="layui-icon"></i>
+ </div>
+ <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+ <i class="layui-icon"></i>
+ </div>
+ </div>
+ </div>
+ </form>
+ <table lay-filter="userTable" lay-data="{id: 'userTable'}"></table>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+ <span shiro:lacksPermission="user:view,user:update,user:delete">
+ <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+ </span>
+ <a lay-event="edit" shiro:hasPermission="user:update"><i
+ class="layui-icon febs-edit-area febs-blue"></i></a>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+ // 引入组件并初始化
+ layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+ var $ = layui.jquery,
+ febs = layui.febs,
+ form = layui.form,
+ table = layui.table,
+ $view = $('#febs-goods'),
+ $query = $view.find('#query'),
+ $reset = $view.find('#reset'),
+ $searchForm = $view.find('form'),
+ $add = $view.find('#add'),
+ sortObject = {field: 'phone', type: null},
+ tableIns;
+
+ form.render();
+
+ // 表格初始化
+ initTable();
+
+ // 初始化表格操作栏各个按钮功能
+ table.on('tool(userTable)', function (obj) {
+ var data = obj.data,
+ layEvent = obj.event;
+ if (layEvent === 'close') {
+ febs.modal.confirm('禁用', '确认禁用该账号?', function () {
+ closeAccount(data.id);
+ });
+ }
+ if (layEvent === 'open') {
+ febs.modal.confirm('开启', '确认开启该账号?', function () {
+ openAccount(data.id);
+ });
+ }
+ if (layEvent === 'see') {
+ febs.modal.open( '个人信息', 'modules/mallMember/detail/' + data.id, {
+ maxmin: true,
+ });
+ }
+ });
+ function closeAccount(id) {
+ febs.get(ctx + 'admin/mallMember/closeAccount/' + id, null, function () {
+ febs.alert.success('禁用成功');
+ $query.click();
+ });
+ }
+ function openAccount(id) {
+ febs.get(ctx + 'admin/mallMember/openAccount/' + id, null, function () {
+ febs.alert.success('开启成功');
+ $query.click();
+ });
+ }
+
+
+ // 查询按钮
+ $query.on('click', function () {
+ var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+ tableIns.reload({where: params, page: {curr: 1}});
+ });
+
+ // 刷新按钮
+ $reset.on('click', function () {
+ $searchForm[0].reset();
+ sortObject.type = 'null';
+ tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+ });
+
+ // $add.on('click', function () {
+ // febs.modal.open('新增', 'modules/goods/goodsAdd/', {
+ // btn: ['提交', '取消'],
+ // yes: function (index, layero) {
+ // $('#goods-add').find('#submit').trigger('click');
+ // },
+ // btn2: function () {
+ // layer.closeAll();
+ // }
+ // });
+ // });
+ $add.on('click', function () {
+ febs.view.tab.change("/modules/goods/goodsAddNew/");
+ });
+
+ function initTable() {
+ tableIns = febs.table.init({
+ elem: $view.find('table'),
+ id: 'userTable',
+ url: ctx + 'admin/goods/goodsList',
+ cols: [[
+ {field: 'goodsName', title: '商品名称', minWidth: 150,align:'left'},
+ // {field: 'accountType', title: '账号类型',
+ // templet: function (d) {
+ // if (d.accountType === 2) {
+ // return '<span style="color:red;">测试账号</span>'
+ // } else if (d.accountType === 1) {
+ // return '<span style="color:green;">正常账号</span>'
+ // }else{
+ // return ''
+ // }
+ // }, minWidth: 80,align:'center'},
+ // {field: 'accountStatus', title: '账号状态',
+ // templet: function (d) {
+ // if (d.accountStatus === 1) {
+ // return '<span style="color:green;">正常</span>'
+ // } else if (d.accountStatus === 2) {
+ // return '<span style="color:red;">禁用</span>'
+ // }else{
+ // return ''
+ // }
+ // }, minWidth: 80,align:'center'},
+ // {field: 'createdTime', title: '注册时间', minWidth: 180,align:'center'},
+ // {title: '操作',
+ // templet: function (d) {
+ // if (d.accountStatus === 1) {
+ // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">详情</button>'
+ // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="close" shiro:hasPermission="user:update">禁用</button>'
+ //
+ // }else{
+ // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">详情</button>'
+ // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open" shiro:hasPermission="user:update">启用</button>'
+ //
+ // }
+ // },minWidth: 300,align:'center'}
+ ]]
+ });
+ }
+
+ // 获取查询参数
+ function getQueryParams() {
+ return {
+ name: $searchForm.find('input[name="goodsName"]').val().trim(),
+ };
+ }
+
+ })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
index 752d935..dcff9c6 100644
--- a/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
+++ b/src/main/resources/templates/febs/views/modules/mallMember/mallMemberList.html
@@ -87,36 +87,8 @@
openAccount(data.id);
});
}
-
- if (layEvent === 'edit') {
- febs.modal.open('身份认证', 'modules/member/memberDetail/' + data.id, {
- btn: ['提交', '取消'],
- yes: function (index, layero) {
- $('#user-update').find('#submit').trigger('click');
- },
- btn2: function () {
- layer.closeAll();
- }
- });
- }
if (layEvent === 'see') {
febs.modal.open( '个人信息', 'modules/mallMember/detail/' + data.id, {
- maxmin: true,
- });
- }
- if (layEvent === 'addCoin') {
- febs.modal.open( '拨币', 'modules/member/addCoin/' + data.id, {
- btn: ['提交', '取消'],
- yes: function (index, layero) {
- $('#user-update').find('#submit').trigger('click');
- },
- btn2: function () {
- layer.closeAll();
- }
- });
- }
- if (layEvent === 'examine') {
- febs.modal.open( '个人数据详情', 'modules/member/memberDetailInfo/' + data.inviteId, {
maxmin: true,
});
}
diff --git a/src/main/resources/templates/febs/views/modules/product/categoryAdd.html b/src/main/resources/templates/febs/views/modules/product/categoryAdd.html
index 248be12..a9e9d66 100644
--- a/src/main/resources/templates/febs/views/modules/product/categoryAdd.html
+++ b/src/main/resources/templates/febs/views/modules/product/categoryAdd.html
@@ -88,7 +88,7 @@
return result;
},
success: function () {
- formSelects.value('user-update-category', user.id.split(','));
+ formSelects.value('user-update-category', member.id.split(','));
},
error: function (id, url, searchVal, err) {
console.error(err);
diff --git a/src/main/resources/templates/febs/views/modules/product/categoryList.html b/src/main/resources/templates/febs/views/modules/product/categoryList.html
index 05175e0..b64c26a 100644
--- a/src/main/resources/templates/febs/views/modules/product/categoryList.html
+++ b/src/main/resources/templates/febs/views/modules/product/categoryList.html
@@ -77,8 +77,8 @@
});
}
- if (layEvent === 'edit') {
- febs.modal.open('身份认证', 'modules/member/memberDetail/' + data.id, {
+ if (layEvent === 'see') {
+ febs.modal.open('编辑', 'modules/product/categoryUpdate/' + data.id, {
btn: ['提交', '取消'],
yes: function (index, layero) {
$('#user-update').find('#submit').trigger('click');
@@ -86,11 +86,6 @@
btn2: function () {
layer.closeAll();
}
- });
- }
- if (layEvent === 'see') {
- febs.modal.open( '个人信息', 'modules/mallMember/detail/' + data.id, {
- maxmin: true,
});
}
});
@@ -141,18 +136,10 @@
cols: [[
{field: 'name', title: '名称', minWidth: 150,align:'left'},
{field: 'parentName', title: '父级名称', minWidth: 150,align:'left'},
- // {title: '操作',
- // templet: function (d) {
- // if (d.accountStatus === 1) {
- // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">详情</button>'
- // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="close" shiro:hasPermission="user:update">禁用</button>'
- //
- // }else{
- // return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">详情</button>'
- // +'<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="open" shiro:hasPermission="user:update">启用</button>'
- //
- // }
- // },minWidth: 300,align:'center'}
+ {title: '操作',
+ templet: function (d) {
+ return '<button class="layui-btn layui-btn-normal layui-btn-xs" lay-event="see" shiro:hasPermission="user:update">编辑</button>'
+ },minWidth: 300,align:'center'}
]]
});
}
diff --git a/src/main/resources/templates/febs/views/modules/product/categoryUpdate.html b/src/main/resources/templates/febs/views/modules/product/categoryUpdate.html
new file mode 100644
index 0000000..95564fc
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/product/categoryUpdate.html
@@ -0,0 +1,124 @@
+<style>
+ #user-add {
+ padding: 20px 25px 25px 0;
+ }
+
+ #user-add .layui-treeSelect .ztree li a, .ztree li span {
+ margin: 0 0 2px 3px !important;
+ }
+ #user-add #data-permission-tree-block {
+ border: 1px solid #eee;
+ border-radius: 2px;
+ padding: 3px 0;
+ }
+ #user-add .layui-treeSelect .ztree li span.button.switch {
+ top: 1px;
+ left: 3px;
+ }
+
+</style>
+<div class="layui-fluid" id="user-add">
+ <form class="layui-form" action="" lay-filter="categary-update-form">
+ <div class="layui-form-item febs-hide">
+ <label class="layui-form-label febs-form-item-require">用户id:</label>
+ <div class="layui-input-block">
+ <input type="text" name="id" data-th-value="${member.id}">
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label febs-form-item-require">名称:</label>
+ <div class="layui-input-block">
+ <input type="text" name="name"
+ lay-verify="name" autocomplete="off" class="layui-input" >
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label ">父类:</label>
+ <div class="layui-input-block">
+ <select name="parentId"
+ xm-select-direction="down"
+ xm-select="user-update-category"
+ xm-select-skin="default">
+ </select>
+ </div>
+ </div>
+ <div class="layui-form-item">
+ <label class="layui-form-label febs-form-item-require">是否推荐:</label>
+ <div class="layui-input-block">
+ <input type="radio" name="isRecommend" value="1" title="是" >
+ <input type="radio" name="isRecommend" value="2" title="否" checked="">
+ </div>
+ </div>
+ <div class="layui-form-item febs-hide">
+ <button class="layui-btn" lay-submit="" lay-filter="categary-update-form-submit" id="submit"></button>
+ </div>
+ </form>
+</div>
+
+<script data-th-inline="javascript">
+ layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate'], function () {
+ var $ = layui.$,
+ febs = layui.febs,
+ layer = layui.layer,
+ formSelects = layui.formSelects,
+ treeSelect = layui.treeSelect,
+ form = layui.form,
+ laydate = layui.laydate,
+ eleTree = layui.eleTree,
+ member = [[${member}]],
+ $view = $('#user-add'),
+ validate = layui.validate;
+
+ form.render();
+ laydate.render({
+ elem: '#febs-form-group-date'
+ });
+
+ formSelects.render();
+
+ formSelects.config('user-update-category', {
+ searchUrl: ctx + 'admin/goodsCategory/categorys',
+ response: {
+ statusCode: 200
+ },
+ beforeSuccess: function (id, url, searchVal, result) {
+ var data = result.data;
+ var tranData = [];
+ for (var i = 0; i < data.length; i++) {
+ tranData.push({
+ name: data[i].name,
+ value: data[i].id
+ })
+ }
+ result.data = tranData;
+ return result;
+ },
+ success: function () {
+ formSelects.value('user-update-category', member.parentId);
+ },
+ error: function (id, url, searchVal, err) {
+ console.error(err);
+ febs.alert.error('获取分类列表失败');
+ }
+ });
+ initUserValue();
+
+ function initUserValue() {
+ form.val("categary-update-form", {
+ "id": member.id,
+ "name": member.name,
+ "parentId": member.parentId,
+ "isRecommend": member.isRecommend
+ });
+ }
+
+ form.on('submit(categary-update-form-submit)', function (data) {
+ febs.post(ctx + 'admin/goodsCategory/addCategory', data.field, function () {
+ layer.closeAll();
+ febs.alert.success('新增成功');
+ $('#febs-user').find('#reset').click();
+ });
+ return false;
+ });
+ });
+</script>
\ No newline at end of file
--
Gitblit v1.9.1