├── doc ├── image.png └── logo-banner.png ├── readmeImages ├── star.gif ├── screely-1680873488767.png ├── screely-1680873554938.png ├── screely-1680873577743.png ├── screely-1680873612592.png ├── screely-1680873661475.png ├── screely-1680873703554.png ├── screely-1680873817576.png ├── screely-1680873844396.png ├── screely-1680873937150.png ├── screely-1680874308945.png ├── screely-1680874351097.png ├── screely-1680874985938.png ├── screely-1680875090915.png ├── screely-1713235168567.png ├── screely-1713235232698.png └── screely-1713235303271.png ├── .gitee └── ISSUE_TEMPLATE.zh-CN.md ├── tduck-common └── src │ └── main │ └── java │ └── com │ └── tduck │ └── cloud │ ├── common │ ├── validator │ │ └── group │ │ │ ├── AddGroup.java │ │ │ ├── UpdateGroup.java │ │ │ └── Group.java │ ├── constant │ │ ├── ConfigConstants.java │ │ ├── RedisKeyConstants.java │ │ ├── StorageConstants.java │ │ └── ResponseCodeConstants.java │ ├── exception │ │ ├── AuthorizationException.java │ │ └── BaseException.java │ ├── entity │ │ ├── PageRequest.java │ │ ├── IDictEnum.java │ │ └── SysBaseEntity.java │ ├── mybatis │ │ ├── wrapper │ │ │ ├── JsonWrappers.java │ │ │ └── JsonLambdaQueryWrapper.java │ │ └── handler │ │ │ ├── AutoFillMetaInfoHandler.java │ │ │ ├── LongToStringSerializer.java │ │ │ └── BooleanTypeHandler.java │ ├── sms │ │ ├── SmsService.java │ │ ├── SmsPlatformProperties.java │ │ ├── SmsTypeEnum.java │ │ ├── VeesingSmsServiceImpl.java │ │ └── SmsConfiguration.java │ ├── jackson │ │ ├── DictEnumSerializer.java │ │ ├── DictEnumDeSerializer.java │ │ └── LongToStringSerializer.java │ └── util │ │ ├── SecurityUtils.java │ │ └── AsyncProcessUtils.java │ └── envconfig │ ├── entity │ ├── SystemInfoConfig.java │ ├── event │ │ └── EnvConfigRefreshEvent.java │ └── SysEnvConfigEntity.java │ ├── mapper │ └── SysEnvConfigMapper.java │ ├── constant │ └── ConfigConstants.java │ └── service │ └── SysEnvConfigService.java ├── tduck-api ├── docker-entrypoint.sh ├── src │ ├── main │ │ ├── resources │ │ │ ├── templates │ │ │ │ └── mail │ │ │ │ │ ├── reg-code.html │ │ │ │ │ └── form-write-notify.html │ │ │ └── application-prod.yml │ │ └── java │ │ │ └── com │ │ │ └── tduck │ │ │ └── cloud │ │ │ └── api │ │ │ ├── exception │ │ │ └── ValidateCodeException.java │ │ │ ├── annotation │ │ │ ├── LoginUser.java │ │ │ ├── NoRepeatSubmit.java │ │ │ └── NotLogin.java │ │ │ ├── config │ │ │ ├── PlatformSignProperties.java │ │ │ ├── ErrorConfig.java │ │ │ ├── SpringDocConfig.java │ │ │ └── MybatisPlusConfig.java │ │ │ ├── TduckApiApplication.java │ │ │ └── web │ │ │ └── controller │ │ │ ├── PublicController.java │ │ │ ├── SysEnvConfigController.java │ │ │ └── CommonController.java │ └── test │ │ └── com │ │ └── tduck │ │ └── cloud │ │ └── api │ │ └── web │ │ └── controller │ │ └── system │ │ └── CacheTest.java └── Dockerfile ├── tduck-form ├── src │ └── main │ │ └── java │ │ └── com │ │ └── tduck │ │ └── cloud │ │ └── form │ │ ├── service │ │ ├── UserFormLogicService.java │ │ ├── UserFormLinkExtService.java │ │ ├── FormTemplateCategoryService.java │ │ ├── UserFormThemeService.java │ │ ├── UserFormService.java │ │ ├── impl │ │ │ ├── UserFormLogicServiceImpl.java │ │ │ ├── UserFormLinkExtServiceImpl.java │ │ │ ├── FormTemplateCategoryServiceImpl.java │ │ │ ├── UserFormServiceImpl.java │ │ │ ├── UserFormThemeServiceImpl.java │ │ │ └── UserFormViewCountServiceImpl.java │ │ ├── UserFormViewCountService.java │ │ ├── FormTemplateService.java │ │ ├── FormDashboardService.java │ │ ├── FormThemeService.java │ │ ├── UserFormItemService.java │ │ ├── UserFormSettingService.java │ │ └── UserFormDataService.java │ │ ├── request │ │ ├── CheckWritePwdRequest.java │ │ ├── QueryProThemeRequest.java │ │ ├── QueryFormTemplateTypeRequest.java │ │ ├── PublicQueryRequest.java │ │ ├── CheckPhoneCodeRequest.java │ │ ├── QueryFormItemRequest.java │ │ ├── QueryFormTemplateRequest.java │ │ ├── SortFormItemRequest.java │ │ ├── CreateGoodsPayRequest.java │ │ ├── ExportRequest.java │ │ └── QueryFormRequest.java │ │ ├── mapper │ │ ├── UserFormMapper.java │ │ ├── FormThemeMapper.java │ │ ├── UserFormAuthMapper.java │ │ ├── UserFormItemMapper.java │ │ ├── UserFormSettingMapper.java │ │ ├── FormTemplateMapper.java │ │ ├── FormThemeCategoryMapper.java │ │ ├── UserFormThemeMapper.java │ │ ├── UserFormLogicMapper.java │ │ ├── FormTemplateCategoryMapper.java │ │ ├── UserFormLinkExtMapper.java │ │ └── UserFormViewCountMapper.java │ │ ├── entity │ │ ├── struct │ │ │ ├── UploadResultStruct.java │ │ │ ├── ImageSelectSchemaStruct.java │ │ │ ├── ExamConfigSchemaStruct.java │ │ │ ├── InputResultStruct.java │ │ │ ├── MatrixInputSchemaStruct.java │ │ │ ├── MatrixSelectSchemaStruct.java │ │ │ ├── ReserveSchemaStruct.java │ │ │ ├── CheckboxSchemaStruct.java │ │ │ ├── GoodsSchemaStruct.java │ │ │ ├── RandomNumberResultStruct.java │ │ │ ├── ReserveTimeRangeSchemaStruct.java │ │ │ ├── OptionQuotaListStruct.java │ │ │ ├── CascaderSchemaStruct.java │ │ │ └── OptionSchemaStruct.java │ │ ├── enums │ │ │ ├── FormPermsBtnTypeEnum.java │ │ │ ├── FormLogicConditionExpressionEnum.java │ │ │ ├── FormSourceTypeEnum.java │ │ │ ├── FormStatusEnum.java │ │ │ ├── EsTypeEnum.java │ │ │ ├── FormTypeEnum.java │ │ │ ├── TimeRangeEnum.java │ │ │ └── FormItemTypeEnum.java │ │ ├── FormTemplateCategoryEntity.java │ │ ├── UserFormLinkExtEntity.java │ │ ├── FormThemeCategoryEntity.java │ │ ├── UserFormViewCountEntity.java │ │ ├── FormThemeEntity.java │ │ ├── UserFormSettingEntity.java │ │ └── UserFormAuthEntity.java │ │ ├── constant │ │ ├── FormSettingConstants.java │ │ ├── FormConstants.java │ │ └── FormRedisKeyConstants.java │ │ ├── vo │ │ ├── UserFormThemeVO.java │ │ ├── FormDataTableVO.java │ │ ├── OperateFormItemVO.java │ │ ├── RecycleFormVO.java │ │ ├── SituationVO.java │ │ ├── UserFormDetailVO.java │ │ └── FormFieldVO.java │ │ ├── util │ │ ├── HtmlUtils.java │ │ ├── ShortIdUtils.java │ │ └── FormAuthUtils.java │ │ └── data │ │ ├── BaseFormatDataHandler.java │ │ ├── SortFormatDataHandler.java │ │ ├── UploadFormatDataHandler.java │ │ ├── DeptSelectFormatDataHandler.java │ │ ├── DefaultFormatDataHandler.java │ │ ├── ProvinceCityFormatDataHandler.java │ │ ├── SubFormFormatDataHandler.java │ │ ├── ReserveDayFormatDataHandler.java │ │ ├── GoodsSelectFormatDataHandler.java │ │ └── MatrixSelectFormatDataHandler.java └── pom.xml ├── tduck-account ├── src │ └── main │ │ └── java │ │ └── com │ │ └── tduck │ │ └── cloud │ │ └── account │ │ ├── constant │ │ ├── AccountConstants.java │ │ └── AccountRedisKeyConstants.java │ │ ├── mapper │ │ ├── UserMapper.java │ │ ├── UserTokenMapper.java │ │ └── UserAuthorizeMapper.java │ │ ├── request │ │ ├── QqLoginRequest.java │ │ ├── AccountLoginRequest.java │ │ ├── RetrievePasswordRequest.java │ │ ├── RegisterAccountRequest.java │ │ └── UpdateUserRequest.java │ │ ├── vo │ │ ├── LoginUserVO.java │ │ └── UserDetailVO.java │ │ ├── entity │ │ ├── UserTokenEntity.java │ │ ├── enums │ │ │ ├── UserAuthorizeTypeEnum.java │ │ │ └── AccountChannelEnum.java │ │ └── UserAuthorizeEntity.java │ │ ├── service │ │ ├── UserTokenService.java │ │ ├── UserValidateService.java │ │ └── UserAuthorizeService.java │ │ └── util │ │ └── PasswordUtils.java └── pom.xml ├── tduck-wx-mp ├── src │ └── main │ │ └── java │ │ └── com │ │ └── tduck │ │ └── cloud │ │ └── wx │ │ └── mp │ │ ├── mapper │ │ └── WxMpUserMapper.java │ │ ├── handler │ │ ├── AbstractHandler.java │ │ ├── scan │ │ │ ├── ScanStrategy.java │ │ │ ├── SubNotifyScanStrategy.java │ │ │ ├── ScanStrategyContext.java │ │ │ ├── LoginScanStrategy.java │ │ │ └── BindAccountScanStrategy.java │ │ ├── NullHandler.java │ │ ├── KfSessionHandler.java │ │ ├── StoreCheckNotifyHandler.java │ │ ├── LogHandler.java │ │ ├── ScanHandler.java │ │ ├── MenuHandler.java │ │ ├── LocationHandler.java │ │ └── UnsubscribeHandler.java │ │ ├── vo │ │ └── WxMpUserVO.java │ │ ├── constant │ │ └── WxMpRedisKeyConstants.java │ │ ├── service │ │ ├── WxMpUserMsgService.java │ │ ├── WxMpUserService.java │ │ └── impl │ │ │ └── WxMpUserMsgServiceImpl.java │ │ ├── request │ │ └── WxMpQrCodeGenRequest.java │ │ ├── builder │ │ ├── AbstractBuilder.java │ │ ├── TextBuilder.java │ │ └── ImageBuilder.java │ │ ├── event │ │ └── WxMpUserSubscribeEvent.java │ │ ├── config │ │ └── WxMpProperties.java │ │ └── entity │ │ └── WxMpUserEntity.java └── pom.xml ├── tduck-webhook ├── src │ ├── main │ │ └── java │ │ │ └── com │ │ │ └── tduck │ │ │ └── cloud │ │ │ └── webhook │ │ │ ├── exception │ │ │ └── SendException.java │ │ │ ├── mapper │ │ │ ├── WebhookConfigMapper.java │ │ │ └── WebhookEventMapper.java │ │ │ ├── service │ │ │ ├── WebhookEventService.java │ │ │ ├── impl │ │ │ │ └── WebhookEventServiceImpl.java │ │ │ └── WebhookConfigService.java │ │ │ ├── event │ │ │ ├── SendTestWebhookEvent.java │ │ │ └── AddWebhookEvent.java │ │ │ ├── constant │ │ │ └── WebhookEventConstants.java │ │ │ └── entity │ │ │ └── WebhookEventEntity.java │ └── test │ │ └── java │ │ └── com │ │ └── tduck │ │ └── cloud │ │ └── webhook │ │ └── WebhookSenderServiceTest.java └── pom.xml ├── tduck-storage └── src │ └── main │ └── java │ └── com │ └── tduck │ └── cloud │ └── storage │ ├── exception │ ├── StorageException.java │ └── InvalidExtensionException.java │ ├── enums │ └── OssTypeEnum.java │ └── cloud │ ├── OssStorageConfig.java │ ├── OssStorageService.java │ └── LocalStorageService.java ├── .gitignore ├── LICENSE └── docker └── docker-compose.yaml /doc/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/doc/image.png -------------------------------------------------------------------------------- /doc/logo-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/doc/logo-banner.png -------------------------------------------------------------------------------- /readmeImages/star.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/star.gif -------------------------------------------------------------------------------- /readmeImages/screely-1680873488767.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873488767.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873554938.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873554938.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873577743.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873577743.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873612592.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873612592.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873661475.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873661475.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873703554.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873703554.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873817576.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873817576.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873844396.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873844396.png -------------------------------------------------------------------------------- /readmeImages/screely-1680873937150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680873937150.png -------------------------------------------------------------------------------- /readmeImages/screely-1680874308945.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680874308945.png -------------------------------------------------------------------------------- /readmeImages/screely-1680874351097.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680874351097.png -------------------------------------------------------------------------------- /readmeImages/screely-1680874985938.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680874985938.png -------------------------------------------------------------------------------- /readmeImages/screely-1680875090915.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1680875090915.png -------------------------------------------------------------------------------- /readmeImages/screely-1713235168567.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1713235168567.png -------------------------------------------------------------------------------- /readmeImages/screely-1713235232698.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1713235232698.png -------------------------------------------------------------------------------- /readmeImages/screely-1713235303271.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TDuckCloud/tduck-platform/HEAD/readmeImages/screely-1713235303271.png -------------------------------------------------------------------------------- /.gitee/ISSUE_TEMPLATE.zh-CN.md: -------------------------------------------------------------------------------- 1 | ### 版本信息 2 | 是否是最新代码:是/否 3 | 4 | ### 演示环境是否有该问题? 5 | 演示环境地址:https://demo.tduckapp.com 6 | 提供你复现出该问题的演示环境地址 7 | 8 | ### 回显步骤 9 | 我操作了xxx 然后出现了xxx 10 | 11 | ### 报错信息 、截图 截图 12 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/validator/group/AddGroup.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.validator.group; 2 | 3 | /** 4 | * @description: 添加校验组 5 | * @author: smalljop 6 | * @create: 2018-10-12 10:00 7 | **/ 8 | public interface AddGroup { 9 | } 10 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/validator/group/UpdateGroup.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.validator.group; 2 | 3 | /** 4 | * @description: 修改校验组 5 | * @author: smalljop 6 | * @create: 2018-10-12 10:00 7 | **/ 8 | public interface UpdateGroup { 9 | } 10 | -------------------------------------------------------------------------------- /tduck-api/docker-entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | java $JAVA_OPTS -server \ 3 | -XX:+UnlockExperimentalVMOptions \ 4 | -XX:+UseCGroupMemoryLimitForHeap \ 5 | -XX:-OmitStackTraceInFastThrow \ 6 | -Djava.security.egd=file:/dev/./urandom \ 7 | org.springframework.boot.loader.JarLauncher 8 | 9 | 10 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/envconfig/entity/SystemInfoConfig.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.envconfig.entity; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author : tduck 7 | * @since : 2023/04/06 10:59 8 | **/ 9 | @Data 10 | public class SystemInfoConfig { 11 | private String webBaseUrl; 12 | } 13 | -------------------------------------------------------------------------------- /tduck-api/src/main/resources/templates/mail/reg-code.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 注册验证码 6 | 7 | 8 |

