diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java index 71ebe3b8..13b59ff8 100644 --- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java +++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java @@ -31,6 +31,8 @@ public class GatewayConfig config.addAllowedMethod("*"); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); + //缓存options预请求 + config.setMaxAge(60000L); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser()); source.registerCorsConfiguration("/**", config); diff --git a/ruoyi-ui/src/api/mall/product/category.js b/ruoyi-ui/src/api/mall/product/category.js new file mode 100644 index 00000000..1d04eeba --- /dev/null +++ b/ruoyi-ui/src/api/mall/product/category.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' + +// 获取菜单 +export function getMenus() { + return request({ + url: '/mall-product/product/category/list/tree', + method: 'get', + }) +} + + +//删除分类 +export function removeMenus(ids) { + return request({ + url: '/mall-product/product/category/delete', + method: 'delete', + data:ids + }) +} + +//添加三级分类 +export function addCategory(data) { + return request({ + url: '/mall-product/product/category/save', + method: 'post', + data:data + }) +} + +//修改三级分类 +export function editCategory(data) { + return request({ + url: '/mall-product/product/category/update', + method: 'put', + data:data + }) +} + +//获取具体一个三级分类 +export function getCategory(data) { + return request({ + url: `/mall-product/product/category/info/${data.catId}`, + method: 'get', + }) +} + +//批量修改 +export function batchSave(data) { + return request({ + url: '/mall-product/product/category/update/sort', + method: 'put', + data:data + }) +} + + + + diff --git a/ruoyi-ui/src/views/mall/product/category.vue b/ruoyi-ui/src/views/mall/product/category.vue new file mode 100644 index 00000000..28e02d6e --- /dev/null +++ b/ruoyi-ui/src/views/mall/product/category.vue @@ -0,0 +1,357 @@ + + + + diff --git a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/controller/CategoryController.java b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/controller/CategoryController.java index 983a63da..65d86c0a 100644 --- a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/controller/CategoryController.java +++ b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/controller/CategoryController.java @@ -1,20 +1,17 @@ package com.xjs.mall.product.controller; -import java.util.Arrays; -import java.util.Map; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; import com.xjs.mall.product.entity.CategoryEntity; import com.xjs.mall.product.service.CategoryService; -import com.xjs.utils.PageUtils; import com.xjs.utils.R; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import java.util.Arrays; +import java.util.List; /** @@ -22,41 +19,47 @@ import com.xjs.utils.R; * * @author xiejs * @email 1294405880@qq.com - * @date 2022-03-15 10:16:53 + * @since 2022-03-15 10:16:53 */ @RestController @RequestMapping("product/category") +@Api(tags = "商城-商品-分类") public class CategoryController { @Autowired private CategoryService categoryService; /** - * 列表 + * 列表--树形结构 */ - @RequestMapping("/list") - public R list(@RequestParam Map params){ - PageUtils page = categoryService.queryPage(params); + @GetMapping("/list/tree") + @ApiOperation("树形结构") + public R list() { - return R.ok().put("page", page); + List list = categoryService.listWithTree(); + + return R.ok().put("page", list); } /** * 信息 */ - @RequestMapping("/info/{catId}") - public R info(@PathVariable("catId") Long catId){ - CategoryEntity category = categoryService.getById(catId); + @GetMapping("/info/{catId}") + @ApiOperation("信息") + public R info(@PathVariable("catId") Long catId) { + CategoryEntity category = categoryService.getById(catId); - return R.ok().put("category", category); + return R.ok().put("data", category); } /** * 保存 */ - @RequestMapping("/save") - public R save(@RequestBody CategoryEntity category){ - categoryService.save(category); + @PostMapping("/save") + @ApiOperation("保存") + @Log(title = "商品分类", businessType = BusinessType.INSERT) + public R save(@RequestBody CategoryEntity category) { + categoryService.save(category); return R.ok(); } @@ -64,19 +67,31 @@ public class CategoryController { /** * 修改 */ - @RequestMapping("/update") - public R update(@RequestBody CategoryEntity category){ - categoryService.updateById(category); + @PutMapping("/update") + @ApiOperation("修改") + @Log(title = "商品分类", businessType = BusinessType.UPDATE) + public R update(@RequestBody CategoryEntity category) { + categoryService.updateById(category); return R.ok(); } + @PutMapping("/update/sort") + @Log(title = "商品分类", businessType = BusinessType.UPDATE) + public R updateSort(@RequestBody CategoryEntity[] categoryEntities) { + categoryService.updateBatchById(Arrays.asList(categoryEntities)); + return R.ok(); + } + /** * 删除 */ - @RequestMapping("/delete") - public R delete(@RequestBody Long[] catIds){ - categoryService.removeByIds(Arrays.asList(catIds)); + @DeleteMapping("/delete") + @ApiOperation("删除") + @Log(title = "商品分类", businessType = BusinessType.DELETE) + public R delete(@RequestBody Long[] catIds) { + + categoryService.removeMenuByIds(Arrays.asList(catIds)); return R.ok(); } diff --git a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/entity/CategoryEntity.java b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/entity/CategoryEntity.java index ff60b310..0b392837 100644 --- a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/entity/CategoryEntity.java +++ b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/entity/CategoryEntity.java @@ -1,18 +1,20 @@ package com.xjs.mall.product.entity; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; import java.io.Serializable; -import java.util.Date; -import lombok.Data; +import java.util.List; /** * 商品三级分类 * * @author xiejs * @email 1294405880@qq.com - * @date 2022-03-15 10:16:53 + * @since 2022-03-15 10:16:53 */ @Data @TableName("pms_category") @@ -39,6 +41,7 @@ public class CategoryEntity implements Serializable { /** * 是否显示[0-不显示,1显示] */ + @TableLogic(value = "1",delval = "0") private Integer showStatus; /** * 排序 @@ -57,4 +60,10 @@ public class CategoryEntity implements Serializable { */ private Integer productCount; + /** + * 子分类 + */ + @TableField(exist = false) + private List children; + } diff --git a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/CategoryService.java b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/CategoryService.java index df1eb947..d510b391 100644 --- a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/CategoryService.java +++ b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/CategoryService.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xjs.utils.PageUtils; import com.xjs.mall.product.entity.CategoryEntity; +import java.util.List; import java.util.Map; /** @@ -16,5 +17,17 @@ import java.util.Map; public interface CategoryService extends IService { PageUtils queryPage(Map params); + + /** + * 查询树形结构分类 + * @return list + */ + List listWithTree(); + + /** + * 批量删除菜单 + * @param asList ids + */ + void removeMenuByIds(List asList); } diff --git a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/impl/CategoryServiceImpl.java b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/impl/CategoryServiceImpl.java index bde50dbc..8eeb4403 100644 --- a/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/impl/CategoryServiceImpl.java +++ b/xjs-business/xjs-project-mall/mall-product/src/main/java/com/xjs/mall/product/service/impl/CategoryServiceImpl.java @@ -1,29 +1,78 @@ package com.xjs.mall.product.service.impl; -import org.springframework.stereotype.Service; -import java.util.Map; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.xjs.utils.PageUtils; -import com.xjs.utils.Query; - import com.xjs.mall.product.dao.CategoryDao; import com.xjs.mall.product.entity.CategoryEntity; import com.xjs.mall.product.service.CategoryService; +import com.xjs.utils.PageUtils; +import com.xjs.utils.Query; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; @Service("categoryService") public class CategoryServiceImpl extends ServiceImpl implements CategoryService { + @Resource + private CategoryDao categoryDao; + @Override public PageUtils queryPage(Map params) { IPage page = this.page( new Query().getPage(params), - new QueryWrapper() + new QueryWrapper<>() ); return new PageUtils(page); } + @Override + public List listWithTree() { + //1、查询所有分类 + List entities = categoryDao.selectList(null); + + //2、找到所有一级分类 + return entities.stream().filter(categoryEntity -> + categoryEntity.getParentCid() == 0) + .peek(menu -> menu.setChildren(this.getChildrens(menu, entities))) + .sorted(Comparator.comparingInt(menu -> (menu.getSort() == null ? 0 : menu.getSort()))) + .collect(Collectors.toList()); + + } + + @Override + public void removeMenuByIds(List asList) { + // todo 检查当前要删除的菜单是否被其他的地方引用 + + categoryDao.deleteBatchIds(asList); + } + + + /** + * 递归获取子菜单 + * + * @param root 根菜单 + * @param all 所有菜单 + * @return list + */ + private List getChildrens(CategoryEntity root, List all) { + + //-----------peek和map区别---------------// + //map有返回值,peek没有返回值 + + return all.stream().filter(categoryEntity -> Objects.equals(categoryEntity.getParentCid(), root.getCatId())) + .peek(categoryEntity -> categoryEntity.setChildren(getChildrens(categoryEntity, all))) + .sorted(Comparator.comparingInt(menu -> (menu.getSort() == null ? 0 : menu.getSort()))) + .collect(Collectors.toList()); + } + + } \ No newline at end of file