去除dal冗余代码,科学上网管理

This commit is contained in:
hudingwen 2022-08-02 21:53:16 +08:00
parent 5c49c9bff4
commit 6d9a0ede04
41 changed files with 2588 additions and 155 deletions

View File

@ -922,6 +922,76 @@
Tibug 博文
</summary>
</member>
<member name="T:Blog.Core.Model.Models.TrojanCusServers">
<summary>
users自定义服务器
</summary>
</member>
<member name="T:Blog.Core.Model.Models.TrojanDetails">
<summary>
用户流量每月汇总表
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.id">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.userId">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.calDate">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.download">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.upload">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.CreateId">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.CreateBy">
<summary>
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanDetails.CreateTime">
<summary>
</summary>
</member>
<member name="T:Blog.Core.Model.Models.TrojanServers">
<summary>
Trojan服务器
</summary>
</member>
<member name="T:Blog.Core.Model.Models.TrojanUrlServers">
<summary>
users自定义URL服务器
</summary>
</member>
<member name="T:Blog.Core.Model.Models.TrojanUsers">
<summary>
Trojan用户
</summary>
</member>
<member name="P:Blog.Core.Model.Models.TrojanUsers.useList">
<summary>
历史流量记录
</summary>
</member>
<member name="T:Blog.Core.Model.Models.UserRole">
<summary>
用户跟角色关联表
@ -2347,6 +2417,73 @@
</summary>
</member>
<member name="T:Blog.Core.Model.ViewModels.TrojanLimitFlowDto">
<summary>
限制流量dto
作者:胡丁文
时间:2020-4-27 16:57:07
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanLimitFlowDto.users">
<summary>
用户
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanLimitFlowDto.quota">
<summary>
流量(-1为无限,单位为最小单位byte)
</summary>
</member>
<member name="T:Blog.Core.Model.ViewModels.TrojanServerSpliceDto">
<summary>
Trojan服务器拼接服务器和订阅地址
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanServerSpliceDto.normalApi">
<summary>
普通订阅连接
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanServerSpliceDto.clashApi">
<summary>
clash订阅连接
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanServerSpliceDto.clashApiBackup">
<summary>
备用clash订阅连接
</summary>
</member>
<member name="T:Blog.Core.Model.ViewModels.TrojanUseDetailDto">
<summary>
Trojan用户流量统计分组
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanUseDetailDto.userId">
<summary>
用户ID
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanUseDetailDto.moth">
<summary>
月度
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanUseDetailDto.up">
<summary>
上传流量
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanUseDetailDto.down">
<summary>
下载流量
</summary>
</member>
<member name="P:Blog.Core.Model.ViewModels.TrojanUseDetailDto.total">
<summary>
下载流量
</summary>
</member>
<member name="T:Blog.Core.Model.ViewModels.WeChatApiDto">
<summary>
微信接口消息DTO

View File

@ -639,6 +639,164 @@
<param name="id"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetUser(Blog.Core.Model.PaginationModel)">
<summary>
获取Trojan用户
</summary>
<param name="pagination"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetAllUser(Blog.Core.Model.PaginationModel)">
<summary>
获取Trojan用户
</summary>
<param name="pagination"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetAllTrojanUser">
<summary>
获取Trojan用户-下拉列表用
</summary>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.AddUser(Blog.Core.Model.Models.TrojanUsers)">
<summary>
添加Trojan用户
</summary>
<param name="user"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.UpdateUser(Blog.Core.Model.Models.TrojanUsers)">
<summary>
更新Trojan用户
</summary>
<param name="user"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.DelUser(System.Int32[])">
<summary>
删除用户
</summary>
<param name="users"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.ResetFlow(System.Int32[])">
<summary>
重置流量
</summary>
<param name="users"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.LimitFlow(Blog.Core.Model.ViewModels.TrojanLimitFlowDto)">
<summary>
限制流量
</summary>
<param name="limit"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.ResetPass(System.Int32[])">
<summary>
重置链接密码
</summary>
<param name="users"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetServers">
<summary>
获取Trojan服务器
</summary>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetSpliceServers(System.String)">
<summary>
获取拼接后的Trojan服务器
</summary>
<param name="id">passwordshow</param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.DelServers(System.Int32[])">
<summary>
删除Trojan服务器
</summary>
<param name="servers"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.UpdateServers(Blog.Core.Model.Models.TrojanServers)">
<summary>
更新Trojan服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.AddServers(Blog.Core.Model.Models.TrojanServers)">
<summary>
添加Trojan服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetCusServers">
<summary>
获取Cus服务器
</summary>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.DelCusServers(System.Int32[])">
<summary>
删除Cus服务器
</summary>
<param name="servers"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.UpdateCusServers(Blog.Core.Model.Models.TrojanCusServers)">
<summary>
更新Cus服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.AddCusServers(Blog.Core.Model.Models.TrojanCusServers)">
<summary>
添加Cus服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.GetUrlServers">
<summary>
获取Url服务器
</summary>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.DelUrlServers(System.Int32[])">
<summary>
删除Url服务器
</summary>
<param name="servers"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.UpdateUrlServers(Blog.Core.Model.Models.TrojanUrlServers)">
<summary>
更新Url服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.AddUrlServers(Blog.Core.Model.Models.TrojanUrlServers)">
<summary>
添加Url服务器
</summary>
<param name="server"></param>
<returns></returns>
</member>
<member name="M:Blog.Core.Controllers.TrojanController.RSS(System.String,System.Boolean)">
<summary>
获取订阅数据
</summary>
<param name="id">链接密码</param>
<param name="isUseBase64">是否使用base64加密</param>
<returns></returns>
</member>
<member name="T:Blog.Core.Controllers.UserController">
<summary>
用户管理

View File

