mp:1)引入 less-loader,解决 menu 的 less 样式;2)接入菜单列表接口

This commit is contained in:
YunaiV
2023-01-14 21:24:14 +08:00
parent f271ef8c47
commit 02ec5d455c
12 changed files with 808 additions and 512 deletions

View File

@ -51,7 +51,7 @@ public interface ErrorCodeConstants {
ErrorCode DRAFT_UPDATE_FAIL = new ErrorCode(1006007002, "更新草稿失败,原因:{}");
ErrorCode DRAFT_DELETE_FAIL = new ErrorCode(1006007002, "删除草稿失败,原因:{}");
// TODO 要处理下
ErrorCode MENU_NOT_EXISTS = new ErrorCode(1006001002, "菜单不存在");
// ========== 公众号菜单 1006008000============
ErrorCode MENU_NOT_EXISTS = new ErrorCode(1006008000, "菜单不存在");
}

View File

@ -32,3 +32,8 @@ tenant-id: {{adminTenentId}}
}]
}]
}
### 请求 /mp/menu/list 接口 => 成功
GET {{baseUrl}}/mp/menu/list?accountId=1
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}

View File

@ -1,25 +1,26 @@
package cn.iocoder.yudao.module.mp.controller.admin.menu;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuRespVO;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO;
import cn.iocoder.yudao.module.mp.convert.menu.MpMenuConvert;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import cn.iocoder.yudao.module.mp.service.menu.MpMenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.annotations.*;
import javax.validation.*;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.*;
import cn.iocoder.yudao.module.mp.service.menu.MpMenuService;
@Api(tags = "管理后台 - 微信菜单")
@Api(tags = "管理后台 - 公众号菜单")
@RestController
@RequestMapping("/mp/menu")
@Validated
@ -29,14 +30,14 @@ public class MpMenuController {
private MpMenuService mpMenuService;
@PostMapping("/save")
@ApiOperation("保存微信菜单")
@ApiOperation("保存公众号菜单")
@PreAuthorize("@ss.hasPermission('mp:menu:save')")
public CommonResult<Long> saveMenu(@Valid @RequestBody MpMenuSaveReqVO createReqVO) {
return success(mpMenuService.saveMenu(createReqVO));
}
@DeleteMapping("/delete")
@ApiOperation("删除微信菜单")
@ApiOperation("删除公众号菜单")
@ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('mp:menu:delete')")
public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
@ -45,7 +46,7 @@ public class MpMenuController {
}
@GetMapping("/get")
@ApiOperation("获得微信菜单")
@ApiOperation("获得公众号菜单")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('mp:menu:query')")
public CommonResult<MpMenuRespVO> getMenu(@RequestParam("id") Long id) {
@ -53,4 +54,13 @@ public class MpMenuController {
return success(MpMenuConvert.INSTANCE.convert(menu));
}
@GetMapping("/list")
@ApiOperation("获得公众号菜单列表")
@ApiImplicitParam(name = "accountId", value = "公众号账号的编号", required = true, example = "10", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('mp:menu:query')")
public CommonResult<List<MpMenuRespVO>> getMenuList(@RequestParam("accountId") Long accountId) {
List<MpMenuDO> list = mpMenuService.getMenuListByAccountId(accountId);
return success(MpMenuConvert.INSTANCE.convertList(list));
}
}

View File

@ -1,12 +1,15 @@
package cn.iocoder.yudao.module.mp.controller.admin.menu.vo;
import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
import cn.iocoder.yudao.module.mp.dal.dataobject.message.MpMessageDO;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import me.chanjar.weixin.common.bean.menu.WxMenuButton;
import lombok.Data;
import me.chanjar.weixin.common.api.WxConsts;
import javax.validation.constraints.NotNull;
import java.util.List;
// TODO 芋艿:完善 swagger 注解
/**
* 微信菜单 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
@ -18,4 +21,112 @@ public class MpMenuBaseVO {
@NotNull(message = "公众号账号的编号不能为空")
private Long accountId;
/**
* 微信公众号 appid
*
* 冗余 {@link MpAccountDO#getAppId()}
*/
private String appId;
/**
* 菜单名称
*/
private String name;
/**
* 菜单标识
*
* 支持多 DB 类型时,无法直接使用 key + @TableField("menuKey") 来实现转换,原因是 "menuKey" AS key 而存在报错
*/
private String menuKey;
/**
* 父菜单编号
*/
private Long parentId;
/**
* 排序
*/
private Integer sort;
// ========== 按钮操作 ==========
/**
* 按钮类型
*
* 枚举 {@link WxConsts.MenuButtonType}
*/
private String type;
/**
* 网页链接
*
* 用户点击菜单可打开链接,不超过 1024 字节
*
* 类型为 {@link WxConsts.XmlMsgType} 的 VIEW、MINIPROGRAM
*/
private String url;
/**
* 小程序的 appId
*
* 类型为 {@link WxConsts.MenuButtonType} 的 MINIPROGRAM
*/
private String miniProgramAppId;
/**
* 小程序的页面路径
*
* 类型为 {@link WxConsts.MenuButtonType} 的 MINIPROGRAM
*/
private String miniProgramPagePath;
// ========== 消息内容 ==========
/**
* 消息类型
*
* 当 {@link #type} 为 CLICK、SCANCODE_WAITMSG
*
* 枚举 {@link WxConsts.XmlMsgType} 中的 TEXT、IMAGE、VOICE、VIDEO、NEWS
*/
private String replyMessageType;
/**
* 回复的消息内容
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 TEXT
*/
private String replyContent;
/**
* 回复的媒体 id
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO
*/
private String replyMediaId;
/**
* 回复的媒体 URL
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 IMAGE、VOICE、VIDEO
*/
private String replyMediaUrl;
/**
* 回复的标题
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO
*/
private String replyTitle;
/**
* 回复的描述
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 VIDEO
*/
private String replyDescription;
/**
* 回复的图文消息数组
*
* 消息类型为 {@link WxConsts.XmlMsgType} 的 NEWS
*/
private List<MpMessageDO.Article> replyArticles;
}

View File

@ -1,14 +1,15 @@
package cn.iocoder.yudao.module.mp.convert.menu;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuRespVO;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.*;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import java.util.List;
@Mapper
public interface MpMenuConvert {
@ -19,6 +20,8 @@ public interface MpMenuConvert {
MpMenuRespVO convert(MpMenuDO bean);
List<MpMenuRespVO> convertList(List<MpMenuDO> list);
@Mappings({
@Mapping(source = "menu.appId", target = "appId"),
@Mapping(source = "menu.replyMessageType", target = "type"),

View File

@ -4,6 +4,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface MpMenuMapper extends BaseMapperX<MpMenuDO> {
@ -12,4 +14,8 @@ public interface MpMenuMapper extends BaseMapperX<MpMenuDO> {
MpMenuDO::getMenuKey, menuKey);
}
default List<MpMenuDO> selectListByAccountId(Long accountId) {
return selectList(MpMenuDO::getAccountId, accountId);
}
}

View File

@ -1,21 +1,21 @@
package cn.iocoder.yudao.module.mp.service.menu;
import javax.validation.*;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.*;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import javax.validation.Valid;
import java.util.List;
/**
* 微信菜单 Service 接口
* 公众号菜单 Service 接口
*
* @author 芋道源码
*/
public interface MpMenuService {
/**
* 保存微信菜单
* 保存公众号菜单
*
* @param createReqVO 创建信息
* @return 编号
@ -23,17 +23,17 @@ public interface MpMenuService {
Long saveMenu(@Valid MpMenuSaveReqVO createReqVO);
/**
* 删除微信菜单
* 删除公众号菜单
*
* @param id 编号
*/
void deleteMenu(Long id);
/**
* 获得微信菜单
* 获得公众号菜单
*
* @param id 编号
* @return 微信菜单
* @return 公众号菜单
*/
MpMenuDO getMenu(Long id);
@ -47,4 +47,12 @@ public interface MpMenuService {
*/
WxMpXmlOutMessage reply(String appId, String key, String openid);
/**
* 获得公众号菜单列表
*
* @param accountId 公众号编号
* @return 公众号菜单列表
*/
List<MpMenuDO> getMenuListByAccountId(Long accountId);
}

View File

@ -1,8 +1,10 @@
package cn.iocoder.yudao.module.mp.service.menu;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.MpMenuSaveReqVO;
import cn.iocoder.yudao.module.mp.convert.menu.MpMenuConvert;
import cn.iocoder.yudao.module.mp.dal.dataobject.menu.MpMenuDO;
import cn.iocoder.yudao.module.mp.dal.mysql.menu.MpMenuMapper;
import cn.iocoder.yudao.module.mp.framework.mp.core.MpServiceFactory;
import cn.iocoder.yudao.module.mp.service.message.MpMessageService;
import cn.iocoder.yudao.module.mp.service.message.bo.MpMessageSendOutReqBO;
@ -13,20 +15,16 @@ import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.mp.controller.admin.menu.vo.*;
import cn.iocoder.yudao.module.mp.dal.mysql.menu.MpMenuMapper;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.mp.enums.ErrorCodeConstants.MENU_NOT_EXISTS;
/**
* 微信菜单 Service 实现类
* 公众号菜单 Service 实现类
*
* @author 芋道源码
*/
@ -76,7 +74,6 @@ public class MpMenuServiceImpl implements MpMenuService {
private void validateMenuExists(Long id) {
if (mpMenuMapper.selectById(id) == null) {
// TODO 芋艿:错误码不太对
throw exception(MENU_NOT_EXISTS);
}
}
@ -105,4 +102,9 @@ public class MpMenuServiceImpl implements MpMenuService {
return mpMessageService.sendOutMessage(sendReqBO);
}
@Override
public List<MpMenuDO> getMenuListByAccountId(Long accountId) {
return mpMenuMapper.selectListByAccountId(accountId);
}
}