😎清理代码

This commit is contained in:
zuohuaijun 2025-03-02 17:01:18 +08:00
parent 0f30009f91
commit 21168c280d
17 changed files with 48 additions and 253 deletions

View File

@ -5,7 +5,6 @@
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core;
global using Admin.NET.Core.Utils;
global using Furion;
global using Furion.DependencyInjection;
global using Furion.DynamicApiController;

View File

@ -25,7 +25,7 @@ public class CaptchaDistributedCache : IDistributedCache
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
private string GetKey(string key)
private static string GetKey(string key)
{
return $"Captcha:{key}";
}

View File

@ -31,9 +31,9 @@ public sealed class RedisEventSourceStorer : IEventSourceStorer, IDisposable
/// </summary>
private readonly Channel<IEventSource> _channel;
private IProducerConsumer<ChannelEventSource> _queueSingle;
private readonly IProducerConsumer<ChannelEventSource> _queueSingle;
private RedisStream<string> _queueBroadcast;
private readonly RedisStream<string> _queueBroadcast;
/// <summary>
/// 构造函数
@ -111,8 +111,7 @@ public sealed class RedisEventSourceStorer : IEventSourceStorer, IDisposable
public async ValueTask WriteAsync(IEventSource eventSource, CancellationToken cancellationToken)
{
// 空检查
if (eventSource == default)
throw new ArgumentNullException(nameof(eventSource));
ArgumentNullException.ThrowIfNull(eventSource);
// 这里判断是否是 ChannelEventSource 或者 自定义的 EventSource
if (eventSource is ChannelEventSource source)

View File

@ -1,43 +0,0 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;
public static class LogInfoExtension
{
/// <summary>
/// 添加自定义日志 自动设置当前请求的Action和Controller名称
/// </summary>
/// <param name="logger"></param>
/// <param name="title"></param>
/// <param name="logMessage"></param>
/// <param name="args"></param>
public static void AddLog(this ILogger logger, string title, string logMessage, params object[] args)
{
var request = App.HttpContext.Request;
// 获取当前路由信息
var route = request.RouteValues.Values;
var scheme = request.Scheme; // 协议http 或 https
var host = request.Host.Value; // 主机名(包括端口)
var path = request.Path.Value; // 路径
var queryString = request.QueryString.Value; // 查询字符串
// 拼接完整链接
var fullUrl = $"{scheme}://{host}{path}{queryString}";
// 写入上下文
using var scope = logger.ScopeContext(ctx => ctx.Set("Title", title)
.Set("Action", route.FirstOrDefault()?.ToString())
.Set("Controller", route.Count > 1 ? route.Skip(1).FirstOrDefault().ToString() : "")
.Set("Url", fullUrl)
.Set("Method", request.Method)
);
// 记录日志
logger.LogInformation(logMessage, args);
// 使用方法 先注入_logger
// _logger.AddLog("日志标题", "日志内容");
}
}

View File

@ -68,165 +68,7 @@ public static partial class ObjectExtension
public static string ToJson(this object obj)
{
return JSON.GetJsonSerializer().Serialize(obj);
}
/// <summary>
/// Json字符串反序列化成对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T ToObject<T>(this string json)
{
return JSON.GetJsonSerializer().Deserialize<T>(json);
}
/// <summary>
/// 将object转换为long若失败则返回0
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static long ParseToLong(this object obj)
{
try
{
return long.Parse(obj.ToString());
}
catch
{
return 0L;
}
}
/// <summary>
/// 将object转换为long若失败则返回指定值
/// </summary>
/// <param name="str"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static long ParseToLong(this string str, long defaultValue)
{
try
{
return long.Parse(str);
}
catch
{
return defaultValue;
}
}
/// <summary>
/// 将object转换为double若失败则返回0
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static double ParseToDouble(this object obj)
{
try
{
return double.Parse(obj.ToString());
}
catch
{
return 0;
}
}
/// <summary>
/// 将object转换为double若失败则返回指定值
/// </summary>
/// <param name="str"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static double ParseToDouble(this object str, double defaultValue)
{
try
{
return double.Parse(str.ToString());
}
catch
{
return defaultValue;
}
}
/// <summary>
/// 将string转换为DateTime若失败则返回日期最小值
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static DateTime ParseToDateTime(this string str)
{
try
{
if (string.IsNullOrWhiteSpace(str))
{
return DateTime.MinValue;
}
if (str.Contains('-') || str.Contains('/'))
{
return DateTime.Parse(str);
}
else
{
int length = str.Length;
return length switch
{
4 => DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture),
6 => DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture),
8 => DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture),
10 => DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture),
12 => DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture),
14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
_ => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
};
}
}
catch
{
return DateTime.MinValue;
}
}
/// <summary>
/// 将string转换为DateTime若失败则返回默认值
/// </summary>
/// <param name="str"></param>
/// <param name="defaultValue"></param>
/// <returns></returns>
public static DateTime ParseToDateTime(this string str, DateTime? defaultValue)
{
try
{
if (string.IsNullOrWhiteSpace(str))
{
return defaultValue.GetValueOrDefault();
}
if (str.Contains('-') || str.Contains('/'))
{
return DateTime.Parse(str);
}
else
{
int length = str.Length;
return length switch
{
4 => DateTime.ParseExact(str, "yyyy", System.Globalization.CultureInfo.CurrentCulture),
6 => DateTime.ParseExact(str, "yyyyMM", System.Globalization.CultureInfo.CurrentCulture),
8 => DateTime.ParseExact(str, "yyyyMMdd", System.Globalization.CultureInfo.CurrentCulture),
10 => DateTime.ParseExact(str, "yyyyMMddHH", System.Globalization.CultureInfo.CurrentCulture),
12 => DateTime.ParseExact(str, "yyyyMMddHHmm", System.Globalization.CultureInfo.CurrentCulture),
14 => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
_ => DateTime.ParseExact(str, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture),
};
}
}
catch
{
return defaultValue.GetValueOrDefault();
}
}
}
/// <summary>
/// 将 string 时间日期格式转换成字符串 如 {yyyy} => 2024