@ -0,0 +1,455 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Blog.Core.Common;
using Blog.Core.Common.Extensions;
using Blog.Core.Common.Helper;
using Blog.Core.Common.HttpContextUser;
using Blog.Core.IServices;
using Blog.Core.IServices.BASE;
using Blog.Core.Model;
using Blog.Core.Model.Models;
using Blog.Core.Model.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace Blog.Core.Controllers
{
[Route("api/[controller]/[action]")]
[ApiController]
[Authorize(Permissions.Name)]
public class TrojanController : ControllerBase
{
private ITrojanUsersServices _trojanUsersServices;
public IBaseServices<TrojanServers> _baseServicesServers;
public IBaseServices<TrojanDetails> _baseServicesDetails;
public IBaseServices<TrojanCusServers> _baseServicesCusServers;
public IBaseServices<TrojanUrlServers> _baseServicesUrlServers;
private IUser _user;
public TrojanController(ITrojanUsersServices trojanUsersServices,IUser user
, IBaseServices<TrojanServers> baseServicesServers
, IBaseServices<TrojanDetails> baseServicesDetails
, IBaseServices<TrojanCusServers> baseServicesCusServers
, IBaseServices<TrojanUrlServers> baseServicesUrlServers)
{
_baseServicesDetails = baseServicesDetails;
_baseServicesServers = baseServicesServers;
_trojanUsersServices = trojanUsersServices;
_baseServicesCusServers = baseServicesCusServers;
_baseServicesUrlServers = baseServicesUrlServers;
_user = user;
}
/// <summary>
/// 获取Trojan用户
/// </summary>
/// <param name="pagination"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<PageModel<TrojanUsers>>> GetUser([FromQuery]PaginationModel pagination)
{
return await GetAllUser(pagination);
}
/// <summary>
/// 获取Trojan用户
/// </summary>
/// <param name="pagination"></param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<PageModel<TrojanUsers>>> GetAllUser([FromQuery]PaginationModel pagination)
{
var data = await _trojanUsersServices.QueryPage(pagination);
if (data.data.Count > 0)
{
var ids = data.data.Select(t => t.id).ToList();
var where = LinqHelper.True<TrojanDetails>();
where = where.And(t => ids.Contains(t.userId)).And(t => t.calDate < DateTime.Now).And(t => t.calDate > DateTime.Now.AddMonths(-12));
var userDetails = await _baseServicesDetails.Query(where);
foreach (var trojanUser in data.data)
{
var ls = from t in userDetails
where t.userId == trojanUser.id
group t by new { moth = t.calDate.ToString("yyyy-MM"), id = t.userId } into g
orderby g.Key.moth descending
select new TrojanUseDetailDto { userId = g.Key.id, moth = g.Key.moth, up = g.Sum(t => Convert.ToDecimal(t.upload)), down = g.Sum(t => Convert.ToDecimal(t.download)) };
var lsData = ls.ToList();
trojanUser.useList = lsData;
}
}
return MessageModel<PageModel<TrojanUsers>>.Success("获取成功", data);
}
/// <summary>
/// 获取Trojan用户-下拉列表用
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<DataTable>> GetAllTrojanUser()
{
var data = await _trojanUsersServices.QueryTable("select id,username from users");
return MessageModel<DataTable>.Success("获取成功", data);
}
/// <summary>
/// 添加Trojan用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<object>> AddUser([FromBody]TrojanUsers user)
{
var find = await _trojanUsersServices.Query(t => t.username == user.username);
if(find!=null && find.Count>0) return MessageModel<object>.Fail("用户名已存在");
var pass = StringHelper.GetGUID();
var passEcrypt = ShaHelper.Sha224(pass);
//user.quota = 0;
user.upload = 0;
user.download = 0;
user.password = passEcrypt;
user.passwordshow = pass;
var data = await _trojanUsersServices.Add(user);
return MessageModel<object>.Success("添加成功", data);
}
/// <summary>
/// 更新Trojan用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<object>> UpdateUser([FromBody]TrojanUsers user)
{
var find = await _trojanUsersServices.QueryById(user.id);
if (find == null) return MessageModel<object>.Fail("用户名不存在");
find.username = user.username;
var data = await _trojanUsersServices.Update(find, new List<string> { "username" });
return MessageModel<object>.Success("更新成功", data);
}
/// <summary>
/// 删除用户
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<string>> DelUser([FromBody]int[] users)
{
var data = await _trojanUsersServices.Query(t => users.Contains(t.id));
var list = data.Select(t => t.id.ToString()).ToArray();
await _trojanUsersServices.DeleteByIds(list);
return MessageModel<string>.Success("删除成功");
}
/// <summary>
/// 重置流量
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<string>> ResetFlow([FromBody]int[] users)
{
var data = await _trojanUsersServices.Query(t => users.Contains(t.id));
foreach (var item in data)
{
item.upload = 0;
item.download = 0;
await _trojanUsersServices.Update(item, new List<string> { "upload", "download" });
}
return MessageModel<string>.Success("重置流量成功");
}
/// <summary>
/// 限制流量
/// </summary>
/// <param name="limit"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<string>> LimitFlow([FromBody] TrojanLimitFlowDto limit)
{
var data = await _trojanUsersServices.Query(t => limit.users.Contains(t.id));
foreach (var item in data)
{
item.quota = limit.quota;
await _trojanUsersServices.Update(item, new List<string> { "quota" });
}
return MessageModel<string>.Success("限制流量成功");
}
/// <summary>
/// 重置链接密码
/// </summary>
/// <param name="users"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<string>> ResetPass([FromBody]int[] users)
{
var data = await _trojanUsersServices.Query(t => users.Contains(t.id));
var pass = StringHelper.GetGUID();
var passEcrypt = ShaHelper.Sha224(pass);
foreach (var item in data)
{
item.password = passEcrypt;
item.passwordshow = pass;
await _trojanUsersServices.Update(item, new List<string> { "password" , "passwordshow" });
}
return MessageModel<string>.Success("重置链接密码成功");
}
/// <summary>
/// 获取Trojan服务器
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<TrojanServers>>> GetServers()
{
var data = await _baseServicesServers.Query();
data = data.OrderBy(t => t.servername).ToList();
return MessageModel<List<TrojanServers>>.Success("获取成功", data);
}
/// <summary>
/// 获取拼接后的Trojan服务器
/// </summary>
/// <param name="id">passwordshow</param>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<TrojanServerSpliceDto>> GetSpliceServers(string id)
{
var data = await _baseServicesServers.Query();
data = data.OrderBy(t => t.servername).ToList();
var res = new TrojanServerSpliceDto();
res.normalApi = Appsettings.app(new string[] { "trojan", "normalApi" }).ObjToString();
res.clashApi = Appsettings.app(new string[] { "trojan", "clashApi" }).ObjToString();
res.clashApiBackup = Appsettings.app(new string[] { "trojan", "clashApiBackup" }).ObjToString();
foreach (var item in data)
{
var serverSplice = GetSplice(item, id);
res.list.Add(new TrojanServerDto { name = item.servername, value = serverSplice });
}
return MessageModel<TrojanServerSpliceDto>.Success("获取成功", res); ;
}
/// <summary>
/// 删除Trojan服务器
/// </summary>
/// <param name="servers"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanServers>>> DelServers([FromBody]int[] servers)
{
var data = await _baseServicesServers.DeleteByIds(servers.Select(t=>t.ToString()).ToArray());
if (data)
return MessageModel<List<TrojanServers>>.Success("删除成功");
else
return MessageModel<List<TrojanServers>>.Fail("删除失败");
}
/// <summary>
/// 更新Trojan服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanServers>>> UpdateServers(TrojanServers server)
{
var data = await _baseServicesServers.Update(server);
return MessageModel<List<TrojanServers>>.Success("更新成功");
}
/// <summary>
/// 添加Trojan服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<List<TrojanServers>>> AddServers(TrojanServers server)
{
var data = await _baseServicesServers.Add(server);
return MessageModel<List<TrojanServers>>.Success("添加成功");
}
/// <summary>
/// 获取Cus服务器
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<TrojanCusServers>>> GetCusServers()
{
var data = await _baseServicesCusServers.Query();
data = data.OrderBy(t => t.servername).ToList();
return MessageModel<List<TrojanCusServers>>.Success("获取成功", data);
}
/// <summary>
/// 删除Cus服务器
/// </summary>
/// <param name="servers"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanCusServers>>> DelCusServers([FromBody] int[] servers)
{
var data = await _baseServicesCusServers.DeleteByIds(servers.Select(t => t.ToString()).ToArray());
if (data)
return MessageModel<List<TrojanCusServers>>.Success("删除成功");
else
return MessageModel<List<TrojanCusServers>>.Fail("删除失败");
}
/// <summary>
/// 更新Cus服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanCusServers>>> UpdateCusServers(TrojanCusServers server)
{
var data = await _baseServicesCusServers.Update(server);
return MessageModel<List<TrojanCusServers>>.Success("更新成功");
}
/// <summary>
/// 添加Cus服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<List<TrojanCusServers>>> AddCusServers(TrojanCusServers server)
{
var data = await _baseServicesCusServers.Add(server);
return MessageModel<List<TrojanCusServers>>.Success("添加成功");
}
/// <summary>
/// 获取Url服务器
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<MessageModel<List<TrojanUrlServers>>> GetUrlServers()
{
var data = await _baseServicesUrlServers.Query();
data = data.OrderBy(t => t.servername).ToList();
return MessageModel<List<TrojanUrlServers>>.Success("获取成功", data);
}
/// <summary>
/// 删除Url服务器
/// </summary>
/// <param name="servers"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanUrlServers>>> DelUrlServers([FromBody] int[] servers)
{
var data = await _baseServicesUrlServers.DeleteByIds(servers.Select(t => t.ToString()).ToArray());
if (data)
return MessageModel<List<TrojanUrlServers>>.Success("删除成功");
else
return MessageModel<List<TrojanUrlServers>>.Fail("删除失败");
}
/// <summary>
/// 更新Url服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPut]
public async Task<MessageModel<List<TrojanUrlServers>>> UpdateUrlServers(TrojanUrlServers server)
{
var data = await _baseServicesUrlServers.Update(server);
return MessageModel<List<TrojanUrlServers>>.Success("更新成功");
}
/// <summary>
/// 添加Url服务器
/// </summary>
/// <param name="server"></param>
/// <returns></returns>
[HttpPost]
public async Task<MessageModel<List<TrojanUrlServers>>> AddUrlServers(TrojanUrlServers server)
{
var data = await _baseServicesUrlServers.Add(server);
return MessageModel<List<TrojanUrlServers>>.Success("添加成功");
}
private string GetSplice(TrojanServers item,string passwordshow)
{
if ("0".Equals(item.servertype))
return $"trojan://{passwordshow}@{item.serveraddress}:{item.serverport}?allowinsecure=0&tfo=0&peer={(string.IsNullOrEmpty(item.serverpeer) ? item.serverpeer : item.serveraddress)}#{item.servername}";
else if ("1".Equals(item.servertype))
return $"trojan://{passwordshow}@{item.serveraddress}:{item.serverport}?wspath={item.serverpath}&ws=1&peer={(string.IsNullOrEmpty(item.serverpeer) ? item.serverpeer : item.serveraddress)}#{item.servername}";
else
return $"servertype:({item.servertype})错误";
}
private List<string> GetSplice(List<TrojanServers> items, string passwordshow)
{
List<string> ls = new List<string>();
foreach (var item in items)
{
ls.Add(GetSplice(item, passwordshow));
}
return ls;
}
/// <summary>
/// 获取订阅数据
/// </summary>
/// <param name="id">链接密码</param>
/// <param name="isUseBase64">是否使用base64加密</param>
/// <returns></returns>
[HttpGet]
[AllowAnonymous]
public async Task<string> RSS(string id,bool isUseBase64=true)
{
StringBuilder sb = new StringBuilder();
try
{
var user = (await _trojanUsersServices.Query(t => t.passwordshow == id)).FirstOrDefault();
if (user == null) throw new Exception("用户不存在");
var data = await _baseServicesServers.Query(t => (t.userid == user.id || t.userid <= 0) && t.serverenable);
if (data != null)
{
data = data.OrderBy(t => t.servername).ToList();
foreach (var item in data)
{
sb.AppendLine(GetSplice(item, user.passwordshow));
}
}
var cusData = await _baseServicesCusServers.Query(t=> (t.userid == user.id || t.userid <=0) && t.serverenable);
if (cusData != null)
{
cusData = cusData.OrderBy(t => t.servername).ToList();
foreach (var item in cusData)
{
sb.AppendLine(item.serveraddress);
}
}
var urlData = await _baseServicesUrlServers.Query(t => (t.userid == user.id || t.userid <= 0) && t.serverenable);
if (urlData != null)
{
urlData = urlData.OrderBy(t => t.servername).ToList();
foreach (var item in urlData)
{
try
{
var urlStrObj = await HttpHelper.GetAsync(item.serveraddress);
var lines = "";
try
{
lines = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(urlStrObj));
}
catch (Exception)
{
lines = urlStrObj;
}
finally
{
sb.AppendLine(lines);
}
}
catch (Exception ex)
{
sb.AppendLine($"trojan://xxxxxx@xxxxxx.xx:443?allowinsecure=0&tfo=0#{ex.Message}");
}
}
}
}
catch (Exception ex)
{
sb.AppendLine($"trojan://xxxxxx@xxxxxx.xx:443?allowinsecure=0&tfo=0#{ex.Message}");
}
if (isUseBase64)
{
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sb.ToString()));
}
else{
return sb.ToString();
}
}
}
}

