关于应用内搜索工具帮助和应用内搜索工具帮助怎么用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于21款工具帮助你快速创建Windows8Store应用、android–GoogleNow(
关于应用内搜索工具帮助和应用内搜索工具帮助怎么用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于21款工具帮助你快速创建Windows 8 Store应用、android – Google Now(现在点击)如何在应用内搜索?、C#工具帮助类、Github Page 搜索工具等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 应用内搜索工具帮助(应用内搜索工具帮助怎么用)
- 21款工具帮助你快速创建Windows 8 Store应用
- android – Google Now(现在点击)如何在应用内搜索?
- C#工具帮助类
- Github Page 搜索工具
应用内搜索工具帮助(应用内搜索工具帮助怎么用)
发布日期:2015-06-01
目录
什么是应用内搜索?
为什么要使用应用内搜索工具?
什么样的站点和App可以申请应用内搜索的合作?
应用内搜索资源提交工具使用规则
inApp调起规范
常见问题
如果我的App不存在一一对应的站点怎么办?
为什么提交了对应关系,但是没有在搜索结果中看到我的App的应用内搜索(inApp)结果?
怎么样可以增加对应到我的App的搜索关键词数量?
怎样删除我已提交的对应关系数据?
什么是应用内搜索?
百度应用内搜索,又称为inApp Search(简称inApp),是移动互联网时代打通开发者App内资源与用户需求的一种新的搜索模式。通过整合和索引合作App的内部资源,将App内信息通过Android平台上产品的搜索结果呈现给用户,用户通过点击相应搜索结果可直接跳转至开发者Native APP的指定页面。inApp Search可直接应用到百度的移动端产品,如百度手机助手、百度移动搜索等,同时也可以API的形式将检索结果打包输出给任意其他App。
为什么要使用应用内搜索工具?
应用内搜索工具用于应用内搜索的基础数据支持。当用户在安卓平台上的百度移动搜索检索到相应的在内的站点(包括PC站和手机站)时,用户可以通过应用内搜索的搜索结果在相应的app内直接满足其搜索需求,扩展用户的需求满足方式。
什么样的站点和App可以申请应用内搜索的合作?
申请应用内搜索的合作您需要满足以下两个要求:
您同时拥有PC站点(或手机站点) 与安卓平台的app,并且两者在内容和功能上具有一一对应关系
您的App的调起和返回逻辑符合百度应用内搜索的调起规范。详细规范说明>>
应用内搜索资源提交工具使用规则
注册并登录百度站长平台。
提交网站并验证归属,具体验证网站归属方法可见帮助文档。
进入“应用内搜索”引导页面,点击顶部“添加数据”按钮后进入应用内搜索的数据提交页面。
站点根据自己的需要,选择url级别或者pattern级别。
当对应关系sitemap文件地址不变(如www.a.com/sitemap.xml),只是更新对应关系sitemap文件内容时,无需在平台操作,站点只需按照约定的更新周期自主更新对应关系sitemap文件内容即可,百度会自动进行抓取。
当对应关系sitemap文件地址发生变化(比如从www.a.com/sitemap.xml变更为www.a.com/sitemap1.xml),请重新提交新的对应关系sitemap文件。
若您需要删除已提交的对应关系,则需在应用内搜索的提交状态查询页面点击“删除已提交数据”按钮,进入删除已提交数据页面进行数据的删除操作。直接在已提交的xml地址中删除指定对应关系并不会成功删除,只是停止更新。
inApp调起规范
为实现应用内搜索的分发和调起,开发者需确保App在应用内搜索的调起逻辑以及返回逻辑。
5.1 调起逻辑
用户从百度应用内搜索结果页面调起App时,要求直接进入App内对应内容的详情页面(例如,搜索“来自星星的你”的视频,直接调起此视频的播放界面),不允许经过App启动页、新手引导页或App首页。 用户从百度应用内搜索结果页面调起App时,要求App能在2秒之内相应用户调起请求,打开并定位到相应页面。
1
2
5.2 返回逻辑
用户从百度应用内搜索结果页面调起App的某一个界面,若用户不进行除‘返回/BACK’之外的任何操作,直接点击安卓手机的物理键‘返回/BACK’,需要直接返回到百度应用内搜索的产品界面。
用户从百度应用内搜索结果页调起App的某一个界面,若发生连续操作,形成一条操作轨迹,此时连续点击安卓手机的物理键‘返回/BACK’,需要能返回到百度应用内搜索的产品界面。
用户直接点击home键或进行其他操作,则不再做返回约束。
若合作App内界面中有“返回”按钮,点击后跳转至App中该页面的逻辑上一页,用户可以留在App中浏览其它内容。
3
同时,inApp也支持用户选择返回地址的返回方式。
用户从百度搜索结果页调起App的某一个界面后,点击物理键‘返回/BACK’以及App内界面中的“返回”按钮均弹出返回界面选择弹窗。用户可自行选择是继续留在App内或返回搜索结果页。 若选择留在App内,则直接返回至该页面的逻辑上一页或App首页;若选择返回百度搜索,则直接返回至百度搜索结果页。
4
5.3 下载后调起逻辑
支持从百度应用内搜索结果下载后调起的特定类目的App,要求App在下载并正确安装后能自动打开App并定位到App内的相应内容详情页。
若App安装完成后系统弹出默认的完成安装弹窗,在安装完成后2分钟内点击弹窗中的“打开”或“完成”后,均要求能定位至相应内容详情页。
5
6
常见问题
如果我的App不存在一一对应的站点怎么办?
站长平台的应用内搜索工具是针对有一一对应网站的App设置的合作资源提交入口。只有当您同时具有App以及站点时才适用此工具。若您的App不存在对应站点,但您依然希望合作应用内搜索,则可通过百度手机助手开发者平台的应用内搜索模块以全量数据合作的形式提交申请。全量数据合作形式的应用内搜索接入不需要您具有与App相对应的站点。
为什么提交了对应关系,但是没有在搜索结果中看到我的App的应用内搜索(inApp)结果?
基于App与网页对应关系的合作形式强烈的依赖于您的网页。我们有一套完整的准入算法保证搜索结果的优质性与相关性。只有当您的网页在原始搜索结果中与用户搜索关键词具有一定的相关性以及用户点击,我们才会针对该网页推荐App的调起。相反,我们则认为您的网页结果不具有推荐相应App的准入资格,即使您提交了对应关系,我们也不会采用。
怎么样可以增加对应到我的App的搜索关键词数量?
对应到App的搜索关键词完全是依赖原有网页搜索结果中您的网页结果的质量。提供更多的优质网页(在搜索结果中排位靠前、用户点击率较高)与App的对应关系数据,将有利于增加对应到App的搜索关键词数量。
怎样删除我已提交的对应关系数据?
您需要在应用内搜索的提交状态查询页面点击“删除已提交数据”按钮,进入删除已提交数据页面进行数据的删除操作。直接在已提交的xml地址中删除指定对应关系并不会成功删除,只是停止更新。
21款工具帮助你快速创建Windows 8 Store应用
Visual Studio 2012 / 2013
微软公司的Visual Studio无人不知,它是开发Windows 8.x应用程序最好的工具。利用Visual Studio,你可以用VB.NET, C#甚至JavaScript来开发Windows 8.x应用程序。值得一提的是,Visual Studio 2013还获得Jolt Awards 2014编码工具的Jolt大奖,>>>查看2014 Jolt Awards编码工具获奖详情。
Ignite UI
Ignite UI是一组HTML和JavaScript界面控件,主要用于基于浏览器的触摸平板、移动终端和桌面应用程序。Ignite UI基于jQuery Core、jQuery UI和jQuery Mobile JavaScript库,并包含了全套22种基于jQuery的移动控件,同时还支持adaptive CSS 以开发iPhone、Android和Windows Phone等应用程序。
Sencha
Sencha框架是世界上第一个基于HTML 5的移动应用框架。它可以让你的Web应用看起来像网络应用。美丽的用户界面组件和丰富的数据管理,全部基于最新的HTML 5和CSS3的 WEB标准,全面兼容Android和iOS设备。
AppsBuilder
AppsBuilder是一款在线跨平台DIY移动开发工具,为用户提供快捷的应用程序解决方案,目前AppsBuilder支持包括iOS、 Windows Phone和Android等在内的多种移动平台。用户所创建的应用程序将会存储到AppsBuilder的云系统中,用户可以实时地更新应用的内容和布 局。
XAML Spy
Windows 8.x Store应用程序的设计由XAML编写。XAML Spy是一款针对 Windows Phone 8.x、Windows Store 8.x、 Silverlight和WPF应用的可视化的运行时检查器。XAML Spy支持Silverlight、Windows Store、Windows Phone和WPF。要注意的是,检查Silverlight 3/4的应用需要安装Silverlight 5。
ZipApp
ZipApp是一款多功能的压缩/解压缩工具,同时支持iPad、iPhone和iPod touch。应用支持.zip、.rar、.7z、.bz2、.tar、.gz等目前常见的绝大多数主流压缩格式,并支持加密的ZIP和RAR文件格式。
Adreno
Adreno是Qualcomm(高通)GPU处理器,是美国高通公司收购AMD绘图掌上设置技术推出的移动图形处理器。该SDK包含游戏&图形优化库和样本。
AllJoyn
AllJoyn是一个开放源码的软件系统,它为分布式应用程序在不同设备中提供了运行环境,特别是移动性、安全性和动态配置。AllJoyn系统处理了异构分布式系统中固有的难题,并解决了将移动性引入方程时所产生的独特问题。这使得应用开发人员可以将注意力集中到应用程序的核心问题上了。AllJoyn是一个“中性平台”,它被设计为相对于它运行的具体操作系统、硬件和设备尽可能的独立。
FastCV
FastCV是一个针对移动平台的计算机视觉库。FastCV允许你添加令人惊喜的功能到使用摄像头的应用程序中,如人脸检测,手势识别,增强现实和文本识别和跟踪。
Parse Windows 8 SDK
Parse Windows 8 SDK 支持数据安全存储、用户认证和管理、数据访问权限控制和各类数据查询等多项功能,并同时支持.NET 和 JavaScript 两种语言。现在,那些用诸如 C#或 Visual Basic 这样的.Net 语言编写代码的开发者只需在 Visual Studio 中使用 NuGet 安装 Parse SDK,就可以跟 Android 和 iOS 开发者一样,获得 Parse 的全套功能。而且,Parse 还支持诸如 LINQ、TAP 这类特殊的.NET 功能。
Component One Studio for WinRT XAML
Component One Studio for WinRT XAML是一款具有触摸体验的工具,支持Microsoft推崇的现代界面设计风格和交互方式(Metro)。Studio for WinRT XAML 提供了date/time pickers, calendars, 具备数据可视化,布局功能的pane,掩码和数值输入类控件,这无疑填补了 WinRT 相对于其他.NET 平台的空白。
DevExpress Windows 8 XAML Controls
Windows 8 XAML Controls是DevExpress公司研发的一个新的开发工具包,可帮助你迅速地在Windows 8上开发WinRT应用程序。该控件包主要针对Windows 8的用户界面。>>>DevExpress Windows 8控件效果展示
Infragistics NetAdvantage for Windows UI
Infragistics NetAdvantage for Windows UI拥有一些相当酷的控件,如数据图表,网格,日历,条形码,货币输入,屏蔽输入和Persistence Framework等,可帮助你快速构建Windows 8.x Store应用程序,>>>查看所包含的完整控件列表
Telerik RadControls for Windows 8 XAML
Telerik RadControls for Windows 8 XAML能使开发者使用图表(Chart)、 日期选择器(DatePicker)、 分页(Pagination)、仪表盘(Gauge)、 日期选择器(TimePicker)、 HubTile、 弹道图(BulletGraph)、数字框(NumericBox)、幻灯片(Slider)、组合框(ComboBox)、 自动完成框(AutoCompleteBox) 和下拉框(DropDownList)等控件创建触摸类应用。
MonoGame
MonoGame是一个 Microsoft XNA 4 Framework 的开源跨平台实现。 目标是让为 Xbox 360, Windows & Windows Phone上开发的XNA游戏移植到 iOS, Android, Mac OS X, Linux 以及 Windows 8 Metro上。OUYA以及PlayStation Mobile 的支持也在计划中。
Scirra Construct2
Construct是一款免费的,基于Windows平台的,面向2D游戏的DirectX 9游戏开发工具。它基于事件的系统以一种可见可阅读的方式的来定义游戏行为。操作上也非常直觉,若你的英文有一定的程度,基本上这款软件只需要些微的引导就可以做出一个简单的游戏。尽管Construct 2编辑器只适用于Windows,但是你制作的游戏却可以运行于任何平台上,如Mac,Linus或者iPad。
SharpDX
SharpDX是一个google上的一个开源项目,它支持所有的windows OS,和.net framework。SharpDX可帮助你创建适合所有Windows 平台的高性能的2D和3D图形。
Unity3D
Unity3D是一个能够实现轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。
ComponentArt Data Visualization for Visual Studio
ComponentArt Data Visualization for Visual Studio是一款Visual Studio 2012/2013插件。所有的控件都基于新的WinRT API,并对触摸输入和移动CPU进行了优化。这些控件包括:图表,仪表,数据网格,地图,导航器和计算器。
Visual Web GUI
Visual WebGui Professional Studio是一个非常完美的web开发解决方案,它可以完全集成到Visual Studio中,并在其中以winform形式开发web应用程序,同时支持移动应用程序、云应用程序开发。
android – Google Now(现在点击)如何在应用内搜索?
>它是否只是截取当前应用程序的屏幕截图并使用OCR提取文本?
>它是否具有“特殊的Google权限”,允许它读取视图中的值?
解决方法
C#工具帮助类
md5帮助类


1、引入库
using System.Security.Cryptography;//引用Md5转换功能
2、计算字符串的Md5值
public static string GetMD5WithString(String input)
{
MD5 md5Hash = MD5.Create();
// 将输入字符串转换为字节数组并计算哈希数据
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
// 创建一个 Stringbuilder 来收集字节并创建字符串
StringBuilder str = new StringBuilder();
// 循环遍历哈希数据的每一个字节并格式化为十六进制字符串
for (int i = 0; i < data.Length; i++)
{
str.Append(data[i].ToString("x2"));//加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位
}
// 返回十六进制字符串
return str.ToString();
}
3、计算文件的Md5值
static public string GetMD5WithFilePath(string filePath)
{
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] hash_byte = md5.ComputeHash(file);
string str = System.BitConverter.ToString(hash_byte);
str = str.Replace("-", "");
return str;
}
Post通用方法


