market业务模块token相关基础代码初始化

pull/52/head
ztNozdormu 2023-08-28 22:12:05 +08:00
parent 19f81d622c
commit f7228dccee
33 changed files with 887 additions and 0 deletions

View File

@ -0,0 +1,64 @@
package cn.iocoder.yudao.module.market.enums;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* Market TODO
*
* market 使 1-008-000-000
*/
public interface ErrorCodeConstants {
// ========== 公众号账号 1008000000============
ErrorCode ACCOUNT_NOT_EXISTS = new ErrorCode(1008000000, "公众号账号不存在");
ErrorCode ACCOUNT_GENERATE_QR_CODE_FAIL = new ErrorCode(1008000001, "生成公众号二维码失败,原因:{}");
ErrorCode ACCOUNT_CLEAR_QUOTA_FAIL = new ErrorCode(1008000002, "清空公众号的 API 配额失败,原因:{}");
// ========== 公众号统计 1008001000============
ErrorCode STATISTICS_GET_USER_SUMMARY_FAIL = new ErrorCode(1008001000, "获取粉丝增减数据失败,原因:{}");
ErrorCode STATISTICS_GET_USER_CUMULATE_FAIL = new ErrorCode(1008001001, "获得粉丝累计数据失败,原因:{}");
ErrorCode STATISTICS_GET_UPSTREAM_MESSAGE_FAIL = new ErrorCode(1008001002, "获得消息发送概况数据失败,原因:{}");
ErrorCode STATISTICS_GET_INTERFACE_SUMMARY_FAIL = new ErrorCode(1008001003, "获得接口分析数据失败,原因:{}");
// ========== 公众号标签 1008002000============
ErrorCode TAG_NOT_EXISTS = new ErrorCode(1008002000, "标签不存在");
ErrorCode TAG_CREATE_FAIL = new ErrorCode(1008002001, "创建标签失败,原因:{}");
ErrorCode TAG_UPDATE_FAIL = new ErrorCode(1008002002, "更新标签失败,原因:{}");
ErrorCode TAG_DELETE_FAIL = new ErrorCode(1008002003, "删除标签失败,原因:{}");
ErrorCode TAG_GET_FAIL = new ErrorCode(1008002004, "获得标签失败,原因:{}");
// ========== 公众号粉丝 1008003000============
ErrorCode USER_NOT_EXISTS = new ErrorCode(1008003000, "粉丝不存在");
ErrorCode USER_UPDATE_TAG_FAIL = new ErrorCode(1008003001, "更新粉丝标签失败,原因:{}");
// ========== 公众号素材 1008004000============
ErrorCode MATERIAL_NOT_EXISTS = new ErrorCode(1008004000, "素材不存在");
ErrorCode MATERIAL_UPLOAD_FAIL = new ErrorCode(1008004001, "上传素材失败,原因:{}");
ErrorCode MATERIAL_IMAGE_UPLOAD_FAIL = new ErrorCode(1008004002, "上传图片失败,原因:{}");
ErrorCode MATERIAL_DELETE_FAIL = new ErrorCode(1008004003, "删除素材失败,原因:{}");
// ========== 公众号消息 1008005000============
ErrorCode MESSAGE_SEND_FAIL = new ErrorCode(1008005000, "发送消息失败,原因:{}");
// ========== 公众号发布能力 1008006000============
ErrorCode FREE_PUBLISH_LIST_FAIL = new ErrorCode(1008006000, "获得已成功发布列表失败,原因:{}");
ErrorCode FREE_PUBLISH_SUBMIT_FAIL = new ErrorCode(1008006001, "提交发布失败,原因:{}");
ErrorCode FREE_PUBLISH_DELETE_FAIL = new ErrorCode(1008006002, "删除发布失败,原因:{}");
// ========== 公众号草稿 1008007000============
ErrorCode DRAFT_LIST_FAIL = new ErrorCode(1008007000, "获得草稿列表失败,原因:{}");
ErrorCode DRAFT_CREATE_FAIL = new ErrorCode(1008007001, "创建草稿失败,原因:{}");
ErrorCode DRAFT_UPDATE_FAIL = new ErrorCode(1008007002, "更新草稿失败,原因:{}");
ErrorCode DRAFT_DELETE_FAIL = new ErrorCode(1008007003, "删除草稿失败,原因:{}");
// ========== 公众号菜单 1008008000============
ErrorCode MENU_SAVE_FAIL = new ErrorCode(1008008000, "创建菜单失败,原因:{}");
ErrorCode MENU_DELETE_FAIL = new ErrorCode(1008008001, "删除菜单失败,原因:{}");
// ========== 公众号自动回复 1008009000============
ErrorCode AUTO_REPLY_NOT_EXISTS = new ErrorCode(1008009000, "自动回复不存在");
ErrorCode AUTO_REPLY_ADD_SUBSCRIBE_FAIL_EXISTS = new ErrorCode(1008009001, "操作失败,原因:已存在关注时的回复");
ErrorCode AUTO_REPLY_ADD_MESSAGE_FAIL_EXISTS = new ErrorCode(1008009002, "操作失败,原因:已存在该消息类型的回复");
ErrorCode AUTO_REPLY_ADD_KEYWORD_FAIL_EXISTS = new ErrorCode(1008009003, "操作失败,原因:已关在该关键字的回复");
}

