ASP.NET MVC5+EF6+EasyUI后台管理系统 微信公众平台开发之消息管理

前言

回顾上一节,我们熟悉的了解了消息的请求和响应,这一节我们来建立数据库的表,表的设计蛮复杂

你也可以按自己所分析的情形结构来建表

必须非常熟悉表的结果才能运用这张表,这表表的情形涵盖比较多

思维导图

我这个人比较喜欢用思维导图来分析和表达一些模型:

表结构 

根据思维导图,我们可以建立的表可以是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
 {
  /// <summary>
  /// 默认回复,没有处理的
  /// </summary>
  Default =0,
  /// <summary>
  /// 关注回复
  /// </summary>
  Subscriber =1,
  /// <summary>
  /// 文本回复
  /// </summary>
  Text =2,
  /// <summary>
  /// 图片回复
  /// </summary>
  Image =3,
  /// <summary>
  /// 语音回复
  /// </summary>
  Voice =4,
  /// <summary>
  /// 视频回复
  /// </summary>
  Video =5,
  /// <summary>
  /// 超链接回复
  /// </summary>
  Link =6,
  /// <summary>
  /// LBS位置回复
  /// </summary>
  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<WC_MessageResponse>(model).State = EntityState.Modified;
    return Edit(model);
   }
   else {
    return Create(model);
   }
  }

DAL层有必要来说明一下

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

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

前端如何设计?

我们来看一个思维导图:

前端完整代码

<style>
 .formtable td {
  vertical-align: top;
  padding: 10px;
 }

 .formtable th {
  text-align: left;
  padding: 10px;
  height: 30px;
 }

 .formtablenormal {
  width: 500px;
 }

  .formtablenormal th {
   border: 0px;
   text-align: right;
  }

  .formtablenormal td {
   border: 0px;
   vertical-align: middle;
  }
