From 2ea6fec1687fa8e4ff9568cacb2f1d09e251c449 Mon Sep 17 00:00:00 2001 From: tanzs Date: Tue, 18 Feb 2025 22:45:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=96=B0=E5=A2=9E=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E9=80=89=E6=8B=A9=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/jeecg/config/shiro/ShiroConfig.java | 9 +-- .../product/mapper/AppProductMapper.java | 5 ++ .../product/mapper/xml/AppProductMapper.xml | 16 ++++- .../productCategory/mapper/AppCategoryMapper.java | 1 + .../product/controller/MProductController.java | 62 +++++++++++++++++ .../miniapp/product/entity/CategoryProductDTO.java | 17 +++++ .../miniapp/product/service/MProductService.java | 11 +++ .../product/service/impl/MProductServiceImpl.java | 80 ++++++++++++++++++++++ .../modules/system/controller/LoginController.java | 36 +++++----- 9 files changed, 214 insertions(+), 23 deletions(-) create mode 100644 jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java create mode 100644 jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java create mode 100644 jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java create mode 100644 jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index cf1f96a..ddd95bb 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -56,7 +56,7 @@ public class ShiroConfig { private JeecgBaseConfig jeecgBaseConfig; @Autowired(required = false) private RedisProperties redisProperties; - + /** * Filter Chain定义说明 * @@ -90,6 +90,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/login", "anon"); //登录接口排除 filterChainDefinitionMap.put("/sys/mLogin", "anon"); //登录接口排除 filterChainDefinitionMap.put("/sys/logout", "anon"); //登出接口排除 + filterChainDefinitionMap.put("/miniapp/user/logout", "anon"); //小程序登出接口排除 filterChainDefinitionMap.put("/sys/thirdLogin/**", "anon"); //第三方登录 filterChainDefinitionMap.put("/sys/getEncryptedString", "anon"); //获取加密串 filterChainDefinitionMap.put("/sys/sms", "anon");//短信验证码 @@ -144,7 +145,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/jmreport/**", "anon"); filterChainDefinitionMap.put("/**/*.js.map", "anon"); filterChainDefinitionMap.put("/**/*.css.map", "anon"); - + //积木BI大屏和仪表盘排除 filterChainDefinitionMap.put("/drag/view", "anon"); filterChainDefinitionMap.put("/drag/page/queryById", "anon"); @@ -292,7 +293,7 @@ public class ShiroConfig { /** * RedisConfig在项目starter项目中 * jeecg-boot-starter-github\jeecg-boot-common\src\main\java\org\jeecg\common\modules\redis\config\RedisConfig.java - * + * * 配置shiro redisManager * 使用的是shiro-redis开源插件 * @@ -314,7 +315,7 @@ public class ShiroConfig { return sentinelManager; } - + // redis 单机支持,在集群为空,或者集群无机器时候使用 add by jzyadmin@163.com if (lettuceConnectionFactory.getClusterConfiguration() == null || lettuceConnectionFactory.getClusterConfiguration().getClusterNodes().isEmpty()) { RedisManager redisManager = new RedisManager(); diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java index d71d4eb..81e487b 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java @@ -1,8 +1,11 @@ package org.jeecg.modules.sysMiniapp.product.mapper; +import io.lettuce.core.dynamic.annotation.Param; import org.jeecg.modules.sysMiniapp.product.entity.AppProduct; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @Description: 产品管理 * @Author: jeecg-boot @@ -11,4 +14,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface AppProductMapper extends BaseMapper { + List getAppProductsByCateGory(@Param("name")String name, @Param("categoryId")Integer categoryId); + } diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml index 0e4f0d6..d5e10c9 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml @@ -1,5 +1,19 @@ - + diff --git a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java index 56a7b3c..f2543d7 100644 --- a/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java +++ b/jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java @@ -11,4 +11,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface AppCategoryMapper extends BaseMapper { + } diff --git a/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java new file mode 100644 index 0000000..fde880a --- /dev/null +++ b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java @@ -0,0 +1,62 @@ +package org.jeecg.modules.miniapp.product.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.constant.SymbolConstant; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.config.shiro.IgnoreAuth; +import org.jeecg.modules.miniapp.product.entity.CategoryProductDTO; +import org.jeecg.modules.miniapp.product.service.impl.MProductServiceImpl; +import org.jeecg.modules.sysMiniapp.product.entity.AppProduct; +import org.jeecg.modules.sysMiniapp.product.entity.Product; +import org.jeecg.modules.sysMiniapp.product.service.IAppProductService; +import org.jeecg.modules.sysMiniapp.productCategoryJoin.entity.AppProductCategoryJoin; +import org.jeecg.modules.sysMiniapp.productCategoryJoin.mapper.AppProductCategoryJoinMapper; +import org.jeecg.modules.sysMiniapp.productCategoryJoin.service.IAppProductCategoryJoinService; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** +* @Description: 产品管理 +* @Author: jeecg-boot +* @Date: 2025-02-16 +* @Version: V1.0 +*/ +@Api(tags="产品管理") +@RestController +@RequestMapping("/miniapp/product") +@Slf4j +public class MProductController { + + @Autowired + MProductServiceImpl mProductService; + + @ApiOperation(value="产品管理-查询所有产品服务", notes="产品管理-查询所有产品服务") + @GetMapping(value = "/categories") + @IgnoreAuth + public Result> query(@RequestParam(name = "name",required = false)String name) { + return mProductService.getAllCateGoryProduct(name); + } + + +} diff --git a/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java new file mode 100644 index 0000000..7fc92b4 --- /dev/null +++ b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java @@ -0,0 +1,17 @@ +package org.jeecg.modules.miniapp.product.entity; + +import lombok.Data; +import org.jeecg.modules.sysMiniapp.product.entity.AppProduct; + +import java.util.List; + +/** + * @author tanzs + * @date 2025/2/18 21:39 + */ +@Data +public class CategoryProductDTO { + private Integer categoryId; + private String categoryName; + private List products; +} diff --git a/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java new file mode 100644 index 0000000..bb6b0d4 --- /dev/null +++ b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java @@ -0,0 +1,11 @@ +package org.jeecg.modules.miniapp.product.service; + +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.miniapp.product.entity.CategoryProductDTO; + +import java.util.List; + +public interface MProductService { + + Result> getAllCateGoryProduct(String name); +} diff --git a/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java new file mode 100644 index 0000000..60e2281 --- /dev/null +++ b/jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java @@ -0,0 +1,80 @@ +package org.jeecg.modules.miniapp.product.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.modules.miniapp.product.entity.CategoryProductDTO; +import org.jeecg.modules.miniapp.product.service.MProductService; +import org.jeecg.modules.sysMiniapp.product.entity.AppProduct; +import org.jeecg.modules.sysMiniapp.product.service.impl.AppProductServiceImpl; +import org.jeecg.modules.sysMiniapp.productCategory.entity.AppCategory; +import org.jeecg.modules.sysMiniapp.productCategory.mapper.AppCategoryMapper; +import org.jeecg.modules.sysMiniapp.productCategory.service.impl.AppCategoryServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +/** + * @author tanzs + * @date 2025/2/18 21:37 + */ +@Service +@Slf4j +public class MProductServiceImpl implements MProductService { + + @Autowired + AppProductServiceImpl appProductService; + + @Autowired + AppCategoryServiceImpl appCategoryService; + + /** + * 查询所有分类 + * @param name + * @return + */ + @Override + public Result> getAllCateGoryProduct(String name) { + // 构建全部数据 + List result = new ArrayList(); + CategoryProductDTO categoryProductDTO = new CategoryProductDTO(); + categoryProductDTO.setCategoryId(0); + categoryProductDTO.setCategoryName("全部"); + // 查询全部产品服务 + List appProducts = new ArrayList(); + if (StrUtil.isNotEmpty(name)){ + LambdaQueryWrapper productLambdaQueryWrapper = new LambdaQueryWrapper<>(); + productLambdaQueryWrapper.like(AppProduct::getName,name); + appProducts = appProductService.list(productLambdaQueryWrapper); + }else { + appProducts = appProductService.list(); + } + categoryProductDTO.setProducts(appProducts); + result.add(categoryProductDTO); + // 构建分类与产品的DTO + List appCategories = appCategoryService.list(); + for(AppCategory category : appCategories){ + CategoryProductDTO categoryProduct = new CategoryProductDTO(); + categoryProduct.setCategoryId(category.getId()); + categoryProduct.setCategoryName(category.getCategoryName()); + // 查询分类下关联的产品 + List categoryProducts = appProductService.getBaseMapper().getAppProductsByCateGory(name,category.getId()); + categoryProduct.setProducts(categoryProducts); + result.add(categoryProduct); + } + // 结果升序 + Collections.sort(result, new Comparator() { + @Override + public int compare(CategoryProductDTO o1, CategoryProductDTO o2) { + // 根据 categoryId 进行升序排序 + return o1.getCategoryId().compareTo(o2.getCategoryId()); + } + }); + return Result.OK(result); + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java index 58f8a69..7b89903 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java @@ -81,24 +81,24 @@ public class LoginController { } // step.1 验证码check -// String captcha = sysLoginModel.getCaptcha(); -// if(captcha==null){ -// result.error500("验证码无效"); -// return result; -// } -// String lowerCaseCaptcha = captcha.toLowerCase(); -// // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 -// String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(); -// String realKey = Md5Util.md5Encode(origin, "utf-8"); -// Object checkCode = redisUtil.get(realKey); -// //当进入登录页时,有一定几率出现验证码错误 #1714 -// if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { -// log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); -// result.error500("验证码错误"); -// // 改成特殊的code 便于前端判断 -// result.setCode(HttpStatus.PRECONDITION_FAILED.value()); -// return result; -// } + String captcha = sysLoginModel.getCaptcha(); + if(captcha==null){ + result.error500("验证码无效"); + return result; + } + String lowerCaseCaptcha = captcha.toLowerCase(); + // 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可 + String origin = lowerCaseCaptcha+sysLoginModel.getCheckKey()+jeecgBaseConfig.getSignatureSecret(); + String realKey = Md5Util.md5Encode(origin, "utf-8"); + Object checkCode = redisUtil.get(realKey); + //当进入登录页时,有一定几率出现验证码错误 #1714 + if(checkCode==null || !checkCode.toString().equals(lowerCaseCaptcha)) { + log.warn("验证码错误,key= {} , Ui checkCode= {}, Redis checkCode = {}", sysLoginModel.getCheckKey(), lowerCaseCaptcha, checkCode); + result.error500("验证码错误"); + // 改成特殊的code 便于前端判断 + result.setCode(HttpStatus.PRECONDITION_FAILED.value()); + return result; + } // step.2 校验用户是否存在且有效 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();