View File

@ -82,7 +82,7 @@
// *** MutiDBEnabled trueEnabledtrue **
// https://www.bilibili.com/video/BV1BJ411B7mn?p=6
"MainDB": "WMBLOG_SQLITE", //Enabledtrue
"MainDB": "WMBLOG_MYSQL_2", //Enabledtrue
"MutiDBEnabled": false, //
"CQRSEnabled": false, //,SqlServer
"DBS": [
@ -131,7 +131,7 @@
"DBType": 0,
"Enabled": true,
"HitRate": 20,
"Connection": "server=.;Database=blogcore001;Uid=root;Pwd=123456;Port=3096;Allow User Variables=True;"
"Connection": "server=localhost;Database=blogcore001;Uid=root;Pwd=root;Port=3306;Allow User Variables=True;"
},
{
"ConnId": "WMBLOG_ORACLE",
@ -171,7 +171,7 @@
"EnableAllIPs": false, //trueIP访
// /localhost:8000/
// http://127.0.0.1:1818 http://localhost:1818
"IPs": "http://127.0.0.1:2364,http://localhost:2364"
"IPs": "http://127.0.0.1:2364,http://localhost:2364,http://127.0.0.1:6688,http://localhost:6688"
},
"AppConfigAlert": {
"Enabled": true
@ -291,5 +291,10 @@
"FiedValue": "Blog.Core.Api"
}
]
},
"trojan": {//
"normalApi": "http://localhost:9291/api/Trojan/RSS?id=",
"clashApi": "https://your-sub-service/sub?target=clash&insert=false&url=",
"clashApiBackup": "https://pub-api-1.bianyuan.xyz/sub?target=clash&insert=false&url="
}
}