public static string CreatePostHttpResponse(string url, IDictionary<string, string> parameters)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
if (request.Method == "POST")
{
//如果需要POST数据
if (!(parameters == null || parameters.Count == 0))
{
request.ContentType = "application/x-www-form-urlencoded";
StringBuilder buffer = new StringBuilder();
int i = 0;
foreach (string key in parameters.Keys)
{
if (i > 0)
{
buffer.AppendFormat("&{0}={1}", key, parameters[key]);
}
else
{
buffer.AppendFormat("{0}={1}", key, parameters[key]);
}
i++;
}
byte[] data = Encoding.UTF8.GetBytes(buffer.ToString());
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
}
else
{
request.ContentLength = 0;
}
//声明一个HttpWebRequest请求
request.Timeout = 90000;
//设置连接超时时间
request.Headers.Set("Pragma", "no-cache");
string result = String.Empty;
Encoding encoding = Encoding.UTF8;
using (WebResponse wr = request.GetResponse())
{
System.IO.Stream respStream = wr.GetResponseStream();
System.IO.StreamReader reader = new System.IO.StreamReader(respStream, encoding);
//在这里对接收到的页面内容进行处理
result = reader.ReadToEnd();
}
return result;
}
Post Raw方式请求


/// <summary>
/// RAW方式Post
/// </summary>
/// <param name="url"></param>
/// <param name="querystring"></param>
/// <returns></returns>
public static string CreatePostHttpResponse(string url, string param, string contentType = "")
{
string strURL = url;
System.Net.HttpWebRequest request;
request = (System.Net.HttpWebRequest)WebRequest.Create(strURL);
request.Method = "POST";
if (string.IsNullOrEmpty(contentType))
{
request.ContentType = "application/json;charset=UTF-8"; // or whatever - application/json, etc, etc
}
else
{
request.ContentType = contentType;
}
string paraUrlCoded = param;
byte[] payload;
payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
request.ContentLength = payload.Length;
Stream writer = request.GetRequestStream();
writer.Write(payload, 0, payload.Length);
writer.Close();
System.Net.HttpWebResponse response;
response = (System.Net.HttpWebResponse)request.GetResponse();
System.IO.Stream s;
s = response.GetResponseStream();
string StrDate = "";
string strValue = "";
StreamReader Reader = new StreamReader(s, Encoding.UTF8);
while ((StrDate = Reader.ReadLine()) != null)
{
strValue += StrDate + "\r\n";
}
return strValue;
}
Get通用方法


