mirror of
https://github.com/nsnail/NetAdmin.git
synced 2025-08-03 02:18:00 +08:00
Compare commits
92 Commits
Author | SHA1 | Date | |
---|---|---|---|
661640d441 | |||
440c7ffcb9 | |||
e8b568426b | |||
37b45c9f36 | |||
7ed30406c9 | |||
71bfdaafa8 | |||
cec96390a5 | |||
0e412db6ce | |||
4d857f1861 | |||
d74a7e13ef | |||
2f16efd291 | |||
81d9b0b3bb | |||
ef2f0de095 | |||
6d87d8e9cd | |||
69dc407002 | |||
6c71c74a27 | |||
4e9f605ea2 | |||
d28d7e9a18 | |||
a6018edb87 | |||
841a4195e7 | |||
5e9b67bca8 | |||
76e5fdcd94 | |||
c68f695555 | |||
587b22014d | |||
2f300285aa | |||
1743f4ff28 | |||
7fc5fca5d9 | |||
d8dbb28cfc | |||
27aafacd54 | |||
e6ce5afd99 | |||
d1503a859b | |||
26e3698f57 | |||
3069b8fbc4 | |||
4d63bd6bf5 | |||
f00046265a | |||
0848c8b7e5 | |||
8479f69bdc | |||
a454f2ab2d | |||
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 |
@ -10,6 +10,7 @@ ij_xml_text_wrap = off # IntelliJ IDEA 中 XML 文本不换行
|
|||||||
indent_size = 4 # 缩进大小为 4 个空格
|
indent_size = 4 # 缩进大小为 4 个空格
|
||||||
indent_style = space # 使用空格进行缩进
|
indent_style = space # 使用空格进行缩进
|
||||||
insert_final_newline = false # 不在文件末尾插入空行
|
insert_final_newline = false # 不在文件末尾插入空行
|
||||||
|
max_line_length = 150 # 行长度限制为 150 个字符
|
||||||
trim_trailing_whitespace = true # 删除行尾的空格
|
trim_trailing_whitespace = true # 删除行尾的空格
|
||||||
|
|
||||||
[{*.json,*.yml}]
|
[{*.json,*.yml}]
|
||||||
|
1
.github/workflows/README.md
vendored
Normal file
1
.github/workflows/README.md
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
github workflows
|
6
.github/workflows/nightly-build.yml
vendored
6
.github/workflows/nightly-build.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [ 20.x ]
|
node-version: [ 22.x ]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -37,8 +37,8 @@ jobs:
|
|||||||
path: ~/.nuget/packages
|
path: ~/.nuget/packages
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||||
restore-keys: ${{ runner.os }}-nuget
|
restore-keys: ${{ runner.os }}-nuget
|
||||||
- working-directory: ./src/backend/NetAdmin.AdmServer.Host
|
- working-directory: ./src/backend/YourSolution.AdmServer.Host
|
||||||
run: dotnet publish NetAdmin.AdmServer.Host.csproj -c Release
|
run: dotnet publish YourSolution.AdmServer.Host.csproj -c Release
|
||||||
- run: docker build -t nsnail/netadmin:nightly .
|
- run: docker build -t nsnail/netadmin:nightly .
|
||||||
- uses: docker/login-action@v3
|
- uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
|
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
@ -12,7 +12,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [ 20.x ]
|
node-version: [ 22.x ]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
@ -37,8 +37,8 @@ jobs:
|
|||||||
path: ~/.nuget/packages
|
path: ~/.nuget/packages
|
||||||
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj') }}
|
||||||
restore-keys: ${{ runner.os }}-nuget
|
restore-keys: ${{ runner.os }}-nuget
|
||||||
- working-directory: ./src/backend/NetAdmin.AdmServer.Host
|
- working-directory: ./src/backend/YourSolution.AdmServer.Host
|
||||||
run: dotnet publish NetAdmin.AdmServer.Host.csproj -c Release
|
run: dotnet publish YourSolution.AdmServer.Host.csproj -c Release
|
||||||
- uses: actions/create-release@v1
|
- uses: actions/create-release@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -402,4 +402,4 @@ FodyWeavers.xsd
|
|||||||
dist/
|
dist/
|
||||||
*.[Dd]esigner.cs
|
*.[Dd]esigner.cs
|
||||||
*.db
|
*.db
|
||||||
/assets/res/Ln.resx
|
/assets/res/Ln.resx
|
6
.gitmodules
vendored
6
.gitmodules
vendored
@ -1,6 +1,6 @@
|
|||||||
[submodule "refs/Furion"]
|
[submodule "refs/Gurion"]
|
||||||
path = refs/Furion
|
path = refs/Gurion
|
||||||
url = https://github.com/nsnail/Furion.git
|
url = https://github.com/nsnail/Gurion.git
|
||||||
[submodule "refs/ns-ext"]
|
[submodule "refs/ns-ext"]
|
||||||
path = refs/ns-ext
|
path = refs/ns-ext
|
||||||
url = https://github.com/nsnail/ns-ext.git
|
url = https://github.com/nsnail/ns-ext.git
|
||||||
|
103
CHANGELOG.md
103
CHANGELOG.md
@ -2,6 +2,109 @@
|
|||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
|
## [2.2.0](https://github.com/nsnail/NetAdmin/compare/v2.1.0...v2.2.0) (2024-11-27)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* ✨ 菜单复制 ([#214](https://github.com/nsnail/NetAdmin/issues/214)) ([81d9b0b](https://github.com/nsnail/NetAdmin/commit/81d9b0b3bb280661ceffa61aa6e9d612fb7ec52c))
|
||||||
|
* ✨ 文档管理 ([#221](https://github.com/nsnail/NetAdmin/issues/221)) ([7ed3040](https://github.com/nsnail/NetAdmin/commit/7ed30406c9f721a12f0b756ec8884a1882242b93))
|
||||||
|
* ✨ select-filter badge icon ([#217](https://github.com/nsnail/NetAdmin/issues/217)) ([4d857f1](https://github.com/nsnail/NetAdmin/commit/4d857f1861b1256980e7cc59e2ab6a5f7d966da2))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 导出界面报错 ([#213](https://github.com/nsnail/NetAdmin/issues/213)) ([ef2f0de](https://github.com/nsnail/NetAdmin/commit/ef2f0de095e314f34bec21c0a2ccdb51423a163b))
|
||||||
|
* 🐛 导出文件的responseType ([#205](https://github.com/nsnail/NetAdmin/issues/205)) ([841a419](https://github.com/nsnail/NetAdmin/commit/841a4195e77aa96e3c6c72626c1add3f71a310aa))
|
||||||
|
* 🐛 请求日志批量插入,漏写了登录日志 ([#210](https://github.com/nsnail/NetAdmin/issues/210)) ([6c71c74](https://github.com/nsnail/NetAdmin/commit/6c71c74a27617c7d0530a5f6eaff650ecfd4eaec))
|
||||||
|
* 🐛 用户选择器报错 ([#220](https://github.com/nsnail/NetAdmin/issues/220)) ([71bfdaa](https://github.com/nsnail/NetAdmin/commit/71bfdaafa8176cf686b03244ee758de058080a71))
|
||||||
|
* 🐛 idd ([#208](https://github.com/nsnail/NetAdmin/issues/208)) ([4e9f605](https://github.com/nsnail/NetAdmin/commit/4e9f605ea2cc6fe394068cfea5638e51920b9096))
|
||||||
|
|
||||||
|
## [2.1.0](https://github.com/nsnail/NetAdmin/compare/v2.0.0...v2.1.0) (2024-11-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* ✨ 首页仪表板自定义布局 ([#201](https://github.com/nsnail/NetAdmin/issues/201)) ([2f30028](https://github.com/nsnail/NetAdmin/commit/2f300285aa2afbfaea1fd9ffe299cc2badf98e0f))
|
||||||
|
* ✨ 用户选择器 ([#189](https://github.com/nsnail/NetAdmin/issues/189)) ([8479f69](https://github.com/nsnail/NetAdmin/commit/8479f69bdccac93a497e039dd01e18333ec2bbdc))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 🐛 --el-color-primary 变量有闪烁现象 ([#194](https://github.com/nsnail/NetAdmin/issues/194)) ([26e3698](https://github.com/nsnail/NetAdmin/commit/26e3698f57a2986f3b727fa38f293ca40c89f3ab))
|
||||||
|
* 🐛 404 ([#198](https://github.com/nsnail/NetAdmin/issues/198)) ([d8dbb28](https://github.com/nsnail/NetAdmin/commit/d8dbb28cfc8ad427062eb8d81be67cc25ded6fb6))
|
||||||
|
* 🐛 module name ([#193](https://github.com/nsnail/NetAdmin/issues/193)) ([3069b8f](https://github.com/nsnail/NetAdmin/commit/3069b8fbc451c4c257becf0523ab6ea6cc9af7e2))
|
||||||
|
|
||||||
|
## [2.0.0](https://github.com/nsnail/NetAdmin/compare/v1.6.0...v2.0.0) (2024-11-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* ✨ 查询过滤器保存 ([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
|
||||||
|
|
||||||
|
* 🐛 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)
|
## [1.2.0](https://github.com/nsnail/NetAdmin/compare/v1.1.1...v1.2.0) (2024-06-06)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<!-- 注意此文件名大小写不可变更 -->
|
<!-- 注意此文件名大小写不可变更 -->
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
<DefineConstants>DBTYPE_SQLITE</DefineConstants>
|
||||||
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
|
<SolutionDir>$(MSBuildThisFileDirectory)</SolutionDir>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(SolutionDir)/build/minver.targets" />
|
<Import Project="$(SolutionDir)/build/minver.targets" />
|
||||||
@ -25,12 +26,12 @@
|
|||||||
<Title>$(AssemblyName)</Title>
|
<Title>$(AssemblyName)</Title>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MinVer" Version="5.0.0">
|
<PackageReference Include="MinVer" Version="6.0.0">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="../GlobalUsings.cs" Link="GlobalUsings.cs" />
|
<Compile Include="$(SolutionDir)/src/backend/GlobalUsings.cs" Link="GlobalUsings.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
@ -1,7 +1,7 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0.0-preview.4 AS base
|
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
RUN apt update
|
RUN apt update
|
||||||
RUN apt install -y redis
|
RUN apt install -y redis
|
||||||
COPY ./dist/backend/NetAdmin.AdmServer.Host/bin/Release/net9.0/publish .
|
COPY ./dist/backend/YourSolution.AdmServer.Host/bin/Release/net9.0/publish .
|
||||||
ENTRYPOINT redis-server --daemonize yes && dotnet NetAdmin.AdmServer.Host.dll -is
|
ENTRYPOINT redis-server --daemonize yes && dotnet YourSolution.AdmServer.Host.dll -is
|
82
NetAdmin.sln
82
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
|
1.git.pull.request.ps1 = scripts/1.git.pull.request.ps1
|
||||||
2.git.release.ps1 = scripts/2.git.release.ps1
|
2.git.release.ps1 = scripts/2.git.release.ps1
|
||||||
3.git.recreate.branch.ps1 = scripts/3.git.recreate.branch.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
|
clean.ln.csx = scripts/clean.ln.csx
|
||||||
code.clean.csx = scripts/code.clean.csx
|
code.clean.csx = scripts/code.clean.csx
|
||||||
code.clean.ps1 = scripts/code.clean.ps1
|
code.clean.ps1 = scripts/code.clean.ps1
|
||||||
@ -43,11 +44,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "scripts", "scripts", "{BB0B
|
|||||||
install.as.tpl.ps1 = scripts/install.as.tpl.ps1
|
install.as.tpl.ps1 = scripts/install.as.tpl.ps1
|
||||||
rename.csx = scripts/rename.csx
|
rename.csx = scripts/rename.csx
|
||||||
resharper.full.ps1 = scripts/resharper.full.ps1
|
resharper.full.ps1 = scripts/resharper.full.ps1
|
||||||
switcher.freesql.json = scripts/switcher.freesql.json
|
switch.nuget.or.project.csx = scripts/switch.nuget.or.project.csx
|
||||||
switcher.furion.json = scripts/switcher.furion.json
|
|
||||||
switcher.nsext.json = scripts/switcher.nsext.json
|
|
||||||
switcher.ps1 = scripts/switcher.ps1
|
|
||||||
sync.sln.files.csx = scripts/sync.sln.files.csx
|
sync.sln.files.csx = scripts/sync.sln.files.csx
|
||||||
|
wait.server.stop.sh = scripts/wait.server.stop.sh
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1129FE25-466B-4F4F-85FC-3752664245E1}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1129FE25-466B-4F4F-85FC-3752664245E1}"
|
||||||
@ -55,6 +54,7 @@ EndProject
|
|||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{3C6F049E-3EE8-4D66-9AFF-E8A369032487}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{3C6F049E-3EE8-4D66-9AFF-E8A369032487}"
|
||||||
ProjectSection(SolutionItems) = preProject
|
ProjectSection(SolutionItems) = preProject
|
||||||
nightly-build.yml = .github/workflows/nightly-build.yml
|
nightly-build.yml = .github/workflows/nightly-build.yml
|
||||||
|
README.md = .github/workflows/README.md
|
||||||
release.yml = .github/workflows/release.yml
|
release.yml = .github/workflows/release.yml
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
@ -67,29 +67,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{8E4C93BA
|
|||||||
stylecop.analyzers.ruleset = build/stylecop.analyzers.ruleset
|
stylecop.analyzers.ruleset = build/stylecop.analyzers.ruleset
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Infrastructure", "src\backend\NetAdmin.Infrastructure\NetAdmin.Infrastructure.csproj", "{1E62C322-EE42-4699-A6F1-791C53EFA62D}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Infrastructure", "src\backend\NetAdmin\NetAdmin.Infrastructure\NetAdmin.Infrastructure.csproj", "{1E62C322-EE42-4699-A6F1-791C53EFA62D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Application", "src\backend\NetAdmin.AdmServer.Application\NetAdmin.AdmServer.Application.csproj", "{E38B2EB4-D7A5-4777-9236-3B348919DF23}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YourSolution.AdmServer.Application", "src\backend\YourSolution.AdmServer.Application\YourSolution.AdmServer.Application.csproj", "{E38B2EB4-D7A5-4777-9236-3B348919DF23}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Host", "src\backend\NetAdmin.AdmServer.Host\NetAdmin.AdmServer.Host.csproj", "{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YourSolution.AdmServer.Host", "src\backend\YourSolution.AdmServer.Host\YourSolution.AdmServer.Host.csproj", "{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.hosted-servers", "03.hosted-servers", "{12AE5B4B-CB1A-498E-83B8-04E201E31D86}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.hosted-servers", "03.hosted-servers", "{12AE5B4B-CB1A-498E-83B8-04E201E31D86}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Domain", "src\backend\NetAdmin.Domain\NetAdmin.Domain.csproj", "{58509C57-09FA-4E3C-BC07-78E786A2A326}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Domain", "src\backend\NetAdmin\NetAdmin.Domain\NetAdmin.Domain.csproj", "{58509C57-09FA-4E3C-BC07-78E786A2A326}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Application", "src\backend\NetAdmin.Application\NetAdmin.Application.csproj", "{70C54E1B-2083-4196-AB68-34CAF0075D82}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Application", "src\backend\NetAdmin\NetAdmin.Application\NetAdmin.Application.csproj", "{70C54E1B-2083-4196-AB68-34CAF0075D82}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Host", "src\backend\NetAdmin.Host\NetAdmin.Host.csproj", "{91839A15-D08F-4848-A301-F793412BC688}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Host", "src\backend\NetAdmin\NetAdmin.Host\NetAdmin.Host.csproj", "{91839A15-D08F-4848-A301-F793412BC688}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Cache", "src\backend\NetAdmin.Cache\NetAdmin.Cache.csproj", "{91452C22-4B57-4F16-9AF6-42C7BF830504}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Cache", "src\backend\NetAdmin\NetAdmin.Cache\NetAdmin.Cache.csproj", "{91452C22-4B57-4F16-9AF6-42C7BF830504}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.AdmServer.Cache", "src\backend\NetAdmin.AdmServer.Cache\NetAdmin.AdmServer.Cache.csproj", "{7CB632D3-3635-4F8D-AFE7-F496D37D422B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YourSolution.AdmServer.Cache", "src\backend\YourSolution.AdmServer.Cache\YourSolution.AdmServer.Cache.csproj", "{7CB632D3-3635-4F8D-AFE7-F496D37D422B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Host", "src\backend\NetAdmin.SysComponent.Host\NetAdmin.SysComponent.Host.csproj", "{C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Host", "src\backend\NetAdmin\NetAdmin.SysComponent.Host\NetAdmin.SysComponent.Host.csproj", "{C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Cache", "src\backend\NetAdmin.SysComponent.Cache\NetAdmin.SysComponent.Cache.csproj", "{19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Cache", "src\backend\NetAdmin\NetAdmin.SysComponent.Cache\NetAdmin.SysComponent.Cache.csproj", "{19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Application", "src\backend\NetAdmin.SysComponent.Application\NetAdmin.SysComponent.Application.csproj", "{34650E82-D257-46DA-BD6B-DE307113347B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Application", "src\backend\NetAdmin\NetAdmin.SysComponent.Application\NetAdmin.SysComponent.Application.csproj", "{34650E82-D257-46DA-BD6B-DE307113347B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02.components", "02.components", "{3F23258D-8299-4992-9F51-2EE9B52CF9D2}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02.components", "02.components", "{3F23258D-8299-4992-9F51-2EE9B52CF9D2}"
|
||||||
EndProject
|
EndProject
|
||||||
@ -97,10 +97,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01.frameworks", "01.framewo
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.tests", "04.tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}"
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.tests", "04.tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}"
|
||||||
EndProject
|
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
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Tests", "src\backend\NetAdmin.Tests\NetAdmin.Tests.csproj", "{00604162-C444-478B-B773-3AB23C856CA7}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTests", "src\backend\UnitTests\UnitTests.csproj", "{C7F27698-DA05-4ACD-B0D7-4791B3972002}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Tests", "src\backend\NetAdmin\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}") = "YourSolution.AdmServer.Domain", "src\backend\YourSolution.AdmServer.Domain\YourSolution.AdmServer.Domain.csproj", "{932520DF-D312-415A-A128-1117F8221D68}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YourSolution.AdmServer.Infrastructure", "src\backend\YourSolution.AdmServer.Infrastructure\YourSolution.AdmServer.Infrastructure.csproj", "{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA}"
|
||||||
|
EndProject
|
||||||
|
##Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gurion", "refs\Gurion\src\Gurion\Gurion.csproj", "{CCD098FE-4F95-4FA4-8CC0-9A6DE921FBAE}"#refs
|
||||||
|
##EndProject#refs
|
||||||
|
##Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql", "refs\FreeSql\FreeSql\FreeSql.csproj", "{3C65DA42-877D-46FF-B754-C12214302A29}"#refs
|
||||||
|
##EndProject#refs
|
||||||
|
##Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Provider.Sqlite", "refs\FreeSql\Providers\FreeSql.Provider.Sqlite\FreeSql.Provider.Sqlite.csproj", "{CF5EFA63-4631-4A64-B4F3-98A7DD532F68}"#refs
|
||||||
|
##EndProject#refs
|
||||||
|
##Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.DbContext", "refs\FreeSql\FreeSql.DbContext\FreeSql.DbContext.csproj", "{FE03DF27-EC56-48DB-81B0-F99947259A7C}"#refs
|
||||||
|
##EndProject#refs
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@ -162,6 +181,30 @@ Global
|
|||||||
{00604162-C444-478B-B773-3AB23C856CA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{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.ActiveCfg = Release|Any CPU
|
||||||
{00604162-C444-478B-B773-3AB23C856CA7}.Release|Any CPU.Build.0 = Release|Any CPU
|
{00604162-C444-478B-B773-3AB23C856CA7}.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
|
||||||
|
##{CCD098FE-4F95-4FA4-8CC0-9A6DE921FBAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
##{CCD098FE-4F95-4FA4-8CC0-9A6DE921FBAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
##{CCD098FE-4F95-4FA4-8CC0-9A6DE921FBAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
##{CCD098FE-4F95-4FA4-8CC0-9A6DE921FBAE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
##{3C65DA42-877D-46FF-B754-C12214302A29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
##{3C65DA42-877D-46FF-B754-C12214302A29}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
##{3C65DA42-877D-46FF-B754-C12214302A29}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
##{3C65DA42-877D-46FF-B754-C12214302A29}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
##{CF5EFA63-4631-4A64-B4F3-98A7DD532F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
##{CF5EFA63-4631-4A64-B4F3-98A7DD532F68}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
##{CF5EFA63-4631-4A64-B4F3-98A7DD532F68}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
##{CF5EFA63-4631-4A64-B4F3-98A7DD532F68}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
##{FE03DF27-EC56-48DB-81B0-F99947259A7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
##{FE03DF27-EC56-48DB-81B0-F99947259A7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
##{FE03DF27-EC56-48DB-81B0-F99947259A7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
##{FE03DF27-EC56-48DB-81B0-F99947259A7C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(NestedProjects) = preSolution
|
GlobalSection(NestedProjects) = preSolution
|
||||||
{4DAF9366-855F-46BB-AE4C-660C92FA0697} = {C84EB5A0-37AD-4B17-A51E-E36888C4441E}
|
{4DAF9366-855F-46BB-AE4C-660C92FA0697} = {C84EB5A0-37AD-4B17-A51E-E36888C4441E}
|
||||||
@ -178,10 +221,13 @@ Global
|
|||||||
{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||||
{89260294-80FC-49F1-8D73-AECD39AFF2B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
|
{89260294-80FC-49F1-8D73-AECD39AFF2B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
|
||||||
{C7F27698-DA05-4ACD-B0D7-4791B3972002} = {89260294-80FC-49F1-8D73-AECD39AFF2B7}
|
{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}
|
{00604162-C444-478B-B773-3AB23C856CA7} = {D9C3EF66-2757-473D-A26B-54FD08DA203F}
|
||||||
{34650E82-D257-46DA-BD6B-DE307113347B} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
{34650E82-D257-46DA-BD6B-DE307113347B} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||||
{19872A4C-3C9A-4C62-A33B-74F5B8D6F77C} = {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}
|
{C2CC1596-3BEE-43EA-A9BE-4EDE5716296C} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2}
|
||||||
|
{79409163-5006-405D-AC96-406FA0AD77B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697}
|
||||||
|
{932520DF-D312-415A-A128-1117F8221D68} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||||
|
{C3DE6F6A-D1FC-4B8E-9033-980FBEBBD2BA} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86}
|
||||||
|
{3C6F049E-3EE8-4D66-9AFF-E8A369032487} = {1129FE25-466B-4F4F-85FC-3752664245E1}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
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_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_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/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/=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/=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>
|
<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_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_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_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_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
|
||||||
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
|
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
|
||||||
|
|
||||||
|
86
README.md
86
README.md
@ -4,93 +4,103 @@
|
|||||||
|
|
||||||
[](https://github.com/nsnail/NetAdmin/actions/workflows/nightly-build.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)
|
|
||||||
[](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
|
```shell
|
||||||
docker run -p 8080:8080 nsnail/netadmin
|
docker run -p 8080:8080 nsnail/netadmin
|
||||||
|
# 需魔法上网
|
||||||
```
|
```
|
||||||
|
|
||||||
## 构建步骤
|
## 构建步骤
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
# 1. 克隆代码仓库
|
# 1. 检查 dotnet sdk 版本 >=9.0.0
|
||||||
# 下载 git https://git-scm.com/downloads
|
dotnet --list-sdks
|
||||||
|
# 下载 dotnet:https://dotnet.microsoft.com/zh-cn/download/dotnet
|
||||||
|
|
||||||
|
# 2. 克隆代码仓库
|
||||||
git clone https://github.com/nsnail/NetAdmin.git && cd ./NetAdmin
|
git clone https://github.com/nsnail/NetAdmin.git && cd ./NetAdmin
|
||||||
|
|
||||||
# 2. 检查dotnet-sdk版本>=9.0.0
|
# 3. 确认本机 redis 处于运行状态
|
||||||
# 下载 dotnet https://dotnet.microsoft.com/zh-cn/download/dotnet
|
redis-server # 启动
|
||||||
dotnet --list-sdks
|
redis-cli # 连接测试
|
||||||
|
# 下载 redis for windows:https://github.com/redis-windows/redis-windows/releases
|
||||||
|
# 下载 redis for linux/mac:https://redis.io/download
|
||||||
|
|
||||||
# 3. 确保本机redis处于运行状态
|
# 4. 运行后端 WebApi
|
||||||
# 下载 redis for windows https://github.com/redis-windows/redis-windows/releases
|
dotnet run --project ./src/backend/YourSolution.AdmServer.Host/YourSolution.AdmServer.Host.csproj --urls http://[::]:5010 -is
|
||||||
# 下载 redis for linux/mac https://redis.io/download
|
# -i 插入种子数据
|
||||||
redis-cli
|
# -s 同步数据库结构
|
||||||
|
# 浏览器访问 http://localhost:5010 ,将看到Swagger(Knife4jUI)界面
|
||||||
|
|
||||||
# 4. 运行后端WebApi
|
# 5. 检查 nodejs 版本 >=20
|
||||||
# 浏览器打开 http://localhost:5010 ,将看到Swagger(Knife4jUI)界面
|
|
||||||
dotnet run --project ./src/backend/NetAdmin.AdmServer.Host/NetAdmin.AdmServer.Host.csproj --urls http://[::]:5010 -is
|
|
||||||
|
|
||||||
# 5. 检查nodejs版本>=20
|
|
||||||
# 下载 nodejs https://nodejs.org/en/download
|
|
||||||
node -v
|
node -v
|
||||||
|
# 下载 nodejs:https://nodejs.org/en/download
|
||||||
|
|
||||||
# 6. 安装npm依赖包
|
# 6. 安装 npm 依赖包
|
||||||
cd ./src/frontend/admin && npm install
|
cd ./src/frontend/admin && npm install
|
||||||
|
|
||||||
# 7. 运行前端项目
|
# 7. 运行前端项目
|
||||||
# 浏览器打开 http://localhost:5020 ,将看到管理界面(默认用户名:root,密码:1234qwer)
|
|
||||||
npm run dev
|
npm run dev
|
||||||
|
# 浏览器访问 http://localhost:5020 ,将看到管理界面(默认用户名密码:root 1234qwer)
|
||||||
```
|
```
|
||||||
|
|
||||||
## 文件目录树
|
## 文件目录
|
||||||
|
|
||||||
```
|
```
|
||||||
|
+---.github # github 工程文件目录
|
||||||
+---.template.config # dotnet 项目模板配置目录
|
+---.template.config # dotnet 项目模板配置目录
|
||||||
+---assets # 项目资源文件目录
|
+---assets # 项目资源文件目录
|
||||||
+---build # 构建相关的工程文件目录
|
+---build # 构建相关的工程文件目录
|
||||||
+---dist # 编译生成的二进制文件目录
|
+---dist # 编译生成的二进制文件目录
|
||||||
|
+---docker # docker 镜像构建文件目录
|
||||||
+---docs # 项目开发文档目录
|
+---docs # 项目开发文档目录
|
||||||
+---refs # 引用的第三方包的仓库目录
|
+---refs # 引用的第三方包的仓库目录
|
||||||
+---scripts # 各种工具脚本文件目录
|
+---scripts # 各种工具脚本文件目录
|
||||||
+---src # 项目源码文件目录
|
+---src # 项目源码文件目录
|
||||||
```
|
```
|
||||||
|
|
||||||
## 后端项目架构
|
## 项目架构
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart TD
|
flowchart TD
|
||||||
H["NetAdmin.Host\n公共主机层\n(.Net自托管主机程序)\n(输入输出格式化)\n(数据校验、鉴权)\n(...所有HTTP管道过滤器中间件)"] --> C["NetAdmin.Cache\n公共缓存层\n(基于Redis或MemoryCache的缓存策略实现)"]
|
sys-host["NetAdmin.SysComponent.Host\n系统组件:主机层"]
|
||||||
C --> A["NetAdmin.Application\n公共业务逻辑层\n(内部服务增删改查)\n(外部服务增删改查)\n(...所有业务用例的计算与组合逻辑的模块化)"]
|
sys-cache["NetAdmin.SysComponent.Cache\n系统组件:缓存层"]
|
||||||
A --> D["NetAdmin.Domain\n数据实体层\n(数据库关系实体映射)\n(DTO数据传输对象)\n(...所有数据模型的抽象与封装)"]
|
sys-app["NetAdmin.SysComponent.Application\n系统组件:应用层"]
|
||||||
D --> I["NetAdmin.Infrastructure\n基础设施层\n(第三方组件和Nuget包引用)\n(公共构建和程序运行配置)\n(公共常量枚举异常定义)\n(全球化化和多语言)\n(...所有公共Utility工具)"]
|
host["<b>NetAdmin.Host</b>\n框架:主机层\n(.Net自托管主机程序)\n(输入输出格式化)\n(数据校验、鉴权)\n(...所有HTTP管道过滤器中间件)"]
|
||||||
|
cache["<b>NetAdmin.Cache</b>\n框架:缓存层\n(基于Redis或MemoryCache的缓存策略实现)"]
|
||||||
XH["NetAdmin.XXX.Host\n(WebApi)"]-->H
|
app["<b>NetAdmin.Application</b>\n框架:业务应用层\n(内部服务增删改查)\n(外部服务增删改查)\n(...所有业务用例的计算与组合逻辑的模块化)"]
|
||||||
XS["NetAdmin.XXXService\n(常驻内存服务)"]-->H
|
domain["<b>NetAdmin.Domain</b>\n框架:数据实体层\n(数据库关系实体映射)\n(DTO数据传输对象)\n(...所有数据模型的抽象与封装)"]
|
||||||
XS["NetAdmin.XXXService\n(常驻内存服务)"]-->XC
|
infra["<b>NetAdmin.Infrastructure</b>\n框架:基础设施层\n(第三方组件和Nuget包引用)\n(公共构建和程序运行配置)\n(公共常量枚举异常定义)\n(全球化化和多语言)\n(...所有公共Utility工具)"]
|
||||||
XC["NetAdmin.XXX.Cache\n(缓存层实例)"]-->C
|
biz-host["YourSolution.XXX.Host\n业务实例:主机层"]
|
||||||
XA["NetAdmin.XXX.Application\n(业务逻辑层实例)"]-->A
|
biz-cache["YourSolution.XXX.Cache\n业务实例:缓存层"]
|
||||||
|
biz-app["YourSolution.XXX.Application\n业务实例:应用层"]
|
||||||
XH-->XC
|
biz-domain["YourSolution.XXX.Domain\n业务实例:数据实体层"]
|
||||||
XC-->XA
|
biz-infra["YourSolution.XXX.Infrastructure\n业务实例:基础设施层"]
|
||||||
|
biz-host-->biz-cache-->biz-app-->biz-domain-->biz-infra
|
||||||
|
sys-host-->sys-cache-->sys-app-->domain-->infra
|
||||||
|
host-->cache-->app-->domain-->infra
|
||||||
|
biz-host-->sys-host-->host
|
||||||
|
biz-cache-->sys-cache-->cache
|
||||||
|
biz-app-->sys-app-->app
|
||||||
|
biz-domain-->domain
|
||||||
|
biz-infra-->infra
|
||||||
```
|
```
|
||||||
|
|
||||||
## 引用的开源代码 / 特别鸣谢
|
## 特别鸣谢
|
||||||
|
|
||||||
| 语言 | 集成领域 | 开源库 |
|
| 语言 | 集成领域 | 开源库 |
|
||||||
|------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|------------|---------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
| C# | Web基础框架 | [ASP.NET Core](https://github.com/dotnet/aspnetcore) |
|
| 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# | 数据库关系映射 | [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# | 代码质量检查 | [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) |
|
| C# | 单元测试框架 | [xunit](https://github.com/xunit/xunit) \| [coverlet.collector](https://github.com/coverlet-coverage/coverlet) |
|
||||||
| C# | 分布式锁 | [RedLock.net](https://github.com/samcook/RedLock.net) |
|
|
||||||
| C# | 控制台终端界面库 | [Spectre.Console](https://github.com/spectreconsole/spectre.console) |
|
| C# | 控制台终端界面库 | [Spectre.Console](https://github.com/spectreconsole/spectre.console) |
|
||||||
| C# | 扩展函数库 | [NSExt](https://github.com/nsnail/ns-ext.git) |
|
| C# | 扩展函数库 | [NSExt](https://github.com/nsnail/ns-ext.git) |
|
||||||
| C# | 图形处理库 | [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) |
|
| C# | 图形处理库 | [SixLabors.ImageSharp](https://github.com/SixLabors/ImageSharp) |
|
||||||
@ -98,8 +108,6 @@ XC-->XA
|
|||||||
| C# | 性能监控采集 | [prometheus-net.AspNetCore](https://github.com/prometheus-net/prometheus-net) |
|
| C# | 性能监控采集 | [prometheus-net.AspNetCore](https://github.com/prometheus-net/prometheus-net) |
|
||||||
| C# | 雪花ID生成器 | [Yitter.IdGenerator](https://github.com/yitter/idgenerator) |
|
| C# | 雪花ID生成器 | [Yitter.IdGenerator](https://github.com/yitter/idgenerator) |
|
||||||
| C# | 自动化版本管理 | [MinVer](https://github.com/adamralph/minver) |
|
| C# | 自动化版本管理 | [MinVer](https://github.com/adamralph/minver) |
|
||||||
| C# | JavaScript引擎 | [MsieJavaScriptEngine](https://github.com/Taritsyn/MsieJavaScriptEngine) |
|
|
||||||
| C# | WebApi图形界面 | [IGeekFan.AspNetCore.Knife4jUI](https://github.com/luoyunchong/IGeekFan.AspNetCore.Knife4jUI) |
|
|
||||||
| TypeScript | SPA基础框架 | [Vue](https://github.com/vuejs/core) |
|
| TypeScript | SPA基础框架 | [Vue](https://github.com/vuejs/core) |
|
||||||
| TypeScript | 前端构建工具 | [Vite](https://github.com/vitejs/vite) |
|
| TypeScript | 前端构建工具 | [Vite](https://github.com/vitejs/vite) |
|
||||||
| TypeScript | UI控件库 | [Element Plus](https://github.com/element-plus/element-plus) |
|
| TypeScript | UI控件库 | [Element Plus](https://github.com/element-plus/element-plus) |
|
||||||
|
249
assets/res/CountryCodes.ln
Normal file
249
assets/res/CountryCodes.ln
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
不丹
|
||||||
|
东帝汶
|
||||||
|
中国
|
||||||
|
中非
|
||||||
|
丹麦
|
||||||
|
乌克兰
|
||||||
|
乌兹别克斯坦
|
||||||
|
乌干达
|
||||||
|
乌拉圭
|
||||||
|
乍得
|
||||||
|
也门
|
||||||
|
亚美尼亚
|
||||||
|
以色列
|
||||||
|
伊拉克
|
||||||
|
伊朗
|
||||||
|
伯利兹
|
||||||
|
佛得角
|
||||||
|
俄罗斯
|
||||||
|
保加利亚
|
||||||
|
克罗地亚
|
||||||
|
关岛
|
||||||
|
冈比亚
|
||||||
|
冰岛
|
||||||
|
几内亚
|
||||||
|
几内亚比绍
|
||||||
|
列支敦士登
|
||||||
|
刚果共和国
|
||||||
|
刚果民主共和国
|
||||||
|
利比亚
|
||||||
|
利比里亚
|
||||||
|
加拿大
|
||||||
|
加纳
|
||||||
|
加蓬
|
||||||
|
匈牙利
|
||||||
|
北马其顿
|
||||||
|
北马里亚纳群岛
|
||||||
|
南乔治亚和南桑威奇群岛
|
||||||
|
南极洲
|
||||||
|
南苏丹
|
||||||
|
南非
|
||||||
|
博茨瓦纳
|
||||||
|
卡塔尔
|
||||||
|
卢旺达
|
||||||
|
卢森堡
|
||||||
|
印度
|
||||||
|
印度尼西亚
|
||||||
|
危地马拉
|
||||||
|
厄瓜多尔
|
||||||
|
厄立特里亚
|
||||||
|
叙利亚
|
||||||
|
古巴
|
||||||
|
台湾
|
||||||
|
吉尔吉斯斯坦
|
||||||
|
吉布提
|
||||||
|
哈萨克斯坦
|
||||||
|
哥伦比亚
|
||||||
|
哥斯达黎加
|
||||||
|
喀麦隆
|
||||||
|
图瓦卢
|
||||||
|
土库曼斯坦
|
||||||
|
土耳其
|
||||||
|
圣卢西亚
|
||||||
|
圣基茨和尼维斯
|
||||||
|
圣多美和普林西比
|
||||||
|
圣巴泰勒米
|
||||||
|
圣文森特和格林纳丁斯
|
||||||
|
圣皮埃尔和密克隆
|
||||||
|
圣诞岛
|
||||||
|
圣赫勒拿
|
||||||
|
圣马力诺
|
||||||
|
圭亚那
|
||||||
|
坦桑尼亚
|
||||||
|
埃及
|
||||||
|
埃塞俄比亚
|
||||||
|
基里巴斯
|
||||||
|
塔吉克斯坦
|
||||||
|
塞内加尔
|
||||||
|
塞尔维亚
|
||||||
|
塞拉利昂
|
||||||
|
塞浦路斯
|
||||||
|
塞舌尔
|
||||||
|
墨西哥
|
||||||
|
多哥
|
||||||
|
多米尼克
|
||||||
|
多米尼加
|
||||||
|
奥兰
|
||||||
|
奥地利
|
||||||
|
委内瑞拉
|
||||||
|
孟加拉国
|
||||||
|
安哥拉
|
||||||
|
安圭拉
|
||||||
|
安提瓜和巴布达
|
||||||
|
安道尔
|
||||||
|
密克罗尼西亚联邦
|
||||||
|
尼加拉瓜
|
||||||
|
尼日利亚
|
||||||
|
尼日尔
|
||||||
|
尼泊尔
|
||||||
|
巴勒斯坦
|
||||||
|
巴哈马
|
||||||
|
巴基斯坦
|
||||||
|
巴巴多斯
|
||||||
|
巴布亚新几内亚
|
||||||
|
巴拉圭
|
||||||
|
巴拿马
|
||||||
|
巴林
|
||||||
|
巴西
|
||||||
|
布基纳法索
|
||||||
|
布隆迪
|
||||||
|
布韦岛
|
||||||
|
希腊
|
||||||
|
帕劳
|
||||||
|
库克群岛
|
||||||
|
库拉索
|
||||||
|
开曼群岛
|
||||||
|
德国
|
||||||
|
意大利
|
||||||
|
所罗门群岛
|
||||||
|
托克劳
|
||||||
|
拉脱维亚
|
||||||
|
挪威
|
||||||
|
捷克
|
||||||
|
摩尔多瓦
|
||||||
|
摩洛哥
|
||||||
|
摩纳哥
|
||||||
|
文莱
|
||||||
|
斐济
|
||||||
|
斯威士兰
|
||||||
|
斯洛伐克
|
||||||
|
斯洛文尼亚
|
||||||
|
斯瓦尔巴和扬马延
|
||||||
|
斯里兰卡
|
||||||
|
新加坡
|
||||||
|
新喀里多尼亚
|
||||||
|
新西兰
|
||||||
|
日本
|
||||||
|
智利
|
||||||
|
朝鲜
|
||||||
|
柬埔寨
|
||||||
|
根西
|
||||||
|
格林纳达
|
||||||
|
格陵兰
|
||||||
|
格鲁吉亚
|
||||||
|
梵蒂冈
|
||||||
|
比利时
|
||||||
|
毛里塔尼亚
|
||||||
|
毛里求斯
|
||||||
|
汤加
|
||||||
|
沙特阿拉伯
|
||||||
|
法国
|
||||||
|
法属南部和南极领地
|
||||||
|
法属圣马丁
|
||||||
|
法属圭亚那
|
||||||
|
法属波利尼西亚
|
||||||
|
法罗群岛
|
||||||
|
波兰
|
||||||
|
波多黎各
|
||||||
|
波黑
|
||||||
|
泰国
|
||||||
|
泽西
|
||||||
|
津巴布韦
|
||||||
|
洪都拉斯
|
||||||
|
海地
|
||||||
|
澳大利亚
|
||||||
|
澳门
|
||||||
|
爱尔兰
|
||||||
|
爱沙尼亚
|
||||||
|
牙买加
|
||||||
|
特克斯和凯科斯群岛
|
||||||
|
特立尼达和多巴哥
|
||||||
|
玻利维亚
|
||||||
|
瑙鲁
|
||||||
|
瑞典
|
||||||
|
瑞士
|
||||||
|
瓜德罗普
|
||||||
|
瓦利斯和富图纳
|
||||||
|
瓦努阿图
|
||||||
|
留尼汪
|
||||||
|
白俄罗斯
|
||||||
|
百慕大
|
||||||
|
皮特凯恩群岛
|
||||||
|
直布罗陀
|
||||||
|
福克兰群岛
|
||||||
|
科威特
|
||||||
|
科摩罗
|
||||||
|
科特迪瓦
|
||||||
|
科科斯基林群岛
|
||||||
|
秘鲁
|
||||||
|
突尼斯
|
||||||
|
立陶宛
|
||||||
|
索马里
|
||||||
|
约旦
|
||||||
|
纳米比亚
|
||||||
|
纽埃
|
||||||
|
缅甸
|
||||||
|
罗马尼亚
|
||||||
|
美国
|
||||||
|
美国本土外小岛屿
|
||||||
|
美属维尔京群岛
|
||||||
|
美属萨摩亚
|
||||||
|
老挝
|
||||||
|
肯尼亚
|
||||||
|
芬兰
|
||||||
|
苏丹
|
||||||
|
苏里南
|
||||||
|
英国
|
||||||
|
英属印度洋领地
|
||||||
|
英属维尔京群岛
|
||||||
|
荷兰
|
||||||
|
荷兰加勒比区
|
||||||
|
荷属圣马丁
|
||||||
|
莫桑比克
|
||||||
|
莱索托
|
||||||
|
菲律宾
|
||||||
|
萨尔瓦多
|
||||||
|
萨摩亚
|
||||||
|
葡萄牙
|
||||||
|
蒙古
|
||||||
|
蒙特塞拉特
|
||||||
|
西撒哈拉
|
||||||
|
西班牙
|
||||||
|
诺福克岛
|
||||||
|
贝宁
|
||||||
|
赞比亚
|
||||||
|
赤道几内亚
|
||||||
|
赫德岛和麦克唐纳群岛
|
||||||
|
越南
|
||||||
|
阿塞拜疆
|
||||||
|
阿富汗
|
||||||
|
阿尔及利亚
|
||||||
|
阿尔巴尼亚
|
||||||
|
阿曼
|
||||||
|
阿根廷
|
||||||
|
阿联酋
|
||||||
|
阿鲁巴
|
||||||
|
韩国
|
||||||
|
香港
|
||||||
|
马尔代夫
|
||||||
|
马恩岛
|
||||||
|
马拉维
|
||||||
|
马提尼克
|
||||||
|
马来西亚
|
||||||
|
马约特
|
||||||
|
马绍尔群岛
|
||||||
|
马耳他
|
||||||
|
马达加斯加
|
||||||
|
马里
|
||||||
|
黎巴嫩
|
||||||
|
黑山
|
@ -1,16 +1,22 @@
|
|||||||
|
上次执行时间
|
||||||
|
上次执行状态
|
||||||
|
上次执行耗时
|
||||||
|
下次执行时间
|
||||||
不为其中之一
|
不为其中之一
|
||||||
不以什么开始
|
不以什么开始
|
||||||
不以什么结束
|
不以什么结束
|
||||||
不包含
|
不包含
|
||||||
不排序
|
不排序
|
||||||
不等于
|
不等于
|
||||||
管理模块
|
|
||||||
丧偶
|
丧偶
|
||||||
中专
|
中专
|
||||||
中共党员
|
中共党员
|
||||||
为其中之一
|
为其中之一
|
||||||
|
人工审核
|
||||||
以什么开始
|
以什么开始
|
||||||
以什么结束
|
以什么结束
|
||||||
|
作业名称
|
||||||
|
作业状态
|
||||||
保密
|
保密
|
||||||
信息
|
信息
|
||||||
倒序排序
|
倒序排序
|
||||||
@ -18,6 +24,7 @@
|
|||||||
公告
|
公告
|
||||||
共青团员
|
共青团员
|
||||||
出生证
|
出生证
|
||||||
|
创建时间
|
||||||
初中
|
初中
|
||||||
删除
|
删除
|
||||||
包含
|
包含
|
||||||
@ -25,12 +32,19 @@
|
|||||||
博士后
|
博士后
|
||||||
发送失败
|
发送失败
|
||||||
同步数据库结构
|
同步数据库结构
|
||||||
|
响应体
|
||||||
|
响应状态码
|
||||||
|
唯一编码
|
||||||
|
备注
|
||||||
外国人居留证
|
外国人居留证
|
||||||
|
外部错误
|
||||||
大专
|
大专
|
||||||
大于
|
大于
|
||||||
大于等于
|
大于等于
|
||||||
女
|
女
|
||||||
|
字典内容导出
|
||||||
宕机
|
宕机
|
||||||
|
客户端IP
|
||||||
小于
|
小于
|
||||||
小于等于
|
小于等于
|
||||||
小学
|
小学
|
||||||
@ -39,17 +53,36 @@
|
|||||||
已校验
|
已校验
|
||||||
已读
|
已读
|
||||||
并且
|
并且
|
||||||
意外错误
|
|
||||||
成功
|
成功
|
||||||
或者
|
或者
|
||||||
|
所属角色
|
||||||
|
所属部门
|
||||||
手机
|
手机
|
||||||
|
手机号
|
||||||
|
执行耗时
|
||||||
|
执行计划
|
||||||
护照
|
护照
|
||||||
指定部门数据
|
指定部门数据
|
||||||
按钮
|
按钮
|
||||||
|
排序
|
||||||
|
接口名称
|
||||||
|
接口导出
|
||||||
|
接口描述
|
||||||
|
接口路径
|
||||||
插入种子数据
|
插入种子数据
|
||||||
|
操作系统
|
||||||
|
数据范围
|
||||||
|
文档内容
|
||||||
|
文档内容导出
|
||||||
|
文档标题
|
||||||
无效操作
|
无效操作
|
||||||
无效输入
|
无效输入
|
||||||
|
无限权限
|
||||||
日期范围
|
日期范围
|
||||||
|
是否启用
|
||||||
|
显示仪表板
|
||||||
|
最后登录时间
|
||||||
|
未处理异常
|
||||||
未婚
|
未婚
|
||||||
未读
|
未读
|
||||||
本人数据
|
本人数据
|
||||||
@ -59,16 +92,26 @@
|
|||||||
框架
|
框架
|
||||||
比较数据库结构
|
比较数据库结构
|
||||||
注册
|
注册
|
||||||
|
消息主题
|
||||||
|
消息摘要
|
||||||
|
消息类型
|
||||||
港澳台通行证
|
港澳台通行证
|
||||||
|
用户代理
|
||||||
|
用户名
|
||||||
|
用户导出
|
||||||
电子邮箱
|
电子邮箱
|
||||||
男
|
男
|
||||||
登录
|
登录
|
||||||
|
登录名
|
||||||
|
登录日志导出
|
||||||
硕士
|
硕士
|
||||||
|
示例导出
|
||||||
离异
|
离异
|
||||||
私信
|
|
||||||
空闲
|
空闲
|
||||||
|
站内信导出
|
||||||
等于
|
等于
|
||||||
等待发送
|
等待发送
|
||||||
|
管理模块
|
||||||
系统模块
|
系统模块
|
||||||
绑定手机号码
|
绑定手机号码
|
||||||
结果非预期
|
结果非预期
|
||||||
@ -76,16 +119,31 @@
|
|||||||
自定义
|
自定义
|
||||||
范围
|
范围
|
||||||
菜单
|
菜单
|
||||||
|
角色名称
|
||||||
|
角色导出
|
||||||
解绑手机号码
|
解绑手机号码
|
||||||
警告
|
警告
|
||||||
|
计划作业导出
|
||||||
|
计划作业执行记录导出
|
||||||
|
请求方式
|
||||||
|
请求日志导出
|
||||||
调试
|
调试
|
||||||
跟踪
|
跟踪
|
||||||
|
跟踪标识
|
||||||
身份证
|
身份证
|
||||||
运行
|
运行
|
||||||
通知
|
通知
|
||||||
|
邮箱号
|
||||||
|
部门名称
|
||||||
|
部门导出
|
||||||
|
配置导出
|
||||||
重设密码
|
重设密码
|
||||||
链接
|
链接
|
||||||
错误
|
错误
|
||||||
随机排序
|
随机排序
|
||||||
|
项值
|
||||||
|
项名
|
||||||
顺序排序
|
顺序排序
|
||||||
高中
|
高中
|
||||||
|
默认角色
|
||||||
|
默认部门
|
@ -21,9 +21,10 @@ XML注释文件不存在
|
|||||||
字典目录编号不能为空
|
字典目录编号不能为空
|
||||||
字典编码不能为空
|
字典编码不能为空
|
||||||
学历不正确
|
学历不正确
|
||||||
|
完全公开
|
||||||
密码不能为空
|
密码不能为空
|
||||||
已处理完毕
|
已处理完毕
|
||||||
并发冲突请稍后重试
|
并发冲突_请稍后重试
|
||||||
开始事务
|
开始事务
|
||||||
性别不正确
|
性别不正确
|
||||||
手机号码不正确
|
手机号码不正确
|
||||||
@ -34,24 +35,30 @@ XML注释文件不存在
|
|||||||
数据库同步开始
|
数据库同步开始
|
||||||
数据库服务器时钟偏移
|
数据库服务器时钟偏移
|
||||||
数据库结构同步完成
|
数据库结构同步完成
|
||||||
数据版本不能为空
|
|
||||||
文件不能为空
|
文件不能为空
|
||||||
|
文档内容不能为空
|
||||||
|
文档分类不存在
|
||||||
|
文档分类名称不能为空
|
||||||
|
文档分类编号不能为空
|
||||||
|
文档分类编码不能为空
|
||||||
|
文档标题不能为空
|
||||||
新密码不能为空
|
新密码不能为空
|
||||||
新手机号码验证码不正确
|
新手机号码验证码不正确
|
||||||
无效端口号
|
无效端口号
|
||||||
无效证件号码
|
无效证件号码
|
||||||
日志长度超过限制
|
|
||||||
旧密码不正确
|
旧密码不正确
|
||||||
旧密码不能为空
|
旧密码不能为空
|
||||||
旧手机号码不正确
|
旧手机号码不正确
|
||||||
旧手机号码验证码不正确
|
旧手机号码验证码不正确
|
||||||
时间戳缺失或误差过大
|
|
||||||
时间表达式
|
时间表达式
|
||||||
时间计划不能为空
|
时间计划不能为空
|
||||||
未指定部门
|
未指定部门
|
||||||
未获取到待执行任务
|
未获取到待执行任务
|
||||||
|
档案可见性不正确
|
||||||
模块名称不能为空
|
模块名称不能为空
|
||||||
|
模块类型不能为空
|
||||||
模块说明不能为空
|
模块说明不能为空
|
||||||
|
此节点已下线
|
||||||
民族不正确
|
民族不正确
|
||||||
消息主题不能为空
|
消息主题不能为空
|
||||||
消息内容不能为空
|
消息内容不能为空
|
||||||
@ -62,16 +69,17 @@ XML注释文件不存在
|
|||||||
用户名或密码错误
|
用户名或密码错误
|
||||||
用户名长度4位以上
|
用户名长度4位以上
|
||||||
用户头像不能为空
|
用户头像不能为空
|
||||||
用户档案不能为空
|
|
||||||
用户编号不存在
|
用户编号不存在
|
||||||
用户编号不能为空
|
登录用户
|
||||||
目标设备不能为空
|
目标设备不能为空
|
||||||
短信验证请求不能为空
|
短信验证请求不能为空
|
||||||
|
种子数据插入完成
|
||||||
站内信不存在
|
站内信不存在
|
||||||
站内信状态不正确
|
站内信状态不正确
|
||||||
站内信类型不正确
|
站内信类型不正确
|
||||||
签名缺失
|
缓存键不能为空
|
||||||
网络地址不正确
|
网络地址不正确
|
||||||
|
自己可见
|
||||||
菜单名称不能为空
|
菜单名称不能为空
|
||||||
菜单标题不能为空
|
菜单标题不能为空
|
||||||
菜单类型不正确
|
菜单类型不正确
|
||||||
@ -81,6 +89,7 @@ XML注释文件不存在
|
|||||||
角色数据范围不正确
|
角色数据范围不正确
|
||||||
角色编号不能为空
|
角色编号不能为空
|
||||||
角色编号列表不能为空
|
角色编号列表不能为空
|
||||||
|
记录已存在
|
||||||
设备类型不能为空
|
设备类型不能为空
|
||||||
证件类型不正确
|
证件类型不正确
|
||||||
该角色下存在用户
|
该角色下存在用户
|
||||||
@ -89,16 +98,21 @@ XML注释文件不存在
|
|||||||
请求地址不能为空
|
请求地址不能为空
|
||||||
请求对象不能为空
|
请求对象不能为空
|
||||||
请求方法不正确
|
请求方法不正确
|
||||||
|
请稍后重试
|
||||||
请联系管理员激活账号
|
请联系管理员激活账号
|
||||||
读取用户令牌出错
|
读取用户令牌出错
|
||||||
账号不能为空
|
账号不能为空
|
||||||
邀请码不正确
|
邀请码不正确
|
||||||
邮箱验证码不正确
|
邮箱验证码不正确
|
||||||
部门不存在
|
部门不存在
|
||||||
|
部门可见
|
||||||
部门名称不能为空
|
部门名称不能为空
|
||||||
配置文件初始化完毕
|
配置文件初始化完毕
|
||||||
键值不能为空
|
键值不能为空
|
||||||
键名称不能为空
|
键名称不能为空
|
||||||
|
随机延时结束时间不正确
|
||||||
|
随机延时起始时间不正确
|
||||||
|
非JSON字符串
|
||||||
验证数据不能为空
|
验证数据不能为空
|
||||||
验证码不正确
|
验证码不正确
|
||||||
验证码不能为空
|
验证码不能为空
|
0
assets/res/YourSolution.AdmServer.Fields.ln
Normal file
0
assets/res/YourSolution.AdmServer.Fields.ln
Normal file
0
assets/res/YourSolution.AdmServer.Statements.ln
Normal file
0
assets/res/YourSolution.AdmServer.Statements.ln
Normal file
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,7 @@
|
|||||||
"ExecutionCron": "0 * * * * ?",
|
"ExecutionCron": "0 * * * * ?",
|
||||||
"HttpMethod": 3,
|
"HttpMethod": 3,
|
||||||
"JobName": "HTTP 请求测试",
|
"JobName": "HTTP 请求测试",
|
||||||
"NextExecTime": "2020/9/13 12:26:40",
|
"NextExecTime": "2020-09-13 12:26:40",
|
||||||
"NextTimeId": 1600000000,
|
"NextTimeId": 1600000000,
|
||||||
"RequestUrl": "https://httpbin.org/ip",
|
"RequestUrl": "https://httpbin.org/ip",
|
||||||
"Status": 1,
|
"Status": 1,
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
"Component": "sys/user",
|
"Component": "sys/user",
|
||||||
"Icon": "el-icon-user",
|
"Icon": "el-icon-user",
|
||||||
"Id": 373837957840901,
|
"Id": 373837957840901,
|
||||||
"Name": "sys-user",
|
"Name": "sys/user",
|
||||||
"ParentId": 373837917724677,
|
"ParentId": 373837917724677,
|
||||||
"Path": "/sys/user",
|
"Path": "/sys/user",
|
||||||
"Sort": 100,
|
"Sort": 100,
|
||||||
@ -35,7 +35,7 @@
|
|||||||
"Component": "sys/role",
|
"Component": "sys/role",
|
||||||
"Icon": "sc-icon-role",
|
"Icon": "sc-icon-role",
|
||||||
"Id": 373838018527237,
|
"Id": 373838018527237,
|
||||||
"Name": "sys-role",
|
"Name": "sys/role",
|
||||||
"ParentId": 373837917724677,
|
"ParentId": 373837917724677,
|
||||||
"Path": "/sys/role",
|
"Path": "/sys/role",
|
||||||
"Sort": 99,
|
"Sort": 99,
|
||||||
@ -46,7 +46,7 @@
|
|||||||
"Component": "sys/dept",
|
"Component": "sys/dept",
|
||||||
"Icon": "sc-icon-dept",
|
"Icon": "sc-icon-dept",
|
||||||
"Id": 373838045605893,
|
"Id": 373838045605893,
|
||||||
"Name": "sys-dept",
|
"Name": "sys/dept",
|
||||||
"ParentId": 373837917724677,
|
"ParentId": 373837917724677,
|
||||||
"Path": "/sys/dept",
|
"Path": "/sys/dept",
|
||||||
"Sort": 98,
|
"Sort": 98,
|
||||||
@ -57,7 +57,7 @@
|
|||||||
"Component": "sys/menu",
|
"Component": "sys/menu",
|
||||||
"Icon": "el-icon-fold",
|
"Icon": "el-icon-fold",
|
||||||
"Id": 373838070898693,
|
"Id": 373838070898693,
|
||||||
"Name": "sys-menu",
|
"Name": "sys/menu",
|
||||||
"ParentId": 373837917724677,
|
"ParentId": 373837917724677,
|
||||||
"Path": "/sys/menu",
|
"Path": "/sys/menu",
|
||||||
"Sort": 97,
|
"Sort": 97,
|
||||||
@ -78,7 +78,7 @@
|
|||||||
"Component": "sys/config",
|
"Component": "sys/config",
|
||||||
"Icon": "el-icon-set-up",
|
"Icon": "el-icon-set-up",
|
||||||
"Id": 380415005847557,
|
"Id": 380415005847557,
|
||||||
"Name": "sys-config",
|
"Name": "sys/config",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/config",
|
"Path": "/sys/config",
|
||||||
"Sort": 100,
|
"Sort": 100,
|
||||||
@ -89,7 +89,7 @@
|
|||||||
"Component": "sys/job",
|
"Component": "sys/job",
|
||||||
"Icon": "sc-icon-ScheduledJob",
|
"Icon": "sc-icon-ScheduledJob",
|
||||||
"Id": 510067557638158,
|
"Id": 510067557638158,
|
||||||
"Name": "sys-job",
|
"Name": "sys/job",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/job",
|
"Path": "/sys/job",
|
||||||
"Sort": 99,
|
"Sort": 99,
|
||||||
@ -100,7 +100,7 @@
|
|||||||
"Component": "sys/dic",
|
"Component": "sys/dic",
|
||||||
"Icon": "sc-icon-dic",
|
"Icon": "sc-icon-dic",
|
||||||
"Id": 375315654221829,
|
"Id": 375315654221829,
|
||||||
"Name": "sys-dic",
|
"Name": "sys/dic",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/dic",
|
"Path": "/sys/dic",
|
||||||
"Sort": 98,
|
"Sort": 98,
|
||||||
@ -111,7 +111,7 @@
|
|||||||
"Component": "sys/msg",
|
"Component": "sys/msg",
|
||||||
"Icon": "el-icon-message",
|
"Icon": "el-icon-message",
|
||||||
"Id": 482779610341392,
|
"Id": 482779610341392,
|
||||||
"Name": "sys-msg",
|
"Name": "sys/msg",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/msg",
|
"Path": "/sys/msg",
|
||||||
"Sort": 97,
|
"Sort": 97,
|
||||||
@ -122,7 +122,7 @@
|
|||||||
"Component": "sys/api",
|
"Component": "sys/api",
|
||||||
"Icon": "sc-icon-api",
|
"Icon": "sc-icon-api",
|
||||||
"Id": 397880678895621,
|
"Id": 397880678895621,
|
||||||
"Name": "sys-api",
|
"Name": "sys/api",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/api",
|
"Path": "/sys/api",
|
||||||
"Sort": 96,
|
"Sort": 96,
|
||||||
@ -133,20 +133,41 @@
|
|||||||
"Component": "sys/cache",
|
"Component": "sys/cache",
|
||||||
"Icon": "sc-icon-memory",
|
"Icon": "sc-icon-memory",
|
||||||
"Id": 374911555702789,
|
"Id": 374911555702789,
|
||||||
"Name": "sys-cache",
|
"Name": "sys/cache",
|
||||||
"ParentId": 485278637670422,
|
"ParentId": 485278637670422,
|
||||||
"Path": "/sys/cache",
|
"Path": "/sys/cache",
|
||||||
"Sort": 95,
|
"Sort": 95,
|
||||||
"Title": "缓存管理",
|
"Title": "缓存管理",
|
||||||
"Type": 1
|
"Type": 1
|
||||||
},
|
},
|
||||||
|
// ------------------------------ 档案管理 ------------------------------
|
||||||
|
{
|
||||||
|
"Icon": "sc-icon-Archive",
|
||||||
|
"Id": 616214756757512,
|
||||||
|
"Name": "archive",
|
||||||
|
"Path": "/archive",
|
||||||
|
"Sort": 98,
|
||||||
|
"Title": "档案管理",
|
||||||
|
"Type": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Component": "sys/doc",
|
||||||
|
"Icon": "el-icon-document",
|
||||||
|
"Id": 616214756757516,
|
||||||
|
"Name": "archive/doc",
|
||||||
|
"ParentId": 616214756757512,
|
||||||
|
"Path": "/archive/doc",
|
||||||
|
"Sort": 100,
|
||||||
|
"Title": "文档管理",
|
||||||
|
"Type": 1
|
||||||
|
},
|
||||||
// ------------------------------ 日志管理 ------------------------------
|
// ------------------------------ 日志管理 ------------------------------
|
||||||
{
|
{
|
||||||
"Icon": "el-icon-tickets",
|
"Icon": "el-icon-tickets",
|
||||||
"Id": 374792687640581,
|
"Id": 374792687640581,
|
||||||
"Name": "log",
|
"Name": "log",
|
||||||
"Path": "/log",
|
"Path": "/log",
|
||||||
"Sort": 98,
|
"Sort": 97,
|
||||||
"Title": "日志管理",
|
"Title": "日志管理",
|
||||||
"Type": 1
|
"Type": 1
|
||||||
},
|
},
|
||||||
@ -154,7 +175,7 @@
|
|||||||
"Component": "sys/log/operation",
|
"Component": "sys/log/operation",
|
||||||
"Icon": "el-icon-pointer",
|
"Icon": "el-icon-pointer",
|
||||||
"Id": 485285246504976,
|
"Id": 485285246504976,
|
||||||
"Name": "sys-log-operation",
|
"Name": "sys/log/operation",
|
||||||
"ParentId": 374792687640581,
|
"ParentId": 374792687640581,
|
||||||
"Path": "/sys/log/operation",
|
"Path": "/sys/log/operation",
|
||||||
"Sort": 100,
|
"Sort": 100,
|
||||||
@ -165,7 +186,7 @@
|
|||||||
"Component": "sys/log/login",
|
"Component": "sys/log/login",
|
||||||
"Icon": "sc-icon-OpenDoor",
|
"Icon": "sc-icon-OpenDoor",
|
||||||
"Id": 485285246504970,
|
"Id": 485285246504970,
|
||||||
"Name": "sys-log-login",
|
"Name": "sys/log/login",
|
||||||
"ParentId": 374792687640581,
|
"ParentId": 374792687640581,
|
||||||
"Path": "/sys/log/login",
|
"Path": "/sys/log/login",
|
||||||
"Sort": 99,
|
"Sort": 99,
|
||||||
@ -178,7 +199,7 @@
|
|||||||
"Id": 373838105399301,
|
"Id": 373838105399301,
|
||||||
"Name": "dev",
|
"Name": "dev",
|
||||||
"Path": "/dev",
|
"Path": "/dev",
|
||||||
"Sort": 97,
|
"Sort": 96,
|
||||||
"Title": "开发管理",
|
"Title": "开发管理",
|
||||||
"Type": 1
|
"Type": 1
|
||||||
},
|
},
|
||||||
@ -186,7 +207,7 @@
|
|||||||
"Component": "dev/code",
|
"Component": "dev/code",
|
||||||
"Icon": "sc-icon-code2",
|
"Icon": "sc-icon-code2",
|
||||||
"Id": 373838147022853,
|
"Id": 373838147022853,
|
||||||
"Name": "dev-code",
|
"Name": "dev/code",
|
||||||
"ParentId": 373838105399301,
|
"ParentId": 373838105399301,
|
||||||
"Path": "/dev/code",
|
"Path": "/dev/code",
|
||||||
"Sort": 100,
|
"Sort": 100,
|
||||||
@ -197,10 +218,20 @@
|
|||||||
"Id": 482777529417739,
|
"Id": 482777529417739,
|
||||||
"ParentId": 373838105399301,
|
"ParentId": 373838105399301,
|
||||||
"Icon": "el-icon-eleme-filled",
|
"Icon": "el-icon-eleme-filled",
|
||||||
"Name": "dev-element",
|
"Name": "dev/element",
|
||||||
"Path": "https://element-plus.gitee.io/zh-CN/component/button.html",
|
"Path": "http://element-plus.org/zh-CN/component/overview.html",
|
||||||
"Sort": 99,
|
"Sort": 99,
|
||||||
"Title": "Element",
|
"Title": "Element",
|
||||||
"Type": 3,
|
"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
|
"Sort": 100
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataScope": 1,
|
"DataScope": 4,
|
||||||
"Enabled": true,
|
"Enabled": true,
|
||||||
"Id": 371729946431493,
|
"Id": 371729946431493,
|
||||||
"Name": "普通用户",
|
"Name": "普通用户",
|
||||||
|
@ -34,5 +34,13 @@
|
|||||||
{
|
{
|
||||||
"ApiId": "api/sys/site.msg/set.site.msg.status",
|
"ApiId": "api/sys/site.msg/set.site.msg.status",
|
||||||
"RoleId": 371729946431493,
|
"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,
|
"MenuId": 373837717815301,
|
||||||
"RoleId": 371729946431493
|
"RoleId": 371729946431493
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Id": 396423792566282,
|
|
||||||
"MenuId": 374967228141573,
|
"MenuId": 374967228141573,
|
||||||
"RoleId": 371729946431493
|
"RoleId": 371729946431493
|
||||||
}
|
}
|
||||||
|
@ -6,5 +6,13 @@
|
|||||||
"Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15",
|
"Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15",
|
||||||
"Token": "A9AFD92E-A33D-4152-9A6C-A9C141D24887",
|
"Token": "A9AFD92E-A33D-4152-9A6C-A9C141D24887",
|
||||||
"UserName": "root"
|
"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,
|
"RoleId": 370943613149253,
|
||||||
"UserId": 370942943322181
|
"UserId": 370942943322181
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"RoleId": 371729946431493,
|
||||||
|
"UserId": 560217289236492
|
||||||
}
|
}
|
||||||
]
|
]
|
@ -15,15 +15,15 @@
|
|||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.10.48">
|
<PackageReference Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.12.19">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Roslynator.Analyzers" Version="4.12.4">
|
<PackageReference Include="Roslynator.Analyzers" Version="4.12.9">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.26.0.92422">
|
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.32.0.97167">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
@ -9,22 +9,4 @@
|
|||||||
Command="dotnet t4 ./gen.cs.tt -o ../dist/backend/$(ProjectName)/Ln.cs"
|
Command="dotnet t4 ./gen.cs.tt -o ../dist/backend/$(ProjectName)/Ln.cs"
|
||||||
StdOutEncoding="utf-8" />
|
StdOutEncoding="utf-8" />
|
||||||
</Target>
|
</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>
|
</Project>
|
1
docker/README.md
Normal file
1
docker/README.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
docker
|
@ -3,7 +3,7 @@
|
|||||||
"isRoot": true,
|
"isRoot": true,
|
||||||
"tools": {
|
"tools": {
|
||||||
"dotnet-t4": {
|
"dotnet-t4": {
|
||||||
"version": "2.3.1",
|
"version": "3.0.0",
|
||||||
"commands": [
|
"commands": [
|
||||||
"t4"
|
"t4"
|
||||||
]
|
]
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
"version": "1.2.0",
|
"version": "2.2.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cz-git": "^1.9.2",
|
"cz-git": "^1.11.0",
|
||||||
"commitizen": "^4.3.0",
|
"commitizen": "^4.3.1",
|
||||||
"prettier": "^3.3.0",
|
"prettier": "^3.4.1",
|
||||||
"standard-version": "^9.5.0"
|
"standard-version": "^9.5.0"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
Submodule refs/FreeSql updated: 0f6c2b807d...6ea7ac8e50
Submodule refs/Furion deleted from d23c7cca55
1
refs/Gurion
Submodule
1
refs/Gurion
Submodule
Submodule refs/Gurion added at c5c88dc135
Submodule refs/ns-ext updated: 8c0dbcf1f4...7557cb0538
@ -20,8 +20,10 @@ git tag -d $tag
|
|||||||
git tag $tag
|
git tag $tag
|
||||||
git push --tags origin release
|
git push --tags origin release
|
||||||
Start-Process -FilePath "https://github.com/nsnail/NetAdmin/compare/main...release"
|
Start-Process -FilePath "https://github.com/nsnail/NetAdmin/compare/main...release"
|
||||||
Write-Host "按『Enter』回到主分支,『Ctrl+C』退出"
|
Write-Host "按『Enter』回到tk分支,『Ctrl+C』退出"
|
||||||
Pause
|
Pause
|
||||||
git checkout main
|
git checkout main
|
||||||
git pull
|
git pull
|
||||||
git branch -D release
|
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#" #>
|
<#@ template language="C#" #>
|
||||||
<#@ output encoding="utf-8" extension="resx" #>
|
<#@ output encoding="utf-8" extension="resx" #>
|
||||||
<#@ import namespace="System.IO" #>
|
<#@ import namespace="System.IO" #>
|
||||||
|
<#@ import namespace="System.Linq" #>
|
||||||
<#@ import namespace="System.Text.RegularExpressions" #>
|
<#@ import namespace="System.Text.RegularExpressions" #>
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<root>
|
<root>
|
||||||
@ -28,14 +29,11 @@
|
|||||||
</resheader>
|
</resheader>
|
||||||
<#
|
<#
|
||||||
var regex = new Regex(@"^\d", RegexOptions.Compiled);
|
var regex = new Regex(@"^\d", RegexOptions.Compiled);
|
||||||
foreach (var file in Directory.GetFiles("../assets/res/", "*.ln"))
|
foreach (var line in Directory.GetFiles("../assets/res/", "*.ln").SelectMany(x => File.ReadLines(x)).Distinct())
|
||||||
{
|
{
|
||||||
foreach (var line in File.ReadLines(file))
|
|
||||||
{
|
|
||||||
#>
|
#>
|
||||||
<data name="<#= regex.IsMatch(line) ? "_" : "" #><#= line #>" xml:space="preserve"><value><#= line #></value></data>
|
<data name="<#= regex.IsMatch(line) ? "_" : "" #><#= line #>" xml:space="preserve"><value><#= line #></value></data>
|
||||||
<#
|
<#
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#>
|
#>
|
||||||
</root>
|
</root>
|
@ -1,4 +1,4 @@
|
|||||||
#r "nuget: NSExt, 2.1.0"
|
#r "nuget: NSExt, 2.3.2"
|
||||||
using NSExt.Extensions;
|
using NSExt.Extensions;
|
||||||
|
|
||||||
Console.WriteLine("请输入原始名称(NetAdmin):");
|
Console.WriteLine("请输入原始名称(NetAdmin):");
|
||||||
|
42
scripts/switch.nuget.or.project.csx
Normal file
42
scripts/switch.nuget.or.project.csx
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using System.Text.RegularExpressions;
|
||||||
|
string input = string.Empty;
|
||||||
|
while (!new[] { "1", "2" }.Contains(input))
|
||||||
|
{
|
||||||
|
Console.WriteLine("1.nuget 2.project");
|
||||||
|
input = Console.ReadLine();
|
||||||
|
}
|
||||||
|
var slnFile = Directory.GetFiles(@"../", "*.sln").First();
|
||||||
|
var csprojFiles = Directory.GetFiles(@"../src", "*.csproj", new EnumerationOptions { RecurseSubdirectories = true });
|
||||||
|
var slnContent = File.ReadAllText(slnFile);
|
||||||
|
|
||||||
|
if (input == "1")
|
||||||
|
{
|
||||||
|
slnContent = Regex.Replace(slnContent, "\\nProject\\((.*)#refs", "\n##Project($1#refs");
|
||||||
|
slnContent = Regex.Replace(slnContent, "\\nEndProject#refs", "\n##EndProject#refs");
|
||||||
|
foreach (Match m in Regex.Matches(slnContent, "\"(\\{[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\\})\"#refs"))
|
||||||
|
{
|
||||||
|
slnContent = slnContent.Replace($" {m.Groups[1].Value}.", $" ##{m.Groups[1].Value}.");
|
||||||
|
}
|
||||||
|
foreach (var csprojFile in csprojFiles)
|
||||||
|
{
|
||||||
|
var csprojContent = File.ReadAllText(csprojFile);
|
||||||
|
csprojContent = Regex.Replace(csprojContent," <ProjectReference(.*)Label=\"refs\"(.*)>", " <!--<ProjectReference$1Label=\"refs\"$2>-->");
|
||||||
|
csprojContent = Regex.Replace(csprojContent," <!--<PackageReference(.*)Label=\"refs\"(.*)>-->", " <PackageReference$1Label=\"refs\"$2>");
|
||||||
|
File.WriteAllText(csprojFile, csprojContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
slnContent = Regex.Replace(slnContent, "##", "");
|
||||||
|
foreach (var csprojFile in csprojFiles)
|
||||||
|
{
|
||||||
|
var csprojContent = File.ReadAllText(csprojFile);
|
||||||
|
csprojContent = Regex.Replace(csprojContent," <!--<ProjectReference(.*)Label=\"refs\"(.*)>-->", " <ProjectReference$1Label=\"refs\"$2>");
|
||||||
|
csprojContent = Regex.Replace(csprojContent," <PackageReference(.*)Label=\"refs\"(.*)>", " <!--<PackageReference$1Label=\"refs\"$2>-->");
|
||||||
|
File.WriteAllText(csprojFile, csprojContent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Console.WriteLine(slnContent);
|
||||||
|
File.WriteAllText(slnFile, slnContent);
|
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"solution": "NetAdmin.sln",
|
|
||||||
"mappings": {
|
|
||||||
"FreeSql.NS": "../refs/FreeSql/FreeSql/FreeSql.csproj",
|
|
||||||
"FreeSql.DbContext.NS": "../refs/FreeSql/FreeSql.DbContext/FreeSql.DbContext.csproj"
|
|
||||||
},
|
|
||||||
"restore": [
|
|
||||||
{
|
|
||||||
"name": "NetAdmin.Infrastructure",
|
|
||||||
"packages": [
|
|
||||||
{
|
|
||||||
"packageName": "FreeSql.NS",
|
|
||||||
"version": "3.2.821-ns1"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"packageName": "FreeSql.DbContext.NS",
|
|
||||||
"version": "3.2.821-ns1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"solution": "NetAdmin.sln",
|
|
||||||
"mappings": {
|
|
||||||
"Furion.Pure.NS": "../refs/Furion/framework/Furion.Pure/Furion.Pure.csproj"
|
|
||||||
},
|
|
||||||
"restore": [
|
|
||||||
{
|
|
||||||
"name": "NetAdmin.Infrastructure",
|
|
||||||
"packages": [
|
|
||||||
{
|
|
||||||
"packageName": "Furion.Pure.NS",
|
|
||||||
"version": "4.9.3-ns1"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"solution": "NetAdmin.sln",
|
|
||||||
"mappings": {
|
|
||||||
"NSExt": "../refs/ns-ext/src/NSExt/NSExt.csproj"
|
|
||||||
},
|
|
||||||
"restore": [
|
|
||||||
{
|
|
||||||
"name": "NetAdmin.Infrastructure",
|
|
||||||
"packages": [
|
|
||||||
{
|
|
||||||
"packageName": "NSExt",
|
|
||||||
"version": "2.1.0"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
# https://github.com/RicoSuter/DNT#switch-to-projects
|
|
||||||
$targets = @{
|
|
||||||
'1' = 'switch-to-projects'
|
|
||||||
'2' = 'switch-to-packages'
|
|
||||||
}
|
|
||||||
$key = ''
|
|
||||||
while ($null -eq $targets[$key])
|
|
||||||
{
|
|
||||||
$key = Read-Host '请选择:1(切换到项目引用) 2(切换到Nuget包引用)'
|
|
||||||
}
|
|
||||||
$files = Get-ChildItem Switcher.*.json
|
|
||||||
$file = 9999
|
|
||||||
while ($null -eq $files[[int]$file - 1])
|
|
||||||
{
|
|
||||||
$i = 0
|
|
||||||
Write-Host '请选择要切换的配置文件文件'
|
|
||||||
foreach ($file in $files)
|
|
||||||
{
|
|
||||||
$i++
|
|
||||||
Write-Host $i $file.Name
|
|
||||||
}
|
|
||||||
$file = Read-Host
|
|
||||||
}
|
|
||||||
$file = [int]$file - 1
|
|
||||||
Copy-Item $files[$file] 'switcher.json' -Force
|
|
||||||
dnt $targets[$key] ../NetAdmin.sln
|
|
||||||
Remove-Item switcher.json
|
|
@ -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 = Regex.Replace(
|
||||||
content,
|
content,
|
||||||
"Project\\(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\"\\) = \"workflows\", \"workflows\", \"{3C6F049E-3EE8-4D66-9AFF-E8A369032487}\"(?:.|\n)*?EndProject",
|
"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.Aop;
|
||||||
global using FreeSql.DataAnnotations;
|
global using FreeSql.DataAnnotations;
|
||||||
global using FreeSql.Internal.Model;
|
global using FreeSql.Internal.Model;
|
||||||
global using Furion;
|
global using Gurion;
|
||||||
global using Furion.Authorization;
|
global using Gurion.Authorization;
|
||||||
global using Furion.ConfigurableOptions;
|
global using Gurion.ConfigurableOptions;
|
||||||
global using Furion.DataEncryption;
|
global using Gurion.DataEncryption;
|
||||||
global using Furion.DataValidation;
|
global using Gurion.DataValidation;
|
||||||
global using Furion.DependencyInjection;
|
global using Gurion.DependencyInjection;
|
||||||
global using Furion.DynamicApiController;
|
global using Gurion.DynamicApiController;
|
||||||
global using Furion.EventBus;
|
global using Gurion.EventBus;
|
||||||
global using Furion.SpecificationDocument;
|
global using Gurion.SpecificationDocument;
|
||||||
global using Furion.UnifyResult;
|
global using Gurion.UnifyResult;
|
||||||
global using Mapster;
|
global using Mapster;
|
||||||
global using Microsoft.AspNetCore.Authorization;
|
global using Microsoft.AspNetCore.Authorization;
|
||||||
global using Microsoft.AspNetCore.Builder;
|
global using Microsoft.AspNetCore.Builder;
|
||||||
@ -63,8 +63,4 @@ global using NetAdmin.Infrastructure.Extensions;
|
|||||||
global using NetAdmin.Infrastructure.Languages;
|
global using NetAdmin.Infrastructure.Languages;
|
||||||
global using NetAdmin.Infrastructure.Utils;
|
global using NetAdmin.Infrastructure.Utils;
|
||||||
global using NSExt.Attributes;
|
global using NSExt.Attributes;
|
||||||
global using NSExt.Extensions;
|
global using NSExt.Extensions;
|
||||||
#if !INFRAS
|
|
||||||
global using DynamicFilterInfo = NetAdmin.Domain.Dto.Dependency.DynamicFilterInfo;
|
|
||||||
global using DynamicFilterOperators = NetAdmin.Domain.Enums.DynamicFilterOperators;
|
|
||||||
#endif
|
|
@ -1,6 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="../NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,7 +0,0 @@
|
|||||||
<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"/>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,19 +0,0 @@
|
|||||||
<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>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup Condition="'$(Configuration)' != 'Debug'">
|
|
||||||
<EmbeddedResource Include="../../../dist/frontend/admin/**/*" LinkBase="UI"/>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -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": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@ -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,9 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="../NetAdmin.Tests/NetAdmin.Tests.csproj"/>
|
|
||||||
<ProjectReference Include="../NetAdmin.AdmServer.Host/NetAdmin.AdmServer.Host.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0"/>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -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;
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
using NetAdmin.Application.Repositories;
|
|
||||||
using NetAdmin.Domain.DbMaps.Dependency;
|
|
||||||
using RedLockNet;
|
|
||||||
|
|
||||||
namespace NetAdmin.Application.Services;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// RedLocker Service Base
|
|
||||||
/// </summary>
|
|
||||||
public abstract class RedLockerService<T1, T2>(DefaultRepository<T1> rpo, RedLocker redLocker)
|
|
||||||
: RepositoryService<T1, T2>(rpo)
|
|
||||||
where T1 : EntityBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 获取锁
|
|
||||||
/// </summary>
|
|
||||||
/// <exception cref="NetAdminGetLockerException">NetAdminGetLockerException</exception>
|
|
||||||
protected async Task<IRedLock> GetLockerAsync(string lockName)
|
|
||||||
{
|
|
||||||
// 加锁
|
|
||||||
var redLock = await redLocker.RedLockFactory.CreateLockAsync( //
|
|
||||||
lockName, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_EXPIRY)
|
|
||||||
, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_WAIT)
|
|
||||||
, TimeSpan.FromSeconds(Numbers.SECS_RED_LOCK_RETRY))
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
return redLock.IsAcquired ? redLock : throw new NetAdminGetLockerException();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
using NetAdmin.Application.Repositories;
|
|
||||||
using NetAdmin.Domain.DbMaps.Dependency;
|
|
||||||
|
|
||||||
namespace NetAdmin.Application.Services;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 仓储服务基类
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TEntity">实体类型</typeparam>
|
|
||||||
/// <typeparam name="TLogger">日志类型</typeparam>
|
|
||||||
public abstract class RepositoryService<TEntity, TLogger>(DefaultRepository<TEntity> rpo) : ServiceBase<TLogger>
|
|
||||||
where TEntity : EntityBase
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 默认仓储
|
|
||||||
/// </summary>
|
|
||||||
protected DefaultRepository<TEntity> Rpo => rpo;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 启用级联保存
|
|
||||||
/// </summary>
|
|
||||||
protected bool EnableCascadeSave {
|
|
||||||
get => Rpo.DbContextOptions.EnableCascadeSave;
|
|
||||||
set => Rpo.DbContextOptions.EnableCascadeSave = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 针对 Sqlite 数据的更新操作
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>
|
|
||||||
/// 非 Sqlite 数据库请删除
|
|
||||||
/// </returns>
|
|
||||||
protected abstract Task<TEntity> UpdateForSqliteAsync(TEntity req);
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 数据库实体基类
|
|
||||||
/// </summary>
|
|
||||||
public abstract record EntityBase : DataAbstraction;
|
|
@ -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; }
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.DbMaps.Dependency.Fields;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 主键字段接口
|
|
||||||
/// </summary>
|
|
||||||
public interface IFieldPrimary<T>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 唯一编码
|
|
||||||
/// </summary>
|
|
||||||
T Id { get; init; }
|
|
||||||
}
|
|
@ -1,33 +0,0 @@
|
|||||||
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" />
|
|
||||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
|
||||||
[Snowflake]
|
|
||||||
public override long Id { get; init; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 可变实体
|
|
||||||
/// </summary>
|
|
||||||
public abstract record MutableEntity<T> : LiteMutableEntity<T>, IFieldModifiedUser
|
|
||||||
{
|
|
||||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
|
||||||
[Column(IsIdentity = false, IsPrimary = true, Position = 1)]
|
|
||||||
public override T Id { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserId" />
|
|
||||||
[Column(CanInsert = false, Position = -1)]
|
|
||||||
[JsonIgnore]
|
|
||||||
public long? ModifiedUserId { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IFieldModifiedUser.ModifiedUserName" />
|
|
||||||
[Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)]
|
|
||||||
[JsonIgnore]
|
|
||||||
public string ModifiedUserName { get; init; }
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.DbMaps.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 简单实体
|
|
||||||
/// </summary>
|
|
||||||
public abstract record SimpleEntity : EntityBase;
|
|
@ -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>();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:查询
|
|
||||||
/// </summary>
|
|
||||||
public record QueryReq<T> : DataAbstraction
|
|
||||||
where T : DataAbstraction, new()
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 取前n条
|
|
||||||
/// </summary>
|
|
||||||
[Range(1, Numbers.MAX_LIMIT_QUERY)]
|
|
||||||
public int Count { get; init; } = Numbers.MAX_LIMIT_QUERY;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 动态查询条件
|
|
||||||
/// </summary>
|
|
||||||
public DynamicFilterInfo DynamicFilter { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查询条件
|
|
||||||
/// </summary>
|
|
||||||
public T Filter { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查询关键字
|
|
||||||
/// </summary>
|
|
||||||
public string Keywords { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 排序方式
|
|
||||||
/// </summary>
|
|
||||||
public Orders? Order { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 排序字段
|
|
||||||
/// </summary>
|
|
||||||
public string Prop { get; init; }
|
|
||||||
}
|
|
@ -1,53 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.Cache;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 响应:获取所有缓存项
|
|
||||||
/// </summary>
|
|
||||||
public sealed record GetAllEntriesRsp : DataAbstraction
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="GetAllEntriesRsp" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public GetAllEntriesRsp() { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="GetAllEntriesRsp" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public GetAllEntriesRsp(long absExp, string key, long sldExp, string data)
|
|
||||||
{
|
|
||||||
AbsExp = absExp;
|
|
||||||
Key = key;
|
|
||||||
SldExp = sldExp;
|
|
||||||
Data = data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绝对过期时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime? AbsExpTime => AbsExp == -1 ? null : DateTime.FromBinary(AbsExp).ToLocalTime();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 滑动过期时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime? SldExpTime => SldExp == -1 ? null : DateTime.FromBinary(SldExp).ToLocalTime();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绝对过期时间
|
|
||||||
/// </summary>
|
|
||||||
public long AbsExp { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存值
|
|
||||||
/// </summary>
|
|
||||||
public string Data { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存键
|
|
||||||
/// </summary>
|
|
||||||
public string Key { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 滑动过期时间
|
|
||||||
/// </summary>
|
|
||||||
public long SldExp { get; init; }
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.JobRecord;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新计划作业执行记录
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateJobRecordReq : CreateJobRecordReq;
|
|
@ -1,8 +0,0 @@
|
|||||||
using NetAdmin.Domain.DbMaps.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.Domain.Dto.Sys.RequestLog;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:创建请求日志
|
|
||||||
/// </summary>
|
|
||||||
public sealed record CreateRequestLogReq : Sys_RequestLog;
|
|
@ -1,8 +0,0 @@
|
|||||||
using NetAdmin.Domain.DbMaps.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.Domain.Dto.Sys.RequestLog;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:查询请求日志
|
|
||||||
/// </summary>
|
|
||||||
public sealed record QueryRequestLogReq : Sys_RequestLog;
|
|
@ -1,107 +0,0 @@
|
|||||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
|
||||||
using NetAdmin.Domain.DbMaps.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.Domain.Dto.Sys.RequestLog;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 响应:查询请求日志
|
|
||||||
/// </summary>
|
|
||||||
public sealed record QueryRequestLogRsp : Sys_RequestLog, IRegister
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 创建者客户端IP
|
|
||||||
/// </summary>
|
|
||||||
public new string CreatedClientIp => base.CreatedClientIp?.ToIpV4();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 操作系统
|
|
||||||
/// </summary>
|
|
||||||
public string Os => UserAgentParser.Create(CreatedUserAgent)?.Platform;
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ApiId" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ApiId { get; init; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 接口描述
|
|
||||||
/// </summary>
|
|
||||||
public string ApiSummary { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IFieldCreatedTime.CreatedTime" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
public override DateTime CreatedTime { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.CreatedUserAgent" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string CreatedUserAgent { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IFieldCreatedUser.CreatedUserName" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string CreatedUserName { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.Duration" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
public override long Duration { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ErrorCode" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
public override ErrorCodes ErrorCode { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.Exception" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string Exception { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ExtraData" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ExtraData { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.HttpStatusCode" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
public override int HttpStatusCode { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.Method" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string Method { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ReferUrl" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ReferUrl { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.RequestBody" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string RequestBody { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.RequestContentType" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string RequestContentType { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.RequestHeaders" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string RequestHeaders { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.RequestUrl" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string RequestUrl { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ResponseBody" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ResponseBody { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ResponseContentType" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ResponseContentType { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ResponseHeaders" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override string ResponseHeaders { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="Sys_RequestLog.ServerIp" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
|
||||||
public override int? ServerIp { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public void Register(TypeAdapterConfig config)
|
|
||||||
{
|
|
||||||
_ = config.ForType<Sys_RequestLog, QueryRequestLogRsp>().Map(d => d.ApiSummary, s => s.Api.Summary);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
|
||||||
|
|
||||||
namespace NetAdmin.Domain.Dto.Sys.Role;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:修改角色
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateRoleReq : CreateRoleReq
|
|
||||||
{
|
|
||||||
/// <inheritdoc cref="IFieldPrimary{T}.Id" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
[Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.唯一编码不能为空))]
|
|
||||||
public override long Id { get; init; }
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IFieldVersion.Version" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
[Required(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.数据版本不能为空))]
|
|
||||||
public override long Version { get; init; }
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.SiteMsgDept;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新站内信-部门映射
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateSiteMsgDeptReq : CreateSiteMsgDeptReq;
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.SiteMsgFlag;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新站内信标记
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateSiteMsgFlagReq : CreateSiteMsgFlagReq;
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.SiteMsgRole;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新站内信-角色映射
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateSiteMsgRoleReq : CreateSiteMsgRoleReq;
|
|
@ -1,6 +0,0 @@
|
|||||||
namespace NetAdmin.Domain.Dto.Sys.SiteMsgUser;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新站内信-用户映射
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateSiteMsgUserReq : CreateSiteMsgUserReq;
|
|
@ -1,13 +0,0 @@
|
|||||||
using NetAdmin.Domain.DbMaps.Dependency.Fields;
|
|
||||||
|
|
||||||
namespace NetAdmin.Domain.Dto.Sys.UserProfile;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求:更新用户档案
|
|
||||||
/// </summary>
|
|
||||||
public sealed record UpdateUserProfileReq : CreateUserProfileReq
|
|
||||||
{
|
|
||||||
/// <inheritdoc cref="IFieldVersion.Version" />
|
|
||||||
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
|
|
||||||
public override long Version { get; init; }
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<DefineConstants>DBTYPE_SQLITE</DefineConstants>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Include="$(SolutionDir)/assets/seed-data/**" LinkBase="SeedData" CopyToOutputDirectory="PreserveNewest"/>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="../NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj"/>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,28 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Cache;
|
|
||||||
using NetAdmin.Host.Middlewares;
|
|
||||||
|
|
||||||
namespace NetAdmin.Host.Controllers;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 探针组件
|
|
||||||
/// </summary>
|
|
||||||
[ApiDescriptionSettings("Probe")]
|
|
||||||
public sealed class ProbeController : ControllerBase<ICache<IDistributedCache, IService>, IService>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 健康检查
|
|
||||||
/// </summary>
|
|
||||||
[AllowAnonymous]
|
|
||||||
[HttpGet]
|
|
||||||
#pragma warning disable CA1822, S3400
|
|
||||||
public object HealthCheck()
|
|
||||||
#pragma warning restore S3400, CA1822
|
|
||||||
{
|
|
||||||
return new {
|
|
||||||
HostName = Environment.MachineName
|
|
||||||
, CurrentConnections = SafetyShopHostMiddleware.Connections
|
|
||||||
, GlobalStatic.ProductVersion
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
namespace NetAdmin.Host.Middlewares;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 安全停机中间件
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// 放在所有中间件最前面
|
|
||||||
/// </remarks>
|
|
||||||
public sealed class SafetyShopHostMiddleware(RequestDelegate next)
|
|
||||||
{
|
|
||||||
private static long _connections;
|
|
||||||
private static bool _hostStopping;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 当前连接数
|
|
||||||
/// </summary>
|
|
||||||
public static long Connections => Interlocked.Read(ref _connections);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 停机处理
|
|
||||||
/// </summary>
|
|
||||||
public static void OnStopping()
|
|
||||||
{
|
|
||||||
Volatile.Write(ref _hostStopping, true);
|
|
||||||
while (Interlocked.Read(ref _connections) > 0) {
|
|
||||||
Thread.Sleep(10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 主函数
|
|
||||||
/// </summary>
|
|
||||||
public async Task InvokeAsync(HttpContext context)
|
|
||||||
{
|
|
||||||
if (Volatile.Read(ref _hostStopping)) {
|
|
||||||
context.Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = Interlocked.Increment(ref _connections);
|
|
||||||
await next(context).ConfigureAwait(false);
|
|
||||||
_ = Interlocked.Decrement(ref _connections);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
using NetAdmin.Domain.Contexts;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.RequestLog;
|
|
||||||
using NetAdmin.Domain.Events.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.Host.Utils;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 请求日志记录器
|
|
||||||
/// </summary>
|
|
||||||
public sealed class RequestLogger(
|
|
||||||
ILogger<RequestLogger> logger
|
|
||||||
, IOptions<SpecificationDocumentSettingsOptions> specificationDocumentSettingsOptions
|
|
||||||
, IEventPublisher eventPublisher) : ISingleton
|
|
||||||
{
|
|
||||||
private static readonly string[] _textContentTypes = ["text", "json", "xml", "urlencoded"];
|
|
||||||
|
|
||||||
private readonly int _tokenPrefixLength
|
|
||||||
= specificationDocumentSettingsOptions?.Value.SecurityDefinitions?[0]?.Scheme?.Length + 1 ??
|
|
||||||
0; // eg. "Bearer ";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 生成审计数据
|
|
||||||
/// </summary>
|
|
||||||
public async Task<CreateRequestLogReq> LogAsync(HttpContext context, long duration, string responseBody
|
|
||||||
, ErrorCodes errorCode, IExceptionHandlerFeature exception)
|
|
||||||
{
|
|
||||||
// 从请求头中读取用户信息
|
|
||||||
var associatedUser = GetAssociatedUser(context);
|
|
||||||
|
|
||||||
var auditData = new CreateRequestLogReq {
|
|
||||||
Duration = duration
|
|
||||||
, Method = context.Request.Method
|
|
||||||
, ReferUrl = context.Request.GetRefererUrlAddress()
|
|
||||||
, RequestContentType = context.Request.ContentType
|
|
||||||
, RequestBody = Array.Exists( //
|
|
||||||
_textContentTypes
|
|
||||||
, x => context.Request.ContentType?.Contains(
|
|
||||||
x, StringComparison.OrdinalIgnoreCase) ?? false)
|
|
||||||
? (await context.ReadBodyContentAsync().ConfigureAwait(false))
|
|
||||||
?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)
|
|
||||||
: string.Empty
|
|
||||||
, RequestUrl = context.Request.GetRequestUrlAddress()
|
|
||||||
, ResponseBody
|
|
||||||
= responseBody?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)
|
|
||||||
, ServerIp = context.GetLocalIpAddressToIPv4()?.IpV4ToInt32()
|
|
||||||
, ApiId = context.Request.Path.Value?.TrimStart('/')
|
|
||||||
, RequestHeaders = context.Request.Headers.Json()
|
|
||||||
, ResponseContentType = context.Response.ContentType
|
|
||||||
, ResponseHeaders = context.Response.Headers.Json()
|
|
||||||
, HttpStatusCode = context.Response.StatusCode
|
|
||||||
, ErrorCode = errorCode
|
|
||||||
, Exception = exception?.Error.ToString()
|
|
||||||
, CreatedUserId = associatedUser?.UserId
|
|
||||||
, CreatedUserName = associatedUser?.UserName
|
|
||||||
, CreatedUserAgent = context.Request.Headers.UserAgent.ToString()
|
|
||||||
, CreatedClientIp = context.GetRealIpAddress()
|
|
||||||
?.MapToIPv4()
|
|
||||||
.ToString()
|
|
||||||
.IpV4ToInt32()
|
|
||||||
};
|
|
||||||
|
|
||||||
// 打印日志
|
|
||||||
logger.Info(auditData);
|
|
||||||
|
|
||||||
// 发布请求日志事件
|
|
||||||
await eventPublisher.PublishAsync(new RequestLogEvent(auditData)).ConfigureAwait(false);
|
|
||||||
|
|
||||||
return auditData;
|
|
||||||
}
|
|
||||||
|
|
||||||
private (long UserId, string UserName)? GetAssociatedUser(HttpContext context)
|
|
||||||
{
|
|
||||||
var token = context.Request.Headers.Authorization.FirstOrDefault();
|
|
||||||
if (token == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContextUserToken userToken = null;
|
|
||||||
try {
|
|
||||||
var jsonWebToken = JWTEncryption.ReadJwtToken(token[_tokenPrefixLength..]);
|
|
||||||
var claim = jsonWebToken?.Claims.FirstOrDefault(y => y.Type == nameof(ContextUserToken));
|
|
||||||
userToken = claim?.Value.ToObject<ContextUserToken>();
|
|
||||||
}
|
|
||||||
catch (Exception ex) {
|
|
||||||
logger.Warn($"{Ln.读取用户令牌出错}: {ex}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return userToken == null ? null : (userToken.Id, userToken.UserName);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,32 +0,0 @@
|
|||||||
#pragma warning disable CS1591
|
|
||||||
|
|
||||||
namespace NetAdmin.Infrastructure.Constant;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 数字常量表
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// public类型会通过接口暴露给前端
|
|
||||||
/// </remarks>
|
|
||||||
public static class Numbers
|
|
||||||
{
|
|
||||||
public const int DEF_PAGE_SIZE_QUERY = 20; // 分页查询默认的页容量
|
|
||||||
public const long DEF_SORT_VAL = 100; // 排序默认值
|
|
||||||
|
|
||||||
public const int HTTP_STATUS_BIZ_FAIL = 900; // Http状态码-业务异常
|
|
||||||
public const long ID_DIC_CATALOG_GEO_AREA = 379794295185413; // 唯一编号:字典目录-行政区划字典
|
|
||||||
|
|
||||||
public const int MAX_LIMIT_BULK_REQ = 100; // 最大限制:批量请求数
|
|
||||||
public const int MAX_LIMIT_PRINT_LEN_CONTENT = 4096; // 最大限制:打印长度(HTTP 内容)
|
|
||||||
public const int MAX_LIMIT_PRINT_LEN_SQL = 4096; // 最大限制:打印长度(SQL 语句)
|
|
||||||
public const int MAX_LIMIT_QUERY = 1000; // 最大限制:非分页查询条数
|
|
||||||
public const int MAX_LIMIT_QUERY_PAGE_NO = 10000; // 最大限制:分页查询页码
|
|
||||||
public const int MAX_LIMIT_QUERY_PAGE_SIZE = 100; // 最大限制:分页查询页容量
|
|
||||||
|
|
||||||
public const int SECS_CACHE_CHART = 300; // 秒:缓存时间-仪表
|
|
||||||
public const int SECS_CACHE_DEFAULT = 60; // 秒:缓存时间-默认
|
|
||||||
public const int SECS_RED_LOCK_EXPIRY = 30; // 秒:RedLock-锁过期时间,锁区域内的逻辑执行如果超过过期时间,锁将被释放
|
|
||||||
public const int SECS_RED_LOCK_RETRY = 1; // 秒:RedLock-锁等待时间内,多久尝试获取一次
|
|
||||||
public const int SECS_RED_LOCK_WAIT = 10; // 秒:RedLock-锁等待时间,相同的 resource 如果当前的锁被其他线程占用,最多等待时间
|
|
||||||
public const int SECS_TIMEOUT_JOB = 600; // 秒:超时时间-作业
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
namespace NetAdmin.Infrastructure.Exceptions;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 加锁失败异常
|
|
||||||
/// </summary>
|
|
||||||
#pragma warning disable RCS1194
|
|
||||||
public sealed class NetAdminGetLockerException : NetAdminException;
|
|
||||||
#pragma warning restore RCS1194
|
|
@ -1,24 +0,0 @@
|
|||||||
namespace NetAdmin.Infrastructure.Exceptions;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 无效操作异常
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// 非正常的业务流程或逻辑
|
|
||||||
/// </remarks>
|
|
||||||
#pragma warning disable RCS1194, DesignedForInheritance
|
|
||||||
public class NetAdminInvalidOperationException : NetAdminException
|
|
||||||
#pragma warning restore DesignedForInheritance, RCS1194
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="NetAdminInvalidOperationException" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public NetAdminInvalidOperationException(string message, Exception innerException = null) //
|
|
||||||
: this(ErrorCodes.InvalidOperation, message, innerException) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="NetAdminInvalidOperationException" /> class.
|
|
||||||
/// </summary>
|
|
||||||
protected NetAdminInvalidOperationException(ErrorCodes errorCode, string message, Exception innerException) //
|
|
||||||
: base(errorCode, message, innerException) { }
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
namespace NetAdmin.Infrastructure.Exceptions;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 非预期结果异常
|
|
||||||
/// </summary>
|
|
||||||
/// <remarks>
|
|
||||||
/// 运行结果是非预期的,例如事务失败回滚
|
|
||||||
/// </remarks>
|
|
||||||
#pragma warning disable RCS1194, DesignedForInheritance
|
|
||||||
public class NetAdminUnexpectedException : NetAdminException
|
|
||||||
#pragma warning restore DesignedForInheritance, RCS1194
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="NetAdminUnexpectedException" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public NetAdminUnexpectedException(string message) //
|
|
||||||
: this(ErrorCodes.Unexpected, message) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="NetAdminUnexpectedException" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public NetAdminUnexpectedException() //
|
|
||||||
: this(string.Empty) { }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="NetAdminUnexpectedException" /> class.
|
|
||||||
/// </summary>
|
|
||||||
protected NetAdminUnexpectedException(ErrorCodes errorCode, string message) //
|
|
||||||
: base(errorCode, message) { }
|
|
||||||
}
|
|
@ -1,38 +0,0 @@
|
|||||||
namespace NetAdmin.Infrastructure.Extensions;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// HttpResponseMessage 扩展方法
|
|
||||||
/// </summary>
|
|
||||||
public static class HttpResponseMessageExtensions
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 记录日志
|
|
||||||
/// </summary>
|
|
||||||
public static async Task LogAsync<T>(this HttpResponseMessage me, ILogger<T> logger
|
|
||||||
, Func<string, string> bodyPreHandle = null)
|
|
||||||
{
|
|
||||||
logger.Info(
|
|
||||||
(await me.BuildJsonAsync(bodyPreHandle).ConfigureAwait(false))?.Sub(
|
|
||||||
0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 记录异常日志
|
|
||||||
/// </summary>
|
|
||||||
public static async Task LogExceptionAsync<T>(this HttpResponseMessage me, string errors, ILogger<T> logger
|
|
||||||
, Func<string, string> bodyHandle = null)
|
|
||||||
{
|
|
||||||
logger.Warn(
|
|
||||||
$"{errors}: {(await me.BuildJsonAsync(bodyHandle).ConfigureAwait(false))?.Sub(0, Numbers.MAX_LIMIT_PRINT_LEN_CONTENT)}");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 将Http请求的Uri、Header、Body打包成Json字符串
|
|
||||||
/// </summary>
|
|
||||||
private static async Task<string> BuildJsonAsync( //
|
|
||||||
this HttpResponseMessage me, Func<string, string> bodyHandle = null)
|
|
||||||
{
|
|
||||||
var body = me?.Content is null ? null : await me.Content!.ReadAsStringAsync().ConfigureAwait(false);
|
|
||||||
return new { Header = me?.ToString(), Body = bodyHandle is null ? body : bodyHandle(body) }.ToJson();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
<PropertyGroup>
|
|
||||||
<DefineConstants>INFRAS</DefineConstants>
|
|
||||||
</PropertyGroup>
|
|
||||||
<Import Project="$(SolutionDir)/build/code.quality.props"/>
|
|
||||||
<Import Project="$(SolutionDir)/build/copy.pkg.xml.comment.files.targets"/>
|
|
||||||
<Import Project="$(SolutionDir)/build/prebuild.targets"/>
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Cronos" Version="0.8.4"/>
|
|
||||||
<PackageReference Include="FreeSql.DbContext.NS" Version="3.2.821-ns1"/>
|
|
||||||
<PackageReference Include="FreeSql.Provider.SqlServer.NS" Version="3.2.821-ns1"/>
|
|
||||||
<PackageReference Include="FreeSql.Provider.Sqlite.NS" Version="3.2.821-ns1"/>
|
|
||||||
<PackageReference Include="Furion.Extras.Authentication.JwtBearer" Version="4.9.3"/>
|
|
||||||
<PackageReference Include="Furion.Extras.ObjectMapper.Mapster.NS" Version="4.9.3-ns1"/>
|
|
||||||
<PackageReference Include="Furion.Pure.NS" Version="4.9.3-ns1"/>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.0-preview.4.24267.6"/>
|
|
||||||
<PackageReference Include="Minio" Version="6.0.2"/>
|
|
||||||
<PackageReference Include="NSExt" Version="2.1.0"/>
|
|
||||||
<PackageReference Include="RedLock.net" Version="2.3.2"/>
|
|
||||||
<PackageReference Include="SixLabors.ImageSharp.Drawing" Version="1.0.0"/>
|
|
||||||
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14"/>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Update="*.json">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
</Project>
|
|
@ -1,98 +0,0 @@
|
|||||||
using RedLockNet.SERedis;
|
|
||||||
using RedLockNet.SERedis.Configuration;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
|
|
||||||
namespace NetAdmin.Infrastructure.Utils;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Redis 分布锁
|
|
||||||
/// </summary>
|
|
||||||
#pragma warning disable DesignedForInheritance
|
|
||||||
public class RedLocker : IDisposable, ISingleton
|
|
||||||
#pragma warning restore DesignedForInheritance
|
|
||||||
{
|
|
||||||
// Track whether Dispose has been called.
|
|
||||||
private bool _disposed;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="RedLocker" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public RedLocker(IOptions<RedisOptions> redisOptions)
|
|
||||||
{
|
|
||||||
RedLockFactory = RedLockFactory.Create( //
|
|
||||||
new List<RedLockMultiplexer> //
|
|
||||||
{
|
|
||||||
ConnectionMultiplexer.Connect( //
|
|
||||||
redisOptions.Value.Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE).ConnStr)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Finalizes an instance of the <see cref="RedLocker" /> class.
|
|
||||||
/// Use C# finalizer syntax for finalization code.
|
|
||||||
/// This finalizer will run only if the Dispose method
|
|
||||||
/// does not get called.
|
|
||||||
/// It gives your base class the opportunity to finalize.
|
|
||||||
/// Do not provide finalizer in types derived from this class.
|
|
||||||
/// </summary>
|
|
||||||
~RedLocker()
|
|
||||||
{
|
|
||||||
// Do not re-create Dispose clean-up code here.
|
|
||||||
// Calling Dispose(disposing: false) is optimal in terms of
|
|
||||||
// readability and maintainability.
|
|
||||||
Dispose(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// RedLockFactory
|
|
||||||
/// </summary>
|
|
||||||
public RedLockFactory RedLockFactory { get; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Implement IDisposable.
|
|
||||||
/// Do not make this method virtual.
|
|
||||||
/// A derived class should not be able to override this method.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
Dispose(true);
|
|
||||||
|
|
||||||
// This object will be cleaned up by the Dispose method.
|
|
||||||
// Therefore, you should call GC.SuppressFinalize to
|
|
||||||
// take this object off the finalization queue
|
|
||||||
// and prevent finalization code for this object
|
|
||||||
// from executing a second time.
|
|
||||||
GC.SuppressFinalize(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Dispose(bool disposing) executes in two distinct scenarios.
|
|
||||||
/// If disposing equals true, the method has been called directly
|
|
||||||
/// or indirectly by a user's code. Managed and unmanaged resources
|
|
||||||
/// can be disposed.
|
|
||||||
/// If disposing equals false, the method has been called by the
|
|
||||||
/// runtime from inside the finalizer and you should not reference
|
|
||||||
/// other objects. Only unmanaged resources can be disposed.
|
|
||||||
/// </summary>
|
|
||||||
protected virtual void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
// Check to see if Dispose has already been called.
|
|
||||||
if (_disposed) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If disposing equals true, dispose all managed
|
|
||||||
// and unmanaged resources.
|
|
||||||
if (disposing) {
|
|
||||||
RedLockFactory.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Call the appropriate methods to clean up
|
|
||||||
// unmanaged resources here.
|
|
||||||
// If disposing is false,
|
|
||||||
// only the following code is executed.
|
|
||||||
|
|
||||||
// Note disposing has been done.
|
|
||||||
_disposed = true;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
|
|
||||||
"AppSettings": {
|
|
||||||
"InjectSpecificationDocument": true,
|
|
||||||
"InjectMiniProfiler": true
|
|
||||||
},
|
|
||||||
"JWTSettings": {
|
|
||||||
"ExpiredTime": 20000
|
|
||||||
},
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Debug",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
|
|
||||||
"AppSettings": {
|
|
||||||
"InjectSpecificationDocument": true,
|
|
||||||
"InjectMiniProfiler": true
|
|
||||||
},
|
|
||||||
"JWTSettings": {
|
|
||||||
"ExpiredTime": 20000
|
|
||||||
},
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Debug",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,332 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
|
|
||||||
// App基本配置
|
|
||||||
"AppSettings": {
|
|
||||||
// AppSettings:配置根节点
|
|
||||||
// InjectMiniProfiler:是否注入 MiniProfiler,bool 类型,默认 true,关闭 Swagger 左上角监听
|
|
||||||
// InjectSpecificationDocument:是否启用 Swagger 文档,bool 类型,默认 true,生产环境可关闭
|
|
||||||
// EnabledReferenceAssemblyScan:是否启用通过 dll 方式添加的引用程序集扫描,bool 类型,默认 false
|
|
||||||
// ExternalAssemblies:配置外部程序集完整路径,支持动态加载,string[] 类型,默认 []
|
|
||||||
// PrintDbConnectionInfo:是否打印数据库连接信息到 MiniProfiler 中,bool 类型,默认 true
|
|
||||||
// SupportPackageNamePrefixs:配置支持的包前缀名,string[] 类型,默认 []
|
|
||||||
// OutputOriginalSqlExecuteLog:是否输出原始 Sql 执行日志(ADO.NET),默认 true
|
|
||||||
// VirtualPath:配置虚拟目录,必须以 / 开头
|
|
||||||
"InjectSpecificationDocument": false,
|
|
||||||
"InjectMiniProfiler": false
|
|
||||||
},
|
|
||||||
// Swagger文档配置 ------------------------------------------------------------------------------
|
|
||||||
"SpecificationDocumentSettings": {
|
|
||||||
// DocumentTitle:文档标题,string,默认 Specification Api Document
|
|
||||||
// DefaultGroupName:默认分组名,string,默认 Default
|
|
||||||
// EnableAuthorized:是否启用权限控制,bool,默认 true
|
|
||||||
// FormatAsV2:采用 Swagger 2.0 版本,bool,默认 false 已弃用
|
|
||||||
// RoutePrefix:规范化文档地址,string,默认 api,如果希望在首页,改为空字符串即可。
|
|
||||||
// DocExpansionState:文档显示方式,DocExpansion,默认 List,取值:
|
|
||||||
// List:列表式(展开子类),默认值
|
|
||||||
// Full:完全展开
|
|
||||||
// None:列表式(不展开子类)
|
|
||||||
// XmlComments:程序集注释描述文件名(可带 .xml,string,默认 Furion.Application, Furion.Web.Entry, Furion.Web.Core
|
|
||||||
// GroupOpenApiInfos:分组信息配置,SpecificationOpenApiInfo[],默认 { 'Group': 'Default'}
|
|
||||||
// SecurityDefinitions:安全策略定义配置,SpecificationOpenApiSecurityScheme[],默认 []
|
|
||||||
// Servers:配置 Server 下拉列表,OpenApiServer[] 类型,默认 [],如:{Servers:[ { Url:"地址", Description:"描述"} ]}
|
|
||||||
// HideServers:是否隐藏 Server 下拉列表,bool 类型,默认 true
|
|
||||||
// RouteTemplate:配置文档 swagger.json 路由模板,默认模板:swagger/{documentName}/swagger.json, {documentName} 代表分组名,必须保留原样
|
|
||||||
// PackagesGroups:配置模块化内置分组名称,string[] 类型,默认 []
|
|
||||||
// EnableEnumSchemaFilter:启用枚举 Schema 筛选器,bool 类型,默认 true
|
|
||||||
// EnableTagsOrderDocumentFilter:启用标签排序筛选器,bool 类型,默认 true
|
|
||||||
// ServerDir:配置 IIS 添加 Application 部署名,string 类型,默认空,仅在 Furion v3.2.0+` 有效
|
|
||||||
// LoginInfo:配置 Swagger 是否需要登录才能访问,SpecificationLoginInfo 类型,默认 null,仅在 Furion v3.3.3+` 有效
|
|
||||||
// Enabled:是否启用登录授权,默认 false
|
|
||||||
// CheckUrl:检查登录状态的 Url 地址,该地址必须是 POST 请求,已授权返回 200,否则返回 401
|
|
||||||
// SubmitUrl:提交登录的 Url 地址,该地址必须是 POST 请求且只有一个 SpecificationAuth 类型参数,成功登录返回 200,否则返回 401,支持相对地址,以 / 开头
|
|
||||||
// EnableAllGroups:启用 Swagger 总分组功能,自动将所有分组的接口合并到 All Groups 中,bool 类型,默认 false,仅在 Furion v3.3.4+` 有效
|
|
||||||
// 另外 SpecificationOpenApiInfo 内置配置如下:
|
|
||||||
//
|
|
||||||
// Group:分组唯一标识,string 类型,必填
|
|
||||||
// Order:分组排序,int 类型,数字越大排前面,默认 0
|
|
||||||
// Visible:配置分组是否可见,bool 类型,默认 true
|
|
||||||
// Title:配置分组标题,string 类型
|
|
||||||
// Description:配置分组描述,string 类型
|
|
||||||
// Version:配置分组版本,默认 1.0
|
|
||||||
// TermsOfService:配置相关链接地址,Uri 类型
|
|
||||||
// Contact:配置联系方式,OpenApiContact 类型
|
|
||||||
// License:配置协议,OpenApiLicense 类型
|
|
||||||
"EnableEnumSchemaFilter": false,
|
|
||||||
"EnableAuthorized": false,
|
|
||||||
"RoutePrefix": "swagger",
|
|
||||||
"XmlComments": [
|
|
||||||
"FreeSql.xml",
|
|
||||||
"NetAdmin.AdmServer.Application.xml",
|
|
||||||
"NetAdmin.AdmServer.Cache.xml",
|
|
||||||
"NetAdmin.AdmServer.Host.xml",
|
|
||||||
"NetAdmin.Application.xml",
|
|
||||||
"NetAdmin.Cache.xml",
|
|
||||||
"NetAdmin.Domain.xml",
|
|
||||||
"NetAdmin.Host.xml",
|
|
||||||
"NetAdmin.Infrastructure.xml",
|
|
||||||
"NetAdmin.ScheduledService.xml",
|
|
||||||
"NetAdmin.SysComponent.Application.xml",
|
|
||||||
"NetAdmin.SysComponent.Cache.xml",
|
|
||||||
"NetAdmin.SysComponent.Host.xml",
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 验证码配置 --------------------------------------------------------------------------------------------------------
|
|
||||||
"Captcha": {
|
|
||||||
"ImageRelativePath": ".data/captcha",
|
|
||||||
"SecretKey": "1Z?f(2)%v?:X5NYRl+]PSi.rDf7Ip#lB"
|
|
||||||
},
|
|
||||||
// 跨域配置 ----------------------------------------------------------------------------------------------------------
|
|
||||||
"CorsAccessorSettings": {
|
|
||||||
// CorsAccessorSettings
|
|
||||||
// PolicyName:跨域策略名,string 类型,必填,默认 App.Cors.Policy
|
|
||||||
// WithOrigins:允许跨域的域名列表,string[] 类型,默认 *
|
|
||||||
// WithHeaders:请求表头,没有配置则允许所有表头,string[] 类型
|
|
||||||
// WithExposedHeaders:设置客户端可获取的响应标头,string[] 类型,默认 ["access-token", "x-access-token"]
|
|
||||||
// WithMethods:设置跨域允许请求谓词,没有配置则允许所有,string[] 类型
|
|
||||||
// AllowCredentials:是否允许跨域请求中的凭据,bool 类型,默认值 true
|
|
||||||
// SetPreflightMaxAge:设置预检过期时间,int 类型,默认值 24小时
|
|
||||||
// FixedClientToken:是否默认配置 WithExposedHeaders,bool 类型,默认 true
|
|
||||||
// SignalRSupport:是否启用 SignalR 跨域支持,bool 类型,默认 false
|
|
||||||
"WithExposedHeaders": [
|
|
||||||
"access-token",
|
|
||||||
"x-access-token",
|
|
||||||
"content-disposition"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// 数据库配置 --------------------------------------------------------------------------------------------------------
|
|
||||||
"Database": {
|
|
||||||
"DbType": "Sqlite",
|
|
||||||
"ConnStr": "data source=NetAdmin.db",
|
|
||||||
"SeedDataRelativePath": "SeedData"
|
|
||||||
},
|
|
||||||
// 动态webapi配置 ----------------------------------------------------------------------------------------------------
|
|
||||||
"DynamicApiControllerSettings": {
|
|
||||||
// 5.1.10 DynamicApiControllerSettings 配置
|
|
||||||
// Furion 还提供动态 WebAPI 接口一些全局配置选项,如:
|
|
||||||
//
|
|
||||||
// DefaultRoutePrefix:默认路由前缀,string,默认 api
|
|
||||||
// DefaultHttpMethod:默认请求谓词,string,默认:POST
|
|
||||||
// DefaultModule:默认模块名称(区域),可用作接口版本,string,默认:v1
|
|
||||||
// LowercaseRoute:小写路由格式,bool,默认:true
|
|
||||||
// AsLowerCamelCase:启用小驼峰命名(首字母小写),默认 false
|
|
||||||
// KeepVerb:是否保留动作谓词,bool,默认:false
|
|
||||||
// KeepName:是否保留默认名称,bool,默认:fasle
|
|
||||||
// CamelCaseSeparator:骆驼(驼峰)/帕斯卡命名分隔符,string,默认:-
|
|
||||||
// VersionSeparator:版本分隔符,string,默认:@
|
|
||||||
// ModelToQuery:GET/HEAD 请求将 类类型参数转查询参数,bool,默认 false
|
|
||||||
// SupportedMvcController:是否支持 Mvc Controller 动态配置,bool,默认 false
|
|
||||||
// UrlParameterization:路由参数采用 [FromQuery] 化,默认 false([FromRoute] 方式)
|
|
||||||
// DefaultArea:配置默认区域,默认 null
|
|
||||||
// ForceWithRoutePrefix:配置是否强制添加 DefaultRoutePrefix,当控制器自定义了 [Route] 有效,仅限 v3.4.1+版本有效
|
|
||||||
// AbandonControllerAffixes:默认去除控制器名称前后缀列表名,string[],默认:
|
|
||||||
// AppServices
|
|
||||||
// AppService
|
|
||||||
// ApiController
|
|
||||||
// Controller
|
|
||||||
// Services
|
|
||||||
// Service
|
|
||||||
// AbandonActionAffixes:默认去除动作方法名称前后缀列表名,string[],默认:
|
|
||||||
// Async
|
|
||||||
// VerbToHttpMethods:复写默认方法名转 [HttpMethod] 规则,string[][] 二维数组类型,内置匹配规则为:
|
|
||||||
// ["post"] = "POST",
|
|
||||||
// ["add"] = "POST",
|
|
||||||
// ["create"] = "POST",
|
|
||||||
// ["insert"] = "POST",
|
|
||||||
// ["submit"] = "POST",
|
|
||||||
// ["get"] = "GET",
|
|
||||||
// ["find"] = "GET",
|
|
||||||
// ["fetch"] = "GET",
|
|
||||||
// ["query"] = "GET",
|
|
||||||
// ["getlist"] = "GET",
|
|
||||||
// ["getall"] = "GET",
|
|
||||||
// ["put"] = "PUT",
|
|
||||||
// ["update"] = "PUT",
|
|
||||||
// ["delete"] = "DELETE",
|
|
||||||
// ["remove"] = "DELETE",
|
|
||||||
// ["clear"] = "DELETE",
|
|
||||||
// ["patch"] = "PATCH"
|
|
||||||
//
|
|
||||||
// 复写示例
|
|
||||||
// "DynamicApiControllerSettings": {
|
|
||||||
// "VerbToHttpMethods": [
|
|
||||||
// [ "getall", "HEAD" ], // => getall 会被复写为 `[HttpHead]`
|
|
||||||
// [ "other", "PUT" ] // => 新增一条新规则,比如,一 `[other]` 开头会转换为 `[HttpPut]` 请求
|
|
||||||
// ]
|
|
||||||
// }
|
|
||||||
// "DefaultRoutePrefix": "rest",
|
|
||||||
"VerbToHttpMethods": [
|
|
||||||
[
|
|
||||||
"post",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"add",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"create",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"insert",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"submit",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"get",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"find",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"fetch",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"query",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"getlist",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"getall",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"put",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"update",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"delete",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"remove",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"clear",
|
|
||||||
"POST"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"patch",
|
|
||||||
"POST"
|
|
||||||
]
|
|
||||||
],
|
|
||||||
"CamelCaseSeparator": ".",
|
|
||||||
"UrlParameterization": true,
|
|
||||||
"KeepVerb": true,
|
|
||||||
"AbandonControllerAffixes": [
|
|
||||||
"Controller"
|
|
||||||
],
|
|
||||||
},
|
|
||||||
// 友好异常配置 -------------------------------------------------------------------------------------------------------
|
|
||||||
"FriendlyExceptionSettings": {
|
|
||||||
// 7.15 FriendlyExceptionSettings 配置
|
|
||||||
// HideErrorCode:隐藏错误码,bool 类型,默认 false
|
|
||||||
// DefaultErrorCode:默认错误码,string 类型
|
|
||||||
// DefaultErrorMessage:默认错误消息,string 类型
|
|
||||||
// ThrowBah:是否将 Oops.Oh 默认抛出为业务异常,bool 类型,默认 false,设置 true 之后 Oops.Oh 默认进入 OnValidateFailed 处理,而不是 OnException
|
|
||||||
// LogError:是否输出异常日志,bool 类型,默认 true
|
|
||||||
"LogError": false
|
|
||||||
},
|
|
||||||
// JWT鉴权配置 -------------------------------------------------------------------------------------------------------
|
|
||||||
"JWTSettings": {
|
|
||||||
"ValidateIssuerSigningKey": true,
|
|
||||||
// 是否验证密钥,bool 类型,默认true
|
|
||||||
"IssuerSigningKey": "bO0BCAGxpxYnm6AE4XpgO25T27NayFzjGgfDqBuzUzD6ROpFiZUi3KjVg93bdGek",
|
|
||||||
// 密钥,string 类型,必须是复杂密钥,长度大于16
|
|
||||||
"ValidateIssuer": true,
|
|
||||||
// 是否验证签发方,bool 类型,默认true
|
|
||||||
"ValidIssuer": "签发方",
|
|
||||||
// 签发方,string 类型
|
|
||||||
"ValidateAudience": true,
|
|
||||||
// 是否验证签收方,bool 类型,默认true
|
|
||||||
"ValidAudience": "签收方",
|
|
||||||
// 签收方,string 类型
|
|
||||||
"ValidateLifetime": true,
|
|
||||||
// 是否验证过期时间,bool 类型,默认true,建议true
|
|
||||||
"ExpiredTime": 20,
|
|
||||||
// 过期时间,long 类型,单位分钟,默认20分钟
|
|
||||||
"ClockSkew": 5,
|
|
||||||
// 过期时间容错值,long 类型,单位秒,默认 5秒
|
|
||||||
"Algorithm": "HS256"
|
|
||||||
// 加密算法,string 类型,默认 HS256
|
|
||||||
},
|
|
||||||
// 日志配置 ----------------------------------------------------------------------------------------------------------
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Information",
|
|
||||||
"Microsoft.AspNetCore": "Warning",
|
|
||||||
"System.Logging.EventBusService": "Error"
|
|
||||||
},
|
|
||||||
"Monitor": {
|
|
||||||
"GlobalEnabled": false,
|
|
||||||
// 是否启用全局拦截,默认 `false`
|
|
||||||
// "IncludeOfMethods": [], // 是否指定拦截特定方法,当 GlobalEnabled: false 有效
|
|
||||||
// "ExcludeOfMethods": [], // 是否指定排除特定方法,当 GlobalEnabled: true 有效
|
|
||||||
// "BahLogLevel": "Information", // 配置 Oops.Oh 和 Oops.Bah 业务日志输出级别,默认 Information
|
|
||||||
// "WithReturnValue": true, // 配置是否包含返回值,默认 `true`,Furion 4.3.9+ 有效
|
|
||||||
"ReturnValueThreshold": 1000
|
|
||||||
// 配置返回值字符串阈值,默认 0,全量输出,Furion 4.3.9+ 有效
|
|
||||||
// "JsonBehavior": "None", // 配置 LoggingMonitor Json 输出行为,默认 None,Furion 4.5.2+ 有效
|
|
||||||
// "MethodsSettings": [
|
|
||||||
// // 配置被监视方法更多信息,Furion 4.3.9+ 有效
|
|
||||||
// {
|
|
||||||
// "FullName": "Furion.Application.TestLoggerServices.MethodName", // 方法完全限定名
|
|
||||||
// "WithReturnValue": true, // 配置是否包含返回值,默认 `true`,Furion 4.3.9+ 有效
|
|
||||||
// "ReturnValueThreshold": 0 // 配置返回值字符串阈值,默认 0,全量输出,Furion 4.3.9+ 有效
|
|
||||||
// }
|
|
||||||
// ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// Redis配置 --------------------------------------------------------------------------------------------------------
|
|
||||||
"Redis": {
|
|
||||||
"Instances": [
|
|
||||||
// 数据缓存
|
|
||||||
{
|
|
||||||
"Name": "DataCache",
|
|
||||||
"ConnStr": "localhost:6379,abortConnect=false",
|
|
||||||
"DataBase": 0,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// UnifyResultSettings 规范化配置 ------------------------------------------------------------------------------------
|
|
||||||
"UnifyResultSettings": {
|
|
||||||
// Return200StatusCodes:配置返回 200 状态码的请求,int[] 类型,只支持 400+(404除外) 状态码篡改
|
|
||||||
// AdaptStatusCodes:配置篡改状态码规则,int[][] 类型,只支持 400+(404除外) 状态码篡改
|
|
||||||
// SupportMvcController:是否支持 MVC 控制台规范化处理,bool 类型,默认 false
|
|
||||||
"Return200StatusCodes": [
|
|
||||||
999
|
|
||||||
],
|
|
||||||
},
|
|
||||||
// 文件上传配置 -------------------------------------------------------------------------------------------------------
|
|
||||||
"Upload": {
|
|
||||||
"ContentTypes": [
|
|
||||||
"image/jpg",
|
|
||||||
"image/png",
|
|
||||||
"image/jpeg",
|
|
||||||
"image/gif"
|
|
||||||
],
|
|
||||||
"MaxSize": 1073741824,
|
|
||||||
"Minio": {
|
|
||||||
"ServerAddress": "vm-ubt-1:9000",
|
|
||||||
"AccessKey": "nVMM0gSqwyIjM8iZ",
|
|
||||||
"SecretKey": "F8OZngGrNsZSYn4MP9swwMSf5rfm61EC",
|
|
||||||
"BucketName": "net-admin",
|
|
||||||
"AccessUrl": "http://vm-ubt-1:9000",
|
|
||||||
"Secure": false,
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
using NetAdmin.Domain.Dto.Dependency;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.Cache;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Modules.Sys;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存模块
|
|
||||||
/// </summary>
|
|
||||||
public interface ICacheModule
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 缓存统计
|
|
||||||
/// </summary>
|
|
||||||
Task<CacheStatisticsRsp> CacheStatisticsAsync();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取所有缓存项
|
|
||||||
/// </summary>
|
|
||||||
Task<PagedQueryRsp<GetAllEntriesRsp>> GetAllEntriesAsync(PagedQueryReq<GetAllEntriesReq> req);
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
using NetAdmin.Application.Modules;
|
|
||||||
using NetAdmin.Domain.Dto.Dependency;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.Role;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Modules.Sys;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 角色模块
|
|
||||||
/// </summary>
|
|
||||||
public interface IRoleModule : ICrudModule<CreateRoleReq, QueryRoleRsp // 创建类型
|
|
||||||
, QueryRoleReq, QueryRoleRsp // 查询类型
|
|
||||||
, UpdateRoleReq, QueryRoleRsp // 修改类型
|
|
||||||
, DelReq // 删除类型
|
|
||||||
>;
|
|
@ -1,53 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Domain.Dto.Dependency;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.Cache;
|
|
||||||
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
using StackExchange.Redis;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys;
|
|
||||||
|
|
||||||
/// <inheritdoc cref="ICacheService" />
|
|
||||||
public sealed class CacheService(IConnectionMultiplexer connectionMultiplexer) //
|
|
||||||
: ServiceBase<ICacheService>, ICacheService
|
|
||||||
{
|
|
||||||
private readonly InstanceNode _redisInstance;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new instance of the <see cref="CacheService" /> class.
|
|
||||||
/// </summary>
|
|
||||||
public CacheService(IConnectionMultiplexer connectionMultiplexer, IOptions<RedisOptions> redisOptions) //
|
|
||||||
: this(connectionMultiplexer) //
|
|
||||||
{
|
|
||||||
_redisInstance = redisOptions.Value.Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<CacheStatisticsRsp> CacheStatisticsAsync()
|
|
||||||
{
|
|
||||||
var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
|
|
||||||
return new CacheStatisticsRsp((string)await database.ExecuteAsync("info").ConfigureAwait(false)) {
|
|
||||||
DbSize = (long)await database.ExecuteAsync("dbSize").ConfigureAwait(false)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<PagedQueryRsp<GetAllEntriesRsp>> GetAllEntriesAsync(PagedQueryReq<GetAllEntriesReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var database = connectionMultiplexer.GetDatabase(_redisInstance.Database);
|
|
||||||
var redisResults = (RedisResult[])await database
|
|
||||||
.ExecuteAsync("scan", (req.Page - 1) * req.PageSize, "count"
|
|
||||||
, req.PageSize)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
var list = ((string[])redisResults![1])!.Where(x => database.KeyType(x) == RedisType.Hash)
|
|
||||||
.Select(x => database.HashGetAll(x)
|
|
||||||
.Append(new HashEntry("key", x))
|
|
||||||
.ToArray()
|
|
||||||
.ToStringDictionary())
|
|
||||||
.ToList()
|
|
||||||
.ConvertAll(x => x.Adapt<GetAllEntriesRsp>());
|
|
||||||
|
|
||||||
return new PagedQueryRsp<GetAllEntriesRsp>(req.Page, req.PageSize, 10000, list);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.SysComponent.Application.Modules.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 字典内容服务
|
|
||||||
/// </summary>
|
|
||||||
public interface IDicContentService : IService, IDicContentModule;
|
|
@ -1,9 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.SysComponent.Application.Modules.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户档案服务
|
|
||||||
/// </summary>
|
|
||||||
public interface IUserProfileService : IService, IUserProfileModule;
|
|
@ -1,26 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.User;
|
|
||||||
using NetAdmin.SysComponent.Application.Modules.Sys;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户服务
|
|
||||||
/// </summary>
|
|
||||||
public interface IUserService : IService, IUserModule
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 获取单个用户(带更新锁)
|
|
||||||
/// </summary>
|
|
||||||
Task<QueryUserRsp> GetForUpdateAsync(QueryUserReq req);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户编号登录
|
|
||||||
/// </summary>
|
|
||||||
Task<LoginRsp> LoginByUserIdAsync(long userId);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 单体更新
|
|
||||||
/// </summary>
|
|
||||||
Task UpdateSingleAsync(UpdateUserReq req);
|
|
||||||
}
|
|
@ -1,181 +0,0 @@
|
|||||||
using NetAdmin.Application.Repositories;
|
|
||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Domain.DbMaps.Sys;
|
|
||||||
using NetAdmin.Domain.Dto.Dependency;
|
|
||||||
using NetAdmin.Domain.Dto.Sys;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.RequestLog;
|
|
||||||
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys;
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IRequestLogService" />
|
|
||||||
public sealed class RequestLogService(DefaultRepository<Sys_RequestLog> rpo) //
|
|
||||||
: RepositoryService<Sys_RequestLog, IRequestLogService>(rpo), IRequestLogService
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<int> BulkDeleteAsync(BulkReq<DelReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = 0;
|
|
||||||
|
|
||||||
// ReSharper disable once LoopCanBeConvertedToQuery
|
|
||||||
foreach (var item in req.Items) {
|
|
||||||
ret += await DeleteAsync(item).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<long> CountAsync(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return QueryInternal(req).CountAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryRequestLogRsp> CreateAsync(CreateRequestLogReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await Rpo.InsertAsync(req).ConfigureAwait(false);
|
|
||||||
return ret.Adapt<QueryRequestLogRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<int> DeleteAsync(DelReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<bool> ExistAsync(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return QueryInternal(req).AnyAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryRequestLogRsp> GetAsync(QueryRequestLogReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await QueryInternal(new QueryReq<QueryRequestLogReq> { Filter = req })
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.Adapt<QueryRequestLogRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<IOrderedEnumerable<GetBarChartRsp>> GetBarChartAsync(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
|
|
||||||
var ret = await QueryInternal(req with { Order = Orders.None })
|
|
||||||
.GroupBy(a => new {
|
|
||||||
a.CreatedTime.Year
|
|
||||||
, a.CreatedTime.Month
|
|
||||||
, a.CreatedTime.Day
|
|
||||||
, a.CreatedTime.Hour
|
|
||||||
})
|
|
||||||
.ToListAsync(a => new GetBarChartRsp {
|
|
||||||
Timestamp = new DateTime(
|
|
||||||
a.Key.Year, a.Key.Month, a.Key.Day, a.Key.Hour, 0
|
|
||||||
, 0, DateTimeKind.Unspecified)
|
|
||||||
, Value = a.Count()
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.OrderBy(x => x.Timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<IOrderedEnumerable<GetPieChartRsp>> GetPieChartByApiSummaryAsync(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await QueryInternal(req with { Order = Orders.None })
|
|
||||||
.GroupBy(a => a.Api.Summary)
|
|
||||||
.ToListAsync(a => new GetPieChartRsp { Value = a.Count(), Key = a.Key })
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.OrderByDescending(x => x.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<IOrderedEnumerable<GetPieChartRsp>> GetPieChartByHttpStatusCodeAsync(
|
|
||||||
QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await QueryInternal(req with { Order = Orders.None })
|
|
||||||
.GroupBy(a => a.HttpStatusCode)
|
|
||||||
#pragma warning disable CA1305
|
|
||||||
.ToListAsync(a => new GetPieChartRsp { Value = a.Count(), Key = a.Key.ToString() })
|
|
||||||
#pragma warning restore CA1305
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.Select(x => x with { Key = Enum.Parse<HttpStatusCode>(x.Key).ToString() })
|
|
||||||
.OrderByDescending(x => x.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<PagedQueryRsp<QueryRequestLogRsp>> PagedQueryAsync(PagedQueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var list = await QueryInternal(req)
|
|
||||||
.Page(req.Page, req.PageSize)
|
|
||||||
.Count(out var total)
|
|
||||||
.ToListAsync(a => new {
|
|
||||||
a.ApiId
|
|
||||||
, ApiSummary = a.Api.Summary
|
|
||||||
, a.ExtraData
|
|
||||||
, a.CreatedClientIp
|
|
||||||
, a.CreatedTime
|
|
||||||
, a.CreatedUserName
|
|
||||||
, a.Duration
|
|
||||||
, a.Method
|
|
||||||
, a.CreatedUserAgent
|
|
||||||
, a.HttpStatusCode
|
|
||||||
, a.Id
|
|
||||||
})
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
return new PagedQueryRsp<QueryRequestLogRsp>(req.Page, req.PageSize, total
|
|
||||||
, list.Adapt<IEnumerable<QueryRequestLogRsp>>());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<IEnumerable<QueryRequestLogRsp>> QueryAsync(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await QueryInternal(req).Take(req.Count).ToListAsync().ConfigureAwait(false);
|
|
||||||
return ret.Adapt<IEnumerable<QueryRequestLogRsp>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<NopReq> UpdateAsync(NopReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override Task<Sys_RequestLog> UpdateForSqliteAsync(Sys_RequestLog req)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private ISelect<Sys_RequestLog> QueryInternal(QueryReq<QueryRequestLogReq> req)
|
|
||||||
{
|
|
||||||
var ret = Rpo.Select.Include(a => a.Api).WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
|
|
||||||
switch (req.Order) {
|
|
||||||
case Orders.None:
|
|
||||||
return ret;
|
|
||||||
case Orders.Random:
|
|
||||||
return ret.OrderByRandom();
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
|
|
||||||
|
|
||||||
if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) {
|
|
||||||
ret = ret.OrderByDescending(a => a.CreatedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.Tool;
|
|
||||||
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys;
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IToolsService" />
|
|
||||||
public sealed class ToolsService : ServiceBase<IToolsService>, IToolsService
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<string> GetChangeLogAsync()
|
|
||||||
{
|
|
||||||
await using var stream = Assembly.GetEntryAssembly()!.GetManifestResourceStream("CHANGELOG.md");
|
|
||||||
using var streamReader = new StreamReader(stream!);
|
|
||||||
return await streamReader.ReadToEndAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<IEnumerable<GetModulesRsp>> GetModulesAsync()
|
|
||||||
{
|
|
||||||
return Task.FromResult<IEnumerable<GetModulesRsp>>(AppDomain.CurrentDomain.GetAssemblies()
|
|
||||||
.Select(x => {
|
|
||||||
var asm = x.GetName();
|
|
||||||
return new GetModulesRsp {
|
|
||||||
Name = asm.Name
|
|
||||||
, Version = asm.Version?.ToString()
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.OrderBy(x => x.Name));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<DateTime> GetServerUtcTimeAsync()
|
|
||||||
{
|
|
||||||
return Task.FromResult(DateTime.Now);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<string> GetVersionAsync()
|
|
||||||
{
|
|
||||||
return Task.FromResult(GlobalStatic.ProductVersion);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,547 +0,0 @@
|
|||||||
using NetAdmin.Application.Repositories;
|
|
||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.Domain.Attributes.DataValidation;
|
|
||||||
using NetAdmin.Domain.Contexts;
|
|
||||||
using NetAdmin.Domain.DbMaps.Sys;
|
|
||||||
using NetAdmin.Domain.Dto.Dependency;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.User;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.UserProfile;
|
|
||||||
using NetAdmin.Domain.Dto.Sys.VerifyCode;
|
|
||||||
using NetAdmin.Domain.Events.Sys;
|
|
||||||
using NetAdmin.SysComponent.Application.Services.Sys.Dependency;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Sys;
|
|
||||||
|
|
||||||
/// <inheritdoc cref="IUserService" />
|
|
||||||
public sealed class UserService(
|
|
||||||
DefaultRepository<Sys_User> rpo //
|
|
||||||
, IUserProfileService userProfileService //
|
|
||||||
, IVerifyCodeService verifyCodeService //
|
|
||||||
, IEventPublisher eventPublisher) //
|
|
||||||
: RepositoryService<Sys_User, IUserService>(rpo), IUserService
|
|
||||||
{
|
|
||||||
private readonly Expression<Func<Sys_User, Sys_User>> _selectUserFields = a => new Sys_User {
|
|
||||||
Id = a.Id
|
|
||||||
, Avatar = a.Avatar
|
|
||||||
, Email = a.Email
|
|
||||||
, Mobile = a.Mobile
|
|
||||||
, Enabled = a.Enabled
|
|
||||||
, UserName = a.UserName
|
|
||||||
, Summary = a.Summary
|
|
||||||
, Version = a.Version
|
|
||||||
, CreatedTime = a.CreatedTime
|
|
||||||
, Dept = new Sys_Dept { Id = a.Dept.Id, Name = a.Dept.Name }
|
|
||||||
, Roles = a.Roles
|
|
||||||
};
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<int> BulkDeleteAsync(BulkReq<DelReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = 0;
|
|
||||||
|
|
||||||
// ReSharper disable once LoopCanBeConvertedToQuery
|
|
||||||
foreach (var item in req.Items) {
|
|
||||||
ret += await DeleteAsync(item).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<bool> CheckMobileAvailableAsync(CheckMobileAvailableReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return !await Rpo.Select.Where(a => a.Mobile == req.Mobile && a.Id != req.Id).AnyAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<bool> CheckUserNameAvailableAsync(CheckUserNameAvailableReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return !await Rpo.Select.Where(a => a.UserName == req.UserName && a.Id != req.Id)
|
|
||||||
.AnyAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<long> CountAsync(QueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
#pragma warning disable VSTHRD103
|
|
||||||
return QueryInternal(req).CountAsync();
|
|
||||||
#pragma warning restore VSTHRD103
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryUserRsp> CreateAsync(CreateUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
await CreateUpdateCheckAsync(req).ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 主表
|
|
||||||
var entity = req.Adapt<Sys_User>();
|
|
||||||
var dbUser = await Rpo.InsertAsync(entity).ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 分表
|
|
||||||
await Rpo.SaveManyAsync(entity, nameof(entity.Roles)).ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 档案表
|
|
||||||
_ = await userProfileService.CreateAsync((req.Profile ?? new CreateUserProfileReq()) with { Id = dbUser.Id })
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
var ret = await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = dbUser.Id } })
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.First();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<int> DeleteAsync(DelReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
|
|
||||||
// 删除主表
|
|
||||||
var ret = await Rpo.DeleteAsync(req.Id).ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 删除分表
|
|
||||||
_ = await Rpo.Orm.Delete<Sys_UserRole>(new { UserId = req.Id }).ExecuteAffrowsAsync().ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 删除档案表
|
|
||||||
_ = await userProfileService.DeleteAsync(req).ConfigureAwait(false);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<bool> ExistAsync(QueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return await (await QueryInternalAsync(req).ConfigureAwait(false)).AnyAsync().ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryUserRsp> GetAsync(QueryUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var ret = await (await QueryInternalAsync(new QueryReq<QueryUserReq> { Filter = req }).ConfigureAwait(false))
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return ret.Adapt<QueryUserRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryUserRsp> GetForUpdateAsync(QueryUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
|
|
||||||
// ReSharper disable once MethodHasAsyncOverload
|
|
||||||
#pragma warning disable VSTHRD103,S6966
|
|
||||||
return (await QueryInternal(new QueryReq<QueryUserReq> { Filter = req })
|
|
||||||
#pragma warning restore S6966, VSTHRD103
|
|
||||||
.ForUpdate()
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false)).Adapt<QueryUserRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">用户名或密码错误</exception>
|
|
||||||
public async Task<LoginRsp> LoginByPwdAsync(LoginByPwdReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var pwd = req.Password.Pwd().Guid();
|
|
||||||
|
|
||||||
Sys_User dbUser;
|
|
||||||
#pragma warning disable IDE0045
|
|
||||||
if (new MobileAttribute().IsValid(req.Account)) {
|
|
||||||
#pragma warning restore IDE0045
|
|
||||||
dbUser = await Rpo.Where(a => a.Mobile == req.Account && a.Password == pwd)
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dbUser = new EmailAddressAttribute().IsValid(req.Account)
|
|
||||||
? await Rpo.Where(a => a.Email == req.Account && a.Password == pwd).ToOneAsync().ConfigureAwait(false)
|
|
||||||
: await Rpo.Where(a => a.UserName == req.Account && a.Password == pwd)
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return dbUser == null ? throw new NetAdminInvalidOperationException(Ln.用户名或密码错误) : LoginInternal(dbUser);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">验证码不正确</exception>
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">用户不存在</exception>
|
|
||||||
public async Task<LoginRsp> LoginBySmsAsync(LoginBySmsReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
if (!await verifyCodeService.VerifyAsync(req.Adapt<VerifySmsCodeReq>()).ConfigureAwait(false)) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.验证码不正确);
|
|
||||||
}
|
|
||||||
|
|
||||||
var dbUser = await Rpo.Where(a => a.Mobile == req.DestDevice).ToOneAsync().ConfigureAwait(false);
|
|
||||||
return dbUser == null ? throw new NetAdminInvalidOperationException(Ln.用户不存在) : LoginInternal(dbUser);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<LoginRsp> LoginByUserIdAsync(long userId)
|
|
||||||
{
|
|
||||||
var dbUser = await Rpo.Where(a => a.Id == userId).ToOneAsync().ConfigureAwait(false);
|
|
||||||
|
|
||||||
return LoginInternal(dbUser);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<PagedQueryRsp<QueryUserRsp>> PagedQueryAsync(PagedQueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var list = await (await QueryInternalAsync(req).ConfigureAwait(false)).Page(req.Page, req.PageSize)
|
|
||||||
.Count(out var total)
|
|
||||||
.ToListAsync(_selectUserFields)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return new PagedQueryRsp<QueryUserRsp>(req.Page, req.PageSize, total, list.Adapt<IEnumerable<QueryUserRsp>>());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<IEnumerable<QueryUserRsp>> QueryAsync(QueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var list = await (await QueryInternalAsync(req).ConfigureAwait(false)).Take(req.Count)
|
|
||||||
.ToListAsync(_selectUserFields)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return list.Adapt<IEnumerable<QueryUserRsp>>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task<IEnumerable<QueryUserProfileRsp>> QueryProfileAsync(QueryReq<QueryUserProfileReq> req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return userProfileService.QueryAsync(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">验证码不正确</exception>
|
|
||||||
public async Task<UserInfoRsp> RegisterAsync(RegisterUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
if (!await verifyCodeService.VerifyAsync(req.VerifySmsCodeReq).ConfigureAwait(false)) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.验证码不正确);
|
|
||||||
}
|
|
||||||
|
|
||||||
var createReq = req.Adapt<CreateUserReq>() with { Profile = new CreateUserProfileReq() };
|
|
||||||
return (await CreateAsync(createReq).ConfigureAwait(false)).Adapt<UserInfoRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">验证码不正确</exception>
|
|
||||||
/// <exception cref="NetAdminInvalidOperationException">用户不存在</exception>
|
|
||||||
public async Task<uint> ResetPasswordAsync(ResetPasswordReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return !await verifyCodeService.VerifyAsync(req.VerifySmsCodeReq).ConfigureAwait(false)
|
|
||||||
? throw new NetAdminInvalidOperationException(Ln.验证码不正确)
|
|
||||||
: (uint)await Rpo.UpdateDiy
|
|
||||||
.SetSource((await Rpo.Where(a => a.Mobile == req.VerifySmsCodeReq.DestDevice)
|
|
||||||
.ToOneAsync(a => new { a.Version, a.Id })
|
|
||||||
.ConfigureAwait(false)).Adapt<Sys_User>() with {
|
|
||||||
Password = req.PasswordText.Pwd().Guid()
|
|
||||||
})
|
|
||||||
.UpdateColumns(a => a.Password)
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<UserInfoRsp> SetAvatarAsync(SetAvatarReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
if (await Rpo.UpdateDiy
|
|
||||||
.SetSource(req with {
|
|
||||||
Id = UserToken.Id
|
|
||||||
, Version = await Rpo.Where(a => a.Id == UserToken.Id)
|
|
||||||
.ToOneAsync(a => a.Version)
|
|
||||||
.ConfigureAwait(false)
|
|
||||||
})
|
|
||||||
.UpdateColumns(a => a.Avatar)
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = (await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = UserToken.Id } })
|
|
||||||
.ConfigureAwait(false)).First()
|
|
||||||
.Adapt<UserInfoRsp>();
|
|
||||||
|
|
||||||
// 发布用户更新事件
|
|
||||||
await eventPublisher.PublishAsync(new UserUpdatedEvent(ret)).ConfigureAwait(false);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<UserInfoRsp> SetEmailAsync(SetEmailReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var user = await Rpo.Where(a => a.Id == UserToken.Id)
|
|
||||||
.ToOneAsync(a => new { a.Mobile, a.Version, a.Email })
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 如果已绑定手机号码、需要手机安全验证
|
|
||||||
if (!user.Mobile.NullOrEmpty()) {
|
|
||||||
if (!await verifyCodeService.VerifyAsync(req.VerifySmsCodeReq).ConfigureAwait(false)) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.验证码不正确);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.Mobile != req.VerifySmsCodeReq.DestDevice) {
|
|
||||||
throw new NetAdminInvalidOperationException($"{Ln.手机号码不正确}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (await Rpo.UpdateDiy
|
|
||||||
.SetSource(new Sys_User { Email = req.DestDevice, Id = UserToken.Id, Version = user.Version })
|
|
||||||
.UpdateColumns(a => a.Email)
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = (await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = UserToken.Id } })
|
|
||||||
.ConfigureAwait(false)).First()
|
|
||||||
.Adapt<UserInfoRsp>();
|
|
||||||
|
|
||||||
// 发布用户更新事件
|
|
||||||
await eventPublisher.PublishAsync(new UserUpdatedEvent(ret)).ConfigureAwait(false);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task SetEnabledAsync(SetUserEnabledReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return Rpo.UpdateDiy.Set(a => a.Enabled == req.Enabled).Where(a => a.Id == req.Id).ExecuteAffrowsAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<UserInfoRsp> SetMobileAsync(SetMobileReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var user = await Rpo.Where(a => a.Id == UserToken.Id)
|
|
||||||
.ToOneAsync(a => new { a.Version, a.Mobile })
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (!user.Mobile.NullOrEmpty()) {
|
|
||||||
// 已有手机号码,需验证旧手机
|
|
||||||
if (!await verifyCodeService.VerifyAsync(req.OriginVerifySmsCodeReq).ConfigureAwait(false)) {
|
|
||||||
throw new NetAdminInvalidOperationException($"{Ln.旧手机号码验证码不正确}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (user.Mobile != req.OriginVerifySmsCodeReq.DestDevice) {
|
|
||||||
throw new NetAdminInvalidOperationException($"{Ln.旧手机号码不正确}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 验证新手机号码
|
|
||||||
if (!await verifyCodeService.VerifyAsync(req.NewVerifySmsCodeReq).ConfigureAwait(false)) {
|
|
||||||
throw new NetAdminInvalidOperationException($"{Ln.新手机号码验证码不正确}");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (await Rpo.UpdateDiy
|
|
||||||
.SetSource(new Sys_User {
|
|
||||||
Version = user.Version
|
|
||||||
, Id = UserToken.Id
|
|
||||||
, Mobile = req.NewVerifySmsCodeReq.DestDevice
|
|
||||||
})
|
|
||||||
.UpdateColumns(a => a.Mobile)
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false) <= 0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = (await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = UserToken.Id } })
|
|
||||||
.ConfigureAwait(false)).First()
|
|
||||||
.Adapt<UserInfoRsp>();
|
|
||||||
|
|
||||||
// 发布用户更新事件
|
|
||||||
await eventPublisher.PublishAsync(new UserUpdatedEvent(ret)).ConfigureAwait(false);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<uint> SetPasswordAsync(SetPasswordReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
var version = await Rpo.Where(a => a.Id == UserToken.Id && a.Password == req.OldPassword.Pwd().Guid())
|
|
||||||
.ToOneAsync(a => new long?(a.Version))
|
|
||||||
.ConfigureAwait(false) ?? throw new NetAdminInvalidOperationException($"{Ln.旧密码不正确}");
|
|
||||||
|
|
||||||
var ret = await Rpo.UpdateDiy
|
|
||||||
.SetSource(new Sys_User {
|
|
||||||
Id = UserToken.Id
|
|
||||||
, Password = req.NewPassword.Pwd().Guid()
|
|
||||||
, Version = version
|
|
||||||
})
|
|
||||||
.UpdateColumns(a => a.Password)
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return (uint)ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<QueryUserRsp> UpdateAsync(UpdateUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
await CreateUpdateCheckAsync(req).ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 主表
|
|
||||||
var entity = req.Adapt<Sys_User>();
|
|
||||||
var ignoreCols = new List<string> { nameof(Sys_User.Token) };
|
|
||||||
if (entity.Password == Guid.Empty) {
|
|
||||||
ignoreCols.Add(nameof(Sys_User.Password));
|
|
||||||
}
|
|
||||||
|
|
||||||
_ = await Rpo.UpdateDiy.SetSource(entity)
|
|
||||||
.IgnoreColumns(ignoreCols.ToArray())
|
|
||||||
.ExecuteAffrowsAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
// 档案表
|
|
||||||
if (req.Profile != null) {
|
|
||||||
_ = await userProfileService.UpdateAsync(req.Profile).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 分表
|
|
||||||
await Rpo.SaveManyAsync(entity, nameof(entity.Roles)).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var ret = (await QueryAsync(new QueryReq<QueryUserReq> { Filter = new QueryUserReq { Id = req.Id } })
|
|
||||||
.ConfigureAwait(false)).First();
|
|
||||||
|
|
||||||
// 发布用户更新事件
|
|
||||||
await eventPublisher.PublishAsync(new UserUpdatedEvent(ret.Adapt<UserInfoRsp>())).ConfigureAwait(false);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public Task UpdateSingleAsync(UpdateUserReq req)
|
|
||||||
{
|
|
||||||
req.ThrowIfInvalid();
|
|
||||||
return Rpo.UpdateAsync(req);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<UserInfoRsp> UserInfoAsync()
|
|
||||||
{
|
|
||||||
var dbUser = await Rpo.Where(a => a.Token == UserToken.Token && a.Enabled)
|
|
||||||
.Include(a => a.Dept)
|
|
||||||
.IncludeMany( //
|
|
||||||
a => a.Roles
|
|
||||||
, then => then.Where(a => a.Enabled)
|
|
||||||
.IncludeMany(a => a.Menus)
|
|
||||||
.IncludeMany(a => a.Depts)
|
|
||||||
.IncludeMany(a => a.Apis))
|
|
||||||
.ToOneAsync()
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
return dbUser.Adapt<UserInfoRsp>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override Task<Sys_User> UpdateForSqliteAsync(Sys_User req)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static LoginRsp LoginInternal(Sys_User dbUser)
|
|
||||||
{
|
|
||||||
if (!dbUser.Enabled) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.请联系管理员激活账号);
|
|
||||||
}
|
|
||||||
|
|
||||||
var tokenPayload
|
|
||||||
= new Dictionary<string, object> { { nameof(ContextUserToken), dbUser.Adapt<ContextUserToken>() } };
|
|
||||||
|
|
||||||
var accessToken = JWTEncryption.Encrypt(tokenPayload);
|
|
||||||
return new LoginRsp {
|
|
||||||
AccessToken = accessToken
|
|
||||||
, RefreshToken = JWTEncryption.GenerateRefreshToken(accessToken)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task CreateUpdateCheckAsync(CreateUpdateUserReq req)
|
|
||||||
{
|
|
||||||
// 检查角色是否存在
|
|
||||||
var roles = await Rpo.Orm.Select<Sys_Role>()
|
|
||||||
.ForUpdate()
|
|
||||||
.Where(a => req.RoleIds.Contains(a.Id))
|
|
||||||
.ToListAsync(a => a.Id)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
if (roles.Count != req.RoleIds.Count) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.角色不存在);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 检查部门是否存在
|
|
||||||
var dept = await Rpo.Orm.Select<Sys_Dept>()
|
|
||||||
.ForUpdate()
|
|
||||||
.Where(a => req.DeptId == a.Id)
|
|
||||||
.ToListAsync(a => a.Id)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
|
|
||||||
if (dept.Count != 1) {
|
|
||||||
throw new NetAdminInvalidOperationException(Ln.部门不存在);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ISelect<Sys_User> QueryInternal(QueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter);
|
|
||||||
switch (req.Order) {
|
|
||||||
case Orders.None:
|
|
||||||
return ret;
|
|
||||||
case Orders.Random:
|
|
||||||
return ret.OrderByRandom();
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
|
|
||||||
if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) {
|
|
||||||
ret = ret.OrderByDescending(a => a.Id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<ISelect<Sys_User>> QueryInternalAsync(QueryReq<QueryUserReq> req)
|
|
||||||
{
|
|
||||||
IEnumerable<long> deptIds = null;
|
|
||||||
if (req.Filter?.DeptId > 0) {
|
|
||||||
deptIds = await Rpo.Orm.Select<Sys_Dept>()
|
|
||||||
.Where(a => a.Id == req.Filter.DeptId)
|
|
||||||
.AsTreeCte()
|
|
||||||
.ToListAsync(a => a.Id)
|
|
||||||
.ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = Rpo.Select.Include(a => a.Dept)
|
|
||||||
.IncludeMany(a => a.Roles.Select(b => new Sys_Role { Id = b.Id, Name = b.Name }))
|
|
||||||
.WhereDynamicFilter(req.DynamicFilter)
|
|
||||||
.WhereIf(deptIds != null, a => deptIds.Contains(a.DeptId))
|
|
||||||
.WhereIf( //
|
|
||||||
req.Filter?.Id > 0, a => a.Id == req.Filter.Id)
|
|
||||||
.WhereIf( //
|
|
||||||
req.Filter?.RoleId > 0, a => a.Roles.Any(b => b.Id == req.Filter.RoleId))
|
|
||||||
.WhereIf( //
|
|
||||||
req.Keywords?.Length > 0
|
|
||||||
, a => a.Id == req.Keywords.Int64Try(0) || a.UserName.Contains(req.Keywords) ||
|
|
||||||
a.Mobile.Contains(req.Keywords) || a.Email.Contains(req.Keywords) ||
|
|
||||||
a.Summary.Contains(req.Keywords));
|
|
||||||
switch (req.Order) {
|
|
||||||
case Orders.None:
|
|
||||||
return ret;
|
|
||||||
case Orders.Random:
|
|
||||||
return ret.OrderByRandom();
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending);
|
|
||||||
|
|
||||||
if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) {
|
|
||||||
ret = ret.OrderByDescending(a => a.CreatedTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
using NetAdmin.Application.Services;
|
|
||||||
using NetAdmin.SysComponent.Application.Modules.Tpl;
|
|
||||||
|
|
||||||
namespace NetAdmin.SysComponent.Application.Services.Tpl.Dependency;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 示例服务
|
|
||||||
/// </summary>
|
|
||||||
public interface IExampleService : IService, IExampleModule;
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user