This commit is contained in:
c
2023-07-23 00:36:17 +08:00
commit 5e5ffd309b
200 changed files with 152313 additions and 0 deletions

63
.gitattributes vendored Normal file
View File

@@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

363
.gitignore vendored Normal file
View File

@@ -0,0 +1,363 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,7 @@
namespace NetPanel.Entity
{
public class Class1
{
}
}

View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Threading.Tasks;
namespace NetPanel.Entity.Conf
{
public class UserAdmin
{
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
public string UserName { get; set; }
/// <summary>
/// Desc:
/// Default:
/// Nullable:False
/// </summary>
public string UserPwd { get; set; }
}
}

16
NetPanel.Entity/Menu.cs Normal file
View File

@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NetPanel.Entity
{
public class Menu
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Icon { get; set; }
public string MenuName { get; set; }
public string Url { get; set; }
public List<Menu> Child { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NetPanel.Entity
{
public class ReturnMsg
{
public int Code { get; set; }
public object Msg { get; set; }
public object Obj { get; set; }
}
}

View File

@@ -0,0 +1,642 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
namespace NetPanel.Help
{
public static class ExtendHelper
{
/// <summary>
/// 扩展帮助类
/// </summary>
#region int
/// <summary>
/// 转换指定时间得到对应的时间戳
/// true 则生成13位的时间戳,
/// false 则生成10位的时间戳,默认为 true
/// </summary>
/// <param name="s"></param>
/// <param name="isLongTime">精度(毫秒)设置 true则生成13位的时间戳精度设置为 false则生成10位的时间戳默认为 true </param>
/// <returns>返回对应的时间戳</returns>
public static long ToTimeStamp(this DateTime s, bool isLongTime = true)
{
var ts = s.ToUniversalTime() - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return isLongTime ? Convert.ToInt64(ts.TotalMilliseconds) : Convert.ToInt64(ts.TotalSeconds);
}
/// <summary>
/// 取整 有小数进1
/// </summary>
/// <param name="d"></param>
/// <param name="decimals"></param>
/// <returns></returns>
public static int ToInteger(this double d)
{
return Math.Ceiling(d).ToInt32();
}
/// <summary>
/// 转换为Double 如果为空返回0
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static double ToDouble(this object s, double e = 0)
{
if (s == null || s == string.Empty)
{
return e;
}
return Convert.ToDouble(s);
}
/// <summary>
/// 转换为int 如果为空返回0
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static int ToInt32(this object s, int e = 0)
{
if (s == null || s == string.Empty)
{
return e;
}
return Convert.ToInt32(s);
}
#endregion
#region bool
/// <summary>
/// 判断 为空
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static bool IsNull(this string s)
{
return string.IsNullOrWhiteSpace(s);
}
/// <summary>
/// 判断 不为空
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static bool IsNotNull(this string s)
{
return !string.IsNullOrWhiteSpace(s);
}
/// <summary>
/// 判断是否 等于 字符串 true 包含 false 不包含
/// </summary>
/// <param name="s"></param>
/// <param name="sArrStr"></param>
/// <returns></returns>
public static bool AndEquals(this string s, params string[] sArrStr)
{
for (int i = 0; i < sArrStr.Length; i++)
{
if (!s.Equals(sArrStr[i], StringComparison.OrdinalIgnoreCase))
{
return false;
}
}
return true;
}
/// <summary>
/// 判断是否 包含等于 字符串 true 包含 false 不包含
/// </summary>
/// <param name="s"></param>
/// <param name="sArrStr"></param>
/// <returns></returns>
public static bool OrEquals(this string s, params string[] sArrStr)
{
for (int i = 0; i < sArrStr.Length; i++)
{
if (s.Equals(sArrStr[i], StringComparison.OrdinalIgnoreCase))
{
return true;
}
}
return false;
}
/// <summary>
/// 判断是否 包含 字符串 true 包含 false 不包含
/// </summary>
/// <param name="s"></param>
/// <param name="sArrStr"></param>
/// <returns></returns>
public static bool AndContains(this string s, params string[] sArrStr)
{
for (int i = 0; i < sArrStr.Length; i++)
{
if (s.IndexOf(sArrStr[i], StringComparison.OrdinalIgnoreCase) <= -1)
{
return false;
}
}
return true;
}
/// <summary>
/// 判断是否 包含 字符串 true 包含 false 不包含
/// </summary>
/// <param name="s"></param>
/// <param name="sArrStr"></param>
/// <returns></returns>
public static bool OrContains(this string s, params string[] sArrStr)
{
for (int i = 0; i < sArrStr.Length; i++)
{
if (s.IndexOf(sArrStr[i], StringComparison.OrdinalIgnoreCase) > -1)
{
return true;
}
}
return false;
}
#endregion
#region DateTime
/// <summary>
/// 字符串转换为 时间
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static DateTime ToDateTime(this object s)
{
return Convert.ToDateTime(s);
}
/// <summary>
/// 字符串转换为 时间
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static DateTime ToDateTime(this string s)
{
return Convert.ToDateTime(s);
}
/// <summary>
/// 时间戳转为C#格式时间
/// </summary>
/// <param name="timeStamp"></param>
/// <returns></returns>
public static DateTime ToDateTimeByStamp(this string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime;
if (timeStamp.Length.Equals(10))//判断是10位
{
lTime = long.Parse(timeStamp + "0000000");
}
else
{
lTime = long.Parse(timeStamp + "0000");//13位
}
TimeSpan toNow = new TimeSpan(lTime);
DateTime daTime = dtStart.Add(toNow);
return daTime;
}
#endregion
#region double
/// <summary>
/// 带小数点数字匹配
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static double MatchingNumber(this string s)
{
string s1 = Regex.Replace(s, @"[^\d.\d]", "");
if (s1.IsNotNull())
{
return s1.ToDouble();
}
return 0;
}
/// <summary>
/// 保留小数点 不四舍五入
/// </summary>
/// <param name="d"></param>
/// <param name="decimals"></param>
/// <returns></returns>
public static double NotRound(this double d, int decimals)
{
if (decimals == 0)
{
return (int)d;
}
string sStr = "1";
for (int i = 0; i < decimals; i++)
{
sStr += "0";
}
decimals = Convert.ToInt32(sStr);
return Math.Floor(d * decimals) / decimals;
}
/// <summary>
/// 实现数据的四舍五入法
/// </summary>
/// <param name="v">要进行处理的数据</param>
/// <param name="x">保留的小数位数</param>
/// <returns>四舍五入后的结果</returns>
public static double Round(this double v, int x)
{
bool isNegative = false;
//如果是负数
if (v < 0)
{
isNegative = true;
v = -v;
}
int IValue = 1;
for (int i = 1; i <= x; i++)
{
IValue = IValue * 10;
}
double Int = Math.Round(v * IValue + 0.5, 0);
v = Int / IValue;
if (isNegative)
{
v = -v;
}
return v;
}
/// <summary>
/// 获取百分比 iCount=总数
/// </summary>
/// <param name="d"></param>
/// <param name="iCount"></param>
/// <returns></returns>
public static double getProportion(this double d, double iCount)
{
try
{
double dc = Math.Round((d / iCount) * 100, 2);
if (double.IsNaN(dc))
{
return 0;
}
return dc;
}
catch (Exception)
{
}
return 0;
}
/// <summary>
/// 获取百分比 iCount=总数
/// </summary>
/// <param name="d"></param>
/// <param name="iCount"></param>
/// <returns></returns>
public static double getProportion(this int d, double iCount)
{
try
{
double dc = Math.Round((d / iCount) * 100, 2);
if (double.IsNaN(dc))
{
return 0;
}
return dc;
}
catch (Exception)
{
}
return 0;
}
/// <summary>
/// 转换为 double
/// </summary>
/// <param name="d"></param>
/// <param name="decimals"></param>
/// <returns></returns>
public static double ToDouble(this object d)
{
return Convert.ToDouble(d);
}
#endregion
#region string
/// <summary>
/// 格式化ToString不会返回null
/// </summary>
/// <param name="s"></param>
/// <param name="e"></param>
/// <returns></returns>
public static string ToString(this object s, string e="")
{
if (s == null || s == string.Empty)
{
return e;
}
return s.ToString();
}
/// <summary>
/// url 编码
/// </summary>
/// <param name="s"></param>
/// <param name="e"></param>
/// <returns></returns>
public static string UrlEncode(this object s, Encoding e = null)
{
if (e == null) e = Encoding.UTF8;
return System.Web.HttpUtility.UrlEncode(s.ToString(), e);
}
/// <summary>
/// url 解码
/// </summary>
/// <param name="s"></param>
/// <param name="e"></param>
/// <returns></returns>
public static string UrlDecode(this object s, Encoding e = null)
{
if (e == null) e = Encoding.UTF8;
return System.Web.HttpUtility.UrlDecode(s.ToString(), e);
}
/// <summary>
/// 数字 千位分隔符
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ToThousandsSeparator(this double s)
{
return s.ToString("N0");
}
/// <summary>
/// 数字 千位分隔符
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ToThousandsSeparator(this int s)
{
return s.ToString("N0");
}
/// <summary>
/// 将c# DateTime时间格式转换为Unix时间戳格式 13位
/// </summary>
/// <param name="time">时间</param>
/// <returns>long</returns>
public static string ToTimeStamp13(this System.DateTime time)
{
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1, 0, 0, 0, 0));
long t = (time.Ticks - startTime.Ticks) / 10000; //除10000调整为13位
return t.ToString();
}
/// <summary>
/// 将c# DateTime时间格式转换为Unix时间戳格式 10位
/// </summary>
/// <param name="time">时间</param>
/// <returns>long</returns>
public static string ToTimeStamp10(this System.DateTime time)
{
DateTime dateStart = new DateTime(1970, 1, 1, 8, 0, 0);
int timeStamp = Convert.ToInt32((time - dateStart).TotalSeconds);
return timeStamp.ToString(); ;
}
/// <summary>
/// 截取字符串 过滤空格
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string[] SplitRemoveEmptyEntries(this string s, params string[] arr)
{
try
{
if (string.IsNullOrWhiteSpace(s))
{
return new string[] { };
}
return s.Split(arr, StringSplitOptions.RemoveEmptyEntries);
}
catch (Exception)
{
return new string[] { };
}
}
/// <summary>
/// 过滤sql 特殊符号
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ReplaceSQLChar(this string str)
{
if (str == String.Empty)
return String.Empty;
str = str.Replace("'", "");
str = str.Replace("<", "");
str = str.Replace(">", "");
str = str.Replace("@", "");
str = str.Replace("=", "");
str = str.Replace("+", "");
str = str.Replace("*", "");
str = str.Replace("&", "");
str = str.Replace("#", "");
str = str.Replace("%", "");
str = str.Replace("$", "");
//删除与数据库相关的词
str = Regex.Replace(str, "select", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "insert", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "delete from", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "count", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "drop table", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "asc", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "mid", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "char", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "xp_cmdshell", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "exec master", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "net localgroup administrators", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "and", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "net user", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "or", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "net", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "-", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "delete", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "drop", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "script", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "update", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "and", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "chr", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "master", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "truncate", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "declare", "", RegexOptions.IgnoreCase);
str = Regex.Replace(str, "mid", "", RegexOptions.IgnoreCase);
return str;
}
/// <summary>
/// 将DateTime 格式转换为 yyyy-MM-dd HH:mm:ss
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToDateStr(this DateTime d)
{
return d.ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// 将DateTime 格式转换为 yyyy-MM-dd HH:mm:ss
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string ToDateStr(this DateTime? d)
{
return Convert.ToDateTime(d).ToString("yyyy-MM-dd HH:mm:ss");
}
/// <summary>
/// Md5 加密
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetMD5Hash(this string str)
{
using (MD5 mi = MD5.Create())
{
byte[] buffer = Encoding.Default.GetBytes(str);
//开始加密
byte[] newBuffer = mi.ComputeHash(buffer);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < newBuffer.Length; i++)
{
sb.Append(newBuffer[i].ToString("x2"));
}
return sb.ToString();
}
}
#endregion
#region T
/// <summary>
/// 对象拷贝
/// </summary>
/// <param name="obj">被复制对象</param>
/// <returns>新对象</returns>
public static T CopyOjbect<T>(T obj)
{
Object targetDeepCopyObj = null;
if ((T)obj == null)
{
return (T)targetDeepCopyObj;
}
Type targetType = obj.GetType();
//值类型
if (targetType.IsValueType == true)
{
targetDeepCopyObj = obj;
}
//引用类型
else
{
targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象
System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();
foreach (System.Reflection.MemberInfo member in memberCollection)
{
//拷贝字段
if (member.MemberType == System.Reflection.MemberTypes.Field)
{
System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;
Object fieldValue = field.GetValue(obj);
if (fieldValue is ICloneable)
{
field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone());
}
else
{
field.SetValue(targetDeepCopyObj, CopyOjbect(fieldValue));
}
}//拷贝属性
else if (member.MemberType == System.Reflection.MemberTypes.Property)
{
System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;
MethodInfo info = myProperty.GetSetMethod(false);
if (info != null)
{
try
{
object propertyValue = myProperty.GetValue(obj, null);
if (propertyValue is ICloneable)
{
myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);
}
else
{
myProperty.SetValue(targetDeepCopyObj, CopyOjbect(propertyValue), null);
}
}
catch (System.Exception ex)
{
}
}
}
}
}
return (T)targetDeepCopyObj;
}
#endregion
}
}