public static string GetHttpResponse(string url, int Timeout)
{
string retString = string.Empty;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "text/html;charset=UTF-8";
request.UserAgent = null;
request.Timeout = Timeout;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
}
catch (Exception ex)
{
LogHelper.Log(ex);
throw;//错误打回上层
}
return retString;
}
使用log4net的log帮助类


using log4net;
using System;
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
namespace Log4NetManager
{
public static class LogHelper
{
private static ILog log = LogManager.GetLogger("LogHelper");
private static ILog log_Normal = LogManager.GetLogger("LogHelperNormal");
public static void Write(string msg, LogLev lev)
{
switch (lev)
{
case LogLev.Debug:
log_Normal.Debug(msg);
break;
case LogLev.Error:
log.Error(msg);
break;
case LogLev.Fatal:
log.Fatal(msg);
break;
case LogLev.Info:
log_Normal.Info(msg);
break;
case LogLev.Warn:
log_Normal.Warn(msg);
break;
default:
break;
}
}
public static void Write(string msg, LogLev lev, params object[] parm)
{
switch (lev)
{
case LogLev.Debug:
log_Normal.DebugFormat(msg, parm);
break;
case LogLev.Error:
log.ErrorFormat(msg, parm);
break;
case LogLev.Fatal:
log.FatalFormat(msg, parm);
break;
case LogLev.Info:
log_Normal.InfoFormat(msg, parm);
break;
case LogLev.Warn:
log_Normal.WarnFormat(msg, parm);
break;
default:
break;
}
}
public static void Write(Exception ex, LogLev lev)
{
switch (lev)
{
case LogLev.Debug:
log_Normal.Debug(ex);
break;
case LogLev.Error:
log.Error(ex);
break;
case LogLev.Fatal:
log.Fatal(ex);
break;
case LogLev.Info:
log_Normal.Info(ex);
break;
case LogLev.Warn:
log_Normal.Warn(ex);
break;
default:
break;
}
}
public static void Log(Exception ex)
{
Write("方法:{0} 消息:{1} 类:{2} 堆:{3} ", LogLev.Fatal, ex.TargetSite, ex.Message,ex.Source, ex.StackTrace);
}
public static void Log(Exception ex,int fmodelid)
{
Write("方法:{0} 消息:{1} 类:{2} 堆:{3} fmodelid:{4}", LogLev.Fatal, ex.TargetSite, ex.Message, ex.Source, ex.StackTrace,fmodelid);
}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
namespace Log4NetManager
{
public enum LogLev
{
Debug,
Error,
Fatal,
Info,
Warn
}
}


<log4net>
<logger name="LogHelper">
<level value="ALL" />
<appender-ref ref="Appender" />
</logger>
<logger name="LogHelperNormal">
<level value="ALL" />
<appender-ref ref="NormalAppender" />
</logger>
<appender name="Appender" type="log4net.Appender.RollingFileAppender">
<!--日志文件名开头-->
<param name="File" value="Log\\" />
<!--是否追加到文件,默认为true,通常无需设置-->
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
<param name="DatePattern" value="yyyyMMdd"_Exception.log"" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
<appender name="NormalAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd"_Normal.log"" />
<param name="RollingStyle" value="Date" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
</log4net>
微信支付签名帮助类


using Log4NetManager;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace UnifiedPayment.Core
{
public class SignHelper
{
/// <summary>
/// 获取Sign
/// </summary>
/// <param name="parameters">参数 会自动过滤空数据 里面不能再传入key键</param>
/// <param name="secretkey">智游宝秘钥</param>
/// <returns></returns>
public static string GetSign(IDictionary<string, string> parameters, string secretkey)
{
var res = string.Empty;
try
{
var keys = parameters.Where(c => !string.IsNullOrEmpty(c.Value) && !string.IsNullOrEmpty(c.Key)).Select(c => c.Key).ToArray();//去除空结果内容
//处理输入参数根据ASCII码排序
Array.Sort(keys, string.CompareOrdinal);
var temp = new List<string>();
foreach (var item in keys)
{
foreach (var key in parameters)
{
if (item == key.Key)
{
temp.Add($"{key.Key}={key.Value}");
break;
}
}
}
temp.Add($"key={secretkey}");
res = GetMD5(string.Join("&", temp));
}
catch (Exception ex)
{
LogHelper.Log(ex);
throw;
}
return res;
}
/// <summary>
/// 获取Sign
/// </summary>
/// <param name="parameters">参数 对象类型</param>
/// <param name="secretkey">智游宝秘钥</param>
/// <returns></returns>
public static string GetSign(object parameters, string secretkey)
{
var t = parameters.GetType();
var dic = new Dictionary<string, string>();
foreach (var item in t.GetProperties())
{
var value = Convert.ToString(item.GetValue(parameters, null));
if (!string.IsNullOrEmpty(value))
dic.Add(item.Name, value);
}
return GetSign(dic, secretkey);
}
/// <summary>
/// 转为md5
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string GetMD5(string text)
{
MD5 md5Hash = MD5.Create();
// 将输入字符串转换为字节数组并计算哈希数据
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(text));
// 创建一个 Stringbuilder 来收集字节并创建字符串
StringBuilder str = new StringBuilder();
// 循环遍历哈希数据的每一个字节并格式化为十六进制字符串
for (int i = 0; i < data.Length; i++)
{
str.Append(data[i].ToString("X2"));//加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位
}
// 返回十六进制字符串
return str.ToString();
}
}
}
XML帮助类


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data;
using System.Xml;
using System.Xml.Serialization;
using System.Text.RegularExpressions;
using Log4NetManager;
namespace UnifiedPayment.Core
{
/*
实体对象转换到Xml
Student stu1 = new Student() { Name = "okbase", Age = 10 };
string xml = XmlUtil.Serializer(typeof(Student), stu1);
Xml转换到实体对象
Student stu2 = XmlUtil.Deserialize(typeof(Student), xml) as Student;
可转换 list, DataTable
*/
/// <summary>
/// Xml序列化与反序列化
/// </summary>
public class XMLHelper
{
#region 反序列化
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="xml">XML字符串</param>
/// <returns></returns>
public static object Deserialize(Type type, string xml)
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(sr);
}
}
catch (Exception e)
{
return null;
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type"></param>
/// <param name="xml"></param>
/// <returns></returns>
public static object Deserialize(Type type, Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
}
#endregion
#region 序列化
/// <summary>
/// 序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="obj">对象</param>
/// <returns></returns>
public static string Serializer(Type type, object obj)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(type);
try
{
//序列化对象
xml.Serialize(Stream, obj);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="obj">参数</param>
/// <returns></returns>
public static string SerializerToWX(object obj)
{
StringBuilder sb = new StringBuilder();
sb.Append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><xml>");
if (obj != null)
{
var pros = obj.GetType().GetProperties();
foreach (var pro in pros)
{
sb.AppendFormat("<{0}>{1}</{0}>",pro.Name,pro.GetValue(obj,null));
}
}
sb.Append("</xml>");
return sb.ToString();
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="xml">xml内容</param>
/// <returns></returns>
public static T Deserialize<T>(string xml)
{
var type = typeof(T);
var res = type.Assembly.CreateInstance(type.FullName);//创建实例
var _t = res.GetType();
var pros = type.GetProperties();
LogHelper.Write($"原始xml为:{xml} 时间为:{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss")}", LogLev.Info);
foreach (var item in pros)
{
var matchStr = $@"<{item.Name}>(\S*)</{item.Name}>";
var reg = new Regex(matchStr);
var data= reg.Match(xml);
if (data.Success)
{
//转换为实体类
if (!_t.GetProperty(item.Name).PropertyType.IsGenericType)
{
//非泛型
_t.GetProperty(item.Name).SetValue(res, string.IsNullOrEmpty(data.Groups[1].Value) ? null : Convert.ChangeType(data.Groups[1].Value, _t.GetProperty(item.Name).PropertyType), null);
}
else
{
//泛型Nullable<>
Type genericTypeDefinition = _t.GetProperty(item.Name).PropertyType.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
_t.GetProperty(item.Name).SetValue(res, string.IsNullOrEmpty(data.Groups[1].Value) ? null : Convert.ChangeType(data.Groups[1].Value, Nullable.GetUnderlyingType(_t.GetProperty(item.Name).PropertyType)), null);
}
}
}
}
return (T)res;
}
#endregion
}
}
WinForm MessageBox更改位置为父窗口下居中