View File

@ -36,7 +36,7 @@ public static class YitIdHelperExtension
// return;
//}
var maxLength = Math.Pow(2, _options.WorkerIdBitLength.ParseToDouble());
var maxLength = Math.Pow(2, _options.WorkerIdBitLength.ToLong());
for (int i = 0; i < maxLength; i++)
{
_workIds.Add(i.ToString());
@ -54,7 +54,7 @@ public static class YitIdHelperExtension
var valueKey = $"{_options.WorkerPrefix}{MainValueKey}";
var minWorkId = 0;
var maxWorkId = Math.Pow(2, _options.WorkerIdBitLength.ParseToDouble());
var maxWorkId = Math.Pow(2, _options.WorkerIdBitLength.ToLong());
var cache = App.GetRequiredService<ICacheProvider>().Cache;
var redisLock = cache.AcquireLock(lockName, 10000, 15000, true);
@ -85,7 +85,7 @@ public static class YitIdHelperExtension
Console.WriteLine($"############ 当前应用雪花WorkId:【{workIdStr}】############");
long workId = workIdStr.ParseToLong();
long workId = workIdStr.ToLong();
if (workId < minWorkId || workId > maxWorkId)
continue;

View File

@ -5,7 +5,6 @@
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
global using Admin.NET.Core.Service;
global using Admin.NET.Core.Utils;
global using Furion;
global using Furion.ConfigurableOptions;
global using Furion.DatabaseAccessor;
@ -19,7 +18,6 @@ global using Furion.HttpRemote;
global using Furion.JsonSerialization;
global using Furion.Logging;
global using Furion.Schedule;
global using Furion.Shapeless;
global using Furion.UnifyResult;
global using Furion.ViewEngine;
global using Magicodes.ExporterAndImporter.Core;

View File

@ -67,7 +67,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
Device = device
};
await _sysOnlineUerRep.InsertAsync(user);
_sysCacheService.HashAdd(CacheConst.KeyUserOnline, user.UserId + Context.ConnectionId + loginMode, user);
SysCacheService.HashAdd(CacheConst.KeyUserOnline, user.UserId + Context.ConnectionId + loginMode, user);
// 以租户Id进行分组
var groupName = $"{GROUP_ONLINE}{user.TenantId}";
@ -96,7 +96,7 @@ public class OnlineUserHub : Hub<IOnlineUserHub>
if (user == null) return;
await _sysOnlineUerRep.DeleteByIdAsync(user.Id);
_sysCacheService.HashDel<SysOnlineUser>(CacheConst.KeyUserOnline, user.UserId + Context.ConnectionId + user.LoginMode);
SysCacheService.HashDel<SysOnlineUser>(CacheConst.KeyUserOnline, user.UserId + Context.ConnectionId + user.LoginMode);
// 通知当前组用户变动
var userList = await _sysOnlineUerRep.AsQueryable().Filter("", true).Where(u => u.TenantId == user.TenantId).Take(10).ToListAsync();

View File

@ -17,7 +17,7 @@ public class FuncList
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public string Merge(object a, object b)
public static string Merge(object a, object b)
{
return a.ToString() + b.ToString();
}
@ -28,7 +28,7 @@ public class FuncList
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public object MergeObj(object a, object b)
public static object MergeObj(object a, object b)
{
return new { a, b };
}
@ -39,7 +39,7 @@ public class FuncList
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public bool IsContain(object a, object b)
public static bool IsContain(object a, object b)
{
return a.ToString().Split(',').Contains(b);
}
@ -54,13 +54,13 @@ public class FuncList
JTokenType jTokenType = jToken.Type;
return jTokenType switch
{
JTokenType.Integer => jToken.ToObject(typeof(long)),
JTokenType.Float => jToken.ToObject(typeof(decimal)),
JTokenType.Boolean => jToken.ToObject(typeof(bool)),
JTokenType.Date => jToken.ToObject(typeof(DateTime)),
JTokenType.Bytes => jToken.ToObject(typeof(byte)),
JTokenType.Guid => jToken.ToObject(typeof(Guid)),
JTokenType.TimeSpan => jToken.ToObject(typeof(TimeSpan)),
JTokenType.Integer => jToken.ToObject<long>(),
JTokenType.Float => jToken.ToObject<decimal>(),
JTokenType.Boolean => jToken.ToObject<bool>(),
JTokenType.Date => jToken.ToObject<DateTime>(),
JTokenType.Bytes => jToken.ToObject<byte>(),
JTokenType.Guid => jToken.ToObject<Guid>(),
JTokenType.TimeSpan => jToken.ToObject<TimeSpan>(),
JTokenType.Array => TransJArrayToSugarPara(jToken),
_ => jToken
};

View File

