mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-08-02 18:17:31 +08:00
Compare commits
78 Commits
Author | SHA1 | Date | |
---|---|---|---|
3293683835 | |||
e71661663f | |||
13ba536df2 | |||
072cc1e491 | |||
6fbb519256 | |||
a4e63c971d | |||
bac4a39544 | |||
f0c3ec109f | |||
000e3d68a8 | |||
58e4572723 | |||
dfe6b03b21 | |||
135f082b06 | |||
c088492cfa | |||
b9b228c9e1 | |||
779d8e511a | |||
6922a863ec | |||
5b69ce8688 | |||
cd8ed674e0 | |||
4733adede5 | |||
e00c30c961 | |||
6b63250039 | |||
2fa8b56f9c | |||
2b4c25c07c | |||
7c56c8d571 | |||
5fb6f7bea7 | |||
e48b425121 | |||
faaf5aa0fc | |||
e1bea2ec31 | |||
33e60a5bd7 | |||
1a28e8d5a6 | |||
60ec6ea2c1 | |||
6d4ccf3445 | |||
1733802e02 | |||
aaea28389a | |||
be5b9a160d | |||
67eaa5b783 | |||
8b01112f42 | |||
d6a479b693 | |||
e1b0030193 | |||
beba4124b0 | |||
8a29640aeb | |||
8bc8aa960c | |||
d00f0d2d9c | |||
1442e0a37c | |||
6100e9e9c8 | |||
ae2d1c4932 | |||
366a26a5cd | |||
8b53f66331 | |||
705d027da4 | |||
a3ab97019d | |||
608a1ded5c | |||
366ca0d237 | |||
56b111b1cf | |||
f5bd69ef60 | |||
ddf891e3bc | |||
7ae473d492 | |||
c20a6c369d | |||
57b71e1354 | |||
127f6e9f6c | |||
d1951dbcb5 | |||
5edcf63e24 | |||
b01b8b24ba | |||
d9c7085472 | |||
a01acddb9c | |||
e5208cd751 | |||
dc326c324c | |||
e0d15f8039 | |||
169ab08b88 | |||
3b8336105a | |||
7214a22ea5 | |||
3152a8d3e8 | |||
40e8eff5f3 | |||
47e67dd503 | |||
903ea1820a | |||
c08ea62064 | |||
4860299959 | |||
72f9d1a3ec | |||
98718a010c |
@ -10,6 +10,7 @@ ij_xml_text_wrap = off # IntelliJ IDEA 中 XML 文本不换行
|
||||
indent_size = 4 # 缩进大小为 4 个空格
|
||||
indent_style = space # 使用空格进行缩进
|
||||
insert_final_newline = false # 不在文件末尾插入空行
|
||||
max_line_length = 150 # 行长度限制为 150 个字符
|
||||
trim_trailing_whitespace = true # 删除行尾的空格
|
||||
|
||||
[{*.json,*.yml}]
|
||||
|
1
.github/workflows/README.md
vendored
Normal file
1
.github/workflows/README.md
vendored
Normal file
@ -0,0 +1 @@
|
||||
github workflows
|
2
.github/workflows/nightly-build.yml
vendored
2
.github/workflows/nightly-build.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [ 20.x ]
|
||||
node-version: [ 22.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [ 20.x ]
|
||||
node-version: [ 22.x ]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -397,6 +397,7 @@ FodyWeavers.xsd
|
||||
# JetBrains Rider
|
||||
*.sln.iml
|
||||
.idea/
|
||||
!src/backend/CloudCode.DataGrip/.idea
|
||||
|
||||
# User Define
|
||||
dist/
|
||||
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -1,6 +1,6 @@
|
||||
[submodule "refs/Furion"]
|
||||
path = refs/Furion
|
||||
url = https://github.com/nsnail/Furion.git
|
||||
[submodule "refs/Gurion"]
|
||||
path = refs/Gurion
|
||||
url = https://github.com/nsnail/Gurion.git
|
||||
[submodule "refs/ns-ext"]
|
||||
path = refs/ns-ext
|
||||
url = https://github.com/nsnail/ns-ext.git
|
||||
|
104
CHANGELOG.md
104
CHANGELOG.md
@ -2,33 +2,99 @@
|
||||
|
||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||
|
||||
### [1.1.1](https://github.com/nsnail/NetAdmin/compare/v1.0.0...v1.1.1) (2024-04-29)
|
||||
## [2.0.0](https://github.com/nsnail/NetAdmin/compare/v1.6.0...v2.0.0) (2024-11-04)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 版本更新日志组件 ([#96](https://github.com/nsnail/NetAdmin/issues/96)) ([a37acc4](https://github.com/nsnail/NetAdmin/commit/a37acc4b55c91d57d51c7fa079da8700530412a5))
|
||||
* ✨ 计划作业 ([#87](https://github.com/nsnail/NetAdmin/issues/87)) ([8293ec0](https://github.com/nsnail/NetAdmin/commit/8293ec0297875ebc9ad75cce9465bd587929c0bf))
|
||||
* ✨ 计划作业执行记录 ([#89](https://github.com/nsnail/NetAdmin/issues/89)) ([6f89015](https://github.com/nsnail/NetAdmin/commit/6f890151989ad733e35653933b7597eec478cc3b))
|
||||
* ✨ 将数据库结构同步和种子数据初始化作为命令行开关 ([#78](https://github.com/nsnail/NetAdmin/issues/78)) ([05ed3d3](https://github.com/nsnail/NetAdmin/commit/05ed3d3746aa274a0f88f7afadfea12a3c8a80ff))
|
||||
* ✨ 快捷启用/禁用用户 ([#91](https://github.com/nsnail/NetAdmin/issues/91)) ([6c2d167](https://github.com/nsnail/NetAdmin/commit/6c2d1676e45b9f1ecf3be3ae5a172db49b62a81d))
|
||||
* ✨ 前端表格高级筛选 ([#100](https://github.com/nsnail/NetAdmin/issues/100)) ([3847d6f](https://github.com/nsnail/NetAdmin/commit/3847d6fdbbd27efb53921bcc8374157f0da47155))
|
||||
* ✨ 日志管理独立出来、增加登录日志界面 ([#65](https://github.com/nsnail/NetAdmin/issues/65)) ([9134c4f](https://github.com/nsnail/NetAdmin/commit/9134c4fe01165a87ebc7e2cbd0a2abff3c9fb3ea))
|
||||
* ✨ 首页仪表面板 ([#103](https://github.com/nsnail/NetAdmin/issues/103)) ([149e1af](https://github.com/nsnail/NetAdmin/commit/149e1afa533b142a3666a325ec84a091d53c1840))
|
||||
* ✨ cron表达式选择器 ([#92](https://github.com/nsnail/NetAdmin/issues/92)) ([bde9fb1](https://github.com/nsnail/NetAdmin/commit/bde9fb1ea264bd0b786ac68d590691892d7ce067))
|
||||
* ✨ 查询过滤器保存 ([779d8e5](https://github.com/nsnail/NetAdmin/commit/779d8e511a84d2be91d74ea308c22b969d6963f3))
|
||||
* ✨ 框架代码同步 ([#173](https://github.com/nsnail/NetAdmin/issues/173)) ([c088492](https://github.com/nsnail/NetAdmin/commit/c088492cfabada198ad563e43278ab7e869029bc))
|
||||
* ✨ 框架代码同步 ([#178](https://github.com/nsnail/NetAdmin/issues/178)) ([58e4572](https://github.com/nsnail/NetAdmin/commit/58e4572723ba68700fb6414167cb27b03c864db1))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 🐛 'Numbers' does not contain a definition for 'CACHE_SECS_DEFAULT' ([#102](https://github.com/nsnail/NetAdmin/issues/102)) ([8f69c29](https://github.com/nsnail/NetAdmin/commit/8f69c2907be282b1b39f4a179badb11502aa2403))
|
||||
* 🐛 低版本jetbrains.resharper.globaltools搞乱了代码 ([#97](https://github.com/nsnail/NetAdmin/issues/97)) ([c117ddf](https://github.com/nsnail/NetAdmin/commit/c117ddfe7a433215b3449cdd6b19318a1f3cbf37))
|
||||
* 🐛 前端样式问题 ([#84](https://github.com/nsnail/NetAdmin/issues/84)) ([6615df3](https://github.com/nsnail/NetAdmin/commit/6615df339934f6d19880c9822b44d5305c2f2a75))
|
||||
* 🐛 请求日志客户端IP显示不正确 ([#60](https://github.com/nsnail/NetAdmin/issues/60)) ([ec698ce](https://github.com/nsnail/NetAdmin/commit/ec698ce4db49861eaaeb8bf5080764939e6d7231))
|
||||
* 🐛 时区问题 ([#107](https://github.com/nsnail/NetAdmin/issues/107)) ([59c85ce](https://github.com/nsnail/NetAdmin/commit/59c85cef217c121b36d52993b6b5a774fe22df9e))
|
||||
* 🐛 小问题 ([#76](https://github.com/nsnail/NetAdmin/issues/76)) ([52ddf27](https://github.com/nsnail/NetAdmin/commit/52ddf273c856d8f7e363ce23e5886b9eedf4604f))
|
||||
* 🐛 在弹窗界面中引用的列表组件,点击重置搜索条件按钮时,会关闭弹窗的bug ([#95](https://github.com/nsnail/NetAdmin/issues/95)) ([8fee14c](https://github.com/nsnail/NetAdmin/commit/8fee14cd6ebd86456956fc59bbb61c545faa1fdd))
|
||||
* 🐛 tinymce editor css 加载路径错误 ([#93](https://github.com/nsnail/NetAdmin/issues/93)) ([5fe7387](https://github.com/nsnail/NetAdmin/commit/5fe73878a2a53dc5e7e2dcbcbf22f91ffb4376dd))
|
||||
* 🐛 tinymce editor css 加载路径错误 ([#94](https://github.com/nsnail/NetAdmin/issues/94)) ([802251e](https://github.com/nsnail/NetAdmin/commit/802251e42347bfe4fa0bcb4867b615d7c03abf19))
|
||||
* 🐛 public const int SECS_CACHE_LOGIN_BY_USER_ID = 3600 * 24 * 30; // 秒:缓存时间-通过用户编号登录的用户信息 ([#179](https://github.com/nsnail/NetAdmin/issues/179)) ([000e3d6](https://github.com/nsnail/NetAdmin/commit/000e3d68a85eaee7758b4160d1d0ffa52aa4aae0))
|
||||
|
||||
## [1.6.0](https://github.com/nsnail/NetAdmin/compare/v1.5.0...v1.6.0) (2024-08-12)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 移除RedLocker,更改为自实现 ([#169](https://github.com/nsnail/NetAdmin/issues/169)) ([cd8ed67](https://github.com/nsnail/NetAdmin/commit/cd8ed674e0615b33fc0e025b9412c2f16d252f0f))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 🐛 站内信角标颜色 ([#167](https://github.com/nsnail/NetAdmin/issues/167)) ([e00c30c](https://github.com/nsnail/NetAdmin/commit/e00c30c96123769d8a9e6f30cc9a2c3e8099e34c))
|
||||
* 🐛 ip归属地查询接口地址更新 ([#168](https://github.com/nsnail/NetAdmin/issues/168)) ([4733ade](https://github.com/nsnail/NetAdmin/commit/4733adede5e8993f741e9b94541aafeb6a733859))
|
||||
* 🐛 ip显示问题 ([#166](https://github.com/nsnail/NetAdmin/issues/166)) ([6b63250](https://github.com/nsnail/NetAdmin/commit/6b6325003924b1605b610f759b2131c15013ffa0))
|
||||
* 🐛 trimSuffix ([#163](https://github.com/nsnail/NetAdmin/issues/163)) ([7c56c8d](https://github.com/nsnail/NetAdmin/commit/7c56c8d571d4f29fcb20f238893dbf61e5e538f0))
|
||||
|
||||
## [1.5.0](https://github.com/nsnail/NetAdmin/compare/v1.4.0...v1.5.0) (2024-07-26)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 登录日志独立存储 ([#161](https://github.com/nsnail/NetAdmin/issues/161)) ([faaf5aa](https://github.com/nsnail/NetAdmin/commit/faaf5aa0fc5299633ca4f384d6287171bb241ff4))
|
||||
* ✨ 框架代码同步 ([#158](https://github.com/nsnail/NetAdmin/issues/158)) ([1a28e8d](https://github.com/nsnail/NetAdmin/commit/1a28e8d5a62aeab7e4fda5049b4f733a16480b67))
|
||||
* ✨ 请求日志增加TraceId ([#154](https://github.com/nsnail/NetAdmin/issues/154)) ([aaea283](https://github.com/nsnail/NetAdmin/commit/aaea28389a56566e055b6651cf48a89194a72cb7))
|
||||
* ✨ cron表达式的自然语言表达 ([#156](https://github.com/nsnail/NetAdmin/issues/156)) ([6d4ccf3](https://github.com/nsnail/NetAdmin/commit/6d4ccf344595e128a445f1cb7596a7a1c28fd4cd))
|
||||
* ✨ logoBar显示程序版本号 ([#153](https://github.com/nsnail/NetAdmin/issues/153)) ([be5b9a1](https://github.com/nsnail/NetAdmin/commit/be5b9a160d1f06cfdf36cea4e5eb95908523fed2))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 🐛 error CS0117: 'Numbers' does not contain a definition for 'SECS_CACHE_DIC_CATALOG_CODE' ([#155](https://github.com/nsnail/NetAdmin/issues/155)) ([1733802](https://github.com/nsnail/NetAdmin/commit/1733802e02b7e69e4c8646f259da5098b87888f7))
|
||||
|
||||
## [1.4.0](https://github.com/nsnail/NetAdmin/compare/v1.3.0...v1.4.0) (2024-07-03)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 框架代码同步 ([#150](https://github.com/nsnail/NetAdmin/issues/150)) ([e1b0030](https://github.com/nsnail/NetAdmin/commit/e1b0030193556fa0564ea059657b4b43c98085c2))
|
||||
|
||||
## [1.3.0](https://github.com/nsnail/NetAdmin/compare/v1.2.0...v1.3.0) (2024-06-24)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 补充多语种文件 ([#146](https://github.com/nsnail/NetAdmin/issues/146)) ([1442e0a](https://github.com/nsnail/NetAdmin/commit/1442e0a37cb2f27d8ba7b77bed91feaa5d7b1fdd))
|
||||
* ✨ 更新实体增加sql过滤参数 ([#140](https://github.com/nsnail/NetAdmin/issues/140)) ([a3ab970](https://github.com/nsnail/NetAdmin/commit/a3ab97019dd1fc2267db987ade80fa6749e24e4d))
|
||||
* ✨ 框架代码同步 ([#139](https://github.com/nsnail/NetAdmin/issues/139)) ([608a1de](https://github.com/nsnail/NetAdmin/commit/608a1ded5c0e9987161444efd48597a687c693e1))
|
||||
* ✨ 框架代码同步 ([#144](https://github.com/nsnail/NetAdmin/issues/144)) ([ae2d1c4](https://github.com/nsnail/NetAdmin/commit/ae2d1c4932bf1229ea36d28d486beaee8de16d53))
|
||||
* ✨ 框架代码同步 ([#148](https://github.com/nsnail/NetAdmin/issues/148)) ([8bc8aa9](https://github.com/nsnail/NetAdmin/commit/8bc8aa960cdd1ed5036927bd508fce4c218618c7))
|
||||
* ✨ 前端版本更新器 ([#145](https://github.com/nsnail/NetAdmin/issues/145)) ([6100e9e](https://github.com/nsnail/NetAdmin/commit/6100e9e9c88005d6a2f3c2706ca750a6ad62d2c7))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 🐛 补充多语种文件 ([#147](https://github.com/nsnail/NetAdmin/issues/147)) ([d00f0d2](https://github.com/nsnail/NetAdmin/commit/d00f0d2d9cc2243908a8b6979b9c4a5811b2a57e))
|
||||
* 🐛 操作日志不显示userName ([#141](https://github.com/nsnail/NetAdmin/issues/141)) ([705d027](https://github.com/nsnail/NetAdmin/commit/705d027da44af159d29db9c93e47b549317c793e))
|
||||
|
||||
## [1.2.0](https://github.com/nsnail/NetAdmin/compare/v1.1.1...v1.2.0) (2024-06-06)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* ✨ 计划作业-上次执行耗时 ([#133](https://github.com/nsnail/NetAdmin/issues/133)) ([57b71e1](https://github.com/nsnail/NetAdmin/commit/57b71e1354ab8b0be995b5f563dd8c3fb7965d5f))
|
||||
* ✨ 框架代码同步 ([#129](https://github.com/nsnail/NetAdmin/issues/129)) ([b01b8b2](https://github.com/nsnail/NetAdmin/commit/b01b8b24ba574c08ba5605e103ff2ccf15e5830a))
|
||||
* ✨ 框架代码同步 ([#130](https://github.com/nsnail/NetAdmin/issues/130)) ([5edcf63](https://github.com/nsnail/NetAdmin/commit/5edcf63e24f6b13f5515e01ee8cf120b1a814d40))
|
||||
* ✨ 默认头像根据用户名绘制svg ([#132](https://github.com/nsnail/NetAdmin/issues/132)) ([127f6e9](https://github.com/nsnail/NetAdmin/commit/127f6e9f6c8c12974e5340e9697281250737bed3))
|
||||
* ✨ 手动执行计划作业 ([#122](https://github.com/nsnail/NetAdmin/issues/122)) ([3b83361](https://github.com/nsnail/NetAdmin/commit/3b8336105a908ba6bc300bec6ac4f49747ea66e9))
|
||||
* ✨ 增强作业执行记录页面 ([#135](https://github.com/nsnail/NetAdmin/issues/135)) ([7ae473d](https://github.com/nsnail/NetAdmin/commit/7ae473d492b9ba60cbb1c355894917d14f5ffa8f))
|
||||
* ✨ naColId组件 ([#118](https://github.com/nsnail/NetAdmin/issues/118)) ([47e67dd](https://github.com/nsnail/NetAdmin/commit/47e67dd503dd0ba6818e8b798e41c62420363f58))
|
||||
* **frontend:** ✨ 手机端分页控件显示总条数 ([#124](https://github.com/nsnail/NetAdmin/issues/124)) ([e0d15f8](https://github.com/nsnail/NetAdmin/commit/e0d15f8039a74a9826a0395983960ab620308899))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* 🐛 字段顺序 ([#131](https://github.com/nsnail/NetAdmin/issues/131)) ([d1951db](https://github.com/nsnail/NetAdmin/commit/d1951dbcb5fa50a7ff308f6b6d554da5f791bcf2))
|
||||
* 🐛 字段长度 ([#134](https://github.com/nsnail/NetAdmin/issues/134)) ([c20a6c3](https://github.com/nsnail/NetAdmin/commit/c20a6c369d7b6d6dcfd07b3f3eaeab0fa309e766))
|
||||
* 🐛 take count ([c08ea62](https://github.com/nsnail/NetAdmin/commit/c08ea62064cc522d7cca9c90a5f15f23d833b6e3))
|
||||
* **backend:** 🐛 更新计划作业在sqlite数据库环境报错 ([#120](https://github.com/nsnail/NetAdmin/issues/120)) ([3152a8d](https://github.com/nsnail/NetAdmin/commit/3152a8d3e8054524470883c336fb6e93903a8426))
|
||||
|
||||
### [1.1.1](https://github.com/nsnail/NetAdmin/compare/v1.1.0...v1.1.1) (2024-04-29)
|
||||
|
||||
## [1.1.0](https://github.com/nsnail/NetAdmin/compare/v1.0.0...v1.1.0) (2024-04-29)
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
<!-- 注意此文件名大小写不可变更 -->
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<DefineConstants>DBTYPE_SQLITE</DefineConstants>
|
||||
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(SolutionDir)/build/minver.targets" />
|
||||
@ -25,7 +26,7 @@
|
||||
<Title>$(AssemblyName)</Title>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MinVer" Version="5.0.0">
|
||||
<PackageReference Include="MinVer" Version="6.0.0">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
@ -1,4 +1,4 @@
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.3 AS base
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
|
||||
WORKDIR /app
|
||||
EXPOSE 8080
|
||||
RUN apt update
|
||||
|
45
NetAdmin.sln
45
NetAdmin.sln
@ -31,6 +31,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{BB0B
|
||||
1.git.pull.request.ps1 = scripts/1.git.pull.request.ps1
|
||||
2.git.release.ps1 = scripts/2.git.release.ps1
|
||||
3.git.recreate.branch.ps1 = scripts/3.git.recreate.branch.ps1
|
||||
4.git.del.obsolete.tags.ps1 = scripts/4.git.del.obsolete.tags.ps1
|
||||
clean.ln.csx = scripts/clean.ln.csx
|
||||
code.clean.csx = scripts/code.clean.csx
|
||||
code.clean.ps1 = scripts/code.clean.ps1
|
||||
@ -44,10 +45,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{BB0B
|
||||
rename.csx = scripts/rename.csx
|
||||
resharper.full.ps1 = scripts/resharper.full.ps1
|
||||
switcher.freesql.json = scripts/switcher.freesql.json
|
||||
switcher.furion.json = scripts/switcher.furion.json
|
||||
switcher.gurion.json = scripts/switcher.gurion.json
|
||||
switcher.nsext.json = scripts/switcher.nsext.json
|
||||
switcher.ps1 = scripts/switcher.ps1
|
||||
sync.sln.files.csx = scripts/sync.sln.files.csx
|
||||
wait.server.stop.sh = scripts/wait.server.stop.sh
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1129FE25-466B-4F4F-85FC-3752664245E1}"
|
||||
@ -55,6 +57,7 @@ EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{3C6F049E-3EE8-4D66-9AFF-E8A369032487}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
nightly-build.yml = .github/workflows/nightly-build.yml
|
||||
README.md = .github/workflows/README.md
|
||||
release.yml = .github/workflows/release.yml
|
||||
EndProjectSection
|
||||
EndProject
|
||||
@ -97,10 +100,25 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01.frameworks", "01.framewo
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.tests", "04.tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Tests", "src\backend\NetAdmin.AdmServer.Tests\NetAdmin.AdmServer.Tests.csproj", "{C7F27698-DA05-4ACD-B0D7-4791B3972002}"
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "05.tools", "05.tools", "{79409163-5006-405D-AC96-406FA0AD77B7}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "src\backend\UnitTests\UnitTests.csproj", "{C7F27698-DA05-4ACD-B0D7-4791B3972002}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Tests", "src\backend\NetAdmin.Tests\NetAdmin.Tests.csproj", "{00604162-C444-478B-B773-3AB23C856CA7}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{E80A1018-C354-4A26-9029-8847BB9DA864}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
README.md = docker/README.md
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Domain", "src\backend\NetAdmin.SysComponent.Domain\NetAdmin.SysComponent.Domain.csproj", "{51D6E603-0749-4A11-A78C-9E5BB127E03A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Domain", "src\backend\NetAdmin.AdmServer.Domain\NetAdmin.AdmServer.Domain.csproj", "{932520DF-D312-415A-A128-1117F8221D68}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Infrastructure", "src\backend\NetAdmin.AdmServer.Infrastructure\NetAdmin.AdmServer.Infrastructure.csproj", "{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Infrastructure", "src\backend\NetAdmin.SysComponent.Infrastructure\NetAdmin.SysComponent.Infrastructure.csproj", "{48EE6FC4-B64A-40D3-B889-36837E067880}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -162,6 +180,22 @@ Global
|
||||
{00604162-C444-478B-B773-3AB23C856CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{00604162-C444-478B-B773-3AB23C856CA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{00604162-C444-478B-B773-3AB23C856CA7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{51D6E603-0749-4A11-A78C-9E5BB127E03A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{51D6E603-0749-4A11-A78C-9E5BB127E03A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{51D6E603-0749-4A11-A78C-9E5BB127E03A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{51D6E603-0749-4A11-A78C-9E5BB127E03A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{932520DF-D312-415A-A128-1117F8221D68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{932520DF-D312-415A-A128-1117F8221D68}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{932520DF-D312-415A-A128-1117F8221D68}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{932520DF-D312-415A-A128-1117F8221D68}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{48EE6FC4-B64A-40D3-B889-36837E067880}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{48EE6FC4-B64A-40D3-B889-36837E067880}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{48EE6FC4-B64A-40D3-B889-36837E067880}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{48EE6FC4-B64A-40D3-B889-36837E067880}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(NestedProjects) = preSolution
|
||||
{4DAF9366-855F-46BB-AE4C-660C92FA0697} = {C84EB5A0-37AD-4B17-A51E-E36888C4441E}
|
||||
@ -178,10 +212,15 @@ Global
|
||||
{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||
{89260294-80FC-49F1-8D73-AECD39AFF2B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
|
||||
{C7F27698-DA05-4ACD-B0D7-4791B3972002} = {89260294-80FC-49F1-8D73-AECD39AFF2B7}
|
||||
{3C6F049E-3EE8-4D66-9AFF-E8A369032487} = {1129FE25-466B-4F4F-85FC-3752664245E1}
|
||||
{00604162-C444-478B-B773-3AB23C856CA7} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
|
||||
{34650E82-D257-46DA-BD6B-DE307113347B} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||
{19872A4C-3C9A-4C62-A33B-74F5B8D6F77C} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||
{C2CC1596-3BEE-43EA-A9BE-4EDE5716296C} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||
{79409163-5006-405D-AC96-406FA0AD77B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
|
||||
{51D6E603-0749-4A11-A78C-9E5BB127E03A} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||
{932520DF-D312-415A-A128-1117F8221D68} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||
{48EE6FC4-B64A-40D3-B889-36837E067880} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||
{3C6F049E-3EE8-4D66-9AFF-E8A369032487} = {1129FE25-466B-4F4F-85FC-3752664245E1}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
@ -27,6 +27,256 @@
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_ACCESSOR_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/PLACE_RECORD_FIELD_ATTRIBUTE_ON_SAME_LINE_EX/@EntryValue">NEVER</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AD/@EntryIndexedValue">AD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AE/@EntryIndexedValue">AE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AF/@EntryIndexedValue">AF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AG/@EntryIndexedValue">AG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AI/@EntryIndexedValue">AI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AL/@EntryIndexedValue">AL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AM/@EntryIndexedValue">AM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AO/@EntryIndexedValue">AO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AQ/@EntryIndexedValue">AQ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AR/@EntryIndexedValue">AR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AS/@EntryIndexedValue">AS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AT/@EntryIndexedValue">AT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AU/@EntryIndexedValue">AU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AW/@EntryIndexedValue">AW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AX/@EntryIndexedValue">AX</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=AZ/@EntryIndexedValue">AZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BA/@EntryIndexedValue">BA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BB/@EntryIndexedValue">BB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BD/@EntryIndexedValue">BD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BE/@EntryIndexedValue">BE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BF/@EntryIndexedValue">BF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BG/@EntryIndexedValue">BG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BH/@EntryIndexedValue">BH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BI/@EntryIndexedValue">BI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BJ/@EntryIndexedValue">BJ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BL/@EntryIndexedValue">BL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BM/@EntryIndexedValue">BM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BN/@EntryIndexedValue">BN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BO/@EntryIndexedValue">BO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BQ/@EntryIndexedValue">BQ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BR/@EntryIndexedValue">BR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BS/@EntryIndexedValue">BS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BT/@EntryIndexedValue">BT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BV/@EntryIndexedValue">BV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BW/@EntryIndexedValue">BW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BY/@EntryIndexedValue">BY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=BZ/@EntryIndexedValue">BZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CA/@EntryIndexedValue">CA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CC/@EntryIndexedValue">CC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CD/@EntryIndexedValue">CD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CF/@EntryIndexedValue">CF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CG/@EntryIndexedValue">CG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CH/@EntryIndexedValue">CH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CI/@EntryIndexedValue">CI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CK/@EntryIndexedValue">CK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CL/@EntryIndexedValue">CL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CM/@EntryIndexedValue">CM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CN/@EntryIndexedValue">CN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CO/@EntryIndexedValue">CO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CR/@EntryIndexedValue">CR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CU/@EntryIndexedValue">CU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CV/@EntryIndexedValue">CV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CW/@EntryIndexedValue">CW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CX/@EntryIndexedValue">CX</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CY/@EntryIndexedValue">CY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=CZ/@EntryIndexedValue">CZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DE/@EntryIndexedValue">DE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DJ/@EntryIndexedValue">DJ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DK/@EntryIndexedValue">DK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DM/@EntryIndexedValue">DM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DO/@EntryIndexedValue">DO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=DZ/@EntryIndexedValue">DZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EC/@EntryIndexedValue">EC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EE/@EntryIndexedValue">EE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EG/@EntryIndexedValue">EG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EH/@EntryIndexedValue">EH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ER/@EntryIndexedValue">ER</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ES/@EntryIndexedValue">ES</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ET/@EntryIndexedValue">ET</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FI/@EntryIndexedValue">FI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FJ/@EntryIndexedValue">FJ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FK/@EntryIndexedValue">FK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FM/@EntryIndexedValue">FM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FO/@EntryIndexedValue">FO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=FR/@EntryIndexedValue">FR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GA/@EntryIndexedValue">GA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GB/@EntryIndexedValue">GB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GD/@EntryIndexedValue">GD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GE/@EntryIndexedValue">GE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GF/@EntryIndexedValue">GF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GG/@EntryIndexedValue">GG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GH/@EntryIndexedValue">GH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GI/@EntryIndexedValue">GI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GL/@EntryIndexedValue">GL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GM/@EntryIndexedValue">GM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GN/@EntryIndexedValue">GN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GP/@EntryIndexedValue">GP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GQ/@EntryIndexedValue">GQ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GR/@EntryIndexedValue">GR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GS/@EntryIndexedValue">GS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GT/@EntryIndexedValue">GT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GU/@EntryIndexedValue">GU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GW/@EntryIndexedValue">GW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GY/@EntryIndexedValue">GY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HK/@EntryIndexedValue">HK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HM/@EntryIndexedValue">HM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HN/@EntryIndexedValue">HN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HR/@EntryIndexedValue">HR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HT/@EntryIndexedValue">HT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=HU/@EntryIndexedValue">HU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ID/@EntryIndexedValue">ID</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IE/@EntryIndexedValue">IE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IL/@EntryIndexedValue">IL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IM/@EntryIndexedValue">IM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IN/@EntryIndexedValue">IN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IO/@EntryIndexedValue">IO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IQ/@EntryIndexedValue">IQ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IR/@EntryIndexedValue">IR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IS/@EntryIndexedValue">IS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=IT/@EntryIndexedValue">IT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JE/@EntryIndexedValue">JE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JM/@EntryIndexedValue">JM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JO/@EntryIndexedValue">JO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JP/@EntryIndexedValue">JP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KE/@EntryIndexedValue">KE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KG/@EntryIndexedValue">KG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KH/@EntryIndexedValue">KH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KI/@EntryIndexedValue">KI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KM/@EntryIndexedValue">KM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KN/@EntryIndexedValue">KN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KP/@EntryIndexedValue">KP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KR/@EntryIndexedValue">KR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KW/@EntryIndexedValue">KW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KY/@EntryIndexedValue">KY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KZ/@EntryIndexedValue">KZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LA/@EntryIndexedValue">LA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LB/@EntryIndexedValue">LB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LC/@EntryIndexedValue">LC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LI/@EntryIndexedValue">LI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LK/@EntryIndexedValue">LK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LR/@EntryIndexedValue">LR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LS/@EntryIndexedValue">LS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LT/@EntryIndexedValue">LT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LU/@EntryIndexedValue">LU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LV/@EntryIndexedValue">LV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=LY/@EntryIndexedValue">LY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MA/@EntryIndexedValue">MA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MC/@EntryIndexedValue">MC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MD/@EntryIndexedValue">MD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ME/@EntryIndexedValue">ME</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MF/@EntryIndexedValue">MF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MG/@EntryIndexedValue">MG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MH/@EntryIndexedValue">MH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MK/@EntryIndexedValue">MK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ML/@EntryIndexedValue">ML</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MM/@EntryIndexedValue">MM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MN/@EntryIndexedValue">MN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MO/@EntryIndexedValue">MO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MP/@EntryIndexedValue">MP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MQ/@EntryIndexedValue">MQ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MR/@EntryIndexedValue">MR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MS/@EntryIndexedValue">MS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MT/@EntryIndexedValue">MT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MU/@EntryIndexedValue">MU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MV/@EntryIndexedValue">MV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MW/@EntryIndexedValue">MW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MX/@EntryIndexedValue">MX</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MY/@EntryIndexedValue">MY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=MZ/@EntryIndexedValue">MZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NA/@EntryIndexedValue">NA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NC/@EntryIndexedValue">NC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NE/@EntryIndexedValue">NE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NF/@EntryIndexedValue">NF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NG/@EntryIndexedValue">NG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NI/@EntryIndexedValue">NI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NL/@EntryIndexedValue">NL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NO/@EntryIndexedValue">NO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NP/@EntryIndexedValue">NP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NR/@EntryIndexedValue">NR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NU/@EntryIndexedValue">NU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=NZ/@EntryIndexedValue">NZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=OM/@EntryIndexedValue">OM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=OTP/@EntryIndexedValue">OTP</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PA/@EntryIndexedValue">PA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PE/@EntryIndexedValue">PE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PF/@EntryIndexedValue">PF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PG/@EntryIndexedValue">PG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PH/@EntryIndexedValue">PH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PK/@EntryIndexedValue">PK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PL/@EntryIndexedValue">PL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PM/@EntryIndexedValue">PM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PN/@EntryIndexedValue">PN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PR/@EntryIndexedValue">PR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PS/@EntryIndexedValue">PS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PT/@EntryIndexedValue">PT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PW/@EntryIndexedValue">PW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=PY/@EntryIndexedValue">PY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=QA/@EntryIndexedValue">QA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RE/@EntryIndexedValue">RE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RO/@EntryIndexedValue">RO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RS/@EntryIndexedValue">RS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RU/@EntryIndexedValue">RU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=RW/@EntryIndexedValue">RW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SA/@EntryIndexedValue">SA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SB/@EntryIndexedValue">SB</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SC/@EntryIndexedValue">SC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SD/@EntryIndexedValue">SD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SE/@EntryIndexedValue">SE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SG/@EntryIndexedValue">SG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SH/@EntryIndexedValue">SH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SI/@EntryIndexedValue">SI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SJ/@EntryIndexedValue">SJ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SK/@EntryIndexedValue">SK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SL/@EntryIndexedValue">SL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SM/@EntryIndexedValue">SM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SN/@EntryIndexedValue">SN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SO/@EntryIndexedValue">SO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SR/@EntryIndexedValue">SR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SS/@EntryIndexedValue">SS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ST/@EntryIndexedValue">ST</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SV/@EntryIndexedValue">SV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SX/@EntryIndexedValue">SX</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SY/@EntryIndexedValue">SY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SZ/@EntryIndexedValue">SZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TC/@EntryIndexedValue">TC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TD/@EntryIndexedValue">TD</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TF/@EntryIndexedValue">TF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TG/@EntryIndexedValue">TG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TH/@EntryIndexedValue">TH</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TJ/@EntryIndexedValue">TJ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TK/@EntryIndexedValue">TK</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TL/@EntryIndexedValue">TL</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TM/@EntryIndexedValue">TM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TN/@EntryIndexedValue">TN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TO/@EntryIndexedValue">TO</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TR/@EntryIndexedValue">TR</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TT/@EntryIndexedValue">TT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TV/@EntryIndexedValue">TV</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TW/@EntryIndexedValue">TW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=TZ/@EntryIndexedValue">TZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UA/@EntryIndexedValue">UA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UG/@EntryIndexedValue">UG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UM/@EntryIndexedValue">UM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=US/@EntryIndexedValue">US</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UY/@EntryIndexedValue">UY</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=UZ/@EntryIndexedValue">UZ</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VA/@EntryIndexedValue">VA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VC/@EntryIndexedValue">VC</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VE/@EntryIndexedValue">VE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VG/@EntryIndexedValue">VG</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VI/@EntryIndexedValue">VI</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VN/@EntryIndexedValue">VN</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VU/@EntryIndexedValue">VU</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WF/@EntryIndexedValue">WF</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=WS/@EntryIndexedValue">WS</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YE/@EntryIndexedValue">YE</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=YT/@EntryIndexedValue">YT</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ZA/@EntryIndexedValue">ZA</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ZM/@EntryIndexedValue">ZM</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=ZW/@EntryIndexedValue">ZW</s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=15b5b1f1_002D457c_002D4ca6_002Db278_002D5615aedc07d3/@EntryIndexedValue"><Policy><Descriptor Staticness="Static" AccessRightKinds="Private" Description="Static readonly fields (private)"><ElementKinds><Kind Name="READONLY_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=236f7aa5_002D7b06_002D43ca_002Dbf2a_002D9b31bfcff09a/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Private" Description="Constant fields (private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=669e5282_002Dfb4b_002D4e90_002D91e7_002D07d269d04b60/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Protected, ProtectedInternal, Internal, Public, PrivateProtected" Description="Constant fields (not private)"><ElementKinds><Kind Name="CONSTANT_FIELD" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /></Policy></s:String>
|
||||
@ -78,6 +328,7 @@
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002EMemberReordering_002EMigrations_002ECSharpFileLayoutPatternRemoveIsAttributeUpgrade/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
|
||||
|
||||
|
83
README.md
83
README.md
@ -2,81 +2,63 @@
|
||||
|
||||
通用后台权限管理系统、快速开发框架(基于C#12/.NET9、Vue3/Vite、Element Plus等现代技术构建,具有十分整洁、优雅的编码规范)
|
||||
|
||||
[](https://github.com/nsnail/NetAdmin/actions/workflows/ci.yml)
|
||||
[](https://github.com/nsnail/NetAdmin/actions/workflows/nightly-build.yml)
|
||||
[](https://github.com/nsnail/NetAdmin/blob/main/LICENSE)
|
||||
[](https://github.com/nsnail/NetAdmin/blob/main/LICENSE)
|
||||
[](https://github.com/nsnail/NetAdmin/blob/main/LICENSE)
|
||||
|
||||
## 在线预览
|
||||
|
||||
http://na.yaopy.com (演示站点仅300kbps带宽,访问较慢)
|
||||
https://na.tools92.top
|
||||
|
||||
## 一键运行
|
||||
|
||||
```shell
|
||||
docker run -p 8080:8080 nsnail/netadmin
|
||||
# 需翻墙
|
||||
```
|
||||
|
||||
## 构建步骤
|
||||
|
||||
- 后端
|
||||
1. 检查dotnet-sdk版本>=9.0.0
|
||||
``` shell
|
||||
dotnet --list-sdks
|
||||
```shell
|
||||
# 1. 检查 dotnet sdk 版本 >=9.0.0
|
||||
dotnet --list-sdks
|
||||
# 下载 dotnet:https://dotnet.microsoft.com/zh-cn/download/dotnet
|
||||
|
||||
# 下载 dotnet https://dotnet.microsoft.com/zh-cn/download/dotnet
|
||||
```
|
||||
2. 克隆代码仓库
|
||||
``` shell
|
||||
git clone https://github.com/nsnail/NetAdmin.git
|
||||
cd ./NetAdmin
|
||||
# 2. 克隆代码仓库
|
||||
git clone https://github.com/nsnail/NetAdmin.git && cd ./NetAdmin
|
||||
|
||||
# 下载 git https://git-scm.com/downloads
|
||||
```
|
||||
3. 确保本机redis处于运行状态
|
||||
``` shell
|
||||
redis-cli
|
||||
# 3. 检查本机 redis 运行状态
|
||||
redis-cli dbsize
|
||||
# 下载 redis for windows:https://github.com/redis-windows/redis-windows/releases
|
||||
# 下载 redis for linux/mac:https://redis.io/download
|
||||
|
||||
# 下载 redis for windows https://github.com/redis-windows/redis-windows/releases
|
||||
# 下载 redis for linux/mac https://redis.io/download
|
||||
```
|
||||
4. 运行后端WebApi
|
||||
``` shell
|
||||
dotnet run --project ./src/backend/NetAdmin.AdmServer.Host/NetAdmin.AdmServer.Host.csproj --urls http://[::]:5010 -is
|
||||
```
|
||||
5. 体验WebApi程序
|
||||
- 浏览器打开 http://localhost:5010 ,将看到Swagger(Knife4jUI)界面
|
||||
# 4. 运行后端 WebApi
|
||||
dotnet run --project ./src/backend/NetAdmin.AdmServer.Host/NetAdmin.AdmServer.Host.csproj --urls http://[::]:5010 -is
|
||||
# 浏览器打开 http://localhost:5010 ,将看到Swagger(Knife4jUI)界面
|
||||
|
||||
---
|
||||
# 5. 检查 nodejs 版本 >=20
|
||||
node -v
|
||||
# 下载 nodejs:https://nodejs.org/en/download
|
||||
|
||||
- 前端
|
||||
1. 检查nodejs版本>=20
|
||||
``` shell
|
||||
node -v
|
||||
# 6. 安装 npm 依赖包
|
||||
cd ./src/frontend/admin && npm install
|
||||
|
||||
# 下载 nodejs https://nodejs.org/en/download
|
||||
```
|
||||
2. 安装npm依赖包
|
||||
``` shell
|
||||
cd ./src/frontend/admin
|
||||
npm install
|
||||
```
|
||||
3. 运行前端项目
|
||||
``` shell
|
||||
npm run dev
|
||||
```
|
||||
4. 体验前端程序
|
||||
- 浏览器打开 http://localhost:5020 ,将看到管理界面(默认用户名:root,密码:1234qwer)
|
||||
# 7. 运行前端项目
|
||||
npm run dev
|
||||
# 浏览器打开 http://localhost:5020 ,将看到管理界面(默认用户名:root,密码:1234qwer)
|
||||
```
|
||||
|
||||
## 文件目录树
|
||||
|
||||
```
|
||||
+---.template.config # dotnet 项目模板配置目录
|
||||
+---assets # 程序运行需要的资源文件目录
|
||||
+---dist # 程序编译与分发的二进制文件目录
|
||||
+---docs # 项目文档目录
|
||||
+---refs # 引用的第三方项目仓库目录
|
||||
+---src # 项目源文件目录
|
||||
+---assets # 项目资源文件目录
|
||||
+---build # 构建相关的工程文件目录
|
||||
+---dist # 编译生成的二进制文件目录
|
||||
+---docs # 项目开发文档目录
|
||||
+---refs # 引用的第三方包的仓库目录
|
||||
+---scripts # 各种工具脚本文件目录
|
||||
+---src # 项目源码文件目录
|
||||
```
|
||||
|
||||
## 后端项目架构
|
||||
@ -103,7 +85,6 @@ XC-->XA
|
||||
| 语言 | 集成领域 | 开源库 |
|
||||
|------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| C# | Web基础框架 | [ASP.NET Core](https://github.com/dotnet/aspnetcore) |
|
||||
| C# | 快速开发脚手架 | [Furion](https://gitee.com/dotnetchina/Furion) |
|
||||
| C# | 数据库关系映射 | [FreeSql](https://github.com/dotnetcore/FreeSql) |
|
||||
| C# | 代码质量检查 | [Roslynator.Analyzers](https://github.com/josefpihrt/roslynator) \| [SonarAnalyzer.CSharp](https://github.com/SonarSource/sonar-dotnet) \| [StyleCop.Analyzers](https://github.com/DotNetAnalyzers/StyleCopAnalyzers) |
|
||||
| C# | 单元测试框架 | [xunit](https://github.com/xunit/xunit) \| [coverlet.collector](https://github.com/coverlet-coverage/coverlet) |
|
||||
|
249
assets/res/CountryCodes.ln
Normal file
249
assets/res/CountryCodes.ln
Normal file
@ -0,0 +1,249 @@
|
||||
不丹
|
||||
东帝汶
|
||||
中国
|
||||
中非
|
||||
丹麦
|
||||
乌克兰
|
||||
乌兹别克斯坦
|
||||
乌干达
|
||||
乌拉圭
|
||||
乍得
|
||||
也门
|
||||
亚美尼亚
|
||||
以色列
|
||||
伊拉克
|
||||
伊朗
|
||||
伯利兹
|
||||
佛得角
|
||||
俄罗斯
|
||||
保加利亚
|
||||
克罗地亚
|
||||
关岛
|
||||
冈比亚
|
||||
冰岛
|
||||
几内亚
|
||||
几内亚比绍
|
||||
列支敦士登
|
||||
刚果共和国
|
||||
刚果民主共和国
|
||||
利比亚
|
||||
利比里亚
|
||||
加拿大
|
||||
加纳
|
||||
加蓬
|
||||
匈牙利
|
||||
北马其顿
|
||||
北马里亚纳群岛
|
||||
南乔治亚和南桑威奇群岛
|
||||
南极洲
|
||||
南苏丹
|
||||
南非
|
||||
博茨瓦纳
|
||||
卡塔尔
|
||||
卢旺达
|
||||
卢森堡
|
||||
印度
|
||||
印度尼西亚
|
||||
危地马拉
|
||||
厄瓜多尔
|
||||
厄立特里亚
|
||||
叙利亚
|
||||
古巴
|
||||
台湾
|
||||
吉尔吉斯斯坦
|
||||
吉布提
|
||||
哈萨克斯坦
|
||||
哥伦比亚
|
||||
哥斯达黎加
|
||||
喀麦隆
|
||||
图瓦卢
|
||||
土库曼斯坦
|
||||
土耳其
|
||||
圣卢西亚
|
||||
圣基茨和尼维斯
|
||||
圣多美和普林西比
|
||||
圣巴泰勒米
|
||||
圣文森特和格林纳丁斯
|
||||
圣皮埃尔和密克隆
|
||||
圣诞岛
|
||||
圣赫勒拿
|
||||
圣马力诺
|
||||
圭亚那
|
||||
坦桑尼亚
|
||||
埃及
|
||||
埃塞俄比亚
|
||||
基里巴斯
|
||||
塔吉克斯坦
|
||||
塞内加尔
|
||||
塞尔维亚
|
||||
塞拉利昂
|
||||
塞浦路斯
|
||||
塞舌尔
|
||||
墨西哥
|
||||
多哥
|
||||
多米尼克
|
||||
多米尼加
|
||||
奥兰
|
||||
奥地利
|
||||
委内瑞拉
|
||||
孟加拉国
|
||||
安哥拉
|
||||
安圭拉
|
||||
安提瓜和巴布达
|
||||
安道尔
|
||||
密克罗尼西亚联邦
|
||||
尼加拉瓜
|
||||
尼日利亚
|
||||
尼日尔
|
||||
尼泊尔
|
||||
巴勒斯坦
|
||||
巴哈马
|
||||
巴基斯坦
|
||||
巴巴多斯
|
||||
巴布亚新几内亚
|
||||
巴拉圭
|
||||
巴拿马
|
||||
巴林
|
||||
巴西
|
||||
布基纳法索
|
||||
布隆迪
|
||||
布韦岛
|
||||
希腊
|
||||
帕劳
|
||||
库克群岛
|
||||
库拉索
|
||||
开曼群岛
|
||||
德国
|
||||
意大利
|
||||
所罗门群岛
|
||||
托克劳
|
||||
拉脱维亚
|
||||
挪威
|
||||
捷克
|
||||
摩尔多瓦
|
||||
摩洛哥
|
||||
摩纳哥
|
||||
文莱
|
||||
斐济
|
||||
斯威士兰
|
||||
斯洛伐克
|
||||
斯洛文尼亚
|
||||
斯瓦尔巴和扬马延
|
||||
斯里兰卡
|
||||
新加坡
|
||||
新喀里多尼亚
|
||||
新西兰
|
||||
日本
|
||||
智利
|
||||
朝鲜
|
||||
柬埔寨
|
||||
根西
|
||||
格林纳达
|
||||
格陵兰
|
||||
格鲁吉亚
|
||||
梵蒂冈
|
||||
比利时
|
||||
毛里塔尼亚
|
||||
毛里求斯
|
||||
汤加
|
||||
沙特阿拉伯
|
||||
法国
|
||||
法属南部和南极领地
|
||||
法属圣马丁
|
||||
法属圭亚那
|
||||
法属波利尼西亚
|
||||
法罗群岛
|
||||
波兰
|
||||
波多黎各
|
||||
波黑
|
||||
泰国
|
||||
泽西
|
||||
津巴布韦
|
||||
洪都拉斯
|
||||
海地
|
||||
澳大利亚
|
||||
澳门
|
||||
爱尔兰
|
||||
爱沙尼亚
|
||||
牙买加
|
||||
特克斯和凯科斯群岛
|
||||
特立尼达和多巴哥
|
||||
玻利维亚
|
||||
瑙鲁
|
||||
瑞典
|
||||
瑞士
|
||||
瓜德罗普
|
||||
瓦利斯和富图纳
|
||||
瓦努阿图
|
||||
留尼汪
|
||||
白俄罗斯
|
||||
百慕大
|
||||
皮特凯恩群岛
|
||||
直布罗陀
|
||||
福克兰群岛
|
||||
科威特
|
||||
科摩罗
|
||||
科特迪瓦
|
||||
科科斯基林群岛
|
||||
秘鲁
|
||||
突尼斯
|
||||
立陶宛
|
||||
索马里
|
||||
约旦
|
||||
纳米比亚
|
||||
纽埃
|
||||
缅甸
|
||||
罗马尼亚
|
||||
美国
|
||||
美国本土外小岛屿
|
||||
美属维尔京群岛
|
||||
美属萨摩亚
|
||||
老挝
|
||||
肯尼亚
|
||||
芬兰
|
||||
苏丹
|
||||
苏里南
|
||||
英国
|
||||
英属印度洋领地
|
||||
英属维尔京群岛
|
||||
荷兰
|
||||
荷兰加勒比区
|
||||
荷属圣马丁
|
||||
莫桑比克
|
||||
莱索托
|
||||
菲律宾
|
||||
萨尔瓦多
|
||||
萨摩亚
|
||||
葡萄牙
|
||||
蒙古
|
||||
蒙特塞拉特
|
||||
西撒哈拉
|
||||
西班牙
|
||||
诺福克岛
|
||||
贝宁
|
||||
赞比亚
|
||||
赤道几内亚
|
||||
赫德岛和麦克唐纳群岛
|
||||
越南
|
||||
阿塞拜疆
|
||||
阿富汗
|
||||
阿尔及利亚
|
||||
阿尔巴尼亚
|
||||
阿曼
|
||||
阿根廷
|
||||
阿联酋
|
||||
阿鲁巴
|
||||
韩国
|
||||
香港
|
||||
马尔代夫
|
||||
马恩岛
|
||||
马拉维
|
||||
马提尼克
|
||||
马来西亚
|
||||
马约特
|
||||
马绍尔群岛
|
||||
马耳他
|
||||
马达加斯加
|
||||
马里
|
||||
黎巴嫩
|
||||
黑山
|
0
assets/res/NetAdmin.AdmServer.Fields.ln
Normal file
0
assets/res/NetAdmin.AdmServer.Fields.ln
Normal file
0
assets/res/NetAdmin.AdmServer.Statements.ln
Normal file
0
assets/res/NetAdmin.AdmServer.Statements.ln
Normal file
@ -4,7 +4,6 @@
|
||||
不包含
|
||||
不排序
|
||||
不等于
|
||||
管理模块
|
||||
丧偶
|
||||
中专
|
||||
中共党员
|
||||
@ -12,79 +11,59 @@
|
||||
以什么开始
|
||||
以什么结束
|
||||
保密
|
||||
保密
|
||||
信息
|
||||
倒序排序
|
||||
全部数据
|
||||
公告
|
||||
共青团员
|
||||
出生证
|
||||
初中
|
||||
删除
|
||||
包含
|
||||
博士
|
||||
博士后
|
||||
发送失败
|
||||
同步数据库结构
|
||||
外国人居留证
|
||||
外部错误
|
||||
大专
|
||||
大于
|
||||
大于等于
|
||||
女
|
||||
女
|
||||
宕机
|
||||
小于
|
||||
小于等于
|
||||
小学
|
||||
已发送
|
||||
已婚
|
||||
已校验
|
||||
已读
|
||||
并且
|
||||
意外错误
|
||||
成功
|
||||
或者
|
||||
手机
|
||||
护照
|
||||
指定部门数据
|
||||
按钮
|
||||
插入种子数据
|
||||
无效操作
|
||||
无效输入
|
||||
日期范围
|
||||
未处理异常
|
||||
未婚
|
||||
未读
|
||||
本人数据
|
||||
本科
|
||||
本部门和下级部门数据
|
||||
本部门数据
|
||||
框架
|
||||
比较数据库结构
|
||||
注册
|
||||
港澳台通行证
|
||||
电子邮箱
|
||||
男
|
||||
登录
|
||||
男
|
||||
硕士
|
||||
示例导出
|
||||
离异
|
||||
私信
|
||||
空闲
|
||||
等于
|
||||
等待发送
|
||||
等于
|
||||
等于
|
||||
管理模块
|
||||
系统模块
|
||||
绑定手机号
|
||||
结果非预期
|
||||
群众
|
||||
自定义
|
||||
范围
|
||||
菜单
|
||||
解绑手机号
|
||||
警告
|
||||
调试
|
||||
跟踪
|
||||
身份证
|
||||
运行
|
||||
通知
|
||||
重设密码
|
||||
链接
|
||||
错误
|
||||
随机排序
|
||||
顺序排序
|
21
assets/res/NetAdmin.Statements.ln
Normal file
21
assets/res/NetAdmin.Statements.ln
Normal file
@ -0,0 +1,21 @@
|
||||
6位数字
|
||||
8位以上数字字母组合
|
||||
XML注释文件不存在
|
||||
中文姓名
|
||||
事务已回滚
|
||||
事务已提交
|
||||
区号电话号码分机号
|
||||
参数格式不正确
|
||||
开始事务
|
||||
支付宝账号
|
||||
数据库同步开始
|
||||
数据库结构同步完成
|
||||
无效端口号
|
||||
无效证件号码
|
||||
时间表达式
|
||||
用户名不能是手机号码
|
||||
用户名长度4位以上
|
||||
请求对象不能为空
|
||||
邀请码不正确
|
||||
配置文件初始化完毕
|
||||
非JSON字符串
|
81
assets/res/NetAdmin.SysComponent.Fields.ln
Normal file
81
assets/res/NetAdmin.SysComponent.Fields.ln
Normal file
@ -0,0 +1,81 @@
|
||||
上次执行时间
|
||||
上次执行状态
|
||||
上次执行耗时
|
||||
下次执行时间
|
||||
人工审核
|
||||
作业名称
|
||||
作业状态
|
||||
全部数据
|
||||
公告
|
||||
创建时间
|
||||
删除
|
||||
发送失败
|
||||
响应体
|
||||
响应状态码
|
||||
唯一编码
|
||||
备注
|
||||
字典内容导出
|
||||
客户端IP
|
||||
已发送
|
||||
已校验
|
||||
已读
|
||||
所属角色
|
||||
所属部门
|
||||
手机
|
||||
手机号
|
||||
执行耗时
|
||||
执行计划
|
||||
指定部门数据
|
||||
按钮
|
||||
排序
|
||||
接口名称
|
||||
接口导出
|
||||
接口描述
|
||||
接口路径
|
||||
操作系统
|
||||
数据范围
|
||||
无限权限
|
||||
是否启用
|
||||
显示仪表板
|
||||
最后登录时间
|
||||
未读
|
||||
本人数据
|
||||
本部门和下级部门数据
|
||||
本部门数据
|
||||
框架
|
||||
注册
|
||||
消息主题
|
||||
消息摘要
|
||||
消息类型
|
||||
用户代理
|
||||
用户名
|
||||
用户导出
|
||||
电子邮箱
|
||||
登录
|
||||
登录名
|
||||
登录日志导出
|
||||
空闲
|
||||
站内信导出
|
||||
等待发送
|
||||
绑定手机号码
|
||||
菜单
|
||||
角色名称
|
||||
角色导出
|
||||
解绑手机号码
|
||||
计划作业导出
|
||||
计划作业执行记录导出
|
||||
请求方式
|
||||
请求日志导出
|
||||
跟踪标识
|
||||
运行
|
||||
通知
|
||||
邮箱号
|
||||
部门名称
|
||||
部门导出
|
||||
配置导出
|
||||
重设密码
|
||||
链接
|
||||
项值
|
||||
项名
|
||||
默认角色
|
||||
默认部门
|
@ -1,17 +1,9 @@
|
||||
1分钟内只能发送1次
|
||||
6位数字
|
||||
8位以上数字字母组合
|
||||
XML注释文件不存在
|
||||
中文姓名
|
||||
事务已回滚
|
||||
事务已提交
|
||||
人机校验请求不能为空
|
||||
人机验证未通过
|
||||
作业名称不能为空
|
||||
允许的文件大小
|
||||
允许的文件格式
|
||||
区号电话号码分机号
|
||||
参数格式不正确
|
||||
唯一编码不能为空
|
||||
图标代码不能为空
|
||||
图标名称不能为空
|
||||
@ -19,57 +11,60 @@ XML注释文件不存在
|
||||
字典名称不能为空
|
||||
字典目录不存在
|
||||
字典目录编号不能为空
|
||||
字典目录编号不能为空
|
||||
字典编码不能为空
|
||||
学历不正确
|
||||
密码不能为空
|
||||
密码不能为空
|
||||
密码不能为空
|
||||
密码不能为空
|
||||
已处理完毕
|
||||
开始事务
|
||||
已处理完毕
|
||||
已处理完毕
|
||||
并发冲突_请稍后重试
|
||||
性别不正确
|
||||
手机号码不正确
|
||||
手机号码不能为空
|
||||
接口编码不存在
|
||||
支付宝账号
|
||||
政治面貌不正确
|
||||
数据库同步开始
|
||||
数据库服务器时钟偏移
|
||||
数据库结构同步完成
|
||||
数据版本不能为空
|
||||
文件不能为空
|
||||
新密码不能为空
|
||||
新手机号码验证码不正确
|
||||
无效端口号
|
||||
无效证件号码
|
||||
日志长度超过限制
|
||||
旧密码不正确
|
||||
旧密码不能为空
|
||||
旧手机号码不正确
|
||||
旧手机号码验证码不正确
|
||||
时间戳缺失或误差过大
|
||||
时间表达式
|
||||
时间计划不能为空
|
||||
未指定部门
|
||||
未获取到待执行任务
|
||||
模块名称不能为空
|
||||
模块类型不能为空
|
||||
模块说明不能为空
|
||||
此节点已下线
|
||||
此节点已下线
|
||||
民族不正确
|
||||
消息主题不能为空
|
||||
消息内容不能为空
|
||||
父节点不存在
|
||||
用户不存在
|
||||
用户名不能为空
|
||||
用户名不能是手机号
|
||||
用户名不能为空
|
||||
用户名不能为空
|
||||
用户名或密码错误
|
||||
用户名长度4位以上
|
||||
用户头像不能为空
|
||||
用户档案不能为空
|
||||
用户编号不存在
|
||||
用户编号不能为空
|
||||
目标设备不能为空
|
||||
目标设备不能为空
|
||||
短信验证请求不能为空
|
||||
短信验证请求不能为空
|
||||
短信验证请求不能为空
|
||||
站内信不存在
|
||||
站内信状态不正确
|
||||
站内信类型不正确
|
||||
签名缺失
|
||||
缓存键不能为空
|
||||
网络地址不正确
|
||||
网络地址不正确
|
||||
网络地址不正确
|
||||
菜单名称不能为空
|
||||
菜单标题不能为空
|
||||
@ -86,18 +81,19 @@ XML注释文件不存在
|
||||
该部门下存在子部门
|
||||
该部门下存在用户
|
||||
请求地址不能为空
|
||||
请求对象不能为空
|
||||
请求方法不正确
|
||||
请稍后重试
|
||||
请联系管理员激活账号
|
||||
读取用户令牌出错
|
||||
账号不能为空
|
||||
邀请码不正确
|
||||
邮箱验证码不正确
|
||||
部门不存在
|
||||
部门名称不能为空
|
||||
配置文件初始化完毕
|
||||
键值不能为空
|
||||
键名称不能为空
|
||||
键名称不能为空
|
||||
随机延时结束时间不正确
|
||||
随机延时起始时间不正确
|
||||
验证数据不能为空
|
||||
验证码不正确
|
||||
验证码不能为空
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
||||
"ExecutionCron": "0 * * * * ?",
|
||||
"HttpMethod": 3,
|
||||
"JobName": "HTTP 请求测试",
|
||||
"NextExecTime": "2020/9/13 12:26:40",
|
||||
"NextExecTime": "2020-09-13 12:26:40",
|
||||
"NextTimeId": 1600000000,
|
||||
"RequestUrl": "https://httpbin.org/ip",
|
||||
"Status": 1,
|
||||
|
@ -6,7 +6,7 @@
|
||||
"Id": 373837717815301,
|
||||
"Name": "home",
|
||||
"Path": "/home",
|
||||
"Sort": 100,
|
||||
"Sort": 999,
|
||||
"Title": "主控面板",
|
||||
"Type": 1
|
||||
},
|
||||
@ -24,7 +24,7 @@
|
||||
"Component": "sys/user",
|
||||
"Icon": "el-icon-user",
|
||||
"Id": 373837957840901,
|
||||
"Name": "sys-user",
|
||||
"Name": "sys/user",
|
||||
"ParentId": 373837917724677,
|
||||
"Path": "/sys/user",
|
||||
"Sort": 100,
|
||||
@ -35,7 +35,7 @@
|
||||
"Component": "sys/role",
|
||||
"Icon": "sc-icon-role",
|
||||
"Id": 373838018527237,
|
||||
"Name": "sys-role",
|
||||
"Name": "sys/role",
|
||||
"ParentId": 373837917724677,
|
||||
"Path": "/sys/role",
|
||||
"Sort": 99,
|
||||
@ -46,7 +46,7 @@
|
||||
"Component": "sys/dept",
|
||||
"Icon": "sc-icon-dept",
|
||||
"Id": 373838045605893,
|
||||
"Name": "sys-dept",
|
||||
"Name": "sys/dept",
|
||||
"ParentId": 373837917724677,
|
||||
"Path": "/sys/dept",
|
||||
"Sort": 98,
|
||||
@ -57,7 +57,7 @@
|
||||
"Component": "sys/menu",
|
||||
"Icon": "el-icon-fold",
|
||||
"Id": 373838070898693,
|
||||
"Name": "sys-menu",
|
||||
"Name": "sys/menu",
|
||||
"ParentId": 373837917724677,
|
||||
"Path": "/sys/menu",
|
||||
"Sort": 97,
|
||||
@ -78,7 +78,7 @@
|
||||
"Component": "sys/config",
|
||||
"Icon": "el-icon-set-up",
|
||||
"Id": 380415005847557,
|
||||
"Name": "sys-config",
|
||||
"Name": "sys/config",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/config",
|
||||
"Sort": 100,
|
||||
@ -89,7 +89,7 @@
|
||||
"Component": "sys/job",
|
||||
"Icon": "sc-icon-ScheduledJob",
|
||||
"Id": 510067557638158,
|
||||
"Name": "sys-job",
|
||||
"Name": "sys/job",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/job",
|
||||
"Sort": 99,
|
||||
@ -100,7 +100,7 @@
|
||||
"Component": "sys/dic",
|
||||
"Icon": "sc-icon-dic",
|
||||
"Id": 375315654221829,
|
||||
"Name": "sys-dic",
|
||||
"Name": "sys/dic",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/dic",
|
||||
"Sort": 98,
|
||||
@ -111,7 +111,7 @@
|
||||
"Component": "sys/msg",
|
||||
"Icon": "el-icon-message",
|
||||
"Id": 482779610341392,
|
||||
"Name": "sys-msg",
|
||||
"Name": "sys/msg",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/msg",
|
||||
"Sort": 97,
|
||||
@ -122,7 +122,7 @@
|
||||
"Component": "sys/api",
|
||||
"Icon": "sc-icon-api",
|
||||
"Id": 397880678895621,
|
||||
"Name": "sys-api",
|
||||
"Name": "sys/api",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/api",
|
||||
"Sort": 96,
|
||||
@ -133,7 +133,7 @@
|
||||
"Component": "sys/cache",
|
||||
"Icon": "sc-icon-memory",
|
||||
"Id": 374911555702789,
|
||||
"Name": "sys-cache",
|
||||
"Name": "sys/cache",
|
||||
"ParentId": 485278637670422,
|
||||
"Path": "/sys/cache",
|
||||
"Sort": 95,
|
||||
@ -154,7 +154,7 @@
|
||||
"Component": "sys/log/operation",
|
||||
"Icon": "el-icon-pointer",
|
||||
"Id": 485285246504976,
|
||||
"Name": "sys-log-operation",
|
||||
"Name": "sys/log/operation",
|
||||
"ParentId": 374792687640581,
|
||||
"Path": "/sys/log/operation",
|
||||
"Sort": 100,
|
||||
@ -165,7 +165,7 @@
|
||||
"Component": "sys/log/login",
|
||||
"Icon": "sc-icon-OpenDoor",
|
||||
"Id": 485285246504970,
|
||||
"Name": "sys-log-login",
|
||||
"Name": "sys/log/login",
|
||||
"ParentId": 374792687640581,
|
||||
"Path": "/sys/log/login",
|
||||
"Sort": 99,
|
||||
@ -186,7 +186,7 @@
|
||||
"Component": "dev/code",
|
||||
"Icon": "sc-icon-code2",
|
||||
"Id": 373838147022853,
|
||||
"Name": "dev-code",
|
||||
"Name": "dev/code",
|
||||
"ParentId": 373838105399301,
|
||||
"Path": "/dev/code",
|
||||
"Sort": 100,
|
||||
@ -197,10 +197,20 @@
|
||||
"Id": 482777529417739,
|
||||
"ParentId": 373838105399301,
|
||||
"Icon": "el-icon-eleme-filled",
|
||||
"Name": "dev-element",
|
||||
"Path": "https://element-plus.gitee.io/zh-CN/component/button.html",
|
||||
"Name": "dev/element",
|
||||
"Path": "http://element-plus.org/zh-CN/component/overview.html",
|
||||
"Sort": 99,
|
||||
"Title": "Element",
|
||||
"Type": 3,
|
||||
},
|
||||
{
|
||||
"Id": 560217289232398,
|
||||
"ParentId": 373838105399301,
|
||||
"Icon": "sc-icon-FreeSql",
|
||||
"Name": "dev/freesql",
|
||||
"Path": "https://freesql.net/guide",
|
||||
"Sort": 99,
|
||||
"Title": "FreeSql",
|
||||
"Type": 3,
|
||||
}
|
||||
]
|
@ -9,7 +9,7 @@
|
||||
"Sort": 100
|
||||
},
|
||||
{
|
||||
"DataScope": 1,
|
||||
"DataScope": 4,
|
||||
"Enabled": true,
|
||||
"Id": 371729946431493,
|
||||
"Name": "普通用户",
|
||||
|
@ -14,5 +14,33 @@
|
||||
{
|
||||
"ApiId": "api/sys/user",
|
||||
"RoleId": 371729946431493
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/site.msg/unread.count",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/site.msg",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/site.msg/get.mine",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/site.msg/paged.query.mine",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/site.msg/set.site.msg.status",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/user/get.session.user.app.config",
|
||||
"RoleId": 371729946431493,
|
||||
},
|
||||
{
|
||||
"ApiId": "api/sys/user/set.session.user.app.config",
|
||||
"RoleId": 371729946431493,
|
||||
}
|
||||
]
|
@ -1,11 +1,9 @@
|
||||
[
|
||||
{
|
||||
"Id": 396423792566281,
|
||||
"MenuId": 373837717815301,
|
||||
"RoleId": 371729946431493
|
||||
},
|
||||
{
|
||||
"Id": 396423792566282,
|
||||
"MenuId": 374967228141573,
|
||||
"RoleId": 371729946431493
|
||||
}
|
||||
|
@ -6,5 +6,13 @@
|
||||
"Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15",
|
||||
"Token": "A9AFD92E-A33D-4152-9A6C-A9C141D24887",
|
||||
"UserName": "root"
|
||||
},
|
||||
{
|
||||
"DeptId": 372119301627909,
|
||||
"Enabled": true,
|
||||
"Id": 560217289236492,
|
||||
"Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15",
|
||||
"Token": "4208EA97-B32F-4E39-A290-4C0D27B61EBF",
|
||||
"UserName": "user"
|
||||
}
|
||||
]
|
@ -1,5 +1,10 @@
|
||||
[
|
||||
{
|
||||
"Id": 370942943322181
|
||||
"Id": 370942943322181,
|
||||
"AppConfig": "[]"
|
||||
},
|
||||
{
|
||||
"Id": 560217289236492,
|
||||
"AppConfig": "[]"
|
||||
}
|
||||
]
|
@ -2,5 +2,9 @@
|
||||
{
|
||||
"RoleId": 370943613149253,
|
||||
"UserId": 370942943322181
|
||||
},
|
||||
{
|
||||
"RoleId": 371729946431493,
|
||||
"UserId": 560217289236492
|
||||
}
|
||||
]
|
@ -15,15 +15,15 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.10.12-preview">
|
||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.11.20">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Roslynator.Analyzers" Version="4.12.2">
|
||||
<PackageReference Include="Roslynator.Analyzers" Version="4.12.9">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.24.0.89429">
|
||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.32.0.97167">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
@ -9,22 +9,4 @@
|
||||
Command="dotnet t4 ./gen.cs.tt -o ../dist/backend/$(ProjectName)/Ln.cs"
|
||||
StdOutEncoding="utf-8" />
|
||||
</Target>
|
||||
<ItemGroup>
|
||||
<None Include="$(SolutionDir)/assets/res/Statements.ln">
|
||||
<Link>Languages/Statements.ln</Link>
|
||||
</None>
|
||||
<None Include="$(SolutionDir)/assets/res/Nations.ln">
|
||||
<Link>Languages/Nations.ln</Link>
|
||||
</None>
|
||||
<None Include="$(SolutionDir)/assets/res/Enums.ln">
|
||||
<Link>Languages/Enums.ln</Link>
|
||||
</None>
|
||||
<EmbeddedResource Include="$(SolutionDir)/assets/res/Ln.resx">
|
||||
<Link>Languages/Ln.resx</Link>
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="$(SolutionDir)/dist/backend/$(ProjectName)/Ln.Designer.cs">
|
||||
<Link>Languages/Ln.Designer.cs</Link>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
</Project>
|
1
docker/README.md
Normal file
1
docker/README.md
Normal file
@ -0,0 +1 @@
|
||||
docker
|
@ -3,7 +3,7 @@
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-t4": {
|
||||
"version": "2.3.1",
|
||||
"version": "3.0.0",
|
||||
"commands": [
|
||||
"t4"
|
||||
]
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"version": "1.1.1",
|
||||
"version": "2.0.0",
|
||||
"devDependencies": {
|
||||
"cz-git": "^1.9.1",
|
||||
"commitizen": "^4.3.0",
|
||||
"prettier": "^3.2.5",
|
||||
"cz-git": "^1.10.1",
|
||||
"commitizen": "^4.3.1",
|
||||
"prettier": "^3.3.3",
|
||||
"standard-version": "^9.5.0"
|
||||
},
|
||||
"config": {
|
||||
|
Submodule refs/Furion deleted from d23c7cca55
@ -20,8 +20,10 @@ git tag -d $tag
|
||||
git tag $tag
|
||||
git push --tags origin release
|
||||
Start-Process -FilePath "https://github.com/nsnail/NetAdmin/compare/main...release"
|
||||
Write-Host "按『Enter』回到主分支,『Ctrl+C』退出"
|
||||
Write-Host "按『Enter』回到tk分支,『Ctrl+C』退出"
|
||||
Pause
|
||||
git checkout main
|
||||
git pull
|
||||
git branch -D release
|
||||
git branch -D tk
|
||||
git checkout -b tk
|
2
scripts/4.git.del.obsolete.tags.ps1
Normal file
2
scripts/4.git.del.obsolete.tags.ps1
Normal file
@ -0,0 +1,2 @@
|
||||
git push origin :refs/tags/$(git tag -l "*-*")
|
||||
git tag -d $(git tag -l "*-*")
|
@ -1,6 +1,7 @@
|
||||
<#@ template language="C#" #>
|
||||
<#@ output encoding="utf-8" extension="resx" #>
|
||||
<#@ import namespace="System.IO" #>
|
||||
<#@ import namespace="System.Linq" #>
|
||||
<#@ import namespace="System.Text.RegularExpressions" #>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
@ -28,14 +29,11 @@
|
||||
</resheader>
|
||||
<#
|
||||
var regex = new Regex(@"^\d", RegexOptions.Compiled);
|
||||
foreach (var file in Directory.GetFiles("../assets/res/", "*.ln"))
|
||||
{
|
||||
foreach (var line in File.ReadLines(file))
|
||||
foreach (var line in Directory.GetFiles("../assets/res/", "*.ln").SelectMany(x => File.ReadLines(x)).Distinct())
|
||||
{
|
||||
#>
|
||||
<data name="<#= regex.IsMatch(line) ? "_" : "" #><#= line #>" xml:space="preserve"><value><#= line #></value></data>
|
||||
<#
|
||||
}
|
||||
}
|
||||
#>
|
||||
</root>
|
@ -1,4 +1,4 @@
|
||||
#r "nuget: NSExt, 2.1.0"
|
||||
#r "nuget: NSExt, 2.2.0"
|
||||
using NSExt.Extensions;
|
||||
|
||||
Console.WriteLine("请输入原始名称(NetAdmin):");
|
||||
|
@ -10,11 +10,11 @@
|
||||
"packages": [
|
||||
{
|
||||
"packageName": "FreeSql.NS",
|
||||
"version": "3.2.821-ns1"
|
||||
"version": "3.2.833-ns4"
|
||||
},
|
||||
{
|
||||
"packageName": "FreeSql.DbContext.NS",
|
||||
"version": "3.2.821-ns1"
|
||||
"version": "3.2.833-ns4"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -1,15 +1,15 @@
|
||||
{
|
||||
"solution": "NetAdmin.sln",
|
||||
"mappings": {
|
||||
"Furion.Pure.NS": "../refs/Furion/framework/Furion.Pure/Furion.Pure.csproj"
|
||||
"Gurion": "../refs/Gurion/src/Gurion.csproj"
|
||||
},
|
||||
"restore": [
|
||||
{
|
||||
"name": "NetAdmin.Infrastructure",
|
||||
"packages": [
|
||||
{
|
||||
"packageName": "Furion.Pure.NS",
|
||||
"version": "4.9.2.31-ns3"
|
||||
"packageName": "Gurion",
|
||||
"version": "1.1.0"
|
||||
}
|
||||
]
|
||||
}
|
@ -9,7 +9,7 @@
|
||||
"packages": [
|
||||
{
|
||||
"packageName": "NSExt",
|
||||
"version": "2.1.0"
|
||||
"version": "2.2.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -17,6 +17,20 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{5198A03D-0
|
||||
"""
|
||||
);
|
||||
|
||||
content = Regex.Replace(
|
||||
content,
|
||||
"Project\\(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\"\\) = \"docker\", \"docker\", \"{E80A1018-C354-4A26-9029-8847BB9DA864}\"(?:.|\n)*?EndProject",
|
||||
$$"""
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docker", "docker", "{E80A1018-C354-4A26-9029-8847BB9DA864}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
{{string.Join('\n',
|
||||
Directory.GetFiles(@"../docker", "*")
|
||||
.Select(x=>$" {Path.GetFileName(x)} = docker/{Path.GetFileName(x)}")
|
||||
)}}
|
||||
EndProject
|
||||
"""
|
||||
);
|
||||
|
||||
content = Regex.Replace(
|
||||
content,
|
||||
"Project\\(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\"\\) = \"workflows\", \"workflows\", \"{3C6F049E-3EE8-4D66-9AFF-E8A369032487}\"(?:.|\n)*?EndProject",
|
||||
|
39
scripts/wait.server.stop.sh
Normal file
39
scripts/wait.server.stop.sh
Normal file
@ -0,0 +1,39 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 检查是否提供了 URL 参数
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <url>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 获取外部传入的 URL 参数
|
||||
URL="$1"
|
||||
|
||||
# 初始化返回值和时间限制
|
||||
response=""
|
||||
start_time=$(date +%s)
|
||||
time_limit=600 # 10分钟的秒数
|
||||
|
||||
# 循环检查 API 返回值
|
||||
while [ "$response" != "1" ]; do
|
||||
# 等待一段时间再进行下一次检查,避免频繁请求
|
||||
sleep 1
|
||||
|
||||
# 使用 curl 请求 URL,并捕获返回值,忽略 SSL 证书错误
|
||||
response=$(curl -sk "$URL")
|
||||
|
||||
# 打印返回值 (可选)
|
||||
echo "$1: $response"
|
||||
|
||||
# 检查时间是否超过限制
|
||||
current_time=$(date +%s)
|
||||
elapsed_time=$((current_time - start_time))
|
||||
|
||||
if [ "$elapsed_time" -ge "$time_limit" ]; then
|
||||
echo "Time limit exceeded. Continuing with the script..."
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# 无论是因为返回值为 "1" 还是超时,继续执行后续脚本
|
||||
echo "Continuing with the script..."
|
@ -25,16 +25,16 @@ global using FreeSql;
|
||||
global using FreeSql.Aop;
|
||||
global using FreeSql.DataAnnotations;
|
||||
global using FreeSql.Internal.Model;
|
||||
global using Furion;
|
||||
global using Furion.Authorization;
|
||||
global using Furion.ConfigurableOptions;
|
||||
global using Furion.DataEncryption;
|
||||
global using Furion.DataValidation;
|
||||
global using Furion.DependencyInjection;
|
||||
global using Furion.DynamicApiController;
|
||||
global using Furion.EventBus;
|
||||
global using Furion.SpecificationDocument;
|
||||
global using Furion.UnifyResult;
|
||||
global using Gurion;
|
||||
global using Gurion.Authorization;
|
||||
global using Gurion.ConfigurableOptions;
|
||||
global using Gurion.DataEncryption;
|
||||
global using Gurion.DataValidation;
|
||||
global using Gurion.DependencyInjection;
|
||||
global using Gurion.DynamicApiController;
|
||||
global using Gurion.EventBus;
|
||||
global using Gurion.SpecificationDocument;
|
||||
global using Gurion.UnifyResult;
|
||||
global using Mapster;
|
||||
global using Microsoft.AspNetCore.Authorization;
|
||||
global using Microsoft.AspNetCore.Builder;
|
||||
@ -64,7 +64,3 @@ global using NetAdmin.Infrastructure.Languages;
|
||||
global using NetAdmin.Infrastructure.Utils;
|
||||
global using NSExt.Attributes;
|
||||
global using NSExt.Extensions;
|
||||
#if !INFRAS
|
||||
global using DynamicFilterInfo = NetAdmin.Domain.Dto.Dependency.DynamicFilterInfo;
|
||||
global using DynamicFilterOperators = NetAdmin.Domain.Enums.DynamicFilterOperators;
|
||||
#endif
|
@ -1,6 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../NetAdmin.AdmServer.Domain/NetAdmin.AdmServer.Domain.csproj"/>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="MailKit" Version="4.8.0"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj"/>
|
||||
<ProjectReference Include="../NetAdmin.AdmServer.Application/NetAdmin.AdmServer.Application.csproj"/>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -0,0 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
||||
<ItemGroup>
|
||||
<Content Include="$(SolutionDir)/assets/seed-data/Adm_*.json" LinkBase="SeedData" CopyToOutputDirectory="PreserveNewest"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../NetAdmin.AdmServer.Infrastructure/NetAdmin.AdmServer.Infrastructure.csproj"/>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Domain/NetAdmin.SysComponent.Domain.csproj"/>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,8 +1,8 @@
|
||||
using NetAdmin.AdmServer.Host.Filters;
|
||||
using NetAdmin.Domain.Contexts;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
using NetAdmin.Domain.Enums.Sys;
|
||||
using NetAdmin.Host.Extensions;
|
||||
using NetAdmin.SysComponent.Domain.Contexts;
|
||||
using NetAdmin.SysComponent.Domain.Enums.Sys;
|
||||
using NetAdmin.SysComponent.Host.Extensions;
|
||||
|
||||
namespace NetAdmin.AdmServer.Host.Extensions;
|
||||
|
||||
@ -22,8 +22,7 @@ public static class ServiceCollectionExtensions
|
||||
(Startup.Args.InsertSeedData ? FreeSqlInitMethods.InsertSeedData : FreeSqlInitMethods.None), freeSql => {
|
||||
// 数据权限过滤器
|
||||
_ = freeSql.GlobalFilter.ApplyOnlyIf<IFieldOwner>( //
|
||||
Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA
|
||||
, () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.Self) ?? false
|
||||
Chars.FLG_FREE_SQL_GLOBAL_FILTER_DATA, () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.Self) ?? false
|
||||
, a => a.OwnerId == ContextUserInfo.Create().Id);
|
||||
});
|
||||
}
|
||||
|
@ -1,17 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="$(SolutionDir)/assets/captcha/**" LinkBase="Assets/Captcha"/>
|
||||
<EmbeddedResource Include="$(SolutionDir)/CHANGELOG.md" LogicalName="CHANGELOG.md"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj"/>
|
||||
<ProjectReference Include="../NetAdmin.AdmServer.Cache/NetAdmin.AdmServer.Cache.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<ProjectReference Include="../NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition="'$(Configuration)' != 'Debug'">
|
||||
<EmbeddedResource Include="../../../dist/frontend/admin/**/*" LinkBase="UI"/>
|
||||
|
@ -1,13 +1,34 @@
|
||||
/*
|
||||
_ooOoo_
|
||||
o8888888o
|
||||
88" . "88
|
||||
(| -_- |)
|
||||
O\ = /O
|
||||
____/`---'\____
|
||||
.' \\| |// `.
|
||||
/ \\||| : |||// \
|
||||
/ _||||| -:- |||||- \
|
||||
| | \\\ - /// | |
|
||||
| \_| ''\---/'' | |
|
||||
\ .-\__ `-` ___/-. /
|
||||
___`. .' /--.--\ `. . __
|
||||
."" '< `.___\_<|>_/___.' >'"".
|
||||
| | : `- \`.;`\ _ /`;.`/ - ` : | |
|
||||
\ \ `-. \_ __\ /__ _/ .-` / /
|
||||
======`-.____`-.___\_____/___.-`____.-'======
|
||||
`=---='
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
佛祖保佑 永无BUG
|
||||
*/
|
||||
|
||||
using NetAdmin.AdmServer.Host;
|
||||
using NetAdmin.AdmServer.Host.Extensions;
|
||||
using NetAdmin.Host.Extensions;
|
||||
using NetAdmin.Host.Middlewares;
|
||||
using NetAdmin.SysComponent.Host.Extensions;
|
||||
using NetAdmin.SysComponent.Host.Middlewares;
|
||||
using Spectre.Console.Cli;
|
||||
using ValidationResult = Spectre.Console.ValidationResult;
|
||||
#if !DEBUG
|
||||
using Prometheus;
|
||||
#endif
|
||||
|
||||
NetAdmin.Host.Startup.Entry<Startup>(args);
|
||||
|
||||
@ -26,8 +47,12 @@ namespace NetAdmin.AdmServer.Host
|
||||
/// <summary>
|
||||
/// 配置应用程序中间件
|
||||
/// </summary>
|
||||
#pragma warning disable S2325
|
||||
public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifeTime)
|
||||
#pragma warning restore S2325
|
||||
{
|
||||
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
|
||||
|
||||
_ = app //
|
||||
.UseMiddleware<SafetyShopHostMiddleware>() // 安全停机中间件
|
||||
.EnableBuffering() // 启用请求体缓冲,允许多次读取请求体
|
||||
@ -36,15 +61,17 @@ namespace NetAdmin.AdmServer.Host
|
||||
.UseOpenApiSkin() // 使用OpenApiSkin中间件(仅在调试模式下),提供Swagger UI皮肤
|
||||
#else
|
||||
.UseVueAdmin() // 托管管理后台,仅在非调试模式下
|
||||
.UseHttpMetrics() // 使用HttpMetrics中间件,启用HTTP性能监控
|
||||
.UsePrometheus() // 使用Prometheus中间件,启用HTTP性能监控
|
||||
#endif
|
||||
.UseInject(string.Empty) // 使用Inject中间件,Furion脚手架的依赖注入支持
|
||||
.UseInject(string.Empty) // 使用Inject中间件,Gurion脚手架的依赖注入支持
|
||||
.UseUnifyResultStatusCodes() // 使用UnifyResultStatusCodes中间件,用于统一处理结果状态码
|
||||
.UseCorsAccessor() // 使用CorsAccessor中间件,启用跨域资源共享(CORS)支持
|
||||
.UseRouting() // 使用Routing中间件,配置路由映射
|
||||
.UseAuthentication() // 使用Authentication中间件,启用身份验证
|
||||
.UseAuthorization() // 使用Authorization中间件,启用授权
|
||||
.UseMiddleware<RemoveNullNodeMiddleware>() // 使用RemoveNullNodeMiddleware中间件,删除JSON中的空节点
|
||||
.UseWebSockets() // 使用WebSockets中间件,启用WebSocket支持
|
||||
.UseMiddleware<VersionCheckerMiddleware>() // 使用VersionUpdaterMiddleware中间件,用于检查版本
|
||||
.UseEndpoints(); // 配置端点以处理请求
|
||||
_ = lifeTime.ApplicationStopping.Register(SafetyShopHostMiddleware.OnStopping);
|
||||
}
|
||||
@ -52,7 +79,9 @@ namespace NetAdmin.AdmServer.Host
|
||||
/// <summary>
|
||||
/// 配置服务容器
|
||||
/// </summary>
|
||||
#pragma warning disable S2325
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
#pragma warning restore S2325
|
||||
{
|
||||
_ = services.AddConsoleFormatter() // 添加控制台日志模板
|
||||
.AddAllOptions() // 添加配置项
|
||||
@ -62,7 +91,8 @@ namespace NetAdmin.AdmServer.Host
|
||||
.AddFreeSqlWithArgs() // 添加 freeSql
|
||||
.AddRemoteRequest() // 添加远程请求
|
||||
.AddCorsAccessor() // 添加支持跨域访问
|
||||
.AddContextUser() // 添加上下文用户
|
||||
.AddContextUserToken() // 添加上下文用户令牌
|
||||
.AddContextUserInfo() // 添加上下文用户信息
|
||||
.AddRedisCache() // 添加 Redis 缓存
|
||||
.AddSchedules() // 添加计划任务
|
||||
|
||||
@ -75,12 +105,18 @@ namespace NetAdmin.AdmServer.Host
|
||||
|
||||
/// <inheritdoc />
|
||||
#pragma warning disable ASA001
|
||||
public Task<int> Execute(CommandContext context, CommandLineArgs settings)
|
||||
public async Task<int> Execute(CommandContext context, CommandLineArgs settings)
|
||||
#pragma warning restore ASA001
|
||||
{
|
||||
Args = settings;
|
||||
_ = Serve.Run(RunOptions.Default.WithArgs(context.Remaining.Raw.ToArray()));
|
||||
return Task.FromResult(0);
|
||||
var webOpt = new WebApplicationOptions //
|
||||
{
|
||||
EnvironmentName = Environment.GetEnvironmentVariable("TEST_ENVIRONMENT").NullOrEmpty(null)
|
||||
, Args = context.Remaining.Raw.ToArray()
|
||||
};
|
||||
Serve.BuildApplication(RunOptions.Default.ConfigureOptions(webOpt), null, out var startUrl, out var app);
|
||||
await app.RunAsync(startUrl).ConfigureAwait(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
@ -1 +0,0 @@
|
||||
{}
|
@ -1 +0,0 @@
|
||||
{}
|
@ -1,45 +0,0 @@
|
||||
{
|
||||
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
|
||||
"SpecificationDocumentSettings": {
|
||||
"GroupOpenApiInfos": [
|
||||
{
|
||||
"Group": "Sys",
|
||||
"Title": "系统组件",
|
||||
"Description": "NetAdmin - 系统组件",
|
||||
},
|
||||
{
|
||||
"Group": "Adm",
|
||||
"Title": "管理服务",
|
||||
"Description": "NetAdmin - 管理服务",
|
||||
},
|
||||
{
|
||||
"Group": "Tpl",
|
||||
"Visible": false,
|
||||
},
|
||||
{
|
||||
"Group": "Probe",
|
||||
"Visible": false,
|
||||
}
|
||||
],
|
||||
"SecurityDefinitions": [
|
||||
{
|
||||
"Id": "Bearer",
|
||||
"Type": "ApiKey",
|
||||
"Name": "Authorization",
|
||||
"Description": "JWT Authorization header using the Bearer scheme.",
|
||||
"BearerFormat": "JWT",
|
||||
"Scheme": "bearer",
|
||||
"In": "Header",
|
||||
"Requirement": {
|
||||
"Scheme": {
|
||||
"Reference": {
|
||||
"Id": "Bearer",
|
||||
"Type": "SecurityScheme"
|
||||
},
|
||||
"Accesses": []
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Debug",
|
||||
"Microsoft.AspNetCore": "Debug",
|
||||
"System.Logging.EventBusService": "Debug"
|
||||
},
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Debug",
|
||||
"Microsoft.AspNetCore": "Debug",
|
||||
"System.Logging.EventBusService": "Debug"
|
||||
},
|
||||
}
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Debug",
|
||||
"Microsoft.AspNetCore": "Debug",
|
||||
"System.Logging.EventBusService": "Debug"
|
||||
},
|
||||
}
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
{
|
||||
// Swagger文档配置 ------------------------------------------------------------------------------
|
||||
"SpecificationDocumentSettings": {
|
||||
"GroupOpenApiInfos": [
|
||||
{
|
||||
"Group": "Sys",
|
||||
"Title": "系统组件",
|
||||
"Description": "NetAdmin - 系统组件"
|
||||
},
|
||||
{
|
||||
"Group": "Adm",
|
||||
"Title": "管理服务",
|
||||
"Description": "NetAdmin - 管理服务"
|
||||
},
|
||||
{
|
||||
"Group": "Tpl",
|
||||
"Visible": false
|
||||
},
|
||||
{
|
||||
"Group": "Probe",
|
||||
"Visible": false
|
||||
}
|
||||
],
|
||||
"XmlComments": [
|
||||
"NetAdmin.AdmServer.Application.xml",
|
||||
"NetAdmin.AdmServer.Cache.xml",
|
||||
"NetAdmin.AdmServer.Domain.xml",
|
||||
"NetAdmin.AdmServer.Host.xml",
|
||||
"NetAdmin.AdmServer.Infrastructure.xml",
|
||||
"FreeSql.xml",
|
||||
"NetAdmin.Application.xml",
|
||||
"NetAdmin.Cache.xml",
|
||||
"NetAdmin.Domain.xml",
|
||||
"NetAdmin.Host.xml",
|
||||
"NetAdmin.Infrastructure.xml",
|
||||
"NetAdmin.SysComponent.Application.xml",
|
||||
"NetAdmin.SysComponent.Cache.xml",
|
||||
"NetAdmin.SysComponent.Domain.xml",
|
||||
"NetAdmin.SysComponent.Host.xml",
|
||||
"NetAdmin.SysComponent.Infrastructure.xml"
|
||||
]
|
||||
},
|
||||
// 数据库配置 --------------------------------------------------------------------------------------------------------
|
||||
"Database": {
|
||||
"DbType": "Sqlite",
|
||||
"ConnStr": "data source=NetAdmin.db",
|
||||
"SeedDataRelativePath": "SeedData"
|
||||
},
|
||||
// JWT鉴权配置 -------------------------------------------------------------------------------------------------------
|
||||
"JWTSettings": {
|
||||
"ValidateIssuerSigningKey": true,
|
||||
"IssuerSigningKey": "bO0BCAGxpxYnm6AE4XpgO25T27NayFzjGgfDqBuzUzD6ROpFiZUi3KjVg93bdGek",
|
||||
"ValidateIssuer": true,
|
||||
"ValidIssuer": "签发方",
|
||||
"ValidateAudience": true,
|
||||
"ValidAudience": "签收方",
|
||||
"ValidateLifetime": true,
|
||||
"ExpiredTime": 5256000,
|
||||
"ClockSkew": 5,
|
||||
"Algorithm": "HS256"
|
||||
},
|
||||
// 日志配置 ----------------------------------------------------------------------------------------------------------
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning",
|
||||
"System.Logging.EventBusService": "Error"
|
||||
}
|
||||
},
|
||||
// Redis配置 --------------------------------------------------------------------------------------------------------
|
||||
"Redis": {
|
||||
"Instances": [
|
||||
{
|
||||
"Name": "DataCache",
|
||||
"ConnStr": "localhost:6379,abortConnect=false",
|
||||
"DataBase": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
// 文件上传配置 -------------------------------------------------------------------------------------------------------
|
||||
"Upload": {
|
||||
"ContentTypes": [
|
||||
"image/jpg",
|
||||
"image/png",
|
||||
"image/jpeg",
|
||||
"image/gif"
|
||||
],
|
||||
"MaxSize": 1073741824,
|
||||
"Minio": {
|
||||
"ServerAddress": "vm-ubt-1:9000",
|
||||
"AccessKey": "nVMM0gSqwyIjM8iZ",
|
||||
"SecretKey": "F8OZngGrNsZSYn4MP9swwMSf5rfm61EC",
|
||||
"BucketName": "cloud-code",
|
||||
"AccessUrl": "http://vm-ubt-1:9000",
|
||||
"Secure": false
|
||||
}
|
||||
},
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="$(SolutionDir)/assets/res/NetAdmin.AdmServer.Statements.ln">
|
||||
<Link>Languages/NetAdmin.AdmServer.Statements.ln</Link>
|
||||
</None>
|
||||
<None Include="$(SolutionDir)/assets/res/NetAdmin.AdmServer.Fields.ln">
|
||||
<Link>Languages/NetAdmin.AdmServer.Fields.ln</Link>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1,186 +0,0 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Net.Http.Json;
|
||||
using Microsoft.AspNetCore.Mvc.Testing;
|
||||
using NetAdmin.AdmServer.Host;
|
||||
using NetAdmin.Application.Modules;
|
||||
using NetAdmin.Domain.Dto.Dependency;
|
||||
using NetAdmin.Domain.Dto.Sys.Api;
|
||||
using NetAdmin.Domain.Dto.Sys.Cache;
|
||||
using NetAdmin.Domain.Dto.Sys.Config;
|
||||
using NetAdmin.Domain.Dto.Sys.Tool;
|
||||
using NetAdmin.SysComponent.Application.Modules.Sys;
|
||||
using NetAdmin.Tests;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace NetAdmin.AdmServer.Tests;
|
||||
|
||||
/// <summary>
|
||||
/// 所有测试
|
||||
/// </summary>
|
||||
[SuppressMessage("Usage", "xUnit1028:Test method must have valid return type")]
|
||||
public class AllTests(WebApplicationFactory<Startup> factory, ITestOutputHelper testOutputHelper)
|
||||
: WebApiTestBase<Startup>(factory, testOutputHelper), IToolsModule, ICacheModule, IApiModule, IConfigModule
|
||||
|
||||
{
|
||||
/// <inheritdoc cref="ICrudModule{TCreateReq,TCreateRsp,TQueryReq,TQueryRsp,TUpdateReq,TUpdateRsp,TDelReq}.BulkDeleteAsync" />
|
||||
public Task<int> BulkDeleteAsync(BulkReq<DelReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[Fact]
|
||||
public async Task<CacheStatisticsRsp> CacheStatisticsAsync()
|
||||
{
|
||||
var rsp = await PostAsync("/api/sys/cache/cache.statistics", null).ConfigureAwait(true);
|
||||
Assert.Equal(HttpStatusCode.OK, rsp.StatusCode);
|
||||
return default;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<long> CountAsync(QueryReq<QueryConfigReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<long> CountAsync(QueryReq<QueryApiReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryConfigRsp> CreateAsync(CreateConfigReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryApiRsp> CreateAsync(CreateApiReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="ICrudModule{TCreateReq,TCreateRsp,TQueryReq,TQueryRsp,TUpdateReq,TUpdateRsp,TDelReq}.DeleteAsync" />
|
||||
public Task<int> DeleteAsync(DelReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<bool> ExistAsync(QueryReq<QueryConfigReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<bool> ExistAsync(QueryReq<QueryApiReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[InlineData(default)]
|
||||
[Theory]
|
||||
public async Task<PagedQueryRsp<GetAllEntriesRsp>> GetAllEntriesAsync(PagedQueryReq<GetAllEntriesReq> req)
|
||||
{
|
||||
var rsp = await PostAsync("/api/sys/cache/get.all.entries"
|
||||
, JsonContent.Create(new PagedQueryReq<GetAllEntriesReq>()))
|
||||
.ConfigureAwait(true);
|
||||
Assert.Equal(HttpStatusCode.OK, rsp.StatusCode);
|
||||
return default;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryConfigRsp> GetAsync(QueryConfigReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryApiRsp> GetAsync(QueryApiReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<string> GetChangeLogAsync()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryConfigRsp> GetLatestConfigAsync()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IEnumerable<GetModulesRsp>> GetModulesAsync()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[Fact]
|
||||
public async Task<DateTime> GetServerUtcTimeAsync()
|
||||
{
|
||||
var response = await PostAsync("/api/sys/tools/get.server.utc.time", null).ConfigureAwait(true);
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
return default;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[Fact]
|
||||
public async Task<string> GetVersionAsync()
|
||||
{
|
||||
var response = await PostAsync("/api/sys/tools/version", null).ConfigureAwait(true);
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
return default;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<PagedQueryRsp<QueryConfigRsp>> PagedQueryAsync(PagedQueryReq<QueryConfigReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<PagedQueryRsp<QueryApiRsp>> PagedQueryAsync(PagedQueryReq<QueryApiReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IEnumerable<QueryConfigRsp>> QueryAsync(QueryReq<QueryConfigReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IEnumerable<QueryApiRsp>> QueryAsync(QueryReq<QueryApiReq> req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
[Fact]
|
||||
public async Task SyncAsync()
|
||||
{
|
||||
var response = await PostAsync("/api/sys/api/sync", null).ConfigureAwait(true);
|
||||
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryConfigRsp> UpdateAsync(UpdateConfigReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<NopReq> UpdateAsync(NopReq req)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
namespace NetAdmin.Host.Extensions;
|
||||
namespace NetAdmin.Application.Extensions;
|
||||
|
||||
/// <summary>
|
||||
/// 工作单元管理器扩展方法
|
||||
@ -21,7 +21,8 @@ public static class UnitOfWorkManagerExtensions
|
||||
unitOfWork.Commit();
|
||||
logger?.Info($"{Ln.事务已提交}: {hashCode}");
|
||||
}
|
||||
catch {
|
||||
catch (Exception ex) {
|
||||
logger?.Warn(ex);
|
||||
unitOfWork.Rollback();
|
||||
logger?.Warn($"{Ln.事务已回滚}: {hashCode}");
|
||||
throw;
|
@ -10,16 +10,12 @@ namespace NetAdmin.Application.Modules;
|
||||
/// <typeparam name="TCreateRsp">创建响应类型</typeparam>
|
||||
/// <typeparam name="TQueryReq">查询请求类型</typeparam>
|
||||
/// <typeparam name="TQueryRsp">查询响应类型</typeparam>
|
||||
/// <typeparam name="TUpdateReq">修改请求类型</typeparam>
|
||||
/// <typeparam name="TUpdateRsp">修改响应类型</typeparam>
|
||||
/// <typeparam name="TDelReq">删除请求类型</typeparam>
|
||||
public interface ICrudModule<in TCreateReq, TCreateRsp, TQueryReq, TQueryRsp, in TUpdateReq, TUpdateRsp, TDelReq>
|
||||
public interface ICrudModule<in TCreateReq, TCreateRsp, TQueryReq, TQueryRsp, TDelReq>
|
||||
where TCreateReq : DataAbstraction, new()
|
||||
where TCreateRsp : DataAbstraction
|
||||
where TQueryReq : DataAbstraction, new()
|
||||
where TQueryRsp : DataAbstraction
|
||||
where TUpdateReq : DataAbstraction, new()
|
||||
where TUpdateRsp : DataAbstraction
|
||||
where TDelReq : DataAbstraction, new()
|
||||
{
|
||||
/// <summary>
|
||||
@ -47,6 +43,11 @@ public interface ICrudModule<in TCreateReq, TCreateRsp, TQueryReq, TQueryRsp, in
|
||||
/// </summary>
|
||||
Task<bool> ExistAsync(QueryReq<TQueryReq> req);
|
||||
|
||||
/// <summary>
|
||||
/// 导出实体
|
||||
/// </summary>
|
||||
Task<IActionResult> ExportAsync(QueryReq<TQueryReq> req);
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个实体
|
||||
/// </summary>
|
||||
@ -61,9 +62,4 @@ public interface ICrudModule<in TCreateReq, TCreateRsp, TQueryReq, TQueryRsp, in
|
||||
/// 查询实体
|
||||
/// </summary>
|
||||
Task<IEnumerable<TQueryRsp>> QueryAsync(QueryReq<TQueryReq> req);
|
||||
|
||||
/// <summary>
|
||||
/// 更新实体
|
||||
/// </summary>
|
||||
Task<TUpdateRsp> UpdateAsync(TUpdateReq req);
|
||||
}
|
@ -1,14 +1,12 @@
|
||||
using NetAdmin.Application.Modules;
|
||||
using NetAdmin.Domain.Dto.Dependency;
|
||||
using NetAdmin.Domain.Dto.Tpl.Example;
|
||||
|
||||
namespace NetAdmin.SysComponent.Application.Modules.Tpl;
|
||||
namespace NetAdmin.Application.Modules.Tpl;
|
||||
|
||||
/// <summary>
|
||||
/// 示例模块
|
||||
/// </summary>
|
||||
public interface IExampleModule : ICrudModule<CreateExampleReq, QueryExampleRsp // 创建类型
|
||||
, QueryExampleReq, QueryExampleRsp // 查询类型
|
||||
, UpdateExampleReq, QueryExampleRsp // 修改类型
|
||||
, DelReq // 删除类型
|
||||
>;
|
@ -0,0 +1,18 @@
|
||||
using NetAdmin.Domain.Contexts;
|
||||
using NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
namespace NetAdmin.Application.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// 基础仓储
|
||||
/// </summary>
|
||||
public sealed class BasicRepository<TEntity, TPrimary>(IFreeSql fSql, UnitOfWorkManager uowManger, ContextUserToken userToken)
|
||||
: DefaultRepository<TEntity, TPrimary>(fSql, uowManger)
|
||||
where TEntity : EntityBase<TPrimary> //
|
||||
where TPrimary : IEquatable<TPrimary>
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前上下文关联的用户令牌
|
||||
/// </summary>
|
||||
public ContextUserToken UserToken => userToken;
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
using NetAdmin.Domain.Contexts;
|
||||
using NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
namespace NetAdmin.Application.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// 默认仓储
|
||||
/// </summary>
|
||||
public sealed class DefaultRepository<TEntity>(IFreeSql fSql, UnitOfWorkManager uowManger, ContextUserToken userToken)
|
||||
: DefaultRepository<TEntity, long>(fSql, uowManger)
|
||||
where TEntity : EntityBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前上下文关联的用户令牌
|
||||
/// </summary>
|
||||
public ContextUserToken UserToken => userToken;
|
||||
}
|
43
src/backend/NetAdmin.Application/Services/RedisService.cs
Normal file
43
src/backend/NetAdmin.Application/Services/RedisService.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using NetAdmin.Application.Repositories;
|
||||
using NetAdmin.Domain.DbMaps.Dependency;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace NetAdmin.Application.Services;
|
||||
|
||||
/// <summary>
|
||||
/// Redis Service Base
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Initializes a new instance of the <see cref="RedisService{TEntity, TPrimary, TLogger}" /> class.
|
||||
/// Redis Service Base
|
||||
/// </remarks>
|
||||
public abstract class RedisService<TEntity, TPrimary, TLogger>(BasicRepository<TEntity, TPrimary> rpo)
|
||||
: RepositoryService<TEntity, TPrimary, TLogger>(rpo)
|
||||
where TEntity : EntityBase<TPrimary> //
|
||||
where TPrimary : IEquatable<TPrimary>
|
||||
{
|
||||
/// <summary>
|
||||
/// Redis Database
|
||||
/// </summary>
|
||||
protected IDatabase RedisDatabase { get; } //
|
||||
= App.GetService<IConnectionMultiplexer>()
|
||||
.GetDatabase(App.GetOptions<RedisOptions>().Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE).Database);
|
||||
|
||||
/// <summary>
|
||||
/// 获取锁
|
||||
/// </summary>
|
||||
protected Task<RedisLocker> GetLockerAsync(string lockerName)
|
||||
{
|
||||
return RedisLocker.GetLockerAsync(RedisDatabase, lockerName, TimeSpan.FromSeconds(Numbers.SECS_REDIS_LOCK_EXPIRY)
|
||||
, Numbers.MAX_LIMIT_RETRY_CNT_REDIS_LOCK, TimeSpan.FromSeconds(Numbers.SECS_REDIS_LOCK_RETRY_DELAY));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取锁(仅获取一次)
|
||||
/// </summary>
|
||||
protected Task<RedisLocker> GetLockerOnceAsync(string lockerName)
|
||||
{
|
||||
return RedisLocker.GetLockerAsync(RedisDatabase, lockerName, TimeSpan.FromSeconds(Numbers.SECS_REDIS_LOCK_EXPIRY), 1
|
||||
, TimeSpan.FromSeconds(Numbers.SECS_REDIS_LOCK_RETRY_DELAY));
|
||||
}
|
||||
}
|
@ -1,5 +1,10 @@
|
||||
using CsvHelper;
|
||||
using Microsoft.Net.Http.Headers;
|
||||
using NetAdmin.Application.Repositories;
|
||||
using NetAdmin.Domain;
|
||||
using NetAdmin.Domain.DbMaps.Dependency;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
using NetAdmin.Domain.Dto.Dependency;
|
||||
|
||||
namespace NetAdmin.Application.Services;
|
||||
|
||||
@ -7,14 +12,16 @@ namespace NetAdmin.Application.Services;
|
||||
/// 仓储服务基类
|
||||
/// </summary>
|
||||
/// <typeparam name="TEntity">实体类型</typeparam>
|
||||
/// <typeparam name="TPrimary">主键类型</typeparam>
|
||||
/// <typeparam name="TLogger">日志类型</typeparam>
|
||||
public abstract class RepositoryService<TEntity, TLogger>(DefaultRepository<TEntity> rpo) : ServiceBase<TLogger>
|
||||
where TEntity : EntityBase
|
||||
public abstract class RepositoryService<TEntity, TPrimary, TLogger>(BasicRepository<TEntity, TPrimary> rpo) : ServiceBase<TLogger>
|
||||
where TEntity : EntityBase<TPrimary> //
|
||||
where TPrimary : IEquatable<TPrimary>
|
||||
{
|
||||
/// <summary>
|
||||
/// 默认仓储
|
||||
/// </summary>
|
||||
protected DefaultRepository<TEntity> Rpo => rpo;
|
||||
protected BasicRepository<TEntity, TPrimary> Rpo => rpo;
|
||||
|
||||
/// <summary>
|
||||
/// 启用级联保存
|
||||
@ -25,10 +32,128 @@ public abstract class RepositoryService<TEntity, TLogger>(DefaultRepository<TEnt
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 针对 Sqlite 数据的更新操作
|
||||
/// 导出实体
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// 非 Sqlite 数据库请删除
|
||||
/// </returns>
|
||||
protected abstract Task<TEntity> UpdateForSqliteAsync(TEntity req);
|
||||
protected static async Task<IActionResult> ExportAsync<TQuery, TExport>( //
|
||||
Func<QueryReq<TQuery>, ISelectGrouping<TEntity, TEntity>> selector, QueryReq<TQuery> query, string fileName
|
||||
, Expression<Func<ISelectGroupingAggregate<TEntity, TEntity>, object>> listExp = null)
|
||||
where TQuery : DataAbstraction, new()
|
||||
{
|
||||
var list = await selector(query).Take(Numbers.MAX_LIMIT_EXPORT).ToListAsync(listExp).ConfigureAwait(false);
|
||||
return await GetExportFileStreamAsync<TExport>(fileName, list).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 导出实体
|
||||
/// </summary>
|
||||
protected static async Task<IActionResult> ExportAsync<TQuery, TExport>( //
|
||||
Func<QueryReq<TQuery>, ISelect<TEntity>> selector, QueryReq<TQuery> query, string fileName, Expression<Func<TEntity, object>> listExp = null)
|
||||
where TQuery : DataAbstraction, new()
|
||||
{
|
||||
var select = selector(query)
|
||||
#if DBTYPE_SQLSERVER
|
||||
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
|
||||
#endif
|
||||
.Take(Numbers.MAX_LIMIT_EXPORT);
|
||||
|
||||
object list = listExp == null ? await select.ToListAsync().ConfigureAwait(false) : await select.ToListAsync(listExp).ConfigureAwait(false);
|
||||
|
||||
return await GetExportFileStreamAsync<TExport>(fileName, list).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 更新实体
|
||||
/// </summary>
|
||||
/// <param name="newValue">新的值</param>
|
||||
/// <param name="includeFields">包含的属性</param>
|
||||
/// <param name="excludeFields">排除的属性</param>
|
||||
/// <param name="whereExp">查询表达式</param>
|
||||
/// <param name="whereSql">查询sql</param>
|
||||
/// <param name="ignoreVersion">是否忽略版本锁</param>
|
||||
/// <returns>更新行数</returns>
|
||||
protected Task<int> UpdateAsync( //
|
||||
TEntity newValue //
|
||||
, IEnumerable<string> includeFields //
|
||||
, string[] excludeFields = null //
|
||||
, Expression<Func<TEntity, bool>> whereExp = null //
|
||||
, string whereSql = null //
|
||||
, bool ignoreVersion = false)
|
||||
{
|
||||
// 默认匹配主键
|
||||
whereExp ??= a => a.Id.Equals(newValue.Id);
|
||||
var update = BuildUpdate(newValue, includeFields, excludeFields, ignoreVersion).Where(whereExp).Where(whereSql);
|
||||
return update.ExecuteAffrowsAsync();
|
||||
}
|
||||
|
||||
#if DBTYPE_SQLSERVER
|
||||
/// <summary>
|
||||
/// 更新实体
|
||||
/// </summary>
|
||||
/// <param name="newValue">新的值</param>
|
||||
/// <param name="includeFields">包含的属性</param>
|
||||
/// <param name="excludeFields">排除的属性</param>
|
||||
/// <param name="whereExp">查询表达式</param>
|
||||
/// <param name="whereSql">查询sql</param>
|
||||
/// <param name="ignoreVersion">是否忽略版本锁</param>
|
||||
/// <returns>更新后的实体列表</returns>
|
||||
protected Task<List<TEntity>> UpdateReturnListAsync( //
|
||||
TEntity newValue //
|
||||
, IEnumerable<string> includeFields //
|
||||
, string[] excludeFields = null //
|
||||
, Expression<Func<TEntity, bool>> whereExp = null //
|
||||
, string whereSql = null //
|
||||
, bool ignoreVersion = false)
|
||||
{
|
||||
// 默认匹配主键
|
||||
whereExp ??= a => a.Id.Equals(newValue.Id);
|
||||
return BuildUpdate(newValue, includeFields, excludeFields, ignoreVersion).Where(whereExp).Where(whereSql).ExecuteUpdatedAsync();
|
||||
}
|
||||
#endif
|
||||
|
||||
private static async Task<IActionResult> GetExportFileStreamAsync<TExport>(string fileName, object list)
|
||||
{
|
||||
var listTyped = list.Adapt<List<TExport>>();
|
||||
var stream = new MemoryStream();
|
||||
var writer = new StreamWriter(stream);
|
||||
var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
|
||||
csv.WriteHeader<TExport>();
|
||||
await csv.NextRecordAsync().ConfigureAwait(false);
|
||||
|
||||
foreach (var item in listTyped) {
|
||||
csv.WriteRecord(item);
|
||||
await csv.NextRecordAsync().ConfigureAwait(false);
|
||||
}
|
||||
|
||||
await csv.FlushAsync().ConfigureAwait(false);
|
||||
_ = stream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
App.HttpContext.Response.Headers.ContentDisposition
|
||||
= new ContentDispositionHeaderValue(Chars.FLG_HTTP_HEADER_VALUE_ATTACHMENT) {
|
||||
FileNameStar
|
||||
= $"{fileName}_{DateTime.Now:yyyy.MM.dd-HH.mm.ss}.csv"
|
||||
}.ToString();
|
||||
|
||||
return new FileStreamResult(stream, Chars.FLG_HTTP_HEADER_VALUE_APPLICATION_OCTET_STREAM);
|
||||
}
|
||||
|
||||
private IUpdate<TEntity> BuildUpdate( //
|
||||
TEntity entity //
|
||||
, IEnumerable<string> includeFields //
|
||||
, string[] excludeFields = null //
|
||||
, bool ignoreVersion = false)
|
||||
{
|
||||
var updateExp = includeFields == null
|
||||
? Rpo.UpdateDiy.SetSource(entity)
|
||||
: Rpo.UpdateDiy.SetDto(includeFields!.ToDictionary(
|
||||
x => x, x => typeof(TEntity).GetProperty(x, BindingFlags.Public | BindingFlags.Instance)!.GetValue(entity)));
|
||||
if (excludeFields != null) {
|
||||
updateExp = updateExp.IgnoreColumns(excludeFields);
|
||||
}
|
||||
|
||||
if (!ignoreVersion && entity is IFieldVersion ver) {
|
||||
updateExp = updateExp.Where($"{nameof(IFieldVersion.Version)} = @version", new { version = ver.Version });
|
||||
}
|
||||
|
||||
return updateExp;
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
using NetAdmin.Application.Modules.Tpl;
|
||||
|
||||
namespace NetAdmin.Application.Services.Tpl.Dependency;
|
||||
|
||||
/// <summary>
|
||||
/// 示例服务
|
||||
/// </summary>
|
||||
public interface IExampleService : IService, IExampleModule;
|
@ -1,16 +1,14 @@
|
||||
using NetAdmin.Application.Repositories;
|
||||
using NetAdmin.Application.Services;
|
||||
using NetAdmin.Application.Services.Tpl.Dependency;
|
||||
using NetAdmin.Domain.DbMaps.Tpl;
|
||||
using NetAdmin.Domain.Dto.Dependency;
|
||||
using NetAdmin.Domain.Dto.Tpl.Example;
|
||||
using NetAdmin.SysComponent.Application.Services.Tpl.Dependency;
|
||||
using DataType = FreeSql.DataType;
|
||||
|
||||
namespace NetAdmin.SysComponent.Application.Services.Tpl;
|
||||
namespace NetAdmin.Application.Services.Tpl;
|
||||
|
||||
/// <inheritdoc cref="IExampleService" />
|
||||
public sealed class ExampleService(DefaultRepository<Tpl_Example> rpo) //
|
||||
: RepositoryService<Tpl_Example, IExampleService>(rpo), IExampleService
|
||||
public sealed class ExampleService(BasicRepository<Tpl_Example, long> rpo) //
|
||||
: RepositoryService<Tpl_Example, long, IExampleService>(rpo), IExampleService
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public async Task<int> BulkDeleteAsync(BulkReq<DelReq> req)
|
||||
@ -30,7 +28,11 @@ public sealed class ExampleService(DefaultRepository<Tpl_Example> rpo) //
|
||||
public Task<long> CountAsync(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
return QueryInternal(req).CountAsync();
|
||||
return QueryInternal(req)
|
||||
#if DBTYPE_SQLSERVER
|
||||
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
|
||||
#endif
|
||||
.CountAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@ -52,16 +54,25 @@ public sealed class ExampleService(DefaultRepository<Tpl_Example> rpo) //
|
||||
public Task<bool> ExistAsync(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
return QueryInternal(req).AnyAsync();
|
||||
return QueryInternal(req)
|
||||
#if DBTYPE_SQLSERVER
|
||||
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
|
||||
#endif
|
||||
.AnyAsync();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IActionResult> ExportAsync(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
return ExportAsync<QueryExampleReq, QueryExampleRsp>(QueryInternal, req, Ln.示例导出);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<QueryExampleRsp> GetAsync(QueryExampleReq req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
var ret = await QueryInternal(new QueryReq<QueryExampleReq> { Filter = req })
|
||||
.ToOneAsync()
|
||||
.ConfigureAwait(false);
|
||||
var ret = await QueryInternal(new QueryReq<QueryExampleReq> { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false);
|
||||
return ret.Adapt<QueryExampleRsp>();
|
||||
}
|
||||
|
||||
@ -71,45 +82,35 @@ public sealed class ExampleService(DefaultRepository<Tpl_Example> rpo) //
|
||||
req.ThrowIfInvalid();
|
||||
var list = await QueryInternal(req)
|
||||
.Page(req.Page, req.PageSize)
|
||||
#if DBTYPE_SQLSERVER
|
||||
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
|
||||
#endif
|
||||
.Count(out var total)
|
||||
.ToListAsync()
|
||||
.ConfigureAwait(false);
|
||||
|
||||
return new PagedQueryRsp<QueryExampleRsp>(req.Page, req.PageSize, total
|
||||
, list.Adapt<IEnumerable<QueryExampleRsp>>());
|
||||
return new PagedQueryRsp<QueryExampleRsp>(req.Page, req.PageSize, total, list.Adapt<IEnumerable<QueryExampleRsp>>());
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<IEnumerable<QueryExampleRsp>> QueryAsync(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
var ret = await QueryInternal(req).Take(req.Count).ToListAsync().ConfigureAwait(false);
|
||||
var ret = await QueryInternal(req)
|
||||
#if DBTYPE_SQLSERVER
|
||||
.WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait)
|
||||
#endif
|
||||
.Take(req.Count)
|
||||
.ToListAsync()
|
||||
.ConfigureAwait(false);
|
||||
return ret.Adapt<IEnumerable<QueryExampleRsp>>();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task<QueryExampleRsp> UpdateAsync(UpdateExampleReq req)
|
||||
{
|
||||
req.ThrowIfInvalid();
|
||||
if (Rpo.Orm.Ado.DataType == DataType.Sqlite) {
|
||||
return await UpdateForSqliteAsync(req).ConfigureAwait(false) as QueryExampleRsp;
|
||||
}
|
||||
|
||||
var ret = await Rpo.UpdateDiy.SetSource(req).ExecuteUpdatedAsync().ConfigureAwait(false);
|
||||
return ret.FirstOrDefault()?.Adapt<QueryExampleRsp>();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override async Task<Tpl_Example> UpdateForSqliteAsync(Tpl_Example req)
|
||||
{
|
||||
return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync().ConfigureAwait(false) <= 0
|
||||
? null
|
||||
: await GetAsync(new QueryExampleReq { Id = req.Id }).ConfigureAwait(false);
|
||||
}
|
||||
|
||||
private ISelect<Tpl_Example> QueryInternal(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
|
||||
|
||||
// ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault
|
||||
switch (req.Order) {
|
||||
case Orders.None:
|
||||
return ret;
|
@ -5,8 +5,7 @@ namespace NetAdmin.Cache;
|
||||
/// <summary>
|
||||
/// 缓存基类
|
||||
/// </summary>
|
||||
public abstract class CacheBase<TCacheContainer, TService>(TCacheContainer cache, TService service)
|
||||
: ICache<TCacheContainer, TService>
|
||||
public abstract class CacheBase<TCacheContainer, TService>(TCacheContainer cache, TService service) : ICache<TCacheContainer, TService>
|
||||
where TService : IService
|
||||
{
|
||||
/// <inheritdoc />
|
||||
|
@ -6,8 +6,7 @@ namespace NetAdmin.Cache;
|
||||
/// <summary>
|
||||
/// 分布式缓存
|
||||
/// </summary>
|
||||
public abstract class DistributedCache<TService>(IDistributedCache cache, TService service)
|
||||
: CacheBase<IDistributedCache, TService>(cache, service)
|
||||
public abstract class DistributedCache<TService>(IDistributedCache cache, TService service) : CacheBase<IDistributedCache, TService>(cache, service)
|
||||
where TService : IService
|
||||
{
|
||||
/// <summary>
|
||||
@ -66,11 +65,10 @@ public abstract class DistributedCache<TService>(IDistributedCache cache, TServi
|
||||
/// <param name="slideLifeTime">滑动过期时间</param>
|
||||
/// <typeparam name="T">缓存对象类型</typeparam>
|
||||
/// <returns>缓存对象</returns>
|
||||
protected async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> createProc, TimeSpan? absLifeTime = null
|
||||
, TimeSpan? slideLifeTime = null)
|
||||
protected async Task<T> GetOrCreateAsync<T>(string key, Func<Task<T>> createProc, TimeSpan? absLifeTime = null, TimeSpan? slideLifeTime = null)
|
||||
{
|
||||
var cacheRead = await GetAsync<T>(key).ConfigureAwait(false);
|
||||
if (cacheRead is not null) {
|
||||
if (cacheRead is not null && App.HttpContext?.Request.Headers.CacheControl.FirstOrDefault() != Chars.FLG_HTTP_HEADER_VALUE_NO_CACHE) {
|
||||
return cacheRead;
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,5 @@ namespace NetAdmin.Cache;
|
||||
/// <summary>
|
||||
/// 内存缓存
|
||||
/// </summary>
|
||||
public abstract class MemoryCache<TService>(IMemoryCache cache, TService service)
|
||||
: CacheBase<IMemoryCache, TService>(cache, service)
|
||||
public abstract class MemoryCache<TService>(IMemoryCache cache, TService service) : CacheBase<IMemoryCache, TService>(cache, service)
|
||||
where TService : IService;
|
@ -0,0 +1,9 @@
|
||||
using NetAdmin.Application.Modules.Tpl;
|
||||
using NetAdmin.Application.Services.Tpl.Dependency;
|
||||
|
||||
namespace NetAdmin.Cache.Tpl.Dependency;
|
||||
|
||||
/// <summary>
|
||||
/// 示例缓存
|
||||
/// </summary>
|
||||
public interface IExampleCache : ICache<IDistributedCache, IExampleService>, IExampleModule;
|
@ -1,10 +1,9 @@
|
||||
using NetAdmin.Cache;
|
||||
using NetAdmin.Application.Services.Tpl.Dependency;
|
||||
using NetAdmin.Cache.Tpl.Dependency;
|
||||
using NetAdmin.Domain.Dto.Dependency;
|
||||
using NetAdmin.Domain.Dto.Tpl.Example;
|
||||
using NetAdmin.SysComponent.Application.Services.Tpl.Dependency;
|
||||
using NetAdmin.SysComponent.Cache.Tpl.Dependency;
|
||||
|
||||
namespace NetAdmin.SysComponent.Cache.Tpl;
|
||||
namespace NetAdmin.Cache.Tpl;
|
||||
|
||||
/// <inheritdoc cref="IExampleCache" />
|
||||
public sealed class ExampleCache(IDistributedCache cache, IExampleService service)
|
||||
@ -40,6 +39,12 @@ public sealed class ExampleCache(IDistributedCache cache, IExampleService servic
|
||||
return Service.ExistAsync(req);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<IActionResult> ExportAsync(QueryReq<QueryExampleReq> req)
|
||||
{
|
||||
return Service.ExportAsync(req);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryExampleRsp> GetAsync(QueryExampleReq req)
|
||||
{
|
||||
@ -57,10 +62,4 @@ public sealed class ExampleCache(IDistributedCache cache, IExampleService servic
|
||||
{
|
||||
return Service.QueryAsync(req);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public Task<QueryExampleRsp> UpdateAsync(UpdateExampleReq req)
|
||||
{
|
||||
return Service.UpdateAsync(req);
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
namespace NetAdmin.Domain.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// 危险字段标记
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Property)]
|
||||
public sealed class DangerFieldAttribute : Attribute;
|
@ -0,0 +1,14 @@
|
||||
namespace NetAdmin.Domain.Attributes.DataValidation;
|
||||
|
||||
/// <summary>
|
||||
/// JSON文本验证器
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)]
|
||||
public sealed class JsonStringAttribute : ValidationAttribute
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
|
||||
{
|
||||
return (value as string).IsJsonString() ? ValidationResult.Success : new ValidationResult(Ln.非JSON字符串, [validationContext.MemberName]);
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
namespace NetAdmin.Domain.Attributes.DataValidation;
|
||||
|
||||
/// <summary>
|
||||
/// 手机号验证器
|
||||
/// 手机号码验证器
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)]
|
||||
public sealed class MobileAttribute : RegexAttribute
|
||||
|
@ -10,7 +10,7 @@ public sealed class PortAttribute : RangeAttribute
|
||||
/// Initializes a new instance of the <see cref="PortAttribute" /> class.
|
||||
/// </summary>
|
||||
public PortAttribute() //
|
||||
: base(1, 65535)
|
||||
: base(1, ushort.MaxValue)
|
||||
{
|
||||
ErrorMessageResourceName = nameof(Ln.无效端口号);
|
||||
ErrorMessageResourceType = typeof(Ln);
|
||||
|
@ -27,8 +27,8 @@ public sealed class UserNameAttribute : RegexAttribute
|
||||
return true;
|
||||
}
|
||||
|
||||
// 不能是手机号
|
||||
ErrorMessageResourceName = nameof(Ln.用户名不能是手机号);
|
||||
// 不能是手机号码
|
||||
ErrorMessageResourceName = nameof(Ln.用户名不能是手机号码);
|
||||
return false;
|
||||
}
|
||||
}
|
14
src/backend/NetAdmin.Domain/Attributes/IndicatorAttribute.cs
Normal file
14
src/backend/NetAdmin.Domain/Attributes/IndicatorAttribute.cs
Normal file
@ -0,0 +1,14 @@
|
||||
namespace NetAdmin.Domain.Attributes;
|
||||
|
||||
/// <summary>
|
||||
/// 标记一个枚举的状态指示
|
||||
/// </summary>
|
||||
/// <inheritdoc />
|
||||
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)]
|
||||
public sealed class IndicatorAttribute(string indicate) : Attribute
|
||||
{
|
||||
/// <summary>
|
||||
/// 状态指示
|
||||
/// </summary>
|
||||
public string Indicate { get; } = indicate;
|
||||
}
|
@ -1,5 +1,3 @@
|
||||
using NetAdmin.Domain.Dto.Sys.User;
|
||||
|
||||
namespace NetAdmin.Domain.Contexts;
|
||||
|
||||
/// <summary>
|
||||
@ -7,6 +5,12 @@ namespace NetAdmin.Domain.Contexts;
|
||||
/// </summary>
|
||||
public sealed record ContextUserToken : DataAbstraction
|
||||
{
|
||||
/// <summary>
|
||||
/// 部门编号
|
||||
/// </summary>
|
||||
/// ReSharper disable once MemberCanBePrivate.Global
|
||||
public long DeptId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 用户编号
|
||||
/// </summary>
|
||||
@ -37,8 +41,18 @@ public sealed record ContextUserToken : DataAbstraction
|
||||
/// <summary>
|
||||
/// 从 QueryUserRsp 创建上下文用户
|
||||
/// </summary>
|
||||
public static ContextUserToken Create(QueryUserRsp user)
|
||||
public static ContextUserToken Create(long id, Guid token, string userName, long deptId)
|
||||
{
|
||||
return new ContextUserToken { Id = user.Id, Token = user.Token, UserName = user.UserName };
|
||||
return new ContextUserToken { Id = id, Token = token, UserName = userName, DeptId = deptId };
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从 Json Web Token 创建上下文用户
|
||||
/// </summary>
|
||||
public static ContextUserToken Create(string jwt)
|
||||
{
|
||||
var claim = JWTEncryption.ReadJwtToken(jwt.TrimPrefix($"{Chars.FLG_HTTP_HEADER_VALUE_AUTH_SCHEMA} "))
|
||||
?.Claims.FirstOrDefault(x => x.Type == nameof(ContextUserToken));
|
||||
return claim?.Value.ToObject<ContextUserToken>();
|
||||
}
|
||||
}
|
@ -30,9 +30,7 @@ public abstract record DataAbstraction
|
||||
/// </summary>
|
||||
public void TruncateStrings()
|
||||
{
|
||||
foreach (var property in GetType()
|
||||
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
|
||||
.Where(x => x.PropertyType == typeof(string))) {
|
||||
foreach (var property in GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType == typeof(string))) {
|
||||
var maxLen = property.GetCustomAttribute<MaxLengthAttribute>(true)?.Length;
|
||||
if (maxLen is null or 0) {
|
||||
continue;
|
||||
|
@ -3,4 +3,11 @@ namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
/// <summary>
|
||||
/// 数据库实体基类
|
||||
/// </summary>
|
||||
public abstract record EntityBase : DataAbstraction;
|
||||
public abstract record EntityBase<T> : DataAbstraction
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
public virtual T Id { get; init; }
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者客户端字段接口
|
||||
/// </summary>
|
||||
public interface IFieldCreatedClient
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建者客户端IP
|
||||
/// </summary>
|
||||
int? CreatedClientIp { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建者来源地址
|
||||
/// </summary>
|
||||
string CreatedReferer { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建者客户端用户代理
|
||||
/// </summary>
|
||||
string CreatedUserAgent { get; init; }
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者客户端IP字段接口
|
||||
/// </summary>
|
||||
public interface IFieldCreatedClientIp
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建者客户端IP
|
||||
/// </summary>
|
||||
int? CreatedClientIp { get; init; }
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 创建者客户端用户代理字段接口
|
||||
/// </summary>
|
||||
public interface IFieldCreatedClientUserAgent
|
||||
{
|
||||
/// <summary>
|
||||
/// 创建者客户端用户代理
|
||||
/// </summary>
|
||||
string CreatedUserAgent { get; init; }
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 修改客户端IP字段接口
|
||||
/// </summary>
|
||||
public interface IFieldModifiedClientIp
|
||||
{
|
||||
/// <summary>
|
||||
/// 客户端IP
|
||||
/// </summary>
|
||||
int ModifiedClientIp { get; init; }
|
||||
}
|
@ -1,15 +1,10 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 修改客户端字段接口
|
||||
/// 修改客户端用户代理字段接口
|
||||
/// </summary>
|
||||
public interface IFieldModifiedClient
|
||||
public interface IFieldModifiedClientUserAgent
|
||||
{
|
||||
/// <summary>
|
||||
/// 客户端IP
|
||||
/// </summary>
|
||||
int ModifiedClientIp { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 客户端用户代理
|
||||
/// </summary>
|
@ -1,7 +1,7 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 更新用户字段接口
|
||||
/// 修改用户字段接口
|
||||
/// </summary>
|
||||
public interface IFieldModifiedUser
|
||||
{
|
||||
|
@ -1,12 +0,0 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 主键字段接口
|
||||
/// </summary>
|
||||
public interface IFieldPrimary<T>
|
||||
{
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
T Id { get; init; }
|
||||
}
|
@ -1,12 +1,12 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
/// <summary>
|
||||
/// 描述字段接口
|
||||
/// 备注字段接口
|
||||
/// </summary>
|
||||
public interface IFieldSummary
|
||||
{
|
||||
/// <summary>
|
||||
/// 描述
|
||||
/// 备注
|
||||
/// </summary>
|
||||
string Summary { get; init; }
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record ImmutableEntity : ImmutableEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -17,18 +17,28 @@ public abstract record ImmutableEntity : ImmutableEntity<long>
|
||||
/// </summary>
|
||||
/// <typeparam name="T">主键类型</typeparam>
|
||||
public abstract record ImmutableEntity<T> : LiteImmutableEntity<T>, IFieldCreatedUser
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldCreatedUser.CreatedUserId" />
|
||||
/// <summary>
|
||||
/// 创建者编号
|
||||
/// </summary>
|
||||
[Column(CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public long? CreatedUserId { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldCreatedUser.CreatedUserName" />
|
||||
/// <summary>
|
||||
/// 创建者用户名
|
||||
/// </summary>
|
||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual string CreatedUserName { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
public override T Id { get; init; }
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record LiteImmutableEntity : LiteImmutableEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -16,15 +16,22 @@ public abstract record LiteImmutableEntity : LiteImmutableEntity<long>
|
||||
/// 轻型不可变实体
|
||||
/// </summary>
|
||||
/// <typeparam name="T">主键类型</typeparam>
|
||||
public abstract record LiteImmutableEntity<T> : EntityBase, IFieldPrimary<T>, IFieldCreatedTime
|
||||
public abstract record LiteImmutableEntity<T> : EntityBase<T>, IFieldCreatedTime
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldCreatedTime.CreatedTime" />
|
||||
/// <summary>
|
||||
/// 创建时间
|
||||
/// </summary>
|
||||
[Column(ServerTime = DateTimeKind.Local, CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual DateTime CreatedTime { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual T Id { get; init; }
|
||||
public override T Id { get; init; }
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record LiteMutableEntity : LiteMutableEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -16,13 +16,20 @@ public abstract record LiteMutableEntity : LiteMutableEntity<long>
|
||||
/// 轻型可变实体
|
||||
/// </summary>
|
||||
public abstract record LiteMutableEntity<T> : LiteImmutableEntity<T>, IFieldModifiedTime
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
public override T Id { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldModifiedTime.ModifiedTime" />
|
||||
/// <summary>
|
||||
/// 修改时间
|
||||
/// </summary>
|
||||
[Column(ServerTime = DateTimeKind.Local, CanInsert = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual DateTime? ModifiedTime { get; init; }
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record LiteVersionEntity : LiteVersionEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -16,13 +16,21 @@ public abstract record LiteVersionEntity : LiteVersionEntity<long>
|
||||
/// 乐观锁轻型可变实体
|
||||
/// </summary>
|
||||
public abstract record LiteVersionEntity<T> : LiteMutableEntity<T>, IFieldVersion
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override T Id { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldVersion.Version" />
|
||||
/// <summary>
|
||||
/// 数据版本
|
||||
/// </summary>
|
||||
[Column(IsVersion = true, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual long Version { get; init; }
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record MutableEntity : MutableEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -15,19 +15,45 @@ public abstract record MutableEntity : MutableEntity<long>
|
||||
/// <summary>
|
||||
/// 可变实体
|
||||
/// </summary>
|
||||
public abstract record MutableEntity<T> : LiteMutableEntity<T>, IFieldModifiedUser
|
||||
public abstract record MutableEntity<T> : LiteMutableEntity<T>, IFieldCreatedUser, IFieldModifiedUser
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 创建者编号
|
||||
/// </summary>
|
||||
[Column(CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual long? CreatedUserId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 创建者用户名
|
||||
/// </summary>
|
||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual string CreatedUserName { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
public override T Id { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserId" />
|
||||
/// <summary>
|
||||
/// 修改者编号
|
||||
/// </summary>
|
||||
[Column(CanInsert = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public long? ModifiedUserId { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserName" />
|
||||
/// <summary>
|
||||
/// 修改者用户名
|
||||
/// </summary>
|
||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public string ModifiedUserName { get; init; }
|
||||
}
|
@ -1,6 +1,19 @@
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record SimpleEntity : SimpleEntity<long>
|
||||
{
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 简单实体
|
||||
/// </summary>
|
||||
public abstract record SimpleEntity : EntityBase;
|
||||
public abstract record SimpleEntity<T> : EntityBase<T>
|
||||
where T : IEquatable<T>;
|
@ -1,13 +1,13 @@
|
||||
using NetAdmin.Domain.Attributes;
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
/// <inheritdoc />
|
||||
public abstract record VersionEntity : VersionEntity<long>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
[Snowflake]
|
||||
public override long Id { get; init; }
|
||||
}
|
||||
@ -16,28 +16,44 @@ public abstract record VersionEntity : VersionEntity<long>
|
||||
/// 乐观锁可变实体
|
||||
/// </summary>
|
||||
public abstract record VersionEntity<T> : LiteVersionEntity<T>, IFieldModifiedUser, IFieldCreatedUser
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// 创建者编号
|
||||
/// </summary>
|
||||
[Column(CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual long? CreatedUserId { get; init; }
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// 创建者用户名
|
||||
/// </summary>
|
||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual string CreatedUserName { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
/// <summary>
|
||||
/// 唯一编码
|
||||
/// </summary>
|
||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
||||
[CsvIgnore]
|
||||
public override T Id { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserId" />
|
||||
/// <summary>
|
||||
/// 修改者编号
|
||||
/// </summary>
|
||||
[Column(CanInsert = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual long? ModifiedUserId { get; init; }
|
||||
|
||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserName" />
|
||||
/// <summary>
|
||||
/// 修改者用户名
|
||||
/// </summary>
|
||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)]
|
||||
[CsvIgnore]
|
||||
[JsonIgnore]
|
||||
public virtual string ModifiedUserName { get; init; }
|
||||
}
|
@ -1,5 +1,3 @@
|
||||
using NetAdmin.Domain.DbMaps.Dependency;
|
||||
|
||||
namespace NetAdmin.Domain.DbMaps.Tpl;
|
||||
|
||||
/// <summary>
|
||||
|
@ -1,5 +1,3 @@
|
||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
||||
|
||||
namespace NetAdmin.Domain.Dto.Dependency;
|
||||
|
||||
/// <inheritdoc cref="DelReq{T}" />
|
||||
@ -8,8 +6,9 @@ public sealed record DelReq : DelReq<long>;
|
||||
/// <summary>
|
||||
/// 请求:通过编号删除
|
||||
/// </summary>
|
||||
public record DelReq<T> : DataAbstraction, IFieldPrimary<T>
|
||||
public record DelReq<T> : EntityBase<T>
|
||||
where T : IEquatable<T>
|
||||
{
|
||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
||||
public T Id { get; init; }
|
||||
/// <inheritdoc cref="EntityBase{T}.Id" />
|
||||
public override T Id { get; init; }
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
using NetAdmin.Domain.Enums;
|
||||
|
||||
namespace NetAdmin.Domain.Dto.Dependency;
|
||||
|
||||
/// <summary>
|
||||
/// 动态过滤条件
|
||||
/// </summary>
|
||||
public sealed record DynamicFilterInfo : DataAbstraction
|
||||
{
|
||||
/// <summary>
|
||||
/// 字段名
|
||||
/// </summary>
|
||||
public string Field { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 子过滤条件
|
||||
/// </summary>
|
||||
public List<DynamicFilterInfo> Filters { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 子过滤条件逻辑关系
|
||||
/// </summary>
|
||||
public DynamicFilterLogics Logic { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 操作符
|
||||
/// </summary>
|
||||
public DynamicFilterOperators Operator { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 值
|
||||
/// </summary>
|
||||
public object Value { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 隐式转换为 FreeSql 的 DynamicFilterInfo 对象
|
||||
/// </summary>
|
||||
public static implicit operator FreeSql.Internal.Model.DynamicFilterInfo(DynamicFilterInfo d)
|
||||
{
|
||||
return d.Adapt<FreeSql.Internal.Model.DynamicFilterInfo>();
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user