</style>
<script>
 //1文本2图文3语音
 var Category = {
  Text: 1,
  Image: 2,
  Voice: 3,
  Equal: 4,
  Contain: 5
 };
 //
 var RequestRule = {
  Default: 0,
  Subscriber: 1,
  Text: 2,
  Image: 3,
  Voice: 4,
  Video: 5,
  Link: 6,
  Location: 7
 };

 function initDefault() {
  $('#swText0').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swImage0').switchbutton("uncheck");
     $('#swVoice0').switchbutton("uncheck");
     $("#div01").show();
     $("#div02,#div03").hide();
     $("#Category").val(Category.Text);
    }
   }
  });
  $('#swImage0').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swVoice0').switchbutton("uncheck");
     $('#swText0').switchbutton("uncheck");
     $("#div02").show();
     $("#div01,#div03").hide();
     $("#Category").val(Category.Image);
     $("#List0").datagrid("resize");
    }
   }
  });
  $('#swVoice0').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swImage0').switchbutton("uncheck");
     $('#swText0').switchbutton("uncheck");
     $("#div03").show();
     $("#div01,#div02").hide();
     $("#Category").val(Category.Voice);
    }
   }
  });
  //文本
  $.post('@Url.Action("GetList")', {
   page: 1,
   rows: 1,
   category: Category.Text,
   messageRule: RequestRule.Default
  },
  function(data) {
   var rows = data.rows;
   for (var i = 0; i < rows.length; i++) {
    if (rows[i].Category == Category.Text) {
     $("#Text0").val(rows[i].TextContent);
     if (rows[i].IsDefault) {
      $('#swText0').switchbutton("check");
      $('#swImage0').switchbutton("uncheck");
      $('#swVoice0').switchbutton("uncheck");
     }
    }
   }
  });
  //语音
  $.post('@Url.Action("GetList")', {
   page: 1,
   rows: 1,
   category: Category.Voice,
   messageRule: RequestRule.Default
  },
  function (data) {
   var rows = data.rows;
   for (var i = 0; i < rows.length; i++) {
    if (rows[i].Category == Category.Voice) {
     $("#VoiceTitle0").val(rows[i].TextContent);
     $("#VoiceContent0").val(rows[i].Remark);
     $("#VoiceUrl0").val(rows[i].MeidaUrl);
     if (rows[i].IsDefault) {
      $('#swVoice0').switchbutton("check");
      $('#swText0').switchbutton("uncheck");
      $('#swImage0').switchbutton("uncheck");
     }
    }
   }
  });

  $('#List0').datagrid({
   url: '@Url.Action("GetList")?messageRule=' + RequestRule.Default + '&category=' + Category.Image,
   width: SetGridWidthSub(40),
   methord: 'post',
   height: SetGridHeightSub(175),
   fitColumns: true,
   sortName: 'Sort',
   sortOrder: 'asc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   onLoadSuccess: function (data) {
    if (data.rows.length > 0)
    {
     if (data.rows[0].IsDefault) {
      $('#swImage0').switchbutton("check");
      $('#swText0').switchbutton("uncheck");
      $('#swVoice0').switchbutton("uncheck");
      $("#Category").val(Category.Image);
     }
    }
   },
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'TextContent',
    title: '标题',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextUrl',
    title: '图片',
    width: 50,
    sortable: true,
    align: 'center', formatter: function (value) { return "<img width='80' height='80' src='" + value + "'/>" }
   },
   {
    field: 'ImgTextLink',
    title: '超链接',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextContext',
    title: '回复内容',
    width: 180,
    sortable: true
   },

   ]]
  });

  $("#btnCreate02").unbind().click(function () {
   $("#modalwindow0").window({
    title: '@Resource.Create',
    width: 700,
    height: 500,
    iconCls: 'fa fa-plus'
   }).window('open');
  });

  $("#btnSava01").unbind().click(function() {
   //默认回复
   $("#MessageRule").val(RequestRule.Default);
   if ($.trim($("#Text0").val())=="")
   {
    $.messager.alert('@Resource.Tip', '内容必须填写!', 'warning');
    return;
   }
   $("#TextContent").val($.trim($("#Text0").val()));
   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
     data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });

  $("#btnSava02").unbind().click(function () {
   if ($.trim($("#ImageTitle0").val()) == "") {
    $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
    return;
   }
   if ($.trim($("#ImageUrl0").val()) == "") {
    $.messager.alert('@Resource.Tip', '图片必须上传!', 'warning');
    return;
   }
   if ($.trim($("#Sort0").val()) == "") {
    $.messager.alert('@Resource.Tip', '排序必须填写!', 'warning');
    return;
   }
   //图文回复
   $("#MessageRule").val(RequestRule.Default);
   $("#TextContent").val($("#ImageTitle0").val());
   $("#ImgTextUrl").val($("#ImageUrl0").val());
   $("#ImgTextContext").val($("#ImageContent0").val());
   $("#ImgTextLink").val($("#ImageLink0").val());
   $("#Sort").val($("#Sort0").val());

   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     if (data.type == 1) {
      $("#Id").val("");
      $("#List0").datagrid('reload');
      $("#modalwindow0").window('close');
      $("#ImageTitle0").val("");
      $("#form02 img").attr("src", "/Content/Images/NotPic.jpg");
      $("#ImageContent0").val("");
      $("#ImageLink0").val("");
      $("#Sort0").val(0);
      $('#FileUpload02').val('');
     }
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
  $("#btnSava03").unbind().click(function() {
   //默认回复
   $("#MessageRule").val(RequestRule.Default);
   if ($.trim($("#Text0").val())=="")
   {
    if ($.trim($("#VoiceTitle0").val()) == "") {
     $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
     return;
    }
    if ($.trim($("#VoiceUrl0").val()) == "") {
     $.messager.alert('@Resource.Tip', '必须上传语音!', 'warning');
     return;
    }
    $("#TextContent").val($("#VoiceTitle0").val());
    $("#MeidaUrl").val($("#VoiceUrl0").val());
    $("#Remark").val($("#VoiceContent0").val());
   }

   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
 }

 function initSubscriber() {
   $('#swText1').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swImage1').switchbutton("uncheck");
     $('#swVoice1').switchbutton("uncheck");
     $("#div11").show();
     $("#div12,#div13").hide();
     $("#Category").val(Category.Text);
    }
   }
  });
  $('#swImage1').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swVoice1').switchbutton("uncheck");
     $('#swText1').switchbutton("uncheck");
     $("#div12").show();
     $("#div11,#div13").hide();
     $("#Category").val(Category.Image);
     $("#List1").datagrid("resize");
    }
   }
  });
  $('#swVoice1').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $('#swImage1').switchbutton("uncheck");
     $('#swText1').switchbutton("uncheck");
     $("#div13").show();
     $("#div11,#div12").hide();
     $("#Category").val(Category.Voice);
    }
   }
  });
  //文本
  $.post('@Url.Action("GetList")', {
   page: 1,
   rows: 1,
   category: Category.Text,
   messageRule: RequestRule.Subscriber
  },
  function(data) {
   var rows = data.rows;
   for (var i = 0; i < rows.length; i++) {
    if (rows[i].Category == Category.Text) {
     $("#Text1").val(rows[i].TextContent);
     if (rows[i].IsDefault) {
      $('#swText1').switchbutton("check");
      $('#swImage1').switchbutton("uncheck");
      $('#swVoice1').switchbutton("uncheck");
     }
    }
   }
  });
  //语音
  $.post('@Url.Action("GetList")', {
   page: 1,
   rows: 1,
   category: Category.Voice,
   messageRule: RequestRule.Subscriber
  },
  function (data) {
   var rows = data.rows;
   for (var i = 0; i < rows.length; i++) {
    if (rows[i].Category == Category.Voice) {
     $("#VoiceTitle1").val(rows[i].TextContent);
     $("#VoiceContent1").val(rows[i].Remark);
     if (rows[i].IsDefault) {
      $('#swVoice1').switchbutton("check");
      $('#swText1').switchbutton("uncheck");
      $('#swImage1').switchbutton("uncheck");
     }
    }
   }
  });

  $('#List1').datagrid({
   url: '@Url.Action("GetList")?messageRule=' + RequestRule.Subscriber + '&category=' + Category.Image,
   width: SetGridWidthSub(40),
   methord: 'post',
   height: SetGridHeightSub(175),
   fitColumns: true,
   sortName: 'Sort',
   sortOrder: 'asc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   onLoadSuccess: function (data) {
    if (data.rows.length > 0)
    {
     if (data.rows[0].IsDefault) {
      $('#swImage1').switchbutton("check");
      $('#swText1').switchbutton("uncheck");
      $('#swVoice1').switchbutton("uncheck");
     }
    }
   },
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'TextContent',
    title: '标题',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextUrl',
    title: '图片',
    width: 50,
    sortable: true,
    align: 'center', formatter: function (value) { return "<img width='80' height='80' src='" + value + "'/>" }
   },
   {
    field: 'ImgTextLink',
    title: '超链接',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextContext',
    title: '回复内容',
    width: 180,
    sortable: true
   },

   ]]
  });

  $("#btnCreate12").unbind().click(function () {
   $("#modalwindow1").window({
    title: '@Resource.Create',
    width: 700,
    height: 500,
    iconCls: 'fa fa-plus'
   }).window('open');
  });

  $("#btnSava11").unbind().click(function() {
   //默认回复
   $("#MessageRule").val(RequestRule.Subscriber);
   if ($.trim($("#Text1").val())=="")
   {
    $.messager.alert('@Resource.Tip', '内容必须填写!', 'warning');
    return;
   }
   $("#TextContent").val($.trim($("#Text1").val()));
   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
     data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });

  $("#btnSava12").unbind().click(function () {
   if ($.trim($("#ImageTitle1").val()) == "") {
    $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
    return;
   }
   if ($.trim($("#ImageUrl1").val()) == "") {
    $.messager.alert('@Resource.Tip', '图片必须上传!', 'warning');
    return;
   }
   if ($.trim($("#Sort1").val()) == "") {
    $.messager.alert('@Resource.Tip', '排序必须填写!', 'warning');
    return;
   }
   //图文回复
   $("#MessageRule").val(RequestRule.Subscriber);
   $("#TextContent").val($("#ImageTitle1").val());
   $("#ImgTextUrl").val($("#ImageUrl1").val());
   $("#ImgTextContext").val($("#ImageContent1").val());
   $("#ImgTextLink").val($("#ImageLink1").val());
   $("#Sort").val($("#Sort1").val());

   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     if (data.type == 1) {
      $("#Id").val("");
      $("#List1").datagrid('reload');
      $("#modalwindow1").window('close');
      $("#ImageTitle1").val("");
      $("#form12 img").attr("src", "/Content/Images/NotPic.jpg");
      $("#ImageContent1").val("");
      $("#ImageLink1").val("");
      $("#Sort1").val(0);
      $('#FileUpload12').val('');
     }
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
  $("#btnSava13").unbind().click(function() {
   //默认回复
   $("#MessageRule").val(RequestRule.Subscriber);
   if ($.trim($("#Text1").val())=="")
   {
    if ($.trim($("#VoiceTitle1").val()) == "") {
     $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
     return;
    }
    if ($.trim($("#VoiceUrl1").val()) == "") {
     $.messager.alert('@Resource.Tip', '必须上传语音!', 'warning');
     return;
    }
    $("#TextContent").val($("#VoiceTitle1").val());
    $("#MeidaUrl").val($("#VoiceUrl1").val());
    $("#Remark").val($("#VoiceContent1").val());
   }

   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
 }

 function initText() {
  $("#Category").val(Category.Equal);
  $('#List2').datagrid({
   url: '@Url.Action("GetList")?messageRule=' + RequestRule.Text,
   width: SetGridWidthSub(40),
   methord: 'post',
   height: SetGridHeightSub(100),
   fitColumns: true,
   sortName: 'CreateTime',
   sortOrder: 'desc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'Category',
    title: 'Category',
    width: 80,
    sortable: true,
    hidden: true
   },
   {
    field: 'MatchKey',
    title: '关键字',
    width: 80,
    sortable: true,
    formatter: function (value,row,index){
     if (row.Category == Category.Equal) {
      return "(完全匹配)" + value
     } else {
      return "(模糊匹配)" + value
     }
    }
   },
   {
    field: 'TextContent',
    title: '回复内容',
    width: 80,
    sortable: true
   },

   ]]
  });

  $('#swMessageRule2').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $("#Category").val(Category.Equal);
    } else {
     $("#Category").val(Category.Contain);
    }
   }
  });
  $("#btnCreate2").unbind().click(function () {
   $("#modalwindow2").window({
    title: '@Resource.Create',
    width: 700,
    height: 400,
    iconCls: 'fa fa-plus'
   }).window('open');
  });

  $("#btnSava2").unbind().click(function () {
   if ($.trim($("#TextMatchKey2").val()) == "") {
    $.messager.alert('@Resource.Tip', '关键字必须填写!', 'warning');
    return;
   }
   if ($.trim($("#Text2").val()) == "") {
    $.messager.alert('@Resource.Tip', '内容必须填写!', 'warning');
    return;
   }
   //文本回复
   $("#MessageRule").val(RequestRule.Text);
   $("#MatchKey").val($.trim($("#TextMatchKey2").val()));
   $("#TextContent").val($("#Text2").val());
   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     if (data.type == 1) {
      $("#Id").val("");
      $("#List2").datagrid('reload');
      $("#modalwindow2").window('close');
      $("#TextMatchKey2").val("");
      $("#Text2").val("");
     }
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
 }

 function initImage() {
  $("#Category").val(Category.Equal);
  $('#List31').datagrid({
   url: '@Url.Action("GetListProperty")?messageRule=' + RequestRule.Image,
   width: 300,
   methord: 'post',
   height: SetGridHeightSub(100),
   fitColumns: true,
   sortName: 'CreateTime',
   sortOrder: 'desc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   onClickRow: function (index,data) {
    var row = $('#List31').datagrid('getSelected');
    if (row != null)
    {
     $('#List3').datagrid({url:'@Url.Action("GetList")?messageRule='+RequestRule.Image+'&category='+row.Category+'&matchKey='+row.MatchKey});
    }
   },
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'Category',
    title: 'Category',
    width: 80,
    sortable: true,
    hidden: true
   },
   {
    field: 'MatchKey',
    title: '关键字',
    width: 130,
    sortable: true,
    formatter: function (value, row, index) {
     if (row.Category == Category.Equal) {
      return "(完全匹配)" + value
     } else {
      return "(模糊匹配)" + value
     }
    }
   },
   {
    field: 'CreateTime',
    title: '创建时间',
    width: 80,
    sortable: true
   },

   ]]
  }).datagrid('getPager').pagination({ showPageList: true, showRefresh: false, displayMsg: '' });

  $('#List3').datagrid({
   url:'@Url.Action("GetList")?messageRule='+RequestRule.Image+'&category=x&matchKey=x',
   width: SetGridWidthSub(340),
   methord: 'post',
   height: SetGridHeightSub(100),
   fitColumns: true,
   sortName: 'Sort',
   sortOrder: 'asc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'Category',
    title: 'Category',
    width: 80,
    sortable: true,
    hidden: true
   },
   {
    field: 'TextContent',
    title: '标题',
    width: 80,
    sortable: true
   },
   {
    field: 'MatchKey',
    title: '关键字',
    width: 80,
    sortable: true,
    formatter: function (value,row,index){
     if (row.Category == Category.Equal) {
      return "(完全匹配)" + value
     } else {
      return "(模糊匹配)" + value
     }
    }
   },
   {
    field: 'ImgTextUrl',
    title: '图片',
    width: 50,
    sortable: true,
    align: 'center', formatter: function (value) { return "<img width='80' height='80' src='" + value + "'/>" }
   },
   {
    field: 'ImgTextLink',
    title: '超链接',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextContext',
    title: '回复内容',
    width: 180,
    sortable: true
   },
   {
    field: 'Sort',
    title: '排序',
    width: 50,
    sortable: true
   },
   ]]
  });

  $('#swMessageRule3').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $("#Category").val(Category.Equal);
    } else {
     $("#Category").val(Category.Contain);
    }
   }
  });
  $("#btnCreate3").unbind().click(function () {
   $("#modalwindow3").window({
    title: '@Resource.Create',
    width: 700,
    height: 550,
    iconCls: 'fa fa-plus'
   }).window('open');
  });

  $("#btnSava3").unbind().click(function () {
   if ($.trim($("#ImageTitle3").val()) == "") {
    $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
    return;
   }
   if ($.trim($("#TextMatchKey3").val()) == "") {
    $.messager.alert('@Resource.Tip', '关键字必须填写!', 'warning');
    return;
   }
   if ($.trim($("#ImageUrl3").val()) == "") {
    $.messager.alert('@Resource.Tip', '图片必须上传!', 'warning');
    return;
   }
   //图文回复
   $("#MessageRule").val(RequestRule.Image);
   $("#MatchKey").val($.trim($("#TextMatchKey3").val()));
   $("#TextContent").val($("#ImageTitle3").val());
   $("#ImgTextUrl").val($("#ImageUrl3").val());
   $("#ImgTextContext").val($("#ImageContent3").val());
   $("#ImgTextLink").val($("#ImageLink3").val());
   $("#Sort").val($("#Sort3").val());
   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     if (data.type == 1) {
      $("#Id").val("");
      $("#List3").datagrid('reload');
      $("#List31").datagrid('reload');
      $("#modalwindow3").window('close');
      $("#ImageTitle3").val("");
      $("#form3 img").attr("src", "/Content/Images/NotPic.jpg");
      $("#ImageContent3").val("");
      $("#ImageLink3").val("");
      $("#Sort3").val(0);
      $('#FileUpload3').val('');
      $("#TextMatchKey3").val('');
     }
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
 }

 function initVoice() {
  $("#Category").val(Category.Equal);
  $('#List4').datagrid({
   url: '@Url.Action("GetList")?messageRule=' + RequestRule.Voice,
   width: SetGridWidthSub(40),
   methord: 'post',
   height: SetGridHeightSub(100),
   fitColumns: true,
   sortName: 'CreateTime',
   sortOrder: 'desc',
   idField: 'Id',
   pageSize: 15,
   pageList: [15, 20, 30, 40, 50],
   pagination: true,
   striped: true,
   //奇偶行是否区分
   singleSelect: true,
   //单选模式
   //rownumbers: true,//行号
   columns: [[{
    field: 'Id',
    title: 'Id',
    width: 80,
    hidden: true
   },
   {
    field: 'Category',
    title: 'Category',
    width: 80,
    sortable: true,
    hidden: true
   },
   {
    field: 'TextContent',
    title: '标题',
    width: 80,
    sortable: true
   },
   {
    field: 'MatchKey',
    title: '关键字',
    width: 80,
    sortable: true,
    formatter: function (value,row,index){
     if (row.Category == Category.Equal) {
      return "(完全匹配)" + value
     } else {
      return "(模糊匹配)" + value
     }
    }
   },
   {
    field: 'MeidaUrl',
    title: '语音',
    width: 80,
    sortable: true,
    align: 'center', formatter: function (value) { return "<img width='80' height='80' src='" + value + "'/>" }
   },
   {
    field: 'ImgTextLink',
    title: '超链接',
    width: 80,
    sortable: true
   },
   {
    field: 'ImgTextContext',
    title: '回复内容',
    width: 80,
    sortable: true
   },

   ]]
  });

  $('#swMessageRule4').switchbutton({
   onChange: function(checked) {
    if (checked) {
     $("#Category").val(Category.Equal);
    } else {
     $("#Category").val(Category.Contain);
    }
   }
  });
  $("#btnCreate4").unbind().click(function() {
   $("#modalwindow4").window({
    title: '@Resource.Create',
    width: 700,
    height: 500,
    iconCls: 'fa fa-plus'
   }).window('open');
  });

  $("#btnSava4").unbind().click(function () {
   if ($.trim($("#VoiceTitle4").val()) == "") {
    $.messager.alert('@Resource.Tip', '标题必须填写!', 'warning');
    return;
   }
   if ($.trim($("#TextMatchKey4").val()) == "") {
    $.messager.alert('@Resource.Tip', '关键字必须填写!', 'warning');
    return;
   }
   if ($.trim($("#VoiceUrl4").val()) == "") {
    $.messager.alert('@Resource.Tip', '必须上传语音!', 'warning');
    return;
   }
   //图文回复
   $("#MessageRule").val(RequestRule.Voice);
   $("#MatchKey").val($("#TextMatchKey4").val());
   $("#TextContent").val($("#VoiceTitle4").val());
   $("#MeidaUrl").val($("#VoiceUrl4").val());
   $("#Remark").val($("#VoiceContent4").val());
   if ($("#form").valid()) {
    $.ajax({
     url: "@Url.Action("PostData")",
     type: "Post",
    data: $("#form").serialize(),
    dataType: "json",
    success: function(data) {
     if (data.type == 1) {
      $("#Id").val("");
      $("#List4").datagrid('reload');
      $("#modalwindow4").window('close');
      $("#TextMatchKey4").val("");
      $("#VoiceTitle4").val("");
      $("#VoiceUrl4").val("");
      $("#VoiceContent4").val("");
      $("#FileUpload4").val("");
      $("#form3 img").attr("src", "/Content/Images/NotPic.jpg");
     }
     $.messageBox5s('@Resource.Tip', data.message);
    }
   });
  }
  });
 }
 $(function() {
  $('#tt').tabs({
   justified: true,
   width: '100%',
   height: $(window).height() - 20
  });
  $('#tt').tabs({
   onSelect: function(title, index) {
    switch (index) {
     case RequestRule.Default:
      initDefault();
      break;
     case RequestRule.Subscriber:
      initSubscriber();
      break;
     case RequestRule.Text:
      initText();
      break;
     case RequestRule.Image:
      initImage();
      break;
     case RequestRule.Voice:
      initVoice();
      break;
    }
   }
  });
  //初始化第一个标签
  initDefault();

  //自动宽高
  $(window).resize(function() {
   $('#tt').tabs({
    height:$(window).height() - 20
   });
   //$('#List2').datagrid('resize', {
   // width: SetGridWidthSub(40),
   // height: SetGridHeightSub(100)
   //});

  });
 });
 $(function () {
  $('input.textbox').validatebox().bind('blur', function () {
   $(this).validatebox('enableValidation').validatebox('validate');
  });
 })
</script>
<form id="form" method="post">
 <input type="hidden" id="Id" name="Id" />
 <input type="hidden" id="MessageRule" name="MessageRule" />
 <input type="hidden" id="Category" name="Category" />
 <input type="hidden" id="MatchKey" name="MatchKey" />
 <input type="hidden" id="TextContent" name="TextContent" />
 <input type="hidden" id="ImgTextContext" name="ImgTextContext" />
 <input type="hidden" id="ImgTextUrl" name="ImgTextUrl" />
 <input type="hidden" id="ImgTextLink" name="ImgTextLink" />
 <input type="hidden" id="MeidaUrl" name="MeidaUrl" />
 <input type="hidden" id="MeidaLink" name="MeidaLink" />
 <input type="hidden" id="Remark" name="Remark" />
 <input type="hidden" id="Sort" name="Sort" value="0" />
 <input type="hidden" id="CreateTime" name="CreateTime" />
 <input type="hidden" id="CreateBy" name="CreateBy" />
 <input type="hidden" id="ModifyTime" name="ModifyTime" />
 <input type="hidden" id="ModifyBy" name="ModifyBy" />
</form>
<div style="padding:10px;">
  <div id="tt" class="easyui-tabs">
   <div title="默认回复">
    <table class="formtable" style="height:45px; line-height:45px; width:100%; border-bottom:1px solid #e7eaec">
     <tr>
      <td style="width:100px;">
       文本: @Html.SwitchButtonByEdit("swText0", false)
      </td>
      <td style="width:100px;">
       图文: @Html.SwitchButtonByEdit("swImage0", false)
      </td>
      <td style="width:100px;">
       语音: @Html.SwitchButtonByEdit("swVoice0", false)
      </td>
      <td></td>
      <td style="width:300px;">
        <div class="color-green">当前操作公众号:<span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span></div>
      </td>
     </tr>
    </table>
    <div id="div01" class="displaynone">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava01", "fa fa-plus", "提交保存", ref perm, "Edit", false)
     </div>
     <textarea id="Text0" style="width: 300px;height: 330px; margin:20px;"></textarea>
     </div>
    <div id="div02" class="displaynone">
     <div class="mvctool bgb">
      @Html.ToolButton("btnCreate02", "fa fa-search", "添加回复", ref perm, "Edit", false)
     </div>
     <div id="modalwindow0" class="easyui-window" style="width:600px; height:550px;" data-options="modal:true,closed: true,minimizable:false,shadow:false">
      <div class="mvctool bgb">
       @Html.ToolButton("btnSava02", "fa fa-search", "提交保存", ref perm, "Edit", false)
      </div>
      <table class="formtablenormal">
       <tr><th>标题: </th><td><input type="text" id="ImageTitle0" class="textbox" data-options="required:true" /></td></tr>
       <tr>
        <th>图片: </th>
        <td>
         <form id="form02" method="post">
          <input type="hidden" name="ImageUrl0" id="ImageUrl0" />
          <img class="expic" src="/Content/Images/NotPic.jpg" />
          <br />
          <a href="javascript:$('#FileUpload02').trigger('click');" class="files">@Resource.Browse</a>
          <input type="file" id="FileUpload02" class="displaynone" name="FileUpload02" onchange="Upload('SingleFile', 'ImageUrl0', 'FileUpload02', '1', '1', '#form02');" />
          <span class="uploading">@Resource.Uploading</span>
         </form>
       </tr>
       <tr><th>内容: </th><td><textarea id="ImageContent0" style="width: 300px; height: 100px;"></textarea></td></tr>
       <tr><th>链接: </th><td><input type="text" id="ImageLink0" /></td></tr>
       <tr><th>排序: </th><td><input type="number" id="Sort0" value="0" /></td></tr>
      </table>

     </div>
     <div style="padding:10px;">
      <table id="List0"></table>
     </div>
    </div>

    <div id="div03" class="displaynone">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava03", "fa fa-plus", "提交保存", ref perm, "Edit", false)
     </div>
        <table class="formtablenormal" style="margin:20px;">
         <tr><th>标题: </th><td><input type="text" id="VoiceTitle0" /></td></tr>
         <tr><th>语音: </th><td>
               <form id="form03" method="post">
                <input type="text" name="VoiceUrl0" class="left" id="VoiceUrl0" />
                <a href="javascript:$('#FileUpload03').trigger('click');" class="files">@Resource.Browse</a>
                <input type="file" accept="audio/mpeg" id="FileUpload03" class="displaynone" name="FileUpload03" onchange="Upload('SingleFile', 'VoiceUrl0', 'FileUpload03', '', '', '#form03');" />
                <span class="uploading">@Resource.Uploading</span>
               </form>
          </td></tr>
         <tr><th>描述: </th><td><textarea id="VoiceContent0" style="width:335px; height:300px;"></textarea></td></tr>
        </table>
     </div>
   </div>
   <div title="关注时回复" >
    <table class="formtable" style="height:45px; line-height:45px; width:100%; border-bottom:1px solid #e7eaec">
     <tr>
      <td style="width:100px;">
       文本: @Html.SwitchButtonByEdit("swText1", false)
      </td>
      <td style="width:100px;">
       图文: @Html.SwitchButtonByEdit("swImage1", false)
      </td>
      <td style="width:100px;">
       语音: @Html.SwitchButtonByEdit("swVoice1", false)
      </td>
      <td></td>
      <td style="width:300px;">
       <div class="color-green">当前操作公众号:<span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span></div>
      </td>
     </tr>
    </table>
    <div id="div11" class="displaynone">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava11", "fa fa-plus", "提交保存", ref perm, "Edit", false)
     </div>
     <textarea id="Text1" style="width: 300px;height: 330px; margin:20px;"></textarea>
    </div>
    <div id="div12" class="displaynone">
     <div class="mvctool bgb">
      @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)
     </div>
     <div id="modalwindow1" class="easyui-window" style="width:600px; height:550px;" data-options="modal:true,closed: true,minimizable:false,shadow:false">
      <div class="mvctool bgb">
       @Html.ToolButton("btnSava12", "fa fa-search", "提交保存", ref perm, "Edit", false)

      </div>
      <table class="formtablenormal">
       <tr><th>标题: </th><td><input type="text" id="ImageTitle1" class="textbox" data-options="required:true" /></td></tr>
       <tr>
        <th>图片: </th>
        <td>
         <form id="form12" method="post">
          <input type="hidden" name="ImageUrl1" id="ImageUrl1" />
          <img class="expic" src="/Content/Images/NotPic.jpg" />
          <br />
          <a href="javascript:$('#FileUpload12').trigger('click');" class="files">@Resource.Browse</a>
          <input type="file" id="FileUpload12" class="displaynone" name="FileUpload12" onchange="Upload('SingleFile', 'ImageUrl1', 'FileUpload12', '1', '1', '#form12');" />
          <span class="uploading">@Resource.Uploading</span>
         </form>
       </tr>
       <tr><th>内容: </th><td><textarea id="ImageContent1" style="width: 300px; height: 100px;"></textarea></td></tr>
       <tr><th>链接: </th><td><input type="text" id="ImageLink1" /></td></tr>
       <tr><th>排序: </th><td><input type="number" id="Sort1" value="0" /></td></tr>
      </table>

     </div>
     <div style="padding:10px;">
      <table id="List1"></table>
     </div>
    </div>

    <div id="div13" class="displaynone">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava13", "fa fa-plus", "提交保存", ref perm, "Edit", false)
     </div>
     <table class="formtablenormal" style="margin:20px;">
      <tr><th>标题: </th><td><input type="text" id="VoiceTitle1" /></td></tr>
      <tr>
       <th>语音: </th>
       <td>
        <form id="form13" method="post">
         <input type="text" name="VoiceUrl1" class="left" id="VoiceUrl0" />
         <a href="javascript:$('#FileUpload13').trigger('click');" class="files">@Resource.Browse</a>
         <input type="file" accept="audio/mpeg" id="FileUpload13" class="displaynone" name="FileUpload13" onchange="Upload('SingleFile', 'VoiceUrl1', 'FileUpload13', '', '', '#form13');" />
         <span class="uploading">@Resource.Uploading</span>
        </form>
       </td>
      </tr>
      <tr><th>描述: </th><td><textarea id="VoiceContent1" style="width:335px; height:300px;"></textarea></td></tr>
     </table>
    </div>
   </div>

   <div title="文本回复" style="padding:10px">
    <div class="mvctool ">
     @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)
     <div class="rightdiv color-green">
      当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
     </div>
    </div>
    <div id="modalwindow2"
      class="easyui-window"
      style="width:600px; height:500px;" data-options="modal:true,closed: true,minimizable:false,shadow:false">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava2", "fa fa-search", "提交保存", ref perm, "Edit", false)
      <div class="rightdiv color-green">
       当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
      </div>
     </div>
     <table class="formtablenormal">
      <tr>
       <th>关键字: </th>
       <td>
        <input type="text" id="TextMatchKey2" />
       </td>
      </tr>
      <tr>
       <th>规则: </th>
       <td>
        @Html.SwitchButtonByEdit("swMessageRule2", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")
       </td>
      </tr>
      <tr>
       <th>内容: </th>
       <td>
        <textarea id="Text2" style="width: 280px;height:200px"></textarea>
       </td>
      </tr>
     </table>
    </div>
    <table id="List2"></table>

   </div>

   <div title="图片回复" style="padding:10px">
    <div class="mvctool">
     @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)
     <div class="rightdiv color-green">
      当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
     </div>
    </div>
    <div id="modalwindow3" class="easyui-window" style="width:600px; height:550px;" data-options="modal:true,closed: true,minimizable:false,shadow:false">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava3", "fa fa-search", "提交保存", ref perm, "Edit", false)
      <div class="rightdiv color-green">
       当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
      </div>
     </div>
     <table class="formtablenormal">
      <tr><th>标题: </th><td><input type="text" id="ImageTitle3" /></td></tr>
      <tr>
       <th>关键字: </th>
       <td>
        <input type="text" id="TextMatchKey3" />
       </td>
      </tr>
      <tr>
       <th>规则: </th>
       <td>
        @Html.SwitchButtonByEdit("swMessageRule3", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")
       </td>
      </tr>
      <tr>
       <th>图片: </th>
       <td>
        <form id="form3" method="post">
         <input type="hidden" name="ImageUrl3" id="ImageUrl3" />
         <img class="expic" src="/Content/Images/NotPic.jpg" />
         <br />
         <a href="javascript:$('#FileUpload3').trigger('click');" class="files">@Resource.Browse</a>
         <input type="file" id="FileUpload3" class="displaynone" name="FileUpload3" onchange="Upload('SingleFile', 'ImageUrl3', 'FileUpload3', '1', '1', '#form3');" />
         <span class="uploading">@Resource.Uploading</span>
        </form>
       </td>
      </tr>
      <tr><th>内容: </th><td><textarea id="ImageContent3" style="width: 300px; height: 80px;"></textarea></td></tr>
      <tr><th>链接: </th><td><input type="text" id="ImageLink3" /></td></tr>
      <tr><th>排序: </th><td><input type="number" id="Sort3" value="0" /></td></tr>
     </table>

    </div>
    <table><tr><td><table id="List31"></table></td><td> </td><td><table id="List3"></table></td></tr></table>

   </div>

   <div title="语音回复" style="padding:10px">
    <div class="mvctool ">
     @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)
     <div class="rightdiv color-green">
      当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
     </div>
    </div>
    <div id="modalwindow4"
      class="easyui-window"
      style="width:600px; height:500px;" data-options="modal:true,closed: true,minimizable:false,shadow:false">
     <div class="mvctool bgb">
      @Html.ToolButton("btnSava4", "fa fa-search", "提交保存", ref perm, "Edit", false)
      <div class="rightdiv color-green">
       当前操作公众号: <span id="CurrentOfficalAccount">@ViewBag.CurrentOfficalAcount</span>
      </div>
     </div>
     <table class="formtablenormal">
      <tr><th>标题: </th><td><input type="text" id="VoiceTitle4" /></td></tr>
      <tr>
       <th>关键字: </th>
       <td>
        <input type="text" id="TextMatchKey4" />
       </td>
      </tr>
      <tr>
       <th>规则: </th>
       <td>
        @Html.SwitchButtonByEdit("swMessageRule4", true, "模糊匹配(关键字包含内容) ", "完全匹配(内容与关键字完全匹配)", "280")
       </td>
      </tr>
      <tr>
       <th>语音: </th>
       <td>
        <form id="form4" method="post">
         <input type="text" class="left" name="VoiceUrl4" id="VoiceUrl4" />
         <a href="javascript:$('#FileUpload4').trigger('click');" class="files">@Resource.Browse</a>
         <input type="file" id="FileUpload4" accept="audio/mpeg" class="displaynone" name="FileUpload4" onchange="Upload('SingleFile', 'VoiceUrl4', 'FileUpload4', '', '', '#form4');" />
         <span class="uploading">@Resource.Uploading</span>
        </form>

       </td>
      </tr>
      <tr><th>描述: </th><td><textarea id="VoiceContent4" style="width: 300px; height: 100px;"></textarea></td></tr>

     </table>

    </div>
    <table id="List4"></table>
   </div>
   @*<div title="视频回复"
     style="padding:10px">
   </div>*@
   @*<div title="链接回复"
     styIe="padding:10px">
   </div>
   <div title="LBS位置回复"
     style="padding:10px">
   </div>*@
  </div>
 </div>

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

