ASP.NET中微信公众平台开发的消息管理是怎样的
创始人
2024-11-28 08:41:58
0次


思维导图 

用思维导图来分析和表达一些模型:

ASP.NET中微信公众平台开发的消息管理是怎样的 

表结构 

根据思维导图,我们可以建立的表可以是3张表:消息表,规则表,类型表
消息表:实际的消息
规则表:文本、图文、语音等
类型表:文本、图文、语音(默认回复,订阅回复)
也可以是两张表:规制表,消息表(+一个类型字段) 

我这里只设计一张表:消息表(+一个规则字段+一个类型字段) 

设计表结构与个人的平时习惯有关系,我还是喜欢简单的东西,别为了设计而去专门设计,这样只会增加系统的复杂度 

CREATE TABLE [dbo].[WC_MessageResponse](
 [Id] [varchar](50) NOT NULL,  --主键 
 [OfficalAccountId] [varchar](50) NULL, --所属公众号
 [MessageRule] [int] NULL,   --消息规则(枚举)
 [Category] [int] NULL,   --类型(枚举)
 [MatchKey] [varchar](1000) NULL,  --关键字
 [TextContent] [varchar](max) NULL, --文本内容
 [ImgTextContext] [varchar](max) NULL, --图文文本内容
 [ImgTextUrl] [varchar](1000) NULL, --图文图片URL
 [ImgTextLink] [varchar](1000) NULL, --图文图片超链接
 [MeidaUrl] [varchar](1000) NULL,  --语音URL
 [MeidaLink] [varchar](1000) NULL,  --语音超链接
 [Enable] [bit] NOT NULL,   --是否启用
 [IsDefault] [bit] NOT NULL,  --是否默认
 [Remark] [varchar](2000) NULL,  --说明
 [Sort] [int] NOT NULL,   --排序
 [CreateTime] [datetime] NOT NULL,  --创建时间
 [CreateBy] [varchar](50) NOT NULL, --创建人
 [ModifyTime] [datetime] NOT NULL,  --修改时间
 [ModifyBy] [varchar](50) NULL,  --修改人
 CONSTRAINT [PK_WC_MessageResponse] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[WC_MessageResponse] WITH CHECK ADD CONSTRAINT [FK_WC_MessageResponse_WC_OfficalAcconts] FOREIGN KEY([OfficalAccountId])
REFERENCES [dbo].[WC_OfficalAccounts] ([Id])
ON DELETE CASCADE
GO

ALTER TABLE [dbo].[WC_MessageResponse] CHECK CONSTRAINT [FK_WC_MessageResponse_WC_OfficalAcconts]
GO

表对应了两个枚举和关联主表公众号管理的主表 

CREATE TABLE [dbo].[WC_OfficalAccounts](
 [Id] [varchar](50) NOT NULL,  --主键
 [OfficalId] [varchar](200) NULL, --公众号的唯一ID
 [OfficalName] [varchar](200) NOT NULL, --公众号名称
 [OfficalCode] [varchar](200) NOT NULL, --公众号帐号
 [OfficalPhoto] [varchar](1000) NULL, --头像
 [OfficalKey] [varchar](500) NULL, --EncodingAESKey
 [ApiUrl] [varchar](1000) NULL,  --我们的资源服务器
 [Token] [varchar](200) NULL,  --Token
 [AppId] [varchar](200) NULL,  --AppId
 [AppSecret] [varchar](200) NULL, --Appsecret
 [AccessToken] [varchar](200) NULL, --访问Token
 [Remark] [varchar](2000) NULL,  --说明
 [Enable] [bit] NOT NULL,  --是否启用
 [IsDefault] [bit] NOT NULL,  --是否为当前默认操作号
 [Category] [int] NOT NULL,  --类别(媒体号,企业号,个人号,开发测试号)
 [CreateTime] [datetime] NOT NULL, --创建时间
 [CreateBy] [varchar](50) NOT NULL, --创建人
 [ModifyTime] [datetime] NOT NULL, --修改时间
 [ModifyBy] [varchar](50) NULL,  --修改人
 CONSTRAINT [PK_WC_OfficalAcconts] PRIMARY KEY CLUSTERED 
(
 [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

对应的枚举 

 public enum WeChatReplyCategory
 {
 //文本
 Text =1,
 //图文
 Image =2,
 //语音
 Voice =3,
 //相等,用于回复关键字
 Equal=4,
 //包含,用于回复关键字
 Contain = 5
 }

 public enum WeChatRequestRuleEnum
 {
 /// 
 /// 默认回复,没有处理的
 /// 
 Default =0,
 /// 
 /// 关注回复
 /// 
 Subscriber =1,
 /// 
 /// 文本回复
 /// 
 Text =2,
 /// 
 /// 图片回复
 /// 
 Image =3,
 /// 
 /// 语音回复
 /// 
 Voice =4,
 /// 
 /// 视频回复
 /// 
 Video =5,
 /// 
 /// 超链接回复
 /// 
 Link =6,
 /// 
 /// LBS位置回复
 /// 
 Location =7,
 }

枚举其实对应就是我省掉的其余两张表
 到这里,相信表的设计已经非常清晰 

后台代码 

增删改查非常普通,主要关注点在前端,前端处理提交的消息中,必须包含规则,类型,来指定消息的最终表达

Controller

[HttpPost]
 [SupportFilter(ActionName = "Edit")]
 public JsonResult PostData(WC_MessageResponseModel model)
 {
  WC_OfficalAccountsModel accountModel = account_BLL.GetCurrentAccount();
  if (string.IsNullOrEmpty(model.Id))
  {
  model.Id = ResultHelper.NewId;
  }
  
  model.CreateBy = GetUserId();
  model.CreateTime = ResultHelper.NowTime;
  model.ModifyBy = GetUserId();
  model.ModifyTime = ResultHelper.NowTime;
  model.OfficalAccountId = accountModel.Id;
  model.Enable = true;
  model.IsDefault = true;
  if (m_BLL.PostData(ref errors, model))
  {
  LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",OfficalAccountId" + model.OfficalAccountId, "成功", "保存", "WC_MessageResponse");
  return Json(JsonHandler.CreateMessage(1, Resource.SaveSucceed));
  }
  else
  {
  string ErrorCol = errors.Error;
  LogHandler.WriteServiceLog(GetUserId(), "Id" + model.Id + ",OfficalAccountId" + model.OfficalAccountId + "," + ErrorCol, "失败", "保存", "WC_MessageResponse");
  return Json(JsonHandler.CreateMessage(0, Resource.SaveFail + ErrorCol));
  }

 }

BLL

public bool PostData(ref ValidationErrors errors, WC_MessageResponseModel model)
 {
  try
  {

  WC_MessageResponse entity = new WC_MessageResponse();

  if (IsExists(model.Id))
  {
   entity = m_Rep.GetById(model.Id);
  }

  entity.Id = model.Id;
  entity.OfficalAccountId = model.OfficalAccountId;
  entity.MessageRule = model.MessageRule;
  entity.Category = model.Category;
  entity.MatchKey = model.MatchKey;
  entity.TextContent = model.TextContent;
  entity.ImgTextContext = model.ImgTextContext;
  entity.ImgTextUrl = model.ImgTextUrl;
  entity.ImgTextLink = model.ImgTextLink;
  entity.MeidaUrl = model.MeidaUrl;
  entity.Enable = model.Enable;
  entity.IsDefault = model.IsDefault;
  entity.Remark = model.Remark;
  entity.CreateTime = model.CreateTime;
  entity.CreateBy = model.CreateBy;
  entity.Sort = model.Sort;
  entity.ModifyTime = model.ModifyTime;
  entity.ModifyBy = model.ModifyBy;
  if (m_Rep.PostData(entity))
  {
   return true;
  }
  else
  {
   errors.Add(Resource.NoDataChange);
   return false;
  }

  }
  catch (Exception ex)
  {
  errors.Add(ex.Message);
  ExceptionHander.WriteException(ex);
  return false;
  }
 }

DAL

public bool PostData(WC_MessageResponse model)
 {
  //如果所有开关都关掉,证明不启用回复
  if (model.Category == null)
  {
  return true;
  }
  //全部设置为不默认
  ExecuteSqlCommand(string.Format("update [dbo].[WC_MessageResponse] set IsDefault=0 where OfficalAccountId ='{0}' and MessageRule={1}", model.OfficalAccountId, model.MessageRule));
  //默认回复和订阅回复,且不是图文另外处理,因为他们有3种模式,但是只有一个是默认的
  if (model.Category!= (int)WeChatReplyCategory.Image && (model.MessageRule == (int)WeChatRequestRuleEnum.Default || model.MessageRule == (int)WeChatRequestRuleEnum.Subscriber))
  {
  //查看数据库是否存在数据
  var entity = Context.WC_MessageResponse.Where(p => p.OfficalAccountId == model.OfficalAccountId && p.MessageRule == model.MessageRule && p.Category == model.Category).FirstOrDefault();
  if (entity != null)
  {
   //删除原来的
   Context.WC_MessageResponse.Remove(entity);
  }
  }
  //全部设置为默认
  ExecuteSqlCommand(string.Format("update [dbo].[WC_MessageResponse] set IsDefault=1 where OfficalAccountId ='{0}' and MessageRule={1} and Category={2}", model.OfficalAccountId, model.MessageRule,model.Category));
  //修改
  if(IsExist(model.Id))
  {
  Context.Entry(model).State = EntityState.Modified;
  return Edit(model);
  }
  else { 
  return Create(model);
  }
 }

DAL层有必要来说明一下 

默认回复和关注回复有3种类型:文本,图文,语音(但是只能有一种,所以有IsDefault字段来表明执行哪种回复)所以这两个规则必须另外处理,且看DAL的代码执行的SQL语句便明白。 

所以我们尽情的设计前端吧!

 ASP.NET中微信公众平台开发的消息管理是怎样的

前端如何设计? 

我们来看一个思维导图: 

ASP.NET中微信公众平台开发的消息管理是怎样的  

前端完整代码 




 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


 
   
  
   
   
    文本: @Html.SwitchButtonByEdit("swText0", false)
   
   
    图文: @Html.SwitchButtonByEdit("swImage0", false)
   
   
    语音: @Html.SwitchButtonByEdit("swVoice0", false)
   
   
   
    当前操作公众号:@ViewBag.CurrentOfficalAcount
                     @Html.ToolButton("btnSava01", "fa fa-plus", "提交保存", ref perm, "Edit", false)    
       
          @Html.ToolButton("btnCreate02", "fa fa-search", "添加回复", ref perm, "Edit", false)    
            @Html.ToolButton("btnSava02", "fa fa-search", "提交保存", ref perm, "Edit", false)    
        标题:           图片:                                    @Resource.Browse            @Resource.Uploading                内容:      链接:      排序:         
           
    
               @Html.ToolButton("btnSava03", "fa fa-plus", "提交保存", ref perm, "Edit", false)    
          标题:       语音:                            @Resource.Browse                  @Resource.Uploading                     描述:          
    
                  文本: @Html.SwitchButtonByEdit("swText1", false)             图文: @Html.SwitchButtonByEdit("swImage1", false)             语音: @Html.SwitchButtonByEdit("swVoice1", false)                 当前操作公众号:@ViewBag.CurrentOfficalAcount                      @Html.ToolButton("btnSava11", "fa fa-plus", "提交保存", ref perm, "Edit", false)                      @Html.ToolButton("btnCreate12", "fa fa-search", "添加回复", ref perm, "Edit", false)    @Html.ToolButton("btnEdit12", "fa fa-search", "编辑", ref perm, "Edit", true)    @Html.ToolButton("btnDelete12", "fa fa-search", "删除", ref perm, "Delete", false)                 @Html.ToolButton("btnSava12", "fa fa-search", "提交保存", ref perm, "Edit", false)                  标题:           图片:                                    @Resource.Browse            @Resource.Uploading                内容:      链接:      排序:                                   @Html.ToolButton("btnSava13", "fa fa-plus", "提交保存", ref perm, "Edit", false)            标题:          语音:                       @Resource.Browse            @Resource.Uploading                  描述:                      @Html.ToolButton("btnCreate2", "fa fa-search", "添加回复", ref perm, "Edit", true)    @Html.ToolButton("btnEdit2", "fa fa-search", "编辑", ref perm, "Edit", true)    @Html.ToolButton("btnDelete2", "fa fa-search", "删除", ref perm, "Delete", false)        当前操作公众号: @ViewBag.CurrentOfficalAcount                  @Html.ToolButton("btnSava2", "fa fa-search", "提交保存", ref perm, "Edit", false)         当前操作公众号: @ViewBag.CurrentOfficalAcount                     关键字:                             规则:           @Html.SwitchButtonByEdit("swMessageRule2", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")                  内容:                                              @Html.ToolButton("btnCreate3", "fa fa-search", "添加回复", ref perm, "Edit", true)    @Html.ToolButton("btnEdit3", "fa fa-search", "编辑", ref perm, "Edit", true)    @Html.ToolButton("btnDelete3", "fa fa-search", "删除", ref perm, "Delete", false)        当前操作公众号: @ViewBag.CurrentOfficalAcount                  @Html.ToolButton("btnSava3", "fa fa-search", "提交保存", ref perm, "Edit", false)         当前操作公众号: @ViewBag.CurrentOfficalAcount                标题:          关键字:                             规则:           @Html.SwitchButtonByEdit("swMessageRule3", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")                  图片:                                   @Resource.Browse            @Resource.Uploading                  内容:     链接:     排序:               
                 @Html.ToolButton("btnCreate4", "fa fa-search", "添加回复", ref perm, "Edit", false)    @Html.ToolButton("btnEdit4", "fa fa-search", "编辑", ref perm, "Edit", true)    @Html.ToolButton("btnDelete4", "fa fa-search", "删除", ref perm, "Delete", false)        当前操作公众号: @ViewBag.CurrentOfficalAcount                  @Html.ToolButton("btnSava4", "fa fa-search", "提交保存", ref perm, "Edit", false)         当前操作公众号: @ViewBag.CurrentOfficalAcount                标题:          关键字:                             规则:           @Html.SwitchButtonByEdit("swMessageRule4", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")                  语音:                       @Resource.Browse            @Resource.Uploading                       描述:                     @*   *@   @*         *@    

利用前端的思维导图,来快速理解前端代码,和应用于实际 

总结 

消息的管理是非常有技巧的一件事

1.消息在没有任务回复的情况 下,我们应该启用默认回复,要不用户会得不到回应,丢失体验 

2.关键字的设计一般是一环扣一环,是有引导作用的
比如:

关键字:(我要)   回复: 按1加入获得礼品一份,按2直接获得50元
关键字:(1)       回复: 按3获得铁观音茶一份,按4获得普洱茶
关键字:(3或4)  回复:请回复您的地址和电话及收件人
这样我们将获得系统与用户之间的完整对话,当然我们也要对用户最后的信息进行处理。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...