guoziyun 9 mēneši atpakaļ
vecāks
revīzija
c3837736db

+ 33 - 6
oms/dist/src/controllers/messageTemplateController.js

@@ -1,9 +1,11 @@
 "use strict";
+// oms/src/controllers/messageTemplateController.ts
 var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 const messageTemplateService_1 = require("../services/messageTemplateService");
+const messageTemplateModel_1 = require("../models/messageTemplateModel");
 const mongoose_1 = __importDefault(require("mongoose"));
 class MessageTemplateController {
     /**
@@ -12,9 +14,15 @@ class MessageTemplateController {
      */
     async createTemplate(req, res) {
         try {
-            const { templateName, messageTitle, messageContent } = req.body;
-            if (!templateName || !messageTitle || !messageContent) {
-                res.status(400).json({ message: "templateName, messageTitle 和 messageContent 都是必需的。" });
+            const { templateName, messageTitle, messageContent, templateType } = req.body;
+            // 验证必需字段
+            if (!templateName || !messageTitle || !messageContent || typeof templateType === "undefined") {
+                res.status(400).json({ message: "templateName, messageTitle, messageContent 和 templateType 都是必需的。" });
+                return;
+            }
+            // 验证 templateType 是否为有效的枚举值
+            if (typeof templateType !== "number" || !(templateType in messageTemplateModel_1.TemplateType)) {
+                res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
                 return;
             }
             const newTemplate = await messageTemplateService_1.messageTemplateService.createTemplate(req.body);
@@ -52,12 +60,26 @@ class MessageTemplateController {
         }
     }
     /**
-     * 获取所有消息模板。
+     * 获取所有消息模板,并支持按模板类型筛选
      * GET /api/message-templates
      */
     async getAllTemplates(req, res) {
         try {
-            const templates = await messageTemplateService_1.messageTemplateService.getAllTemplates();
+            const { templateType } = req.query;
+            let templates;
+            if (templateType) {
+                // 如果提供了 templateType,则按类型筛选
+                const type = parseInt(templateType, 10);
+                if (isNaN(type) || !(type in messageTemplateModel_1.TemplateType)) {
+                    res.status(400).json({ message: "无效的 templateType 参数。" });
+                    return;
+                }
+                templates = await messageTemplateService_1.messageTemplateService.getTemplatesByType(type);
+            }
+            else {
+                // 否则获取所有模板
+                templates = await messageTemplateService_1.messageTemplateService.getAllTemplates();
+            }
             res.status(200).json(templates);
         }
         catch (error) {
@@ -71,7 +93,12 @@ class MessageTemplateController {
     async updateTemplate(req, res) {
         try {
             const { templateName } = req.params;
-            const updatedTemplate = await messageTemplateService_1.messageTemplateService.updateTemplate(templateName, req.body);
+            const updateData = req.body;
+            if (updateData.templateType !== undefined && (typeof updateData.templateType !== "number" || !(updateData.templateType in messageTemplateModel_1.TemplateType))) {
+                res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
+                return;
+            }
+            const updatedTemplate = await messageTemplateService_1.messageTemplateService.updateTemplate(templateName, updateData);
             if (updatedTemplate) {
                 res.status(200).json(updatedTemplate);
             }

+ 36 - 1
oms/dist/src/models/messageTemplateModel.js

@@ -34,11 +34,46 @@ var __importStar = (this && this.__importStar) || (function () {
     };
 })();
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.MessageTemplate = void 0;
+exports.MessageTemplate = exports.TEMPLATE_TYPE_MAP = exports.TemplateType = void 0;
 const mongoose_1 = __importStar(require("mongoose"));
+// 定义模板类型的枚举,确保数据的一致性
+var TemplateType;
+(function (TemplateType) {
+    TemplateType[TemplateType["OTHER"] = 0] = "OTHER";
+    TemplateType[TemplateType["NEW_PAINTING_REMINDER"] = 1] = "NEW_PAINTING_REMINDER";
+    TemplateType[TemplateType["DAILY_SIGN_IN_REWARD"] = 2] = "DAILY_SIGN_IN_REWARD";
+    TemplateType[TemplateType["COMPLETION_ENCOURAGEMENT"] = 3] = "COMPLETION_ENCOURAGEMENT";
+    TemplateType[TemplateType["LIMITED_TIME_EVENT_REMINDER"] = 4] = "LIMITED_TIME_EVENT_REMINDER";
+    TemplateType[TemplateType["NEW_FEATURE_INTRODUCTION"] = 5] = "NEW_FEATURE_INTRODUCTION";
+    TemplateType[TemplateType["SOCIAL_SHARING_ENCOURAGEMENT"] = 6] = "SOCIAL_SHARING_ENCOURAGEMENT";
+    TemplateType[TemplateType["LONG_TIME_INACTIVE_USER_RECALL"] = 7] = "LONG_TIME_INACTIVE_USER_RECALL";
+    TemplateType[TemplateType["HOT_PAINTING_RECOMMENDATION"] = 8] = "HOT_PAINTING_RECOMMENDATION";
+    TemplateType[TemplateType["CHALLENGE_TASK_REMINDER"] = 9] = "CHALLENGE_TASK_REMINDER";
+    TemplateType[TemplateType["HOLIDAY_CELEBRATION"] = 10] = "HOLIDAY_CELEBRATION";
+})(TemplateType || (exports.TemplateType = TemplateType = {}));
+// 定义模板类型和中文描述的映射,方便在应用中使用
+exports.TEMPLATE_TYPE_MAP = {
+    [TemplateType.OTHER]: "其他",
+    [TemplateType.NEW_PAINTING_REMINDER]: "新画作提醒",
+    [TemplateType.DAILY_SIGN_IN_REWARD]: "每日签到奖励",
+    [TemplateType.COMPLETION_ENCOURAGEMENT]: "完成度鼓励",
+    [TemplateType.LIMITED_TIME_EVENT_REMINDER]: "限时活动提醒",
+    [TemplateType.NEW_FEATURE_INTRODUCTION]: "新功能介绍",
+    [TemplateType.SOCIAL_SHARING_ENCOURAGEMENT]: "社交分享鼓励",
+    [TemplateType.LONG_TIME_INACTIVE_USER_RECALL]: "长期未活跃用户召回",
+    [TemplateType.HOT_PAINTING_RECOMMENDATION]: "热门画作推荐",
+    [TemplateType.CHALLENGE_TASK_REMINDER]: "挑战任务提醒",
+    [TemplateType.HOLIDAY_CELEBRATION]: "节日/特殊日庆贺",
+};
 // 定义消息模板的 Mongoose Schema
 const MessageTemplateSchema = new mongoose_1.Schema({
     templateName: { type: String, required: true, unique: true, trim: true }, // 模板的唯一名称,方便在代码中引用
+    templateType: {
+        type: Number,
+        required: true,
+        enum: Object.values(TemplateType).filter((value) => typeof value === "number"), // 使用枚举值来约束此字段
+        default: TemplateType.OTHER,
+    },
     messageTitle: { type: Object, of: String, required: true }, // 消息标题,使用嵌套对象支持多语言
     messageContent: { type: Object, of: String, required: true }, // 消息内容,使用嵌套对象支持多语言
 }, {

+ 11 - 2
oms/dist/src/services/messageTemplateService.js

@@ -1,4 +1,5 @@
 "use strict";
+// oms/src/services/messageTemplateService.ts
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.messageTemplateService = void 0;
 const messageTemplateModel_1 = require("../models/messageTemplateModel");
@@ -6,7 +7,7 @@ const messageTemplateModel_1 = require("../models/messageTemplateModel");
 exports.messageTemplateService = {
     /**
      * 创建一个新的消息模板。
-     * @param templateData 模板数据,包含 templateName, messageTitle, messageContent。
+     * @param templateData 模板数据,包含 templateName, templateType, messageTitle, messageContent。
      * @returns 新创建的模板文档。
      */
     createTemplate: async (templateData) => {
@@ -21,6 +22,14 @@ exports.messageTemplateService = {
     getTemplateByName: async (templateName) => {
         return await messageTemplateModel_1.MessageTemplate.findOne({ templateName });
     },
+    /**
+     * 根据模板类型获取所有模板。
+     * @param templateType 模板的类型(数字枚举)。
+     * @returns 匹配的模板文档数组。
+     */
+    getTemplatesByType: async (templateType) => {
+        return await messageTemplateModel_1.MessageTemplate.find({ templateType });
+    },
     /**
      * 获取所有消息模板。
      * @returns 所有模板文档的数组。
@@ -31,7 +40,7 @@ exports.messageTemplateService = {
     /**
      * 更新一个已存在的模板。
      * @param templateName 要更新的模板名称。
-     * @param updateData 更新的数据。
+     * @param updateData 更新的数据,包含 templateType, messageTitle, messageContent等
      * @returns 更新后的模板文档,如果未找到则为 null。
      */
     updateTemplate: async (templateName, updateData) => {

+ 1 - 1
oms/public/app/index.html

@@ -9,5 +9,5 @@
   <style>body,html{width:100%;height:100%}*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}body{margin:0;color:#000000d9;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-variant:tabular-nums;line-height:1.5715;background-color:#fff;font-feature-settings:"tnum"}html{--antd-wave-shadow-color:#1890ff;--scroll-bar:0}</style><link rel="stylesheet" href="styles-LXBSU6DF.css" media="print" onload="this.media='all'"><noscript><link rel="stylesheet" href="styles-LXBSU6DF.css"></noscript></head>
   <body>
     <app-root></app-root>
-  <script src="polyfills-B6TNHZQ6.js" type="module"></script><script src="main-OX5ICUCO.js" type="module"></script></body>
+  <script src="polyfills-B6TNHZQ6.js" type="module"></script><script src="main-JXTAQOED.js" type="module"></script></body>
 </html>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 0 - 0
oms/public/app/main-JXTAQOED.js


+ 38 - 7
oms/src/controllers/messageTemplateController.ts

@@ -1,6 +1,8 @@
+// oms/src/controllers/messageTemplateController.ts
+
 import { Request, Response } from "express";
 import { messageTemplateService } from "../services/messageTemplateService";
-import { IMessageTemplate } from "../models/messageTemplateModel";
+import { IMessageTemplate, TemplateType } from "../models/messageTemplateModel";
 import mongoose from "mongoose";
 
 class MessageTemplateController {
@@ -10,10 +12,17 @@ class MessageTemplateController {
    */
   public async createTemplate(req: Request, res: Response): Promise<void> {
     try {
-      const { templateName, messageTitle, messageContent } = req.body;
+      const { templateName, messageTitle, messageContent, templateType } = req.body;
+
+      // 验证必需字段
+      if (!templateName || !messageTitle || !messageContent || typeof templateType === "undefined") {
+        res.status(400).json({ message: "templateName, messageTitle, messageContent 和 templateType 都是必需的。" });
+        return;
+      }
 
-      if (!templateName || !messageTitle || !messageContent) {
-        res.status(400).json({ message: "templateName, messageTitle 和 messageContent 都是必需的。" });
+      // 验证 templateType 是否为有效的枚举值
+      if (typeof templateType !== "number" || !(templateType in TemplateType)) {
+        res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
         return;
       }
 
@@ -50,12 +59,27 @@ class MessageTemplateController {
   }
 
   /**
-   * 获取所有消息模板。
+   * 获取所有消息模板,并支持按模板类型筛选
    * GET /api/message-templates
    */
   public async getAllTemplates(req: Request, res: Response): Promise<void> {
     try {
-      const templates = await messageTemplateService.getAllTemplates();
+      const { templateType } = req.query;
+      let templates: IMessageTemplate[];
+
+      if (templateType) {
+        // 如果提供了 templateType,则按类型筛选
+        const type = parseInt(templateType as string, 10);
+        if (isNaN(type) || !(type in TemplateType)) {
+          res.status(400).json({ message: "无效的 templateType 参数。" });
+          return;
+        }
+        templates = await messageTemplateService.getTemplatesByType(type as TemplateType);
+      } else {
+        // 否则获取所有模板
+        templates = await messageTemplateService.getAllTemplates();
+      }
+
       res.status(200).json(templates);
     } catch (error: any) {
       res.status(500).json({ message: "获取所有模板时出错。", error: error.message });
@@ -69,7 +93,14 @@ class MessageTemplateController {
   public async updateTemplate(req: Request, res: Response): Promise<void> {
     try {
       const { templateName } = req.params;
-      const updatedTemplate = await messageTemplateService.updateTemplate(templateName, req.body);
+      const updateData = req.body;
+
+      if (updateData.templateType !== undefined && (typeof updateData.templateType !== "number" || !(updateData.templateType in TemplateType))) {
+        res.status(400).json({ message: "templateType 必须是有效的数字枚举值。" });
+        return;
+      }
+
+      const updatedTemplate = await messageTemplateService.updateTemplate(templateName, updateData);
 
       if (updatedTemplate) {
         res.status(200).json(updatedTemplate);

+ 37 - 0
oms/src/models/messageTemplateModel.ts

@@ -7,9 +7,40 @@ interface ILocalizedStrings {
   [key: string]: string;
 }
 
+// 定义模板类型的枚举,确保数据的一致性
+export enum TemplateType {
+  OTHER = 0,
+  NEW_PAINTING_REMINDER = 1, // 新画作提醒
+  DAILY_SIGN_IN_REWARD = 2, // 每日签到奖励
+  COMPLETION_ENCOURAGEMENT = 3, // 完成度鼓励
+  LIMITED_TIME_EVENT_REMINDER = 4, // 限时活动提醒
+  NEW_FEATURE_INTRODUCTION = 5, // 新功能介绍
+  SOCIAL_SHARING_ENCOURAGEMENT = 6, // 社交分享鼓励
+  LONG_TIME_INACTIVE_USER_RECALL = 7, // 长期未活跃用户召回
+  HOT_PAINTING_RECOMMENDATION = 8, // 热门画作推荐
+  CHALLENGE_TASK_REMINDER = 9, // 挑战任务提醒
+  HOLIDAY_CELEBRATION = 10, // 节日/特殊日庆贺
+}
+
+// 定义模板类型和中文描述的映射,方便在应用中使用
+export const TEMPLATE_TYPE_MAP: Record<TemplateType, string> = {
+  [TemplateType.OTHER]: "其他",
+  [TemplateType.NEW_PAINTING_REMINDER]: "新画作提醒",
+  [TemplateType.DAILY_SIGN_IN_REWARD]: "每日签到奖励",
+  [TemplateType.COMPLETION_ENCOURAGEMENT]: "完成度鼓励",
+  [TemplateType.LIMITED_TIME_EVENT_REMINDER]: "限时活动提醒",
+  [TemplateType.NEW_FEATURE_INTRODUCTION]: "新功能介绍",
+  [TemplateType.SOCIAL_SHARING_ENCOURAGEMENT]: "社交分享鼓励",
+  [TemplateType.LONG_TIME_INACTIVE_USER_RECALL]: "长期未活跃用户召回",
+  [TemplateType.HOT_PAINTING_RECOMMENDATION]: "热门画作推荐",
+  [TemplateType.CHALLENGE_TASK_REMINDER]: "挑战任务提醒",
+  [TemplateType.HOLIDAY_CELEBRATION]: "节日/特殊日庆贺",
+};
+
 // 定义消息模板的接口
 export interface IMessageTemplate extends Document {
   templateName: string;
+  templateType: TemplateType; // 新增字段:模板类型
   messageTitle: ILocalizedStrings;
   messageContent: ILocalizedStrings;
   createdAt: Date;
@@ -20,6 +51,12 @@ export interface IMessageTemplate extends Document {
 const MessageTemplateSchema: Schema = new Schema(
   {
     templateName: { type: String, required: true, unique: true, trim: true }, // 模板的唯一名称,方便在代码中引用
+    templateType: {
+      type: Number,
+      required: true,
+      enum: Object.values(TemplateType).filter((value) => typeof value === "number"), // 使用枚举值来约束此字段
+      default: TemplateType.OTHER,
+    },
     messageTitle: { type: Object, of: String, required: true }, // 消息标题,使用嵌套对象支持多语言
     messageContent: { type: Object, of: String, required: true }, // 消息内容,使用嵌套对象支持多语言
   },

+ 14 - 3
oms/src/services/messageTemplateService.ts

@@ -1,10 +1,12 @@
-import { MessageTemplate, IMessageTemplate } from "../models/messageTemplateModel";
+// oms/src/services/messageTemplateService.ts
+
+import { MessageTemplate, IMessageTemplate, TemplateType } from "../models/messageTemplateModel";
 
 // 导出消息模板服务对象
 export const messageTemplateService = {
   /**
    * 创建一个新的消息模板。
-   * @param templateData 模板数据,包含 templateName, messageTitle, messageContent。
+   * @param templateData 模板数据,包含 templateName, templateType, messageTitle, messageContent。
    * @returns 新创建的模板文档。
    */
   createTemplate: async (templateData: Partial<IMessageTemplate>): Promise<IMessageTemplate> => {
@@ -21,6 +23,15 @@ export const messageTemplateService = {
     return await MessageTemplate.findOne({ templateName });
   },
 
+  /**
+   * 根据模板类型获取所有模板。
+   * @param templateType 模板的类型(数字枚举)。
+   * @returns 匹配的模板文档数组。
+   */
+  getTemplatesByType: async (templateType: TemplateType): Promise<IMessageTemplate[]> => {
+    return await MessageTemplate.find({ templateType });
+  },
+
   /**
    * 获取所有消息模板。
    * @returns 所有模板文档的数组。
@@ -32,7 +43,7 @@ export const messageTemplateService = {
   /**
    * 更新一个已存在的模板。
    * @param templateName 要更新的模板名称。
-   * @param updateData 更新的数据。
+   * @param updateData 更新的数据,包含 templateType, messageTitle, messageContent等
    * @returns 更新后的模板文档,如果未找到则为 null。
    */
   updateTemplate: async (templateName: string, updateData: Partial<IMessageTemplate>): Promise<IMessageTemplate | null> => {

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels