diff --git a/.gitignore b/.gitignore index d8848d49..e3c67641 100644 --- a/.gitignore +++ b/.gitignore @@ -265,3 +265,7 @@ content/src/Zzz.DbMigrator/Logs/* /aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/appsettings.Production.json /aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/Logs /aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/Logs +/vben271/dist.zip +/aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/publish.zip +/aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/appsettings.Production.json +/aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/publish.zip diff --git a/Readme.md b/Readme.md index 5ee236d9..140cc814 100644 --- a/Readme.md +++ b/Readme.md @@ -4,27 +4,48 @@ - - + + - - + + + + + +
-### 说明 +#### 项目简介 + +基于ABP Vnext4.4.0的微服务架构,基于DDD思想开发,基于vue3.0,Typescript,Antd 的后台管理框架,适用于大型分布式业务系统和企业后台。 + +[预览地址](https://vvbin.cn/doc-next/) 用户名:admin 密码: 1q2w3E* + +#### 系统功能 -- main分支为主要开发分支,后续都基于此分支维护,该分支前端基于vue3.0,Typescript,如果要使用Vue请切换到Vue2分支。 -- .Net Core5.0 -- Abp Vnext 4.2 , -- Ant Design, Vben Admin [前端文档](https://vvbin.cn/doc-next/) -- Mysql,Redis,Hangfire,ES(日志可选) -- 微服务架构设计, DDD 实践 -- 容器化 CI CD -- Xunit 单元测试(提供sample单元测试) +- [x] 用户管理 +- [x] 角色管理 +- [x] 审计日志 +- [x] 后台任务(hangfire) +- [x] 集成事件(dotnetcore.cap) +- [x] IdentityServer4 + - [x] 客户端管理 + - [x] Api资源管理 + - [x] ApiScope管理 + - [x] Identity资源管理 +- [x] SinglaR消息通知 +- [x] 多语言 +- [x] FreeSql +- [x] 数据字典(UI暂时没有) +- [x] 容器化部署 +- [x] 单元测试 +- [x] ES日志 +- [ ] 多租户 +- [ ] 组织机构 @@ -37,18 +58,11 @@ - 后端使用swagger的时候tag请不要用中文 [SwaggerOperation(summary: "获取所有角色", Tags = new[] { "Role" })] - 前端代理生成在src/services下,如何使用请参考用户模块 - - -### 对接思路 - 前端 - - 通过 token 调用 /api/abp/application-configuration 获取应用级别信息,包括权限,多语言,保存在 Store 中; - 多语言基于前端,后端 Api 的多语言基于 abp 自带的; - 配置菜单,属性 meta.policy 不传代表不验证权限 - 按钮权限,v-auth 例如:v-auth=('AbpIdentity.Roles.Create') -- 后端 - - 项目不一定要基于 IdentityServer4,所以新增了一个登陆方法,生成 Token. - - IdentityServer4的已经独立出来,也会开源。 ### 使用 @@ -56,19 +70,17 @@ ![](https://blog-resouce.oss-cn-shenzhen.aliyuncs.com/images/abp/gui.png) -- 下载模板之后再当前项目src\AbpVnextPro.GUI\bin\Debug\net5.0-windows\decompression可以看到生成的源码 - 启动 - 前端yarn - 后端修改mysql和redis连接字符串 - - 执行tools下的迁移控制台程序 + - 执行迁移控制台程序 - - 启动host下httpapi.host即可 - - - host下的public可以忽略,这个用来做暴露第三方接口的,通过id4授权。 + - 启动HttpApi.Host和IdentityServer4 + #### 参与贡献 diff --git a/aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/publish.zip b/aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/publish.zip deleted file mode 100644 index 671e93c1..00000000 Binary files a/aspnet-core/services/host/CompanyName.ProjectName.HttpApi.Host/publish.zip and /dev/null differ diff --git a/aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/Dockerfile b/aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/Dockerfile new file mode 100644 index 00000000..6eee47d6 --- /dev/null +++ b/aspnet-core/services/host/CompanyName.ProjectName.IdentityServer/Dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/aspnet:5.0 + +# 创建目录 +RUN mkdir /app + +COPY publish /app + +# 设置工作目录 +WORKDIR /app + +# 暴露80端口 +EXPOSE 80 + +# 设置环境变量 +ENV ASPNETCORE_ENVIRONMENT=Production + +ENTRYPOINT ["dotnet", "CompanyName.ProjectName.IdentityServer.dll"] + + diff --git a/aspnet-core/services/src/CompanyName.ProjectName.DbMigrator/appsettings.json b/aspnet-core/services/src/CompanyName.ProjectName.DbMigrator/appsettings.json index e888b4b8..076a85ec 100644 --- a/aspnet-core/services/src/CompanyName.ProjectName.DbMigrator/appsettings.json +++ b/aspnet-core/services/src/CompanyName.ProjectName.DbMigrator/appsettings.json @@ -1,6 +1,6 @@ { "ConnectionStrings": { - "Default": "Data Source=localhost;Database=CompanyNameProjectNameDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" + "Default": "Data Source=120.24.194.14;Database=CompanyNameProjectNameDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true" }, "IdentityServer": { "Clients": { diff --git a/aspnet-core/services/src/CompanyName.ProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs b/aspnet-core/services/src/CompanyName.ProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs index 271abb94..f557fb91 100644 --- a/aspnet-core/services/src/CompanyName.ProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs +++ b/aspnet-core/services/src/CompanyName.ProjectName.Domain/IdentityServer/IdentityServerDataSeedContributor.cs @@ -20,7 +20,7 @@ using Client = Volo.Abp.IdentityServer.Clients.Client; namespace CompanyName.ProjectName.IdentityServer { - public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency + public class IdentityServerDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IApiResourceRepository _apiResourceRepository; private readonly IApiScopeRepository _apiScopeRepository; @@ -86,10 +86,10 @@ namespace CompanyName.ProjectName.IdentityServer private async Task CreateApiResourceAsync(IEnumerable claims) { var apiResource = new ApiResource( - _guidGenerator.Create(), - "Identity.Api", - "身份认证中心Api" - ); + _guidGenerator.Create(), + "Identity.Api", + "身份认证中心Api" + ); //foreach (var claim in claims) //{ @@ -99,31 +99,28 @@ namespace CompanyName.ProjectName.IdentityServer // } //} - return await _apiResourceRepository.InsertAsync(apiResource); } private async Task CreateApiScopeAsync() { - await _apiScopeRepository.InsertAsync( - new ApiScope( - _guidGenerator.Create(), - "Api_Read" - ), - autoSave: true - ); + new ApiScope( + _guidGenerator.Create(), + "Api_Read" + ), + autoSave: true + ); await _apiScopeRepository.InsertAsync( - new ApiScope( - _guidGenerator.Create(), - "Api_Write" - ), - autoSave: true - ); - + new ApiScope( + _guidGenerator.Create(), + "Api_Write" + ), + autoSave: true + ); } private async Task CreateClientsAsync() @@ -142,15 +139,14 @@ namespace CompanyName.ProjectName.IdentityServer name: "Vue3", description: "Vue3-UI", scopes: commonScopes, - grantTypes: new[] { "implicit" }, + grantTypes: new[] {"implicit"}, secret: "1q2w3E*".Sha256(), redirectUri: "http://localhost:4200/oidc", - postLogoutRedirectUri: "http://localhost:4200/oidc", + postLogoutRedirectUri: "http://localhost:4200/oidc,http://120.24.194.14:8012/oidc", frontChannelLogoutUri: "http://localhost:4200/oidc", - corsOrigins: new[] { "https://localhost:4200", "http://localhost:4200" }, + corsOrigins: new[] {"https://localhost:4200", "http://localhost:4200", "http://120.24.194.14:8012"}, requireClientSecret: false ); - } private async Task CreateClientAsync( @@ -167,28 +163,26 @@ namespace CompanyName.ProjectName.IdentityServer IEnumerable permissions = null, IEnumerable corsOrigins = null) { - var client = new Client( - _guidGenerator.Create(), - name - ) - { - ClientName = name, - ProtocolType = "oidc", - Description = description, - AlwaysIncludeUserClaimsInIdToken = true, - AllowOfflineAccess = true, - AbsoluteRefreshTokenLifetime = 31536000, //365 days - AccessTokenLifetime = 31536000, //365 days - AuthorizationCodeLifetime = 300, - IdentityTokenLifetime = 300, - RequireConsent = false, - FrontChannelLogoutUri = frontChannelLogoutUri, - RequireClientSecret = requireClientSecret, - RequirePkce = requirePkce, - AllowAccessTokensViaBrowser = true, - }; - + _guidGenerator.Create(), + name + ) + { + ClientName = name, + ProtocolType = "oidc", + Description = description, + AlwaysIncludeUserClaimsInIdToken = true, + AllowOfflineAccess = true, + AbsoluteRefreshTokenLifetime = 31536000, //365 days + AccessTokenLifetime = 31536000, //365 days + AuthorizationCodeLifetime = 300, + IdentityTokenLifetime = 300, + RequireConsent = false, + FrontChannelLogoutUri = frontChannelLogoutUri, + RequireClientSecret = requireClientSecret, + RequirePkce = requirePkce, + AllowAccessTokensViaBrowser = true, + }; foreach (var scope in scopes) @@ -255,4 +249,4 @@ namespace CompanyName.ProjectName.IdentityServer return await _clientRepository.InsertAsync(client); } } -} +} \ No newline at end of file diff --git a/vben271/.env.production b/vben271/.env.production index 258b2b4c..4003896c 100644 --- a/vben271/.env.production +++ b/vben271/.env.production @@ -36,7 +36,7 @@ VITE_LEGACY = false VITE_BUILD_COMPRESS = 'none' # 认证授权服务器地址 -VITE_AUTH_URL='http://sts.xx.cn' +VITE_AUTH_URL='http://120.24.194.14:8013' # 接口地址 diff --git a/vben271/dist.zip b/vben271/dist.zip deleted file mode 100644 index b8d7f613..00000000 Binary files a/vben271/dist.zip and /dev/null differ diff --git a/vben271/src/router/guard/index.ts b/vben271/src/router/guard/index.ts index 059eec88..056ea498 100644 --- a/vben271/src/router/guard/index.ts +++ b/vben271/src/router/guard/index.ts @@ -12,7 +12,7 @@ import { createStateGuard } from './stateGuard'; import nProgress from 'nprogress'; import projectSetting from '/@/settings/projectSetting'; import { createParamMenuGuard } from './paramMenuGuard'; - +import { PageEnum } from '/@/enums/pageEnum'; // Don't change the order of creation export function setupRouterGuard(router: Router) { createPageGuard(router); @@ -37,7 +37,11 @@ function createPageGuard(router: Router) { to.meta.loaded = !!loadedPageMap.get(to.path); // Notify routing changes setRouteChange(to); - console.log(1); + if (to.path.includes('Error')) { + router.replace(PageEnum.BASE_LOGIN); + return; + } + return true; });