diff --git a/Blog.Core.Api/Blog.Core.Model.xml b/Blog.Core.Api/Blog.Core.Model.xml
index 36975d1..ea9857b 100644
--- a/Blog.Core.Api/Blog.Core.Model.xml
+++ b/Blog.Core.Api/Blog.Core.Model.xml
@@ -982,6 +982,76 @@
Tibug 博文
+
+
+ users自定义服务器
+
+
+
+
+ 用户流量每月汇总表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Trojan服务器
+
+
+
+
+ users自定义URL服务器
+
+
+
+
+ Trojan用户
+
+
+
+
+ 历史流量记录
+
+
用户跟角色关联表
@@ -2407,6 +2477,73 @@
+
+
+ 限制流量dto
+ 作者:胡丁文
+ 时间:2020-4-27 16:57:07
+
+
+
+
+ 用户
+
+
+
+
+ 流量(-1为无限,单位为最小单位byte)
+
+
+
+
+ Trojan服务器拼接服务器和订阅地址
+
+
+
+
+ 普通订阅连接
+
+
+
+
+ clash订阅连接
+
+
+
+
+ 备用clash订阅连接
+
+
+
+
+ Trojan用户流量统计分组
+
+
+
+
+ 用户ID
+
+
+
+
+ 月度
+
+
+
+
+ 上传流量
+
+
+
+
+ 下载流量
+
+
+
+
+ 下载流量
+
+
微信接口消息DTO
diff --git a/Blog.Core.Api/Blog.Core.xml b/Blog.Core.Api/Blog.Core.xml
index 3321d53..a14a900 100644
--- a/Blog.Core.Api/Blog.Core.xml
+++ b/Blog.Core.Api/Blog.Core.xml
@@ -650,6 +650,159 @@
+
+
+ 获取Trojan用户
+
+
+
+
+
+
+
+
+ 获取Trojan用户-下拉列表用
+
+
+
+
+
+ 添加Trojan用户
+
+
+
+
+
+
+ 更新Trojan用户
+
+
+
+
+
+
+ 删除用户
+
+
+
+
+
+
+ 重置流量
+
+
+
+
+
+
+ 限制流量
+
+
+
+
+
+
+ 重置链接密码
+
+
+
+
+
+
+ 获取Trojan服务器
+
+
+
+
+
+ 获取拼接后的Trojan服务器
+
+ passwordshow
+
+
+
+
+ 删除Trojan服务器
+
+
+
+
+
+
+ 更新Trojan服务器
+
+
+
+
+
+
+ 添加Trojan服务器
+
+
+
+
+
+
+ 获取Cus服务器
+
+
+
+
+
+ 删除Cus服务器
+
+
+
+
+
+
+ 更新Cus服务器
+
+
+
+
+
+
+ 添加Cus服务器
+
+
+
+
+
+
+ 获取Url服务器
+
+
+
+
+
+ 删除Url服务器
+
+
+
+
+
+
+ 更新Url服务器
+
+
+
+
+
+
+ 添加Url服务器
+
+
+
+
+
+
+ 获取订阅数据
+
+ 链接密码
+ 是否使用base64加密
+
+
用户管理
@@ -1062,6 +1215,13 @@
卡片消息对象
+
+
+ 推送卡片消息接口
+
+ 卡片消息对象
+
+
推送文本消息
diff --git a/Blog.Core.Api/Controllers/TrojanController.cs b/Blog.Core.Api/Controllers/TrojanController.cs
new file mode 100644
index 0000000..8ec64c8
--- /dev/null
+++ b/Blog.Core.Api/Controllers/TrojanController.cs
@@ -0,0 +1,451 @@
+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 _baseServicesServers;
+ public IBaseServices _baseServicesDetails;
+ public IBaseServices _baseServicesCusServers;
+ public IBaseServices _baseServicesUrlServers;
+ private IUser _user;
+ public TrojanController(ITrojanUsersServices trojanUsersServices,IUser user
+ , IBaseServices baseServicesServers
+ , IBaseServices baseServicesDetails
+ , IBaseServices baseServicesCusServers
+ , IBaseServices baseServicesUrlServers)
+ {
+ _baseServicesDetails = baseServicesDetails;
+ _baseServicesServers = baseServicesServers;
+ _trojanUsersServices = trojanUsersServices;
+ _baseServicesCusServers = baseServicesCusServers;
+ _baseServicesUrlServers = baseServicesUrlServers;
+ _user = user;
+ }
+ ///
+ /// 获取Trojan用户
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpGet]
+ public async Task>> GetUser([FromQuery]PaginationModel pagination, [FromQuery] string name, [FromQuery] bool isuse)
+ {
+ var whereFind = LinqHelper.True();
+ if (!string.IsNullOrEmpty(name))
+ whereFind = whereFind.And(t=>t.username.Contains(name));
+ if (isuse)
+ whereFind = whereFind.And(t => t.upload > 0 || t.download > 0);
+ var data = await _trojanUsersServices.QueryPage(whereFind, pagination.PageIndex, pagination.PageSize);
+ if (data.data.Count > 0)
+ {
+ var ids = data.data.Select(t => t.id).ToList();
+ var where = LinqHelper.True();
+ 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>.Success("获取成功", data);
+ }
+
+ ///
+ /// 获取Trojan用户-下拉列表用
+ ///
+ ///
+ [HttpGet]
+ public async Task> GetAllTrojanUser()
+ {
+ var data = await _trojanUsersServices.QueryTable("select id,username from users");
+ return MessageModel.Success("获取成功", data);
+ }
+ ///
+ /// 添加Trojan用户
+ ///
+ ///
+ ///
+ [HttpPost]
+ public async Task> AddUser([FromBody]TrojanUsers user)
+ {
+ var find = await _trojanUsersServices.Query(t => t.username == user.username);
+ if(find!=null && find.Count>0) return MessageModel