├── vue ├── src │ ├── vite-env.d.ts │ ├── types │ │ ├── lottie.d.ts │ │ ├── router.d.ts │ │ └── model-viewer.d.ts │ ├── constants │ │ ├── theme │ │ │ ├── index.ts │ │ │ ├── names.ts │ │ │ └── config.ts │ │ └── http-status │ │ │ ├── httpStatus.ts │ │ │ └── helps.ts │ ├── enums │ │ ├── index.ts │ │ ├── user.ts │ │ ├── websocket.ts │ │ ├── chat.ts │ │ └── workflow.ts │ ├── api │ │ ├── oss │ │ │ ├── types.d.ts │ │ │ └── oss.ts │ │ ├── redemption-code │ │ │ ├── types.d.ts │ │ │ └── redemption-code.ts │ │ ├── notice │ │ │ ├── types.ts │ │ │ └── notice.ts │ │ ├── system-overview │ │ │ ├── system-overview.ts │ │ │ └── types.d.ts │ │ ├── system-notice │ │ │ ├── system-notice.ts │ │ │ └── types.ts │ │ ├── system-user │ │ │ ├── system-user.ts │ │ │ └── types.d.ts │ │ ├── auth │ │ │ ├── types.d.ts │ │ │ └── auth.ts │ │ ├── user │ │ │ ├── user.ts │ │ │ └── types.d.ts │ │ ├── system-redemption │ │ │ ├── system-redemption.ts │ │ │ └── types.d.ts │ │ ├── workflow-result │ │ │ ├── types.d.ts │ │ │ └── workflow-result.ts │ │ ├── workflow-task │ │ │ └── workflow-task.ts │ │ ├── system-workflow │ │ │ └── system-workflow.ts │ │ └── chat │ │ │ └── chat.ts │ ├── assets │ │ ├── font │ │ │ ├── PingFang.ttf │ │ │ └── font.css │ │ ├── svg │ │ │ ├── assets.svg │ │ │ ├── profile.svg │ │ │ ├── effects.svg │ │ │ ├── attach.svg │ │ │ ├── chatIcon.svg │ │ │ ├── image-gen.svg │ │ │ ├── model-gen.svg │ │ │ ├── globe.svg │ │ │ ├── audio-gen.svg │ │ │ ├── exchange-code.svg │ │ │ ├── video-gen.svg │ │ │ ├── settings.svg │ │ │ ├── system-management.svg │ │ │ ├── ai-avatar.svg │ │ │ ├── creative.svg │ │ │ ├── all-tools.svg │ │ │ ├── points.svg │ │ │ ├── model-icon.svg │ │ │ └── language.svg │ │ └── vue.svg │ ├── env.d.ts │ ├── views │ │ ├── ai │ │ │ └── chat │ │ │ │ ├── types.ts │ │ │ │ └── components │ │ │ │ └── AiImageViewer.vue │ │ ├── comfyui │ │ │ └── components │ │ │ │ └── EmptyState.vue │ │ ├── works │ │ │ └── components │ │ │ │ ├── EmptyState.vue │ │ │ │ └── LoadingState.vue │ │ └── system │ │ │ ├── views │ │ │ └── OverviewView.vue │ │ │ └── index.vue │ ├── utils │ │ └── eventBusUtil.ts │ ├── App.vue │ ├── i18n │ │ ├── index.ts │ │ └── languages.config.ts │ ├── stores │ │ └── index.ts │ ├── components │ │ ├── auth │ │ │ └── components │ │ │ │ └── TermsAgreement.vue │ │ └── common │ │ │ └── AuthWrapper.vue │ ├── layouts │ │ └── components │ │ │ ├── SidebarLogo.vue │ │ │ └── SidebarFooter.vue │ ├── composables │ │ └── useAuthGuard.ts │ └── main.ts ├── .vscode │ └── extensions.json ├── .env ├── public │ └── favicon.ico ├── .env.development ├── .env.production ├── tsconfig.json ├── .gitignore ├── tsconfig.app.json ├── tsconfig.node.json └── package.json └── singleton ├── .idea ├── .gitignore ├── vcs.xml ├── misc.xml ├── encodings.xml ├── jarRepositories.xml └── compiler.xml ├── common └── src │ └── main │ └── java │ └── com │ └── cn │ └── common │ ├── constant │ ├── NoticeConstant.java │ ├── UserConstant.java │ ├── VerificationCodeConstant.java │ └── CacheExpireConstant.java │ ├── mapper │ ├── UserCreditsMapper.java │ ├── RedemptionCodeMapper.java │ ├── CreditTransactionMapper.java │ ├── UserMapper.java │ ├── WorkflowMapper.java │ ├── WorkflowFormMapper.java │ ├── WorkflowResultMapper.java │ ├── WorkflowCategoryMapper.java │ └── WorkflowOutputMapper.java │ ├── vo │ ├── PageVo.java │ └── UserInfoVo.java │ ├── enums │ ├── RequiredEnum.java │ ├── TransactionType.java │ ├── RoleEnum.java │ ├── ComfyuiWorksTypeEnum.java │ ├── FilePathEnum.java │ ├── TaskStatusEnum.java │ ├── ComfyuiFormTypeEnum.java │ └── RedemptionCodeStatus.java │ ├── base │ └── BasePage.java │ ├── exceptions │ ├── RateLimitException.java │ ├── OssException.java │ ├── CreditException.java │ ├── EmailException.java │ └── UniversalException.java │ ├── dto │ └── UploadNicknameDto.java │ ├── structure │ ├── NoticeStructure.java │ └── UserInfoStructure.java │ ├── entity │ ├── WorkflowOutput.java │ ├── CreditTransaction.java │ ├── WorkflowCategory.java │ ├── UserCredits.java │ ├── User.java │ ├── WorkflowForm.java │ ├── Workflow.java │ ├── RedemptionCode.java │ └── WorkflowResult.java │ ├── configuration │ ├── WebClientConfiguration.java │ ├── AdminInitConfiguration.java │ ├── MybatisPlusConfig.java │ ├── ComfyuiConfiguration.java │ ├── DateObjectHandler.java │ ├── LocalDateTimeConfig.java │ ├── AliConfiguration.java │ └── RedissonConfig.java │ ├── utils │ ├── StringUtils.java │ ├── UserUtils.java │ └── RedemptionCodeGenerator.java │ └── annotations │ └── RateLimit.java ├── application └── src │ └── main │ ├── resources │ ├── banner.txt │ └── application.yml │ └── java │ └── com │ └── cn │ ├── Application.java │ └── filter │ └── AuthInterfaceFilter.java ├── notice ├── src │ └── main │ │ └── java │ │ └── com │ │ └── cn │ │ └── notice │ │ ├── service │ │ ├── NoticeService.java │ │ └── impl │ │ │ └── NoticeServiceImpl.java │ │ ├── vo │ │ └── NoticeVo.java │ │ └── controller │ │ └── NoticeController.java └── pom.xml ├── oss ├── src │ └── main │ │ └── java │ │ └── com │ │ └── cn │ │ └── oss │ │ ├── service │ │ └── OssService.java │ │ ├── vo │ │ └── FileVo.java │ │ ├── exceptions │ │ └── UploadException.java │ │ └── controller │ │ └── OssController.java └── pom.xml ├── auth ├── src │ └── main │ │ └── java │ │ └── com │ │ └── cn │ │ └── auth │ │ ├── dto │ │ ├── RedeemCodeDto.java │ │ ├── UpdateAvatarDto.java │ │ ├── UpdateNicknameDto.java │ │ ├── GetVerificationCodeDto.java │ │ ├── PasswordLoginDto.java │ │ ├── EmailCodeLoginDto.java │ │ ├── RegisterDto.java │ │ └── ForgotPasswordDto.java │ │ ├── service │ │ ├── RedemptionCodeService.java │ │ ├── AuthService.java │ │ └── UserService.java │ │ ├── exceptions │ │ ├── RedemptionCodeException.java │ │ └── AuthException.java │ │ ├── vo │ │ ├── UserVo.java │ │ ├── UserCreditsVo.java │ │ └── CreditTransactionVo.java │ │ └── controller │ │ └── RedemptionCodeController.java └── pom.xml ├── llm └── src │ └── main │ └── java │ └── com │ └── cn │ └── llm │ ├── dto │ ├── AudioFileDto.java │ ├── DeleteSessionDto.java │ ├── PdfFileDto.java │ ├── GetAvailableModelListDto.java │ ├── GetAvailableModelPageDto.java │ └── SubmitMessageDto.java │ ├── excepitons │ └── LlmException.java │ ├── enums │ └── PaymentModeEnum.java │ ├── service │ └── LlmService.java │ └── registry │ └── RemoteRegistryRefresher.java ├── system ├── src │ └── main │ │ └── java │ │ └── com │ │ └── cn │ │ └── system │ │ ├── service │ │ ├── SystemOverviewService.java │ │ ├── SystemNoticeService.java │ │ ├── SystemUserService.java │ │ ├── SystemRedemptionCodeService.java │ │ ├── impl │ │ │ └── SystemNoticeServiceImpl.java │ │ └── SystemWorkflowService.java │ │ ├── dto │ │ ├── DeleteWorkflowDto.java │ │ ├── CreateWorkflowCategoryDto.java │ │ ├── DeleteWorkflowCategoryDto.java │ │ ├── DeleteUserDto.java │ │ ├── DeleteRedemptionCodeDto.java │ │ ├── UpdateUserDto.java │ │ ├── UpdateWorkflowCategoryDto.java │ │ ├── UpdateUserRoleDto.java │ │ ├── UpdateRedemptionCodeCreditsDto.java │ │ ├── UpdateWorkflowDto.java │ │ ├── ResetPasswordDto.java │ │ ├── CreateUserDto.java │ │ ├── SystemNoticeSetDto.java │ │ ├── UpdateRedemptionCodeDto.java │ │ └── CreateRedemptionCodeDto.java │ │ ├── vo │ │ ├── SystemWorkflowCategoryVo.java │ │ ├── SystemNoticeVo.java │ │ ├── ModelCallStatsVo.java │ │ ├── TaskStatsVo.java │ │ ├── SystemWorkflowPageItemVo.java │ │ ├── SystemUserVo.java │ │ ├── UserStatsVo.java │ │ ├── SystemRedemptionCodeVo.java │ │ ├── AiStatsVo.java │ │ ├── SystemResourcesVo.java │ │ ├── WorkflowStatsVo.java │ │ └── SystemOverviewVo.java │ │ └── controller │ │ ├── SystemOverviewController.java │ │ └── SystemNoticeController.java └── pom.xml ├── comfyui ├── src │ └── main │ │ └── java │ │ └── com │ │ └── cn │ │ └── comfyui │ │ ├── vo │ │ ├── WorkflowCategoryVo.java │ │ ├── UploadFileVo.java │ │ ├── WorkflowsVo.java │ │ ├── TaskProgressVo.java │ │ ├── WorkflowResultVo.java │ │ └── WorkflowInterfaceVo.java │ │ ├── dto │ │ ├── RemakeTaskDto.java │ │ ├── CancelTaskDto.java │ │ ├── WorkflowResultDto.java │ │ ├── BatchDeleteWorkflowResultDto.java │ │ └── SubmitTaskDto.java │ │ ├── model │ │ ├── WorkflowResultModel.java │ │ └── TaskNodeContainer.java │ │ ├── constant │ │ └── ComfyuiConstant.java │ │ ├── structure │ │ ├── TaskStructure.java │ │ └── TaskInfoStructure.java │ │ ├── websocket │ │ ├── message │ │ │ └── MessageType.java │ │ └── config │ │ │ ├── WebSocketConfig.java │ │ │ └── WebSocketShutdownListener.java │ │ ├── excepitons │ │ └── ComfyuiException.java │ │ ├── service │ │ ├── WorkflowResultService.java │ │ └── WorkflowService.java │ │ └── utils │ │ └── ComfyuiUtils.java └── pom.xml └── database └── workflow_result_add_form_params.sql /vue/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /vue/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /vue/.env: -------------------------------------------------------------------------------- 1 | # 所有环境通用的环境变量 2 | VITE_APP_TITLE=3D创意平台 3 | VITE_API_BASE_URL=http://localhost:3000 -------------------------------------------------------------------------------- /vue/src/types/lottie.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.json' { 2 | const value: any; 3 | export default value; 4 | } -------------------------------------------------------------------------------- /vue/src/constants/theme/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config'; 2 | export * from './colors'; 3 | export * from './names'; -------------------------------------------------------------------------------- /singleton/.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # 默认忽略的文件 2 | /shelf/ 3 | /workspace.xml 4 | # 依赖于环境的 Maven 主目录路径 5 | /mavenHomeManager.xml 6 | -------------------------------------------------------------------------------- /vue/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dulaiduwang003/cogni-comfyui-openrouter-ai/HEAD/vue/public/favicon.ico -------------------------------------------------------------------------------- /vue/src/enums/index.ts: -------------------------------------------------------------------------------- 1 | // 统一导出所有枚举 2 | export * from './workflow' 3 | export * from './websocket' 4 | export * from './chat' -------------------------------------------------------------------------------- /vue/src/api/oss/types.d.ts: -------------------------------------------------------------------------------- 1 | export namespace UploadFileApi { 2 | export interface Params { 3 | file: File 4 | } 5 | } -------------------------------------------------------------------------------- /vue/src/assets/font/PingFang.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dulaiduwang003/cogni-comfyui-openrouter-ai/HEAD/vue/src/assets/font/PingFang.ttf -------------------------------------------------------------------------------- /vue/.env.development: -------------------------------------------------------------------------------- 1 | # 开发环境的环境变量 2 | 3 | # 开发环境API地址 4 | VITE_API_BASE_URL=http://localhost:9000/api 5 | 6 | # WS环境 7 | VITE_API_WS_URL=ws://127.0.0.1:9000/api -------------------------------------------------------------------------------- /vue/.env.production: -------------------------------------------------------------------------------- 1 | # 生成环境的环境变量 2 | 3 | # 生成环境API地址 4 | VITE_API_BASE_URL=http://localhost:9000/api 5 | 6 | # WS环境 7 | VITE_API_WS_URL=ws://127.0.0.1:9000/api -------------------------------------------------------------------------------- /vue/src/api/redemption-code/types.d.ts: -------------------------------------------------------------------------------- 1 | export namespace RedeemCodeApi { 2 | export interface Params { 3 | code: string 4 | } 5 | 6 | 7 | } -------------------------------------------------------------------------------- /vue/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { "path": "./tsconfig.app.json" }, 5 | { "path": "./tsconfig.node.json" } 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/constant/NoticeConstant.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.constant; 2 | 3 | public interface NoticeConstant { 4 | 5 | 6 | String NOTICE = "NOTICE:"; 7 | 8 | 9 | } 10 | -------------------------------------------------------------------------------- /singleton/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /vue/src/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module '*.vue' { 4 | import type { DefineComponent } from 'vue' 5 | const component: DefineComponent<{}, {}, any> 6 | export default component 7 | } -------------------------------------------------------------------------------- /vue/src/api/notice/types.ts: -------------------------------------------------------------------------------- 1 | export namespace NoticeApi { 2 | export type NoticeVo = { 3 | title: string 4 | publisher: string 5 | content: string 6 | createTime: string 7 | md5: string 8 | } 9 | } 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /vue/src/api/notice/notice.ts: -------------------------------------------------------------------------------- 1 | import type { NoticeApi } from './types' 2 | import { get } from '@/utils/requestUtil' 3 | 4 | export const noticeApi = { 5 | getNotice: () => get('/notice/get') 6 | } 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /vue/src/assets/svg/assets.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/assets/svg/profile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /vue/src/assets/svg/effects.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/constants/http-status/httpStatus.ts: -------------------------------------------------------------------------------- 1 | export enum HttpStatus { 2 | SUCCESS = 200, 3 | CREATED = 201, 4 | NO_CONTENT = 204, 5 | BAD_REQUEST = 400, 6 | UNAUTHORIZED = 401, 7 | FORBIDDEN = 403, 8 | NOT_FOUND = 404, 9 | INTERNAL_SERVER_ERROR = 500, 10 | } 11 | 12 | -------------------------------------------------------------------------------- /vue/src/assets/svg/attach.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/application/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | `/\︵/\` /\_/\ z 3 | (=^∶^=) (=~.~=) 4 | (~)︾(~) (~)@(~)﹏.ゅ 5 | `=---=' 6 | 7 | ............................................. 8 | 如果下雨 你看不见我 9 | 如果天晴 你会想起我 10 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/constant/UserConstant.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.constant; 2 | 3 | /** 4 | * @author bdth 5 | * @version 1.0 6 | * @gitHub github@dulaiduwang003 7 | */ 8 | public interface UserConstant { 9 | 10 | String USER_INFO = "USER_INFO"; 11 | } 12 | -------------------------------------------------------------------------------- /vue/src/constants/http-status/helps.ts: -------------------------------------------------------------------------------- 1 | import { HttpStatus } from "./httpStatus"; 2 | 3 | 4 | export const isSuccessResponse = (code: number | string): boolean => { 5 | if (typeof code === 'string') { 6 | code = parseInt(code, 10); 7 | } 8 | return code === HttpStatus.SUCCESS; 9 | }; -------------------------------------------------------------------------------- /vue/src/api/system-overview/system-overview.ts: -------------------------------------------------------------------------------- 1 | import type { SystemOverviewApi } from './types' 2 | import { get } from '@/utils/requestUtil' 3 | 4 | export const systemOverviewApi = { 5 | reqSystemOverview: () => { 6 | return get('/system/overview/get') 7 | } 8 | } -------------------------------------------------------------------------------- /vue/src/api/redemption-code/redemption-code.ts: -------------------------------------------------------------------------------- 1 | import type { RedeemCodeApi } from './types' 2 | import { post } from '@/utils/requestUtil' 3 | 4 | export const redemptionCodeApi = { 5 | reqRedeemCode: (params: RedeemCodeApi.Params) => { 6 | return post('/redemption-code/redeem', params) 7 | } 8 | } -------------------------------------------------------------------------------- /vue/src/assets/svg/chatIcon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /vue/src/assets/svg/image-gen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/assets/svg/model-gen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/constant/VerificationCodeConstant.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.constant; 2 | 3 | /** 4 | * @author bdth github@dulaiduwang003 5 | * @version 1.0 6 | */ 7 | public interface VerificationCodeConstant { 8 | 9 | String EMAIL_CODE_KEY_PREFIX = "EMAIL_CODE:"; 10 | 11 | 12 | } 13 | -------------------------------------------------------------------------------- /vue/src/enums/user.ts: -------------------------------------------------------------------------------- 1 | // 用户积分交易类型枚举 2 | export enum TransactionType { 3 | FREEZE = "FREEZE", // 冻结积分 4 | CONSUME = "CONSUME", // 消费积分 5 | REFUND = "REFUND", // 退还积分 6 | RECHARGE = "RECHARGE" // 充值积分 7 | } 8 | 9 | export enum Role { 10 | USER = "USER", // 用户 11 | ADMIN = "ADMIN" // 管理员 12 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/UserCreditsMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.UserCredits; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface UserCreditsMapper extends BaseMapper { 9 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/vo/PageVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.util.List; 7 | 8 | @Data 9 | @Accessors(chain = true) 10 | public class PageVo{ 11 | 12 | 13 | private Long total; 14 | 15 | private List items; 16 | } 17 | -------------------------------------------------------------------------------- /vue/src/api/system-notice/system-notice.ts: -------------------------------------------------------------------------------- 1 | import type { SystemNoticeApi } from './types' 2 | import { post } from '@/utils/requestUtil' 3 | 4 | export const systemNoticeApi = { 5 | setNotice: (body: SystemNoticeApi.NoticeSetDto) => post('/system/notice/set', body), 6 | clearNotice: () => post('/system/notice/clear') 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/RedemptionCodeMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.RedemptionCode; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface RedemptionCodeMapper extends BaseMapper { 9 | } -------------------------------------------------------------------------------- /vue/src/enums/websocket.ts: -------------------------------------------------------------------------------- 1 | // WebSocket消息类型枚举 2 | export enum WebSocketMessageTypeEnum { 3 | TASK_STATUS_CHANGE = "TASK_STATUS_CHANGE", // 任务状态变化 4 | TASK_PROGRESS_UPDATE = "TASK_PROGRESS_UPDATE", // 任务进度更新 5 | QUEUE_POSITION_UPDATE = "QUEUE_POSITION_UPDATE", // 队列位置更新 6 | CONNECTION_ACK = "CONNECTION_ACK", // 连接确认消息 7 | ERROR = "ERROR" // 错误消息 8 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/CreditTransactionMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.CreditTransaction; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface CreditTransactionMapper extends BaseMapper { 9 | } -------------------------------------------------------------------------------- /vue/src/api/system-notice/types.ts: -------------------------------------------------------------------------------- 1 | export namespace SystemNoticeApi { 2 | export type NoticeVo = { 3 | title: string 4 | publisher: string 5 | content: string 6 | createTime: string 7 | } 8 | 9 | export type NoticeSetDto = { 10 | title: string 11 | publisher: string 12 | content: string 13 | createTime?: string 14 | } 15 | } 16 | 17 | 18 | -------------------------------------------------------------------------------- /vue/src/assets/svg/globe.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/notice/src/main/java/com/cn/notice/service/NoticeService.java: -------------------------------------------------------------------------------- 1 | package com.cn.notice.service; 2 | 3 | import com.cn.notice.vo.NoticeVo; 4 | 5 | /** 6 | * 通知服务接口 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | public interface NoticeService { 13 | 14 | 15 | NoticeVo getNotice(); 16 | 17 | } 18 | 19 | 20 | -------------------------------------------------------------------------------- /vue/src/assets/font/font.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'PingFang'; 3 | src: url('@/assets/font/PingFang.ttf') format('truetype'); 4 | font-weight: normal; 5 | font-style: normal; 6 | font-display: swap; 7 | /* 添加兼容性写法 */ 8 | src: local('PingFang SC'), 9 | local('PingFang-SC-Regular'), 10 | url('@/assets/font/PingFang.ttf') format('truetype'); 11 | } 12 | 13 | -------------------------------------------------------------------------------- /singleton/oss/src/main/java/com/cn/oss/service/OssService.java: -------------------------------------------------------------------------------- 1 | package com.cn.oss.service; 2 | 3 | 4 | import org.springframework.web.multipart.MultipartFile; 5 | 6 | /** 7 | * OSS服务接口 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | public interface OssService { 14 | 15 | 16 | String uploadFile(final MultipartFile file); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /vue/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Build analysis 16 | dist/stats.html 17 | 18 | # Editor directories and files 19 | .vscode/* 20 | !.vscode/extensions.json 21 | .idea 22 | .DS_Store 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? 28 | -------------------------------------------------------------------------------- /vue/src/assets/svg/audio-gen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/RedeemCodeDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | /** 7 | * 兑换码DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class RedeemCodeDto { 15 | 16 | @NotBlank(message = "兑换码不能为空") 17 | private String code; 18 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/RequiredEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @ToString 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public enum RequiredEnum { 13 | 14 | TRUE(1L), 15 | 16 | FALSE(0L); 17 | 18 | Long dec; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/base/BasePage.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.base; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author 明明不是下雨天 github@dulaiduwang003 2024/7/4 下午4:37 10 | */ 11 | @Data 12 | @Accessors(chain = true) 13 | public class BasePage { 14 | 15 | private List items; 16 | 17 | private Long total; 18 | 19 | } 20 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/TransactionType.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | @Getter 7 | @AllArgsConstructor 8 | public enum TransactionType { 9 | FREEZE("FREEZE"), //冻结积分 10 | CONSUME("CONSUME"), //消费积分 11 | REFUND("REFUND"), //退还积分 12 | RECHARGE("RECHARGE"); //充值积分 13 | 14 | private final String code; 15 | 16 | } -------------------------------------------------------------------------------- /vue/src/constants/theme/names.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 主题名称常量 3 | */ 4 | export const THEME_DARK_RED = 'theme-dark-red'; 5 | export const THEME_LIGHT_SOFT_LAVENDER = 'theme-light-soft-lavender'; 6 | export const THEME_LIGHT_RED = 'theme-light-red'; 7 | 8 | export const DEFAULT_THEME = THEME_LIGHT_SOFT_LAVENDER; 9 | 10 | export type ThemeName = 11 | | typeof THEME_DARK_RED 12 | | typeof THEME_LIGHT_SOFT_LAVENDER 13 | | typeof THEME_LIGHT_RED; -------------------------------------------------------------------------------- /vue/src/enums/chat.ts: -------------------------------------------------------------------------------- 1 | // 输入类型枚举 2 | export enum InputTypeEnum { 3 | TEXT = "text", // 文本 4 | IMAGE = "image", // 图片 5 | AUDIO = "audio", // 音频, 6 | FILE = "file", // 文件 7 | } 8 | 9 | // 输出类型枚举 10 | export enum OutputTypeEnum { 11 | TEXT = "text", // 文本 12 | IMAGE = "image", // 图片 13 | } 14 | 15 | // 付费模式枚举 16 | export enum PaymentModeEnum { 17 | FREE = "FREE", // 免费 18 | PAID = "PAID", // 付费 19 | } 20 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/RoleEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | 9 | @Getter 10 | @ToString 11 | @NoArgsConstructor 12 | @AllArgsConstructor 13 | public enum RoleEnum { 14 | 15 | ADMIN("ADMIN"), 16 | 17 | USER("USER"); 18 | 19 | private String desc; 20 | } 21 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/AudioFileDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | /** 7 | * 音频文件DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class AudioFileDto { 15 | /** 音频文件 URL */ 16 | @NotBlank(message = "audio url 不能为空") 17 | private String url; 18 | } -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/DeleteSessionDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | /** 7 | * 删除会话DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class DeleteSessionDto { 15 | @NotBlank(message = "sessionId不能为空") 16 | private String sessionId; 17 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.User; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * The interface User mapper. 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Mapper 14 | public interface UserMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/PdfFileDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | /** 7 | * PDF文件DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class PdfFileDto { 15 | /** PDF 文件 URL(仅允许 http/https) */ 16 | @NotBlank(message = "pdfFiles.url 不能为空") 17 | private String url; 18 | } -------------------------------------------------------------------------------- /singleton/oss/src/main/java/com/cn/oss/vo/FileVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.oss.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 文件VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class FileVo implements Serializable { 18 | 19 | private String url; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/SystemOverviewService.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service; 2 | 3 | import com.cn.system.vo.SystemOverviewVo; 4 | 5 | /** 6 | * 系统概况统计服务 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | public interface SystemOverviewService { 13 | 14 | /** 15 | * 获取系统概况统计数据 16 | */ 17 | SystemOverviewVo getSystemOverview(); 18 | } 19 | 20 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/WorkflowMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.Workflow; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * The interface User mapper. 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Mapper 14 | public interface WorkflowMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/DeleteWorkflowDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | 6 | /** 7 | * 删除工作流DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class DeleteWorkflowDto { 15 | 16 | @NotNull(message = "workflowId 不能为空") 17 | private Long workflowId; 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/service/RedemptionCodeService.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.service; 2 | 3 | import com.cn.auth.dto.RedeemCodeDto; 4 | 5 | /** 6 | * 兑换码服务接口 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | public interface RedemptionCodeService { 13 | 14 | /** 15 | * 兑换兑换码 16 | * 17 | * @param dto 兑换码DTO 18 | */ 19 | void redeemCode(RedeemCodeDto dto); 20 | } -------------------------------------------------------------------------------- /vue/src/assets/svg/exchange-code.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/WorkflowCategoryVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 工作流筛选条件VO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class WorkflowCategoryVo { 16 | 17 | private Long categoryId; 18 | 19 | private String name; 20 | 21 | 22 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/CreateWorkflowCategoryDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | /** 7 | * 创建工作流类别DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class CreateWorkflowCategoryDto { 15 | 16 | @NotBlank(message = "name 不能为空") 17 | private String name; 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/WorkflowFormMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.WorkflowForm; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * The interface User mapper. 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Mapper 14 | public interface WorkflowFormMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/DeleteWorkflowCategoryDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | 6 | /** 7 | * 删除工作流类别DTO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | public class DeleteWorkflowCategoryDto { 15 | 16 | @NotNull(message = "categoryId 不能为空") 17 | private Long categoryId; 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/WorkflowResultMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.WorkflowResult; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * The interface User mapper. 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Mapper 14 | public interface WorkflowResultMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemWorkflowCategoryVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 系统工作流类别VO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class SystemWorkflowCategoryVo { 16 | 17 | private Long categoryId; 18 | 19 | private String name; 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/WorkflowCategoryMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.cn.common.entity.WorkflowCategory; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | /** 8 | * The interface User mapper. 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Mapper 14 | public interface WorkflowCategoryMapper extends BaseMapper { 15 | } 16 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/mapper/WorkflowOutputMapper.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | 5 | import com.cn.common.entity.WorkflowOutput; 6 | import org.apache.ibatis.annotations.Mapper; 7 | 8 | /** 9 | * The interface User mapper. 10 | * 11 | * @author bdth github@dulaiduwang003 12 | * @version 1.0 13 | */ 14 | @Mapper 15 | public interface WorkflowOutputMapper extends BaseMapper { 16 | } 17 | -------------------------------------------------------------------------------- /vue/src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/DeleteUserDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 删除用户DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class DeleteUserDto { 17 | 18 | @NotNull(message = "用户ID不能为空") 19 | private Long id; 20 | } -------------------------------------------------------------------------------- /vue/src/assets/svg/video-gen.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/UpdateAvatarDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 更新头像DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class UpdateAvatarDto { 17 | 18 | @NotEmpty(message = "头像不能为空") 19 | private String avatar; 20 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/exceptions/RateLimitException.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.exceptions; 2 | 3 | /** 4 | * 限流异常 5 | * 6 | * @author 时间海 @github dulaiduwang003 7 | * @version 1.0 8 | */ 9 | public class RateLimitException extends RuntimeException { 10 | 11 | public RateLimitException(String message) { 12 | super(message); 13 | } 14 | 15 | public RateLimitException(String message, Throwable cause) { 16 | super(message, cause); 17 | } 18 | } -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/UpdateNicknameDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 更新昵称DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class UpdateNicknameDto { 17 | 18 | @NotEmpty(message = "昵称不能为空") 19 | private String nickname; 20 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/DeleteRedemptionCodeDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 删除兑换码DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class DeleteRedemptionCodeDto { 17 | 18 | @NotNull 19 | private Long id; 20 | } 21 | 22 | 23 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/dto/RemakeTaskDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 重制任务DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class RemakeTaskDto { 17 | 18 | @NotBlank(message = "任务ID不能为空") 19 | private String taskId; 20 | } 21 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/dto/CancelTaskDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 取消任务DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class CancelTaskDto { 17 | 18 | @NotEmpty(message = "任务ID不能为空") 19 | private String taskId; 20 | 21 | } 22 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/model/WorkflowResultModel.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.model; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 工作流结果模型 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class WorkflowResultModel { 16 | 17 | private String url; 18 | 19 | private String type; 20 | 21 | private Long workflowResultId; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/SystemNoticeService.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service; 2 | 3 | import com.cn.system.dto.SystemNoticeSetDto; 4 | 5 | /** 6 | * 系统公告设置服务 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | public interface SystemNoticeService { 13 | 14 | /** 15 | * 设置公告 16 | */ 17 | void set(SystemNoticeSetDto dto); 18 | 19 | /** 20 | * 清空公告 21 | */ 22 | void clear(); 23 | } 24 | 25 | 26 | -------------------------------------------------------------------------------- /singleton/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/UploadFileVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 上传文件VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class UploadFileVo implements Serializable { 18 | 19 | private String fileName; 20 | 21 | private String url; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/dto/UploadNicknameDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * @author 明明不是下雨天 github@dulaiduwang003 2024/9/10 下午11:06 11 | */ 12 | @Data 13 | @Accessors(chain = true) 14 | public class UploadNicknameDto implements Serializable { 15 | 16 | @NotEmpty(message = "用户昵称不能为空") 17 | private String nickname; 18 | } 19 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/ComfyuiWorksTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | @Getter 9 | @ToString 10 | @NoArgsConstructor 11 | @AllArgsConstructor 12 | public enum ComfyuiWorksTypeEnum { 13 | 14 | AUDIO("AUDIO"), 15 | 16 | VIDEO("VIDEO"), 17 | 18 | MODEL("MODEL"), 19 | 20 | IMAGE("IMAGE"); 21 | 22 | 23 | 24 | String dec; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/GetVerificationCodeDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 获取验证码DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class GetVerificationCodeDto { 17 | 18 | @NotEmpty(message = "邮箱不能为空") 19 | private String email; 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/dto/WorkflowResultDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 作品结果DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class WorkflowResultDto { 17 | 18 | 19 | @NotNull(message = "作品ID不能为空") 20 | private Long workflowResultId; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/vo/UserInfoVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | /** 10 | * @author 明明不是下雨天 github@dulaiduwang003 2024/9/10 下午9:14 11 | */ 12 | @Data 13 | @Accessors(chain = true) 14 | public class UserInfoVo implements Serializable { 15 | 16 | 17 | 18 | private String nickname; 19 | 20 | private String avatar; 21 | 22 | private List roles; 23 | } 24 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/exceptions/RedemptionCodeException.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.exceptions; 2 | 3 | /** 4 | * 兑换码相关异常 5 | * 6 | * @author 时间海 @github dulaiduwang003 7 | * @email 2074055628@qq.com 8 | * @version 1.0 9 | */ 10 | public class RedemptionCodeException extends RuntimeException { 11 | 12 | public RedemptionCodeException(String message) { 13 | super(message); 14 | } 15 | 16 | public RedemptionCodeException(String message, Throwable cause) { 17 | super(message, cause); 18 | } 19 | } -------------------------------------------------------------------------------- /singleton/database/workflow_result_add_form_params.sql: -------------------------------------------------------------------------------- 1 | -- 为 workflow_result 表添加元数据字段 2 | -- 用于保存生成作品时使用的表单参数(包含 tips、type、options 等元数据) 3 | 4 | ALTER TABLE workflow_result 5 | ADD COLUMN workflow_id BIGINT COMMENT '工作流ID', 6 | ADD COLUMN form_params JSON COMMENT '生成时使用的表单参数(包含tips、type、options等元数据)', 7 | ADD INDEX idx_workflow_id (workflow_id); 8 | 9 | -- 添加注释说明 10 | ALTER TABLE workflow_result MODIFY COLUMN form_params JSON COMMENT 'JSON格式存储,包含workflowId和taskNodeContainer数组,taskNodeContainer中包含nodeKey、inputs、nodeValue、isUpload、tips、type、options等字段'; 11 | 12 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/structure/NoticeStructure.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.structure; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain=true) 11 | public class NoticeStructure implements Serializable { 12 | 13 | private String title; 14 | 15 | private String publisher; 16 | 17 | private String content; 18 | 19 | private LocalDateTime createTime; 20 | 21 | private String md5; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/structure/UserInfoStructure.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.structure; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 用户结构体 10 | * 11 | * @author bdth 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class UserInfoStructure implements Serializable { 17 | 18 | private Long userId; 19 | 20 | private String nickname; 21 | 22 | private String avatar; 23 | 24 | private String role; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /vue/src/views/ai/chat/types.ts: -------------------------------------------------------------------------------- 1 | export interface Message { 2 | id: string 3 | content: string 4 | isUser: boolean 5 | timestamp: number 6 | userName?: string 7 | aiModel?: string 8 | aiModelIcon?: string 9 | reasoningContent?: string 10 | citations?: UrlCitation[] 11 | imageUrls?: string[] 12 | pdfFiles?: { url: string; filename: string }[] 13 | audioFiles?: { url: string }[] 14 | } 15 | 16 | export interface UrlCitation { 17 | title?: string 18 | url?: string 19 | content?: string 20 | startIndex?: number 21 | endIndex?: number 22 | } -------------------------------------------------------------------------------- /vue/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "compilerOptions": { 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | 6 | "baseUrl": ".", 7 | "paths": { 8 | "@/*": ["src/*"] 9 | }, 10 | 11 | /* Linting */ 12 | "strict": true, 13 | "noUnusedLocals": true, 14 | "noUnusedParameters": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "noUncheckedSideEffectImports": true 17 | }, 18 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "./auto-imports.d.ts"] 19 | } 20 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/FilePathEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | /** 9 | * The enum File enum. 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @version 1.0 13 | */ 14 | @Getter 15 | @ToString 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public enum FilePathEnum { 19 | 20 | TEMP("TEMP"), 21 | 22 | COMFYUI("COMFYUI"), 23 | 24 | USER("USER"); 25 | 26 | String dec; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /vue/src/utils/eventBusUtil.ts: -------------------------------------------------------------------------------- 1 | import mitt from 'mitt'; 2 | 3 | //登录弹窗 4 | export const OPEN_AUTH_DIALOG = 'open-auth-dialog'; 5 | //兑换码弹窗 6 | export const OPEN_REDEMPTION_DIALOG = 'open-redemption-dialog'; 7 | //登录成功 8 | export const LOGIN_SUCCESS = 'login-success'; 9 | //公告弹窗 10 | export const OPEN_NOTICE_ANNOUNCER = 'open-notice-announcer'; 11 | 12 | type Events = { 13 | [OPEN_AUTH_DIALOG]: void; 14 | [OPEN_REDEMPTION_DIALOG]: void; 15 | [LOGIN_SUCCESS]: void; 16 | [OPEN_NOTICE_ANNOUNCER]: void; 17 | }; 18 | 19 | const emitter = mitt(); 20 | 21 | export default emitter; -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/PasswordLoginDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.NotEmpty; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 密码登录DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class PasswordLoginDto { 17 | 18 | @NotEmpty(message = "登录邮箱不能为空") 19 | private String email; 20 | 21 | @NotEmpty(message = "登录密码不能为空") 22 | private String password; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/GetAvailableModelListDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 获取可用模型列表DTO 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | @Data 13 | public class GetAvailableModelListDto { 14 | private String inputType; // 逗号分隔的输入模态 15 | private String outputType; // 逗号分隔的输出模态 16 | private String name; // 名称模糊匹配 17 | private Boolean supportReasoning; // 是否为推理模型(null 不筛选) 18 | private String paymentMode; // 付费模式筛选(收费/免费,null 不筛选) 19 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateUserDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | /** 8 | * 更新用户DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | @Accessors(chain = true) 16 | public class UpdateUserDto { 17 | 18 | @NotNull(message = "用户ID不能为空") 19 | private Long id; 20 | 21 | private String email; 22 | 23 | private String nickname; 24 | 25 | private String avatar; 26 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateWorkflowCategoryDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | 7 | /** 8 | * 更新工作流类别DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | public class UpdateWorkflowCategoryDto { 16 | 17 | @NotNull(message = "categoryId 不能为空") 18 | private Long categoryId; 19 | 20 | @NotBlank(message = "name 不能为空") 21 | private String name; 22 | } 23 | 24 | 25 | -------------------------------------------------------------------------------- /vue/src/assets/svg/settings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/types/router.d.ts: -------------------------------------------------------------------------------- 1 | import 'vue-router' 2 | 3 | // 返回按钮配置接口 4 | interface BackButtonConfig { 5 | // 是否显示返回按钮 6 | show: boolean 7 | // 返回按钮的目标路由(如果不设置则使用浏览器历史返回) 8 | to?: string 9 | // 返回按钮的文本(默认为"返回") 10 | text?: string 11 | } 12 | 13 | declare module 'vue-router' { 14 | interface RouteMeta { 15 | // 是否需要认证 16 | requiresAuth?: boolean 17 | // 是否隐藏侧边栏 18 | hideSidebar?: boolean 19 | // 页面标题 20 | title?: string 21 | // 页面描述 22 | description?: string 23 | // 返回按钮配置 24 | backButton?: BackButtonConfig 25 | // 其他自定义元信息 26 | [key: string]: any 27 | } 28 | } -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/vo/UserVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 用户信息视图对象 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class UserVo implements Serializable { 18 | 19 | /** 20 | * 用户昵称 21 | */ 22 | private String nickname; 23 | 24 | /** 25 | * 用户头像 26 | */ 27 | private String avatar; 28 | 29 | 30 | private String role; 31 | } -------------------------------------------------------------------------------- /vue/src/api/oss/oss.ts: -------------------------------------------------------------------------------- 1 | import type { UploadFileApi } from './types' 2 | import { post } from '@/utils/requestUtil' 3 | 4 | export const ossApi = { 5 | /** 6 | * 上传文件 7 | * @param params 包含文件的参数对象 8 | * @returns Promise 返回文件URL或文件路径 9 | */ 10 | uploadFile: (params: UploadFileApi.Params) => { 11 | const formData = new FormData() 12 | formData.append('file', params.file) 13 | 14 | return post('/oss/upload/file', formData, { 15 | headers: { 16 | 'Content-Type': 'multipart/form-data' 17 | } 18 | }) 19 | } 20 | } -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/vo/UserCreditsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 用户积分信息视图对象 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class UserCreditsVo { 16 | 17 | /** 18 | * 总积分 19 | */ 20 | private Long totalCredits; 21 | 22 | /** 23 | * 可用积分 24 | */ 25 | private Long availableCredits; 26 | 27 | /** 28 | * 冻结积分 29 | */ 30 | private Long frozenCredits; 31 | 32 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateUserRoleDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | /** 9 | * 更新用户角色DTO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class UpdateUserRoleDto { 18 | 19 | @NotNull(message = "用户ID不能为空") 20 | private Long id; 21 | 22 | @NotBlank(message = "角色不能为空") 23 | private String role; 24 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateRedemptionCodeCreditsDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | /** 9 | * 更新兑换码积分DTO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class UpdateRedemptionCodeCreditsDto { 18 | 19 | @NotNull 20 | private Long id; 21 | 22 | @NotNull 23 | @Min(0) 24 | private Long creditsAmount; 25 | } 26 | 27 | 28 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/SystemUserService.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service; 2 | 3 | import com.cn.common.vo.PageVo; 4 | import com.cn.system.dto.*; 5 | import com.cn.system.vo.SystemUserVo; 6 | 7 | /** 8 | * 系统用户服务接口 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | public interface SystemUserService { 15 | 16 | PageVo page(Integer page, Integer size, String keyword, String role); 17 | 18 | Long create(CreateUserDto dto); 19 | 20 | void update(UpdateUserDto dto); 21 | 22 | void delete(DeleteUserDto dto); 23 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/WorkflowOutput.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "workflow_output") 12 | public class WorkflowOutput { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private Long workflowId; 18 | 19 | private String nodeKey; 20 | 21 | private String type; 22 | 23 | } 24 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemNoticeVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * 系统公告VO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class SystemNoticeVo implements Serializable { 19 | 20 | private String title; 21 | 22 | private String publisher; 23 | 24 | private String content; 25 | 26 | private LocalDateTime time; 27 | } 28 | 29 | 30 | -------------------------------------------------------------------------------- /vue/src/assets/svg/system-management.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/constant/ComfyuiConstant.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.constant; 2 | 3 | /** 4 | * ComfyUI常量 5 | * 6 | * @author 时间海 @github dulaiduwang003 7 | * @email 2074055628@qq.com 8 | * @version 1.0 9 | */ 10 | public interface ComfyuiConstant { 11 | 12 | String COMFYUI_QUEUE = "COMFYUI_QUEUE"; 13 | 14 | String COMFYUI_QUEUE_INDEX = "COMFYUI_QUEUE_INDEX"; 15 | 16 | String COMFYUI_TASK_LIST = "COMFYUI_TASK_LIST:USER_ID:"; 17 | 18 | String COMFYUI_TASK_TIME_INDEX = "COMFYUI_TASK_TIME_INDEX:USER_ID:"; 19 | 20 | String COMFYUI_GLOBAL_SUBMIT_LOCK = "COMFYUI_GLOBAL_SUBMIT_LOCK"; 21 | 22 | } 23 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/ModelCallStatsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * AI 模型调用统计 VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public class ModelCallStatsVo { 20 | 21 | /** 22 | * 模型名称 23 | */ 24 | private String modelName; 25 | 26 | /** 27 | * 调用次数 28 | */ 29 | private Long callCount; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/TaskStatsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 任务队列统计 VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public class TaskStatsVo { 20 | 21 | /** 22 | * 队列中的任务数 23 | */ 24 | private Long queuedTasks; 25 | 26 | /** 27 | * 正在构建的任务数 28 | */ 29 | private Integer buildingTasks; 30 | } 31 | 32 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemWorkflowPageItemVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 系统工作流分页项VO 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class SystemWorkflowPageItemVo { 16 | 17 | private Long workflowId; 18 | 19 | private String name; 20 | 21 | private String description; 22 | 23 | private String url; 24 | 25 | private String categoryName; 26 | 27 | private Long creditsDeducted; 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/TaskStatusEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | /** 9 | * The enum File enum. 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @version 1.0 13 | */ 14 | @Getter 15 | @ToString 16 | @NoArgsConstructor 17 | @AllArgsConstructor 18 | public enum TaskStatusEnum { 19 | 20 | WAIT("WAIT"), 21 | 22 | BUILD("BUILD"), 23 | 24 | SUCCEED("SUCCEED"), 25 | 26 | CANCELED("CANCELED"), 27 | 28 | FAILED("FAILED"); 29 | 30 | String dec; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/EmailCodeLoginDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.Email; 4 | import jakarta.validation.constraints.NotBlank; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | /** 9 | * 邮箱验证码登录DTO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class EmailCodeLoginDto { 18 | 19 | @NotBlank(message = "邮箱不能为空") 20 | @Email(message = "邮箱格式错误") 21 | private String email; 22 | 23 | @NotBlank(message = "验证码不能为空") 24 | private String code; 25 | } -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/GetAvailableModelPageDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 获取可用模型分页DTO 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | @Data 13 | public class GetAvailableModelPageDto { 14 | private String inputType; // 逗号分隔的输入模态 15 | private String outputType; // 逗号分隔的输出模态 16 | private String name; // 名称模糊匹配 17 | private Boolean supportReasoning; // 是否为推理模型(null 不筛选) 18 | private String paymentMode; // 付费模式筛选(收费/免费,null 不筛选 19 | // 分页参数 20 | private Integer page; // 当前页码 21 | } -------------------------------------------------------------------------------- /singleton/notice/src/main/java/com/cn/notice/vo/NoticeVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.notice.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * 通知VO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class NoticeVo implements Serializable { 19 | 20 | private String title; 21 | 22 | private String publisher; 23 | 24 | private String content; 25 | 26 | private LocalDateTime createTime; 27 | 28 | private String md5; 29 | } 30 | 31 | 32 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemUserVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.time.LocalDateTime; 7 | 8 | /** 9 | * 系统用户VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class SystemUserVo { 18 | 19 | private Long id; 20 | 21 | private String email; 22 | 23 | private String nickname; 24 | 25 | private String avatar; 26 | 27 | private String role; 28 | 29 | private LocalDateTime createTime; 30 | 31 | private LocalDateTime updateTime; 32 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateWorkflowDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | 7 | /** 8 | * 更新工作流DTO 9 | * 10 | * @author 时间海 @github dulaiduwang003 11 | * @email 2074055628@qq.com 12 | * @version 1.0 13 | */ 14 | @Data 15 | public class UpdateWorkflowDto { 16 | 17 | @NotNull(message = "workflowId 不能为空") 18 | private Long workflowId; 19 | 20 | @NotBlank(message = "name 不能为空") 21 | private String name; 22 | 23 | @NotNull(message = "workflowCategoryId 不能为空") 24 | private Long workflowCategoryId; 25 | } 26 | 27 | 28 | -------------------------------------------------------------------------------- /vue/src/assets/svg/ai-avatar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /vue/src/App.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 22 | 23 | 26 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/dto/BatchDeleteWorkflowResultDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.dto; 2 | 3 | import jakarta.validation.constraints.NotNull; 4 | import jakarta.validation.constraints.Size; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 批量删除作品DTO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class BatchDeleteWorkflowResultDto { 20 | 21 | @NotNull(message = "作品ID列表不能为空") 22 | @Size(min = 1, max = 50, message = "一次最多删除50个作品") 23 | private List workflowResultIds; 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /vue/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 4 | "target": "ES2022", 5 | "lib": ["ES2023"], 6 | "module": "ESNext", 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "isolatedModules": true, 13 | "moduleDetection": "force", 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true, 21 | "noUncheckedSideEffectImports": true 22 | }, 23 | "include": ["vite.config.ts"] 24 | } 25 | -------------------------------------------------------------------------------- /singleton/application/src/main/java/com/cn/Application.java: -------------------------------------------------------------------------------- 1 | package com.cn; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableAsync; 6 | import org.springframework.scheduling.annotation.EnableScheduling; 7 | 8 | /** 9 | * 应用启动类 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @SpringBootApplication 16 | @EnableScheduling 17 | @EnableAsync 18 | public class Application { 19 | 20 | public static void main(String[] args) { 21 | SpringApplication.run(Application.class, args); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/structure/TaskStructure.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.structure; 2 | 3 | import com.cn.comfyui.model.TaskNodeContainer; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.io.Serializable; 8 | import java.util.List; 9 | 10 | /** 11 | * 任务结构 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class TaskStructure implements Serializable { 20 | 21 | private Long userId; 22 | 23 | private Long workflowId; 24 | 25 | private String taskId; 26 | 27 | private List taskNodeContainer; 28 | 29 | } 30 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/CreditTransaction.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "credit_transactions") 12 | public class CreditTransaction { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private Long userId; 18 | 19 | private String transactionType; 20 | 21 | private Long amount; 22 | 23 | 24 | private String description; 25 | 26 | @TableField(fill = FieldFill.INSERT) 27 | private LocalDateTime createTime; 28 | 29 | } -------------------------------------------------------------------------------- /vue/src/i18n/index.ts: -------------------------------------------------------------------------------- 1 | import { createI18n } from 'vue-i18n' 2 | import zhCN from './locales/zh-CN' 3 | import enUS from './locales/en-US' 4 | import { defaultLanguage, isSupportedLanguage } from './languages.config' 5 | 6 | 7 | const getDefaultLocale = () => { 8 | const savedLocale = localStorage.getItem('app-locale') 9 | if (savedLocale && isSupportedLanguage(savedLocale)) { 10 | return savedLocale 11 | } 12 | return defaultLanguage 13 | } 14 | 15 | const i18n = createI18n({ 16 | legacy: false, 17 | locale: getDefaultLocale(), 18 | fallbackLocale: 'zh-CN', 19 | messages: { 20 | 'zh-CN': zhCN, 21 | 'en-US': enUS 22 | }, 23 | globalInjection: true 24 | }) 25 | 26 | export default i18n 27 | 28 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/WorkflowsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 工作流VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class WorkflowsVo implements Serializable { 18 | 19 | private Long workflowId; 20 | 21 | private String name; 22 | 23 | private String description; 24 | 25 | private String url; 26 | 27 | private String categoryName; 28 | 29 | /** 30 | * 工作流需要消耗的积分数量 31 | */ 32 | private Long creditsDeducted; 33 | } 34 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/ResetPasswordDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import jakarta.validation.constraints.NotNull; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | /** 10 | * 重置密码DTO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class ResetPasswordDto { 19 | 20 | @NotNull(message = "用户ID不能为空") 21 | private Long id; 22 | 23 | @NotBlank(message = "密码不能为空") 24 | @Size(min = 6, message = "密码长度至少为6位") 25 | private String password; 26 | } -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/websocket/message/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.websocket.message; 2 | 3 | /** 4 | * WebSocket消息类型枚举 5 | * 6 | * @author 时间海 @github dulaiduwang003 7 | * @email 2074055628@qq.com 8 | * @version 1.0 9 | */ 10 | public enum MessageType { 11 | 12 | 13 | /** 14 | * 任务状态变化 - 状态改变时发送 15 | */ 16 | TASK_STATUS_CHANGE, 17 | 18 | /** 19 | * 任务进度更新 - 进度变化时发送 20 | */ 21 | TASK_PROGRESS_UPDATE, 22 | 23 | /** 24 | * 队列位置更新 - 排队位置变化时发送 25 | */ 26 | QUEUE_POSITION_UPDATE, 27 | 28 | /** 29 | * 连接确认消息 30 | */ 31 | CONNECTION_ACK, 32 | 33 | /** 34 | * 错误消息 35 | */ 36 | ERROR 37 | } 38 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/UserStatsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 用户统计 VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public class UserStatsVo { 20 | 21 | /** 22 | * 用户总数 23 | */ 24 | private Long totalUsers; 25 | 26 | /** 27 | * 当前在线用户数(WebSocket 连接数) 28 | */ 29 | private Integer onlineUsers; 30 | 31 | /** 32 | * 今日新增用户数 33 | */ 34 | private Long todayNewUsers; 35 | } 36 | 37 | -------------------------------------------------------------------------------- /vue/src/constants/theme/config.ts: -------------------------------------------------------------------------------- 1 | import { Moon, Sunny } from '@element-plus/icons-vue'; 2 | import type { ThemeName } from './names'; 3 | import { THEME_DARK_RED, THEME_LIGHT_SOFT_LAVENDER, THEME_LIGHT_RED } from './names'; 4 | 5 | export interface ThemeOption { 6 | value: ThemeName; 7 | label: string; 8 | labelKey: string; // i18n key for translation 9 | icon: any; 10 | } 11 | 12 | export const themeOptions: ThemeOption[] = [ 13 | { value: THEME_DARK_RED, label: '深色 - 红色', labelKey: 'theme.darkRed', icon: Moon }, 14 | { value: THEME_LIGHT_SOFT_LAVENDER, label: '浅色 - 薰衣草', labelKey: 'theme.lightSoftLavender', icon: Sunny }, 15 | { value: THEME_LIGHT_RED, label: '浅色 - 红色', labelKey: 'theme.lightRed', icon: Sunny }, 16 | ]; -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/WorkflowCategory.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * Comfyui工作流筛选实体类 11 | */ 12 | 13 | @Data 14 | @Accessors(chain = true) 15 | @TableName(value = "workflow_category") 16 | public class WorkflowCategory { 17 | 18 | @TableId(type = IdType.AUTO) 19 | private Long id; 20 | 21 | private String name; 22 | 23 | 24 | @TableField(fill = FieldFill.INSERT) 25 | private LocalDateTime createTime; 26 | 27 | @TableField(fill = FieldFill.INSERT_UPDATE) 28 | private LocalDateTime updateTime; 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/dto/SubmitTaskDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.dto; 2 | 3 | import com.cn.comfyui.model.TaskNodeContainer; 4 | import jakarta.validation.constraints.NotEmpty; 5 | import jakarta.validation.constraints.NotNull; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 提交任务DTO 13 | * 14 | * @author 时间海 @github dulaiduwang003 15 | * @email 2074055628@qq.com 16 | * @version 1.0 17 | */ 18 | @Data 19 | @Accessors(chain = true) 20 | public class SubmitTaskDto { 21 | 22 | @NotNull(message = "工作流ID不能为空") 23 | private Long workflowId; 24 | 25 | @NotEmpty(message = "操作节点不能为空") 26 | private List nodeContainer; 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/exceptions/OssException.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.exceptions; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 微信接口异常处理 8 | * @author 时间海 @github dulaiduwang003 9 | * @version 1.0 10 | */ 11 | @SuppressWarnings("all") 12 | @Data 13 | public class OssException extends RuntimeException { 14 | 15 | private String message; 16 | 17 | private Integer code; 18 | 19 | 20 | public OssException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public OssException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /vue/src/assets/svg/creative.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/exceptions/CreditException.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.exceptions; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 积分业务异常处理 8 | * @author bdth github@dulaiduwang003 9 | * @version 1.0 10 | */ 11 | @SuppressWarnings("all") 12 | @Data 13 | public class CreditException extends RuntimeException { 14 | 15 | private String message; 16 | 17 | private Integer code; 18 | 19 | 20 | public CreditException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public CreditException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/exceptions/EmailException.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.exceptions; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 微信接口异常处理 8 | * @author 时间海 @github dulaiduwang003 9 | * @version 1.0 10 | */ 11 | @SuppressWarnings("all") 12 | @Data 13 | public class EmailException extends RuntimeException { 14 | 15 | private String message; 16 | 17 | private Integer code; 18 | 19 | 20 | public EmailException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public EmailException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/excepitons/LlmException.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.excepitons; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * LLM异常处理 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | @SuppressWarnings("all") 13 | @Data 14 | public class LlmException extends RuntimeException { 15 | 16 | private String message; 17 | 18 | private Integer code; 19 | 20 | public LlmException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public LlmException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/exceptions/UniversalException.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.exceptions; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 微信接口异常处理 8 | * @author 时间海 @github dulaiduwang003 9 | * @version 1.0 10 | */ 11 | @SuppressWarnings("all") 12 | @Data 13 | public class UniversalException extends RuntimeException { 14 | 15 | private String message; 16 | 17 | private Integer code; 18 | 19 | 20 | public UniversalException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public UniversalException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /singleton/oss/src/main/java/com/cn/oss/exceptions/UploadException.java: -------------------------------------------------------------------------------- 1 | package com.cn.oss.exceptions; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * 上传异常处理 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | @SuppressWarnings("all") 13 | @Data 14 | public class UploadException extends RuntimeException { 15 | 16 | private String message; 17 | 18 | private Integer code; 19 | 20 | public UploadException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public UploadException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemRedemptionCodeVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.time.LocalDateTime; 7 | 8 | /** 9 | * 系统兑换码VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class SystemRedemptionCodeVo { 18 | 19 | private Long id; 20 | 21 | private String code; 22 | 23 | private Long creditsAmount; 24 | 25 | private Integer status; 26 | 27 | private Long usedByUserId; 28 | 29 | private LocalDateTime usedTime; 30 | 31 | private LocalDateTime expireTime; 32 | 33 | private String description; 34 | 35 | private LocalDateTime createTime; 36 | } 37 | 38 | 39 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/exceptions/AuthException.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.exceptions; 2 | 3 | 4 | import lombok.Data; 5 | 6 | /** 7 | * 认证异常处理 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @SuppressWarnings("all") 14 | @Data 15 | public class AuthException extends RuntimeException { 16 | 17 | private String message; 18 | 19 | private Integer code; 20 | 21 | 22 | public AuthException(final String message, final Integer code) { 23 | super(message); 24 | this.message = message; 25 | this.code = code; 26 | } 27 | 28 | public AuthException(final String message) { 29 | super(message); 30 | this.message = message; 31 | this.code = 500; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/UserCredits.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "user_credits") 12 | public class UserCredits { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private Long userId; 18 | 19 | private Long totalCredits; 20 | 21 | private Long availableCredits; 22 | 23 | private Long frozenCredits; 24 | 25 | @TableField(fill = FieldFill.INSERT) 26 | private LocalDateTime createTime; 27 | 28 | @TableField(fill = FieldFill.INSERT_UPDATE) 29 | private LocalDateTime updateTime; 30 | 31 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/WebClientConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.reactive.function.client.WebClient; 7 | 8 | @Configuration 9 | public class WebClientConfiguration { 10 | 11 | @Value("${spring.codec.max-in-memory-size}") 12 | private int maxInMemorySize; 13 | 14 | @Bean 15 | public WebClient webClient() { 16 | return WebClient 17 | .builder() 18 | .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(maxInMemorySize)) 19 | .build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "user") 12 | public class User { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private String email; 18 | 19 | private String password; 20 | 21 | private String nickname; 22 | 23 | private String avatar; 24 | 25 | private String role; 26 | 27 | @TableField(fill = FieldFill.INSERT) 28 | private LocalDateTime createTime; 29 | 30 | @TableField(fill = FieldFill.INSERT_UPDATE) 31 | private LocalDateTime updateTime; 32 | 33 | } 34 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/excepitons/ComfyuiException.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.excepitons; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * ComfyUI异常处理 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @email 2074055628@qq.com 10 | * @version 1.0 11 | */ 12 | @SuppressWarnings("all") 13 | @Data 14 | public class ComfyuiException extends RuntimeException { 15 | 16 | private String message; 17 | 18 | private Integer code; 19 | 20 | public ComfyuiException(final String message, final Integer code) { 21 | super(message); 22 | this.message = message; 23 | this.code = code; 24 | } 25 | 26 | public ComfyuiException(final String message) { 27 | super(message); 28 | this.message = message; 29 | this.code = 500; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/RegisterDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.Email; 4 | import jakarta.validation.constraints.NotBlank; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | import org.hibernate.validator.constraints.Length; 8 | 9 | /** 10 | * 注册DTO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class RegisterDto { 19 | 20 | @NotBlank(message = "邮箱不能为空") 21 | @Email(message = "邮箱格式错误") 22 | private String email; 23 | 24 | @NotBlank(message = "验证码不能为空") 25 | private String code; 26 | 27 | @NotBlank(message = "密码不能为空") 28 | @Length(min = 6, message = "密码不能低于6位") 29 | private String password; 30 | } -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/service/WorkflowResultService.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.service; 2 | 3 | import com.cn.common.base.BasePage; 4 | import com.cn.comfyui.dto.BatchDeleteWorkflowResultDto; 5 | import com.cn.comfyui.dto.WorkflowResultDto; 6 | import com.cn.comfyui.vo.WorkflowResultVo; 7 | 8 | /** 9 | * 工作流结果服务接口 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | public interface WorkflowResultService { 16 | 17 | BasePage getWorkflowResultPage(final Long page); 18 | 19 | WorkflowResultVo getWorkflowResultDetail(final Long workflowResultId); 20 | 21 | void deleteWorkflowResult(final WorkflowResultDto dto); 22 | 23 | void batchDeleteWorkflowResult(final BatchDeleteWorkflowResultDto dto); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/WorkflowForm.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.annotation.TableId; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "workflow_form") 12 | public class WorkflowForm { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private Long workflowId; 18 | 19 | private String type; 20 | 21 | private String tips; 22 | 23 | private String nodeKey; 24 | 25 | private String inputs; 26 | 27 | private String options; 28 | 29 | private String template; 30 | 31 | private Long required; 32 | 33 | private Long size; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/dto/ForgotPasswordDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.dto; 2 | 3 | import jakarta.validation.constraints.Email; 4 | import jakarta.validation.constraints.NotBlank; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | import org.hibernate.validator.constraints.Length; 8 | 9 | /** 10 | * 忘记密码DTO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class ForgotPasswordDto { 19 | 20 | @NotBlank(message = "邮箱不能为空") 21 | @Email(message = "邮箱格式错误") 22 | private String email; 23 | 24 | @NotBlank(message = "验证码不能为空") 25 | private String code; 26 | 27 | @NotBlank(message = "新密码不能为空") 28 | @Length(min = 6, message = "新密码不能低于6位") 29 | private String password; 30 | } -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/vo/CreditTransactionVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.time.LocalDateTime; 7 | 8 | /** 9 | * 积分交易记录视图对象 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Accessors(chain = true) 17 | public class CreditTransactionVo { 18 | 19 | /** 20 | * 交易ID 21 | */ 22 | private Long id; 23 | 24 | /** 25 | * 交易类型 26 | */ 27 | private String transactionType; 28 | 29 | /** 30 | * 交易金额 31 | */ 32 | private Long amount; 33 | 34 | /** 35 | * 交易描述 36 | */ 37 | private String description; 38 | 39 | /** 40 | * 创建时间 41 | */ 42 | private LocalDateTime createTime; 43 | 44 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/Workflow.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "workflow") 12 | public class Workflow { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | private String name; 18 | 19 | private String description; 20 | 21 | private String url; 22 | 23 | private String json; 24 | 25 | private String workflowCategoryId; 26 | 27 | private Long creditsDeducted; 28 | 29 | @TableField(fill = FieldFill.INSERT) 30 | private LocalDateTime createTime; 31 | 32 | @TableField(fill = FieldFill.INSERT_UPDATE) 33 | private LocalDateTime updateTime; 34 | 35 | } 36 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/CreateUserDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.Email; 4 | import jakarta.validation.constraints.NotBlank; 5 | import jakarta.validation.constraints.Size; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | /** 10 | * 创建用户DTO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class CreateUserDto { 19 | 20 | @NotBlank(message = "邮箱不能为空") 21 | @Email(message = "邮箱格式不正确") 22 | private String email; 23 | 24 | @NotBlank(message = "密码不能为空") 25 | @Size(min = 6, message = "密码长度至少为6位") 26 | private String password; 27 | 28 | private String nickname; 29 | 30 | private String avatar; 31 | 32 | private String role; 33 | } -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/service/AuthService.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.service; 2 | 3 | 4 | import com.cn.auth.dto.EmailCodeLoginDto; 5 | import com.cn.auth.dto.PasswordLoginDto; 6 | import com.cn.auth.dto.GetVerificationCodeDto; 7 | import com.cn.auth.dto.RegisterDto; 8 | import com.cn.auth.dto.ForgotPasswordDto; 9 | 10 | /** 11 | * 认证服务接口 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | public interface AuthService { 18 | 19 | 20 | 21 | String passwordLogin(final PasswordLoginDto dto); 22 | 23 | String emailCodeLogin(final EmailCodeLoginDto dto); 24 | 25 | void getVerificationCode(final GetVerificationCodeDto dto); 26 | 27 | void register(final RegisterDto dto); 28 | 29 | void logout(); 30 | 31 | void forgotPassword(final ForgotPasswordDto dto); 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/SystemNoticeSetDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.io.Serializable; 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 系统公告设置DTO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class SystemNoticeSetDto implements Serializable { 20 | 21 | @NotBlank(message = "标题不能为空") 22 | private String title; 23 | 24 | @NotBlank(message = "发布人不能为空") 25 | private String publisher; 26 | 27 | @NotBlank(message = "内容不能为空") 28 | private String content; 29 | 30 | /** 31 | * 展示时间(前端弹窗显示用);不传则由后端生成当前时间 32 | */ 33 | private LocalDateTime createTime; 34 | } 35 | 36 | 37 | -------------------------------------------------------------------------------- /vue/src/api/system-user/system-user.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | GetUserPageApi, 3 | CreateUserApi, 4 | UpdateUserApi, 5 | DeleteUserApi 6 | } from './types' 7 | import { get, post } from '@/utils/requestUtil' 8 | 9 | export const systemUserApi = { 10 | // 获取用户分页列表 11 | reqGetUserPage: (params?: GetUserPageApi.Params) => { 12 | return get('/system/user/page', params) 13 | }, 14 | 15 | // 创建用户 16 | reqCreateUser: (params: CreateUserApi.Params) => { 17 | return post('/system/user/create', params) 18 | }, 19 | 20 | // 更新用户信息 21 | reqUpdateUser: (params: UpdateUserApi.Params) => { 22 | return post('/system/user/update', params) 23 | }, 24 | 25 | // 删除用户 26 | reqDeleteUser: (params: DeleteUserApi.Params) => { 27 | return post('/system/user/delete', params) 28 | } 29 | } -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/model/TaskNodeContainer.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.model; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | /** 7 | * 任务节点容器 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @email 2074055628@qq.com 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Accessors(chain = true) 15 | public class TaskNodeContainer { 16 | 17 | private String nodeKey; 18 | 19 | private String inputs; 20 | 21 | private String nodeValue; 22 | 23 | private Boolean isUpload; 24 | 25 | // ========== 元数据字段(用于前端显示和作品记录)========== 26 | 27 | /** 28 | * 表单提示文字 29 | */ 30 | private String tips; 31 | 32 | /** 33 | * 表单类型(TEXT_PROMPT、IMAGE_UPLOAD、RADIO_SELECTOR 等) 34 | */ 35 | private String type; 36 | 37 | /** 38 | * 选择器选项(JSON 数组字符串) 39 | */ 40 | private String options; 41 | 42 | } 43 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/dto/SubmitMessageDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.dto; 2 | 3 | import jakarta.validation.constraints.NotBlank; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 提交消息DTO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | public class SubmitMessageDto { 17 | 18 | @NotBlank(message = "sessionId 不能为空") 19 | private String sessionId; 20 | 21 | /** 22 | * 文本可为空,但 text、imageUrls、pdfFiles、audioFiles 不能同时为空(由控制器校验) 23 | */ 24 | private String text; 25 | 26 | /** 27 | * 图片URL列表,仅 http/https 或 data:image;base64 由前端转为URL,这里只接收URL。 28 | */ 29 | private List imageUrls; 30 | 31 | /** 32 | * PDF 文件(多个) 33 | */ 34 | private List pdfFiles; 35 | 36 | /** 37 | * 音频文件(多个,base64 + format) 38 | */ 39 | private List audioFiles; 40 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/AiStatsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * AI 对话统计 VO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Builder 19 | @NoArgsConstructor 20 | @AllArgsConstructor 21 | public class AiStatsVo { 22 | 23 | /** 24 | * 今日 API 调用总次数 25 | */ 26 | private Long todayApiCalls; 27 | 28 | /** 29 | * 今日 Token 消耗总量 30 | */ 31 | private Long todayTokensUsed; 32 | 33 | /** 34 | * 今日对话次数(可选,从数据库统计) 35 | */ 36 | private Long todayConversations; 37 | 38 | /** 39 | * 活跃的 AI 模型统计(Top 5) 40 | */ 41 | private List activeModels; 42 | } 43 | 44 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/UpdateRedemptionCodeDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 更新兑换码DTO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class UpdateRedemptionCodeDto { 20 | 21 | @NotNull 22 | private Long id; 23 | 24 | /** 可选:调整积分数量(已使用的不允许修改) */ 25 | @Min(0) 26 | private Long creditsAmount; 27 | 28 | /** 可选:调整状态(1 有效,0 已使用,-1 已禁用) */ 29 | private Integer status; 30 | 31 | /** 可选:调整过期时间 */ 32 | private LocalDateTime expireTime; 33 | 34 | /** 可选:调整描述 */ 35 | private String description; 36 | } 37 | 38 | 39 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemResourcesVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 系统资源统计 VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public class SystemResourcesVo { 20 | 21 | /** 22 | * CPU 使用率 (%) 23 | */ 24 | private Double cpuUsage; 25 | 26 | /** 27 | * 内存使用率 (%) 28 | */ 29 | private Double memoryUsage; 30 | 31 | /** 32 | * 总内存 (MB) 33 | */ 34 | private Long memoryTotal; 35 | 36 | /** 37 | * 已用内存 (MB) 38 | */ 39 | private Long memoryUsed; 40 | 41 | /** 42 | * 可用内存 (MB) 43 | */ 44 | private Long memoryFree; 45 | } 46 | 47 | -------------------------------------------------------------------------------- /vue/src/api/auth/types.d.ts: -------------------------------------------------------------------------------- 1 | export namespace PasswordLoginApi { 2 | 3 | export interface Params { 4 | email: string 5 | password: string 6 | } 7 | 8 | } 9 | 10 | export namespace EmailLoginApi { 11 | 12 | 13 | export interface Params { 14 | email: string 15 | code: string 16 | } 17 | 18 | } 19 | 20 | 21 | 22 | 23 | export namespace GetVerificationCodeApi { 24 | 25 | 26 | export interface Params { 27 | email: string 28 | password: string 29 | } 30 | 31 | } 32 | 33 | 34 | export namespace RegisterApi { 35 | 36 | export interface Params { 37 | email: string 38 | code: string 39 | password: string 40 | } 41 | } 42 | 43 | export namespace ForgotPasswordApi { 44 | export interface Params { 45 | email: string 46 | code: string 47 | password: string 48 | } 49 | } 50 | 51 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/WorkflowStatsVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | /** 9 | * 工作流统计 VO 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @email 2074055628@qq.com 13 | * @version 1.0 14 | */ 15 | @Data 16 | @Builder 17 | @NoArgsConstructor 18 | @AllArgsConstructor 19 | public class WorkflowStatsVo { 20 | 21 | /** 22 | * 工作流总数 23 | */ 24 | private Long totalWorkflows; 25 | 26 | /** 27 | * 今日任务提交总数 28 | */ 29 | private Long todayTasks; 30 | 31 | /** 32 | * 今日成功任务数 33 | */ 34 | private Long todaySuccessTasks; 35 | 36 | /** 37 | * 今日失败任务数 38 | */ 39 | private Long todayFailedTasks; 40 | 41 | /** 42 | * 今日取消任务数 43 | */ 44 | private Long todayCancelledTasks; 45 | } 46 | 47 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/TaskProgressVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import com.cn.comfyui.model.WorkflowResultModel; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.io.Serializable; 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 任务进度VO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class TaskProgressVo implements Serializable { 20 | 21 | private String taskId; 22 | 23 | private String workflowName; 24 | 25 | private Long progress; 26 | 27 | private WorkflowResultModel workflowResultModel; 28 | 29 | private String status; 30 | 31 | private Long location; 32 | 33 | private LocalDateTime createTime; 34 | 35 | /** 36 | * 任务消耗的积分数量 37 | */ 38 | private Long creditsDeducted; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/enums/PaymentModeEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.enums; 2 | 3 | /** 4 | * 付费模式枚举 5 | * 6 | * @author 时间海 @github dulaiduwang003 7 | * @email 2074055628@qq.com 8 | * @version 1.0 9 | */ 10 | public enum PaymentModeEnum { 11 | PAID("PAID"), 12 | FREE("FREE"); 13 | 14 | private final String value; 15 | 16 | PaymentModeEnum(String value) { 17 | this.value = value; 18 | } 19 | 20 | public String getValue() { 21 | return value; 22 | } 23 | 24 | /** 25 | * 根据字符串值获取枚举 26 | */ 27 | public static PaymentModeEnum fromValue(String value) { 28 | if (value == null) { 29 | return null; 30 | } 31 | for (PaymentModeEnum mode : PaymentModeEnum.values()) { 32 | if (mode.getValue().equals(value)) { 33 | return mode; 34 | } 35 | } 36 | return null; 37 | } 38 | } -------------------------------------------------------------------------------- /singleton/.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /vue/src/assets/svg/all-tools.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vue/src/views/comfyui/components/EmptyState.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/AdminInitConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * 管理员初始化配置属性 9 | * 10 | * @author bdth github@dulaiduwang003 11 | * @version 1.0 12 | */ 13 | @Data 14 | @Component 15 | @ConfigurationProperties(prefix = "admin.init") 16 | public class AdminInitConfiguration { 17 | 18 | /** 19 | * 是否启用管理员初始化 20 | */ 21 | private Boolean enabled = true; 22 | 23 | /** 24 | * 管理员邮箱 25 | */ 26 | private String email; 27 | 28 | /** 29 | * 管理员密码 30 | */ 31 | private String password; 32 | 33 | /** 34 | * 管理员昵称 35 | */ 36 | private String nickname = "系统管理员"; 37 | 38 | /** 39 | * 初始积分 40 | */ 41 | private Long initialCredits = 1000000L; 42 | } 43 | 44 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/SystemRedemptionCodeService.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service; 2 | 3 | import com.cn.common.vo.PageVo; 4 | import com.cn.system.dto.CreateRedemptionCodeDto; 5 | import com.cn.system.dto.DeleteRedemptionCodeDto; 6 | import com.cn.system.dto.UpdateRedemptionCodeCreditsDto; 7 | import com.cn.system.dto.UpdateRedemptionCodeDto; 8 | import com.cn.system.vo.SystemRedemptionCodeVo; 9 | 10 | /** 11 | * 系统兑换码服务接口 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | public interface SystemRedemptionCodeService { 18 | 19 | PageVo page(Integer page, Integer size, String keyword, Integer status); 20 | 21 | Long create(CreateRedemptionCodeDto dto); 22 | 23 | void delete(DeleteRedemptionCodeDto dto); 24 | 25 | void updateCredits(UpdateRedemptionCodeCreditsDto dto); 26 | 27 | void update(UpdateRedemptionCodeDto dto); 28 | } 29 | 30 | 31 | -------------------------------------------------------------------------------- /vue/src/types/model-viewer.d.ts: -------------------------------------------------------------------------------- 1 | declare module '@google/model-viewer' { 2 | export interface ModelViewerElement extends HTMLElement { 3 | src: string 4 | alt: string 5 | autoRotate: boolean 6 | cameraControls: boolean 7 | environmentImage: string 8 | exposure: number 9 | shadowIntensity: number 10 | toneMapping: string 11 | loading: 'auto' | 'lazy' | 'eager' 12 | } 13 | } 14 | 15 | declare global { 16 | namespace JSX { 17 | interface IntrinsicElements { 18 | 'model-viewer': React.DetailedHTMLProps, HTMLElement> & { 19 | src?: string 20 | alt?: string 21 | 'auto-rotate'?: boolean 22 | 'camera-controls'?: boolean 23 | 'environment-image'?: string 24 | exposure?: number 25 | 'shadow-intensity'?: number 26 | 'tone-mapping'?: string 27 | loading?: 'auto' | 'lazy' | 'eager' 28 | } 29 | } 30 | } 31 | } 32 | 33 | export {} -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/dto/CreateRedemptionCodeDto.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.dto; 2 | 3 | import jakarta.validation.constraints.Min; 4 | import jakarta.validation.constraints.NotNull; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 创建兑换码DTO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class CreateRedemptionCodeDto { 20 | 21 | /** 22 | * 发放的积分数量 23 | */ 24 | @NotNull 25 | @Min(1) 26 | private Long creditsAmount; 27 | 28 | /** 29 | * 可选:自定义前缀(如 RC-) 30 | */ 31 | private String prefix; 32 | 33 | /** 34 | * 可选:随机部分长度,默认 8 35 | */ 36 | @Min(4) 37 | private Integer length; 38 | 39 | /** 40 | * 可选:过期时间 41 | */ 42 | private LocalDateTime expireTime; 43 | 44 | /** 45 | * 可选:描述 46 | */ 47 | private String description; 48 | } 49 | 50 | 51 | -------------------------------------------------------------------------------- /vue/src/api/auth/auth.ts: -------------------------------------------------------------------------------- 1 | import type { PasswordLoginApi, EmailLoginApi, RegisterApi, ForgotPasswordApi, GetVerificationCodeApi } from './types' 2 | import { post } from '@/utils/requestUtil' 3 | 4 | export const authApi = { 5 | reqPasswordLogin: (params: PasswordLoginApi.Params) => { 6 | return post('/auth/password-login', params) 7 | }, 8 | reqEmailLogin: (params: EmailLoginApi.Params) => { 9 | return post('/auth/email-login', params) 10 | }, 11 | reqRegister: (params: RegisterApi.Params) => { 12 | return post('/auth/register', params) 13 | }, 14 | reqForgotPassword: (params: ForgotPasswordApi.Params) => { 15 | return post('/auth/forgot-password', params) 16 | }, 17 | reqGetVerificationCode: (params: GetVerificationCodeApi.Params) => { 18 | return post('/auth/get-verification-code', params) 19 | }, 20 | reqLogout: () => { 21 | return post('/auth/logout') 22 | } 23 | } -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/WorkflowResultVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import com.alibaba.fastjson2.JSONObject; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.io.Serializable; 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 工作流结果VO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Accessors(chain = true) 19 | public class WorkflowResultVo implements Serializable { 20 | 21 | private Long workflowResultId; 22 | 23 | private String type; 24 | 25 | private String url; 26 | 27 | private String workflowName; 28 | 29 | private String taskId; 30 | 31 | private LocalDateTime createTime; 32 | 33 | /** 34 | * 工作流ID 35 | */ 36 | private Long workflowId; 37 | 38 | /** 39 | * 生成时使用的表单参数(包含 tips、type、options 等元数据) 40 | * 用于前端展示和重新制作 41 | */ 42 | private JSONObject formParams; 43 | } 44 | -------------------------------------------------------------------------------- /vue/src/api/user/user.ts: -------------------------------------------------------------------------------- 1 | import type { GetUserInfoApi, UpdateAvatarApi, UpdateNicknameApi, GetUserCreditsApi, GetCreditTransactionsApi } from './types' 2 | import { get, post } from '@/utils/requestUtil' 3 | 4 | export const userApi = { 5 | reqGetUserInfo: () => { 6 | return get('/user/get/user-info') 7 | }, 8 | 9 | // 更新用户头像 10 | reqUpdateAvatar: (params: UpdateAvatarApi.Params) => { 11 | return post('/user/update-avatar', params) 12 | }, 13 | 14 | // 更新用户昵称 15 | reqUpdateNickname: (params: UpdateNicknameApi.Params) => { 16 | return post('/user/update-nickname', params) 17 | }, 18 | 19 | // 获取用户积分信息 20 | reqGetUserCredits: () => { 21 | return get('/user/get/credits') 22 | }, 23 | 24 | // 获取积分交易记录 25 | reqGetCreditTransactions: (params?: GetCreditTransactionsApi.Params) => { 26 | return get('/user/get/credit-transactions',params) 27 | } 28 | } -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/utils/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.utils; 2 | 3 | import java.util.List; 4 | import java.util.Objects; 5 | 6 | /** 7 | * 字符串处理类 8 | * 9 | * @author 时间海 @github dulaiduwang003 10 | * @version 1.0 11 | */ 12 | @SuppressWarnings("all") 13 | public final class StringUtils extends org.apache.commons.lang3.StringUtils { 14 | 15 | 16 | public static boolean isLegal(String str) { 17 | if (isEmpty(str)) { 18 | return true; 19 | } 20 | return !str.contains("|"); 21 | } 22 | 23 | public static boolean notEmpty(String str) { 24 | if (Objects.nonNull(str) && str.length() > 0) { 25 | return true; 26 | } 27 | 28 | return false; 29 | } 30 | 31 | 32 | public static String join(List list) { 33 | return join(list.toArray()); 34 | } 35 | 36 | 37 | public static String join(List list, String separator) { 38 | return join(list.toArray(), separator); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/utils/UserUtils.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.utils; 2 | 3 | import cn.dev33.satoken.stp.StpUtil; 4 | import com.cn.common.constant.UserConstant; 5 | import com.cn.common.structure.UserInfoStructure; 6 | 7 | 8 | /** 9 | * 用户工具类 10 | * 11 | * @author 时间海 @github dulaiduwang003 12 | * @version 1.0 13 | */ 14 | public class UserUtils { 15 | 16 | 17 | public static Long getCurrentLoginId() { 18 | return Long.parseLong(String.valueOf(StpUtil.getLoginId())); 19 | } 20 | 21 | public static Long getLoginIdByToken(final String token){ 22 | return Long.parseLong(String.valueOf(StpUtil.getLoginIdByToken(token))); 23 | } 24 | 25 | 26 | public static UserInfoStructure getCurrentUserInfo() { 27 | return (UserInfoStructure) StpUtil.getSession().get(UserConstant.USER_INFO); 28 | } 29 | 30 | public static void updateUserInfo(final UserInfoStructure userInfo) { 31 | StpUtil.getSession().set(UserConstant.USER_INFO, userInfo); 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/MybatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import com.baomidou.mybatisplus.annotation.DbType; 4 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 5 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | 10 | /** 11 | * 12 | * MP配置 13 | * 14 | * @author bdth @github dulaiduwang003 15 | * @version 1.0 16 | */ 17 | @Configuration 18 | public class MybatisPlusConfig { 19 | 20 | 21 | /** 22 | * 配置分页拦截链 23 | * 24 | * @return the mybatis plus interceptor 25 | */ 26 | @Bean 27 | public MybatisPlusInterceptor paginationInterceptor() { 28 | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); 29 | interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 30 | return interceptor; 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /singleton/auth/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.cn 8 | singleton 9 | 1.0-SNAPSHOT 10 | 11 | 12 | auth 13 | 14 | 15 | 22 16 | 22 17 | UTF-8 18 | 19 | 20 | 21 | 22 | com.cn 23 | common 24 | 1.0-SNAPSHOT 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /singleton/notice/src/main/java/com/cn/notice/controller/NoticeController.java: -------------------------------------------------------------------------------- 1 | package com.cn.notice.controller; 2 | 3 | import com.cn.common.annotations.RateLimit; 4 | import com.cn.common.msg.Result; 5 | import com.cn.notice.service.NoticeService; 6 | import lombok.RequiredArgsConstructor; 7 | import org.springframework.http.MediaType; 8 | import org.springframework.validation.annotation.Validated; 9 | import org.springframework.web.bind.annotation.*; 10 | 11 | /** 12 | * 通知控制器 13 | * 14 | * @author 时间海 @github dulaiduwang003 15 | * @email 2074055628@qq.com 16 | * @version 1.0 17 | */ 18 | @RestController 19 | @RequestMapping("/notice") 20 | @RequiredArgsConstructor 21 | @Validated 22 | public class NoticeController { 23 | 24 | private final NoticeService noticeService; 25 | 26 | @GetMapping(value = "/get", produces = MediaType.APPLICATION_JSON_VALUE) 27 | @RateLimit(permitsPerSecond = 5.0, limitType = RateLimit.LimitType.GLOBAL) 28 | public Result get() { 29 | return Result.data(noticeService.getNotice()); 30 | } 31 | } 32 | 33 | 34 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/vo/SystemOverviewVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.vo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.time.LocalDateTime; 9 | 10 | /** 11 | * 系统概况统计 VO 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Data 18 | @Builder 19 | @NoArgsConstructor 20 | @AllArgsConstructor 21 | public class SystemOverviewVo { 22 | 23 | /** 24 | * 用户统计 25 | */ 26 | private UserStatsVo userStats; 27 | 28 | /** 29 | * AI 对话统计 30 | */ 31 | private AiStatsVo aiStats; 32 | 33 | /** 34 | * 工作流统计 35 | */ 36 | private WorkflowStatsVo workflowStats; 37 | 38 | /** 39 | * 系统资源统计 40 | */ 41 | private SystemResourcesVo systemResources; 42 | 43 | /** 44 | * 任务队列统计 45 | */ 46 | private TaskStatsVo taskStats; 47 | 48 | /** 49 | * 统计时间戳 50 | */ 51 | private LocalDateTime timestamp; 52 | } 53 | 54 | -------------------------------------------------------------------------------- /vue/src/stores/index.ts: -------------------------------------------------------------------------------- 1 | import { createPinia } from 'pinia' 2 | import { setupResponseInterceptors } from '@/utils/requestUtil' 3 | import { useAuthStore } from './modules/auth' 4 | import { useUserStore } from './modules/user' 5 | 6 | // 创建pinia实例 7 | export const pinia = createPinia() 8 | 9 | // 延迟设置响应拦截器的函数 10 | export function setupStoreInterceptors() { 11 | setupResponseInterceptors(async () => { 12 | const authStore = useAuthStore() 13 | const userStore = useUserStore() 14 | 15 | // 先清除用户信息,再执行登出 16 | userStore.clearUserInfo() 17 | authStore.logout() 18 | }) 19 | } 20 | 21 | // 导出模块 22 | export { useAuthStore } from './modules/auth' 23 | export { useUserStore } from './modules/user' 24 | export { useTaskWebSocketStore as useTaskWebSocketStore } from './modules/taskWebsocket' 25 | 26 | // 创建一个统一的初始化函数 27 | export async function initializeStores() { 28 | // 先设置响应拦截器 29 | setupStoreInterceptors() 30 | 31 | // 然后初始化用户store 32 | const userStore = useUserStore() 33 | await userStore.init() 34 | } 35 | 36 | export default pinia 37 | 38 | -------------------------------------------------------------------------------- /singleton/oss/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.cn 8 | singleton 9 | 1.0-SNAPSHOT 10 | 11 | 12 | com.cn.oss 13 | oss 14 | 15 | 16 | 21 17 | 21 18 | UTF-8 19 | 20 | 21 | 22 | 23 | com.cn 24 | common 25 | 1.0-SNAPSHOT 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /singleton/system/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.cn 8 | singleton 9 | 1.0-SNAPSHOT 10 | 11 | 12 | com.cn.system 13 | system 14 | 15 | 16 | 21 17 | 21 18 | UTF-8 19 | 20 | 21 | 22 | 23 | com.cn 24 | common 25 | 1.0-SNAPSHOT 26 | 27 | 28 | -------------------------------------------------------------------------------- /singleton/notice/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.cn 8 | singleton 9 | 1.0-SNAPSHOT 10 | 11 | 12 | com.cn.notice 13 | notice 14 | 15 | 16 | 22 17 | 22 18 | UTF-8 19 | 20 | 21 | 22 | 23 | com.cn 24 | common 25 | 1.0-SNAPSHOT 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/annotations/RateLimit.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.annotations; 2 | 3 | import java.lang.annotation.*; 4 | 5 | /** 6 | * 接口限流注解 7 | * 8 | * @author 时间海 @github dulaiduwang003 9 | * @version 1.0 10 | */ 11 | @Target(ElementType.METHOD) 12 | @Retention(RetentionPolicy.RUNTIME) 13 | @Documented 14 | public @interface RateLimit { 15 | 16 | /** 17 | * 每秒允许的请求数 18 | */ 19 | double permitsPerSecond() default 10.0; 20 | 21 | /** 22 | * 限流维度 23 | * IP: 按IP地址限流 24 | * USER: 按用户ID限流 25 | * GLOBAL: 全局限流 26 | */ 27 | LimitType limitType() default LimitType.IP; 28 | 29 | /** 30 | * 限流提示信息 31 | */ 32 | String message() default "请求过于频繁,请稍后再试"; 33 | 34 | /** 35 | * 限流维度枚举 36 | */ 37 | enum LimitType { 38 | /** 39 | * 按IP限流 40 | */ 41 | IP, 42 | 43 | /** 44 | * 按用户ID限流 45 | */ 46 | USER, 47 | 48 | /** 49 | * 全局限流(按接口方法) 50 | */ 51 | GLOBAL 52 | } 53 | } -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/controller/SystemOverviewController.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.controller; 2 | 3 | import com.cn.common.msg.Result; 4 | import com.cn.system.service.SystemOverviewService; 5 | import lombok.RequiredArgsConstructor; 6 | import org.springframework.http.MediaType; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | /** 12 | * 系统概况统计接口 13 | * 14 | * @author 时间海 @github dulaiduwang003 15 | * @email 2074055628@qq.com 16 | * @version 1.0 17 | */ 18 | @RestController 19 | @RequestMapping("/system/overview") 20 | @RequiredArgsConstructor 21 | public class SystemOverviewController { 22 | 23 | private final SystemOverviewService systemOverviewService; 24 | 25 | /** 26 | * 获取系统概况统计数据 27 | */ 28 | @GetMapping(value = "/get", produces = MediaType.APPLICATION_JSON_VALUE) 29 | public Result getSystemOverview() { 30 | return Result.data(systemOverviewService.getSystemOverview()); 31 | } 32 | } 33 | 34 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/vo/WorkflowInterfaceVo.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.vo; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | 6 | import java.io.Serializable; 7 | import java.util.List; 8 | 9 | /** 10 | * 工作流接口VO 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Data 17 | @Accessors(chain = true) 18 | public class WorkflowInterfaceVo implements Serializable { 19 | 20 | private Long workflowId; 21 | 22 | private String name; 23 | 24 | private List formContainer; 25 | 26 | private Long creditsDeducted; 27 | 28 | 29 | @Data 30 | @Accessors(chain = true) 31 | public static class WorkflowsFormContainer { 32 | 33 | private String inputs; 34 | 35 | private String nodeKey; 36 | 37 | private String tips; 38 | 39 | private String type; 40 | 41 | private boolean required; 42 | 43 | private String options; 44 | 45 | private String template; 46 | 47 | private Long size; 48 | 49 | 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /vue/src/views/works/components/EmptyState.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | 25 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/utils/ComfyuiUtils.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.utils; 2 | 3 | import com.alibaba.fastjson2.JSONObject; 4 | import lombok.RequiredArgsConstructor; 5 | import org.springframework.stereotype.Component; 6 | 7 | import static com.alibaba.fastjson2.JSON.parseObject; 8 | 9 | /** 10 | * ComfyUI工具类 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | @Component 17 | @RequiredArgsConstructor 18 | public class ComfyuiUtils { 19 | 20 | 21 | 22 | public static String getFileExtensionFromUrl(String fileName) { 23 | if (fileName == null) { 24 | return ""; 25 | } 26 | int lastIndexOfDot = fileName.lastIndexOf('.'); 27 | if (lastIndexOfDot == -1 || lastIndexOfDot == fileName.length() - 1) { 28 | return ""; 29 | } 30 | return fileName.substring(lastIndexOfDot + 1).toLowerCase(); 31 | } 32 | 33 | public static String getBodyError(final String errorBody) { 34 | final JSONObject error = parseObject(errorBody).getJSONObject("error"); 35 | return error.getString("message"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /singleton/.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/RedemptionCode.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import lombok.Data; 5 | import lombok.experimental.Accessors; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | @Data 10 | @Accessors(chain = true) 11 | @TableName(value = "redemption_codes") 12 | public class RedemptionCode { 13 | 14 | @TableId(type = IdType.AUTO) 15 | private Long id; 16 | 17 | /** 18 | * 兑换码 19 | */ 20 | private String code; 21 | 22 | /** 23 | * 积分数量 24 | */ 25 | private Long creditsAmount; 26 | 27 | /** 28 | * 状态:1-有效 0-已使用 -1-已禁用 29 | */ 30 | private Integer status; 31 | 32 | /** 33 | * 使用者用户ID 34 | */ 35 | private Long usedByUserId; 36 | 37 | /** 38 | * 使用时间 39 | */ 40 | private LocalDateTime usedTime; 41 | 42 | /** 43 | * 过期时间 44 | */ 45 | private LocalDateTime expireTime; 46 | 47 | /** 48 | * 描述 49 | */ 50 | private String description; 51 | 52 | /** 53 | * 创建时间 54 | */ 55 | @TableField(fill = FieldFill.INSERT) 56 | private LocalDateTime createTime; 57 | } -------------------------------------------------------------------------------- /vue/src/assets/svg/points.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /singleton/application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | active: @spring.profiles.active@ 4 | codec: 5 | max-in-memory-size: 10485760 6 | jackson: 7 | date-format: yyyy/MM/dd HH:mm:ss 8 | time-zone: GMT+8 9 | servlet: 10 | multipart: 11 | file-size-threshold: 1024MB 12 | max-request-size: 10MB 13 | max-file-size: 10MB 14 | datasource: 15 | driver-class-name: com.mysql.cj.jdbc.Driver 16 | type: com.alibaba.druid.pool.DruidDataSource 17 | data: 18 | redis: 19 | timeout: 10s 20 | lettuce: 21 | pool: 22 | max-active: 200 23 | max-wait: -1ms 24 | max-idle: 10 25 | min-idle: 0 26 | sa-token: 27 | token-prefix: Bearer 28 | token-name: Authorization 29 | active-timeout: -1 30 | is-concurrent: true 31 | is-share: true 32 | is-log: false 33 | token-style: tik 34 | mybatis-plus: 35 | typeAliasesPackage: com.cn.common.entity 36 | configuration: 37 | map-underscore-to-camel-case: true 38 | cache-enabled: false 39 | jdbc-type-for-null: 'null' 40 | # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl 41 | server: 42 | servlet: 43 | context-path: /api 44 | 45 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/websocket/config/WebSocketConfig.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.websocket.config; 2 | 3 | import com.cn.comfyui.websocket.handler.TaskProgressWebSocketHandler; 4 | import lombok.RequiredArgsConstructor; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.web.socket.config.annotation.EnableWebSocket; 7 | import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 8 | import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 9 | 10 | /** 11 | * WebSocket配置类 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | @Configuration 18 | @EnableWebSocket 19 | @RequiredArgsConstructor 20 | public class WebSocketConfig implements WebSocketConfigurer { 21 | 22 | private final TaskProgressWebSocketHandler taskProgressWebSocketHandler; 23 | 24 | @Override 25 | public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 26 | // 注册任务进度WebSocket处理器 27 | registry.addHandler(taskProgressWebSocketHandler, "/ws/task-progress") 28 | 29 | .setAllowedOrigins("*"); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /vue/src/enums/workflow.ts: -------------------------------------------------------------------------------- 1 | // ComfyUI 表单类型枚举 2 | export enum WorkflowFormTypeEnum { 3 | IMAGE_UPLOAD = "IMAGE_UPLOAD", //上传图片控件 4 | IMAGE_SCRIBBLE = "IMAGE_SCRIBBLE", //图片涂抹控件 5 | IMAGE_CONFIGURABLE = "IMAGE_CONFIGURABLE", //图片类(需选择具体控件) 6 | AUDIO_UPLOAD = "AUDIO_UPLOAD", //上传音频控件 7 | VIDEO_UPLOAD = "VIDEO_UPLOAD", //上传视频控件 8 | RADIO_SELECTOR = "RADIO_SELECTOR", //单选下拉框 9 | CHECKBOX_SELECTOR = "CHECKBOX_SELECTOR",//多选控件 值使用,分割 10 | TEXT_PROMPT = "TEXT_PROMPT", //普通文本输入框 11 | TEXT_CONFIGURABLE="TEXT_CONFIGURABLE"//文本类(需选择具体控件) 12 | } 13 | 14 | // ComfyUI 任务状态枚举 15 | export enum WorkflowTaskStatusEnum { 16 | WAIT = "WAIT", //等待中 17 | BUILD = "BUILD",//构建中 18 | SUCCEED = "SUCCEED", //成功 19 | CANCELED = "CANCELED", //已取消 20 | FAILED = "FAILED" //失败 21 | } 22 | 23 | // ComfyUI 作品类型枚举 24 | export enum WorkflowResultModelTypeEnum { 25 | AUDIO = "AUDIO", 26 | VIDEO = "VIDEO", 27 | MODEL = "MODEL", 28 | IMAGE = "IMAGE" 29 | } 30 | 31 | export enum WorkflowResultModelDigitalEnum { 32 | TEXT = "text", 33 | MULTI_LINE_PROMPT = "multi_line_prompt", 34 | RESOLUTION = "resolution", 35 | IMAGE = "image", 36 | VIDEO = "video", 37 | AUDIO = "audio" 38 | } -------------------------------------------------------------------------------- /vue/src/components/auth/components/TermsAgreement.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 18 | 19 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/ComfyuiConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import java.util.List; 9 | import java.util.Map; 10 | 11 | /** 12 | * @author bdth github@dulaiduwang003 13 | * @version 1.0 14 | */ 15 | @Configuration 16 | @ConfigurationProperties(prefix = "comfyui") 17 | @Data 18 | @Accessors(chain = true) 19 | public class ComfyuiConfiguration { 20 | 21 | private List server; 22 | 23 | private Long submitTaskMax; 24 | 25 | private Task task; 26 | 27 | private Map supportedFileTypes; 28 | 29 | @Data 30 | @Accessors(chain = true) 31 | public static class Task { 32 | 33 | private Long maxRetryTime; 34 | 35 | private Long maxRetries; 36 | 37 | private Long timeoutCheckInterval; 38 | } 39 | 40 | @Data 41 | @Accessors(chain = true) 42 | public static class ServerConfig { 43 | private String name; 44 | private String url; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /vue/src/assets/svg/model-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/entity/WorkflowResult.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.entity; 2 | 3 | import com.alibaba.fastjson2.JSONObject; 4 | import com.baomidou.mybatisplus.annotation.*; 5 | import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; 6 | import lombok.Data; 7 | import lombok.experimental.Accessors; 8 | 9 | import java.time.LocalDateTime; 10 | 11 | @Data 12 | @Accessors(chain = true) 13 | @TableName(value = "workflow_result", autoResultMap = true) 14 | public class WorkflowResult { 15 | 16 | @TableId(type = IdType.AUTO) 17 | private Long id; 18 | 19 | private String taskId; 20 | 21 | private String type; 22 | 23 | private String url; 24 | 25 | private Long userId; 26 | 27 | private String workflowName; 28 | 29 | /** 30 | * 工作流ID 31 | */ 32 | private Long workflowId; 33 | 34 | /** 35 | * 生成时使用的表单参数(包含 tips、type、options 等元数据) 36 | * 存储格式为 JSON,对应 TaskInfoStructure.Form 结构 37 | */ 38 | @TableField(typeHandler = JacksonTypeHandler.class) 39 | private JSONObject formParams; 40 | 41 | @TableField(fill = FieldFill.INSERT) 42 | private LocalDateTime createTime; 43 | 44 | @TableField(fill = FieldFill.INSERT_UPDATE) 45 | private LocalDateTime updateTime; 46 | } 47 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/DateObjectHandler.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 4 | import org.apache.ibatis.reflection.MetaObject; 5 | import org.springframework.stereotype.Component; 6 | 7 | import java.time.LocalDateTime; 8 | 9 | /** 10 | * The type Date object handler. 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @version 1.0 14 | */ 15 | @Component 16 | public class DateObjectHandler implements MetaObjectHandler { 17 | /** 18 | * Insert fill. 19 | * 20 | * @param metaObject the meta object 21 | */ 22 | @Override 23 | public void insertFill(MetaObject metaObject) { 24 | this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); 25 | this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); 26 | } 27 | 28 | /** 29 | * Update fill. 30 | * 31 | * @param metaObject the meta object 32 | */ 33 | @Override 34 | public void updateFill(MetaObject metaObject) { 35 | this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); 36 | } 37 | 38 | 39 | } 40 | -------------------------------------------------------------------------------- /vue/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Cogin X", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc -b && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "@element-plus/icons-vue": "^2.3.1", 13 | "@google/model-viewer": "^4.1.0", 14 | "@yeger/vue-masonry-wall": "^5.1.1", 15 | "axios": "^1.9.0", 16 | "element-plus": "^2.9.11", 17 | "fabric": "^6.7.1", 18 | "highlight.js": "^11.11.1", 19 | "lottie-web": "^5.13.0", 20 | "markdown-it": "^14.1.0", 21 | "mitt": "^3.0.1", 22 | "pinia": "^3.0.3", 23 | "vue": "^3.5.13", 24 | "vue-i18n": "^9.14.5", 25 | "vue-router": "^4.5.0", 26 | "vue-waterfall-plugin-next": "^2.6.5", 27 | "vue-waterfall2": "^1.10.9" 28 | }, 29 | "devDependencies": { 30 | "@types/markdown-it": "^14.1.2", 31 | "@types/node": "^22.15.26", 32 | "@vitejs/plugin-vue": "^5.2.1", 33 | "@vue/tsconfig": "^0.7.0", 34 | "rollup-plugin-visualizer": "^6.0.4", 35 | "sass": "^1.89.0", 36 | "terser": "^5.44.0", 37 | "typescript": "~5.7.2", 38 | "vite": "^6.2.0", 39 | "vite-plugin-compression": "^0.5.1", 40 | "vue-tsc": "^2.2.4" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /vue/src/api/system-redemption/system-redemption.ts: -------------------------------------------------------------------------------- 1 | import type { SystemRedemptionApi } from './types' 2 | import { get, post } from '@/utils/requestUtil' 3 | 4 | export const systemRedemptionApi = { 5 | // 分页查询兑换码 6 | fetchCodes: (params: SystemRedemptionApi.FetchCodesParams) => { 7 | return get>( 8 | '/system/redemption-code/page', 9 | params 10 | ) 11 | }, 12 | 13 | // 创建兑换码 14 | createCode: (body: SystemRedemptionApi.CreateRedemptionCodeDto) => { 15 | return post('/system/redemption-code/create', body) 16 | }, 17 | 18 | // 删除兑换码 19 | deleteCode: (id: number) => { 20 | return post('/system/redemption-code/delete', { id } as SystemRedemptionApi.DeleteRedemptionCodeDto) 21 | }, 22 | 23 | // 修改兑换码积分 24 | updateCodeCredits: (id: number, creditsAmount: number) => { 25 | return post('/system/redemption-code/update-credits', { 26 | id, 27 | creditsAmount 28 | } as SystemRedemptionApi.UpdateRedemptionCodeCreditsDto) 29 | }, 30 | 31 | // 修改兑换码(除 code 外) 32 | updateCode: (body: SystemRedemptionApi.UpdateRedemptionCodeDto) => { 33 | return post('/system/redemption-code/update', body) 34 | } 35 | } 36 | 37 | 38 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/structure/TaskInfoStructure.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.structure; 2 | 3 | import com.cn.comfyui.model.TaskNodeContainer; 4 | import com.cn.comfyui.model.WorkflowResultModel; 5 | import lombok.Data; 6 | import lombok.experimental.Accessors; 7 | 8 | import java.io.Serializable; 9 | import java.time.LocalDateTime; 10 | import java.util.List; 11 | 12 | /** 13 | * 任务信息结构 14 | * 15 | * @author 时间海 @github dulaiduwang003 16 | * @email 2074055628@qq.com 17 | * @version 1.0 18 | */ 19 | @Data 20 | @Accessors(chain = true) 21 | public class TaskInfoStructure implements Serializable { 22 | 23 | private String taskId; 24 | 25 | private String workflowName; 26 | 27 | private WorkflowResultModel workflowResultModel; 28 | 29 | private String status; 30 | 31 | private Long progress; 32 | 33 | private Long location; 34 | 35 | private Form form; 36 | 37 | private LocalDateTime createTime; 38 | 39 | /** 40 | * 任务消耗的积分数量 41 | */ 42 | private Long creditsDeducted; 43 | 44 | @Data 45 | @Accessors(chain = true) 46 | public static class Form{ 47 | 48 | private Long workflowId; 49 | 50 | private List taskNodeContainer; 51 | 52 | } 53 | 54 | 55 | } 56 | -------------------------------------------------------------------------------- /vue/src/api/system-redemption/types.d.ts: -------------------------------------------------------------------------------- 1 | export namespace SystemRedemptionApi { 2 | export type Result = { code: number; msg: string; data: T } 3 | 4 | export type PageVo = { total: number; items: T[] } 5 | 6 | export type SystemRedemptionCodeVo = { 7 | id: number 8 | code: string 9 | creditsAmount: number 10 | status: 1 | 0 | -1 11 | usedByUserId: number | null 12 | usedTime: string | null 13 | expireTime: string | null 14 | description: string | null 15 | createTime: string 16 | } 17 | 18 | export type CreateRedemptionCodeDto = { 19 | creditsAmount: number 20 | prefix?: string 21 | length?: number // >= 4 22 | expireTime?: string // ISO 8601 23 | description?: string 24 | } 25 | 26 | export type UpdateRedemptionCodeCreditsDto = { id: number; creditsAmount: number } 27 | export type DeleteRedemptionCodeDto = { id: number } 28 | export type UpdateRedemptionCodeDto = { 29 | id: number 30 | creditsAmount?: number // >= 0(已使用不允许改) 31 | status?: 1 | 0 | -1 32 | expireTime?: string 33 | description?: string 34 | } 35 | 36 | export type FetchCodesParams = { 37 | page?: number 38 | size?: number 39 | keyword?: string 40 | status?: 1 | 0 | -1 41 | } 42 | } 43 | 44 | 45 | -------------------------------------------------------------------------------- /vue/src/api/system-user/types.d.ts: -------------------------------------------------------------------------------- 1 | import type { Role } from "@/enums/user" 2 | 3 | // 获取用户分页列表接口 4 | export namespace GetUserPageApi { 5 | export interface Params { 6 | page?: number 7 | size?: number 8 | keyword?: string 9 | role?: Role 10 | } 11 | 12 | export interface Result { 13 | total: number 14 | items: SystemUser[] 15 | } 16 | 17 | export interface SystemUser { 18 | id: number 19 | email: string 20 | nickname: string 21 | avatar: string 22 | role: Role 23 | createTime: string 24 | updateTime: string 25 | } 26 | } 27 | 28 | // 创建用户接口 29 | export namespace CreateUserApi { 30 | export interface Params { 31 | email: string 32 | password: string 33 | nickname?: string 34 | avatar?: string 35 | role?: Role 36 | } 37 | 38 | 39 | } 40 | 41 | // 更新用户接口 42 | export namespace UpdateUserApi { 43 | export interface Params { 44 | id: number 45 | email?: string 46 | nickname?: string 47 | avatar?: string 48 | role?: Role 49 | } 50 | } 51 | 52 | // 删除用户接口 53 | export namespace DeleteUserApi { 54 | export interface Params { 55 | id: number 56 | } 57 | } -------------------------------------------------------------------------------- /vue/src/assets/svg/language.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /singleton/comfyui/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.cn 8 | singleton 9 | 1.0-SNAPSHOT 10 | 11 | 12 | com.cn.comfyui 13 | comfyui 14 | 15 | 16 | 21 17 | 21 18 | UTF-8 19 | 20 | 21 | 22 | 23 | com.cn 24 | common 25 | 1.0-SNAPSHOT 26 | 27 | 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-websocket 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /vue/src/layouts/components/SidebarLogo.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 31 | 32 | -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/service/WorkflowService.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.service; 2 | 3 | import com.cn.comfyui.dto.CancelTaskDto; 4 | import com.cn.comfyui.dto.RemakeTaskDto; 5 | import com.cn.comfyui.dto.SubmitTaskDto; 6 | import com.cn.comfyui.vo.TaskProgressVo; 7 | import com.cn.comfyui.vo.WorkflowCategoryVo; 8 | import com.cn.comfyui.vo.WorkflowInterfaceVo; 9 | import com.cn.comfyui.vo.WorkflowsVo; 10 | import com.cn.common.vo.PageVo; 11 | 12 | import java.util.List; 13 | 14 | /** 15 | * 工作流服务接口 16 | * 17 | * @author 时间海 @github dulaiduwang003 18 | * @email 2074055628@qq.com 19 | * @version 1.0 20 | */ 21 | public interface WorkflowService { 22 | 23 | String submitTask(final SubmitTaskDto dto); 24 | 25 | TaskProgressVo getTaskProgress(final String taskId); 26 | 27 | List getTaskProgressList(); 28 | 29 | PageVo getTaskProgressPage(final Long page, final String status); 30 | 31 | WorkflowInterfaceVo getWorkflowInterface(final Long workflowId); 32 | 33 | PageVo getWorkflowsPage(final String prompt, final Long categoryId, final Long page); 34 | 35 | void cancelTask(final CancelTaskDto dto); 36 | 37 | String remakeTask(final RemakeTaskDto dto); 38 | 39 | List getWorkflowCategoryList(); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /vue/src/api/workflow-result/types.d.ts: -------------------------------------------------------------------------------- 1 | import { WorkflowResultModelTypeEnum } from "@/enums/workflow" 2 | 3 | 4 | // 基础分页结构 5 | export interface BasePage { 6 | total: number 7 | items: T[] 8 | } 9 | 10 | 11 | 12 | // 作品信息 13 | export interface WorkflowResultModelsVo { 14 | workflowResultId: number // 作品ID 15 | type: string // 作品类型 16 | url: string // 作品URL 17 | workflowName: string // 工作流名称 18 | taskId: string // 任务ID 19 | createTime: string // 创建时间 20 | } 21 | 22 | 23 | 24 | // 获取作品分页列表 API 25 | export namespace GetWorkflowResultPageApi { 26 | export interface Params { 27 | page?: number // 页码,默认为1 28 | } 29 | 30 | export type Result = BasePage 31 | } 32 | 33 | // 获取作品详情 API 34 | export namespace GetWorkflowDetailDetailApi { 35 | export interface Params { 36 | workflowResultId: number // 作品ID 37 | } 38 | 39 | export type Result = WorkflowResultModelsVo 40 | } 41 | 42 | // 删除作品 API 43 | export namespace DeleteWorkflowResultApi { 44 | export interface Params { 45 | workflowResultId: number // 作品ID 46 | } 47 | 48 | export type Result = void 49 | } 50 | 51 | // 批量删除作品 API 52 | export namespace BatchDeleteWorkflowResultApi { 53 | export interface Params { 54 | workflowResultIds: number[] // 作品ID列表 55 | } 56 | 57 | export type Result = void 58 | } -------------------------------------------------------------------------------- /vue/src/composables/useAuthGuard.ts: -------------------------------------------------------------------------------- 1 | import { computed } from 'vue' 2 | import { useAuthStore } from '@/stores' 3 | import { withAuth, checkAuth, ensureAuth } from '@/utils/authGuard' 4 | 5 | /** 6 | * 认证守卫 7 | */ 8 | export function useAuthGuard() { 9 | const authStore = useAuthStore() 10 | 11 | // 响应式的登录状态 12 | const isLoggedIn = computed(() => authStore.isLoggedIn) 13 | 14 | /** 15 | * 包装需要认证的方法 16 | * @param callback 需要执行的回调函数 17 | * @param message 未登录提示信息 18 | */ 19 | const withAuthGuard = (callback: () => void | Promise, message?: string) => { 20 | return () => withAuth(callback, message) 21 | } 22 | 23 | /** 24 | * 直接检查并执行 25 | * @param callback 需要执行的回调函数 26 | * @param message 未登录提示信息 27 | */ 28 | const executeWithAuth = (callback: () => void | Promise, message?: string) => { 29 | withAuth(callback, message) 30 | } 31 | 32 | /** 33 | * 异步确保用户已登录 34 | * 如果未登录会弹窗,登录成功后 resolve 35 | */ 36 | const ensureAuthenticated = () => { 37 | return ensureAuth() 38 | } 39 | 40 | /** 41 | * 同步检查登录状态 42 | */ 43 | const checkAuthentication = () => { 44 | return checkAuth() 45 | } 46 | 47 | return { 48 | isLoggedIn, 49 | withAuthGuard, 50 | executeWithAuth, 51 | ensureAuthenticated, 52 | checkAuthentication 53 | } 54 | } -------------------------------------------------------------------------------- /vue/src/views/system/views/OverviewView.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 40 | 41 | 46 | 47 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/utils/RedemptionCodeGenerator.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.utils; 2 | 3 | import java.security.SecureRandom; 4 | import java.util.Random; 5 | 6 | /** 7 | * 兑换码生成工具类 8 | * 9 | * @author CogniX 10 | */ 11 | public class RedemptionCodeGenerator { 12 | 13 | private static final String CHARSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 14 | private static final Random RANDOM = new SecureRandom(); 15 | 16 | /** 17 | * 生成指定长度的兑换码 18 | * 19 | * @param length 兑换码长度 20 | * @return 兑换码 21 | */ 22 | public static String generateCode(int length) { 23 | StringBuilder code = new StringBuilder(length); 24 | for (int i = 0; i < length; i++) { 25 | code.append(CHARSET.charAt(RANDOM.nextInt(CHARSET.length()))); 26 | } 27 | return code.toString(); 28 | } 29 | 30 | /** 31 | * 生成默认8位长度的兑换码 32 | * 33 | * @return 兑换码 34 | */ 35 | public static String generateCode() { 36 | return generateCode(8); 37 | } 38 | 39 | /** 40 | * 生成带前缀的兑换码 41 | * 42 | * @param prefix 前缀 43 | * @param length 后缀长度 44 | * @return 兑换码 45 | */ 46 | public static String generateCodeWithPrefix(String prefix, int length) { 47 | return prefix + generateCode(length); 48 | } 49 | } -------------------------------------------------------------------------------- /singleton/comfyui/src/main/java/com/cn/comfyui/websocket/config/WebSocketShutdownListener.java: -------------------------------------------------------------------------------- 1 | package com.cn.comfyui.websocket.config; 2 | 3 | import com.cn.comfyui.websocket.handler.TaskProgressWebSocketHandler; 4 | import lombok.RequiredArgsConstructor; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.context.ApplicationListener; 7 | import org.springframework.context.event.ContextClosedEvent; 8 | import org.springframework.stereotype.Component; 9 | 10 | /** 11 | * WebSocket关闭监听器 12 | * 在应用关闭时主动清理所有WebSocket连接,避免Tomcat关闭时的异常 13 | * 14 | * @author 时间海 @github dulaiduwang003 15 | * @email 2074055628@qq.com 16 | * @version 1.0 17 | */ 18 | @Slf4j 19 | @Component 20 | @RequiredArgsConstructor 21 | public class WebSocketShutdownListener implements ApplicationListener { 22 | 23 | private final TaskProgressWebSocketHandler taskProgressWebSocketHandler; 24 | 25 | @Override 26 | public void onApplicationEvent(ContextClosedEvent event) { 27 | log.info("应用正在关闭,开始清理WebSocket连接..."); 28 | try { 29 | // 主动关闭所有WebSocket连接 30 | taskProgressWebSocketHandler.closeAllConnections(); 31 | log.info("WebSocket连接清理完成"); 32 | } catch (Exception e) { 33 | log.warn("WebSocket连接清理过程中发生异常: {}", e.getMessage()); 34 | } 35 | } 36 | } -------------------------------------------------------------------------------- /vue/src/i18n/languages.config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 语言配置文件 3 | * 添加新语言只需要在这里添加配置即可 4 | */ 5 | 6 | export interface LanguageConfig { 7 | code: string // 语言代码,如 'zh-CN' 8 | name: string // 语言名称,如 '中文' 9 | flag?: string // 国旗 emoji(可选) 10 | } 11 | 12 | /** 13 | * 支持的语言列表 14 | */ 15 | export const supportedLanguages: LanguageConfig[] = [ 16 | { 17 | code: 'zh-CN', 18 | name: '中文', 19 | flag: '🇨🇳' 20 | }, 21 | { 22 | code: 'en-US', 23 | name: 'English', 24 | flag: '🇺🇸' 25 | } 26 | 27 | ] 28 | 29 | /** 30 | * 默认语言 31 | */ 32 | export const defaultLanguage = 'zh-CN' 33 | 34 | /** 35 | * 获取语言配置 36 | */ 37 | export const getLanguageConfig = (code: string): LanguageConfig | undefined => { 38 | return supportedLanguages.find(lang => lang.code === code) 39 | } 40 | 41 | /** 42 | * 获取语言显示名称 43 | */ 44 | export const getLanguageName = (code: string): string => { 45 | const config = getLanguageConfig(code) 46 | return config ? config.name : code 47 | } 48 | 49 | /** 50 | * 检查语言是否支持 51 | */ 52 | export const isSupportedLanguage = (code: string): boolean => { 53 | return supportedLanguages.some(lang => lang.code === code) 54 | } 55 | 56 | /** 57 | * 获取所有语言代码 58 | */ 59 | export const getAllLanguageCodes = (): string[] => { 60 | return supportedLanguages.map(lang => lang.code) 61 | } 62 | 63 | -------------------------------------------------------------------------------- /vue/src/api/user/types.d.ts: -------------------------------------------------------------------------------- 1 | import { TransactionType, Role } from '@/enums/user' 2 | 3 | export namespace GetUserInfoApi { 4 | export interface Result { 5 | nickname: string 6 | avatar: string 7 | role: Role 8 | } 9 | 10 | 11 | 12 | } 13 | 14 | // 更新用户头像接口 15 | export namespace UpdateAvatarApi { 16 | export interface Params { 17 | avatar: string 18 | } 19 | } 20 | 21 | // 更新用户昵称接口 22 | export namespace UpdateNicknameApi { 23 | export interface Params { 24 | nickname: string 25 | } 26 | } 27 | 28 | // 获取用户积分信息接口 29 | export namespace GetUserCreditsApi { 30 | export interface Result { 31 | totalCredits: number 32 | availableCredits: number 33 | frozenCredits: number 34 | } 35 | } 36 | 37 | // 获取积分交易记录接口 38 | export namespace GetCreditTransactionsApi { 39 | export interface Params { 40 | page?: number 41 | size?: number 42 | transactionType?: TransactionType 43 | } 44 | 45 | export interface Result { 46 | total: number 47 | items: CreditTransaction[] 48 | } 49 | 50 | export interface CreditTransaction { 51 | id: number 52 | transactionType: TransactionType 53 | amount: number 54 | description: string 55 | createTime: string 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/ComfyuiFormTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | import lombok.NoArgsConstructor; 6 | import lombok.ToString; 7 | 8 | /** 9 | * 10 | * @author 明明不是下雨天 github@dulaiduwang003 2024/9/26 16:03 11 | */ 12 | 13 | @Getter 14 | @ToString 15 | @NoArgsConstructor 16 | @AllArgsConstructor 17 | public enum ComfyuiFormTypeEnum { 18 | 19 | /** 20 | * 文本可配置类型(解析阶段使用,需要管理员选择具体类型) 21 | */ 22 | TEXT_CONFIGURABLE("TEXT_CONFIGURABLE"), 23 | 24 | /** 25 | * 纯文本输入框 26 | */ 27 | TEXT_PROMPT("TEXT_PROMPT"), 28 | 29 | /** 30 | * 单选下拉框 31 | */ 32 | RADIO_SELECTOR("RADIO_SELECTOR"), 33 | 34 | /** 35 | * 多选框 36 | */ 37 | CHECKBOX_SELECTOR("CHECKBOX_SELECTOR"), 38 | 39 | /** 40 | * 图片可配置类型(解析阶段使用,需要管理员选择具体类型) 41 | */ 42 | IMAGE_CONFIGURABLE("IMAGE_CONFIGURABLE"), 43 | 44 | /** 45 | * 图片上传 46 | */ 47 | IMAGE_UPLOAD("IMAGE_UPLOAD"), 48 | 49 | /** 50 | * 图片涂抹组件(用户上传图片后可以涂抹) 51 | */ 52 | IMAGE_SCRIBBLE("IMAGE_SCRIBBLE"), 53 | 54 | /** 55 | * 视频上传 56 | */ 57 | VIDEO_UPLOAD("VIDEO_UPLOAD"), 58 | 59 | /** 60 | * 音频上传 61 | */ 62 | AUDIO_UPLOAD("AUDIO_UPLOAD"); 63 | 64 | 65 | String dec; 66 | 67 | } 68 | -------------------------------------------------------------------------------- /vue/src/layouts/components/SidebarFooter.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | 24 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.service; 2 | 3 | import com.cn.auth.dto.UpdateAvatarDto; 4 | import com.cn.auth.dto.UpdateNicknameDto; 5 | 6 | import com.cn.auth.vo.UserVo; 7 | import com.cn.auth.vo.UserCreditsVo; 8 | import com.cn.auth.vo.CreditTransactionVo; 9 | 10 | import com.cn.common.vo.PageVo; 11 | 12 | /** 13 | * 用户服务接口 14 | * 15 | * @author 时间海 @github dulaiduwang003 16 | * @email 2074055628@qq.com 17 | * @version 1.0 18 | */ 19 | public interface UserService { 20 | 21 | /** 22 | * 获取当前登录用户信息 23 | * 24 | * @return 用户信息视图对象 25 | */ 26 | UserVo getUserInfo(); 27 | 28 | /** 29 | * 更新用户头像 30 | * 31 | * @param dto 包含新头像URL的DTO 32 | */ 33 | void updateAvatar(UpdateAvatarDto dto); 34 | 35 | /** 36 | * 更新用户昵称 37 | * 38 | * @param dto 包含新昵称的DTO 39 | */ 40 | void updateNickname(UpdateNicknameDto dto); 41 | 42 | /** 43 | * 获取当前用户积分信息 44 | * 45 | * @return 用户积分信息 46 | */ 47 | UserCreditsVo getUserCredits(); 48 | 49 | /** 50 | * 获取当前用户积分交易记录 51 | * 52 | * @param page 页码 53 | * @param size 每页大小 54 | * @param transactionType 交易类型筛选,可选参数 55 | * @return 积分交易记录分页数据 56 | */ 57 | PageVo getCreditTransactions(Integer page, Integer size, String transactionType); 58 | 59 | 60 | } 61 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/constant/CacheExpireConstant.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.constant; 2 | 3 | /** 4 | * 缓存过期时间常量 5 | * 统一管理 Redis 缓存的过期时间,单位:秒 6 | * 7 | * @author Conni-X-Pro 8 | */ 9 | public interface CacheExpireConstant { 10 | 11 | /** 12 | * 30秒 13 | */ 14 | int EXPIRE_30_SECONDS = 30; 15 | 16 | /** 17 | * 1分钟 18 | */ 19 | int EXPIRE_1_MINUTE = 60; 20 | 21 | /** 22 | * 5分钟 23 | */ 24 | int EXPIRE_5_MINUTES = 5 * 60; 25 | 26 | /** 27 | * 10分钟 28 | */ 29 | int EXPIRE_10_MINUTES = 10 * 60; 30 | 31 | /** 32 | * 30分钟 33 | */ 34 | int EXPIRE_30_MINUTES = 30 * 60; 35 | 36 | /** 37 | * 1小时 38 | */ 39 | int EXPIRE_1_HOUR = 60 * 60; 40 | 41 | /** 42 | * 6小时 43 | */ 44 | int EXPIRE_6_HOURS = 6 * 60 * 60; 45 | 46 | /** 47 | * 12小时 48 | */ 49 | int EXPIRE_12_HOURS = 12 * 60 * 60; 50 | 51 | /** 52 | * 24小时 53 | */ 54 | int EXPIRE_24_HOURS = 24 * 60 * 60; 55 | 56 | /** 57 | * 48小时 58 | */ 59 | int EXPIRE_48_HOURS = 48 * 60 * 60; 60 | 61 | /** 62 | * 7天 63 | */ 64 | int EXPIRE_7_DAYS = 7 * 24 * 60 * 60; 65 | 66 | /** 67 | * 10天 68 | */ 69 | int EXPIRE_10_DAYS = 10 * 24 * 60 * 60; 70 | 71 | /** 72 | * 30天 73 | */ 74 | int EXPIRE_30_DAYS = 30 * 24 * 60 * 60; 75 | } 76 | 77 | -------------------------------------------------------------------------------- /vue/src/api/workflow-result/workflow-result.ts: -------------------------------------------------------------------------------- 1 | import type { GetWorkflowResultPageApi, GetWorkflowDetailDetailApi, DeleteWorkflowResultApi, BatchDeleteWorkflowResultApi } from './types' 2 | import { get, post } from '@/utils/requestUtil' 3 | 4 | export const WorkflowResultModelApi = { 5 | /** 6 | * 获取作品分页列表 7 | * @param params 请求参数 8 | * @returns 作品分页列表 9 | */ 10 | reqGetWorkflowResultPage: (params: GetWorkflowResultPageApi.Params = { page: 1 }) => { 11 | return get('/comfyui/result/get/workflow-result/page', params) 12 | }, 13 | 14 | /** 15 | * 获取作品详情 16 | * @param params 请求参数 17 | * @returns 作品详情 18 | */ 19 | reqGWorkflowResultDetail: (params: GetWorkflowDetailDetailApi.Params) => { 20 | return get('/comfyui/result/get/workflow-result/detail', params) 21 | }, 22 | 23 | /** 24 | * 删除作品 25 | * @param params 请求参数 26 | * @returns 删除结果 27 | */ 28 | reqDeleteWorkflowResult: (params: DeleteWorkflowResultApi.Params) => { 29 | return post('/comfyui/result/delete/workflow-result', params) 30 | }, 31 | 32 | /** 33 | * 批量删除作品 34 | * @param params 请求参数 35 | * @returns 删除结果 36 | */ 37 | reqBatchDeleteWorkflowResult: (params: BatchDeleteWorkflowResultApi.Params) => { 38 | return post('/comfyui/result/batch-delete/workflow-result', params) 39 | } 40 | } -------------------------------------------------------------------------------- /vue/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import { createPinia } from 'pinia' 3 | import ElementPlus from 'element-plus' 4 | import 'element-plus/dist/index.css' 5 | import i18n from './i18n' 6 | 7 | import './style.css' 8 | import './styles/page-transitions.css' 9 | import './assets/highlight.css' 10 | import App from './App.vue' 11 | import router from './router' 12 | import { initializeStores } from './stores' 13 | import { authDirective, authShowDirective } from './directives/authDirective' 14 | 15 | // 隐藏初始加载屏幕的函数 16 | function hideInitialLoading() { 17 | const loadingElement = document.getElementById('initial-loading') 18 | if (loadingElement) { 19 | loadingElement.classList.add('fade-out') 20 | // 动画完成后移除元素 21 | setTimeout(() => { 22 | loadingElement.remove() 23 | document.body.style.overflow = 'auto' 24 | }, 500) 25 | } 26 | } 27 | 28 | const app = createApp(App) 29 | const pinia = createPinia() 30 | 31 | app.use(pinia) 32 | app.use(i18n) 33 | app.use(ElementPlus) 34 | app.use(router) 35 | 36 | // 注册认证指令 37 | app.directive('auth', authDirective) 38 | app.directive('auth-show', authShowDirective) 39 | 40 | // 初始化stores 41 | initializeStores().then(() => { 42 | app.mount('#app') 43 | 44 | // 等待渲染完成后隐藏加载屏幕 45 | setTimeout(() => { 46 | setTimeout(hideInitialLoading, 300) 47 | }, 100) 48 | }).catch((error) => { 49 | console.error('应用初始化失败:', error) 50 | // 即使初始化失败也要隐藏加载屏幕 51 | hideInitialLoading() 52 | }) 53 | -------------------------------------------------------------------------------- /singleton/.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 32 | 33 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/LocalDateTimeConfig.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; 4 | import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import java.time.LocalDateTime; 9 | import java.time.format.DateTimeFormatter; 10 | 11 | /** 12 | * @author 时间海 @github dulaiduwang003 13 | * @version 1.0 14 | */ 15 | @Configuration 16 | public class LocalDateTimeConfig { 17 | 18 | 19 | /** 20 | * 本地日期时间反序列化 21 | * Local date time deserializer local date time serializer. 22 | * 23 | * @return the local date time serializer 24 | */ 25 | @Bean 26 | public LocalDateTimeSerializer localDateTimeDeserializer() { 27 | return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); 28 | } 29 | 30 | /** 31 | * jackson 2对象映射器 32 | * Jackson 2 object mapper builder customizer jackson 2 object mapper builder customizer. 33 | * 34 | * @return the jackson 2 object mapper builder customizer 35 | */ 36 | @Bean 37 | public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { 38 | return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /vue/src/api/system-overview/types.d.ts: -------------------------------------------------------------------------------- 1 | export namespace SystemOverviewApi { 2 | 3 | export interface ActiveModel { 4 | modelName: string; 5 | callCount: number; 6 | } 7 | 8 | export interface UserStats { 9 | totalUsers: number; 10 | onlineUsers: number; 11 | todayNewUsers: number; 12 | } 13 | 14 | export interface AIStats { 15 | todayApiCalls: number; 16 | todayTokensUsed: number; 17 | todayConversations: number; 18 | activeModels: ActiveModel[]; 19 | } 20 | 21 | export interface WorkflowStats { 22 | totalWorkflows: number; 23 | todayTasks: number; 24 | todaySuccessTasks: number; 25 | todayFailedTasks: number; 26 | todayCancelledTasks: number; 27 | } 28 | 29 | export interface SystemResources { 30 | cpuUsage: number; 31 | memoryUsage: number; 32 | memoryTotal: number; 33 | memoryUsed: number; 34 | memoryFree: number; 35 | } 36 | 37 | export interface TaskStats { 38 | queuedTasks: number; 39 | buildingTasks: number; 40 | } 41 | 42 | 43 | 44 | 45 | export interface Result { 46 | userStats: UserStats; 47 | aiStats: AIStats; 48 | workflowStats: WorkflowStats; 49 | systemResources: SystemResources; 50 | taskStats: TaskStats; 51 | timestamp: string; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /vue/src/api/workflow-task/workflow-task.ts: -------------------------------------------------------------------------------- 1 | import type { GetWorkflowPageApi,CancelTaskApi, RemakeTaskApi, GetWorkflowCategoryListApi, GetWorkflowInterfaceApi, SubmitTaskApi, GetTaskProgressPageApi } from './types' 2 | import { get, post } from '@/utils/requestUtil' 3 | 4 | export const comfyuiTaskApi = { 5 | reqGetWorkflowResultModelflowsPage: (params: GetWorkflowPageApi.Params) => { 6 | return get('/comfyui/task/get/workflow/page',params) 7 | }, 8 | reqGetWorkflowResultModelflowFilterList: () => { 9 | return get('/comfyui/task/get/workflow-category/list') 10 | }, 11 | reqGetWorkflowResultModelflowsInterface: (params: GetWorkflowInterfaceApi.Params) => { 12 | return get('/comfyui/task/get/workflow/interface', params) 13 | }, 14 | reqSubmitComfyuiTask: (params: SubmitTaskApi.Params) => { 15 | return post('/comfyui/task/submit/task', params) 16 | }, 17 | reqGetComfyuiTaskProgressPage: (params: GetTaskProgressPageApi.Params) => { 18 | return get('/comfyui/task/get/task/progress-page', params) 19 | }, 20 | reqCancelComfyuiTask: (params: CancelTaskApi.Params) => { 21 | return post('/comfyui/task/cancel/task', params) 22 | }, 23 | reqRemakeComfyuiTask: (params: RemakeTaskApi.Params) => { 24 | return post('/comfyui/task/remake/task', params) 25 | }, 26 | getComfyuiTaskProgressWebsocketUrl: () => { 27 | return ('/ws/task-progress') 28 | } 29 | } -------------------------------------------------------------------------------- /vue/src/views/ai/chat/components/AiImageViewer.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 56 | 57 | 60 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/AliConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.configuration; 2 | 3 | import lombok.Data; 4 | import lombok.experimental.Accessors; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author bdth github@dulaiduwang003 12 | * @version 1.0 13 | */ 14 | @Configuration 15 | @ConfigurationProperties(prefix = "ali") 16 | @Data 17 | @Accessors(chain = true) 18 | public class AliConfiguration { 19 | 20 | private Certified certified; 21 | 22 | private Oss oss; 23 | 24 | private Sms sms; 25 | 26 | @Data 27 | @Accessors(chain = true) 28 | public static class Certified { 29 | 30 | private String accessKey; 31 | 32 | private String secretKey; 33 | 34 | } 35 | 36 | @Data 37 | @Accessors(chain = true) 38 | public static class Sms { 39 | 40 | private String templateCode; 41 | 42 | private String signName; 43 | 44 | } 45 | 46 | @Data 47 | @Accessors(chain = true) 48 | public static class Oss { 49 | 50 | private String endpoint; 51 | 52 | private String bucketName; 53 | 54 | private String domain; 55 | 56 | private List supportedFileTypes; 57 | } 58 | 59 | @Data 60 | @Accessors(chain = true) 61 | public static class SupportedFileType { 62 | private String extension; 63 | private String mimeType; 64 | private Long maxSizeInBytes; 65 | } 66 | 67 | } 68 | -------------------------------------------------------------------------------- /singleton/application/src/main/java/com/cn/filter/AuthInterfaceFilter.java: -------------------------------------------------------------------------------- 1 | package com.cn.filter; 2 | 3 | import cn.dev33.satoken.stp.StpInterface; 4 | import cn.dev33.satoken.stp.StpUtil; 5 | import com.cn.common.constant.UserConstant; 6 | import com.cn.common.structure.UserInfoStructure; 7 | import lombok.RequiredArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.stereotype.Component; 10 | 11 | import java.util.Collections; 12 | import java.util.List; 13 | 14 | /** 15 | * 权限拦截处理类 16 | * 17 | * @author 时间海 @github dulaiduwang003 18 | * @email 2074055628@qq.com 19 | * @version 1.0 20 | */ 21 | @Component 22 | @RequiredArgsConstructor 23 | @Slf4j 24 | public class AuthInterfaceFilter implements StpInterface { 25 | 26 | 27 | /** 28 | * 获取当前用户拥有的权限 29 | * 30 | * @return the role list 31 | */ 32 | @Override 33 | public List getRoleList(Object loginId, String loginType) { 34 | try { 35 | UserInfoStructure structure = (UserInfoStructure) StpUtil.getSessionByLoginId(loginId).get(UserConstant.USER_INFO); 36 | return Collections.singletonList(structure.getRole()); 37 | } catch (Exception e) { 38 | log.error("获取用户权限类型失败 信息:{}", e.getMessage()); 39 | throw new RuntimeException(); 40 | } 41 | } 42 | 43 | /** 44 | * 获取当前用户拥有的权限 45 | * 46 | * @param o the o 47 | * @param s the s 48 | * @return the permission list 49 | */ 50 | @Override 51 | public List getPermissionList(Object o, String s) { 52 | return null; 53 | } 54 | 55 | 56 | } 57 | -------------------------------------------------------------------------------- /singleton/auth/src/main/java/com/cn/auth/controller/RedemptionCodeController.java: -------------------------------------------------------------------------------- 1 | package com.cn.auth.controller; 2 | 3 | import com.cn.auth.dto.RedeemCodeDto; 4 | import com.cn.auth.exceptions.RedemptionCodeException; 5 | import com.cn.auth.service.RedemptionCodeService; 6 | import com.cn.common.msg.Result; 7 | import com.cn.common.annotations.RateLimit; 8 | import lombok.RequiredArgsConstructor; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.http.MediaType; 11 | import org.springframework.validation.annotation.Validated; 12 | import org.springframework.web.bind.annotation.*; 13 | 14 | /** 15 | * 兑换码控制器 16 | * 17 | * @author 时间海 @github dulaiduwang003 18 | * @email 2074055628@qq.com 19 | * @version 1.0 20 | */ 21 | @RestController 22 | @RequestMapping("/redemption-code") 23 | @RequiredArgsConstructor 24 | @Slf4j 25 | public class RedemptionCodeController { 26 | 27 | private final RedemptionCodeService redemptionCodeService; 28 | 29 | /** 30 | * 兑换码兑换 31 | * 32 | * @param dto 兑换码请求DTO 33 | * @return 兑换结果 34 | */ 35 | @PostMapping(value = "/redeem", produces = MediaType.APPLICATION_JSON_VALUE) 36 | @RateLimit(permitsPerSecond = 0.167, limitType = RateLimit.LimitType.USER, message = "兑换过于频繁,请稍后再试") 37 | public Result redeemCode(@RequestBody @Validated RedeemCodeDto dto) { 38 | try { 39 | redemptionCodeService.redeemCode(dto); 40 | return Result.ok(); 41 | } catch (RedemptionCodeException e) { 42 | log.warn("兑换码兑换失败: {}", e.getMessage()); 43 | return Result.error(e.getMessage()); 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /vue/src/components/common/AuthWrapper.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 55 | 56 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/enums/RedemptionCodeStatus.java: -------------------------------------------------------------------------------- 1 | package com.cn.common.enums; 2 | 3 | import lombok.Getter; 4 | 5 | /** 6 | * 兑换码状态枚举 7 | * 8 | * @author CogniX 9 | */ 10 | @Getter 11 | public enum RedemptionCodeStatus { 12 | 13 | /** 14 | * 有效状态 - 可以正常兑换 15 | */ 16 | ACTIVE(1), 17 | 18 | /** 19 | * 已使用状态 - 已被用户兑换,不可再次使用 20 | */ 21 | USED(0), 22 | 23 | /** 24 | * 已禁用状态 - 管理员禁用,不可使用 25 | */ 26 | DISABLED(-1); 27 | 28 | private final Integer code; 29 | 30 | RedemptionCodeStatus(Integer code) { 31 | this.code = code; 32 | } 33 | 34 | /** 35 | * 根据状态码获取枚举 36 | * 37 | * @param code 状态码 38 | * @return 对应的枚举,如果找不到则返回null 39 | */ 40 | public static RedemptionCodeStatus fromCode(Integer code) { 41 | if (code == null) { 42 | return null; 43 | } 44 | 45 | for (RedemptionCodeStatus status : values()) { 46 | if (status.getCode().equals(code)) { 47 | return status; 48 | } 49 | } 50 | return null; 51 | } 52 | 53 | /** 54 | * 检查状态是否有效(可以兑换) 55 | * 56 | * @return 是否有效 57 | */ 58 | public boolean isActive() { 59 | return this == ACTIVE; 60 | } 61 | 62 | /** 63 | * 检查状态是否已使用 64 | * 65 | * @return 是否已使用 66 | */ 67 | public boolean isUsed() { 68 | return this == USED; 69 | } 70 | 71 | /** 72 | * 检查状态是否已禁用 73 | * 74 | * @return 是否已禁用 75 | */ 76 | public boolean isDisabled() { 77 | return this == DISABLED; 78 | } 79 | } -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/service/LlmService.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.service; 2 | 3 | 4 | import com.cn.llm.dto.SubmitMessageDto; 5 | import java.util.Map; 6 | import java.util.List; 7 | import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; 8 | 9 | /** 10 | * LLM 服务接口 11 | * 12 | * @author 时间海 @github dulaiduwang003 13 | * @email 2074055628@qq.com 14 | * @version 1.0 15 | */ 16 | public interface LlmService { 17 | 18 | /** 19 | * 提交一条用户消息并存储到Redis 20 | */ 21 | void submitMessage(SubmitMessageDto dto); 22 | 23 | /** 24 | * 按会话发起一次流式回复 25 | * @param token 用户token(用于身份验证) 26 | */ 27 | SseEmitter chatStream(String sessionId, String modelId, 28 | String enableWebSearch, 29 | String generateImages, 30 | String token); 31 | 32 | /** 33 | * 删除一个会话(删除该会话下的所有消息) 34 | * @param sessionId 会话ID 35 | * @param force 是否在会话被占用时强制删除 36 | */ 37 | void deleteSession(String sessionId, boolean force); 38 | 39 | /** 获取默认模型ID(用于控制器解析完整模型对象) */ 40 | String getDefaultModelId(); 41 | 42 | /** 获取默认模型完整对象(包含 supportPdf 等扩展字段) */ 43 | Object getDefaultModelObject(); 44 | 45 | /** 46 | * 从Redis获取会话的最新消息 47 | * @param sessionId 会话ID 48 | * @param limit 限制数量 49 | * @return 消息列表(按时间正序) 50 | */ 51 | List> getChatMessages(String sessionId, int limit); 52 | 53 | /** 54 | * 向Redis中添加助手回复消息 55 | * @param sessionId 会话ID 56 | * @param contentJson 消息内容JSON 57 | */ 58 | void addAssistantMessage(String sessionId, String contentJson); 59 | 60 | /** 61 | * 检查会话是否需要回复(最后一条是否为用户消息) 62 | * @param sessionId 会话ID 63 | * @return 是否需要回复 64 | */ 65 | boolean needsReply(String sessionId); 66 | 67 | } -------------------------------------------------------------------------------- /singleton/oss/src/main/java/com/cn/oss/controller/OssController.java: -------------------------------------------------------------------------------- 1 | package com.cn.oss.controller; 2 | 3 | 4 | import com.cn.common.exceptions.OssException; 5 | import com.cn.common.msg.Result; 6 | import com.cn.oss.exceptions.UploadException; 7 | import com.cn.oss.service.OssService; 8 | import com.cn.common.annotations.RateLimit; 9 | import jakarta.validation.Valid; 10 | import jakarta.validation.constraints.NotNull; 11 | import lombok.RequiredArgsConstructor; 12 | import lombok.extern.slf4j.Slf4j; 13 | import org.springframework.web.bind.annotation.PostMapping; 14 | import org.springframework.web.bind.annotation.RequestMapping; 15 | import org.springframework.web.bind.annotation.RestController; 16 | import org.springframework.web.multipart.MultipartFile; 17 | 18 | /** 19 | * OSS控制器 20 | * 21 | * @author 时间海 @github dulaiduwang003 22 | * @email 2074055628@qq.com 23 | * @version 1.0 24 | */ 25 | @Slf4j 26 | @RestController 27 | @RequestMapping("/oss") 28 | @RequiredArgsConstructor 29 | public class OssController { 30 | 31 | private final OssService ossService; 32 | 33 | 34 | 35 | /** 36 | * Upload file result. 37 | * 38 | * @param file the file 39 | * @return the result 40 | */ 41 | @PostMapping(value = "/upload/file", consumes = "multipart/form-data") 42 | @RateLimit(permitsPerSecond = 0.2, limitType = RateLimit.LimitType.USER, message = "文件上传过于频繁,请稍后再试") 43 | public Result uploadFile(@Valid @NotNull(message = "上传文件不能为空") final MultipartFile file) { 44 | try { 45 | return Result.data(ossService.uploadFile(file)); 46 | } catch (OssException | UploadException ex) { 47 | return Result.error(ex.getMessage()); 48 | } 49 | 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/impl/SystemNoticeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service.impl; 2 | 3 | 4 | import com.cn.common.constant.NoticeConstant; 5 | import com.cn.common.structure.NoticeStructure; 6 | import com.cn.common.utils.RedisUtils; 7 | import com.cn.system.dto.SystemNoticeSetDto; 8 | import com.cn.system.service.SystemNoticeService; 9 | import lombok.RequiredArgsConstructor; 10 | import org.springframework.stereotype.Service; 11 | 12 | import java.time.LocalDateTime; 13 | import cn.dev33.satoken.secure.SaSecureUtil; 14 | 15 | /** 16 | * 系统公告服务实现类 17 | * 18 | * @author 时间海 @github dulaiduwang003 19 | * @email 2074055628@qq.com 20 | * @version 1.0 21 | */ 22 | @Service 23 | @RequiredArgsConstructor 24 | public class SystemNoticeServiceImpl implements SystemNoticeService { 25 | 26 | private final RedisUtils redisUtils; 27 | 28 | @Override 29 | public void set(final SystemNoticeSetDto dto) { 30 | LocalDateTime finalCreateTime = dto.getCreateTime() != null ? dto.getCreateTime() : LocalDateTime.now(); 31 | String md5 = SaSecureUtil.md5(dto.getTitle() + "|" + dto.getPublisher() + "|" + dto.getContent() + "|" + finalCreateTime.toString()); 32 | NoticeStructure vo = new NoticeStructure() 33 | .setTitle(dto.getTitle()) 34 | .setPublisher(dto.getPublisher()) 35 | .setContent(dto.getContent()) 36 | .setCreateTime(finalCreateTime) 37 | .setMd5(md5); 38 | redisUtils.set(NoticeConstant.NOTICE, vo); 39 | } 40 | 41 | @Override 42 | public void clear() { 43 | redisUtils.delKey(NoticeConstant.NOTICE); 44 | } 45 | 46 | 47 | 48 | 49 | 50 | 51 | } 52 | 53 | 54 | -------------------------------------------------------------------------------- /vue/src/views/works/components/LoadingState.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/service/SystemWorkflowService.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.service; 2 | 3 | import com.cn.common.vo.PageVo; 4 | import com.cn.system.dto.*; 5 | import com.cn.system.vo.ParsingWorkflowVo; 6 | import com.cn.system.vo.SystemWorkflowPageItemVo; 7 | import com.cn.system.vo.SystemWorkflowCategoryVo; 8 | import org.springframework.web.multipart.MultipartFile; 9 | 10 | /** 11 | * 系统工作流管理服务 12 | * 13 | * @author 时间海 @github dulaiduwang003 14 | * @email 2074055628@qq.com 15 | * @version 1.0 16 | */ 17 | public interface SystemWorkflowService { 18 | 19 | /** 20 | * 解析工作流 JSON 文件,自动识别节点类型 21 | * 22 | * @param file 上传的 JSON 文件 23 | * @return 解析结果,包含所有节点信息和可识别的输入节点 24 | */ 25 | ParsingWorkflowVo parsingWorkflowJson(MultipartFile file); 26 | 27 | /** 28 | * 保存工作流配置 29 | * 30 | * @param dto 工作流配置数据 31 | */ 32 | void saveWorkflowConfig(SaveWorkflowConfigDto dto); 33 | 34 | /** 35 | * 分页查询工作流 36 | */ 37 | PageVo page(Integer page, Integer size, String keyword, Long categoryId); 38 | 39 | /** 40 | * 更新工作流(仅名称与类别) 41 | */ 42 | void updateWorkflow(UpdateWorkflowDto dto); 43 | 44 | /** 45 | * 删除工作流 46 | */ 47 | void deleteWorkflow(DeleteWorkflowDto dto); 48 | 49 | /** 50 | * 新建类别 51 | */ 52 | Long createCategory(CreateWorkflowCategoryDto dto); 53 | 54 | /** 55 | * 修改类别名称 56 | */ 57 | void updateCategory(UpdateWorkflowCategoryDto dto); 58 | 59 | /** 60 | * 删除类别 61 | */ 62 | void deleteCategory(DeleteWorkflowCategoryDto dto); 63 | 64 | /** 65 | * 获取所有类别列表(按创建时间倒序) 66 | */ 67 | java.util.List getCategoryList(); 68 | } 69 | 70 | -------------------------------------------------------------------------------- /singleton/common/src/main/java/com/cn/common/configuration/RedissonConfig.java: -------------------------------------------------------------------------------- 1 | /** 2 | * @author 明明不是下雨天 3 | */ 4 | package com.cn.common.configuration; 5 | 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.redisson.Redisson; 8 | import org.redisson.api.RedissonClient; 9 | import org.redisson.client.codec.Codec; 10 | import org.redisson.codec.JsonJacksonCodec; 11 | import org.redisson.config.Config; 12 | import org.redisson.config.SingleServerConfig; 13 | import org.springframework.beans.factory.annotation.Value; 14 | import org.springframework.context.annotation.Bean; 15 | import org.springframework.context.annotation.Configuration; 16 | 17 | import java.util.Objects; 18 | 19 | /** 20 | * The type Redisson config. 21 | * 22 | * @author 欧渐风. 23 | * @email 2074055628 @qq.com. 24 | */ 25 | @Configuration 26 | @Slf4j 27 | public class RedissonConfig { 28 | 29 | @Value("${spring.data.redis.host}") 30 | private String host; 31 | 32 | @Value("${spring.data.redis.port}") 33 | private int port; 34 | 35 | @Value("${spring.data.redis.database}") 36 | private int database; 37 | 38 | @Value("${spring.data.redis.password}") 39 | private String password; 40 | 41 | @Bean 42 | public RedissonClient redisson() { 43 | Config config = new Config(); 44 | SingleServerConfig singleServerConfig = config.useSingleServer(); 45 | String address = "redis://" + host + ":" + port; 46 | singleServerConfig.setAddress(address); 47 | singleServerConfig.setDatabase(database); 48 | if (!Objects.equals(password, "")) { 49 | singleServerConfig.setPassword(password); 50 | } 51 | Codec codec = new JsonJacksonCodec(); 52 | config.setCodec(codec); 53 | return Redisson.create(config); 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /singleton/notice/src/main/java/com/cn/notice/service/impl/NoticeServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.cn.notice.service.impl; 2 | 3 | import com.cn.common.constant.NoticeConstant; 4 | import com.cn.common.structure.NoticeStructure; 5 | import com.cn.common.utils.RedisUtils; 6 | import com.cn.notice.service.NoticeService; 7 | import com.cn.notice.vo.NoticeVo; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.stereotype.Service; 10 | import cn.dev33.satoken.secure.SaSecureUtil; 11 | import java.time.LocalDateTime; 12 | 13 | /** 14 | * 通知服务实现类 15 | * 16 | * @author 时间海 @github dulaiduwang003 17 | * @email 2074055628@qq.com 18 | * @version 1.0 19 | */ 20 | @Service 21 | @RequiredArgsConstructor 22 | public class NoticeServiceImpl implements NoticeService { 23 | 24 | 25 | private final RedisUtils redisUtils; 26 | 27 | 28 | @Override 29 | public NoticeVo getNotice() { 30 | NoticeStructure value = (NoticeStructure)redisUtils.get(NoticeConstant.NOTICE); 31 | if (value != null) { 32 | String md5 = value.getMd5(); 33 | if (md5 == null) { 34 | LocalDateTime ct = value.getCreateTime(); 35 | md5 = SaSecureUtil.md5(value.getTitle() + "|" + value.getPublisher() + "|" + value.getContent() + "|" + (ct == null ? "" : ct.toString())); 36 | value.setMd5(md5); 37 | redisUtils.set(NoticeConstant.NOTICE, value); 38 | } 39 | return new NoticeVo() 40 | .setCreateTime(value.getCreateTime()) 41 | .setContent(value.getContent()) 42 | .setPublisher(value.getPublisher()) 43 | .setTitle(value.getTitle()) 44 | .setMd5(md5); 45 | }else { 46 | return null; 47 | } 48 | } 49 | 50 | 51 | } 52 | 53 | 54 | -------------------------------------------------------------------------------- /singleton/system/src/main/java/com/cn/system/controller/SystemNoticeController.java: -------------------------------------------------------------------------------- 1 | package com.cn.system.controller; 2 | 3 | import com.cn.common.annotations.RateLimit; 4 | import com.cn.common.msg.Result; 5 | import com.cn.system.dto.SystemNoticeSetDto; 6 | import com.cn.system.service.SystemNoticeService; 7 | import jakarta.validation.Valid; 8 | import lombok.RequiredArgsConstructor; 9 | import org.springframework.http.MediaType; 10 | import org.springframework.validation.annotation.Validated; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestBody; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RestController; 15 | 16 | /** 17 | * 系统公告设置接口 18 | * 19 | * @author 时间海 @github dulaiduwang003 20 | * @email 2074055628@qq.com 21 | * @version 1.0 22 | */ 23 | @RestController 24 | @RequestMapping("/system/notice") 25 | @Validated 26 | @RequiredArgsConstructor 27 | public class SystemNoticeController { 28 | 29 | private final SystemNoticeService systemNoticeService; 30 | 31 | @PostMapping(value = "/set", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) 32 | @RateLimit(permitsPerSecond = 0.2, limitType = RateLimit.LimitType.USER, message = "公告设置过于频繁,请稍后再试") 33 | public Result set(@RequestBody @Valid final SystemNoticeSetDto dto) { 34 | systemNoticeService.set(dto); 35 | return Result.ok(); 36 | } 37 | 38 | @PostMapping(value = "/clear", produces = MediaType.APPLICATION_JSON_VALUE) 39 | @RateLimit(permitsPerSecond = 0.2, limitType = RateLimit.LimitType.USER, message = "公告清空过于频繁,请稍后再试") 40 | public Result clear() { 41 | systemNoticeService.clear(); 42 | return Result.ok(); 43 | } 44 | } 45 | 46 | 47 | -------------------------------------------------------------------------------- /singleton/llm/src/main/java/com/cn/llm/registry/RemoteRegistryRefresher.java: -------------------------------------------------------------------------------- 1 | package com.cn.llm.registry; 2 | 3 | import com.cn.llm.config.OpenRouterConfig; 4 | import jakarta.annotation.PostConstruct; 5 | import lombok.RequiredArgsConstructor; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 8 | import org.springframework.scheduling.annotation.Scheduled; 9 | import org.springframework.stereotype.Component; 10 | 11 | /** 12 | * 远程注册刷新器 13 | * 14 | * @author 时间海 @github dulaiduwang003 15 | * @email 2074055628@qq.com 16 | * @version 1.0 17 | */ 18 | @Slf4j 19 | @Component 20 | @RequiredArgsConstructor 21 | @ConditionalOnProperty(prefix = "open-router.remote-registry", name = "enabled", havingValue = "true") 22 | public class RemoteRegistryRefresher { 23 | 24 | private final RemoteRegistryClient client; 25 | private final RemoteRegistryStore store; 26 | private final OpenRouterConfig openRouterConfig; 27 | 28 | @PostConstruct 29 | public void init() { 30 | log.info("启动触发远程注册拉取"); 31 | refresh(); 32 | } 33 | 34 | @Scheduled(cron = "${open-router.remote-registry.cron:0 0/30 * * * ?}") 35 | public void scheduledRefresh() { 36 | log.info("定时触发远程注册拉取"); 37 | refresh(); 38 | } 39 | 40 | private void refresh() { 41 | log.info("开始拉取远程注册数据"); 42 | try { 43 | final String content = client.fetch(); 44 | if (content != null && !content.isBlank()) { 45 | store.update(content); 46 | log.info("远程注册数据已刷新,长度={} 字节", content.length()); 47 | } else { 48 | log.warn("远程注册数据刷新失败或为空,保留旧值"); 49 | } 50 | } catch (Exception e) { 51 | log.error("刷新远程注册数据时发生异常: {}", e.getMessage(), e); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /vue/src/api/system-workflow/system-workflow.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | ParsingWorkflowVo, 3 | SaveWorkflowConfigDto, 4 | WorkflowPageVo, 5 | UpdateWorkflowDto, 6 | DeleteWorkflowDto, 7 | CreateCategoryDto, 8 | UpdateCategoryDto, 9 | DeleteCategoryDto 10 | } from './types' 11 | import { post, get } from '@/utils/requestUtil' 12 | 13 | export const workflowApi = { 14 | parseWorkflow: (file: File) => { 15 | const formData = new FormData() 16 | formData.append('file', file) 17 | return post('/system/workflow/parsing', formData, { 18 | headers: { 'Content-Type': 'multipart/form-data' } 19 | }) 20 | }, 21 | 22 | saveWorkflowConfig: (payload: SaveWorkflowConfigDto) => { 23 | return post('/system/workflow/save', payload) 24 | }, 25 | 26 | // Page list 27 | getWorkflowPage: (params: { page?: number; size?: number; keyword?: string; categoryId?: number }) => { 28 | return get('/system/workflow/page', params) 29 | }, 30 | 31 | // Update workflow (name & category only) 32 | updateWorkflow: (payload: UpdateWorkflowDto) => { 33 | return post('/system/workflow/update', payload) 34 | }, 35 | 36 | // Delete workflow 37 | deleteWorkflow: (payload: DeleteWorkflowDto) => { 38 | return post('/system/workflow/delete', payload) 39 | }, 40 | 41 | // Category CRUD 42 | getCategoryList: () => { 43 | return get>('/system/workflow/category/list') 44 | }, 45 | createCategory: (payload: CreateCategoryDto) => { 46 | return post('/system/workflow/category/create', payload) 47 | }, 48 | updateCategory: (payload: UpdateCategoryDto) => { 49 | return post('/system/workflow/category/update', payload) 50 | }, 51 | deleteCategory: (payload: DeleteCategoryDto) => { 52 | return post('/system/workflow/category/delete', payload) 53 | } 54 | } 55 | 56 | 57 | -------------------------------------------------------------------------------- /vue/src/views/system/index.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 35 | 36 | -------------------------------------------------------------------------------- /vue/src/api/chat/chat.ts: -------------------------------------------------------------------------------- 1 | import type { GetModelsPageApi, GetModelsListApi, SubmitMessageApi, ChatStreamApi, DeleteChatSessionApi,ModelItem } from './types' 2 | import { get, post } from '@/utils/requestUtil' 3 | 4 | export const chatApi = { 5 | // 获取模型列表(分页) 6 | reqGetModelsPage: (params: GetModelsPageApi.Params) => { 7 | return post('/llm/get/available-model/page', params) 8 | }, 9 | // 获取自动模型 10 | reqGetDefaultModel:()=>{ 11 | return get('/llm/get/default-model') 12 | }, 13 | // 获取模型列表(不分页) 14 | reqGetModelsList: (params: GetModelsListApi.Params) => { 15 | return post('/llm/get/available-model/list', params) 16 | }, 17 | // 提交消息 18 | reqSubmitMessage: (params: SubmitMessageApi.Params) => { 19 | return post('/llm/chat/submit', params) 20 | }, 21 | // 删除会话 22 | reqDeleteChatSession: (params: DeleteChatSessionApi.Params) => { 23 | return post('/llm/chat/session/delete', params) 24 | }, 25 | // 建立SSE聊天流连接 26 | reqChatStream: (params: ChatStreamApi.Params) => { 27 | const { sessionId, modelId, enableWebSearch, generateImages } = params 28 | const q = new URLSearchParams() 29 | q.set('sessionId', sessionId) 30 | if (modelId) q.set('modelId', modelId) 31 | if (enableWebSearch !== undefined) q.set('enableWebSearch', String(enableWebSearch)) 32 | if (generateImages !== undefined) q.set('generateImages', String(generateImages)) 33 | 34 | // SSE 无法设置请求头,需要通过 URL 参数传递 token 35 | const token = localStorage.getItem('token') 36 | if (token) { 37 | q.set('token', token) 38 | } 39 | 40 | const url = `${import.meta.env.VITE_API_BASE_URL}/llm/chat/stream?${q.toString()}` 41 | const eventSource = new EventSource(url) 42 | 43 | return eventSource 44 | }, 45 | 46 | } 47 | --------------------------------------------------------------------------------