Browse Source

feat:新增产品服务选择小程序接口

master
tanzs 2 months ago
parent
commit
2ea6fec168
9 changed files with 214 additions and 23 deletions
  1. +5
    -4
      jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
  2. +5
    -0
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java
  3. +15
    -1
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml
  4. +1
    -0
      jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java
  5. +62
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java
  6. +17
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java
  7. +11
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java
  8. +80
    -0
      jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java
  9. +18
    -18
      jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java

+ 5
- 4
jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java View File

@ -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();


+ 5
- 0
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/AppProductMapper.java View File

@ -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<AppProduct> {
List<AppProduct> getAppProductsByCateGory(@Param("name")String name, @Param("categoryId")Integer categoryId);
}

+ 15
- 1
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/product/mapper/xml/AppProductMapper.xml View File

@ -1,5 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.modules.sysMiniapp.product.mapper.AppProductMapper">
<select id="getAppProductsByCateGory" resultType="org.jeecg.modules.sysMiniapp.product.entity.AppProduct">
SELECT
p.id as id,
p.`name` as name,
p.pdf as pdf
FROM
app_product AS p
LEFT JOIN app_product_category_join AS c ON p.id = c.product_id
<where>
c.category_id = #{categoryId}
<if test="name!= null">
AND p.`name` LIKE CONCAT('%',#{name},'%')
</if>
</where>
</select>
</mapper>

+ 1
- 0
jeecg-module-demo/src/main/java/org/jeecg/modules/sysMiniapp/productCategory/mapper/AppCategoryMapper.java View File

@ -11,4 +11,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface AppCategoryMapper extends BaseMapper<AppCategory> {
}

+ 62
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/controller/MProductController.java View File

@ -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<List<CategoryProductDTO>> query(@RequestParam(name = "name",required = false)String name) {
return mProductService.getAllCateGoryProduct(name);
}
}

+ 17
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/entity/CategoryProductDTO.java View File

@ -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<AppProduct> products;
}

+ 11
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/MProductService.java View File

@ -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<List<CategoryProductDTO>> getAllCateGoryProduct(String name);
}

+ 80
- 0
jeecg-module-miniapp/src/main/java/org/jeecg/modules/miniapp/product/service/impl/MProductServiceImpl.java View File

@ -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<List<CategoryProductDTO>> getAllCateGoryProduct(String name) {
// 构建全部数据
List<CategoryProductDTO> result = new ArrayList<CategoryProductDTO>();
CategoryProductDTO categoryProductDTO = new CategoryProductDTO();
categoryProductDTO.setCategoryId(0);
categoryProductDTO.setCategoryName("全部");
// 查询全部产品服务
List<AppProduct> appProducts = new ArrayList<AppProduct>();
if (StrUtil.isNotEmpty(name)){
LambdaQueryWrapper<AppProduct> productLambdaQueryWrapper = new LambdaQueryWrapper<>();
productLambdaQueryWrapper.like(AppProduct::getName,name);
appProducts = appProductService.list(productLambdaQueryWrapper);
}else {
appProducts = appProductService.list();
}
categoryProductDTO.setProducts(appProducts);
result.add(categoryProductDTO);
// 构建分类与产品的DTO
List<AppCategory> appCategories = appCategoryService.list();
for(AppCategory category : appCategories){
CategoryProductDTO categoryProduct = new CategoryProductDTO();
categoryProduct.setCategoryId(category.getId());
categoryProduct.setCategoryName(category.getCategoryName());
// 查询分类下关联的产品
List<AppProduct> categoryProducts = appProductService.getBaseMapper().getAppProductsByCateGory(name,category.getId());
categoryProduct.setProducts(categoryProducts);
result.add(categoryProduct);
}
// 结果升序
Collections.sort(result, new Comparator<CategoryProductDTO>() {
@Override
public int compare(CategoryProductDTO o1, CategoryProductDTO o2) {
// 根据 categoryId 进行升序排序
return o1.getCategoryId().compareTo(o2.getCategoryId());
}
});
return Result.OK(result);
}
}

+ 18
- 18
jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java View File

@ -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<SysUser> queryWrapper = new LambdaQueryWrapper<>();


Loading…
Cancel
Save