using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class CenterWinDialog : IDisposable
{
private int mTries = 0;
private Form mOwner;
public CenterWinDialog(Form owner)
{
mOwner = owner;
owner.BeginInvoke(new MethodInvoker(findDialog));
}
private void findDialog()
{
// Enumerate windows to find the message box
if (mTries < 0) return;
EnumThreadWndProc callback = new EnumThreadWndProc(checkWindow);
if (EnumThreadWindows(GetCurrentThreadId(), callback, IntPtr.Zero))
{
if (++mTries < 10) mOwner.BeginInvoke(new MethodInvoker(findDialog));
}
}
private bool checkWindow(IntPtr hWnd, IntPtr lp)
{
// Checks if <hWnd> is a dialog
StringBuilder sb = new StringBuilder(260);
GetClassName(hWnd, sb, sb.Capacity);
if (sb.ToString() != "#32770") return true;
// Got it
Rectangle frmRect = new Rectangle(mOwner.Location, mOwner.Size);
RECT dlgRect;
GetWindowRect(hWnd, out dlgRect);
MoveWindow(hWnd,
frmRect.Left + (frmRect.Width - dlgRect.Right + dlgRect.Left) / 2,
frmRect.Top + (frmRect.Height - dlgRect.Bottom + dlgRect.Top) / 2,
dlgRect.Right - dlgRect.Left,
dlgRect.Bottom - dlgRect.Top, true);
return false;
}
public void Dispose()
{
mTries = -1;
}
// P/Invoke declarations
private delegate bool EnumThreadWndProc(IntPtr hWnd, IntPtr lp);
[DllImport("user32.dll")]
private static extern bool EnumThreadWindows(int tid, EnumThreadWndProc callback, IntPtr lp);
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId();
[DllImport("user32.dll")]
private static extern int GetClassName(IntPtr hWnd, StringBuilder buffer, int buflen);
[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, out RECT rc);
[DllImport("user32.dll")]
private static extern bool MoveWindow(IntPtr hWnd, int x, int y, int w, int h, bool repaint);
private struct RECT { public int Left; public int Top; public int Right; public int Bottom; }
}