View File

@ -0,0 +1,387 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
namespace Blog.Core.Common.Extensions
{
public static partial class Extention
{
#region BuildExtendSelectExpre方法
/// <summary>
/// 组合继承属性选择表达式树,无拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, TResult>> BuildExtendSelectExpre<TBase, TResult>(this Expression<Func<TBase, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,1个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, TResult>> BuildExtendSelectExpre<TBase, T1, TResult>(this Expression<Func<TBase, T1, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,2个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, TResult>> BuildExtendSelectExpre<TBase, T1, T2, TResult>(this Expression<Func<TBase, T1, T2, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,3个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, TResult>(this Expression<Func<TBase, T1, T2, T3, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,4个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,5个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="T5">拓展类型5</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, T5, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, T5, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, T5, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, T5, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,6个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="T5">拓展类型5</typeparam>
/// <typeparam name="T6">拓展类型6</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, T5, T6, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, T5, T6, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, T5, T6, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, T5, T6, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,7个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="T5">拓展类型5</typeparam>
/// <typeparam name="T6">拓展类型6</typeparam>
/// <typeparam name="T7">拓展类型7</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, T5, T6, T7, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, T5, T6, T7, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,8个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="T5">拓展类型5</typeparam>
/// <typeparam name="T6">拓展类型6</typeparam>
/// <typeparam name="T7">拓展类型7</typeparam>
/// <typeparam name="T8">拓展类型8</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, T5, T6, T7, T8, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, TResult>>(expression);
}
/// <summary>
/// 组合继承属性选择表达式树,9个拓展参数
/// TResult将继承TBase的所有属性
/// </summary>
/// <typeparam name="TBase">原数据类型</typeparam>
/// <typeparam name="T1">拓展类型1</typeparam>
/// <typeparam name="T2">拓展类型2</typeparam>
/// <typeparam name="T3">拓展类型3</typeparam>
/// <typeparam name="T4">拓展类型4</typeparam>
/// <typeparam name="T5">拓展类型5</typeparam>
/// <typeparam name="T6">拓展类型6</typeparam>
/// <typeparam name="T7">拓展类型7</typeparam>
/// <typeparam name="T8">拓展类型8</typeparam>
/// <typeparam name="T9">拓展类型9</typeparam>
/// <typeparam name="TResult">返回类型</typeparam>
/// <param name="expression">拓展表达式</param>
/// <returns></returns>
public static Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> BuildExtendSelectExpre<TBase, T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(this Expression<Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> expression) where TResult : TBase
{
return GetExtendSelectExpre<TBase, TResult, Func<TBase, T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>>(expression);
}
#endregion
#region And和Or方法
/// <summary>
/// 连接表达式与运算
/// </summary>
/// <typeparam name="T">参数</typeparam>
/// <param name="one">原表达式</param>
/// <param name="another">新的表达式</param>
/// <returns></returns>
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another)
{
//创建新参数
var newParameter = Expression.Parameter(typeof(T), "parameter");
var parameterReplacer = new ParameterReplaceVisitor(newParameter);
var left = parameterReplacer.Visit(one.Body);
var right = parameterReplacer.Visit(another.Body);
var body = Expression.And(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
/// <summary>
/// 连接表达式或运算
/// </summary>
/// <typeparam name="T">参数</typeparam>
/// <param name="one">原表达式</param>
/// <param name="another">新表达式</param>
/// <returns></returns>
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another)
{
//创建新参数
var newParameter = Expression.Parameter(typeof(T), "parameter");
var parameterReplacer = new ParameterReplaceVisitor(newParameter);
var left = parameterReplacer.Visit(one.Body);
var right = parameterReplacer.Visit(another.Body);
var body = Expression.Or(left, right);
return Expression.Lambda<Func<T, bool>>(body, newParameter);
}
#endregion
#region Expression的Invoke方法
public static TResult Invoke<TResult>(this Expression<Func<TResult>> expression)
{
return expression.Compile().Invoke();
}
public static TResult Invoke<T1, TResult>(this Expression<Func<T1, TResult>> expression, T1 arg1)
{
return expression.Compile().Invoke(arg1);
}
public static TResult Invoke<T1, T2, TResult>(this Expression<Func<T1, T2, TResult>> expression, T1 arg1, T2 arg2)
{
return expression.Compile().Invoke(arg1, arg2);
}
public static TResult Invoke<T1, T2, T3, TResult>(this Expression<Func<T1, T2, T3, TResult>> expression, T1 arg1, T2 arg2, T3 arg3)
{
return expression.Compile().Invoke(arg1, arg2, arg3);
}
public static TResult Invoke<T1, T2, T3, T4, TResult>(this Expression<Func<T1, T2, T3, T4, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4);
}
public static TResult Invoke<T1, T2, T3, T4, T5, TResult>(this Expression<Func<T1, T2, T3, T4, T5, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5);
}
public static TResult Invoke<T1, T2, T3, T4, T5, T6, TResult>(this Expression<Func<T1, T2, T3, T4, T5, T6, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6);
}
public static TResult Invoke<T1, T2, T3, T4, T5, T6, T7, TResult>(this Expression<Func<T1, T2, T3, T4, T5, T6, T7, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
public static TResult Invoke<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(this Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}
public static TResult Invoke<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(this Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
public static TResult Invoke<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>(this Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>> expression, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10)
{
return expression.Compile().Invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
}
#endregion
/// <summary>
/// 获取表达式中的固定值
/// </summary>
/// <param name="expression">表达式</param>
/// <returns></returns>
public static object GetConstantValue(this Expression expression)
{
var visitor = new GetConstantValueVisitor();
visitor.Visit(expression);
return visitor.ConstantValue;
}
public static object GetMemberValue(this Expression expression)
{
var visitor = new GetMemberValueVisitor();
visitor.Visit(expression);
return visitor.Value;
}
#region
private static Expression<TDelegate> GetExtendSelectExpre<TBase, TResult, TDelegate>(Expression<TDelegate> expression)
{
NewExpression newBody = Expression.New(typeof(TResult));
MemberInitExpression oldExpression = (MemberInitExpression)expression.Body;
ParameterExpression[] oldParamters = expression.Parameters.ToArray();
List<string> existsProperties = new List<string>();
foreach (var aBinding in oldExpression.Bindings)
{
existsProperties.Add(aBinding.Member.Name);
}
List<MemberBinding> newBindings = new List<MemberBinding>();
var ls = typeof(TResult).GetProperties().Where(x => !existsProperties.Contains(x.Name));
foreach (var aProperty in ls)
{
if (typeof(TBase).GetMembers().Any(x => x.Name == aProperty.Name))
{
MemberInfo newMember = typeof(TBase).GetMember(aProperty.Name)[0];
MemberBinding newMemberBinding = Expression.Bind(newMember, Expression.Property(oldParamters[0], aProperty.Name));
newBindings.Add(newMemberBinding);
}
}
newBindings.AddRange(oldExpression.Bindings);
var body = Expression.MemberInit(newBody, newBindings.ToArray());
var resExpression = Expression.Lambda<TDelegate>(body, oldParamters);
return resExpression;
}
#endregion
}
/// <summary>
/// 继承ExpressionVisitor类实现参数替换统一
/// </summary>
class ParameterReplaceVisitor : ExpressionVisitor
{
public ParameterReplaceVisitor(ParameterExpression paramExpr)
{
_parameter = paramExpr;
}
//新的表达式参数
private ParameterExpression _parameter { get; set; }
protected override Expression VisitParameter(ParameterExpression p)
{
if (p.Type == _parameter.Type)
return _parameter;
else
return p;
}
}
class GetConstantValueVisitor : ExpressionVisitor
{
public object ConstantValue { get; set; }
protected override Expression VisitConstant(ConstantExpression node)
{
ConstantValue = node.Value;
return base.VisitConstant(node);
}
}
class GetMemberValueVisitor : ExpressionVisitor
{
public object Value { get; set; }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -3,8 +3,10 @@ using Autofac.Extras.DynamicProxy;
using Blog.Core.AOP;
using Blog.Core.Common;
using Blog.Core.IRepository.Base;
using Blog.Core.IServices.BASE;
using Blog.Core.Model;
using Blog.Core.Repository.Base;
using Blog.Core.Services.BASE;
using log4net;
using System;
using System.Collections.Generic;
@ -60,6 +62,7 @@ namespace Blog.Core.Extensions
}
builder.RegisterGeneric(typeof(BaseRepository<>)).As(typeof(IBaseRepository<>)).InstancePerDependency();//注册仓储
builder.RegisterGeneric(typeof(BaseServices<>)).As(typeof(IBaseServices<>)).InstancePerDependency();//注册服务
// 获取 Service.dll 程序集服务,并注册
var assemblysServices = Assembly.LoadFrom(servicesDllFile);

View File

@ -0,0 +1,14 @@
using Blog.Core.IServices.BASE;
using Blog.Core.Model.Models;
namespace Blog.Core.IServices
{
/// <summary>
/// TrojanUsersServices
/// </summary>
public interface ITrojanUsersServices : IBaseServices<TrojanUsers>
{
}
}

View File

@ -0,0 +1,25 @@

using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Blog.Core.Model.Models
{
///<summary>
///users自定义服务器
///</summary>
[SugarTable("users_cus", "WMBLOG_MYSQL_2")]
public partial class TrojanCusServers
{
[SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)]
public int id { set; get; }
public int userid { get; set; }
public string servername { set; get; }
public string serveraddress { set; get; }
[SugarColumn(IsNullable = true)]
public string serverremark { get; set; }
public bool serverenable { get; set; }
}
}