总结

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

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

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

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

本文已被整理到了《ASP.NET微信开发教程汇总》,欢迎大家学习阅读。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET MVC自定义错误页面真的简单吗?

    如果你在设置asp.net mvc自定义错误页面时遇到问题,这并不止你一个人.惊讶之余你的做法是正确的,没有起到作用的原因是其一部分错误是由asp.net管道处理的,另一部分是由iis直接处理. 通常情况 (我期望是这种情况,在一些其他框架/服务器上) 我们只需要在一个地方配置自定义错误页就可以了,无论怎么哪儿引发的错误.就像这样︰ <customErrors mode="On"> <error code="404" path="404.

  • ASP.NET Core MVC 配置全局路由前缀

    ASP.NET Core MVC 配置全局路由前缀 前言 大家好,今天给大家介绍一个 ASP.NET Core MVC 的一个新特性,给全局路由添加统一前缀.严格说其实不算是新特性,不过是Core MVC特有的. 应用背景 不知道大家在做 Web Api 应用程序的时候,有没有遇到过这种场景,就是所有的接口都是以 /api 开头的,也就是我们的api 接口请求地址是像这样的: http://www.example.com/api/order/333 或者是这样的需求 http://www.exa

  • ASP.NET MVC5+EF6+EasyUI后台管理系统 微信公众平台开发之资源环境准备

    前言: 本次将学习扩展企业微信公众号功能,微信公众号也是企业流量及品牌推广的主要途径,所谓工欲善其事必先利其器,调试微信必须把程序发布外网环境,导致调试速度太慢,太麻烦! 我们需要准备妥当才能进入开发,为后续快速开发作准备 什么是内网穿透? 意在外部网络通过域名可以访问本地IIS站点! 软件环境: Windows10+IIS10 (把本地站点配置到IIS10做为备用,发布站点不作为教程) 知识点:花生壳(主要)ngrok开始: 首先发布站点到IIS,我这里发布站点到本地IIS,并绑定端口为:80

  • asp.net如何进行mvc异步查询

    查询是项目中必不可少的工作,而且不同的项目不同的团队,都有自己的简单方法.Asp.net mvc 有自己独特的优势,下面是结合mvc实现一个产品列表的Demo. 问题描述 对于一些列表页面,保持一致的查询代码. 解决方案 1.依赖文件jquery.js.jquery.unobtrusive-ajax.js. 2.创建部分视图,PartialView主要存放服务器发送过来的数据. 3.一个包含集合数据的viewmodel. 部分视图代码基本如下: asp.net怎样进行mvc异步查询? 问题讨论

  • 详解ASP.NET MVC的筛选器

    在ActionInvoker对Action的执行过程中,除了通过利用ActionDescriptor对Action方法的执行,以及之前进行的Model绑定与验证之外,还具有一个重要的工作,那就是对相关筛选器(Filter)的执行.ASP.NET MVC的筛选器是一种基于AOP(面向方面编程)的设计,我们将一些非业务的逻辑实现在相应的筛选器中,然后以一种横切(Crosscutting)的方式应用到对应的Action方法.当Action方法执行前后,这些筛选器会自动执行.ASP.NET MVC提供了

  • ASP.NET MVC 微信JS-SDK认证

    ASP.NET MVC微信JS-SDK认证,具体内容: 写在前面 前阵子因为有个项目需要做微信自定义分享功能,因而去研究了下微信JS-SDK相关知识. 此文做个简单的记(tu)录(cao)... 开始 所有的东西都从文档开始:微信JSSDK说明文档 项目需要用到的是分享接口不过使用微信JS-SDK之前,需要做JS接口认证. 认证如下: 步骤一:绑定域名 步骤二:引入JS文件 步骤三:通过config接口注入权限验证配置 步骤四:通过ready接口处理成功验证 步骤五:通过error接口处理失败验

  • Asp.net MVC中获取控制器的名称的方法

    1.视图中 string controller = ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"].ToString(); string controller = ViewContext.RouteData.Values["controller"].ToString(); 2.控制器的action中 string controller = RouteData.Ro

  • ASP.NET MVC阿里大于短信接口开发短信群发能

    互联网上有许多公司提供短信接口服务,诸如网易云信.阿里大于等等.我在自己项目里需要使用到短信服务起到通知作用,实际开发周期三天,完成配置.开发和使用,总的说,阿里大于提供的接口易于开发,非常的方便,短信费用是计数缴纳的,作为个人开发者,我使用的服务业务产生的费用为0.045¥/条(10万条以下). 现在要实现一个例会短信群发通知的功能,所有被通知对象信息均存于Mysql中,应用架构采用asp.net MVC .首先准备好获取的API各项(以下各项服务参数都需要在大于官网上申请), 申请好自己的短

  • asp.net mvc4中bootstrap datetimepicker控件的使用

    前段时间写了一篇关于调用阿里大于的短信接口来开发例会短信群发通知功能的文章http://www.jb51.net/article/94142.htm,其中的例会时间是需求中的重中之重,它需要满足"格式化","易输入"这两点,对短信费用关心的开发者要知道长短信是两条短信费用之和,因此,例会时间不能随意交给用户自定义输入:要考虑到"易输入"这点,只能选择日期选择控件来辅助用户输入,由于日期选择控件较为小巧使用,在页面中引入并不是难事.在本篇文章中,使

  • ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)

    上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录.验证和注销功能. 一.业务逻辑层1.实现256散列加密方法. Ninesky.Core[右键]-> 添加->文件夹,输入文件夹名General. General文件夹[右键]->添加->类,输入类名Security. 引用System.Security.Cryptography命名空间(1),并实现SHA256静态加密方法. 2.Administrator模型类 Ninesky.Core[右键]-

  • ASP.NET MVC实现多个按钮提交的方法

    有时候会遇到这种情况:在一个表单上需要多个按钮来完成不同的功能,比如一个简单的审批功能. 如果是用webform那不需要讨论,但asp.net mvc中一个表单只能提交到一个Action处理,相对比较麻烦点. 方法一:使用客户端脚本 比如我们在View中这样写: <inputtype="submit"value="审核通过"onclick='this.form.action="<%=Url.Action("Action1")

  • ASP.NET MVC中URL地址传参的两种写法

    一.url地址传参的第一种写法 1.通过mvc中默认的url地址书写格式:控制器/方法名/参数 2.实例:http://localhost:39270/RequestDemo/Index/88,默认参数名为id所以名称为id. 如果使用其他名称,后台是无法读取的会报错 二.url地址传参的第二种写法 1.使用?加参数名=参数值的写法,如果有多个参数使用&来连接 http://localhost:39270/RequestDemo/Index?id=88&name=%E5%BC%A0%E4%

  • Asp.NET MVC中使用SignalR实现推送功能

    一.简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重新发送请求或使用轮询技术来获取消息. 可访问其官方网站:https://github.com/SignalR/ 获取更多资讯. 二.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(lo

随机推荐