using System;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;
public class MessageBoxEx
{
public static DialogResult Show(Form owner, string text)
{
using (new CenterWinDialog(owner))
{
return MessageBox.Show(text);
}
}
}
注: 出处为https://stackoverflow.com/questions/2576156/winforms-how-can-i-make-messagebox-appear-centered-on-mainform 的Hans Passant answer
WPF根据父控件获取子控件


private List<ChildType> FindVisualChild<ChildType>(DependencyObject obj) where ChildType : DependencyObject
{
var res = new List<ChildType>();
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is ChildType)
{
res.Add( child as ChildType);
}
else
{
List<ChildType> childOfChildren = FindVisualChild<ChildType>(child);
if (childOfChildren != null)
{
res.AddRange(childOfChildren);
}
}
}
return res;
}
sqlSuger 简单封装


using log4net.Core;
using Microsoft.Extensions.Configuration;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace CommonHelper
{
/// <summary>
/// 使用文档:http://www.codeisbug.com/Doc/8/1122
/// </summary>
public class SqlSugerHelper
{
private string ConnectionString = string.Empty;
private string SqlMapPath = string.Empty;
/// <summary>
/// 初始化
/// </summary>
/// <param name="conn">数据库连接串</param>
/// <param name="jsonConfigFileName">配置文件名称</param>
/// <param name="sqlMapPath">sqlmap地址</param>
/// <param name="databaseType">数据库类型</param>
/// <param name="isLogSql">是否记录日志</param>
public SqlSugerHelper(string conn = "", string jsonConfigFileName = "appsettings.json", string sqlMapPath = "wwwroot/SQLMAP", DatabaseType databaseType = DatabaseType.Oracle, bool isLogSql = true)
{
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile(jsonConfigFileName, optional: true)
.Build();
if (string.IsNullOrEmpty(conn))
{
conn = config.GetSection("Connections:DefaultConnect").Value;
}
else if (conn.StartsWith("setting:"))
{
conn = config.GetSection(conn.Substring(8)).Value;
}
SqlMapPath = Common.GetPath(sqlMapPath);
var sugerConfig = new ConnectionConfig()
{
ConnectionString = conn,
DbType = SqlSugar.DbType.Oracle,
IsAutoCloseConnection = true,
IsShardSameThread = true //设为true相同线程是同一个SqlSugarClient
};
switch (databaseType)
{
case DatabaseType.SqlServer:
sugerConfig.DbType = SqlSugar.DbType.SqlServer;
break;
case DatabaseType.MySql:
sugerConfig.DbType = SqlSugar.DbType.MySql;
break;
case DatabaseType.Oracle:
sugerConfig.DbType = SqlSugar.DbType.Oracle;
break;
case DatabaseType.Sqlite:
sugerConfig.DbType = SqlSugar.DbType.Sqlite;
break;
default:
break;
}
SqlSugarClient db = new SqlSugarClient(sugerConfig);
db.Ado.IsEnableLogEvent = true;
db.Ado.LogEventStarting = (sql, pars) =>
{
//记录sql语句
if (isLogSql)
LogHelper.Write(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)), LogLev.Info);
Console.WriteLine(sql + "\r\n" + db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)));
Console.WriteLine();
};
Suger = db;
}
/// <summary>
/// 返回操作对象
/// </summary>
public SqlSugarClient Suger { get; } = null;
public void TranStart()
{
if (Suger.Ado.Transaction == null)
Suger.Ado.BeginTran();
}
public void TranCommit()
{
if (Suger.Ado.Transaction != null)
Suger.Ado.CommitTran();
}
public void TranRollback()
{
if (Suger.Ado.Transaction != null)
Suger.Ado.RollbackTran();
}
/// <summary>
/// 插入单条
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public bool Insert<T>(T obj) where T : class, new()
{
if (obj == null) { return false; }
try
{
return Suger.Insertable(obj).ExecuteCommandIdentityIntoEntity();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return false;
}
}
/// <summary>
/// 插入多条
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public bool Insert<T>(List<T> obj) where T : class, new()
{
if (obj.Count <= 0) { return false; }
try
{
return Suger.Insertable(obj.ToArray()).ExecuteCommandIdentityIntoEntity();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return false;
}
}
/// <summary>
/// 更新单条
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public int Update<T>(T obj, Expression<Func<T, object>> columns) where T : class, new()
{
if (obj == null) { return 0; }
try
{
return Suger.Updateable(obj).WhereColumns(it => columns)
.IgnoreColumns(it => it.ToUpper() == "CREATE_TIME" || it.ToUpper() == "CREATE_OPTORNAME" || it.ToUpper() == "CREATE_OPTORCODE")
.ExecuteCommand();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return -1;
}
}
/// <summary>
/// 更新多条
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="objs"></param>
/// <param name="columns"></param>
/// <returns></returns>
public int Update<T>(List<T> objs, Expression<Func<T, object>> columns) where T : class, new()
{
if (objs.Count <= 0) { return 0; }
try
{
return Suger.Updateable(objs).WhereColumns(it => columns)
.IgnoreColumns(it => it.ToUpper() == "CREATE_TIME" || it.ToUpper() == "CREATE_OPTORNAME" || it.ToUpper() == "CREATE_OPTORCODE").ExecuteCommand();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return -1;
}
}
/// <summary>
/// 删除
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fid"></param>
/// <returns></returns>
public int Delete<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
try
{
return Suger.Deleteable<T>().Where(expression).ExecuteCommand();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return -1;
}
}
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="produceFullName"> 如GTMP_PK_TBKTRADE.GTMP_TBK_GETSERIALNO</param>
/// <param name="parameters"></param>
/// <returns></returns>
public string ExcuteProduce(string produceFullName, params SugarParameter[] parameters)
{
try
{
return Suger.Ado.UseStoredProcedure().GetString(produceFullName, parameters);
}
catch (Exception ex)
{
LogHelper.Log(ex);
return null;
}
}
/// <summary>
/// 执行无参数的sql语句 兼容sqlmap
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="mapname"></param>
/// <returns></returns>
public List<T> Query<T>(string sql, string mapname = "") where T : class, new()
{
try
{
if (!string.IsNullOrEmpty(mapname))
{
var pd = SQLMapHelper.GetSqlMapInfo(SqlMapPath, mapname, sql);
return Suger.SqlQueryable<T>(pd.TransferedSQL).ToList();
}
return Suger.SqlQueryable<T>(sql).ToList();
}
catch (Exception ex)
{
LogHelper.Log(ex);
return null;
}
}
/// <summary>
/// 返回延迟查询对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public ISugarQueryable<T> Queryable<T>() where T : class, new()
{
try
{
return Suger.Queryable<T>();
}
catch (Exception ex)
{
LogHelper.Log(ex, $"出错表名:{typeof(T).Name}");
return null;
}
}
}
}
注:sqlmap部分 没有需要的可以直接删掉
sqlSuger DataTable 转换为自定义 类型集合
注: 主要解决 直接使用sqlquery 出现返回数据首行出现无字段信息问题


