Abp Vnext 的 Vue3 实现版本
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1 lines
117 KiB

{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Abp Vnext Pro \u00b6 \u4ecb\u7ecd \u00b6 \u5b8c\u5168\u514d\u8d39\u5f00\u6e90 ABP vNext\u7684\u524d\u8eab\u662fasp.net boilerplate\uff08\u8001\u7248abp\uff09\uff0c\u5b83\u4e0d\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u7248\u672c\u66f4\u65b0\uff0c\u800c\u662f\u5b8c\u5168\u57fa\u4e8e.NET Core\u7684\u91cd\u5199\u3002 ABP vNext \u793e\u533a\u7248\u7684UI\u4e0d\u4f7f\u7528\u4e8e\u5b9e\u9645\u9879\u76ee\u5f00\u53d1\u3002\u4e3a\u6b64\uff0c\u7ed3\u5408Vben Admin \u6253\u9020\u5f00\u7bb1\u5373\u7528\u7684ABP vNext Pro\u3002 \u7cfb\u7edf\u529f\u80fd \u00b6 \u7528\u6237\u7ba1\u7406 \u89d2\u8272\u7ba1\u7406 \u5ba1\u8ba1\u65e5\u5fd7 \u540e\u53f0\u4efb\u52a1 \u96c6\u6210\u4e8b\u4ef6 IdentityServer4 \u5ba2\u6237\u7aef\u7ba1\u7406 Api \u8d44\u6e90\u7ba1\u7406 ApiScope \u7ba1\u7406 Identity \u8d44\u6e90\u7ba1\u7406 SinglaR \u6d88\u606f\u901a\u77e5(\u7ad9\u5185\u4fe1) \u591a\u8bed\u8a00 \u6570\u636e\u5b57\u5178 \u5bb9\u5668\u5316\u90e8\u7f72 \u5355\u5143\u6d4b\u8bd5 ES \u65e5\u5fd7 Setting \u7ba1\u7406 \u591a\u79df\u6237 \u6587\u4ef6\u7ba1\u7406 \u6f14\u793a \u00b6 \u6f14\u793a\u5730\u5740","title":"Home"},{"location":"#abp-vnext-pro","text":"","title":"Abp Vnext Pro"},{"location":"#_1","text":"\u5b8c\u5168\u514d\u8d39\u5f00\u6e90 ABP vNext\u7684\u524d\u8eab\u662fasp.net boilerplate\uff08\u8001\u7248abp\uff09\uff0c\u5b83\u4e0d\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u7248\u672c\u66f4\u65b0\uff0c\u800c\u662f\u5b8c\u5168\u57fa\u4e8e.NET Core\u7684\u91cd\u5199\u3002 ABP vNext \u793e\u533a\u7248\u7684UI\u4e0d\u4f7f\u7528\u4e8e\u5b9e\u9645\u9879\u76ee\u5f00\u53d1\u3002\u4e3a\u6b64\uff0c\u7ed3\u5408Vben Admin \u6253\u9020\u5f00\u7bb1\u5373\u7528\u7684ABP vNext Pro\u3002","title":"\u4ecb\u7ecd"},{"location":"#_2","text":"\u7528\u6237\u7ba1\u7406 \u89d2\u8272\u7ba1\u7406 \u5ba1\u8ba1\u65e5\u5fd7 \u540e\u53f0\u4efb\u52a1 \u96c6\u6210\u4e8b\u4ef6 IdentityServer4 \u5ba2\u6237\u7aef\u7ba1\u7406 Api \u8d44\u6e90\u7ba1\u7406 ApiScope \u7ba1\u7406 Identity \u8d44\u6e90\u7ba1\u7406 SinglaR \u6d88\u606f\u901a\u77e5(\u7ad9\u5185\u4fe1) \u591a\u8bed\u8a00 \u6570\u636e\u5b57\u5178 \u5bb9\u5668\u5316\u90e8\u7f72 \u5355\u5143\u6d4b\u8bd5 ES \u65e5\u5fd7 Setting \u7ba1\u7406 \u591a\u79df\u6237 \u6587\u4ef6\u7ba1\u7406","title":"\u7cfb\u7edf\u529f\u80fd"},{"location":"#_3","text":"\u6f14\u793a\u5730\u5740","title":"\u6f14\u793a"},{"location":"about/contact-us/","text":"Authors \u00b6 Author: @WangJunZzz Email: 510423039@qq.com Blogs: https://www.cnblogs.com/WangJunZzz \u8d5e\u52a9 \u00b6 \u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u4f60\u53ef\u4ee5\u5e2e\u4f5c\u8005\u4e70\u4e00\u676f\u5496\u5561\u8868\u793a\u652f\u6301!","title":"Contact Us"},{"location":"about/contact-us/#authors","text":"Author: @WangJunZzz Email: 510423039@qq.com Blogs: https://www.cnblogs.com/WangJunZzz","title":"Authors"},{"location":"about/contact-us/#_1","text":"\u5982\u679c\u4f60\u89c9\u5f97\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u4f60\u53ef\u4ee5\u5e2e\u4f5c\u8005\u4e70\u4e00\u676f\u5496\u5561\u8868\u793a\u652f\u6301!","title":"\u8d5e\u52a9"},{"location":"about/license/","text":"License \u00b6 MIT License MIT License Copyright \u00a9 2021 WangJunZzz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","title":"License"},{"location":"about/license/#license","text":"MIT License MIT License Copyright \u00a9 2021 WangJunZzz Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","title":"License"},{"location":"about/release-notes/","text":"\u53d1\u884c\u8bf4\u660e \u00b6 5.3.2.4 \u00b6 Bug \u5347\u7ea7Vben2.8\uff0c\u7ec4\u7ec7\u673a\u6784\u7f16\u8f91\u9519\u8bef #62 5.3.2.3 \u00b6 \u529f\u80fd \u6743\u9650\u83dc\u5355\u7ea7\u8054\u64cd\u4f5c #48 Bug \u7edf\u4e00\u53c2\u6570\u8fd4\u56de\u503c\u8fc7\u6ee4\u5668\uff0c\u7a7a\u6307\u9488\u5f02\u5e38 #61 5.3.2.2 \u00b6 \u529f\u80fd \u542f\u7528GlobalUsing\u529f\u80fd #56 \u91c7\u7528Directory.Build.targets\u7ba1\u7406 nuget\u5305 #55 Bug Vben \u5206\u9875\u7ec4\u4ef6\u603b\u6761\u6570\u663e\u793a\u5f02\u5e38 #59 5.3.2.1 \u00b6 \u529f\u80fd \u8c03\u6574NotificationManagement\u805a\u5408\u8bbe\u8ba1 #51 \u8c03\u6574NotificationManagement,Redis\u914d\u7f6e #50 \u5347\u7ea7Abp5.3.2 Bug \u591a\u4e2ahangfire\u5b9a\u65f6\u4efb\u52a1\uff0c\u53ea\u6267\u884c\u5355\u4e2a\u95ee\u9898 #54 vue\u5ba2\u6237\u7aef\u5148\u542f\u52a8\uff0cSignalR\u4e0d\u5c1d\u8bd5\u91cd\u8fde #49","title":"\u53d1\u884c\u8bf4\u660e"},{"location":"about/release-notes/#_1","text":"","title":"\u53d1\u884c\u8bf4\u660e"},{"location":"about/release-notes/#5324","text":"Bug \u5347\u7ea7Vben2.8\uff0c\u7ec4\u7ec7\u673a\u6784\u7f16\u8f91\u9519\u8bef #62","title":"5.3.2.4"},{"location":"about/release-notes/#5323","text":"\u529f\u80fd \u6743\u9650\u83dc\u5355\u7ea7\u8054\u64cd\u4f5c #48 Bug \u7edf\u4e00\u53c2\u6570\u8fd4\u56de\u503c\u8fc7\u6ee4\u5668\uff0c\u7a7a\u6307\u9488\u5f02\u5e38 #61","title":"5.3.2.3"},{"location":"about/release-notes/#5322","text":"\u529f\u80fd \u542f\u7528GlobalUsing\u529f\u80fd #56 \u91c7\u7528Directory.Build.targets\u7ba1\u7406 nuget\u5305 #55 Bug Vben \u5206\u9875\u7ec4\u4ef6\u603b\u6761\u6570\u663e\u793a\u5f02\u5e38 #59","title":"5.3.2.2"},{"location":"about/release-notes/#5321","text":"\u529f\u80fd \u8c03\u6574NotificationManagement\u805a\u5408\u8bbe\u8ba1 #51 \u8c03\u6574NotificationManagement,Redis\u914d\u7f6e #50 \u5347\u7ea7Abp5.3.2 Bug \u591a\u4e2ahangfire\u5b9a\u65f6\u4efb\u52a1\uff0c\u53ea\u6267\u884c\u5355\u4e2a\u95ee\u9898 #54 vue\u5ba2\u6237\u7aef\u5148\u542f\u52a8\uff0cSignalR\u4e0d\u5c1d\u8bd5\u91cd\u8fde #49","title":"5.3.2.1"},{"location":"user-guide/zh/deploy/docker/","text":"Docker\u90e8\u7f72 \u00b6 Lion.AbpPro.HttpApi.Host \u00b6 \u5728Lion.AbpPro.HttpApi.Host\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.HttpApi.Host . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.HttpApi.Host -p 8011 :80 Lion.AbpPro.HttpApi.Host Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app RUN echo \"deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib\" > /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian-security/ bullseye-security main\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\" >> /etc/apt/sources.list && \\ apt-get update && \\ apt-get install libgdiplus libc6-dev -y && \\ ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll && \\ ln -s /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/libdl.dll && apt-get clean # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.HttpApi.Host.dll\"] Lion.AbpPro.IdentityServer \u00b6 \u5728Lion.AbpPro.IdentityServer\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.IdentityServer . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.IdentityServer -p 8013 :80 Lion.AbpPro.IdentityServer Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.IdentityServer.dll\"] Lion.AbpPro.WebGateway \u00b6 \u5728Lion.AbpPro.WebGateway\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.WebGateway . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.WebGateway -p 8013 :80 Lion.AbpPro.WebGateway Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.WebGateway.dll\"] Vue3 \u00b6 \u4fee\u6539env.production \u63a5\u53e3\u5730\u5740\u4e3a\u4ee5\u4e0a\u4f60\u53d1\u5e03\u7684\u5730\u5740 \u6253\u5305\u9879\u76ee npm run build \u751f\u4ea7Docker\u955c\u50cf docker build -t Lion.AbpPro.Vue3 . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.Vue3 -p 8012 :80 Lion.AbpPro.Vue3 Dockerfile \u6587\u4ef6 FROM nginx:1.17.3-alpine as base EXPOSE 80 COPY /_nginx/nginx.conf /etc/nginx/nginx.conf COPY /_nginx/env.js /etc/nginx/env.js COPY /_nginx/default.conf /etc/nginx/conf.d/default.conf COPY /dist/ /usr/share/nginx/html CMD [\"nginx\", \"-g\", \"daemon off;\"]","title":"Docker"},{"location":"user-guide/zh/deploy/docker/#docker","text":"","title":"Docker\u90e8\u7f72"},{"location":"user-guide/zh/deploy/docker/#lionabpprohttpapihost","text":"\u5728Lion.AbpPro.HttpApi.Host\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.HttpApi.Host . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.HttpApi.Host -p 8011 :80 Lion.AbpPro.HttpApi.Host Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app RUN echo \"deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib\" > /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian-security/ bullseye-security main\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\" >> /etc/apt/sources.list && \\ echo \"deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib\" >> /etc/apt/sources.list && \\ apt-get update && \\ apt-get install libgdiplus libc6-dev -y && \\ ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll && \\ ln -s /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/libdl.dll && apt-get clean # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.HttpApi.Host.dll\"]","title":"Lion.AbpPro.HttpApi.Host"},{"location":"user-guide/zh/deploy/docker/#lionabpproidentityserver","text":"\u5728Lion.AbpPro.IdentityServer\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.IdentityServer . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.IdentityServer -p 8013 :80 Lion.AbpPro.IdentityServer Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.IdentityServer.dll\"]","title":"Lion.AbpPro.IdentityServer"},{"location":"user-guide/zh/deploy/docker/#lionabpprowebgateway","text":"\u5728Lion.AbpPro.WebGateway\u76ee\u5f55\u4e0b\u6267\u884c dotnet public -o publish \u751f\u6210 Docker \u955c\u50cf docker build -t Lion.AbpPro.WebGateway . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.WebGateway -p 8013 :80 Lion.AbpPro.WebGateway Dockerfile \u6587\u4ef6 FROM mcr.microsoft.com/dotnet/aspnet:6.0 # \u521b\u5efa\u76ee\u5f55 RUN mkdir /app COPY publish /app # \u8bbe\u7f6e\u5de5\u4f5c\u76ee\u5f55 WORKDIR /app # \u66b4\u973280\u7aef\u53e3 EXPOSE 80 # \u8bbe\u7f6e\u65f6\u533a .net6 \u624d\u6709\u8fd9\u4e2a\u95ee\u9898 ENV TZ=Asia/Shanghai # \u8bbe\u7f6e\u73af\u5883\u53d8\u91cf ENV ASPNETCORE_ENVIRONMENT=Production ENTRYPOINT [\"dotnet\", \"Lion.AbpPro.WebGateway.dll\"]","title":"Lion.AbpPro.WebGateway"},{"location":"user-guide/zh/deploy/docker/#vue3","text":"\u4fee\u6539env.production \u63a5\u53e3\u5730\u5740\u4e3a\u4ee5\u4e0a\u4f60\u53d1\u5e03\u7684\u5730\u5740 \u6253\u5305\u9879\u76ee npm run build \u751f\u4ea7Docker\u955c\u50cf docker build -t Lion.AbpPro.Vue3 . \u8fd0\u884c\u5bb9\u5668 docker run -itd --name Lion.AbpPro.Vue3 -p 8012 :80 Lion.AbpPro.Vue3 Dockerfile \u6587\u4ef6 FROM nginx:1.17.3-alpine as base EXPOSE 80 COPY /_nginx/nginx.conf /etc/nginx/nginx.conf COPY /_nginx/env.js /etc/nginx/env.js COPY /_nginx/default.conf /etc/nginx/conf.d/default.conf COPY /dist/ /usr/share/nginx/html CMD [\"nginx\", \"-g\", \"daemon off;\"]","title":"Vue3"},{"location":"user-guide/zh/deploy/github/","text":"Github\u81ea\u52a8\u5316\u90e8\u7f72 \u00b6 \u6dfb\u52a0\u90e8\u7f72 yaml \u00b6 \u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6dfb\u52a0 .github/workflow/ \u540e\u7aef\u9879\u76ee \u00b6 name : \u540e\u7aef\u90e8\u7f72(API,IdentityServer4,Gateways) # \u6307\u5b9a\u540d\u79f0 on : push : branches : - main # \u4ee3\u7801\u63a8\u9001\u5230main\u5206\u652f\u7684\u65f6\u5019\u89e6\u53d1jobs jobs : build : runs-on : ubuntu-latest steps : - uses : actions/checkout@v2 - name : Install Dotnet 6.x uses : actions/setup-dotnet@v1 with : dotnet-version : \"6.0\" # \u5b89\u88c5Dotnet \u73af\u5883 include-prerelease : True - name : \u7f16\u8bd1 run : dotnet build aspnet-core/Lion.AbpPro.sln # \u7f16\u8bd1\u9879\u76ee - name : \u5355\u5143\u6d4b\u8bd5 run : dotnet test aspnet-core/services/test/Lion.AbpPro.Domain.Tests/Lion.AbpPro.Domain.Tests.csproj # \u8fd0\u884c\u5355\u5143\u6d4b\u8bd5 - name : \u53d1\u5e03->Lion.AbpPro.HttpApi.Host run : dotnet publish aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Lion.AbpPro.HttpApi.Host.csproj -o Lion.AbpPro.HttpApi.Host # \u53d1\u5e03Host\u9879\u76ee - name : \u53d1\u5e03->Lion.AbpPro.IdentityServer run : dotnet publish aspnet-core/services/host/Lion.AbpPro.IdentityServer/Lion.AbpPro.IdentityServer.csproj -o Lion.AbpPro.IdentityServer # \u53d1\u5e03IdentityServer\u9879\u76ee - name : \u53d1\u5e03->Lion.AbpPro.IdentityServer run : dotnet publish aspnet-core/gateways/Lion.AbpPro.WebGateway/Lion.AbpPro.WebGateway.csproj -o Lion.AbpPro.WebGateway # \u53d1\u5e03\u7f51\u5173\u9879\u76ee - name : \u90e8\u7f72->Lion.AbpPro.HttpApi.Host uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} # \u670d\u52a1\u5668\u751f\u6210\u7684ssh key \u5728github \u4e0b\u6dfb\u52a0secret ARGS : \"-avzr --delete --exclude 'appsettings.json'\" # \u628a\u53d1\u5e03\u597d\u7684\u9879\u76ee\u590d\u5236\u5230\u670d\u52a1\u5668\uff0c\u5e76\u4e14\u5220\u9664\u670d\u52a1\u5668\u4e0a\u7684/root/wwwroot/Lion.AbpPro.HttpApi.Host\u4e0b\u7684\u6587\u4ef6\u4f46\u662f\u4e0d\u5305\u62ecappsettings.json SOURCE : \"Lion.AbpPro.HttpApi.Host\" # \u5bf9\u5e94\u4e0a\u9762\u53d1\u5e03\u597d\u7684\u76ee\u5f55 REMOTE_HOST : ${{ secrets.REMOTE_HOST }} # \u670d\u52a1\u5668\u516c\u7f51ip\u5730\u5740 REMOTE_USER : ${{ secrets.REMOTE_USER }} # \u7528\u6237\u540d TARGET : \"/root/wwwroot\" # \u53d1\u5e03\u5230\u670d\u52a1\u5668\u6307\u5b9a\u76ee\u5f55 - name : \u90e8\u7f72->Lion.AbpPro.IdentityServer uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete --exclude 'appsettings.json'\" SOURCE : \"Lion.AbpPro.IdentityServer\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\" - name : \u90e8\u7f72->Lion.AbpPro.WebGateway uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete --exclude 'appsettings.json'\" SOURCE : \"Lion.AbpPro.WebGateway\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\" \u5b89\u88c5 supervisor \u00b6 yum install -y supervisor systemctl start supervisord systemctl enable supervisord # \u8bbe\u7f6e\u4e3a\u5f00\u673a\u542f\u52a8 \u9ed8\u8ba4\u914d\u7f6e\u76ee\u5f55\u5728 /etc/supervisord.d yum install -y supervisor systemctl start supervisord systemctl enable supervisord # \u8bbe\u7f6e\u4e3a\u5f00\u673a\u542f\u52a8 \u5f00\u542f web \u7ba1\u7406\u754c\u9762 # vi vi /etc/supervisord.conf [ inet_http_server ] ; inet ( TCP ) server disabled by default port = 0 .0.0.0:9001 ; ( ip_address:port specifier, *:port for all iface ) username = admin ; # \u7ba1\u7406web\u7aef\u767b\u5f55\u7528\u6237\u540d password = 1q2w3E*. ; # \u7ba1\u7406web\u7aef\u767b\u5f55\u5bc6\u7801 \u67e5\u770b\u662f\u5426\u80fd\u8bbf\u95ee http://ip:9001 \u6dfb\u52a0 Lion.AbpPro.HttpApi.Host.ini [ program:Lion.AbpPro.HttpApi.Host ] command = /bin/bash -c \"dotnet Lion.AbpPro.HttpApi.Host.dll --urls=http://*:8011\" directory = /root/wwwroot/Lion.AbpPro.HttpApi.Host autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.HttpApi.Host/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.HttpApi.Host/out.log user = root \u6dfb\u52a0 Lion.AbpPro.IdentityServer.ini [ program:Lion.AbpPro.IdentityServer ] command = /bin/bash -c \"dotnet Lion.AbpPro.IdentityServer.dll --urls=http://*:8013\" directory = /root/wwwroot/Lion.AbpPro.IdentityServer autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.IdentityServer/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.IdentityServer/out.log user = root \u6dfb\u52a0 Lion.AbpPro.WebGateway.ini [ program:Lion.AbpPro.WebGateway ] command = /bin/bash -c \"dotnet Lion.AbpPro.WebGateway.dll --urls=http://*:8014\" directory = /root/wwwroot/Lion.AbpPro.WebGateway autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.WebGateway/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.WebGateway/out.log user = root \u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e supervisorctl reload \u524d\u7aef\u914d\u7f6e \u00b6 \u5b89\u88c5 Nginx sudo yum install -y nginx systemctl start nginx # \u542f\u52a8 Nginx systemctl enable nginx # \u542f\u7528\u5f00\u673a\u542f\u52a8 Nginx \u8bbf\u95ee http://ip:80 -- \u914d\u7f6e Yml name : \u524d\u7aef\u90e8\u7f72(vue) on : push : branches : - main jobs : build : runs-on : ubuntu-latest steps : - name : Checkout uses : actions/checkout@v2.3.1 with : persist-credentials : false - name : \u7f16\u8bd1|\u53d1\u5e03 run : | cd vben271 yarn npm run build - name : \u90e8\u7f72->Vue uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete\" SOURCE : \"vben271/dist\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\" \u914d\u7f6e Nginx # vi /etc/nginx/nginx.conf server { listen 8012 ; listen [ :: ] :8012 ; server_name _ ; root /root/wwwroot/dist ; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf ; #vue-router\u914d\u7f6e \u89e3\u51b3\u5237\u65b0\u6d4f\u89c8\u5668 404\u95ee\u9898 location / { try_files $uri $uri / @router ; index index.html ; } location @router { rewrite ^.*$ /index.html last ; } error_page 404 /404.html ; location = /404.html { } error_page 500 502 503 504 /50x.html ; location = /50x.html { } }","title":"Github\u81ea\u52a8\u5316\u90e8\u7f72"},{"location":"user-guide/zh/deploy/github/#github","text":"","title":"Github\u81ea\u52a8\u5316\u90e8\u7f72"},{"location":"user-guide/zh/deploy/github/#yaml","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6dfb\u52a0 .github/workflow/","title":"\u6dfb\u52a0\u90e8\u7f72 yaml"},{"location":"user-guide/zh/deploy/github/#_1","text":"name : \u540e\u7aef\u90e8\u7f72(API,IdentityServer4,Gateways) # \u6307\u5b9a\u540d\u79f0 on : push : branches : - main # \u4ee3\u7801\u63a8\u9001\u5230main\u5206\u652f\u7684\u65f6\u5019\u89e6\u53d1jobs jobs : build : runs-on : ubuntu-latest steps : - uses : actions/checkout@v2 - name : Install Dotnet 6.x uses : actions/setup-dotnet@v1 with : dotnet-version : \"6.0\" # \u5b89\u88c5Dotnet \u73af\u5883 include-prerelease : True - name : \u7f16\u8bd1 run : dotnet build aspnet-core/Lion.AbpPro.sln # \u7f16\u8bd1\u9879\u76ee - name : \u5355\u5143\u6d4b\u8bd5 run : dotnet test aspnet-core/services/test/Lion.AbpPro.Domain.Tests/Lion.AbpPro.Domain.Tests.csproj # \u8fd0\u884c\u5355\u5143\u6d4b\u8bd5 - name : \u53d1\u5e03->Lion.AbpPro.HttpApi.Host run : dotnet publish aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Lion.AbpPro.HttpApi.Host.csproj -o Lion.AbpPro.HttpApi.Host # \u53d1\u5e03Host\u9879\u76ee - name : \u53d1\u5e03->Lion.AbpPro.IdentityServer run : dotnet publish aspnet-core/services/host/Lion.AbpPro.IdentityServer/Lion.AbpPro.IdentityServer.csproj -o Lion.AbpPro.IdentityServer # \u53d1\u5e03IdentityServer\u9879\u76ee - name : \u53d1\u5e03->Lion.AbpPro.IdentityServer run : dotnet publish aspnet-core/gateways/Lion.AbpPro.WebGateway/Lion.AbpPro.WebGateway.csproj -o Lion.AbpPro.WebGateway # \u53d1\u5e03\u7f51\u5173\u9879\u76ee - name : \u90e8\u7f72->Lion.AbpPro.HttpApi.Host uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} # \u670d\u52a1\u5668\u751f\u6210\u7684ssh key \u5728github \u4e0b\u6dfb\u52a0secret ARGS : \"-avzr --delete --exclude 'appsettings.json'\" # \u628a\u53d1\u5e03\u597d\u7684\u9879\u76ee\u590d\u5236\u5230\u670d\u52a1\u5668\uff0c\u5e76\u4e14\u5220\u9664\u670d\u52a1\u5668\u4e0a\u7684/root/wwwroot/Lion.AbpPro.HttpApi.Host\u4e0b\u7684\u6587\u4ef6\u4f46\u662f\u4e0d\u5305\u62ecappsettings.json SOURCE : \"Lion.AbpPro.HttpApi.Host\" # \u5bf9\u5e94\u4e0a\u9762\u53d1\u5e03\u597d\u7684\u76ee\u5f55 REMOTE_HOST : ${{ secrets.REMOTE_HOST }} # \u670d\u52a1\u5668\u516c\u7f51ip\u5730\u5740 REMOTE_USER : ${{ secrets.REMOTE_USER }} # \u7528\u6237\u540d TARGET : \"/root/wwwroot\" # \u53d1\u5e03\u5230\u670d\u52a1\u5668\u6307\u5b9a\u76ee\u5f55 - name : \u90e8\u7f72->Lion.AbpPro.IdentityServer uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete --exclude 'appsettings.json'\" SOURCE : \"Lion.AbpPro.IdentityServer\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\" - name : \u90e8\u7f72->Lion.AbpPro.WebGateway uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete --exclude 'appsettings.json'\" SOURCE : \"Lion.AbpPro.WebGateway\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\"","title":"\u540e\u7aef\u9879\u76ee"},{"location":"user-guide/zh/deploy/github/#supervisor","text":"yum install -y supervisor systemctl start supervisord systemctl enable supervisord # \u8bbe\u7f6e\u4e3a\u5f00\u673a\u542f\u52a8 \u9ed8\u8ba4\u914d\u7f6e\u76ee\u5f55\u5728 /etc/supervisord.d yum install -y supervisor systemctl start supervisord systemctl enable supervisord # \u8bbe\u7f6e\u4e3a\u5f00\u673a\u542f\u52a8 \u5f00\u542f web \u7ba1\u7406\u754c\u9762 # vi vi /etc/supervisord.conf [ inet_http_server ] ; inet ( TCP ) server disabled by default port = 0 .0.0.0:9001 ; ( ip_address:port specifier, *:port for all iface ) username = admin ; # \u7ba1\u7406web\u7aef\u767b\u5f55\u7528\u6237\u540d password = 1q2w3E*. ; # \u7ba1\u7406web\u7aef\u767b\u5f55\u5bc6\u7801 \u67e5\u770b\u662f\u5426\u80fd\u8bbf\u95ee http://ip:9001 \u6dfb\u52a0 Lion.AbpPro.HttpApi.Host.ini [ program:Lion.AbpPro.HttpApi.Host ] command = /bin/bash -c \"dotnet Lion.AbpPro.HttpApi.Host.dll --urls=http://*:8011\" directory = /root/wwwroot/Lion.AbpPro.HttpApi.Host autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.HttpApi.Host/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.HttpApi.Host/out.log user = root \u6dfb\u52a0 Lion.AbpPro.IdentityServer.ini [ program:Lion.AbpPro.IdentityServer ] command = /bin/bash -c \"dotnet Lion.AbpPro.IdentityServer.dll --urls=http://*:8013\" directory = /root/wwwroot/Lion.AbpPro.IdentityServer autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.IdentityServer/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.IdentityServer/out.log user = root \u6dfb\u52a0 Lion.AbpPro.WebGateway.ini [ program:Lion.AbpPro.WebGateway ] command = /bin/bash -c \"dotnet Lion.AbpPro.WebGateway.dll --urls=http://*:8014\" directory = /root/wwwroot/Lion.AbpPro.WebGateway autostart = true autorestart = true stderr_logfile = /root/wwwroot/Lion.AbpPro.WebGateway/err.log stdout_logfile = /root/wwwroot/Lion.AbpPro.WebGateway/out.log user = root \u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e supervisorctl reload","title":"\u5b89\u88c5 supervisor"},{"location":"user-guide/zh/deploy/github/#_2","text":"\u5b89\u88c5 Nginx sudo yum install -y nginx systemctl start nginx # \u542f\u52a8 Nginx systemctl enable nginx # \u542f\u7528\u5f00\u673a\u542f\u52a8 Nginx \u8bbf\u95ee http://ip:80 -- \u914d\u7f6e Yml name : \u524d\u7aef\u90e8\u7f72(vue) on : push : branches : - main jobs : build : runs-on : ubuntu-latest steps : - name : Checkout uses : actions/checkout@v2.3.1 with : persist-credentials : false - name : \u7f16\u8bd1|\u53d1\u5e03 run : | cd vben271 yarn npm run build - name : \u90e8\u7f72->Vue uses : easingthemes/ssh-deploy@v2.2.11 env : SSH_PRIVATE_KEY : ${{ secrets.SSH_PRIVATE_KEY }} ARGS : \"-avzr --delete\" SOURCE : \"vben271/dist\" REMOTE_HOST : ${{ secrets.REMOTE_HOST }} REMOTE_USER : ${{ secrets.REMOTE_USER }} TARGET : \"/root/wwwroot\" \u914d\u7f6e Nginx # vi /etc/nginx/nginx.conf server { listen 8012 ; listen [ :: ] :8012 ; server_name _ ; root /root/wwwroot/dist ; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf ; #vue-router\u914d\u7f6e \u89e3\u51b3\u5237\u65b0\u6d4f\u89c8\u5668 404\u95ee\u9898 location / { try_files $uri $uri / @router ; index index.html ; } location @router { rewrite ^.*$ /index.html last ; } error_page 404 /404.html ; location = /404.html { } error_page 500 502 503 504 /50x.html ; location = /50x.html { } }","title":"\u524d\u7aef\u914d\u7f6e"},{"location":"user-guide/zh/extension/MagicodesIE/","text":"\u914d\u7f6e \u00b6 /// <summary> /// \u914d\u7f6eMagicodes.IE \u5bfc\u5165\u5bfc\u51fa /// </summary> private void ConfigureMagicodes ( ServiceConfigurationContext context ) { context . Services . AddTransient < IExporter , ExcelExporter >(); context . Services . AddTransient < IExcelExporter , ExcelExporter >(); } \u793a\u4f8b \u00b6 /// <summary> /// \u7528\u6237\u5bfc\u51fa\u5217\u8868 /// </summary> /// <returns></returns> [Authorize(AbpProPermissions.SystemManagement.UserExport)] public async Task < ActionResult > ExportAsync ( PagingUserListInput input ) { var request = new GetIdentityUsersInput { Filter = input . Filter ?. Trim (), MaxResultCount = input . PageSize , SkipCount = input . SkipCount , Sorting = \" LastModificationTime desc\" }; List < Volo . Abp . Identity . IdentityUser > source = await _identityUserRepository . GetListAsync ( request . Sorting , request . MaxResultCount , request . SkipCount , request . Filter ); var result = ObjectMapper . Map < List < Volo . Abp . Identity . IdentityUser >, List < ExportIdentityUserOutput >>( source ); var bytes = await _excelExporter . ExportAsByteArray < ExportIdentityUserOutput >( result ); return new XlsxFileResult ( bytes : bytes , fileDownloadName : $\"\u7528\u6237\u5bfc\u51fa\u5217\u8868{DateTime.Now:yyyyMMdd}\" ); }","title":"Magicodes.IE"},{"location":"user-guide/zh/extension/MagicodesIE/#_1","text":"/// <summary> /// \u914d\u7f6eMagicodes.IE \u5bfc\u5165\u5bfc\u51fa /// </summary> private void ConfigureMagicodes ( ServiceConfigurationContext context ) { context . Services . AddTransient < IExporter , ExcelExporter >(); context . Services . AddTransient < IExcelExporter , ExcelExporter >(); }","title":"\u914d\u7f6e"},{"location":"user-guide/zh/extension/MagicodesIE/#_2","text":"/// <summary> /// \u7528\u6237\u5bfc\u51fa\u5217\u8868 /// </summary> /// <returns></returns> [Authorize(AbpProPermissions.SystemManagement.UserExport)] public async Task < ActionResult > ExportAsync ( PagingUserListInput input ) { var request = new GetIdentityUsersInput { Filter = input . Filter ?. Trim (), MaxResultCount = input . PageSize , SkipCount = input . SkipCount , Sorting = \" LastModificationTime desc\" }; List < Volo . Abp . Identity . IdentityUser > source = await _identityUserRepository . GetListAsync ( request . Sorting , request . MaxResultCount , request . SkipCount , request . Filter ); var result = ObjectMapper . Map < List < Volo . Abp . Identity . IdentityUser >, List < ExportIdentityUserOutput >>( source ); var bytes = await _excelExporter . ExportAsByteArray < ExportIdentityUserOutput >( result ); return new XlsxFileResult ( bytes : bytes , fileDownloadName : $\"\u7528\u6237\u5bfc\u51fa\u5217\u8868{DateTime.Now:yyyyMMdd}\" ); }","title":"\u793a\u4f8b"},{"location":"user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/","text":"\u7edf\u4e00\u8fd4\u56de\u503c\u683c\u5f0f \u00b6 \u5728\u4f7f\u7528 abp \u7684\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u63d0\u4f9b\u7ed9\u7b2c\u4e09\u65b9\u63a5\u53e3\u8981\u5b9e\u73b0\u8fd4\u56de\u503c\u7edf\u4e00\u9700\u8981\u600e\u4e48\u505a\uff1f { // \u8fd4\u56de\u683c\u5f0f\u7c7b\u4f3c\u8fd9\u79cd \"success\" : false , \"message\" : \"\u8bf7\u6c42\u5931\u8d25\" , \"data\" : null , \"code\" : 500 } \u5b9a\u4e49\u8fd4\u56de\u7c7b\u578b public class WrapResult < T > { public bool Success { get ; private set ; } public string Message { get ; private set ; } public T Data { get ; private set ; } public int Code { get ; private set ; } public WrapResult () { Success = true ; Message = \"Success\" ; Data = default ; Code = 200 ; } public void SetSuccess ( T data , string message = \"Success\" , int code = 200 ) { Success = true ; Data = data ; Code = code ; } public void SetFail ( string message = \"Fail\" , int code = 500 ) { Success = false ; Message = message ; Code = code ; } } \u5b9e\u73b0\u601d\u8def \u00b6 \u5b9a\u4e49 DontWrapResultAttribute public class DontWrapResultAttribute : Attribute { } \u5b9e\u73b0 IAsyncExceptionFilter(\u62e6\u622a\u5f02\u5e38,\u629b\u5f02\u5e38\u65f6\u6307\u5b9a\u8fd4\u56de\u683c\u5f0f) public sealed class ResultExceptionFilter : IAsyncExceptionFilter , ITransientDependency { public async Task OnExceptionAsync ( ExceptionContext context ) { if (! ShouldHandleException ( context )) { return ; } await HandleAndWrapException ( context ); } private bool ShouldHandleException ( ExceptionContext context ) { if ( context . ActionDescriptor . AsControllerActionDescriptor (). ControllerTypeInfo . GetCustomAttributes ( typeof ( DontWrapResultAttribute ), true ). Any ()) { return true ; } if ( context . ActionDescriptor . GetMethodInfo (). GetCustomAttributes ( typeof ( DontWrapResultAttribute ), true ). Any ()) { return true ; } return false ; } private async Task HandleAndWrapException ( ExceptionContext context ) { var exceptionHandlingOptions = context . GetRequiredService < IOptions < AbpExceptionHandlingOptions >>(). Value ; var exceptionToErrorInfoConverter = context . GetRequiredService < IExceptionToErrorInfoConverter >(); var remoteServiceErrorInfo = exceptionToErrorInfoConverter . Convert ( context . Exception , options => { options . SendExceptionsDetailsToClients = exceptionHandlingOptions . SendExceptionsDetailsToClients ; options . SendStackTraceToClients = exceptionHandlingOptions . SendStackTraceToClients ; }); var logLevel = context . Exception . GetLogLevel (); var remoteServiceErrorInfoBuilder = new StringBuilder (); remoteServiceErrorInfoBuilder . AppendLine ( $\"---------- {nameof(RemoteServiceErrorInfo)} ----------\" ); remoteServiceErrorInfoBuilder . AppendLine ( context . GetRequiredService < IJsonSerializer >(). Serialize ( remoteServiceErrorInfo , indented : true )); var logger = context . GetService < ILogger < ResultExceptionFilter >>( NullLogger < ResultExceptionFilter >. Instance ); logger . LogWithLevel ( logLevel , remoteServiceErrorInfoBuilder . ToString ()); logger . LogException ( context . Exception , logLevel ); await context . GetRequiredService < IExceptionNotifier >(). NotifyAsync ( new ExceptionNotificationContext ( context . Exception )); context . HttpContext . Response . StatusCode = 200 ; var result = SimplifyMessage ( context ); context . Result = new ObjectResult ( result ); context . Exception = null ; //Handled! } private WrapResult < object > SimplifyMessage ( ExceptionContext context ) { var result = new WrapResult < object >(); var localizer = context . GetService < IStringLocalizer < AbpProResource >>(); switch ( context . Exception ) { case AbpAuthorizationException : result . SetFail ( \"\u6743\u9650\u4e0d\u8db3\" , 401 ); break ; case AbpValidationException : result . SetFail ( \"\u8bf7\u6c42\u53c2\u6570\u9a8c\u8bc1\u5931\u8d25\" , 400 ); break ; case EntityNotFoundException : result . SetFail ( \"\u5b9e\u4f53\u4e0d\u5b58\u5728\" , 506 ); break ; case NotImplementedException : result . SetFail ( \"\u672a\u5b9e\u73b0\u529f\u80fd\" , 507 ); break ; default : { if ( context . Exception is IHasErrorCode codeException ) { result . SetFail ( localizer [ codeException . Code ]); foreach ( var key in context . Exception . Data . Keys ) { result . SetFail ( result . Message . Replace ( \"{\" + key + \"}\" , context . Exception . Data [ key ]?. ToString ())); } } else { result . SetFail ( context . Exception . Message ); } break ; } } return result ; } } \u6ce8\u518c Filter \u00b6 public override void ConfigureServices ( ServiceConfigurationContext context ) { context . Services . AddMvc ( options => { options . Filters . Add ( typeof ( ResultExceptionFilter )); }); } \u4f7f\u7528 \u00b6 \u5728 Controller \u4e0a\u6216\u8005 Action \u4e0a\u6253\u4e0a DontWrapResultAttribute \u7279\u6027 \u4f8b\u5982 [Route(\"Permissions\")] [DontWrapResult] public class PermissionController : AbpProController , IRolePermissionAppService { private readonly IRolePermissionAppService _rolePermissionAppService ; public PermissionController ( IRolePermissionAppService rolePermissionAppService ) { _rolePermissionAppService = rolePermissionAppService ; } [HttpPost(\"tree\")] [SwaggerOperation(summary: \"\u83b7\u53d6\u89d2\u8272\u6743\u9650\", Tags = new[] { \"Permissions\" })] [WrapResult] //\u63a7\u5236\u5668\u4e0a\u6253\u4e86 action\u4e0a\u5c31\u4e0d\u9700\u8981 public Task < PermissionOutput > GetPermissionAsync ( GetPermissionInput input ) { return _rolePermissionAppService . GetPermissionAsync ( input ); } }","title":"\u7edf\u4e00\u8fd4\u56de\u503c\u683c\u5f0f"},{"location":"user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/#_1","text":"\u5728\u4f7f\u7528 abp \u7684\u8fc7\u7a0b\u4e2d\uff0c\u5982\u679c\u63d0\u4f9b\u7ed9\u7b2c\u4e09\u65b9\u63a5\u53e3\u8981\u5b9e\u73b0\u8fd4\u56de\u503c\u7edf\u4e00\u9700\u8981\u600e\u4e48\u505a\uff1f { // \u8fd4\u56de\u683c\u5f0f\u7c7b\u4f3c\u8fd9\u79cd \"success\" : false , \"message\" : \"\u8bf7\u6c42\u5931\u8d25\" , \"data\" : null , \"code\" : 500 } \u5b9a\u4e49\u8fd4\u56de\u7c7b\u578b public class WrapResult < T > { public bool Success { get ; private set ; } public string Message { get ; private set ; } public T Data { get ; private set ; } public int Code { get ; private set ; } public WrapResult () { Success = true ; Message = \"Success\" ; Data = default ; Code = 200 ; } public void SetSuccess ( T data , string message = \"Success\" , int code = 200 ) { Success = true ; Data = data ; Code = code ; } public void SetFail ( string message = \"Fail\" , int code = 500 ) { Success = false ; Message = message ; Code = code ; } }","title":"\u7edf\u4e00\u8fd4\u56de\u503c\u683c\u5f0f"},{"location":"user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/#_2","text":"\u5b9a\u4e49 DontWrapResultAttribute public class DontWrapResultAttribute : Attribute { } \u5b9e\u73b0 IAsyncExceptionFilter(\u62e6\u622a\u5f02\u5e38,\u629b\u5f02\u5e38\u65f6\u6307\u5b9a\u8fd4\u56de\u683c\u5f0f) public sealed class ResultExceptionFilter : IAsyncExceptionFilter , ITransientDependency { public async Task OnExceptionAsync ( ExceptionContext context ) { if (! ShouldHandleException ( context )) { return ; } await HandleAndWrapException ( context ); } private bool ShouldHandleException ( ExceptionContext context ) { if ( context . ActionDescriptor . AsControllerActionDescriptor (). ControllerTypeInfo . GetCustomAttributes ( typeof ( DontWrapResultAttribute ), true ). Any ()) { return true ; } if ( context . ActionDescriptor . GetMethodInfo (). GetCustomAttributes ( typeof ( DontWrapResultAttribute ), true ). Any ()) { return true ; } return false ; } private async Task HandleAndWrapException ( ExceptionContext context ) { var exceptionHandlingOptions = context . GetRequiredService < IOptions < AbpExceptionHandlingOptions >>(). Value ; var exceptionToErrorInfoConverter = context . GetRequiredService < IExceptionToErrorInfoConverter >(); var remoteServiceErrorInfo = exceptionToErrorInfoConverter . Convert ( context . Exception , options => { options . SendExceptionsDetailsToClients = exceptionHandlingOptions . SendExceptionsDetailsToClients ; options . SendStackTraceToClients = exceptionHandlingOptions . SendStackTraceToClients ; }); var logLevel = context . Exception . GetLogLevel (); var remoteServiceErrorInfoBuilder = new StringBuilder (); remoteServiceErrorInfoBuilder . AppendLine ( $\"---------- {nameof(RemoteServiceErrorInfo)} ----------\" ); remoteServiceErrorInfoBuilder . AppendLine ( context . GetRequiredService < IJsonSerializer >(). Serialize ( remoteServiceErrorInfo , indented : true )); var logger = context . GetService < ILogger < ResultExceptionFilter >>( NullLogger < ResultExceptionFilter >. Instance ); logger . LogWithLevel ( logLevel , remoteServiceErrorInfoBuilder . ToString ()); logger . LogException ( context . Exception , logLevel ); await context . GetRequiredService < IExceptionNotifier >(). NotifyAsync ( new ExceptionNotificationContext ( context . Exception )); context . HttpContext . Response . StatusCode = 200 ; var result = SimplifyMessage ( context ); context . Result = new ObjectResult ( result ); context . Exception = null ; //Handled! } private WrapResult < object > SimplifyMessage ( ExceptionContext context ) { var result = new WrapResult < object >(); var localizer = context . GetService < IStringLocalizer < AbpProResource >>(); switch ( context . Exception ) { case AbpAuthorizationException : result . SetFail ( \"\u6743\u9650\u4e0d\u8db3\" , 401 ); break ; case AbpValidationException : result . SetFail ( \"\u8bf7\u6c42\u53c2\u6570\u9a8c\u8bc1\u5931\u8d25\" , 400 ); break ; case EntityNotFoundException : result . SetFail ( \"\u5b9e\u4f53\u4e0d\u5b58\u5728\" , 506 ); break ; case NotImplementedException : result . SetFail ( \"\u672a\u5b9e\u73b0\u529f\u80fd\" , 507 ); break ; default : { if ( context . Exception is IHasErrorCode codeException ) { result . SetFail ( localizer [ codeException . Code ]); foreach ( var key in context . Exception . Data . Keys ) { result . SetFail ( result . Message . Replace ( \"{\" + key + \"}\" , context . Exception . Data [ key ]?. ToString ())); } } else { result . SetFail ( context . Exception . Message ); } break ; } } return result ; } }","title":"\u5b9e\u73b0\u601d\u8def"},{"location":"user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/#filter","text":"public override void ConfigureServices ( ServiceConfigurationContext context ) { context . Services . AddMvc ( options => { options . Filters . Add ( typeof ( ResultExceptionFilter )); }); }","title":"\u6ce8\u518c Filter"},{"location":"user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/#_3","text":"\u5728 Controller \u4e0a\u6216\u8005 Action \u4e0a\u6253\u4e0a DontWrapResultAttribute \u7279\u6027 \u4f8b\u5982 [Route(\"Permissions\")] [DontWrapResult] public class PermissionController : AbpProController , IRolePermissionAppService { private readonly IRolePermissionAppService _rolePermissionAppService ; public PermissionController ( IRolePermissionAppService rolePermissionAppService ) { _rolePermissionAppService = rolePermissionAppService ; } [HttpPost(\"tree\")] [SwaggerOperation(summary: \"\u83b7\u53d6\u89d2\u8272\u6743\u9650\", Tags = new[] { \"Permissions\" })] [WrapResult] //\u63a7\u5236\u5668\u4e0a\u6253\u4e86 action\u4e0a\u5c31\u4e0d\u9700\u8981 public Task < PermissionOutput > GetPermissionAsync ( GetPermissionInput input ) { return _rolePermissionAppService . GetPermissionAsync ( input ); } }","title":"\u4f7f\u7528"},{"location":"user-guide/zh/getting-started/contributing/","text":"\u8d21\u732e \u00b6 \u8d21\u732e\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u4e4b\u4e00\u5c31\u662f\u53c2\u4e0e\u8ba8\u8bba\u548cissue\u8ba8\u8bba\u3002 \u5982\u679c\u60a8\u6709\u4efb\u4f55\u7591\u95ee\u6216\u95ee\u9898\uff0c\u8bf7\u5728Lion.AbpPro\u4ed3\u5e93\u4e2d\u62a5\u544a\uff1a \u63d0\u4ea4Issue \u63d0\u4ea4\u66f4\u6539 \u00b6 \u60a8\u8fd8\u53ef\u4ee5\u901a\u8fc7\u63d0\u4ea4\u4ee3\u7801\u66f4\u6539PR\u6765\u505a\u51fa\u8d21\u732e\u3002 Pull requests \u53ef\u8ba9\u60a8\u544a\u8bc9\u5176\u4ed6\u4eba\u5df2\u63a8\u9001\u5230GitHub\u4e0a\u5b58\u50a8\u5e93\u7684\u66f4\u6539\u3002 \u6253\u5f00 Pull requests \u540e\uff0c\u60a8\u53ef\u4ee5\u4e0e\u534f\u4f5c\u8005\u8ba8\u8bba\u548c\u5ba1\u67e5\u505a\u51fa\u7684\u66f4\u6539\uff0c\u5e76\u5728\u66f4\u6539\u5408\u5e76\u5230\u5b58\u50a8\u5e93\u4e4b\u524d\u6dfb\u52a0\u540e\u7eed\u63d0\u4ea4\u3002 \u5176\u4ed6\u8d44\u6e90 \u00b6 issue \u548c pull requests \u4f7f\u7528\u641c\u7d22\u8fc7\u6ee4 issue \u548c pull requests","title":"\u8d21\u732e"},{"location":"user-guide/zh/getting-started/contributing/#_1","text":"\u8d21\u732e\u6700\u7b80\u5355\u7684\u65b9\u5f0f\u4e4b\u4e00\u5c31\u662f\u53c2\u4e0e\u8ba8\u8bba\u548cissue\u8ba8\u8bba\u3002 \u5982\u679c\u60a8\u6709\u4efb\u4f55\u7591\u95ee\u6216\u95ee\u9898\uff0c\u8bf7\u5728Lion.AbpPro\u4ed3\u5e93\u4e2d\u62a5\u544a\uff1a \u63d0\u4ea4Issue","title":"\u8d21\u732e"},{"location":"user-guide/zh/getting-started/contributing/#_2","text":"\u60a8\u8fd8\u53ef\u4ee5\u901a\u8fc7\u63d0\u4ea4\u4ee3\u7801\u66f4\u6539PR\u6765\u505a\u51fa\u8d21\u732e\u3002 Pull requests \u53ef\u8ba9\u60a8\u544a\u8bc9\u5176\u4ed6\u4eba\u5df2\u63a8\u9001\u5230GitHub\u4e0a\u5b58\u50a8\u5e93\u7684\u66f4\u6539\u3002 \u6253\u5f00 Pull requests \u540e\uff0c\u60a8\u53ef\u4ee5\u4e0e\u534f\u4f5c\u8005\u8ba8\u8bba\u548c\u5ba1\u67e5\u505a\u51fa\u7684\u66f4\u6539\uff0c\u5e76\u5728\u66f4\u6539\u5408\u5e76\u5230\u5b58\u50a8\u5e93\u4e4b\u524d\u6dfb\u52a0\u540e\u7eed\u63d0\u4ea4\u3002","title":"\u63d0\u4ea4\u66f4\u6539"},{"location":"user-guide/zh/getting-started/contributing/#_3","text":"issue \u548c pull requests \u4f7f\u7528\u641c\u7d22\u8fc7\u6ee4 issue \u548c pull requests","title":"\u5176\u4ed6\u8d44\u6e90"},{"location":"user-guide/zh/getting-started/introduction/","text":"\u4ecb\u7ecd \u00b6 Lion.AbpPro \u662fAbp Vnext \u7684Vue3\u7248\u672c\u5b9e\u73b0\uff0c\u540c\u65f6\u4e5f\u662f\u514d\u8d39\u5f00\u6e90\u3002\u5b83\u6709\u52a9\u4e8e\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\uff0c\u5c5e\u4e8e\u5f00\u7bb1\u5373\u7528\u7684\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\uff0c\u4e5f\u80fd\u9002\u7528\u5fae\u670d\u52a1\u3002 \u540e\u7aef\u9879\u76ee\u7ed3\u6784 \u00b6 \u251c\u2500\u2500 Directory.Build.props nuget \u7248\u672c\u63a7\u5236 \u251c\u2500\u2500 frameworks # \u516c\u5171\u6a21\u5757 \u2502 \u251c\u2500\u2500 CAP # dotnetcore.cap \u2502 \u2514\u2500\u2500 Extensions # \u81ea\u5b9a\u4e49\u6269\u5c55 \u251c\u2500\u2500 gateways # \u7f51\u5173 \u2502 \u2514\u2500\u2500 Lion.AbpPro.WebGateway # \u57fa\u4e8eocelot\u7f51\u5173 \u251c\u2500\u2500 modules # \u6a21\u5757 \u2502 \u251c\u2500\u2500 DataDictionaryManagement # \u6570\u636e\u5b57\u5178 \u2502 \u251c\u2500\u2500 FileManagement # \u57fa\u4e8e\u963f\u91cc\u4e91\u7684\u6587\u4ef6\u670d\u52a1 \u2502 \u2514\u2500\u2500 NotificationManagement # \u901a\u77e5\u670d\u52a1 \u251c\u2500\u2500 services # \u516c\u5171\u9759\u6001\u8d44\u6e90\u76ee\u5f55 \u2502 \u251c\u2500\u2500 host # \u542f\u52a8\u6a21\u5757 \u2502 \u251c\u2500\u2500 CompanyName.ProjectName.HttpApi.Host # admin ui host \u2502 \u2514\u2500\u2500 CompanyName.ProjectName.IdentityServer # IdentityServer host \u2502 \u251c\u2500\u2500 src # \u6e90\u7801 \u2502 \u2514\u2500\u2500 CompanyName.ProjectName.DbMigrator # \u8fc1\u79fb\u63a7\u5236\u53f0\u7a0b\u5e8f \u2502 \u2514\u2500\u2500 test # \u5355\u5143\u6d4b\u8bd5 \u251c\u2500\u2500 shared # \u516c\u5171Host \u2502 \u251c\u2500\u2500 Lion.AbpPro.Shared.Hosting.Gateways # \u7f51\u5173host\u6a21\u5757 \u2502 \u2514\u2500\u2500 Lion.AbpPro.Shared.Hosting.Microservices # \u670d\u52a1host\u6a21\u5757 \u524d\u7aef\u9879\u76ee\u7ed3\u6784 \u00b6 \u251c\u2500\u2500 _nginx # docker \u6253\u5305 \u251c\u2500\u2500 build # \u6253\u5305\u811a\u672c\u76f8\u5173 \u2502 \u251c\u2500\u2500 config # \u914d\u7f6e\u6587\u4ef6 \u2502 \u251c\u2500\u2500 generate # \u751f\u6210\u5668 \u2502 \u251c\u2500\u2500 script # \u811a\u672c \u2502 \u2514\u2500\u2500 vite # vite\u914d\u7f6e \u251c\u2500\u2500 mock # mock\u6587\u4ef6\u5939 \u251c\u2500\u2500 public # \u516c\u5171\u9759\u6001\u8d44\u6e90\u76ee\u5f55 \u251c\u2500\u2500 src # \u4e3b\u76ee\u5f55 \u2502 \u251c\u2500\u2500 api # \u63a5\u53e3\u6587\u4ef6 \u2502 \u251c\u2500\u2500 assets # \u8d44\u6e90\u6587\u4ef6 \u2502 \u2502 \u251c\u2500\u2500 icons # icon sprite \u56fe\u6807\u6587\u4ef6\u5939 \u2502 \u2502 \u251c\u2500\u2500 images # \u9879\u76ee\u5b58\u653e\u56fe\u7247\u7684\u6587\u4ef6\u5939 \u2502 \u2502 \u2514\u2500\u2500 svg # \u9879\u76ee\u5b58\u653esvg\u56fe\u7247\u7684\u6587\u4ef6\u5939 \u2502 \u251c\u2500\u2500 components # \u516c\u5171\u7ec4\u4ef6 \u2502 \u251c\u2500\u2500 design # \u6837\u5f0f\u6587\u4ef6 \u2502 \u251c\u2500\u2500 directives # \u6307\u4ee4 \u2502 \u251c\u2500\u2500 enums # \u679a\u4e3e/\u5e38\u91cf \u2502 \u251c\u2500\u2500 hooks # hook \u2502 \u2502 \u251c\u2500\u2500 component # \u7ec4\u4ef6\u76f8\u5173hook \u2502 \u2502 \u251c\u2500\u2500 core # \u57fa\u7840hook \u2502 \u2502 \u251c\u2500\u2500 event # \u4e8b\u4ef6\u76f8\u5173hook \u2502 \u2502 \u251c\u2500\u2500 setting # \u914d\u7f6e\u76f8\u5173hook \u2502 \u2502 \u2514\u2500\u2500 web # web\u76f8\u5173hook \u2502 \u251c\u2500\u2500 layouts # \u5e03\u5c40\u6587\u4ef6 \u2502 \u2502 \u251c\u2500\u2500 default # \u9ed8\u8ba4\u5e03\u5c40 \u2502 \u2502 \u251c\u2500\u2500 iframe # iframe\u5e03\u5c40 \u2502 \u2502 \u2514\u2500\u2500 page # \u9875\u9762\u5e03\u5c40 \u2502 \u251c\u2500\u2500 locales # \u591a\u8bed\u8a00 \u2502 \u251c\u2500\u2500 logics # \u903b\u8f91 \u2502 \u251c\u2500\u2500 main.ts # \u4e3b\u5165\u53e3 \u2502 \u251c\u2500\u2500 router # \u8def\u7531\u914d\u7f6e \u2502 \u251c\u2500\u2500 services # Nswag\u751f\u6210\u7684\u4ee3\u7406 \u2502 \u2502 \u251c\u2500\u2500 ServiceProxies.ts # Nswag\u751f\u6210\u7684\u4ee3\u7406 \u2502 \u2502 \u251c\u2500\u2500 ServiceProxyBase.ts # Nswag\u751f\u6210\u7684\u4ee3\u7406\u62e6\u622a\u5668 \u2502 \u251c\u2500\u2500 settings # \u9879\u76ee\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 componentSetting.ts # \u7ec4\u4ef6\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 designSetting.ts # \u6837\u5f0f\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 encryptionSetting.ts # \u52a0\u5bc6\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 localeSetting.ts # \u591a\u8bed\u8a00\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 projectSetting.ts # \u9879\u76ee\u914d\u7f6e \u2502 \u2502 \u2514\u2500\u2500 siteSetting.ts # \u7ad9\u70b9\u914d\u7f6e \u2502 \u251c\u2500\u2500 store # \u6570\u636e\u4ed3\u5e93 \u2502 \u251c\u2500\u2500 utils # \u5de5\u5177\u7c7b \u2502 \u2514\u2500\u2500 views # \u9875\u9762 \u251c\u2500\u2500 test # \u6d4b\u8bd5 \u2502 \u2514\u2500\u2500 server # \u6d4b\u8bd5\u7528\u5230\u7684\u670d\u52a1 \u2502 \u251c\u2500\u2500 api # \u6d4b\u8bd5\u670d\u52a1\u5668 \u2502 \u251c\u2500\u2500 upload # \u6d4b\u8bd5\u4e0a\u4f20\u670d\u52a1\u5668 \u2502 \u2514\u2500\u2500 websocket # \u6d4b\u8bd5ws\u670d\u52a1\u5668 \u251c\u2500\u2500 types # \u7c7b\u578b\u6587\u4ef6 \u251c\u2500\u2500 vite.config.ts # vite\u914d\u7f6e\u6587\u4ef6 \u2514\u2500\u2500 windi.config.ts # windcss\u914d\u7f6e\u6587\u4ef6 \u76f8\u5173\u89c6\u9891 \u00b6 \u5f85\u5b8c\u5584 \u76f8\u5173\u6587\u7ae0 \u00b6 \u5f85\u5b8c\u5584","title":"\u4ecb\u7ecd"},{"location":"user-guide/zh/getting-started/introduction/#_1","text":"Lion.AbpPro \u662fAbp Vnext \u7684Vue3\u7248\u672c\u5b9e\u73b0\uff0c\u540c\u65f6\u4e5f\u662f\u514d\u8d39\u5f00\u6e90\u3002\u5b83\u6709\u52a9\u4e8e\u63d0\u9ad8\u5f00\u53d1\u6548\u7387\uff0c\u5c5e\u4e8e\u5f00\u7bb1\u5373\u7528\u7684\u540e\u53f0\u7ba1\u7406\u7cfb\u7edf\uff0c\u4e5f\u80fd\u9002\u7528\u5fae\u670d\u52a1\u3002","title":"\u4ecb\u7ecd"},{"location":"user-guide/zh/getting-started/introduction/#_2","text":"\u251c\u2500\u2500 Directory.Build.props nuget \u7248\u672c\u63a7\u5236 \u251c\u2500\u2500 frameworks # \u516c\u5171\u6a21\u5757 \u2502 \u251c\u2500\u2500 CAP # dotnetcore.cap \u2502 \u2514\u2500\u2500 Extensions # \u81ea\u5b9a\u4e49\u6269\u5c55 \u251c\u2500\u2500 gateways # \u7f51\u5173 \u2502 \u2514\u2500\u2500 Lion.AbpPro.WebGateway # \u57fa\u4e8eocelot\u7f51\u5173 \u251c\u2500\u2500 modules # \u6a21\u5757 \u2502 \u251c\u2500\u2500 DataDictionaryManagement # \u6570\u636e\u5b57\u5178 \u2502 \u251c\u2500\u2500 FileManagement # \u57fa\u4e8e\u963f\u91cc\u4e91\u7684\u6587\u4ef6\u670d\u52a1 \u2502 \u2514\u2500\u2500 NotificationManagement # \u901a\u77e5\u670d\u52a1 \u251c\u2500\u2500 services # \u516c\u5171\u9759\u6001\u8d44\u6e90\u76ee\u5f55 \u2502 \u251c\u2500\u2500 host # \u542f\u52a8\u6a21\u5757 \u2502 \u251c\u2500\u2500 CompanyName.ProjectName.HttpApi.Host # admin ui host \u2502 \u2514\u2500\u2500 CompanyName.ProjectName.IdentityServer # IdentityServer host \u2502 \u251c\u2500\u2500 src # \u6e90\u7801 \u2502 \u2514\u2500\u2500 CompanyName.ProjectName.DbMigrator # \u8fc1\u79fb\u63a7\u5236\u53f0\u7a0b\u5e8f \u2502 \u2514\u2500\u2500 test # \u5355\u5143\u6d4b\u8bd5 \u251c\u2500\u2500 shared # \u516c\u5171Host \u2502 \u251c\u2500\u2500 Lion.AbpPro.Shared.Hosting.Gateways # \u7f51\u5173host\u6a21\u5757 \u2502 \u2514\u2500\u2500 Lion.AbpPro.Shared.Hosting.Microservices # \u670d\u52a1host\u6a21\u5757","title":"\u540e\u7aef\u9879\u76ee\u7ed3\u6784"},{"location":"user-guide/zh/getting-started/introduction/#_3","text":"\u251c\u2500\u2500 _nginx # docker \u6253\u5305 \u251c\u2500\u2500 build # \u6253\u5305\u811a\u672c\u76f8\u5173 \u2502 \u251c\u2500\u2500 config # \u914d\u7f6e\u6587\u4ef6 \u2502 \u251c\u2500\u2500 generate # \u751f\u6210\u5668 \u2502 \u251c\u2500\u2500 script # \u811a\u672c \u2502 \u2514\u2500\u2500 vite # vite\u914d\u7f6e \u251c\u2500\u2500 mock # mock\u6587\u4ef6\u5939 \u251c\u2500\u2500 public # \u516c\u5171\u9759\u6001\u8d44\u6e90\u76ee\u5f55 \u251c\u2500\u2500 src # \u4e3b\u76ee\u5f55 \u2502 \u251c\u2500\u2500 api # \u63a5\u53e3\u6587\u4ef6 \u2502 \u251c\u2500\u2500 assets # \u8d44\u6e90\u6587\u4ef6 \u2502 \u2502 \u251c\u2500\u2500 icons # icon sprite \u56fe\u6807\u6587\u4ef6\u5939 \u2502 \u2502 \u251c\u2500\u2500 images # \u9879\u76ee\u5b58\u653e\u56fe\u7247\u7684\u6587\u4ef6\u5939 \u2502 \u2502 \u2514\u2500\u2500 svg # \u9879\u76ee\u5b58\u653esvg\u56fe\u7247\u7684\u6587\u4ef6\u5939 \u2502 \u251c\u2500\u2500 components # \u516c\u5171\u7ec4\u4ef6 \u2502 \u251c\u2500\u2500 design # \u6837\u5f0f\u6587\u4ef6 \u2502 \u251c\u2500\u2500 directives # \u6307\u4ee4 \u2502 \u251c\u2500\u2500 enums # \u679a\u4e3e/\u5e38\u91cf \u2502 \u251c\u2500\u2500 hooks # hook \u2502 \u2502 \u251c\u2500\u2500 component # \u7ec4\u4ef6\u76f8\u5173hook \u2502 \u2502 \u251c\u2500\u2500 core # \u57fa\u7840hook \u2502 \u2502 \u251c\u2500\u2500 event # \u4e8b\u4ef6\u76f8\u5173hook \u2502 \u2502 \u251c\u2500\u2500 setting # \u914d\u7f6e\u76f8\u5173hook \u2502 \u2502 \u2514\u2500\u2500 web # web\u76f8\u5173hook \u2502 \u251c\u2500\u2500 layouts # \u5e03\u5c40\u6587\u4ef6 \u2502 \u2502 \u251c\u2500\u2500 default # \u9ed8\u8ba4\u5e03\u5c40 \u2502 \u2502 \u251c\u2500\u2500 iframe # iframe\u5e03\u5c40 \u2502 \u2502 \u2514\u2500\u2500 page # \u9875\u9762\u5e03\u5c40 \u2502 \u251c\u2500\u2500 locales # \u591a\u8bed\u8a00 \u2502 \u251c\u2500\u2500 logics # \u903b\u8f91 \u2502 \u251c\u2500\u2500 main.ts # \u4e3b\u5165\u53e3 \u2502 \u251c\u2500\u2500 router # \u8def\u7531\u914d\u7f6e \u2502 \u251c\u2500\u2500 services # Nswag\u751f\u6210\u7684\u4ee3\u7406 \u2502 \u2502 \u251c\u2500\u2500 ServiceProxies.ts # Nswag\u751f\u6210\u7684\u4ee3\u7406 \u2502 \u2502 \u251c\u2500\u2500 ServiceProxyBase.ts # Nswag\u751f\u6210\u7684\u4ee3\u7406\u62e6\u622a\u5668 \u2502 \u251c\u2500\u2500 settings # \u9879\u76ee\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 componentSetting.ts # \u7ec4\u4ef6\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 designSetting.ts # \u6837\u5f0f\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 encryptionSetting.ts # \u52a0\u5bc6\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 localeSetting.ts # \u591a\u8bed\u8a00\u914d\u7f6e \u2502 \u2502 \u251c\u2500\u2500 projectSetting.ts # \u9879\u76ee\u914d\u7f6e \u2502 \u2502 \u2514\u2500\u2500 siteSetting.ts # \u7ad9\u70b9\u914d\u7f6e \u2502 \u251c\u2500\u2500 store # \u6570\u636e\u4ed3\u5e93 \u2502 \u251c\u2500\u2500 utils # \u5de5\u5177\u7c7b \u2502 \u2514\u2500\u2500 views # \u9875\u9762 \u251c\u2500\u2500 test # \u6d4b\u8bd5 \u2502 \u2514\u2500\u2500 server # \u6d4b\u8bd5\u7528\u5230\u7684\u670d\u52a1 \u2502 \u251c\u2500\u2500 api # \u6d4b\u8bd5\u670d\u52a1\u5668 \u2502 \u251c\u2500\u2500 upload # \u6d4b\u8bd5\u4e0a\u4f20\u670d\u52a1\u5668 \u2502 \u2514\u2500\u2500 websocket # \u6d4b\u8bd5ws\u670d\u52a1\u5668 \u251c\u2500\u2500 types # \u7c7b\u578b\u6587\u4ef6 \u251c\u2500\u2500 vite.config.ts # vite\u914d\u7f6e\u6587\u4ef6 \u2514\u2500\u2500 windi.config.ts # windcss\u914d\u7f6e\u6587\u4ef6","title":"\u524d\u7aef\u9879\u76ee\u7ed3\u6784"},{"location":"user-guide/zh/getting-started/introduction/#_4","text":"\u5f85\u5b8c\u5584","title":"\u76f8\u5173\u89c6\u9891"},{"location":"user-guide/zh/getting-started/introduction/#_5","text":"\u5f85\u5b8c\u5584","title":"\u76f8\u5173\u6587\u7ae0"},{"location":"user-guide/zh/getting-started/quick-start/","text":"\u5feb\u901f\u5f00\u59cb \u00b6 \u5148\u51b3\u6761\u4ef6 \u00b6 dotnet core 6.0.202 nodejs 16+ pnpm mysql redis rabbitmq \u53ef\u9009 Docker\u4e00\u952e\u5b89\u88c5Mysql|Redis|Rabbitmq \u5feb\u901f\u642d\u5efa\u5fc5\u8981\u73af\u5883\uff0c\u4e0b\u8f7d docker-compose.yaml , \u6267\u884c: docker-compose up -d \u521b\u5efa\u65b0\u9879\u76ee \u00b6 \u76f4\u63a5Clone \u00b6 git clone https://github.com/WangJunZzz/abp-vnext-pro.git \u6216\u8005 GUI\u521b\u5efa\u9879\u76ee \u00b6 \u540e\u7aef \u00b6 \u4fee\u6539 HttpApi.Host-> appsettings.json \u914d\u7f6e Mysql \u8fde\u63a5\u5b57\u7b26\u4e32 Redis \u8fde\u63a5\u5b57\u7b26\u4e32 RabbitMq(\u5982\u679c\u4e0d\u9700\u8981\u542f\u7528\u8bbe\u7f6e\u4e3a false) Es \u5730\u5740\u5373\u53ef(\u5982\u679c\u6ca1\u6709 es \u4e5f\u53ef\u4ee5\u8fd0\u884c,\u53ea\u662f\u524d\u7aef es \u65e5\u5fd7\u9875\u9762\u65e0\u6cd5\u4f7f\u7528\u800c\u5df2\uff0c\u4e0d\u5f71\u54cd\u540e\u7aef\u9879\u76ee\u542f\u52a8) \u4fee\u6539 IdentityServer-> appsettings.json \u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 \u4fee\u6539 DbMigrator-> appsettings.json \u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 \u53f3\u952e\u5355\u51fb.DbMigrator\u9879\u76ee,\u8bbe\u7f6e\u4e3a\u542f\u52a8\u9879\u76ee\u8fd0\u884c\uff0c\u6309F5(\u6216Ctrl + F5) \u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f. \u5b83\u5c06\u5177\u6709\u5982\u4e0b\u6240\u793a\u7684\u8f93\u51fa: Note \u521d\u59cb\u7684\u79cd\u5b50\u6570\u636e\u5728\u6570\u636e\u5e93\u4e2d\u521b\u5efa\u4e86 admin \u7528\u6237(\u5bc6\u7801\u4e3a1q2w3E*) \u7528\u4e8e\u767b\u5f55\u5e94\u7528\u7a0b\u5e8f. \u6240\u4ee5, \u5bf9\u4e8e\u65b0\u6570\u636e\u5e93\u81f3\u5c11\u4f7f\u7528 .DbMigrator \u4e00\u6b21. Note \u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528Ocelot\u7f51\u5173\u53ef\u4ee5\u79fb\u9664Lion.AbpPro.WebGateway\u9879\u76ee\uff0c\u524d\u7aef\u63a5\u53e3\u5730\u5740\u76f4\u63a5\u4fee\u6539\u4e3aLion.AbpPro.HttpApi.Host\u7684\u63a5\u53e3\u5730\u5740\u3002 Note \u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528IdentityServer4\u53ef\u4ee5\u79fb\u9664Lion.AbpPro.IdentityServer\u9879\u76ee\uff0c\u8bf7\u53c2\u8003\u5982\u4f55\u5982\u4f55\u79fb\u9664IdentityServer4 \u591a\u9879\u76ee\u542f\u52a8(HttpApi.Host,IdentityServer,WebGateway)\uff0c\u5c31\u80fd\u770b\u5230\u540e\u53f0\u670d\u52a1\u767b\u9646\u9875\u9762\uff0c\u5982\u4e0b\uff1a \u524d\u7aef \u00b6 Vben Admin \u6587\u6863 \u5b89\u88c5npm\u5305 \u00b6 pnmp install \u542f\u52a8\u9879\u76ee \u00b6 npm run dev","title":"\u5feb\u901f\u5f00\u59cb"},{"location":"user-guide/zh/getting-started/quick-start/#_1","text":"","title":"\u5feb\u901f\u5f00\u59cb"},{"location":"user-guide/zh/getting-started/quick-start/#_2","text":"dotnet core 6.0.202 nodejs 16+ pnpm mysql redis rabbitmq \u53ef\u9009 Docker\u4e00\u952e\u5b89\u88c5Mysql|Redis|Rabbitmq \u5feb\u901f\u642d\u5efa\u5fc5\u8981\u73af\u5883\uff0c\u4e0b\u8f7d docker-compose.yaml , \u6267\u884c: docker-compose up -d","title":"\u5148\u51b3\u6761\u4ef6"},{"location":"user-guide/zh/getting-started/quick-start/#_3","text":"","title":"\u521b\u5efa\u65b0\u9879\u76ee"},{"location":"user-guide/zh/getting-started/quick-start/#clone","text":"git clone https://github.com/WangJunZzz/abp-vnext-pro.git \u6216\u8005","title":"\u76f4\u63a5Clone"},{"location":"user-guide/zh/getting-started/quick-start/#gui","text":"","title":"GUI\u521b\u5efa\u9879\u76ee"},{"location":"user-guide/zh/getting-started/quick-start/#_4","text":"\u4fee\u6539 HttpApi.Host-> appsettings.json \u914d\u7f6e Mysql \u8fde\u63a5\u5b57\u7b26\u4e32 Redis \u8fde\u63a5\u5b57\u7b26\u4e32 RabbitMq(\u5982\u679c\u4e0d\u9700\u8981\u542f\u7528\u8bbe\u7f6e\u4e3a false) Es \u5730\u5740\u5373\u53ef(\u5982\u679c\u6ca1\u6709 es \u4e5f\u53ef\u4ee5\u8fd0\u884c,\u53ea\u662f\u524d\u7aef es \u65e5\u5fd7\u9875\u9762\u65e0\u6cd5\u4f7f\u7528\u800c\u5df2\uff0c\u4e0d\u5f71\u54cd\u540e\u7aef\u9879\u76ee\u542f\u52a8) \u4fee\u6539 IdentityServer-> appsettings.json \u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 \u4fee\u6539 DbMigrator-> appsettings.json \u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 \u53f3\u952e\u5355\u51fb.DbMigrator\u9879\u76ee,\u8bbe\u7f6e\u4e3a\u542f\u52a8\u9879\u76ee\u8fd0\u884c\uff0c\u6309F5(\u6216Ctrl + F5) \u8fd0\u884c\u5e94\u7528\u7a0b\u5e8f. \u5b83\u5c06\u5177\u6709\u5982\u4e0b\u6240\u793a\u7684\u8f93\u51fa: Note \u521d\u59cb\u7684\u79cd\u5b50\u6570\u636e\u5728\u6570\u636e\u5e93\u4e2d\u521b\u5efa\u4e86 admin \u7528\u6237(\u5bc6\u7801\u4e3a1q2w3E*) \u7528\u4e8e\u767b\u5f55\u5e94\u7528\u7a0b\u5e8f. \u6240\u4ee5, \u5bf9\u4e8e\u65b0\u6570\u636e\u5e93\u81f3\u5c11\u4f7f\u7528 .DbMigrator \u4e00\u6b21. Note \u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528Ocelot\u7f51\u5173\u53ef\u4ee5\u79fb\u9664Lion.AbpPro.WebGateway\u9879\u76ee\uff0c\u524d\u7aef\u63a5\u53e3\u5730\u5740\u76f4\u63a5\u4fee\u6539\u4e3aLion.AbpPro.HttpApi.Host\u7684\u63a5\u53e3\u5730\u5740\u3002 Note \u5982\u679c\u4e0d\u9700\u8981\u4f7f\u7528IdentityServer4\u53ef\u4ee5\u79fb\u9664Lion.AbpPro.IdentityServer\u9879\u76ee\uff0c\u8bf7\u53c2\u8003\u5982\u4f55\u5982\u4f55\u79fb\u9664IdentityServer4 \u591a\u9879\u76ee\u542f\u52a8(HttpApi.Host,IdentityServer,WebGateway)\uff0c\u5c31\u80fd\u770b\u5230\u540e\u53f0\u670d\u52a1\u767b\u9646\u9875\u9762\uff0c\u5982\u4e0b\uff1a","title":"\u540e\u7aef"},{"location":"user-guide/zh/getting-started/quick-start/#_5","text":"Vben Admin \u6587\u6863","title":"\u524d\u7aef"},{"location":"user-guide/zh/getting-started/quick-start/#npm","text":"pnmp install","title":"\u5b89\u88c5npm\u5305"},{"location":"user-guide/zh/getting-started/quick-start/#_6","text":"npm run dev","title":"\u542f\u52a8\u9879\u76ee"},{"location":"user-guide/zh/infrastructure/config/","text":"\u914d\u7f6e \u00b6 \u65e5\u5fd7 \u00b6 \u65e5\u5fd7\u7ea7\u522b \u00b6 Debug \u2192 Information \u2192 Warning \u2192 Error \u2192 Fatal \"Serilog\" : { \"Using\" : [ \"Serilog.Sinks.Console\" , \"Serilog.Sinks.File\" ], \"MinimumLevel\" : { // \u9ed8\u8ba4\u5168\u5c40\u65e5\u5fd7\u7ea7\u522b \"Default\" : \"Information\" , \"Override\" : { //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft \u65e5\u5fd7\u7ea7\u522b \"Microsoft\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Volo.Abp \u65e5\u5fd7\u7ea7\u522b \"Volo.Abp\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Hangfire \u65e5\u5fd7\u7ea7\u522b \"Hangfire\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a DotNetCore.CAP \u65e5\u5fd7\u7ea7\u522b \"DotNetCore.CAP\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Serilog.AspNetCore \u65e5\u5fd7\u7ea7\u522b \"Serilog.AspNetCore\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft.EntityFrameworkCore \u65e5\u5fd7\u7ea7\u522b \"Microsoft.EntityFrameworkCore\" : \"Warning\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft.AspNetCore \u65e5\u5fd7\u7ea7\u522b \"Microsoft.AspNetCore\" : \"Information\" } }, \"WriteTo\" : [ { // \u8f93\u51fa\u5230\u63a7\u5236\u53f0\u65e5\u5fd7 \"Name\" : \"Console\" }, { // \u8f93\u51fa\u5230\u6587\u4ef6 \"Name\" : \"File\" , \"Args\" : { \"path\" : \"logs/logs-.txt\" , // \u6309\u5929\u8f93\u51fa \"rollingInterval\" : \"Day\" } } ] } \u5199\u5165ES \u00b6 \u5148\u51b3\u6761\u4ef6\uff1a\u642d\u5efa\u597dES\u73af\u5883 Enabled:\u662f\u5426\u542f\u7528 Url:es\u5730\u5740 IndexFormat:es\u7d22\u5f15 UserName:\u7528\u6237\u540d Password:\u5bc6\u7801 SearchIndexFormat:es\u65e5\u5fd7\u67e5\u8be2\u7d22\u5f15\u6a21\u5f0f \"ElasticSearch\" : { \"Enabled\" : \"false\" , \"Url\" : \"http://es.cn\" , \"IndexFormat\" : \"Lion.AbpPro.development.{0:yyyy.MM.dd}\" , \"UserName\" : \"elastic\" , \"Password\" : \"aVVhjQ95RP7nbwNy\" , \"SearchIndexFormat\" : \"Lion.AbpPro.development*\" }, \u67e5\u770bLion.AbpPro.HttpApi.Host.Program.cs public class Program { public static void Main ( string [] args ) { CreateHostBuilder ( args ). Build (). Run (); } private static IHostBuilder CreateHostBuilder ( string [] args ) => Host . CreateDefaultBuilder ( args ) . ConfigureWebHostDefaults ( webBuilder => { webBuilder . ConfigureKestrel (( context , options ) => { options . Limits . MaxRequestBodySize = 1024 * 50 ; }); webBuilder . UseStartup < Startup >(); }) . UseSerilog (( context , loggerConfiguration ) => { // \u914d\u7f6eES\u65e5\u5fd7 SerilogToEsExtensions . SetSerilogConfiguration ( loggerConfiguration , context . Configuration ); }). UseAutofac (); } \u8de8\u57df(CORS) \u00b6 \u5141\u8bb8\u6307\u5b9a\u7b56\u7565 \"App\" : { // \u9017\u53f7\u5206\u9694 \"CorsOrigins\" : \"http://*.com,http://localhost:4200\" }, \u914d\u7f6e\u8de8\u57df private void ConfigureCors ( ServiceConfigurationContext context ) { var configuration = context . Services . GetConfiguration (); context . Services . AddCors ( options => { options . AddPolicy ( DefaultCorsPolicyName , builder => { builder . WithOrigins ( configuration [ \"App:CorsOrigins\" ] . Split ( \",\" , StringSplitOptions . RemoveEmptyEntries ) . Select ( o => o . RemovePostFix ( \"/\" )) . ToArray () ) . WithAbpExposedHeaders () . SetIsOriginAllowedToAllowWildcardSubdomains () . AllowAnyHeader () . AllowAnyMethod () . AllowCredentials (); }); }); } AccessToken \u00b6 Audience:\u63a5\u6536\u5bf9\u8c61 Issuer:\u7b7e\u53d1\u4e3b\u4f53 SecurityKey:\u5bc6\u94a5 ExpirationTime:\u8fc7\u671f\u65f6\u95f4(\u5355\u4f4d\u5c0f\u65f6) \"Jwt\" : { \"Audience\" : \"Lion.AbpPro\" , \"SecurityKey\" : \"dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=\" , \"Issuer\" : \"Lion.AbpPro\" , \"ExpirationTime\" : 30 } CAP \u00b6 \u5982\u679c\u8981\u5207\u6362\u5176\u4ed6\u4e2d\u95f4\u4ef6\u8bf7\u53c2\u8003 dotnetcore.cap Enabled: \u662f\u5426\u542f\u7528 RabbitMq\uff1aMq\u914d\u7f6e \"Cap\" : { \"Enabled\" : \"true\" , \"RabbitMq\" : { \"HostName\" : \"localhost\" , \"UserName\" : \"admin\" , \"Password\" : \"admin\" } }","title":"\u914d\u7f6e"},{"location":"user-guide/zh/infrastructure/config/#_1","text":"","title":"\u914d\u7f6e"},{"location":"user-guide/zh/infrastructure/config/#_2","text":"","title":"\u65e5\u5fd7"},{"location":"user-guide/zh/infrastructure/config/#_3","text":"Debug \u2192 Information \u2192 Warning \u2192 Error \u2192 Fatal \"Serilog\" : { \"Using\" : [ \"Serilog.Sinks.Console\" , \"Serilog.Sinks.File\" ], \"MinimumLevel\" : { // \u9ed8\u8ba4\u5168\u5c40\u65e5\u5fd7\u7ea7\u522b \"Default\" : \"Information\" , \"Override\" : { //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft \u65e5\u5fd7\u7ea7\u522b \"Microsoft\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Volo.Abp \u65e5\u5fd7\u7ea7\u522b \"Volo.Abp\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Hangfire \u65e5\u5fd7\u7ea7\u522b \"Hangfire\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a DotNetCore.CAP \u65e5\u5fd7\u7ea7\u522b \"DotNetCore.CAP\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Serilog.AspNetCore \u65e5\u5fd7\u7ea7\u522b \"Serilog.AspNetCore\" : \"Information\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft.EntityFrameworkCore \u65e5\u5fd7\u7ea7\u522b \"Microsoft.EntityFrameworkCore\" : \"Warning\" , //\u540d\u79f0\u7a7a\u95f4\u4e3a Microsoft.AspNetCore \u65e5\u5fd7\u7ea7\u522b \"Microsoft.AspNetCore\" : \"Information\" } }, \"WriteTo\" : [ { // \u8f93\u51fa\u5230\u63a7\u5236\u53f0\u65e5\u5fd7 \"Name\" : \"Console\" }, { // \u8f93\u51fa\u5230\u6587\u4ef6 \"Name\" : \"File\" , \"Args\" : { \"path\" : \"logs/logs-.txt\" , // \u6309\u5929\u8f93\u51fa \"rollingInterval\" : \"Day\" } } ] }","title":"\u65e5\u5fd7\u7ea7\u522b"},{"location":"user-guide/zh/infrastructure/config/#es","text":"\u5148\u51b3\u6761\u4ef6\uff1a\u642d\u5efa\u597dES\u73af\u5883 Enabled:\u662f\u5426\u542f\u7528 Url:es\u5730\u5740 IndexFormat:es\u7d22\u5f15 UserName:\u7528\u6237\u540d Password:\u5bc6\u7801 SearchIndexFormat:es\u65e5\u5fd7\u67e5\u8be2\u7d22\u5f15\u6a21\u5f0f \"ElasticSearch\" : { \"Enabled\" : \"false\" , \"Url\" : \"http://es.cn\" , \"IndexFormat\" : \"Lion.AbpPro.development.{0:yyyy.MM.dd}\" , \"UserName\" : \"elastic\" , \"Password\" : \"aVVhjQ95RP7nbwNy\" , \"SearchIndexFormat\" : \"Lion.AbpPro.development*\" }, \u67e5\u770bLion.AbpPro.HttpApi.Host.Program.cs public class Program { public static void Main ( string [] args ) { CreateHostBuilder ( args ). Build (). Run (); } private static IHostBuilder CreateHostBuilder ( string [] args ) => Host . CreateDefaultBuilder ( args ) . ConfigureWebHostDefaults ( webBuilder => { webBuilder . ConfigureKestrel (( context , options ) => { options . Limits . MaxRequestBodySize = 1024 * 50 ; }); webBuilder . UseStartup < Startup >(); }) . UseSerilog (( context , loggerConfiguration ) => { // \u914d\u7f6eES\u65e5\u5fd7 SerilogToEsExtensions . SetSerilogConfiguration ( loggerConfiguration , context . Configuration ); }). UseAutofac (); }","title":"\u5199\u5165ES"},{"location":"user-guide/zh/infrastructure/config/#cors","text":"\u5141\u8bb8\u6307\u5b9a\u7b56\u7565 \"App\" : { // \u9017\u53f7\u5206\u9694 \"CorsOrigins\" : \"http://*.com,http://localhost:4200\" }, \u914d\u7f6e\u8de8\u57df private void ConfigureCors ( ServiceConfigurationContext context ) { var configuration = context . Services . GetConfiguration (); context . Services . AddCors ( options => { options . AddPolicy ( DefaultCorsPolicyName , builder => { builder . WithOrigins ( configuration [ \"App:CorsOrigins\" ] . Split ( \",\" , StringSplitOptions . RemoveEmptyEntries ) . Select ( o => o . RemovePostFix ( \"/\" )) . ToArray () ) . WithAbpExposedHeaders () . SetIsOriginAllowedToAllowWildcardSubdomains () . AllowAnyHeader () . AllowAnyMethod () . AllowCredentials (); }); }); }","title":"\u8de8\u57df(CORS)"},{"location":"user-guide/zh/infrastructure/config/#accesstoken","text":"Audience:\u63a5\u6536\u5bf9\u8c61 Issuer:\u7b7e\u53d1\u4e3b\u4f53 SecurityKey:\u5bc6\u94a5 ExpirationTime:\u8fc7\u671f\u65f6\u95f4(\u5355\u4f4d\u5c0f\u65f6) \"Jwt\" : { \"Audience\" : \"Lion.AbpPro\" , \"SecurityKey\" : \"dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=\" , \"Issuer\" : \"Lion.AbpPro\" , \"ExpirationTime\" : 30 }","title":"AccessToken"},{"location":"user-guide/zh/infrastructure/config/#cap","text":"\u5982\u679c\u8981\u5207\u6362\u5176\u4ed6\u4e2d\u95f4\u4ef6\u8bf7\u53c2\u8003 dotnetcore.cap Enabled: \u662f\u5426\u542f\u7528 RabbitMq\uff1aMq\u914d\u7f6e \"Cap\" : { \"Enabled\" : \"true\" , \"RabbitMq\" : { \"HostName\" : \"localhost\" , \"UserName\" : \"admin\" , \"Password\" : \"admin\" } }","title":"CAP"},{"location":"user-guide/zh/infrastructure/freesql/","text":"CQRS \u00b6 CQRS:\u547d\u4ee4\u67e5\u8be2\u804c\u8d23\u9694\u79bb,\u547d\u4ee4\u662f\u6307 \u63d2\u5165\u3001\u4fee\u6539\u3001\u5220\u9664\uff0c\u5c31\u662f\u66f4\u6539\u6570\u636e\u7684\u52a8\u4f5c.\u901a\u8fc7 Freesql \u89e3\u51b3\u5355\u4e00\u6570\u636e\u6a21\u578b\u5e26\u6765\u7684\u67e5\u8be2\u5c34\u5c2c\u573a\u9762\u3002 \u5f53\u524d\u67b6\u6784\u4e0b\uff0cFreesql \u548c ef \u4e0d\u5728\u4e00\u4e2a\u4e8b\u52a1\uff0c\u6700\u597d\u5b9e\u73b0\u5c31\u662f\u7528\u6765\u505a\u67e5\u8be2\uff0c\u6bd4\u5982\u5206\u9875\u67e5\u8be2\u3002 \u914d\u7f6e \u00b6 public class AbpProFreeSqlModule : AbpModule { public override void ConfigureServices ( ServiceConfigurationContext context ) { var configuration = context . Services . GetConfiguration (); var connectionString = configuration . GetConnectionString ( \"Default\" ); var freeSql = new FreeSql . FreeSqlBuilder () . UseConnectionString ( FreeSql . DataType . MySql , connectionString ) . Build (); context . Services . AddSingleton < IFreeSql >( freeSql ); } } \u4f7f\u7528 \u00b6 \u5728 Domain \u5c42\u6dfb\u52a0\u63a5\u53e3 public interface IUserFreeSqlBasicRepository { Task < List < UserOutput >> GetListAsync (); } \u5728 Freesql \u5c42\u6dfb\u52a0\u5b9e\u73b0 public class UserFreeSqlBasicRepository : FreeSqlBasicRepository , IUserFreeSqlBasicRepository { public async Task < List < UserOutput >> GetListAsync () { var sql = \"select id from AbpUsers\" ; var result = await FreeSql . Select < UserOutput >() . WithSql ( sql ) . ToListAsync (); return result ; } }","title":"FreeSql"},{"location":"user-guide/zh/infrastructure/freesql/#cqrs","text":"CQRS:\u547d\u4ee4\u67e5\u8be2\u804c\u8d23\u9694\u79bb,\u547d\u4ee4\u662f\u6307 \u63d2\u5165\u3001\u4fee\u6539\u3001\u5220\u9664\uff0c\u5c31\u662f\u66f4\u6539\u6570\u636e\u7684\u52a8\u4f5c.\u901a\u8fc7 Freesql \u89e3\u51b3\u5355\u4e00\u6570\u636e\u6a21\u578b\u5e26\u6765\u7684\u67e5\u8be2\u5c34\u5c2c\u573a\u9762\u3002 \u5f53\u524d\u67b6\u6784\u4e0b\uff0cFreesql \u548c ef \u4e0d\u5728\u4e00\u4e2a\u4e8b\u52a1\uff0c\u6700\u597d\u5b9e\u73b0\u5c31\u662f\u7528\u6765\u505a\u67e5\u8be2\uff0c\u6bd4\u5982\u5206\u9875\u67e5\u8be2\u3002","title":"CQRS"},{"location":"user-guide/zh/infrastructure/freesql/#_1","text":"public class AbpProFreeSqlModule : AbpModule { public override void ConfigureServices ( ServiceConfigurationContext context ) { var configuration = context . Services . GetConfiguration (); var connectionString = configuration . GetConnectionString ( \"Default\" ); var freeSql = new FreeSql . FreeSqlBuilder () . UseConnectionString ( FreeSql . DataType . MySql , connectionString ) . Build (); context . Services . AddSingleton < IFreeSql >( freeSql ); } }","title":"\u914d\u7f6e"},{"location":"user-guide/zh/infrastructure/freesql/#_2","text":"\u5728 Domain \u5c42\u6dfb\u52a0\u63a5\u53e3 public interface IUserFreeSqlBasicRepository { Task < List < UserOutput >> GetListAsync (); } \u5728 Freesql \u5c42\u6dfb\u52a0\u5b9e\u73b0 public class UserFreeSqlBasicRepository : FreeSqlBasicRepository , IUserFreeSqlBasicRepository { public async Task < List < UserOutput >> GetListAsync () { var sql = \"select id from AbpUsers\" ; var result = await FreeSql . Select < UserOutput >() . WithSql ( sql ) . ToListAsync (); return result ; } }","title":"\u4f7f\u7528"},{"location":"user-guide/zh/infrastructure/frontend/","text":"\u524d\u7aef \u00b6 Vben Admin \u6587\u6863 \u4ee3\u7801\u751f\u6210 \u00b6 \u524d\u7aef\u63a5\u53e3\uff0c\u53c2\u6570\uff0c\u81ea\u52a8\u751f\u6210\uff0c\u5168\u90e8\u91c7\u7528 Post \u65b9\u5f0f \u6240\u6709\u8bbf\u95ee\u540e\u7aef\u63a5\u53e3\u4ee3\u7801\u81ea\u52a8\u751f\u6210 NSwag \u914d\u7f6e\u4ee3\u7406\u7684\u5730\u5740 \u00b6 nswag->nswag.json \"documentGenerator\" : { \"fromDocument\" : { // \u4ee3\u7406\u5730\u5740\uff0c\u53ea\u6709\u751f\u6210\u7684\u65f6\u5019\u7528\uff0c\u4e0d\u533a\u5206\u73af\u5883 \"url\" : \"http://localhost:44315/swagger/v1/swagger.json\" , } } \u5982\u679c\u63a5\u53e3\u53c2\u6570\u6216\u8005\u8fd4\u56de\u503c\u6709\u6539\u53d8\uff0c\u9700\u8981\u91cd\u65b0\u751f\u6210\u4ee3\u7406\uff0c\u6267\u884c: npm run nswag \u540e\u7aefApi\u683c\u5f0f \u00b6 // \u4e00\u5b9a\u8981\u6253Tags\uff0c\u56e0\u4e3a\u524d\u7aef\u4f1a\u6839\u636e\u8fd9\u4e2a\u751f\u6210\u4ee3\u7406\u7c7b // \u5efa\u8bae\u53c2\u6570\u90fd\u5c01\u88c5\u4e3a\u4e00\u4e2aInput [SwaggerOperation(summary: \"\u767b\u5f55\", Tags = new[] { \"Account\" })] public Task < LoginOutput > LoginAsync ( LoginInput input ) { return _loginAppService . LoginAsync ( input ); } \u524d\u7aef\u591a\u73af\u5883 \u00b6 .env.development \u548c.env.production VITE_API_URL:\u540e\u7aef\u63a5\u53e3\u5730\u5740 VITE_AUTH_URL:IdentityServer\u63a5\u53e3\u5730\u5740 \u6743\u9650\u914d\u7f6e \u00b6 \u83dc\u5355\u6743\u9650 \u00b6 import type { AppRouteModule } from \"/@/router/types\" ; import { LAYOUT } from \"/@/router/constant\" ; import { t } from \"/@/hooks/web/useI18n\" ; const tenant : AppRouteModule = { path : \"/tenant\" , name : \"Tenant\" , component : LAYOUT , meta : { orderNo : 30 , icon : \"ant-design:contacts-outlined\" , title : t ( \"routes.tenant.tenantManagement\" ), }, children : [ { path : \"Tenant\" , name : \"Tenant\" , component : () => import ( \"/@/views/tenants/Tenant.vue\" ), meta : { title : t ( \"routes.tenant.tenantList\" ), icon : \"ant-design:switcher-filled\" , policy : \"AbpTenantManagement.Tenants\" , //\u83dc\u5355\u6743\u9650 }, }, ], }; export default tenant ; \u6309\u94ae\u6743\u9650 \u00b6 <template> <div> <BasicTable @register=\"registerTable\" size=\"small\"> <template #action=\"{ record }\"> <TableAction :actions=\"[ { icon: 'ant-design:edit-outlined', auth: 'AbpIdentity.Users.Update', // \u6309\u94ae\u6743\u9650 label: t('common.editText'), onClick: handleEdit.bind(null, record), }, ]\" :dropDownActions=\"[ { auth: 'AbpIdentity.Users.Delete', // \u6309\u94ae\u6743\u9650 label: t('common.delText'), onClick: handleDelete.bind(null, record), }, { auth: 'System.Users.Enable', // \u6309\u94ae\u6743\u9650 label: !record.isActive ? t('common.enabled') : t('common.disEnabled'), onClick: handleLock.bind(null, record), }, ]\" /> </template> </BasicTable> <CreateAbpUser @register=\"registerCreateAbpUserModal\" @reload=\"reload\" :bodyStyle=\"{ 'padding-top': '0' }\" /> <EditAbpUser @register=\"registerEditAbpUserModal\" @reload=\"reload\" :bodyStyle=\"{ 'padding-top': '0' }\" /> </div> </template>","title":"\u524d\u7aef"},{"location":"user-guide/zh/infrastructure/frontend/#_1","text":"Vben Admin \u6587\u6863","title":"\u524d\u7aef"},{"location":"user-guide/zh/infrastructure/frontend/#_2","text":"\u524d\u7aef\u63a5\u53e3\uff0c\u53c2\u6570\uff0c\u81ea\u52a8\u751f\u6210\uff0c\u5168\u90e8\u91c7\u7528 Post \u65b9\u5f0f \u6240\u6709\u8bbf\u95ee\u540e\u7aef\u63a5\u53e3\u4ee3\u7801\u81ea\u52a8\u751f\u6210 NSwag","title":"\u4ee3\u7801\u751f\u6210"},{"location":"user-guide/zh/infrastructure/frontend/#_3","text":"nswag->nswag.json \"documentGenerator\" : { \"fromDocument\" : { // \u4ee3\u7406\u5730\u5740\uff0c\u53ea\u6709\u751f\u6210\u7684\u65f6\u5019\u7528\uff0c\u4e0d\u533a\u5206\u73af\u5883 \"url\" : \"http://localhost:44315/swagger/v1/swagger.json\" , } } \u5982\u679c\u63a5\u53e3\u53c2\u6570\u6216\u8005\u8fd4\u56de\u503c\u6709\u6539\u53d8\uff0c\u9700\u8981\u91cd\u65b0\u751f\u6210\u4ee3\u7406\uff0c\u6267\u884c: npm run nswag","title":"\u914d\u7f6e\u4ee3\u7406\u7684\u5730\u5740"},{"location":"user-guide/zh/infrastructure/frontend/#api","text":"// \u4e00\u5b9a\u8981\u6253Tags\uff0c\u56e0\u4e3a\u524d\u7aef\u4f1a\u6839\u636e\u8fd9\u4e2a\u751f\u6210\u4ee3\u7406\u7c7b // \u5efa\u8bae\u53c2\u6570\u90fd\u5c01\u88c5\u4e3a\u4e00\u4e2aInput [SwaggerOperation(summary: \"\u767b\u5f55\", Tags = new[] { \"Account\" })] public Task < LoginOutput > LoginAsync ( LoginInput input ) { return _loginAppService . LoginAsync ( input ); }","title":"\u540e\u7aefApi\u683c\u5f0f"},{"location":"user-guide/zh/infrastructure/frontend/#_4","text":".env.development \u548c.env.production VITE_API_URL:\u540e\u7aef\u63a5\u53e3\u5730\u5740 VITE_AUTH_URL:IdentityServer\u63a5\u53e3\u5730\u5740","title":"\u524d\u7aef\u591a\u73af\u5883"},{"location":"user-guide/zh/infrastructure/frontend/#_5","text":"","title":"\u6743\u9650\u914d\u7f6e"},{"location":"user-guide/zh/infrastructure/frontend/#_6","text":"import type { AppRouteModule } from \"/@/router/types\" ; import { LAYOUT } from \"/@/router/constant\" ; import { t } from \"/@/hooks/web/useI18n\" ; const tenant : AppRouteModule = { path : \"/tenant\" , name : \"Tenant\" , component : LAYOUT , meta : { orderNo : 30 , icon : \"ant-design:contacts-outlined\" , title : t ( \"routes.tenant.tenantManagement\" ), }, children : [ { path : \"Tenant\" , name : \"Tenant\" , component : () => import ( \"/@/views/tenants/Tenant.vue\" ), meta : { title : t ( \"routes.tenant.tenantList\" ), icon : \"ant-design:switcher-filled\" , policy : \"AbpTenantManagement.Tenants\" , //\u83dc\u5355\u6743\u9650 }, }, ], }; export default tenant ;","title":"\u83dc\u5355\u6743\u9650"},{"location":"user-guide/zh/infrastructure/frontend/#_7","text":"<template> <div> <BasicTable @register=\"registerTable\" size=\"small\"> <template #action=\"{ record }\"> <TableAction :actions=\"[ { icon: 'ant-design:edit-outlined', auth: 'AbpIdentity.Users.Update', // \u6309\u94ae\u6743\u9650 label: t('common.editText'), onClick: handleEdit.bind(null, record), }, ]\" :dropDownActions=\"[ { auth: 'AbpIdentity.Users.Delete', // \u6309\u94ae\u6743\u9650 label: t('common.delText'), onClick: handleDelete.bind(null, record), }, { auth: 'System.Users.Enable', // \u6309\u94ae\u6743\u9650 label: !record.isActive ? t('common.enabled') : t('common.disEnabled'), onClick: handleLock.bind(null, record), }, ]\" /> </template> </BasicTable> <CreateAbpUser @register=\"registerCreateAbpUserModal\" @reload=\"reload\" :bodyStyle=\"{ 'padding-top': '0' }\" /> <EditAbpUser @register=\"registerEditAbpUserModal\" @reload=\"reload\" :bodyStyle=\"{ 'padding-top': '0' }\" /> </div> </template>","title":"\u6309\u94ae\u6743\u9650"},{"location":"user-guide/zh/modules/dic/","text":"\u6570\u636e\u5b57\u5178\u6a21\u5757 \u00b6 Abp\u81ea\u5e26\u7684Setting\u6a21\u5757\u53ef\u80fd\u6ee1\u8db3\u4e0d\u4e86\u9700\u6c42\uff0c\u7279\u610f\u63d0\u4f9b\u6570\u636e\u5b57\u5178\u6a21\u5757\u3002 \u5b89\u88c5 \u00b6 Lion.Abp.DataDictionaryManagement.Application Lion.Abp.DataDictionaryManagement.Application.Contracts Lion.Abp.DataDictionaryManagement.Domain Lion.Abp.DataDictionaryManagement.Domain.Shared Lion.Abp.DataDictionaryManagement.EntityFrameworkCore Lion.Abp.DataDictionaryManagement.HttpApi Lion.Abp.DataDictionaryManagement.HttpApi.Client \u6a21\u5757\u4f9d\u8d56 \u00b6 \u6dfb\u52a0 DependsOn(typeof(DataDictionaryManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureDataDictionaryManagement(); \u5b9e\u4f53 \u00b6 DataDictionary \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid TenantId \u79df\u6237id Guid? Code \u5b57\u5178\u7f16\u7801 string DisplayText \u663e\u793a\u540d string Description \u63cf\u8ff0 DateTime Details \u5b57\u5178\u660e\u7ec6 List IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime DataDictionaryDetail \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid DataDictionaryId \u6240\u5c5e\u5b57\u5178Id Guid Order \u6392\u5e8f Int Code \u5b57\u5178\u7f16\u7801 string IsEnabled \u542f/\u505c\u7528(\u9ed8\u8ba4\u542f\u7528) bool DisplayText \u663e\u793a\u540d string Description \u63cf\u8ff0 DateTime IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime","title":"\u6570\u636e\u5b57\u5178"},{"location":"user-guide/zh/modules/dic/#_1","text":"Abp\u81ea\u5e26\u7684Setting\u6a21\u5757\u53ef\u80fd\u6ee1\u8db3\u4e0d\u4e86\u9700\u6c42\uff0c\u7279\u610f\u63d0\u4f9b\u6570\u636e\u5b57\u5178\u6a21\u5757\u3002","title":"\u6570\u636e\u5b57\u5178\u6a21\u5757"},{"location":"user-guide/zh/modules/dic/#_2","text":"Lion.Abp.DataDictionaryManagement.Application Lion.Abp.DataDictionaryManagement.Application.Contracts Lion.Abp.DataDictionaryManagement.Domain Lion.Abp.DataDictionaryManagement.Domain.Shared Lion.Abp.DataDictionaryManagement.EntityFrameworkCore Lion.Abp.DataDictionaryManagement.HttpApi Lion.Abp.DataDictionaryManagement.HttpApi.Client","title":"\u5b89\u88c5"},{"location":"user-guide/zh/modules/dic/#_3","text":"\u6dfb\u52a0 DependsOn(typeof(DataDictionaryManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureDataDictionaryManagement();","title":"\u6a21\u5757\u4f9d\u8d56"},{"location":"user-guide/zh/modules/dic/#_4","text":"DataDictionary \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid TenantId \u79df\u6237id Guid? Code \u5b57\u5178\u7f16\u7801 string DisplayText \u663e\u793a\u540d string Description \u63cf\u8ff0 DateTime Details \u5b57\u5178\u660e\u7ec6 List IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime DataDictionaryDetail \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid DataDictionaryId \u6240\u5c5e\u5b57\u5178Id Guid Order \u6392\u5e8f Int Code \u5b57\u5178\u7f16\u7801 string IsEnabled \u542f/\u505c\u7528(\u9ed8\u8ba4\u542f\u7528) bool DisplayText \u663e\u793a\u540d string Description \u63cf\u8ff0 DateTime IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime","title":"\u5b9e\u4f53"},{"location":"user-guide/zh/modules/file/","text":"\u6570\u636e\u5b57\u5178\u6a21\u5757 \u00b6 \u4e0eabp\u81ea\u5e26\u7684\u6587\u4ef6\u6a21\u5757\u4e0d\u4e00\u6837\uff0c\u6b64\u6a21\u5757\u63a5\u5165\u963f\u91cc\u4e91oss\u4f5c\u4e3a\u4e91\u5b58\u50a8\u3002 \u524d\u7aef\u4e0a\u4f20\u6587\u4ef6\u5230OSS,\u6587\u4ef6\u6a21\u5757\u4fdd\u5b58\u76f8\u5bf9\u8def\u5f84\u3002 \u5b89\u88c5 \u00b6 Lion.Abp.FileManagement.Application Lion.Abp.FileManagement.Application.Contracts Lion.Abp.FileManagement.Domain Lion.Abp.FileManagement.Domain.Shared Lion.Abp.FileManagement.EntityFrameworkCore Lion.Abp.FileManagement.HttpApi Lion.Abp.FileManagement.HttpApi.Client \u6a21\u5757\u4f9d\u8d56 \u00b6 \u6dfb\u52a0 DependsOn(typeof(FileManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureFileManagement(); \u5b9e\u4f53 \u00b6 File \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid TenantId \u79df\u6237id Guid? FileName \u6587\u4ef6\u540d\u79f0 string FilePath \u6587\u4ef6\u8def\u5f84 string IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime OSS\u914d\u7f6e \u00b6 \u963f\u91cc\u4e91OSS\u914d\u7f6e \u5c06OSS\u914d\u7f6e\u6dfb\u52a0\u5230AppSetting AppSetting\u914d\u7f6e \u00b6 \"AliYun\" : { \"OSS\" : { \"AccessKeyId\" : \"LTAI5tLkt3vvScGPVZ5qKJDc1S\" , \"AccessKeySecret\" : \"BixV8vP5uPrbsdwjYzzsEXOPjkxPST12S\" , \"Endpoint\" : \"oss-cn-shenzhen.aliyuncs.com\" , \"ContainerName\" : \"lion-abp-pro\" , \"RegionId\" : \"oss-cn-shenzhen\" , \"RoleArn\" : \"acs:ram::1846393972471789:role/ramosst1t\" } } \u4e0a\u4f20\u7ec4\u4ef6 \u00b6 \u524d\u7aefUploadOss.ts","title":"\u6587\u4ef6\u7ba1\u7406"},{"location":"user-guide/zh/modules/file/#_1","text":"\u4e0eabp\u81ea\u5e26\u7684\u6587\u4ef6\u6a21\u5757\u4e0d\u4e00\u6837\uff0c\u6b64\u6a21\u5757\u63a5\u5165\u963f\u91cc\u4e91oss\u4f5c\u4e3a\u4e91\u5b58\u50a8\u3002 \u524d\u7aef\u4e0a\u4f20\u6587\u4ef6\u5230OSS,\u6587\u4ef6\u6a21\u5757\u4fdd\u5b58\u76f8\u5bf9\u8def\u5f84\u3002","title":"\u6570\u636e\u5b57\u5178\u6a21\u5757"},{"location":"user-guide/zh/modules/file/#_2","text":"Lion.Abp.FileManagement.Application Lion.Abp.FileManagement.Application.Contracts Lion.Abp.FileManagement.Domain Lion.Abp.FileManagement.Domain.Shared Lion.Abp.FileManagement.EntityFrameworkCore Lion.Abp.FileManagement.HttpApi Lion.Abp.FileManagement.HttpApi.Client","title":"\u5b89\u88c5"},{"location":"user-guide/zh/modules/file/#_3","text":"\u6dfb\u52a0 DependsOn(typeof(FileManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureFileManagement();","title":"\u6a21\u5757\u4f9d\u8d56"},{"location":"user-guide/zh/modules/file/#_4","text":"File \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid TenantId \u79df\u6237id Guid? FileName \u6587\u4ef6\u540d\u79f0 string FilePath \u6587\u4ef6\u8def\u5f84 string IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime","title":"\u5b9e\u4f53"},{"location":"user-guide/zh/modules/file/#oss","text":"\u963f\u91cc\u4e91OSS\u914d\u7f6e \u5c06OSS\u914d\u7f6e\u6dfb\u52a0\u5230AppSetting","title":"OSS\u914d\u7f6e"},{"location":"user-guide/zh/modules/file/#appsetting","text":"\"AliYun\" : { \"OSS\" : { \"AccessKeyId\" : \"LTAI5tLkt3vvScGPVZ5qKJDc1S\" , \"AccessKeySecret\" : \"BixV8vP5uPrbsdwjYzzsEXOPjkxPST12S\" , \"Endpoint\" : \"oss-cn-shenzhen.aliyuncs.com\" , \"ContainerName\" : \"lion-abp-pro\" , \"RegionId\" : \"oss-cn-shenzhen\" , \"RoleArn\" : \"acs:ram::1846393972471789:role/ramosst1t\" } }","title":"AppSetting\u914d\u7f6e"},{"location":"user-guide/zh/modules/file/#_5","text":"\u524d\u7aefUploadOss.ts","title":"\u4e0a\u4f20\u7ec4\u4ef6"},{"location":"user-guide/zh/modules/identity/","text":"\u8eab\u4efd\u7ba1\u7406\u6a21\u5757 \u00b6 \u8eab\u4efd\u6a21\u5757\u57fa\u4e8e Microsoft Identity \u5e93 \u7528\u4e8e\u7ba1\u7406\u89d2\u8272,\u7528\u6237\u53ca\u5176\u6743\u9650. \u7528\u6237 \u00b6 \u6b64\u9875\u7528\u4e8e\u67e5\u770b\u7528\u6237\u5217\u8868. \u60a8\u53ef\u4ee5\u521b\u5efa/\u7f16\u8f91\u548c\u5220\u9664\u7528\u6237, \u5c06\u89d2\u8272\u5206\u914d\u7ed9\u7528\u6237\u3002 \u4e00\u4e2a\u7528\u6237\u53ef\u4ee5\u6709\u96f6\u4e2a\u6216\u591a\u4e2a\u89d2\u8272. \u7528\u6237\u4ece\u5176\u89d2\u8272\u7ee7\u627f\u6743\u9650 \u3002 \u89d2\u8272 \u00b6 \u89d2\u8272\u7528\u4e8e\u6309\u5206\u7ec4\u7ed9\u7528\u6237\u5206\u914d\u6743\u9650. \u89d2\u8272\u9664\u4e86\u89d2\u8272\u540d\u79f0\u4e4b\u5916\u8fd8\u67092\u4e2a\u5c5e\u6027: Default: \u5982\u679c\u67d0\u4e2a\u89d2\u8272\u88ab\u6807\u8bb0\u4e3a \"default\", \u90a3\u4e48\u5f53\u65b0\u7528\u6237\u6ce8\u518c\u5230\u5e94\u7528\u7a0b\u5e8f\u65f6, \u5176\u5c06\u88ab\u4f5c\u4e3a\u9ed8\u8ba4\u89d2\u8272\u5206\u914d\u7ed9\u65b0\u7528\u6237. Public: \u7528\u6237\u7684\u516c\u5171\u89d2\u8272\u53ef\u4ee5\u88ab\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u5176\u4ed6\u7528\u6237\u770b\u5230. \u8fd9\u4e2a\u529f\u80fd\u5728\u8eab\u4efd\u6a21\u5757\u4e2d\u6ca1\u6709\u7528\u5230, \u4f46\u88ab\u63d0\u4f9b\u4f5c\u4e3a\u4f60\u53ef\u80fd\u5e0c\u671b\u5728\u4f60\u81ea\u5df1\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u7684\u529f\u80fd. \u7ec4\u7ec7\u5355\u5143 \u00b6 \u7ec4\u7ec7\u5355\u5143\u7531 OrganizationUnit \u5b9e\u4f53\u8868\u793a. \u5b83\u7684\u57fa\u672c\u5c5e\u6027\u662f: TenantId: \u7ec4\u7ec7\u5355\u5143\u7684\u79df\u6237Id. \u5bf9\u4e8e\u5bbf\u4e3b\u53ef\u4ee5\u662f null. ParentId: \u7236\u7ea7\u7ec4\u7ec7\u5355\u5143\u7684Id. \u5982\u679c\u8fd9\u662f\u4e00\u4e2a\u6839\u7ea7\u7ec4\u7ec7\u5355\u5143\uff0c\u5b83\u53ef\u4ee5\u662f null. Code: \u5bf9\u4e8e\u79df\u6237\u552f\u4e00\u7684\u5c42\u7ea7\u5b57\u7b26\u4e32\u7f16\u7801. DisplayName: \u7ec4\u7ec7\u5355\u5143\u7684\u663e\u793a\u540d\u79f0. \u7ec4\u7ec7\u6811 \u00b6 \u7531\u4e8e\u7ec4\u7ec7\u5355\u5143\u53ef\u4ee5\u6709\u7236\u7ea7, \u56e0\u6b64\u79df\u6237\u7684\u6240\u6709\u7ec4\u7ec7\u5355\u5143\u662f\u4e00\u4e2a \u6811 \u7ed3\u6784. \u8fd9\u4e2a\u6811\u6709\u4e00\u4e9b\u89c4\u5219; \u53ef\u4ee5\u6709\u591a\u4e2a\u6839\u7ea7 (ParentId \u662f null \u7684) . \u4e00\u4e2a\u7ec4\u7ec7\u5355\u5143\u7684\u7b2c\u4e00\u7ea7\u5b50\u9879\u6570\u91cf\u6709\u9650\u5236 (\u56e0\u4e3a\u4e0b\u9762\u89e3\u91ca\u7684\u56fa\u5b9a\u7684\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u5355\u4f4d\u957f\u5ea6) . \u7ec4\u7ec7\u5355\u5143\u7f16\u7801 \u00b6 \u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u662f\u901a\u8fc7 OrganizationUnitManager \u670d\u52a1\u81ea\u52a8\u751f\u6210\u548c\u7ef4\u62a4\u7684. \u5b83\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32, \u50cf\u8fd9\u6837:\"00001.00042.00005\" \u901a\u5e38\u7528\u8fd9\u79cd\u7f16\u7801\u53ef\u4ee5\u8f7b\u6613\u5730 (\u9012\u5f52) \u67e5\u8be2\u51fa\u6570\u636e\u5e93\u4e2d\u7ec4\u7ec7\u5355\u5143\u7684\u6240\u6709\u5b50\u9879. \u8fd9\u4e2a\u7f16\u7801\u6709\u4e00\u4e9b\u89c4\u5219 (\u5f53\u4f60\u4f7f\u7528 OrganizationUnitManager \u65f6\u81ea\u52a8\u88ab\u5e94\u7528\u7684) : \u5bf9 \u79df\u6237 \u662f \u552f\u4e00\u7684. \u540c\u4e00\u7ec4\u7ec7\u5355\u5143\u7684\u5168\u90e8\u5b50\u9879\u90fd\u5177\u6709 \u4ee5\u7236\u7ea7\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u5f00\u5934\u7684 \u7f16\u7801. \u5982\u793a\u4f8b\u4e2d\u6240\u793a, \u5b83\u662f\u56fa\u5b9a\u957f\u5ea6\u7684\u4e14\u662f\u57fa\u4e8e\u6811\u4e2d\u7ec4\u7ec7\u5355\u5143\u7684\u7ea7\u522b\u7684. \u5c3d\u7ba1\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u662f\u552f\u4e00\u7684, \u4f46\u5982\u679c\u4f60\u79fb\u52a8\u4e86\u76f8\u5173\u7684\u7ec4\u7ec7\u5355\u5143, \u5b83\u4e5f\u53ef\u4ee5\u88ab\u66f4\u6539. \u8bf7\u6ce8\u610f, \u4f60\u5fc5\u987b\u6839\u636eId\u5f15\u7528\u4e00\u4e2a\u7ec4\u7ec7\u5355\u5143, \u800c\u4e0d\u662f\u7f16\u7801, \u56e0\u4e3a\u7f16\u7801\u540e\u7eed\u662f\u53ef\u4ee5\u88ab\u66f4\u6539\u7684.","title":"\u8eab\u4efd\u8ba4\u8bc1"},{"location":"user-guide/zh/modules/identity/#_1","text":"\u8eab\u4efd\u6a21\u5757\u57fa\u4e8e Microsoft Identity \u5e93 \u7528\u4e8e\u7ba1\u7406\u89d2\u8272,\u7528\u6237\u53ca\u5176\u6743\u9650.","title":"\u8eab\u4efd\u7ba1\u7406\u6a21\u5757"},{"location":"user-guide/zh/modules/identity/#_2","text":"\u6b64\u9875\u7528\u4e8e\u67e5\u770b\u7528\u6237\u5217\u8868. \u60a8\u53ef\u4ee5\u521b\u5efa/\u7f16\u8f91\u548c\u5220\u9664\u7528\u6237, \u5c06\u89d2\u8272\u5206\u914d\u7ed9\u7528\u6237\u3002 \u4e00\u4e2a\u7528\u6237\u53ef\u4ee5\u6709\u96f6\u4e2a\u6216\u591a\u4e2a\u89d2\u8272. \u7528\u6237\u4ece\u5176\u89d2\u8272\u7ee7\u627f\u6743\u9650 \u3002","title":"\u7528\u6237"},{"location":"user-guide/zh/modules/identity/#_3","text":"\u89d2\u8272\u7528\u4e8e\u6309\u5206\u7ec4\u7ed9\u7528\u6237\u5206\u914d\u6743\u9650. \u89d2\u8272\u9664\u4e86\u89d2\u8272\u540d\u79f0\u4e4b\u5916\u8fd8\u67092\u4e2a\u5c5e\u6027: Default: \u5982\u679c\u67d0\u4e2a\u89d2\u8272\u88ab\u6807\u8bb0\u4e3a \"default\", \u90a3\u4e48\u5f53\u65b0\u7528\u6237\u6ce8\u518c\u5230\u5e94\u7528\u7a0b\u5e8f\u65f6, \u5176\u5c06\u88ab\u4f5c\u4e3a\u9ed8\u8ba4\u89d2\u8272\u5206\u914d\u7ed9\u65b0\u7528\u6237. Public: \u7528\u6237\u7684\u516c\u5171\u89d2\u8272\u53ef\u4ee5\u88ab\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u5176\u4ed6\u7528\u6237\u770b\u5230. \u8fd9\u4e2a\u529f\u80fd\u5728\u8eab\u4efd\u6a21\u5757\u4e2d\u6ca1\u6709\u7528\u5230, \u4f46\u88ab\u63d0\u4f9b\u4f5c\u4e3a\u4f60\u53ef\u80fd\u5e0c\u671b\u5728\u4f60\u81ea\u5df1\u7684\u5e94\u7528\u7a0b\u5e8f\u4e2d\u4f7f\u7528\u7684\u529f\u80fd.","title":"\u89d2\u8272"},{"location":"user-guide/zh/modules/identity/#_4","text":"\u7ec4\u7ec7\u5355\u5143\u7531 OrganizationUnit \u5b9e\u4f53\u8868\u793a. \u5b83\u7684\u57fa\u672c\u5c5e\u6027\u662f: TenantId: \u7ec4\u7ec7\u5355\u5143\u7684\u79df\u6237Id. \u5bf9\u4e8e\u5bbf\u4e3b\u53ef\u4ee5\u662f null. ParentId: \u7236\u7ea7\u7ec4\u7ec7\u5355\u5143\u7684Id. \u5982\u679c\u8fd9\u662f\u4e00\u4e2a\u6839\u7ea7\u7ec4\u7ec7\u5355\u5143\uff0c\u5b83\u53ef\u4ee5\u662f null. Code: \u5bf9\u4e8e\u79df\u6237\u552f\u4e00\u7684\u5c42\u7ea7\u5b57\u7b26\u4e32\u7f16\u7801. DisplayName: \u7ec4\u7ec7\u5355\u5143\u7684\u663e\u793a\u540d\u79f0.","title":"\u7ec4\u7ec7\u5355\u5143"},{"location":"user-guide/zh/modules/identity/#_5","text":"\u7531\u4e8e\u7ec4\u7ec7\u5355\u5143\u53ef\u4ee5\u6709\u7236\u7ea7, \u56e0\u6b64\u79df\u6237\u7684\u6240\u6709\u7ec4\u7ec7\u5355\u5143\u662f\u4e00\u4e2a \u6811 \u7ed3\u6784. \u8fd9\u4e2a\u6811\u6709\u4e00\u4e9b\u89c4\u5219; \u53ef\u4ee5\u6709\u591a\u4e2a\u6839\u7ea7 (ParentId \u662f null \u7684) . \u4e00\u4e2a\u7ec4\u7ec7\u5355\u5143\u7684\u7b2c\u4e00\u7ea7\u5b50\u9879\u6570\u91cf\u6709\u9650\u5236 (\u56e0\u4e3a\u4e0b\u9762\u89e3\u91ca\u7684\u56fa\u5b9a\u7684\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u5355\u4f4d\u957f\u5ea6) .","title":"\u7ec4\u7ec7\u6811"},{"location":"user-guide/zh/modules/identity/#_6","text":"\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u662f\u901a\u8fc7 OrganizationUnitManager \u670d\u52a1\u81ea\u52a8\u751f\u6210\u548c\u7ef4\u62a4\u7684. \u5b83\u662f\u4e00\u4e2a\u5b57\u7b26\u4e32, \u50cf\u8fd9\u6837:\"00001.00042.00005\" \u901a\u5e38\u7528\u8fd9\u79cd\u7f16\u7801\u53ef\u4ee5\u8f7b\u6613\u5730 (\u9012\u5f52) \u67e5\u8be2\u51fa\u6570\u636e\u5e93\u4e2d\u7ec4\u7ec7\u5355\u5143\u7684\u6240\u6709\u5b50\u9879. \u8fd9\u4e2a\u7f16\u7801\u6709\u4e00\u4e9b\u89c4\u5219 (\u5f53\u4f60\u4f7f\u7528 OrganizationUnitManager \u65f6\u81ea\u52a8\u88ab\u5e94\u7528\u7684) : \u5bf9 \u79df\u6237 \u662f \u552f\u4e00\u7684. \u540c\u4e00\u7ec4\u7ec7\u5355\u5143\u7684\u5168\u90e8\u5b50\u9879\u90fd\u5177\u6709 \u4ee5\u7236\u7ea7\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u5f00\u5934\u7684 \u7f16\u7801. \u5982\u793a\u4f8b\u4e2d\u6240\u793a, \u5b83\u662f\u56fa\u5b9a\u957f\u5ea6\u7684\u4e14\u662f\u57fa\u4e8e\u6811\u4e2d\u7ec4\u7ec7\u5355\u5143\u7684\u7ea7\u522b\u7684. \u5c3d\u7ba1\u7ec4\u7ec7\u5355\u5143\u7f16\u7801\u662f\u552f\u4e00\u7684, \u4f46\u5982\u679c\u4f60\u79fb\u52a8\u4e86\u76f8\u5173\u7684\u7ec4\u7ec7\u5355\u5143, \u5b83\u4e5f\u53ef\u4ee5\u88ab\u66f4\u6539. \u8bf7\u6ce8\u610f, \u4f60\u5fc5\u987b\u6839\u636eId\u5f15\u7528\u4e00\u4e2a\u7ec4\u7ec7\u5355\u5143, \u800c\u4e0d\u662f\u7f16\u7801, \u56e0\u4e3a\u7f16\u7801\u540e\u7eed\u662f\u53ef\u4ee5\u88ab\u66f4\u6539\u7684.","title":"\u7ec4\u7ec7\u5355\u5143\u7f16\u7801"},{"location":"user-guide/zh/modules/setting/","text":"\u8bbe\u7f6e\u7ba1\u7406 \u00b6 \u5b98\u65b9Setting\u6a21\u5757\u53c2\u8003\u6587\u6863 \u914d\u7f6e\u7cfb\u7edf\u662f\u5728\u542f\u52a8\u65f6\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u5f88\u597d\u7684\u65b9\u5f0f. \u9664\u4e86\u914d\u7f6e\u4e4b\u5916, ABP\u63d0\u4f9b\u4e86\u53e6\u5916\u4e00\u79cd\u8bbe\u7f6e\u548c\u83b7\u53d6\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u7684\u65b9\u5f0f. \u8bbe\u7f6e\u5b58\u50a8\u5728\u52a8\u6001\u6570\u636e\u6e90(\u901a\u5e38\u662f\u6570\u636e\u5e93)\u4e2d\u7684\u952e\u503c\u5bf9. \u8bbe\u7f6e\u7cfb\u7edf\u9884\u6784\u5efa\u4e86\u7528\u6237,\u79df\u6237,\u5168\u5c40\u548c\u9ed8\u8ba4\u8bbe\u7f6e\u65b9\u6cd5\u5e76\u4e14\u53ef\u4ee5\u8fdb\u884c\u6269\u5c55. \u5b9a\u4e49\u8bbe\u7f6e \u00b6 \u4f7f\u7528\u8bbe\u7f6e\u4e4b\u524d\u9700\u8981\u5b9a\u4e49\u5b83. ABP\u662f \u6a21\u5757\u5316\u7684, \u4e0d\u540c\u7684\u6a21\u5757\u53ef\u4ee5\u62e5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e. \u53ea\u9700\u8981\u5b9e\u73b0SettingDefinitionProvider\u7c7b\u65e2\u53ef. \u793a\u4f8b\u5982\u4e0b: \u548c\u5b98\u65b9Setting\u6a21\u5757\u533a\u522b\uff0c\u503c\u6dfb\u52a0\u4e862\u4e2a\u5c5e\u6027\uff0c\u4e00\u4e2a\u5206\u7ec4\uff0c\u4e00\u4e2a\u7ec4\u4ef6\u7c7b\u578b public class CustomSettingProvider : SettingDefinitionProvider { public override void Define ( ISettingDefinitionContext context ) { context . Add ( new SettingDefinition ( AbpProSettings . Other . Github , \"https://github.com/WangJunZzz/abp-vnext-pro\" , L ( \"DisplayName:\" + AbpProSettings . Other . Github ), L ( \"Description:\" + AbpProSettings . Other . Github ) ) // \u5206\u7ec4 . WithProperty ( AbpProSettings . Group . Default , AbpProSettings . Group . OtherManagement ) // \u524d\u7aef\u7ec4\u4ef6\u7c7b\u578b . WithProperty ( AbpProSettings . ControlType . Default , AbpProSettings . ControlType . TypeText )); } } SettingDefinition \u7c7b\u5177\u6709\u4ee5\u4e0b\u5c5e\u6027: Name: \u5e94\u7528\u7a0b\u5e8f\u4e2d\u8bbe\u7f6e\u7684\u552f\u4e00\u540d\u79f0. \u662f\u5177\u6709\u7ea6\u675f\u7684\u552f\u4e00\u5c5e\u6027, \u5728\u5e94\u7528\u7a0b\u5e8f\u83b7\u53d6/\u8bbe\u7f6e\u6b64\u8bbe\u7f6e\u7684\u503c (\u8bbe\u7f6e\u540d\u79f0\u5b9a\u4e49\u4e3a\u5e38\u91cf\u800c\u4e0d\u662f\u9b54\u6cd5\u5b57\u7b26\u4e32\u662f\u4e2a\u597d\u4e3b\u610f). DefaultValue: \u8bbe\u7f6e\u7684\u9ed8\u8ba4\u503c. DisplayName: \u672c\u5730\u5316\u7684\u5b57\u7b26\u4e32,\u7528\u4e8e\u5728UI\u4e0a\u663e\u793a\u540d\u79f0. Description: \u672c\u5730\u5316\u7684\u5b57\u7b26\u4e32,\u7528\u4e8e\u5728UI\u4e0a\u663e\u793a\u63cf\u8ff0. \u4e0a\u9762\u6dfb\u52a0\u4e862\u4e2a\u5c5e\u6027\uff0c\u4e3a\u4e86\u9002\u914dvue\u524d\u7aef\uff0c\u4e00\u4e2a\u8bbe\u7f6eSetting\u5c5e\u4e8e\u54ea\u4e2a\u5206\u7ec4\uff0c\u4e00\u4e2a\u662f\u6839\u636eSetting\u7684\u7c7b\u578b\u6307\u5b9a\u5bf9\u5e94\u7684\u524d\u7aef\u7ec4\u4ef6\uff0c\u6bd4\u5982\u5b57\u7b26\u4e32\u5c31\u662f,Input\u7ec4\u4ef6\u3002 \u652f\u6301\u4ee5\u4e0b\u7ec4\u4ef6\uff1aText\uff0cCheckBox\uff0cNumber \u8bfb\u53d6\u8bbe\u7f6e\u503c \u00b6 ISettingProvider \u7528\u4e8e\u83b7\u53d6\u6307\u5b9a\u8bbe\u7f6e\u7684\u503c\u6216\u6240\u6709\u8bbe\u7f6e\u7684\u503c. \u793a\u4f8b\u7528\u6cd5: public class MyService { private readonly ISettingProvider _settingProvider ; //Inject ISettingProvider in the constructor public MyService ( ISettingProvider settingProvider ) { _settingProvider = settingProvider ; } public async Task FooAsync () { //Get a value as string. string userName = await _settingProvider . GetOrNullAsync ( \"Smtp.UserName\" ); //Get a bool value and fallback to the default value (false) if not set. bool enableSsl = await _settingProvider . GetAsync < bool >( \"Smtp.EnableSsl\" ); //Get a bool value and fallback to the provided default value (true) if not set. bool enableSsl = await _settingProvider . GetAsync < bool >( \"Smtp.EnableSsl\" , defaultValue : true ); //Get a bool value with the IsTrueAsync shortcut extension method bool enableSsl = await _settingProvider . IsTrueAsync ( \"Smtp.EnableSsl\" ); //Get an int value or the default value (0) if not set int port = ( await _settingProvider . GetAsync < int >( \"Smtp.Port\" )); //Get an int value or null if not provided int? port = ( await _settingProvider . GetOrNullAsync ( \"Smtp.Port\" ))?. To < int >(); } } ISettingProvider \u662f\u975e\u5e38\u5e38\u7528\u7684\u670d\u52a1,\u4e00\u4e9b\u57fa\u7c7b\u4e2d(\u5982IApplicationService)\u5df2\u7ecf\u5c06\u5176\u5c5e\u6027\u6ce8\u5165. \u8fd9\u79cd\u60c5\u51b5\u4e0b\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528SettingProvider. ISettingProvider \u4f7f\u7528\u8bbe\u7f6e\u503c\u63d0\u4f9b\u7a0b\u5e8f\u6765\u83b7\u53d6\u8bbe\u7f6e\u503c. \u5982\u679c\u503c\u63d0\u4f9b\u7a0b\u5e8f\u65e0\u6cd5\u83b7\u53d6\u8bbe\u7f6e\u503c,\u5219\u4f1a\u56de\u9000\u5230\u4e0b\u4e00\u4e2a\u503c\u63d0\u4f9b\u7a0b\u5e8f. DefaultValueSettingValueProvider: \u4ece\u8bbe\u7f6e\u5b9a\u4e49\u7684\u9ed8\u8ba4\u503c\u4e2d\u83b7\u53d6\u503c. ConfigurationSettingValueProvider: \u4eceIConfiguration\u670d\u52a1\u4e2d\u83b7\u53d6\u503c. GlobalSettingValueProvider: \u83b7\u53d6\u8bbe\u7f6e\u7684\u5168\u5c40\u503c. TenantSettingValueProvider: \u83b7\u53d6\u5f53\u524d\u79df\u6237\u7684\u8bbe\u7f6e\u503c. UserSettingValueProvider: \u83b7\u53d6\u5f53\u524d\u7528\u6237\u7684\u8bbe\u7f6e\u503c. \u8bbe\u7f6e\u56de\u9000\u7cfb\u7edf\u4ece\u5e95\u90e8 (\u7528\u6237) \u5230 \u9876\u90e8(\u9ed8\u8ba4) \u65b9\u5411\u8d77\u4f5c\u7528.","title":"\u8bbe\u7f6e(Setting)"},{"location":"user-guide/zh/modules/setting/#_1","text":"\u5b98\u65b9Setting\u6a21\u5757\u53c2\u8003\u6587\u6863 \u914d\u7f6e\u7cfb\u7edf\u662f\u5728\u542f\u52a8\u65f6\u914d\u7f6e\u5e94\u7528\u7a0b\u5e8f\u5f88\u597d\u7684\u65b9\u5f0f. \u9664\u4e86\u914d\u7f6e\u4e4b\u5916, ABP\u63d0\u4f9b\u4e86\u53e6\u5916\u4e00\u79cd\u8bbe\u7f6e\u548c\u83b7\u53d6\u5e94\u7528\u7a0b\u5e8f\u8bbe\u7f6e\u7684\u65b9\u5f0f. \u8bbe\u7f6e\u5b58\u50a8\u5728\u52a8\u6001\u6570\u636e\u6e90(\u901a\u5e38\u662f\u6570\u636e\u5e93)\u4e2d\u7684\u952e\u503c\u5bf9. \u8bbe\u7f6e\u7cfb\u7edf\u9884\u6784\u5efa\u4e86\u7528\u6237,\u79df\u6237,\u5168\u5c40\u548c\u9ed8\u8ba4\u8bbe\u7f6e\u65b9\u6cd5\u5e76\u4e14\u53ef\u4ee5\u8fdb\u884c\u6269\u5c55.","title":"\u8bbe\u7f6e\u7ba1\u7406"},{"location":"user-guide/zh/modules/setting/#_2","text":"\u4f7f\u7528\u8bbe\u7f6e\u4e4b\u524d\u9700\u8981\u5b9a\u4e49\u5b83. ABP\u662f \u6a21\u5757\u5316\u7684, \u4e0d\u540c\u7684\u6a21\u5757\u53ef\u4ee5\u62e5\u6709\u4e0d\u540c\u7684\u8bbe\u7f6e. \u53ea\u9700\u8981\u5b9e\u73b0SettingDefinitionProvider\u7c7b\u65e2\u53ef. \u793a\u4f8b\u5982\u4e0b: \u548c\u5b98\u65b9Setting\u6a21\u5757\u533a\u522b\uff0c\u503c\u6dfb\u52a0\u4e862\u4e2a\u5c5e\u6027\uff0c\u4e00\u4e2a\u5206\u7ec4\uff0c\u4e00\u4e2a\u7ec4\u4ef6\u7c7b\u578b public class CustomSettingProvider : SettingDefinitionProvider { public override void Define ( ISettingDefinitionContext context ) { context . Add ( new SettingDefinition ( AbpProSettings . Other . Github , \"https://github.com/WangJunZzz/abp-vnext-pro\" , L ( \"DisplayName:\" + AbpProSettings . Other . Github ), L ( \"Description:\" + AbpProSettings . Other . Github ) ) // \u5206\u7ec4 . WithProperty ( AbpProSettings . Group . Default , AbpProSettings . Group . OtherManagement ) // \u524d\u7aef\u7ec4\u4ef6\u7c7b\u578b . WithProperty ( AbpProSettings . ControlType . Default , AbpProSettings . ControlType . TypeText )); } } SettingDefinition \u7c7b\u5177\u6709\u4ee5\u4e0b\u5c5e\u6027: Name: \u5e94\u7528\u7a0b\u5e8f\u4e2d\u8bbe\u7f6e\u7684\u552f\u4e00\u540d\u79f0. \u662f\u5177\u6709\u7ea6\u675f\u7684\u552f\u4e00\u5c5e\u6027, \u5728\u5e94\u7528\u7a0b\u5e8f\u83b7\u53d6/\u8bbe\u7f6e\u6b64\u8bbe\u7f6e\u7684\u503c (\u8bbe\u7f6e\u540d\u79f0\u5b9a\u4e49\u4e3a\u5e38\u91cf\u800c\u4e0d\u662f\u9b54\u6cd5\u5b57\u7b26\u4e32\u662f\u4e2a\u597d\u4e3b\u610f). DefaultValue: \u8bbe\u7f6e\u7684\u9ed8\u8ba4\u503c. DisplayName: \u672c\u5730\u5316\u7684\u5b57\u7b26\u4e32,\u7528\u4e8e\u5728UI\u4e0a\u663e\u793a\u540d\u79f0. Description: \u672c\u5730\u5316\u7684\u5b57\u7b26\u4e32,\u7528\u4e8e\u5728UI\u4e0a\u663e\u793a\u63cf\u8ff0. \u4e0a\u9762\u6dfb\u52a0\u4e862\u4e2a\u5c5e\u6027\uff0c\u4e3a\u4e86\u9002\u914dvue\u524d\u7aef\uff0c\u4e00\u4e2a\u8bbe\u7f6eSetting\u5c5e\u4e8e\u54ea\u4e2a\u5206\u7ec4\uff0c\u4e00\u4e2a\u662f\u6839\u636eSetting\u7684\u7c7b\u578b\u6307\u5b9a\u5bf9\u5e94\u7684\u524d\u7aef\u7ec4\u4ef6\uff0c\u6bd4\u5982\u5b57\u7b26\u4e32\u5c31\u662f,Input\u7ec4\u4ef6\u3002 \u652f\u6301\u4ee5\u4e0b\u7ec4\u4ef6\uff1aText\uff0cCheckBox\uff0cNumber","title":"\u5b9a\u4e49\u8bbe\u7f6e"},{"location":"user-guide/zh/modules/setting/#_3","text":"ISettingProvider \u7528\u4e8e\u83b7\u53d6\u6307\u5b9a\u8bbe\u7f6e\u7684\u503c\u6216\u6240\u6709\u8bbe\u7f6e\u7684\u503c. \u793a\u4f8b\u7528\u6cd5: public class MyService { private readonly ISettingProvider _settingProvider ; //Inject ISettingProvider in the constructor public MyService ( ISettingProvider settingProvider ) { _settingProvider = settingProvider ; } public async Task FooAsync () { //Get a value as string. string userName = await _settingProvider . GetOrNullAsync ( \"Smtp.UserName\" ); //Get a bool value and fallback to the default value (false) if not set. bool enableSsl = await _settingProvider . GetAsync < bool >( \"Smtp.EnableSsl\" ); //Get a bool value and fallback to the provided default value (true) if not set. bool enableSsl = await _settingProvider . GetAsync < bool >( \"Smtp.EnableSsl\" , defaultValue : true ); //Get a bool value with the IsTrueAsync shortcut extension method bool enableSsl = await _settingProvider . IsTrueAsync ( \"Smtp.EnableSsl\" ); //Get an int value or the default value (0) if not set int port = ( await _settingProvider . GetAsync < int >( \"Smtp.Port\" )); //Get an int value or null if not provided int? port = ( await _settingProvider . GetOrNullAsync ( \"Smtp.Port\" ))?. To < int >(); } } ISettingProvider \u662f\u975e\u5e38\u5e38\u7528\u7684\u670d\u52a1,\u4e00\u4e9b\u57fa\u7c7b\u4e2d(\u5982IApplicationService)\u5df2\u7ecf\u5c06\u5176\u5c5e\u6027\u6ce8\u5165. \u8fd9\u79cd\u60c5\u51b5\u4e0b\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528SettingProvider. ISettingProvider \u4f7f\u7528\u8bbe\u7f6e\u503c\u63d0\u4f9b\u7a0b\u5e8f\u6765\u83b7\u53d6\u8bbe\u7f6e\u503c. \u5982\u679c\u503c\u63d0\u4f9b\u7a0b\u5e8f\u65e0\u6cd5\u83b7\u53d6\u8bbe\u7f6e\u503c,\u5219\u4f1a\u56de\u9000\u5230\u4e0b\u4e00\u4e2a\u503c\u63d0\u4f9b\u7a0b\u5e8f. DefaultValueSettingValueProvider: \u4ece\u8bbe\u7f6e\u5b9a\u4e49\u7684\u9ed8\u8ba4\u503c\u4e2d\u83b7\u53d6\u503c. ConfigurationSettingValueProvider: \u4eceIConfiguration\u670d\u52a1\u4e2d\u83b7\u53d6\u503c. GlobalSettingValueProvider: \u83b7\u53d6\u8bbe\u7f6e\u7684\u5168\u5c40\u503c. TenantSettingValueProvider: \u83b7\u53d6\u5f53\u524d\u79df\u6237\u7684\u8bbe\u7f6e\u503c. UserSettingValueProvider: \u83b7\u53d6\u5f53\u524d\u7528\u6237\u7684\u8bbe\u7f6e\u503c. \u8bbe\u7f6e\u56de\u9000\u7cfb\u7edf\u4ece\u5e95\u90e8 (\u7528\u6237) \u5230 \u9876\u90e8(\u9ed8\u8ba4) \u65b9\u5411\u8d77\u4f5c\u7528.","title":"\u8bfb\u53d6\u8bbe\u7f6e\u503c"},{"location":"user-guide/zh/modules/signalr/","text":"\u5b9e\u65f6\u901a\u4fe1 \u00b6 \u96c6\u6210Abp SignalR,\u5b9e\u73b0\u7c7b\u4f3c\u7ad9\u5185\u4fe1\u6a21\u5757\u3002 \u53d1\u9001\u6d88\u606f\u4f1a\u5728\u524d\u7aef\u53f3\u4e0a\u89d2\uff0c\u6839\u636e\u4e0d\u540c\u6d88\u606f\u7b49\u7ea7\u6709\u4e0d\u540c\u7684\u7a97\u4f53\u63d0\u793a\u3002 \u5728\u53f3\u4e0a\u89d2\u706f\u6ce1\u6309\u94ae\u53ef\u4ee5\u770b\u5230\u63a5\u53d7\u7684\u6d88\u606f\u3002 \u5b89\u88c5 \u00b6 Lion.Abp.NotificationManagement.Application Lion.Abp.NotificationManagement.Application.Contracts Lion.Abp.NotificationManagement.Domain Lion.Abp.NotificationManagement.Domain.Shared Lion.Abp.NotificationManagement.EntityFrameworkCore Lion.Abp.NotificationManagement.HttpApi Lion.Abp.NotificationManagement.HttpApi.Client \u6a21\u5757\u4f9d\u8d56 \u00b6 \u6dfb\u52a0 DependsOn(typeof(NotificationManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureNotificationManagement(); \u5b9e\u4f53 \u00b6 Notification \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid Title \u6d88\u606f\u6807\u9898 string Content \u6d88\u606f\u5185\u5bb9 string MessageType \u6d88\u606f\u7c7b\u578b MessageType MessageLevel \u6d88\u606f\u7b49\u7ea7 MessageLevel SenderId \u521b\u5efa\u4eba \u53d1\u9001\u4eba NotificationSubscriptions \u6d88\u606f\u8ba2\u9605\u8005\u96c6\u5408 List IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime NotificationSubscription \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid ReceiveId \u63a5\u6536\u4eba Guid Read \u662f\u5426\u5df2\u8bfb bool ReadTime \u5df2\u8bfb\u65f6\u95f4 DateTime? IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime \u53d1\u9001\u6d88\u606f \u00b6 \u6ce8\u5165NotificationManager,NotificationAppService\u5373\u53ef\u53d1\u9001\u4e0d\u540c\u7ea7\u522b\uff0c\u4e0d\u540c\u7b49\u7ea7\u7684\u6d88\u606f\u3002 \u53d1\u9001\u7ed9\u6307\u5b9a\u4eba /// <summary> /// \u53d1\u9001\u8b66\u544a\u6587\u672c\u6d88\u606f /// </summary> /// <param name=\"title\">\u6807\u9898</param> /// <param name=\"content\">\u6d88\u606f\u5185\u5bb9</param> /// <param name=\"receiveIds\">\u63a5\u53d7\u4eba\uff0c\u53d1\u9001\u7ed9\u8c01\u3002</param> await _notificationManager . SendCommonWarningMessageAsync ( title , content , receiveIds ); \u53d1\u9001\u7ed9\u6240\u6709\u4eba /// <summary> /// \u53d1\u9001\u8b66\u544a\u6587\u672c\u6d88\u606f /// </summary> /// <param name=\"title\">\u6807\u9898</param> /// <param name=\"content\">\u6d88\u606f\u5185\u5bb9</param> await _notificationManager . SendBroadCastInformationMessageAsync ( title , content ); \u4f9d\u8d56 \u00b6 \u5982\u679c\u670d\u52a1\u5206\u5e03\u5f0f\u90e8\u7f72\uff0c\u9700\u8981\u4f7f\u7528Redis(\u9ed8\u8ba4\u4f9d\u8d56),\u89e3\u51b3SignalR\u6d88\u606f\u91cd\u590d\u95ee\u9898\u3002 private void ConfigurationSignalR ( ServiceConfigurationContext context ) { var redisConnection = context . Services . GetConfiguration ()[ \"Redis:Configuration\" ]; if ( redisConnection . IsNullOrWhiteSpace ()) { throw new UserFriendlyException ( message : \"Redis\u8fde\u63a5\u5b57\u7b26\u4e32\u672a\u914d\u7f6e.\" ); } context . Services . AddSignalR () . AddStackExchangeRedis ( redisConnection , options => { options . Configuration . ChannelPrefix = \"Lion.AbpPro\" ; }); } Vue\u5ba2\u6237\u7aef\u8fde\u63a5 \u00b6 \u5728\u7528\u6237\u767b\u9646\u6210\u529f\u4e4b\u540e\uff0c\u8fde\u63a5SignalR,\u5e76\u4e14\u5e26\u81ea\u52a8\u91cd\u8fde\u673a\u5236\u3002 \u6e90\u7801 \u793a\u4f8b\u5982\u4e0b: const { startConnect } = useSignalR (); onMounted (() => { startConnect (); });","title":"\u5b9e\u65f6\u901a\u4fe1"},{"location":"user-guide/zh/modules/signalr/#_1","text":"\u96c6\u6210Abp SignalR,\u5b9e\u73b0\u7c7b\u4f3c\u7ad9\u5185\u4fe1\u6a21\u5757\u3002 \u53d1\u9001\u6d88\u606f\u4f1a\u5728\u524d\u7aef\u53f3\u4e0a\u89d2\uff0c\u6839\u636e\u4e0d\u540c\u6d88\u606f\u7b49\u7ea7\u6709\u4e0d\u540c\u7684\u7a97\u4f53\u63d0\u793a\u3002 \u5728\u53f3\u4e0a\u89d2\u706f\u6ce1\u6309\u94ae\u53ef\u4ee5\u770b\u5230\u63a5\u53d7\u7684\u6d88\u606f\u3002","title":"\u5b9e\u65f6\u901a\u4fe1"},{"location":"user-guide/zh/modules/signalr/#_2","text":"Lion.Abp.NotificationManagement.Application Lion.Abp.NotificationManagement.Application.Contracts Lion.Abp.NotificationManagement.Domain Lion.Abp.NotificationManagement.Domain.Shared Lion.Abp.NotificationManagement.EntityFrameworkCore Lion.Abp.NotificationManagement.HttpApi Lion.Abp.NotificationManagement.HttpApi.Client","title":"\u5b89\u88c5"},{"location":"user-guide/zh/modules/signalr/#_3","text":"\u6dfb\u52a0 DependsOn(typeof(NotificationManagementXxxModule)) \u7279\u6027\u5230\u5bf9\u5e94\u6a21\u5757\u3002 \u5728EntityFrameworkCore\u5c42\u6dfb\u52a0\u6570\u636e\u5e93\u914d\u7f6e\u5728AbpProDbContext.cs\u7684OnModelCreating()\u65b9\u6cd5\u4e2d\u6dfb\u52a0builder.ConfigureNotificationManagement();","title":"\u6a21\u5757\u4f9d\u8d56"},{"location":"user-guide/zh/modules/signalr/#_4","text":"Notification \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid Title \u6d88\u606f\u6807\u9898 string Content \u6d88\u606f\u5185\u5bb9 string MessageType \u6d88\u606f\u7c7b\u578b MessageType MessageLevel \u6d88\u606f\u7b49\u7ea7 MessageLevel SenderId \u521b\u5efa\u4eba \u53d1\u9001\u4eba NotificationSubscriptions \u6d88\u606f\u8ba2\u9605\u8005\u96c6\u5408 List IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime NotificationSubscription \u8868\u7ed3\u6784\uff1a \u5b57\u6bb5\u540d \u63cf\u8ff0 \u7c7b\u578b Id Id Guid ReceiveId \u63a5\u6536\u4eba Guid Read \u662f\u5426\u5df2\u8bfb bool ReadTime \u5df2\u8bfb\u65f6\u95f4 DateTime? IsDeleted \u662f\u5426\u5220\u9664 bool DeleterId \u5220\u9664\u4eba Guid? DeletionTime \u5220\u9664\u65f6\u95f4 DateTime LastModifierId \u6700\u540e\u4fee\u6539\u4eba Guid? LastModificationTime \u6700\u540e\u4fee\u6539\u65f6\u95f4 DateTime CreatorId \u521b\u5efa\u4eba Guid? CreationTime \u521b\u5efa\u65f6\u95f4 DateTime","title":"\u5b9e\u4f53"},{"location":"user-guide/zh/modules/signalr/#_5","text":"\u6ce8\u5165NotificationManager,NotificationAppService\u5373\u53ef\u53d1\u9001\u4e0d\u540c\u7ea7\u522b\uff0c\u4e0d\u540c\u7b49\u7ea7\u7684\u6d88\u606f\u3002 \u53d1\u9001\u7ed9\u6307\u5b9a\u4eba /// <summary> /// \u53d1\u9001\u8b66\u544a\u6587\u672c\u6d88\u606f /// </summary> /// <param name=\"title\">\u6807\u9898</param> /// <param name=\"content\">\u6d88\u606f\u5185\u5bb9</param> /// <param name=\"receiveIds\">\u63a5\u53d7\u4eba\uff0c\u53d1\u9001\u7ed9\u8c01\u3002</param> await _notificationManager . SendCommonWarningMessageAsync ( title , content , receiveIds ); \u53d1\u9001\u7ed9\u6240\u6709\u4eba /// <summary> /// \u53d1\u9001\u8b66\u544a\u6587\u672c\u6d88\u606f /// </summary> /// <param name=\"title\">\u6807\u9898</param> /// <param name=\"content\">\u6d88\u606f\u5185\u5bb9</param> await _notificationManager . SendBroadCastInformationMessageAsync ( title , content );","title":"\u53d1\u9001\u6d88\u606f"},{"location":"user-guide/zh/modules/signalr/#_6","text":"\u5982\u679c\u670d\u52a1\u5206\u5e03\u5f0f\u90e8\u7f72\uff0c\u9700\u8981\u4f7f\u7528Redis(\u9ed8\u8ba4\u4f9d\u8d56),\u89e3\u51b3SignalR\u6d88\u606f\u91cd\u590d\u95ee\u9898\u3002 private void ConfigurationSignalR ( ServiceConfigurationContext context ) { var redisConnection = context . Services . GetConfiguration ()[ \"Redis:Configuration\" ]; if ( redisConnection . IsNullOrWhiteSpace ()) { throw new UserFriendlyException ( message : \"Redis\u8fde\u63a5\u5b57\u7b26\u4e32\u672a\u914d\u7f6e.\" ); } context . Services . AddSignalR () . AddStackExchangeRedis ( redisConnection , options => { options . Configuration . ChannelPrefix = \"Lion.AbpPro\" ; }); }","title":"\u4f9d\u8d56"},{"location":"user-guide/zh/modules/signalr/#vue","text":"\u5728\u7528\u6237\u767b\u9646\u6210\u529f\u4e4b\u540e\uff0c\u8fde\u63a5SignalR,\u5e76\u4e14\u5e26\u81ea\u52a8\u91cd\u8fde\u673a\u5236\u3002 \u6e90\u7801 \u793a\u4f8b\u5982\u4e0b: const { startConnect } = useSignalR (); onMounted (() => { startConnect (); });","title":"Vue\u5ba2\u6237\u7aef\u8fde\u63a5"},{"location":"user-guide/zh/problem/problem/","text":"\u7f16\u8bd1 \u00b6 VS \u7f16\u8bd1\u9879\u76ee\u5b57\u7b26\u4e32\u8d85\u8fc7 256 \u4e2a\u5b57\u7b26 \u00b6 \u628a\u9879\u76ee\u62f7\u8d1d\u5230\u78c1\u76d8\u6839\u76ee\u5f55 OR \u4f7f\u7528 Rider \u5f00\u53d1","title":"\u95ee\u9898"},{"location":"user-guide/zh/problem/problem/#_1","text":"","title":"\u7f16\u8bd1"},{"location":"user-guide/zh/problem/problem/#vs-256","text":"\u628a\u9879\u76ee\u62f7\u8d1d\u5230\u78c1\u76d8\u6839\u76ee\u5f55 OR \u4f7f\u7528 Rider \u5f00\u53d1","title":"VS \u7f16\u8bd1\u9879\u76ee\u5b57\u7b26\u4e32\u8d85\u8fc7 256 \u4e2a\u5b57\u7b26"}]}