mirror of
https://github.com/anjoy8/Blog.Core.git
synced 2024-09-20 23:48:27 +08:00
添加动态linq查询
添加微信管理
This commit is contained in:
parent
26ba3b2afb
commit
98068d795c
File diff suppressed because it is too large
Load Diff
|
@ -823,6 +823,307 @@
|
|||
通过此处的key格式为 xx:xx:x
|
||||
</summary>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Controllers.WeChatCompanyController">
|
||||
<summary>
|
||||
WeChatCompanyController
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.#ctor(Blog.Core.IServices.IWeChatCompanyServices)">
|
||||
<summary>
|
||||
构造函数
|
||||
</summary>
|
||||
<param name="iWeChatCompanyServices"></param>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.Get(Blog.Core.Model.PaginationModel)">
|
||||
<summary>
|
||||
获取
|
||||
</summary>
|
||||
<param name="pagination">分页条件</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.Get(System.String)">
|
||||
<summary>
|
||||
获取(id)
|
||||
</summary>
|
||||
<param name="id">主键ID</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.Post(Blog.Core.Model.Models.WeChatCompany)">
|
||||
<summary>
|
||||
添加
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.Put(Blog.Core.Model.Models.WeChatCompany)">
|
||||
<summary>
|
||||
更新
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.Delete(System.String)">
|
||||
<summary>
|
||||
删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatCompanyController.BatchDelete(System.String)">
|
||||
<summary>
|
||||
批量删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Controllers.WeChatConfigController">
|
||||
<summary>
|
||||
WeChatConfigController
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.#ctor(Blog.Core.IServices.IWeChatConfigServices)">
|
||||
<summary>
|
||||
构造函数
|
||||
</summary>
|
||||
<param name="iWeChatConfigServices"></param>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.Get(Blog.Core.Model.PaginationModel)">
|
||||
<summary>
|
||||
获取
|
||||
</summary>
|
||||
<param name="pagination">分页条件</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.Get(System.String)">
|
||||
<summary>
|
||||
获取(id)
|
||||
</summary>
|
||||
<param name="id">主键ID</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.Post(Blog.Core.Model.Models.WeChatConfig)">
|
||||
<summary>
|
||||
添加
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.Put(Blog.Core.Model.Models.WeChatConfig)">
|
||||
<summary>
|
||||
更新
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.Delete(System.String)">
|
||||
<summary>
|
||||
删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatConfigController.BatchDelete(System.String)">
|
||||
<summary>
|
||||
批量删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Controllers.WeChatController">
|
||||
<summary>
|
||||
微信公众号管理
|
||||
作者:胡丁文
|
||||
时间:2020-3-29 21:24:12
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.#ctor(Blog.Core.IServices.IWeChatConfigServices,Microsoft.Extensions.Logging.ILogger{Blog.Core.Controllers.WeChatController})">
|
||||
<summary>
|
||||
构造函数
|
||||
</summary>
|
||||
<param name="weChatConfigServices"></param>
|
||||
<param name="logger"></param>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetToken(System.String)">
|
||||
<summary>
|
||||
更新Token
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.RefreshToken(System.String)">
|
||||
<summary>
|
||||
刷新Token
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetTemplate(System.String)">
|
||||
<summary>
|
||||
获取模板
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetMenu(System.String)">
|
||||
<summary>
|
||||
获取菜单
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.UpdateMenu(Blog.Core.Model.ViewModels.WeChatApiDto)">
|
||||
<summary>
|
||||
更新菜单
|
||||
</summary>
|
||||
<param name="menu"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetSubUsers(System.String)">
|
||||
<summary>
|
||||
获取订阅用户(所有)
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.Valid(Blog.Core.Model.ViewModels.WeChatValidDto)">
|
||||
<summary>
|
||||
入口
|
||||
</summary>
|
||||
<param name="validDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetSubUser(System.String,System.String)">
|
||||
<summary>
|
||||
获取订阅用户
|
||||
</summary>
|
||||
<param name="id"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetQRBind(Blog.Core.Model.ViewModels.WeChatUserInfo)">
|
||||
<summary>
|
||||
获取一个绑定员工公众号二维码
|
||||
</summary>
|
||||
<param name="info">消息</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.PushCardMsg(Blog.Core.Model.ViewModels.WeChatCardMsgDataDto)">
|
||||
<summary>
|
||||
推送卡片消息接口
|
||||
</summary>
|
||||
<param name="msg">卡片消息对象</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.PushTxtMsg(Blog.Core.Model.ViewModels.WeChatPushTestDto)">
|
||||
<summary>
|
||||
推送文本消息
|
||||
</summary>
|
||||
<param name="msg">消息对象</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.GetBindUserInfo(Blog.Core.Model.ViewModels.WeChatUserInfo)">
|
||||
<summary>
|
||||
通过绑定用户获取微信用户信息(一般用于初次绑定检测)
|
||||
</summary>
|
||||
<param name="info">信息</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatController.UnBind(Blog.Core.Model.ViewModels.WeChatUserInfo)">
|
||||
<summary>
|
||||
用户解绑
|
||||
</summary>
|
||||
<param name="info">消息</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Controllers.WeChatPushLogController">
|
||||
<summary>
|
||||
WeChatPushLogController
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.#ctor(Blog.Core.IServices.IWeChatPushLogServices)">
|
||||
<summary>
|
||||
构造函数
|
||||
</summary>
|
||||
<param name="iWeChatPushLogServices"></param>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.Get(Blog.Core.Model.PaginationModel)">
|
||||
<summary>
|
||||
获取
|
||||
</summary>
|
||||
<param name="pagination">分页条件</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.Get(System.String)">
|
||||
<summary>
|
||||
获取(id)
|
||||
</summary>
|
||||
<param name="id">主键ID</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.Post(Blog.Core.Model.Models.WeChatPushLog)">
|
||||
<summary>
|
||||
添加
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.Put(Blog.Core.Model.Models.WeChatPushLog)">
|
||||
<summary>
|
||||
更新
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.Delete(System.String)">
|
||||
<summary>
|
||||
删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatPushLogController.BatchDelete(System.String)">
|
||||
<summary>
|
||||
批量删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Controllers.WeChatSubController">
|
||||
<summary>
|
||||
WeChatSubController
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.#ctor(Blog.Core.IServices.IWeChatSubServices)">
|
||||
<summary>
|
||||
构造函数
|
||||
</summary>
|
||||
<param name="iWeChatSubServices"></param>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.Get(Blog.Core.Model.PaginationModel)">
|
||||
<summary>
|
||||
获取
|
||||
</summary>
|
||||
<param name="pagination">分页条件</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.Get(System.String)">
|
||||
<summary>
|
||||
获取(id)
|
||||
</summary>
|
||||
<param name="id">主键ID</param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.Post(Blog.Core.Model.Models.WeChatSub)">
|
||||
<summary>
|
||||
添加
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.Put(Blog.Core.Model.Models.WeChatSub)">
|
||||
<summary>
|
||||
更新
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.Delete(System.String)">
|
||||
<summary>
|
||||
删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:Blog.Core.Controllers.WeChatSubController.BatchDelete(System.String)">
|
||||
<summary>
|
||||
批量删除
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:Blog.Core.Api.Controllers.NacosController">
|
||||
<summary>
|
||||
服务管理
|
||||
|
|
|
@ -254,9 +254,10 @@ namespace Blog.Core.Controllers
|
|||
foreach (var item in assignView.pids)
|
||||
{
|
||||
var rmpitem = roleModulePermissions.Where(d => d.PermissionId == item);
|
||||
var moduleid = (await _permissionServices.Query(p => p.Id == item)).FirstOrDefault()?.Mid;
|
||||
if (!rmpitem.Any())
|
||||
{
|
||||
var moduleid = (await _permissionServices.Query(p => p.Id == item)).FirstOrDefault()?.Mid;
|
||||
|
||||
RoleModulePermission roleModulePermission = new RoleModulePermission()
|
||||
{
|
||||
IsDeleted = false,
|
||||
|
@ -272,6 +273,17 @@ namespace Blog.Core.Controllers
|
|||
data.success &= (await _roleModulePermissionServices.Add(roleModulePermission)) > 0;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var role in rmpitem)
|
||||
{
|
||||
if (!role.ModuleId.Equals(moduleid))
|
||||
{
|
||||
role.ModuleId = moduleid.Value;
|
||||
await _roleModulePermissionServices.Update(role, new List<string> { "ModuleId" });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (data.success)
|
||||
|
@ -373,6 +385,7 @@ namespace Blog.Core.Controllers
|
|||
if (pids.Any())
|
||||
{
|
||||
var rolePermissionMoudles = (await _permissionServices.Query(d => pids.Contains(d.Id))).OrderBy(c => c.OrderSort);
|
||||
var temp = rolePermissionMoudles.ToList().Find(t => t.Id == 87);
|
||||
var permissionTrees = (from child in rolePermissionMoudles
|
||||
where child.IsDeleted == false
|
||||
orderby child.Id
|
||||
|
@ -410,7 +423,6 @@ namespace Blog.Core.Controllers
|
|||
};
|
||||
|
||||
permissionTrees = permissionTrees.OrderBy(d => d.order).ToList();
|
||||
|
||||
RecursionHelper.LoopNaviBarAppendChildren(permissionTrees, rootRoot);
|
||||
|
||||
data.success = true;
|
||||
|
|
94
Blog.Core.Api/Controllers/WeChatCompanyController.cs
Normal file
94
Blog.Core.Api/Controllers/WeChatCompanyController.cs
Normal file
|
@ -0,0 +1,94 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Blog.Core.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatCompanyController
|
||||
/// </summary>
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
[Authorize(Permissions.Name)]
|
||||
public partial class WeChatCompanyController : Controller
|
||||
{
|
||||
readonly IWeChatCompanyServices _WeChatCompanyServices;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="iWeChatCompanyServices"></param>
|
||||
public WeChatCompanyController(IWeChatCompanyServices iWeChatCompanyServices)
|
||||
{
|
||||
_WeChatCompanyServices = iWeChatCompanyServices;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取
|
||||
/// </summary>
|
||||
/// <param name="pagination">分页条件</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<PageModel<WeChatCompany>>> Get([FromQuery] PaginationModel pagination)
|
||||
{
|
||||
var data = await _WeChatCompanyServices.QueryPage(pagination);
|
||||
return new MessageModel<PageModel<WeChatCompany>> { success = true, response = data};
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取(id)
|
||||
/// </summary>
|
||||
/// <param name="id">主键ID</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{id}")]
|
||||
public async Task<MessageModel<WeChatCompany>> Get(string id)
|
||||
{
|
||||
var data = await _WeChatCompanyServices.QueryById(id);
|
||||
return new MessageModel<WeChatCompany> { success = true, response = data };
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<MessageModel<string>> Post([FromBody] WeChatCompany obj)
|
||||
{
|
||||
await _WeChatCompanyServices.Add(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<MessageModel<string>> Put([FromBody] WeChatCompany obj)
|
||||
{
|
||||
await _WeChatCompanyServices.Update(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> Delete(string id)
|
||||
{
|
||||
await _WeChatCompanyServices.DeleteById(id);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> BatchDelete(string ids)
|
||||
{
|
||||
var i = ids.Split(",");
|
||||
await _WeChatCompanyServices.DeleteByIds(i);
|
||||
return new MessageModel<string> { success = true };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
94
Blog.Core.Api/Controllers/WeChatConfigController.cs
Normal file
94
Blog.Core.Api/Controllers/WeChatConfigController.cs
Normal file
|
@ -0,0 +1,94 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Blog.Core.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatConfigController
|
||||
/// </summary>
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
[Authorize(Permissions.Name)]
|
||||
public partial class WeChatConfigController : Controller
|
||||
{
|
||||
readonly IWeChatConfigServices _WeChatConfigServices;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="iWeChatConfigServices"></param>
|
||||
public WeChatConfigController(IWeChatConfigServices iWeChatConfigServices)
|
||||
{
|
||||
_WeChatConfigServices = iWeChatConfigServices;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取
|
||||
/// </summary>
|
||||
/// <param name="pagination">分页条件</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<PageModel<WeChatConfig>>> Get([FromQuery] PaginationModel pagination)
|
||||
{
|
||||
var data = await _WeChatConfigServices.QueryPage(pagination);
|
||||
return new MessageModel<PageModel<WeChatConfig>> { success = true, response = data};
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取(id)
|
||||
/// </summary>
|
||||
/// <param name="id">主键ID</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{id}")]
|
||||
public async Task<MessageModel<WeChatConfig>> Get(string id)
|
||||
{
|
||||
var data = await _WeChatConfigServices.QueryById(id);
|
||||
return new MessageModel<WeChatConfig> { success = true, response = data };
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<MessageModel<string>> Post([FromBody] WeChatConfig obj)
|
||||
{
|
||||
await _WeChatConfigServices.Add(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<MessageModel<string>> Put([FromBody] WeChatConfig obj)
|
||||
{
|
||||
await _WeChatConfigServices.Update(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> Delete(string id)
|
||||
{
|
||||
await _WeChatConfigServices.DeleteById(id);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> BatchDelete(string ids)
|
||||
{
|
||||
var i = ids.Split(",");
|
||||
await _WeChatConfigServices.DeleteByIds(i);
|
||||
return new MessageModel<string> { success = true };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
187
Blog.Core.Api/Controllers/WeChatController.cs
Normal file
187
Blog.Core.Api/Controllers/WeChatController.cs
Normal file
|
@ -0,0 +1,187 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Blog.Core.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号管理
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-3-29 21:24:12
|
||||
/// </summary>
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
[Authorize(Permissions.Name)]
|
||||
public partial class WeChatController : Controller
|
||||
{
|
||||
readonly IWeChatConfigServices _weChatConfigServices;
|
||||
readonly ILogger<WeChatController> _logger;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="weChatConfigServices"></param>
|
||||
/// <param name="logger"></param>
|
||||
public WeChatController(IWeChatConfigServices weChatConfigServices, ILogger<WeChatController> logger)
|
||||
{
|
||||
_weChatConfigServices = weChatConfigServices;
|
||||
_logger = logger;
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新Token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<WeChatApiDto>> GetToken(string id)
|
||||
{
|
||||
return await _weChatConfigServices.GetToken(id);
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 刷新Token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<WeChatApiDto>> RefreshToken(string id)
|
||||
{
|
||||
return await _weChatConfigServices.RefreshToken(id);
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取模板
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<WeChatApiDto>> GetTemplate(string id)
|
||||
{
|
||||
return await _weChatConfigServices.GetTemplate(id);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取菜单
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<WeChatApiDto>> GetMenu(string id)
|
||||
{
|
||||
return await _weChatConfigServices.GetMenu(id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新菜单
|
||||
/// </summary>
|
||||
/// <param name="menu"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<MessageModel<WeChatApiDto>> UpdateMenu(WeChatApiDto menu)
|
||||
{
|
||||
return await _weChatConfigServices.UpdateMenu(menu);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取订阅用户(所有)
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<WeChatApiDto>> GetSubUsers(string id)
|
||||
{
|
||||
return await _weChatConfigServices.GetSubUsers(id);
|
||||
}
|
||||
/// <summary>
|
||||
/// 入口
|
||||
/// </summary>
|
||||
/// <param name="validDto"></param>
|
||||
/// <returns></returns>
|
||||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
[HttpGet]
|
||||
public async Task<string> Valid([FromQuery] WeChatValidDto validDto)
|
||||
{
|
||||
using (var reader = new StreamReader(Request.Body))
|
||||
{
|
||||
var body = await reader.ReadToEndAsync();
|
||||
return await _weChatConfigServices.Valid(validDto, body);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取订阅用户
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatApiDto>> GetSubUser(string id,string openid)
|
||||
{
|
||||
return await _weChatConfigServices.GetSubUser(id,openid);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取一个绑定员工公众号二维码
|
||||
/// </summary>
|
||||
/// <param name="info">消息</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> GetQRBind([FromQuery]WeChatUserInfo info)
|
||||
{
|
||||
return await _weChatConfigServices.GetQRBind(info);
|
||||
}
|
||||
/// <summary>
|
||||
/// 推送卡片消息接口
|
||||
/// </summary>
|
||||
/// <param name="msg">卡片消息对象</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> PushCardMsg(WeChatCardMsgDataDto msg)
|
||||
{
|
||||
string pushUserIP = $"{Request.HttpContext.Connection.RemoteIpAddress}:{Request.HttpContext.Connection.RemotePort}";
|
||||
return await _weChatConfigServices.PushCardMsg(msg, pushUserIP);
|
||||
}
|
||||
/// <summary>
|
||||
/// 推送文本消息
|
||||
/// </summary>
|
||||
/// <param name="msg">消息对象</param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatApiDto>> PushTxtMsg([FromBody] WeChatPushTestDto msg)
|
||||
{
|
||||
return await _weChatConfigServices.PushTxtMsg(msg);
|
||||
}
|
||||
/// <summary>
|
||||
/// 通过绑定用户获取微信用户信息(一般用于初次绑定检测)
|
||||
/// </summary>
|
||||
/// <param name="info">信息</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> GetBindUserInfo([FromQuery]WeChatUserInfo info)
|
||||
{
|
||||
return await _weChatConfigServices.GetBindUserInfo(info);
|
||||
}
|
||||
/// <summary>
|
||||
/// 用户解绑
|
||||
/// </summary>
|
||||
/// <param name="info">消息</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
[AllowAnonymous]
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> UnBind([FromQuery]WeChatUserInfo info)
|
||||
{
|
||||
return await _weChatConfigServices.UnBind(info);
|
||||
}
|
||||
}
|
||||
}
|
94
Blog.Core.Api/Controllers/WeChatPushLogController.cs
Normal file
94
Blog.Core.Api/Controllers/WeChatPushLogController.cs
Normal file
|
@ -0,0 +1,94 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Blog.Core.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatPushLogController
|
||||
/// </summary>
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
[Authorize(Permissions.Name)]
|
||||
public partial class WeChatPushLogController : Controller
|
||||
{
|
||||
readonly IWeChatPushLogServices _WeChatPushLogServices;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="iWeChatPushLogServices"></param>
|
||||
public WeChatPushLogController(IWeChatPushLogServices iWeChatPushLogServices)
|
||||
{
|
||||
_WeChatPushLogServices = iWeChatPushLogServices;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取
|
||||
/// </summary>
|
||||
/// <param name="pagination">分页条件</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<PageModel<WeChatPushLog>>> Get([FromQuery] PaginationModel pagination)
|
||||
{
|
||||
var data = await _WeChatPushLogServices.QueryPage(pagination);
|
||||
return new MessageModel<PageModel<WeChatPushLog>> { success = true, response = data};
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取(id)
|
||||
/// </summary>
|
||||
/// <param name="id">主键ID</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{id}")]
|
||||
public async Task<MessageModel<WeChatPushLog>> Get(string id)
|
||||
{
|
||||
var data = await _WeChatPushLogServices.QueryById(id);
|
||||
return new MessageModel<WeChatPushLog> { success = true, response = data };
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<MessageModel<string>> Post([FromBody] WeChatPushLog obj)
|
||||
{
|
||||
await _WeChatPushLogServices.Add(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<MessageModel<string>> Put([FromBody] WeChatPushLog obj)
|
||||
{
|
||||
await _WeChatPushLogServices.Update(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> Delete(string id)
|
||||
{
|
||||
await _WeChatPushLogServices.DeleteById(id);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> BatchDelete(string ids)
|
||||
{
|
||||
var i = ids.Split(",");
|
||||
await _WeChatPushLogServices.DeleteByIds(i);
|
||||
return new MessageModel<string> { success = true };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
94
Blog.Core.Api/Controllers/WeChatSubController.cs
Normal file
94
Blog.Core.Api/Controllers/WeChatSubController.cs
Normal file
|
@ -0,0 +1,94 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Blog.Core.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatSubController
|
||||
/// </summary>
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ApiController]
|
||||
[Authorize(Permissions.Name)]
|
||||
public partial class WeChatSubController : Controller
|
||||
{
|
||||
readonly IWeChatSubServices _WeChatSubServices;
|
||||
/// <summary>
|
||||
/// 构造函数
|
||||
/// </summary>
|
||||
/// <param name="iWeChatSubServices"></param>
|
||||
public WeChatSubController(IWeChatSubServices iWeChatSubServices)
|
||||
{
|
||||
_WeChatSubServices = iWeChatSubServices;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取
|
||||
/// </summary>
|
||||
/// <param name="pagination">分页条件</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<MessageModel<PageModel<WeChatSub>>> Get([FromQuery] PaginationModel pagination)
|
||||
{
|
||||
var data = await _WeChatSubServices.QueryPage(pagination);
|
||||
return new MessageModel<PageModel<WeChatSub>> { success = true, response = data};
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取(id)
|
||||
/// </summary>
|
||||
/// <param name="id">主键ID</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("{id}")]
|
||||
public async Task<MessageModel<WeChatSub>> Get(string id)
|
||||
{
|
||||
var data = await _WeChatSubServices.QueryById(id);
|
||||
return new MessageModel<WeChatSub> { success = true, response = data };
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<MessageModel<string>> Post([FromBody] WeChatSub obj)
|
||||
{
|
||||
await _WeChatSubServices.Add(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 更新
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<MessageModel<string>> Put([FromBody] WeChatSub obj)
|
||||
{
|
||||
await _WeChatSubServices.Update(obj);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> Delete(string id)
|
||||
{
|
||||
await _WeChatSubServices.DeleteById(id);
|
||||
return new MessageModel<string> { success = true};
|
||||
}
|
||||
/// <summary>
|
||||
/// 批量删除
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpDelete]
|
||||
public async Task<MessageModel<string>> BatchDelete(string ids)
|
||||
{
|
||||
var i = ids.Split(",");
|
||||
await _WeChatSubServices.DeleteByIds(i);
|
||||
return new MessageModel<string> { success = true };
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -13,7 +13,7 @@
|
|||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": ""
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:9291"
|
||||
},
|
||||
|
|
|
@ -107,7 +107,7 @@ namespace Blog.Core
|
|||
//{
|
||||
// options.JsonSerializerOptions.PropertyNamingPolicy = null;
|
||||
//})
|
||||
//全局配置Json序列化处理
|
||||
//MVC全局配置Json序列化处理
|
||||
.AddNewtonsoftJson(options =>
|
||||
{
|
||||
//忽略循环引用
|
||||
|
@ -115,7 +115,7 @@ namespace Blog.Core
|
|||
//不使用驼峰样式的key
|
||||
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
|
||||
//设置时间格式
|
||||
//options.SerializerSettings.DateFormatString = "yyyy-MM-dd";
|
||||
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
||||
//忽略Model中为null的属性
|
||||
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
||||
//设置本地时间而非UTC时间
|
||||
|
|
3
Blog.Core.Api/appsettings.Development.json
Normal file
3
Blog.Core.Api/appsettings.Development.json
Normal file
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"urls": "http://*:9291", //web服务端口,如果用IIS部署,把这个去掉
|
||||
"urls": "http://*:8081", //web服务端口,如果用IIS部署,把这个去掉
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information", //加入Default否则log4net本地写入不了日志
|
||||
|
|
|
@ -1010,5 +1010,402 @@
|
|||
"ModifyBy": null,
|
||||
"ModifyTime": "\/Date(1546272000000+0800)\/",
|
||||
"Id": 46
|
||||
},
|
||||
|
||||
{
|
||||
"Id": "47",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信获取",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/get",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-22 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "48",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信客户批量删除",
|
||||
"LinkUrl": "\/api\/WeChatCompany\/BatchDelete",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "49",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信客户删除",
|
||||
"LinkUrl": "\/api\/WeChatCompany\/delete",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "50",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信客户获取",
|
||||
"LinkUrl": "\/api\/WeChatCompany\/get",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "51",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信客户添加",
|
||||
"LinkUrl": "\/api\/WeChatCompany\/post",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "52",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信客户更新",
|
||||
"LinkUrl": "\/api\/WeChatCompany\/put",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "53",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信公众号批量删除",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/BatchDelete",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-25 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "54",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信公众号获取",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/get",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-22 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "55",
|
||||
"IsDeleted": 0,
|
||||
"Name": "获取公众号菜单设置",
|
||||
"LinkUrl": "\/api\/WeChat\/GetMenu",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "56",
|
||||
"IsDeleted": 0,
|
||||
"Name": "获取订阅用户",
|
||||
"LinkUrl": "\/api\/WeChat\/GetSubUsers",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:20:30",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "57",
|
||||
"IsDeleted": 0,
|
||||
"Name": "获取消息模板列表",
|
||||
"LinkUrl": "\/api\/WeChat\/GetTemplate",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "58",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信公众号更新",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/post",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-24 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "59",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信公众号添加",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/put",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-24 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "60",
|
||||
"IsDeleted": 0,
|
||||
"Name": "刷新Token",
|
||||
"LinkUrl": "\/api\/WeChat\/RefreshToken",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-30 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "61",
|
||||
"IsDeleted": 0,
|
||||
"Name": "更新微信菜单设置",
|
||||
"LinkUrl": "\/api\/WeChat\/UpdateMenu",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "62",
|
||||
"IsDeleted": 0,
|
||||
"Name": "获取推送记录",
|
||||
"LinkUrl": "\/api\/WeChatPushLog\/get",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "63",
|
||||
"IsDeleted": 0,
|
||||
"Name": "获取绑定用户",
|
||||
"LinkUrl": "\/api\/WeChatSub\/get",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:20:47",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-23 00:00:00",
|
||||
"ParentId": 0
|
||||
},
|
||||
{
|
||||
"Id": "64",
|
||||
"IsDeleted": 0,
|
||||
"Name": "微信公众号删除",
|
||||
"LinkUrl": "\/api\/WeChatConfig\/delete",
|
||||
"Area": null,
|
||||
"Controller": null,
|
||||
"Action": null,
|
||||
"Icon": null,
|
||||
"Code": null,
|
||||
"OrderSort": 0,
|
||||
"Description": null,
|
||||
"IsMenu": 0,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-24 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"ParentId": 0
|
||||
}
|
||||
]
|
||||
|
|
Can't render this file because it contains an unexpected character in line 3 and column 5.
|
|
@ -1666,8 +1666,7 @@
|
|||
"IsDeleted": 0,
|
||||
"Id": 82,
|
||||
"IsHide": 0
|
||||
}
|
||||
,
|
||||
},
|
||||
{
|
||||
"Code": " ",
|
||||
"Name": "删除",
|
||||
|
@ -1751,5 +1750,599 @@
|
|||
"IsDeleted": 0,
|
||||
"Id": 86,
|
||||
"IsHide": 1
|
||||
},
|
||||
{
|
||||
"Id": 87,
|
||||
"Code": "-",
|
||||
"Name": "微信公众号管理",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 3,
|
||||
"Icon": "fa-weixin",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-21 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-13 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 0,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 88,
|
||||
"Code": "\/WeChat\/Manager",
|
||||
"Name": "微信列表",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 1,
|
||||
"Icon": "fa-list",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-21 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 89,
|
||||
"Code": "\/WeChat\/Company",
|
||||
"Name": "微信客户",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": "2",
|
||||
"Icon": "fa-address-book",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-26 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 90,
|
||||
"Code": "\/WeChat\/Menu",
|
||||
"Name": "微信菜单",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 3,
|
||||
"Icon": "fa-sliders",
|
||||
"Description": "微信菜单设置",
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 91,
|
||||
"Code": "\/WeChat\/Template",
|
||||
"Name": "模板消息",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 4,
|
||||
"Icon": "fa-comments-o",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 92,
|
||||
"Code": "\/WeChat\/PushLog",
|
||||
"Name": "推送记录",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 8,
|
||||
"Icon": "fa-history",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 93,
|
||||
"Code": "\/WeChat\/SubUser",
|
||||
"Name": "订阅用户",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 6,
|
||||
"Icon": "fa fa-user",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 14:09:08",
|
||||
"ModifyId": 8,
|
||||
"ModifyBy": "test",
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 94,
|
||||
"Code": "\/WeChat\/BindUser",
|
||||
"Name": "绑定用户",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 7,
|
||||
"Icon": "fa fa-user-circle-o",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:12:52",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 95,
|
||||
"Code": "\/WeChat\/SendMessage",
|
||||
"Name": "文本消息",
|
||||
"IsButton": 0,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 5,
|
||||
"Icon": "fa fa-paper-plane",
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-24 09:05:50",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-30 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 87,
|
||||
"Mid": 0
|
||||
},
|
||||
{
|
||||
"Id": 96,
|
||||
"Code": " ",
|
||||
"Name": "查询",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "getWeChatAccount",
|
||||
"OrderSort": "0",
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-22 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 54
|
||||
},
|
||||
{
|
||||
"Id": 98,
|
||||
"Code": " ",
|
||||
"Name": "删除",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "handleDel",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-22 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 64
|
||||
},
|
||||
{
|
||||
"Id": 99,
|
||||
"Code": " ",
|
||||
"Name": "新增",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "handleAdd",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-24 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 59
|
||||
},
|
||||
{
|
||||
"Id": 100,
|
||||
"Code": " ",
|
||||
"Name": "编辑",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "handleEdit",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-24 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 58
|
||||
},
|
||||
{
|
||||
"Id": 101,
|
||||
"Code": " ",
|
||||
"Name": "批量删除",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "batchRemove",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-25 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 53
|
||||
},
|
||||
{
|
||||
"Id": 102,
|
||||
"Code": " ",
|
||||
"Name": "刷新Token",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": "handleRefreshWeChatToken",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-03-30 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-17 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 88,
|
||||
"Mid": 60
|
||||
},
|
||||
{
|
||||
"Id": 103,
|
||||
"Code": " ",
|
||||
"Name": "查询",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": "getWeChatCompany",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 89,
|
||||
"Mid": 50
|
||||
},
|
||||
{
|
||||
"Id": 104,
|
||||
"Code": " ",
|
||||
"Name": "删除",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": "handleDel",
|
||||
"OrderSort": "0",
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 89,
|
||||
"Mid": 49
|
||||
},
|
||||
{
|
||||
"Id": 105,
|
||||
"Code": " ",
|
||||
"Name": "批量删除",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": "batchRemove",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 89,
|
||||
"Mid": 48
|
||||
},
|
||||
{
|
||||
"Id": 106,
|
||||
"Code": " ",
|
||||
"Name": "添加",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": "handleAdd",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 89,
|
||||
"Mid": 51
|
||||
},
|
||||
{
|
||||
"Id": 107,
|
||||
"Code": " ",
|
||||
"Name": "编辑",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": "handleEdit",
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-06 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 89,
|
||||
"Mid": 52
|
||||
},
|
||||
{
|
||||
"Id": 108,
|
||||
"Code": " ",
|
||||
"Name": "获取菜单",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 90,
|
||||
"Mid": 55
|
||||
},
|
||||
{
|
||||
"Id": 109,
|
||||
"Code": " ",
|
||||
"Name": "更新菜单",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-06 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 90,
|
||||
"Mid": 61
|
||||
},
|
||||
{
|
||||
"Id": 110,
|
||||
"Code": " ",
|
||||
"Name": "获取消息模板",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 91,
|
||||
"Mid": 57
|
||||
},
|
||||
{
|
||||
"Id": 111,
|
||||
"Code": " ",
|
||||
"Name": "获取推送记录",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-08 00:00:00",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 92,
|
||||
"Mid": 62
|
||||
},
|
||||
{
|
||||
"Id": 112,
|
||||
"Code": " ",
|
||||
"Name": "获取订阅用户",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": null,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:21:53",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2020-04-23 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 93,
|
||||
"Mid": 56
|
||||
},
|
||||
{
|
||||
"Id": 113,
|
||||
"Code": " ",
|
||||
"Name": "获取绑定用户",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:22:11",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 94,
|
||||
"Mid": 63
|
||||
},
|
||||
{
|
||||
"Id": 114,
|
||||
"Code": " ",
|
||||
"Name": "推送文字消息",
|
||||
"IsButton": 1,
|
||||
"IsHide": 0,
|
||||
"IskeepAlive": 0,
|
||||
"Func": null,
|
||||
"OrderSort": 0,
|
||||
"Icon": null,
|
||||
"Description": null,
|
||||
"Enabled": 1,
|
||||
"CreateId": 8,
|
||||
"CreateBy": "test",
|
||||
"CreateTime": "2020-04-23 16:22:11",
|
||||
"ModifyId": null,
|
||||
"ModifyBy": null,
|
||||
"ModifyTime": "2021-09-29 00:00:00",
|
||||
"IsDeleted": 0,
|
||||
"Pid": 95,
|
||||
"Mid": 0
|
||||
}
|
||||
]
|
||||
|
|
Can't render this file because it contains an unexpected character in line 3 and column 5.
|
551
Blog.Core.Common/Helper/DynamicLinqFactory.cs
Normal file
551
Blog.Core.Common/Helper/DynamicLinqFactory.cs
Normal file
|
@ -0,0 +1,551 @@
|
|||
using RestSharp.Extensions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Common.Helper
|
||||
{
|
||||
#region 动态linq帮助类,连接符号,运算符号
|
||||
|
||||
/// <summary>
|
||||
/// 动态linq工厂
|
||||
/// </summary>
|
||||
public static class DynamicLinqFactory
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 生成lambd表达式(如:CompanyID != 1 & CompanyID == 1)
|
||||
/// </summary>
|
||||
/// <typeparam name="TSource"></typeparam>
|
||||
/// <param name="propertyStr"></param>
|
||||
/// <returns></returns>
|
||||
public static Expression<Func<TSource, bool>> CreateLambda<TSource>(string propertyStr)
|
||||
{
|
||||
// 设置自定义lanbd
|
||||
// 定义 lanbd 种子(p=> xxxxxx)中的 p
|
||||
if (string.IsNullOrWhiteSpace(propertyStr))
|
||||
return LinqHelper.True<TSource>();//为空就返回空的表达式
|
||||
|
||||
var parameter = Expression.Parameter(typeof(TSource), "p");
|
||||
var strArr = SpiltStrings(propertyStr);
|
||||
|
||||
|
||||
// 第一个判断条件,固定一个判断条件作为最左边
|
||||
Expression mainExpressin = ExpressionStudio(null, strArr.FirstOrDefault(x => x.LinkSymbol == LinkSymbol.Empty), parameter);
|
||||
|
||||
// 将需要放置在最左边的判断条件从列表中去除,因为已经合成到表达式最左边了
|
||||
strArr.Remove(strArr.FirstOrDefault(x => x.LinkSymbol == LinkSymbol.Empty));
|
||||
|
||||
foreach (var x in strArr)
|
||||
{
|
||||
mainExpressin = ExpressionStudio(mainExpressin, x, parameter);
|
||||
}
|
||||
|
||||
return mainExpressin.ToLambda<Func<TSource, bool>>(parameter);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 组合条件判断表达式
|
||||
/// </summary>
|
||||
/// <param name="left">左边的表达式</param>
|
||||
/// <param name="DynamicLinq"></param>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
public static Expression ExpressionStudio(Expression left, DynamicLinqHelper DynamicLinq, ParameterExpression key)
|
||||
{
|
||||
Expression mainExpression = key;
|
||||
|
||||
var properties = DynamicLinq.Left.Split('.');
|
||||
|
||||
// 从1开始,是不想用自定义种子,外层种子已经定义好了
|
||||
// 暂时也不会有多个自定义种子,先这样
|
||||
for (var i = 0; i < properties.Length; i++)
|
||||
{
|
||||
mainExpression = mainExpression.Property(properties[i]);
|
||||
}
|
||||
|
||||
left = left == null
|
||||
// 如果左边表达式为空,则当前的表达式就为最左边
|
||||
? ChangeOperationSymbol(DynamicLinq.OperationSymbol, mainExpression, DynamicLinq.Right)
|
||||
// 如果不为空,则将当前的表达式连接到左边
|
||||
: ChangeLinkSymbol(DynamicLinq.LinkSymbol, left, ChangeOperationSymbol(DynamicLinq.OperationSymbol, mainExpression, DynamicLinq.Right));
|
||||
return left;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串装换成动态帮助类(内含递归)
|
||||
/// </summary>
|
||||
public static List<DynamicLinqHelper> SpiltStrings(string propertyStr)
|
||||
{
|
||||
// 定义返回用List
|
||||
var outList = new List<DynamicLinqHelper>();
|
||||
|
||||
// 当最后已经没有连接运算符的时候,进入该条件
|
||||
if (!propertyStr.Contains("&") & !propertyStr.Contains("|"))
|
||||
{
|
||||
// 当前的条件是不具备连接符号的
|
||||
var lastStr = propertyStr.Trim().Split(' ');
|
||||
outList.Add(new DynamicLinqHelper
|
||||
{
|
||||
LinkSymbol = LinkSymbol.Empty,
|
||||
Left = lastStr[0],
|
||||
Right = lastStr[2],
|
||||
OperationSymbol = ChangeOperationSymbol(lastStr[1])
|
||||
});
|
||||
return outList;
|
||||
}
|
||||
// 判断当前 & | 哪个符号在最后一个判断逻辑内
|
||||
var key = propertyStr.LastIndexOf('&') > propertyStr.LastIndexOf('|') ? '&' : '|';
|
||||
|
||||
var nowStrArr = propertyStr.Substring(propertyStr.LastIndexOf(key)).Trim().Split(' ');
|
||||
|
||||
outList.Add(new DynamicLinqHelper
|
||||
{
|
||||
LinkSymbol = ChangeLinkSymbol(nowStrArr[0]),
|
||||
Left = nowStrArr[1],
|
||||
OperationSymbol = ChangeOperationSymbol(nowStrArr[2]),
|
||||
Right = nowStrArr[3]
|
||||
});
|
||||
// 将剩余部分继续切割
|
||||
propertyStr = propertyStr.Substring(0, propertyStr.LastIndexOf(key)).Trim();
|
||||
// 递归 由后彺前
|
||||
outList.AddRange(SpiltStrings(propertyStr));
|
||||
|
||||
return outList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串符号转成运算枚举符号
|
||||
/// </summary>
|
||||
public static LinkSymbol ChangeLinkSymbol(string str)
|
||||
{
|
||||
// 这里判断链接符号
|
||||
// 当链接符号为Empty,则说明当前对象为表达式的最左边
|
||||
// 如果一个表达式出现两次链接符号为空,则说明输入的字符串格式有问题
|
||||
switch (str)
|
||||
{
|
||||
case "|":
|
||||
return LinkSymbol.OrElse;
|
||||
case "&":
|
||||
return LinkSymbol.AndAlso;
|
||||
default:
|
||||
return LinkSymbol.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将运算枚举符号转成具体使用方法
|
||||
/// </summary>
|
||||
public static Expression ChangeLinkSymbol(LinkSymbol Symbol, Expression left, Expression right)
|
||||
{
|
||||
switch (Symbol)
|
||||
{
|
||||
case LinkSymbol.OrElse:
|
||||
return left.OrElse(right);
|
||||
case LinkSymbol.AndAlso:
|
||||
return left.AndAlso(right);
|
||||
default:
|
||||
return left;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将字符串符号转成运算枚举符号
|
||||
/// </summary>
|
||||
public static OperationSymbol ChangeOperationSymbol(string str)
|
||||
{
|
||||
switch (str)
|
||||
{
|
||||
case "<":
|
||||
return OperationSymbol.LessThan;
|
||||
case "<=":
|
||||
return OperationSymbol.LessThanOrEqual;
|
||||
case ">":
|
||||
return OperationSymbol.GreaterThan;
|
||||
case ">=":
|
||||
return OperationSymbol.GreaterThanOrEqual;
|
||||
case "==":
|
||||
case "=":
|
||||
return OperationSymbol.Equal;
|
||||
case "!=":
|
||||
return OperationSymbol.NotEqual;
|
||||
case "contains":
|
||||
case "like":
|
||||
return OperationSymbol.Contains;
|
||||
}
|
||||
throw new Exception("OperationSymbol IS NULL");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将运算枚举符号转成具体使用方法
|
||||
/// </summary>
|
||||
public static Expression ChangeOperationSymbol(OperationSymbol symbol, Expression key, object right)
|
||||
{
|
||||
// 将右边数据类型强行转换成左边一样的类型
|
||||
// 两者如果Type不匹配则无法接下去的运算操作,抛出异常
|
||||
object newTypeRight;
|
||||
if (right == null || string.IsNullOrEmpty(right.ToString()) || right.ToString() == "null")
|
||||
newTypeRight = null;
|
||||
else
|
||||
newTypeRight = Convert.ChangeType(right, key.Type);
|
||||
|
||||
// 根据当前枚举类别判断使用那种比较方法
|
||||
switch (symbol)
|
||||
{
|
||||
case OperationSymbol.Equal:
|
||||
return key.Equal(Expression.Constant(newTypeRight));
|
||||
case OperationSymbol.GreaterThan:
|
||||
{
|
||||
if (key.Type == typeof(string))
|
||||
return key.Contains(Expression.Constant(newTypeRight)); //对string 特殊处理 由于string
|
||||
else
|
||||
return key.GreaterThan(Expression.Constant((newTypeRight)));
|
||||
}
|
||||
case OperationSymbol.GreaterThanOrEqual:
|
||||
{
|
||||
if (key.Type == typeof(string))
|
||||
return key.Contains(Expression.Constant(newTypeRight, typeof(string)));
|
||||
else
|
||||
return key.GreaterThanOrEqual(Expression.Constant(newTypeRight));
|
||||
}
|
||||
|
||||
case OperationSymbol.LessThan:
|
||||
{
|
||||
if (key.Type == typeof(string))
|
||||
return key.Contains(Expression.Constant(newTypeRight, typeof(string)));
|
||||
else
|
||||
return key.LessThan(Expression.Constant((newTypeRight)));
|
||||
}
|
||||
case OperationSymbol.LessThanOrEqual:
|
||||
{
|
||||
if (key.Type == typeof(string))
|
||||
return key.Contains(Expression.Constant(newTypeRight, typeof(string)));
|
||||
else
|
||||
return key.LessThanOrEqual(Expression.Constant((newTypeRight)));
|
||||
}
|
||||
case OperationSymbol.NotEqual:
|
||||
return key.NotEqual(Expression.Constant(newTypeRight));
|
||||
case OperationSymbol.Contains:
|
||||
return key.Contains(Expression.Constant(newTypeRight));
|
||||
}
|
||||
throw new Exception("OperationSymbol IS NULL");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态linq帮助类
|
||||
/// </summary>
|
||||
public class DynamicLinqHelper
|
||||
{
|
||||
[Display(Name = "左")]
|
||||
public string Left { get; set; }
|
||||
[Display(Name = "右")]
|
||||
public string Right { get; set; }
|
||||
|
||||
[Display(Name = "运算符")]
|
||||
public OperationSymbol OperationSymbol { get; set; }
|
||||
|
||||
[Display(Name = "连接符")]
|
||||
public LinkSymbol LinkSymbol { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 连接符枚举(将来可能会包含 括号 )
|
||||
/// </summary>
|
||||
public enum LinkSymbol
|
||||
{
|
||||
[Display(Name = "&&")]
|
||||
AndAlso,
|
||||
[Display(Name = "||")]
|
||||
OrElse,
|
||||
[Display(Name = "空")]
|
||||
Empty
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 常用比较运算符 > , >= , == , < , <= , != ,Contains
|
||||
/// </summary>
|
||||
public enum OperationSymbol
|
||||
{
|
||||
[Display(Name = "Contains")]
|
||||
Contains,
|
||||
[Display(Name = ">")]
|
||||
GreaterThan,
|
||||
[Display(Name = ">=")]
|
||||
GreaterThanOrEqual,
|
||||
[Display(Name = "<")]
|
||||
LessThan,
|
||||
[Display(Name = "<=")]
|
||||
LessThanOrEqual,
|
||||
[Display(Name = "==")]
|
||||
Equal,
|
||||
[Display(Name = "!=")]
|
||||
NotEqual
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Linq扩展
|
||||
/// </summary>
|
||||
public static class ExpressionExtensions
|
||||
{
|
||||
#region 常用扩展方法
|
||||
|
||||
/// <summary>
|
||||
/// 调用内部方法
|
||||
/// </summary>
|
||||
public static Expression Call(this Expression instance, string methodName, params Expression[] arguments)
|
||||
{
|
||||
if(instance.Type == typeof(string))
|
||||
return Expression.Call(instance, instance.Type.GetMethod(methodName,new Type[] { typeof(string)}), arguments); //修复string contains 出现的问题 Ambiguous match found.
|
||||
else
|
||||
return Expression.Call(instance, instance.Type.GetMethod(methodName), arguments);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取内部成员
|
||||
/// </summary>
|
||||
public static Expression Property(this Expression expression, string propertyName)
|
||||
{
|
||||
// Todo:左边条件如果是dynamic,
|
||||
// 则Expression.Property无法获取子内容
|
||||
// 报错在这里,由于expression内的对象为Object,所以无法解析到
|
||||
// var x = (expression as IQueryable).ElementType;
|
||||
return Expression.Property(expression, propertyName);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 转Lambda
|
||||
/// </summary>
|
||||
public static Expression<TDelegate> ToLambda<TDelegate>(this Expression body,
|
||||
params ParameterExpression[] parameters)
|
||||
{
|
||||
return Expression.Lambda<TDelegate>(body, parameters);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region 常用运算符 [ > , >= , == , < , <= , != , || , && ]
|
||||
|
||||
/// <summary>
|
||||
/// &&
|
||||
/// </summary>
|
||||
public static Expression AndAlso(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.AndAlso(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ||
|
||||
/// </summary>
|
||||
public static Expression OrElse(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.OrElse(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Contains
|
||||
/// </summary>
|
||||
public static Expression Contains(this Expression left, Expression right)
|
||||
{
|
||||
return left.Call("Contains", right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// >
|
||||
/// </summary>
|
||||
public static Expression GreaterThan(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.GreaterThan(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// >=
|
||||
/// </summary>
|
||||
public static Expression GreaterThanOrEqual(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.GreaterThanOrEqual(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <
|
||||
/// </summary>
|
||||
public static Expression LessThan(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.LessThan(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <=
|
||||
/// </summary>
|
||||
public static Expression LessThanOrEqual(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.LessThanOrEqual(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ==
|
||||
/// </summary>
|
||||
public static Expression Equal(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.Equal(left, right);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// !=
|
||||
/// </summary>
|
||||
public static Expression NotEqual(this Expression left, Expression right)
|
||||
{
|
||||
return Expression.NotEqual(left, right);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Queryable扩展
|
||||
/// </summary>
|
||||
public static class QueryableExtensions
|
||||
{
|
||||
#region 自定义扩展Queryable
|
||||
|
||||
/// <summary>
|
||||
/// Where扩展
|
||||
/// </summary>
|
||||
public static IEnumerable<TSource> IWhere<TSource>(this IEnumerable<TSource> source, string linqStr)
|
||||
{
|
||||
return source.Where(DynamicLinqFactory.CreateLambda<TSource>(linqStr).Compile());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// FirstOrDefault扩展
|
||||
/// </summary>
|
||||
public static TSource IFirstOrDefault<TSource>(this IEnumerable<TSource> source, string linqStr)
|
||||
{
|
||||
return source.FirstOrDefault(DynamicLinqFactory.CreateLambda<TSource>(linqStr).Compile());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Count扩展
|
||||
/// </summary>
|
||||
public static Int32 ICount<TSource>(this IEnumerable<TSource> source, string linqStr)
|
||||
{
|
||||
return source.Count(DynamicLinqFactory.CreateLambda<TSource>(linqStr).Compile());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义排序
|
||||
/// </summary>
|
||||
public static IOrderedQueryable<TSource> ISort<TSource>(this IQueryable<TSource> source, string orderByProperty, bool asc)
|
||||
{
|
||||
string command = asc ? "OrderBy" : "OrderByDescending";
|
||||
var type = typeof(TSource);
|
||||
var property = type.GetProperty(orderByProperty);
|
||||
var parameter = Expression.Parameter(type, "p");
|
||||
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
|
||||
var orderByExpression = Expression.Lambda(propertyAccess, parameter);
|
||||
var resultExpression = Expression.Call(typeof(Queryable), command, new Type[] { type, property.PropertyType }, source.Expression, Expression.Quote(orderByExpression));
|
||||
return (IOrderedQueryable<TSource>)source.Provider.CreateQuery<TSource>(resultExpression);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义分页
|
||||
/// </summary>
|
||||
/// <typeparam name="TSource"></typeparam>
|
||||
/// <param name="source"></param>
|
||||
/// <param name="nowPage"></param>
|
||||
/// <param name="pageSize"></param>
|
||||
/// <returns></returns>
|
||||
public static IQueryable<TSource> IPaging<TSource>(this IQueryable<TSource> source, int nowPage, int pageSize)
|
||||
{
|
||||
return source.ISkip((nowPage - 1) * pageSize).ITake(pageSize);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义Skip
|
||||
/// </summary>
|
||||
public static IQueryable<TSource> ISkip<TSource>(this IQueryable<TSource> source, int count)
|
||||
{
|
||||
return source.Provider.CreateQuery<TSource>(Expression.Call(
|
||||
// 类别
|
||||
typeof(Queryable),
|
||||
// 调用的方法
|
||||
"Skip",
|
||||
// 元素类别
|
||||
new Type[] { source.ElementType },
|
||||
// 调用的表达树
|
||||
source.Expression,
|
||||
// 参数
|
||||
Expression.Constant(count)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义Take
|
||||
/// </summary>
|
||||
public static IQueryable<TSource> ITake<TSource>(this IQueryable<TSource> source, int count)
|
||||
{
|
||||
return source.Provider.CreateQuery<TSource>(Expression.Call(
|
||||
// 类别
|
||||
typeof(Queryable),
|
||||
// 调用的方法
|
||||
"Take",
|
||||
// 元素类别
|
||||
new Type[] { source.ElementType },
|
||||
// 调用的表达树
|
||||
source.Expression,
|
||||
// 参数
|
||||
Expression.Constant(count)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 自定义去重复
|
||||
/// </summary>
|
||||
public static IEnumerable<TSource> IDistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
|
||||
{
|
||||
var seenKeys = new HashSet<TKey>();
|
||||
return source.Where(element => seenKeys.Add(keySelector(element)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态赋值
|
||||
/// </summary>
|
||||
public static void CopyTo<T>(this object source, T target) where T : class, new()
|
||||
{
|
||||
if (source == null)
|
||||
return;
|
||||
|
||||
if (target == null)
|
||||
{
|
||||
target = new T();
|
||||
}
|
||||
|
||||
foreach (var property in target.GetType().GetProperties())
|
||||
{
|
||||
// 这里可以判断一下当前属性值是否为空的 source.GetType().GetProperty(property.Name).GetValue(source, null)
|
||||
target.GetType().InvokeMember(property.Name, BindingFlags.SetProperty, null, target, new object[] { source.GetType().GetProperty(property.Name).GetValue(source, null) });
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除特殊字段数据
|
||||
/// </summary>
|
||||
public static void RemoveSpecialPropertyValue(this object source)
|
||||
{
|
||||
var properties = source.GetType().GetProperties();
|
||||
foreach (var x in properties)
|
||||
{
|
||||
if (x.GetAccessors().Any(y => y.IsVirtual))
|
||||
{
|
||||
source.GetType().GetProperty(x.Name).SetValue(source, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
@ -50,7 +51,7 @@ namespace Blog.Core.Common.Helper
|
|||
}
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
string encoding = response.ContentEncoding;
|
||||
if (encoding.Length < 1)
|
||||
if (string.IsNullOrWhiteSpace(encoding))
|
||||
{
|
||||
encoding = "UTF-8"; //默认编码
|
||||
}
|
||||
|
@ -75,14 +76,16 @@ namespace Blog.Core.Common.Helper
|
|||
}
|
||||
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
|
||||
string encoding = response.ContentEncoding;
|
||||
if (encoding.Length < 1)
|
||||
if (string.IsNullOrWhiteSpace(encoding))
|
||||
{
|
||||
encoding = "UTF-8"; //默认编码
|
||||
}
|
||||
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(encoding));
|
||||
string retString = await reader.ReadToEndAsync();
|
||||
return retString;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ namespace Blog.Core.Common.Helper
|
|||
if (value == null)
|
||||
value = defaultValue;
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch (Exception)
|
||||
{
|
||||
value = defaultValue;
|
||||
}
|
||||
|
|
31
Blog.Core.Common/Helper/LinqHelper.cs
Normal file
31
Blog.Core.Common/Helper/LinqHelper.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.Linq.Expressions;
|
||||
|
||||
namespace Blog.Core.Common.Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// Linq操作帮助类
|
||||
/// </summary>
|
||||
public static class LinqHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建初始条件为True的表达式
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
public static Expression<Func<T, bool>> True<T>()
|
||||
{
|
||||
return x => true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建初始条件为False的表达式
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <returns></returns>
|
||||
public static Expression<Func<T, bool>> False<T>()
|
||||
{
|
||||
return x => false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -62,6 +62,37 @@ namespace Blog.Core.Common.Helper
|
|||
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
|
||||
return Convert.ToBase64String(s);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sha1加密
|
||||
/// </summary>
|
||||
/// <param name="str">要加密的字符串</param>
|
||||
/// <returns>加密后的十六进制的哈希散列(字符串)</returns>
|
||||
public static string Sha1(string str, string format = "x2")
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(str);
|
||||
var data = SHA1.Create().ComputeHash(buffer);
|
||||
var sb = new StringBuilder();
|
||||
foreach (var t in data)
|
||||
{
|
||||
sb.Append(t.ToString(format));
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
/// <summary>
|
||||
/// Sha256加密
|
||||
/// </summary>
|
||||
/// <param name="str">要加密的字符串</param>
|
||||
/// <returns>加密后的十六进制的哈希散列(字符串)</returns>
|
||||
public static string Sha256(string str, string format = "x2")
|
||||
{
|
||||
var buffer = Encoding.UTF8.GetBytes(str);
|
||||
var data = SHA256.Create().ComputeHash(buffer);
|
||||
var sb = new StringBuilder();
|
||||
foreach (var t in data)
|
||||
{
|
||||
sb.Append(t.ToString(format));
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
312
Blog.Core.Common/Helper/WeChatHelper.cs
Normal file
312
Blog.Core.Common/Helper/WeChatHelper.cs
Normal file
|
@ -0,0 +1,312 @@
|
|||
using Blog.Core.Model.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Common.Helper
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号帮助类
|
||||
/// </summary>
|
||||
public static class WeChatHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 新增素材/上传多媒体文件(临时)
|
||||
/// http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html
|
||||
/// 1.上传的媒体文件限制:
|
||||
///图片(image) : 1MB,支持JPG格式
|
||||
///语音(voice):1MB,播放长度不超过60s,支持MP4格式
|
||||
///视频(video):10MB,支持MP4格式
|
||||
///缩略图(thumb):64KB,支持JPG格式
|
||||
///2.媒体文件在后台保存时间为3天,即3天后media_id失效
|
||||
/// </summary>
|
||||
/// <param name="access_token"></param>
|
||||
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
|
||||
/// <param name="fileName">文件名</param>
|
||||
/// <param name="inputStream">文件输入流</param>
|
||||
/// <returns>media_id</returns>
|
||||
public async static Task<WeChatApiDto> UploadMediaTemp(string token, string type, string fileName, Stream inputStream)
|
||||
{
|
||||
var url = $"http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={token}&type={type}";
|
||||
using var client = new HttpClient();
|
||||
using HttpContent content = new StreamContent(inputStream);
|
||||
var httpResponse = await client.PostAsync(url, content);
|
||||
var txt = await httpResponse.Content.ReadAsStringAsync();
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 新增素材/上传多媒体文件(永久)
|
||||
/// http://mp.weixin.qq.com/wiki/5/963fc70b80dc75483a271298a76a8d59.html
|
||||
/// 1.上传的媒体文件限制:
|
||||
///图片(image) : 1MB,支持JPG格式
|
||||
///语音(voice):1MB,播放长度不超过60s,支持MP4格式
|
||||
///视频(video):10MB,支持MP4格式
|
||||
///缩略图(thumb):64KB,支持JPG格式
|
||||
/// </summary>
|
||||
/// <param name="access_token"></param>
|
||||
/// <param name="type">媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)</param>
|
||||
/// <param name="fileName">文件名</param>
|
||||
/// <param name="inputStream">文件输入流</param>
|
||||
/// <returns>media_id</returns>
|
||||
public async static Task<WeChatApiDto> UploadMedia(string token, string type, string fileName, Stream inputStream)
|
||||
{
|
||||
var url = $"https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={token}&type={type}";
|
||||
using var client = new HttpClient();
|
||||
using HttpContent content = new StreamContent(inputStream);
|
||||
var httpResponse = await client.PostAsync(url, content);
|
||||
var txt = await httpResponse.Content.ReadAsStringAsync();
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 通过绑定票据获取公众号关注二维码
|
||||
/// </summary>
|
||||
/// <param name="ticket"></param>
|
||||
/// <returns></returns>
|
||||
public async static Task<WeChatApiDto> GetQRCodePicture(string ticket)
|
||||
{
|
||||
string url = $"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket={ticket}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取临时关注二维码
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="postData">The post data.</param>
|
||||
public async static Task<WeChatApiDto> GetQRCode(string token, string jsonData)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={token}";
|
||||
var txt = await HttpHelper.PostAsync(url, jsonData);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取关注的公众号用户openid(获取所有OpenID)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="isGetAll">是否递归获取所有用户的</param>
|
||||
/// <returns>List<System.String>.</returns>
|
||||
public async static Task<WeChatApiDto> GetUsers(string token,bool isGetAll=false)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/user/get?access_token={token}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
if (data.data == null) data.data = new WeChatOpenIDsDto();
|
||||
if(!string.IsNullOrEmpty(data.next_openid))
|
||||
await GetUsers(token, data.next_openid, data.data.openid);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取关注的公众号用户openid(递归)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="nextUser">The next user.</param>
|
||||
/// <param name="users">The users.</param>
|
||||
public async static Task GetUsers(string token, string nextUser, List<string> users)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/user/get?access_token={token}&next_openid={nextUser}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
if (data.data != null && data.data.openid != null)
|
||||
users.AddRange(data.data.openid);
|
||||
if (!string.IsNullOrEmpty(data.next_openid))
|
||||
await GetUsers(token, data.next_openid, data.data.openid);
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取菜单内容(获取菜单有menu外层,提交菜单不需要menu外层)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
public async static Task<WeChatApiDto> GetMenu(string token)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/menu/get?access_token={token}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 转换微信菜单按钮为事件的按钮
|
||||
/// </summary>
|
||||
public static void ConverMenuButtonForEvent(WeChatApiDto weChatApiDto)
|
||||
{
|
||||
foreach (var item in weChatApiDto?.menu?.button)
|
||||
{
|
||||
if (item.key.ObjToString().Equals("event") || item.type.ObjToString().Equals("event"))
|
||||
{
|
||||
var temp = item.type;
|
||||
item.type = item.key;
|
||||
item.key = temp;
|
||||
}
|
||||
if (item.sub_button != null)
|
||||
{
|
||||
ConverMenuButtonForEvent(item.sub_button);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 转换微信菜单按钮为事件的按钮
|
||||
/// </summary>
|
||||
public static void ConverMenuButtonForEvent(WeChatMenuButtonDto[] weChatMenuButtonDto)
|
||||
{
|
||||
foreach (var item in weChatMenuButtonDto)
|
||||
{
|
||||
if (item.key.ObjToString().Equals("event") || item.type.ObjToString().Equals("event"))
|
||||
{
|
||||
var temp = item.type;
|
||||
item.type = item.key;
|
||||
item.key = temp;
|
||||
}
|
||||
if (item.sub_button != null)
|
||||
{
|
||||
ConverMenuButtonForEvent(item.sub_button);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 设置菜单内容(设置菜单不需要menu外层)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="jsonMenu">The json menu.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
public async static Task<WeChatApiDto> SetMenu(string token, string jsonMenu)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/menu/create?access_token={token}";
|
||||
var txt = await HttpHelper.PostAsync(url, jsonMenu);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 删除菜单内容
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
||||
public async static Task<WeChatApiDto> DeleteMenu(string token)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={token}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 发送普通消息(群发所有人,单人发送也可以)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="jsonData">The json data.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
public async static Task<WeChatApiDto> SendMsgToAll(string token, string jsonData)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token={token}";
|
||||
var txt = await HttpHelper.PostAsync(url, jsonData);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 发送普通消息(单个人-24小时内用户跟微信公众号有互动才会推送成功)
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="jsonData">The json data.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
public async static Task<WeChatApiDto> SendMsg(string token, string jsonData)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token={token}";
|
||||
var txt = await HttpHelper.PostAsync(url, jsonData);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 发送卡片消息模板
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="jsonData">The json data.</param>
|
||||
/// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
|
||||
public async static Task<WeChatApiDto> SendCardMsg(string token, string jsonData)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={token}";
|
||||
var txt = await HttpHelper.PostAsync(url, jsonData);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 拉取普通access_token
|
||||
/// </summary>
|
||||
/// <param name="appid">appid</param>
|
||||
/// <param name="appsecret">appsecret</param>
|
||||
/// <returns>返回token</returns>
|
||||
public async static Task<WeChatApiDto> GetToken(string appid, string appsecret)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appid}&secret={appsecret}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取微信服务器IP列表
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
public async static Task<WeChatApiDto> GetWechatIP(string token)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token={token}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// openid获取微信用户信息
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <param name="openid">The openid.</param>
|
||||
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
||||
public async static Task<WeChatApiDto> GetUserInfo(string token,string openid)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/user/info?access_token={token}&openid={openid}&lang=zh_CN";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// openid获取微信用户信息
|
||||
/// </summary>
|
||||
/// <param name="token">The openid.</param>
|
||||
/// <param name="openid">The access token.</param>
|
||||
public async static Task<WeChatApiDto> GetUserInfoTwo(string token,string openid)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/sns/userinfo?access_token={token}&openid={openid}&lang=zh_CN";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// code换取用户openID
|
||||
/// </summary>
|
||||
/// <param name="appid">The appid.</param>
|
||||
/// <param name="appsecret">The appsecret.</param>
|
||||
/// <param name="code">The code.</param>
|
||||
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
||||
public async static Task<WeChatApiDto> GetOpenidByCode(string appid, string appsecret, string code)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={appsecret}&code={code}&grant_type=authorization_code";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取模板消息
|
||||
/// </summary>
|
||||
/// <param name="token">The token.</param>
|
||||
/// <returns>Dictionary<System.String, System.Object>.</returns>
|
||||
public async static Task<WeChatApiDto> GetTemplate(string token)
|
||||
{
|
||||
string url = $"https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token={token}";
|
||||
var txt = await HttpHelper.GetAsync(url);
|
||||
var data = JsonHelper.ParseFormByJson<WeChatApiDto>(txt);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -13,7 +13,7 @@ namespace Blog.Core.Extensions
|
|||
/// </summary>
|
||||
public static class AppConfigSetup
|
||||
{
|
||||
public static void AddAppConfigSetup(this IServiceCollection services, IWebHostEnvironment env)
|
||||
public static void AddAppConfigSetup(this IServiceCollection services, IHostEnvironment env)
|
||||
{
|
||||
if (services == null) throw new ArgumentNullException(nameof(services));
|
||||
|
||||
|
|
|
@ -57,6 +57,7 @@ namespace Blog.Core.IServices.BASE
|
|||
Expression<Func<T, T2, T3, object[]>> joinExpression,
|
||||
Expression<Func<T, T2, T3, TResult>> selectExpression,
|
||||
Expression<Func<T, T2, T3, bool>> whereLambda = null) where T : class, new();
|
||||
Task<PageModel<TEntity>> QueryPage(PaginationModel pagination);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
16
Blog.Core.IServices/IWeChatCompanyServices.cs
Normal file
16
Blog.Core.IServices/IWeChatCompanyServices.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using Blog.Core.IServices.BASE;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.IServices
|
||||
{
|
||||
/// <summary>
|
||||
/// IWeChatCompanyServices
|
||||
/// </summary>
|
||||
public interface IWeChatCompanyServices : IBaseServices<WeChatCompany>
|
||||
{
|
||||
|
||||
}
|
||||
}
|
102
Blog.Core.IServices/IWeChatConfigServices.cs
Normal file
102
Blog.Core.IServices/IWeChatConfigServices.cs
Normal file
|
@ -0,0 +1,102 @@
|
|||
using Blog.Core.IServices.BASE;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.IServices
|
||||
{
|
||||
/// <summary>
|
||||
/// IWeChatConfigServices
|
||||
/// </summary>
|
||||
public interface IWeChatConfigServices :IBaseServices<WeChatConfig>
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取可用的微信token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> GetToken(string id);
|
||||
/// <summary>
|
||||
/// 刷新微信token
|
||||
/// </summary>
|
||||
/// <param name="publicAccount"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> RefreshToken(string id);
|
||||
/// <summary>
|
||||
/// 获取模板信息
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> GetTemplate(string id);
|
||||
/// <summary>
|
||||
/// 获取菜单
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> GetMenu(string id);
|
||||
/// <summary>
|
||||
/// 获取订阅用户
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="openid"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> GetSubUser(string id,string openid);
|
||||
/// <summary>
|
||||
/// 获取订阅用户列表
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> GetSubUsers(string id);
|
||||
/// <summary>
|
||||
/// 处理微信事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
Task<string> HandleWeChat(WeChatXMLDto weChat);
|
||||
/// <summary>
|
||||
/// 微信验证入库
|
||||
/// </summary>
|
||||
/// <param name="validDto"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
Task<string> Valid(WeChatValidDto validDto,string body);
|
||||
/// <summary>
|
||||
/// 获取绑定二维码
|
||||
/// </summary>
|
||||
/// <param name="info"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatResponseUserInfo>> GetQRBind(WeChatUserInfo info);
|
||||
/// <summary>
|
||||
/// 推送卡片消息(绑定用户)
|
||||
/// </summary>
|
||||
/// <param name="msg"></param>
|
||||
/// <param name="ip"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatResponseUserInfo>> PushCardMsg(WeChatCardMsgDataDto msg,string ip);
|
||||
/// <summary>
|
||||
/// 推送文本消息(绑定或订阅)
|
||||
/// </summary>
|
||||
/// <param name="msg"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> PushTxtMsg(WeChatPushTestDto msg);
|
||||
/// <summary>
|
||||
/// 更新菜单
|
||||
/// </summary>
|
||||
/// <param name="menu"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatApiDto>> UpdateMenu(WeChatApiDto menu);
|
||||
/// <summary>
|
||||
/// 通过绑定用户获取微信用户信息
|
||||
/// </summary>
|
||||
/// <param name="info"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatResponseUserInfo>> GetBindUserInfo(WeChatUserInfo info);
|
||||
/// <summary>
|
||||
/// 解除绑定用户
|
||||
/// </summary>
|
||||
/// <param name="info"></param>
|
||||
/// <returns></returns>
|
||||
Task<MessageModel<WeChatResponseUserInfo>> UnBind(WeChatUserInfo info);
|
||||
}
|
||||
}
|
16
Blog.Core.IServices/IWeChatPushLogServices.cs
Normal file
16
Blog.Core.IServices/IWeChatPushLogServices.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using Blog.Core.IServices.BASE;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.IServices
|
||||
{
|
||||
/// <summary>
|
||||
/// IWeChatPushLogServices
|
||||
/// </summary>
|
||||
public interface IWeChatPushLogServices : IBaseServices<WeChatPushLog>
|
||||
{
|
||||
|
||||
}
|
||||
}
|
16
Blog.Core.IServices/IWeChatSubServices.cs
Normal file
16
Blog.Core.IServices/IWeChatSubServices.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using Blog.Core.IServices.BASE;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.IServices
|
||||
{
|
||||
/// <summary>
|
||||
/// IWeChatSubServices
|
||||
/// </summary>
|
||||
public interface IWeChatSubServices : IBaseServices<WeChatSub>
|
||||
{
|
||||
|
||||
}
|
||||
}
|
|
@ -9,25 +9,25 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 广告图片
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 512, IsNullable = true, ColumnDataType = "nvarchar")]
|
||||
[SugarColumn(Length = 512, IsNullable = true)]
|
||||
public string ImgUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 广告标题
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 64, IsNullable = true, ColumnDataType = "nvarchar")]
|
||||
[SugarColumn(Length = 64, IsNullable = true)]
|
||||
public string Title { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 广告链接
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 256, IsNullable = true, ColumnDataType = "nvarchar")]
|
||||
[SugarColumn(Length = 256, IsNullable = true)]
|
||||
public string Url { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 2000, IsNullable = true, ColumnDataType = "nvarchar")]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -17,25 +17,25 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 600, IsNullable = true)]
|
||||
[SugarColumn(Length = 600, IsNullable = true)]
|
||||
public string bsubmitter { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标题blog
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 256, IsNullable = true)]
|
||||
[SugarColumn(Length = 256, IsNullable = true)]
|
||||
public string btitle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 类别
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string bcategory { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 内容
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string bcontent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
@ -60,7 +60,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string bRemark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -15,29 +15,29 @@ namespace Blog.Core.Model.Models
|
|||
/// </summary>
|
||||
public DateTime createdate { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string username { get; set; }
|
||||
|
||||
/// <summary>手机
|
||||
///
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string phone { get; set; }
|
||||
/// <summary>qq
|
||||
///
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string QQ { get; set; }
|
||||
|
||||
/// <summary>留言内容
|
||||
///
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string body { get; set; }
|
||||
/// <summary>ip地址
|
||||
///
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string ip { get; set; }
|
||||
|
||||
/// <summary>是否显示在前台,0否1是
|
||||
|
|
|
@ -23,7 +23,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -38,7 +38,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 修改者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
///修改时间
|
||||
|
|
|
@ -25,37 +25,37 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string Name { get; set; }
|
||||
/// <summary>
|
||||
/// 菜单链接地址
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string LinkUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 区域名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Area { get; set; }
|
||||
/// <summary>
|
||||
/// 控制器名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Controller { get; set; }
|
||||
/// <summary>
|
||||
/// Action名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Action { get; set; }
|
||||
/// <summary>
|
||||
/// 图标
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Icon { get; set; }
|
||||
/// <summary>
|
||||
/// 菜单编号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 10, IsNullable = true)]
|
||||
[SugarColumn(Length = 10, IsNullable = true)]
|
||||
public string Code { get; set; }
|
||||
/// <summary>
|
||||
/// 排序
|
||||
|
@ -64,7 +64,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// /描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是右侧菜单
|
||||
|
@ -82,7 +82,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -97,7 +97,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 修改者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
|
|
|
@ -17,27 +17,27 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 区域名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Area { get; set; }
|
||||
/// <summary>
|
||||
/// 区域控制器名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Controller { get; set; }
|
||||
/// <summary>
|
||||
/// Action名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Action { get; set; }
|
||||
/// <summary>
|
||||
/// IP地址
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string IPAddress { get; set; }
|
||||
/// <summary>
|
||||
/// 描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// 登录时间
|
||||
|
@ -47,7 +47,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 登录名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string LoginName { get; set; }
|
||||
/// <summary>
|
||||
/// 用户ID
|
||||
|
|
|
@ -18,13 +18,13 @@ namespace Blog.Core.Model.Models
|
|||
[SugarColumn(IsNullable = true)]
|
||||
public bool? IsDeleted { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string plURL { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string plPWD { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string plAccountName { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
|
@ -33,10 +33,10 @@ namespace Blog.Core.Model.Models
|
|||
[SugarColumn(IsNullable = true)]
|
||||
public int? plErrorCount { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string plHintPwd { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string plHintquestion { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
|
@ -48,7 +48,7 @@ namespace Blog.Core.Model.Models
|
|||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? plLastErrTime { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string test { get; set; }
|
||||
|
||||
|
||||
|
|
|
@ -18,12 +18,12 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 菜单执行Action名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string Code { get; set; }
|
||||
/// <summary>
|
||||
/// 菜单显示名(如用户页、编辑(按钮)、删除(按钮))
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string Name { get; set; }
|
||||
/// <summary>
|
||||
/// 是否是按钮
|
||||
|
@ -44,7 +44,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 按钮事件
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Func { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
@ -54,12 +54,12 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 菜单图标
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Icon { get; set; }
|
||||
/// <summary>
|
||||
/// 菜单描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// 激活状态
|
||||
|
@ -73,7 +73,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -88,7 +88,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 修改者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
|
|
|
@ -34,12 +34,12 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 角色名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string Name { get; set; }
|
||||
/// <summary>
|
||||
///描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = true)]
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
///排序
|
||||
|
@ -57,7 +57,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
|
|
@ -30,7 +30,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -45,7 +45,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 修改者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
|
|
|
@ -13,32 +13,32 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 任务名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string Name { get; set; }
|
||||
/// <summary>
|
||||
/// 任务分组
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string JobGroup { get; set; }
|
||||
/// <summary>
|
||||
/// 任务运行时间表达式
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string Cron { get; set; }
|
||||
/// <summary>
|
||||
/// 任务所在DLL对应的程序集名称
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string AssemblyName { get; set; }
|
||||
/// <summary>
|
||||
/// 任务所在类
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string ClassName { get; set; }
|
||||
/// <summary>
|
||||
/// 任务描述
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 1000, IsNullable = true)]
|
||||
[SugarColumn(Length = 1000, IsNullable = true)]
|
||||
public string Remark { get; set; }
|
||||
/// <summary>
|
||||
/// 执行次数
|
||||
|
|
|
@ -14,19 +14,19 @@ namespace Blog.Core.Model.Models
|
|||
this.TopicDetail = new List<TopicDetail>();
|
||||
this.tUpdatetime = DateTime.Now;
|
||||
}
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tLogo { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tName { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 400, IsNullable = true)]
|
||||
[SugarColumn(Length = 400, IsNullable = true)]
|
||||
public string tDetail { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tAuthor { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tSectendDetail { get; set; }
|
||||
|
||||
public bool tIsDelete { get; set; }
|
||||
|
|
|
@ -13,19 +13,19 @@ namespace Blog.Core.Model.Models
|
|||
this.tdUpdatetime = DateTime.Now;
|
||||
}
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tdLogo { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tdName { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string tdContent { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string tdDetail { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tdSectendDetail { get; set; }
|
||||
|
||||
public bool tdIsDelete { get; set; } = false;
|
||||
|
@ -36,7 +36,7 @@ namespace Blog.Core.Model.Models
|
|||
public DateTime tdUpdatetime { get; set; }
|
||||
public int tdTop { get; set; }
|
||||
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string tdAuthor { get; set; }
|
||||
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 创建者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType ="nvarchar",Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -50,7 +50,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 修改者
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType ="nvarchar",Length = 50, IsNullable = true)]
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
|
|
75
Blog.Core.Model/Models/WeChatCompany.cs
Normal file
75
Blog.Core.Model/Models/WeChatCompany.cs
Normal file
|
@ -0,0 +1,75 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatCompany")]
|
||||
public partial class WeChatCompany
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 公司ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true, Length = 100, IsNullable = false)]
|
||||
public string CompanyID { get; set; }
|
||||
/// <summary>
|
||||
/// 公司名称
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string CompanyName { get; set; }
|
||||
/// <summary>
|
||||
/// 公司IP
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string CompanyIP { get; set; }
|
||||
/// <summary>
|
||||
/// 公司备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = false)]
|
||||
public string CompanyRemark { get; set; }
|
||||
/// <summary>
|
||||
/// api地址
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = false)]
|
||||
public string CompanyAPI { get; set; }
|
||||
/// <summary>
|
||||
/// 是否激活
|
||||
/// </summary>
|
||||
public bool Enabled { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
110
Blog.Core.Model/Models/WeChatConfig.cs
Normal file
110
Blog.Core.Model/Models/WeChatConfig.cs
Normal file
|
@ -0,0 +1,110 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatConfig")]
|
||||
public class WeChatConfig
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 微信公众号唯一标识
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true, Length = 100, IsNullable = false)]
|
||||
public string publicAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信公众号名称
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = false)]
|
||||
public string publicNick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信账号
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string weChatAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信名称
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200)]
|
||||
public string weChatNick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应用ID
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100)]
|
||||
public string appid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 应用秘钥
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string appsecret { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众号推送token
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string token { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 验证秘钥(验证消息是否真实)
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string interactiveToken { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信公众号token过期时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? tokenExpiration { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200,IsNullable = true)]
|
||||
public string remark { get; set; }
|
||||
/// <summary>
|
||||
/// 是否激活
|
||||
/// </summary>
|
||||
public bool Enabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
116
Blog.Core.Model/Models/WeChatPushLog.cs
Normal file
116
Blog.Core.Model/Models/WeChatPushLog.cs
Normal file
|
@ -0,0 +1,116 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatPushLog")]
|
||||
public partial class WeChatPushLog
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 推送ID
|
||||
/// </summary>
|
||||
[SugarColumn(IsPrimaryKey = true,IsNullable = false)]
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 来自谁
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string PushLogFrom { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送IP
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string PushLogIP { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送客户
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string PushLogCompanyID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送用户
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string PushLogToUserID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送模板ID
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string PushLogTemplateID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送内容
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string PushLogContent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false)]
|
||||
public DateTime? PushLogTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送状态(Y/N)
|
||||
/// </summary>
|
||||
[SugarColumn(Length =1,IsNullable = false)]
|
||||
public string PushLogStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = false)]
|
||||
public string PushLogRemark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送OpenID
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string PushLogOpenid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 推送微信公众号
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string PushLogPublicAccount { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
96
Blog.Core.Model/Models/WeChatQR.cs
Normal file
96
Blog.Core.Model/Models/WeChatQR.cs
Normal file
|
@ -0,0 +1,96 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatQR")]
|
||||
public partial class WeChatQR
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 主键id,ticket
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200,IsPrimaryKey =true, IsNullable = false)]
|
||||
public string QRticket { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 需要绑定的公司
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string QRbindCompanyID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 需要绑定的员工id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string QRbindJobID { get; set; }
|
||||
/// <summary>
|
||||
/// 需要绑定的员工昵称
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string QRbindJobNick { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public DateTime QRcrateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联的公众号
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string QRpublicAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否已使用
|
||||
/// </summary>
|
||||
public bool QRisUsed { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 使用时间
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public DateTime? QRuseTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 关联的微信用户id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string QRuseOpenid { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
104
Blog.Core.Model/Models/WeChatSub.cs
Normal file
104
Blog.Core.Model/Models/WeChatSub.cs
Normal file
|
@ -0,0 +1,104 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatSub")]
|
||||
public partial class WeChatSub
|
||||
{
|
||||
[SugarColumn(IsNullable = false,IsPrimaryKey = true)]
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 来自哪个公众号
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100 , IsNullable = false, IndexGroupNameList = new string[] { "index" })]
|
||||
public string SubFromPublicAccount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绑定公司id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100 , IsNullable = false, IndexGroupNameList = new string[] { "index" })]
|
||||
public string CompanyID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绑定员工id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100 , IsNullable = false, IndexGroupNameList = new string[] { "index" })]
|
||||
public string SubJobID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绑定微信id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = false)]
|
||||
public string SubUserOpenID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绑定微信联合id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string SubUserUnionID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绑定时间
|
||||
/// </summary>
|
||||
public DateTime SubUserRegTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 更新时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? SubUserRefTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string SubUserRemark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否已解绑
|
||||
/// </summary>
|
||||
public bool IsUnBind { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 上次绑定微信id
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100, IsNullable = true)]
|
||||
public string LastSubUserOpenID { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
92
Blog.Core.Model/Models/WeChatUploadFile.cs
Normal file
92
Blog.Core.Model/Models/WeChatUploadFile.cs
Normal file
|
@ -0,0 +1,92 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Blog.Core.Model.Models
|
||||
{
|
||||
///<summary>
|
||||
///
|
||||
///</summary>
|
||||
[SugarTable("WeChatUploadFile")]
|
||||
public partial class WeChatUploadFile
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 文件ID
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 100,IsPrimaryKey = true,IsNullable =false)]
|
||||
public string UploadFileID { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件名称
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = false)]
|
||||
public string UploadFileName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件大小
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = false)]
|
||||
public int? UploadFileSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件类型
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string UploadFileContentType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件拓展名
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 50, IsNullable = true)]
|
||||
public string UploadFileExtension { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件位置
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string UploadFilePosition { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件上传时间
|
||||
/// </summary>
|
||||
public DateTime? UploadFileTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件备注
|
||||
/// </summary>
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string UploadFileRemark { get; set; }
|
||||
/// <summary>
|
||||
/// 创建者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? CreateId { get; set; }
|
||||
/// <summary>
|
||||
/// 创建人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string CreateBy { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 修改者id
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public int? ModifyId { get; set; }
|
||||
/// <summary>
|
||||
/// 修改人
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public string ModifyBy { get; set; }
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime? ModifyTime { get; set; }
|
||||
}
|
||||
}
|
|
@ -28,17 +28,17 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 登录账号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string uLoginName { get; set; }
|
||||
/// <summary>
|
||||
/// 登录密码
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string uLoginPWD { get; set; }
|
||||
/// <summary>
|
||||
/// 真实姓名
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string uRealName { get; set; }
|
||||
/// <summary>
|
||||
/// 状态
|
||||
|
@ -47,7 +47,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 2000, IsNullable = true)]
|
||||
[SugarColumn(Length = 2000, IsNullable = true)]
|
||||
public string uRemark { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
|
@ -73,7 +73,7 @@ namespace Blog.Core.Model.Models
|
|||
/// <summary>
|
||||
/// 登录账号
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string name { get; set; }
|
||||
|
||||
// 性别
|
||||
|
@ -86,7 +86,7 @@ namespace Blog.Core.Model.Models
|
|||
[SugarColumn(IsNullable = true)]
|
||||
public DateTime birth { get; set; } = DateTime.Now;
|
||||
// 地址
|
||||
[SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = true)]
|
||||
[SugarColumn(Length = 200, IsNullable = true)]
|
||||
public string addr { get; set; }
|
||||
|
||||
[SugarColumn(IsNullable = true)]
|
||||
|
|
31
Blog.Core.Model/PaginationModel.cs
Normal file
31
Blog.Core.Model/PaginationModel.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model
|
||||
{
|
||||
/// <summary>
|
||||
/// 所需分页参数
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-3 20:31:26
|
||||
/// </summary>
|
||||
public class PaginationModel
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前页
|
||||
/// </summary>
|
||||
public int intPageIndex { get; set; } = 1;
|
||||
/// <summary>
|
||||
/// 每页大小
|
||||
/// </summary>
|
||||
public int intPageSize { get; set; } = 10;
|
||||
/// <summary>
|
||||
/// 排序字段(例如:id desc,time asc)
|
||||
/// </summary>
|
||||
public string strOrderByFileds { get; set; }
|
||||
/// <summary>
|
||||
/// 查询条件( 例如:id = 1 and name = 小明)
|
||||
/// </summary>
|
||||
public string conditions { get; set; }
|
||||
}
|
||||
}
|
116
Blog.Core.Model/ViewModels/WeChatApiDto.cs
Normal file
116
Blog.Core.Model/ViewModels/WeChatApiDto.cs
Normal file
|
@ -0,0 +1,116 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信接口消息DTO
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-03-25
|
||||
/// </summary>
|
||||
public class WeChatApiDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号ID(数据库查询)
|
||||
/// </summary>
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 错误代码
|
||||
/// </summary>
|
||||
public int errcode { get; set; }
|
||||
/// <summary>
|
||||
/// 错误信息
|
||||
/// </summary>
|
||||
public string errmsg { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// token
|
||||
/// </summary>
|
||||
public string access_token { get; set; }
|
||||
/// <summary>
|
||||
/// 过期时间(秒)
|
||||
/// </summary>
|
||||
public int expires_in { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 用户关注数
|
||||
/// </summary>
|
||||
public int total { get; set; }
|
||||
/// <summary>
|
||||
/// 获取用户数量
|
||||
/// </summary>
|
||||
public int count { get; set; }
|
||||
/// <summary>
|
||||
/// 获取用户OpenIDs
|
||||
/// </summary>
|
||||
public WeChatOpenIDsDto data { get; set; }
|
||||
public List<WeChatApiDto> users { get; set; }
|
||||
/// <summary>
|
||||
/// 下一个关注用户
|
||||
/// </summary>
|
||||
public string next_openid { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 微信消息模板列表
|
||||
/// </summary>
|
||||
|
||||
public WeChatTemplateList[] template_list { get; set; }
|
||||
/// <summary>
|
||||
/// 微信菜单
|
||||
/// </summary>
|
||||
public WeChatMenuDto menu { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 二维码票据
|
||||
/// </summary>
|
||||
public string ticket { get; set; }
|
||||
/// <summary>
|
||||
/// 二维码过期时间
|
||||
/// </summary>
|
||||
public int expire_seconds { get; set; }
|
||||
/// <summary>
|
||||
/// 二维码地址
|
||||
/// </summary>
|
||||
public string url { get; set; }
|
||||
/// <summary>
|
||||
/// 关注状态
|
||||
/// </summary>
|
||||
public string subscribe { get; set; }
|
||||
/// <summary>
|
||||
/// 用户微信ID
|
||||
/// </summary>
|
||||
public string openid { get; set; }
|
||||
/// <summary>
|
||||
/// 昵称
|
||||
/// </summary>
|
||||
public string nickname { get; set; }
|
||||
/// <summary>
|
||||
/// 性别
|
||||
/// </summary>
|
||||
public int sex { get; set; }
|
||||
/// <summary>
|
||||
/// 语言
|
||||
/// </summary>
|
||||
public string language { get; set; }
|
||||
/// <summary>
|
||||
/// 城市
|
||||
/// </summary>
|
||||
public string city { get; set; }
|
||||
/// <summary>
|
||||
/// 省份
|
||||
/// </summary>
|
||||
public string province { get; set; }
|
||||
/// <summary>
|
||||
/// 城市
|
||||
/// </summary>
|
||||
public string country { get; set; }
|
||||
/// <summary>
|
||||
/// 头像地址
|
||||
/// </summary>
|
||||
public string headimgurl { get; set; }
|
||||
|
||||
}
|
||||
}
|
23
Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs
Normal file
23
Blog.Core.Model/ViewModels/WeChatCardMsgDataDto.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信推送消息Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:16:16
|
||||
/// </summary>
|
||||
public class WeChatCardMsgDataDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送关键信息
|
||||
/// </summary>
|
||||
public WeChatUserInfo info { get; set; }
|
||||
/// <summary>
|
||||
/// 推送卡片消息Dto
|
||||
/// </summary>
|
||||
public WeChatCardMsgDetailDto cardMsg { set; get; }
|
||||
}
|
||||
}
|
23
Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs
Normal file
23
Blog.Core.Model/ViewModels/WeChatCardMsgDataOpenIDDto.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信推送消息Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-11-23 16:29:05
|
||||
/// </summary>
|
||||
public class WeChatCardMsgDataOpenIDDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送关键信息
|
||||
/// </summary>
|
||||
public WeChatUserInfoOpenID info { get; set; }
|
||||
/// <summary>
|
||||
/// 推送卡片消息Dto
|
||||
/// </summary>
|
||||
public WeChatCardMsgDetailDto cardMsg { set; get; }
|
||||
}
|
||||
}
|
80
Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs
Normal file
80
Blog.Core.Model/ViewModels/WeChatCardMsgDetailDto.cs
Normal file
|
@ -0,0 +1,80 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 消息模板dto(如何填写数据,请参考微信模板即可)
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-1 09:32:16
|
||||
/// </summary>
|
||||
public class WeChatCardMsgDetailDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 消息模板
|
||||
/// </summary>
|
||||
public string template_id { get; set; }
|
||||
/// <summary>
|
||||
/// 标题
|
||||
/// </summary>
|
||||
public string first { get; set; }
|
||||
/// <summary>
|
||||
/// 标题颜色(颜色代码都必须为#开头的16进制代码)
|
||||
/// </summary>
|
||||
public string colorFirst { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 内容1
|
||||
/// </summary>
|
||||
public string keyword1 { get; set; }
|
||||
/// <summary>
|
||||
/// 内容1颜色
|
||||
/// </summary>
|
||||
|
||||
public string color1 { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 内容2
|
||||
/// </summary>
|
||||
public string keyword2 { get; set; }
|
||||
/// <summary>
|
||||
/// 内容2颜色
|
||||
/// </summary>
|
||||
public string color2 { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 内容3
|
||||
/// </summary>
|
||||
public string keyword3 { get; set; }
|
||||
/// <summary>
|
||||
/// 内容3颜色
|
||||
/// </summary>
|
||||
public string color3 { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 内容4
|
||||
/// </summary>
|
||||
public string keyword4 { get; set; }
|
||||
/// <summary>
|
||||
/// 内容4颜色
|
||||
/// </summary>
|
||||
public string color4 { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 内容5
|
||||
/// </summary>
|
||||
public string keyword5 { get; set; }
|
||||
/// <summary>
|
||||
/// 内容5颜色
|
||||
/// </summary>
|
||||
public string color5 { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 备注信息
|
||||
/// </summary>
|
||||
public string remark { get; set; }
|
||||
/// <summary>
|
||||
/// 备注信息颜色
|
||||
/// </summary>
|
||||
public string colorRemark { get; set; } = "#173177";
|
||||
/// <summary>
|
||||
/// 跳转连接
|
||||
/// </summary>
|
||||
public string url { get; set; }
|
||||
}
|
||||
}
|
18
Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs
Normal file
18
Blog.Core.Model/ViewModels/WeChatMenuButtonDto.cs
Normal file
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取微信菜单DTO,用于存放具体菜单内容
|
||||
/// </summary>
|
||||
public class WeChatMenuButtonDto
|
||||
{
|
||||
public string type { get; set; }
|
||||
public string name { get; set; }
|
||||
public string key { get; set; }
|
||||
public string url { get; set; }
|
||||
public WeChatMenuButtonDto[] sub_button { get; set; }
|
||||
}
|
||||
}
|
18
Blog.Core.Model/ViewModels/WeChatMenuDto.cs
Normal file
18
Blog.Core.Model/ViewModels/WeChatMenuDto.cs
Normal file
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取微信菜单DTO
|
||||
/// </summary>
|
||||
public class WeChatMenuDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 按钮列表(最多三个)
|
||||
/// </summary>
|
||||
public WeChatMenuButtonDto[] button { get; set; }
|
||||
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatOpenIDsDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信OpenID列表Dto
|
||||
/// </summary>
|
||||
public class WeChatOpenIDsDto
|
||||
{
|
||||
public List<string> openid { get; set; } = new List<string>();
|
||||
}
|
||||
}
|
22
Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs
Normal file
22
Blog.Core.Model/ViewModels/WeChatPushCardMsgDetailDto.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送详细数据
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:16:16
|
||||
/// </summary>
|
||||
public class WeChatPushCardMsgDetailDto
|
||||
{
|
||||
public WeChatPushCardMsgValueColorDto first { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto keyword1 { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto keyword2 { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto keyword3 { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto keyword4 { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto keyword5 { get; set; }
|
||||
public WeChatPushCardMsgValueColorDto remark { get; set; }
|
||||
}
|
||||
}
|
31
Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs
Normal file
31
Blog.Core.Model/ViewModels/WeChatPushCardMsgDto.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送给微信所需Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:16:16
|
||||
/// </summary>
|
||||
public class WeChatPushCardMsgDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送微信用户ID
|
||||
/// </summary>
|
||||
public string touser { get; set; }
|
||||
/// <summary>
|
||||
/// 推送的模板ID
|
||||
/// </summary>
|
||||
public string template_id { get; set; }
|
||||
/// <summary>
|
||||
/// 推送URL地址
|
||||
/// </summary>
|
||||
public string url { get; set; }
|
||||
/// <summary>
|
||||
/// 推送的数据
|
||||
/// </summary>
|
||||
public WeChatPushCardMsgDetailDto data { get; set; }
|
||||
}
|
||||
}
|
23
Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs
Normal file
23
Blog.Core.Model/ViewModels/WeChatPushCardMsgValueColorDto.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信keyword所需Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:18:08
|
||||
/// </summary>
|
||||
public class WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 内容
|
||||
/// </summary>
|
||||
public string value { get; set; }
|
||||
/// <summary>
|
||||
/// 文字颜色
|
||||
/// </summary>
|
||||
public string color { get; set; } = "#173177";
|
||||
}
|
||||
}
|
26
Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs
Normal file
26
Blog.Core.Model/ViewModels/WeChatPushLinkMsgContentDto.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
public class WeChatPushLinkMsgContentDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 图文链接标题
|
||||
/// </summary>
|
||||
public string title { get; set; }
|
||||
/// <summary>
|
||||
/// 图文描述
|
||||
/// </summary>
|
||||
public string description { get; set; }
|
||||
/// <summary>
|
||||
/// 访问URL
|
||||
/// </summary>
|
||||
public string viewUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 图片URL
|
||||
/// </summary>
|
||||
public string pictureUrl { get; set; }
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatPushPictureContentDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
public class WeChatPushPictureContentDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 图片mediaID
|
||||
/// </summary>
|
||||
public string pictureMediaID { get; set; }
|
||||
}
|
||||
}
|
61
Blog.Core.Model/ViewModels/WeChatPushTestDto.cs
Normal file
61
Blog.Core.Model/ViewModels/WeChatPushTestDto.cs
Normal file
|
@ -0,0 +1,61 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 推送模拟消息Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-24 14:52:44
|
||||
/// </summary>
|
||||
public class WeChatPushTestDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前选中的微信公众号
|
||||
/// </summary>
|
||||
public string selectWeChat { get; set; }
|
||||
/// <summary>
|
||||
/// 当前选中的操作集合
|
||||
/// </summary>
|
||||
public string selectOperate { get; set; }
|
||||
/// <summary>
|
||||
/// 当前选中的绑定还是订阅
|
||||
/// </summary>
|
||||
public string selectBindOrSub { get; set; }
|
||||
/// <summary>
|
||||
/// 当前选中的微信客户
|
||||
/// </summary>
|
||||
public string selectCompany { get; set; }
|
||||
/// <summary>
|
||||
/// 当前选中的消息类型
|
||||
/// </summary>
|
||||
public string selectMsgType { get; set; }
|
||||
/// <summary>
|
||||
/// 当前选中要发送的用户
|
||||
/// </summary>
|
||||
public string selectUser { get; set; }
|
||||
/// <summary>
|
||||
/// 文本消息
|
||||
/// </summary>
|
||||
public WeChatPushTextContentDto textContent { get; set; }
|
||||
/// <summary>
|
||||
/// 图片消息
|
||||
/// </summary>
|
||||
public WeChatPushPictureContentDto pictureContent { get; set; }
|
||||
/// <summary>
|
||||
/// 语音消息
|
||||
/// </summary>
|
||||
public WeChatPushVoiceContentDto voiceContent { get; set; }
|
||||
/// <summary>
|
||||
/// 视频消息
|
||||
/// </summary>
|
||||
public WeChatPushVideoContentDto videoContent { get; set; }
|
||||
/// <summary>
|
||||
/// 链接消息
|
||||
/// </summary>
|
||||
public WeChatPushLinkMsgContentDto linkMsgContent { get; set; }
|
||||
|
||||
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatPushTextContentDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
public class WeChatPushTextContentDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 文字消息
|
||||
/// </summary>
|
||||
public string text { get; set; }
|
||||
}
|
||||
}
|
22
Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs
Normal file
22
Blog.Core.Model/ViewModels/WeChatPushVideoContentDto.cs
Normal file
|
@ -0,0 +1,22 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
public class WeChatPushVideoContentDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 视频标题
|
||||
/// </summary>
|
||||
public string title { get; set; }
|
||||
/// <summary>
|
||||
/// 视频封面mediaID
|
||||
/// </summary>
|
||||
public string pictureMediaID { get; set; }
|
||||
/// <summary>
|
||||
/// 视频mediaID
|
||||
/// </summary>
|
||||
public string videoMediaID { get; set; }
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatPushVoiceContentDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
public class WeChatPushVoiceContentDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 语音mediaID
|
||||
/// </summary>
|
||||
public string voiceMediaID { get; set; }
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatQRActionDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatQRActionDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信二维码预装发送信息dto
|
||||
/// </summary>
|
||||
public class WeChatQRActionDto
|
||||
{
|
||||
public WeChatQRActionInfoDto scene { get; set; }
|
||||
}
|
||||
}
|
14
Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs
Normal file
14
Blog.Core.Model/ViewModels/WeChatQRActionInfoDto.cs
Normal file
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信二维码预装具体消息
|
||||
/// </summary>
|
||||
public class WeChatQRActionInfoDto
|
||||
{
|
||||
public string scene_str { get; set; }
|
||||
}
|
||||
}
|
16
Blog.Core.Model/ViewModels/WeChatQRDto.cs
Normal file
16
Blog.Core.Model/ViewModels/WeChatQRDto.cs
Normal file
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信二维码预装信息DTO
|
||||
/// </summary>
|
||||
public class WeChatQRDto
|
||||
{
|
||||
public int expire_seconds { get; set; }
|
||||
public string action_name { get; set; }
|
||||
public WeChatQRActionDto action_info { get; set; }
|
||||
}
|
||||
}
|
28
Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs
Normal file
28
Blog.Core.Model/ViewModels/WeChatResponseUserInfo.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 返回给调用者的Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:52:06
|
||||
/// </summary>
|
||||
public class WeChatResponseUserInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号ID
|
||||
/// </summary>
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 公司代码
|
||||
/// </summary>
|
||||
public string companyCode { get; set; }
|
||||
/// <summary>
|
||||
/// 数据
|
||||
/// </summary>
|
||||
public WeChatApiDto usersData { get; set; }
|
||||
}
|
||||
}
|
15
Blog.Core.Model/ViewModels/WeChatTemplateList.cs
Normal file
15
Blog.Core.Model/ViewModels/WeChatTemplateList.cs
Normal file
|
@ -0,0 +1,15 @@
|
|||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信消息模板Dto
|
||||
/// </summary>
|
||||
public class WeChatTemplateList
|
||||
{
|
||||
public string template_id { get; set; }
|
||||
public string title { get; set; }
|
||||
public string primary_industry { get; set; }
|
||||
public string deputy_industry { get; set; }
|
||||
public string content { get; set; }
|
||||
public string example { get; set; }
|
||||
}
|
||||
}
|
31
Blog.Core.Model/ViewModels/WeChatUserInfo.cs
Normal file
31
Blog.Core.Model/ViewModels/WeChatUserInfo.cs
Normal file
|
@ -0,0 +1,31 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信推送所需信息(公司版本)
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-8 09:04:36
|
||||
/// </summary>
|
||||
public class WeChatUserInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号ID
|
||||
/// </summary>
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 公司代码
|
||||
/// </summary>
|
||||
public string companyCode { get; set; }
|
||||
/// <summary>
|
||||
/// 用户id
|
||||
/// </summary>
|
||||
public string userID { get; set; }
|
||||
/// <summary>
|
||||
/// 用户昵称
|
||||
/// </summary>
|
||||
public string userNick { get; set; }
|
||||
}
|
||||
}
|
23
Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs
Normal file
23
Blog.Core.Model/ViewModels/WeChatUserInfoOpenID.cs
Normal file
|
@ -0,0 +1,23 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信推送所需信息(OpenID版本)
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-11-23 16:27:29
|
||||
/// </summary>
|
||||
public class WeChatUserInfoOpenID
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号ID
|
||||
/// </summary>
|
||||
public string id { get; set; }
|
||||
/// <summary>
|
||||
/// 微信OpenID
|
||||
/// </summary>
|
||||
public List<string> userID { get; set; }
|
||||
}
|
||||
}
|
37
Blog.Core.Model/ViewModels/WeChatValidDto.cs
Normal file
37
Blog.Core.Model/ViewModels/WeChatValidDto.cs
Normal file
|
@ -0,0 +1,37 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信验证Dto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-1 21:34:07
|
||||
/// </summary>
|
||||
public class WeChatValidDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号唯一标识
|
||||
/// </summary>
|
||||
public string publicAccount { get; set; }
|
||||
/// <summary>
|
||||
/// 验证成功后返回给微信的字符串
|
||||
/// </summary>
|
||||
public string echoStr { get; set; }
|
||||
/// <summary>
|
||||
/// 签名
|
||||
/// </summary>
|
||||
public string signature { get; set; }
|
||||
/// <summary>
|
||||
/// 时间戳
|
||||
/// </summary>
|
||||
public string timestamp { get; set; }
|
||||
/// <summary>
|
||||
/// 随机数
|
||||
/// </summary>
|
||||
public string nonce { get; set; }
|
||||
|
||||
}
|
||||
}
|
118
Blog.Core.Model/ViewModels/WeChatXMLDto.cs
Normal file
118
Blog.Core.Model/ViewModels/WeChatXMLDto.cs
Normal file
|
@ -0,0 +1,118 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Blog.Core.Model.ViewModels
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信XmlDto
|
||||
/// 作者:胡丁文
|
||||
/// 时间:2020-4-3 20:31:26
|
||||
/// </summary>
|
||||
[XmlRoot(ElementName ="xml")]
|
||||
public class WeChatXMLDto
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信公众号唯一表示
|
||||
/// </summary>
|
||||
public string publicAccount { get; set; }
|
||||
/// <summary>
|
||||
/// 微信开发者
|
||||
/// </summary>
|
||||
public string ToUserName { get; set; }
|
||||
/// <summary>
|
||||
/// 来自谁
|
||||
/// </summary>
|
||||
public string FromUserName { get; set; }
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
public string CreateTime { get; set; }
|
||||
/// <summary>
|
||||
/// 消息类型
|
||||
/// </summary>
|
||||
public string MsgType { get; set; }
|
||||
/// <summary>
|
||||
/// 文字内容
|
||||
/// </summary>
|
||||
public string Content { get; set; }
|
||||
/// <summary>
|
||||
/// 消息ID
|
||||
/// </summary>
|
||||
public string MsgId { get; set; }
|
||||
/// <summary>
|
||||
/// 消息事件
|
||||
/// </summary>
|
||||
public string Event { get; set; }
|
||||
/// <summary>
|
||||
/// 事件key值
|
||||
/// </summary>
|
||||
public string EventKey { get; set; }
|
||||
/// <summary>
|
||||
/// 图片地址
|
||||
/// </summary>
|
||||
public string PicUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 多媒体ID
|
||||
/// </summary>
|
||||
public string MediaId { get; set; }
|
||||
/// <summary>
|
||||
/// 格式
|
||||
/// </summary>
|
||||
public string Format { get; set; }
|
||||
/// <summary>
|
||||
/// 语音失败
|
||||
/// </summary>
|
||||
public string Recognition { get; set; }
|
||||
/// <summary>
|
||||
/// 缩略媒体ID
|
||||
/// </summary>
|
||||
public string ThumbMediaId { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置维度
|
||||
/// </summary>
|
||||
public string Location_X { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置经度
|
||||
/// </summary>
|
||||
public string Location_Y { get; set; }
|
||||
/// <summary>
|
||||
/// 地图缩放大小
|
||||
/// </summary>
|
||||
public string Scale { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置信息
|
||||
/// </summary>
|
||||
public string Label { get; set; }
|
||||
/// <summary>
|
||||
/// 消息标题
|
||||
/// </summary>
|
||||
public string Title { get; set; }
|
||||
/// <summary>
|
||||
/// 消息描述
|
||||
/// </summary>
|
||||
public string Description { get; set; }
|
||||
/// <summary>
|
||||
/// 消息链接
|
||||
/// </summary>
|
||||
public string Url { get; set; }
|
||||
/// <summary>
|
||||
/// 二维码的ticket,可用来换取二维码图片
|
||||
/// </summary>
|
||||
public string Ticket { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置纬度
|
||||
/// </summary>
|
||||
public string Latitude { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置经度
|
||||
/// </summary>
|
||||
public string Longitude { get; set; }
|
||||
/// <summary>
|
||||
/// 地理位置精度
|
||||
/// </summary>
|
||||
public string Precision { get; set; }
|
||||
}
|
||||
}
|
|
@ -72,7 +72,7 @@ namespace Blog.Core.Serilog.Es.HttpInfo
|
|||
}
|
||||
return data;
|
||||
}
|
||||
catch(Exception ex)
|
||||
catch(Exception)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IServices.BASE;
|
||||
using Blog.Core.Model;
|
||||
using SqlSugar;
|
||||
|
@ -317,6 +318,11 @@ namespace Blog.Core.Services.BASE
|
|||
{
|
||||
return await BaseDal.QueryMuch(joinExpression, selectExpression, whereLambda);
|
||||
}
|
||||
public async Task<PageModel<TEntity>> QueryPage(PaginationModel pagination)
|
||||
{
|
||||
var express = DynamicLinqFactory.CreateLambda<TEntity>(pagination.conditions);
|
||||
return await QueryPage(express, pagination.intPageIndex, pagination.intPageSize, pagination.strOrderByFileds);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
34
Blog.Core.Services/WeChatCompanyServices.cs
Normal file
34
Blog.Core.Services/WeChatCompanyServices.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using Blog.Core.Common;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IRepository.UnitOfWork;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Blog.Core.Services.BASE;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatCompanyServices
|
||||
/// </summary>
|
||||
public class WeChatCompanyServices : BaseServices<WeChatCompany>, IWeChatCompanyServices
|
||||
{
|
||||
readonly IBaseRepository<WeChatCompany> _dal;
|
||||
readonly IUnitOfWork _unitOfWork;
|
||||
readonly ILogger<WeChatCompanyServices> _logger;
|
||||
public WeChatCompanyServices(IBaseRepository<WeChatCompany> dal,IUnitOfWork unitOfWork, ILogger<WeChatCompanyServices> logger)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
this._unitOfWork = unitOfWork;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
906
Blog.Core.Services/WeChatConfigServices.cs
Normal file
906
Blog.Core.Services/WeChatConfigServices.cs
Normal file
|
@ -0,0 +1,906 @@
|
|||
using Blog.Core.Common;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IRepository.UnitOfWork;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Blog.Core.Services.BASE;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatConfigServices
|
||||
/// </summary>
|
||||
public class WeChatConfigServices : BaseServices<WeChatConfig>, IWeChatConfigServices
|
||||
{
|
||||
readonly IBaseRepository<WeChatConfig> _dal;
|
||||
readonly IUnitOfWork _unitOfWork;
|
||||
readonly ILogger<WeChatConfigServices> _logger;
|
||||
public WeChatConfigServices(IBaseRepository<WeChatConfig> dal,IUnitOfWork unitOfWork, ILogger<WeChatConfigServices> logger)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
this._unitOfWork = unitOfWork;
|
||||
this._logger = logger;
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> GetToken(string publicAccount)
|
||||
{
|
||||
var config = await this.QueryById(publicAccount);
|
||||
if (config == null) MessageModel<string>.Success($"公众号{publicAccount}未维护至系统");//还没过期,直接返回
|
||||
if (config.tokenExpiration > DateTime.Now)
|
||||
{
|
||||
//再次判断token在微信服务器是否正确
|
||||
var wechatIP = await WeChatHelper.GetWechatIP(config.token);
|
||||
if (wechatIP.errcode == 0)
|
||||
MessageModel<WeChatApiDto>.Success("", new WeChatApiDto { access_token = config.token });//还没过期,直接返回
|
||||
}
|
||||
//过期了,重新获取
|
||||
var data = await WeChatHelper.GetToken(config.appid, config.appsecret);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
config.token = data.access_token;
|
||||
config.tokenExpiration = DateTime.Now.AddSeconds(data.expires_in);
|
||||
await this.Update(config);
|
||||
return MessageModel<WeChatApiDto>.Success("",data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Fail($"\r\n获取Token失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}");
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> RefreshToken(string publicAccount)
|
||||
{
|
||||
var config = await this.QueryById(publicAccount);
|
||||
if (config == null) MessageModel<string>.Success($"公众号{publicAccount}未维护至系统");//还没过期,直接返回
|
||||
//过期了,重新获取
|
||||
var data = await WeChatHelper.GetToken(config.appid, config.appsecret);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
config.token = data.access_token;
|
||||
config.tokenExpiration = DateTime.Now.AddSeconds(data.expires_in);
|
||||
await this.Update(config);
|
||||
return MessageModel<WeChatApiDto>.Success("", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Fail($"\r\n获取Token失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}");
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> GetTemplate(string id)
|
||||
{
|
||||
var res = await GetToken(id);
|
||||
if (!res.success) return res;
|
||||
var data = await WeChatHelper.GetTemplate(res.response.access_token);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success("", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success($"\r\n获取模板失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}", data);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取菜单
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<MessageModel<WeChatApiDto>> GetMenu(string id)
|
||||
{
|
||||
var res = await GetToken(id);
|
||||
if (!res.success) return res;
|
||||
var data = await WeChatHelper.GetMenu(res.response.access_token);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success("", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success($"\r\n获取菜单失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}", data);
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> GetSubUsers(string id)
|
||||
{
|
||||
var res = await GetToken(id);
|
||||
if (!res.success) return res;
|
||||
var data = await WeChatHelper.GetUsers(res.response.access_token);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
data.users = new List<WeChatApiDto>();
|
||||
foreach (var openid in data.data.openid)
|
||||
{
|
||||
data.users.Add(await WeChatHelper.GetUserInfo(res.response.access_token, openid));
|
||||
}
|
||||
return MessageModel<WeChatApiDto>.Success("", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success($"\r\n获取订阅用户失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}", data);
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> GetSubUser(string id,string openid)
|
||||
{
|
||||
var res = await GetToken(id);
|
||||
if (!res.success) return res;
|
||||
var data = await WeChatHelper.GetUserInfo(res.response.access_token,openid);
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success("", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success($"\r\n获取订阅用户失败\r\n错误代码:{data.errcode}\r\n错误信息:{data.errmsg}", data);
|
||||
}
|
||||
}
|
||||
public async Task<string> Valid(WeChatValidDto validDto,string body)
|
||||
{
|
||||
WeChatXMLDto weChatData = null;
|
||||
string objReturn = null;
|
||||
try
|
||||
{
|
||||
_logger.LogInformation("会话开始");
|
||||
if (string.IsNullOrEmpty(validDto.publicAccount)) throw new Exception("没有微信公众号唯一标识id数据");
|
||||
var config = await QueryById(validDto.publicAccount);
|
||||
if (config == null) throw new Exception($"公众号不存在=>{validDto.publicAccount}");
|
||||
_logger.LogInformation(JsonHelper.GetJSON<WeChatValidDto>(validDto));
|
||||
var token = config.interactiveToken;//验证用的token 和access_token不一样
|
||||
string[] arrTmp = { token, validDto.timestamp, validDto.nonce };
|
||||
Array.Sort(arrTmp);
|
||||
string combineString = string.Join("", arrTmp);
|
||||
string encryption = MD5Helper.Sha1(combineString).ToLower();
|
||||
|
||||
_logger.LogInformation(
|
||||
$"来自公众号:{validDto.publicAccount}\r\n" +
|
||||
$"微信signature:{validDto.signature}\r\n" +
|
||||
$"微信timestamp:{validDto.timestamp}\r\n" +
|
||||
$"微信nonce:{validDto.nonce}\r\n" +
|
||||
$"合并字符串:{combineString}\r\n" +
|
||||
$"微信服务器signature:{validDto.signature}\r\n" +
|
||||
$"本地服务器signature:{encryption}"
|
||||
);
|
||||
if (encryption == validDto.signature)
|
||||
{
|
||||
//判断是首次验证还是交互?
|
||||
if (string.IsNullOrEmpty(validDto.echoStr))
|
||||
{
|
||||
//非首次验证
|
||||
weChatData = XmlHelper.ParseFormByXml<WeChatXMLDto>(body, "xml");
|
||||
weChatData.publicAccount = validDto.publicAccount;
|
||||
objReturn = await HandleWeChat(weChatData);
|
||||
}
|
||||
else
|
||||
{
|
||||
//首次接口地址验证
|
||||
objReturn = validDto.echoStr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
objReturn = "签名验证失败";
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"会话出错(信息)=>\r\n{ex.Message}");
|
||||
_logger.LogInformation($"会话出错(堆栈)=>\r\n{ex.StackTrace}");
|
||||
//返回错误给用户
|
||||
objReturn = string.Format(@$"<xml><ToUserName><![CDATA[{weChatData?.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChatData?.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[{ex.Message}]]></Content></xml>");
|
||||
}
|
||||
finally
|
||||
{
|
||||
_logger.LogInformation($"微信get数据=>\r\n{JsonHelper.GetJSON<WeChatValidDto>(validDto)}");
|
||||
_logger.LogInformation($"微信post数据=>\r\n{body}");
|
||||
_logger.LogInformation($"返回微信数据=>\r\n{objReturn}");
|
||||
_logger.LogInformation($"会话结束");
|
||||
}
|
||||
return objReturn;
|
||||
}
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> GetQRBind(WeChatUserInfo info)
|
||||
{
|
||||
var res = await GetToken(info?.id);
|
||||
if (!res.success) return MessageModel<WeChatResponseUserInfo>.Fail(res.msg);
|
||||
var push = new WeChatQRDto
|
||||
{
|
||||
expire_seconds = 604800,
|
||||
action_name = "QR_STR_SCENE",
|
||||
action_info = new WeChatQRActionDto
|
||||
{
|
||||
scene = new WeChatQRActionInfoDto
|
||||
{
|
||||
scene_str = $"bind_{info?.id}"
|
||||
}
|
||||
}
|
||||
};
|
||||
WeChatResponseUserInfo reData = new WeChatResponseUserInfo();
|
||||
reData.companyCode = info.companyCode;
|
||||
reData.id = info.id;
|
||||
var pushJosn = JsonHelper.GetJSON<WeChatQRDto>(push);
|
||||
var data = await WeChatHelper.GetQRCode(res.response.access_token, pushJosn);
|
||||
WeChatQR weChatQR = new WeChatQR
|
||||
{
|
||||
QRbindCompanyID = info.companyCode,
|
||||
QRbindJobID = info.userID,
|
||||
QRbindJobNick = info.userNick,
|
||||
QRcrateTime = DateTime.Now,
|
||||
QRpublicAccount = info.id,
|
||||
QRticket = data.ticket
|
||||
};
|
||||
data.id = info.userID;
|
||||
await this._dal.Db.Insertable<WeChatQR>(weChatQR).ExecuteCommandAsync();
|
||||
reData.usersData= data;
|
||||
return MessageModel<WeChatResponseUserInfo>.Success("获取二维码成功", reData);
|
||||
}
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> PushCardMsg(WeChatCardMsgDataDto msg,string ip)
|
||||
{
|
||||
var bindUser = await _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount == msg.info.id && t.CompanyID == msg.info.companyCode && t.IsUnBind == false && msg.info.userID.Contains(t.SubJobID)).SingleAsync();
|
||||
if (bindUser == null)
|
||||
return MessageModel<WeChatResponseUserInfo>.Fail("用户不存在或者已经解绑!");
|
||||
var res = await GetToken(msg?.info?.id);
|
||||
if(!res.success)
|
||||
return MessageModel<WeChatResponseUserInfo>.Fail(res.msg);
|
||||
WeChatResponseUserInfo reData = new WeChatResponseUserInfo();
|
||||
reData.companyCode = msg.info.companyCode;
|
||||
reData.id = msg.info.id;
|
||||
try
|
||||
{
|
||||
var pushData = new WeChatPushCardMsgDto
|
||||
{
|
||||
template_id = msg.cardMsg.template_id,
|
||||
url = msg.cardMsg.url,
|
||||
touser = bindUser.SubUserOpenID,
|
||||
data = new WeChatPushCardMsgDetailDto
|
||||
{
|
||||
first = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.first,
|
||||
color = msg.cardMsg.color1
|
||||
},
|
||||
keyword1 = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.keyword1,
|
||||
color = msg.cardMsg.color1
|
||||
},
|
||||
keyword2 = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.keyword2,
|
||||
color = msg.cardMsg.color2
|
||||
},
|
||||
keyword3 = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.keyword3,
|
||||
color = msg.cardMsg.color3
|
||||
},
|
||||
keyword4 = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.keyword4,
|
||||
color = msg.cardMsg.color4
|
||||
},
|
||||
keyword5 = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.keyword5,
|
||||
color = msg.cardMsg.color5
|
||||
},
|
||||
remark = new WeChatPushCardMsgValueColorDto
|
||||
{
|
||||
value = msg.cardMsg.remark,
|
||||
color = msg.cardMsg.colorRemark
|
||||
}
|
||||
}
|
||||
};
|
||||
var pushJson = JsonHelper.GetJSON<WeChatPushCardMsgDto>(pushData);
|
||||
var data = await WeChatHelper.SendCardMsg(res.response.access_token, pushJson);
|
||||
reData.usersData = data;
|
||||
try
|
||||
{
|
||||
var pushLog = new WeChatPushLog
|
||||
{
|
||||
PushLogCompanyID = msg.info.companyCode,
|
||||
PushLogPublicAccount = msg.info.id,
|
||||
PushLogContent = pushJson,
|
||||
PushLogOpenid = bindUser.SubUserOpenID,
|
||||
PushLogToUserID = bindUser.SubJobID,
|
||||
PushLogStatus = data.errcode == 0 ? "Y" : "N",
|
||||
PushLogRemark = data.errmsg,
|
||||
PushLogTime = DateTime.Now,
|
||||
PushLogTemplateID = msg.cardMsg.template_id,
|
||||
PushLogIP = ip
|
||||
};
|
||||
await _dal.Db.Insertable<WeChatPushLog>(pushLog).ExecuteCommandAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogInformation($"记录失败\r\n{ex.Message}\r\n{ex.StackTrace}");
|
||||
}
|
||||
if (reData.usersData.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatResponseUserInfo>.Success("卡片消息推送成功", reData);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatResponseUserInfo>.Success("卡片消息推送失败", reData);
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return MessageModel<WeChatResponseUserInfo>.Success($"卡片消息推送错误=>{ex.Message}", reData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public async Task<MessageModel<WeChatApiDto>> PushTxtMsg(WeChatPushTestDto msg) {
|
||||
var res = await GetToken(msg.selectWeChat);
|
||||
if (!res.success) return res;
|
||||
var token = res.response.access_token;
|
||||
if (msg.selectBindOrSub.Equals("sub"))
|
||||
{
|
||||
return await PushText(token, msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageModel<WeChatApiDto> messageModel = new MessageModel<WeChatApiDto>();
|
||||
messageModel.success = true;
|
||||
//绑定用户
|
||||
if (msg.selectOperate.Equals("one"))
|
||||
{
|
||||
//发送单个
|
||||
var usrs = _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount.Equals(msg.selectWeChat) && t.CompanyID.Equals(msg.selectCompany) && t.SubJobID.Equals(msg.selectUser)).ToList();
|
||||
foreach (var item in usrs)
|
||||
{
|
||||
msg.selectUser = item.SubUserOpenID;
|
||||
var info = await PushText(token, msg);
|
||||
if (!info.success)
|
||||
{
|
||||
messageModel.success = false;
|
||||
}
|
||||
messageModel.msg += info.msg;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//发送所有
|
||||
var usrs = _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount.Equals(msg.selectWeChat) && t.CompanyID.Equals(msg.selectCompany)).ToList();
|
||||
foreach (var item in usrs)
|
||||
{
|
||||
msg.selectUser = item.SubUserOpenID;
|
||||
var info = await PushText(token, msg);
|
||||
if (!info.success)
|
||||
{
|
||||
messageModel.success = false;
|
||||
}
|
||||
messageModel.msg += info.msg;
|
||||
}
|
||||
}
|
||||
return messageModel;
|
||||
}
|
||||
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> PushText(string token,WeChatPushTestDto msg) {
|
||||
|
||||
object data = null; ;
|
||||
WeChatApiDto pushres = null; ;
|
||||
//订阅用户
|
||||
switch (msg.selectMsgType)
|
||||
{
|
||||
case "text":
|
||||
//发送文本
|
||||
data = new
|
||||
{
|
||||
filter = new
|
||||
{
|
||||
is_to_all = msg.selectOperate.Equals("one") ? false : true,
|
||||
tag_id = 0,
|
||||
},
|
||||
touser = msg.selectUser,
|
||||
msgtype = msg.selectMsgType,
|
||||
text = new
|
||||
{
|
||||
content = msg.textContent.text
|
||||
}
|
||||
};
|
||||
|
||||
if (msg.selectOperate.Equals("one"))
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsg(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsgToAll(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
break;
|
||||
case "image":
|
||||
//发送图片
|
||||
data = new
|
||||
{
|
||||
filter = new
|
||||
{
|
||||
is_to_all = msg.selectOperate.Equals("one") ? false : true,
|
||||
tag_id = 0,
|
||||
},
|
||||
touser = msg.selectUser,
|
||||
msgtype = msg.selectMsgType,
|
||||
images = new
|
||||
{
|
||||
media_ids = new List<string> {
|
||||
msg.pictureContent.pictureMediaID
|
||||
},
|
||||
recommend = "xxx",
|
||||
need_open_comment = 1,
|
||||
only_fans_can_comment = 0
|
||||
}
|
||||
};
|
||||
if (msg.selectOperate.Equals("one"))
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsg(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsgToAll(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
break;
|
||||
case "voice":
|
||||
//发送音频
|
||||
data = new
|
||||
{
|
||||
filter = new
|
||||
{
|
||||
is_to_all = msg.selectOperate.Equals("one") ? false : true,
|
||||
tag_id = 0,
|
||||
},
|
||||
touser = msg.selectUser,
|
||||
msgtype = msg.selectMsgType,
|
||||
voice = new
|
||||
{
|
||||
media_id = msg.voiceContent.voiceMediaID
|
||||
}
|
||||
};
|
||||
if (msg.selectOperate.Equals("one"))
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsg(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsgToAll(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
break;
|
||||
case "mpvideo":
|
||||
//发送视频
|
||||
data = new
|
||||
{
|
||||
filter = new
|
||||
{
|
||||
is_to_all = msg.selectOperate.Equals("one") ? false : true,
|
||||
tag_id = 0,
|
||||
},
|
||||
touser = msg.selectUser,
|
||||
msgtype = msg.selectMsgType,
|
||||
mpvideo = new
|
||||
{
|
||||
media_id = msg.videoContent.videoMediaID,
|
||||
}
|
||||
};
|
||||
if (msg.selectOperate.Equals("one"))
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsg(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
else
|
||||
{
|
||||
pushres = await WeChatHelper.SendMsgToAll(token, JsonHelper.ObjToJson(data));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
pushres = new WeChatApiDto() { errcode = -1, errmsg = $"未找到推送类型{msg.selectMsgType}" };
|
||||
break;
|
||||
}
|
||||
if (pushres.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success("推送成功", pushres);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Fail($"\r\n推送失败\r\n错误代码:{pushres.errcode}\r\n错误信息:{pushres.errmsg}", pushres);
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatApiDto>> UpdateMenu(WeChatApiDto menu)
|
||||
{
|
||||
WeChatHelper.ConverMenuButtonForEvent(menu);
|
||||
var res = await GetToken(menu.id);
|
||||
if (!res.success) return res;
|
||||
var data = await WeChatHelper.SetMenu(res.response.access_token, JsonHelper.ObjToJson(menu.menu));
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
|
||||
return MessageModel<WeChatApiDto>.Success("更新成功", data);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatApiDto>.Success("更新失败", data);
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> GetBindUserInfo(WeChatUserInfo info)
|
||||
{
|
||||
var bindUser = await _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount == info.id && t.CompanyID == info.companyCode && info.userID.Equals(t.SubJobID) && t.IsUnBind == false ).FirstAsync();
|
||||
if (bindUser == null) return MessageModel<WeChatResponseUserInfo>.Fail("用户不存在或者已经解绑!");
|
||||
var res = await GetToken(info.id);
|
||||
if(!res.success) return MessageModel<WeChatResponseUserInfo>.Fail(res.msg);
|
||||
var token = res.response.access_token;
|
||||
WeChatResponseUserInfo reData = new WeChatResponseUserInfo();
|
||||
reData.companyCode = info.companyCode;
|
||||
reData.id = info.id;
|
||||
var data = await WeChatHelper.GetUserInfo(token, bindUser.SubUserOpenID);
|
||||
reData.usersData = data;
|
||||
if (data.errcode.Equals(0))
|
||||
{
|
||||
return MessageModel<WeChatResponseUserInfo>.Success("用户信息获取成功", reData);
|
||||
}
|
||||
else
|
||||
{
|
||||
return MessageModel<WeChatResponseUserInfo>.Fail("用户信息获取失败", reData);
|
||||
}
|
||||
}
|
||||
public async Task<MessageModel<WeChatResponseUserInfo>> UnBind(WeChatUserInfo info)
|
||||
{
|
||||
var bindUser = await _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount == info.id && t.CompanyID == info.companyCode && info.userID.Equals(t.SubJobID) && t.IsUnBind == false ).FirstAsync();
|
||||
if (bindUser == null) return MessageModel<WeChatResponseUserInfo>.Fail("用户不存在或者已经解绑!");
|
||||
WeChatResponseUserInfo reData = new WeChatResponseUserInfo();
|
||||
reData.companyCode = info.companyCode;
|
||||
reData.id = info.id;
|
||||
bindUser.IsUnBind = true;
|
||||
bindUser.SubUserRefTime = DateTime.Now;
|
||||
await _dal.Db.Updateable<WeChatSub>(bindUser).UpdateColumns(t=> new{ t.IsUnBind,t.SubUserRefTime}).ExecuteCommandAsync();
|
||||
return MessageModel<WeChatResponseUserInfo>.Success("用户解绑成功", reData);
|
||||
}
|
||||
|
||||
public async Task<string> HandleWeChat(WeChatXMLDto weChat)
|
||||
{
|
||||
|
||||
switch (weChat.MsgType)
|
||||
{
|
||||
case "text":
|
||||
return await HandText(weChat);
|
||||
case "image":
|
||||
return await HandImage(weChat);
|
||||
case "voice":
|
||||
return await HandVoice(weChat);
|
||||
case "shortvideo":
|
||||
return await HandShortvideo(weChat);
|
||||
case "location":
|
||||
return await HandLocation(weChat);
|
||||
case "link":
|
||||
return await HandLink(weChat);
|
||||
case "event":
|
||||
return await HandEvent(weChat);
|
||||
default:
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[处理失败,没有找到消息类型=>{weChat.MsgType}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理文本
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandText(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了文本=>{weChat.Content}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理图片
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandImage(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了图片=>{weChat.PicUrl}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理声音
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandVoice(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了声音=>{weChat.MediaId}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理小视频
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandShortvideo(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了小视频=>{weChat.MediaId}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理地理位置
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandLocation(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了地址位置=>{weChat.Label}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理链接消息
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandLink(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了链接消息=>{weChat.Url}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 处理事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> HandEvent(WeChatXMLDto weChat)
|
||||
{
|
||||
|
||||
switch (weChat.Event)
|
||||
{
|
||||
case "subscribe":
|
||||
return await EventSubscribe(weChat);
|
||||
case "unsubscribe":
|
||||
return await EventUnsubscribe(weChat);
|
||||
case "SCAN":
|
||||
return await EventSCAN(weChat);
|
||||
case "LOCATION":
|
||||
return await EventLOCATION(weChat);
|
||||
case "CLICK":
|
||||
return await EventCLICK(weChat);
|
||||
case "VIEW":
|
||||
return await EventVIEW(weChat);
|
||||
default:
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[处理失败,没有找到事件类型=>{weChat.Event}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 关注事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventSubscribe(WeChatXMLDto weChat)
|
||||
{
|
||||
if (weChat.EventKey != null && (weChat.EventKey.Equals("bind") || weChat.EventKey.Equals("qrscene_bind")))
|
||||
{
|
||||
return await QRBind(weChat);
|
||||
}
|
||||
else
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了已关注事件=>key:{weChat.EventKey}=>ticket:{weChat.Ticket}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 取消关注事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventUnsubscribe(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了取消关注事件=>{weChat.Event}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 已关注扫码事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventSCAN(WeChatXMLDto weChat)
|
||||
{
|
||||
if (weChat.EventKey != null && (weChat.EventKey.StartsWith("bind_") || weChat.EventKey.StartsWith("qrscene_bind_")))
|
||||
{
|
||||
|
||||
return await QRBind(weChat);
|
||||
}
|
||||
else
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了已关注扫码事件=>key:{weChat.EventKey}=>ticket:{weChat.Ticket}]]></Content></xml>";
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// 扫码绑定
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
private async Task<string> QRBind(WeChatXMLDto weChat)
|
||||
{
|
||||
var ticket = await _dal.Db.Queryable<WeChatQR>().InSingleAsync(weChat.Ticket);
|
||||
if (ticket == null) throw new Exception("ticket未找到");
|
||||
if (ticket.QRisUsed) throw new Exception("ticket已被使用");
|
||||
if (!ticket.QRpublicAccount.Equals(weChat.publicAccount)) throw new Exception($"公众号错误 need:{ticket.QRpublicAccount} but:{weChat.publicAccount}");
|
||||
|
||||
var bindUser = await _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount == ticket.QRpublicAccount && t.CompanyID == ticket.QRbindCompanyID && t.SubJobID == ticket.QRbindJobID).SingleAsync();
|
||||
bool isNewBind;
|
||||
if (bindUser == null )
|
||||
{
|
||||
isNewBind = true;
|
||||
bindUser = new WeChatSub
|
||||
{
|
||||
SubFromPublicAccount = ticket.QRpublicAccount,
|
||||
CompanyID = ticket.QRbindCompanyID,
|
||||
SubJobID = ticket.QRbindJobID,
|
||||
SubUserOpenID = weChat.FromUserName,
|
||||
SubUserRegTime = DateTime.Now,
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
isNewBind = false;
|
||||
//订阅过的就更新
|
||||
if (bindUser.SubUserOpenID != weChat.FromUserName)
|
||||
{
|
||||
//记录上一次的订阅此工号的微信号
|
||||
bindUser.LastSubUserOpenID = bindUser.SubUserOpenID;
|
||||
}
|
||||
bindUser.SubUserOpenID = weChat.FromUserName;
|
||||
bindUser.SubUserRefTime = DateTime.Now;
|
||||
bindUser.IsUnBind = false;
|
||||
}
|
||||
ticket.QRisUsed = true;
|
||||
ticket.QRuseTime = DateTime.Now;
|
||||
ticket.QRuseOpenid = weChat.FromUserName;
|
||||
|
||||
try
|
||||
{
|
||||
_unitOfWork.BeginTran();
|
||||
await _dal.Db.Updateable<WeChatQR>(ticket).ExecuteCommandAsync();
|
||||
if (isNewBind)
|
||||
await _dal.Db.Insertable<WeChatSub>(bindUser).ExecuteCommandAsync();
|
||||
else
|
||||
await _dal.Db.Updateable<WeChatSub>(bindUser).ExecuteCommandAsync();
|
||||
_unitOfWork.CommitTran();
|
||||
}
|
||||
catch
|
||||
{
|
||||
_unitOfWork.RollbackTran();
|
||||
throw;
|
||||
}
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[恭喜您:{(string.IsNullOrEmpty(ticket.QRbindJobNick) ? ticket.QRbindJobID : ticket.QRbindJobNick)},绑定成功!]]></Content></xml>";
|
||||
}
|
||||
/// <summary>
|
||||
/// 上报位置地理事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventLOCATION(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了地理位置事件=>维度:{weChat.Latitude}经度:{weChat.Longitude}位置精度:{weChat.Precision}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 点击菜单按钮事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventCLICK(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了菜单点击按钮事件=>{weChat.EventKey}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 点击菜单网址事件
|
||||
/// </summary>
|
||||
/// <param name="weChat"></param>
|
||||
/// <returns></returns>
|
||||
private async Task<string> EventVIEW(WeChatXMLDto weChat)
|
||||
{
|
||||
return await Task.Run(() =>
|
||||
{
|
||||
return @$"<xml><ToUserName><![CDATA[{weChat.FromUserName}]]></ToUserName>
|
||||
<FromUserName><![CDATA[{weChat.ToUserName}]]></FromUserName>
|
||||
<CreateTime>{DateTime.Now.Ticks.ToString()}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[我收到了菜单点击网址事件=>{weChat.EventKey}]]></Content></xml>";
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
}
|
34
Blog.Core.Services/WeChatPushLogServices.cs
Normal file
34
Blog.Core.Services/WeChatPushLogServices.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using Blog.Core.Common;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IRepository.UnitOfWork;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Blog.Core.Services.BASE;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatPushLogServices
|
||||
/// </summary>
|
||||
public class WeChatPushLogServices : BaseServices<WeChatPushLog>, IWeChatPushLogServices
|
||||
{
|
||||
readonly IBaseRepository<WeChatPushLog> _dal;
|
||||
readonly IUnitOfWork _unitOfWork;
|
||||
readonly ILogger<WeChatPushLogServices> _logger;
|
||||
public WeChatPushLogServices(IBaseRepository<WeChatPushLog> dal,IUnitOfWork unitOfWork, ILogger<WeChatPushLogServices> logger)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
this._unitOfWork = unitOfWork;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
34
Blog.Core.Services/WeChatSubServices.cs
Normal file
34
Blog.Core.Services/WeChatSubServices.cs
Normal file
|
@ -0,0 +1,34 @@
|
|||
using Blog.Core.Common;
|
||||
using Blog.Core.Common.Helper;
|
||||
using Blog.Core.IRepository.Base;
|
||||
using Blog.Core.IRepository.UnitOfWork;
|
||||
using Blog.Core.IServices;
|
||||
using Blog.Core.Model;
|
||||
using Blog.Core.Model.Models;
|
||||
using Blog.Core.Model.ViewModels;
|
||||
using Blog.Core.Services.BASE;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Blog.Core.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// WeChatSubServices
|
||||
/// </summary>
|
||||
public class WeChatSubServices : BaseServices<WeChatSub>, IWeChatSubServices
|
||||
{
|
||||
readonly IBaseRepository<WeChatSub> _dal;
|
||||
readonly IUnitOfWork _unitOfWork;
|
||||
readonly ILogger<WeChatSubServices> _logger;
|
||||
public WeChatSubServices(IBaseRepository<WeChatSub> dal,IUnitOfWork unitOfWork, ILogger<WeChatSubServices> logger)
|
||||
{
|
||||
this._dal = dal;
|
||||
base.BaseDal = dal;
|
||||
this._unitOfWork = unitOfWork;
|
||||
this._logger = logger;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user