public T ComplexSqlQueryable<T>(string sql) where T : class, new()
{
var dt = Queryable(sql);
var tt = new System.Data.DataTable(typeof(T).Name);
Type tp = typeof(T);
//泛型Nullable判断,取其中的类型
if (tp.IsGenericType)
{
tp = tp.GetGenericArguments()[0];
}
foreach (DataColumn col in dt.Columns)
{
BindingFlags flag = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance;
var type = tp.GetProperty(col.ColumnName, flag);
var typeres = type == null ? col.DataType : type.PropertyType;
tt.Columns.Add(new System.Data.DataColumn(col.ColumnName, typeres));
}
for (int i = 0; i < dt.Rows.Count; i++)
{
System.Data.DataRow dr = tt.NewRow();
foreach (DataColumn col in dt.Columns)
{
var type = col.DataType;
var toType = tt.Columns[col.ColumnName].DataType;
if (type != toType)
{
//文本类型不转换
if (toType == typeof(string))
{
dr[col.ColumnName] = dt.Rows[i][col.ColumnName].ToString();
continue;
}
//空值 取字段默认实例
if (string.IsNullOrEmpty(dt.Rows[i][col.ColumnName].ToString()))
{
dr[col.ColumnName] = Activator.CreateInstance(toType);
continue;
}
var TryParse = toType.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder,
new Type[] { typeof(string), toType.MakeByRefType() },
new ParameterModifier[] { new ParameterModifier(2) });
var parameters = new object[] { dt.Rows[i][col.ColumnName].ToString(), Activator.CreateInstance(toType) };
bool success = (bool)TryParse.Invoke(null, parameters);
if (success)
{
dr[col.ColumnName] = parameters[1];
}
}
else
dr[col.ColumnName] = dt.Rows[i][col.ColumnName];
}
tt.Rows.Add(dr);
}
return tt.ToT<T>();
}
其中 获取datatable 方法代码为:
public DataTable Queryable(string sql)
{
return SugerClient.GetInstance().Ado.GetDataTable(sql);
}
简单转换方法为:


