From e509adfdab7392bfb5c04615b48ee23578fe6217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= <454313500@qq.com> Date: Fri, 19 Jan 2024 18:17:30 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj | 4 - .../20240115_120000_yi-abp-pro.sql | 822 ------------------ .../20240116_120000_yi-abp-pro.sql | 822 ------------------ 4 files changed, 2 insertions(+), 1648 deletions(-) delete mode 100644 Yi.Abp.Net8/src/Yi.Abp.Web/database_backup/20240115_120000_yi-abp-pro.sql delete mode 100644 Yi.Abp.Net8/src/Yi.Abp.Web/database_backup/20240116_120000_yi-abp-pro.sql diff --git a/.gitignore b/.gitignore index f22a04b4..4ccf385e 100644 --- a/.gitignore +++ b/.gitignore @@ -270,3 +270,5 @@ dist Logs logs /Yi.Abp.Net8/test/Yi.Abp.Test/appsettings.Development.json +/Yi.Abp.Net8/test/Yi.Abp.Test/appsettings.Production.json + diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj b/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj index dde9883e..644a03bb 100644 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj +++ b/Yi.Abp.Net8/src/Yi.Abp.Web/Yi.Abp.Web.csproj @@ -44,8 +44,4 @@ - - - - diff --git a/Yi.Abp.Net8/src/Yi.Abp.Web/database_backup/20240115_120000_yi-abp-pro.sql b/Yi.Abp.Net8/src/Yi.Abp.Web/database_backup/20240115_120000_yi-abp-pro.sql deleted file mode 100644 index 4e42be16..00000000 --- a/Yi.Abp.Net8/src/Yi.Abp.Web/database_backup/20240115_120000_yi-abp-pro.sql +++ /dev/null @@ -1,822 +0,0 @@ --- MySqlBackup.NET 2.3.8.0 --- Dump Time: 2024-01-15 12:00:00 --- -------------------------------------- --- Server version 8.0.31 MySQL Community Server - GPL - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8mb3 */; -/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; -/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; - - --- --- Definition of AccessLog --- - -DROP TABLE IF EXISTS `AccessLog`; -CREATE TABLE IF NOT EXISTS `AccessLog` ( - `Id` varchar(36) NOT NULL, - `Number` bigint NOT NULL, - `LastModificationTime` datetime DEFAULT NULL, - `CreationTime` datetime NOT NULL, - PRIMARY KEY (`Id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; - --- --- Dumping data for table AccessLog --- - -/*!40000 ALTER TABLE `AccessLog` DISABLE KEYS */; -INSERT INTO `AccessLog`(`Id`,`Number`,`LastModificationTime`,`CreationTime`) VALUES('022ebf71-7353-2d6b-290c-3a0fd80482b8',1152,NULL,'2024-01-02 00:24:55'),('0cc2ef9f-0f56-1a22-2731-3a0f858893b8',456,NULL,'2023-12-17 00:00:41'),('11ea4447-7d4b-ddaa-fd15-3a100124fd9c',300,NULL,'2024-01-10 00:04:49'),('18159d07-692d-6b23-d3f7-3a0fa4796282',159,NULL,'2023-12-23 00:12:19'),('20487b06-dc37-77da-dc72-3a0f7ad0ec95',119,NULL,'2023-12-14 22:03:53'),('268d50d0-ccb7-a4f6-c18f-3a0ff6e39435',487,NULL,'2024-01-08 00:17:10'),('295d930f-7a4c-769b-6361-3a0f9a31f103',211,NULL,'2023-12-21 00:18:05'),('2e27bd93-a188-5876-d72b-3a0fd325c4c6',46,NULL,'2024-01-01 01:43:08'),('35b89fda-6700-7042-b3e2-3a0fdd26cd98',499,NULL,'2024-01-03 00:20:28'),('3f94c9db-4c69-e0d2-4f37-3a0ffbfabd42',291,NULL,'2024-01-09 00:00:34'),('458a8823-f1d0-6c25-9cfe-3a0f80699711',385,NULL,'2023-12-16 00:08:44'),('46e95d4e-a2c7-4e01-7d42-3a0fc8a3b850',23,NULL,'2023-12-30 00:44:53'),('49858460-269e-3849-999d-3a0fc377847f',129,NULL,'2023-12-29 00:38:30'),('49dab4a5-7ffe-232b-11af-3a101ae0db8a',189,NULL,'2024-01-15 00:00:32'),('4f2f39b1-4a2c-5aa8-b278-3a0f7b45c5a7',270,NULL,'2023-12-15 00:11:31'),('5216c507-9965-84df-1716-3a0f951f1f68',235,NULL,'2023-12-20 00:39:25'),('5fe879f1-6c61-1cf6-ea7a-3a0fa9a24070',278,NULL,'2023-12-24 00:15:03'),('62f55edd-a45d-d266-7ef4-3a0f8fdf19a5',229,NULL,'2023-12-19 00:11:23'),('6e1dfaa3-9022-9b24-45b9-3a1015bba3cc',247,NULL,'2024-01-14 00:01:46'),('7505bd45-0abb-f9b3-154e-3a0f9f47c3e8',187,NULL,'2023-12-22 00:00:01'),('751ae5d0-d576-925e-0b92-3a0fb0516f66',474,NULL,'2023-12-25 07:24:07'),('82230212-b346-f44d-487e-3a0fcdacac8a',14,NULL,'2023-12-31 00:12:46'),('96c6823a-7af8-10c1-af1a-3a0ff1ba41cf',259,NULL,'2024-01-07 00:13:56'),('ad648d76-bb36-61fb-12b2-3a10109a7774',234,NULL,'2024-01-13 00:07:26'),('b983855d-f85c-23b5-d525-3a0fb99639c0',202,NULL,'2023-12-27 02:35:51'),('c4f5a8fc-f87c-77d2-a2bc-3a1006473fb4',291,NULL,'2024-01-11 00:00:20'),('d2952dd3-2b6d-5829-7ad7-3a0fbe32ef84',120,NULL,'2023-12-28 00:05:30'),('da025437-dbe6-bbbf-1f85-3a0fe76863dc',293,NULL,'2024-01-05 00:08:19'),('e235005b-166f-773e-82a1-3a0fec8facfc',361,NULL,'2024-01-06 00:09:19'),('eb61771f-0220-a2d1-461b-3a100b971dde',184,NULL,'2024-01-12 00:45:41'),('fbb4119a-52d3-c43e-b0af-3a0fe23c3c7e',501,NULL,'2024-01-04 00:01:59'),('fe09d95b-254d-0ed0-1fb5-3a0fb4064fdc',336,NULL,'2023-12-26 00:40:33'),('ff7de823-d3d4-178f-2513-3a0f8ac06a11',401,NULL,'2023-12-18 00:19:46'); -/*!40000 ALTER TABLE `AccessLog` ENABLE KEYS */; - --- --- Definition of Agree --- - -DROP TABLE IF EXISTS `Agree`; -CREATE TABLE IF NOT EXISTS `Agree` ( - `Id` varchar(36) NOT NULL, - `CreationTime` datetime NOT NULL, - `DiscussId` varchar(36) NOT NULL COMMENT '主题id', - `CreatorId` varchar(36) DEFAULT NULL COMMENT '创建者', - PRIMARY KEY (`Id`), - KEY `index_CreatorId_DiscussId` (`CreatorId`,`DiscussId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; - --- --- Dumping data for table Agree --- - -/*!40000 ALTER TABLE `Agree` DISABLE KEYS */; -INSERT INTO `Agree`(`Id`,`CreationTime`,`DiscussId`,`CreatorId`) VALUES('079ba80b-9ab0-10b5-205b-3a0ff53b765c','2024-01-07 16:33:55','f6462b48-9601-0253-6450-3a0ff538dfa4','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('079d6be1-fc03-638d-c64d-3a101cf4a56c','2024-01-15 09:41:23','aaa00329-7f35-d3fe-d258-3a0f8380b742','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('09dc0eaf-41c3-2ae9-4ac3-3a0ff9185ebe','2024-01-08 10:34:04','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('1150199e-c849-71c6-4224-3a0fe48da54e','2024-01-04 10:50:09','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('12ed9673-f42d-b719-78e3-3a1013d35309','2024-01-13 15:08:24','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('13381e5a-d7d6-1dd8-48df-3a0fdb0b9566','2024-01-02 14:31:30','fee1c7d4-999a-390a-d2a8-3a0fda7ed85f','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('163e10c6-fb5a-2655-8dac-3a0fead152b0','2024-01-05 16:01:47','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','9ce9ce71-c3ef-0bd0-1e1a-3a0fead09645'),('1c3de122-d7cc-76da-8703-3a1009a26dd3','2024-01-11 15:38:48','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','cfa14797-eb98-cbdf-f4de-3a1009a1c9af'),('2322e99c-5d33-77b2-c236-3a0fb1a2e91b','2023-12-25 13:32:44','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','4685a3e5-b7a5-33b8-b67d-3a0fb195641a'),('2d028e49-73ff-e771-6dc7-3a0fb6081862','2023-12-26 10:01:44','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('37c4c4a7-ceb1-d69e-27d8-3a1003357e06','2024-01-10 09:42:05','aaa00329-7f35-d3fe-d258-3a0f8380b742','ab7018b2-ad7d-835f-2d19-3a1003313e5a'),('427a5491-a69e-ca56-7da7-3a0fd6228373','2024-01-01 15:38:27','aaa00329-7f35-d3fe-d258-3a0f8380b742','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('453999dc-cbfc-2fd6-f3ec-3a0ff6a596a9','2024-01-07 23:09:28','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','98d7ce6a-37e1-a5b8-a877-3a0fdba5612e'),('474da6b6-d775-b448-8f94-3a0fb0aad5bc','2023-12-25 09:01:46','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','3de3e074-8ebc-9280-0d16-3a0fae1099ef'),('505edb56-ad3d-3205-40b3-3a0fb10f756f','2023-12-25 10:51:41','46850bb5-45c0-015d-53a5-3a0fb10f6a61','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('54d97aa3-9e0c-f7a5-8438-3a0fea909214','2024-01-05 14:51:04','e89c9593-f337-ada7-d108-3a0f83ae48e6','899ea329-a63f-bba9-0f68-3a0fea8fd365'),('59322173-31b8-1901-a87d-3a0ff592e996','2024-01-07 18:09:26','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('5cad1b76-7fba-2f5c-c256-3a0fff8a4b14','2024-01-09 16:36:14','aaa00329-7f35-d3fe-d258-3a0f8380b742','be3f42e6-e6ae-25ab-7973-3a0ffe0c6503'),('5d5206b0-fd8f-6371-057f-3a0fff949b20','2024-01-09 16:47:30','330d1540-45b0-9a84-880a-3a0fff93c9ad','be3f42e6-e6ae-25ab-7973-3a0ffe0c6503'),('648ab0d4-4669-207d-78a5-3a0fc5675e0d','2023-12-29 09:40:06','e89c9593-f337-ada7-d108-3a0f83ae48e6','313abacd-9a19-5dbd-d665-3a0fc564495a'),('679539d2-a258-f2d3-e5fc-3a0fae87bcd2','2023-12-24 23:04:12','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('775db22e-180e-8e0a-b689-3a0fe41e8837','2024-01-04 08:48:47','46850bb5-45c0-015d-53a5-3a0fb10f6a61','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('7d614c80-59af-7102-e805-3a0fb5f0e3e6','2023-12-26 09:36:24','252ad40f-be77-3bc6-e31f-3a0fb1718e26','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('8abcc2a3-a2a6-cb47-a0be-3a0ff4bc385e','2024-01-07 14:14:56','aaa00329-7f35-d3fe-d258-3a0f8380b742','ae04a0b3-3e0a-99bf-bcb0-3a0ff4bbeee4'),('8bdd64ea-c450-e172-47ca-3a0fae87c9f2','2023-12-24 23:04:15','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('95938a60-3f2f-77c1-7020-3a0fae87480a','2023-12-24 23:03:42','7d4aa766-d97b-a395-7fc7-3a0fae13ca30','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('976822bc-ffc7-05e2-6ada-3a0fe02ebbfd','2024-01-03 14:28:00','37496047-2805-dda9-a94f-3a0fe02c7ffa','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('a34bf6a5-fd35-7c0e-d732-3a101cf77fb3','2024-01-15 09:44:30','f6462b48-9601-0253-6450-3a0ff538dfa4','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('a6359e75-ab80-f44f-5fe2-3a0fdac1daa5','2024-01-02 13:10:58','aaa00329-7f35-d3fe-d258-3a0f8380b742','84f17d54-d35b-5581-e5d3-3a0fdabcaeae'),('ac688476-e1dc-e540-01d2-3a0fb6080c77','2023-12-26 10:01:41','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('b1c06a2a-6c90-b831-ef93-3a0fb60814a5','2023-12-26 10:01:43','e89c9593-f337-ada7-d108-3a0f83ae48e6','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('b370482f-4db8-e1d1-17cf-3a0fae87c25b','2023-12-24 23:04:13','e89c9593-f337-ada7-d108-3a0f83ae48e6','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('b5004b17-238d-e00d-bd9f-3a0fb8d5dd02','2023-12-26 23:05:44','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('cc163291-0d98-4e08-f74e-3a0fdf2a67d2','2024-01-03 09:43:39','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','59cf7e31-e3e4-544e-1038-3a0f836cc538'),('cf187b0f-3a15-8ae7-bd93-3a101d20d5d0','2024-01-15 10:29:39','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('cf767005-9201-6abd-e55e-3a100b41d52d','2024-01-11 23:12:32','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','eeb2b210-3f18-e3a6-fd89-3a100b40bc07'),('e431be80-e23a-ea16-0186-3a0fe1ff6939','2024-01-03 22:55:33','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','2d407f53-71c5-b2b6-ccdd-3a0fe1fed2a0'),('fbe8b6bb-8c25-e0c6-9546-3a0fffb36f7b','2024-01-09 17:21:10','37496047-2805-dda9-a94f-3a0fe02c7ffa','69371804-7f8b-2f4d-d9b3-3a0fb0adfcde'),('fda4f102-267f-f4ab-aec9-3a0fe47f1d6f','2024-01-04 10:34:16','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','98d7ce6a-37e1-a5b8-a877-3a0fdba5612e'),('fe3c5555-b41b-8e52-2327-3a0fef7508e6','2024-01-06 13:39:05','e89c9593-f337-ada7-d108-3a0f83ae48e6','0a6a0afd-6a31-4729-0c76-3a0fb8d4f73c'),('fe7c3bd6-e6f1-0ec4-97d7-3a0fb73c5f2a','2023-12-26 15:38:27','aaa00329-7f35-d3fe-d258-3a0f8380b742','74b32e7e-4586-78ca-fd43-3a0fa9fbd640'),('fefdaed8-548b-870f-af45-3a0fdba2207a','2024-01-02 17:15:56','3e6d5b45-5095-7eae-cdf8-3a0fdb2bd515','59cf7e31-e3e4-544e-1038-3a0f836cc538'); -/*!40000 ALTER TABLE `Agree` ENABLE KEYS */; - --- --- Definition of Article --- - -DROP TABLE IF EXISTS `Article`; -CREATE TABLE IF NOT EXISTS `Article` ( - `Id` varchar(36) NOT NULL, - `IsDeleted` tinyint(1) NOT NULL, - `Content` longtext NOT NULL, - `Name` varchar(255) NOT NULL, - `DiscussId` varchar(36) NOT NULL, - `ParentId` varchar(36) NOT NULL, - `CreationTime` datetime NOT NULL, - `CreatorId` varchar(36) DEFAULT NULL, - `LastModifierId` varchar(36) DEFAULT NULL, - `LastModificationTime` datetime DEFAULT NULL, - `OrderNum` int NOT NULL COMMENT '排序', - PRIMARY KEY (`Id`), - KEY `index_Name` (`Name`), - KEY `index_ParentId` (`ParentId`), - KEY `index_DiscussId` (`DiscussId`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; - --- --- Dumping data for table Article --- - -/*!40000 ALTER TABLE `Article` DISABLE KEYS */; -INSERT INTO `Article`(`Id`,`IsDeleted`,`Content`,`Name`,`DiscussId`,`ParentId`,`CreationTime`,`CreatorId`,`LastModifierId`,`LastModificationTime`,`OrderNum`) VALUES('0104dd98-ea24-3c69-0aa6-3a0ff53f8685',0,'\r\n- [CSharp Pad](http://csharppad.com/) - 基于Web的C# REPL,具有出色的代码完成功能。 \r\n- [AzureCrawler](https://github.com/yagopv/AzureCrawler) - 为Angular、Ember、Durandal或任何JavaScript应用程序获取HTML快照的工具 \r\n- [CSScript](https://www.cs-script.net/) - CS-Script是一个基于CLR的脚本系统,使用C#作为编程语言。CS-Script目前针对Microsoft CLR (.NET 2.0/3.0/3.5/4.0/4.5)提供全面支持,同时在Mono上也有完全支持。它带有许多附加功能,如脚本托管。 \r\n- [CsvHelper](https://github.com/JoshClose/CsvHelper) - 用于帮助读取和写入CSV文件的库 [https://github.com/JoshClose/CsvHelper](https://github.com/JoshClose/CsvHelper) \r\n- [RecordParser](https://github.com/leandromoh/recordparser) - 用于帮助读取和写入零堆分配的CSV和Flat文件的库。 \r\n- [Hashids.net](https://github.com/ullmark/hashids.net) - 从整数生成短唯一ID,如[https://hashids.org](https://hashids.org/) \r\n- [ConsoleTableExt](https://github.com/minhhungit/ConsoleTableExt) - 用于创建.NET控制台应用程序的表格的流利库。 \r\n- [FlatMapper](https://github.com/joaomatossilva/FlatMapper) - 以LINQ兼容的方式导入和导出纯文本文件的库。 \r\n- [FluentValidation](https://github.com/FluentValidation/FluentValidation) - 用于.NET的小型验证库,使用流利接口和Lambda表达式构建验证规则。 \r\n- [FormHelper](https://github.com/SinanBozkus/FormHelper) - 用于ASP.NET Core的表单和验证助手。Form Helper可帮助您创建Ajax表单和验证,无需编写任何JavaScript代码。(与Fluent Validation兼容) \r\n- [Guard](https://github.com/safakgur/guard) - 高性能、可扩展的参数验证库。 \r\n- [Valit](https://github.com/valit-stack/Valit) - Valit是一种性能优先的紧凑型高级模型验证库。 \r\n- [Validot](https://github.com/bartoszlenar/Validot) - Validot是一种性能优先的紧凑型高级模型验证库。使用简单的声明式流利接口,它有效地处理类、结构、嵌套成员、集合、可为null的值,以及任何关系或组合。它还支持翻译、带测试的自定义逻辑扩展以及DI容器。 \r\n- [Humanizer](https://github.com/Humanizr/Humanizer) - Humanizer可以满足您在操作和显示字符串、枚举、日期、时间、时间跨度、数字和数量方面的所有.NET需求。 \r\n- [LINQPad](https://www.linqpad.net/) - 一个C#/VB/F#草稿本,可立即执行任何表达式、语句块或程序,具有丰富的输出格式和丰富的功能。还可以在LINQ中交互查询数据库。[$] \r\n- [LINQPad.QueryPlanVisualizer](https://github.com/Giorgi/LINQPad.QueryPlanVisualizer/) - 直接在LINQPad内查看SQL Server和Postgres查询计划。 \r\n- [Polly](https://github.com/App-vNext/Polly) - 以流利的方式表达瞬态异常处理和弹性策略,如重试、等待和重试、断路器以及舱壁隔离。 \r\n- [Rant](https://github.com/TheBerkin/rant3) - Rant过程化文本生成DSL \r\n- [ScriptCS](https://github.com/scriptcs/scriptcs) - 使用文本编辑器、NuGet和Roslyn的C#应用程序编写! \r\n- [Shielded](https://github.com/jbakic/Shielded) - 用于.NET的软件事务内存(STM)实现 \r\n- [MSBuild ILMerge task](https://archive.codeplex.com/?p=ilmergemsbuild) - MSBuild ILMerge任务是一个NuGet包,允许您在自动化构建和/或Visual Studio项目中使用著名的ILMerge工具。 \r\n- [ReactJS.NET](https://github.com/reactjs/React.NET) - ReactJS.NET是一个库,使得使用Babel与Facebook的React和JSX更容易从C#中使用。 \r\n- [Aeron.NET](https://github.com/AdaptiveConsulting/Aeron.NET) - 高效可靠的UDP单播、UDP多播和IPC消息传输 - Aeron的.NET端口 \r\n- [TypeShape](https://github.com/eiriktsarpalis/TypeShape) - TypeShape是一个小型、可扩展的F#库,用于实际的通用编程 \r\n- [Streams](https://github.com/nessos/Streams) - 用于流数据的高效函数式风格管道的轻量级F#/C#库。 \r\n- [Warden](https://github.com/warden-stack/Warden) - 为您的应用程序、资源和基础架构定义“健康检查”。保持您的Warden监视 \r\n- [ByteSize](https://github.com/omar/ByteSize) - ByteSize是一个实用程序类,通过消除值的二义性,使代码中的字节大小表示更容易。ByteSize对字节的表示方式类似于System.TimeSpan对时间的表示方式。 \r\n- [Jot](https://github.com/anakic/jot) - 用于持久化和还原应用程序状态的库(.settings文件的更好替代品)。 \r\n- [Enums.NET](https://github.com/TylerBrinkley/Enums.NET) - Enums.NET是一个高性能的类型安全.NET枚举实用库。 \r\n- [HidLibrary](https://github.com/mikeobrien/HidLibrary) - 该库使您能够在.NET中枚举和与Hid兼容的USB设备进行通信。 \r\n- [SystemWrapper](https://github.com/jozefizso/SystemWrapper) - SystemWrapper是.NET库,用于更轻松地测试系统API。 \r\n- [YoutubeExplode](https://github.com/Tyrrrz/YoutubeExplode) - 提取元数据和下载Youtube视频和播放列表的终极库。 \r\n- [DeviceId](https://github.com/MatthewKing/DeviceId) - 生成可用于唯一标识计算机的“设备ID”。 \r\n- [DeviceDetector.NET](https://github.com/totpero/DeviceDetector.NET) - 通用设备检测库将解析任何用户代理并检测浏览器、操作系统、所使用的设备(台式机、平板电脑、移动设备、电视、汽车等)、品牌和型号。 \r\n- [NaturalSort.Extension](https://github.com/tompazourek/NaturalSort.Extension) - 为StringComparer添加自然排序支持(例如,\"abc1\"、\"abc2\"、\"abc10\",而不是\"abc1\"、\"abc10\"、\"abc2\")的扩展方法。 \r\n- [Coravel](https://github.com/jamesmh/coravel) - 用于任务调度、缓存、排队、邮件、事件广播(等等)的.NET Core库,几乎不需要配置! \r\n- [Quickenshtein](https://github.com/Turnerj/Quickenshtein) - 一种极快且内存效率高的Levenshtein距离计算器,支持SIMD和多线程。 \r\n- [Infinity Crawler](https://github.com/TurnerSoftware/InfinityCrawler) - 一个简单但功能强大的.NET的网络爬虫库 \r\n- [Build Versioning](https://github.com/TurnerSoftware/BuildVersioning) - 用于.NET的简单构建版本控制,由Git标签提供支持 \r\n- [SystemTextJson.JsonDiffPatch](https://github.com/weichch/system-text-json-jsondiffpatch) - 用于System.Text.Json的高性能、低分配的JSON对象差异和补丁扩展。支持以RFC 6902 JSON Patch格式生成补丁文档。\r\n* [.NET-libraries-that-make-your-life-easier](https://github.com/tallesl/net-libraries-that-make-your-life-easier) - 开源的.NET库,让你的生活更轻松\r\n* [awesome-LINQ](https://github.com/aloisdg/awesome-linq) - 精选的出色LINQ库、工具和更多资源集合。\r\n* [awesome-analyzers](https://github.com/Cybermaxs/awesome-analyzers) - 一个精选的.NET编译器平台(\"Roslyn\")诊断分析器和代码修复工具列表。\r\n* [C# Algorithms, Data Structures](https://github.com/aalhour/C-Sharp-Algorithms) - C#算法和数据结构实现列表。\r\n* [Awesome .NET Core](https://github.com/thangchung/awesome-dotnet-core) - 一个出色的.NET Core库、工具、框架和软件集合。\r\n* [ASP.NET Core Library and Framework Support](https://github.com/jpsingleton/ANCLAFS) - 列出了ASP.NET Core和.NET Core当前支持的.NET库和框架。\r\n* [Awesome .NET Performance](https://github.com/adamsitnik/awesome-dot-net-performance) - 一个精选的出色.NET性能书籍、课程、培训、会议演讲、博客以及最具启发性的开源贡献者列表。\r\n* [awesome-ddd](https://github.com/heynickc/awesome-ddd) - 领域驱动设计(DDD)、命令查询责任分离(CQRS)、事件溯源和事件风暴资源的精选列表。\r\n* [Awesome Unity](https://github.com/RyanNielson/awesome-unity) - 高质量、社区驱动的Unity资源、项目和工具的分类集合。\r\n* [Awesome Xamarin](https://github.com/XamSome/awesome-xamarin) - 用于Xamarin移动项目的有趣库和工具的集合。\r\n* [Awesome Roslyn](https://github.com/ironcev/awesome-roslyn) - 一个精选的出色Roslyn书籍、教程、开源项目、分析器、代码修复和重构列表。\r\n* [.NET Open Source Developer Projects](https://github.com/Microsoft/dotnet/blob/master/dotnet-developer-projects.md) - 这个由社区维护的列表展示了对开发过程的各个方面都有用的.NET开源项目。\r\n* [Awesome Microservices .NET Core](https://github.com/mjebrahimi/Awesome-Microservices-NetCore) - 一个出色的Microservices在.NET Core中的培训系列、文章、视频、书籍、课程、示例项目和工具的集合。\r\n* [dotnet-console-games](https://github.com/dotnet/dotnet-console-games) - 在.NET控制台应用程序中实现的游戏示例。','其他','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,111),('0156f8b4-d1c0-2b7f-1052-3a0ff53f8681',0,'- [Paypal Merchant SDK](https://github.com/paypal/merchant-sdk-dotnet) - 官方的.NET PayPal Merchant SDK \r\n- [NopCommerce](https://github.com/nopSolutions/nopCommerce) - nopCommerce。免费的开源电子商务购物车(ASP.NET Core) \r\n- [ServiceStack.Stripe](https://github.com/ServiceStack/Stripe) - stripe.com REST API的.NET客户端 \r\n- [SmartStoreNET](https://github.com/smartstore/SmartStoreNET) - 免费的ASP.NET MVC电子商务购物车解决方案 \r\n- [Stripe.Net](https://github.com/stripe/stripe-dotnet) - Stripe.net是[https://stripe.com/的全功能.NET](https://stripe.com/%E7%9A%84%E5%85%A8%E5%8A%9F%E8%83%BD.NET) API \r\n- [Virto Commerce](https://github.com/VirtoCommerce/vc-platform) - Virto Commerce是第二代发布的唯一一款完全基于开源许可下可用的企业级电子商务产品。Virto Commerce基于.NET 4.5,广泛使用MVC、IoC、EF、Azure、AngularJS等尖端技术。它可以部署在Microsoft Cloud(Azure)、Amazon Web Services(AWS)和本地环境中。[https://virtocommerce.com](https://virtocommerce.com/) \r\n- [SimplCommerce](https://github.com/simplcommerce/simplcommerce) - 基于.NET Core构建的超级简单电子商务系统。易于使用和易于定制。由于.NET Core,您可以在Windows、Linux上运行SimplCommerce。支持各种RDBMS:Microsoft SQL Server、PostgreSQL、MySQL \r\n- [GrandNode](https://github.com/grandnode/grandnode2) - 基于.NET Core 5.0和MongoDB的头部、多供应商、多租户的最先进的开源电子商务平台。 \r\n- [Square](https://github.com/square/connect-csharp-sdk) - Square支付和其他Square API的官方SDK。 \r\n- [Adyen](https://github.com/Adyen/adyen-dotnet-api-library) - 官方的Adyen Payment API Library for .NET。','电商支付','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,38),('01753787-da18-b28f-d697-3a0ff53f8682',0,'\r\n- [.NET Micro Framework 解释器](https://github.com/NETMF/netmf-interpreter) - Microsoft® .NET Micro Framework (NETMF),用于在小型设备上使用Visual Studio开发嵌入式应用程序的框架。','微型框架','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,69),('022bef00-2afb-9c35-8ec1-3a0fe9b5b449',0,'C# 中的异常是指程序在运行时遇到意外情况时产生的错误。通常情况下,当程序出现异常时,它将停止运行并抛出异常。为了防止程序崩溃并使程序更加健壮,我们需要使用异常处理技术。\r\n## 异常处理语法\r\n\r\nC# 中的异常处理使用 try-catch 块。try 块中包含可能抛出异常的代码,catch 块用于捕获并处理异常。\r\n\r\n```csharp\r\n\r\ntry\r\n{\r\n // 可能抛出异常的代码\r\n}\r\ncatch (ExceptionType1 ex1)\r\n{\r\n // 处理 ExceptionType1 类型的异常\r\n}\r\ncatch (ExceptionType2 ex2)\r\n{\r\n // 处理 ExceptionType2 类型的异常\r\n}\r\nfinally\r\n{\r\n // 在 try/catch 块之后执行的代码,不管是否出现异常都会执行\r\n}\r\n```\r\n\r\n\r\n\r\n其中,try 块是必需的,catch 和 finally 块都是可选的。在 try 块中,如果代码抛出异常,程序将立即跳转到最近的 catch 块中。如果 try 块中的代码没有抛出异常,则程序将跳过 catch 块并执行 finally 块中的代码。\r\n## 异常类型\r\n\r\n在 C# 中有许多不同的异常类型。每种异常类型都表示不同的错误情况。以下是一些常见的异常类型:\r\n\r\n- System.Exception:所有异常的基类。\r\n- System.ArgumentException:表示参数无效。\r\n- System.NullReferenceException:表示尝试访问空对象时出错。\r\n- System.IndexOutOfRangeException:表示索引超出范围。\r\n- System.IO.IOException:表示输入/输出错误。\r\n- System.FormatException:表示格式不正确。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 try-catch 块的示例代码:\r\n\r\n```csharp\r\n\r\ntry\r\n{\r\n int a = 10;\r\n int b = 0;\r\n int c = a / b;\r\n}\r\ncatch (DivideByZeroException ex)\r\n{\r\n Console.WriteLine(\"除数不能为零\");\r\n}\r\nfinally\r\n{\r\n Console.WriteLine(\"程序结束\");\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们尝试将 10 除以 0。这将导致 DivideByZeroException 异常。由于我们使用了 try-catch 块,程序将不会崩溃并且会打印出“除数不能为零”的错误信息,然后执行 finally 块中的代码,输出“程序结束”。\r\n## 自定义异常\r\n\r\n除了使用内置的异常类型之外,我们还可以定义自己的异常类型。我们可以创建一个继承自 System.Exception 的类,然后使用它来表示我们程序中的特定错误情况。\r\n\r\n以下是一个自定义异常类型的示例代码:\r\n\r\n```csharp\r\n\r\npublic class MyException : Exception\r\n{\r\n public MyException(string message) : base(message)\r\n {\r\n }\r\n}\r\n\r\ntry\r\n{\r\n throw new MyException(\"自定义异常\");\r\n}\r\ncatch (MyException ex)\r\n{\r\n Console.WriteLine(ex.Message);\r\n}\r\nfinally\r\n{\r\n Console.WriteLine(\"程序结束\");\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个名为 MyException 的自定义异常类型。它继承自 Exception 类,并包含一个构造函数,用于接受异常消息。\r\n\r\n然后,在 try 块中,我们使用 throw 语句抛出一个新的 MyException 异常。这将跳转到最近的 catch 块中,我们可以将其捕获并处理。在这里,我们只是简单地输出了异常消息。\r\n\r\n最后,我们执行 finally 块中的代码,输出“程序结束”。\r\n## 总结\r\n\r\n异常处理是 C# 程序设计中非常重要的一部分。通过使用 try-catch 块,我们可以在程序出现意外情况时捕获并处理异常,使程序更加健壮。同时,我们还可以使用自定义异常类型来表示程序中的特定错误情况。\r\n','C# 异常处理','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,27),('02b5b80f-45d8-a47f-c35b-3a0ff53f8683',0,'\r\n- [PushSharp](https://github.com/Redth/PushSharp) - 用于向iOS、OSX、Android、Chrome、Windows Phone、Windows 8、Blackberry和Amazon设备发送推送通知的服务器端库。','推送通知','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,81),('03211927-fca5-84ae-b575-3a0ff53f8684',0,'* [Sprache](https://github.com/sprache/Sprache) - 一个简单、轻量级的库,可在C#代码中直接构建解析器。\r\n* [Pidgin](https://github.com/benjamin-hodgson/Pidgin) - 一个轻量、快速且灵活的C#解析库,由Stack Overflow开发。\r\n* [FParsec](https://github.com/stephan-tolksdorf/fparsec) - 一个用于F#的解析器组合库。\r\n* [Superpower](https://github.com/datalust/superpower) - 一个C#解析器构建工具包,具有高质量的错误报告功能。\r\n* [CSLY](https://github.com/b3b00/CSLY) - 一个轻量的嵌入式C#词法分析器/解析器生成器。','解析器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,109),('047627b4-0fd7-8fb0-cb10-3a0fe7638b2c',1,'\r\n## 简介\r\n\r\n要开始使用 C# 进行开发,需要先搭建好开发环境。本文将介绍如何在 Windows 系统下安装并配置 C# 开发环境。\r\n\r\n## 安装 .NET SDK\r\n\r\n首先需要安装 .NET SDK,它是一个开发工具包,包括了用于开发 C# 应用程序所需的运行时、库和工具。 \r\n\r\n1. 前往 [.NET 官网](https://dotnet.microsoft.com/download/dotnet) 下载最新的 .NET SDK 安装程序。 \r\n2. 双击安装程序,按照提示进行安装。在安装过程中需要注意选择安装路径和安装的版本,可以选择安装多个版本的 .NET SDK。 \r\n3. 安装完成后,打开命令提示符或 PowerShell 窗口,输入以下命令来验证是否安装成功:\r\n\r\n```bash\r\ndotnet --version\r\n```\r\n\r\n如果能够输出正确的版本号,则说明安装成功。\r\n## 安装开发环境\r\n\r\nC# 开发可以使用多种开发环境,包括 Visual Studio、Visual Studio Code、Rider 等等。其中,Visual Studio 是最为常用的 C# 开发环境之一。\r\n### 安装 Visual Studio \r\n1. 前往 [Visual Studio 官网](https://visualstudio.microsoft.com/vs/) 下载 Visual Studio 安装程序。 \r\n2. 双击安装程序,按照提示进行安装。在安装过程中需要注意选择安装的组件,可以根据自己的需要进行选择。\r\n### 安装 Visual Studio Code \r\n1. 前往 [Visual Studio Code 官网](https://code.visualstudio.com/) 下载 Visual Studio Code 安装程序。 \r\n2. 双击安装程序,按照提示进行安装。在安装过程中需要注意选择安装的组件,可以根据自己的需要进行选择。\r\n## 配置开发环境\r\n\r\n无论使用哪种开发环境,都需要配置 C# 扩展和编译器。\r\n### 配置 Visual Studio \r\n1. 打开 Visual Studio,点击 \"文件\" -> \"新建\" -> \"项目\"。 \r\n2. 在弹出的对话框中,选择 \"C#\" -> \"控制台应用程序\",然后选择项目名称和存储位置,最后点击 \"创建\"。 \r\n3. 在项目中添加新的 C# 文件,然后在其中编写代码。 \r\n4. 点击 \"生成\" -> \"生成解决方案\",将代码编译成可执行文件。\r\n### 配置 Visual Studio Code \r\n1. 打开 Visual Studio Code,安装 \"C#\" 扩展。 \r\n2. 打开项目文件夹,然后在其中添加新的 C# 文件,然后在其中编写代码。 \r\n3. 打开终端窗口,输入以下命令来编译代码:\r\n\r\n```bash\r\ndotnet build\r\n```\r\n\r\n\r\n\r\n如果编译成功,则会在项目文件夹中生成可执行文件。\r\n## 示例代码\r\n\r\n下面是一个\r\n\r\n- 使用 Visual Studio Code 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在 Visual Studio Code 中保存文件后,可以在终端窗口中输入以下命令来运行程序:\r\n\r\n```bash\r\n\r\ndotnet run\r\n```\r\n\r\n\r\n\r\n程序会在终端窗口中输出 \"Hello, World!\" 字符串。\r\n\r\n至此,你已经成功搭建了 C# 的开发环境,并编写了第一个 C# 程序。','C# 环境','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-05 00:03:01',NULL,'74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-05 00:05:16',0),('04f04717-ed78-66a2-07b1-3a0ff53ad54c',0,'\r\n**1、nginx是如何实现高并发的?**\r\n\r\n答:一个主进程,多个工作进程,每个工作进程可以处理多个请求,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker继续处理其他请求,而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即@skoo所说的webserver刚好属于网络io密集型应用,不算是计算密集型。\r\n\r\n**2、Nginx如何处理HTTP请求?**\r\n\r\n答:Nginx使用反应器模式。主事件循环等待操作系统发出准备事件的信号,这样数据就可以从套接字读取,在该实例中读取到缓冲区并进行处理。单个线程可以提供数万个并发连接。\r\n\r\n**3、使用“反向代理服务器”的优点是什么?**\r\n\r\n答:反向代理服务器可以隐藏源服务器的存在和特征。它充当互联网云和web服务器之间的中间层。这对于安全方面来说是很好的,特别是当您使用web托管服务时。\r\n\r\n**4、列举Nginx服务器的最佳用途。**\r\n\r\n答:Nginx服务器的最佳用法是在网络上部署动态HTTP内容,使用SCGI、WSGI应用程序服务器、用于脚本的FastCGI处理程序。它还可以作为负载均衡器。\r\n\r\n**5、Nginx服务器上的Master和Worker进程分别是什么?**\r\n\r\n答:Master进程:读取及评估配置和维持 ;Worker进程:处理请求。\r\n\r\n**6、什么是C10K问题?**\r\n\r\n答:C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。\r\n\r\n**7、请陈述stub_status和sub_filter指令的作用是什么?**\r\n\r\n答:(1)Stub_status指令:该指令用于了解Nginx当前状态的当前状态,如当前的活动连接,接受和处理当前读/写/等待连接的总数 ;(2)Sub_filter指令:它用于搜索和替换响应中的内容,并快速修复陈旧的数据\r\n\r\n**8、为什么不使用多线程?**\r\n\r\n答:Nginx:采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换,所以才使得Nginx支持更高的并发。\r\n\r\n**9、为什么要做动、静分离?**\r\n\r\n答:在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js等等),这些不需要经过后台处理的文件称为静态文件,否则动态文件。因此我们后台处理忽略静态文件,但是如果直接忽略静态文件的话,后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS等)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。这里将静态资源放到nginx中,动态资源转发到[tomcat](https://www.wkcto.com/courses/tomcat.html)服务器中,毕竟Tomcat的优势是处理动态请求。\r\n\r\n**10、ngx_http_upstream_module的作用是什么?**\r\n\r\n答:要在URL中保留双斜线,就必须使用merge_slashes_off;语法:merge_slashes [on/off] ; 默认值: merge_slashes on ;环境: http,server','Nginx面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,6),('068f3494-3fa5-aca0-96d9-3a0fdc9d3d46',0,'## 11日\n1.Yi.Abp开发仓库全部`迁移`至Yi仓库中\n\n## 12日\n1.完成`文章`Crud增删改查功能模块\n2.完成`主题`Crud增删改查功能模块\n3.修复`主题列表`总数错误问题\n\n## 13日\n1.完成全站`搜索`功能\n2.完善`头像`默认功能\n3.完成`评论`的功能模块\n\n## 14日\n1.首页`接口`设计\n2.首页`推荐分类`动态来自接口\n\n## 15日\n1.完善`点赞功能`的登录跳转\n2.支持`评论`的删除功能\n3.修复`访问趋势`的横坐标显示\n4.修复`文档`编辑功能\n\n## 16日\n1.支持文章的`面包屑`跳转\n2.修复首页进入`站点显示为空`问题\n3.支持`注册`功能模块\n\n## 17日\n1.支持`主题文章`的权限模块\n2.`登录注册`页面全部重做\n\n## 18日\n1.完善`首页板块`置顶功能\n2.完善`主题列表`显示功能\n3.新增`用户限制`功能模块\n\n## 19日\n1.完成后台的`板块`编辑功能\n2.完成后台的`主题`编辑功能\n3.完成数据`自动备份`功能\n4.完善文章及主题的`权限功能`\n\n## 20日\n1.完成是`否允许评论`设置\n2.完成第一版本`板块的设计`\n3.完成首页`top主题`展示\n4.修复登录`验证码`刷新问题\n5.修复`主题发布`权限问题\n\n## 21日\n1.完善`禁止发布主题`的板块右上角显示\n2.完善`未登录头像`显示状态\n\n## 22日\n1.修复`点赞人数`的问题\n2.修复`文章背景`显示不全样式错误问题\n\n## 23日\n1.修复`注册`完成后跳转登录功能\n2.修复`评论显示`错误问题\n3.修复`文章添加`子文章功能\n\n## 24日\n1.修复进入`个人中心`保存信息后没有立即生效或保存后跳到首页\n2.修复个人中心`性别`更改显示问题\n\n## 25日\n1.添加`联系我们`的页面跳转功能\n2.支持个人中心`头像`在线选择功能\n\n## 26日\n1.新增`页面加载`的动画渲染\n2.新增`本月排行`功能\n3.新增`推荐用户`功能\n4.新增`推荐主题`功能\n\n## 27日\n1.修复排行榜`头像`显示问题\n\n## 28日\n1.完善token过期后,`自动跳转`登录的用户体验\n\n## 29日\n元旦喽~','2023年12月','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','00000000-0000-0000-0000-000000000000','2024-01-02 21:50:13','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2024-01-02 22:08:46',0),('06e932a1-8bec-235f-4480-3a0fe9b5b449',0,'\r\n当我们在编写 C# 代码时,变量是非常重要的一个概念。一个变量可以被看作是程序中存储值的容器。在 C# 中,变量可以存储多种不同类型的数据,包括整数、浮点数、布尔值和字符串等。\r\n### 定义变量\r\n\r\n在 C# 中,定义一个变量需要指定变量的类型,并给变量取一个名字。变量名必须以字母或下划线开头,并且不能包含空格或特殊字符。\r\n\r\n以下是定义一个整数变量的示例代码:\r\n\r\n```csharp\r\n\r\nint num = 42;\r\n```\r\n\r\n\r\n\r\n在上面的代码中,我们定义了一个名为 `num` 的整数变量,并将其初始化为 42。在变量名后面的等号表示给变量赋值的操作。\r\n\r\n我们还可以定义一个空的变量,如下所示:\r\n\r\n```csharp\r\n\r\nint num;\r\n```\r\n\r\n\r\n\r\n在上面的代码中,我们定义了一个名为 `num` 的整数变量,但没有给它赋初值。这样的变量称为未初始化变量。在使用未初始化变量时,可能会引发错误。\r\n### 变量类型\r\n\r\nC# 中有多种不同类型的变量。下面列出了一些常用的变量类型及其用途: \r\n- `int`:用于存储整数值。 \r\n- `float`:用于存储浮点数值。 \r\n- `double`:用于存储双精度浮点数值。 \r\n- `bool`:用于存储布尔值(true 或 false)。 \r\n- `string`:用于存储字符串值。 \r\n- `char`:用于存储单个字符。\r\n\r\n以下是一些定义不同类型变量的示例代码:\r\n\r\n```csharp\r\n\r\nint num = 42;\r\nfloat num2 = 3.14f;\r\ndouble num3 = 2.71828;\r\nbool flag = true;\r\nstring message = \"Hello, world!\";\r\nchar c = ''A'';\r\n```\r\n\r\n\r\n\r\n在上面的代码中,我们分别定义了一个整数变量 `num`、一个浮点数变量 `num2`、一个双精度浮点数变量 `num3`、一个布尔值变量 `flag`、一个字符串变量 `message` 和一个字符变量 `c`。\r\n### 变量作用域\r\n\r\n在 C# 中,变量的作用域指的是变量在程序中可见的范围。在定义一个变量时,需要确定该变量的作用域。一般来说,变量的作用域可以分为以下几种:\r\n- 局部变量:在一个代码块内定义的变量。它们只在该代码块内可见,不能被其他代码块访问。\r\n- 全局变量:在程序的任何地方定义的变量。它们可以被程序中的所有代码块访问。\r\n\r\n以下是一个定义局部变量和全局变量的示例代码:\r\n\r\n```csharp\r\n\r\nclass MyClass {\r\n int num = 42; // 定义\r\n\r\n void MyMethod() {\r\n int num2 = 10; // 定义局部变量\r\n }\r\n```\r\n\r\n\r\n\r\n}\r\n\r\n在上面的代码中,我们定义了一个名为 `num` 的类成员变量和一个名为 `num2` 的方法局部变量。`num` 是一个全局变量,可以被类中的任何方法访问。`num2` 是一个局部变量,只能在 `MyMethod` 方法中访问。\r\n### 变量命名规则\r\n\r\n在 C# 中,变量名必须遵循一些命名规则。以下是一些常见的命名规则:\r\n- 变量名必须以字母或下划线开头。\r\n- 变量名不能包含空格或特殊字符。\r\n- 变量名不能与 C# 关键字相同。\r\n- 变量名应该使用有意义的名称,以便其他开发人员能够理解变量的作用。\r\n\r\n以下是一些合法的变量名示例:\r\n\r\n```csharp\r\n\r\nint age;\r\nfloat price;\r\nstring firstName;\r\n```\r\n\r\n\r\n\r\n在上面的代码中,我们使用了合法的变量名 `age`、`price` 和 `firstName`。\r\n### 变量赋值\r\n\r\n在 C# 中,变量赋值是指将一个值存储到变量中。我们可以在定义变量时进行赋值,也可以在之后的代码中对变量进行赋值。\r\n\r\n以下是一些赋值示例代码:\r\n\r\n```csharp\r\n\r\nint num = 42; // 定义变量并赋值\r\nnum = 10; // 修改变量的值\r\n```\r\n\r\n\r\n\r\n在上面的代码中,我们首先定义了一个名为 `num` 的整数变量,并将其初始化为 42。然后,我们将变量的值修改为 10。\r\n### 总结\r\n\r\n本文介绍了 C# 中变量的定义、类型、作用域、命名规则和赋值等基本概念。掌握了这些概念,你就能够在 C# 中使用变量存储和操作数据了。\r\n','C# 变量','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,7),('076b1e8a-0869-9f4b-d0a9-3a0ff544b11d',0,'![image.png](/prod-api/file/203844ba-323a-65ee-c079-3a0ff544a327/true)','依赖注入','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:44:00','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('07b22748-8108-3a98-338f-3a0ff53f8682',0,'- [CSCore](https://github.com/filoe/cscore) - 高级音频库,支持实时音频数据的播放/录制、解码/编码和处理(效果、可视化等)。 \r\n- [TagLib#](https://github.com/mono/taglib-sharp) - TagLib#(又称taglib-sharp)是一个用于读取和写入媒体文件中的元数据的库,包括视频、音频和照片格式。 \r\n- [LibVLCSharp](https://github.com/videolan/libvlcsharp) - libvlc 的 Xamarin 绑定,是 VideoLAN 制作的 VLC 应用程序所使用的多媒体框架。 \r\n- [NAudio](https://github.com/naudio/NAudio) - 支持多种文件格式(如 MP3、MP4、WAV、AIFF、Speex 等)的音频播放、解码和编码库。 \r\n- [Xabe.FFmpeg](https://github.com/tomaszzmuda/Xabe.FFmpeg) - FFmpeg 的 .NET Standard 包装器。它允许在不了解 FFmpeg 如何工作的情况下处理媒体,并可以用于从 C# 应用程序传递自定义参数给 FFmpeg。【付费】 \r\n- [SeeShark](https://github.com/vignetteapp/SeeShark) - 使用 FFmpeg 支持超过190种像素格式的.NET跨平台相机库。\r\n- [MetadataExtractor](https://github.com/drewnoakes/metadata-extractor-dotnet) - 使用简单易用的API从媒体(图像,视频,音频)中提取元数据。','媒体','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,67),('08d36286-b047-7a98-29f7-3a0ff53f867f',0,'* [CosmosOS](https://github.com/CosmosOS/Cosmos) - Cosmos是操作系统的“构建工具包”。使用托管语言(例如C#,VB.NET等)构建自己的OS!','操作系统','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,4),('097bfcec-4b8a-1d91-71ac-3a0fe9b5b449',0,'在 C# 中读取文件的最基本方法是使用 System.IO 命名空间中的 StreamReader 类。StreamReader 类提供了一个方便的方法,用于从文件中读取字符流。以下是一份示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\nusing System.IO;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n string path = @\"C:\\example.txt\";\r\n \r\n // 创建一个 StreamReader 的实例来读取文件\r\n StreamReader reader = new StreamReader(path);\r\n\r\n // 读取文件的全部内容\r\n string contents = reader.ReadToEnd();\r\n\r\n // 关闭文件\r\n reader.Close();\r\n\r\n // 输出读取到的内容\r\n Console.WriteLine(contents);\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在这个示例中,我们首先创建了一个字符串变量来存储文件路径。然后,我们创建了一个 StreamReader 实例,并将其用于读取文件的全部内容。最后,我们关闭了文件,并将读取到的内容输出到控制台上。\r\n## 文件输出\r\n\r\n在 C# 中写入文件的最基本方法是使用 System.IO 命名空间中的 StreamWriter 类。StreamWriter 类提供了一个方便的方法,用于向文件中写入字符流。以下是一份示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\nusing System.IO;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n string path = @\"C:\\example.txt\";\r\n\r\n // 创建一个 StreamWriter 的实例来写入文件\r\n StreamWriter writer = new StreamWriter(path);\r\n\r\n // 写入一些内容到文件中\r\n writer.WriteLine(\"Hello, world!\");\r\n\r\n // 关闭文件\r\n writer.Close();\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在这个示例中,我们首先创建了一个字符串变量来存储文件路径。然后,我们创建了一个 StreamWriter 实例,并将其用于向文件中写入一些内容。最后,我们关闭了文件。\r\n## 处理文件输入和输出\r\n\r\n除了读取和写入文件之外,我们还可以在 C# 中处理文件输入和输出。一个常见的用例是按行读取文件并对每一行执行一些操作,然后将结果写入到另一个文件中。以下是一份示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\nusing System.IO;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n string inputPath = @\"C:\\input.txt\";\r\n string outputPath = @\"C:\\output.txt\";\r\n\r\n // 创建一个 StreamReader 的实例来读取文件\r\n StreamReader reader = new StreamReader(inputPath);\r\n\r\n // 创建一个 StreamWriter 的实例来写入文件\r\n StreamWriter writer = new StreamWriter(outputPath);\r\n\r\n // 读取文件的每一行并处理\r\n string line;\r\n while ((line = reader.ReadLine()) != null)\r\n {\r\n // 在这里处理每一行,例如计算行数、单词数等等\r\n int lineLength = line.Length;\r\n\r\n // 将处理结果写入到输出文件中\r\n writer.WriteLine($\"Length of line: {lineLength}\");\r\n }\r\n\r\n // 关闭文件\r\n reader.Close();\r\n writer.Close();\r\n }\r\n}\r\n```\r\n\r\n在这个示例中,我们首先创建了两个字符串变量来存储输入和输出文件的路径。然后,我们创建了一个 StreamReader 实例,用于读取输入文件,以及一个 StreamWriter 实例,用于写入输出文件。接下来,我们使用一个 while 循环来读取输入文件的每一行,并对每一行执行一些操作。在这个示例中,我们只是计算了每一行的长度,并将结果写入到输出文件中。\r\n\r\n最后,我们关闭了输入和输出文件,并结束了程序的执行。\r\n\r\n需要注意的是,在实际的开发中,我们通常需要使用 try-catch 块来捕获可能会抛出异常的文件操作。同时,我们也需要注意在处理文件输入和输出时可能会遇到的一些其他问题,例如编码问题、换行符问题等等。\r\n\r\n总之,C# 提供了丰富的文件操作功能,我们可以使用它们来读取、写入和处理文件。在实际的开发中,我们需要根据具体的需求来选择合适的文件操作方式,并注意处理可能出现的异常和问题。\r\n','C# 文件的输入与输出','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,28),('09bbbc5d-4b2c-8b69-8dd8-3a0ff53f8681',0,'\r\n- [Blzhawk](https://github.com/TASEmulators/BizHawk) - BizHawk是一个用C#编写的多系统模拟器。BizHawk为休闲玩家提供了一些不错的功能,例如全屏和手柄支持,还提供了所有系统核心的完整重新录制和调试工具。 \r\n- [Ryujinx](https://github.com/Ryujinx/Ryujinx) - 用C#编写的实验性任天堂Switch模拟器。','模拟器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,39),('0a0cb798-d950-44ce-9541-3a0ff53f8680',0,'\r\n- [.NET Fiddle](https://dotnetfiddle.net/) - 在浏览器中编写、编译和运行C#、F#和VB代码。它相当于JSFiddle的.NET版本。 \r\n- [Sharplab](https://sharplab.io/) - 使用不同的Roslyn分支和版本运行C#代码,查看生成的IL并检查JIT的输出。','代码片段','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,24),('0a16a81e-1201-48ce-a981-3a0f83ac968d',0,'## 简介\n> 工作单元模式是“维护一个被业务事务影响的对象列表,协调变化的写入和并发问题的解决”\n\n它的作用\n1. 事务相关\n2. 共用连接\n...\n\n## 如何使用\n依赖注入`IUnitOfWorkManager`,使用`CreateContext`创建一个`IUnitOfWork`工作单元\n在工作单元内部,可提交,回滚,获取仓储 \n``` cs\n bool IsTran { get; set; }\n bool IsCommit { get; set; }\n bool IsClose { get; set; }\n\n IRepository GetRepository();\n bool Commit();\n```\n\n> 注意,在除Get请求上,其他请求默认都开启了工作单元(post、put、delelte)\n\n## 完整例子\n``` cs\n private IUnitOfWorkManager _unitOfWorkManager { get; set; }\n public void Test()\n {\n using (var uow = _unitOfWorkManager.CreateContext())\n {\n //仓储执行各种操作\n\n //统一提交\n uow.Commit();\n }\n \n }\n```\n## 特性方式\n还可以通过`[UnitOfWork]`特性,打在方法上,该方法便会当作一个事务进行提交\n``` cs\n [UnitOfWork]\n public void Test()\n {\n //仓储执行各种操作\n }\n```\n\n','工作单元','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:20:46','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('0a283655-6ac5-61be-e263-3a0fe9b5b44a',0,'索引器是一种特殊的属性,它允许使用类似于数组的语法来访问对象的元素。它实际上是一个方法,可以通过类的实例名称后跟方括号中的索引来访问它。\r\n\r\nC# 中的索引器提供了一种方便的方法来访问和操作类中的元素,而不需要暴露类中的字段或属性。它们通常用于自定义集合类中,以允许使用类似于数组的语法来访问集合元素。\r\n## C# 索引器(Indexer)语法\r\n\r\n在 C# 中,索引器声明的语法如下所示:\r\n\r\n```csharp\r\n\r\naccess_modifier return_type this [ parameter_list ]\r\n{\r\n // get and/or set accessor implementation\r\n}\r\n```\r\n\r\n\r\n\r\n其中: \r\n- `access_modifier`:表示索引器的访问修饰符,可以是 public、private、protected、internal 或 protected internal。 \r\n- `return_type`:表示索引器的返回类型,可以是任何有效的类型,包括 void。 \r\n- `parameter_list`:表示索引器的参数列表,可以包含一个或多个参数,每个参数都必须有一个类型和一个名称。\r\n\r\n在索引器的访问器实现中,可以实现 get 访问器、set 访问器或两者都实现。它们的语法如下:\r\n\r\n```csharp\r\n\r\nget\r\n{\r\n // get accessor implementation\r\n}\r\n\r\nset\r\n{\r\n // set accessor implementation\r\n}\r\n```\r\n\r\n\r\n\r\n在 get 访问器中,可以通过返回值返回所需的元素。在 set 访问器中,可以使用 value 关键字来获取传递给访问器的值,并进行所需的操作。\r\n## C# 索引器(Indexer)示例\r\n\r\n以下是一个简单的示例,演示如何在 C# 中使用索引器访问对象的元素:\r\n\r\n```csharp\r\n\r\npublic class MyCollection\r\n{\r\n private string[] items = new string[10];\r\n\r\n public string this[int index]\r\n {\r\n get { return items[index]; }\r\n set { items[index] = value; }\r\n }\r\n}\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n MyCollection collection = new MyCollection();\r\n\r\n collection[0] = \"Item 1\";\r\n collection[1] = \"Item 2\";\r\n\r\n Console.WriteLine(collection[0]); // Output: Item 1\r\n Console.WriteLine(collection[1]); // Output: Item 2\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个名为 `MyCollection` 的类,它包含一个名为 `items` 的字符串数组。然后我们定义了一个名为 `this[int index]` 的索引器,它允许我们使用类似于数组的语法来访问和修改 `items` 数组中的元素。\r\n\r\n在 `Main` 方法中,我们创建了一个 `MyCollection` 实例,并使用索引器向集合中添加了两个元素。然后我们使用索引器读取并输出集合中的元素。\r\n## C# 索引器(Indexer)的注意事项\r\n\r\n以下是一些在使用 C# 索引器时需要注意的事项: \r\n- 索引器可以有多个参数,但它们的参数名必须不同。例如,`this[int i, int j]` 是有效的,但 `this[int i, int i]` 是无效的。 \r\n- 索引器可以重载,就像普通的方法一样。例如,我们可以定义一个名为 `this[string name]` 的索引器和一个名为 `this[int index]` 的索引器,它们都有不同的参数类型。\r\n- 如果只实现 get 访问器,则索引器是只读的。如果只实现 set 访问器,则索引器是只写的。如果两者都实现,则索引器是可读写的。\r\n- 索引器中的参数可以是 ref 或 out 类型。这使得我们可以在索引器内部修改参数的值,并在调用方的作用域内保留更改。\r\n- 索引器中的参数可以是可变参数。这使得我们可以使用任意数量的索引来访问对象的元素。\r\n## 结论\r\n\r\nC# 索引器提供了一种方便的方法来访问和操作对象的元素,而不需要暴露类中的字段或属性。它们通常用于自定义集合类中,以允许使用类似于数组的语法来访问集合元素。在实现索引器时,需要注意参数的类型和访问器的实现方式,以确保正确地访问和操作对象的元素。\r\n','C# 索引器(Indexer)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,32),('0a6ccf33-c680-ab36-c63e-3a0ff53f8680',0,'- [Stream](https://github.com/GetStream/stream-chat-net) 官方 .NET API 客户端,用于 Stream Chat,这是一个用于构建聊天应用程序的服务。','聊天','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,19),('0a710732-22ec-279c-5164-3a0fe9b5b44a',0,'C# 中的委托是一个指向方法的引用,允许我们像对象一样处理方法。通过委托,我们可以将方法作为参数传递给其他方法,也可以将方法保存在变量中,然后在需要时执行它。\r\n## 定义委托\r\n\r\n在 C# 中,委托定义使用 `delegate` 关键字,其语法如下:\r\n\r\n```csharp\r\n\r\ndelegate returnType delegateName(parameterList);\r\n```\r\n\r\n\r\n\r\n其中: \r\n- `returnType`:表示委托所引用的方法的返回类型。 \r\n- `delegateName`:表示委托的名称。 \r\n- `parameterList`:表示委托所引用的方法的参数列表。\r\n\r\n下面是一个示例代码,定义了一个委托 `CalculateDelegate`:\r\n\r\n```csharp\r\n\r\ndelegate int CalculateDelegate(int x, int y);\r\n```\r\n\r\n\r\n\r\n该委托引用的方法需要接受两个 int 类型的参数,返回一个 int 类型的值。\r\n## 创建委托实例\r\n\r\n创建委托实例的语法如下:\r\n\r\n```csharp\r\n\r\ndelegateName instanceName = new delegateName(methodName);\r\n```\r\n\r\n\r\n\r\n其中: \r\n- `delegateName`:表示委托的名称。 \r\n- `instanceName`:表示委托实例的名称。 \r\n- `methodName`:表示委托所引用的方法的名称。\r\n\r\n下面是一个示例代码,创建了一个委托实例 `addDelegate`,引用了一个名为 `Add` 的方法:\r\n\r\n```csharp\r\n\r\ndelegate int CalculateDelegate(int x, int y);\r\n\r\nclass Program\r\n{\r\n static int Add(int x, int y)\r\n {\r\n return x + y;\r\n }\r\n\r\n static void Main(string[] args)\r\n {\r\n CalculateDelegate addDelegate = new CalculateDelegate(Add);\r\n }\r\n}\r\n```\r\n\r\n\r\n## 调用委托\r\n\r\n通过委托实例,我们可以调用委托所引用的方法。委托实例的调用方式与方法调用方式类似,只需要使用委托实例的名称即可。下面是一个示例代码,调用了上述创建的委托实例:\r\n\r\n```csharp\r\n\r\ndelegate int CalculateDelegate(int x, int y);\r\n\r\nclass Program\r\n{\r\n static int Add(int x, int y)\r\n {\r\n return x + y;\r\n }\r\n\r\n static void Main(string[] args)\r\n {\r\n CalculateDelegate addDelegate = new CalculateDelegate(Add);\r\n\r\n int result = addDelegate(1, 2);\r\n\r\n Console.WriteLine(result); // 输出:3\r\n }\r\n}\r\n```\r\n\r\n\r\n## 委托链\r\n\r\nC# 中的委托还支持委托链的概念,即将多个委托实例组合成一个委托实例。当调用委托实例时,将按照添加顺序调用每个委托实例。委托链的语法如下:\r\n\r\n```csharp\r\n\r\ndelegateName = delegateName1 + delegateName2 + ...;\r\n```\r\n\r\n\r\n\r\n下面是一个示例代码,使用委托链实现了两个方法的加法:\r\n\r\n```csharp\r\n\r\ndelegate int CalculateDelegate(int x, int y);\r\n\r\nclass Program\r\n{\r\n static int Add(int x, int y)\r\n {\r\n return x + y;\r\n }\r\n\r\n static int Multiply(int x, int y)\r\n {\r\n return x * y;\r\n }\r\n\r\n static void Main(string[] args)\r\n {\r\n CalculateDelegate addDelegate = new CalculateDelegate(Add);\r\n CalculateDelegate multiplyDelegate = new CalculateDelegate(Multiply);\r\n\r\n CalculateDelegate chainDelegate = addDelegate + multiplyDelegate;\r\n\r\n int result = chainDelegate(2, 3);\r\n\r\n Console.WriteLine(result); // 输出:6\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上述示例代码中,我们创建了两个委托实例 `addDelegate` 和 `multiplyDelegate`,分别引用了 `Add` 和 `Multiply` 两个方法。然后,通过将这两个委托实例组合成一个委托链 `chainDelegate`,实现了两个方法的加法和乘法。最后,调用委托链实例 `chainDelegate`,输出了结果 6。\r\n## 总结\r\n\r\nC# 委托是一种非常重要的语言特性,它允许我们将方法作为参数传递给其他方法,也可以将方法保存在变量中,然后在需要时执行它。通过委托链,我们还可以将多个委托实例组合成一个委托实例,实现多个方法的组合调用。\r\n\r\n希望本文能够帮助大家更好地理解和使用 C# 委托。如果您有任何疑问或建议,欢迎在下方留言区留言。\r\n','C# 委托(Delegate)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,33),('0a814c6d-3803-5e86-75ef-3a0f83ad712c',0,'## 简介\n当程序出现异常之后,框架需要记录,同时反馈前端对应的信息\n它通过`全局错误中间件`实现\n\n错误后,将统一返回以下模型格式:\n``` cs\npublic class RemoteServiceErrorInfo\n{\n\n public string? Code { get; set; }\n\n /// \n /// message.\n /// \n public string? Message { get; set; }\n\n /// \n /// details.\n /// \n public string? Details { get; set; }\n\n /// \n /// data.\n /// \n public object? Data { get; set; }\n}\n```\n\n框架内部错误分为三大类:\n#### 系统内部错误\n> httpCode:500\n系统不能处理、或未发现的错误,需要即使进行修复\n#### 业务友好错误\n> httpCode:403\n跟业务相关,业务请求不合理,例如:登录失败、数据重复\n#### 授权错误\n> httpCode:401\n跟权限相关,代表当前用户权限不足\n\n## 使用\n你可以在程序任何地方进行抛出错误\n``` cs\n throw new Exception(\"系统错误\");//状态码500\n throw new UserFriendlyException(\"业务错误\");//状态码403\n throw new NotImplementedException(\"未实现\");//状态码501\n throw new UserFriendlyException(\"花里胡哨错误\",\"401\");//状态码401\n```\nAbp内部将自动抓取,并返回给前端','异常处理','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:21:42','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('0c87f251-cc9e-29f3-e4eb-3a0ff57edf85',0,'\n**C#Winform全原创贪吃蛇无bug极致简易小白必学逻辑完整代码**\n\n**作者写给小白的话:**\n百度其实有很多贪吃蛇代码,但要么代码过于复杂根本看不懂,要么bug一堆为乞丐版贪吃蛇,要么解释不清楚为残缺代码,还有的是用数据结构弄的贪吃蛇,小白根本都不知道发生了什么,非常不适合学习,顶多复制看看就没了。\n**本程序特点:**\n基本把已知的bug解决完,简单易懂都是用基础做的,没有加数据结构。没有加任何花里胡哨的东西,代码明了简介,非常适合小白进行学习!\n\n![image.png](/prod-api/file/746b978f-f5a7-f00e-cf28-3a0ff57ea2be/true)\n![image.png](/prod-api/file/e15f1cf3-e48c-71db-050d-3a0ff57ec0fe/true)\n\n **1. **程序功能介绍:****\n 就是个贪吃蛇的游戏,没啥说的!\n \n **2. **代码功能解释:****\nsnake_show()//初始化蛇的生成界面\nmove_Tick()//计时器自动移动\nKeyPress()//接受按键控制方向\negg_show()//蛋的生成\neat()//吃蛋的过程\ncheak()//检测函数\ntail_show()//控制蛇尾的生成方向\nsnake_bug()//蛇吃到自己结束游戏\nwall_bug()//撞墙结束游戏\negg_bug()//蛋刷到蛇身的bug\n禁止按下反方向键移动bug\n **3. 全部完整代码:**\n\n 1. 创建winform项目,命名为MRTCS ------(末日贪吃蛇)\n\n ps:主要之前一开始弄的是tcs(贪吃蛇),然后又弄了cjtcs(超级贪吃蛇),之后弄了zztcs(最终贪吃蛇)\n\n 2. 直接从工具箱拖2个timer计时器,改名为move和cheak,move间隔为300,cheak间隔为1,窗口大小设为1000,1000\n\n 3. 然后复制一下代码\n\n 4. 最后把代码里面的事件放进相应的控件中(load,move,cheak,KeyPress)\n\n 5. 运行ok!\n**以下代码:**\n\n``` cs\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\n\nnamespace MRTCS\n{\n public partial class Form1 : Form\n {\n public Form1()\n {\n InitializeComponent();\n }\n int x = 0; int y = 0; int count = 0;\n char fxp = ''s'';\n char oldfxp = ''w'';\n \n bool egg_exist = false;\n Label[,] map = new Label[100, 100];//地图的二维数组\n Label[] snake = new Label[1000];//蛇的数组\n Label egg = new Label();//蛋的标签\n Random egg_position = new Random();\n\n private void Form1_Load(object sender, EventArgs e)//load事件\n {\n\n snake_show();\n \n\n }\n private void snake_show()//初始化蛇的生成界面\n {\n Label snake_template = new Label();\n snake_template.Size = new Size(100, 100);\n snake_template.BackColor = Color.Black;\n snake_template.Location = new Point(0, 0);\n snake[count] = snake_template;\n Controls.Add(snake[count]);\n }\n \n\n private void move_Tick(object sender, EventArgs e)//计时器自动移动\n {\n if (count > 0)\n {\n for (int i = count; i > 0; i--)\n {\n snake[i].Location = snake[i - 1].Location;\n }\n }\n switch (fxp)\n {\n case ''a'': snake[0].Left -= 100; break;\n case ''d'': snake[0].Left += 100; break;\n case ''w'': snake[0].Top -= 100; break;\n case ''s'': snake[0].Top += 100; break;\n }\n\n eat();\n\n }\n\n private void Form1_KeyPress(object sender, KeyPressEventArgs e)//接受按键控制方向\n {\n {\n switch (e.KeyChar)\n {\n case ''a'': if (oldfxp != ''d'' || count == 0) fxp = ''a''; break;\n case ''d'': if (oldfxp != ''a'' || count == 0) fxp = ''d''; break;\n case ''w'': if (oldfxp != ''s'' || count == 0) fxp = ''w''; break;\n case ''s'': if (oldfxp != ''w'' || count == 0) fxp = ''s''; break;\n }\n oldfxp = fxp;\n }\n }\n private void egg_show()//蛋的生成\n {\n int x = egg_position.Next(0, 9);\n int y = egg_position.Next(0, 9);\n egg.Location = new Point(x * 100, y * 100);\n egg.Size = new Size(100, 100);\n egg.BackColor = Color.Red;\n Controls.Add(egg);\n }\n\n private void eat()//吃蛋的过程\n {\n if (snake[0].Location == egg.Location)\n {\n ++count;\n Label snake_template = new Label();\n snake_template.Size = new Size(100, 100);\n snake_template.BackColor = Color.Black;\n snake_template.Location = tail_show(); /*new Point(snake[count - 1].Left - 100, snake[count - 1].Top);*/\n snake[count] = snake_template;\n Controls.Add(snake[count]);\n egg_exist = false;\n }\n }\n\n private void cheak_Tick(object sender, EventArgs e)//检测\n {\n if (!egg_exist)//刷蛋\n {\n egg_show();\n egg_exist = true;\n }\n egg_bug();\n snake_bug();\n wall_bug();\n }\n\n private void egg_bug()//蛋刷到蛇身\n {\n for (int i = 0; i < count + 1; i++)\n {\n if (snake[i].Location == egg.Location && i != 0)\n {\n egg_exist = false;\n }\n\n }\n }\n private void snake_bug()//蛇吃到自己\n {\n for (int i = 0; i < count + 1; i++)\n {\n if (snake[i].Location == snake[0].Location && i != 0)\n {\n move.Enabled = false;\n cheak.Enabled = false;\n MessageBox.Show(\"GameOver!\");\n\n }\n\n }\n }\n private void wall_bug()//撞墙\n {\n if (snake[0].Left < 0 || snake[0].Left > 900 || snake[0].Top < 0 || snake[0].Top > 900)\n {\n move.Enabled = false;\n cheak.Enabled = false;\n MessageBox.Show(\"GameOver!\");\n }\n\n }\n private Point tail_show()//蛇尾的生成\n {\n if (count == 0|| count == 1)\n {\n if (snake[0].Top == egg.Top && snake[0].Left - 100 == egg.Left)\n return new Point(snake[0].Left + 100, snake[0].Top);\n if (snake[0].Top == egg.Top && snake[0].Left + 100 == egg.Left)\n return new Point(snake[0].Left - 100, snake[0].Top);\n if (snake[0].Left == egg.Left && snake[0].Top - 100 == egg.Top)\n return new Point(snake[0].Left, snake[0].Top + 100);\n if (snake[0].Left == egg.Left && snake[0].Top + 100 == egg.Top)\n return new Point(snake[0].Left, snake[0].Top - 100);\n else\n return new Point(-200,-200);\n }\n else\n {\n if (snake[count-1].Top == egg.Top && snake[count-2].Left - 100 == egg.Left)\n return new Point(snake[count-1].Left + 100, snake[count-1].Top);\n if (snake[count-1].Top == egg.Top && snake[count - 2].Left + 100 == egg.Left)\n return new Point(snake[count-1].Left - 100, snake[count-1].Top);\n if (snake[count-1].Left == egg.Left && snake[count - 2].Top - 100 == egg.Top)\n return new Point(snake[count-1].Left, snake[count-1].Top + 100);\n if (snake[count-1].Left == egg.Left && snake[count - 2].Top + 100 == egg.Top)\n return new Point(snake[count-1].Left, snake[count-1].Top - 100);\n else\n return new Point(-200, -200);\n }\n }\n }\n}\n\n```\n以上为全部代码!\n**感谢阅读!**\n**有具体不懂的可以私聊问我!乐意教学!**\n','C#Winform--贪吃蛇','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:47:33','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('0cec4258-46f2-2df8-f5c0-3a0ff5452e3b',0,'![image.png](/prod-api/file/4314e274-d913-a5d7-709f-3a0ff54524af/true)','Middleware中间件','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:44:32','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('0d334442-9fc3-0c8c-cf39-3a0ff53f867f',0,'- [Algorithmia](https://github.com/SolutionsDesign/Algorithmia) - 用于 .NET 3.5 及更高版本的算法和数据结构库。Algorithmia 包含复杂的算法和数据结构,如图形、优先队列、命令、撤销重做等。 \r\n- [C# Algorithms](https://github.com/aalhour/C-Sharp-Algorithms) - 标准数据结构和算法的 C# 插拔式类库项目。它包含 35+ 数据结构和 30+ 算法,设计为面向对象的独立组件。 \r\n- [Towel](https://github.com/ZacharyPatten/Towel) - 数据结构、算法、数学、元数据、扩展、控制台、测量和其他有用的工具。 \r\n- [Akade.IndexedSet](https://github.com/akade/Akade.IndexedSet) - 一个方便的数据结构,支持高效的内存中索引和查询,包括范围查询和模糊字符串匹配。','算法数据结构','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,2),('0e393c8b-4eec-a3fe-c511-3a0ff53f8680',0,'- [dnSpy](https://github.com/0xd4d/dnSpy) - 开源的.NET程序集浏览器、编辑器、反编译器和调试器 \r\n- [ILSpy](https://ilspy.net/) - ILSpy是开源的.NET程序集浏览器和反编译器 \r\n- [JustDecompile Engine](https://github.com/telerik/JustDecompileEngine) - [JustDecompile](https://www.telerik.com/products/decompiler.aspx) 的反编译引擎 \r\n- [dotPeek](https://www.jetbrains.com/decompiler/) - 免费的独立工具,基于ReSharper捆绑的反编译器。它可以可靠地将任何.NET程序集反编译为等效的C#或IL代码。它可以基于原始二进制文件直接创建Visual Studio解决方案。**[专有]** **[免费]**','反编译','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,32),('0f753094-b421-7381-7ef4-3a0ff53f8680',0,'- [FastReport](https://github.com/FastReports/FastReport) - 用于 .NET Core 2.x/.Net Framework 4.x 的开源报告生成器。FastReport 可用于 ASP.NET MVC 和 Web API 应用程序。 \r\n- [NReco PivotData](https://www.nrecosite.com/pivot_data_library_net.aspx) - 内存中的数据聚合/OLAP 库,支持生成数据透视表(导出为 HTML),包括 ASP.NET 数据透视表构建控件 **[$][免费用于单一部署/非SaaS]** 。','报表','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,16),('10eba897-7340-df30-3faf-3a0fe48288e8',1,'C# 是一种现代化的面向对象编程语言,主要用于 Windows 平台的开发。在 C# 中,程序结构是指程序的组织方式和代码的组成部分,包括命名空间、类、方法等。\r\n## 命名空间\r\n\r\n命名空间是 C# 中用来组织代码的一种机制。它可以包含类、结构体、枚举、委托等类型,并且可以嵌套其他命名空间。命名空间的定义通常放在源文件的顶部,格式如下:\r\n\r\n```csharp\r\n\r\nnamespace MyNamespace\r\n{\r\n // 类、结构体、枚举、委托等类型定义\r\n}\r\n```\r\n\r\n\r\n\r\n其中,`MyNamespace` 是命名空间的名称,可以根据实际需要自定义。如果在一个程序中定义了多个命名空间,可以使用 `using` 关键字引用它们,例如:\r\n\r\n```csharp\r\n\r\nusing System;\r\nusing MyNamespace;\r\n```\r\n\r\n\r\n## 类\r\n\r\n类是 C# 中最基本的组织代码的单元,它用来定义对象的属性和方法。一个类可以包含多个属性和方法,它们被称为类的成员。类的定义格式如下:\r\n\r\n```csharp\r\n\r\nclass MyClass\r\n{\r\n // 类的成员定义\r\n}\r\n```\r\n\r\n\r\n\r\n其中,`MyClass` 是类的名称,也可以根据实际需要自定义。类的成员包括字段、属性、方法和事件等,它们的访问权限可以使用 `public`、`private`、`protected` 和 `internal` 关键字进行控制。\r\n## 方法\r\n\r\n方法是 C# 中用来执行特定操作的代码块,它可以带有参数和返回值。方法的定义格式如下:\r\n\r\n```csharp\r\n\r\npublic void MyMethod(int arg1, string arg2)\r\n{\r\n // 方法体\r\n}\r\n```\r\n\r\n\r\n\r\n其中,`public` 是访问修饰符,表示该方法可以被其他类访问;`void` 表示该方法没有返回值;`MyMethod` 是方法的名称,可以根据实际需要自定义;`int arg1` 和 `string arg2` 是方法的参数,它们的类型需要在参数名称之前声明。\r\n## 控制语句\r\n\r\nC# 中有多种控制语句可以用来控制程序的执行流程,包括条件语句、循环语句和跳转语句等。\r\n### 条件语句\r\n\r\n条件语句用来根据条件判断执行不同的代码块。C# 中的条件语句包括 `if`、`else` 和 `switch` 语句,例如:\r\n\r\n```csharp\r\n\r\nif (condition)\r\n{\r\n // 条件为真时执行的代码\r\n}\r\nelse\r\n{\r\n // 条件为假时执行的代码\r\n}\r\n\r\nswitch (variable)\r\n{\r\n case value1:\r\n // 变量等于 value1 时执行的代码\r\n break;\r\n case value2:\r\n // 变量等于 value2 时执行的代码\r\n break;\r\n default:\r\n // 变量不等于 value1 或 value2 时执行的代码\r\n break;\r\n```\r\n\r\n\r\n\r\n}\r\n\r\n```arduino\r\n\r\n### 循环语句\r\n\r\n循环语句用来多次执行相同的代码块。C# 中的循环语句包括 `while`、`do-while` 和 `for` 语句,例如:\r\n\r\n```csharp\r\nwhile (condition)\r\n{\r\n // 循环条件为真时执行的代码\r\n}\r\n\r\ndo\r\n{\r\n // 至少执行一次的循环代码\r\n} while (condition);\r\n\r\nfor (int i = 0; i < 10; i++)\r\n{\r\n // 执行 10 次的循环代码\r\n}\r\n```\r\n\r\n\r\n### 跳转语句\r\n\r\n跳转语句用来改变程序的执行流程。C# 中的跳转语句包括 `break`、`continue` 和 `return` 语句,例如:\r\n\r\n```csharp\r\n\r\nwhile (true)\r\n{\r\n if (condition)\r\n {\r\n break; // 跳出循环\r\n }\r\n if (otherCondition)\r\n {\r\n continue; // 继续循环下一次迭代\r\n }\r\n}\r\n\r\npublic int MyMethod()\r\n{\r\n return 0; // 返回一个整数值\r\n}\r\n```\r\n\r\n\r\n## 异常处理\r\n\r\n异常处理是指在程序运行过程中发生错误时,采取一些措施来保证程序正常运行。C# 中的异常处理机制使用 `try`、`catch` 和 `finally` 语句来实现,例如:\r\n\r\n```csharp\r\n\r\ntry\r\n{\r\n // 可能会抛出异常的代码\r\n}\r\ncatch (Exception ex)\r\n{\r\n // 处理异常的代码\r\n}\r\nfinally\r\n{\r\n // 无论是否抛出异常都会执行的代码\r\n}\r\n```\r\n\r\n\r\n\r\n其中,`try` 语句包含可能会抛出异常的代码块;`catch` 语句用来捕获并处理异常,`Exception ex` 表示要捕获的异常类型,可以根据实际需要自定义;`finally` 语句包含无论是否抛出异常都会执行的代码块。\r\n## 总结\r\n\r\nC# 程序结构包括命名空间、类、方法、控制语句和异常处理等组成部分。掌握 C# 程序结构对于编写高质量的 C# 程序非常重要,希望本文能够帮助您更好地理解和掌握 C# 程序结构。\r\n','C# 程序结构','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-04 10:38:00','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-04 23:56:49',0),('11de4df7-29ad-6cdb-4c29-3a0ff587b4bf',0,'**C#Winform--俄罗斯方块**\n\n**作者心得**\n好吧,我承认,这是一个面向过程弄的\n虽然打算面向对象,但技术不成熟,弄着弄着,就变成面向对象了\n代码。。。。数量直接指数爆炸,我怕这个页面都放不下\n另外,第一次使用了第三方控件,美滋滋\n\n**部分核心源代码**\n(太多!太多了!也就只能放下一个地图)\n(其他面向过程代码真的太多了)\n\n```csharp\n\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Drawing;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows.Forms;\nusing CCWin;\nnamespace ZJELSFK\n{\n public partial class Form1 : CCSkinMain\n {\n public Form1()\n {\n InitializeComponent();\n }\n Button[,] map = new Button[15, 25];\n bool start = true;\n char fxp = ''o'';\n int x = 4;\n int y = 0;\n int sco = 0;\n string create = \"O\";\n string create_next = \"O\";\n bool number = true;\n bool change = false;\n bool end = false;\n Random random = new Random();\n private void Form1_Load(object sender, EventArgs e)//创建地图\n {\n \n for (int i = 0; i < 10; i++)\n {\n for (int j = 0; j < 20; j++)\n {\n Button map_template = new Button();\n map_template.Size = new Size(20, 20);\n map_template.BackColor = Color.White;\n map_template.Location = new Point(i * 20 + 20, j * 20);\n map[i, j] = map_template;\n Controls.Add(map[i, j]);\n }\n }\n\n for (int i = 0; i < 21; i++)\n {\n Button map_template2 = new Button();\n map_template2.Size = new Size(20, 20);\n map_template2.BackColor = Color.Black;\n map_template2.Location = new Point(0, i * 20);\n Controls.Add(map_template2);\n Button map_template3 = new Button();\n map_template3.Size = new Size(20, 20);\n map_template3.BackColor = Color.Black;\n map_template3.Location = new Point(220, i * 20);\n Controls.Add(map_template3);\n if (i < 12)\n {\n Button map_template4 = new Button();\n map_template4.Size = new Size(20, 20);\n map_template4.BackColor = Color.Black;\n map_template4.Location = new Point(i * 20, 400);\n Controls.Add(map_template4);\n }\n }\n create = random_blocks();\n create_next = random_blocks(); //初始化随机方块\n }\n\n\n```\n\n**效果截图**\n![image.png](/prod-api/file/cf85afd6-a509-fea9-b88a-3a0ff5877418/true)\n\n![image.png](/prod-api/file/8244f012-bd52-da0a-508b-3a0ff5879277/true)\n**作者的话**\n这个俄罗斯方块还挺好玩的,其实打算弄下去,改进为 面相对象,但是当我有这个想法的时候,已经开发Asp项目,放弃了winform,不想再弄这玩意儿了,哎!\n','C#Winform--俄罗斯方块','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:57:12','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('121ea144-a7e6-76d6-c651-3a0ff53f8681',0,'- [Curryfy](https://github.com/leandromoh/Curryfy) - 提供强类型的C#委托扩展方法,以利用函数式编程技巧,如柯里化和部分应用。 \r\n- [language-ext](https://github.com/louthy/language-ext) - 该库使用C# 6+的特性,提供了一个功能性的“基础类库”,如果你闭上眼睛看,它可以看起来像是语言本身的扩展。它还包括一个类似于Erlang的进程系统(actors),可以选择将消息和状态持久化到Redis(注意,你可以在不使用Redis的情况下进行内部消息传递)。进程系统还支持消息和状态的Rx流,允许完整的反应式事件和消息分发系统。 \r\n- [Optional](https://github.com/nlkl/Optional) - 一个强大的C#选项类型。 \r\n- [JFlepp.Maybe](https://github.com/jflepp/JFlepp.Maybe) - 一个适用于C#的Maybe类型,旨在将F#中的Option类型以C#的方式进行移植。 \r\n- [Optuple](https://github.com/atifaziz/Optuple) - 为.NET Standard提供了一种在非侵入性方式中为`(bool, T)`提供Option-like语义的库;也就是说,对于库或其用户来说,没有新的选项类型依赖关系。 \r\n- [MoreLinq](https://github.com/MoreLinq/MoreLinq) - 为LINQ to Objects提供额外的方法。\r\n','函数式编程','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,45),('12ed21a4-d495-aa73-a6da-3a0fe75ec506',1,'title: C# 简介\r\narticle: false\r\ndate: 2023-04-15 11:39:44\r\npermalink: /pages/9d25e7/\r\n---\r\n\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','C# 简介','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-04 23:57:48','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-05 00:05:21',0),('151a241c-e397-fd94-405d-3a0ff58e2131',0,'**作者的话**\n原谅我,第一次接触这玩意儿\nAJAX\nAsynchronous JavaScript and XML(异步的 JavaScript 和 XML)\n\nJauery\njQuery 是一个 JavaScript 库。\n制作了一个类似于百度的高级搜索功能,边输边加载\n**效果展示**\n![image.png](/prod-api/file/68d6b594-52dd-399f-f296-3a0ff58e14c2/true)\n\n```csharp\n\n@{\n Layout = \"\";\n}\n\n\n\n \n AJAX高级搜索\n \n \n \n \n \n \n\n\n\n
\n\n
\n\n \n
\n \n \n
\n
\n \n\n\n\n```\n\n\n','AjaxJquery--制作一个类似百度的搜索方式','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 18:04:13','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('1534dfeb-6884-fb07-d310-3a0ff58ef6f7',0,'**作者的话**\n这个已经投入实战了!!\n一个真正有意义的项目哦!\n自动打水印,一键上传,包括班级上传统计在这里插入代码片\n\n**效果展示**\n![image.png](/prod-api/file/09469f24-044a-a463-969e-3a0ff58eee8b/true)\n\n\n**源代码**\n\n```csharp\n@{\n ViewBag.Title = \"Home Page\";\n}\n@using StudentSys.Models\n@{\n jiftEntities ji = new jiftEntities();\n var stu = from u in ji.student\n select new\n {\n u.name,\n u.num,\n u.time,\n u.sub\n };\n}\n\n\n\n\n\n\n\n\n \n\n\n
\n
\n
    \n @{\n foreach (var k in stu)\n {\n string t = \"[已提交]\";\n if (k.sub == 0)\n {\n t = \"[未提交]\";\n }\n
  • @t@k.num@k.name@k.time
  • \n\n }\n }\n
\n
\n
\n
\n
\n
\n 姓名:\n
\n \n
\n
\n\n
\n

\n
\n \n \n\n\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n\n\n```\n','JqueryJs--青年大学习截图上传统计工具','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 18:05:08','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('163afc07-fc66-3f79-ab38-3a0ff53f8684',0,'\r\n* [EmbedIO](https://github.com/unosquare/embedio) - 基于Mono构建的跨平台Web服务器。\r\n* [XSP](https://github.com/mono/xsp) - Mono的ASP.NET托管服务器。该模块包括一个Apache模块,一个可以连接到其他Web服务器的FastCGI模块,以及用于测试的独立服务器(类似于Microsoft的Cassini)。','WebServers','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,105),('16521d2c-0fe5-4496-8dd0-3a0fe7845287',1,'\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','C# 简介','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-05 00:38:49','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-05 00:39:19',0),('190541cc-32a2-3c3d-e711-3a0ff53f8680',0,'- [AIMLBot (Program#)](http://aimlbot.sourceforge.net/) - 一个小型、快速、符合标准但易于定制的基于 AIML(人工智能标记语言)的聊天机器人的 C# 实现。 \r\n- [SIML](https://simlbot.com/) - 合成智能标记语言,下一代聊天机器人和数字助手语言。 \r\n- [Mpt-Instruct-DotNet-S](https://github.com/NethermindEth/Mpt-Instruct-DotNet-S) - 能够生成和解释 C# 代码的低级虚拟机(LLM),以及其用于在消费者 CPU 上运行的 C# 包装器(需要5GB以上RAM),包含控制台和 Blazor 示例项目。\r\n* [BotSharp](https://github.com/SciSharp/BotSharp) - BotSharp是AI Bot平台构建者的开源机器学习框架。\r\n* [NadekoBot](https://github.com/Kwoth/NadekoBot) - 用C#编写的开源,通用的Discord聊天机器人。\r\n* [Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot) - Telegram Bot API客户端。\r\n* [Funogram](https://github.com/Dolfik1/Funogram) - F#Telegram Bot Api库。','人工智能','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,8),('193b98cd-64dc-af38-dcdd-3a0ff53f8683',0,'- [Rx.NET](https://github.com/dotnet/reactive) - 响应式扩展(Rx)是一个用于组合异步和基于事件的程序的库,使用可观察序列和LINQ风格的查询操作符。 \r\n- [Dynamic Data](https://github.com/reactivemarbles/DynamicData) - 集合的响应式扩展(Rx)。 \r\n- [ObsevableComputations](https://github.com/IgorBuchelnikov/ObservableComputations) - 一个跨平台的.NET库,用于处理参数和结果均实现了INotifyPropertyChanged和INotifyCollectionChanged(ObservableCollection)接口的对象的计算。','响应式编程','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,85),('195867e3-fe66-4959-9dea-3a0ff543218e',0,'![image.png](/prod-api/file/4c618d9f-802d-12e7-6d4e-3a0ff542fb7e/true)','Program入口','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:42:18','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('1986d25f-215f-5a84-c57c-3a0ff53f8683',0,'\r\n- [Ceras](https://github.com/rikimaru0345/Ceras) - Ceras是一个二进制序列化器。它将任何对象转换为byte[],并可以反向操作。它在功能、速度和使用上都超越一般,支持引用循环、大型/复杂的继承链、将对象分成部分等功能。 \r\n- [CsvExport](https://github.com/jitbit/CsvExport) - 非常简单轻巧的CSV导出工具,与Excel兼容,支持转义文本和引号等功能。 \r\n- [Protobuf.NET](https://github.com/protobuf-net/protobuf-net) - Protocol Buffers是Google用于大部分数据通信的二进制序列化格式的名称。 \r\n- [Json.NET](https://github.com/JamesNK/Newtonsoft.Json) - 非常流行的高性能JSON框架,用于.NET。 \r\n- [ServiceStack.Text](https://github.com/ServiceStack/ServiceStack.Text) - 用于servicestack.net的JSON、JSV和CSV文本序列化器。 \r\n- [Msgpack-Cli](https://github.com/msgpack/msgpack-cli) - 适用于通用语言基础结构的MessagePack实现。 \r\n- [Jil](https://github.com/kevin-montrose/Jil) - 快速的.NET JSON序列化器,基于Sigil构建(StackOverflow使用)。 \r\n- [ProtoBuf](https://github.com/SilentOrbit/protobuf) - 根据.proto规范生成协议缓冲区序列化的C#代码。 \r\n- [FlatSharp](https://github.com/jamescourtney/FlatSharp) - 快速、符合习惯的FlatBuffers实现。使用.fbs文件或属性。 \r\n- [F# Data](https://fsprojects.github.io/FSharp.Data/) - F#类型提供程序,用于访问XML、JSON、CSV和HTML文件(基于示例文档)以及访问WorldBank数据。 \r\n- [Bond](https://github.com/Microsoft/bond) - 用于处理有模式数据的跨平台框架。支持跨语言的序列化和功能强大的通用机制,用于高效操作数据。 \r\n- [Hyperion](https://github.com/akkadotnet/Hyperion) - 高性能的多态序列化器,用于.NET框架。 \r\n- [FileHelpers](https://github.com/MarcosMeli/FileHelpers) - 免费且易于使用的.NET库,用于在文件、字符串或流中导入或导出固定长度或分隔记录的数据。 \r\n- [FsPickler](https://github.com/mbraceproject/FsPickler) - 用于.NET的快速多格式消息序列化器。 \r\n- [Migrant](https://github.com/antmicro/Migrant) - 快速且灵活的序列化框架,可用于未装饰的类。 \r\n- [Utf8Json](https://github.com/neuecc/Utf8Json) - 用于C#(.NET、.NET Core、Unity和Xamarin)的快速且零分配的JSON序列化器,直接读写UTF8二进制数据以提高性能。 \r\n- [ObjectDumper.NET](https://github.com/thomasgalliker/ObjectDumper) - 将内存中的对象序列化为C#代码的工具。 \r\n- [FluentSerializer](https://github.com/Marvin-Brouwer/FluentSerializer#readme) - 针对多种数据格式的基于配置文件的序列化器。','序列化','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,91),('19a572c7-eaf9-4f01-35f8-3a0ff544ebfb',0,'![image.png](/prod-api/file/68284e28-7430-1949-5631-3a0ff544df96/true)','Autofac','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:44:15','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('1c8ab2c9-7714-b114-5978-3a0ff53f8682',0,'\r\n- [Cloudmersive PDF](https://cloudmersive.com/pdf-api) - Cloudmersive PDF是一个本地的.NET Framework和.NET Core NuGet库以及API服务,可以高度扩展和准确地创建、修改、加密或转换PDF文档;并且可以免费使用,没有过期时间 **[免费]** \r\n- [Docotic.Pdf](https://bitmiracle.com/pdf-library/) - 用于在.NET和.NET Core应用程序中创建、读取、编辑、绘制和打印PDF文档的PDF库。100%托管,没有不安全的代码块。 **[需要付费]** **]** \r\n- [ITextSharp](https://github.com/itext/itextsharp) - iText是一个PDF库,允许您在便携式文档格式(PDF)中创建、调整、检查和维护文档。 **[需要付费]** **[免费提供给开源项目]** \r\n- [PdfiumViewer](https://github.com/pvginkel/PdfiumViewer) - PdfiumViewer是基于PDFium项目的PDF查看器。 \r\n- [WkhtmlToPdf](https://github.com/codaxy/wkhtmltopdf) - 基于wkhtmltopdf控制台实用程序的C#包装器。允许使用HTML和CSS生成漂亮的PDF。 \r\n- [Pdfium.Net SDK](https://pdfium.patagames.com/) - 高级C# PDF库,用于渲染、创建、编辑、合并、拆分、打印和查看PDF文档。开源的PDF查看器可在[GitHub](https://github.com/patagames) 上找到。还提供[NuGet包](https://www.nuget.org/packages/Pdfium.Net.SDK/) ,可轻松将其包含到项目中。 **[需要付费]** \r\n- [PdfPig](https://uglytoad.github.io/PdfPig/) - 在C#中从PDF中读取、创建和提取文本和其他内容(PdfBox的端口)。 \r\n- [QuestPDF](https://www.questpdf.com/) - QuestPDF是一个经过现代化和经过测试的开源库,通过提供友好、可发现和可预测的C#流畅API,可以帮助您生成PDF文档。 \r\n- [Kevsoft.PDFtk](https://github.com/kevbite/Kevsoft.PDFtk) - 用于驱动强大的pdftk二进制文件的包装器,可以填充PDF表单、获取字段信息、连接多个文档或页面、拆分文档、添加或替换印章,以及附加文件到页面或从页面下载文件。\r\n- [PdfSharpCore](https://github.com/ststeiger/PdfSharpCore) - PdfSharpCore 是开源 .NET 库,可轻松即时创建和处理 PDF 文档。 相同的绘图例程可用于创建 PDF 文档、在屏幕上绘图或将输出发送到任何打印机。**[免费]** **[MIT开源]** ','PDF','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,78),('1d72b54e-ad7e-2f79-90e8-3a0ff53f8680',0,'\r\n- [BootstrapBlazor](https://github.com/dotnetcore/BootstrapBlazor) - 基于 Bootstrap 和 Blazor 的企业级 UI 组件集合。 \r\n- [ant-design-blazor](https://github.com/ant-design-blazor/ant-design-blazor) - 基于 Ant Design 和 Blazor WebAssembly 的企业级 UI 组件集合。 \r\n- [MASA.Blazor](https://github.com/BlazorComponent/MASA.Blazor) - 基于 Material Design 和 Blazor WebAssembly 的企业级 UI 组件集合。 \r\n- [Megabit.Blazorise](https://github.com/Megabit/Blazorise) - Blazorise 是一个构建在 Blazor 和 CSS 框架(如 Bootstrap、Bulma 和 Material)之上的组件库,非常易于使用。 \r\n- [blazork8s](https://github.com/weibaohui/blazork8s) - 使用 Blazor 和 .NET Core 构建的 Kubernetes 管理界面。\r\n','Blazor','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,12),('1e533a0a-3ac0-5562-5e8d-3a0ff53f8682',0,'- [ExcelDna](https://github.com/Excel-DNA/ExcelDna) - ExcelDna使使用C#、F#或VB .NET创建和部署Excel插件更加容易。 \r\n- [ClosedXML](https://github.com/ClosedXML/ClosedXML) - ClosedXML使开发人员更容易创建Excel 2007/2010文件。 \r\n- [NPOI](https://github.com/tonyqus/npoi) - 该项目是POI Java项目的.NET版本,位于[https://poi.apache.org/。](https://poi.apache.org/%E3%80%82) \r\n- [EPPlus](https://github.com/JanKallman/EPPlus) - EPPlus是一个.NET库,使用Open Office XML格式(xlsx)读取和写入Excel 2007/2010文件。 \r\n- [Open XML SDK](https://github.com/officedev/open-xml-sdk) - Open XML SDK提供了用于处理Open XML文档(DOCX、XLSX和PPTX)的开源库。 \r\n- [DocX](https://github.com/xceedsoftware/DocX) - DocX是一个.NET库,允许开发人员操作Word 2007/2010/2013文件,不需要安装Microsoft Word或Office。 \r\n- [ExcelDataReader](https://github.com/ExcelDataReader/ExcelDataReader) - 用于读取Microsoft Excel文件(2.0-2007)的轻量级快速C#库。 \r\n- [NetOffice](https://github.com/NetOfficeFw/NetOffice) - 用于Microsoft Office应用程序的.NET包装程序集。 \r\n- [GemBox.Bundle](https://www.gemboxsoftware.com/bundle) - 一组.NET组件,支持快速、简单和高效地处理办公文件(Excel、Word、PowerPoint、PDF和电子邮件)。 **[需要付费]** **[提供免费Lite版本]** \r\n- [Outlook Redemption](http://www.dimastr.com/redemption/home.htm) - 用于处理Outlook对象模型和(扩展的)MAPI的库。支持Outlook 98 - 2019。可以与Exchange和Outlook中的对象/邮件/帐户/文件夹一起使用。 **[需要付费]** \r\n- [ShapeCrawler](https://github.com/ShapeCrawler/ShapeCrawler) - 用于在没有安装Microsoft Office的情况下处理PowerPoint演示文稿的流畅API。 \r\n- [MiniExcel](https://github.com/shps951023/MiniExcel) - 一个微型Excel助手,避免OOM并具有高性能,可用于创建/映射/模板填充数据。 \r\n- [Toxy](https://github.com/nissl-lab/toxy) - .NET文本提取框架,支持一些文件格式。\r\n','Office','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,74),('1ee1880c-52cc-dc89-b4b5-3a0ff53f8680',0,'- [.NET Compiler Platform (\"Roslyn\") Analyzers](https://github.com/dotnet/roslyn-analyzers) - 一些最初用于帮助完善静态分析API设计和实现的Roslyn诊断分析器。 \r\n- [PVS-Studio](https://pvs-studio.com/en/pvs-studio/) - PVS-Studio是一款代码质量、安全性(SAST)和代码安全性的静态分析器。[[免费提供给开源项目](https://pvs-studio.com/en/order/open-source-license/) ] **[$]** \r\n- [NDepend](https://www.ndepend.com/) - 是一个用于估算.NET代码质量和技术债务的Visual Studio和VS Team Services扩展程序,可使用C# LINQ语法创建代码规则,可视化代码结构并关注变更和演进。**[$]** \r\n- [App.Metrics](https://github.com/AppMetrics/AppMetrics) - App Metrics是一个开源跨平台的.NET库,用于记录和报告应用程序内的指标,并报告其健康状况。更多详情请查看[文档](https://www.app-metrics.io/) 。 \r\n- [CodeMaid](http://www.codemaid.net/) - Visual Studio扩展,用于清理、深入分析和简化C#、C++、F#、VB、PHP、JSON、XAML、XML、ASP、HTML、CSS、LESS、SCSS、JavaScript和TypeScript代码。 \r\n- [StyleCop](https://github.com/StyleCop) - StyleCop分析C#源代码以强制执行一组样式和一致性规则。 \r\n- [Gendarme](https://github.com/spouliot/gendarme) - 可扩展的基于规则的工具,用于查找.NET应用程序和库中的问题。 \r\n- [Metrics-Net](https://github.com/Recognos/Metrics.NET) - 捕获CLR和应用程序级别的指标。因此,您知道发生了什么。 \r\n- [AspNet.Metrics](https://github.com/alhardy/aspnet-metrics) - 捕获CLR、应用程序级别的Web请求指标。使用Metrics-Net的中间件和扩展。 \r\n- [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet) - 强大的.NET性能基准库。 \r\n- [Bencher](https://bencher.dev/) - 一套连续基准测试工具,旨在在持续集成中捕获性能回归。 \r\n- [Codinion](https://www.codinion.com/) - 为C#和一些其他\"Visual\"特性提供了增强的语法突出显示。**[$]** \r\n- [NsDepCop](https://github.com/realvizu/NsDepCop) - 用于在C#项目中强制实施命名空间依赖规则的静态代码分析工具。 \r\n- [WebBen](https://github.com/omerfarukz/WebBen) - 用于对您的Hypertext Transfer Protocol (HTTP)服务器进行基准测试的工具。\r\n* [awesome-static-analysis](https://github.com/mre/awesome-static-analysis) - 针对各种编程语言的静态分析工具,链接和代码质量检查器的精选列表。\r\n* [CodeFormatter](https://github.com/dotnet/codeformatter) - CodeFormatter是使用Roslyn来自动重写我们的代码格式。\r\n* [DevSkim](https://github.com/Microsoft/DevSkim) - DevSkim是IDE扩展和语言分析器的框架,可在开发人员编写代码时在开发环境中提供内联安全性分析。\r\n* [RefactoringEssentials](https://github.com/icsharpcode/RefactoringEssentials) - Visual Studio扩展工具,支持分析和重构代码。\r\n* [roslyn-analyzers](https://github.com/dotnet/roslyn-analyzers) - Roslyn分析器分析您的代码的样式,质量和可维护性,设计和其他问题。\r\n* [StyleCopAnalyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) - StyleCop规则实现的.NET编译器平台。\r\n* [Audit.NET](https://github.com/thepirat000/Audit.NET) - 一个可扩展的框架,用于审核.NET和.NET Core中的执行操作。\r\n* [coverlet](https://github.com/tonerdo/coverlet) - Coverlet是.NET的跨平台代码覆盖框架。\r\n* [MiniCover](https://github.com/lucaslorentz/minicover) - 跨平台代码覆盖工具\r\n* [NBench](https://github.com/petabridge/NBench) - .NET应用程序的性能基准测试框架\r\n* [Nexogen.Libraries.Metrics](https://github.com/nexogen-international/Nexogen.Libraries.Metrics) - 用于在.NET中收集应用程序指标并将其导出到Prometheus的库。\r\n* [OpenCover](https://github.com/OpenCover/opencover) - 代码覆盖工具(仅适用于WINDOWS OS)\r\n* [PerformanceMonitor](https://github.com/dotnet-architecture/PerformanceMonitor) - .NET应用程序性能监视器。\r\n* [prometheus-net](https://github.com/prometheus-net/prometheus-net) - .NET指标,监视系统,检测应用程序的prometheus库。\r\n* [Prometheus.Client](https://github.com/PrometheusClientNet/Prometheus.Client) - Prometheus客户端。','代码分析和指标','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,23),('214c9cf9-a708-52dd-6009-3a0ff53f8680',0,'- [SharpCompress](https://github.com/adamhathcock/sharpcompress) - SharpCompress是用于.NET/Mono/Silverlight/WP7的压缩库,可以进行解压缩,支持rar、7zip、zip、tar、bzip2和gzip,提供了前向只读和文件随机访问API。它还实现了zip、tar、bzip2和gzip的写入支持。 \r\n- [DotNetZip.Semverd](https://github.com/haf/DotNetZip.Semverd) - 一个开源项目,提供了处理ZIP文件的.NET库以及一些相关工具。(是[不再维护 DotNetZip](https://archive.codeplex.com/?p=dotnetzip) 的分支) \r\n- [SharpZipLib](https://icsharpcode.github.io/SharpZipLib/) - 一个完全用C#编写的Zip、GZip、Tar和BZip2库,适用于.NET平台。 \r\n- [Snappy for Windows](https://snappy.machinezoo.com/) - 基于P/Invoke的.NET Snappy压缩库。 \r\n- [Snappy.Sharp](https://github.com/jeffesp/Snappy.Sharp) - 用C#实现的Google Snappy压缩算法。\r\n* [lz4net](https://github.com/MiloszKrajewski/K4os.Compression.LZ4) - 适用于所有.NET平台的超快速压缩算法。','压缩','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,26),('21c32610-8371-97fb-5e14-3a0fe670d770',0,'测试导入','测试.md','4a14cce8-795a-8c68-8c2a-3a0fe1c7215a','00000000-0000-0000-0000-000000000000','2024-01-04 19:37:55','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509',NULL,NULL,0),('22141ebb-7c79-d5a3-f662-3a0f83ae86b6',0,'我们的代码可直接编写在Src中,src中便是提供的模板使用\n\n当然,作为单独的模块或者示例,也可以通过前面的章节使用`脚手架`进行生成一个单独的模板\n\n## 使用脚手架创建代码目录\n![image.png](/prod-api/file/c364dd77-0905-22bc-c179-3a1004655d1b/true)\n我们本次的示例代码将全部放在源代码中的`sample`文件夹中,该文件夹只是提供的一个示例,作为顶层依赖,项目生成不会依赖于它\n\n![image.png](/prod-api/file/15ffd2d6-fe6d-7638-adc0-3a100467b186/true)\n进入对应的目录,使用\n``` shell\ndotnet new yi --name=Acme.BookStore\n```\n生成模板代码文件\n![image.png](/prod-api/file/0792c52d-d4c6-148b-0426-3a1004685bfc/true)\n\n然后将每一层项目手动添加到自己的项目解决方案中,右键添加现有方案\n\n![image.png](/prod-api/file/7a0fd471-767e-a5ed-eead-3a10046a90dd/true)\n\n设置启动项为Acme.BookStore.Web直接进行启动即可\n\n![image.png](/prod-api/file/32cccbae-df9d-b1be-dbc7-3a10046c47f6/true)\n\n> 可以看到swagger,至此一行代码没写,已经集成好了rbac与bbs的模块\n\n## 补充,去除内置的模块化\n由于模块化的存在,各个模板之间可以相互引用,如果我们的项目没有Bbs的功能,可直接去除依赖即可,相同的,没有Rbac也是可以直接去除的。\n\n当我们开发了属于自己的模块,其他项目也可以直接进行模块的依赖,非常的优雅\n\n去除模块依赖方式也非常的简单,只需要将各层相关的nuget或者项目依赖去除,将报错的红色的应用清理一下就完成了','1.创建应用服务端','e89c9593-f337-ada7-d108-3a0f83ae48e6','00000000-0000-0000-0000-000000000000','2023-12-16 15:22:53','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2024-01-10 15:25:59',0),('2319a427-c784-2b02-ea26-3a0ff53f8680',0,'- [Fody](https://github.com/Fody/Fody) - 编辑.net程序集的可扩展工具。\r\n- [ILRepack](https://github.com/gluck/il-repack) - ILMerge 的开源替代品。 \r\n- [Mono.Cecil](https://github.com/jbevain/cecil) - Cecil 是一个用于生成和检查以 ECMA CIL 格式表示的程序和库的库。','程序集','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,9),('259333a1-1672-cc4c-ae1e-3a0ff53ad549',0,'# AspNetCore面试题\r\n\r\n**1、什么是dot net core的startup class?**\r\n\r\n答:Startup class是dot net core应用的入口。所有的dot net core应用必须有这个class 这个类用来配置应用。\r\n\r\n  这个类的调用是在program main函数里面进行配置的。类的名字可以自己定义。\r\n\r\n**2、什么是中间件?**\r\n\r\n答:中间件在这里是指注入到应用中处理请求和响应的组件。\r\n\r\n**3、application builder的use和run方法有什么区别?**\r\n\r\n答:这两个方法都在start up class的configure方法里面调用。都是用来向应用请求管道里面添加中间件的。Use方法可以调用下一个中间件的添加,而run不会。\r\n\r\n**4、dot net core 管道里面的map拓展有什么作用?**\r\n\r\n答:可以针对不同的路径添加不同的中间件。\r\n\r\n**5、dot net core里面的路径是如何处理的?**\r\n\r\n答:路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。\r\n\r\n  主要有两种路径处理方式,常规路径处理和属性路径处理。常规路径处理就是用MapRoute的方式设定调用路径,属性路径处理是指在调用函数的上方设定一个路径属性。\r\n\r\n**6、如何在dot net core中激活session功能?**\r\n\r\n答:首先要添加session包. 其次要在config service方法里面添加session。然后又在configure方法里面调用usesession。\r\n\r\n**7、描述一下依赖注入后的服务生命周期?**\r\n\r\n答:asp.net core主要提供了三种依赖注入的方式\r\n\r\n其中AddTransient与AddSingleton比较好区别\r\n\r\nAddTransient瞬时模式:每次都获取一个新的实例\r\n\r\nAddSingleton单例模式:每次都获取同一个实例\r\n\r\n \r\n\r\n而AddTransient与AddScoped的区别更不容易区别一点\r\n\r\n首先这两种方式每次请求得到的都不是同一个对象,从这点看会发现这两个都一样。\r\n\r\n但是我们可以继续分细一点,虽然不同的请求得到的结果不同,但是我们可以在同一次请求中去获取多次实例测试。\r\n\r\n小总结:\r\n\r\nAddTransient瞬时模式:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例\r\n\r\nAddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例\r\n\r\nAddSingleton单例模式:每次都获取同一个实例\r\n\r\n**8、dot net core跟dot net比较有哪些更好的地方?**\r\n\r\n  答:第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。\r\n\r\n  第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。\r\n\r\n  第三是dot net core处理请求的效率更高,能够处理更多的请求。\r\n\r\n  第四是dot net core有更多的安装配置方法。\r\n\r\n**9、asp dot core有哪些好的功能?**\r\n\r\n答:第一是依赖注入。\r\n\r\n第二是日志系统架构。\r\n\r\n第三是引入了一个跨平台的网络服务器,kestrel。可以没有iis, apache和nginx就可以单独运行。\r\n\r\n第四是可以使用命令行创建应用。\r\n\r\n第五是使用APP settings json file来配置工程。\r\n\r\n第六是使用start up来注册服务。\r\n\r\n第七是更好的支持异步编程。\r\n\r\n第八是支持web socket和signal IR。\r\n\r\n第九是对于跨网站的请求的预防和保护机制。','AspNetCore面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,1),('2694ee8d-3b1a-b0a3-e2e0-3a0ff58533cf',0,'**C#Unity--3D迷宫**\n\n**作者心得**\n2d迷宫都有了\n能少的了3d???\n这不就来了?\n\n**源代码**\n\n```csharp\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class Player : MonoBehaviour\n{\n Transform m_camTransform;\n Vector3 m_camRot;\n float m_camHeight = 1.4f;\n public Transform m_transform;\n CharacterController m_ch;\n float m_movSpeed = 3.0f;\n float m_gravity = 2.0f;\n public int m_life = 5;\n // Start is called before the first frame update\n void Start()\n {\n m_transform = this.transform;\n m_ch = this.GetComponent();\n m_camTransform = Camera.main.transform;\n m_camTransform.position = m_transform.TransformPoint(0, m_camHeight,0);\n m_camTransform.rotation = m_transform.rotation;\n m_camRot = m_camTransform.eulerAngles;\n Cursor.lockState = CursorLockMode.Locked;\n Cursor.visible = false;\n }\n\n // Update is called once per frame\n void Update()\n {\n if (m_life <= 0)\n return;\n Control();\n }\n void Control()\n {\n float rh = Input.GetAxis(\"Mouse X\");\n float rv = Input.GetAxis(\"Mouse Y\");\n m_camRot.x -= rv;\n m_camRot.y += rh;\n m_camTransform.eulerAngles = m_camRot;\n Vector3 camrot = m_camTransform.eulerAngles;\n camrot.x = 0;camrot.z = 0;\n m_transform.eulerAngles = camrot;\n float xm = 0, ym = 0, zm = 0;\n //ym -= m_gravity * Time.deltaTime;\n if (Input.GetKey(KeyCode.W))\n {\n zm += m_movSpeed * Time.deltaTime;\n }\n if (Input.GetKey(KeyCode.S))\n {\n zm -= m_movSpeed * Time.deltaTime;\n }\n if (Input.GetKey(KeyCode.A))\n {\n xm -= m_movSpeed * Time.deltaTime;\n }\n else if (Input.GetKey(KeyCode.D))\n {\n xm += m_movSpeed * Time.deltaTime;\n }\n m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));\n\n m_camTransform.position = m_transform.TransformPoint(0,m_camHeight, 0);\n }\n}\n\n```\n**效果截图**\n![image.png](/prod-api/file/3b9028e9-fdb9-8981-6d29-3a0ff5850b28/true)\n![image.png](/prod-api/file/452132ed-d7df-8f85-6acc-3a0ff5851bda/true)\n\n**作者的话**\n迷宫算是unity的入门\n毕竟都是我自学,也没打算研究太深\n另外,我记得最后unity弄了一个大型3d跑酷的项目\n为此,还特意去学了建模\n那个项目奔跑,跳跃,捡道具,玩法较多\n可惜,毕竟年代久远加换了n次系统,现在貌似找不到了\n可惜!\n','C#Unity--3D迷宫','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:54:28','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('26db64b6-61c4-d057-3f49-3a0ff53f8682',0,'\r\n- [Cledev.OpenAI](https://github.com/lucabriguglia/Cledev.OpenAI) - 用于OpenAI的.NET SDK,包括ChatGPT、DALL-E和Whisper APIs以及一个Blazor Server游乐场。','OpenAI','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,75),('2adcde6b-ced1-8a06-b92f-3a0ff53f8680',0,'- [Unfold](https://github.com/thomasvm/unfold) - 用于.NET Web应用程序的基于PowerShell的部署解决方案 \r\n- [DbUp](https://github.com/DbUp/DbUp) - 用于将更改部署到SQL Server数据库的.NET库。它跟踪已经运行的SQL脚本,并运行需要的更改脚本,以使您的数据库保持最新 \r\n- [Octo Pack](https://github.com/OctopusDeploy/OctoPack) - 用于构建您的应用程序的NuGet包,以便使用Octopus Deploy等工具进行部署 \r\n- [yuniql](https://github.com/rdagumampan/yuniql) - 免费且开源的架构版本控制和迁移工具,使用.NET Core制作。使用纯SQL运行迁移,在普通文件夹中安排版本,并通过独立的CLI(无需CLR)、Azure Pipelines、Docker或ASP.NET Core代码从CSV中种子数据。详细信息请访问 [https://yuniql.io](https://yuniql.io/)\r\n','部署','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,33),('2e3b7f34-b6d7-78c3-6c56-3a0ff53f8683',0,'\r\n- [SqlKata](https://sqlkata.com/) - 一个优雅的SQL查询构建器,支持复杂查询、联接、子查询、嵌套的条件、供应商引擎目标等等。','SQL构建器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,82),('306d2f85-60de-0f9d-2770-3a0ff53f8682',0,'\r\n- [Community Toolkit](https://github.com/CommunityToolkit) - 用于各种.NET技术的控件和辅助库以及示例的集合。包括由Microsoft支持的现代MVVM库,包括[Windows Community Toolkit](https://github.com/CommunityToolkit/WindowsCommunityToolkit) 、[MAUI Community Toolkit](https://github.com/CommunityToolkit/Maui) 和[Dotnet Community Toolkit](https://github.com/CommunityToolkit/dotnet) 。 \r\n- [Caliburn.Micro](https://github.com/Caliburn-Micro/Caliburn.Micro) - 一个小而强大的框架,专为在所有XAML平台上构建应用程序而设计。它对MV*模式的强大支持将使您能够快速构建解决方案,无需牺牲代码质量或可测试性。 \r\n- [MVVM Light Toolkit](https://github.com/lbugnion/mvvmlight) - 该工具包的主要目的是加速在WPF、Silverlight、Windows Store(RT)和Windows Phone中创建和开发MVVM应用程序。 \r\n- [Catel](https://www.catelproject.com/) - Catel是一个应用程序开发平台,重点关注MVVM(WPF、Silverlight、Windows Phone和WinRT)和MVC(ASP.NET MVC)。Catel的核心包含了IoC容器、模型、验证、记忆、消息中介器、参数检查等。 \r\n- [UpdateControls](https://updatecontrols.net/cs/) - Update Controls不需要您实现`INotifyPropertyChanged`或声明`DependencyProperty`。它直接连接控件到CLR属性。这使它非常适合Model/View/ViewModel模式。 \r\n- [ReactiveUI](https://github.com/reactiveui/reactiveui/) - 用于.NET的MVVM框架,集成了Reactive Extensions(Rx)框架,使开发人员能够使用WPF、Windows Store应用程序、WP8或Xamarin构建优雅的可测试应用程序。 \r\n- [Okra App Framework](https://okraframework.github.io/) - 专为Windows 8.1构建的面向应用程序的MVVM框架,考虑了依赖注入,包括一套完整的Visual Studio MVVM模板。 \r\n- [Prism](https://github.com/PrismLibrary/Prism) - 一个跨平台的桌面和移动MVVM开发框架。 \r\n- [Win Application Framework (WAF)](https://github.com/jbe2277/waf) - 一个轻量级的框架,帮助您创建结构良好的WPF和UWP应用程序。它支持您应用分层架构和Model-View-ViewModel模式。 \r\n- [MVVMCross](https://github.com/MvvmCross/MvvmCross) - 跨平台的mvvm移动开发框架,适用于WPF、Silverlight for WP7和WP8、Mono for Android、MonoTouch for iOS、Windows通用项目(WPA8.1和Windows 8.1商店应用程序)。广泛使用可移植类库(PCL)来提供可维护的跨平台C#本机应用程序。 \r\n- [Stylet](https://github.com/canton7/stylet/) - 受Caliburn Micro启发的最小MVVM框架,具有良好的文档、高测试覆盖率和自己的IoC容器 \r\n- [Gemini](https://github.com/tgjones/gemini) - 在概念上类似于Visual Studio Shell的IDE框架。基于WPF、AvalonDock和Caliburn Micro构建。 \r\n- [Toms Toolbox](https://github.com/tom-englert/TomsToolbox) - 用于轻松构建基于[Managed Extensibility Framework (MEF)](https://docs.microsoft.com/en-us/dotnet/framework/mef/) 的模块化MVVM应用程序的可视化组合框架。 \r\n- [MVVM Dialogs](https://github.com/FantasticFiasco/mvvm-dialogs) - 简化了在WPF或UWP中使用MVVM时从视图模型打开对话框的概念的框架。 \r\n- [Smaragd](https://github.com/nkristek/Smaragd) - 一个跨平台、轻量级的库,用于使用MVVM架构开发.NET应用程序。 \r\n- [EBind](https://github.com/SIDOVSKY/EBind) - 简洁、快速且功能丰富的.NET数据绑定解决方案。\r\n','MVVM','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,71),('3075ba2d-9ff6-c20a-ba97-3a0ff53f8681',0,'\r\n- [Sandcastle](https://github.com/EWSoftware/SHFB) - 类似于 NDoc 的 Sandcastle 帮助文件生成器。 \r\n- [SourceBrowser](https://github.com/KirillOsenkov/SourceBrowser) - 源代码浏览器网站生成工具,用于支持 [https://referencesource.microsoft.com。](https://referencesource.microsoft.com./) \r\n- [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.WebApi) - 无缝地为 Web API 项目添加 Swagger 文档。 \r\n- [F# Formatting](https://fsprojects.github.io/FSharp.Formatting/) - 用于从 F# 脚本文件、Markdown 文档和内联 XML 或 Markdown 注释文档化 F# 和 C# 项目的工具。 \r\n- [DocFX](https://github.com/dotnet/docfx) - 用于构建和发布.NET项目的API文档的工具。 \r\n- [DocNet](https://github.com/FransBouma/DocNet) - 友好的静态文档生成器,使用Markdown文件来构建内容。','文档','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,37),('31c6abdb-855d-d980-1d58-3a0ff53f8683',0,'- [FluentScheduler](https://github.com/fluentscheduler/FluentScheduler) - 具有流畅界面的任务调度程序,可从您的应用程序运行自动化作业 \r\n- [NCrontab](https://github.com/atifaziz/NCrontab) - 用于解析和格式化 [crontab](http://crontab.org/) 表达式以及根据 crontab 日程计算时间发生的类库 \r\n- [NCrontab.Scheduler](https://github.com/thomasgalliker/NCrontab.Scheduler) - 用于调度基于 NCrontab 的任务的简单任务调度库 \r\n- [QuartzNet](https://github.com/quartznet/quartznet) - Quartz企业调度程序 .NET 版 \r\n- [Hangfire](https://github.com/HangfireIO) - 在.NET应用程序内执行fire-and-forget、延迟和循环任务的简单方法 \r\n- [Chroniton](https://github.com/leosperry/Chroniton) - 用于在计划上运行强类型作业(任务)的简单、完全可集成和可自定义库。 \r\n- [DurableTask](https://github.com/Azure/durabletask) - 该框架允许用户使用异步/等待功能在C#中编写长时间运行的持久工作流。 \r\n- [Workflow Core](https://github.com/danielgerlag/workflow-core) - 轻量级可嵌入的工作流引擎\r\n- [Coravel](https://github.com/jamesmh/coravel) - .Net Core符合Laravel:调度,排队等\r\n- [Gofer.NET](https://github.com/brthor/Gofer.NET) - 用于.NET Core的分布式后台任务/作业的简易C#API。','任务调度','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,88),('327f39b2-9e42-3615-6a8b-3a0fdcb0be5d',0,'## 2日\n1.正式上线`头像选择`功能\n2.新增`excel`上传下载功能\n3.支持接口`枚举`swagger友好显示\n\n## 3日\n1.新增右上角开源`地址导航`\n2.新增`文章导入`功能\n3.禁用操作主题或者文章时候进行`切换`\n\n## 4日\n1.上线`文章导入`功能,支持默认与vuepress方式\n2.新增首页用户注册人数、在线人数、昨日新增`用户分析`模块\n3.完善`面包屑`的显示及跳转\n\n## 5日\n1.完善首页`用户分析`模块实时显示\n\n## 6日\n1.开发`第三方登录OAuth`框架模块\n2.优化`置顶主题`的显示\n\n## 7日\n1.后端OAuth模块接入`QQ`实现\n2.后端OAuth模块接入`Gitee`实现\n3.随着业务的累积,优化`领域划分`结构\n4.优化`主题的高度`样式显示\n5.优化`目录的提示`显示交互体验\n6.新增用户头像的`悬浮窗口`显示\n\n## 8日\n1.优化`板块置顶`显示\n2.优化`在线人数`显示\n3.添加`第三方登录`页面搭建\n\n## 9日\n1.个人中心添加`第三方登录`界面\n2.登录页面添加`第三方登录`界面\n\n## 10日\n1.后端添加`脚手架`模板生成功能\n2.正式上线`第三方登录`QQ登录、Gitee登录\n\n## 11日\n1.后端优化`索引`结构\n2.后端实现`积分模块`,包含签到、钱钱、经验、排行榜\n\n## 12日\n1.后端初步搭建`任务调度`管理模块\n\n## 13日\n1.完成上线`任务调度`管理模块\n2.添加上线`签到`功能页面','2024年1月','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','00000000-0000-0000-0000-000000000000','2024-01-02 22:11:31','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2024-01-13 17:22:56',0),('3357ce5e-6027-0983-4015-3a0ff53f8682',0,'- [Microsoft Ajax Minifier](https://archive.codeplex.com/?p=ajaxmin) - 包含JS和CSS最小化器,具有最高的性能,因为它们专门为.NET设计。可选择为JS代码生成源映射。 \r\n- [Web Markup Minifier](https://github.com/Taritsyn/WebMarkupMin) - .NET库,包含一组标记最小化器。该项目的目标是通过减小HTML、XHTML和XML代码的大小来提高Web应用程序的性能。 \r\n- [CompressedStaticFiles](https://github.com/AnderssonPeter/CompressedStaticFiles) - 无需按需压缩即可将压缩的静态文件发送到浏览器,还支持在浏览器指示支持时发送更高级的图像格式。','最小化器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,70),('342681a0-40ff-9f91-9815-3a0fe9b5b449',0,'预处理器指令是一组在编译C#代码之前处理源代码的指令。它们以#符号开头,并用于控制编译器的行为。预处理器指令在代码中不执行,而是在编译代码之前对其进行修改。本文将介绍C#中常用的预处理器指令,并提供一些示例代码。\r\n## 条件编译指令\r\n\r\n条件编译指令用于根据特定条件编译代码。这些条件可以是预定义的符号,也可以是自定义的符号。\r\n### #if 指令\r\n\r\n#if 指令指定一个条件,只有当该条件为 true 时,代码才会被编译。\r\n\r\n```arduino\r\n\r\n#define DEBUG\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#endif\r\n```\r\n\r\n\r\n### #elif 指令\r\n\r\n#elif 指令允许您指定多个条件。如果前面的 #if 或 #elif 条件不成立,则编译器会测试下一个条件。\r\n\r\n```arduino\r\n\r\n#define PLATFORM_X64\r\n#if PLATFORM_X86\r\n Console.WriteLine(\"32位平台\");\r\n#elif PLATFORM_X64\r\n Console.WriteLine(\"64位平台\");\r\n#endif\r\n```\r\n\r\n\r\n### #else 指令\r\n\r\n#else 指令指定一个条件不成立时执行的代码块。\r\n\r\n```arduino\r\n\r\n#define DEBUG\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#else\r\n Console.WriteLine(\"Release 版本\");\r\n#endif\r\n```\r\n\r\n\r\n### #endif 指令\r\n\r\n#endif 指令指示条件编译块的结束。\r\n\r\n```arduino\r\n\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#else\r\n Console.WriteLine(\"Release 版本\");\r\n#endif\r\n```\r\n\r\n\r\n## 行号指令\r\n\r\n行号指令允许您在编译器输出中包含源代码行号。\r\n### #line 指令\r\n\r\n#line 指令允许您更改行号和文件名,以控制编译器输出。\r\n\r\n```arduino\r\n\r\n#line 200 \"MyFile.cs\"\r\nConsole.WriteLine(\"输出在第 200 行,文件名为 MyFile.cs\");\r\n```\r\n\r\n\r\n### #line default 指令\r\n\r\n#line default 指令将行号指令重置为默认值,文件名也设置为当前文件的文件名。\r\n\r\n```arduino\r\n\r\n#line default\r\nConsole.WriteLine(\"重置为默认行号和文件名\");\r\n```\r\n\r\n\r\n## 错误指令\r\n\r\n错误指令允许您在代码中生成编译错误和警告。\r\n### #error 指令\r\n\r\n#error 指令在代码中生成一个编译错误,并显示指定的错误消息。\r\n\r\n```arduino\r\n\r\n#if PLATFORM_X86\r\n Console.WriteLine(\"32位平台\");\r\n#else\r\n #error 仅支持32位平台\r\n#endif\r\n```\r\n\r\n\r\n### #warning 指令\r\n\r\n#warning 指令在代码中生成一个编译警告,并显示指定的警告消息。\r\n\r\n```arduino\r\n\r\n#warning 这段代码需要进行性能优化\r\n```\r\n\r\n\r\n## 版本指令\r\n\r\n版本指令用于指定程序集的版本信息\r\n\r\n### #define 指令\r\n\r\n#define 指令用于定义符号。定义符号后,您可以在代码中使用 #if 指令来检查该符号是否定义。\r\n\r\n```arduino\r\n\r\n#define VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#else\r\n Console.WriteLine(\"版本 2\");\r\n#endif\r\n```\r\n\r\n\r\n### #undef 指令\r\n\r\n#undef 指令用于取消定义符号。\r\n\r\n```arduino\r\n\r\n#define VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#endif\r\n\r\n#undef VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#else\r\n Console.WriteLine(\"未定义版本\");\r\n#endif\r\n```\r\n\r\n\r\n## 程序集指令\r\n\r\n程序集指令用于指定程序集的元数据。\r\n### #assembly 指令\r\n\r\n#assembly 指令指定程序集的元数据,如程序集名称、版本、作者、版权等。\r\n\r\n```csharp\r\n\r\n[assembly: AssemblyTitle(\"MyApplication\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyDescription(\"这是我的应用程序\")]\r\n```\r\n\r\n\r\n### #pragma 指令\r\n\r\n#pragma 指令用于指定编译器的行为。\r\n\r\n```arduino\r\n\r\n#pragma warning disable 0168\r\n```\r\n\r\n\r\n\r\n以上代码将禁用警告 0168。\r\n## 总结\r\n\r\n以上是C#中常用的预处理器指令,它们允许您在编译代码之前修改源代码和编译器行为。在编写C#程序时,预处理器指令是一个非常有用的工具,可以帮助您控制编译器的行为,并根据不同的条件编译不同的代码。\r\n','C# 预处理器指令','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,25),('345c66bf-c163-f40c-09aa-3a0ff53f867f',0,'- [.NET Boxed Templates](https://github.com/Dotnet-Boxed/Templates) - 包含一切的 .NET 项目模板,提供了启动所需的最少代码量,以加速开发过程。 \r\n- [ASP.NET Core Starter Kit](https://github.com/kriasoft/aspnet-starter-kit) - 后端:.NET Core、EF Core、C#;前端:Babel、Webpack、React、CSS 模块。 \r\n- [ProjectScaffold](https://github.com/fsprojects/ProjectScaffold) - 由 F# 基金会推荐的典型 .NET 解决方案,包括文件系统设置、用于依赖项的 Paket 和用于构建/测试自动化的 FAKE。默认情况下,构建过程还会编译文档并生成 NuGet 包。 \r\n- [Serene](https://github.com/volkanceylan/Serenity) - Serenity 是一个旨在简化和缩短基于服务架构的数据中心业务应用程序开发的 ASP.NET MVC 应用程序平台。Serenity 是一个用于构建 Serenity 应用程序的启动模板。 \r\n- [Side-Waffle](https://github.com/LigerShark/side-waffle) - 用于 Web 和桌面开发的大量有用模板的集合。 \r\n- [Template10](https://github.com/Windows-XAML/Template10) - 包含设计模式的 Windows 10 模板。 \r\n- [Nucleus](https://github.com/alirizaadiyahsi/Nucleus) - 使用 ASP.NET Core API 分层架构的 Vue 启动应用程序模板,采用 JWT 基于身份验证。 \r\n- [JHipster.NET](https://github.com/jhipster/jhipster-dotnetcore) - JHipster 蓝图,用 asp.net core 替换原始的 SpringBoot 后端。Jhipster 的主要目标是展示现代 Web 开发的最佳实践,用 Java 实现。因此,该项目的目标是在 .NET 中做同样的事情。前端可以使用 Angular、React 和不久的将支持 Blazor。\r\n* [aspnet-core-react-template](https://github.com/bradymholt/aspnet-core-react-template) - ASP.NET Core/ React SPA应用程序模板。\r\n* [AspNetCoreSpa](https://github.com/asadsahi/AspNetCoreSpa) - Asp.Net Core和Angular 8 SPA Fullstack应用程序模板。\r\n* [ASP.NET-MVC-Template](https://github.com/NikolayIT/ASP.NET-MVC-Template) - 带有Angular的ASP.NET MVC 5,ASP.NET Core和ASP.NET Core的现成模板。\r\n* [AddFeatureFolders](https://github.com/OdeToCode/AddFeatureFolders) - 为ASP.NET Core中的MVC控制器和视图启用功能文件夹。\r\n* [Angular Visual Studio Webpack Starter](https://github.com/damienbod/AngularWebpackVisualStudio) - 用于Webpack,Visual Studio,ASP.NET Core和Angular的模板。应用程序的客户端和服务器端都在一个ASP.NET Core项目中实现,这使得部署更容易。\r\n* [CleanArchitecture](https://github.com/ardalis/CleanArchitecture) - 一个高度适配的ASP.NET Core框架。\r\n* [CleanArchitecture (SPA)](https://github.com/JasonGT/CleanArchitecture) - 遵循Clean Architecture的原理使用Angular 8和ASP.NET Core 3创建单页应用程序(SPA)的解决方案模板\r\n* [DNTFrameworkCoreTemplate](https://github.com/rabbal/DNTFrameworkCoreTemplate) - 基于[DNTFrameworkCore]的Boilerplate项目模板。\r\n* [dotnet new caju](https://github.com/ivanpaulovich/dotnet-new-caju) - 代码整洁框架,[clean-architecture-manga](https://github.com/ivanpaulovich/clean-architecture-manga)。\r\n* [EISK](https://github.com/EISK/eisk.webapi) - 为开发人员资源提供简单的用例,以使用[体系结构最佳实践]在.NET Core之上构建可伸缩的应用程序 (DDD, onion architecture etc)\r\n* [JavaScriptServices](https://github.com/aspnet/JavaScriptServices) - Microsoft ASP.NET核心JavaScript服务。\r\n* [kendo-ui-core](https://github.com/telerik/kendo-ui-core) - 一个基于jQuery的HTML5小部件库,用于构建现代Web应用程序。\r\n* [QuickApp](https://github.com/emonney/QuickApp) - 具有完整登录,用户和角色管理的ASP.NET Core / Angular4启动项目模板。\r\n* [Serenity](https://github.com/volkanceylan/Serenity) - Serenity是一个ASP.NET MVC / TypeScript应用程序框架,旨在通过基于服务的体系结构,简化和缩短以数据为中心的应用程序开发。\r\n* [Toucan](https://github.com/mrellipse/toucan) - 用于构建单页应用程序的Boilerplate。服务器是围绕SOLID原则设计的多项目.Net Core解决方案。客户端是TypeScript 2,Vuejs 2,Vuex 2。','应用模板','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,1),('34dc6ac8-b63c-7dcb-14ec-3a0ff53f8681',0,'\r\n- [.NET Interactive](https://github.com/dotnet/interactive) - .NET Interactive将.NET的强大功能嵌入到您的交互式体验中。','交互式编程','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,57),('3721d2e0-5c12-ddec-8437-3a0ff5429c67',0,'![image.png](/prod-api/file/ae2370b5-e190-706c-6470-3a0ff5428232/true)','总览','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:41:44','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('38f0c9ee-10b0-b273-f75b-3a0fe9b5b449',0,'C# 中的结构体 (Struct) 是一种用户定义的值类型。与类 (Class) 不同,结构体是一种轻量级的类型,适用于小型数据结构。结构体可以包含数据成员和方法成员。\r\n## 结构体的定义\r\n\r\n结构体的定义使用 `struct` 关键字,结构体名称遵循 Pascal 命名法,并且应该以大写字母开头。以下是结构体的一般语法:\r\n\r\n```csharp\r\n\r\nstruct StructName\r\n{\r\n // 数据成员和方法成员\r\n}\r\n```\r\n\r\n\r\n\r\n下面是一个简单的结构体定义的示例:\r\n\r\n```csharp\r\n\r\nstruct Point\r\n{\r\n public int X;\r\n public int Y;\r\n\r\n public Point(int x, int y)\r\n {\r\n X = x;\r\n Y = y;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在这个示例中,我们定义了一个 `Point` 结构体,它包含了两个整型的数据成员 `X` 和 `Y`,以及一个构造函数用于初始化这两个数据成员。\r\n## 结构体的实例化\r\n\r\n结构体是一种值类型,所以在声明结构体变量时,它会被分配在栈上而不是堆上。可以使用 `new` 运算符来实例化结构体对象,也可以使用默认构造函数来初始化结构体对象。\r\n\r\n```csharp\r\n\r\nPoint p1 = new Point(10, 20);\r\nPoint p2 = default(Point); // 使用默认构造函数初始化\r\n```\r\n\r\n\r\n## 结构体的使用\r\n\r\n结构体可以像类一样使用。可以访问结构体的数据成员和方法成员。\r\n\r\n```csharp\r\n\r\nConsole.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\np1.X = 100;\r\nConsole.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n```\r\n\r\n\r\n## 结构体的比较\r\n\r\n结构体可以使用比较运算符进行比较。在默认情况下,结构体的比较是按值进行的,即比较结构体的每个数据成员。\r\n\r\n```csharp\r\n\r\nPoint p3 = new Point(10, 20);\r\nif (p1 == p3)\r\n{\r\n Console.WriteLine(\"p1 and p3 are equal.\");\r\n}\r\nelse\r\n{\r\n Console.WriteLine(\"p1 and p3 are not equal.\");\r\n}\r\n```\r\n\r\n\r\n## 总结\r\n\r\n结构体是一种轻量级的值类型,适用于小型数据结构。与类不同,结构体是一种值类型,分配在栈上而不是堆上。结构体可以包含数据成员和方法成员,并且可以使用比较运算符进行比较。\r\n## 示例代码\r\n\r\n以下是一个完整的示例程序,用于演示结构体的使用:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nstruct Point\r\n{\r\n public int X;\r\n public int Y;\r\n\r\n public Point(int x, int y)\r\n {\r\n X = x;\r\n Y = y;\r\n }\r\n}\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Point p1 = Point(10, 20);\r\n Point p2 = default(Point);\r\n\r\n Console.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n Console.WriteLine(\"p2.X = {0}, p2.Y = {1}\", p2.X, p2.Y);\r\n\r\n p1.X = 100;\r\n Console.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n\r\n Point p3 = new Point(10, 20);\r\n if (p1 == p3)\r\n {\r\n Console.WriteLine(\"p1 and p3 are equal.\");\r\n }\r\n else\r\n {\r\n Console.WriteLine(\"p1 and p3 are not equal.\");\r\n }\r\n }\r\n}\r\n```\r\n\r\n输出:\r\n```\r\np1.X = 10, p1.Y = 20\r\np2.X = 0, p2.Y = 0\r\np1.X = 100, p1.Y = 20\r\np1 and p3 are equal.\r\n```\r\n','C# 结构(Struct)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,17),('391cc105-0620-02c2-f020-3a0ff53f8680',0,'- [ASP.NET Identity](https://github.com/aspnet/Identity/) - ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的身份验证库。\r\n- [ASP.NET SAML](https://github.com/jitbit/AspNetSaml) - 用于 ASP.NET 应用程序的 SAML 认证支持。 \r\n- [DotNetOpenAuth](https://github.com/DotNetOpenAuth/DotNetOpenAuth) - OpenID、OAuth 和 InfoCard 协议的 C# 实现。 \r\n- [Logibit Hawk](https://github.com/logibit/logibit.hawk/) - F# [Hawk](https://github.com/outmoded/hawk) 认证库。 \r\n- [IdentityModel](https://github.com/IdentityModel) - 用于 .NET 4.5 和 MVC4/Web API 中的身份和访问控制的辅助库。 \r\n- [IdentityServer](https://github.com/IdentityServer) - 可扩展的 OAuth2 和 OpenID Connect 提供程序框架。 \r\n * [IdentityServer4.EntityFramework](https://github.com/IdentityServer/IdentityServer4.EntityFramework) - EF的IdentityServer4库。\r\n * [IdentityServer4.MongoDB](https://github.com/diogodamiani/IdentityServer4.MongoDB) - MongoDB 的IdentityServer4库。\r\n * [IdentityServer4.EntityFrameworkCore](https://github.com/2020IP/TwentyTwenty.IdentityServer4.EntityFrameworkCore) - EF Core 的IdentityServer4库。\r\n * [IdentityServer4.Templates](https://github.com/IdentityServer/IdentityServer4.Templates) - IdentityServer4模板.\r\n- [OAuth](https://github.com/danielcrenna/vault/tree/master/oauth) - 用 C# 编写的生成 OAuth 1.0a 签名的轻量级库。 \r\n- [Stuntman](https://rimdev.io/stuntman/) - Stuntman 是一个用于在开发过程中模拟用户身份的库,利用 .NET Claims Identity。 \r\n- [openiddict](https://github.com/openiddict/openiddict-core) - 灵活多用途的 .NET OAuth 2.0/OpenID Connect 堆栈。\r\n * [oidc-debugger](https://github.com/nbarbettini/oidc-debugger) - OAuth 2.0和OpenID Connect调试工具\r\n* [AspNet.Security.OpenIdConnect.Server](https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server) - 用于OWIN / Katana和ASP.NET Core的OpenID Connect / OAuth2服务器框架。\r\n* [Auth0](https://github.com/auth0/auth0.net) - Auth0身份验证和管理API的.NET客户端。\r\n* [Casbin.NET](https://github.com/casbin-net/Casbin.NET) - 支持ACL,RBAC,ABAC的授权库。\r\n* [stormpath-sdk](https://github.com/stormpath/stormpath-sdk-dotnet) - Stormpath使开发人员能够将用户身份验证,用户管理和安全工作流程快速构建到其应用程序中。\r\n* [aspnetcore-security-headers](https://github.com/juunas11/aspnetcore-security-headers) - 用于向ASP.NET Core应用程序添加安全标头的中间件。\r\n* [HtmlSanitizer](https://github.com/mganss/HtmlSanitizer) - 清除HTML以避免XSS攻击。\r\n* [jose-jwt](https://github.com/dvsekhvalnov/jose-jwt) - 用于处理JOSE对象的库(JWT,JWA,JWS及相关)。\r\n* [Jwt.Net](https://github.com/jwt-dotnet/jwt) - Jwt.Net,一个用于.NET的JWT(JSON Web令牌)实现。\r\n* [JWT Simple Server](https://github.com/Xabaril/JWTSimpleServer) - 用于ASP.NET Core的轻量级动态jwt服务器。\r\n* [NWebsec](https://github.com/NWebsec/NWebsec) - ASP.NET的安全库。\r\n* [reCAPTCHA](https://github.com/PaulMiami/reCAPTCHA) - 用于ASP.NET Core的reCAPTCHA 2.0。\r\n* [roslyn-security-guard](https://github.com/dotnet-security-guard/roslyn-security-guard) - 旨在帮助.NET应用程序进行安全审计的Roslyn分析器。\r\n* [OwaspHeaders](https://github.com/GaProgMan/OwaspHeaders.Core) - .NET Core中间件,用于注入Owasp推荐的HTTP标头,以提高安全性。\r\n* [Security](https://github.com/aspnet/Security) - 于Web应用程序的安全性和授权的中间件。\r\n* [SecurityHeaders](https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders) - 允许向ASP.NET Core网站添加安全标头的小包。','认证授权','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,11),('394a5e45-3061-c7de-b2ab-3a0fe6ad9c4c',1,'import axios, {\r\n AxiosInstance,\r\n AxiosError,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n} from \"axios\";\r\nimport { ElMessage } from \"element-plus\";\r\nimport qs from \"qs\";\r\n\r\n// 数据返回的接口\r\n// 定义请求响应参数,不含data\r\ninterface Result {\r\n code: number;\r\n msg: string;\r\n}\r\n\r\n// 请求响应参数,包含data\r\ninterface ResultData extends Result {\r\n newslist?: T;\r\n}\r\nenum RequestEnums {\r\n TIMEOUT = 20000,\r\n OVERDUE = 600, // 登录失效\r\n FAIL = 999, // 请求失败\r\n SUCCESS = 200, // 请求成功\r\n}\r\nconst config = {\r\n // 默认地址\r\n // baseURL: import.meta.env.VITE_APP_API_BASE_URL as string,\r\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\r\n // 设置超时时间\r\n timeout: RequestEnums.TIMEOUT as number,\r\n};\r\n\r\nclass RequestHttp {\r\n service: AxiosInstance;\r\n maxNum: number;\r\n completeCount: number;\r\n urls: AxiosRequestConfig[];\r\n len: number;\r\n public constructor(config: AxiosRequestConfig) {\r\n // 实例化axios\r\n this.service = axios.create(config);\r\n this.maxNum = 2;\r\n this.completeCount = 0;\r\n this.urls = [];\r\n this.len = 0;\r\n this.service.interceptors.request.use(\r\n (config: AxiosRequestConfig) => {\r\n // console.log(config)\r\n return this.enqueue(config);\r\n // return config\r\n },\r\n (error: AxiosError) => {\r\n Promise.reject(error);\r\n }\r\n );\r\n this.service.interceptors.response.use(\r\n (response: AxiosResponse) => {\r\n const { data, config } = response;\r\n if (data.code === RequestEnums.OVERDUE) {\r\n localStorage.setItem(\"token\", \"\");\r\n return Promise.reject(data);\r\n }\r\n if (data.code && data.code !== RequestEnums.SUCCESS) {\r\n ElMessage.error(data);\r\n return Promise.reject(data);\r\n }\r\n return data;\r\n },\r\n (error: AxiosError) => {\r\n const { response } = error;\r\n if (response) {\r\n this.handleCode(response.status);\r\n }\r\n if (!window.navigator.onLine) {\r\n ElMessage.error(\"网络连接失败\");\r\n }\r\n }\r\n );\r\n }\r\n handleCode(code: number): void {\r\n switch (code) {\r\n case 401:\r\n ElMessage.error(\"登录失败,请重新登录\");\r\n break;\r\n default:\r\n ElMessage.error(\"请求失败\");\r\n break;\r\n }\r\n }\r\n\r\n // 常用方法封装\r\n get(url: string, params?: object): Promise> {\r\n return this.service.get(url, { params });\r\n }\r\n post(url: string, params?: object): Promise> {\r\n return this.service.post(url, qs.stringify(params));\r\n }\r\n put(url: string, params?: object): Promise> {\r\n return this.service.put(url, qs.stringify(params));\r\n }\r\n delete(url: string, params?: object): Promise> {\r\n return this.service.delete(url, { params });\r\n }\r\n\r\n private enqueue(config: AxiosRequestConfig) {\r\n this.urls.push(config);\r\n this.len++;\r\n if (this.completeCount < this.maxNum) {\r\n this.next();\r\n }\r\n }\r\n\r\n private next() {\r\n let count = this.completeCount++;\r\n this.service.interceptors.request.use((config:AxiosRequestConfig)=>{\r\n console.log()\r\n })\r\n }\r\n}\r\n\r\n// 导出一个实例对象\r\nexport default new RequestHttp(config);\r\n','demo.txt','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:44:18','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:44:22',0),('3a17ec67-1bd1-6275-515a-3a0ff53f8680',0,'\r\n- [cmd](https://github.com/manojlds/cmd) - 一个用于以更简单方式运行外部程序的C#库。演示了C#的“动态”特性。','DLR','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,36),('3d055ac4-e5bf-2546-3c46-3a0fe6a6a54f',1,'测试导入11111111','测试.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:36:41','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:36:54',0),('3d74a219-292e-21df-3fe4-3a0ff53f8684',0,'* [Fleck](https://github.com/statianzo/Fleck) - Fleck是C#中的WebSocket服务器实现。 Fleck不需要继承,容器或其他引用。\r\n* [SignalR](https://github.com/SignalR/SignalR) - Web应用程序的实时Web功能,包括服务器端推送。\r\n* [SuperSocket](https://github.com/kerryjiang/SuperSocket) - 轻量级,跨平台和可扩展的套接字服务器应用程序框架。\r\n* [Websocket-Sharp](https://github.com/sta/websocket-sharp) - WebSocket协议的C#客户端和服务器实现。\r\n* [WebSocket4NET](https://archive.codeplex.com/?p=websocket4net) - 适用于.NET 2.0+、Xamarin、Mono、Silverlight、Windows Phone和WinRT的WebSocket客户端。\r\n* [Crossertech](https://crosser.io/) - 为你在Microsoft.NET平台上构建实时应用程序提供了一组强大的工具,以及更多功能。\r\n* [WampSharp](https://github.com/Code-Sharp/WampSharp) - Web 应用程序消息传递协议的 C# 实现\r\n* [The Web Application Messaging Protocol](https://wamp-proto.org/) - 一种提供远程过程调用和通过 WebSocket 发布/订阅的消息传递模式的协议。\r\n* [NetGain](https://github.com/StackExchange/NetGain) - 高性能的WebSocket服务器库,用于支持Stack Overflow。\r\n* [websocket-manager](https://github.com/radu-matei/websocket-manager) - ASP .NET Core的实时库。\r\n* [Websockets.PCL](https://github.com/NVentimiglia/Websockets.PCL) - WebSockets.PCL是一个可移植的类库,支持Profile 259,用于实现C#的WebSocket。\r\n* [Websocket.Client](https://github.com/Marfusios/websocket-client) - 一个多平台封装,覆盖了原生C#类ClientWebSocket,具有内置的重新连接和错误处理功能。','WebSocket','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,106),('3e28fd34-bc31-3b08-760d-3a0fe9b5b449',0,'\r\nC# 可空类型(Nullable)是一种用于表示变量可以具有空(null)值的特殊类型。在 C# 中,如果一个变量没有被赋值,那么它将自动地被赋值为 null,这通常是一个不合法的值。然而,有时候我们需要表示一个变量可以为空值,这时候就需要使用可空类型。\r\n## 定义可空类型\r\n\r\nC# 中的可空类型是通过在类型名称后面加上一个问号(?)来定义的,例如:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\ndouble? nullableDouble = 3.14;\r\nbool? nullableBool = true;\r\n```\r\n\r\n\r\n\r\n在上面的例子中,`nullableInt` 被定义为一个可空的整数类型,它的值为 null。`nullableDouble` 被定义为一个可空的双精度浮点数类型,它的值为 3.14。`nullableBool` 被定义为一个可空的布尔类型,它的值为 true。\r\n## 操作可空类型\r\n\r\n当我们使用可空类型时,需要注意一些操作的差异。例如,如果我们想要获取一个可空类型的值,需要使用 `.Value` 属性:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\nif (nullableInt.HasValue)\r\n{\r\n int value = nullableInt.Value;\r\n Console.WriteLine(value); // 这里不会输出任何内容,因为 nullableInt 的值为 null。\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的例子中,我们首先检查 `nullableInt` 是否有值,然后使用 `.Value` 属性获取其值。由于 `nullableInt` 的值为 null,所以我们不会在控制台输出任何内容。\r\n\r\n另外,还可以使用 `??` 运算符来给可空类型一个默认值。例如:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\nint value = nullableInt ?? 0;\r\nConsole.WriteLine(value); // 输出 0\r\n```\r\n\r\n\r\n\r\n在上面的例子中,由于 `nullableInt` 的值为 null,所以我们使用 `??` 运算符将其替换为默认值 0。\r\n## 示例代码\r\n\r\n下面是一个完整的示例代码,展示了如何使用可空类型:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main()\r\n {\r\n int? nullableInt = null;\r\n double? nullableDouble = 3.14;\r\n bool? nullableBool = true;\r\n\r\n if (nullableInt.HasValue)\r\n {\r\n int value = nullableInt.Value;\r\n Console.WriteLine(value);\r\n }\r\n\r\n int value2 = nullableInt ?? 0;\r\n Console.WriteLine(value2);\r\n\r\n double value3 = nullableDouble ?? 0.0;\r\n Console.WriteLine(value3);\r\n\r\n bool value4 = nullableBool ?? false;\r\n Console.WriteLine(value4);\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例代码中,我们定义了三个可空类型的变量 `nullableInt`、`nullableDouble` 和 `nullableBool`,然后分别演示了如何使用 `.Value` 属性和 `??` 运算符获取其值,并将其输出到控制台上。\r\n','C# 可空类型(Nullable)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,14),('3ef5dd22-29dd-2d41-23c1-3a0ff53f8681',0,'- [ExtensionMethods.Net](https://www.extensionmethod.net/csharp) - 包含一系列扩展方法的网站。 \r\n- [Z.ExtensionMethods](https://github.com/zzzprojects/Z.ExtensionMethods) - 包含1000多个有用的扩展方法。','扩展','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,44),('40575263-2283-7ba3-7b16-3a0ff53f8681',0,'\r\n- [AngleSharp](https://github.com/AngleSharp/AngleSharp) - 完整的HTML5 DOM和CSS3 OM构建。 \r\n- [dotless](https://github.com/dotless/dotless) - Ruby Less CSS库的.NET端口,详见 [http://www.dotlesscss.org。](http://www.dotlesscss.org./) \r\n- [ExCSS](https://github.com/TylerBrinks/ExCSS) - 用于C#的CSS3解析库。 \r\n- [HtmlAgilityPack](https://html-agility-pack.net/?z=codeplex) - 敏捷的HTML解析器,构建可读/可写的DOM,并支持普通的XPath或XSLT。 \r\n- [LibSass Host](https://github.com/Taritsyn/LibSassHost) - 围绕 [libSass](https://sass-lang.com/libsass) 库的.NET封装,具备支持虚拟文件系统的能力。 \r\n- [LtGt](https://github.com/Tyrrrz/LtGt) - 轻量级HTML处理器,可用于解析和导航DOM,处理CSS选择器,可以转换为Linq2Xml,易于扩展等等。\r\n','HTML-CSS','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,52),('4264aef4-979f-f533-dc79-3a100334d6a8',0,'## 简介\n上节说到,真正关注的代码其实只用在src中\n![image.png](/prod-api/file/7f52e9a7-6b6d-cc80-64f6-3a10031e9214/true)\n当我们要新建一个项目或者模块的时候,并不想取这个`Yi.Abp`的名字,我们可以使用dotnet的脚手架进行模板的生成\n\n**环境**:只需要dotnet sdk即可\n\n## 步骤\n![image.png](/prod-api/file/2a8d18c4-4899-433d-3553-3a10032e9645/true)\n在模板文件目录上,有一个`.template.config`文件夹,就是通过这个进行控制模板的生成及替换\n\n进入该目录,使用cmd执行以以下命令:\n``` shell\ndotnet new install . --force\n```\n\n![image.png](/prod-api/file/0a92e464-13af-ef93-77b9-3a10032fe20c/true)\n\n出现 `已安装以下模板` 及代表安装完成\n\n>我们只需要安装一次即可,如果模板文件发生变化,我们生成出来的文件也是一样会变化的\n\n当模板安装完成,接下来我们可以选择一个自己想要的空白文件夹,输入命令:\n\n``` shell\ndotnet new yi --name=Acme.BookStore\n#Acme.BookStore可以替换成你想要生成的名称即可\n```\n\n![image.png](/prod-api/file/55536e5a-ef47-1593-3701-3a100333df31/true)\n\n最后查看目录:\n![image.png](/prod-api/file/20286d62-a9d1-6ab0-7fc0-3a1003348554/true)\n这个便是我们想要的结果了','脚手架使用','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2024-01-10 09:41:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('42a6889a-d6f5-3836-9195-3a0fe745e5ba',0,'测试导入22222222222222','测试2.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 23:30:38','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509',NULL,NULL,0),('43c8fd5c-e80b-7071-63ed-3a0fe9b5b440',0,'\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','C# 简介','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,1),('43f54add-90e9-c3c1-56ac-3a0ff53f8684',0,'* WebAssembly\r\n * [Blazor](https://github.com/aspnet/blazor) - Blazor是使用C#/ Razor和HTML的.NET Web框架,可在带有WebAssembly的浏览器中运行。 \r\n * [Awesome Blazor](https://github.com/AdrienTorris/awesome-blazor) - Blazor的资源,Blazor是使用C#/ Razor和HTML的.NET Web框架,可在具有WebAssembly的浏览器中运行。\r\n * [Blazor Redux](https://github.com/torhovland/blazor-redux) - 将Redux状态存储与Blazor连接。\r\n * [Ooui](https://github.com/praeclarum/Ooui) - 是使用Web技术的.NET跨平台的小型UI库。\r\n* [ReactJS.NET](https://github.com/reactjs/React.NET) - 用于JSX编译和React组件的服务器端呈现的.NET库。\r\n* [redux.NET](https://github.com/GuillaumeSalles/redux.NET) - .NET应用程序的可预测状态容器。\r\n* [ASP.NET MVC](https://dotnet.microsoft.com/apps/aspnet) - ASP.NET是一个用于构建出色的网站和应用程序的免费Web框架。\r\n* [Coalesce](https://coalesce.intellitect.com/) - Coalesce是一个用于快速开发ASP.NET Core Web应用程序的框架。\r\n* [FubuMVC](https://github.com/DarthFubuMVC/fubumvc) - 一种用于.NET的前端控制器风格的MVC框架。\r\n* [NancyFx](https://github.com/NancyFx/Nancy) - 一个轻量级、低仪式感的框架,用于在.NET和Mono上构建基于HTTP的服务。\r\n* [IISNode](https://github.com/tjanczuk/iisnode) - 在IIS中托管Node.js应用程序。\r\n* [Suave.IO](https://suave.io/) - 一个框架/库/ Web服务器,让你在提前完成项目后,当你看到你用F#编写的美丽代码时,会感到欣慰得流泪。F#.\r\n* [DotVVM](https://github.com/riganti/dotvvm) - 面向不喜欢编写JavaScript的人的MVVM框架,支持OWIN和ASP.NET Core,并提供Visual Studio 2015和2017的免费扩展。\r\n* [Giraffe](https://github.com/giraffe-fsharp/Giraffe) - 用于构建丰富Web应用程序的功能性(F#)ASP.NET Core微框架。','Web框架','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,104),('44a285c9-706c-77c3-37f5-3a0fe480668b',1,'---\r\ntitle: C# 简介\r\narticle: false\r\ndate: 2023-04-15 11:39:44\r\npermalink: /pages/9d25e7/\r\n---\r\n\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','01.C# 简介.md','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-04 10:35:41','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-04 23:56:50',0),('49eaf5a1-f354-f3b2-f4b1-3a0ff57d53ce',0,'## 《4.0v意世界--WinRar解压》\n - (采用winform平台,采用c#语言,winform项目下载即可使用)\n - (这个就有点来头了,首先使用的winrar解压操作,还有treeview和listview联合操作做了一个树状磁盘目录)\n - (最近打算去弄个自己的博客,希望支持)\n - (有人说做这个有什么用?主要他能实现自动化操作,我可以设置当你打开这个软件的时候,自动进行安装,相当于自动更新游戏的傻瓜操作)\n **效果图如下:**\n![image.png](/prod-api/file/c5007661-c34c-d8e1-da05-3a0ff57c98d4/true)\n\n![image.png](/prod-api/file/34acf4b5-a870-6542-f8b5-3a0ff57cb7fa/true)\n\n![image.png](/prod-api/file/e3fb8dce-be93-a318-a034-3a0ff57cd15d/true)\n\n![image.png](/prod-api/file/bb5318e2-4154-8192-7bbd-3a0ff57ce5a5/true)\n\n![image.png](/prod-api/file/b713dbcd-3708-8bcf-915e-3a0ff57cfc1e/true)\n**核心代码:**\n\n解压操作:\n``` cs\n public static string ExistsWinRar()\n {\n string result = string.Empty;\n\n string key = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinRAR.exe\";\n RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key);\n if (registryKey != null)\n {\n result = registryKey.GetValue(\"\").ToString();\n }\n registryKey.Close();\n\n return result;\n \n }\n\n public static void UnRAR(string rarFilePath, string unrarDestPath)\n {\n string rarexe = ExistsWinRar();\n if (String.IsNullOrEmpty(rarexe))\n {\n throw new Exception(\"未安装WinRAR程序。\");\n }\n try\n {\n //组合出需要shell的完整格式 \n string shellArguments = string.Format(\"x -o+ \\\"{0}\\\" \\\"{1}\\\\\\\"\", rarFilePath, unrarDestPath);\n\n //用Process调用 \n using (Process unrar = new Process())\n {\n ProcessStartInfo startinfo = new ProcessStartInfo();\n startinfo.FileName = rarexe;\n startinfo.Arguments = shellArguments; //设置命令参数 \n startinfo.WindowStyle = ProcessWindowStyle.Hidden; //隐藏 WinRAR 窗口 \n\n unrar.StartInfo = startinfo;\n unrar.Start();\n unrar.WaitForExit();//等待解压完成 \n\n unrar.Close();\n }\n }\n catch\n {\n throw;\n }\n }\n\n private void button1_Click(object sender, EventArgs e)\n {\n string rarFilePath = textBox1.Text;\n string unrarDestPath = textBox2.Text;\n try\n {\n UnRAR(rarFilePath, unrarDestPath);\n MessageBox.Show(\"成功!\");\n }\n catch\n {\n MessageBox.Show(\"错误!\");\n };\n }\n\n private void button2_Click(object sender, EventArgs e)\n {\n Form2 p =new Form2();\n p.ShowDialog();\n }\n\n private void cheak_Tick(object sender, EventArgs e)\n {\n textBox1.Text = data.data_t;\n textBox2.Text = data.data_f;\n }\n }\n```\n\n\n磁盘管理操作:\n \n\n``` cs\n private void Form2_Load(object sender, EventArgs e)\n {\n TreeNode rootNode = new TreeNode(\"我的电脑\");\n treeView1.Nodes.Add(rootNode);\n\n }\n\n private void ListViewShow(TreeNode NodeDir)\n {\n listViewFile.Clear();\n try\n {\n if (NodeDir.Parent == null)\n {\n foreach (string DrvName in Directory.GetLogicalDrives())\n {\n ListViewItem ItemList = new ListViewItem(DrvName);\n listViewFile.Items.Add(ItemList);\n }\n }\n else\n {\n foreach (string dirName in Directory.GetDirectories((string)NodeDir.Tag))\n {\n ListViewItem dirItem = new ListViewItem(dirName);\n listViewFile.Items.Add(dirItem);\n }\n foreach (string fileName in Directory.GetFiles((string)NodeDir.Tag))\n {\n ListViewItem fileItem = new ListViewItem(fileName);\n listViewFile.Items.Add(fileItem);\n }\n }\n }\n catch { }\n }\n private void TreeViewShow(TreeNode selectNode)\n {\n try\n {\n if (selectNode.Nodes.Count == 0)\n {\n if (selectNode.Parent == null)\n {\n foreach (string drvName in Directory.GetLogicalDrives())\n {\n TreeNode drvNode = new TreeNode(drvName);\n drvNode.Tag = drvName;\n selectNode.Nodes.Add(drvNode);\n }\n }\n else\n {\n foreach (string dirName in Directory.GetDirectories((string)selectNode.Tag))\n {\n TreeNode dirNode = new TreeNode(dirName);\n dirNode.Tag = dirName;\n selectNode.Nodes.Add(dirNode);\n }\n }\n }\n }\n catch (Exception ex)\n {\n MessageBox.Show(ex.Message);\n }\n }\n \n\n private void listViewFile_SelectedIndexChanged(object sender, EventArgs e)\n {\n //int selectCount = listViewFile.SelectedItems.Count;\n if (listViewFile.SelectedItems.Count == 0)\n return;\n data.data_t = listViewFile.SelectedItems[0].Text;\n }\n\n private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)\n {\n TreeViewShow(e.Node);\n ListViewShow(e.Node);\n if (treeView1.SelectedNode.Nodes.Count == 0)\n return;\n data.data_f = treeView1.SelectedNode.Text;\n }\n\n private void button1_Click(object sender, EventArgs e)\n {\n this.Close();\n }\n }\n```\n','C#Winform--WinRar解压','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:45:52','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('49f2547a-3d6c-0da4-4554-3a0fe672a3a9',1,'测试导入11111111','测试.md','4a14cce8-795a-8c68-8c2a-3a0fe1c7215a','00000000-0000-0000-0000-000000000000','2024-01-04 19:39:53','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 19:55:11',0),('4a109e3c-d4b5-2c34-487d-3a0fe6affc1a',1,'测试导入22222222222222','测试2.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:46:53','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:46:59',0),('4b13f388-6ff1-bd67-4276-3a0ff53ad54c',0,'# 微服务面试题\r\n\r\n**1、什么是微服务?**\r\n\r\n答:单个轻量级服务一般为一个单独微服务,微服务讲究的是 专注某个功能的实现,比如登录系统只专注于用户登录方面功能的实现,讲究的是职责单一,开箱即用,可以独立运行。微服务架构系统是一个分布式的系统,按照业务进行划分服务单元模块,解决单个系统的不足,满足越来越复杂的业务需求。\r\n\r\n​ 马丁福勒(Martin Fowler):就目前而言,对于微服务业界并没有一个统一的、标准的定义。但通常而言,微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协调,为用户提供最终价值。服务之间采用轻量级通信。每个服务都围绕具体业务进行构建,并能够独立部署到生产环境等。另外应尽量避免统一的、集中的服务管理机制。\r\n\r\n通俗的来讲:\r\n\r\n微服务就是一个独立的职责单一的服务应用程序。在 intellij idea 工具里面就是用maven开发的一个个独立的module,具体就是使用springboot 开发的一个小的模块,处理单一专业的业务逻辑,一个模块只做一个事情。\r\n\r\n微服务强调的是服务大小,关注的是某一个点,具体解决某一个问题/落地对应的一个服务应用,可以看做是idea 里面一个 module。\r\n\r\n比如你去医院:你的牙齿不舒服,那么你就去牙科。你的头疼,那么你就去脑科。一个个的科室,就是一个微服务,一个功能就是一个服务。\r\n\r\n**2、微服务之间如何独立通讯的?**\r\n\r\n答: 同步通信:.Net5通过 RPC GRPC 远程过程调用或者通过 REST 接口json调用 等。\r\n\r\n 异步:消息队列,如:RabbitMq、ActiveM、Kafka 等。\r\n\r\n**3、什么是熔断?什么是服务降级?**\r\n\r\n答:服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。\r\n\r\n服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。\r\n\r\n**4、微服务的优缺点是什么?说下你在项目中碰到的坑。**\r\n\r\n答:优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。\r\n\r\n​ 缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控。\r\n\r\n**5、你所知道微服务的技术栈有哪些?列举一二。**\r\n\r\n答:微服务条目 落地技术\r\n服务开发 AspnetCore、.Net5、.Net6\r\n服务配置与管理 携程公司的Apollo、社区的的Consul等\r\n服务注册与发现 Eurka、Consul、Zookeeper等\r\n服务调用 Rest(服务通信)、RPC、GRpc\r\n服务熔断器 Polly、Envoy等\r\n负载均衡 Nginx等\r\n服务接口调用(客户端简化工具) WebAPI等\r\n消息队列 Kafka、RabbitMQ、ActiveMQ等\r\n服务配置中心管理 Apollo、Chef等\r\n服务路由(API网关) Ocelot等\r\n服务监控 Zabbix,Nagios,Skywalking等\r\n全链路追踪 Zipkin,Brave,Skywalking等\r\n服务部署 Docker,OpenStack,Kubernetes等\r\n数据流操作开发包 SpringCloud Stream(封装与Redis,Rabbit,kafka等发送接收消息)\r\n事件消息总线CAP\r\n\r\n**6、什么是微服务架构?**\r\n\r\n答:微服务架构 就是 对微服务进行管理整合应用的。微服务架构 依赖于 微服务,是在微服务基础之上的。\r\n\r\n例如:上面已经列举了什么是微服务。在医院里,每一个科室都是一个独立的微服务,那么 这个医院 就是 一个大型的微服务架构,就类似 院长 可以 对下面的 科室进行管理。微服务架构主要就是这种功能。\r\n\r\n**7、设计微服务的最佳实践是什么?**\r\n\r\n答:\r\n\r\n1. 为每个微服务分开数据存储\r\n2. 将代码保持在类似的成熟度等级上\r\n3. 为每个微服务进行单独的构建\r\n4. 部署到容器中\r\n5. 将服务器视为无状态的\r\n\r\n**8、单体应用、SOA 和微服务架构有什么区别?****\r\n\r\n答:\r\n\r\n- **单体应用**类似于一个大容器,其中程序的所有组件都被组装在一起并紧密包装。\r\n- **SOA**是一组相互通信的服务。通信可以涉及简单的数据传送,也可以涉及两个或多个协调某些活动的服务。\r\n- **微服务架构**是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合。\r\n\r\n**9、在使用微服务架构时,你面临的挑战是什么?****\r\n\r\n答:\r\n\r\n开发较小的微服务听起来很容易,但在开发时会经常遇到一些挑战。\r\n\r\n- **自动化组件**:难以自动化,因为有许多较小的组件。对于每个组件,都必须采取构建、发布和监控的步骤。\r\n- **可感知性**:将大量组件维持在一起会带来难以部署、维护、监控和识别的问题。它需要在所有组件周围具有很好的感知能力。\r\n- **配置管理**:有时在各种环境中维护组件的配置会很困难。\r\n- **调试**:很难找到与产生的错误相关的每一项服务。维护一个集中式的日志和控制面板对调试问题至关重要。\r\n\r\n**10、为什么需要域驱动设计(DDD)?**\r\n\r\n答:\r\n\r\n- 映射领域\r\n- 降低复杂性\r\n- 可测试性\r\n- 可维护性\r\n- 知识丰富的设计\r\n- 将业务和服务结合在一起\r\n- 上下文集中\r\n- 通用语言\r\n\r\n**11、你对分布式事务的理解?**\r\n\r\n答:\r\n\r\n**分布式事务**是单个事件导致两个或多个不能以原子方式提交的单独数据源的突变的情况。在微服务的世界中,它变得更加复杂,因为每个服务都是一个工作单元,并且在大多数情况下,多个服务必须协同工作才能使业务成功。\r\n\r\n12、什么是幂等性(Idempotence)及用在那里?\r\n\r\n**幂等性**是能够以同样的方式做两次,而最终结果将保持不变,就好像它只做了一次的特性。\r\n\r\n**用法**:在远程服务或数据源中使用幂等性,以便当它多次接收指令时,只处理一次。\r\n\r\n**13、什么是有界上下文?**\r\n\r\n答:有界上下文是领域驱动设计的核心模式。 DDD 战略设计部门的重点是处理大型模型和团队。 DDD 通过将大型模型划分为不同的有界上下文并明确其相互关系来处理大型模型。\r\n\r\n**14、容器在微服务中的用途是什么?**\r\n\r\n答:容器是管理基于微服务的程序以便单独开发和部署它们的好方法*。*你可以将微服务封装在容器镜像及其依赖项中,然后可以用它来滚动开发按需实例的微服务而无需任何额外的工作。\r\n\r\n**15、什么是金丝雀发布(Canary Releasing)?**\r\n\r\n答:**金丝雀发布**是一种降低在生产中引入新版本软件风险的技术。通过在将更改传递给整个基础架构之前将更改缓慢地推广到一小部分用户来完成的。','微服务面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,11),('4b209706-6455-f4a5-357e-3a0ff53f867f',0,'- [Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot) - 用于 [Telegram Bot API](https://core.telegram.org/bots/api) 的 .NET 客户端。 \r\n- [TLSharp](https://github.com/sochix/TLSharp) - 它非常适合任何希望直接向 Telegram 用户发送数据或编写自定义 Telegram 客户端的开发人员。 \r\n- [WTelegramClient](https://github.com/wiz0u/WTelegramClient) - 使用最新版本的 [Telegram Client API](https://core.telegram.org/methods) 自动化 Telegram 上的用户帐户。 \r\n- [NancyFx](https://github.com/NancyFx/Nancy) - 轻量级、低仪式感的框架,用于在 .NET 和 Mono 上构建基于 HTTP 的服务。 \r\n- [ASP.NET Web API](https://dotnet.microsoft.com/apps/aspnet/apis) - 使构建可触及广泛范围的客户端,包括浏览器和移动设备在内的 HTTP 服务变得容易的框架。 \r\n- [Breeze](https://breeze.github.io/doc-net/) - 使用 OData 3 协议,启用丰富的数据访问。提供了 JavaScript 和 C# 的客户端库。 \r\n- [Mobius: C# API for Spark](https://github.com/Microsoft/Mobius) - Mobius 为 Apache Spark 添加了 C# 语言绑定,使其能够在 C# 中实现 Spark 驱动程序代码和数据处理操作。 \r\n- [ServiceStack](https://github.com/ServiceStack/ServiceStack) - 精心设计的、非常快速的、非常愉快的 Web 服务框架,适用于所有情况。 \r\n- [Nelibur](https://github.com/Nelibur/Nelibur) - Nelibur 是基于纯 WCF 的消息传递式 Web 服务框架。Nelibur 简化了创建高性能和基于消息的 Web 服务,并且您肯定拥有 WCF 的所有功能。 \r\n- [WebAPI Contrib](https://github.com/WebApiContrib/WebAPIContrib) - 一组开源项目,帮助改进与 ASP.NET Web API 的工作。 \r\n- [Xamarin.Essentials](https://docs.microsoft.com/en-us/xamarin/essentials/) - Xamarin.Essentials 为移动应用程序提供跨平台 API。 \r\n- [FFImageLoading - Fast & Furious Image Loading](https://github.com/luberda-molinet/FFImageLoading) - 这个库可以在 Xamarin.iOS、Xamarin.Android、Xamarin.Forms、Xamarin.Mac / Xamarin.Tizen 和 Windows(UWP、WinRT)上快速、轻松地加载图像。 \r\n- [Ocelot](https://github.com/ThreeMammals/Ocelot) - .NET Core API 网关。 \r\n- [CommandQuery](https://github.com/hlaueriksson/CommandQuery) - 用于 ASP.NET Core、AWS Lambda、Azure Functions、Google Cloud Functions、ASP.NET Web API 2 的命令查询分离。 \r\n- [Cloud Storage](https://github.com/managedcode/Storage) :此库提供了访问和操作不同云 Blob 存储提供程序(Azure Storage、AWS S3、Google Cloud Storage)中的数据的通用接口。它使得在提供程序之间轻松切换或同时使用多个提供程序变得容易,而无需学习和使用多个 API。\r\n* [autorest](https://github.com/Azure/autorest) - Swagger(OpenAPI)规范代码生成器,具有C#和Razor模板。支持C#,Java,Node.js,TypeScript,Python和Ruby。\r\n* [aspnet-api-versioning](https://github.com/Microsoft/aspnet-api-versioning) - 提供一组库,这些库可将服务API版本添加到ASP.NET Web API,具有ASP.NET Web API的OData和ASP.NET Core。\r\n* [AspNetCoreRateLimit](https://github.com/stefanprodan/AspNetCoreRateLimit) - ASP.NET限速中间件。\r\n* [CondenserDotNet](https://github.com/Drawaes/CondenserDotNet) - 使用Kestrel和Consul的API Condenser / Reverse Proxy,包括轻量级consul库。\r\n* [Flurl](https://github.com/tmenier/Flurl) - 适用于.NET的Fluent URL构建器和可测试的HTTP。\r\n* GraphQL\r\n * [Dapper.GraphQL](https://github.com/landmarkhw/Dapper.GraphQL) - 一个旨在将Dapper和graphql-dotnet项目集成在一起的库,主要考虑的是易用性和性能。\r\n * [graphql-aspnetcore](https://github.com/JuergenGutsch/graphql-aspnetcore) - ASP.NET Core MiddleWare创建GraphQL端点。\r\n * [graphql-convention](https://github.com/graphql-dotnet/conventions) - 该库是GraphQL的补充层,使您可以使用现有的属性和方法作为字段解析器,将.NET类自动包装到GraphQL模式定义中。\r\n * [graphiql-dotnet](https://github.com/JosephWoodward/graphiql-dotnet) - 用于ASP.NET Core的GraphiQL中间件。\r\n * [graphql-dotnetcore](https://github.com/mkmarek/graphql-dotnetcore) - 基于[graphql-js](https://github.com/graphql/graphql-js)的.NETQL GraphQL。\r\n * [graphql-dotnet](https://github.com/graphql-dotnet/graphql-dotnet) - GraphQL for .NET。\r\n * [graphql-dotnet-server](https://github.com/graphql-dotnet/server) - GraphQL for .NET - 订阅传输WebSockets。\r\n * [Hot Chocolate](https://github.com/ChilliCream/hotchocolate) - .Net Core和.NET Framework的GraphQL服务器。\r\n * [FSharp.Data.GraphQL](https://github.com/fsprojects/FSharp.Data.GraphQL) - Facebook GraphQL查询语言的[FSharp]((https://fsprojects.github.io/FSharp.Data.GraphQL))实现。\r\n * [parser](https://github.com/graphql-dotnet/parser) - .NET中GraphQL的词法分析器和解析器。\r\n * [tanka-graphql](https://github.com/pekkah/tanka-graphql) - GraphQL执行库和服务器库,支持SignalR,Apollo,模式操纵以及Apollo和graphql-js熟悉的其他功能。\r\n* [halcyon](https://github.com/visualeyes/halcyon) - ASP.NET的HAL实现。\r\n* [JSON API .NET Core](https://github.com/Research-Institute/json-api-dotnet-core) - 用于ASP.Net Core的JSON API框架。\r\n* [LightNode](https://github.com/neuecc/LightNode) - 基于OWIN构建的Micro RPC / REST框架\r\n* [NetCoreStack.Proxy](https://github.com/NetCoreStack/Proxy) - 适用于.NET Standard 2.0的类型安全的分布式REST库(NetCoreStack Flying Proxy)\r\n* [NSwag](https://github.com/RSuter/NSwag) - 用于.NET,Web API和TypeScript的Swagger / OpenAPI工具链。\r\n* [OData](https://github.com/OData/WebApi/tree/feature/netcore) - 开放数据协议(OData)支持创建基于HTTP的数据服务,允许使用统一资源标识符识别资源( URIs)并在抽象数据模型中定义,由Web客户端使用简单的HTTP消息进行发布和编辑。\r\n* [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator) - 可以通过 OpenAPI Generator,在给定 OpenAPI 规范(v2, v3)的情况下自动生成 API 客户端库、server stubs、文档以及配置。\r\n* [refit](https://github.com/paulcbetts/refit) - 适用于.NET Core,Xamarin和.NET的自动类型安全REST库。\r\n* [RestClient.Net](https://github.com/MelbourneDeveloper/RestClient.Net) - 适用于所有C#跨平台的REST客户端。\r\n* [RestEase](https://github.com/canton7/RestEase) - 易于使用的类型安全REST API客户端库,简单且可自定义。\r\n* [RestLess](https://github.com/letsar/RestLess) - .Net Standard的自动类型安全无反射REST API客户端库。\r\n* [Restier](https://github.com/OData/RESTier) - RESTier是一个RESTful API开发框架,用于在.NET平台上构建基于OData V4的标准化RESTful服务。\r\n* [Restsharp](https://github.com/restsharp/RestSharp) - 用于.NET的简单REST和HTTP API客户端\r\n* [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) - Swagger工具,生成API文档,包括用于测试的UI。\r\n * [MicroElements.Swashbuckle.FluentValidation](https://github.com/micro-elements/MicroElements.Swashbuckle.FluentValidation) - 向Swagger添加FluentValidation规则。\r\n * [Swashbuckle.AspNetCore.Filters](https://github.com/mattfrear/Swashbuckle.AspNetCore.Filters) - 一堆有用的Swashbuckle.AspNetCore筛选器。\r\n * [WebAnchor](https://github.com/mattiasnordqvist/Web-Anchor) - Web Anchor 提供了类型安全,可测试和灵活的,运行时生成的Web资源访问。简单来说提供了Web APi灵活的访问方式。\r\n* [WebAPIContrib for ASP.NET CORE](https://github.com/WebApiContrib/WebAPIContrib.Core) - ASP.NET Core的附加组件和扩展库。','API','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,3),('4b4b193e-9601-501b-011b-3a0f83825961',0,'## 它是什么?\n\nYiFramework是一个基于.Net8+Abp.vNext+SqlSugar的DDD领域驱动设计后端开源框架\n\n中文名称:意框架\n\n英文名称:YiFramework\n\n但是,不仅仅是如此\n\n## 它的理念\n谁说Abp复杂?谁说DDD难?打破常规,化繁为简,新人入门,项目二开,最佳方式之一\n\n> 一百个人,就有一百种DDD,Yi框架不一定是极度严格的DDD,而是站在巨人的肩膀上,经过极多项目的提炼,摸索出一种最佳实践\n\n\n优雅的进行快速开发,通常,简单程度与优雅程度不可兼得,Yi框架并不一昧的追求极致的解耦,会站在用户使用角度上,在使用难易度进行考虑衡量\n\n> 一个面向用户的快速开发后端框架\n\n在真正的使用这,你会明白这一点,极致的简单,也是优雅的一种体现。\n\n## 特点\n- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目\n- 项目直接内置源码,不打包,非常适合进行二开改造\n- 内置包含大量通用场景模块\n- 等等\n\n## 基础设施简介\n\n以下全部功能可直接使用:\n\n- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)\n\n- [SqlSugar官网](https://www.donet5.com/home/doc)\n\n## 内置模块简介\n- Rbac权限管理系统\n- Bbs论坛社区系统\n\n\n> 重复的东西,无需再写一遍,这也是优雅的体现之一\n','Yi框架简介','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2023-12-16 14:34:38','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('4f5bac5d-5e36-59a3-d15a-3a0f83aace6f',0,'## 简介\n熟悉Asp.NetCore的小伙伴们,对依赖注入可太熟悉,这里也不在过多的讲述依赖注入知识\n默认内置的注入方式,通常是在启动类文件,一个一个手动注入,例如:\n``` cs\nservice.Addsingle<接口,类>()\n```\n同样,当服务过多,添加服务的代码会显的非常长,不够优雅\n可以使用框架内置的接口\n- IScopedDependency\n- ISingletonDependency\n- ITransientDependency\n\n也可以使用框架内置的特性\n- DependencyAttribute\n- ExposeServicesAttribute\n\n> 使用特性,可以指定特定类、接口作为抽象\n## 如何使用\n#### 特性方式:\n在实现类上标注特性即可\n``` cs\n[ExposeServices(typeof(ITestService))]\n[Dependency(ServiceLifetime.Transient)]\npublic class Test\n{\n}\n```\n\n#### 接口方式:\n同理,根据不同的接口,选择不同的生命周期,自动会优先找自动以`I+类名`的接口作为抽象\n``` cs\npublic class Test:ITest,ISingletonDependency\n{\n}\n```','依赖注入','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:18:50','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('509444a0-17ff-2d0c-9100-3a0facd63cea',0,'## 111111111111111','11','8593141f-ca6b-dbac-7c57-3a0facd5b208','00000000-0000-0000-0000-000000000000','2023-12-24 15:10:42','a46718ba-f869-6473-142b-3a0facd47b09',NULL,NULL,0),('517df697-63d3-0412-8aa6-3a0ff53f8682',0,'- [MathNet](https://www.mathdotnet.com/) - Math.NET 是一个开源倡议,旨在构建和维护涵盖基本数学的工具包,以满足.NET开发人员的高级和日常需求。 \r\n- [Microsoft Automatic Graph Layout](https://github.com/Microsoft/automatic-graph-layout) - 用于图形布局和查看的一组工具。 \r\n- [UnitConversion](https://github.com/atulmish/UnitConversion) - 可扩展的 .NET Core 和 .NET Framework 单位转换库。 \r\n- [ALGLIB](https://www.alglib.net/) - ALGLIB 是一个跨平台的数值分析和数据处理库。它支持多种编程语言(C++、C#、Delphi)和多种操作系统(Windows 和 POSIX,包括 Linux)【专有】和【免费版】。 \r\n- [AutoDiff](https://github.com/alexshtf/autodiff) - AutoDiff 是一个用于快速计算由表达式定义的函数梯度的库。主要在数值优化中有用。 \r\n- [GeometRi](https://github.com/RiSearcher/GeometRi.CSharp) - 用于 .Net 的简单轻量级计算几何库。 \r\n- [Rationals](https://github.com/tompazourek/Rationals) - 用于 .NET 的有任意精度的有理数算术实现。 \r\n- [MKL.NET](https://github.com/AnthonyLloyd/MKL.NET) - 用于 Intel MKL 的简单跨平台 .NET API。 \r\n- [AngouriMath](https://github.com/asc-community/AngouriMath) - 一个开源的符号/计算代数库,主要用于 C# 和 F#。它涵盖了各种功能,可视为.NET中SymPy的替代品。 \r\n- [Vim.Math3d](https://github.com/vimaec/math3d) - 一个功能丰富的跨平台替代 System.Numerics,支持一致的序列化和二进制布局,以及用于高效3D数学的其他结构和算法。 \r\n- [WPF-Math](https://github.com/ForNeVeR/wpf-math) - 一个用于 WPF 框架的渲染数学公式的 .NET 库,使用 LaTeX 排版风格。 \r\n- [Jodo.Numerics](https://github.com/JosephJShort/Jodo/#numerics) - 提供额外的数字类型(如定点数和不溢出的数)以及对运算符、数学、字符串解析等的全面支持。经过广泛测试,跨平台兼容。','数学','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,66),('52d7c4f6-5a2e-9bea-4584-3a0f83ad066c',0,'## 简介\n> 鉴权是用于解析用户的令牌,知道用户是否携带令牌,并且知道用户信息是谁\n\n改鉴权使用的是微软Asp.NetCore扩鉴权扩展方式\n程序模块已内置 \n``` cs\ncontext.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\n .AddJwtBearer(options =>\n {\n options.TokenValidationParameters = new TokenValidationParameters\n {\n ClockSkew = TimeSpan.Zero,\n ValidateIssuer = true,\n ValidateAudience = true,\n ValidateLifetime = true,\n ValidateIssuerSigningKey = true,\n ValidIssuer = jwtOptions.Issuer,\n ValidAudience = jwtOptions.Audience,\n RequireExpirationTime = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SecurityKey))\n };\n options.Events = new JwtBearerEvents\n {\n OnMessageReceived = context =>\n {\n var accessToken = context.Request.Query[\"access_token\"];\n if (!string.IsNullOrEmpty(accessToken))\n {\n context.Token = accessToken;\n }\n return Task.CompletedTask;\n }\n };\n });\n```\n## 如何使用\n默认已经集成,所以在使用方面,可要求客户端添加标准的jwtbear头即可\n\nswagger 接口文档中,已集成,直接输入jwttoken即可\n![Alt text](../image/swaggerIndex.png)\n\n我们采用的是HSA对称加密方式,只需要具备密钥\n对应的配置文件\n``` json\n //鉴权\n \"JwtOptions\": {\n \"Issuer\": \"https://ccnetcore.com\",\n \"Audience\": \"https://ccnetcore.com\",\n \"SecurityKey\": \"zqxwcevrbtnymu312412ihe9rfwhe78rh23djoi32hrui3ryf9e8wfh34iuj54y0934uti4h97fgw7hf97wyh8yy69520\",\n \"ExpiresMinuteTime\": 86400\n }\n```\n## Token如何来\n那肯定是登录啊,登录接口会返回Token\n\n那如何制作Token?直接上代码,下面这个也是登录的创建token的方式\n\n``` cs\n /// \n /// 创建令牌\n /// \n /// \n /// \n private string CreateToken(Dictionary dic)\n {\n var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecurityKey));\n var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n var claims = dic.Select(x => new Claim(x.Key, x.Value.ToString())).ToList();\n var token = new JwtSecurityToken(\n issuer: _jwtOptions.Issuer,\n audience: _jwtOptions.Audience,\n claims: claims,\n expires: DateTime.Now.AddSeconds(_jwtOptions.ExpiresMinuteTime),\n notBefore: DateTime.Now,\n signingCredentials: creds);\n string returnToken = new JwtSecurityTokenHandler().WriteToken(token);\n\n return returnToken;\n }\n```\n','Jwt鉴权','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:21:15','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('52e07765-63e1-c17c-67df-3a0ff53ad54c',0,'\r\n**1、那些地方用到了单例模式**\r\n\r\n答:\r\n\r\n1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。\r\n2. 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。\r\n3. 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制\r\n4. Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个\r\n5. windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。\r\n\r\n**2、举一个用 .Net5中实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类** **层次?** 答:装饰模式增加强了单个对象的能力。.Net5 IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如 BufferedStream 它们增强了 Stream 对象, 以实现提升性能的 Buffer 层次的读取和写入。\r\n\r\n**3、适配器模式是什么?什么时候使用?\\****\r\n\r\n答:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。\r\n\r\n**4、适配器模式与装饰器模式有什么区别?\\****\r\n\r\n答:虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。\r\n\r\n装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者模提供了比继承更有弹性的替代方案。\r\n\r\n通俗的解释:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。\r\n\r\n适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。\r\n\r\n适配器模式有三种:类的适配器模式、对象的适配器模式、接口的适配器模式。\r\n\r\n通俗的说法:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。\r\n\r\n**5、适配器模式和代理模式之间有什么不同?\\****\r\n\r\n答:这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。\r\n\r\n**6、使用工厂模式最主要的好处是什么?你在哪里使用?**\r\n\r\n答:工厂模式的最大好处是增加了创建对象时的封装层次。如果 你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。可以看我的文章工厂模式得更详细的解释和和了解更多的好处。\r\n\r\n**7、什么时候使用享元模式?**\r\n\r\n答:享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。Net5中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。\r\n\r\n**8、什么是责任链设计模式\\****\r\n\r\n答:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。\r\n\r\n**9、你可以说出几个在.Net5中使用的设计模式吗?**\r\n\r\n答:装饰器设计模式(Decorator design pattern)被用于多个.Net5 IO类中。单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如HttpClient,像HttpClientFactory,观察者模式(Observer pattern)被用于DiagnosticSource和很多的事件监听中。','设计模式面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,9),('5373ab8e-b1ce-b873-faf1-3a0f8385b93a',0,'# 后端\nC# Asp.NetCore 8.0\n- [x] 动态Api:Abp.vNext\n- [x] 鉴权授权:Jwt\n- [x] 日志:Serilog\n- [x] 模块化:Abp.vNext\n- [x] 依赖注入:Autofac\n- [x] 对象映射:Mapster\n- [x] ORM: SqlsugarCore\n- [x] 多租户:Abp.vNext\n- [x] 后台任务:Quartz.Net\n- [x] 本地缓存:Abp.vNext\n- [x] 分布式缓存:Abp.vNext\n- [x] 事件总线:Abp.vNext\n\n# 前端\njs Vue3.2\n- [x] 异步请求:axios\n- [x] 图表:echarts\n- [x] ui:element-plus\n- [x] 存储:pinia\n- [x] 路由:vue-router\n- [x] 打包:vite\n\n# 运维\n- [x] 部署:nginx\n- [x] CICD:gitlab+Jenkins\n- [x] Docker:harbor\n\n\n','核心技术','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2023-12-16 14:38:19','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('54a0da70-7907-9ca4-55b2-3a0f83acd072',0,'## 简介\n种子数据一直都是一个很繁琐的东西,例如在初始化数据的时候,添加默认用户\n可以通过导入sql的方式进行添加种子数据,也可以通过程序代码中自动初始化数据\n我们目前提供后者\n\n## 如何使用\n一切的根源,来源自:`IDataSeedContributor`\n直接使用实现`IDataSeedContributor`接口,我们只需要实现 `SeedAsync(DataSeedContext context)`即可\n\n在实现类上,要将该类加入容器中,推荐通过内置的依赖注入模块\n\n当然,对于扩展,你可以重写其他的方法\n\n#### 其他方式使用\n另外,你可以直接依赖注入,直接使用IDataSeeder SeedAsync方法,重新手动执行种子数据\n> 默认在程序启动的时候,会根据配置文件选择,是否执行种子数据\n\n## 完整例子\n``` cs\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing SqlSugar;\nusing Volo.Abp.Data;\nusing Volo.Abp.DependencyInjection;\nusing Volo.Abp.Domain.Repositories;\nusing Volo.Abp.Guids;\nusing Yi.Framework.Rbac.Domain.Entities;\nusing Yi.Framework.SqlSugarCore.Abstractions;\n\nnamespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds\n{\n public class ConfigDataSeed : IDataSeedContributor, ITransientDependency\n {\n private ISqlSugarRepository _repository;\n public ConfigDataSeed(ISqlSugarRepository repository)\n {\n _repository = repository;\n }\n public async Task SeedAsync(DataSeedContext context)\n {\n if (!await _repository.IsAnyAsync(x => true))\n {\n await _repository.InsertManyAsync(GetSeedData());\n }\n }\n public List GetSeedData()\n {\n List entities = new List();\n ConfigEntity config1 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.name\",\n ConfigName = \"站点名称\",\n ConfigValue = \"意社区\"\n };\n entities.Add(config1);\n\n ConfigEntity config2 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.author\",\n ConfigName = \"站点作者\",\n ConfigValue = \"橙子\"\n };\n entities.Add(config2);\n\n ConfigEntity config3 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.icp\",\n ConfigName = \"站点Icp备案\",\n ConfigValue = \"赣ICP备20008025号\"\n };\n entities.Add(config3);\n\n\n ConfigEntity config4 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.bottom\",\n ConfigName = \"站点底部信息\",\n ConfigValue = \"你好世界\"\n };\n entities.Add(config4);\n return entities;\n }\n }\n\n\n}\n\n \n```','种子数据','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:21:01','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('55ba8148-b948-9c55-ffd5-3a0ff53f8682',0,'\r\n- [NetCoreServer](https://github.com/chronoxor/NetCoreServer) - 超快和低延迟的异步套接字服务器和客户端C# .NET Core库,支持TCP、SSL、UDP、HTTP、HTTPS、WebSocket协议以及10K连接问题的解决方案(NETStandard)。 \r\n- [SharpPcap](https://github.com/chmorgan/sharppcap) - 完全托管的、跨平台(Windows、Mac、Linux)的.NET库,用于从实时和基于文件的设备捕获数据包。\r\n- [AspNetCore.Proxy](https://github.com/twitchax/AspNetCore.Proxy) - Proxy代理库。\r\n- [CurlThin](https://github.com/stil/CurlThin) - 轻量级cURL绑定库,支持通过curl_multi接口进行多个同时传输。\r\n- [NETStandard.HttpListener](https://github.com/StefH/NETStandard.HttpListener) - HttpListener(NETStandard)。\r\n- [Networker](https://github.com/MarkioE/Networker) - 一个简单易用的.NET TCP和UDP网络库,旨在实现灵活,可扩展和快速。','网络','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,72),('57ffa3f7-03c4-fc7d-1ae8-3a0fe745b5ca',1,'测试导入11111111','测试.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 23:30:26','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 23:30:32',0),('58170f2f-ef75-82b0-6964-3a0ff53f8682',0,'\r\n- ## Markdown 处理 \r\n- [MarkdownSharp](https://code.google.com/archive/p/markdownsharp) - Markdown处理器的开源C#实现,被广泛用于Stack Overflow等地方。 \r\n- [F# Formatting](https://fsprojects.github.io/FSharp.Formatting/) - 用于文档化F#和C#项目的工具。该库包含可扩展的Markdown解析器作为核心组件。 \r\n- [CommonMark.NET](https://github.com/Knagis/CommonMark.NET) - 用于将Markdown文档转换为HTML的C#实现CommonMark规范。经过最大性能和可移植性的优化。 \r\n- [markdig](https://github.com/lunet-io/markdig) - 用于.NET的快速、强大、符合CommonMark规范的可扩展Markdown处理器。','Markdown','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,64),('595c740e-00a0-54f3-a662-3a0fe9b5b449',0,'当我们在使用面向对象编程语言时,多态性是一个非常重要的概念。C# 是一种面向对象编程语言,它支持多态性的特性。\r\n## 什么是多态性?\r\n\r\n多态性是指同一种行为或方法在不同的对象上具有不同的实现方式或表现形式的能力。这意味着,一个对象的方法可以被多个对象使用,并且每个对象可以根据自己的特定情况来执行该方法。这使得代码更加灵活和可重用。\r\n## 多态性的类型\r\n\r\n在 C# 中,有两种类型的多态性:静态多态性和动态多态性。\r\n### 静态多态性\r\n\r\n静态多态性又被称为编译时多态性或重载。它是指在编译时就能够确定要执行哪个方法,而不是在运行时才确定。在 C# 中,实现静态多态性的方法有方法重载和运算符重载。\r\n#### 方法重载\r\n\r\n方法重载是指在一个类中定义多个具有相同名称但参数类型或数量不同的方法。编译器将根据调用方法时传递的参数类型和数量来确定要执行的方法。\r\n\r\n例如,下面的代码演示了方法重载的实现:\r\n\r\n```csharp\r\n\r\nclass Calculator\r\n{\r\n public int Add(int a, int b)\r\n {\r\n return a + b;\r\n }\r\n \r\n public double Add(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,`Calculator` 类中定义了两个名为 `Add` 的方法。一个方法接受 `int` 类型的参数,另一个方法接受 `double` 类型的参数。编译器会根据传递的参数类型和数量来确定要执行的方法。例如:\r\n\r\n```csharp\r\n\r\nvar calculator = new Calculator();\r\n\r\nint result1 = calculator.Add(2, 3); // 调用第一个 Add 方法,返回 5\r\ndouble result2 = calculator.Add(2.5, 3.5); // 调用第二个 Add 方法,返回 6.0\r\n```\r\n\r\n\r\n#### 运算符重载\r\n\r\nC# 允许我们对运算符进行重载,这样我们就可以对自定义类型进行运算。例如,我们可以对 `+` 运算符进行重载,使其能够对自定义类型进行加法运算。\r\n\r\n例如,下面的代码演示了如何对自定义类型 `Point` 进行加法运算:\r\n\r\n```csharp\r\n\r\nclass Point\r\n{\r\n public int X { get; set; }\r\n public int Y { get; set; }\r\n \r\n public static Point operator +(Point p1, Point p2)\r\n {\r\n return new Point { X = p1.X + p2.X, Y = p1.Y + p2.Y };\r\n }\r\n}\r\n\r\nvar p1 = new Point { X = 2, Y = 3 };\r\nvar p2 = new Point { X = 4, Y = 5 };\r\nvar p3 = p1 + p2; //\r\n```\r\n\r\n在上面的示例中,我们定义了 `Point` 类,并对 `+` 运算符进行了重载。重载方法采用静态方法的形式,并且必须以 `operator` 关键字开头,后面跟着要重载的运算符。在这个示例中,我们定义了 `+` 运算符的重载方法。这个方法接受两个 `Point` 类型的参数,并返回一个新的 `Point` 对象,表示两个点的和。\r\n### 动态多态性\r\n\r\n动态多态性又被称为运行时多态性或覆盖。它是指在运行时才能够确定要执行哪个方法。在 C# 中,实现动态多态性的方法有虚方法和抽象方法。\r\n#### 虚方法\r\n\r\n虚方法是指在基类中定义的方法,它可以被子类重写。在基类中,我们可以使用 `virtual` 关键字来声明一个方法是虚方法。在子类中,我们可以使用 `override` 关键字来重写基类中的虚方法。\r\n\r\n例如,下面的代码演示了如何使用虚方法:\r\n\r\n```csharp\r\n\r\nclass Shape\r\n{\r\n public virtual double GetArea()\r\n {\r\n return 0;\r\n }\r\n}\r\n\r\nclass Circle : Shape\r\n{\r\n public double Radius { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Math.PI * Radius * Radius;\r\n }\r\n}\r\n\r\nclass Square : Shape\r\n{\r\n public double Side { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个 `Shape` 类,它包含一个虚方法 `GetArea`。`Circle` 和 `Square` 类都继承自 `Shape` 类,并重写了 `GetArea` 方法。这样,在我们调用 `GetArea` 方法时,具体执行哪个方法取决于对象的实际类型。例如:\r\n\r\n```csharp\r\n\r\nvar circle = new Circle { Radius = 5 };\r\nvar square = new Square { Side = 10 };\r\n\r\ndouble circleArea = circle.GetArea(); // 返回 78.53981633974483\r\ndouble squareArea = square.GetArea(); // 返回 100\r\n```\r\n\r\n\r\n#### 抽象方法\r\n\r\n抽象方法是指在基类中定义的没有实现体的方法,它必须在派生类中被实现。在基类中,我们可以使用 `abstract` 关键字来声明一个方法是抽象方法。在子类中,我们必须使用 `override` 关键字来实现基类中的抽象方法。\r\n\r\n例如,下面的代码演示了如何使用抽象方法:\r\n\r\n```csharp\r\n\r\nabstract class Shape\r\n{\r\n public abstract double GetArea();\r\n}\r\n\r\nclass Circle : Shape\r\n{\r\n public double Radius { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Math.PI * Radius * Radius;\r\n }\r\n}\r\n\r\nclass Square : Shape\r\n{\r\n public double Side { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个抽象类`Shape`,它包含一个抽象方法 `GetArea`。`Circle` 和 `Square` 类都继承自 `Shape` 类,并实现了 `GetArea` 方法。这样,在我们调用 `GetArea` 方法时,具体执行哪个方法取决于对象的实际类型。例如:\r\n\r\n```csharp\r\n\r\nShape circle = new Circle { Radius = 5 };\r\nShape square = new Square { Side = 10 };\r\n\r\ndouble circleArea = circle.GetArea(); // 返回 78.53981633974483\r\ndouble squareArea = square.GetArea(); // 返回 100\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们将 `Circle` 和 `Square` 对象赋值给 `Shape` 类型的变量。这样做的好处是可以提高代码的灵活性,因为我们可以使用基类类型的变量来引用派生类对象。\r\n## 总结\r\n\r\n多态性是面向对象编程中非常重要的概念。C# 支持两种类型的多态性:静态多态性和动态多态性。静态多态性是在编译时确定要执行的方法,它的实现方式包括方法重载和运算符重载。动态多态性是在运行时才能够确定要执行的方法,它的实现方式包括虚方法和抽象方法。\r\n\r\n示例代码如下:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nnamespace PolymorphismExample\r\n{\r\n class Program\r\n {\r\n static void Main(string[] args)\r\n {\r\n var calculator = new Calculator();\r\n\r\n int result1 = calculator.Add(2, 3);\r\n double result2 = calculator.Add(2.5, 3.5);\r\n\r\n Console.WriteLine($\"2 + 3 = {result1}\");\r\n Console.WriteLine($\"2.5 + 3.5 = {result2}\");\r\n\r\n var p1 = new Point { X = 2, Y = 3 };\r\n var p2 = new Point { X = 4, Y = 5 };\r\n var p3 = p1 + p2;\r\n\r\n Console.WriteLine($\"({p1.X}, {p1.Y}) + ({p2.X}, {p2.Y}) = ({p3.X}, {p3.Y})\");\r\n\r\n Shape circle = new Circle { Radius = 5 };\r\n Shape square = new Square { Side = 10 };\r\n\r\n double circleArea = circle.GetArea();\r\n double squareArea = square.GetArea();\r\n\r\n Console.WriteLine($\"圆的面积是 {circleArea}\");\r\n Console.WriteLine($\"正方形的面积是 {squareArea}\");\r\n }\r\n }\r\n\r\n class Calculator\r\n {\r\n public int Add(int a, int b)\r\n {\r\n return a + b;\r\n }\r\n\r\n public double Add(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n }\r\n\r\n class Point\r\n {\r\n public int X { get; set; }\r\n public int Y { get; set; }\r\n\r\n public static Point operator +(Point p1, Point p2)\r\n {\r\n return new Point { X = p1.X + p2.X, Y = p1.Y + p2.Y };\r\n }\r\n }\r\n\r\n abstract class Shape\r\n {\r\n public abstract double GetArea();\r\n }\r\n\r\n class Circle : Shape\r\n {\r\n public double Radius { get; set; }\r\n\r\n public override double GetArea()\r\n {\r\n return Math.PI *continued* * Radius * Radius;\r\n }\r\n }\r\n\r\n class Square : Shape\r\n {\r\n public double Side { get; set; }\r\n\r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n }\r\n}\r\n\r\n```\r\n\r\n以上是一个简单的 C# 多态性示例。这个示例中使用了方法重载、运算符重载、虚方法和抽象方法。每种多态性的实现方式都有各自的优点和适用场景。在实际编程中,我们可以根据具体情况选择使用适当的多态性实现方式来提高代码的灵活性和可重用性。\r\n','C# 多态性','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,21),('59a0ebc6-b076-5be7-6eb7-3a0ff5881694',0,'**C#WPF--网络资源爬虫**\n\n**作者心得**\n真没你想的那么高级,真的\n算是我第一个与http有交互的玩意儿吧\n运用到了:正则表达式\n(后来代码被我弄去研究了,貌似改动过)\n\n**源代码**\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Net;\nusing System.Text.RegularExpressions;\nusing System.IO;\n\nnamespace TQJ\n{\n /// \n /// MainWindow.xaml 的交互逻辑\n /// \n public partial class MainWindow : Window\n {\n \n public MainWindow()\n {\n InitializeComponent();\n }\n\n\n public string wwwtext;\n public static string textclass;\n \n\n private void Window_Initialized(object sender, EventArgs e)\n {\n \n if (!Directory.Exists(@\"e:\\data\"))\n {\n Directory.CreateDirectory(@\"e:\\data\");\n }\n\n }\n public static string get_uft8(string unicodeString)\n {\n UTF8Encoding utf8 = new UTF8Encoding();\n Byte[] encodedBytes = utf8.GetBytes(unicodeString);\n String decodedString = utf8.GetString(encodedBytes);\n return decodedString;\n }\n\n private void Button_Click(object sender, RoutedEventArgs e)//提取图片\n {\n wwwtext = www.Text;\n string lt= (\"_\" + System.Guid.NewGuid().ToString() + \"_\" + System.Guid.NewGuid().ToString()).ToUpper();\n try\n {\n //WebClient client = new WebClient();\n ////Byte[] pageData = client.DownloadData(\"\");\n ////string html= Encoding.GetEncoding(\"utf-8\").GetString(pageData);\n ////TextBox.Text += html;\n\n ////MatchCollection matches = Regex.Matches(html, @\"[0-9]{4}\", RegexOptions.IgnoreCase);\n\n ////foreach (Match item in matches)\n ////{\n //// TextBox.Text = TextBox.Text + item.Value;\n //// string pathImg = \"http://120.77.214.11/code.ajx?t=\" + item.Value;\n //client.DownloadFile(\"https://vpn.jift.edu.cn/http/77726476706e69737468656265737421e3e44ed22d396e44300d8db9d6562d/cas/codeimage?vpn-1\", @\"e:\\data\\\" + System.DateTime.Now.ToFileTime() + \".jpg\");\n // //}\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站已加密,请换一个试试\");\n }\n\n }\n\n private void Button_Click_1(object sender, RoutedEventArgs e)//提取电话\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\phone.txt\", true); \n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"(134|135|136|137|138|139|150|151|152|157|158|159|147|182|183|184|187|188|170|178|130|131|132|145|155|156|185|186|176|170|171|166|133|153|180|181|189|170|177|173)(\\b)?[0-9]{8}\");\n foreach (Match item in matches)\n {\n sw.WriteLine(item.Value);\n TextBox.Text = TextBox.Text +\"\\r\\n\"+ item.Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在电话号码,请换一个试试\");\n }\n\n sw.Close();\n\n }\n\n private void Button_Click_2(object sender, RoutedEventArgs e)\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\email.txt\", true);\n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"([A-Za-z0-9\\u4e00-\\u9fa5]+)@([a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+)\");\n foreach (Match item in matches)\n {\n sw.WriteLine(\"用户名:\" + item.Groups[1].Value+\";域名:\"+ item.Groups[2].Value);\n TextBox.Text = TextBox.Text + \"\\r\\n\" + \"用户名:\" + item.Groups[1].Value + \";域名:\" + item.Groups[2].Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在邮箱,请换一个试试\");\n }\n\n sw.Close();\n }\n\n private void Button_Click_3(object sender, RoutedEventArgs e)\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\address.txt\", true);\n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"(.+)\\[port=([0-9]{2,5})(,type=(.+))?\\]\");\n foreach (Match item in matches)\n {\n sw.WriteLine(\"IP:\" + item.Groups[1].Value + \";port:\" + item.Groups[2].Value);\n TextBox.Text = TextBox.Text + \"\\r\\n\" + \"IP:\" + item.Groups[1].Value + \";port:\" + item.Groups[2].Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在地址,请换一个试试\");\n }\n\n sw.Close();\n }\n\n private void Button_Click_4(object sender, RoutedEventArgs e)\n {\n textclass = www.Text;\n this.Hide();\n Window1 p = new Window1();\n p.Show();\n }\n\n private void Button_Click_5(object sender, RoutedEventArgs e)\n {\n Form1 form1 = new Form1();\n form1.Show();\n }\n\n private void Button_Click_6(object sender, RoutedEventArgs e)\n {\n TextBox.Text=( \"_\"+System.Guid.NewGuid().ToString()+\"_\"+System.Guid.NewGuid().ToString()).ToUpper();\n }\n }\n }\n\n\n```\n**效果截图**\n![image.png](/prod-api/file/9b3282c2-304f-6f2d-b431-3a0ff5880480/true)\n**作者的话**\n好像这个是我最后一个winform项目了\n接下来应该走Asp .net项目了\n虽然这2个关系不大,但是winform作为c#入门真的很有帮助!','C#WPF--网络资源爬虫','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:57:37','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('5ac86950-2d82-1a53-0eac-3a0fa8f8c42f',0,'## jenkins流水线\n\n在上一章,已经将核心的环境给安装了,接下来我们可进行jenkins的流水线配置\n\n> 这里开始配置的前提,需要将推荐插件下载,不安装插件流水线的功能都没有,同时检测`Publish Over SSH`插件是否已经安装,需要这个插件进行远程执行命令\n\n## 配置凭据\n我们需要先将密钥配置好,因为我们等下的流水线的git拉去代码要将密钥进行登录\n\n在`系统管理/凭据/系统/全局凭据 (unrestricted)`中添加一个用户名和密码的凭据,这里我们可以填写我们git仓库的的账号即可\n\n## 配置免密登录\n这一步至关重要,由于我们会远程向其他服务器执行命名,需要先配置免密登录。\n\n通常来说,jenkins只做拉去代码,打包发布成可执行的包,至于执行包发布给谁,可以通过ssh发送,对应的服务器只需要收到包,解压,然后直接启动即可,如果服务器资源不够,也可以考虑`127.0.0.1`当远程服务器\n\n``` shell\n#获取rsa密钥对\nssh-keygen -t rsa\\\n\n#将密钥进行拷贝\nssh-copy-id -i /root/.ssh/id_rsa.pub root\\@localhost\n```\n按以上的提示一步一步回车即可\n\n如果提示命令没有找到,需安装openssh客户端\n``` shell\nyum -y install openssh-clients\\\n```\n## Publish over SSH配置\n由于我们使用到这个插件进行命令与文件的传输\n\n需要在`系统管理/System/Publish over SSH`中进行配置这个插件\n\n主要就是针对的上方的免密登录功能\n\n以下详细介绍每一个配置吧~\n``` shell\nname: 只是一个标识\n\nHostname: 远程ip,如果是本机可以localhost\n\nUsername:远程登录用户名,可以root\n\nRemote Directory:远程传输根目录,待会传输文件的目录会拼接上这个,我是习惯传输到/home下,所以可以填写/home\n\nKey 输入框粘贴 `/root/.ssh/id_rsa` 中的密钥,全部都要粘贴进去哦~\n```\n保存之前,可以进行测试,看以下是否成功!\n\n## 环境变量配置\n如果之前配置的环境变量,不是系统环境变量,需要单独为jenkins赋上\n\n不然执行命令,将提示命令未找到,主要是dotnet与npm\n\n我们可以在`系统管理/System`中的全局属性下有一个`环境变量`\n``` shell\nkey: PATH\nvalue: /usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/dotnet:/opt/nodejs/node-v18.13.0-linux-x64/bin\n```\n\n### 后端脚本编写\n\n有了环境,我们可以将我们的代码手动发布上传,测试一下是否可以手动执行dotnet运行,如果成功,将说明环境安装成功\n\n之后,我们可以写两个脚本,一个启动、一个关闭,放到我们的程序入口,关于程序的启动和关闭,可以由脚本来控制会减少很多的问题及困难\n\n我们其实已经在程序里带出来了,就是框架中的`start.sh`及`end.sh`\n\n``` shell\n#!/bin/bash\n./end.sh\nnohup dotnet Yi.Abp.Web.dll > /dev/null 2>&1 &\necho \"Yi-启动成功!\"\n\n\n#!/bin/bash\nkill $(lsof -t -i:19001)\necho \"Yi-进程已关闭\"\n\n```\n\n编写启动和停止脚本,我们还要给它赋值权限,否则不是一个有效的执行文件\n\n``` shell\nchmod +x start.sh\nchmod +x end.sh\n```\n\n> 这里如果提示:unix编码问题 ^M\n可以使用vim进行转码\n``` shell\nvim test.sh\n:set ff=unix\n:wq\n\n```\n\n\n## 流水线编写\n\n好了,到了这步,如果你一切顺利,恭喜你,准备进入流水线的脚本编写了\n\n> 心急吃不了热豆腐,我们得静下心来,这块需要慢慢配置,一点一点调试\n\n首页->新建任务->流水线\n\n> 以下脚本为Yi框架的cicd脚本,后端与前端及各个项目是不一样\n\n我这里已经将脚本编写好,可根据实际情况进行更改,主要是密钥和授权等\n\n### 后端流水线脚本:\n``` java\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.Abp.Net8/src/Yi.Abp.Web;\n dotnet publish -c Release;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_01.zip ./Yi.Abp.Net8/src/Yi.Abp.Web/bin/Release/net8.0/publish/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/net8\necho 开始解压\nunzip -o /home/yi/build/publish_01.zip -d ./\necho 开始启动\nsh start.sh\necho 启动成功'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n### 前端rbac脚本:\n``` shell\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.RuoYi.Vue3;\n npm config set registry https://registry.npm.taobao.org;\n npm i;\n npm run build:prod;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_rbac_01.zip ./Yi.RuoYi.Vue3/dist/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/rbac\necho 开始解压\nunzip -o /home/yi/build/publish_rbac_01.zip -d ./\necho 替换完成'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_rbac_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n\n### 前端bbs脚本\n``` shell\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.Bbs.Vue3;\n npm config set registry https://registry.npm.taobao.org;\n npm install;\n npm run build;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_bbs_01.zip ./Yi.Bbs.Vue3/dist/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/bbs\necho 开始解压\nunzip -o /home/yi/build/publish_bbs_01.zip -d ./\necho 替换完成'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_bbs_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n\n编写完成之后,可以逐步一下一下进行测试,看看哪里有问题再进行更改\n\n> 以上脚本,都是一步一个脚印,一晚一行代码磨出来的,比较适合现在的场景,可推荐使用,坑比较少\n\n## 进阶\n后续,你可以尝试`gitlab+jenkins+harbor+docker+k8s`的路线,这块橙子也是搭建过好几次,但需求点过于多,比较费劲,同时一般只有非常大型的项目才用的上,再次就不过多赘述了,想讲实战讲清楚,估计是当前篇幅至少10倍以上,里面的坑我之前pdf简单汇总了一次,大概就有23面以上,现在可能很有很多工具,安装应该没有那么复杂了,不过我还暂时没有去接触的场景,如果你想像我一样,可以一起播撒这颗种子,让更多人的收获\n\n## 结语\n可以看的出来,一个大家认为很简答的cicd,如果像从零开始一下一下搭建出来,坑还是蛮多的,爬出这些坑也是比较费事,并没有网上说的那么容易\n\n本人这种环境搭建不下10次以上,也只是`无他,熟能生巧而已`\n\n> 搞的多了,也就麻了,水来土挡,坑来我填\n\n最后,如果你这边怀着激动心情,讲上述的过程全部跑成功了,那么恭喜你啦~我亲爱的朋友,这篇文章教程就有它真正的意义了!\n\n','Jenkins流水线配置','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','00000000-0000-0000-0000-000000000000','2023-12-23 21:09:56','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2023-12-26 10:01:04',0),('5bc73d5b-d9d3-a9fa-fbcf-3a0f83ac66c2',0,'## 简介\n审计日志是对数据的操作记录\n例如:\n1. 数据的创建者\n2. 数据的创建时间\n3. 数据的更新者\n4. 数据的更新时间\n\n对于重要的数据,我们应该提供审计日志功能,方便进行数据追溯\n框架内部已`自动集成`,使用起来非常简单\n## 如何使用\n我们把全部的审计日志封装一个对象\n你的**实体**可直接继继承或者实现接口\nAuditedObject与IAuditedObject\n\n它包含4个属性字段,\n``` cs\n public DateTime CreationTime { get; set; }= DateTime.Now;\n\n public Guid? CreatorId { get; set; }\n\n public Guid? LastModifierId { get; set; }\n\n public DateTime? LastModificationTime { get; set; }\n\n```\n\n**在执行插入的时候:**\n会自动为`CreationTime` 与 `CreatorId` 赋值\n\n\n**在执行更新的时候:**\n会自动为`LastModificationTime` 与 `LastModifierId` 赋值\n\n当然,如果只需要部分的审计日志,你完全可以实现单独的接口\n分别为:\n``` cs\nIHasCreationTime\nIMayHaveCreator\nIModificationAuditedObject\nIHasModificationTime\n```','审计日志','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:20:34','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('5c85168f-9d75-dbd7-5de8-3a0ff53f8680',0,'- [iCal.NET](https://github.com/rianjs/ical.net) iCal.NET 是一个面向 .NET 的 iCalendar(RFC 5545)类库,旨在提供 RFC 5545 兼容性,并与流行的日历应用程序和类库完全兼容。','日历','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,18),('5cb28486-6431-0144-7613-3a0ff584b04a',0,'**C#Unity--2D迷宫**\n\n**作者心得**\n哇!这是?第一次接触游戏引擎!!!!\n体验真的极佳!\n那时候基本上课教一些跟专业没关系的课程\n偶然听别说c#在unity占的分量,我决定来试试!\n看了很多书,很多教程!很庆幸,我们学校图书馆还有好几本关于unity的书籍,于是上课时间,统统浏览几遍!\n\n**源代码**\n```csharp\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class move : MonoBehaviour\n{\n public float speed = 1.0F;\n // Start is called before the first frame update\n void Start()\n {\n \n }\n\n // Update is called once per frame\n void Update()\n {\n if (Input.GetKey(\"up\"))\n this.transform.Translate(0, 0, speed*Time.deltaTime);\n if (Input.GetKey(\"down\"))\n this.transform.Translate(0, 0, -speed * Time.deltaTime);\n if (Input.GetKey(\"left\"))\n this.transform.Translate(-speed * Time.deltaTime, 0, 0);\n if (Input.GetKey(\"right\"))\n this.transform.Translate(speed * Time.deltaTime, 0, 0);\n }\n}\n\n\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.UI;\n\npublic class open : MonoBehaviour\n{\n private GameObject btn;\n // Start is called before the first frame update\n void Start()\n {\n btn = GameObject.Find(\"Button\");\n btn.GetComponent\n \n \n \n \n \n \n\n\n\n```\n','JqueryJs--青年大学习截图上传统计工具','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 18:05:08','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('163afc07-fc66-3f79-ab38-3a0ff53f8684',0,'\r\n* [EmbedIO](https://github.com/unosquare/embedio) - 基于Mono构建的跨平台Web服务器。\r\n* [XSP](https://github.com/mono/xsp) - Mono的ASP.NET托管服务器。该模块包括一个Apache模块,一个可以连接到其他Web服务器的FastCGI模块,以及用于测试的独立服务器(类似于Microsoft的Cassini)。','WebServers','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,105),('16521d2c-0fe5-4496-8dd0-3a0fe7845287',1,'\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','C# 简介','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-05 00:38:49','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-05 00:39:19',0),('190541cc-32a2-3c3d-e711-3a0ff53f8680',0,'- [AIMLBot (Program#)](http://aimlbot.sourceforge.net/) - 一个小型、快速、符合标准但易于定制的基于 AIML(人工智能标记语言)的聊天机器人的 C# 实现。 \r\n- [SIML](https://simlbot.com/) - 合成智能标记语言,下一代聊天机器人和数字助手语言。 \r\n- [Mpt-Instruct-DotNet-S](https://github.com/NethermindEth/Mpt-Instruct-DotNet-S) - 能够生成和解释 C# 代码的低级虚拟机(LLM),以及其用于在消费者 CPU 上运行的 C# 包装器(需要5GB以上RAM),包含控制台和 Blazor 示例项目。\r\n* [BotSharp](https://github.com/SciSharp/BotSharp) - BotSharp是AI Bot平台构建者的开源机器学习框架。\r\n* [NadekoBot](https://github.com/Kwoth/NadekoBot) - 用C#编写的开源,通用的Discord聊天机器人。\r\n* [Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot) - Telegram Bot API客户端。\r\n* [Funogram](https://github.com/Dolfik1/Funogram) - F#Telegram Bot Api库。','人工智能','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,8),('193b98cd-64dc-af38-dcdd-3a0ff53f8683',0,'- [Rx.NET](https://github.com/dotnet/reactive) - 响应式扩展(Rx)是一个用于组合异步和基于事件的程序的库,使用可观察序列和LINQ风格的查询操作符。 \r\n- [Dynamic Data](https://github.com/reactivemarbles/DynamicData) - 集合的响应式扩展(Rx)。 \r\n- [ObsevableComputations](https://github.com/IgorBuchelnikov/ObservableComputations) - 一个跨平台的.NET库,用于处理参数和结果均实现了INotifyPropertyChanged和INotifyCollectionChanged(ObservableCollection)接口的对象的计算。','响应式编程','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,85),('195867e3-fe66-4959-9dea-3a0ff543218e',0,'![image.png](/prod-api/file/4c618d9f-802d-12e7-6d4e-3a0ff542fb7e/true)','Program入口','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:42:18','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('1986d25f-215f-5a84-c57c-3a0ff53f8683',0,'\r\n- [Ceras](https://github.com/rikimaru0345/Ceras) - Ceras是一个二进制序列化器。它将任何对象转换为byte[],并可以反向操作。它在功能、速度和使用上都超越一般,支持引用循环、大型/复杂的继承链、将对象分成部分等功能。 \r\n- [CsvExport](https://github.com/jitbit/CsvExport) - 非常简单轻巧的CSV导出工具,与Excel兼容,支持转义文本和引号等功能。 \r\n- [Protobuf.NET](https://github.com/protobuf-net/protobuf-net) - Protocol Buffers是Google用于大部分数据通信的二进制序列化格式的名称。 \r\n- [Json.NET](https://github.com/JamesNK/Newtonsoft.Json) - 非常流行的高性能JSON框架,用于.NET。 \r\n- [ServiceStack.Text](https://github.com/ServiceStack/ServiceStack.Text) - 用于servicestack.net的JSON、JSV和CSV文本序列化器。 \r\n- [Msgpack-Cli](https://github.com/msgpack/msgpack-cli) - 适用于通用语言基础结构的MessagePack实现。 \r\n- [Jil](https://github.com/kevin-montrose/Jil) - 快速的.NET JSON序列化器,基于Sigil构建(StackOverflow使用)。 \r\n- [ProtoBuf](https://github.com/SilentOrbit/protobuf) - 根据.proto规范生成协议缓冲区序列化的C#代码。 \r\n- [FlatSharp](https://github.com/jamescourtney/FlatSharp) - 快速、符合习惯的FlatBuffers实现。使用.fbs文件或属性。 \r\n- [F# Data](https://fsprojects.github.io/FSharp.Data/) - F#类型提供程序,用于访问XML、JSON、CSV和HTML文件(基于示例文档)以及访问WorldBank数据。 \r\n- [Bond](https://github.com/Microsoft/bond) - 用于处理有模式数据的跨平台框架。支持跨语言的序列化和功能强大的通用机制,用于高效操作数据。 \r\n- [Hyperion](https://github.com/akkadotnet/Hyperion) - 高性能的多态序列化器,用于.NET框架。 \r\n- [FileHelpers](https://github.com/MarcosMeli/FileHelpers) - 免费且易于使用的.NET库,用于在文件、字符串或流中导入或导出固定长度或分隔记录的数据。 \r\n- [FsPickler](https://github.com/mbraceproject/FsPickler) - 用于.NET的快速多格式消息序列化器。 \r\n- [Migrant](https://github.com/antmicro/Migrant) - 快速且灵活的序列化框架,可用于未装饰的类。 \r\n- [Utf8Json](https://github.com/neuecc/Utf8Json) - 用于C#(.NET、.NET Core、Unity和Xamarin)的快速且零分配的JSON序列化器,直接读写UTF8二进制数据以提高性能。 \r\n- [ObjectDumper.NET](https://github.com/thomasgalliker/ObjectDumper) - 将内存中的对象序列化为C#代码的工具。 \r\n- [FluentSerializer](https://github.com/Marvin-Brouwer/FluentSerializer#readme) - 针对多种数据格式的基于配置文件的序列化器。','序列化','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,91),('19a572c7-eaf9-4f01-35f8-3a0ff544ebfb',0,'![image.png](/prod-api/file/68284e28-7430-1949-5631-3a0ff544df96/true)','Autofac','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:44:15','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('1c8ab2c9-7714-b114-5978-3a0ff53f8682',0,'\r\n- [Cloudmersive PDF](https://cloudmersive.com/pdf-api) - Cloudmersive PDF是一个本地的.NET Framework和.NET Core NuGet库以及API服务,可以高度扩展和准确地创建、修改、加密或转换PDF文档;并且可以免费使用,没有过期时间 **[免费]** \r\n- [Docotic.Pdf](https://bitmiracle.com/pdf-library/) - 用于在.NET和.NET Core应用程序中创建、读取、编辑、绘制和打印PDF文档的PDF库。100%托管,没有不安全的代码块。 **[需要付费]** **]** \r\n- [ITextSharp](https://github.com/itext/itextsharp) - iText是一个PDF库,允许您在便携式文档格式(PDF)中创建、调整、检查和维护文档。 **[需要付费]** **[免费提供给开源项目]** \r\n- [PdfiumViewer](https://github.com/pvginkel/PdfiumViewer) - PdfiumViewer是基于PDFium项目的PDF查看器。 \r\n- [WkhtmlToPdf](https://github.com/codaxy/wkhtmltopdf) - 基于wkhtmltopdf控制台实用程序的C#包装器。允许使用HTML和CSS生成漂亮的PDF。 \r\n- [Pdfium.Net SDK](https://pdfium.patagames.com/) - 高级C# PDF库,用于渲染、创建、编辑、合并、拆分、打印和查看PDF文档。开源的PDF查看器可在[GitHub](https://github.com/patagames) 上找到。还提供[NuGet包](https://www.nuget.org/packages/Pdfium.Net.SDK/) ,可轻松将其包含到项目中。 **[需要付费]** \r\n- [PdfPig](https://uglytoad.github.io/PdfPig/) - 在C#中从PDF中读取、创建和提取文本和其他内容(PdfBox的端口)。 \r\n- [QuestPDF](https://www.questpdf.com/) - QuestPDF是一个经过现代化和经过测试的开源库,通过提供友好、可发现和可预测的C#流畅API,可以帮助您生成PDF文档。 \r\n- [Kevsoft.PDFtk](https://github.com/kevbite/Kevsoft.PDFtk) - 用于驱动强大的pdftk二进制文件的包装器,可以填充PDF表单、获取字段信息、连接多个文档或页面、拆分文档、添加或替换印章,以及附加文件到页面或从页面下载文件。\r\n- [PdfSharpCore](https://github.com/ststeiger/PdfSharpCore) - PdfSharpCore 是开源 .NET 库,可轻松即时创建和处理 PDF 文档。 相同的绘图例程可用于创建 PDF 文档、在屏幕上绘图或将输出发送到任何打印机。**[免费]** **[MIT开源]** ','PDF','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,78),('1d72b54e-ad7e-2f79-90e8-3a0ff53f8680',0,'\r\n- [BootstrapBlazor](https://github.com/dotnetcore/BootstrapBlazor) - 基于 Bootstrap 和 Blazor 的企业级 UI 组件集合。 \r\n- [ant-design-blazor](https://github.com/ant-design-blazor/ant-design-blazor) - 基于 Ant Design 和 Blazor WebAssembly 的企业级 UI 组件集合。 \r\n- [MASA.Blazor](https://github.com/BlazorComponent/MASA.Blazor) - 基于 Material Design 和 Blazor WebAssembly 的企业级 UI 组件集合。 \r\n- [Megabit.Blazorise](https://github.com/Megabit/Blazorise) - Blazorise 是一个构建在 Blazor 和 CSS 框架(如 Bootstrap、Bulma 和 Material)之上的组件库,非常易于使用。 \r\n- [blazork8s](https://github.com/weibaohui/blazork8s) - 使用 Blazor 和 .NET Core 构建的 Kubernetes 管理界面。\r\n','Blazor','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,12),('1e533a0a-3ac0-5562-5e8d-3a0ff53f8682',0,'- [ExcelDna](https://github.com/Excel-DNA/ExcelDna) - ExcelDna使使用C#、F#或VB .NET创建和部署Excel插件更加容易。 \r\n- [ClosedXML](https://github.com/ClosedXML/ClosedXML) - ClosedXML使开发人员更容易创建Excel 2007/2010文件。 \r\n- [NPOI](https://github.com/tonyqus/npoi) - 该项目是POI Java项目的.NET版本,位于[https://poi.apache.org/。](https://poi.apache.org/%E3%80%82) \r\n- [EPPlus](https://github.com/JanKallman/EPPlus) - EPPlus是一个.NET库,使用Open Office XML格式(xlsx)读取和写入Excel 2007/2010文件。 \r\n- [Open XML SDK](https://github.com/officedev/open-xml-sdk) - Open XML SDK提供了用于处理Open XML文档(DOCX、XLSX和PPTX)的开源库。 \r\n- [DocX](https://github.com/xceedsoftware/DocX) - DocX是一个.NET库,允许开发人员操作Word 2007/2010/2013文件,不需要安装Microsoft Word或Office。 \r\n- [ExcelDataReader](https://github.com/ExcelDataReader/ExcelDataReader) - 用于读取Microsoft Excel文件(2.0-2007)的轻量级快速C#库。 \r\n- [NetOffice](https://github.com/NetOfficeFw/NetOffice) - 用于Microsoft Office应用程序的.NET包装程序集。 \r\n- [GemBox.Bundle](https://www.gemboxsoftware.com/bundle) - 一组.NET组件,支持快速、简单和高效地处理办公文件(Excel、Word、PowerPoint、PDF和电子邮件)。 **[需要付费]** **[提供免费Lite版本]** \r\n- [Outlook Redemption](http://www.dimastr.com/redemption/home.htm) - 用于处理Outlook对象模型和(扩展的)MAPI的库。支持Outlook 98 - 2019。可以与Exchange和Outlook中的对象/邮件/帐户/文件夹一起使用。 **[需要付费]** \r\n- [ShapeCrawler](https://github.com/ShapeCrawler/ShapeCrawler) - 用于在没有安装Microsoft Office的情况下处理PowerPoint演示文稿的流畅API。 \r\n- [MiniExcel](https://github.com/shps951023/MiniExcel) - 一个微型Excel助手,避免OOM并具有高性能,可用于创建/映射/模板填充数据。 \r\n- [Toxy](https://github.com/nissl-lab/toxy) - .NET文本提取框架,支持一些文件格式。\r\n','Office','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,74),('1ee1880c-52cc-dc89-b4b5-3a0ff53f8680',0,'- [.NET Compiler Platform (\"Roslyn\") Analyzers](https://github.com/dotnet/roslyn-analyzers) - 一些最初用于帮助完善静态分析API设计和实现的Roslyn诊断分析器。 \r\n- [PVS-Studio](https://pvs-studio.com/en/pvs-studio/) - PVS-Studio是一款代码质量、安全性(SAST)和代码安全性的静态分析器。[[免费提供给开源项目](https://pvs-studio.com/en/order/open-source-license/) ] **[$]** \r\n- [NDepend](https://www.ndepend.com/) - 是一个用于估算.NET代码质量和技术债务的Visual Studio和VS Team Services扩展程序,可使用C# LINQ语法创建代码规则,可视化代码结构并关注变更和演进。**[$]** \r\n- [App.Metrics](https://github.com/AppMetrics/AppMetrics) - App Metrics是一个开源跨平台的.NET库,用于记录和报告应用程序内的指标,并报告其健康状况。更多详情请查看[文档](https://www.app-metrics.io/) 。 \r\n- [CodeMaid](http://www.codemaid.net/) - Visual Studio扩展,用于清理、深入分析和简化C#、C++、F#、VB、PHP、JSON、XAML、XML、ASP、HTML、CSS、LESS、SCSS、JavaScript和TypeScript代码。 \r\n- [StyleCop](https://github.com/StyleCop) - StyleCop分析C#源代码以强制执行一组样式和一致性规则。 \r\n- [Gendarme](https://github.com/spouliot/gendarme) - 可扩展的基于规则的工具,用于查找.NET应用程序和库中的问题。 \r\n- [Metrics-Net](https://github.com/Recognos/Metrics.NET) - 捕获CLR和应用程序级别的指标。因此,您知道发生了什么。 \r\n- [AspNet.Metrics](https://github.com/alhardy/aspnet-metrics) - 捕获CLR、应用程序级别的Web请求指标。使用Metrics-Net的中间件和扩展。 \r\n- [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet) - 强大的.NET性能基准库。 \r\n- [Bencher](https://bencher.dev/) - 一套连续基准测试工具,旨在在持续集成中捕获性能回归。 \r\n- [Codinion](https://www.codinion.com/) - 为C#和一些其他\"Visual\"特性提供了增强的语法突出显示。**[$]** \r\n- [NsDepCop](https://github.com/realvizu/NsDepCop) - 用于在C#项目中强制实施命名空间依赖规则的静态代码分析工具。 \r\n- [WebBen](https://github.com/omerfarukz/WebBen) - 用于对您的Hypertext Transfer Protocol (HTTP)服务器进行基准测试的工具。\r\n* [awesome-static-analysis](https://github.com/mre/awesome-static-analysis) - 针对各种编程语言的静态分析工具,链接和代码质量检查器的精选列表。\r\n* [CodeFormatter](https://github.com/dotnet/codeformatter) - CodeFormatter是使用Roslyn来自动重写我们的代码格式。\r\n* [DevSkim](https://github.com/Microsoft/DevSkim) - DevSkim是IDE扩展和语言分析器的框架,可在开发人员编写代码时在开发环境中提供内联安全性分析。\r\n* [RefactoringEssentials](https://github.com/icsharpcode/RefactoringEssentials) - Visual Studio扩展工具,支持分析和重构代码。\r\n* [roslyn-analyzers](https://github.com/dotnet/roslyn-analyzers) - Roslyn分析器分析您的代码的样式,质量和可维护性,设计和其他问题。\r\n* [StyleCopAnalyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) - StyleCop规则实现的.NET编译器平台。\r\n* [Audit.NET](https://github.com/thepirat000/Audit.NET) - 一个可扩展的框架,用于审核.NET和.NET Core中的执行操作。\r\n* [coverlet](https://github.com/tonerdo/coverlet) - Coverlet是.NET的跨平台代码覆盖框架。\r\n* [MiniCover](https://github.com/lucaslorentz/minicover) - 跨平台代码覆盖工具\r\n* [NBench](https://github.com/petabridge/NBench) - .NET应用程序的性能基准测试框架\r\n* [Nexogen.Libraries.Metrics](https://github.com/nexogen-international/Nexogen.Libraries.Metrics) - 用于在.NET中收集应用程序指标并将其导出到Prometheus的库。\r\n* [OpenCover](https://github.com/OpenCover/opencover) - 代码覆盖工具(仅适用于WINDOWS OS)\r\n* [PerformanceMonitor](https://github.com/dotnet-architecture/PerformanceMonitor) - .NET应用程序性能监视器。\r\n* [prometheus-net](https://github.com/prometheus-net/prometheus-net) - .NET指标,监视系统,检测应用程序的prometheus库。\r\n* [Prometheus.Client](https://github.com/PrometheusClientNet/Prometheus.Client) - Prometheus客户端。','代码分析和指标','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,23),('214c9cf9-a708-52dd-6009-3a0ff53f8680',0,'- [SharpCompress](https://github.com/adamhathcock/sharpcompress) - SharpCompress是用于.NET/Mono/Silverlight/WP7的压缩库,可以进行解压缩,支持rar、7zip、zip、tar、bzip2和gzip,提供了前向只读和文件随机访问API。它还实现了zip、tar、bzip2和gzip的写入支持。 \r\n- [DotNetZip.Semverd](https://github.com/haf/DotNetZip.Semverd) - 一个开源项目,提供了处理ZIP文件的.NET库以及一些相关工具。(是[不再维护 DotNetZip](https://archive.codeplex.com/?p=dotnetzip) 的分支) \r\n- [SharpZipLib](https://icsharpcode.github.io/SharpZipLib/) - 一个完全用C#编写的Zip、GZip、Tar和BZip2库,适用于.NET平台。 \r\n- [Snappy for Windows](https://snappy.machinezoo.com/) - 基于P/Invoke的.NET Snappy压缩库。 \r\n- [Snappy.Sharp](https://github.com/jeffesp/Snappy.Sharp) - 用C#实现的Google Snappy压缩算法。\r\n* [lz4net](https://github.com/MiloszKrajewski/K4os.Compression.LZ4) - 适用于所有.NET平台的超快速压缩算法。','压缩','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,26),('21c32610-8371-97fb-5e14-3a0fe670d770',0,'测试导入','测试.md','4a14cce8-795a-8c68-8c2a-3a0fe1c7215a','00000000-0000-0000-0000-000000000000','2024-01-04 19:37:55','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509',NULL,NULL,0),('22141ebb-7c79-d5a3-f662-3a0f83ae86b6',0,'我们的代码可直接编写在Src中,src中便是提供的模板使用\n\n当然,作为单独的模块或者示例,也可以通过前面的章节使用`脚手架`进行生成一个单独的模板\n\n## 使用脚手架创建代码目录\n![image.png](/prod-api/file/c364dd77-0905-22bc-c179-3a1004655d1b/true)\n我们本次的示例代码将全部放在源代码中的`sample`文件夹中,该文件夹只是提供的一个示例,作为顶层依赖,项目生成不会依赖于它\n\n![image.png](/prod-api/file/15ffd2d6-fe6d-7638-adc0-3a100467b186/true)\n进入对应的目录,使用\n``` shell\ndotnet new yi --name=Acme.BookStore\n```\n生成模板代码文件\n![image.png](/prod-api/file/0792c52d-d4c6-148b-0426-3a1004685bfc/true)\n\n然后将每一层项目手动添加到自己的项目解决方案中,右键添加现有方案\n\n![image.png](/prod-api/file/7a0fd471-767e-a5ed-eead-3a10046a90dd/true)\n\n设置启动项为Acme.BookStore.Web直接进行启动即可\n\n![image.png](/prod-api/file/32cccbae-df9d-b1be-dbc7-3a10046c47f6/true)\n\n> 可以看到swagger,至此一行代码没写,已经集成好了rbac与bbs的模块\n\n## 补充,去除内置的模块化\n由于模块化的存在,各个模板之间可以相互引用,如果我们的项目没有Bbs的功能,可直接去除依赖即可,相同的,没有Rbac也是可以直接去除的。\n\n当我们开发了属于自己的模块,其他项目也可以直接进行模块的依赖,非常的优雅\n\n去除模块依赖方式也非常的简单,只需要将各层相关的nuget或者项目依赖去除,将报错的红色的应用清理一下就完成了','1.创建应用服务端','e89c9593-f337-ada7-d108-3a0f83ae48e6','00000000-0000-0000-0000-000000000000','2023-12-16 15:22:53','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2024-01-10 15:25:59',0),('2319a427-c784-2b02-ea26-3a0ff53f8680',0,'- [Fody](https://github.com/Fody/Fody) - 编辑.net程序集的可扩展工具。\r\n- [ILRepack](https://github.com/gluck/il-repack) - ILMerge 的开源替代品。 \r\n- [Mono.Cecil](https://github.com/jbevain/cecil) - Cecil 是一个用于生成和检查以 ECMA CIL 格式表示的程序和库的库。','程序集','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,9),('259333a1-1672-cc4c-ae1e-3a0ff53ad549',0,'# AspNetCore面试题\r\n\r\n**1、什么是dot net core的startup class?**\r\n\r\n答:Startup class是dot net core应用的入口。所有的dot net core应用必须有这个class 这个类用来配置应用。\r\n\r\n  这个类的调用是在program main函数里面进行配置的。类的名字可以自己定义。\r\n\r\n**2、什么是中间件?**\r\n\r\n答:中间件在这里是指注入到应用中处理请求和响应的组件。\r\n\r\n**3、application builder的use和run方法有什么区别?**\r\n\r\n答:这两个方法都在start up class的configure方法里面调用。都是用来向应用请求管道里面添加中间件的。Use方法可以调用下一个中间件的添加,而run不会。\r\n\r\n**4、dot net core 管道里面的map拓展有什么作用?**\r\n\r\n答:可以针对不同的路径添加不同的中间件。\r\n\r\n**5、dot net core里面的路径是如何处理的?**\r\n\r\n答:路径处理是用来为进入的请求寻找处理函数的机制。所有的路径在函数运行开始时进行注册。\r\n\r\n  主要有两种路径处理方式,常规路径处理和属性路径处理。常规路径处理就是用MapRoute的方式设定调用路径,属性路径处理是指在调用函数的上方设定一个路径属性。\r\n\r\n**6、如何在dot net core中激活session功能?**\r\n\r\n答:首先要添加session包. 其次要在config service方法里面添加session。然后又在configure方法里面调用usesession。\r\n\r\n**7、描述一下依赖注入后的服务生命周期?**\r\n\r\n答:asp.net core主要提供了三种依赖注入的方式\r\n\r\n其中AddTransient与AddSingleton比较好区别\r\n\r\nAddTransient瞬时模式:每次都获取一个新的实例\r\n\r\nAddSingleton单例模式:每次都获取同一个实例\r\n\r\n \r\n\r\n而AddTransient与AddScoped的区别更不容易区别一点\r\n\r\n首先这两种方式每次请求得到的都不是同一个对象,从这点看会发现这两个都一样。\r\n\r\n但是我们可以继续分细一点,虽然不同的请求得到的结果不同,但是我们可以在同一次请求中去获取多次实例测试。\r\n\r\n小总结:\r\n\r\nAddTransient瞬时模式:每次请求,都获取一个新的实例。即使同一个请求获取多次也会是不同的实例\r\n\r\nAddScoped:每次请求,都获取一个新的实例。同一个请求获取多次会得到相同的实例\r\n\r\nAddSingleton单例模式:每次都获取同一个实例\r\n\r\n**8、dot net core跟dot net比较有哪些更好的地方?**\r\n\r\n  答:第一是跨平台,它可以运行在三大操作系统上面,windows, Linux和MAC。\r\n\r\n  第二是对架构本身安装没有依赖,因为所有的依赖都跟程序本身在一起。\r\n\r\n  第三是dot net core处理请求的效率更高,能够处理更多的请求。\r\n\r\n  第四是dot net core有更多的安装配置方法。\r\n\r\n**9、asp dot core有哪些好的功能?**\r\n\r\n答:第一是依赖注入。\r\n\r\n第二是日志系统架构。\r\n\r\n第三是引入了一个跨平台的网络服务器,kestrel。可以没有iis, apache和nginx就可以单独运行。\r\n\r\n第四是可以使用命令行创建应用。\r\n\r\n第五是使用APP settings json file来配置工程。\r\n\r\n第六是使用start up来注册服务。\r\n\r\n第七是更好的支持异步编程。\r\n\r\n第八是支持web socket和signal IR。\r\n\r\n第九是对于跨网站的请求的预防和保护机制。','AspNetCore面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,1),('2694ee8d-3b1a-b0a3-e2e0-3a0ff58533cf',0,'**C#Unity--3D迷宫**\n\n**作者心得**\n2d迷宫都有了\n能少的了3d???\n这不就来了?\n\n**源代码**\n\n```csharp\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class Player : MonoBehaviour\n{\n Transform m_camTransform;\n Vector3 m_camRot;\n float m_camHeight = 1.4f;\n public Transform m_transform;\n CharacterController m_ch;\n float m_movSpeed = 3.0f;\n float m_gravity = 2.0f;\n public int m_life = 5;\n // Start is called before the first frame update\n void Start()\n {\n m_transform = this.transform;\n m_ch = this.GetComponent();\n m_camTransform = Camera.main.transform;\n m_camTransform.position = m_transform.TransformPoint(0, m_camHeight,0);\n m_camTransform.rotation = m_transform.rotation;\n m_camRot = m_camTransform.eulerAngles;\n Cursor.lockState = CursorLockMode.Locked;\n Cursor.visible = false;\n }\n\n // Update is called once per frame\n void Update()\n {\n if (m_life <= 0)\n return;\n Control();\n }\n void Control()\n {\n float rh = Input.GetAxis(\"Mouse X\");\n float rv = Input.GetAxis(\"Mouse Y\");\n m_camRot.x -= rv;\n m_camRot.y += rh;\n m_camTransform.eulerAngles = m_camRot;\n Vector3 camrot = m_camTransform.eulerAngles;\n camrot.x = 0;camrot.z = 0;\n m_transform.eulerAngles = camrot;\n float xm = 0, ym = 0, zm = 0;\n //ym -= m_gravity * Time.deltaTime;\n if (Input.GetKey(KeyCode.W))\n {\n zm += m_movSpeed * Time.deltaTime;\n }\n if (Input.GetKey(KeyCode.S))\n {\n zm -= m_movSpeed * Time.deltaTime;\n }\n if (Input.GetKey(KeyCode.A))\n {\n xm -= m_movSpeed * Time.deltaTime;\n }\n else if (Input.GetKey(KeyCode.D))\n {\n xm += m_movSpeed * Time.deltaTime;\n }\n m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));\n\n m_camTransform.position = m_transform.TransformPoint(0,m_camHeight, 0);\n }\n}\n\n```\n**效果截图**\n![image.png](/prod-api/file/3b9028e9-fdb9-8981-6d29-3a0ff5850b28/true)\n![image.png](/prod-api/file/452132ed-d7df-8f85-6acc-3a0ff5851bda/true)\n\n**作者的话**\n迷宫算是unity的入门\n毕竟都是我自学,也没打算研究太深\n另外,我记得最后unity弄了一个大型3d跑酷的项目\n为此,还特意去学了建模\n那个项目奔跑,跳跃,捡道具,玩法较多\n可惜,毕竟年代久远加换了n次系统,现在貌似找不到了\n可惜!\n','C#Unity--3D迷宫','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:54:28','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('26db64b6-61c4-d057-3f49-3a0ff53f8682',0,'\r\n- [Cledev.OpenAI](https://github.com/lucabriguglia/Cledev.OpenAI) - 用于OpenAI的.NET SDK,包括ChatGPT、DALL-E和Whisper APIs以及一个Blazor Server游乐场。','OpenAI','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,75),('2adcde6b-ced1-8a06-b92f-3a0ff53f8680',0,'- [Unfold](https://github.com/thomasvm/unfold) - 用于.NET Web应用程序的基于PowerShell的部署解决方案 \r\n- [DbUp](https://github.com/DbUp/DbUp) - 用于将更改部署到SQL Server数据库的.NET库。它跟踪已经运行的SQL脚本,并运行需要的更改脚本,以使您的数据库保持最新 \r\n- [Octo Pack](https://github.com/OctopusDeploy/OctoPack) - 用于构建您的应用程序的NuGet包,以便使用Octopus Deploy等工具进行部署 \r\n- [yuniql](https://github.com/rdagumampan/yuniql) - 免费且开源的架构版本控制和迁移工具,使用.NET Core制作。使用纯SQL运行迁移,在普通文件夹中安排版本,并通过独立的CLI(无需CLR)、Azure Pipelines、Docker或ASP.NET Core代码从CSV中种子数据。详细信息请访问 [https://yuniql.io](https://yuniql.io/)\r\n','部署','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,33),('2e3b7f34-b6d7-78c3-6c56-3a0ff53f8683',0,'\r\n- [SqlKata](https://sqlkata.com/) - 一个优雅的SQL查询构建器,支持复杂查询、联接、子查询、嵌套的条件、供应商引擎目标等等。','SQL构建器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,82),('306d2f85-60de-0f9d-2770-3a0ff53f8682',0,'\r\n- [Community Toolkit](https://github.com/CommunityToolkit) - 用于各种.NET技术的控件和辅助库以及示例的集合。包括由Microsoft支持的现代MVVM库,包括[Windows Community Toolkit](https://github.com/CommunityToolkit/WindowsCommunityToolkit) 、[MAUI Community Toolkit](https://github.com/CommunityToolkit/Maui) 和[Dotnet Community Toolkit](https://github.com/CommunityToolkit/dotnet) 。 \r\n- [Caliburn.Micro](https://github.com/Caliburn-Micro/Caliburn.Micro) - 一个小而强大的框架,专为在所有XAML平台上构建应用程序而设计。它对MV*模式的强大支持将使您能够快速构建解决方案,无需牺牲代码质量或可测试性。 \r\n- [MVVM Light Toolkit](https://github.com/lbugnion/mvvmlight) - 该工具包的主要目的是加速在WPF、Silverlight、Windows Store(RT)和Windows Phone中创建和开发MVVM应用程序。 \r\n- [Catel](https://www.catelproject.com/) - Catel是一个应用程序开发平台,重点关注MVVM(WPF、Silverlight、Windows Phone和WinRT)和MVC(ASP.NET MVC)。Catel的核心包含了IoC容器、模型、验证、记忆、消息中介器、参数检查等。 \r\n- [UpdateControls](https://updatecontrols.net/cs/) - Update Controls不需要您实现`INotifyPropertyChanged`或声明`DependencyProperty`。它直接连接控件到CLR属性。这使它非常适合Model/View/ViewModel模式。 \r\n- [ReactiveUI](https://github.com/reactiveui/reactiveui/) - 用于.NET的MVVM框架,集成了Reactive Extensions(Rx)框架,使开发人员能够使用WPF、Windows Store应用程序、WP8或Xamarin构建优雅的可测试应用程序。 \r\n- [Okra App Framework](https://okraframework.github.io/) - 专为Windows 8.1构建的面向应用程序的MVVM框架,考虑了依赖注入,包括一套完整的Visual Studio MVVM模板。 \r\n- [Prism](https://github.com/PrismLibrary/Prism) - 一个跨平台的桌面和移动MVVM开发框架。 \r\n- [Win Application Framework (WAF)](https://github.com/jbe2277/waf) - 一个轻量级的框架,帮助您创建结构良好的WPF和UWP应用程序。它支持您应用分层架构和Model-View-ViewModel模式。 \r\n- [MVVMCross](https://github.com/MvvmCross/MvvmCross) - 跨平台的mvvm移动开发框架,适用于WPF、Silverlight for WP7和WP8、Mono for Android、MonoTouch for iOS、Windows通用项目(WPA8.1和Windows 8.1商店应用程序)。广泛使用可移植类库(PCL)来提供可维护的跨平台C#本机应用程序。 \r\n- [Stylet](https://github.com/canton7/stylet/) - 受Caliburn Micro启发的最小MVVM框架,具有良好的文档、高测试覆盖率和自己的IoC容器 \r\n- [Gemini](https://github.com/tgjones/gemini) - 在概念上类似于Visual Studio Shell的IDE框架。基于WPF、AvalonDock和Caliburn Micro构建。 \r\n- [Toms Toolbox](https://github.com/tom-englert/TomsToolbox) - 用于轻松构建基于[Managed Extensibility Framework (MEF)](https://docs.microsoft.com/en-us/dotnet/framework/mef/) 的模块化MVVM应用程序的可视化组合框架。 \r\n- [MVVM Dialogs](https://github.com/FantasticFiasco/mvvm-dialogs) - 简化了在WPF或UWP中使用MVVM时从视图模型打开对话框的概念的框架。 \r\n- [Smaragd](https://github.com/nkristek/Smaragd) - 一个跨平台、轻量级的库,用于使用MVVM架构开发.NET应用程序。 \r\n- [EBind](https://github.com/SIDOVSKY/EBind) - 简洁、快速且功能丰富的.NET数据绑定解决方案。\r\n','MVVM','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,71),('3075ba2d-9ff6-c20a-ba97-3a0ff53f8681',0,'\r\n- [Sandcastle](https://github.com/EWSoftware/SHFB) - 类似于 NDoc 的 Sandcastle 帮助文件生成器。 \r\n- [SourceBrowser](https://github.com/KirillOsenkov/SourceBrowser) - 源代码浏览器网站生成工具,用于支持 [https://referencesource.microsoft.com。](https://referencesource.microsoft.com./) \r\n- [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.WebApi) - 无缝地为 Web API 项目添加 Swagger 文档。 \r\n- [F# Formatting](https://fsprojects.github.io/FSharp.Formatting/) - 用于从 F# 脚本文件、Markdown 文档和内联 XML 或 Markdown 注释文档化 F# 和 C# 项目的工具。 \r\n- [DocFX](https://github.com/dotnet/docfx) - 用于构建和发布.NET项目的API文档的工具。 \r\n- [DocNet](https://github.com/FransBouma/DocNet) - 友好的静态文档生成器,使用Markdown文件来构建内容。','文档','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,37),('31c6abdb-855d-d980-1d58-3a0ff53f8683',0,'- [FluentScheduler](https://github.com/fluentscheduler/FluentScheduler) - 具有流畅界面的任务调度程序,可从您的应用程序运行自动化作业 \r\n- [NCrontab](https://github.com/atifaziz/NCrontab) - 用于解析和格式化 [crontab](http://crontab.org/) 表达式以及根据 crontab 日程计算时间发生的类库 \r\n- [NCrontab.Scheduler](https://github.com/thomasgalliker/NCrontab.Scheduler) - 用于调度基于 NCrontab 的任务的简单任务调度库 \r\n- [QuartzNet](https://github.com/quartznet/quartznet) - Quartz企业调度程序 .NET 版 \r\n- [Hangfire](https://github.com/HangfireIO) - 在.NET应用程序内执行fire-and-forget、延迟和循环任务的简单方法 \r\n- [Chroniton](https://github.com/leosperry/Chroniton) - 用于在计划上运行强类型作业(任务)的简单、完全可集成和可自定义库。 \r\n- [DurableTask](https://github.com/Azure/durabletask) - 该框架允许用户使用异步/等待功能在C#中编写长时间运行的持久工作流。 \r\n- [Workflow Core](https://github.com/danielgerlag/workflow-core) - 轻量级可嵌入的工作流引擎\r\n- [Coravel](https://github.com/jamesmh/coravel) - .Net Core符合Laravel:调度,排队等\r\n- [Gofer.NET](https://github.com/brthor/Gofer.NET) - 用于.NET Core的分布式后台任务/作业的简易C#API。','任务调度','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,88),('327f39b2-9e42-3615-6a8b-3a0fdcb0be5d',0,'## 2日\n1.正式上线`头像选择`功能\n2.新增`excel`上传下载功能\n3.支持接口`枚举`swagger友好显示\n\n## 3日\n1.新增右上角开源`地址导航`\n2.新增`文章导入`功能\n3.禁用操作主题或者文章时候进行`切换`\n\n## 4日\n1.上线`文章导入`功能,支持默认与vuepress方式\n2.新增首页用户注册人数、在线人数、昨日新增`用户分析`模块\n3.完善`面包屑`的显示及跳转\n\n## 5日\n1.完善首页`用户分析`模块实时显示\n\n## 6日\n1.开发`第三方登录OAuth`框架模块\n2.优化`置顶主题`的显示\n\n## 7日\n1.后端OAuth模块接入`QQ`实现\n2.后端OAuth模块接入`Gitee`实现\n3.随着业务的累积,优化`领域划分`结构\n4.优化`主题的高度`样式显示\n5.优化`目录的提示`显示交互体验\n6.新增用户头像的`悬浮窗口`显示\n\n## 8日\n1.优化`板块置顶`显示\n2.优化`在线人数`显示\n3.添加`第三方登录`页面搭建\n\n## 9日\n1.个人中心添加`第三方登录`界面\n2.登录页面添加`第三方登录`界面\n\n## 10日\n1.后端添加`脚手架`模板生成功能\n2.正式上线`第三方登录`QQ登录、Gitee登录\n\n## 11日\n1.后端优化`索引`结构\n2.后端实现`积分模块`,包含签到、钱钱、经验、排行榜\n\n## 12日\n1.后端初步搭建`任务调度`管理模块\n\n## 13日\n1.完成上线`任务调度`管理模块\n2.添加上线`签到`功能页面\n\n## 15日\n1.上线`钱钱`功能模块\n2.完善`签到记录`功能\n3.修复`评论换行`问题','2024年1月','e9e69a38-ce1e-06f5-7944-3a0fdc942ef3','00000000-0000-0000-0000-000000000000','2024-01-02 22:11:31','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2024-01-15 16:50:19',0),('3357ce5e-6027-0983-4015-3a0ff53f8682',0,'- [Microsoft Ajax Minifier](https://archive.codeplex.com/?p=ajaxmin) - 包含JS和CSS最小化器,具有最高的性能,因为它们专门为.NET设计。可选择为JS代码生成源映射。 \r\n- [Web Markup Minifier](https://github.com/Taritsyn/WebMarkupMin) - .NET库,包含一组标记最小化器。该项目的目标是通过减小HTML、XHTML和XML代码的大小来提高Web应用程序的性能。 \r\n- [CompressedStaticFiles](https://github.com/AnderssonPeter/CompressedStaticFiles) - 无需按需压缩即可将压缩的静态文件发送到浏览器,还支持在浏览器指示支持时发送更高级的图像格式。','最小化器','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,70),('342681a0-40ff-9f91-9815-3a0fe9b5b449',0,'预处理器指令是一组在编译C#代码之前处理源代码的指令。它们以#符号开头,并用于控制编译器的行为。预处理器指令在代码中不执行,而是在编译代码之前对其进行修改。本文将介绍C#中常用的预处理器指令,并提供一些示例代码。\r\n## 条件编译指令\r\n\r\n条件编译指令用于根据特定条件编译代码。这些条件可以是预定义的符号,也可以是自定义的符号。\r\n### #if 指令\r\n\r\n#if 指令指定一个条件,只有当该条件为 true 时,代码才会被编译。\r\n\r\n```arduino\r\n\r\n#define DEBUG\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#endif\r\n```\r\n\r\n\r\n### #elif 指令\r\n\r\n#elif 指令允许您指定多个条件。如果前面的 #if 或 #elif 条件不成立,则编译器会测试下一个条件。\r\n\r\n```arduino\r\n\r\n#define PLATFORM_X64\r\n#if PLATFORM_X86\r\n Console.WriteLine(\"32位平台\");\r\n#elif PLATFORM_X64\r\n Console.WriteLine(\"64位平台\");\r\n#endif\r\n```\r\n\r\n\r\n### #else 指令\r\n\r\n#else 指令指定一个条件不成立时执行的代码块。\r\n\r\n```arduino\r\n\r\n#define DEBUG\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#else\r\n Console.WriteLine(\"Release 版本\");\r\n#endif\r\n```\r\n\r\n\r\n### #endif 指令\r\n\r\n#endif 指令指示条件编译块的结束。\r\n\r\n```arduino\r\n\r\n#if DEBUG\r\n Console.WriteLine(\"Debug 版本\");\r\n#else\r\n Console.WriteLine(\"Release 版本\");\r\n#endif\r\n```\r\n\r\n\r\n## 行号指令\r\n\r\n行号指令允许您在编译器输出中包含源代码行号。\r\n### #line 指令\r\n\r\n#line 指令允许您更改行号和文件名,以控制编译器输出。\r\n\r\n```arduino\r\n\r\n#line 200 \"MyFile.cs\"\r\nConsole.WriteLine(\"输出在第 200 行,文件名为 MyFile.cs\");\r\n```\r\n\r\n\r\n### #line default 指令\r\n\r\n#line default 指令将行号指令重置为默认值,文件名也设置为当前文件的文件名。\r\n\r\n```arduino\r\n\r\n#line default\r\nConsole.WriteLine(\"重置为默认行号和文件名\");\r\n```\r\n\r\n\r\n## 错误指令\r\n\r\n错误指令允许您在代码中生成编译错误和警告。\r\n### #error 指令\r\n\r\n#error 指令在代码中生成一个编译错误,并显示指定的错误消息。\r\n\r\n```arduino\r\n\r\n#if PLATFORM_X86\r\n Console.WriteLine(\"32位平台\");\r\n#else\r\n #error 仅支持32位平台\r\n#endif\r\n```\r\n\r\n\r\n### #warning 指令\r\n\r\n#warning 指令在代码中生成一个编译警告,并显示指定的警告消息。\r\n\r\n```arduino\r\n\r\n#warning 这段代码需要进行性能优化\r\n```\r\n\r\n\r\n## 版本指令\r\n\r\n版本指令用于指定程序集的版本信息\r\n\r\n### #define 指令\r\n\r\n#define 指令用于定义符号。定义符号后,您可以在代码中使用 #if 指令来检查该符号是否定义。\r\n\r\n```arduino\r\n\r\n#define VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#else\r\n Console.WriteLine(\"版本 2\");\r\n#endif\r\n```\r\n\r\n\r\n### #undef 指令\r\n\r\n#undef 指令用于取消定义符号。\r\n\r\n```arduino\r\n\r\n#define VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#endif\r\n\r\n#undef VERSION_1\r\n#if VERSION_1\r\n Console.WriteLine(\"版本 1\");\r\n#else\r\n Console.WriteLine(\"未定义版本\");\r\n#endif\r\n```\r\n\r\n\r\n## 程序集指令\r\n\r\n程序集指令用于指定程序集的元数据。\r\n### #assembly 指令\r\n\r\n#assembly 指令指定程序集的元数据,如程序集名称、版本、作者、版权等。\r\n\r\n```csharp\r\n\r\n[assembly: AssemblyTitle(\"MyApplication\")]\r\n[assembly: AssemblyVersion(\"1.0.0.0\")]\r\n[assembly: AssemblyDescription(\"这是我的应用程序\")]\r\n```\r\n\r\n\r\n### #pragma 指令\r\n\r\n#pragma 指令用于指定编译器的行为。\r\n\r\n```arduino\r\n\r\n#pragma warning disable 0168\r\n```\r\n\r\n\r\n\r\n以上代码将禁用警告 0168。\r\n## 总结\r\n\r\n以上是C#中常用的预处理器指令,它们允许您在编译代码之前修改源代码和编译器行为。在编写C#程序时,预处理器指令是一个非常有用的工具,可以帮助您控制编译器的行为,并根据不同的条件编译不同的代码。\r\n','C# 预处理器指令','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,25),('345c66bf-c163-f40c-09aa-3a0ff53f867f',0,'- [.NET Boxed Templates](https://github.com/Dotnet-Boxed/Templates) - 包含一切的 .NET 项目模板,提供了启动所需的最少代码量,以加速开发过程。 \r\n- [ASP.NET Core Starter Kit](https://github.com/kriasoft/aspnet-starter-kit) - 后端:.NET Core、EF Core、C#;前端:Babel、Webpack、React、CSS 模块。 \r\n- [ProjectScaffold](https://github.com/fsprojects/ProjectScaffold) - 由 F# 基金会推荐的典型 .NET 解决方案,包括文件系统设置、用于依赖项的 Paket 和用于构建/测试自动化的 FAKE。默认情况下,构建过程还会编译文档并生成 NuGet 包。 \r\n- [Serene](https://github.com/volkanceylan/Serenity) - Serenity 是一个旨在简化和缩短基于服务架构的数据中心业务应用程序开发的 ASP.NET MVC 应用程序平台。Serenity 是一个用于构建 Serenity 应用程序的启动模板。 \r\n- [Side-Waffle](https://github.com/LigerShark/side-waffle) - 用于 Web 和桌面开发的大量有用模板的集合。 \r\n- [Template10](https://github.com/Windows-XAML/Template10) - 包含设计模式的 Windows 10 模板。 \r\n- [Nucleus](https://github.com/alirizaadiyahsi/Nucleus) - 使用 ASP.NET Core API 分层架构的 Vue 启动应用程序模板,采用 JWT 基于身份验证。 \r\n- [JHipster.NET](https://github.com/jhipster/jhipster-dotnetcore) - JHipster 蓝图,用 asp.net core 替换原始的 SpringBoot 后端。Jhipster 的主要目标是展示现代 Web 开发的最佳实践,用 Java 实现。因此,该项目的目标是在 .NET 中做同样的事情。前端可以使用 Angular、React 和不久的将支持 Blazor。\r\n* [aspnet-core-react-template](https://github.com/bradymholt/aspnet-core-react-template) - ASP.NET Core/ React SPA应用程序模板。\r\n* [AspNetCoreSpa](https://github.com/asadsahi/AspNetCoreSpa) - Asp.Net Core和Angular 8 SPA Fullstack应用程序模板。\r\n* [ASP.NET-MVC-Template](https://github.com/NikolayIT/ASP.NET-MVC-Template) - 带有Angular的ASP.NET MVC 5,ASP.NET Core和ASP.NET Core的现成模板。\r\n* [AddFeatureFolders](https://github.com/OdeToCode/AddFeatureFolders) - 为ASP.NET Core中的MVC控制器和视图启用功能文件夹。\r\n* [Angular Visual Studio Webpack Starter](https://github.com/damienbod/AngularWebpackVisualStudio) - 用于Webpack,Visual Studio,ASP.NET Core和Angular的模板。应用程序的客户端和服务器端都在一个ASP.NET Core项目中实现,这使得部署更容易。\r\n* [CleanArchitecture](https://github.com/ardalis/CleanArchitecture) - 一个高度适配的ASP.NET Core框架。\r\n* [CleanArchitecture (SPA)](https://github.com/JasonGT/CleanArchitecture) - 遵循Clean Architecture的原理使用Angular 8和ASP.NET Core 3创建单页应用程序(SPA)的解决方案模板\r\n* [DNTFrameworkCoreTemplate](https://github.com/rabbal/DNTFrameworkCoreTemplate) - 基于[DNTFrameworkCore]的Boilerplate项目模板。\r\n* [dotnet new caju](https://github.com/ivanpaulovich/dotnet-new-caju) - 代码整洁框架,[clean-architecture-manga](https://github.com/ivanpaulovich/clean-architecture-manga)。\r\n* [EISK](https://github.com/EISK/eisk.webapi) - 为开发人员资源提供简单的用例,以使用[体系结构最佳实践]在.NET Core之上构建可伸缩的应用程序 (DDD, onion architecture etc)\r\n* [JavaScriptServices](https://github.com/aspnet/JavaScriptServices) - Microsoft ASP.NET核心JavaScript服务。\r\n* [kendo-ui-core](https://github.com/telerik/kendo-ui-core) - 一个基于jQuery的HTML5小部件库,用于构建现代Web应用程序。\r\n* [QuickApp](https://github.com/emonney/QuickApp) - 具有完整登录,用户和角色管理的ASP.NET Core / Angular4启动项目模板。\r\n* [Serenity](https://github.com/volkanceylan/Serenity) - Serenity是一个ASP.NET MVC / TypeScript应用程序框架,旨在通过基于服务的体系结构,简化和缩短以数据为中心的应用程序开发。\r\n* [Toucan](https://github.com/mrellipse/toucan) - 用于构建单页应用程序的Boilerplate。服务器是围绕SOLID原则设计的多项目.Net Core解决方案。客户端是TypeScript 2,Vuejs 2,Vuex 2。','应用模板','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,1),('34dc6ac8-b63c-7dcb-14ec-3a0ff53f8681',0,'\r\n- [.NET Interactive](https://github.com/dotnet/interactive) - .NET Interactive将.NET的强大功能嵌入到您的交互式体验中。','交互式编程','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,57),('3721d2e0-5c12-ddec-8437-3a0ff5429c67',0,'![image.png](/prod-api/file/ae2370b5-e190-706c-6470-3a0ff5428232/true)','总览','2da0361c-000d-e0d8-6737-3a0ff5421cdc','00000000-0000-0000-0000-000000000000','2024-01-07 16:41:44','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('38f0c9ee-10b0-b273-f75b-3a0fe9b5b449',0,'C# 中的结构体 (Struct) 是一种用户定义的值类型。与类 (Class) 不同,结构体是一种轻量级的类型,适用于小型数据结构。结构体可以包含数据成员和方法成员。\r\n## 结构体的定义\r\n\r\n结构体的定义使用 `struct` 关键字,结构体名称遵循 Pascal 命名法,并且应该以大写字母开头。以下是结构体的一般语法:\r\n\r\n```csharp\r\n\r\nstruct StructName\r\n{\r\n // 数据成员和方法成员\r\n}\r\n```\r\n\r\n\r\n\r\n下面是一个简单的结构体定义的示例:\r\n\r\n```csharp\r\n\r\nstruct Point\r\n{\r\n public int X;\r\n public int Y;\r\n\r\n public Point(int x, int y)\r\n {\r\n X = x;\r\n Y = y;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在这个示例中,我们定义了一个 `Point` 结构体,它包含了两个整型的数据成员 `X` 和 `Y`,以及一个构造函数用于初始化这两个数据成员。\r\n## 结构体的实例化\r\n\r\n结构体是一种值类型,所以在声明结构体变量时,它会被分配在栈上而不是堆上。可以使用 `new` 运算符来实例化结构体对象,也可以使用默认构造函数来初始化结构体对象。\r\n\r\n```csharp\r\n\r\nPoint p1 = new Point(10, 20);\r\nPoint p2 = default(Point); // 使用默认构造函数初始化\r\n```\r\n\r\n\r\n## 结构体的使用\r\n\r\n结构体可以像类一样使用。可以访问结构体的数据成员和方法成员。\r\n\r\n```csharp\r\n\r\nConsole.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\np1.X = 100;\r\nConsole.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n```\r\n\r\n\r\n## 结构体的比较\r\n\r\n结构体可以使用比较运算符进行比较。在默认情况下,结构体的比较是按值进行的,即比较结构体的每个数据成员。\r\n\r\n```csharp\r\n\r\nPoint p3 = new Point(10, 20);\r\nif (p1 == p3)\r\n{\r\n Console.WriteLine(\"p1 and p3 are equal.\");\r\n}\r\nelse\r\n{\r\n Console.WriteLine(\"p1 and p3 are not equal.\");\r\n}\r\n```\r\n\r\n\r\n## 总结\r\n\r\n结构体是一种轻量级的值类型,适用于小型数据结构。与类不同,结构体是一种值类型,分配在栈上而不是堆上。结构体可以包含数据成员和方法成员,并且可以使用比较运算符进行比较。\r\n## 示例代码\r\n\r\n以下是一个完整的示例程序,用于演示结构体的使用:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nstruct Point\r\n{\r\n public int X;\r\n public int Y;\r\n\r\n public Point(int x, int y)\r\n {\r\n X = x;\r\n Y = y;\r\n }\r\n}\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Point p1 = Point(10, 20);\r\n Point p2 = default(Point);\r\n\r\n Console.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n Console.WriteLine(\"p2.X = {0}, p2.Y = {1}\", p2.X, p2.Y);\r\n\r\n p1.X = 100;\r\n Console.WriteLine(\"p1.X = {0}, p1.Y = {1}\", p1.X, p1.Y);\r\n\r\n Point p3 = new Point(10, 20);\r\n if (p1 == p3)\r\n {\r\n Console.WriteLine(\"p1 and p3 are equal.\");\r\n }\r\n else\r\n {\r\n Console.WriteLine(\"p1 and p3 are not equal.\");\r\n }\r\n }\r\n}\r\n```\r\n\r\n输出:\r\n```\r\np1.X = 10, p1.Y = 20\r\np2.X = 0, p2.Y = 0\r\np1.X = 100, p1.Y = 20\r\np1 and p3 are equal.\r\n```\r\n','C# 结构(Struct)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,17),('391cc105-0620-02c2-f020-3a0ff53f8680',0,'- [ASP.NET Identity](https://github.com/aspnet/Identity/) - ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的身份验证库。\r\n- [ASP.NET SAML](https://github.com/jitbit/AspNetSaml) - 用于 ASP.NET 应用程序的 SAML 认证支持。 \r\n- [DotNetOpenAuth](https://github.com/DotNetOpenAuth/DotNetOpenAuth) - OpenID、OAuth 和 InfoCard 协议的 C# 实现。 \r\n- [Logibit Hawk](https://github.com/logibit/logibit.hawk/) - F# [Hawk](https://github.com/outmoded/hawk) 认证库。 \r\n- [IdentityModel](https://github.com/IdentityModel) - 用于 .NET 4.5 和 MVC4/Web API 中的身份和访问控制的辅助库。 \r\n- [IdentityServer](https://github.com/IdentityServer) - 可扩展的 OAuth2 和 OpenID Connect 提供程序框架。 \r\n * [IdentityServer4.EntityFramework](https://github.com/IdentityServer/IdentityServer4.EntityFramework) - EF的IdentityServer4库。\r\n * [IdentityServer4.MongoDB](https://github.com/diogodamiani/IdentityServer4.MongoDB) - MongoDB 的IdentityServer4库。\r\n * [IdentityServer4.EntityFrameworkCore](https://github.com/2020IP/TwentyTwenty.IdentityServer4.EntityFrameworkCore) - EF Core 的IdentityServer4库。\r\n * [IdentityServer4.Templates](https://github.com/IdentityServer/IdentityServer4.Templates) - IdentityServer4模板.\r\n- [OAuth](https://github.com/danielcrenna/vault/tree/master/oauth) - 用 C# 编写的生成 OAuth 1.0a 签名的轻量级库。 \r\n- [Stuntman](https://rimdev.io/stuntman/) - Stuntman 是一个用于在开发过程中模拟用户身份的库,利用 .NET Claims Identity。 \r\n- [openiddict](https://github.com/openiddict/openiddict-core) - 灵活多用途的 .NET OAuth 2.0/OpenID Connect 堆栈。\r\n * [oidc-debugger](https://github.com/nbarbettini/oidc-debugger) - OAuth 2.0和OpenID Connect调试工具\r\n* [AspNet.Security.OpenIdConnect.Server](https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server) - 用于OWIN / Katana和ASP.NET Core的OpenID Connect / OAuth2服务器框架。\r\n* [Auth0](https://github.com/auth0/auth0.net) - Auth0身份验证和管理API的.NET客户端。\r\n* [Casbin.NET](https://github.com/casbin-net/Casbin.NET) - 支持ACL,RBAC,ABAC的授权库。\r\n* [stormpath-sdk](https://github.com/stormpath/stormpath-sdk-dotnet) - Stormpath使开发人员能够将用户身份验证,用户管理和安全工作流程快速构建到其应用程序中。\r\n* [aspnetcore-security-headers](https://github.com/juunas11/aspnetcore-security-headers) - 用于向ASP.NET Core应用程序添加安全标头的中间件。\r\n* [HtmlSanitizer](https://github.com/mganss/HtmlSanitizer) - 清除HTML以避免XSS攻击。\r\n* [jose-jwt](https://github.com/dvsekhvalnov/jose-jwt) - 用于处理JOSE对象的库(JWT,JWA,JWS及相关)。\r\n* [Jwt.Net](https://github.com/jwt-dotnet/jwt) - Jwt.Net,一个用于.NET的JWT(JSON Web令牌)实现。\r\n* [JWT Simple Server](https://github.com/Xabaril/JWTSimpleServer) - 用于ASP.NET Core的轻量级动态jwt服务器。\r\n* [NWebsec](https://github.com/NWebsec/NWebsec) - ASP.NET的安全库。\r\n* [reCAPTCHA](https://github.com/PaulMiami/reCAPTCHA) - 用于ASP.NET Core的reCAPTCHA 2.0。\r\n* [roslyn-security-guard](https://github.com/dotnet-security-guard/roslyn-security-guard) - 旨在帮助.NET应用程序进行安全审计的Roslyn分析器。\r\n* [OwaspHeaders](https://github.com/GaProgMan/OwaspHeaders.Core) - .NET Core中间件,用于注入Owasp推荐的HTTP标头,以提高安全性。\r\n* [Security](https://github.com/aspnet/Security) - 于Web应用程序的安全性和授权的中间件。\r\n* [SecurityHeaders](https://github.com/andrewlock/NetEscapades.AspNetCore.SecurityHeaders) - 允许向ASP.NET Core网站添加安全标头的小包。','认证授权','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,11),('394a5e45-3061-c7de-b2ab-3a0fe6ad9c4c',1,'import axios, {\r\n AxiosInstance,\r\n AxiosError,\r\n AxiosRequestConfig,\r\n AxiosResponse,\r\n} from \"axios\";\r\nimport { ElMessage } from \"element-plus\";\r\nimport qs from \"qs\";\r\n\r\n// 数据返回的接口\r\n// 定义请求响应参数,不含data\r\ninterface Result {\r\n code: number;\r\n msg: string;\r\n}\r\n\r\n// 请求响应参数,包含data\r\ninterface ResultData extends Result {\r\n newslist?: T;\r\n}\r\nenum RequestEnums {\r\n TIMEOUT = 20000,\r\n OVERDUE = 600, // 登录失效\r\n FAIL = 999, // 请求失败\r\n SUCCESS = 200, // 请求成功\r\n}\r\nconst config = {\r\n // 默认地址\r\n // baseURL: import.meta.env.VITE_APP_API_BASE_URL as string,\r\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\r\n // 设置超时时间\r\n timeout: RequestEnums.TIMEOUT as number,\r\n};\r\n\r\nclass RequestHttp {\r\n service: AxiosInstance;\r\n maxNum: number;\r\n completeCount: number;\r\n urls: AxiosRequestConfig[];\r\n len: number;\r\n public constructor(config: AxiosRequestConfig) {\r\n // 实例化axios\r\n this.service = axios.create(config);\r\n this.maxNum = 2;\r\n this.completeCount = 0;\r\n this.urls = [];\r\n this.len = 0;\r\n this.service.interceptors.request.use(\r\n (config: AxiosRequestConfig) => {\r\n // console.log(config)\r\n return this.enqueue(config);\r\n // return config\r\n },\r\n (error: AxiosError) => {\r\n Promise.reject(error);\r\n }\r\n );\r\n this.service.interceptors.response.use(\r\n (response: AxiosResponse) => {\r\n const { data, config } = response;\r\n if (data.code === RequestEnums.OVERDUE) {\r\n localStorage.setItem(\"token\", \"\");\r\n return Promise.reject(data);\r\n }\r\n if (data.code && data.code !== RequestEnums.SUCCESS) {\r\n ElMessage.error(data);\r\n return Promise.reject(data);\r\n }\r\n return data;\r\n },\r\n (error: AxiosError) => {\r\n const { response } = error;\r\n if (response) {\r\n this.handleCode(response.status);\r\n }\r\n if (!window.navigator.onLine) {\r\n ElMessage.error(\"网络连接失败\");\r\n }\r\n }\r\n );\r\n }\r\n handleCode(code: number): void {\r\n switch (code) {\r\n case 401:\r\n ElMessage.error(\"登录失败,请重新登录\");\r\n break;\r\n default:\r\n ElMessage.error(\"请求失败\");\r\n break;\r\n }\r\n }\r\n\r\n // 常用方法封装\r\n get(url: string, params?: object): Promise> {\r\n return this.service.get(url, { params });\r\n }\r\n post(url: string, params?: object): Promise> {\r\n return this.service.post(url, qs.stringify(params));\r\n }\r\n put(url: string, params?: object): Promise> {\r\n return this.service.put(url, qs.stringify(params));\r\n }\r\n delete(url: string, params?: object): Promise> {\r\n return this.service.delete(url, { params });\r\n }\r\n\r\n private enqueue(config: AxiosRequestConfig) {\r\n this.urls.push(config);\r\n this.len++;\r\n if (this.completeCount < this.maxNum) {\r\n this.next();\r\n }\r\n }\r\n\r\n private next() {\r\n let count = this.completeCount++;\r\n this.service.interceptors.request.use((config:AxiosRequestConfig)=>{\r\n console.log()\r\n })\r\n }\r\n}\r\n\r\n// 导出一个实例对象\r\nexport default new RequestHttp(config);\r\n','demo.txt','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:44:18','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:44:22',0),('3a17ec67-1bd1-6275-515a-3a0ff53f8680',0,'\r\n- [cmd](https://github.com/manojlds/cmd) - 一个用于以更简单方式运行外部程序的C#库。演示了C#的“动态”特性。','DLR','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,36),('3d055ac4-e5bf-2546-3c46-3a0fe6a6a54f',1,'测试导入11111111','测试.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:36:41','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:36:54',0),('3d74a219-292e-21df-3fe4-3a0ff53f8684',0,'* [Fleck](https://github.com/statianzo/Fleck) - Fleck是C#中的WebSocket服务器实现。 Fleck不需要继承,容器或其他引用。\r\n* [SignalR](https://github.com/SignalR/SignalR) - Web应用程序的实时Web功能,包括服务器端推送。\r\n* [SuperSocket](https://github.com/kerryjiang/SuperSocket) - 轻量级,跨平台和可扩展的套接字服务器应用程序框架。\r\n* [Websocket-Sharp](https://github.com/sta/websocket-sharp) - WebSocket协议的C#客户端和服务器实现。\r\n* [WebSocket4NET](https://archive.codeplex.com/?p=websocket4net) - 适用于.NET 2.0+、Xamarin、Mono、Silverlight、Windows Phone和WinRT的WebSocket客户端。\r\n* [Crossertech](https://crosser.io/) - 为你在Microsoft.NET平台上构建实时应用程序提供了一组强大的工具,以及更多功能。\r\n* [WampSharp](https://github.com/Code-Sharp/WampSharp) - Web 应用程序消息传递协议的 C# 实现\r\n* [The Web Application Messaging Protocol](https://wamp-proto.org/) - 一种提供远程过程调用和通过 WebSocket 发布/订阅的消息传递模式的协议。\r\n* [NetGain](https://github.com/StackExchange/NetGain) - 高性能的WebSocket服务器库,用于支持Stack Overflow。\r\n* [websocket-manager](https://github.com/radu-matei/websocket-manager) - ASP .NET Core的实时库。\r\n* [Websockets.PCL](https://github.com/NVentimiglia/Websockets.PCL) - WebSockets.PCL是一个可移植的类库,支持Profile 259,用于实现C#的WebSocket。\r\n* [Websocket.Client](https://github.com/Marfusios/websocket-client) - 一个多平台封装,覆盖了原生C#类ClientWebSocket,具有内置的重新连接和错误处理功能。','WebSocket','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,106),('3e28fd34-bc31-3b08-760d-3a0fe9b5b449',0,'\r\nC# 可空类型(Nullable)是一种用于表示变量可以具有空(null)值的特殊类型。在 C# 中,如果一个变量没有被赋值,那么它将自动地被赋值为 null,这通常是一个不合法的值。然而,有时候我们需要表示一个变量可以为空值,这时候就需要使用可空类型。\r\n## 定义可空类型\r\n\r\nC# 中的可空类型是通过在类型名称后面加上一个问号(?)来定义的,例如:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\ndouble? nullableDouble = 3.14;\r\nbool? nullableBool = true;\r\n```\r\n\r\n\r\n\r\n在上面的例子中,`nullableInt` 被定义为一个可空的整数类型,它的值为 null。`nullableDouble` 被定义为一个可空的双精度浮点数类型,它的值为 3.14。`nullableBool` 被定义为一个可空的布尔类型,它的值为 true。\r\n## 操作可空类型\r\n\r\n当我们使用可空类型时,需要注意一些操作的差异。例如,如果我们想要获取一个可空类型的值,需要使用 `.Value` 属性:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\nif (nullableInt.HasValue)\r\n{\r\n int value = nullableInt.Value;\r\n Console.WriteLine(value); // 这里不会输出任何内容,因为 nullableInt 的值为 null。\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的例子中,我们首先检查 `nullableInt` 是否有值,然后使用 `.Value` 属性获取其值。由于 `nullableInt` 的值为 null,所以我们不会在控制台输出任何内容。\r\n\r\n另外,还可以使用 `??` 运算符来给可空类型一个默认值。例如:\r\n\r\n```csharp\r\n\r\nint? nullableInt = null;\r\nint value = nullableInt ?? 0;\r\nConsole.WriteLine(value); // 输出 0\r\n```\r\n\r\n\r\n\r\n在上面的例子中,由于 `nullableInt` 的值为 null,所以我们使用 `??` 运算符将其替换为默认值 0。\r\n## 示例代码\r\n\r\n下面是一个完整的示例代码,展示了如何使用可空类型:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main()\r\n {\r\n int? nullableInt = null;\r\n double? nullableDouble = 3.14;\r\n bool? nullableBool = true;\r\n\r\n if (nullableInt.HasValue)\r\n {\r\n int value = nullableInt.Value;\r\n Console.WriteLine(value);\r\n }\r\n\r\n int value2 = nullableInt ?? 0;\r\n Console.WriteLine(value2);\r\n\r\n double value3 = nullableDouble ?? 0.0;\r\n Console.WriteLine(value3);\r\n\r\n bool value4 = nullableBool ?? false;\r\n Console.WriteLine(value4);\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例代码中,我们定义了三个可空类型的变量 `nullableInt`、`nullableDouble` 和 `nullableBool`,然后分别演示了如何使用 `.Value` 属性和 `??` 运算符获取其值,并将其输出到控制台上。\r\n','C# 可空类型(Nullable)','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,14),('3ef5dd22-29dd-2d41-23c1-3a0ff53f8681',0,'- [ExtensionMethods.Net](https://www.extensionmethod.net/csharp) - 包含一系列扩展方法的网站。 \r\n- [Z.ExtensionMethods](https://github.com/zzzprojects/Z.ExtensionMethods) - 包含1000多个有用的扩展方法。','扩展','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,44),('40575263-2283-7ba3-7b16-3a0ff53f8681',0,'\r\n- [AngleSharp](https://github.com/AngleSharp/AngleSharp) - 完整的HTML5 DOM和CSS3 OM构建。 \r\n- [dotless](https://github.com/dotless/dotless) - Ruby Less CSS库的.NET端口,详见 [http://www.dotlesscss.org。](http://www.dotlesscss.org./) \r\n- [ExCSS](https://github.com/TylerBrinks/ExCSS) - 用于C#的CSS3解析库。 \r\n- [HtmlAgilityPack](https://html-agility-pack.net/?z=codeplex) - 敏捷的HTML解析器,构建可读/可写的DOM,并支持普通的XPath或XSLT。 \r\n- [LibSass Host](https://github.com/Taritsyn/LibSassHost) - 围绕 [libSass](https://sass-lang.com/libsass) 库的.NET封装,具备支持虚拟文件系统的能力。 \r\n- [LtGt](https://github.com/Tyrrrz/LtGt) - 轻量级HTML处理器,可用于解析和导航DOM,处理CSS选择器,可以转换为Linq2Xml,易于扩展等等。\r\n','HTML-CSS','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,52),('4264aef4-979f-f533-dc79-3a100334d6a8',0,'## 简介\n上节说到,真正关注的代码其实只用在src中\n![image.png](/prod-api/file/7f52e9a7-6b6d-cc80-64f6-3a10031e9214/true)\n当我们要新建一个项目或者模块的时候,并不想取这个`Yi.Abp`的名字,我们可以使用dotnet的脚手架进行模板的生成\n\n**环境**:只需要dotnet sdk即可\n\n## 步骤\n![image.png](/prod-api/file/2a8d18c4-4899-433d-3553-3a10032e9645/true)\n在模板文件目录上,有一个`.template.config`文件夹,就是通过这个进行控制模板的生成及替换\n\n进入该目录,使用cmd执行以以下命令:\n``` shell\ndotnet new install . --force\n```\n\n![image.png](/prod-api/file/0a92e464-13af-ef93-77b9-3a10032fe20c/true)\n\n出现 `已安装以下模板` 及代表安装完成\n\n>我们只需要安装一次即可,如果模板文件发生变化,我们生成出来的文件也是一样会变化的\n\n当模板安装完成,接下来我们可以选择一个自己想要的空白文件夹,输入命令:\n\n``` shell\ndotnet new yi --name=Acme.BookStore\n#Acme.BookStore可以替换成你想要生成的名称即可\n```\n\n![image.png](/prod-api/file/55536e5a-ef47-1593-3701-3a100333df31/true)\n\n最后查看目录:\n![image.png](/prod-api/file/20286d62-a9d1-6ab0-7fc0-3a1003348554/true)\n这个便是我们想要的结果了','脚手架使用','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2024-01-10 09:41:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('42a6889a-d6f5-3836-9195-3a0fe745e5ba',0,'测试导入22222222222222','测试2.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 23:30:38','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509',NULL,NULL,0),('43c8fd5c-e80b-7071-63ed-3a0fe9b5b440',0,'\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','C# 简介','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,1),('43f54add-90e9-c3c1-56ac-3a0ff53f8684',0,'* WebAssembly\r\n * [Blazor](https://github.com/aspnet/blazor) - Blazor是使用C#/ Razor和HTML的.NET Web框架,可在带有WebAssembly的浏览器中运行。 \r\n * [Awesome Blazor](https://github.com/AdrienTorris/awesome-blazor) - Blazor的资源,Blazor是使用C#/ Razor和HTML的.NET Web框架,可在具有WebAssembly的浏览器中运行。\r\n * [Blazor Redux](https://github.com/torhovland/blazor-redux) - 将Redux状态存储与Blazor连接。\r\n * [Ooui](https://github.com/praeclarum/Ooui) - 是使用Web技术的.NET跨平台的小型UI库。\r\n* [ReactJS.NET](https://github.com/reactjs/React.NET) - 用于JSX编译和React组件的服务器端呈现的.NET库。\r\n* [redux.NET](https://github.com/GuillaumeSalles/redux.NET) - .NET应用程序的可预测状态容器。\r\n* [ASP.NET MVC](https://dotnet.microsoft.com/apps/aspnet) - ASP.NET是一个用于构建出色的网站和应用程序的免费Web框架。\r\n* [Coalesce](https://coalesce.intellitect.com/) - Coalesce是一个用于快速开发ASP.NET Core Web应用程序的框架。\r\n* [FubuMVC](https://github.com/DarthFubuMVC/fubumvc) - 一种用于.NET的前端控制器风格的MVC框架。\r\n* [NancyFx](https://github.com/NancyFx/Nancy) - 一个轻量级、低仪式感的框架,用于在.NET和Mono上构建基于HTTP的服务。\r\n* [IISNode](https://github.com/tjanczuk/iisnode) - 在IIS中托管Node.js应用程序。\r\n* [Suave.IO](https://suave.io/) - 一个框架/库/ Web服务器,让你在提前完成项目后,当你看到你用F#编写的美丽代码时,会感到欣慰得流泪。F#.\r\n* [DotVVM](https://github.com/riganti/dotvvm) - 面向不喜欢编写JavaScript的人的MVVM框架,支持OWIN和ASP.NET Core,并提供Visual Studio 2015和2017的免费扩展。\r\n* [Giraffe](https://github.com/giraffe-fsharp/Giraffe) - 用于构建丰富Web应用程序的功能性(F#)ASP.NET Core微框架。','Web框架','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,104),('44a285c9-706c-77c3-37f5-3a0fe480668b',1,'---\r\ntitle: C# 简介\r\narticle: false\r\ndate: 2023-04-15 11:39:44\r\npermalink: /pages/9d25e7/\r\n---\r\n\r\n## 简介\r\n\r\nC# 是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言。它最初于 2000 年发布,并随后成为 .NET 框架的一部分,逐渐成为开发 Windows 应用程序和 Web 应用程序的主要选择之一。C# 语言的设计目标是提供一种现代、通用、面向对象的编程语言,使开发人员能够更轻松地构建 Windows 应用程序、Web 应用程序、服务端应用程序等。\r\n## 语言特点\r\n\r\nC# 语言具有以下特点:\r\n\r\n- 简单易学:C# 语法简单,易于理解,同时也有着很多的教程和文档。\r\n- 类型安全:C# 提供了类型检查,能够在编译时发现很多错误。\r\n- 面向对象:C# 是一种面向对象的语言,支持类、接口、继承、封装等面向对象的概念。\r\n- 支持泛型:C# 支持泛型编程,能够实现更加通用的代码。\r\n- 自动内存管理:C# 采用垃圾回收机制,不需要开发人员手动管理内存,减少了内存泄漏等问题的出现。\r\n\r\n## 应用领域\r\n\r\nC# 语言的应用领域非常广泛,主要包括以下方面:\r\n\r\n- Windows 应用程序开发:C# 是 Windows 平台上的主流编程语言,开发 Windows 应用程序非常方便。\r\n- Web 应用程序开发:C# 和 ASP.NET 框架一起使用,可以开发 Web 应用程序和服务端应用程序。\r\n- 游戏开发:C# 和 Unity 一起使用,能够开发各种类型的游戏。\r\n- 移动应用程序开发:C# 和 Xamarin 一起使用,可以开发 Android 和 iOS 平台上的移动应用程序。\r\n\r\n## 开发环境\r\n\r\n如果你想使用 C# 开发应用程序,可以使用 Visual Studio 开发环境。Visual Studio 是一款功能强大、易于使用的 IDE,支持多种编程语言,包括 C#。除此之外,你还可以使用 Visual Studio Code、Rider 等其他的开发环境。\r\n\r\n## 示例代码\r\n\r\n下面是一个使用 C# 编写的 \"Hello, World!\" 程序的示例代码:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nclass Program\r\n{\r\n static void Main(string[] args)\r\n {\r\n Console.WriteLine(\"Hello, World!\");\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n这个程序会在控制台输出 \"Hello, World!\" 字符串。\r\n','01.C# 简介.md','67bbbd51-8f39-6bc3-46fe-3a0fa9fe8385','00000000-0000-0000-0000-000000000000','2024-01-04 10:35:41','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','74b32e7e-4586-78ca-fd43-3a0fa9fbd640','2024-01-04 23:56:50',0),('49eaf5a1-f354-f3b2-f4b1-3a0ff57d53ce',0,'## 《4.0v意世界--WinRar解压》\n - (采用winform平台,采用c#语言,winform项目下载即可使用)\n - (这个就有点来头了,首先使用的winrar解压操作,还有treeview和listview联合操作做了一个树状磁盘目录)\n - (最近打算去弄个自己的博客,希望支持)\n - (有人说做这个有什么用?主要他能实现自动化操作,我可以设置当你打开这个软件的时候,自动进行安装,相当于自动更新游戏的傻瓜操作)\n **效果图如下:**\n![image.png](/prod-api/file/c5007661-c34c-d8e1-da05-3a0ff57c98d4/true)\n\n![image.png](/prod-api/file/34acf4b5-a870-6542-f8b5-3a0ff57cb7fa/true)\n\n![image.png](/prod-api/file/e3fb8dce-be93-a318-a034-3a0ff57cd15d/true)\n\n![image.png](/prod-api/file/bb5318e2-4154-8192-7bbd-3a0ff57ce5a5/true)\n\n![image.png](/prod-api/file/b713dbcd-3708-8bcf-915e-3a0ff57cfc1e/true)\n**核心代码:**\n\n解压操作:\n``` cs\n public static string ExistsWinRar()\n {\n string result = string.Empty;\n\n string key = @\"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\WinRAR.exe\";\n RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(key);\n if (registryKey != null)\n {\n result = registryKey.GetValue(\"\").ToString();\n }\n registryKey.Close();\n\n return result;\n \n }\n\n public static void UnRAR(string rarFilePath, string unrarDestPath)\n {\n string rarexe = ExistsWinRar();\n if (String.IsNullOrEmpty(rarexe))\n {\n throw new Exception(\"未安装WinRAR程序。\");\n }\n try\n {\n //组合出需要shell的完整格式 \n string shellArguments = string.Format(\"x -o+ \\\"{0}\\\" \\\"{1}\\\\\\\"\", rarFilePath, unrarDestPath);\n\n //用Process调用 \n using (Process unrar = new Process())\n {\n ProcessStartInfo startinfo = new ProcessStartInfo();\n startinfo.FileName = rarexe;\n startinfo.Arguments = shellArguments; //设置命令参数 \n startinfo.WindowStyle = ProcessWindowStyle.Hidden; //隐藏 WinRAR 窗口 \n\n unrar.StartInfo = startinfo;\n unrar.Start();\n unrar.WaitForExit();//等待解压完成 \n\n unrar.Close();\n }\n }\n catch\n {\n throw;\n }\n }\n\n private void button1_Click(object sender, EventArgs e)\n {\n string rarFilePath = textBox1.Text;\n string unrarDestPath = textBox2.Text;\n try\n {\n UnRAR(rarFilePath, unrarDestPath);\n MessageBox.Show(\"成功!\");\n }\n catch\n {\n MessageBox.Show(\"错误!\");\n };\n }\n\n private void button2_Click(object sender, EventArgs e)\n {\n Form2 p =new Form2();\n p.ShowDialog();\n }\n\n private void cheak_Tick(object sender, EventArgs e)\n {\n textBox1.Text = data.data_t;\n textBox2.Text = data.data_f;\n }\n }\n```\n\n\n磁盘管理操作:\n \n\n``` cs\n private void Form2_Load(object sender, EventArgs e)\n {\n TreeNode rootNode = new TreeNode(\"我的电脑\");\n treeView1.Nodes.Add(rootNode);\n\n }\n\n private void ListViewShow(TreeNode NodeDir)\n {\n listViewFile.Clear();\n try\n {\n if (NodeDir.Parent == null)\n {\n foreach (string DrvName in Directory.GetLogicalDrives())\n {\n ListViewItem ItemList = new ListViewItem(DrvName);\n listViewFile.Items.Add(ItemList);\n }\n }\n else\n {\n foreach (string dirName in Directory.GetDirectories((string)NodeDir.Tag))\n {\n ListViewItem dirItem = new ListViewItem(dirName);\n listViewFile.Items.Add(dirItem);\n }\n foreach (string fileName in Directory.GetFiles((string)NodeDir.Tag))\n {\n ListViewItem fileItem = new ListViewItem(fileName);\n listViewFile.Items.Add(fileItem);\n }\n }\n }\n catch { }\n }\n private void TreeViewShow(TreeNode selectNode)\n {\n try\n {\n if (selectNode.Nodes.Count == 0)\n {\n if (selectNode.Parent == null)\n {\n foreach (string drvName in Directory.GetLogicalDrives())\n {\n TreeNode drvNode = new TreeNode(drvName);\n drvNode.Tag = drvName;\n selectNode.Nodes.Add(drvNode);\n }\n }\n else\n {\n foreach (string dirName in Directory.GetDirectories((string)selectNode.Tag))\n {\n TreeNode dirNode = new TreeNode(dirName);\n dirNode.Tag = dirName;\n selectNode.Nodes.Add(dirNode);\n }\n }\n }\n }\n catch (Exception ex)\n {\n MessageBox.Show(ex.Message);\n }\n }\n \n\n private void listViewFile_SelectedIndexChanged(object sender, EventArgs e)\n {\n //int selectCount = listViewFile.SelectedItems.Count;\n if (listViewFile.SelectedItems.Count == 0)\n return;\n data.data_t = listViewFile.SelectedItems[0].Text;\n }\n\n private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)\n {\n TreeViewShow(e.Node);\n ListViewShow(e.Node);\n if (treeView1.SelectedNode.Nodes.Count == 0)\n return;\n data.data_f = treeView1.SelectedNode.Text;\n }\n\n private void button1_Click(object sender, EventArgs e)\n {\n this.Close();\n }\n }\n```\n','C#Winform--WinRar解压','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:45:52','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('49f2547a-3d6c-0da4-4554-3a0fe672a3a9',1,'测试导入11111111','测试.md','4a14cce8-795a-8c68-8c2a-3a0fe1c7215a','00000000-0000-0000-0000-000000000000','2024-01-04 19:39:53','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 19:55:11',0),('4a109e3c-d4b5-2c34-487d-3a0fe6affc1a',1,'测试导入22222222222222','测试2.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 20:46:53','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 20:46:59',0),('4b13f388-6ff1-bd67-4276-3a0ff53ad54c',0,'# 微服务面试题\r\n\r\n**1、什么是微服务?**\r\n\r\n答:单个轻量级服务一般为一个单独微服务,微服务讲究的是 专注某个功能的实现,比如登录系统只专注于用户登录方面功能的实现,讲究的是职责单一,开箱即用,可以独立运行。微服务架构系统是一个分布式的系统,按照业务进行划分服务单元模块,解决单个系统的不足,满足越来越复杂的业务需求。\r\n\r\n​ 马丁福勒(Martin Fowler):就目前而言,对于微服务业界并没有一个统一的、标准的定义。但通常而言,微服务架构是一种架构模式或者说是架构风格,它提倡将单一应用程序划分成一组小的服务。每个服务运行在其独立的自己的进程中服务之间相互配合、相互协调,为用户提供最终价值。服务之间采用轻量级通信。每个服务都围绕具体业务进行构建,并能够独立部署到生产环境等。另外应尽量避免统一的、集中的服务管理机制。\r\n\r\n通俗的来讲:\r\n\r\n微服务就是一个独立的职责单一的服务应用程序。在 intellij idea 工具里面就是用maven开发的一个个独立的module,具体就是使用springboot 开发的一个小的模块,处理单一专业的业务逻辑,一个模块只做一个事情。\r\n\r\n微服务强调的是服务大小,关注的是某一个点,具体解决某一个问题/落地对应的一个服务应用,可以看做是idea 里面一个 module。\r\n\r\n比如你去医院:你的牙齿不舒服,那么你就去牙科。你的头疼,那么你就去脑科。一个个的科室,就是一个微服务,一个功能就是一个服务。\r\n\r\n**2、微服务之间如何独立通讯的?**\r\n\r\n答: 同步通信:.Net5通过 RPC GRPC 远程过程调用或者通过 REST 接口json调用 等。\r\n\r\n 异步:消息队列,如:RabbitMq、ActiveM、Kafka 等。\r\n\r\n**3、什么是熔断?什么是服务降级?**\r\n\r\n答:服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。\r\n\r\n服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。\r\n\r\n**4、微服务的优缺点是什么?说下你在项目中碰到的坑。**\r\n\r\n答:优点:松耦合,聚焦单一业务功能,无关开发语言,团队规模降低。在开发中,不需要了解多有业务,只专注于当前功能,便利集中,功能小而精。微服务一个功能受损,对其他功能影响并不是太大,可以快速定位问题。微服务只专注于当前业务逻辑代码,不会和 html、css 或其他界面进行混合。可以灵活搭配技术,独立性比较舒服。\r\n\r\n​ 缺点:随着服务数量增加,管理复杂,部署复杂,服务器需要增多,服务通信和调用压力增大,运维工程师压力增大,人力资源增多,系统依赖增强,数据一致性,性能监控。\r\n\r\n**5、你所知道微服务的技术栈有哪些?列举一二。**\r\n\r\n答:微服务条目 落地技术\r\n服务开发 AspnetCore、.Net5、.Net6\r\n服务配置与管理 携程公司的Apollo、社区的的Consul等\r\n服务注册与发现 Eurka、Consul、Zookeeper等\r\n服务调用 Rest(服务通信)、RPC、GRpc\r\n服务熔断器 Polly、Envoy等\r\n负载均衡 Nginx等\r\n服务接口调用(客户端简化工具) WebAPI等\r\n消息队列 Kafka、RabbitMQ、ActiveMQ等\r\n服务配置中心管理 Apollo、Chef等\r\n服务路由(API网关) Ocelot等\r\n服务监控 Zabbix,Nagios,Skywalking等\r\n全链路追踪 Zipkin,Brave,Skywalking等\r\n服务部署 Docker,OpenStack,Kubernetes等\r\n数据流操作开发包 SpringCloud Stream(封装与Redis,Rabbit,kafka等发送接收消息)\r\n事件消息总线CAP\r\n\r\n**6、什么是微服务架构?**\r\n\r\n答:微服务架构 就是 对微服务进行管理整合应用的。微服务架构 依赖于 微服务,是在微服务基础之上的。\r\n\r\n例如:上面已经列举了什么是微服务。在医院里,每一个科室都是一个独立的微服务,那么 这个医院 就是 一个大型的微服务架构,就类似 院长 可以 对下面的 科室进行管理。微服务架构主要就是这种功能。\r\n\r\n**7、设计微服务的最佳实践是什么?**\r\n\r\n答:\r\n\r\n1. 为每个微服务分开数据存储\r\n2. 将代码保持在类似的成熟度等级上\r\n3. 为每个微服务进行单独的构建\r\n4. 部署到容器中\r\n5. 将服务器视为无状态的\r\n\r\n**8、单体应用、SOA 和微服务架构有什么区别?****\r\n\r\n答:\r\n\r\n- **单体应用**类似于一个大容器,其中程序的所有组件都被组装在一起并紧密包装。\r\n- **SOA**是一组相互通信的服务。通信可以涉及简单的数据传送,也可以涉及两个或多个协调某些活动的服务。\r\n- **微服务架构**是一种架构风格,它将应用程序构建为以业务域为模型的小型自治服务集合。\r\n\r\n**9、在使用微服务架构时,你面临的挑战是什么?****\r\n\r\n答:\r\n\r\n开发较小的微服务听起来很容易,但在开发时会经常遇到一些挑战。\r\n\r\n- **自动化组件**:难以自动化,因为有许多较小的组件。对于每个组件,都必须采取构建、发布和监控的步骤。\r\n- **可感知性**:将大量组件维持在一起会带来难以部署、维护、监控和识别的问题。它需要在所有组件周围具有很好的感知能力。\r\n- **配置管理**:有时在各种环境中维护组件的配置会很困难。\r\n- **调试**:很难找到与产生的错误相关的每一项服务。维护一个集中式的日志和控制面板对调试问题至关重要。\r\n\r\n**10、为什么需要域驱动设计(DDD)?**\r\n\r\n答:\r\n\r\n- 映射领域\r\n- 降低复杂性\r\n- 可测试性\r\n- 可维护性\r\n- 知识丰富的设计\r\n- 将业务和服务结合在一起\r\n- 上下文集中\r\n- 通用语言\r\n\r\n**11、你对分布式事务的理解?**\r\n\r\n答:\r\n\r\n**分布式事务**是单个事件导致两个或多个不能以原子方式提交的单独数据源的突变的情况。在微服务的世界中,它变得更加复杂,因为每个服务都是一个工作单元,并且在大多数情况下,多个服务必须协同工作才能使业务成功。\r\n\r\n12、什么是幂等性(Idempotence)及用在那里?\r\n\r\n**幂等性**是能够以同样的方式做两次,而最终结果将保持不变,就好像它只做了一次的特性。\r\n\r\n**用法**:在远程服务或数据源中使用幂等性,以便当它多次接收指令时,只处理一次。\r\n\r\n**13、什么是有界上下文?**\r\n\r\n答:有界上下文是领域驱动设计的核心模式。 DDD 战略设计部门的重点是处理大型模型和团队。 DDD 通过将大型模型划分为不同的有界上下文并明确其相互关系来处理大型模型。\r\n\r\n**14、容器在微服务中的用途是什么?**\r\n\r\n答:容器是管理基于微服务的程序以便单独开发和部署它们的好方法*。*你可以将微服务封装在容器镜像及其依赖项中,然后可以用它来滚动开发按需实例的微服务而无需任何额外的工作。\r\n\r\n**15、什么是金丝雀发布(Canary Releasing)?**\r\n\r\n答:**金丝雀发布**是一种降低在生产中引入新版本软件风险的技术。通过在将更改传递给整个基础架构之前将更改缓慢地推广到一小部分用户来完成的。','微服务面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,11),('4b209706-6455-f4a5-357e-3a0ff53f867f',0,'- [Telegram.Bot](https://github.com/TelegramBots/Telegram.Bot) - 用于 [Telegram Bot API](https://core.telegram.org/bots/api) 的 .NET 客户端。 \r\n- [TLSharp](https://github.com/sochix/TLSharp) - 它非常适合任何希望直接向 Telegram 用户发送数据或编写自定义 Telegram 客户端的开发人员。 \r\n- [WTelegramClient](https://github.com/wiz0u/WTelegramClient) - 使用最新版本的 [Telegram Client API](https://core.telegram.org/methods) 自动化 Telegram 上的用户帐户。 \r\n- [NancyFx](https://github.com/NancyFx/Nancy) - 轻量级、低仪式感的框架,用于在 .NET 和 Mono 上构建基于 HTTP 的服务。 \r\n- [ASP.NET Web API](https://dotnet.microsoft.com/apps/aspnet/apis) - 使构建可触及广泛范围的客户端,包括浏览器和移动设备在内的 HTTP 服务变得容易的框架。 \r\n- [Breeze](https://breeze.github.io/doc-net/) - 使用 OData 3 协议,启用丰富的数据访问。提供了 JavaScript 和 C# 的客户端库。 \r\n- [Mobius: C# API for Spark](https://github.com/Microsoft/Mobius) - Mobius 为 Apache Spark 添加了 C# 语言绑定,使其能够在 C# 中实现 Spark 驱动程序代码和数据处理操作。 \r\n- [ServiceStack](https://github.com/ServiceStack/ServiceStack) - 精心设计的、非常快速的、非常愉快的 Web 服务框架,适用于所有情况。 \r\n- [Nelibur](https://github.com/Nelibur/Nelibur) - Nelibur 是基于纯 WCF 的消息传递式 Web 服务框架。Nelibur 简化了创建高性能和基于消息的 Web 服务,并且您肯定拥有 WCF 的所有功能。 \r\n- [WebAPI Contrib](https://github.com/WebApiContrib/WebAPIContrib) - 一组开源项目,帮助改进与 ASP.NET Web API 的工作。 \r\n- [Xamarin.Essentials](https://docs.microsoft.com/en-us/xamarin/essentials/) - Xamarin.Essentials 为移动应用程序提供跨平台 API。 \r\n- [FFImageLoading - Fast & Furious Image Loading](https://github.com/luberda-molinet/FFImageLoading) - 这个库可以在 Xamarin.iOS、Xamarin.Android、Xamarin.Forms、Xamarin.Mac / Xamarin.Tizen 和 Windows(UWP、WinRT)上快速、轻松地加载图像。 \r\n- [Ocelot](https://github.com/ThreeMammals/Ocelot) - .NET Core API 网关。 \r\n- [CommandQuery](https://github.com/hlaueriksson/CommandQuery) - 用于 ASP.NET Core、AWS Lambda、Azure Functions、Google Cloud Functions、ASP.NET Web API 2 的命令查询分离。 \r\n- [Cloud Storage](https://github.com/managedcode/Storage) :此库提供了访问和操作不同云 Blob 存储提供程序(Azure Storage、AWS S3、Google Cloud Storage)中的数据的通用接口。它使得在提供程序之间轻松切换或同时使用多个提供程序变得容易,而无需学习和使用多个 API。\r\n* [autorest](https://github.com/Azure/autorest) - Swagger(OpenAPI)规范代码生成器,具有C#和Razor模板。支持C#,Java,Node.js,TypeScript,Python和Ruby。\r\n* [aspnet-api-versioning](https://github.com/Microsoft/aspnet-api-versioning) - 提供一组库,这些库可将服务API版本添加到ASP.NET Web API,具有ASP.NET Web API的OData和ASP.NET Core。\r\n* [AspNetCoreRateLimit](https://github.com/stefanprodan/AspNetCoreRateLimit) - ASP.NET限速中间件。\r\n* [CondenserDotNet](https://github.com/Drawaes/CondenserDotNet) - 使用Kestrel和Consul的API Condenser / Reverse Proxy,包括轻量级consul库。\r\n* [Flurl](https://github.com/tmenier/Flurl) - 适用于.NET的Fluent URL构建器和可测试的HTTP。\r\n* GraphQL\r\n * [Dapper.GraphQL](https://github.com/landmarkhw/Dapper.GraphQL) - 一个旨在将Dapper和graphql-dotnet项目集成在一起的库,主要考虑的是易用性和性能。\r\n * [graphql-aspnetcore](https://github.com/JuergenGutsch/graphql-aspnetcore) - ASP.NET Core MiddleWare创建GraphQL端点。\r\n * [graphql-convention](https://github.com/graphql-dotnet/conventions) - 该库是GraphQL的补充层,使您可以使用现有的属性和方法作为字段解析器,将.NET类自动包装到GraphQL模式定义中。\r\n * [graphiql-dotnet](https://github.com/JosephWoodward/graphiql-dotnet) - 用于ASP.NET Core的GraphiQL中间件。\r\n * [graphql-dotnetcore](https://github.com/mkmarek/graphql-dotnetcore) - 基于[graphql-js](https://github.com/graphql/graphql-js)的.NETQL GraphQL。\r\n * [graphql-dotnet](https://github.com/graphql-dotnet/graphql-dotnet) - GraphQL for .NET。\r\n * [graphql-dotnet-server](https://github.com/graphql-dotnet/server) - GraphQL for .NET - 订阅传输WebSockets。\r\n * [Hot Chocolate](https://github.com/ChilliCream/hotchocolate) - .Net Core和.NET Framework的GraphQL服务器。\r\n * [FSharp.Data.GraphQL](https://github.com/fsprojects/FSharp.Data.GraphQL) - Facebook GraphQL查询语言的[FSharp]((https://fsprojects.github.io/FSharp.Data.GraphQL))实现。\r\n * [parser](https://github.com/graphql-dotnet/parser) - .NET中GraphQL的词法分析器和解析器。\r\n * [tanka-graphql](https://github.com/pekkah/tanka-graphql) - GraphQL执行库和服务器库,支持SignalR,Apollo,模式操纵以及Apollo和graphql-js熟悉的其他功能。\r\n* [halcyon](https://github.com/visualeyes/halcyon) - ASP.NET的HAL实现。\r\n* [JSON API .NET Core](https://github.com/Research-Institute/json-api-dotnet-core) - 用于ASP.Net Core的JSON API框架。\r\n* [LightNode](https://github.com/neuecc/LightNode) - 基于OWIN构建的Micro RPC / REST框架\r\n* [NetCoreStack.Proxy](https://github.com/NetCoreStack/Proxy) - 适用于.NET Standard 2.0的类型安全的分布式REST库(NetCoreStack Flying Proxy)\r\n* [NSwag](https://github.com/RSuter/NSwag) - 用于.NET,Web API和TypeScript的Swagger / OpenAPI工具链。\r\n* [OData](https://github.com/OData/WebApi/tree/feature/netcore) - 开放数据协议(OData)支持创建基于HTTP的数据服务,允许使用统一资源标识符识别资源( URIs)并在抽象数据模型中定义,由Web客户端使用简单的HTTP消息进行发布和编辑。\r\n* [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator) - 可以通过 OpenAPI Generator,在给定 OpenAPI 规范(v2, v3)的情况下自动生成 API 客户端库、server stubs、文档以及配置。\r\n* [refit](https://github.com/paulcbetts/refit) - 适用于.NET Core,Xamarin和.NET的自动类型安全REST库。\r\n* [RestClient.Net](https://github.com/MelbourneDeveloper/RestClient.Net) - 适用于所有C#跨平台的REST客户端。\r\n* [RestEase](https://github.com/canton7/RestEase) - 易于使用的类型安全REST API客户端库,简单且可自定义。\r\n* [RestLess](https://github.com/letsar/RestLess) - .Net Standard的自动类型安全无反射REST API客户端库。\r\n* [Restier](https://github.com/OData/RESTier) - RESTier是一个RESTful API开发框架,用于在.NET平台上构建基于OData V4的标准化RESTful服务。\r\n* [Restsharp](https://github.com/restsharp/RestSharp) - 用于.NET的简单REST和HTTP API客户端\r\n* [Swashbuckle](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) - Swagger工具,生成API文档,包括用于测试的UI。\r\n * [MicroElements.Swashbuckle.FluentValidation](https://github.com/micro-elements/MicroElements.Swashbuckle.FluentValidation) - 向Swagger添加FluentValidation规则。\r\n * [Swashbuckle.AspNetCore.Filters](https://github.com/mattfrear/Swashbuckle.AspNetCore.Filters) - 一堆有用的Swashbuckle.AspNetCore筛选器。\r\n * [WebAnchor](https://github.com/mattiasnordqvist/Web-Anchor) - Web Anchor 提供了类型安全,可测试和灵活的,运行时生成的Web资源访问。简单来说提供了Web APi灵活的访问方式。\r\n* [WebAPIContrib for ASP.NET CORE](https://github.com/WebApiContrib/WebAPIContrib.Core) - ASP.NET Core的附加组件和扩展库。','API','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,3),('4b4b193e-9601-501b-011b-3a0f83825961',0,'## 它是什么?\n\nYiFramework是一个基于.Net8+Abp.vNext+SqlSugar的DDD领域驱动设计后端开源框架\n\n中文名称:意框架\n\n英文名称:YiFramework\n\n但是,不仅仅是如此\n\n## 它的理念\n谁说Abp复杂?谁说DDD难?打破常规,化繁为简,新人入门,项目二开,最佳方式之一\n\n> 一百个人,就有一百种DDD,Yi框架不一定是极度严格的DDD,而是站在巨人的肩膀上,经过极多项目的提炼,摸索出一种最佳实践\n\n\n优雅的进行快速开发,通常,简单程度与优雅程度不可兼得,Yi框架并不一昧的追求极致的解耦,会站在用户使用角度上,在使用难易度进行考虑衡量\n\n> 一个面向用户的快速开发后端框架\n\n在真正的使用这,你会明白这一点,极致的简单,也是优雅的一种体现。\n\n## 特点\n- 面向用户的后端框架,使用简单,适合小型、中型、企业级项目\n- 项目直接内置源码,不打包,非常适合进行二开改造\n- 内置包含大量通用场景模块\n- 等等\n\n## 基础设施简介\n\n以下全部功能可直接使用:\n\n- [Abp.vNext官网](https://docs.abp.io/zh-Hans/abp/latest/)\n\n- [SqlSugar官网](https://www.donet5.com/home/doc)\n\n## 内置模块简介\n- Rbac权限管理系统\n- Bbs论坛社区系统\n\n\n> 重复的东西,无需再写一遍,这也是优雅的体现之一\n','Yi框架简介','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2023-12-16 14:34:38','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('4f5bac5d-5e36-59a3-d15a-3a0f83aace6f',0,'## 简介\n熟悉Asp.NetCore的小伙伴们,对依赖注入可太熟悉,这里也不在过多的讲述依赖注入知识\n默认内置的注入方式,通常是在启动类文件,一个一个手动注入,例如:\n``` cs\nservice.Addsingle<接口,类>()\n```\n同样,当服务过多,添加服务的代码会显的非常长,不够优雅\n可以使用框架内置的接口\n- IScopedDependency\n- ISingletonDependency\n- ITransientDependency\n\n也可以使用框架内置的特性\n- DependencyAttribute\n- ExposeServicesAttribute\n\n> 使用特性,可以指定特定类、接口作为抽象\n## 如何使用\n#### 特性方式:\n在实现类上标注特性即可\n``` cs\n[ExposeServices(typeof(ITestService))]\n[Dependency(ServiceLifetime.Transient)]\npublic class Test\n{\n}\n```\n\n#### 接口方式:\n同理,根据不同的接口,选择不同的生命周期,自动会优先找自动以`I+类名`的接口作为抽象\n``` cs\npublic class Test:ITest,ISingletonDependency\n{\n}\n```','依赖注入','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:18:50','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('509444a0-17ff-2d0c-9100-3a0facd63cea',0,'## 111111111111111','11','8593141f-ca6b-dbac-7c57-3a0facd5b208','00000000-0000-0000-0000-000000000000','2023-12-24 15:10:42','a46718ba-f869-6473-142b-3a0facd47b09',NULL,NULL,0),('517df697-63d3-0412-8aa6-3a0ff53f8682',0,'- [MathNet](https://www.mathdotnet.com/) - Math.NET 是一个开源倡议,旨在构建和维护涵盖基本数学的工具包,以满足.NET开发人员的高级和日常需求。 \r\n- [Microsoft Automatic Graph Layout](https://github.com/Microsoft/automatic-graph-layout) - 用于图形布局和查看的一组工具。 \r\n- [UnitConversion](https://github.com/atulmish/UnitConversion) - 可扩展的 .NET Core 和 .NET Framework 单位转换库。 \r\n- [ALGLIB](https://www.alglib.net/) - ALGLIB 是一个跨平台的数值分析和数据处理库。它支持多种编程语言(C++、C#、Delphi)和多种操作系统(Windows 和 POSIX,包括 Linux)【专有】和【免费版】。 \r\n- [AutoDiff](https://github.com/alexshtf/autodiff) - AutoDiff 是一个用于快速计算由表达式定义的函数梯度的库。主要在数值优化中有用。 \r\n- [GeometRi](https://github.com/RiSearcher/GeometRi.CSharp) - 用于 .Net 的简单轻量级计算几何库。 \r\n- [Rationals](https://github.com/tompazourek/Rationals) - 用于 .NET 的有任意精度的有理数算术实现。 \r\n- [MKL.NET](https://github.com/AnthonyLloyd/MKL.NET) - 用于 Intel MKL 的简单跨平台 .NET API。 \r\n- [AngouriMath](https://github.com/asc-community/AngouriMath) - 一个开源的符号/计算代数库,主要用于 C# 和 F#。它涵盖了各种功能,可视为.NET中SymPy的替代品。 \r\n- [Vim.Math3d](https://github.com/vimaec/math3d) - 一个功能丰富的跨平台替代 System.Numerics,支持一致的序列化和二进制布局,以及用于高效3D数学的其他结构和算法。 \r\n- [WPF-Math](https://github.com/ForNeVeR/wpf-math) - 一个用于 WPF 框架的渲染数学公式的 .NET 库,使用 LaTeX 排版风格。 \r\n- [Jodo.Numerics](https://github.com/JosephJShort/Jodo/#numerics) - 提供额外的数字类型(如定点数和不溢出的数)以及对运算符、数学、字符串解析等的全面支持。经过广泛测试,跨平台兼容。','数学','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,66),('52d7c4f6-5a2e-9bea-4584-3a0f83ad066c',0,'## 简介\n> 鉴权是用于解析用户的令牌,知道用户是否携带令牌,并且知道用户信息是谁\n\n改鉴权使用的是微软Asp.NetCore扩鉴权扩展方式\n程序模块已内置 \n``` cs\ncontext.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\n .AddJwtBearer(options =>\n {\n options.TokenValidationParameters = new TokenValidationParameters\n {\n ClockSkew = TimeSpan.Zero,\n ValidateIssuer = true,\n ValidateAudience = true,\n ValidateLifetime = true,\n ValidateIssuerSigningKey = true,\n ValidIssuer = jwtOptions.Issuer,\n ValidAudience = jwtOptions.Audience,\n RequireExpirationTime = true,\n IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtOptions.SecurityKey))\n };\n options.Events = new JwtBearerEvents\n {\n OnMessageReceived = context =>\n {\n var accessToken = context.Request.Query[\"access_token\"];\n if (!string.IsNullOrEmpty(accessToken))\n {\n context.Token = accessToken;\n }\n return Task.CompletedTask;\n }\n };\n });\n```\n## 如何使用\n默认已经集成,所以在使用方面,可要求客户端添加标准的jwtbear头即可\n\nswagger 接口文档中,已集成,直接输入jwttoken即可\n![Alt text](../image/swaggerIndex.png)\n\n我们采用的是HSA对称加密方式,只需要具备密钥\n对应的配置文件\n``` json\n //鉴权\n \"JwtOptions\": {\n \"Issuer\": \"https://ccnetcore.com\",\n \"Audience\": \"https://ccnetcore.com\",\n \"SecurityKey\": \"zqxwcevrbtnymu312412ihe9rfwhe78rh23djoi32hrui3ryf9e8wfh34iuj54y0934uti4h97fgw7hf97wyh8yy69520\",\n \"ExpiresMinuteTime\": 86400\n }\n```\n## Token如何来\n那肯定是登录啊,登录接口会返回Token\n\n那如何制作Token?直接上代码,下面这个也是登录的创建token的方式\n\n``` cs\n /// \n /// 创建令牌\n /// \n /// \n /// \n private string CreateToken(Dictionary dic)\n {\n var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecurityKey));\n var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);\n var claims = dic.Select(x => new Claim(x.Key, x.Value.ToString())).ToList();\n var token = new JwtSecurityToken(\n issuer: _jwtOptions.Issuer,\n audience: _jwtOptions.Audience,\n claims: claims,\n expires: DateTime.Now.AddSeconds(_jwtOptions.ExpiresMinuteTime),\n notBefore: DateTime.Now,\n signingCredentials: creds);\n string returnToken = new JwtSecurityTokenHandler().WriteToken(token);\n\n return returnToken;\n }\n```\n','Jwt鉴权','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:21:15','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('52e07765-63e1-c17c-67df-3a0ff53ad54c',0,'\r\n**1、那些地方用到了单例模式**\r\n\r\n答:\r\n\r\n1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。\r\n2. 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。\r\n3. 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制\r\n4. Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个\r\n5. windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。\r\n\r\n**2、举一个用 .Net5中实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类** **层次?** 答:装饰模式增加强了单个对象的能力。.Net5 IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如 BufferedStream 它们增强了 Stream 对象, 以实现提升性能的 Buffer 层次的读取和写入。\r\n\r\n**3、适配器模式是什么?什么时候使用?\\****\r\n\r\n答:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。\r\n\r\n**4、适配器模式与装饰器模式有什么区别?\\****\r\n\r\n答:虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。\r\n\r\n装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者模提供了比继承更有弹性的替代方案。\r\n\r\n通俗的解释:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。\r\n\r\n适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。\r\n\r\n适配器模式有三种:类的适配器模式、对象的适配器模式、接口的适配器模式。\r\n\r\n通俗的说法:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。\r\n\r\n**5、适配器模式和代理模式之间有什么不同?\\****\r\n\r\n答:这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。\r\n\r\n**6、使用工厂模式最主要的好处是什么?你在哪里使用?**\r\n\r\n答:工厂模式的最大好处是增加了创建对象时的封装层次。如果 你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。可以看我的文章工厂模式得更详细的解释和和了解更多的好处。\r\n\r\n**7、什么时候使用享元模式?**\r\n\r\n答:享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。Net5中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。\r\n\r\n**8、什么是责任链设计模式\\****\r\n\r\n答:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。\r\n\r\n**9、你可以说出几个在.Net5中使用的设计模式吗?**\r\n\r\n答:装饰器设计模式(Decorator design pattern)被用于多个.Net5 IO类中。单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如HttpClient,像HttpClientFactory,观察者模式(Observer pattern)被用于DiagnosticSource和很多的事件监听中。','设计模式面试题','f6462b48-9601-0253-6450-3a0ff538dfa4','00000000-0000-0000-0000-000000000000','2024-01-07 16:33:14','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,9),('5373ab8e-b1ce-b873-faf1-3a0f8385b93a',0,'# 后端\nC# Asp.NetCore 8.0\n- [x] 动态Api:Abp.vNext\n- [x] 鉴权授权:Jwt\n- [x] 日志:Serilog\n- [x] 模块化:Abp.vNext\n- [x] 依赖注入:Autofac\n- [x] 对象映射:Mapster\n- [x] ORM: SqlsugarCore\n- [x] 多租户:Abp.vNext\n- [x] 后台任务:Quartz.Net\n- [x] 本地缓存:Abp.vNext\n- [x] 分布式缓存:Abp.vNext\n- [x] 事件总线:Abp.vNext\n\n# 前端\njs Vue3.2\n- [x] 异步请求:axios\n- [x] 图表:echarts\n- [x] ui:element-plus\n- [x] 存储:pinia\n- [x] 路由:vue-router\n- [x] 打包:vite\n\n# 运维\n- [x] 部署:nginx\n- [x] CICD:gitlab+Jenkins\n- [x] Docker:harbor\n\n\n','核心技术','aaa00329-7f35-d3fe-d258-3a0f8380b742','00000000-0000-0000-0000-000000000000','2023-12-16 14:38:19','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('54a0da70-7907-9ca4-55b2-3a0f83acd072',0,'## 简介\n种子数据一直都是一个很繁琐的东西,例如在初始化数据的时候,添加默认用户\n可以通过导入sql的方式进行添加种子数据,也可以通过程序代码中自动初始化数据\n我们目前提供后者\n\n## 如何使用\n一切的根源,来源自:`IDataSeedContributor`\n直接使用实现`IDataSeedContributor`接口,我们只需要实现 `SeedAsync(DataSeedContext context)`即可\n\n在实现类上,要将该类加入容器中,推荐通过内置的依赖注入模块\n\n当然,对于扩展,你可以重写其他的方法\n\n#### 其他方式使用\n另外,你可以直接依赖注入,直接使用IDataSeeder SeedAsync方法,重新手动执行种子数据\n> 默认在程序启动的时候,会根据配置文件选择,是否执行种子数据\n\n## 完整例子\n``` cs\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing SqlSugar;\nusing Volo.Abp.Data;\nusing Volo.Abp.DependencyInjection;\nusing Volo.Abp.Domain.Repositories;\nusing Volo.Abp.Guids;\nusing Yi.Framework.Rbac.Domain.Entities;\nusing Yi.Framework.SqlSugarCore.Abstractions;\n\nnamespace Yi.Framework.Bbs.SqlSugarCore.DataSeeds\n{\n public class ConfigDataSeed : IDataSeedContributor, ITransientDependency\n {\n private ISqlSugarRepository _repository;\n public ConfigDataSeed(ISqlSugarRepository repository)\n {\n _repository = repository;\n }\n public async Task SeedAsync(DataSeedContext context)\n {\n if (!await _repository.IsAnyAsync(x => true))\n {\n await _repository.InsertManyAsync(GetSeedData());\n }\n }\n public List GetSeedData()\n {\n List entities = new List();\n ConfigEntity config1 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.name\",\n ConfigName = \"站点名称\",\n ConfigValue = \"意社区\"\n };\n entities.Add(config1);\n\n ConfigEntity config2 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.author\",\n ConfigName = \"站点作者\",\n ConfigValue = \"橙子\"\n };\n entities.Add(config2);\n\n ConfigEntity config3 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.icp\",\n ConfigName = \"站点Icp备案\",\n ConfigValue = \"赣ICP备20008025号\"\n };\n entities.Add(config3);\n\n\n ConfigEntity config4 = new ConfigEntity()\n {\n ConfigKey = \"bbs.site.bottom\",\n ConfigName = \"站点底部信息\",\n ConfigValue = \"你好世界\"\n };\n entities.Add(config4);\n return entities;\n }\n }\n\n\n}\n\n \n```','种子数据','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:21:01','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('55ba8148-b948-9c55-ffd5-3a0ff53f8682',0,'\r\n- [NetCoreServer](https://github.com/chronoxor/NetCoreServer) - 超快和低延迟的异步套接字服务器和客户端C# .NET Core库,支持TCP、SSL、UDP、HTTP、HTTPS、WebSocket协议以及10K连接问题的解决方案(NETStandard)。 \r\n- [SharpPcap](https://github.com/chmorgan/sharppcap) - 完全托管的、跨平台(Windows、Mac、Linux)的.NET库,用于从实时和基于文件的设备捕获数据包。\r\n- [AspNetCore.Proxy](https://github.com/twitchax/AspNetCore.Proxy) - Proxy代理库。\r\n- [CurlThin](https://github.com/stil/CurlThin) - 轻量级cURL绑定库,支持通过curl_multi接口进行多个同时传输。\r\n- [NETStandard.HttpListener](https://github.com/StefH/NETStandard.HttpListener) - HttpListener(NETStandard)。\r\n- [Networker](https://github.com/MarkioE/Networker) - 一个简单易用的.NET TCP和UDP网络库,旨在实现灵活,可扩展和快速。','网络','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,72),('57ffa3f7-03c4-fc7d-1ae8-3a0fe745b5ca',1,'测试导入11111111','测试.md','32518510-b9d5-4436-a902-3a0fe686d8ce','00000000-0000-0000-0000-000000000000','2024-01-04 23:30:26','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','627714f3-0ed1-1ec5-fdf5-3a0f9dc32509','2024-01-04 23:30:32',0),('58170f2f-ef75-82b0-6964-3a0ff53f8682',0,'\r\n- ## Markdown 处理 \r\n- [MarkdownSharp](https://code.google.com/archive/p/markdownsharp) - Markdown处理器的开源C#实现,被广泛用于Stack Overflow等地方。 \r\n- [F# Formatting](https://fsprojects.github.io/FSharp.Formatting/) - 用于文档化F#和C#项目的工具。该库包含可扩展的Markdown解析器作为核心组件。 \r\n- [CommonMark.NET](https://github.com/Knagis/CommonMark.NET) - 用于将Markdown文档转换为HTML的C#实现CommonMark规范。经过最大性能和可移植性的优化。 \r\n- [markdig](https://github.com/lunet-io/markdig) - 用于.NET的快速、强大、符合CommonMark规范的可扩展Markdown处理器。','Markdown','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,64),('595c740e-00a0-54f3-a662-3a0fe9b5b449',0,'当我们在使用面向对象编程语言时,多态性是一个非常重要的概念。C# 是一种面向对象编程语言,它支持多态性的特性。\r\n## 什么是多态性?\r\n\r\n多态性是指同一种行为或方法在不同的对象上具有不同的实现方式或表现形式的能力。这意味着,一个对象的方法可以被多个对象使用,并且每个对象可以根据自己的特定情况来执行该方法。这使得代码更加灵活和可重用。\r\n## 多态性的类型\r\n\r\n在 C# 中,有两种类型的多态性:静态多态性和动态多态性。\r\n### 静态多态性\r\n\r\n静态多态性又被称为编译时多态性或重载。它是指在编译时就能够确定要执行哪个方法,而不是在运行时才确定。在 C# 中,实现静态多态性的方法有方法重载和运算符重载。\r\n#### 方法重载\r\n\r\n方法重载是指在一个类中定义多个具有相同名称但参数类型或数量不同的方法。编译器将根据调用方法时传递的参数类型和数量来确定要执行的方法。\r\n\r\n例如,下面的代码演示了方法重载的实现:\r\n\r\n```csharp\r\n\r\nclass Calculator\r\n{\r\n public int Add(int a, int b)\r\n {\r\n return a + b;\r\n }\r\n \r\n public double Add(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,`Calculator` 类中定义了两个名为 `Add` 的方法。一个方法接受 `int` 类型的参数,另一个方法接受 `double` 类型的参数。编译器会根据传递的参数类型和数量来确定要执行的方法。例如:\r\n\r\n```csharp\r\n\r\nvar calculator = new Calculator();\r\n\r\nint result1 = calculator.Add(2, 3); // 调用第一个 Add 方法,返回 5\r\ndouble result2 = calculator.Add(2.5, 3.5); // 调用第二个 Add 方法,返回 6.0\r\n```\r\n\r\n\r\n#### 运算符重载\r\n\r\nC# 允许我们对运算符进行重载,这样我们就可以对自定义类型进行运算。例如,我们可以对 `+` 运算符进行重载,使其能够对自定义类型进行加法运算。\r\n\r\n例如,下面的代码演示了如何对自定义类型 `Point` 进行加法运算:\r\n\r\n```csharp\r\n\r\nclass Point\r\n{\r\n public int X { get; set; }\r\n public int Y { get; set; }\r\n \r\n public static Point operator +(Point p1, Point p2)\r\n {\r\n return new Point { X = p1.X + p2.X, Y = p1.Y + p2.Y };\r\n }\r\n}\r\n\r\nvar p1 = new Point { X = 2, Y = 3 };\r\nvar p2 = new Point { X = 4, Y = 5 };\r\nvar p3 = p1 + p2; //\r\n```\r\n\r\n在上面的示例中,我们定义了 `Point` 类,并对 `+` 运算符进行了重载。重载方法采用静态方法的形式,并且必须以 `operator` 关键字开头,后面跟着要重载的运算符。在这个示例中,我们定义了 `+` 运算符的重载方法。这个方法接受两个 `Point` 类型的参数,并返回一个新的 `Point` 对象,表示两个点的和。\r\n### 动态多态性\r\n\r\n动态多态性又被称为运行时多态性或覆盖。它是指在运行时才能够确定要执行哪个方法。在 C# 中,实现动态多态性的方法有虚方法和抽象方法。\r\n#### 虚方法\r\n\r\n虚方法是指在基类中定义的方法,它可以被子类重写。在基类中,我们可以使用 `virtual` 关键字来声明一个方法是虚方法。在子类中,我们可以使用 `override` 关键字来重写基类中的虚方法。\r\n\r\n例如,下面的代码演示了如何使用虚方法:\r\n\r\n```csharp\r\n\r\nclass Shape\r\n{\r\n public virtual double GetArea()\r\n {\r\n return 0;\r\n }\r\n}\r\n\r\nclass Circle : Shape\r\n{\r\n public double Radius { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Math.PI * Radius * Radius;\r\n }\r\n}\r\n\r\nclass Square : Shape\r\n{\r\n public double Side { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个 `Shape` 类,它包含一个虚方法 `GetArea`。`Circle` 和 `Square` 类都继承自 `Shape` 类,并重写了 `GetArea` 方法。这样,在我们调用 `GetArea` 方法时,具体执行哪个方法取决于对象的实际类型。例如:\r\n\r\n```csharp\r\n\r\nvar circle = new Circle { Radius = 5 };\r\nvar square = new Square { Side = 10 };\r\n\r\ndouble circleArea = circle.GetArea(); // 返回 78.53981633974483\r\ndouble squareArea = square.GetArea(); // 返回 100\r\n```\r\n\r\n\r\n#### 抽象方法\r\n\r\n抽象方法是指在基类中定义的没有实现体的方法,它必须在派生类中被实现。在基类中,我们可以使用 `abstract` 关键字来声明一个方法是抽象方法。在子类中,我们必须使用 `override` 关键字来实现基类中的抽象方法。\r\n\r\n例如,下面的代码演示了如何使用抽象方法:\r\n\r\n```csharp\r\n\r\nabstract class Shape\r\n{\r\n public abstract double GetArea();\r\n}\r\n\r\nclass Circle : Shape\r\n{\r\n public double Radius { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Math.PI * Radius * Radius;\r\n }\r\n}\r\n\r\nclass Square : Shape\r\n{\r\n public double Side { get; set; }\r\n \r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n}\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们定义了一个抽象类`Shape`,它包含一个抽象方法 `GetArea`。`Circle` 和 `Square` 类都继承自 `Shape` 类,并实现了 `GetArea` 方法。这样,在我们调用 `GetArea` 方法时,具体执行哪个方法取决于对象的实际类型。例如:\r\n\r\n```csharp\r\n\r\nShape circle = new Circle { Radius = 5 };\r\nShape square = new Square { Side = 10 };\r\n\r\ndouble circleArea = circle.GetArea(); // 返回 78.53981633974483\r\ndouble squareArea = square.GetArea(); // 返回 100\r\n```\r\n\r\n\r\n\r\n在上面的示例中,我们将 `Circle` 和 `Square` 对象赋值给 `Shape` 类型的变量。这样做的好处是可以提高代码的灵活性,因为我们可以使用基类类型的变量来引用派生类对象。\r\n## 总结\r\n\r\n多态性是面向对象编程中非常重要的概念。C# 支持两种类型的多态性:静态多态性和动态多态性。静态多态性是在编译时确定要执行的方法,它的实现方式包括方法重载和运算符重载。动态多态性是在运行时才能够确定要执行的方法,它的实现方式包括虚方法和抽象方法。\r\n\r\n示例代码如下:\r\n\r\n```csharp\r\n\r\nusing System;\r\n\r\nnamespace PolymorphismExample\r\n{\r\n class Program\r\n {\r\n static void Main(string[] args)\r\n {\r\n var calculator = new Calculator();\r\n\r\n int result1 = calculator.Add(2, 3);\r\n double result2 = calculator.Add(2.5, 3.5);\r\n\r\n Console.WriteLine($\"2 + 3 = {result1}\");\r\n Console.WriteLine($\"2.5 + 3.5 = {result2}\");\r\n\r\n var p1 = new Point { X = 2, Y = 3 };\r\n var p2 = new Point { X = 4, Y = 5 };\r\n var p3 = p1 + p2;\r\n\r\n Console.WriteLine($\"({p1.X}, {p1.Y}) + ({p2.X}, {p2.Y}) = ({p3.X}, {p3.Y})\");\r\n\r\n Shape circle = new Circle { Radius = 5 };\r\n Shape square = new Square { Side = 10 };\r\n\r\n double circleArea = circle.GetArea();\r\n double squareArea = square.GetArea();\r\n\r\n Console.WriteLine($\"圆的面积是 {circleArea}\");\r\n Console.WriteLine($\"正方形的面积是 {squareArea}\");\r\n }\r\n }\r\n\r\n class Calculator\r\n {\r\n public int Add(int a, int b)\r\n {\r\n return a + b;\r\n }\r\n\r\n public double Add(double a, double b)\r\n {\r\n return a + b;\r\n }\r\n }\r\n\r\n class Point\r\n {\r\n public int X { get; set; }\r\n public int Y { get; set; }\r\n\r\n public static Point operator +(Point p1, Point p2)\r\n {\r\n return new Point { X = p1.X + p2.X, Y = p1.Y + p2.Y };\r\n }\r\n }\r\n\r\n abstract class Shape\r\n {\r\n public abstract double GetArea();\r\n }\r\n\r\n class Circle : Shape\r\n {\r\n public double Radius { get; set; }\r\n\r\n public override double GetArea()\r\n {\r\n return Math.PI *continued* * Radius * Radius;\r\n }\r\n }\r\n\r\n class Square : Shape\r\n {\r\n public double Side { get; set; }\r\n\r\n public override double GetArea()\r\n {\r\n return Side * Side;\r\n }\r\n }\r\n}\r\n\r\n```\r\n\r\n以上是一个简单的 C# 多态性示例。这个示例中使用了方法重载、运算符重载、虚方法和抽象方法。每种多态性的实现方式都有各自的优点和适用场景。在实际编程中,我们可以根据具体情况选择使用适当的多态性实现方式来提高代码的灵活性和可重用性。\r\n','C# 多态性','bb410108-243a-5b04-d532-3a0fc6b8afcb','00000000-0000-0000-0000-000000000000','2024-01-05 10:52:00',NULL,NULL,NULL,21),('59a0ebc6-b076-5be7-6eb7-3a0ff5881694',0,'**C#WPF--网络资源爬虫**\n\n**作者心得**\n真没你想的那么高级,真的\n算是我第一个与http有交互的玩意儿吧\n运用到了:正则表达式\n(后来代码被我弄去研究了,貌似改动过)\n\n**源代码**\n\n```csharp\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Net;\nusing System.Text.RegularExpressions;\nusing System.IO;\n\nnamespace TQJ\n{\n /// \n /// MainWindow.xaml 的交互逻辑\n /// \n public partial class MainWindow : Window\n {\n \n public MainWindow()\n {\n InitializeComponent();\n }\n\n\n public string wwwtext;\n public static string textclass;\n \n\n private void Window_Initialized(object sender, EventArgs e)\n {\n \n if (!Directory.Exists(@\"e:\\data\"))\n {\n Directory.CreateDirectory(@\"e:\\data\");\n }\n\n }\n public static string get_uft8(string unicodeString)\n {\n UTF8Encoding utf8 = new UTF8Encoding();\n Byte[] encodedBytes = utf8.GetBytes(unicodeString);\n String decodedString = utf8.GetString(encodedBytes);\n return decodedString;\n }\n\n private void Button_Click(object sender, RoutedEventArgs e)//提取图片\n {\n wwwtext = www.Text;\n string lt= (\"_\" + System.Guid.NewGuid().ToString() + \"_\" + System.Guid.NewGuid().ToString()).ToUpper();\n try\n {\n //WebClient client = new WebClient();\n ////Byte[] pageData = client.DownloadData(\"\");\n ////string html= Encoding.GetEncoding(\"utf-8\").GetString(pageData);\n ////TextBox.Text += html;\n\n ////MatchCollection matches = Regex.Matches(html, @\"[0-9]{4}\", RegexOptions.IgnoreCase);\n\n ////foreach (Match item in matches)\n ////{\n //// TextBox.Text = TextBox.Text + item.Value;\n //// string pathImg = \"http://120.77.214.11/code.ajx?t=\" + item.Value;\n //client.DownloadFile(\"https://vpn.jift.edu.cn/http/77726476706e69737468656265737421e3e44ed22d396e44300d8db9d6562d/cas/codeimage?vpn-1\", @\"e:\\data\\\" + System.DateTime.Now.ToFileTime() + \".jpg\");\n // //}\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站已加密,请换一个试试\");\n }\n\n }\n\n private void Button_Click_1(object sender, RoutedEventArgs e)//提取电话\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\phone.txt\", true); \n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"(134|135|136|137|138|139|150|151|152|157|158|159|147|182|183|184|187|188|170|178|130|131|132|145|155|156|185|186|176|170|171|166|133|153|180|181|189|170|177|173)(\\b)?[0-9]{8}\");\n foreach (Match item in matches)\n {\n sw.WriteLine(item.Value);\n TextBox.Text = TextBox.Text +\"\\r\\n\"+ item.Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在电话号码,请换一个试试\");\n }\n\n sw.Close();\n\n }\n\n private void Button_Click_2(object sender, RoutedEventArgs e)\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\email.txt\", true);\n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"([A-Za-z0-9\\u4e00-\\u9fa5]+)@([a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+)\");\n foreach (Match item in matches)\n {\n sw.WriteLine(\"用户名:\" + item.Groups[1].Value+\";域名:\"+ item.Groups[2].Value);\n TextBox.Text = TextBox.Text + \"\\r\\n\" + \"用户名:\" + item.Groups[1].Value + \";域名:\" + item.Groups[2].Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在邮箱,请换一个试试\");\n }\n\n sw.Close();\n }\n\n private void Button_Click_3(object sender, RoutedEventArgs e)\n {\n StreamWriter sw = new StreamWriter(@\"e:\\data\\address.txt\", true);\n wwwtext = www.Text;\n try\n {\n WebClient client = new WebClient();\n string html = client.DownloadString(wwwtext);\n MatchCollection matches = Regex.Matches(html, @\"(.+)\\[port=([0-9]{2,5})(,type=(.+))?\\]\");\n foreach (Match item in matches)\n {\n sw.WriteLine(\"IP:\" + item.Groups[1].Value + \";port:\" + item.Groups[2].Value);\n TextBox.Text = TextBox.Text + \"\\r\\n\" + \"IP:\" + item.Groups[1].Value + \";port:\" + item.Groups[2].Value;\n }\n MessageBox.Show(\"提取成功!\", \"提示!\");\n }\n catch\n {\n MessageBox.Show(\"该网站不存在地址,请换一个试试\");\n }\n\n sw.Close();\n }\n\n private void Button_Click_4(object sender, RoutedEventArgs e)\n {\n textclass = www.Text;\n this.Hide();\n Window1 p = new Window1();\n p.Show();\n }\n\n private void Button_Click_5(object sender, RoutedEventArgs e)\n {\n Form1 form1 = new Form1();\n form1.Show();\n }\n\n private void Button_Click_6(object sender, RoutedEventArgs e)\n {\n TextBox.Text=( \"_\"+System.Guid.NewGuid().ToString()+\"_\"+System.Guid.NewGuid().ToString()).ToUpper();\n }\n }\n }\n\n\n```\n**效果截图**\n![image.png](/prod-api/file/9b3282c2-304f-6f2d-b431-3a0ff5880480/true)\n**作者的话**\n好像这个是我最后一个winform项目了\n接下来应该走Asp .net项目了\n虽然这2个关系不大,但是winform作为c#入门真的很有帮助!','C#WPF--网络资源爬虫','ffdae7fe-db2b-b217-8fec-3a0ff57b9493','00000000-0000-0000-0000-000000000000','2024-01-07 17:57:37','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('5ac86950-2d82-1a53-0eac-3a0fa8f8c42f',0,'## jenkins流水线\n\n在上一章,已经将核心的环境给安装了,接下来我们可进行jenkins的流水线配置\n\n> 这里开始配置的前提,需要将推荐插件下载,不安装插件流水线的功能都没有,同时检测`Publish Over SSH`插件是否已经安装,需要这个插件进行远程执行命令\n\n## 配置凭据\n我们需要先将密钥配置好,因为我们等下的流水线的git拉去代码要将密钥进行登录\n\n在`系统管理/凭据/系统/全局凭据 (unrestricted)`中添加一个用户名和密码的凭据,这里我们可以填写我们git仓库的的账号即可\n\n## 配置免密登录\n这一步至关重要,由于我们会远程向其他服务器执行命名,需要先配置免密登录。\n\n通常来说,jenkins只做拉去代码,打包发布成可执行的包,至于执行包发布给谁,可以通过ssh发送,对应的服务器只需要收到包,解压,然后直接启动即可,如果服务器资源不够,也可以考虑`127.0.0.1`当远程服务器\n\n``` shell\n#获取rsa密钥对\nssh-keygen -t rsa\\\n\n#将密钥进行拷贝\nssh-copy-id -i /root/.ssh/id_rsa.pub root\\@localhost\n```\n按以上的提示一步一步回车即可\n\n如果提示命令没有找到,需安装openssh客户端\n``` shell\nyum -y install openssh-clients\\\n```\n## Publish over SSH配置\n由于我们使用到这个插件进行命令与文件的传输\n\n需要在`系统管理/System/Publish over SSH`中进行配置这个插件\n\n主要就是针对的上方的免密登录功能\n\n以下详细介绍每一个配置吧~\n``` shell\nname: 只是一个标识\n\nHostname: 远程ip,如果是本机可以localhost\n\nUsername:远程登录用户名,可以root\n\nRemote Directory:远程传输根目录,待会传输文件的目录会拼接上这个,我是习惯传输到/home下,所以可以填写/home\n\nKey 输入框粘贴 `/root/.ssh/id_rsa` 中的密钥,全部都要粘贴进去哦~\n```\n保存之前,可以进行测试,看以下是否成功!\n\n## 环境变量配置\n如果之前配置的环境变量,不是系统环境变量,需要单独为jenkins赋上\n\n不然执行命令,将提示命令未找到,主要是dotnet与npm\n\n我们可以在`系统管理/System`中的全局属性下有一个`环境变量`\n``` shell\nkey: PATH\nvalue: /usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/dotnet:/opt/nodejs/node-v18.13.0-linux-x64/bin\n```\n\n### 后端脚本编写\n\n有了环境,我们可以将我们的代码手动发布上传,测试一下是否可以手动执行dotnet运行,如果成功,将说明环境安装成功\n\n之后,我们可以写两个脚本,一个启动、一个关闭,放到我们的程序入口,关于程序的启动和关闭,可以由脚本来控制会减少很多的问题及困难\n\n我们其实已经在程序里带出来了,就是框架中的`start.sh`及`end.sh`\n\n``` shell\n#!/bin/bash\n./end.sh\nnohup dotnet Yi.Abp.Web.dll > /dev/null 2>&1 &\necho \"Yi-启动成功!\"\n\n\n#!/bin/bash\nkill $(lsof -t -i:19001)\necho \"Yi-进程已关闭\"\n\n```\n\n编写启动和停止脚本,我们还要给它赋值权限,否则不是一个有效的执行文件\n\n``` shell\nchmod +x start.sh\nchmod +x end.sh\n```\n\n> 这里如果提示:unix编码问题 ^M\n可以使用vim进行转码\n``` shell\nvim test.sh\n:set ff=unix\n:wq\n\n```\n\n\n## 流水线编写\n\n好了,到了这步,如果你一切顺利,恭喜你,准备进入流水线的脚本编写了\n\n> 心急吃不了热豆腐,我们得静下心来,这块需要慢慢配置,一点一点调试\n\n首页->新建任务->流水线\n\n> 以下脚本为Yi框架的cicd脚本,后端与前端及各个项目是不一样\n\n我这里已经将脚本编写好,可根据实际情况进行更改,主要是密钥和授权等\n\n### 后端流水线脚本:\n``` java\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.Abp.Net8/src/Yi.Abp.Web;\n dotnet publish -c Release;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_01.zip ./Yi.Abp.Net8/src/Yi.Abp.Web/bin/Release/net8.0/publish/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/net8\necho 开始解压\nunzip -o /home/yi/build/publish_01.zip -d ./\necho 开始启动\nsh start.sh\necho 启动成功'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n### 前端rbac脚本:\n``` shell\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.RuoYi.Vue3;\n npm config set registry https://registry.npm.taobao.org;\n npm i;\n npm run build:prod;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_rbac_01.zip ./Yi.RuoYi.Vue3/dist/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/rbac\necho 开始解压\nunzip -o /home/yi/build/publish_rbac_01.zip -d ./\necho 替换完成'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_rbac_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n\n### 前端bbs脚本\n``` shell\npipeline {\n agent any\n\n stages {\n stage(''git'') {\n steps {\n git branch: ''abp'', credentialsId: ''38c9c74f-8658-4b8d-9ee7-d4c9923ef042'', url: ''https://gitee.com/ccnetcore/Yi.git''\n echo ''仓库克隆成功''\n }\n }\n stage(''build'') {\n steps {\n sh \"\"\"\n cd Yi.Bbs.Vue3;\n npm config set registry https://registry.npm.taobao.org;\n npm install;\n npm run build;\n \"\"\"\n echo ''构建成功''\n }\n }\n stage(''zip'') {\n steps {\n sh \"\"\"\n mkdir -p ./publish\n 7za a ./publish/publish_bbs_01.zip ./Yi.Bbs.Vue3/dist/*;\n \"\"\"\n echo ''压缩包成功''\n }\n }\n stage(''publish'') {\n steps {\n sshPublisher(publishers: [sshPublisherDesc(configName: ''ccnetcore'', transfers: [sshTransfer(cleanRemote: false, excludes: '''', execCommand: ''''''cd /home/yi/bbs\necho 开始解压\nunzip -o /home/yi/build/publish_bbs_01.zip -d ./\necho 替换完成'''''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: ''[, ]+'', remoteDirectory: ''yi/build'', remoteDirectorySDF: false, removePrefix: ''publish'', sourceFiles: ''publish/publish_bbs_01.zip'')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])\n echo ''发布成功''\n }\n }\n }\n}\n\n```\n\n编写完成之后,可以逐步一下一下进行测试,看看哪里有问题再进行更改\n\n> 以上脚本,都是一步一个脚印,一晚一行代码磨出来的,比较适合现在的场景,可推荐使用,坑比较少\n\n## 进阶\n后续,你可以尝试`gitlab+jenkins+harbor+docker+k8s`的路线,这块橙子也是搭建过好几次,但需求点过于多,比较费劲,同时一般只有非常大型的项目才用的上,再次就不过多赘述了,想讲实战讲清楚,估计是当前篇幅至少10倍以上,里面的坑我之前pdf简单汇总了一次,大概就有23面以上,现在可能很有很多工具,安装应该没有那么复杂了,不过我还暂时没有去接触的场景,如果你想像我一样,可以一起播撒这颗种子,让更多人的收获\n\n## 结语\n可以看的出来,一个大家认为很简答的cicd,如果像从零开始一下一下搭建出来,坑还是蛮多的,爬出这些坑也是比较费事,并没有网上说的那么容易\n\n本人这种环境搭建不下10次以上,也只是`无他,熟能生巧而已`\n\n> 搞的多了,也就麻了,水来土挡,坑来我填\n\n最后,如果你这边怀着激动心情,讲上述的过程全部跑成功了,那么恭喜你啦~我亲爱的朋友,这篇文章教程就有它真正的意义了!\n\n','Jenkins流水线配置','6b80ed42-50cd-db15-c073-3a0fa8f7fd77','00000000-0000-0000-0000-000000000000','2023-12-23 21:09:56','59cf7e31-e3e4-544e-1038-3a0f836cc538','59cf7e31-e3e4-544e-1038-3a0f836cc538','2023-12-26 10:01:04',0),('5bc73d5b-d9d3-a9fa-fbcf-3a0f83ac66c2',0,'## 简介\n审计日志是对数据的操作记录\n例如:\n1. 数据的创建者\n2. 数据的创建时间\n3. 数据的更新者\n4. 数据的更新时间\n\n对于重要的数据,我们应该提供审计日志功能,方便进行数据追溯\n框架内部已`自动集成`,使用起来非常简单\n## 如何使用\n我们把全部的审计日志封装一个对象\n你的**实体**可直接继继承或者实现接口\nAuditedObject与IAuditedObject\n\n它包含4个属性字段,\n``` cs\n public DateTime CreationTime { get; set; }= DateTime.Now;\n\n public Guid? CreatorId { get; set; }\n\n public Guid? LastModifierId { get; set; }\n\n public DateTime? LastModificationTime { get; set; }\n\n```\n\n**在执行插入的时候:**\n会自动为`CreationTime` 与 `CreatorId` 赋值\n\n\n**在执行更新的时候:**\n会自动为`LastModificationTime` 与 `LastModifierId` 赋值\n\n当然,如果只需要部分的审计日志,你完全可以实现单独的接口\n分别为:\n``` cs\nIHasCreationTime\nIMayHaveCreator\nIModificationAuditedObject\nIHasModificationTime\n```','审计日志','8c464ab3-8ba5-2761-a4b0-3a0f83a9f312','00000000-0000-0000-0000-000000000000','2023-12-16 15:20:34','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,0),('5c85168f-9d75-dbd7-5de8-3a0ff53f8680',0,'- [iCal.NET](https://github.com/rianjs/ical.net) iCal.NET 是一个面向 .NET 的 iCalendar(RFC 5545)类库,旨在提供 RFC 5545 兼容性,并与流行的日历应用程序和类库完全兼容。','日历','37ce4711-6459-430f-a837-3a0ff53d41c9','00000000-0000-0000-0000-000000000000','2024-01-07 16:38:22','59cf7e31-e3e4-544e-1038-3a0f836cc538',NULL,NULL,18),('5cb28486-6431-0144-7613-3a0ff584b04a',0,'**C#Unity--2D迷宫**\n\n**作者心得**\n哇!这是?第一次接触游戏引擎!!!!\n体验真的极佳!\n那时候基本上课教一些跟专业没关系的课程\n偶然听别说c#在unity占的分量,我决定来试试!\n看了很多书,很多教程!很庆幸,我们学校图书馆还有好几本关于unity的书籍,于是上课时间,统统浏览几遍!\n\n**源代码**\n```csharp\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class move : MonoBehaviour\n{\n public float speed = 1.0F;\n // Start is called before the first frame update\n void Start()\n {\n \n }\n\n // Update is called once per frame\n void Update()\n {\n if (Input.GetKey(\"up\"))\n this.transform.Translate(0, 0, speed*Time.deltaTime);\n if (Input.GetKey(\"down\"))\n this.transform.Translate(0, 0, -speed * Time.deltaTime);\n if (Input.GetKey(\"left\"))\n this.transform.Translate(-speed * Time.deltaTime, 0, 0);\n if (Input.GetKey(\"right\"))\n this.transform.Translate(speed * Time.deltaTime, 0, 0);\n }\n}\n\n\n\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.SceneManagement;\nusing UnityEngine.UI;\n\npublic class open : MonoBehaviour\n{\n private GameObject btn;\n // Start is called before the first frame update\n void Start()\n {\n btn = GameObject.Find(\"Button\");\n btn.GetComponent