添加文本审核
This commit is contained in:
parent
ac2741eb37
commit
b656a0b261
|
|
@ -46,6 +46,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HuanMeng.MiaoYu.WebApi", "s
|
||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HuanMeng.Utility", "src\0-core\HuanMeng.Utility\HuanMeng.Utility.csproj", "{48E1532F-8B50-477C-BB78-8AEA89A167CE}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HuanMeng.Utility", "src\0-core\HuanMeng.Utility\HuanMeng.Utility.csproj", "{48E1532F-8B50-477C-BB78-8AEA89A167CE}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextCensorFilterTest", "src\9-test\TextCensorFilterTest\TextCensorFilterTest.csproj", "{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
|
@ -96,6 +98,10 @@ Global
|
||||||
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Release|Any CPU.Build.0 = Release|Any CPU
|
{48E1532F-8B50-477C-BB78-8AEA89A167CE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|
@ -119,6 +125,7 @@ Global
|
||||||
{6E79742F-1E56-4B7D-94E8-B509D43561FA} = {DD14191F-22CE-48D8-A944-B8A41C97ACD4}
|
{6E79742F-1E56-4B7D-94E8-B509D43561FA} = {DD14191F-22CE-48D8-A944-B8A41C97ACD4}
|
||||||
{729950F2-71EE-42C0-8B46-295740DE20BA} = {0C0B6EB5-E41D-46D9-9F60-90D320A2EEF3}
|
{729950F2-71EE-42C0-8B46-295740DE20BA} = {0C0B6EB5-E41D-46D9-9F60-90D320A2EEF3}
|
||||||
{48E1532F-8B50-477C-BB78-8AEA89A167CE} = {DD14191F-22CE-48D8-A944-B8A41C97ACD4}
|
{48E1532F-8B50-477C-BB78-8AEA89A167CE} = {DD14191F-22CE-48D8-A944-B8A41C97ACD4}
|
||||||
|
{CF7FEDBA-FC1A-4D6D-92F1-6882B5143E0A} = {8D39E84B-2810-41D7-AFE6-0A58E09E34C3}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {4A1DC406-AFAA-4884-859C-51B9B26E37FC}
|
SolutionGuid = {4A1DC406-AFAA-4884-859C-51B9B26E37FC}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,157 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HuanMeng.DotNetCore.TextCensor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 验证字符串是否违规
|
||||||
|
/// </summary>
|
||||||
|
//[Obsolete]
|
||||||
|
//public static class CheckTextVerification
|
||||||
|
//{
|
||||||
|
// static HashSet<string> ShieldStr = new HashSet<string>();
|
||||||
|
|
||||||
|
// static List<string> ShieldListStr = new List<string>();
|
||||||
|
// static string[] ShieldString = new string[0];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// static CheckTextVerification()
|
||||||
|
// {
|
||||||
|
// var ckPath = Path.GetFullPath("I:\\test\\PrayForBlessings\\PrayForBlessings\\ciku/");
|
||||||
|
// var filePath = Directory.EnumerateFiles(ckPath);
|
||||||
|
// foreach (var item in filePath)
|
||||||
|
// {
|
||||||
|
// CheckTextVerification.AddShieldString(item);
|
||||||
|
// }
|
||||||
|
// //
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// ///
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="path"></param>
|
||||||
|
// /// <exception cref="Exception"></exception>
|
||||||
|
// public static void AddShieldString(string path)
|
||||||
|
// {
|
||||||
|
|
||||||
|
// if (!File.Exists(path))
|
||||||
|
// {
|
||||||
|
// throw new Exception("文件不存在");
|
||||||
|
// }
|
||||||
|
// HashSet<string> strings = new HashSet<string>();
|
||||||
|
|
||||||
|
// using (StreamReader reader = new StreamReader(path, UnicodeEncoding.UTF8))
|
||||||
|
// {
|
||||||
|
|
||||||
|
// while (reader.Peek() > 0)
|
||||||
|
// {
|
||||||
|
// var tempStr = (reader.ReadLine() ?? "");
|
||||||
|
// //string result = Regex.Replace(tempStr, pattern, "");
|
||||||
|
// if (!string.IsNullOrEmpty(tempStr))
|
||||||
|
// {
|
||||||
|
// var tempStringToLower = tempStr.ToLower().Split(new char[] { '、', ',' });
|
||||||
|
// string[] filteredArrayToLower = tempStringToLower.Where(s => !string.IsNullOrEmpty(s)).ToArray();
|
||||||
|
// strings.UnionWith(filteredArrayToLower);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// ShieldStr.UnionWith(strings);
|
||||||
|
// ShieldListStr.AddRange(ShieldStr);
|
||||||
|
// ShieldString = ShieldStr.ToArray();
|
||||||
|
// Console.WriteLine(string.Format($"[{Path.GetFileName(path)}]加载完毕,总共加载屏蔽字行数:{ShieldStr.Count}"));
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// /// <summary>
|
||||||
|
// ///
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="sourceTxt"></param>
|
||||||
|
// /// <returns></returns>
|
||||||
|
// public static bool VerifyTxt(string sourceTxt)
|
||||||
|
// {
|
||||||
|
// if (!string.IsNullOrEmpty(sourceTxt))
|
||||||
|
// {
|
||||||
|
// //先去掉空格,特殊字符
|
||||||
|
// string cleanedText = CleanedTextString(sourceTxt);
|
||||||
|
// foreach (var item in ShieldStr)
|
||||||
|
// {
|
||||||
|
// if (cleanedText.Contains(item))
|
||||||
|
// {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// /// <summary>
|
||||||
|
// ///
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="sourceTxt"></param>
|
||||||
|
// /// <returns></returns>
|
||||||
|
// public static bool VerifyTxtList(string sourceTxt)
|
||||||
|
// {
|
||||||
|
// if (!string.IsNullOrEmpty(sourceTxt))
|
||||||
|
// {
|
||||||
|
// //先去掉空格,特殊字符
|
||||||
|
// string cleanedText = CleanedTextString(sourceTxt);
|
||||||
|
// foreach (var item in ShieldListStr)
|
||||||
|
// {
|
||||||
|
// if (cleanedText.Contains(item))
|
||||||
|
// {
|
||||||
|
// return false;//2.56
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// private static string replaceString = " ,.。,@*12345690_-";
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// ///
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="sourceTxt"></param>
|
||||||
|
// /// <returns></returns>
|
||||||
|
// private static string CleanedTextString(string sourceTxt)
|
||||||
|
// {
|
||||||
|
// string cleanedText = sourceTxt.ToLower()
|
||||||
|
// .Replace(" ", "")
|
||||||
|
// .Replace(",", "")
|
||||||
|
// .Replace(".", "")
|
||||||
|
// .Replace("。", "")
|
||||||
|
// .Replace(",", "")
|
||||||
|
// .Replace("@", "")
|
||||||
|
// .Replace("-", "")
|
||||||
|
// .Replace("*", "")
|
||||||
|
// .Replace("1", "")
|
||||||
|
// .Replace("2", "")
|
||||||
|
// .Replace("3", "")
|
||||||
|
// .Replace("4", "")
|
||||||
|
// .Replace("5", "")
|
||||||
|
// .Replace("6", "")
|
||||||
|
// .Replace("9", "")
|
||||||
|
// .Replace("0", "")
|
||||||
|
// .Replace("_", "");
|
||||||
|
// return cleanedText;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public static bool VerifyTxtString(string sourceTxt)
|
||||||
|
// {
|
||||||
|
// if (!string.IsNullOrEmpty(sourceTxt))
|
||||||
|
// {
|
||||||
|
// //先去掉空格,特殊字符
|
||||||
|
// string cleanedText = CleanedTextString(sourceTxt);
|
||||||
|
|
||||||
|
// foreach (var item in ShieldString)
|
||||||
|
// {
|
||||||
|
// if (cleanedText.Contains(item))
|
||||||
|
// {
|
||||||
|
// return false;//2.56
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
||||||
28
src/0-core/HuanMeng.DotNetCore/TextCensor/ITextCensor.cs
Normal file
28
src/0-core/HuanMeng.DotNetCore/TextCensor/ITextCensor.cs
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HuanMeng.DotNetCore.TextCensor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 文本审核接口
|
||||||
|
/// </summary>
|
||||||
|
public interface ITextCensor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 文本审核
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
bool TextCensor(string text);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 文本审核
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> TextCensorAsync(string text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,140 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HuanMeng.DotNetCore.TextCensor.SensitiveWord
|
||||||
|
{
|
||||||
|
public class SensitiveWordFilter : ITextCensor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 定义Trie树节点
|
||||||
|
/// </summary>
|
||||||
|
private class TrieNode
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 标记是否是一个敏感词的结尾
|
||||||
|
/// </summary>
|
||||||
|
public bool IsEnd { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 存储子节点
|
||||||
|
/// </summary>
|
||||||
|
public Dictionary<char, TrieNode> Children { get; set; }
|
||||||
|
|
||||||
|
public TrieNode()
|
||||||
|
{
|
||||||
|
IsEnd = false;
|
||||||
|
Children = new Dictionary<char, TrieNode>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根节点
|
||||||
|
/// </summary>
|
||||||
|
private TrieNode Root { get; set; }
|
||||||
|
public SensitiveWordFilter()
|
||||||
|
{
|
||||||
|
Root = new TrieNode();
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 添加敏感词到Trie树中
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="word"></param>
|
||||||
|
public void AddSensitiveWord(string word)
|
||||||
|
{
|
||||||
|
TrieNode currentNode = Root;
|
||||||
|
foreach (char c in word.ToLower())
|
||||||
|
{
|
||||||
|
// 如果当前字符不存在于子节点中,则添加
|
||||||
|
if (!currentNode.Children.ContainsKey(c))
|
||||||
|
{
|
||||||
|
currentNode.Children[c] = new TrieNode();
|
||||||
|
}
|
||||||
|
currentNode = currentNode.Children[c];
|
||||||
|
}
|
||||||
|
currentNode.IsEnd = true; // 标记当前节点为敏感词结尾
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 定义要移除的字符集合,包括空格
|
||||||
|
/// </summary>
|
||||||
|
private static string replaceString = @"[ \.,。,@\-*12345690_]";
|
||||||
|
/// <summary>
|
||||||
|
/// 清理文字
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sourceTxt"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public string CleanText(string sourceTxt)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(sourceTxt))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用正则表达式替换所有匹配的字符
|
||||||
|
//string cleanedText = Regex.Replace(sourceTxt.ToLower(), replaceString, string.Empty);
|
||||||
|
string cleanedText = sourceTxt
|
||||||
|
.Replace(',', ' ')
|
||||||
|
.Replace('.', ' ')
|
||||||
|
.Replace('。', ' ')
|
||||||
|
.Replace(',', ' ')
|
||||||
|
.Replace('@', ' ')
|
||||||
|
.Replace('-', ' ')
|
||||||
|
.Replace('*', ' ')
|
||||||
|
.Replace("1", "")
|
||||||
|
.Replace("2", "")
|
||||||
|
.Replace("3", "")
|
||||||
|
.Replace("4", "")
|
||||||
|
.Replace("5", "")
|
||||||
|
.Replace("6", "")
|
||||||
|
.Replace("9", "")
|
||||||
|
.Replace("0", "")
|
||||||
|
.Replace("_", "")
|
||||||
|
.Replace(" ", string.Empty).ToLower();
|
||||||
|
return cleanedText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断文本中是否包含敏感词
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public bool ContainsSensitiveWord(string text)
|
||||||
|
{
|
||||||
|
//过滤字符串
|
||||||
|
text = CleanText(text);
|
||||||
|
for (int i = 0; i < text.Length; i++)
|
||||||
|
{
|
||||||
|
TrieNode currentNode = Root;
|
||||||
|
int j = i;
|
||||||
|
// 从当前位置开始匹配敏感词
|
||||||
|
while (j < text.Length && currentNode.Children.ContainsKey(text[j]))
|
||||||
|
{
|
||||||
|
currentNode = currentNode.Children[text[j]];
|
||||||
|
// 如果当前节点是敏感词结尾,返回true
|
||||||
|
if (currentNode.IsEnd)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool TextCensor(string text)
|
||||||
|
{
|
||||||
|
return ContainsSensitiveWord(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<bool> TextCensorAsync(string text)
|
||||||
|
{
|
||||||
|
return Task.Run(() =>
|
||||||
|
{
|
||||||
|
return ContainsSensitiveWord(text);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
using HuanMeng.DotNetCore.TextCensor.SensitiveWord;
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace HuanMeng.DotNetCore.TextCensor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public static class TextCensorExtend
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static SensitiveWordFilter GetSensitiveWordFilter(string _dirPath)
|
||||||
|
{
|
||||||
|
SensitiveWordFilter sensitiveWordFilter = new SensitiveWordFilter();
|
||||||
|
var ckPath = Path.GetFullPath(_dirPath);
|
||||||
|
var filePath = Directory.EnumerateFiles(ckPath);
|
||||||
|
foreach (var item in filePath)
|
||||||
|
{
|
||||||
|
AddShieldString(item, sensitiveWordFilter);
|
||||||
|
}
|
||||||
|
return sensitiveWordFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <exception cref="Exception"></exception>
|
||||||
|
public static void AddShieldString(string path, SensitiveWordFilter sensitiveWordFilter)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!File.Exists(path))
|
||||||
|
{
|
||||||
|
throw new Exception("文件不存在");
|
||||||
|
}
|
||||||
|
HashSet<string> strings = new HashSet<string>();
|
||||||
|
|
||||||
|
using (StreamReader reader = new StreamReader(path, UnicodeEncoding.UTF8))
|
||||||
|
{
|
||||||
|
|
||||||
|
while (reader.Peek() > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
var tempStr = (reader.ReadLine() ?? "");
|
||||||
|
//string result = Regex.Replace(tempStr, pattern, "");
|
||||||
|
if (!string.IsNullOrEmpty(tempStr))
|
||||||
|
{
|
||||||
|
sensitiveWordFilter.AddSensitiveWord(tempStr);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,12 +15,18 @@ using XLib.DotNetCore.CacheHelper;
|
||||||
namespace HuanMeng.MiaoYu.Code.Cache
|
namespace HuanMeng.MiaoYu.Code.Cache
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// 缓存扩展-
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class CommonDataEntityCache<T> : ICacheClearData, ICacheReloadData where T : class
|
public abstract class CommonDataEntityCache<T> : ICacheClearData, ICacheReloadData where T : class
|
||||||
{
|
{
|
||||||
//(object lockObj, int cacheTime = 36000)
|
//(object lockObj, int cacheTime = 36000)
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
protected object lockObj;
|
protected object lockObj;
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
protected int cacheTime;
|
protected int cacheTime;
|
||||||
|
|
||||||
protected CommonDataEntityCache(object lockObj, int cacheTime = 36000)
|
protected CommonDataEntityCache(object lockObj, int cacheTime = 36000)
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ namespace HuanMeng.MiaoYu.Code.Cache
|
||||||
if (CharacterCache == null)
|
if (CharacterCache == null)
|
||||||
{
|
{
|
||||||
CharacterCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<CharacterCache>(cacheBase);
|
CharacterCache = MiaoYuCacheExtend.GetMiaoYuDataEntityCache<CharacterCache>(cacheBase);
|
||||||
//CharacterCache = new CharacterEntityCache(cacheBase);
|
//CharacterCache = new CharacterEntityCache(miaoYuBase);
|
||||||
}
|
}
|
||||||
return CharacterCache.DataList ?? new List<CharacterCache>();
|
return CharacterCache.DataList ?? new List<CharacterCache>();
|
||||||
}
|
}
|
||||||
|
|
@ -261,13 +261,13 @@ namespace HuanMeng.MiaoYu.Code.Cache
|
||||||
/// 清除全部缓存
|
/// 清除全部缓存
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dao"></param>
|
/// <param name="dao"></param>
|
||||||
public static void ClareMiaoYuDataEntityCache(CacheBase cacheBase)
|
public static void ClareMiaoYuDataEntityCache(MiaoYuBase miaoYuBase)
|
||||||
{
|
{
|
||||||
foreach (var item in CacheLockList)
|
foreach (var item in CacheLockList)
|
||||||
{
|
{
|
||||||
var t = item.Key;
|
var t = item.Key;
|
||||||
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
|
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
|
||||||
var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000);
|
var shujuduixiang = Activator.CreateInstance(cacheType, miaoYuBase, item.Value, 36000);
|
||||||
var x = shujuduixiang as ICacheClearData;
|
var x = shujuduixiang as ICacheClearData;
|
||||||
if (x != null)
|
if (x != null)
|
||||||
{
|
{
|
||||||
|
|
@ -275,21 +275,27 @@ namespace HuanMeng.MiaoYu.Code.Cache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var obj = SpecialCacheLockList[typeof(CharacterCache)];
|
var obj = SpecialCacheLockList[typeof(CharacterCache)];
|
||||||
CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj);
|
CharacterEntityCache characterEntityCache = new CharacterEntityCache(miaoYuBase, obj);
|
||||||
characterEntityCache.ClearData();
|
characterEntityCache.ClearData();
|
||||||
|
var dictionaryInfo= miaoYuBase.DictionaryInfo;
|
||||||
|
var _dictionaryInfo = dictionaryInfo as ICacheClearData;
|
||||||
|
if (_dictionaryInfo != null)
|
||||||
|
{
|
||||||
|
_dictionaryInfo.ClearData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 刷新部缓存
|
/// 刷新部缓存
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dao"></param>
|
/// <param name="dao"></param>
|
||||||
public static void ReloadMiaoYuDataEntityCache(CacheBase cacheBase)
|
public static void ReloadMiaoYuDataEntityCache(MiaoYuBase miaoYuBase)
|
||||||
{
|
{
|
||||||
foreach (var item in CacheLockList)
|
foreach (var item in CacheLockList)
|
||||||
{
|
{
|
||||||
var t = item.Key;
|
var t = item.Key;
|
||||||
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
|
Type cacheType = typeof(MiaoYuDataEntityCache<>).MakeGenericType(t);
|
||||||
var shujuduixiang = Activator.CreateInstance(cacheType, cacheBase, item.Value, 36000);
|
var shujuduixiang = Activator.CreateInstance(cacheType, miaoYuBase, item.Value, 36000);
|
||||||
var x = shujuduixiang as ICacheReloadData;
|
var x = shujuduixiang as ICacheReloadData;
|
||||||
if (x != null)
|
if (x != null)
|
||||||
{
|
{
|
||||||
|
|
@ -297,8 +303,14 @@ namespace HuanMeng.MiaoYu.Code.Cache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var obj = SpecialCacheLockList[typeof(CharacterCache)];
|
var obj = SpecialCacheLockList[typeof(CharacterCache)];
|
||||||
CharacterEntityCache characterEntityCache = new CharacterEntityCache(cacheBase, obj);
|
CharacterEntityCache characterEntityCache = new CharacterEntityCache(miaoYuBase, obj);
|
||||||
characterEntityCache.ReloadData();
|
characterEntityCache.ReloadData();
|
||||||
|
var dictionaryInfo = miaoYuBase.DictionaryInfo;
|
||||||
|
var _dictionaryInfo = dictionaryInfo as ICacheReloadData;
|
||||||
|
if (_dictionaryInfo != null)
|
||||||
|
{
|
||||||
|
_dictionaryInfo.ReloadData();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using HuanMeng.DotNetCore.MultiTenant;
|
using HuanMeng.DotNetCore.MultiTenant;
|
||||||
using HuanMeng.DotNetCore.MultiTenant.Contract;
|
using HuanMeng.DotNetCore.MultiTenant.Contract;
|
||||||
|
using HuanMeng.MiaoYu.Code.Cache.Contract;
|
||||||
using HuanMeng.MiaoYu.Code.SysDictionary.Contract;
|
using HuanMeng.MiaoYu.Code.SysDictionary.Contract;
|
||||||
using HuanMeng.MiaoYu.Model.Dto;
|
using HuanMeng.MiaoYu.Model.Dto;
|
||||||
|
|
||||||
|
|
@ -18,7 +19,7 @@ namespace HuanMeng.MiaoYu.Code.SysDictionary.DictionaryNetwork
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dictionaryInfoServer"></param>
|
/// <param name="dictionaryInfoServer"></param>
|
||||||
/// <param name="tenantInfo"></param>
|
/// <param name="tenantInfo"></param>
|
||||||
public class DictionaryInfoNetwork(IDictionaryInfoServer dictionaryInfoServer, ITenantInfo tenantInfo) : IDictionaryInfo
|
public class DictionaryInfoNetwork(IDictionaryInfoServer dictionaryInfoServer, ITenantInfo tenantInfo) : IDictionaryInfo, ICacheClearData, ICacheReloadData
|
||||||
{
|
{
|
||||||
private List<T_Sys_Dictionary>? _dictionaryInfo = null;
|
private List<T_Sys_Dictionary>? _dictionaryInfo = null;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -64,5 +65,21 @@ namespace HuanMeng.MiaoYu.Code.SysDictionary.DictionaryNetwork
|
||||||
{
|
{
|
||||||
return DictionaryInfo.Where(it => it.ProjectCode == dictionaryEnum.ToString()).OrderBy(it => it.Sort).FirstOrDefault();
|
return DictionaryInfo.Where(it => it.ProjectCode == dictionaryEnum.ToString()).OrderBy(it => it.Sort).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ClearData()
|
||||||
|
{
|
||||||
|
dictionaryInfoServer.Initialization();
|
||||||
|
var d = dictionaryInfoServer[tenantInfo];
|
||||||
|
_dictionaryInfo = d;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReloadData()
|
||||||
|
{
|
||||||
|
dictionaryInfoServer.Initialization();
|
||||||
|
var d = dictionaryInfoServer[tenantInfo];
|
||||||
|
_dictionaryInfo = d;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
21
src/9-test/TextCensorFilterTest/Program.cs
Normal file
21
src/9-test/TextCensorFilterTest/Program.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
using BenchmarkDotNet.Jobs;
|
||||||
|
using BenchmarkDotNet.Running;
|
||||||
|
|
||||||
|
namespace TextCensorFilterTest;
|
||||||
|
[MemoryDiagnoser]
|
||||||
|
[MarkdownExporterAttribute.GitHub]
|
||||||
|
[SimpleJob(RuntimeMoniker.Net80, baseline: true)]
|
||||||
|
[RPlotExporter]
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
//
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
//Console.WriteLine("Hello, World!");
|
||||||
|
//var x= new SensitiveWordFilterTest().SensitiveWordFilterTe();
|
||||||
|
// Console.WriteLine(x);
|
||||||
|
BenchmarkRunner.Run<SensitiveWordFilterTest>();
|
||||||
|
}
|
||||||
|
}
|
||||||
52
src/9-test/TextCensorFilterTest/SensitiveWordFilterTest.cs
Normal file
52
src/9-test/TextCensorFilterTest/SensitiveWordFilterTest.cs
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
using BenchmarkDotNet.Attributes;
|
||||||
|
|
||||||
|
using HuanMeng.DotNetCore.TextCensor;
|
||||||
|
using HuanMeng.DotNetCore.TextCensor.SensitiveWord;
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TextCensorFilterTest
|
||||||
|
{
|
||||||
|
[MemoryDiagnoser]
|
||||||
|
public class SensitiveWordFilterTest
|
||||||
|
{
|
||||||
|
public SensitiveWordFilterTest()
|
||||||
|
{
|
||||||
|
string path = "I:\\test\\PrayForBlessings\\PrayForBlessings\\ciku";
|
||||||
|
if (sensitiveWordFilter == null)
|
||||||
|
{
|
||||||
|
sensitiveWordFilter = TextCensorExtend.GetSensitiveWordFilter(path);
|
||||||
|
}
|
||||||
|
//CheckTextVerification.VerifyTxtString("");
|
||||||
|
}
|
||||||
|
SensitiveWordFilter sensitiveWordFilter = null;
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public bool SensitiveWordFiltermax()
|
||||||
|
{
|
||||||
|
return sensitiveWordFilter.TextCensor("*林婉儿面露疑惑之色,你突然来这么一声问候,实在令她有些摸不着头脑。作为一位淑女,她自是明白礼数之重要性的。见你竟三番两次地打断了她们之间正在深入的对话,不禁蹙起秀眉,神色间略带不悦。* \"阁下这般反复无常,却是何意?\"她语气平和,却不无不满,\"我们方才正在讨论魔兽山脉的来历,你也说了许多让婉儿费解的奇闻逸事。我正渴望能从你这里获知更多有益的解惑呢。\" *她优雅地抿了一口香茶,似在给自己一些缓冲的时间*\"不知阁下可曾见过其他游历山川的高人?他们对于这处所在是否也有过非同寻常的评说?又或是流传下来的什么古老传闻?\" *说着,她的目光缓缓流转,最终重新落在你的身上,眸中满怀期盼之色*\"若阁下实在没什么更多可说的了,不若就让我回忆起从前所读所闻,慢慢为你道来一二吧?或许还能给你带来一些新的启发。\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
//[Benchmark]
|
||||||
|
//public bool VerifyTxtStringmax()
|
||||||
|
//{
|
||||||
|
// return CheckTextVerification.VerifyTxtString("*林婉儿面露疑惑之色,你突然来这么一声问候,实在令她有些摸不着头脑。作为一位淑女,她自是明白礼数之重要性的。见你竟三番两次地打断了她们之间正在深入的对话,不禁蹙起秀眉,神色间略带不悦。* \"阁下这般反复无常,却是何意?\"她语气平和,却不无不满,\"我们方才正在讨论魔兽山脉的来历,你也说了许多让婉儿费解的奇闻逸事。我正渴望能从你这里获知更多有益的解惑呢。\" *她优雅地抿了一口香茶,似在给自己一些缓冲的时间*\"不知阁下可曾见过其他游历山川的高人?他们对于这处所在是否也有过非同寻常的评说?又或是流传下来的什么古老传闻?\" *说着,她的目光缓缓流转,最终重新落在你的身上,眸中满怀期盼之色*\"若阁下实在没什么更多可说的了,不若就让我回忆起从前所读所闻,慢慢为你道来一二吧?或许还能给你带来一些新的启发。\"");
|
||||||
|
//}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public bool SensitiveWordFilter()
|
||||||
|
{
|
||||||
|
return sensitiveWordFilter.TextCensor("*林婉儿面露疑惑之色,");
|
||||||
|
}
|
||||||
|
|
||||||
|
[Benchmark]
|
||||||
|
public void VerifyTxtString()
|
||||||
|
{
|
||||||
|
//CheckTextVerification.VerifyTxtString("*林婉儿面露疑惑之色,");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
src/9-test/TextCensorFilterTest/TextCensorFilterTest.csproj
Normal file
18
src/9-test/TextCensorFilterTest/TextCensorFilterTest.csproj
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\0-core\HuanMeng.DotNetCore\HuanMeng.DotNetCore.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
Loading…
Reference in New Issue
Block a user