View File

@ -0,0 +1,8 @@
/**
* market
* ,,,,
*
* 1. Controller URL /market/ Module
* 2. DataObject market_ 便
*/
package cn.iocoder.yudao.module.market;

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.market;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
*
*
* https://cloud.iocoder.cn/quick-start/ 文章
* https://cloud.iocoder.cn/quick-start/ 文章
* https://cloud.iocoder.cn/quick-start/ 文章
*
* @author
*/
@SpringBootApplication
public class MarketServerApplication {
public static void main(String[] args) {
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
SpringApplication.run(MarketServerApplication.class, args);
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
// 如果你碰到启动的问题,请认真阅读 https://cloud.iocoder.cn/quick-start/ 文章
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.market.controller.admin.market;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.market.service.info.TokenInfoService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
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 java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 公众号账号")
@RestController
@RequestMapping("/mp/account")
@Validated
public class TokenInfoController {
@Resource
private TokenInfoService tokenInfoService;
// @GetMapping("/page")
// @Operation(summary = "获得公众号账号分页")
// @PreAuthorize("@ss.hasPermission('mp:account:query')")
// public CommonResult<PageResult<MpAccountRespVO>> getAccountPage(@Valid MpAccountPageReqVO pageVO) {
// PageResult<MpAccountDO> pageResult = tokenInfoService.getAccountPage(pageVO);
// return success(MpAccountConvert.INSTANCE.convertPage(pageResult));
// }
}

View File

@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.market.controller.admin.market.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* Base VO VO 使
* VO Swagger
*
* @author fengdan
*/
@Data
public class TokenInfoBaseVO {
@Schema(description = "公众号名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码")
@NotEmpty(message = "公众号名称不能为空")
private String name;
@Schema(description = "公众号微信号", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudaoyuanma")
@NotEmpty(message = "公众号微信号不能为空")
private String account;
@Schema(description = "公众号 appId", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx5b23ba7a5589ecbb")
@NotEmpty(message = "公众号 appId 不能为空")
private String appId;
@Schema(description = "公众号密钥", requiredMode = Schema.RequiredMode.REQUIRED, example = "3a7b3b20c537e52e74afd395eb85f61f")
@NotEmpty(message = "公众号密钥不能为空")
private String appSecret;
@Schema(description = "公众号 token", requiredMode = Schema.RequiredMode.REQUIRED, example = "kangdayuzhen")
@NotEmpty(message = "公众号 token 不能为空")
private String token;
@Schema(description = "加密密钥", example = "gjN+Ksei")
private String aesKey;
@Schema(description = "备注", example = "请关注芋道源码,学习技术")
private String remark;
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.market.controller.admin.market.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 公众号账号分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TokenInfoageReqVO extends PageParam {
@Schema(name = "公众号名称", description = "模糊匹配")
private String name;
@Schema(name = "公众号账号", description = "模糊匹配")
private String account;
@Schema(name = "公众号 appid", description = "模糊匹配")
private String appId;
}

View File

@ -0,0 +1,5 @@
### 请求 /mp/material/page 接口 => 成功
GET {{baseUrl}}/mp/material/page?permanent=true&pageNo=1&pageSize=10
Content-Type: application/json
Authorization: Bearer {{token}}
tenant-id: {{adminTenentId}}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.market.controller.admin.material;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.market.service.rank.TokenRankService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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 java.io.IOException;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 公众号素材")
@RestController
@RequestMapping("/mp/material")
@Validated
public class MpMaterialController {
@Resource
private TokenRankService tokenRankService;
// @GetMapping("/page")
// @Operation(summary = "获得公众号账号分页")
// @PreAuthorize("@ss.hasPermission('mp:account:query')")
// public CommonResult<PageResult<MpAccountRespVO>> getAccountPage(@Valid MpAccountPageReqVO pageVO) {
// PageResult<MpAccountDO> pageResult = tokenRankService.getAccountPage(pageVO);
// return success(MpAccountConvert.INSTANCE.convertPage(pageResult));
// }
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.market.controller.admin.material.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 公众号素材的分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class TokenRankPageReqVO extends PageParam {
@Schema(description = "公众号账号的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
@NotNull(message = "公众号账号的编号不能为空")
private Long accountId;
@Schema(description = "是否永久", example = "true")
private Boolean permanent;
@Schema(description = "文件类型 参见 WxConsts.MediaFileType 枚举", example = "image")
private String type;
}

View File

@ -0,0 +1,6 @@
/**
* RESTful API
* 1. admin yudao-ui-admin
* 2. app APP yudao-ui-app Controller VO App
*/
package cn.iocoder.yudao.module.market.controller;

View File

@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.market.convert.account;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mp.controller.admin.account.vo.MpAccountCreateReqVO;
import cn.iocoder.yudao.module.mp.controller.admin.account.vo.MpAccountRespVO;
import cn.iocoder.yudao.module.mp.controller.admin.account.vo.MpAccountSimpleRespVO;
import cn.iocoder.yudao.module.mp.controller.admin.account.vo.MpAccountUpdateReqVO;
import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface MpAccountConvert {
MpAccountConvert INSTANCE = Mappers.getMapper(MpAccountConvert.class);
MpAccountDO convert(MpAccountCreateReqVO bean);
MpAccountDO convert(MpAccountUpdateReqVO bean);
MpAccountRespVO convert(MpAccountDO bean);
List<MpAccountRespVO> convertList(List<MpAccountDO> list);
PageResult<MpAccountRespVO> convertPage(PageResult<MpAccountDO> page);
List<MpAccountSimpleRespVO> convertList02(List<MpAccountDO> list);
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.market.convert.material;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialRespVO;
import cn.iocoder.yudao.module.mp.controller.admin.material.vo.MpMaterialUploadRespVO;
import cn.iocoder.yudao.module.mp.dal.dataobject.account.MpAccountDO;
import cn.iocoder.yudao.module.mp.dal.dataobject.material.MpMaterialDO;
import me.chanjar.weixin.mp.bean.material.WxMpMaterial;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.io.File;
@Mapper
public interface MpMaterialConvert {
MpMaterialConvert INSTANCE = Mappers.getMapper(MpMaterialConvert.class);
@Mappings({
@Mapping(target = "id", ignore = true),
@Mapping(source = "account.id", target = "accountId"),
@Mapping(source = "account.appId", target = "appId"),
@Mapping(source = "name", target = "name")
})
MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account,
String name);
@Mappings({
@Mapping(target = "id", ignore = true),
@Mapping(source = "account.id", target = "accountId"),
@Mapping(source = "account.appId", target = "appId"),
@Mapping(source = "name", target = "name")
})
MpMaterialDO convert(String mediaId, String type, String url, MpAccountDO account,
String name, String title, String introduction, String mpUrl);
MpMaterialUploadRespVO convert(MpMaterialDO bean);
default WxMpMaterial convert(String name, File file, String title, String introduction) {
return new WxMpMaterial(name, file, title, introduction);
}
PageResult<MpMaterialRespVO> convertPage(PageResult<MpMaterialDO> page);
}

View File

@ -0,0 +1,136 @@
package cn.iocoder.yudao.module.market.dal.dataobject.info;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
* TOKEN DO
*
* @author
*/
@TableName("mk_token_info")
@KeySequence("mk_token_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TokenInfoDO extends BaseDO {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String baseCcy;
/**
* //
*/
private String ctMult;
/**
* 线
*/
private LocalDateTime listDate;
/**
* //
*/
private String ctVal;
/**
* //
*/
private String ctValCcy;
/**
* /
*/
private LocalDateTime expDate;
/**
* BTC-USD//
*/
private String instFamily;
/**
* id BTC-USD-SWAP
*/
private String instId;
/**
* SPOT MARGIN SWAP FUTURES OPTION
*/
private String instType;
/**
* instId
*/
private String lever;
/**
* BTC-USDT-SWAP1
*/
private String lotSz;
/**
*
*/
private String maxIcebergSz;
/**
*
*/
private String maxLmtSz;
/**
*
*/
private String maxMktSz;
/**
*
*/
private String maxStopSz;
/**
*
*/
private String maxTriggerSz;
/**
*
*/
private String maxTwapSz;
/**
*
*/
private String minSz;
/**
* CP
*/
private String optType;
/**
* BTC-USDT USDT /
*/
private String quoteCcy;
/**
* BTC //
*/
private String settleCcy;
/**
* * * live * suspend * preopen线 * test * 线线线 * 线
*/
private String state;
/**
*
*/
private String stk;
/**
* 0.0001
*/
private String tickSz;
/**
* BTC-USD//
*/
private String uly;
/**
* 1 2 3
*/
private Byte exchangeType;
}

View File

@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.market.dal.dataobject.rank;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* TOKEN DO
*
* @author
*/
@TableName("mk_token_rank")
@KeySequence("mk_token_rank_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TokenRankDO extends BaseDO {
/**
* ID
*/
@TableId
private Integer id;
/**
*
*/
private String tokenBaseName;
/**
* (0: 1)
*/
private Byte event;
/**
* (0: 1)
*/
private Byte hot;
/**
*
*/
private Integer capRanking;
/**
*
*/
private Object volRanking;
/**
*
*/
private String concept;
/**
*
*/
private Byte comprehensiveRanking;
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.market.dal.mysql.info;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.market.controller.admin.market.vo.TokenInfoageReqVO;
import cn.iocoder.yudao.module.market.dal.dataobject.info.TokenInfoDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TokenInfoMapper extends BaseMapperX<TokenInfoDO> {
default PageResult<TokenInfoDO> selectPage(TokenInfoageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<TokenInfoDO>()
.likeIfPresent(TokenInfoDO::getInstId, reqVO.getName())
.likeIfPresent(TokenInfoDO::getExchangeType, reqVO.getAccount())
.orderByDesc(TokenInfoDO::getId));
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.market.dal.mysql.rank;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.market.controller.admin.material.vo.TokenRankPageReqVO;
import cn.iocoder.yudao.module.market.dal.dataobject.rank.TokenRankDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TokenRankMapper extends BaseMapperX<TokenRankDO> {
default PageResult<TokenRankDO> selectPage(TokenRankPageReqVO pageReqVO) {
return selectPage(pageReqVO, new LambdaQueryWrapperX<TokenRankDO>()
.eq(TokenRankDO::getHot, pageReqVO.getAccountId())
.eqIfPresent(TokenRankDO::getTokenBaseName, pageReqVO.getPermanent())
.orderByDesc(TokenRankDO::getId));
}
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.yudao.module.market.framework.market.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
*
*
* @author
*/
@Configuration
public class MarketConfiguration {
// @Bean
// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
// public RedisTemplateWxRedisOps redisTemplateWxRedisOps(StringRedisTemplate stringRedisTemplate) {
// return new RedisTemplateWxRedisOps(stringRedisTemplate);
// }
//
// @Bean
// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
// public MpServiceFactory mpServiceFactory(RedisTemplateWxRedisOps redisTemplateWxRedisOps,
// WxMpProperties wxMpProperties,
// MessageReceiveHandler messageReceiveHandler,
// KfSessionHandler kfSessionHandler,
// StoreCheckNotifyHandler storeCheckNotifyHandler,
// MenuHandler menuHandler,
// NullHandler nullHandler,
// SubscribeHandler subscribeHandler,
// UnsubscribeHandler unsubscribeHandler,
// LocationHandler locationHandler,
// ScanHandler scanHandler,
// MessageAutoReplyHandler messageAutoReplyHandler) {
// return new DefaultMpServiceFactory(redisTemplateWxRedisOps, wxMpProperties,
// messageReceiveHandler, kfSessionHandler, storeCheckNotifyHandler, menuHandler,
// nullHandler, subscribeHandler, unsubscribeHandler, locationHandler, scanHandler, messageAutoReplyHandler);
// }
}

View File

@ -0,0 +1,16 @@
package cn.iocoder.yudao.module.market.framework.market.core;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* {@link MarketServiceFactory}
*
* @author
*/
@Slf4j
@RequiredArgsConstructor
public class DefaultMarketServiceFactory implements MarketServiceFactory {
}

View File

@ -0,0 +1,10 @@
package cn.iocoder.yudao.module.market.framework.market.core;
/**
* {@link WxMpService}
*
* @author
*/
public interface MarketServiceFactory {
}

View File

@ -0,0 +1,50 @@
/*
* Copyright (c) 2018-2025, zengtao All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the pig4cloud.com developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: zengtao (w1999wtw3537@gmail.com)
*/
package cn.iocoder.yudao.module.market.framework.market.core.context;
import com.alibaba.ttl.TransmittableThreadLocal;
/**
* Context
*
* {@link WxMpMessageHandler} {@link #getAppId()} appId
*
* @see MpOpenController#handleMessage(String, String, MpOpenHandleMessageReqVO)
*
* @author
*/
public class MarketContextHolder {
/**
* appId
*/
private static final ThreadLocal<String> APPID = new TransmittableThreadLocal<>();
public static void setAppId(String appId) {
APPID.set(appId);
}
public static String getAppId() {
return APPID.get();
}
public static void clear() {
APPID.remove();
}
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.market.framework.market.core.util;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import lombok.extern.slf4j.Slf4j;
import javax.validation.Validator;
/**
*
*
* @author
*/
@Slf4j
public class MarketUtils {
}

View File

@ -0,0 +1,6 @@
/**
* mp framework
*
* @author
*/
package cn.iocoder.yudao.module.market.framework;

View File

@ -0,0 +1,10 @@
package cn.iocoder.yudao.module.market.framework.rpc.config;
import cn.iocoder.yudao.module.infra.api.file.FileApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = FileApi.class)
public class RpcConfiguration {
}

View File

@ -0,0 +1,4 @@
/**
*
*/
package cn.iocoder.yudao.module.market.framework.rpc;

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.market.framework.security.config;
import cn.iocoder.yudao.framework.security.config.AuthorizeRequestsCustomizer;
import cn.iocoder.yudao.module.system.enums.ApiConstants;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
/**
* System Security
*/
@Configuration(proxyBeanMethods = false, value = "systemSecurityConfiguration")
public class SecurityConfiguration {
@Bean("systemAuthorizeRequestsCustomizer")
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
return new AuthorizeRequestsCustomizer() {
@Override
public void customize(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry) {
// TODO 芋艿:这个每个项目都需要重复配置,得捉摸有没通用的方案
// Swagger 接口文档
registry.antMatchers("/v3/api-docs/**").permitAll() // 元数据
.antMatchers("/swagger-ui.html").permitAll(); // Swagger UI
// Druid 监控
registry.antMatchers("/druid/**").anonymous();
// Spring Boot Actuator 的安全配置
registry.antMatchers("/actuator").anonymous()
.antMatchers("/actuator/**").anonymous();
// RPC 服务的安全配置
registry.antMatchers(ApiConstants.PREFIX + "/**").permitAll();
}
};
}
}

View File

@ -0,0 +1,4 @@
/**
*
*/
package cn.iocoder.yudao.module.market.framework.security.core;

View File

@ -0,0 +1,24 @@
package cn.iocoder.yudao.module.market.framework.web.config;
import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* market web Configuration
*
* @author
*/
@Configuration(proxyBeanMethods = false)
public class MpWebConfiguration {
/**
* mp API
*/
@Bean
public GroupedOpenApi mpGroupedOpenApi() {
return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("market");
}
}

View File

@ -0,0 +1,4 @@
/**
* mp web
*/
package cn.iocoder.yudao.module.market.framework.web;

View File

@ -0,0 +1,8 @@
/**
* mp
*
*
* 1. Controller URL /mp/ Module
* 2. DataObject mp_ 便
*/
package cn.iocoder.yudao.module.market;

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.market.service.info;
/**
* Service
*
* @author
*/
public interface TokenInfoService {
/**
* TODO
*/
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.yudao.module.market.service.info;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* Service
*
* @author fengdan
*/
@Slf4j
@Service
@Validated
public class TokenInfoServiceImpl implements TokenInfoService {
}

View File

@ -0,0 +1,12 @@
package cn.iocoder.yudao.module.market.service.rank;
/**
* TokenRank Service
*
* @author
*/
public interface TokenRankService {
}

View File

@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.market.service.rank;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* Service
*
* @author
*/
@Service
@Validated
@Slf4j
public class TokenRankServiceImpl implements TokenRankService {
}