View File

@ -0,0 +1,62 @@
//模板自动生成(请勿修改)
//作者:胡丁文
using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Blog.Core.Model.Models
{
///<summary>
///用户流量每月汇总表
///</summary>
[SugarTable("users_detail", "WMBLOG_MYSQL_2")]
public partial class TrojanDetails
{
/// <summary>
///
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int id { get; set; }
/// <summary>
///
/// </summary>
public int userId { get; set; }
/// <summary>
///
/// </summary>
public DateTime calDate { get; set; }
/// <summary>
///
/// </summary>
public ulong download { get; set; }
/// <summary>
///
/// </summary>
public ulong upload { get; set; }
/// <summary>
///
/// </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; }
}
}

View File

@ -0,0 +1,30 @@

using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Blog.Core.Model.Models
{
///<summary>
///Trojan服务器
///</summary>
[SugarTable("servers", "WMBLOG_MYSQL_2")]
public partial class TrojanServers
{
[SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)]
public int id { set; get; }
public int userid { get; set; }
public string servername { set; get; }
public string serveraddress { set; get; }
public int serverport { get; set; }
[SugarColumn(IsNullable = true)]
public string serverremark { get; set; }
public bool serverenable { get; set; }
public string serverpeer { get; set; }
[SugarColumn(IsNullable = true)]
public string serverpath { get; set; }
public string servertype { get; set; }
}
}

