添加动态linq查询

添加微信管理
This commit is contained in:
hudingwen 2021-10-08 15:32:11 +08:00
parent 26ba3b2afb
commit 98068d795c
79 changed files with 6685 additions and 91 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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>
服务管理

View File

@ -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;

View 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 };
}
}
}

View 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 };
}
}
}

View 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);
}
}
}

View 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 };
}
}
}

View 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 };
}
}
}

View File

@ -13,7 +13,7 @@
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": ""
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:9291"
},

View File

@ -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时间

View File

@ -0,0 +1,3 @@
{
}

View File

@ -1,5 +1,5 @@
{
"urls": "http://*:9291", //webIIS
"urls": "http://*:8081", //webIIS
"Logging": {
"LogLevel": {
"Default": "Information", //Defaultlog4net

View File

@ -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.

View File

@ -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.

View 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
}
}

View File

@ -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;
}
}
}

View File

@ -99,7 +99,7 @@ namespace Blog.Core.Common.Helper
if (value == null)
value = defaultValue;
}
catch (Exception ex)
catch (Exception)
{
value = defaultValue;
}

View 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;
}
}
}

View File

@ -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();
}
}
}

View 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格式
///语音voice1MB播放长度不超过60s支持MP4格式
///视频video10MB支持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格式
///语音voice1MB播放长度不超过60s支持MP4格式
///视频video10MB支持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&lt;System.String&gt;.</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&lt;System.String, System.Object&gt;.</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&lt;System.String, System.Object&gt;.</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&lt;System.String, System.Object&gt;.</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;
}
}
}

View File

@ -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));

View File

@ -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);
}
}

View 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>
{
}
}

View 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);
}
}

View 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>
{
}
}

View 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>
{
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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是

View File

@ -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>
///修改时间

View File

@ -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>
/// 修改时间

View File

@ -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

View File

@ -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; }

View File

@ -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>
/// 修改时间

View File

@ -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>
/// 创建时间

View File

@ -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>
/// 修改时间

View File

@ -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>
/// 执行次数

View File

@ -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; }

View File

@ -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; }

View File

@ -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>
/// 修改时间

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View File

@ -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)]

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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>();
}
}

View 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; }
}
}

View 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; }
}
}

View 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";
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View File

@ -72,7 +72,7 @@ namespace Blog.Core.Serilog.Es.HttpInfo
}
return data;
}
catch(Exception ex)
catch(Exception)
{
return string.Empty;
}

View File

@ -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);
}
}
}

View 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;
}
}
}

View 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>";
});
}
}
}

View 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;
}
}
}

View 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;
}
}
}