欢迎您注册TDuck,验证码五分钟内有效。

9 | 您的验证码为: 10 | 11 | 12 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/UserFormLogicService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.form.entity.UserFormLogicEntity; 5 | 6 | public interface UserFormLogicService extends IService { 7 | } 8 | -------------------------------------------------------------------------------- /tduck-api/src/main/resources/templates/mail/form-write-notify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TDUCK-您的项目收到新的反馈 6 | 7 | 8 |

您的项目

收到新的反馈 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/CheckWritePwdRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | @Data 8 | public class CheckWritePwdRequest { 9 | 10 | @NotBlank 11 | private String formKey; 12 | @NotBlank 13 | private String password; 14 | } 15 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/constant/ConfigConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.constant; 2 | 3 | /** 4 | * @description: 配置表key 5 | * @author: smalljop 6 | * @create: 2020-02-18 23:22 7 | **/ 8 | public interface ConfigConstants { 9 | /** 10 | * OSS配置 11 | */ 12 | String CLOUD_STORAGE_CONFIG_KEY = "CloudStorageConfigKey"; 13 | } 14 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/constant/RedisKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.constant; 2 | 3 | /** 4 | * @description: redis key常量 5 | * @author: smalljop 6 | * @create: 2020-02-12 22:34 7 | **/ 8 | public interface RedisKeyConstants { 9 | /** 10 | * 用户token 11 | */ 12 | String USER_TOKEN = "user:token:{}"; 13 | 14 | 15 | } 16 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/QueryProThemeRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 表单主题查询 8 | * @create : 2020-11-24 10:15 9 | **/ 10 | @Data 11 | public class QueryProThemeRequest { 12 | private String color; 13 | 14 | private Long style; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/exception/AuthorizationException.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.exception; 2 | 3 | /** 4 | * @author : smalljop 5 | * @description : 授权异常 6 | * @create : 2020-11-27 14:37 7 | **/ 8 | public class AuthorizationException extends BaseException { 9 | public AuthorizationException(String msg) { 10 | super(msg); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/constant/AccountConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.constant; 2 | 3 | /** 4 | * @author : smalljop 5 | * @description : 6 | * @create : 2020-11-11 18:16 7 | **/ 8 | public interface AccountConstants { 9 | /** 10 | * 默认头像 11 | */ 12 | String DEFAULT_AVATAR = "https://s1.locimg.com/2023/05/16/17db376b12ec4.png"; 13 | } 14 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/QueryFormTemplateTypeRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 查询表单模板分页 8 | * @create : 2020-12-10 15:04 9 | **/ 10 | @Data 11 | public class QueryFormTemplateTypeRequest { 12 | 13 | 14 | @Data 15 | public static class List { 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.account.entity.UserEntity; 5 | 6 | /** 7 | * 用户(AcUser)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-10 18:10:41 11 | */ 12 | public interface UserMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormEntity; 5 | 6 | /** 7 | * 表单表(Form)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-18 18:16:17 11 | */ 12 | public interface UserFormMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/mapper/UserTokenMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.account.entity.UserTokenEntity; 5 | 6 | /** 7 | * 用户tokenMapper接口 8 | * 9 | * @author tduck 10 | * @date 2023-04-04 16:11:29 11 | */ 12 | public interface UserTokenMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/FormThemeMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.FormThemeEntity; 5 | 6 | /** 7 | * 表单主题外观模板(FormTheme)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-23 18:33:54 11 | */ 12 | public interface FormThemeMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/mapper/WxMpUserMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.wx.mp.entity.WxMpUserEntity; 5 | 6 | /** 7 | * 微信公众号用户 (WxMpUser)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-12-01 17:04:37 11 | */ 12 | public interface WxMpUserMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormAuthMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormAuthEntity; 5 | 6 | /** 7 | * 表单权限授权对象Mapper接口 8 | * 9 | * @author tduck-gen 10 | * @date 2021-08-17 14:37:42 11 | */ 12 | public interface UserFormAuthMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormItemMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormItemEntity; 5 | 6 | /** 7 | * 表单项(FormItem)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-19 10:49:17 11 | */ 12 | public interface UserFormItemMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormSettingMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormSettingEntity; 5 | 6 | /** 7 | * 表单设置 8 | * 9 | * @author tduck 10 | * @date 2021-08-12 16:19:57 11 | */ 12 | public interface UserFormSettingMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/exception/SendException.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.exception; 2 | 3 | import com.tduck.cloud.common.exception.BaseException; 4 | 5 | /** 6 | * 发送异常 7 | * 8 | * @author : tduck 9 | * @since : 2023/03/27 16:28 10 | **/ 11 | public class SendException extends BaseException { 12 | public SendException(String msg) { 13 | super(msg); 14 | } 15 | 16 | 17 | } 18 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/FormTemplateMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.FormTemplateEntity; 5 | 6 | /** 7 | * 表单模板(FormTemplate)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2021-01-06 10:43:00 11 | */ 12 | public interface FormTemplateMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/FormThemeCategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.FormThemeCategoryEntity; 5 | 6 | /** 7 | * 表单主题分类 8 | * 9 | * @author smalljop 10 | * @since 2021-01-06 10:51:05 11 | */ 12 | public interface FormThemeCategoryMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/exception/ValidateCodeException.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.exception; 2 | 3 | import com.tduck.cloud.common.exception.BaseException; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 验证码错误 8 | * @create : 2020-12-14 16:00 9 | **/ 10 | public class ValidateCodeException extends BaseException { 11 | public ValidateCodeException(String msg) { 12 | super(msg); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormThemeMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormThemeEntity; 5 | 6 | /** 7 | * 表单主题(UserFormTheme)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-25 13:36:31 11 | */ 12 | public interface UserFormThemeMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/envconfig/mapper/SysEnvConfigMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.envconfig.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.envconfig.entity.SysEnvConfigEntity; 5 | 6 | /** 7 | * 系统环境配置Mapper接口 8 | * 9 | * @author tduck-gen 10 | * @date 2021-12-28 15:06:17 11 | */ 12 | public interface SysEnvConfigMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormLogicMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormLogicEntity; 5 | 6 | /** 7 | * 用户表单逻辑表(UserFormLogic)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-11-18 18:16:17 11 | */ 12 | public interface UserFormLogicMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/UserFormLinkExtService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.form.entity.UserFormLinkExtEntity; 5 | 6 | /** 7 | * 单链接扩展值Service接口 8 | * 9 | * @author tduck-gen 10 | * @date 2021-12-14 14:26:38 11 | */ 12 | public interface UserFormLinkExtService extends IService { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/mapper/WebhookConfigMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.webhook.entity.WebhookConfigEntity; 5 | 6 | /** 7 | * Webhook配置Mapper接口 8 | * 9 | * @author tduck-gen 10 | * @date 2023-03-27 13:50:06 11 | */ 12 | public interface WebhookConfigMapper extends BaseMapper { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/mapper/WebhookEventMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.mapper; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import com.tduck.cloud.webhook.entity.WebhookEventEntity; 6 | 7 | /** 8 | * Webhook事件Mapper接口 9 | * 10 | * @author tduck-gen 11 | * @date 2023-03-27 13:50:06 12 | */ 13 | public interface WebhookEventMapper extends BaseMapper { 14 | 15 | } 16 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/service/WebhookEventService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.webhook.entity.WebhookEventEntity; 5 | 6 | /** 7 | * Webhook事件Service接口 8 | * 9 | * @author tduck-gen 10 | * @date 2023-03-27 13:50:06 11 | */ 12 | public interface WebhookEventService extends IService { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /tduck-api/Dockerfile: -------------------------------------------------------------------------------- 1 | # 使用 openjdk:8-jdk-alpine 作为基础镜像 2 | FROM openjdk:8-jdk-alpine 3 | 4 | # 安装字体和 fontconfig 5 | RUN apk add --no-cache ttf-dejavu fontconfig 6 | 7 | # 设置工作目录 8 | WORKDIR /application 9 | 10 | # 将构建好的 JAR 文件拷贝到容器中,假设你已经在本地生成了 JAR 文件 11 | ARG JAR_FILE=target/tduck-api.jar 12 | COPY ${JAR_FILE} application.jar 13 | 14 | # 暴露 Spring Boot 默认的端口 8999 15 | EXPOSE 8999 16 | 17 | # 运行 Spring Boot 应用 18 | ENTRYPOINT ["java", "-jar", "application.jar"] 19 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/mapper/UserAuthorizeMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.account.entity.UserAuthorizeEntity; 5 | 6 | /** 7 | * 第三方用户授权信息(AcUserAuthorize)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2020-12-09 17:43:15 11 | */ 12 | public interface UserAuthorizeMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/AbstractHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler; 2 | 3 | import me.chanjar.weixin.mp.api.WxMpMessageHandler; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | 7 | /** 8 | * @author Binary Wang(https://github.com/binarywang) 9 | */ 10 | public abstract class AbstractHandler implements WxMpMessageHandler { 11 | protected Logger logger = LoggerFactory.getLogger(getClass()); 12 | } 13 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/FormTemplateCategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.FormTemplateCategoryEntity; 5 | 6 | /** 7 | * 表单模板分类(FormTemplateType)表数据库访问层 8 | * 9 | * @author smalljop 10 | * @since 2021-01-06 10:51:05 11 | */ 12 | public interface FormTemplateCategoryMapper extends BaseMapper { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/FormTemplateCategoryService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.form.entity.FormTemplateCategoryEntity; 5 | 6 | /** 7 | * 表单模板分类(FormTemplateType)表服务接口 8 | * 9 | * @author smalljop 10 | * @since 2021-01-06 10:51:06 11 | */ 12 | public interface FormTemplateCategoryService extends IService { 13 | 14 | } -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/request/QqLoginRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.request; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : qq登录 8 | * @create : 2020-12-09 18:30 9 | **/ 10 | @Data 11 | public class QqLoginRequest { 12 | 13 | 14 | private String redirectUri; 15 | 16 | private String authorizeCode; 17 | 18 | /** 19 | * 请求Ip地址 20 | */ 21 | private String requestIp; 22 | } 23 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/PublicQueryRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | 4 | import com.tduck.cloud.common.entity.PageRequest; 5 | import lombok.Data; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | @Data 11 | public class PublicQueryRequest extends PageRequest { 12 | private String formKey; 13 | 14 | private Long queryId; 15 | 16 | private Map queryParams = new HashMap<>(); 17 | } 18 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/vo/WxMpUserVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @NoArgsConstructor 9 | @AllArgsConstructor 10 | public class WxMpUserVO { 11 | /** 12 | * 昵称 13 | */ 14 | private String nickname; 15 | /** 16 | * 头像 17 | */ 18 | private String headImgUrl; 19 | 20 | private String openId; 21 | } 22 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/constant/StorageConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.constant; 2 | 3 | /** 4 | * @description: 文件路径常量 5 | * @author: smalljop 6 | * @create: 2020-02-19 14:40 7 | **/ 8 | public interface StorageConstants { 9 | 10 | /** 11 | * 默认文件上传路径前缀 12 | */ 13 | String FILE_UPLOAD_PREFIX = "manage-platform"; 14 | /** 15 | * 头像上传地址 16 | */ 17 | String AVATAR_UPLOAD_PREFIX = "manage-platform/avatar"; 18 | } 19 | -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/annotation/LoginUser.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 登录用户信息 10 | * 11 | * @author Mark sunlightcs@gmail.com 12 | */ 13 | @Target(ElementType.PARAMETER) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface LoginUser { 16 | 17 | } 18 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/constant/WxMpRedisKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.constant; 2 | 3 | /** 4 | * @description: redis key常量 5 | * @author: smalljop 6 | * @create: 2020-02-12 22:34 7 | **/ 8 | public interface WxMpRedisKeyConstants { 9 | /** 10 | * 微信登录二维码Id 11 | */ 12 | String WX_MP_LOGIN_QRCODE = "wx:mp:login:{}"; 13 | 14 | /** 15 | * 订阅通知 16 | */ 17 | String WX_MP_SUB_NOTIFY = "wx:mp:sub:notify:{}"; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/UploadResultStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 上传收集结果 10 | * @create : 2021/06/07 16:37 11 | **/ 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class UploadResultStruct { 16 | 17 | private String name; 18 | private String url; 19 | } 20 | -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/annotation/NoRepeatSubmit.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.annotation; 2 | 3 | 4 | import java.lang.annotation.ElementType; 5 | import java.lang.annotation.Retention; 6 | import java.lang.annotation.RetentionPolicy; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * 不允许重复提交注解 11 | * 12 | * @author smalljop 13 | */ 14 | @Target({ElementType.METHOD, ElementType.TYPE}) 15 | @Retention(RetentionPolicy.RUNTIME) 16 | public @interface NoRepeatSubmit { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/annotation/NotLogin.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * 不需要登录的接口 10 | * @author : tduck 11 | * @since : 2023/03/31 15:32 12 | **/ 13 | @Target({ElementType.METHOD, ElementType.TYPE}) 14 | @Retention(RetentionPolicy.RUNTIME) 15 | public @interface NotLogin { 16 | } 17 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/service/WxMpUserMsgService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.service; 2 | 3 | /** 4 | * 公众号用户消息 5 | * 6 | * @author : smalljop 7 | * @description : 8 | * @create : 2020-12-02 10:34 9 | **/ 10 | public interface WxMpUserMsgService { 11 | 12 | /** 13 | * 发送文本客服消息 14 | * 15 | * @param appId 16 | * @param openId 17 | * @param content 18 | */ 19 | void sendKfTextMsg(String appId, String openId, String content); 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/CheckPhoneCodeRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 检查验证码是否正确 10 | * @create : 2020-11-10 18:17 11 | **/ 12 | @Data 13 | public class CheckPhoneCodeRequest { 14 | @NotBlank(message = "手机号不能为空") 15 | private String phoneNumber; 16 | 17 | @NotBlank(message = "验证码不能为空") 18 | private String code; 19 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/constant/FormSettingConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.constant; 2 | 3 | /** 4 | * @author : wangqing 5 | * @description : 表单设置项常量 6 | * @create : 2022/07/07 11:49 7 | **/ 8 | public interface FormSettingConstants { 9 | 10 | /** 11 | * 表单提交后显示类型字段名称 12 | */ 13 | String SUBMIT_SHOW_TYPE_KEY = "submitShowType"; 14 | 15 | /** 16 | * 自定义提示页面内容 17 | */ 18 | String SUBMIT_SHOW_CUSTOM_PAGE_KEY = "submitShowCustomPage"; 19 | 20 | 21 | } 22 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/ImageSelectSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 选项结构 10 | * @create : 2021/06/07 16:37 11 | **/ 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class ImageSelectSchemaStruct extends OptionSchemaStruct{ 16 | 17 | private boolean multiple; 18 | 19 | 20 | } 21 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/validator/group/Group.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2016-2019 人人开源 All rights reserved. 3 | *

4 | * https://www.renren.io 5 | *

6 | * 版权所有,侵权必究! 7 | */ 8 | 9 | package com.tduck.cloud.common.validator.group; 10 | 11 | import javax.validation.GroupSequence; 12 | 13 | /** 14 | * 定义校验顺序,如果AddGroup组失败,则UpdateGroup组不会再校验 15 | * 16 | * @author Mark sunlightcs@gmail.com 17 | */ 18 | @GroupSequence({AddGroup.class, UpdateGroup.class}) 19 | public interface Group { 20 | 21 | } 22 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/entity/PageRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.entity; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author : smalljop 8 | * @description : 分页 9 | * @create : 2020-12-09 10:47 10 | **/ 11 | @Data 12 | public class PageRequest { 13 | 14 | private long current = 1; 15 | private long size = 50; 16 | 17 | 18 | public Page toMybatisPage() { 19 | return new Page(current, size); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tduck-storage/src/main/java/com/tduck/cloud/storage/exception/StorageException.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.storage.exception; 2 | 3 | import com.tduck.cloud.common.exception.BaseException; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 异常 8 | * @create : 2020-11-10 10:49 9 | **/ 10 | public class StorageException extends BaseException { 11 | public StorageException(String msg) { 12 | super(msg); 13 | } 14 | 15 | public StorageException(String msg, Throwable e) { 16 | super(msg, e); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/QueryFormItemRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 查询表单问题 10 | * @create : 2021/06/03 14:45 11 | **/ 12 | @Data 13 | public class QueryFormItemRequest { 14 | 15 | /** 16 | * 表单key 17 | */ 18 | @NotBlank 19 | private String key; 20 | /** 21 | * 是显示类型 22 | */ 23 | private Boolean displayType; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/vo/UserFormThemeVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.vo; 2 | 3 | import com.tduck.cloud.form.entity.UserFormThemeEntity; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author : smalljop 8 | * @description : 表单主题 9 | * @create : 2020-11-25 17:33 10 | **/ 11 | @Data 12 | public class UserFormThemeVO extends UserFormThemeEntity { 13 | 14 | /** 15 | * 头部图片 16 | */ 17 | private String headImgUrl; 18 | 19 | 20 | /** 21 | * 按钮颜色 22 | */ 23 | private String btnsColor; 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | /logs/ 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ !**/src/main/**/build/ 29 | !**/src/test/**/build/ 30 | 31 | ### VS Code ### 32 | .vscode/ 33 | /tduck-storage/target/ 34 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormLinkExtMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormLinkExtEntity; 5 | import org.springframework.stereotype.Component; 6 | import org.springframework.stereotype.Service; 7 | 8 | /** 9 | * 单链接扩展值Mapper接口 10 | * 11 | * @author tduck-gen 12 | * @date 2021-12-14 14:26:38 13 | */ 14 | @Component 15 | @Service 16 | public interface UserFormLinkExtMapper extends BaseMapper { 17 | 18 | } 19 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/vo/FormDataTableVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.vo; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * 表单数据表格 11 | */ 12 | @Data 13 | @NoArgsConstructor 14 | public class FormDataTableVO { 15 | /** 16 | * 数据列表 17 | */ 18 | private List rows; 19 | 20 | private Long total; 21 | 22 | public FormDataTableVO(List rows, Long total) { 23 | this.rows = rows; 24 | this.total = total; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/ExamConfigSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | @Data 8 | public class ExamConfigSchemaStruct { 9 | 10 | /** 11 | * 是否启用考试 12 | */ 13 | private Boolean enableScore; 14 | 15 | /** 16 | * 积分方式 17 | */ 18 | private String scoringType; 19 | 20 | 21 | /** 22 | * 分数 23 | */ 24 | private BigDecimal score; 25 | 26 | /** 27 | * 答案 28 | */ 29 | private String answer; 30 | } 31 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/QueryFormTemplateRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import com.tduck.cloud.common.entity.PageRequest; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author : smalljop 8 | * @description : 查询表单模板 9 | * @create : 2020-12-10 15:04 10 | **/ 11 | @Data 12 | public class QueryFormTemplateRequest { 13 | 14 | 15 | /** 16 | * 分页查询 17 | */ 18 | @Data 19 | public static class Page extends PageRequest { 20 | 21 | private String name; 22 | 23 | private Long type; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/mybatis/wrapper/JsonWrappers.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.mybatis.wrapper; 2 | 3 | /** 4 | * msyql 查询包装类 5 | * 6 | * @author : smalljop 7 | * @description : 8 | * @create : 2020-11-24 11:56 9 | **/ 10 | public class JsonWrappers { 11 | 12 | 13 | /** 14 | * 获取 LambdaQueryWrapper<T> 15 | * 16 | * @param 实体类泛型 17 | * @return LambdaQueryWrapper<T> 18 | */ 19 | public static JsonLambdaQueryWrapper jsonLambdaQuery() { 20 | return new JsonLambdaQueryWrapper<>(); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/UserFormThemeService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.form.entity.UserFormThemeEntity; 5 | 6 | /** 7 | * 表单表单项(UserFormTheme)表服务接口 8 | * 9 | * @author smalljop 10 | * @since 2020-11-25 13:36:31 11 | */ 12 | public interface UserFormThemeService extends IService { 13 | 14 | /** 15 | * 获取表单主题详情 16 | * 17 | * @param key 18 | * @return 19 | */ 20 | UserFormThemeEntity getByKey(String key); 21 | } -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/scan/ScanStrategy.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler.scan; 2 | 3 | import com.tduck.cloud.wx.mp.request.WxMpQrCodeGenRequest; 4 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 5 | 6 | /** 7 | * @author : smalljop 8 | * @description : 扫码处理基本 9 | * @create : 2020-12-01 17:45 10 | **/ 11 | public interface ScanStrategy { 12 | 13 | 14 | /*** 15 | * 处理 16 | * @param request 17 | * @return 18 | */ 19 | WxMpXmlOutMessage handle(String appId, String openId, WxMpQrCodeGenRequest request); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/request/AccountLoginRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 账号登录请求 10 | * @create : 2020-11-10 18:17 11 | **/ 12 | @Data 13 | public class AccountLoginRequest { 14 | 15 | @NotBlank(message = "请填写账号") 16 | private String account; 17 | @NotBlank(message = "请填写密码") 18 | private String password; 19 | 20 | /** 21 | * 请求Ip地址 22 | */ 23 | private String requestIp; 24 | } 25 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/UserFormService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.form.entity.UserFormEntity; 5 | 6 | /** 7 | * 表单表(Form)表服务接口 8 | * 9 | * @author smalljop 10 | * @since 2020-11-18 18:16:18 11 | */ 12 | public interface UserFormService extends IService { 13 | 14 | 15 | /** 16 | * 根据key获取 17 | * 18 | * @param key key 19 | * @return UserFormEntity 20 | */ 21 | UserFormEntity getByKey(final String key); 22 | 23 | 24 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/util/HtmlUtils.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.util; 2 | 3 | import cn.hutool.http.HtmlUtil; 4 | import lombok.experimental.UtilityClass; 5 | 6 | @UtilityClass 7 | public class HtmlUtils extends HtmlUtil { 8 | 9 | 10 | /** 11 | * 清除标签 还原转义文本 12 | * @param content 13 | * @return 14 | */ 15 | public static String cleanHtmlTag(String content) { 16 | // 清除HTML标签和空格 html编码解码 17 | return HtmlUtil.unescape(content).replaceAll("(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)", "").replaceAll(NBSP, ""); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/impl/UserFormLogicServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.tduck.cloud.form.entity.UserFormLogicEntity; 5 | import com.tduck.cloud.form.mapper.UserFormLogicMapper; 6 | import com.tduck.cloud.form.service.UserFormLogicService; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * 表单逻辑 11 | */ 12 | @Service 13 | public class UserFormLogicServiceImpl extends ServiceImpl implements UserFormLogicService { 14 | } 15 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/envconfig/entity/event/EnvConfigRefreshEvent.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.envconfig.entity.event; 2 | 3 | import com.tduck.cloud.envconfig.entity.SysEnvConfigEntity; 4 | import lombok.Getter; 5 | import org.springframework.context.ApplicationEvent; 6 | 7 | /** 8 | * 系统配置更新之后 更新对应的类 9 | * 10 | * @author tduck 11 | */ 12 | public class EnvConfigRefreshEvent extends ApplicationEvent { 13 | 14 | @Getter 15 | private final SysEnvConfigEntity config; 16 | 17 | 18 | public EnvConfigRefreshEvent(Object source, SysEnvConfigEntity config) { 19 | super(source); 20 | this.config = config; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/BaseFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | /** 4 | * 基本格式化数据处理 5 | * 处理不同组件的数据格式化 比如 6 | * 7 | * @author tduck 8 | */ 9 | public interface BaseFormatDataHandler { 10 | 11 | /** 12 | * 标签key 一些常量 13 | */ 14 | String LABEL_KEY = "label"; 15 | 16 | /* 17 | * 逗号 , 18 | */ 19 | String COMMA = ","; 20 | 21 | /** 22 | * 格式化数据 23 | * 24 | * @param key 数据key 25 | * @param value 格式化前的数据 26 | * @param scheme 组件scheme 27 | * @return 格式化后的数据 28 | */ 29 | Object formatData(String key, Object value, Object scheme); 30 | } 31 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/vo/LoginUserVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 登录用户VO 10 | * @create : 2020-11-12 14:34 11 | **/ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class LoginUserVO { 16 | /** 17 | * 头像 18 | */ 19 | private String avatar; 20 | /** 21 | * 性别 22 | */ 23 | private String name; 24 | 25 | /** 26 | * token 27 | */ 28 | private String token; 29 | 30 | private boolean isAdmin; 31 | } 32 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.sms; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 短信服务 8 | * @create : 2020-12-15 10:30 9 | **/ 10 | public abstract class SmsService { 11 | 12 | public SmsPlatformProperties properties; 13 | 14 | /** 15 | * 发送短信 16 | * 17 | * @param phoneNumber 手机号 18 | * @param templateId 模板Id 19 | * @param templateParams 短信模板參數 20 | * @return 21 | */ 22 | public abstract boolean sendSms(String phoneNumber, String templateId, Map templateParams) throws Exception; 23 | 24 | 25 | } 26 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/SortFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import cn.hutool.json.JSONUtil; 5 | 6 | import java.util.stream.Collectors; 7 | 8 | /** 9 | * 排序类型格式化数据处理 10 | * 11 | * @author tduck 12 | */ 13 | public class SortFormatDataHandler implements BaseFormatDataHandler { 14 | 15 | @Override 16 | public Object formatData(String key, Object value, Object scheme) { 17 | return JSONUtil.parseArray(JSONUtil.toJsonStr(value)).toList(JSONObject.class) 18 | .stream().map(item -> item.getStr(LABEL_KEY)).collect(Collectors.joining(COMMA)); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/UploadFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import cn.hutool.json.JSONUtil; 5 | 6 | import java.util.stream.Collectors; 7 | 8 | /** 9 | * 上传序类型格式化数据处理 10 | * 11 | * @author tduck 12 | */ 13 | public class UploadFormatDataHandler implements BaseFormatDataHandler { 14 | 15 | @Override 16 | public Object formatData(String key, Object value, Object scheme) { 17 | return JSONUtil.parseArray(JSONUtil.toJsonStr(value)).toList(JSONObject.class) 18 | .stream().map(item -> item.getStr("url")).collect(Collectors.joining(COMMA)); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/FormPermsBtnTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | 6 | /** 7 | * 表单按钮权限类型 8 | */ 9 | @AllArgsConstructor 10 | public enum FormPermsBtnTypeEnum { 11 | DETAIL("detail", "查看"), 12 | ADD("add", "新增"), 13 | IMPORT("import", "导入"), 14 | EXPORT("export", "导出"), 15 | QUERY("query", "结构查询"), 16 | BATCH_ACTION("batchAction", "批量操作"), 17 | CUSTOM_COLUMN("customColumn", "自定义列"), 18 | UPDATE("update", "编辑"), 19 | DELETE("delete", "删除"); 20 | 21 | 22 | private final String code; 23 | private final String desc; 24 | 25 | } 26 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/event/SendTestWebhookEvent.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.event; 2 | 3 | import com.tduck.cloud.webhook.entity.WebhookConfigEntity; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 发送测试webHook 12 | * 13 | * @author tduck 14 | */ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class SendTestWebhookEvent implements Serializable { 19 | 20 | 21 | private WebhookConfigEntity webhookConfig; 22 | 23 | 24 | /** 25 | * 事件类型 26 | */ 27 | private String eventType; 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/vo/OperateFormItemVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | 8 | /** 9 | * 操作返回数据 10 | */ 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class OperateFormItemVO { 15 | 16 | /** 17 | * 排序号 18 | */ 19 | private Long sort; 20 | 21 | /** 22 | * 数据Id 23 | */ 24 | private Long itemDataId; 25 | 26 | /** 27 | * 操作是否成功 28 | */ 29 | private Boolean operateSuccess; 30 | 31 | 32 | /** 33 | * 刷新全部 34 | */ 35 | private Boolean refreshAll; 36 | 37 | } 38 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/DeptSelectFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | import cn.hutool.json.JSONObject; 4 | import cn.hutool.json.JSONUtil; 5 | 6 | import java.util.stream.Collectors; 7 | 8 | /** 9 | * 部门选择类型格式化数据处理 10 | * 11 | * @author tduck 12 | */ 13 | public class DeptSelectFormatDataHandler implements BaseFormatDataHandler { 14 | 15 | @Override 16 | public Object formatData(String key, Object value, Object scheme) { 17 | return JSONUtil.parseArray(JSONUtil.toJsonStr(value)).toList(JSONObject.class) 18 | .stream().map(item -> item.getStr("name")).collect(Collectors.joining(",")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/FormTemplateCategoryEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.tduck.cloud.common.entity.BaseEntity; 5 | import lombok.Data; 6 | 7 | 8 | /** 9 | * 表单主题分类 10 | * 11 | * @author smalljop 12 | * @since 2021-01-06 10:50:51 13 | */ 14 | 15 | @Data 16 | @TableName(value = "fm_form_template_category", autoResultMap = true) 17 | public class FormTemplateCategoryEntity extends BaseEntity { 18 | /** 19 | * 主题名称 20 | */ 21 | private String name; 22 | /** 23 | * 排序 24 | */ 25 | private Integer sort; 26 | 27 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/FormLogicConditionExpressionEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | import com.baomidou.mybatisplus.annotation.EnumValue; 4 | import com.fasterxml.jackson.annotation.JsonValue; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Getter; 7 | 8 | 9 | /** 10 | * @author : smalljop 11 | * @description :逻辑条件 12 | * @create : 2020-12-04 13:35 13 | **/ 14 | @Getter 15 | @AllArgsConstructor 16 | public enum FormLogicConditionExpressionEnum { 17 | 18 | EQ("eq", "等于"), 19 | NE("ne", "不等于"); 20 | 21 | 22 | @EnumValue 23 | @JsonValue 24 | private String value; 25 | 26 | private String desc; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/request/SortFormItemRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import javax.validation.constraints.NotNull; 7 | 8 | /** 9 | * @author : smalljop 10 | * @description : 排序表单项 11 | * @create : 2020-11-20 10:14 12 | **/ 13 | @Data 14 | public class SortFormItemRequest { 15 | /** 16 | * 表单Id 17 | */ 18 | @NotNull(message = "key请求异常") 19 | private String formKey; 20 | 21 | 22 | private Long beforePosition; 23 | 24 | private Long afterPosition; 25 | @NotBlank(message = "formItemId请求异常") 26 | private String formItemId; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/DefaultFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | 4 | import cn.hutool.core.collection.CollUtil; 5 | import cn.hutool.core.convert.Convert; 6 | 7 | import java.util.Collection; 8 | 9 | /** 10 | * 默认处理 11 | * 12 | * @author tduck 13 | */ 14 | public class DefaultFormatDataHandler implements BaseFormatDataHandler { 15 | 16 | 17 | @Override 18 | public Object formatData(String key, Object value, Object scheme) { 19 | // 答案如果是多个值 如多选等 20 | if (value instanceof Collection) { 21 | return CollUtil.join(Convert.toList(value), COMMA); 22 | } 23 | return value.toString(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/config/PlatformSignProperties.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | 10 | /** 11 | * @author smalljop 12 | */ 13 | @Data 14 | @Configuration 15 | @ConfigurationProperties(prefix = "platform.sign") 16 | public class PlatformSignProperties { 17 | 18 | /** 19 | * 忽略验签地址 20 | */ 21 | private List ignoreUrls = new ArrayList<>(); 22 | 23 | /** 24 | * 秘钥 25 | */ 26 | private String secret; 27 | 28 | } -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/request/WxMpQrCodeGenRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.request; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.Getter; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 微信公众号二维码生成请求 10 | */ 11 | @Data 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class WxMpQrCodeGenRequest { 15 | private QrCodeType type; 16 | 17 | private String data; 18 | 19 | 20 | @AllArgsConstructor 21 | public enum QrCodeType { 22 | LOGIN("login"), 23 | BIND_ACCOUNT("bindAccount"), 24 | SUB_NOTIFY("subNotify"); 25 | 26 | @Getter 27 | private String key; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/builder/AbstractBuilder.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.builder; 2 | 3 | import me.chanjar.weixin.mp.api.WxMpService; 4 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 6 | import org.slf4j.Logger; 7 | import org.slf4j.LoggerFactory; 8 | 9 | /** 10 | * @author Binary Wang(https://github.com/binarywang) 11 | */ 12 | public abstract class AbstractBuilder { 13 | protected final Logger logger = LoggerFactory.getLogger(getClass()); 14 | 15 | public abstract WxMpXmlOutMessage build(String content, 16 | WxMpXmlMessage wxMessage, WxMpService service); 17 | } 18 | -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/config/ErrorConfig.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.config; 2 | 3 | import org.springframework.boot.web.server.ErrorPage; 4 | import org.springframework.boot.web.server.ErrorPageRegistrar; 5 | import org.springframework.boot.web.server.ErrorPageRegistry; 6 | import org.springframework.http.HttpStatus; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class ErrorConfig implements ErrorPageRegistrar { 11 | 12 | @Override 13 | public void registerErrorPages(ErrorPageRegistry registry) { 14 | ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html"); 15 | registry.addErrorPages(error404Page); 16 | } 17 | } 18 | 19 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/UserFormViewCountService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service; 2 | 3 | import java.util.List; 4 | 5 | import com.tduck.cloud.form.entity.UserFormViewCountEntity; 6 | import com.baomidou.mybatisplus.extension.service.IService; 7 | 8 | /** 9 | * 用户表单查看次数Service接口 10 | * 11 | * @author tduck 12 | * @date 2023-04-04 21:29:39 13 | */ 14 | public interface UserFormViewCountService extends IService { 15 | 16 | /** 17 | * 查看次数自增 18 | * 19 | * @param formKey 表单key 20 | */ 21 | void increment(String formKey); 22 | 23 | /** 24 | * 查看次数 25 | * 26 | * @param formKey 表单key 27 | */ 28 | Long count(String formKey); 29 | } 30 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/impl/UserFormLinkExtServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.tduck.cloud.form.entity.UserFormLinkExtEntity; 5 | import com.tduck.cloud.form.mapper.UserFormLinkExtMapper; 6 | import com.tduck.cloud.form.service.UserFormLinkExtService; 7 | import org.springframework.stereotype.Service; 8 | 9 | 10 | /** 11 | * 单链接扩展值Service业务层处理 12 | * 13 | * @author tduck-gen 14 | * @date 2021-12-14 14:26:38 15 | */ 16 | @Service 17 | public class UserFormLinkExtServiceImpl extends ServiceImpl implements UserFormLinkExtService { 18 | 19 | 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/FormSourceTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | import com.baomidou.mybatisplus.annotation.EnumValue; 4 | import com.fasterxml.jackson.annotation.JsonValue; 5 | import com.tduck.cloud.common.entity.IDictEnum; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 表单来源 12 | * @create : 2020-12-04 13:35 13 | **/ 14 | 15 | @Getter 16 | @AllArgsConstructor 17 | public enum FormSourceTypeEnum implements IDictEnum { 18 | 19 | BLANK(1, "空白创建"), 20 | TEMPLATE(2, "模板"); 21 | 22 | 23 | @EnumValue 24 | @JsonValue 25 | private Integer value; 26 | 27 | private String desc; 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/UserFormLinkExtEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.tduck.cloud.common.entity.BaseEntity; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | /** 10 | * 单链接扩展值对象 fm_user_form_link_ext 11 | * 12 | * @author tduck-gen 13 | * @date 2021-12-14 14:26:38 14 | */ 15 | @Data 16 | @TableName("fm_user_form_link_ext") 17 | public class UserFormLinkExtEntity extends BaseEntity { 18 | 19 | 20 | 21 | /** 22 | * 表单唯一标识 23 | */ 24 | @NotBlank 25 | private String formKey; 26 | 27 | /** 28 | * 扩展值 29 | */ 30 | @NotBlank 31 | private String extValue; 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/impl/FormTemplateCategoryServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.tduck.cloud.form.entity.FormTemplateCategoryEntity; 5 | import com.tduck.cloud.form.mapper.FormTemplateCategoryMapper; 6 | import com.tduck.cloud.form.service.FormTemplateCategoryService; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | * 表单模板分类(FormTemplateType)表服务实现类 11 | * 12 | * @author smalljop 13 | * @since 2021-01-06 10:51:06 14 | */ 15 | @Service 16 | public class FormTemplateCategoryServiceImpl extends ServiceImpl implements FormTemplateCategoryService { 17 | 18 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/FormThemeCategoryEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.tduck.cloud.common.entity.BaseEntity; 5 | import lombok.Data; 6 | 7 | import javax.validation.constraints.NotBlank; 8 | 9 | 10 | /** 11 | * 表单模板分类(FormTemplateType)表实体类 12 | * 13 | * @author smalljop 14 | * @since 2021-01-06 10:50:51 15 | */ 16 | 17 | @Data 18 | @TableName(value = "fm_form_theme_category", autoResultMap = true) 19 | public class FormThemeCategoryEntity extends BaseEntity { 20 | /** 21 | * 主题名称 22 | */ 23 | @NotBlank 24 | private String name; 25 | /** 26 | * 排序 27 | */ 28 | private Integer sort; 29 | 30 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/InputResultStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import com.tduck.cloud.common.util.JsonUtils; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author : smalljop 12 | * @description : 上传收集结果 13 | * @create : 2021/06/07 16:37 14 | **/ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class InputResultStruct { 19 | 20 | /** 21 | * 不允许重复 22 | */ 23 | private boolean notRepeat; 24 | 25 | 26 | public static InputResultStruct builder(Map params) { 27 | return JsonUtils.objToObj(params, InputResultStruct.class); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/constant/FormConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.constant; 2 | 3 | /** 4 | * @author : smalljop 5 | * @description : 6 | * @create : 2020-11-11 18:16 7 | **/ 8 | public interface FormConstants { 9 | 10 | /** 11 | * 选择性组件保存会创建两个字段 一个存放Id 一个存放选项名 12 | */ 13 | String FIELD_SUFFIX_LABEL = "label"; 14 | 15 | 16 | /** 17 | * 表单Item排序位置自增 18 | */ 19 | String FORM_ITEM_POS_DELTA = "form:item:pos:{}"; 20 | 21 | 22 | /** 23 | * 手机号验证码 24 | */ 25 | String PHONE_NUMBER_CODE = "form:mobile:code:{}"; 26 | 27 | 28 | /** 29 | * 查看表单数 30 | */ 31 | String FORM_VIEW_COUNT = "form:view:count:{}"; 32 | 33 | String FORM_RESULT_NUMBER = "form:view:result:{}"; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /tduck-api/src/test/com/tduck/cloud/api/web/controller/system/CacheTest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api.web.controller.system; 2 | 3 | import com.tduck.cloud.common.util.CacheUtils; 4 | import org.junit.runner.RunWith; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.boot.test.context.SpringBootTest; 7 | import org.springframework.test.context.junit4.SpringRunner; 8 | 9 | 10 | @RunWith(SpringRunner.class) 11 | @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 12 | public class CacheTest { 13 | 14 | @Autowired 15 | CacheUtils cacheUtils; 16 | 17 | @org.junit.Test 18 | public void genEnumByDict() { 19 | // cacheUtils.save("aa","aaa"); 20 | System.out.println(cacheUtils.get("aa")); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/MatrixInputSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 矩阵输入组件结构 12 | * @create : 2021/06/07 16:37 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class MatrixInputSchemaStruct { 18 | 19 | 20 | private Table table; 21 | 22 | @Data 23 | public static class Table { 24 | private List rows; 25 | private List columns; 26 | } 27 | 28 | 29 | @Data 30 | public static class Item { 31 | private String label; 32 | private String id; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/MatrixSelectSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 矩阵选择组件结构 12 | * @create : 2021/06/07 16:37 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class MatrixSelectSchemaStruct { 18 | 19 | 20 | private Table table; 21 | 22 | @Data 23 | public static class Table { 24 | private List rows; 25 | private List columns; 26 | } 27 | 28 | 29 | @Data 30 | public static class Item { 31 | private String label; 32 | private String id; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/mapper/UserFormViewCountMapper.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.tduck.cloud.form.entity.UserFormViewCountEntity; 5 | import org.apache.ibatis.annotations.Param; 6 | import org.apache.ibatis.annotations.Update; 7 | 8 | /** 9 | * 用户表单查看次数Mapper接口 10 | * 11 | * @author tduck 12 | * @date 2023-04-04 21:29:39 13 | */ 14 | public interface UserFormViewCountMapper extends BaseMapper { 15 | 16 | 17 | /** 18 | * 查看次数自增 19 | * 20 | * @param formKey 表单key 21 | */ 22 | @Update("update fm_user_form_view_count set count = count + 1 , update_time=now() where form_key = #{formKey}") 23 | void incrementCount(@Param("formKey") String formKey); 24 | } 25 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/event/AddWebhookEvent.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.event; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * 新增Webhook事件 9 | * 10 | * @author tduck 11 | */ 12 | @Data 13 | @NoArgsConstructor 14 | @AllArgsConstructor 15 | public class AddWebhookEvent { 16 | 17 | /** 18 | * 来源类型 用来查询对应的配置 区分是什么业务的webhook 19 | */ 20 | private String webhookSourceType; 21 | 22 | 23 | /** 24 | * 来源ID 用来查询对应的配置 25 | */ 26 | private String webhookSourceId; 27 | 28 | 29 | /** 30 | * 事件类型 31 | */ 32 | private String eventType; 33 | 34 | 35 | private String eventSourceId; 36 | 37 | /** 38 | * 数据 39 | */ 40 | private Object data; 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/FormStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | import com.baomidou.mybatisplus.annotation.EnumValue; 4 | import com.fasterxml.jackson.annotation.JsonValue; 5 | import com.tduck.cloud.common.entity.IDictEnum; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | import lombok.NoArgsConstructor; 9 | 10 | /** 11 | * @author : smalljop 12 | * @description : 表单状态 13 | * @create : 2020-12-04 13:35 14 | **/ 15 | @Getter 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public enum FormStatusEnum implements IDictEnum { 19 | 20 | CREATE(1, "未发布"), 21 | RELEASE(2, "收集中"), 22 | STOP(3, "停止发布"); 23 | 24 | 25 | @EnumValue 26 | @JsonValue 27 | private Integer value; 28 | 29 | private String desc; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/event/WxMpUserSubscribeEvent.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.event; 2 | 3 | import com.tduck.cloud.wx.mp.entity.WxMpUserEntity; 4 | import com.tduck.cloud.wx.mp.request.WxMpQrCodeGenRequest; 5 | import lombok.Getter; 6 | import org.springframework.context.ApplicationEvent; 7 | 8 | /** 9 | * 微信用户订阅事件 10 | * 11 | * @author smalljop 12 | */ 13 | public class WxMpUserSubscribeEvent extends ApplicationEvent { 14 | 15 | @Getter 16 | private WxMpUserEntity wxMpUserEntity; 17 | 18 | 19 | @Getter 20 | private WxMpQrCodeGenRequest params; 21 | 22 | public WxMpUserSubscribeEvent(Object source, WxMpUserEntity wxMpUserEntity, WxMpQrCodeGenRequest params) { 23 | super(source); 24 | this.wxMpUserEntity = wxMpUserEntity; 25 | this.params = params; 26 | } 27 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/EsTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Getter; 6 | 7 | /** 8 | * ElasticSearch的字段类型 9 | */ 10 | @AllArgsConstructor 11 | @Getter 12 | public enum EsTypeEnum { 13 | 14 | STRING("string", "字符串类型"), 15 | TEXT("text", "字符串类型"), 16 | KEYWORD("keyword", "字符串类型"), 17 | INTEGER("integer", "整数类型"), 18 | LONG("long", "整数类型"), 19 | SHORT("short", "整数类型"), 20 | BYTE("byte", "整数类型"), 21 | DOUBLE("double", "浮点类型"), 22 | FLOAT("float", "浮点类型"), 23 | HALF_FLOAT("half_float", "浮点类型"), 24 | SCALED_FLOAT("scaled_float", "浮点类型"), 25 | BOOLEAN("boolean", "逻辑类型"), 26 | DATE("date", "日期类型"); 27 | 28 | private String type; 29 | private String name; 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/ReserveSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | /** 11 | * @author : smalljop 12 | * @description : 选项结构 13 | * @create : 2021/06/07 16:37 14 | **/ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class ReserveSchemaStruct { 19 | 20 | 21 | private List reserveProjectList; 22 | 23 | 24 | 25 | @Data 26 | public static class ReserveProject{ 27 | private Long id; 28 | private String name; 29 | /** 30 | * 每周天库存 31 | */ 32 | private Map quotaWeek; 33 | } 34 | 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /tduck-storage/src/main/java/com/tduck/cloud/storage/exception/InvalidExtensionException.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.storage.exception; 2 | 3 | 4 | import java.util.Arrays; 5 | 6 | /** 7 | * 文件上传异常 8 | */ 9 | public class InvalidExtensionException extends RuntimeException { 10 | private static final long serialVersionUID = 1L; 11 | 12 | private final String[] allowedExtension; 13 | private final String extension; 14 | private final String filename; 15 | 16 | public InvalidExtensionException(String[] allowedExtension, String extension, String filename) { 17 | super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); 18 | this.allowedExtension = allowedExtension; 19 | this.extension = extension; 20 | this.filename = filename; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/vo/UserDetailVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.vo; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * @author : smalljop 7 | * @description : 用户详情 8 | * @create: 2020-12-21 10:51 9 | **/ 10 | @Data 11 | public class UserDetailVO { 12 | /** 13 | * 姓名 14 | */ 15 | private String name; 16 | /** 17 | * 头像 18 | */ 19 | private String avatar; 20 | /** 21 | * 性别 22 | */ 23 | private Integer gender; 24 | /** 25 | * 手机号 26 | */ 27 | private String phoneNumber; 28 | /** 29 | * 邮箱 30 | */ 31 | private String email; 32 | 33 | /** 34 | * 绑定qq 35 | */ 36 | private String qqName; 37 | 38 | /** 39 | * 绑定微信名称 40 | */ 41 | private String wxName; 42 | 43 | 44 | private boolean isAdmin; 45 | } 46 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/service/impl/WebhookEventServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.service.impl; 2 | 3 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 4 | import com.tduck.cloud.webhook.entity.WebhookEventEntity; 5 | import com.tduck.cloud.webhook.mapper.WebhookEventMapper; 6 | import com.tduck.cloud.webhook.service.WebhookEventService; 7 | import lombok.RequiredArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.stereotype.Service; 10 | 11 | /** 12 | * Webhook事件Service业务层处理 13 | * 14 | * @author tduck-gen 15 | * @date 2023-03-27 13:50:06 16 | */ 17 | @Service 18 | @Slf4j 19 | @RequiredArgsConstructor 20 | public class WebhookEventServiceImpl extends ServiceImpl implements WebhookEventService { 21 | 22 | 23 | 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/NullHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler; 2 | 3 | import me.chanjar.weixin.common.session.WxSessionManager; 4 | import me.chanjar.weixin.mp.api.WxMpService; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author Binary Wang(https://github.com/binarywang) 13 | */ 14 | @Component 15 | public class NullHandler extends AbstractHandler { 16 | 17 | @Override 18 | public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 19 | Map context, WxMpService wxMpService, 20 | WxSessionManager sessionManager) { 21 | return null; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/builder/TextBuilder.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.builder; 2 | 3 | import me.chanjar.weixin.mp.api.WxMpService; 4 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; 7 | 8 | /** 9 | * @author Binary Wang(https://github.com/binarywang) 10 | */ 11 | public class TextBuilder extends AbstractBuilder { 12 | 13 | @Override 14 | public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, 15 | WxMpService service) { 16 | WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) 17 | .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) 18 | .build(); 19 | return m; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/KfSessionHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler; 2 | 3 | import me.chanjar.weixin.common.session.WxSessionManager; 4 | import me.chanjar.weixin.mp.api.WxMpService; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * @author Binary Wang(https://github.com/binarywang) 13 | */ 14 | @Component 15 | public class KfSessionHandler extends AbstractHandler { 16 | 17 | @Override 18 | public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 19 | Map context, WxMpService wxMpService, 20 | WxSessionManager sessionManager) { 21 | return null; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/service/WebhookConfigService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.service; 2 | 3 | 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.tduck.cloud.webhook.entity.WebhookConfigEntity; 6 | 7 | /** 8 | * Webhook配置Service接口 9 | * 10 | * @author tduck-gen 11 | * @date 2023-03-27 13:50:06 12 | */ 13 | public interface WebhookConfigService extends IService { 14 | 15 | 16 | /** 17 | * 保存Webhook配置 18 | * 19 | * @param webhookConfigEntity Webhook配置 20 | */ 21 | Boolean saveWebhookConfig(WebhookConfigEntity webhookConfigEntity); 22 | 23 | /** 24 | * 获取Webhook配置 25 | * 26 | * @param sourceType 来源类型 27 | * @param sourceId 来源ID 28 | * @return Webhook配置 29 | */ 30 | WebhookConfigEntity getWebhookConfig(String sourceType, String sourceId); 31 | } 32 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/constant/ResponseCodeConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.constant; 2 | 3 | /** 4 | * @description: 响应状态码 5 | * @author: smalljop 6 | * @create: 2020-02-10 15:46 7 | **/ 8 | public interface ResponseCodeConstants { 9 | /** 10 | * 接口成功 11 | */ 12 | int SUCCESS = 200; 13 | /** 14 | * 接口失败 发生异常 15 | */ 16 | int FAIL = 500; 17 | 18 | /** 19 | * 未登录 20 | */ 21 | int UNAUTHORIZED = 401; 22 | 23 | /** 24 | * 需要验证的请求 25 | */ 26 | int NEED_VERIFICATION = 416; 27 | 28 | /** 29 | * 找不到该请求 30 | */ 31 | int NOT_FOUND = 404; 32 | 33 | /** 34 | * 非法签名 35 | */ 36 | Integer SIGN_FAIL_CODE = 405; 37 | 38 | /** 39 | * 非法签名 40 | */ 41 | String SIGN_FAIL_MSG = "非法访问,请检查请求信息"; 42 | 43 | 44 | String VALIDATE_CODE_FAIL_MSG = "验证码验证失败"; 45 | } 46 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/builder/ImageBuilder.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.builder; 2 | 3 | import me.chanjar.weixin.mp.api.WxMpService; 4 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutImageMessage; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 7 | 8 | /** 9 | * @author Binary Wang(https://github.com/binarywang) 10 | */ 11 | public class ImageBuilder extends AbstractBuilder { 12 | 13 | @Override 14 | public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, 15 | WxMpService service) { 16 | 17 | WxMpXmlOutImageMessage m = WxMpXmlOutMessage.IMAGE().mediaId(content) 18 | .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) 19 | .build(); 20 | 21 | return m; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/envconfig/constant/ConfigConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.envconfig.constant; 2 | 3 | /** 4 | * @description: 配置表key 5 | * @author: smalljop 6 | * @create: 2020-02-18 23:22 7 | **/ 8 | public interface ConfigConstants { 9 | 10 | /** 11 | * 系统配置 12 | */ 13 | String SYSTEM_INFO_CONFIG = "systemInfoConfig"; 14 | /** 15 | * 邮件配置 16 | */ 17 | String EMAIL_ENV_CONFIG = "emailEnvConfig"; 18 | 19 | 20 | /** 21 | * 短信配置 22 | */ 23 | String SMS_ENV_CONFIG = "smsEnvConfig"; 24 | 25 | 26 | /** 27 | * 存储配置 28 | */ 29 | String FILE_ENV_CONFIG = "fileEnvConfig"; 30 | 31 | 32 | /** 33 | * 微信公众号配置 34 | */ 35 | String WX_MP_ENV_CONFIG = "wxMpEnvConfig"; 36 | 37 | 38 | /** 39 | * 微信支付配置 40 | */ 41 | String WX_PAY_ENV_CONFIG = "wxPayEnvConfig"; 42 | 43 | 44 | 45 | } 46 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/FormTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.enums; 2 | 3 | import com.baomidou.mybatisplus.annotation.EnumValue; 4 | import com.fasterxml.jackson.annotation.JsonValue; 5 | import com.tduck.cloud.common.entity.IDictEnum; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Getter; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 表单类型 12 | * @create : 2020-12-04 13:35 13 | **/ 14 | @Getter 15 | @AllArgsConstructor 16 | public enum FormTypeEnum implements IDictEnum { 17 | 18 | 19 | /** 20 | * 普通表单 21 | */ 22 | ORDINARY(1, "普通表单"), 23 | /** 24 | * 流程表单 25 | */ 26 | WORKFLOW(2, "流程表单"), 27 | /** 28 | * 文件夹 29 | */ 30 | FOLDER(3, "文件夹"), 31 | /** 32 | * 考试 33 | */ 34 | EXAM(4, "考试"); 35 | 36 | private Integer value; 37 | private String desc; 38 | 39 | 40 | } 41 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/CheckboxSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import com.tduck.cloud.common.util.JsonUtils; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * @author : smalljop 12 | * @description : 选项结构 13 | * @create : 2021/06/07 16:37 14 | **/ 15 | 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | @Data 19 | public class CheckboxSchemaStruct { 20 | 21 | private Config config; 22 | 23 | 24 | 25 | @Data 26 | public static class Config extends OptionQuotaListStruct{ 27 | private boolean showVoteResult; 28 | } 29 | 30 | 31 | 32 | 33 | 34 | public static CheckboxSchemaStruct builder(Map params) { 35 | return JsonUtils.objToObj(params, CheckboxSchemaStruct.class); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/vo/RecycleFormVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.vo; 2 | 3 | import com.tduck.cloud.common.entity.BaseEntity; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 回收站表单 12 | * @create : 2021/03/23 17:13 13 | **/ 14 | @Data 15 | @AllArgsConstructor 16 | public class RecycleFormVO extends BaseEntity { 17 | private String key; 18 | /*** 19 | * 收集数量 20 | */ 21 | private Long resultCount; 22 | 23 | private String name; 24 | 25 | public RecycleFormVO(String key, Long resultCount, String name, LocalDateTime createTime, LocalDateTime updateTime) { 26 | this.key = key; 27 | this.resultCount = resultCount; 28 | this.name = name; 29 | this.createTime = createTime; 30 | this.updateTime = updateTime; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/StoreCheckNotifyHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler; 2 | 3 | import me.chanjar.weixin.common.session.WxSessionManager; 4 | import me.chanjar.weixin.mp.api.WxMpService; 5 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 7 | import org.springframework.stereotype.Component; 8 | 9 | import java.util.Map; 10 | 11 | /** 12 | * 门店审核事件处理 13 | * 14 | * @author Binary Wang(https://github.com/binarywang) 15 | */ 16 | @Component 17 | public class StoreCheckNotifyHandler extends AbstractHandler { 18 | 19 | @Override 20 | public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 21 | Map context, WxMpService wxMpService, 22 | WxSessionManager sessionManager) { 23 | return null; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/sms/SmsPlatformProperties.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.sms; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | /** 8 | * 短信配置类 9 | * 10 | * @author smalljop 11 | */ 12 | @Data 13 | @Configuration 14 | @ConfigurationProperties(prefix = "platform.sms") 15 | public class SmsPlatformProperties { 16 | 17 | /** 18 | * secretId 19 | */ 20 | private String secretId; 21 | 22 | 23 | private SmsTypeEnum type; 24 | /** 25 | * 秘钥 26 | */ 27 | private String secretKey; 28 | /** 29 | * appId 腾讯云使用 30 | */ 31 | private String appId; 32 | /** 33 | * 短信签名 如【tduck】 需要去短信平台申请 34 | */ 35 | private String sign; 36 | 37 | /** 38 | * 模板id 39 | */ 40 | private String templateId; 41 | 42 | 43 | } 44 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/GoodsSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.math.BigDecimal; 8 | import java.util.List; 9 | 10 | /** 11 | * @author : smalljop 12 | * @description : 选项结构 13 | * @create : 2021/06/07 16:37 14 | **/ 15 | @Data 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public class GoodsSchemaStruct { 19 | 20 | 21 | private List goodsList; 22 | 23 | 24 | 25 | @Data 26 | public static class Goods{ 27 | private String id; 28 | /** 29 | * 商品名 30 | */ 31 | private String goodsName; 32 | /** 33 | * 价格 34 | */ 35 | private BigDecimal price; 36 | /** 37 | * 库存 38 | */ 39 | private Long inventory; 40 | } 41 | 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/RandomNumberResultStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.LinkedList; 8 | 9 | /** 10 | * @author : smalljop 11 | * @description : 上传收集结果 12 | * @create : 2021/06/07 16:37 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class RandomNumberResultStruct { 18 | 19 | private boolean submitVisible; 20 | 21 | private LinkedList rules; 22 | 23 | public enum RuleType { 24 | /** 25 | * 随机数 26 | */ 27 | RAND_NUMBER 28 | } 29 | 30 | @Data 31 | public static class Rule { 32 | // 规则类型 33 | private RuleType type; 34 | // 规则名称 35 | private String label; 36 | //长度 37 | private Integer length; 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/vo/SituationVO.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.vo; 2 | 3 | import com.google.common.base.Objects; 4 | import lombok.AllArgsConstructor; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 填写统计 10 | * @author hasee 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class SituationVO { 16 | private String createTime; 17 | 18 | private Integer count; 19 | 20 | 21 | @Override 22 | public boolean equals(Object o) { 23 | if (this == o) { 24 | return true; 25 | } 26 | if (o == null || getClass() != o.getClass()) { 27 | return false; 28 | } 29 | SituationVO situation = (SituationVO) o; 30 | return Objects.equal(createTime, situation.createTime); 31 | } 32 | 33 | @Override 34 | public int hashCode() { 35 | return Objects.hashCode(createTime); 36 | } 37 | } -------------------------------------------------------------------------------- /tduck-api/src/main/java/com/tduck/cloud/api/TduckApiApplication.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.api; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.cache.annotation.EnableCaching; 6 | import org.springframework.context.annotation.ComponentScan; 7 | import org.springframework.scheduling.annotation.EnableAsync; 8 | 9 | /** 10 | * @author smalljop 11 | */ 12 | @SpringBootApplication 13 | @EnableAsync 14 | @EnableCaching 15 | @ComponentScan("com.tduck.cloud.*") 16 | public class TduckApiApplication { 17 | 18 | public static void main(String[] args) { 19 | SpringApplication.run(TduckApiApplication.class, args); 20 | System.out.println("Tduck-填鸭表单社区版-启动成功>>"); 21 | System.out.println("启动成功,请访问:http://localhost:8999"); 22 | System.out.println("请使用管理员账号登录,用户名:admin@tduckcloud.com,密码:123456,然后请尽快修改密码!!!"); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/enums/TimeRangeEnum.java: -------------------------------------------------------------------------------- 1 | 2 | package com.tduck.cloud.form.entity.enums; 3 | 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | 7 | /** 8 | * @author : tduck 9 | * @description : 时间范围枚举 10 | * @create : 2022/10/11 11:12 11 | **/ 12 | @NoArgsConstructor 13 | @Getter 14 | public enum TimeRangeEnum { 15 | /** 16 | * 今天 17 | */ 18 | TODAY, 19 | /** 20 | * 昨天 21 | */ 22 | YESTERDAY, 23 | /** 24 | * 近7天 25 | */ 26 | WEEK, 27 | /** 28 | * 上周 29 | */ 30 | LAST_WEEK, 31 | /** 32 | * 本月 33 | */ 34 | MONTH, 35 | /** 36 | * 上月 37 | */ 38 | LAST_MONTH, 39 | /** 40 | * 本季度 41 | */ 42 | QUARTER, 43 | /** 44 | * 上季度 45 | */ 46 | LAST_QUARTER, 47 | /** 48 | * 本年 49 | */ 50 | YEAR, 51 | /** 52 | * 去年 53 | */ 54 | LAST_YEAR; 55 | 56 | 57 | } 58 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/ReserveTimeRangeSchemaStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author : tudck 11 | * @description : 预约时段结构 12 | * @create : 2021/06/07 16:37 13 | **/ 14 | @Data 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public class ReserveTimeRangeSchemaStruct { 18 | 19 | 20 | private List reserveProjectList; 21 | 22 | 23 | @Data 24 | public static class ReserveProject { 25 | private Long id; 26 | private String name; 27 | 28 | /** 29 | * 库存时段 30 | */ 31 | private List timeRangeList; 32 | } 33 | 34 | @Data 35 | public static class TimeRange { 36 | private List timeRange; 37 | private Integer value; 38 | } 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/constant/AccountRedisKeyConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.constant; 2 | 3 | /** 4 | * @description: redis key常量 5 | * @author: smalljop 6 | * @create: 2020-02-12 22:34 7 | **/ 8 | public interface AccountRedisKeyConstants { 9 | /** 10 | * 邮箱验证码 11 | */ 12 | String EMAIL_CODE = "user:email:code:{}"; 13 | 14 | /** 15 | * 手机号验证码 16 | */ 17 | String PHONE_NUMBER_CODE = "user:mobile:code:{}"; 18 | 19 | /** 20 | * 手机找回密码验证码 21 | */ 22 | String PHONE_RETRIEVE_PWD_CODE = "user:mobile:retrieve:pwd:code:{}"; 23 | 24 | 25 | /** 26 | * 找回密码验证完成用户身份code 27 | */ 28 | String RETRIEVE_PWD_USER_CODE = "user:retrieve:pwd:code:{}"; 29 | 30 | /** 31 | * 修改邮箱验证 32 | */ 33 | String UPDATE_USER_EMAIL_CODE = "user:email:update:code:{}:{}"; 34 | 35 | 36 | /** 37 | * 用户token 38 | */ 39 | String USER_TOKEN = "user:token:{}"; 40 | } 41 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/request/RetrievePasswordRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 找回密码请求 10 | * @create : 2020-11-10 18:17 11 | **/ 12 | @Data 13 | public class RetrievePasswordRequest { 14 | 15 | @Data 16 | public static class CheckPhoneCode { 17 | @NotBlank(message = "手机号不能为空") 18 | private String phoneNumber; 19 | 20 | @NotBlank(message = "验证码不能为空") 21 | private String code; 22 | } 23 | 24 | 25 | /** 26 | * 重置密码 27 | */ 28 | @Data 29 | public static class Reset { 30 | @NotBlank(message = "code不能为空") 31 | private String code; 32 | @NotBlank(message = "密码不能为空") 33 | private String password; 34 | @NotBlank(message = "确认密码不能为空") 35 | private String rePassword; 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /tduck-webhook/src/main/java/com/tduck/cloud/webhook/constant/WebhookEventConstants.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.webhook.constant; 2 | 3 | /** 4 | * @author : tduck 5 | * @since : 2023/03/27 15:45 6 | **/ 7 | public interface WebhookEventConstants { 8 | 9 | 10 | /** 11 | * webhook event_stauts 12 | */ 13 | String WEBHOOK_EVENT_STATUS_PENDING = "pending"; 14 | 15 | 16 | /** 17 | * 成功 18 | */ 19 | String WEBHOOK_EVENT_STATUS_SUCCESS = "success"; 20 | 21 | 22 | /*** 23 | * 失败 24 | */ 25 | String WEBHOOK_EVENT_STATUS_FAILED = "failed"; 26 | 27 | 28 | /** 29 | * webhook配置来源 表单 30 | */ 31 | String WEBHOOK_CONFIG_SOURCE_TYPE_FORM = "form"; 32 | 33 | /** 34 | * 表单数据新增事件类型 35 | */ 36 | String WEBHOOK_EVENT_TYPE_FORM_DATA_ADD = "form_data_add"; 37 | String WEBHOOK_EVENT_TYPE_FORM_DATA_UPDATE = "form_data_update"; 38 | String WEBHOOK_EVENT_TYPE_FORM_DATA_DELETE = "form_data_delete"; 39 | } 40 | -------------------------------------------------------------------------------- /tduck-wx-mp/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | tduck-platform 7 | com.tduck 8 | 0.0.1-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | tduck-wx-mp 13 | 14 | 15 | 16 | com.tduck 17 | tduck-common 18 | 0.0.1-SNAPSHOT 19 | 20 | 21 | com.github.binarywang 22 | weixin-java-mp 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/entity/UserTokenEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.time.LocalDateTime; 8 | import java.io.Serializable; 9 | import java.math.BigDecimal; 10 | 11 | import com.tduck.cloud.common.entity.BaseEntity; 12 | 13 | /** 14 | * 用户token对象 ac_user_token 15 | * 16 | * @author tduck 17 | * @date 2023-04-04 16:11:29 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = true) 21 | @TableName("ac_user_token") 22 | public class UserTokenEntity extends BaseEntity { 23 | 24 | private static final long serialVersionUID = 1L; 25 | 26 | /** 27 | * 类型 28 | */ 29 | private Long type; 30 | 31 | private Long userId; 32 | /** 33 | * 用户Id 34 | */ 35 | private LocalDateTime expireTime; 36 | /** 37 | * token 38 | */ 39 | private String token; 40 | 41 | } 42 | -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/envconfig/entity/SysEnvConfigEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.envconfig.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.tduck.cloud.common.entity.BaseEntity; 6 | import com.tduck.cloud.common.mybatis.handler.JacksonTypeHandler; 7 | import lombok.Data; 8 | 9 | import javax.validation.constraints.NotBlank; 10 | import java.util.Map; 11 | 12 | /** 13 | * 系统环境配置对象 sys_env_config 14 | * 15 | * @author tduck-gen 16 | * @date 2021-12-28 15:06:17 17 | */ 18 | @Data 19 | @TableName(value = "sys_env_config", autoResultMap = true) 20 | public class SysEnvConfigEntity extends BaseEntity { 21 | 22 | 23 | /** 24 | * 配置key 25 | */ 26 | @NotBlank 27 | private String envKey; 28 | 29 | /** 30 | * 参数键值 31 | */ 32 | @TableField(typeHandler = JacksonTypeHandler.class) 33 | private Map envValue; 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/UserFormViewCountEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import java.time.LocalDateTime; 8 | import java.io.Serializable; 9 | import java.math.BigDecimal; 10 | 11 | import com.tduck.cloud.common.entity.BaseEntity; 12 | 13 | /** 14 | * 用户表单查看次数对象 fm_user_form_view_count 15 | * 16 | * @author tduck 17 | * @date 2023-04-04 21:29:39 18 | */ 19 | @Data 20 | @EqualsAndHashCode(callSuper = true) 21 | @TableName("fm_user_form_view_count") 22 | public class UserFormViewCountEntity extends BaseEntity { 23 | 24 | private static final long serialVersionUID = 1L; 25 | 26 | /** 27 | * 28 | */ 29 | @TableId(value = "id") 30 | private Long id; 31 | /** 32 | * 表单唯一标识 33 | */ 34 | private String formKey; 35 | /** 36 | * 37 | */ 38 | private Long count; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/FormThemeEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableName; 4 | import com.tduck.cloud.common.entity.BaseEntity; 5 | import lombok.Data; 6 | import lombok.experimental.FieldNameConstants; 7 | 8 | 9 | /** 10 | * 表单主题外观模板(FormTheme)表实体类 11 | * 12 | * @author smalljop 13 | * @since 2020-11-23 18:33:50 14 | */ 15 | @Data 16 | @TableName(value = "fm_form_theme", autoResultMap = true) 17 | @FieldNameConstants 18 | public class FormThemeEntity extends BaseEntity { 19 | 20 | /** 21 | * 主题名称 22 | */ 23 | private String name; 24 | /** 25 | * 主题风格 26 | */ 27 | private Long style; 28 | /** 29 | * 头部图片 30 | */ 31 | private String headImgUrl; 32 | 33 | /** 34 | * 背景图片 35 | */ 36 | private String backgroundImg; 37 | 38 | 39 | /** 40 | * 主题颜色 41 | */ 42 | private String themeColor; 43 | 44 | 45 | } -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/handler/LogHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.handler; 2 | 3 | import com.tduck.cloud.common.util.JsonUtils; 4 | import me.chanjar.weixin.common.session.WxSessionManager; 5 | import me.chanjar.weixin.mp.api.WxMpService; 6 | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; 7 | import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; 8 | import org.springframework.stereotype.Component; 9 | 10 | import java.util.Map; 11 | 12 | /** 13 | * @author Binary Wang(https://github.com/binarywang) 14 | */ 15 | @Component 16 | public class LogHandler extends AbstractHandler { 17 | @Override 18 | public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 19 | Map context, WxMpService wxMpService, 20 | WxSessionManager sessionManager) { 21 | this.logger.info("\n接收到请求消息,内容:{}", JsonUtils.objToJson(wxMessage)); 22 | return null; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/UserFormSettingEntity.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.TableField; 4 | import com.baomidou.mybatisplus.annotation.TableName; 5 | import com.tduck.cloud.common.entity.BaseEntity; 6 | import com.tduck.cloud.common.mybatis.handler.JacksonTypeHandler; 7 | import lombok.Data; 8 | import lombok.experimental.FieldNameConstants; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | import java.util.Map; 12 | 13 | /** 14 | * 表单设置对象 15 | * 16 | * @author tduck 17 | * @date 2021-08-12 16:19:57 18 | */ 19 | @Data 20 | @FieldNameConstants 21 | @TableName(value = "fm_user_form_setting", autoResultMap = true) 22 | public class UserFormSettingEntity extends BaseEntity { 23 | 24 | 25 | @NotBlank 26 | private String formKey; 27 | 28 | 29 | /** 30 | * 设置具体内容 31 | */ 32 | @TableField(typeHandler = JacksonTypeHandler.class) 33 | private Map settings; 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /tduck-wx-mp/src/main/java/com/tduck/cloud/wx/mp/service/WxMpUserService.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.wx.mp.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.tduck.cloud.wx.mp.entity.WxMpUserEntity; 5 | 6 | import java.util.Collection; 7 | import java.util.List; 8 | 9 | /** 10 | * 微信公众号用户 (WxMpUser)表服务接口 11 | * 12 | * @author smalljop 13 | * @since 2020-12-01 17:04:44 14 | */ 15 | public interface WxMpUserService extends IService { 16 | 17 | 18 | /** 19 | * 根据openId查询 20 | * 21 | * @param openIdList 22 | * @return 23 | */ 24 | List listWxMpUserByOpenId(Collection openIdList); 25 | 26 | /*** 27 | * 查询 28 | * @param appId 29 | * @param openId 30 | * @return 31 | */ 32 | WxMpUserEntity getByAppIdAndOpenId(String appId, String openId); 33 | 34 | /*** 35 | * 查询 36 | * @param userId 37 | * @return 38 | */ 39 | WxMpUserEntity getByUserId(Long userId); 40 | } -------------------------------------------------------------------------------- /tduck-common/src/main/java/com/tduck/cloud/common/jackson/DictEnumSerializer.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.common.jackson; 2 | 3 | import com.fasterxml.jackson.core.JsonGenerator; 4 | import com.fasterxml.jackson.databind.JsonSerializer; 5 | import com.fasterxml.jackson.databind.SerializerProvider; 6 | import com.tduck.cloud.common.entity.IDictEnum; 7 | 8 | import java.io.IOException; 9 | 10 | 11 | /** 12 | * 字典枚举序列化定义 13 | * @author tduck 14 | */ 15 | public class DictEnumSerializer extends JsonSerializer { 16 | 17 | @Override 18 | public void serialize(IDictEnum dictEnum, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 19 | jsonGenerator.writeObject(dictEnum.getValue()); 20 | jsonGenerator.writeFieldName(jsonGenerator.getOutputContext().getCurrentName() + "Desc"); 21 | jsonGenerator.writeString(dictEnum.getDesc()); 22 | } 23 | 24 | 25 | @Override 26 | public Class handledType() { 27 | return IDictEnum.class; 28 | } 29 | 30 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/data/ProvinceCityFormatDataHandler.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.data; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.convert.Convert; 5 | import cn.hutool.core.lang.TypeReference; 6 | import cn.hutool.core.map.MapUtil; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * 省市级联类型格式化数据处理 13 | * 14 | * @author tduck 15 | */ 16 | public class ProvinceCityFormatDataHandler implements BaseFormatDataHandler { 17 | 18 | @Override 19 | public Object formatData(String key, Object value, Object scheme) { 20 | // 省市级联 数据结构改造后 21 | if (value instanceof Map) { 22 | Map map = Convert.toMap(String.class, Object.class, value); 23 | return CollUtil.join(MapUtil.getQuietly(map, "cascadeValue", new TypeReference>() { 24 | }, CollUtil.newArrayList()), ",") + MapUtil.getStr(map, "detailAddr", ""); 25 | } 26 | return value.toString(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /tduck-account/src/main/java/com/tduck/cloud/account/request/RegisterAccountRequest.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.account.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author : smalljop 9 | * @description : 账号注册 10 | * @create : 2020-11-10 18:17 11 | **/ 12 | @Data 13 | public class RegisterAccountRequest { 14 | 15 | @NotBlank(message = "邮箱不能为空", groups = {EmailGroup.class}) 16 | private String email; 17 | @NotBlank(message = "手机号不能为空", groups = {PhoneNumberGroup.class}) 18 | private String phoneNumber; 19 | @NotBlank(message = "密码不能为空", groups = {EmailGroup.class, PhoneNumberGroup.class}) 20 | private String password; 21 | @NotBlank(message = "验证码不能为空", groups = {EmailGroup.class, PhoneNumberGroup.class}) 22 | private String code; 23 | 24 | /** 25 | * 邮箱校验组 26 | */ 27 | public interface EmailGroup { 28 | } 29 | 30 | 31 | /** 32 | * 手机校验组 33 | */ 34 | public interface PhoneNumberGroup { 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/service/impl/UserFormServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.service.impl; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 6 | import com.tduck.cloud.form.entity.UserFormEntity; 7 | import com.tduck.cloud.form.mapper.UserFormMapper; 8 | import com.tduck.cloud.form.service.UserFormService; 9 | import org.springframework.stereotype.Service; 10 | 11 | /** 12 | * 表单主表(Form)表服务实现类 13 | * 14 | * @author smalljop 15 | * @since 2020-11-18 18:16:18 16 | */ 17 | @Service 18 | public class UserFormServiceImpl extends ServiceImpl implements UserFormService { 19 | 20 | @Override 21 | public UserFormEntity getByKey(final String key) { 22 | if (StrUtil.isBlank(key)) { 23 | return null; 24 | } 25 | return this.getOne(Wrappers.lambdaQuery().eq(UserFormEntity::getFormKey, key)); 26 | } 27 | 28 | 29 | } -------------------------------------------------------------------------------- /tduck-form/src/main/java/com/tduck/cloud/form/entity/struct/OptionQuotaListStruct.java: -------------------------------------------------------------------------------- 1 | package com.tduck.cloud.form.entity.struct; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @author : tduck 9 | * @description : 10 | * @create : 2022/09/26 16:14 11 | **/ 12 | @Data 13 | public class OptionQuotaListStruct { 14 | private List