View File

@ -0,0 +1,25 @@

using System;
using System.Linq;
using System.Text;
using SqlSugar;
namespace Blog.Core.Model.Models
{
///<summary>
///users自定义URL服务器
///</summary>
[SugarTable("users_url", "WMBLOG_MYSQL_2")]
public partial class TrojanUrlServers
{
[SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)]
public int id { set; get; }
public int userid { get; set; }
public string servername { set; get; }
public string serveraddress { set; get; }
[SugarColumn(IsNullable = true)]
public string serverremark { get; set; }
public bool serverenable { get; set; }
}
}

View File

@ -0,0 +1,38 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Blog.Core.Model.ViewModels;
using SqlSugar;
namespace Blog.Core.Model.Models
{
///<summary>
///Trojan用户
///</summary>
[SugarTable("users", "WMBLOG_MYSQL_2")]
public partial class TrojanUsers
{
[SugarColumn(IsNullable = false, IsPrimaryKey = true, IsIdentity = true)]
public int id { set; get; }
public string username { set; get; }
public string password { set; get; }
public Int64 quota { set; get; }
public UInt64 download { set; get; }
public UInt64 upload { set; get; }
public string passwordshow { set; get; }
[SugarColumn(IsNullable = true)]
public int CreateId { get; set; }
[SugarColumn(IsNullable = true)]
public string CreateBy { get; set; }
[SugarColumn(IsNullable = true)]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 历史流量记录
/// </summary>
[SugarColumn(IsIgnore = true)]
public List<TrojanUseDetailDto> useList { 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-27 16:57:07
/// </summary>
public class TrojanLimitFlowDto
{
/// <summary>
/// 用户
/// </summary>
public int[] users { get; set; }
/// <summary>
/// 流量(-1为无限,单位为最小单位byte)
/// </summary>
public Int64 quota { get; set; }
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Blog.Core.Model.ViewModels
{
public class TrojanServerDto
{
public string name { get; set; }
public string value { get; set; }
}
}

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Blog.Core.Model.ViewModels
{
/// <summary>
/// Trojan服务器拼接服务器和订阅地址
/// </summary>
public class TrojanServerSpliceDto
{
/// <summary>
/// 普通订阅连接
/// </summary>
public string normalApi { get; set; }
/// <summary>
/// clash订阅连接
/// </summary>
public string clashApi { get; set; }
/// <summary>
/// 备用clash订阅连接
/// </summary>
public string clashApiBackup { get; set; }
public List<TrojanServerDto> list { get; set; } = new List<TrojanServerDto>();
}
}

View File

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Blog.Core.Model.ViewModels
{
/// <summary>
/// Trojan用户流量统计分组
/// </summary>
public class TrojanUseDetailDto
{
/// <summary>
/// 用户ID
/// </summary>
public int userId { get; set; }
/// <summary>
/// 月度
/// </summary>
public string moth { get; set; }
/// <summary>
/// 上传流量
/// </summary>
public decimal up { get; set; }
/// <summary>
/// 下载流量
/// </summary>
public decimal down { get; set; }
/// <summary>
/// 下载流量
/// </summary>
public decimal total { get { return up + down; } }
}
}

View File

@ -7,12 +7,6 @@ namespace Blog.Core.Services
{
public partial class AccessTrendLogServices : BaseServices<AccessTrendLog>, IAccessTrendLogServices
{
IBaseRepository<AccessTrendLog> _dal;
public AccessTrendLogServices(IBaseRepository<AccessTrendLog> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -7,13 +7,6 @@ namespace Blog.Core.Services
{
public class AdvertisementServices : BaseServices<Advertisement>, IAdvertisementServices
{
IBaseRepository<Advertisement> _dal;
public AdvertisementServices(IBaseRepository<Advertisement> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
public void ReturnExp()
{

View File

@ -13,6 +13,10 @@ namespace Blog.Core.Services.BASE
{
public class BaseServices<TEntity> : IBaseServices<TEntity> where TEntity : class, new()
{
public BaseServices(IBaseRepository<TEntity> BaseDal = null)
{
this.BaseDal = BaseDal;
}
//public IBaseRepository<TEntity> baseDal = new BaseRepository<TEntity>();
public IBaseRepository<TEntity> BaseDal { get; set; }//通过在子类的构造函数中注入,这里是基类,不用构造函数

View File

@ -13,7 +13,6 @@ namespace Blog.Core.Services
{
public class BlogArticleServices : BaseServices<BlogArticle>, IBlogArticleServices
{
public IBaseRepository<BlogArticle> _dal { get; set; }
IMapper _mapper;
public BlogArticleServices(IMapper mapper)
{

View File

@ -10,11 +10,6 @@ namespace Blog.Core.Services
/// </summary>
public class DepartmentServices : BaseServices<Department>, IDepartmentServices
{
private readonly IBaseRepository<Department> _dal;
public DepartmentServices(IBaseRepository<Department> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -12,13 +12,10 @@ namespace Blog.Core.Services
{
public class GuestbookServices : BaseServices<Guestbook>, IGuestbookServices
{
private readonly IBaseRepository<Guestbook> _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly IBaseRepository<PasswordLib> _passwordLibRepository;
public GuestbookServices(IUnitOfWork unitOfWork, IBaseRepository<Guestbook> dal, IBaseRepository<PasswordLib> passwordLibRepository)
public GuestbookServices(IUnitOfWork unitOfWork, IBaseRepository<PasswordLib> passwordLibRepository)
{
this._dal = dal;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
_passwordLibRepository = passwordLibRepository;
}
@ -47,7 +44,7 @@ namespace Blog.Core.Services
//......
Console.WriteLine($"");
var guestbooks = await _dal.Query();
var guestbooks = await BaseDal.Query();
Console.WriteLine($"first time : the count of guestbooks is :{guestbooks.Count}");
int ex = 0;
@ -55,7 +52,7 @@ namespace Blog.Core.Services
int throwEx = 1 / ex;
Console.WriteLine($"insert a data into the table Guestbook now.");
var insertGuestbook = await _dal.Add(new Guestbook()
var insertGuestbook = await BaseDal.Add(new Guestbook()
{
username = "bbb",
blogId = 1,
@ -63,7 +60,7 @@ namespace Blog.Core.Services
isshow = true
});
guestbooks = await _dal.Query();
guestbooks = await BaseDal.Query();
Console.WriteLine($"second time : the count of guestbooks is :{guestbooks.Count}");
@ -81,7 +78,7 @@ namespace Blog.Core.Services
var passwords = await _passwordLibRepository.Query();
Console.WriteLine($"third time : the count of passwords is :{passwords.Count}");
var guestbooks = await _dal.Query();
var guestbooks = await BaseDal.Query();
Console.WriteLine($"third time : the count of guestbooks is :{guestbooks.Count}");
return new MessageModel<string>()
@ -114,7 +111,7 @@ namespace Blog.Core.Services
//......
Console.WriteLine($"");
var guestbooks = await _dal.Query();
var guestbooks = await BaseDal.Query();
Console.WriteLine($"first time : the count of guestbooks is :{guestbooks.Count}");
int ex = 0;
@ -122,7 +119,7 @@ namespace Blog.Core.Services
int throwEx = 1 / ex;
Console.WriteLine($"insert a data into the table Guestbook now.");
var insertGuestbook = await _dal.Add(new Guestbook()
var insertGuestbook = await BaseDal.Add(new Guestbook()
{
username = "bbb",
blogId = 1,
@ -130,7 +127,7 @@ namespace Blog.Core.Services
isshow = true
});
guestbooks = await _dal.Query();
guestbooks = await BaseDal.Query();
Console.WriteLine($"second time : the count of guestbooks is :{guestbooks.Count}");
return true;

View File

@ -7,12 +7,5 @@ namespace Blog.Core.IServices
public class ApplicationUserServices : BaseServices<ApplicationUser>, IApplicationUserServices
{
IBaseRepository<ApplicationUser> _dal;
public ApplicationUserServices(IBaseRepository<ApplicationUser> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -11,12 +11,5 @@ namespace Blog.Core.Services
public class ModuleServices : BaseServices<Modules>, IModuleServices
{
IBaseRepository<Modules> _dal;
public ModuleServices(IBaseRepository<Modules> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -7,12 +7,6 @@ namespace Blog.Core.Services
{
public partial class OperateLogServices : BaseServices<OperateLog>, IOperateLogServices
{
IBaseRepository<OperateLog> _dal;
public OperateLogServices(IBaseRepository<OperateLog> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -7,12 +7,6 @@ namespace Blog.Core.Services
{
public partial class PasswordLibServices : BaseServices<PasswordLib>, IPasswordLibServices
{
IBaseRepository<PasswordLib> _dal;
public PasswordLibServices(IBaseRepository<PasswordLib> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -20,13 +20,10 @@ namespace Blog.Core.Services
{
public partial class PayServices : BaseServices<RootEntityTkey<int>>, IPayServices
{
IBaseRepository<RootEntityTkey<int>> _dal;
IHttpContextAccessor _httpContextAccessor;
ILogger<PayServices> _logger;
public PayServices(IBaseRepository<RootEntityTkey<int>> dal, ILogger<PayServices> logger, IHttpContextAccessor httpContextAccessor)
public PayServices(ILogger<PayServices> logger, IHttpContextAccessor httpContextAccessor)
{
this._dal = dal;
base.BaseDal = dal;
_logger = logger;
_httpContextAccessor = httpContextAccessor;
}

View File

@ -11,12 +11,5 @@ namespace Blog.Core.Services
public class PermissionServices : BaseServices<Permission>, IPermissionServices
{
IBaseRepository<Permission> _dal;
public PermissionServices(IBaseRepository<Permission> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -21,14 +21,13 @@ namespace Blog.Core.Services
// 将多个仓储接口注入
public RoleModulePermissionServices(
IRoleModulePermissionRepository dal,
IRoleModulePermissionRepository dal,
IBaseRepository<Modules> moduleRepository,
IBaseRepository<Role> roleRepository)
{
this._dal = dal;
this._moduleRepository = moduleRepository;
this._roleRepository = roleRepository;
base.BaseDal = dal;
}
/// <summary>

View File

@ -13,13 +13,6 @@ namespace Blog.Core.Services
/// </summary>
public class RoleServices : BaseServices<Role>, IRoleServices
{
IBaseRepository<Role> _dal;
public RoleServices(IBaseRepository<Role> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
/// <summary>
///
/// </summary>

View File

@ -7,12 +7,6 @@ namespace Blog.Core.Services
{
public partial class TasksQzServices : BaseServices<TasksQz>, ITasksQzServices
{
IBaseRepository<TasksQz> _dal;
public TasksQzServices(IBaseRepository<TasksQz> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
}
}

View File

@ -10,13 +10,6 @@ namespace Blog.Core.Services
{
public class TopicDetailServices : BaseServices<TopicDetail>, ITopicDetailServices
{
IBaseRepository<TopicDetail> _dal;
public TopicDetailServices(IBaseRepository<TopicDetail> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
/// <summary>
/// 获取开Bug数据缓存
/// </summary>

View File

@ -10,14 +10,6 @@ namespace Blog.Core.Services
{
public class TopicServices: BaseServices<Topic>, ITopicServices
{
IBaseRepository<Topic> _dal;
public TopicServices(IBaseRepository<Topic> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
/// <summary>
/// 获取开Bug专题分类缓存
/// </summary>

View File

@ -0,0 +1,18 @@
using Blog.Core.Common;
using Blog.Core.IRepository.Base;
using Blog.Core.IServices;
using Blog.Core.Model.Models;
using Blog.Core.Services.BASE;
using System.Linq;
using System.Threading.Tasks;
namespace Blog.Core.Services
{
/// <summary>
/// TrojanUsersServices
/// </summary>
public class TrojanUsersServices : BaseServices<TrojanUsers>, ITrojanUsersServices
{
}
}

View File

@ -13,13 +13,6 @@ namespace Blog.Core.Services
/// </summary>
public class UserRoleServices : BaseServices<UserRole>, IUserRoleServices
{
IBaseRepository<UserRole> _dal;
public UserRoleServices(IBaseRepository<UserRole> dal)
{
this._dal = dal;
base.BaseDal = dal;
}
/// <summary>
///
/// </summary>

View File

@ -19,13 +19,10 @@ namespace Blog.Core.Services
/// </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)
public WeChatCompanyServices(IUnitOfWork unitOfWork, ILogger<WeChatCompanyServices> logger)
{
this._dal = dal;
base.BaseDal = dal;
this._unitOfWork = unitOfWork;
this._logger = logger;
}

View File

@ -19,13 +19,10 @@ namespace Blog.Core.Services
/// </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)
public WeChatConfigServices(IUnitOfWork unitOfWork, ILogger<WeChatConfigServices> logger)
{
this._dal = dal;
base.BaseDal = dal;
this._unitOfWork = unitOfWork;
this._logger = logger;
}
@ -237,13 +234,13 @@ namespace Blog.Core.Services
QRticket = data.ticket
};
data.id = info.userID;
await this._dal.Db.Insertable<WeChatQR>(weChatQR).ExecuteCommandAsync();
await this.BaseDal.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();
var bindUser = await BaseDal.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);
@ -316,7 +313,7 @@ namespace Blog.Core.Services
PushLogTemplateID = msg.cardMsg.template_id,
PushLogIP = ip
};
await _dal.Db.Insertable<WeChatPushLog>(pushLog).ExecuteCommandAsync();
await BaseDal.Db.Insertable<WeChatPushLog>(pushLog).ExecuteCommandAsync();
}
catch (Exception ex)
{
@ -355,7 +352,7 @@ namespace Blog.Core.Services
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();
var usrs = BaseDal.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;
@ -370,7 +367,7 @@ namespace Blog.Core.Services
else
{
//发送所有
var usrs = _dal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount.Equals(msg.selectWeChat) && t.CompanyID.Equals(msg.selectCompany)).ToList();
var usrs = BaseDal.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;
@ -531,7 +528,7 @@ namespace Blog.Core.Services
}
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();
var bindUser = await BaseDal.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);
@ -552,14 +549,14 @@ namespace Blog.Core.Services
}
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();
var bindUser = await BaseDal.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();
await BaseDal.Db.Updateable<WeChatSub>(bindUser).UpdateColumns(t=> new{ t.IsUnBind,t.SubUserRefTime}).ExecuteCommandAsync();
return MessageModel<WeChatResponseUserInfo>.Success("用户解绑成功", reData);
}
@ -796,12 +793,12 @@ namespace Blog.Core.Services
private async Task<string> QRBind(WeChatXMLDto weChat)
{
var ticket = await _dal.Db.Queryable<WeChatQR>().InSingleAsync(weChat.Ticket);
var ticket = await BaseDal.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();
var bindUser = await BaseDal.Db.Queryable<WeChatSub>().Where(t => t.SubFromPublicAccount == ticket.QRpublicAccount && t.CompanyID == ticket.QRbindCompanyID && t.SubJobID == ticket.QRbindJobID).SingleAsync();
bool isNewBind;
if (bindUser == null )
{
@ -835,11 +832,11 @@ namespace Blog.Core.Services
try
{
_unitOfWork.BeginTran();
await _dal.Db.Updateable<WeChatQR>(ticket).ExecuteCommandAsync();
await BaseDal.Db.Updateable<WeChatQR>(ticket).ExecuteCommandAsync();
if (isNewBind)
await _dal.Db.Insertable<WeChatSub>(bindUser).ExecuteCommandAsync();
await BaseDal.Db.Insertable<WeChatSub>(bindUser).ExecuteCommandAsync();
else
await _dal.Db.Updateable<WeChatSub>(bindUser).ExecuteCommandAsync();
await BaseDal.Db.Updateable<WeChatSub>(bindUser).ExecuteCommandAsync();
_unitOfWork.CommitTran();
}
catch

View File

@ -19,16 +19,6 @@ namespace Blog.Core.Services
/// </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

@ -19,16 +19,6 @@ namespace Blog.Core.Services
/// </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;
}
}
}

View File

@ -12,16 +12,12 @@ namespace Blog.Core.FrameWork.Services
/// </summary>
public class SysUserInfoServices : BaseServices<SysUserInfo>, ISysUserInfoServices
{
private readonly IBaseRepository<SysUserInfo> _dal;
private readonly IBaseRepository<UserRole> _userRoleRepository;
private readonly IBaseRepository<Role> _roleRepository;
public SysUserInfoServices(IBaseRepository<SysUserInfo> dal, IBaseRepository<UserRole> userRoleRepository, IBaseRepository<Role> roleRepository)
public SysUserInfoServices(IBaseRepository<UserRole> userRoleRepository, IBaseRepository<Role> roleRepository)
{
this._dal = dal;
_userRoleRepository = userRoleRepository;
_roleRepository = roleRepository;
base.BaseDal = dal;
}
/// <summary>
///