public static class Extend
{
public static List<TT> ToT<TT>(this IEnumerable objs)
{
return JsonConvert.DeserializeObject<List<TT>>(JsonConvert.SerializeObject(objs));
}
public static TT ToT<TT>(this object obj)
{
return JsonConvert.DeserializeObject<TT>(JsonConvert.SerializeObject(obj));
}
}
另转载一个 泛型反射类型转换方法


public static T ConvertType<T>(object val)
{
if (val == null) return default(T);//返回类型的默认值
Type tp = typeof(T);
//泛型Nullable判断,取其中的类型
if (tp.IsGenericType)
{
tp = tp.GetGenericArguments()[0];
}
//string直接返回转换
if (tp.Name.ToLower() == "string")
{
return (T)val;
}
//反射获取TryParse方法
var TryParse = tp.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder,
new Type[] { typeof(string), tp.MakeByRefType() },
new ParameterModifier[] { new ParameterModifier(2) });
var parameters = new object[] { val, Activator.CreateInstance(tp) };
bool success = (bool)TryParse.Invoke(null, parameters);
//成功返回转换后的值,否则返回类型的默认值
if (success)
{
return (T)parameters[1];
}
return default(T);
}
将一个数据对象的值导入到另一个模型中(同字段名导入)


1 /// <summary>
2 /// 改变对象数据
3 /// </summary>
4 /// <param name="sourceObj">需要被改变的数据</param>
5 /// <param name="updateDataObj">改变的数据源对象</param>
6 public static void ChangeModel(this object sourceObj, object updateDataObj)
7 {
8 var sourType = sourceObj.GetType();
9 var dataType = updateDataObj.GetType();
10 var sourPros = sourType.GetProperties();
11 var dataPros = dataType.GetProperties();
12 foreach (var sourP in sourPros)
13 {
14 foreach (var dataP in dataPros)
15 {
16 //同名替换值
17 if (sourP.Name.ToLower() == dataP.Name.ToLower())
18 {
19 var sourPVal = sourP.GetValue(sourceObj);
20 var dataPVal = dataP.GetValue(updateDataObj);
21 object data = null;
22 if (sourPVal != dataPVal)
23 {
24 if (sourP.PropertyType != dataP.PropertyType)
25 {
26 Type tp = sourP.PropertyType;
27 //泛型Nullable判断,取其中的类型
28 if (tp.IsGenericType)
29 {
30 tp = tp.GetGenericArguments()[0];
31 }
32 if (string.IsNullOrEmpty(dataPVal.ToString()))
33 {
34 data = tp.Assembly.CreateInstance(tp.FullName);
35 }
36 //string直接返回转换
37 else if (tp.Name.ToLower() == "string")
38 {
39 data = dataPVal.ToString();
40 }
41 else if (tp.Name.ToLower() == "int32")
42 {
43 data = Convert.ToInt32(dataPVal);
44 }
45 else if (tp.Name.ToLower() == "int64")
46 {
47 data = Convert.ToInt64(dataPVal);
48 }
49 else if (tp.Name.ToLower() == "double")
50 {
51 data = Convert.ToDouble(dataPVal);
52 }
53 else if (tp.Name.ToLower() == "decimal")
54 {
55 data = Convert.ToDecimal(dataPVal);
56 }
57 else if (tp.Name.ToLower() == "boolean")
58 {
59 data = Convert.ToBoolean(dataPVal);
60 }
61 else if (tp.IsClass)
62 {
63 if (sourP.PropertyType.IsGenericType)
64 {
65 var listType = sourP.PropertyType;
66 //是泛型类
67 var newList = Activator.CreateInstance(listType);
68 BindingFlags flag = BindingFlags.Instance | BindingFlags.Public;
69 MethodInfo methodInfo = listType.GetMethod("Add", flag);
70
71 int count = Convert.ToInt32(dataP.PropertyType.GetProperty("Count").GetValue(dataPVal, null));
72 for (int i = 0; i < count; i++)
73 {
74 object listItem = dataP.PropertyType.GetProperty("Item").GetValue(dataPVal, new object[] { i });
75 methodInfo.Invoke(newList, new object[] { listItem });//相当于List<T>调用Add方法
76 }
77 data = newList;
78 }
79 else
80 {
81 //是单独的一个类
82 var newClass = tp.Assembly.CreateInstance(tp.FullName);
83 newClass.ChangeModel(dataPVal);
84 data = newClass;
85 }
86 }
87 else
88 {
89 var TryParse = tp.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder,
90 new Type[] { typeof(string), tp.MakeByRefType() },
91 new ParameterModifier[] { new ParameterModifier(2) });
92 var parameters = new object[] { dataPVal.ToString(), Activator.CreateInstance(tp) };
93 bool success = (bool)TryParse.Invoke(null, parameters);
94 //成功返回转换后的值,否则返回类型的默认值
95 if (success)
96 {
97 data = parameters[1];
98 }
99 }
100 }
101 else
102 {
103 data = dataPVal;
104 }
105 sourP.SetValue(sourceObj, data, null);
106 }
107 }
108 }
109 }
110
111 }