227
NetPanel.Help/HtmlTag.cs Normal file
View File

@@ -0,0 +1,227 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
namespace NetPanel.Help
{
public class HtmlTag
{
private String m_Name;
private String m_BeginTag;
private String m_InnerHTML;
private Hashtable m_Attributes = new Hashtable();
static Regex attrReg = new Regex(@"([a-zA-Z1-9_-]+)\s*=\s*(\x27|\x22)([^\x27\x22]*)(\x27|\x22)", RegexOptions.IgnoreCase);
private HtmlTag(string name, string beginTag, string innerHTML)
{
m_Name = name;
m_BeginTag = beginTag;
m_InnerHTML = innerHTML;
MatchCollection matchs = attrReg.Matches(beginTag);
foreach (Match match in matchs)
{
m_Attributes[match.Groups[1].Value.ToUpper()] = match.Groups[3].Value;
}
}
public string GetBeginTag()
{
return m_BeginTag;
}
public List<HtmlTag> FindTag(String name)
{
return FindTag(m_InnerHTML, name, String.Format(@"<{0}(\s[^<>]*|)>", name));
}
public List<HtmlTag> FindImgTag()
{
return FindTag(m_InnerHTML, "img", @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>");
}
public List<HtmlTag> FindTag(String name, String format)
{
return FindTag(m_InnerHTML, name, format);
}
public List<HtmlTag> FindTagByAttr(String tagName, String attrName, String attrValue)
{
return FindTagByAttr(m_InnerHTML, tagName, attrName, attrValue);
}
public String TagName
{
get { return m_Name; }
}
public String InnerHTML
{
get { return m_InnerHTML; }
}
public String InnerText
{
get { return checkStr(m_InnerHTML); }
}
public String GetAttribute(string name)
{
return m_Attributes[name.ToUpper()] as String;
}
public String FindDate
{
get
{
Match m = Regex.Match(InnerText, @"(?<date>((1[6-9]|[2-3]\d)\d{2})-(\d{1,2})-(\d{1,2}))");
if (m.Groups.Count > 0)
{
return m.Groups["date"].Value;
}
else
{
return null;
}
}
}
public static string checkStr2(string html)
{
html = html.Replace("<br>", "$br$");
html = html.Replace("<br/>", "$br/$");
System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" no[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex(@"\<img[^\>]+\>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex(@"</p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex(@"<p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex(@"<[^>]*>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex1.Replace(html, ""); //过滤<script></script>标记
html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性
html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件
html = regex4.Replace(html, ""); //过滤iframe
html = regex5.Replace(html, ""); //过滤frameset
html = regex6.Replace(html, ""); //过滤frameset
// html = regex7.Replace(html, ""); //过滤frameset
// html = regex8.Replace(html, ""); //过滤frameset
html = regex9.Replace(html, "");
html = html.Replace(" ", "");
html = html.Replace("</strong>", "");
html = html.Replace("<strong>", "");
html = html.Replace("$br$", "<br>");
html = html.Replace("$br/$", "<br/>");
return html;
}
public static string checkStr(string html)
{
if (string.IsNullOrEmpty(html))
{
return html;
}
System.Text.RegularExpressions.Regex regex1 = new System.Text.RegularExpressions.Regex(@"<script[\s\S]+</script *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex2 = new System.Text.RegularExpressions.Regex(@" href *= *[\s\S]*script *:", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex3 = new System.Text.RegularExpressions.Regex(@" no[\s\S]*=", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex4 = new System.Text.RegularExpressions.Regex(@"<iframe[\s\S]+</iframe *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex5 = new System.Text.RegularExpressions.Regex(@"<frameset[\s\S]+</frameset *>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex6 = new System.Text.RegularExpressions.Regex(@"\<img[^\>]+\>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex7 = new System.Text.RegularExpressions.Regex(@"</p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex8 = new System.Text.RegularExpressions.Regex(@"<p>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
System.Text.RegularExpressions.Regex regex9 = new System.Text.RegularExpressions.Regex(@"<[^>]*>", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
html = regex1.Replace(html, ""); //过滤<script></script>标记
html = regex2.Replace(html, ""); //过滤href=javascript: (<A>) 属性
html = regex3.Replace(html, " _disibledevent="); //过滤其它控件的on...事件
html = regex4.Replace(html, ""); //过滤iframe
html = regex5.Replace(html, ""); //过滤frameset
html = regex6.Replace(html, ""); //过滤frameset
html = regex7.Replace(html, ""); //过滤frameset
html = regex8.Replace(html, ""); //过滤frameset
html = regex9.Replace(html, "");
html = html.Replace(" ", "");
html = html.Replace("</strong>", "");
html = html.Replace("<strong>", "");
html = html.Replace("&nbsp;", " ");
return html;
}
public static string HtmlToText(string str)
{
string m_outstr = str;
m_outstr = new Regex(@"(?m)<script[^>]*>(\w|\W)*?</script[^>]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
m_outstr = new Regex(@"(?m)<style[^>]*>(\w|\W)*?</style[^>]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
m_outstr = new Regex(@"(?m)<select[^>]*>(\w|\W)*?</select[^>]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
//m_outstr = new Regex(@"(?m)<a[^>]*>(\w|\W)*?</a[^>]*>", RegexOptions.Multiline | RegexOptions.IgnoreCase).Replace(m_outstr, "");
Regex objReg = new System.Text.RegularExpressions.Regex("(<[^>]+?>)|&nbsp;", RegexOptions.Multiline | RegexOptions.IgnoreCase);
m_outstr = objReg.Replace(m_outstr, "");
Regex objReg2 = new System.Text.RegularExpressions.Regex("(\\s)+", RegexOptions.Multiline | RegexOptions.IgnoreCase);
m_outstr = objReg2.Replace(m_outstr, " ");
return m_outstr;
}
/// <summary>
/// 在文本html的文本查找标志名为tagName,并且属性attrName的值为attrValue的所有标志
/// 例如FindTagByAttr(html, "div", "class", "demo")
/// 返回所有class为demo的div标志
/// </summary>
public static List<HtmlTag> FindTagByAttr(String html, String tagName, String attrName, String attrValue)
{
String format = String.Format(@"<{0}\s[^<>]*{1}\s*=\s*(\x27|\x22){2}(\x27|\x22)[^<>]*>", tagName, attrName, attrValue);
return FindTag(html, tagName, format);
}
public static List<HtmlTag> FindTag(String html, String name, String format)
{
Regex reg = new Regex(format, RegexOptions.IgnoreCase);
Regex tagReg = new Regex(String.Format(@"<(\/|)({0})(\s[^<>]*|)>", name), RegexOptions.IgnoreCase);
List<HtmlTag> tags = new List<HtmlTag>();
int start = 0;
while (true)
{
Match match = reg.Match(html, start);
if (match.Success)
{
start = match.Index + match.Length;
Match tagMatch = null;
int beginTagCount = 1;
while (true)
{
tagMatch = tagReg.Match(html, start);
if (!tagMatch.Success)
{
tagMatch = null;
break;
}
start = tagMatch.Index + tagMatch.Length;
if (tagMatch.Groups[1].Value == "/") beginTagCount--;
else beginTagCount++;
if (beginTagCount == 0) break;
}
if (tagMatch != null)
{
HtmlTag tag = new HtmlTag(name, match.Value, html.Substring(match.Index + match.Length, tagMatch.Index - match.Index - match.Length));
tags.Add(tag);
}
else
{
break;
}
}
else
{
break;
}
}
return tags;
}
}
}

979
NetPanel.Help/HttpHelper.cs Normal file
View File

@@ -0,0 +1,979 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Text.RegularExpressions;
namespace NetPanel.Help
{
/// <summary>
/// Http连接操作帮助类
/// </summary>
public class HttpHelper
{
#region
//默认的编码
private Encoding encoding = Encoding.Default;
//Post数据编码
private Encoding postencoding = Encoding.Default;
//HttpWebRequest对象用来发起请求
private HttpWebRequest request = null;
//获取影响流的数据对象
private HttpWebResponse response = null;
private int _MaxRetryCount = 3;
public int MaxRetryCount
{
get
{
return this._MaxRetryCount;
}
set
{
this._MaxRetryCount = value;
bool flag = value < 0;
if (flag)
{
this._MaxRetryCount = 0;
}
}
}
#endregion
#region Public
public HttpResult GetContent(HttpItem item, string ProxyPwd = null, string ProxyUserName = null)
{
HttpResult result = this.GetHtml(item);
int retrycount = 0;
while (retrycount < this._MaxRetryCount)
{
bool flag = result.StatusCode == HttpStatusCode.RequestTimeout;
if (!flag)
{
break;
}
result = this.GetHtml(item);
this._MaxRetryCount++;
}
return result;
}
/// <summary>
/// 根据相传入的数据,得到相应页面数据
/// </summary>
/// <param name="item">参数类对象</param>
/// <returns>返回HttpResult类型</returns>
public HttpResult GetHtml(HttpItem item)
{
//返回参数
HttpResult result = new HttpResult();
try
{
//准备参数
SetRequest(item);
}
catch (Exception ex)
{
result.Cookie = string.Empty;
result.Header = null;
result.Html = ex.Message;
result.StatusDescription = "配置参数时出错:" + ex.Message;
//配置参数时出错
return result;
}
try
{
System.GC.Collect();
//请求数据
using (response = (HttpWebResponse)request.GetResponse())
{
GetData(item, result);
}
}
catch (WebException ex)
{
if (ex.Response != null)
{
using (response = (HttpWebResponse)ex.Response)
{
GetData(item, result);
}
}
else
{
result.Html = ex.Message;
}
}
catch (Exception ex)
{
result.Html = ex.Message;
}
if (item.IsToLower) result.Html = result.Html.ToLower();
return result;
}
#endregion
#region GetData
/// <summary>
/// 获取数据的并解析的方法
/// </summary>
/// <param name="item"></param>
/// <param name="result"></param>
private void GetData(HttpItem item, HttpResult result)
{
#region base
//获取StatusCode
result.StatusCode = response.StatusCode;
//获取StatusDescription
result.StatusDescription = response.StatusDescription;
//获取最后访问的URl
result.ResponseUri = response.ResponseUri.ToString();
//获取Headers
result.Header = response.Headers;
//获取CookieCollection
if (response.Cookies != null) result.CookieCollection = response.Cookies;
//获取set-cookie
if (response.Headers["set-cookie"] != null) result.Cookie = response.Headers["set-cookie"];
//过滤 cookie
if (response.Headers["set-cookie"] != null) result.CookieSmall = GetSmallCookie(response.Headers["set-cookie"]);
#endregion
#region byte
//处理网页Byte
byte[] ResponseByte = GetByte();
#endregion
#region Html
if (ResponseByte != null & ResponseByte.Length > 0)
{
//设置编码
SetEncoding(item, result, ResponseByte);
//得到返回的HTML
result.Html = encoding.GetString(ResponseByte);
}
else
{
//没有返回任何Html代码
result.Html = string.Empty;
}
#endregion
}
/// <summary>
/// 设置编码
/// </summary>
/// <param name="item">HttpItem</param>
/// <param name="result">HttpResult</param>
/// <param name="ResponseByte">byte[]</param>
private void SetEncoding(HttpItem item, HttpResult result, byte[] ResponseByte)
{
//是否返回Byte类型数据
if (item.ResultType == ResultType.Byte) result.ResultByte = ResponseByte;
//从这里开始我们要无视编码了
if (encoding == null)
{
Match meta = Regex.Match(Encoding.Default.GetString(ResponseByte), "<meta[^<]*charset=([^<]*)[\"']", RegexOptions.IgnoreCase);
string c = string.Empty;
if (meta != null && meta.Groups.Count > 0)
{
c = meta.Groups[1].Value.ToLower().Trim();
}
if (c.Length > 2)
{
try
{
encoding = Encoding.GetEncoding(c.Replace("\"", string.Empty).Replace("'", "").Replace(";", "").Replace("iso-8859-1", "gbk").Trim());
}
catch
{
if (string.IsNullOrEmpty(response.CharacterSet))
{
encoding = Encoding.UTF8;
}
else
{
encoding = Encoding.GetEncoding(response.CharacterSet);
}
}
}
else
{
if (string.IsNullOrEmpty(response.CharacterSet))
{
encoding = Encoding.UTF8;
}
else
{
encoding = Encoding.GetEncoding(response.CharacterSet);
}
}
}
}
/// <summary>
/// 提取网页Byte
/// </summary>
/// <returns></returns>
private byte[] GetByte()
{
byte[] ResponseByte = null;
MemoryStream _stream = new MemoryStream();
//GZIIP处理
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
{
//开始读取流并设置编码方式
_stream = GetMemoryStream(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
}
else
{
//开始读取流并设置编码方式
_stream = GetMemoryStream(response.GetResponseStream());
}
//获取Byte
ResponseByte = _stream.ToArray();
_stream.Close();
return ResponseByte;
}
/// <summary>
/// 4.0以下.net版本取数据使用
/// </summary>
/// <param name="streamResponse">流</param>
private MemoryStream GetMemoryStream(Stream streamResponse)
{
MemoryStream _stream = new MemoryStream();
int Length = 256;
Byte[] buffer = new Byte[Length];
int bytesRead = streamResponse.Read(buffer, 0, Length);
while (bytesRead > 0)
{
_stream.Write(buffer, 0, bytesRead);
bytesRead = streamResponse.Read(buffer, 0, Length);
}
return _stream;
}
#endregion
#region SetRequest
/// <summary>
/// 根据字符生成Cookie和精简串将排除path,expires,domain以及重复项
/// </summary>
/// <param name="strcookie">Cookie字符串</param>
/// <returns>精简串</returns>
public string GetSmallCookie(string strcookie)
{
if (string.IsNullOrWhiteSpace(strcookie))
{
return string.Empty;
}
List<string> cookielist = new List<string>();
//将Cookie字符串以,;分开,生成一个字符数组,并删除里面的空项
string[] list = strcookie.ToString().Split(new string[] { ",", ";" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in list)
{
string itemcookie = item.ToLower().Trim().Replace("\r\n", string.Empty).Replace("\n", string.Empty);
//排除空字符串
if (string.IsNullOrWhiteSpace(itemcookie)) continue;
//排除不存在=号的Cookie项
if (!itemcookie.Contains("=")) continue;
//排除path项
if (itemcookie.Contains("path=")) continue;
//排除expires项
if (itemcookie.Contains("expires=")) continue;
//排除domain项
if (itemcookie.Contains("domain=")) continue;
//排除重复项
if (cookielist.Contains(item)) continue;
//对接Cookie基本的Key和Value串
cookielist.Add(string.Format("{0};", item));
}
return string.Join("", cookielist);
}
/// <summary>
/// 为请求准备参数
/// </summary>
///<param name="item">参数列表</param>
private void SetRequest(HttpItem item)
{
// 验证证书
SetCer(item);
//设置Header参数
if (item.Header != null && item.Header.Count > 0) foreach (string key in item.Header.AllKeys)
{
request.Headers.Add(key, item.Header[key]);
}
// 设置代理
SetProxy(item);
if (item.ProtocolVersion != null) request.ProtocolVersion = item.ProtocolVersion;
request.ServicePoint.Expect100Continue = item.Expect100Continue;
//请求方式Get或者Post
request.Method = item.Method;
request.Timeout = item.Timeout;
request.KeepAlive = item.KeepAlive;
request.ReadWriteTimeout = item.ReadWriteTimeout;
if (item.IfModifiedSince != null) request.IfModifiedSince = Convert.ToDateTime(item.IfModifiedSince);
//Accept
request.Accept = item.Accept;
//ContentType返回类型
request.ContentType = item.ContentType;
//UserAgent客户端的访问类型包括浏览器版本和操作系统信息
request.UserAgent = item.UserAgent;
// 编码
encoding = item.Encoding;
//设置安全凭证
request.Credentials = item.ICredentials;
//设置Cookie
SetCookie(item);
//来源地址
request.Referer = item.Referer;
//是否执行跳转功能
request.AllowAutoRedirect = item.Allowautoredirect;
request.AllowWriteStreamBuffering = item.AllowWriteStreamBuffering;
if (item.MaximumAutomaticRedirections > 0)
{
request.MaximumAutomaticRedirections = item.MaximumAutomaticRedirections;
}
//设置Post数据
SetPostData(item);
//设置最大连接
if (item.Connectionlimit > 0) request.ServicePoint.ConnectionLimit = item.Connectionlimit;
}
/// <summary>
/// 设置证书
/// </summary>
/// <param name="item"></param>
private void SetCer(HttpItem item)
{
if (!string.IsNullOrEmpty(item.CerPath))
{
//这一句一定要写在创建连接的前面。使用回调的方法进行证书验证。
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
//初始化对像并设置请求的URL地址
request = (HttpWebRequest)WebRequest.Create(item.URL);
SetCerList(item);
//将证书添加到请求里
request.ClientCertificates.Add(new X509Certificate(item.CerPath));
}
else
{
//初始化对像并设置请求的URL地址
request = (HttpWebRequest)WebRequest.Create(item.URL);
SetCerList(item);
}
}
/// <summary>
/// 设置多个证书
/// </summary>
/// <param name="item"></param>
private void SetCerList(HttpItem item)
{
if (item.ClentCertificates != null && item.ClentCertificates.Count > 0)
{
foreach (X509Certificate c in item.ClentCertificates)
{
request.ClientCertificates.Add(c);
}
}
}
/// <summary>
/// 设置Cookie
/// </summary>
/// <param name="item">Http参数</param>
private void SetCookie(HttpItem item)
{
if (!string.IsNullOrEmpty(item.Cookie)) request.Headers[HttpRequestHeader.Cookie] = item.Cookie;
//设置CookieCollection
if (item.ResultCookieType == ResultCookieType.CookieCollection)
{
request.CookieContainer = new CookieContainer();
if (item.CookieCollection != null && item.CookieCollection.Count > 0)
request.CookieContainer.Add(item.CookieCollection);
}
}
/// <summary>
/// 设置Post数据
/// </summary>
/// <param name="item">Http参数</param>
private void SetPostData(HttpItem item)
{
//验证在得到结果时是否有传入数据
if (!request.Method.Trim().ToLower().Contains("get"))
{
if (item.PostEncoding != null)
{
postencoding = item.PostEncoding;
}
byte[] buffer = null;
//写入Byte类型
if (item.PostDataType == PostDataType.Byte && item.PostdataByte != null && item.PostdataByte.Length > 0)
{
//验证在得到结果时是否有传入数据
buffer = item.PostdataByte;
}//写入文件
else if (item.PostDataType == PostDataType.FilePath && !string.IsNullOrEmpty(item.Postdata))
{
StreamReader r = new StreamReader(item.Postdata, postencoding);
buffer = postencoding.GetBytes(r.ReadToEnd());
r.Close();
} //写入字符串
else if (!string.IsNullOrEmpty(item.Postdata))
{
buffer = postencoding.GetBytes(item.Postdata);
}
if (buffer != null)
{
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
}
}
/// <summary>
/// 设置代理
/// </summary>
/// <param name="item">参数对象</param>
private void SetProxy(HttpItem item)
{
bool isIeProxy = false;
if (!string.IsNullOrEmpty(item.ProxyIp))
{
isIeProxy = item.ProxyIp.ToLower().Contains("ieproxy");
}
if (!string.IsNullOrEmpty(item.ProxyIp) && !isIeProxy)
{
//设置代理服务器
if (item.ProxyIp.Contains(":"))
{
string[] plist = item.ProxyIp.Split(':');
WebProxy myProxy = new WebProxy(plist[0].Trim(), Convert.ToInt32(plist[1].Trim()));
//建议连接
myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd);
//给当前请求对象
request.Proxy = myProxy;
}
else
{
WebProxy myProxy = new WebProxy(item.ProxyIp, false);
//建议连接
myProxy.Credentials = new NetworkCredential(item.ProxyUserName, item.ProxyPwd);
//给当前请求对象
request.Proxy = myProxy;
}
}
else if (isIeProxy)
{
//设置为IE代理
}
else
{
request.Proxy = item.WebProxy;
}
}
#endregion
#region private main
/// <summary>
/// 回调验证证书问题
/// </summary>
/// <param name="sender">流对象</param>
/// <param name="certificate">证书</param>
/// <param name="chain">X509Chain</param>
/// <param name="errors">SslPolicyErrors</param>
/// <returns>bool</returns>
private bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; }
#endregion
}
/// <summary>
/// Http请求参考类
/// </summary>
public class HttpItem
{
string _URL = string.Empty;
/// <summary>
/// 请求URL必须填写
/// </summary>
public string URL
{
get { return _URL; }
set { _URL = value; }
}
string _Method = "GET";
/// <summary>
/// 请求方式默认为GET方式,当为POST方式时必须设置Postdata的值
/// </summary>
public string Method
{
get { return _Method; }
set { _Method = value; }
}
int _Timeout = 100000;
/// <summary>
/// 默认请求超时时间
/// </summary>
public int Timeout
{
get { return _Timeout; }
set { _Timeout = value; }
}
int _ReadWriteTimeout = 30000;
/// <summary>
/// 默认写入Post数据超时间
/// </summary>
public int ReadWriteTimeout
{
get { return _ReadWriteTimeout; }
set { _ReadWriteTimeout = value; }
}
Boolean _KeepAlive = true;
/// <summary>
/// 获取或设置一个值,该值指示是否与 Internet 资源建立持久性连接默认为true。
/// </summary>
public Boolean KeepAlive
{
get { return _KeepAlive; }
set { _KeepAlive = value; }
}
string _Accept = "text/html, application/xhtml+xml, */*";
/// <summary>
/// 请求标头值 默认为text/html, application/xhtml+xml, */*
/// </summary>
public string Accept
{
get { return _Accept; }
set { _Accept = value; }
}
string _ContentType = "text/html";
/// <summary>
/// 请求返回类型默认 text/html
/// </summary>
public string ContentType
{
get { return _ContentType; }
set { _ContentType = value; }
}
string _UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
/// <summary>
/// 客户端访问信息默认Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
/// </summary>
public string UserAgent
{
get { return _UserAgent; }
set { _UserAgent = value; }
}
Encoding _Encoding = null;
/// <summary>
/// 返回数据编码默认为NUll,可以自动识别,一般为utf-8,gbk,gb2312
/// </summary>
public Encoding Encoding
{
get { return _Encoding; }
set { _Encoding = value; }
}
private PostDataType _PostDataType = PostDataType.String;
/// <summary>
/// Post的数据类型
/// </summary>
public PostDataType PostDataType
{
get { return _PostDataType; }
set { _PostDataType = value; }
}
string _Postdata = string.Empty;
/// <summary>
/// Post请求时要发送的字符串Post数据
/// </summary>
public string Postdata
{
get { return _Postdata; }
set { _Postdata = value; }
}
private byte[] _PostdataByte = null;
/// <summary>
/// Post请求时要发送的Byte类型的Post数据
/// </summary>
public byte[] PostdataByte
{
get { return _PostdataByte; }
set { _PostdataByte = value; }
}
private WebProxy _WebProxy;
/// <summary>
/// 设置代理对象不想使用IE默认配置就设置为Null而且不要设置ProxyIp
/// </summary>
public WebProxy WebProxy
{
get { return _WebProxy; }
set { _WebProxy = value; }
}
CookieCollection cookiecollection = null;
/// <summary>
/// Cookie对象集合
/// </summary>
public CookieCollection CookieCollection
{
get { return cookiecollection; }
set { cookiecollection = value; }
}
string _Cookie = string.Empty;
/// <summary>
/// 请求时的Cookie
/// </summary>
public string Cookie
{
get { return _Cookie; }
set { _Cookie = value; }
}
string _Referer = string.Empty;
/// <summary>
/// 来源地址,上次访问地址
/// </summary>
public string Referer
{
get { return _Referer; }
set { _Referer = value; }
}
string _CerPath = string.Empty;
/// <summary>
/// 证书绝对路径
/// </summary>
public string CerPath
{
get { return _CerPath; }
set { _CerPath = value; }
}
private Boolean isToLower = false;
/// <summary>
/// 是否设置为全文小写,默认为不转化
/// </summary>
public Boolean IsToLower
{
get { return isToLower; }
set { isToLower = value; }
}
private Boolean allowautoredirect = false;
/// <summary>
/// 支持跳转页面,查询结果将是跳转后的页面,默认是不跳转
/// </summary>
public Boolean Allowautoredirect
{
get { return allowautoredirect; }
set { allowautoredirect = value; }
}
private Boolean allowwriteStreamBuffering = false;
public Boolean AllowWriteStreamBuffering
{
get { return allowwriteStreamBuffering; }
set { allowwriteStreamBuffering = value; }
}
private int connectionlimit = 1024;
/// <summary>
/// 最大连接数
/// </summary>
public int Connectionlimit
{
get { return connectionlimit; }
set { connectionlimit = value; }
}
private string proxyusername = string.Empty;
/// <summary>
/// 代理Proxy 服务器用户名
/// </summary>
public string ProxyUserName
{
get { return proxyusername; }
set { proxyusername = value; }
}
private string proxypwd = string.Empty;
/// <summary>
/// 代理 服务器密码
/// </summary>
public string ProxyPwd
{
get { return proxypwd; }
set { proxypwd = value; }
}
private string proxyip = string.Empty;
/// <summary>
/// 代理 服务IP ,如果要使用IE代理就设置为ieproxy
/// </summary>
public string ProxyIp
{
get { return proxyip; }
set { proxyip = value; }
}
private ResultType resulttype = ResultType.String;
/// <summary>
/// 设置返回类型String和Byte
/// </summary>
public ResultType ResultType
{
get { return resulttype; }
set { resulttype = value; }
}
private WebHeaderCollection header = new WebHeaderCollection();
/// <summary>
/// header对象
/// </summary>
public WebHeaderCollection Header
{
get { return header; }
set { header = value; }
}
private Version _ProtocolVersion;
/// <summary>
// 获取或设置用于请求的 HTTP 版本。返回结果:用于请求的 HTTP 版本。默认为 System.Net.HttpVersion.Version11。
/// </summary>
public Version ProtocolVersion
{
get { return _ProtocolVersion; }
set { _ProtocolVersion = value; }
}
private Boolean _expect100continue = true;
/// <summary>
/// 获取或设置一个 System.Boolean 值,该值确定是否使用 100-Continue 行为。如果 POST 请求需要 100-Continue 响应,则为 true否则为 false。默认值为 true。
/// </summary>
public Boolean Expect100Continue
{
get { return _expect100continue; }
set { _expect100continue = value; }
}
private X509CertificateCollection _ClentCertificates;
/// <summary>
/// 设置509证书集合
/// </summary>
public X509CertificateCollection ClentCertificates
{
get { return _ClentCertificates; }
set { _ClentCertificates = value; }
}
private Encoding _PostEncoding;
/// <summary>
/// 设置或获取Post参数编码,默认的为Default编码
/// </summary>
public Encoding PostEncoding
{
get { return _PostEncoding; }
set { _PostEncoding = value; }
}
private ResultCookieType _ResultCookieType = ResultCookieType.String;
/// <summary>
/// Cookie返回类型,默认的是只返回字符串类型
/// </summary>
public ResultCookieType ResultCookieType
{
get { return _ResultCookieType; }
set { _ResultCookieType = value; }
}
private ICredentials _ICredentials = CredentialCache.DefaultCredentials;
/// <summary>
/// 获取或设置请求的身份验证信息。
/// </summary>
public ICredentials ICredentials
{
get { return _ICredentials; }
set { _ICredentials = value; }
}
/// <summary>
/// 设置请求将跟随的重定向的最大数目
/// </summary>
private int _MaximumAutomaticRedirections;
public int MaximumAutomaticRedirections
{
get { return _MaximumAutomaticRedirections; }
set { _MaximumAutomaticRedirections = value; }
}
private DateTime? _IfModifiedSince = null;
/// <summary>
/// 获取和设置IfModifiedSince默认为当前日期和时间
/// </summary>
public DateTime? IfModifiedSince
{
get { return _IfModifiedSince; }
set { _IfModifiedSince = value; }
}
}
/// <summary>
/// Http返回参数类
/// </summary>
public class HttpResult
{
private string _CookieSmall;
/// <summary>
/// Http请求返回的Cookie
/// </summary>
public string CookieSmall
{
get { return _CookieSmall; }
set { _CookieSmall = value; }
}
private string _Cookie;
/// <summary>
/// Http请求返回的Cookie
/// </summary>
public string Cookie
{
get { return _Cookie; }
set { _Cookie = value; }
}
private CookieCollection _CookieCollection;
/// <summary>
/// Cookie对象集合
/// </summary>
public CookieCollection CookieCollection
{
get { return _CookieCollection; }
set { _CookieCollection = value; }
}
private string _html = string.Empty;
/// <summary>
/// 返回的String类型数据 只有ResultType.String时才返回数据其它情况为空
/// </summary>
public string Html
{
get { return _html; }
set { _html = value; }
}
private byte[] _ResultByte;
/// <summary>
/// 返回的Byte数组 只有ResultType.Byte时才返回数据其它情况为空
/// </summary>
public byte[] ResultByte
{
get { return _ResultByte; }
set { _ResultByte = value; }
}
private WebHeaderCollection _Header;
/// <summary>
/// header对象
/// </summary>
public WebHeaderCollection Header
{
get { return _Header; }
set { _Header = value; }
}
private string _StatusDescription;
/// <summary>
/// 返回状态说明
/// </summary>
public string StatusDescription
{
get { return _StatusDescription; }
set { _StatusDescription = value; }
}
private HttpStatusCode _StatusCode;
/// <summary>
/// 返回状态码,默认为OK
/// </summary>
public HttpStatusCode StatusCode
{
get { return _StatusCode; }
set { _StatusCode = value; }
}
/// <summary>
/// 最后访问的URl
/// </summary>
public string ResponseUri { get; set; }
/// <summary>
/// 获取重定向的URl
/// </summary>
public string RedirectUrl
{
get
{
try
{
if (Header != null && Header.Count > 0)
{
if (Header["location"] != null)
{
string locationurl = Header["location"].ToString().ToLower();
if (!string.IsNullOrEmpty(locationurl))
{
bool b = locationurl.StartsWith("http://") || locationurl.StartsWith("https://");
if (!b)
{
locationurl = new Uri(new Uri(ResponseUri), locationurl).AbsoluteUri;
}
}
return locationurl;
}
}
}
catch { }
return string.Empty;
}
}
}
/// <summary>
/// 返回类型
/// </summary>
public enum ResultType
{
/// <summary>
/// 表示只返回字符串 只有Html有数据
/// </summary>
String,
/// <summary>
/// 表示返回字符串和字节流 ResultByte和Html都有数据返回
/// </summary>
Byte
}
/// <summary>
/// Post的数据格式默认为string
/// </summary>
public enum PostDataType
{
/// <summary>
/// 字符串类型这时编码Encoding可不设置
/// </summary>
String,
/// <summary>
/// Byte类型需要设置PostdataByte参数的值编码Encoding可设置为空
/// </summary>
Byte,
/// <summary>
/// 传文件Postdata必须设置为文件的绝对路径必须设置Encoding的值
/// </summary>
FilePath
}
/// <summary>
/// Cookie返回类型
/// </summary>
public enum ResultCookieType
{
/// <summary>
/// 只返回字符串类型的Cookie
/// </summary>
String,
/// <summary>
/// CookieCollection格式的Cookie集合同时也返回String类型的cookie
/// </summary>
CookieCollection
}
}

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

43
NetPanel.sln Normal file
View File

@@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.6.33815.320
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetPanel", "NetPanel\NetPanel.csproj", "{DFB41D29-96A8-47AD-AC18-BB8B34254C08}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetPanel.Entity", "NetPanel.Entity\NetPanel.Entity.csproj", "{0C644A79-C37F-47AC-9437-AF6DC43C0E78}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetPanel.Bl", "NetPanel.Bl\NetPanel.Bl.csproj", "{DABD2FF1-C32D-417D-B0C8-81D62B832B9E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetPanel.Help", "NetPanel.Help\NetPanel.Help.csproj", "{FD4E00DA-FFE7-4807-BFC8-64704D965D9B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{DFB41D29-96A8-47AD-AC18-BB8B34254C08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DFB41D29-96A8-47AD-AC18-BB8B34254C08}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DFB41D29-96A8-47AD-AC18-BB8B34254C08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DFB41D29-96A8-47AD-AC18-BB8B34254C08}.Release|Any CPU.Build.0 = Release|Any CPU
{0C644A79-C37F-47AC-9437-AF6DC43C0E78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C644A79-C37F-47AC-9437-AF6DC43C0E78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C644A79-C37F-47AC-9437-AF6DC43C0E78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C644A79-C37F-47AC-9437-AF6DC43C0E78}.Release|Any CPU.Build.0 = Release|Any CPU
{DABD2FF1-C32D-417D-B0C8-81D62B832B9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DABD2FF1-C32D-417D-B0C8-81D62B832B9E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DABD2FF1-C32D-417D-B0C8-81D62B832B9E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DABD2FF1-C32D-417D-B0C8-81D62B832B9E}.Release|Any CPU.Build.0 = Release|Any CPU
{FD4E00DA-FFE7-4807-BFC8-64704D965D9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FD4E00DA-FFE7-4807-BFC8-64704D965D9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{FD4E00DA-FFE7-4807-BFC8-64704D965D9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FD4E00DA-FFE7-4807-BFC8-64704D965D9B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5633E95C-9E27-4638-8F2E-53A11430F072}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,5 @@
{
"UserName": "打工人",
"UserPwd": "123qwe"
}

View File

@@ -0,0 +1,24 @@

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace btApiOrWeb.Controllers
{
public class DataListController : Controller
{
public IActionResult DownloadFileList()
{
return View();
}
}
}

View File

@@ -0,0 +1,47 @@

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using NetPanel.Entity;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace btApiOrWeb.Controllers
{
public class HomeController : Controller
{
public IActionResult Index()
{
ViewBag.data = new List<Menu>()
{
new Menu()
{
Id=1,
MenuName="列表",
Icon="nav-icon fas fa-th",
Child=new List<Menu>(){
new Menu{ MenuName="已有插件" , Url="/DataList/JsonData"},
new Menu{ MenuName="模板插件" , Url="/DataList/JsonDataV7"},
new Menu{ MenuName="404列表" , Url="/DataList/DownloadFileList"},
}
}
};
return View();
}
public IActionResult Privacy()
{
return View();
}
}
}

View File

@@ -0,0 +1,46 @@

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using NetPanel.Entity;
using NetPanel.Entity.Conf;
using Newtonsoft.Json.Linq;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using NetPanel.Help;
using Newtonsoft.Json;
namespace btApiOrWeb.Controllers
{
public class LoginController : MyController
{
public IActionResult Login()
{
return View();
}
[HttpPost]
public IActionResult GetUser()
{
ReturnMsg enReturnMsg = new ReturnMsg();
enReturnMsg.Code = 0;
enReturnMsg.Msg = "失败!";
JObject json = GetJson();
string name = json["UserName"].ToString("");
string pwd = json["UserPwd"].ToString("");
string sPath = AppContext.BaseDirectory;
UserAdmin userAdmin = JsonConvert.DeserializeObject<UserAdmin>(System.IO.File.ReadAllText(sPath + "/Conf/UserAdmin.json"));
if (userAdmin.UserName != name && userAdmin.UserPwd != pwd)
{
enReturnMsg.Msg = "用户名,密码错误!";
return Json(enReturnMsg);
}
enReturnMsg.Code = 1;
enReturnMsg.Msg = "成功!";
return Json(enReturnMsg);
}
}
}

View File

@@ -0,0 +1,169 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text;
namespace NetPanel.Help
{
public class MyController : Controller
{
/// <summary>
/// 是否 get
/// </summary>
public bool IsHttpGet
{
get { return Request.Method == "GET"; }
}
/// <summary>
/// 是否 post
/// </summary>
public bool IsHttpPost
{
get { return Request.Method == "POST"; }
}
/// <summary>
/// 获取get 参数
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetQuery<T>(string key)
{
try
{
if (Request.Query.ContainsKey(key))
{
//一般类型
return (T)Convert.ChangeType(Request.Query[key].FirstOrDefault(), typeof(T));
}
else
{
return default(T);
}
}
catch (Exception ex)
{
return default(T);
}
}
/// <summary>
/// 获取post
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T GetForm<T>(string key)
{
try
{
if (Request.Form.ContainsKey(key))
{
//一般类型
return (T)Convert.ChangeType(HttpContext.Request.Form[key].FirstOrDefault(), typeof(T));
}
else
{
return default(T);
}
}
catch (Exception ex)
{
return default(T);
}
}
/// <summary>
/// 获取Get或Post的数据并转换为Json格式。
/// </summary>
/// <returns></returns>
public string GetJsonStr()
{
if (IsHttpGet)
{
string text = Request.QueryString.Value;
if (text.Length > 0)
{
text = text.Substring(1);
}
Dictionary<string, string> keyValue = GetRequestKeyValue(text);
return JsonConvert.SerializeObject(keyValue);
}
else if (IsHttpPost)
{
if (Request.ContentType.Contains("application/json"))
{
string json = "";
using (var reader = new StreamReader(Request.Body, Encoding.UTF8))
{
// json= reader.ReadToEnd();
json = reader.ReadToEndAsync().Result;
}
return JsonConvert.SerializeObject(GetRequestKeyValue(json)).UrlDecode();
}
else
{
StringBuilder sb = new StringBuilder();
foreach (var item in Request.Form.Keys)
{
sb.Append(item + "=" + Request.Form[item] + "&");
}
Dictionary<string, string> keyValue = GetRequestKeyValue(sb.ToString());
return JsonConvert.SerializeObject(keyValue);
}
}
return "{}";
}
/// <summary>
/// 获取Get或Post的数据并转换为Json格式。
/// </summary>
/// <returns></returns>
public JObject GetJson()
{
string str = GetJsonStr();
return JObject.Parse(str);
}
/// <summary>
/// 获取 get 或 post 的 参数
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
private Dictionary<string, string> GetRequestKeyValue(string val)
{
string[] arr = val.Split("&", StringSplitOptions.RemoveEmptyEntries);
Dictionary<string, string> keyValue = new Dictionary<string, string>();
foreach (var item in arr)
{
string[] arr1 = item.Split("=", StringSplitOptions.RemoveEmptyEntries);
if (arr1.Length == 1)
{
if (!keyValue.ContainsKey(arr1[0]))
{
keyValue.Add(arr1[0], "");
}
}
else if (arr1.Length == 2)
{
if (!keyValue.ContainsKey(arr1[0]))
{
keyValue.Add(arr1[0], arr1[1]);
}
else
{
keyValue[arr1[0]] = arr1[1];
}
}
}
return keyValue;
}
}
}

View File

@@ -0,0 +1,9 @@
namespace NetPanel.Models
{
public class ErrorViewModel
{
public string? RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}

22
NetPanel/NetPanel.csproj Normal file
View File

@@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\NetPanel.Entity\NetPanel.Entity.csproj" />
<ProjectReference Include="..\NetPanel.Help\NetPanel.Help.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Dll\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

30
NetPanel/Program.cs Normal file
View File

@@ -0,0 +1,30 @@
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Login}/{action=Login}/{id?}");
app.Run();

View File

@@ -0,0 +1,28 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:2047",
"sslPort": 0
}
},
"profiles": {
"NetPanel": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5238",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -0,0 +1,138 @@
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
<section class="content-header"></section>
<section class="content">
<div class="container-fluid">
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<h3 class="card-title">404列表</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
<button type="button" class="btn btn-tool" data-card-widget="remove">
<i class="fas fa-times"></i>
</button>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<div class="form-group">
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>路径</th>
<th>状态</th>
<th>时间</th>
<th>操作</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
<!-- /.card-body -->
<div class="card-footer" id="pager">
</div>
</div>
<!-- /.card -->
</div>
<!-- /.container-fluid -->
</section>
<script>
$(function () {
getList();
})
function getList() {
$('#pager').sjAjaxPager({
url: "/DataList/getDownloadFileList",
pageSize: 10,
searchParam: {
action: "getDownloadFileList"
},
success: function (data) {
if (data.ErrorCode == 1) {
var sHtml = '';
for (var i = 0; i < data.Data.length; i++) {
sHtml += "<tr>";
sHtml += "<td>" + data.Data[i]['Path'] + "</td>";
sHtml += "<td>" + data.Data[i]['Status'] + "</td>";
sHtml += "<td>" + dateFtt('yyyy-MM-dd hh:mm:ss', data.Data[i]['SysAddTime']) + "</td>";
if (data.Data[i]['Status'] == 0) {
sHtml += '<td><button type="button" class="btn btn-primary " onclick="updDownloadFile(' + data.Data[i]['Id'] + ')">已检查</button></td>';
} else {
sHtml += '<td></td>';
}
sHtml += "</tr>";
}
$('#tbody').html(sHtml)
}
},
complete: function () {
}
});
}
var isOk = true;
function updDownloadFile(id) {
if (isOk) {
isOk = false;
$.ajax({
url: "/DataList/updDownloadFile",
type: 'post',
dataType: "json",
data: { 'status': 1, 'id': id},
success: function (msg) {
alert(msg.Msg)
if (msg.Code == 1) {
getList();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
isOk = true;
}
});
}
}
//时间 格式化
function dateFtt(fmt, date) { //author: meizz
date = new Date(date);
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
</script>

View File

@@ -0,0 +1,144 @@
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
<section class="content-header"></section>
<section class="content">
<div class="container-fluid">
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<h3 class="card-title">已有插件</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
<button type="button" class="btn btn-tool" data-card-widget="remove">
<i class="fas fa-times"></i>
</button>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<div class="row">
<div class="form-group row col-12 col-md-3 col-xl-3">
<label class="col-form-label col-2 col-md-4 col-xl-3">key</label>
<div class="col-10 col-md-8 col-xl-9">
<input type="text" class="form-control" id="key">
</div>
</div>
<div class="form-group row col-12 col-md-3 col-xl-3">
<button type="button" class="btn btn-primary " onclick="getList()">添加</button>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>key</th>
<th>名称</th>
<th>说明</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
<!-- /.card-body -->
<div class="card-footer" id="pager">
</div>
</div>
<!-- /.card -->
</div>
<!-- /.container-fluid -->
</section>
<script>
$(function () {
getList();
})
function getList() {
$('#pager').sjAjaxPager({
url: "/DataList/getJsonDataList",
pageSize: 10,
searchParam: {
action: "getJsonDataList"
},
success: function (data) {
if (data.ErrorCode == 1) {
var sHtml = '';
for (var i = 0; i < data.Data.length; i++) {
sHtml += "<tr>";
sHtml += "<td>" + data.Data[i]['name'] + "</td>";
sHtml += "<td>" + data.Data[i]['title'] + "</td>";
sHtml += "<td title=\"" + data.Data[i]['ps'] + "\">" + getText(data.Data[i]['ps'], 12) + "</td>";
sHtml += "</tr>";
}
$('#tbody').html(sHtml)
}
},
complete: function () {
}
});
}
var isOk = true;
function addPluginList() {
if (isOk) {
isOk = false;
$.ajax({
url: "/DataList/addPluginList",
type: 'post',
dataType: "json",
data: { key: $('#key').val() },
success: function (msg) {
alert(msg.Msg)
if (msg.Code == 1) {
getList();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
isOk = true;
}
});
}
}
function getText(str, len) {
if (str.length > len) {
return str.substring(0, len);
}
return str;
}
//时间 格式化
function dateFtt(fmt, date) { //author: meizz
date = new Date(date);
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
</script>

View File

@@ -0,0 +1,137 @@
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
<section class="content-header"></section>
<section class="content">
<div class="container-fluid">
<!-- SELECT2 EXAMPLE -->
<div class="card card-default">
<div class="card-header">
<h3 class="card-title">已有插件</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
<button type="button" class="btn btn-tool" data-card-widget="remove">
<i class="fas fa-times"></i>
</button>
</div>
</div>
<!-- /.card-header -->
<div class="card-body">
<div class="row">
<div class="form-group row col-12 col-md-3 col-xl-3">
<button type="button" class="btn btn-primary " onclick="getV7List()">更新列表</button>
</div>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>key</th>
<th>名称</th>
<th>说明</th>
</tr>
</thead>
<tbody id="tbody">
</tbody>
</table>
</div>
<!-- /.card-body -->
<div class="card-footer" id="pager">
</div>
</div>
<!-- /.card -->
</div>
<!-- /.container-fluid -->
</section>
<script>
$(function () {
getList();
})
function getList() {
$('#pager').sjAjaxPager({
url: "/DataList/getJsonDataV7List",
pageSize: 10,
searchParam: {
action: "getJsonDataList"
},
success: function (data) {
if (data.ErrorCode == 1) {
var sHtml = '';
for (var i = 0; i < data.Data.length; i++) {
sHtml += "<tr>";
sHtml += "<td>" + data.Data[i]['name'] + "</td>";
sHtml += "<td>" + data.Data[i]['title'] + "</td>";
sHtml += "<td title=\"" + data.Data[i]['ps']+ "\">" + getText(data.Data[i]['ps'],20) + "</td>";
sHtml += "</tr>";
}
$('#tbody').html(sHtml)
}
},
complete: function () {
}
});
}
var isOk = true;
function getV7List() {
if (isOk) {
isOk = false;
$.ajax({
url: "/DataList/getV7List",
type: 'post',
dataType: "json",
success: function (msg) {
alert(msg.Msg)
if (msg.Code == 1) {
getList();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
isOk = true;
}
});
}
}
function getText(str, len) {
if (str.length > len) {
return str.substring(0, len);
}
return str;
}
//时间 格式化
function dateFtt(fmt, date) { //author: meizz
date = new Date(date);
var o = {
"M+": date.getMonth() + 1, //月份
"d+": date.getDate(), //日
"h+": date.getHours(), //小时
"m+": date.getMinutes(), //分
"s+": date.getSeconds(), //秒
"q+": Math.floor((date.getMonth() + 3) / 3), //季度
"S": date.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
</script>

View File

@@ -0,0 +1,20 @@

@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

View File

@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Dashboard</title>
@Html.Partial("UiCss")
<style>
iframe {
margin: 0 0;
width: 100%;
}
</style>
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">
<!-- Preloader -->
@*<div class="preloader flex-column justify-content-center align-items-center">
<img class="animation__shake" src="dist/img/AdminLTELogo.png" alt="AdminLTELogo" height="60" width="60">
</div>*@
@Html.Partial("Top")
@Html.Partial("Menu")
<center>
<table height="150px" border="0" id='waitPage' style="display:none">
<tr>
<td>
<img width='28' height='28' id='myImage' src="/AdminLTE/dist/img/onload.gif" />
</td>
<td>加载中,请等待...</td>
</tr>
</table>
</center>
<div class="content-wrapper">
<iframe id="iframeBody" name="iframeLeft" src="" frameborder="0" seamless></iframe>
</div>
<!-- /.content-wrapper -->
<!--<footer class="main-footer">
<strong>Copyright &copy; 2014-2021 <a href="https://adminlte.io">AdminLTE.io</a>.</strong>
All rights reserved.
<div class="float-right d-none d-sm-inline-block">
<b>Version</b> 3.2.0
</div>
</footer>-->
</div>
<!-- ./wrapper -->
@Html.Partial("UiJs")
<script type="text/javascript">
var iframe = document.getElementById("iframeBody");
var hash = window.location.hash;
if (hash != '') {
iframe.src = hash.replace('#', '');
}
$('#iframeBody').height(document.documentElement.clientHeight - 70);
$('.menu').click(function () {
var url = $(this).attr("data-Url");
$("#waitPage").show();
iframe.style.display = "none";
iframe.src = url;
if (iframe.attachEvent) {
iframe.attachEvent("onload", function () {
$("#waitPage").hide();
iframe.show();
iframe.style.display = "block";
});
} else {
iframe.onload = function () {
$("#waitPage").hide();
iframe.style.display = "block";
};
}
return false;
})
$(window).resize(function () {
$('#iframeBody').height(document.documentElement.clientHeight - 70);
});
</script>
</body>
</html>

View File

@@ -0,0 +1,6 @@
@{
ViewData["Title"] = "Privacy Policy";
}
<h1>@ViewData["Title"]</h1>
<p>Use this page to detail your site's privacy policy.</p>

View File

@@ -0,0 +1,91 @@

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Log in</title>
<!-- Font Awesome -->
<link rel="stylesheet" href="/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="/AdminLTE/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="/AdminLTE/dist/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
<a href="#">打工人</a>
</div>
<!-- /.login-logo -->
<div class="card">
<div class="card-body login-card-body">
<p class="login-box-msg">登录以开始会话</p>
<form method="post">
<div class="input-group mb-3">
<input type="email" class="form-control" id="UserName" placeholder="用户名">
<div class="input-group-append">
<div class="input-group-text">
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" class="form-control" id="UserPwd" placeholder="密码">
<div class="input-group-append">
<div class="input-group-text">
</div>
</div>
</div>
<div class="row">
<button type="button" class="btn btn-primary btn-block" onclick="login()">登录</button>
</div>
</form>
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
<!-- jQuery -->
<script src="/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="/AdminLTE/dist/js/adminlte.min.js"></script>
<script type="text/javascript">
function login() {
$.ajax({
url: "/Login/GetUser",
type: 'post',
dataType: "json",
contentType: "application/json",
data: { action: 'login', 'UserPwd': $('#UserPwd').val(), 'UserName': $('#UserName').val() },
success: function (msg) {
if (msg.Code == 1) {
window.location.href = "/Home/Index";
} else {
alert(msg.Msg);
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
},
complete: function () {
}
});
}
</script>
</body>
</html>

View File

@@ -0,0 +1,52 @@
@using NetPanel.Entity;
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-primary elevation-4">
<!-- Brand Logo -->
<a href="index3.html" class="brand-link">
<img src="/AdminLTE/dist/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3" style="opacity: .8">
<span class="brand-text font-weight-light">AdminLTE 3</span>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar Menu -->
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false" id="menu_toggle">
<!-- Add icons to the links using the .nav-icon class
with font-awesome or any other icon font library -->
@{ List<Menu> menuList = ViewBag.data;
foreach (Menu menu in menuList)
{
<li class="nav-item">
<a href="#" class="nav-link ">
<i class="@menu.Icon"></i>
<p>
@menu.MenuName
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview submenu" style="display: none;">
@foreach (Menu secondMenu in menu.Child)
{
<li class="nav-item">
<a href="#" data-Url="@secondMenu.Url" data-Txt="@menu.MenuName > @secondMenu.MenuName" class="nav-link menu">
@*<i class="far fa-circle nav-icon"></i>*@
<p>@secondMenu.MenuName</p>
</a>
</li>
}
</ul>
</li>
} }
</ul>
</nav>
<!-- /.sidebar-menu -->
</div>
<!-- /.sidebar -->
</aside>

View File

@@ -0,0 +1,41 @@
 <!-- Navbar -->
<nav class="main-header navbar navbar-expand navbar-white navbar-light">
<!-- Left navbar links -->
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
</li>
@*<li class="nav-item d-none d-sm-inline-block">
<a href="index3.html" class="nav-link">Home</a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="#" class="nav-link">Contact</a>
</li>*@
</ul>
<!-- Right navbar links -->
<ul class="navbar-nav ml-auto">
<!-- Notifications Dropdown Menu -->
<li class="nav-item dropdown">
<a class="nav-link" data-toggle="dropdown" href="#">
超级用户
</a>
<div class="dropdown-menu">
<a href="#" class="dropdown-item">退出登录 </a>
</div>
</li>
<li class="nav-item">
<a class="nav-link" data-widget="fullscreen" href="#" role="button">
<i class="fas fa-expand-arrows-alt"></i>
</a>
</li>
</ul>
</nav>
<!-- /.navbar -->

View File

@@ -0,0 +1,8 @@
 <!-- Font Awesome -->
<link rel="stylesheet" href="/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Tempusdominus Bootstrap 4 -->
<link rel="stylesheet" href="/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="/AdminLTE/dist/css/adminlte.min.css">
<!-- overlayScrollbars -->
<link rel="stylesheet" href="/AdminLTE/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">

View File

@@ -0,0 +1,13 @@

<!-- jQuery -->
<script src="/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- jQuery UI 1.11.4 -->
<script src="/AdminLTE/plugins/jquery-ui/jquery-ui.min.js"></script>
<!-- Bootstrap 4 -->
<script src="/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- overlayScrollbars -->
<script src="/AdminLTE/plugins/overlayScrollbars/js/OverlayScrollbars.min.js"></script>
<!-- AdminLTE App -->
<script src="/AdminLTE/dist/js/adminlte.min.js"></script>

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Dashboard</title>
<!-- Font Awesome -->
<link rel="stylesheet" href="/AdminLTE/plugins/fontawesome-free/css/all.min.css">
<!-- Tempusdominus Bootstrap 4 -->
<link rel="stylesheet" href="/AdminLTE/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="/AdminLTE/dist/css/adminlte.min.css">
@* @RenderSection("css", false)*@
</head>
<body marginwidth="0" marginheight="0" style="background-color: #f4f6f9">
<!-- jQuery -->
<script src="/AdminLTE/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="/AdminLTE/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="/AdminLTE/dist/js/adminlte.min.js"></script>
<script src="/AdminLTE/dist/js/jquery-ajax-pager.js"></script>
<script src="/AdminLTE/dist/js/myMenu.js"></script>
<!-- Content Wrapper. Contains page content -->
@RenderBody()
@*@RenderSection("js", false)*@
</body>
</html>

View File

@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 339 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,204 @@
/*
* Version 1.0
* 2015-12-20 by sullivan
* AJAX Pager
*/
;
(function (window, $) {
var ms = {
init: function (obj, args) {
return (function () {
$.ajax({
type: args.type,
//async: true,
data: $.extend(args.searchParam || {}, {
pageIndex: args.pageIndex,
pageSize: args.pageSize || 10
}),
dataType: args.dataType,
url: args.url,
beforeSend: function () {
if (args.beforeSend != null) {
args.beforeSend();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
args.error(XMLHttpRequest, textStatus, errorThrown);
},
success: function (data) {
args.success(data);
//后台返回数据格式:{"total":0,"items":[]}
args.pageCount = Math.ceil(data.total / args.pageSize);
if (args.pageCount == 0) {
args.pageCount = 1;
}
ms.fillHtml(obj, args);
ms.bindEvent(obj, args);
},
complete: function () {
args.complete();
}
});
})();
},
doPage: function (obj, args, index, pageSize, searchParam) {
args.pageIndex = index;
args.pageSize = pageSize;
args.searchParam = searchParam;
$.ajax({
type: args.type,
// async: true,
data: $.extend(args.searchParam || {}, {
pageIndex: args.pageIndex,
pageSize: args.pageSize || 10
}),
dataType: args.dataType,
url: args.url,
beforeSend: function () {
if (args.beforeSend != null) {
args.beforeSend();
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
args.error(XMLHttpRequest, textStatus, errorThrown);
},
success: function (data) {
args.pageCount = Math.ceil(data.total / args.pageSize);
if (args.pageCount == 0) {
args.pageCount = 1;
}
args.success(data);
ms.fillHtml(obj, { "pageIndex": index, "pageCount": args.pageCount });
},
complete: function () {
args.complete();
}
});
},
//填充html
fillHtml: function (obj, args) {
return (function () {
obj.empty();
var sHtml = "";
//obj.append('<li>');
sHtml += '<ul class="pagination pagination-sm m-0 float-right">'
if (args.pageCount > 1) {
if (args.pageIndex != 1) {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber" data_pageIndex="' + (args.pageIndex - 1) + '" >«</a></li>'
} else {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber" data_pageIndex="" >«</a></li>'
}
//中间页码
if (args.pageIndex != 1 && args.pageIndex >= 4 && args.pageCount != 4) {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber">' + 1 + '</a></li>';
}
if (args.pageIndex - 2 > 2 && args.pageIndex <= args.pageCount && args.pageCount > 5) {
sHtml += '<li class="page-item"><span class="page-link">...</span>';
}
var start = args.pageIndex - 2, end = args.pageIndex + 2;
if ((start > 1 && args.pageIndex < 4) || args.pageIndex == 1) {
end++;
}
if (args.pageIndex > args.pageCount - 4 && args.pageIndex >= args.pageCount) {
start--;
}
for (; start <= end; start++) {
if (start <= args.pageCount && start >= 1) {
if (start != args.pageIndex) {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber">' + start + '</a></li>';
} else {
sHtml += '<li class="page-item active"><a class="page-link">' + start + '</a></li>';
}
}
}
if (args.pageIndex + 2 < args.pageCount - 1 && args.pageIndex >= 1 && args.pageCount > 5) {
sHtml += '<li class="page-item"><span class="page-link">...</span></li>';
}
if (args.pageIndex != args.pageCount && args.pageIndex < args.pageCount - 2 && args.pageCount != 4) {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber">' + args.pageCount + '</a></li>'
}
if (args.pageCount >= (args.pageIndex + 1)) {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber" data_pageIndex="' + (args.pageIndex + 1) + '">»</a></li>'
} else {
sHtml += '<li class="page-item"><a href="javascript:;" class="page-link tcdNumber" data_pageIndex="">»</a></li>'
}
} else {
sHtml += '<li class="page-item"><span class="page-link">«</span></li>';
sHtml += '<li class="page-item active"><span class="page-link">1</span></li>';
sHtml += '<li class="page-item"><span class="page-link">»</span></li>';
}
sHtml += '</ul>'
//sHtml += '<span>共' + args.pageCount + '页</span>';
obj.append(sHtml);
})();
},
//绑定事件
bindEvent: function (obj, args) {
return (function () {
obj.unbind("click");
obj.on("click", "a.tcdNumber", function () {
var pageIndex = parseInt($(this).text());
if (isNaN(pageIndex)) {
pageIndex = parseInt($(this).attr("data_pageIndex"));
}
if (!isNaN(pageIndex)) {
//ms.fillHtml(obj, { "pageIndex": pageIndex, "pageCount": args.pageCount });
if (typeof (args.backFn) == "function") {
args.backFn(pageIndex);
} else {
ms.doPage(obj, args, pageIndex, args.pageSize, args.searchParam);
//alert(pageIndex);
}
}
});
})();
}
}
//保存数据
var mydata = {}
$.fn.sjAjaxPager = function (type, options) {
var gettype = Object.prototype.toString
if (gettype.call(type) == "[object Object]") {
var args = {
url: "", //url
type: "POST", //提交分数
dataType: "JSON", //格式
searchParam: {}, //参数
beforeSend: null,
success: null,
complete: null,
error: function () {
alert("抱歉,请求出错,请重新请求!");
},
pageSize: 10, //每页显示
pageIndex: 1, //当前页码
pageCount: 0, //总共多少页
backFn: null, //自定义点击时间
};
var data = $.extend({}, args, type);
mydata[$(this).attr('id')] = data;
ms.init(this, data);
} else if (type.toLowerCase() == 'load') { //通过传递一些参数执行一次查询,通过调用这个方法从服务器加载新数据。
var data = mydata[$(this).attr('id')];
data.searchParam = options;
ms.doPage(this, data, 1, data.pageSize, data.searchParam);
} else if (type.toLowerCase() == 'reload') { //刷新当前页
var data = mydata[$(this).attr('id')];
ms.doPage(this, data, data.pageIndex, data.pageSize, data.searchParam);
}
}
})(window, jQuery);

View File

@@ -0,0 +1,39 @@
$(function () {
//标签隐藏
//当前窗体 url
var url = window.location.pathname;
// ?后参数
var search = window.location.search;
//给父窗体 url 赋值
window.parent.location.hash = url + search;
//清除菜单格式
$(".submenu", parent.document).hide();
$(".active", parent.document).removeClass("active");
$(".menu-is-opening", parent.document).removeClass("menu-is-opening");
$(".menu-open", parent.document).removeClass("menu-open");
//父窗体iframe
var iframeBody = $("#iframeBody", parent.document);
//当前窗体 url
var url = window.location.pathname;
//父窗体 菜单列表
var menutoggleli = $("#menu_toggle li a", parent.document);
for (var i = 0; i < menutoggleli.length; i++) {
var a = $(menutoggleli[i]);
var menuUrl = a.attr("data-Url"); //菜单 的url
var menuTxt = a.attr("data-Txt"); //菜单 名称
if (menuUrl == url) {
//选中的 菜单
// $("#txt").html(menuTxt);
$(menutoggleli[i]).parent().parent().show();
$(menutoggleli[i]).parent().parent().prev().addClass('active');
$(menutoggleli[i]).addClass('active');
$(menutoggleli[i]).parent().parent().parent().addClass('menu-is-opening').addClass('menu-open');
break;
}
}
})

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Brands';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-brands-400.eot");
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
.fab {
font-family: 'Font Awesome 5 Brands';
font-weight: 400; }

View File

@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands";font-weight:400}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,15 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-regular-400.eot");
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
.far {
font-family: 'Font Awesome 5 Free';
font-weight: 400; }

View File

@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400}

View File

@@ -0,0 +1,16 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face {
font-family: 'Font Awesome 5 Free';
font-style: normal;
font-weight: 900;
font-display: block;
src: url("../webfonts/fa-solid-900.eot");
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
.fa,
.fas {
font-family: 'Font Awesome 5 Free';
font-weight: 900; }

View File

@@ -0,0 +1,5 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}

View File

@@ -0,0 +1,371 @@
/*!
* Font Awesome Free 5.15.4 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
svg:not(:root).svg-inline--fa {
overflow: visible; }
.svg-inline--fa {
display: inline-block;
font-size: inherit;
height: 1em;
overflow: visible;
vertical-align: -.125em; }
.svg-inline--fa.fa-lg {
vertical-align: -.225em; }
.svg-inline--fa.fa-w-1 {
width: 0.0625em; }
.svg-inline--fa.fa-w-2 {
width: 0.125em; }
.svg-inline--fa.fa-w-3 {
width: 0.1875em; }
.svg-inline--fa.fa-w-4 {
width: 0.25em; }
.svg-inline--fa.fa-w-5 {
width: 0.3125em; }
.svg-inline--fa.fa-w-6 {
width: 0.375em; }
.svg-inline--fa.fa-w-7 {
width: 0.4375em; }
.svg-inline--fa.fa-w-8 {
width: 0.5em; }
.svg-inline--fa.fa-w-9 {
width: 0.5625em; }
.svg-inline--fa.fa-w-10 {
width: 0.625em; }
.svg-inline--fa.fa-w-11 {
width: 0.6875em; }
.svg-inline--fa.fa-w-12 {
width: 0.75em; }
.svg-inline--fa.fa-w-13 {
width: 0.8125em; }
.svg-inline--fa.fa-w-14 {
width: 0.875em; }
.svg-inline--fa.fa-w-15 {
width: 0.9375em; }
.svg-inline--fa.fa-w-16 {
width: 1em; }
.svg-inline--fa.fa-w-17 {
width: 1.0625em; }
.svg-inline--fa.fa-w-18 {
width: 1.125em; }
.svg-inline--fa.fa-w-19 {
width: 1.1875em; }
.svg-inline--fa.fa-w-20 {
width: 1.25em; }
.svg-inline--fa.fa-pull-left {
margin-right: .3em;
width: auto; }
.svg-inline--fa.fa-pull-right {
margin-left: .3em;
width: auto; }
.svg-inline--fa.fa-border {
height: 1.5em; }
.svg-inline--fa.fa-li {
width: 2em; }
.svg-inline--fa.fa-fw {
width: 1.25em; }
.fa-layers svg.svg-inline--fa {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.fa-layers {
display: inline-block;
height: 1em;
position: relative;
text-align: center;
vertical-align: -.125em;
width: 1em; }
.fa-layers svg.svg-inline--fa {
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-text, .fa-layers-counter {
display: inline-block;
position: absolute;
text-align: center; }
.fa-layers-text {
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-counter {
background-color: #ff253a;
border-radius: 1em;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: #fff;
height: 1.5em;
line-height: 1;
max-width: 5em;
min-width: 1.5em;
overflow: hidden;
padding: .25em;
right: 0;
text-overflow: ellipsis;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-bottom-right {
bottom: 0;
right: 0;
top: auto;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: bottom right;
transform-origin: bottom right; }
.fa-layers-bottom-left {
bottom: 0;
left: 0;
right: auto;
top: auto;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: bottom left;
transform-origin: bottom left; }
.fa-layers-top-right {
right: 0;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-top-left {
left: 0;
right: auto;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top left;
transform-origin: top left; }
.fa-lg {
font-size: 1.33333em;
line-height: 0.75em;
vertical-align: -.0667em; }
.fa-xs {
font-size: .75em; }
.fa-sm {
font-size: .875em; }
.fa-1x {
font-size: 1em; }
.fa-2x {
font-size: 2em; }
.fa-3x {
font-size: 3em; }
.fa-4x {
font-size: 4em; }
.fa-5x {
font-size: 5em; }
.fa-6x {
font-size: 6em; }
.fa-7x {
font-size: 7em; }
.fa-8x {
font-size: 8em; }
.fa-9x {
font-size: 9em; }
.fa-10x {
font-size: 10em; }
.fa-fw {
text-align: center;
width: 1.25em; }
.fa-ul {
list-style-type: none;
margin-left: 2.5em;
padding-left: 0; }
.fa-ul > li {
position: relative; }
.fa-li {
left: -2em;
position: absolute;
text-align: center;
width: 2em;
line-height: inherit; }
.fa-border {
border: solid 0.08em #eee;
border-radius: .1em;
padding: .2em .25em .15em; }
.fa-pull-left {
float: left; }
.fa-pull-right {
float: right; }
.fa.fa-pull-left,
.fas.fa-pull-left,
.far.fa-pull-left,
.fal.fa-pull-left,
.fab.fa-pull-left {
margin-right: .3em; }
.fa.fa-pull-right,
.fas.fa-pull-right,
.far.fa-pull-right,
.fal.fa-pull-right,
.fab.fa-pull-right {
margin-left: .3em; }
.fa-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear; }
.fa-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8); }
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
.fa-rotate-90 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
-webkit-transform: rotate(90deg);
transform: rotate(90deg); }
.fa-rotate-180 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
-webkit-transform: rotate(180deg);
transform: rotate(180deg); }
.fa-rotate-270 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
-webkit-transform: rotate(270deg);
transform: rotate(270deg); }
.fa-flip-horizontal {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
-webkit-transform: scale(-1, 1);
transform: scale(-1, 1); }
.fa-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(1, -1);
transform: scale(1, -1); }
.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(-1, -1);
transform: scale(-1, -1); }
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical,
:root .fa-flip-both {
-webkit-filter: none;
filter: none; }
.fa-stack {
display: inline-block;
height: 2em;
position: relative;
width: 2.5em; }
.fa-stack-1x,
.fa-stack-2x {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.svg-inline--fa.fa-stack-1x {
height: 1em;
width: 1.25em; }
.svg-inline--fa.fa-stack-2x {
height: 2em;
width: 2.5em; }
.fa-inverse {
color: #fff; }
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px; }
.sr-only-focusable:active, .sr-only-focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto; }
.svg-inline--fa .fa-primary {
fill: var(--fa-primary-color, currentColor);
opacity: 1;
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa .fa-secondary {
fill: var(--fa-secondary-color, currentColor);
opacity: 0.4;
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-primary {
opacity: 0.4;
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-secondary {
opacity: 1;
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa mask .fa-primary,
.svg-inline--fa mask .fa-secondary {
fill: black; }
.fad.fa-inverse {
color: #fff; }

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 730 KiB

Some files were not shown because too many files have changed in this diff Show More