@ -132,7 +132,7 @@ public class SelectTable : ISingleton
}
else if (key.Equals("func"))
{
ExecFunc(resultObj, item);
SelectTable.ExecFunc(resultObj, item);
}
else if (key.Equals("total@") || key.Equals("total"))
{
@ -181,7 +181,7 @@ public class SelectTable : ISingleton
}
else if (key.Equals("func"))
{
ExecFunc(resultObj, item);
SelectTable.ExecFunc(resultObj, item);
}
else if (key.Equals("total@") || key.Equals("total"))
{
@ -396,7 +396,7 @@ public class SelectTable : ISingleton
}
// 执行方法
private void ExecFunc(JObject resultObj, KeyValuePair<string, JToken> item)
private static void ExecFunc(JObject resultObj, KeyValuePair<string, JToken> item)
{
var jb = JObject.Parse(item.Value.ToString());
@ -478,7 +478,7 @@ public class SelectTable : ISingleton
if (ziduan[1].Length > 20)
throw new Exception("别名不能超过20个字符");
str.Append(ziduan[0] + " as `" + ReplaceSQLChar(ziduan[1]) + "`,");
str.Append(ziduan[0] + " as `" + SelectTable.ReplaceSQLChar(ziduan[1]) + "`,");
}
// 不对函数加``解决sum(*)、Count(1)等不能使用的问题
else if (ziduan[0].Contains('('))
@ -835,7 +835,7 @@ public class SelectTable : ISingleton
}
// 处理sql注入
private string ReplaceSQLChar(string str)
private static string ReplaceSQLChar(string str)
{
if (string.IsNullOrWhiteSpace(str))
return string.Empty;

View File

@ -163,7 +163,7 @@ public class SysLdapService : IDynamicApiController, ITransient
public async Task<List<SysUserLdap>> SyncUserTenant(long tenantId)
{
var sysLdap = await _sysLdapRep.GetFirstAsync(c => c.TenantId == tenantId && c.IsDelete == false && c.Status == StatusEnum.Enable) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
return await SyncUser(sysLdap);
return await SysLdapService.SyncUser(sysLdap);
}
/// <summary>
@ -175,7 +175,7 @@ public class SysLdapService : IDynamicApiController, ITransient
public async Task<List<SysUserLdap>> SyncUser(SyncSysLdapInput input)
{
var sysLdap = await _sysLdapRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
return await SyncUser(sysLdap);
return await SysLdapService.SyncUser(sysLdap);
}
/// <summary>
@ -183,7 +183,7 @@ public class SysLdapService : IDynamicApiController, ITransient
/// </summary>
/// <param name="sysLdap"></param>
/// <returns></returns>
private async Task<List<SysUserLdap>> SyncUser(SysLdap sysLdap)
private static async Task<List<SysUserLdap>> SyncUser(SysLdap sysLdap)
{
if (sysLdap == null) throw Oops.Oh(ErrorCodeEnum.D1002);
var ldapConn = new LdapConnection();

View File

@ -154,7 +154,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="key"></param>
/// <returns></returns>
[NonAction]
public TimeSpan GetExpire(string key)
public static TimeSpan GetExpire(string key)
{
return _cacheProvider.Cache.GetExpire(key);
}
@ -274,7 +274,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="key"></param>
/// <returns></returns>
[NonAction]
public IDictionary<String, T> GetHashMap<T>(string key)
public static IDictionary<String, T> GetHashMap<T>(string key)
{
return _cacheProvider.Cache.GetDictionary<T>(key);
}
@ -287,7 +287,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="dic"></param>
/// <returns></returns>
[NonAction]
public bool HashSet<T>(string key, Dictionary<string, T> dic)
public static bool HashSet<T>(string key, Dictionary<string, T> dic)
{
var hash = GetHashMap<T>(key);
foreach (var v in dic)
@ -305,7 +305,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="hashKey"></param>
/// <param name="value"></param>
[NonAction]
public void HashAdd<T>(string key, string hashKey, T value)
public static void HashAdd<T>(string key, string hashKey, T value)
{
var hash = GetHashMap<T>(key);
hash.Add(hashKey, value);
@ -319,7 +319,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="hashKey"></param>
/// <param name="value"></param>
[NonAction]
public void HashAddOrUpdate<T>(string key, string hashKey, T value)
public static void HashAddOrUpdate<T>(string key, string hashKey, T value)
{
var hash = GetHashMap<T>(key);
if (hash.ContainsKey(hashKey))
@ -336,7 +336,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="fields"></param>
/// <returns></returns>
[NonAction]
public List<T> HashGet<T>(string key, params string[] fields)
public static List<T> HashGet<T>(string key, params string[] fields)
{
var hash = GetHashMap<T>(key);
return hash.Where(t => fields.Any(c => t.Key == c)).Select(t => t.Value).ToList();
@ -350,7 +350,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="field"></param>
/// <returns></returns>
[NonAction]
public T HashGetOne<T>(string key, string field)
public static T HashGetOne<T>(string key, string field)
{
var hash = GetHashMap<T>(key);
return hash.TryGetValue(field, out T value) ? value : default;
@ -363,7 +363,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="key"></param>
/// <returns></returns>
[NonAction]
public IDictionary<string, T> HashGetAll<T>(string key)
public static IDictionary<string, T> HashGetAll<T>(string key)
{
var hash = GetHashMap<T>(key);
return hash;
@ -377,7 +377,7 @@ public class SysCacheService : IDynamicApiController, ISingleton
/// <param name="fields"></param>
/// <returns></returns>
[NonAction]
public int HashDel<T>(string key, params string[] fields)
public static int HashDel<T>(string key, params string[] fields)
{
var hash = GetHashMap<T>(key);
fields.ToList().ForEach(t => hash.Remove(t));

View File

@ -46,7 +46,7 @@ public class SysMessageService : IDynamicApiController, ITransient
[DisplayName("发送消息给除了发送人的其他人")]
public async Task SendOtherUser(MessageInput input)
{
var hashKey = _sysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var hashKey = SysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var exceptReceiveUsers = hashKey.Where(u => u.Value.UserId == input.ReceiveUserId).Select(u => u.Value).ToList();
await _chatHubContext.Clients.AllExcept(exceptReceiveUsers.Select(t => t.ConnectionId)).ReceiveMessage(input);
}
@ -61,7 +61,7 @@ public class SysMessageService : IDynamicApiController, ITransient
{
var sysLogMsg = await SaveMsgLog(input);
var hashKey = _sysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var hashKey = SysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var receiveUser = hashKey.Where(u => u.Value.UserId == input.ReceiveUserId).Select(u => u.Value).FirstOrDefault();
await _chatHubContext.Clients.Client(receiveUser.ConnectionId ?? "").ReceiveMessage(sysLogMsg);
}
@ -74,7 +74,7 @@ public class SysMessageService : IDynamicApiController, ITransient
[DisplayName("发送消息给某些人")]
public async Task SendUsers(MessageInput input)
{
var hashKey = _sysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var hashKey = SysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var receiveUsers = hashKey.Where(u => input.UserIds.Any(a => a == u.Value.UserId)).Select(u => u.Value).ToList();
await receiveUsers.ForEachAsync(u => _chatHubContext.Clients.Client(u.ConnectionId ?? "").ReceiveMessage(input));
}
@ -86,7 +86,7 @@ public class SysMessageService : IDynamicApiController, ITransient
/// <returns></returns>
private async Task<SysLogMsg> SaveMsgLog(MessageInput input)
{
var hashKey = _sysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var hashKey = SysCacheService.HashGetAll<SysOnlineUser>(CacheConst.KeyUserOnline);
var receiveUser = hashKey.Where(u => u.Value.UserId == input.ReceiveUserId).Select(u => u.Value).FirstOrDefault();
var sendUser = hashKey.Where(u => u.Value.UserId == input.SendUserId).Select(u => u.Value).FirstOrDefault();

View File

@ -263,7 +263,7 @@ public class SysRegionService : IDynamicApiController, ITransient
await _sysRegionRep.Context.Fastest<SysRegion>().BulkCopyAsync(regionList);
}
private void GetChildren(List<SysRegion> regionList, List<GDRegionResponse> responses, int level, long pid)
private static void GetChildren(List<SysRegion> regionList, List<GDRegionResponse> responses, int level, long pid)
{
foreach (var region in responses)
{

View File

@ -49,7 +49,7 @@ public class SysServerService : IDynamicApiController, ITransient
var programStartTime = Process.GetCurrentProcess().StartTime;
var totalMilliseconds = (DateTime.Now - programStartTime).TotalMilliseconds.ToString();
var ts = totalMilliseconds.Contains('.') ? totalMilliseconds.Split('.')[0] : totalMilliseconds;
var programRunTime = DateTimeUtil.FormatTime(ts.ParseToLong());
var programRunTime = DateTimeUtil.FormatTime(ts.ToLong());
var memoryMetrics = ComputerUtil.GetComputerInfo();
return new

View File

@ -4,7 +4,7 @@
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Utils;
namespace Admin.NET.Core;
/// <summary>
/// 聚合配置增强版(独立类)

View File

@ -34,7 +34,7 @@ public static class ComputerUtil
var cpuRates = GetCPURates();
if (cpuRates != null)
{
memoryMetrics.CpuRates = cpuRates.Select(u => Math.Ceiling(u.ParseToDouble()) + "%").ToList();
memoryMetrics.CpuRates = cpuRates.Select(u => Math.Ceiling(u.ToDouble()) + "%").ToList();
}
return memoryMetrics;
}
@ -208,19 +208,19 @@ public static class ComputerUtil
// 返回1705379131
// 使用date格式化即可
string output = ShellUtil.Bash("date -r $(sysctl -n kern.boottime | awk '{print $4}' | tr -d ',') +\"%Y-%m-%d %H:%M:%S\"").Trim();
runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ToLong());
}
else if (IsUnix())
{
string output = ShellUtil.Bash("date -d \"$(awk -F. '{print $1}' /proc/uptime) second ago\" +\"%Y-%m-%d %H:%M:%S\"").Trim();
runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
runTime = DateTimeUtil.FormatTime((DateTime.Now - output.ToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ToLong());
}
else
{
string output = ShellUtil.Cmd("wmic", "OS get LastBootUpTime/Value");
string[] outputArr = output.Split('=', (char)StringSplitOptions.RemoveEmptyEntries);
if (outputArr.Length == 2)
runTime = DateTimeUtil.FormatTime((DateTime.Now - outputArr[1].Split('.')[0].ParseToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ParseToLong());
runTime = DateTimeUtil.FormatTime((DateTime.Now - outputArr[1].Split('.')[0].ToDateTime()).TotalMilliseconds.ToString().Split('.')[0].ToLong());
}
return runTime;
}