1 /// <summary>
2 /// 转换类型
3 /// </summary>
4 /// <typeparam name="T">要转换的基础类型</typeparam>
5 /// <param name="val">值</param>
6 /// <returns></returns>
7 public static T ConvertType<T>(object val)
8 {
9 if (val == null) return default(T); //返回类型的默认值
10 Type tp = typeof(T);
11 //泛型Nullable判断,取其中的类型
12 if (tp.IsGenericType)
13 {
14 tp = tp.GetGenericArguments()[0];
15 }
16
17 //string直接返回转换
18 if (tp.Name.ToLower() == "string")
19 {
20 return (T)val;
21 }
22
23 //反射获取TryParse方法
24 var TryParse = tp.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder,
25 new Type[] { typeof(string), tp.MakeByRefType() },
26 new ParameterModifier[] { new ParameterModifier(2) });
27 var parameters = new object[] { val, Activator.CreateInstance(tp) };
28 bool success = (bool)TryParse.Invoke(null, parameters);
29 //成功返回转换后的值,否则返回类型的默认值
30 if (success)
31 {
32 return (T)parameters[1];
33 }
34
35 return default(T);
36 }
Github Page 搜索工具
轮子
今天造了一个轮子 -- Github Page搜索工具 https://man-ing.com/github。
什么是Github Page
直接从GitHub存储库托管。只需编辑,推送,更改即可生效。
关于Github Page的更多信息可以点击这个链接了解一下【Github Page】
如何创建一个属于自己的Github Page
- Github+Hexo+Next创建自己的博客
关于这个轮子
- 搜索
你可以在搜索框中输入你想要查找的Github Page关键词,点击搜索Github Page按钮即可获取搜索结果。
- Top Github Page
Github Page搜索主页,会根据Github Page Stars的数量来进行排名,显示Top10的Github Page。
- Github Page信息摘要
在Github Page详情页,你可以查看当前Github Page仓库的Stars数量,Score分数,以及编程语言。你还可以选择点击去Github Page站点,还是去Github Page仓库。当详情页下方是Github Page的readme信息,你也可以通过阅读这些信息来了解这个仓库的大概内容。
为啥要造这个轮子
就是发现其实有很多优秀的Github Page,但是比较分散,当然你也可以直接去Github官网进行搜索,这个工具提供了一种更方便的访问Github Page的方法。以后会提供更多扩展功能。
更多信息
- Github Page搜索工具链接 https://man-ing.com/github
- Share Code 我的个人网站
关于应用内搜索工具帮助和应用内搜索工具帮助怎么用的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于21款工具帮助你快速创建Windows 8 Store应用、android – Google Now(现在点击)如何在应用内搜索?、C#工具帮助类、Github Page 搜索工具等相关知识的信息别忘了在本站进行查找喔。
本文标签: