Skip to content

Commit

Permalink
Merge branch 'publish' into arm32
Browse files Browse the repository at this point in the history
  • Loading branch information
agile.zhou committed Jul 5, 2023
2 parents 3a7e4e9 + d71ce23 commit 974515e
Show file tree
Hide file tree
Showing 12 changed files with 78 additions and 35 deletions.
10 changes: 6 additions & 4 deletions AgileConfig.Server.Apisite/AgileConfig.Server.Apisite.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<AssemblyVersion>1.6.15</AssemblyVersion>
<Version>1.6.15</Version>
<PackageVersion>1.6.15</PackageVersion>
<AssemblyVersion>1.6.19</AssemblyVersion>
<Version>1.6.19</Version>
<PackageVersion>1.6.19</PackageVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<FileVersion>1.6.15</FileVersion>
<FileVersion>1.6.19</FileVersion>
<Authors>kklldog</Authors>
<Company>kklldog</Company>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
Expand Down
2 changes: 1 addition & 1 deletion AgileConfig.Server.Apisite/Controllers/ConfigController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ public async Task<IActionResult> Publish([FromBody] PublishLogVM model, string e

var appId = model.AppId;
var userId = await this.GetCurrentUserId(_userService);
var ret = _configService.Publish(appId, model.Log, userId, env);
var ret = _configService.Publish(appId, model.Ids, model.Log, userId, env);

if (ret.result)
{
Expand Down
2 changes: 2 additions & 0 deletions AgileConfig.Server.Apisite/Models/PublishLogVM.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ public class PublishLogVM: IAppIdModel
{
public string AppId { get; set; }
public string Log { get; set; }

public string[] Ids { get; set; }
}
}
28 changes: 20 additions & 8 deletions AgileConfig.Server.Apisite/UIExtension/ReactUIMiddleware.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,35 @@
using Microsoft.Extensions.Primitives;
using System.Collections.Concurrent;
using AgileConfig.Server.Common;
using Microsoft.AspNetCore.Hosting;

namespace AgileConfig.Server.Apisite.UIExtension
{
public class ReactUIMiddleware
{
private static readonly ConcurrentDictionary<string, UIFileBag> StaticFilesCache = new ();
private static string UiDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot/ui");
private static readonly ConcurrentDictionary<string, UIFileBag> StaticFilesCache = new();
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private readonly IWebHostEnvironment _environment;
public ReactUIMiddleware(
RequestDelegate next,
ILoggerFactory loggerFactory
ILoggerFactory loggerFactory,
IWebHostEnvironment environment
)
{
_next = next;
_logger = loggerFactory.
CreateLogger<ReactUIMiddleware>();
_environment = environment;
#if DEBUG
//if debug mode, try to switch to project wwwwroot dir
var projectUIPath = Path.Combine(_environment.ContentRootPath, "wwwroot/ui");
if (Directory.Exists(projectUIPath))
{
UiDirectory = projectUIPath;
}
#endif
}

private bool IsAdminConsoleMode => "true".Equals(Global.Config["adminConsole"], StringComparison.OrdinalIgnoreCase);
Expand All @@ -43,7 +56,7 @@ private bool ShouldHandleUIStaticFilesRequest(HttpContext context)
if (refererValues.Any())
{
var refererValue = refererValues.First();
if (refererValue.EndsWith("/ui", StringComparison.OrdinalIgnoreCase)
if (refererValue.EndsWith("/ui", StringComparison.OrdinalIgnoreCase)
|| refererValue.Contains("/monaco-editor/", StringComparison.OrdinalIgnoreCase))
{
return true;
Expand Down Expand Up @@ -88,7 +101,6 @@ private async Task RewriteIndexHtml(string filePath)
await File.WriteAllLinesAsync(filePath, rows);
}

private static readonly string UiDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot/ui");
public async Task Invoke(HttpContext context)
{
//handle /ui request
Expand Down Expand Up @@ -120,7 +132,7 @@ public async Task Invoke(HttpContext context)
context.Response.StatusCode = 404;
return;
}

if (StaticFilesCache.TryGetValue(filePath, out var uiFile))
{
// cached
Expand All @@ -141,10 +153,10 @@ public async Task Invoke(HttpContext context)
LastModified = lastModified,
ExtType = extType
};

StaticFilesCache.TryAdd(filePath, uiFile);
}

//判断前端缓存的文件是否过期
if (context.Request.Headers.TryGetValue("If-Modified-Since", out StringValues values))
{
Expand All @@ -155,7 +167,7 @@ public async Task Invoke(HttpContext context)
return;
}
}

context.Response.OnStarting(() =>
{
context.Response.ContentType = uiFile.ContentType;
Expand Down
5 changes: 3 additions & 2 deletions AgileConfig.Server.IService/IConfigService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@ public interface IConfigService: IDisposable
Task<string> IfEnvEmptySetDefaultAsync(string env);

/// <summary>
/// 发布当前待发布的配置项
/// 发布当前待发布的配置项,如果传ids那么就是只发布这些项目,如果不传ids,那么就是全部发布
/// </summary>
/// <param name="appId"></param>
/// <param name="ids"></param>
/// <param name="log"></param>
/// <param name="operatorr"></param>
/// <returns></returns>
(bool result, string publishTimelineId) Publish(string appId, string log, string operatorr, string env);
(bool result, string publishTimelineId) Publish(string appId,string[] ids, string log, string operatorr, string env);

Task<Config> GetAsync(string id, string env);

Expand Down
18 changes: 11 additions & 7 deletions AgileConfig.Server.Service/ConfigService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -299,8 +299,8 @@ public async Task<string> AppPublishedConfigsMd5(string appId, string env)
&& c.Env == env
).ToListAsync();

var keyStr = string.Join('&', configs.Select(c => GenerateKey(c)).ToArray().OrderBy(k => k));
var valStr = string.Join('&', configs.Select(c => c.Value).ToArray().OrderBy(v => v));
var keyStr = string.Join('&', configs.Select(c => GenerateKey(c)).ToArray().OrderBy(k => k, StringComparer.Ordinal));
var valStr = string.Join('&', configs.Select(c => c.Value).ToArray().OrderBy(v => v, StringComparer.Ordinal));
var txt = $"{keyStr}&{valStr}";

return Encrypt.Md5(txt);
Expand Down Expand Up @@ -428,8 +428,8 @@ public async Task<string> AppPublishedConfigsMd5WithInheritanced(string appId, s
{
var configs = await GetPublishedConfigsByAppIdWithInheritanced(appId, env);

var keyStr = string.Join('&', configs.Select(c => GenerateKey(c)).ToArray().OrderBy(k => k));
var valStr = string.Join('&', configs.Select(c => c.Value).ToArray().OrderBy(v => v));
var keyStr = string.Join('&', configs.Select(c => GenerateKey(c)).ToArray().OrderBy(k => k, StringComparer.Ordinal));
var valStr = string.Join('&', configs.Select(c => c.Value).ToArray().OrderBy(v => v, StringComparer.Ordinal));
var txt = $"{keyStr}&{valStr}";

return Encrypt.Md5(txt);
Expand Down Expand Up @@ -470,10 +470,11 @@ public void Dispose()
/// 发布当前待发布的配置项
/// </summary>
/// <param name="appId">应用id</param>
/// <param name="ids">待发布的id列表</param>
/// <param name="log">发布日志</param>
/// <param name="operatorr">操作员</param>
/// <returns></returns>
public (bool result, string publishTimelineId) Publish(string appId, string log, string operatorr, string env)
public (bool result, string publishTimelineId) Publish(string appId, string[] ids, string log, string operatorr, string env)
{
lock (Lockobj)
{
Expand All @@ -484,6 +485,11 @@ public void Dispose()
x.Env == env &&
x.Status == ConfigStatus.Enabled &&
x.EditStatus != EditStatus.Commit).ToList();
if (ids != null && ids.Any())
{
//如果ids传值了,过滤一下
waitPublishConfigs = waitPublishConfigs.Where(x => ids.Contains(x.Id)).ToList();
}
//这里默认admin console 实例只部署一个,如果部署多个同步操作,高并发的时候这个version会有问题
var versionMax = dbcontext.PublishTimeline.Select.Where(x => x.AppId == appId).Max(x => x.Version);

Expand Down Expand Up @@ -925,8 +931,6 @@ private async Task<bool> SaveFromDictAsync(IDictionary<string, string> dict, str
}
}



if (addConfigs.Any())
{
await dbcontext.Configs.AddRangeAsync(addConfigs);
Expand Down
4 changes: 2 additions & 2 deletions AgileConfig.Server.Service/ServiceInfoService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,15 +94,15 @@ public async Task<string> ServicesMD5()
private string GenerateMD5(List<ServiceInfo> services)
{
var sb = new StringBuilder();
foreach (var serviceInfo in services.OrderBy(x => x.ServiceId))
foreach (var serviceInfo in services.OrderBy(x => x.ServiceId, StringComparer.Ordinal))
{
var metaDataStr = "";
if (!string.IsNullOrEmpty(serviceInfo.MetaData))
{
var metaData = JsonConvert.DeserializeObject<List<string>>(serviceInfo.MetaData);
if (metaData != null)
{
metaDataStr = string.Join(",", metaData.OrderBy(x => x));
metaDataStr = string.Join(",", metaData.OrderBy(x => x, StringComparer.Ordinal));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ export default {
'pages.configs.table.cols.action.exportJson': 'Export',
'pages.configs.table.cols.action.edit': 'Edit',
'pages.configs.table.cols.action.delete': 'Delete',
'pages.configs.table.cols.action.publish': 'Publish',
'pages.configs.table.cols.action.publish': 'Publish All',
'pages.configs.table.cols.action.offline': 'Offline',
'pages.configs.table.cols.action.history': 'History',

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ export default {

'pages.configs.table.cols.action.edit': '编辑',
'pages.configs.table.cols.action.delete': '删除',
'pages.configs.table.cols.action.publish': '发布',
'pages.configs.table.cols.action.publish': '发布全部',
'pages.configs.table.cols.action.offline': '下线',
'pages.configs.table.cols.action.history': '历史',

Expand Down
16 changes: 9 additions & 7 deletions AgileConfig.Server.UI/react-ui-antd/src/pages/Configs/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ import { saveVisitApp } from '@/utils/latestVisitApps';
const { TextArea } = Input;
const { confirm } = Modal;

const handlePublish = async (appId: string, log:string, env:string) => {
const handlePublish = async (appId: string, ids:string[], log:string, env:string) => {
const hide = message.loading('正在发布');
try {
const result = await publish(appId, log, env);
const result = await publish(appId, ids, log, env);
hide();
const success = result.success;
if (success) {
Expand Down Expand Up @@ -225,11 +225,14 @@ const configs: React.FC = (props: any) => {
}, [tableData]);

const publish = (appId: string) => {
const rows = selectedRowsState.filter(x=>x.editStatus !== 10).map(x=>x.id);
const isPublishAll = rows.length === 0;
const msg = isPublishAll ? '所有' : '已选择';
_publishLog = '';
confirm({
content: <div>
{
'确定发布当前所有待发布的配置项吗?'
`确定发布当前【${msg}】的待发布配置项吗?`
}
<br />
<br />
Expand All @@ -243,7 +246,8 @@ const configs: React.FC = (props: any) => {
</div>
</div>,
onOk: async () => {
const result = await handlePublish(appId, _publishLog, currentEnv);

const result = await handlePublish(appId, rows, _publishLog, currentEnv);
if (result && actionRef.current) {
if (actionRef.current?.clearSelected){
actionRef.current?.clearSelected();
Expand Down Expand Up @@ -499,9 +503,7 @@ const configs: React.FC = (props: any) => {
hidden={(waitPublishStatus.addCount + waitPublishStatus.editCount + waitPublishStatus.deleteCount) === 0}
onClick={()=>{publish(appId)}}>
{
intl.formatMessage({
id: 'pages.configs.table.cols.action.publish'
})
selectedRowsState.filter(x=>x.editStatus !== 10).length > 0 ? '发布选择项' : '发布全部'
}
</Button>
</AuthorizedEle>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,13 @@ export async function getWaitPublishStatus(appId: string, env: string) {
});
}

export async function publish(appId: string, publistLog: string, env: string) {
export async function publish(appId: string, ids:string[], publistLog: string, env: string) {
return request('config/publish?env=' + env, {
method: 'POST',
data: {
log: publistLog,
appId: appId
appId: appId,
ids: ids
}
});
}
Expand Down
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Change log
------------------------------
[1.6.19]
* 调试模式的时候优先读取项目文件夹下的wwwroot/ui文件夹里的内容
https://github.com/dotnetcore/AgileConfig/pull/139

[1.6.18]
* 客户端计算配置的MD5时,OrderBy更改为 StringComparer.Ordinal 实现,避免服务端和客户端区域文化不一致导致的频繁reload问题。https://github.com/dotnetcore/AgileConfig/pull/132

[1.6.16]
* 支持选择部分项目发布 https://github.com/dotnetcore/AgileConfig/issues/128

[1.6.15]
* switch mysql driver to mysqlconnector

[1.6.14]
* 当同步环境配置的时候同步更新描述;

[1.6.13]
修复 json 编辑的时候 key 值修改大小写会多生产一个 key 的问题

[1.6.12]
* json 视图与 kv 视图编辑的时候支持补丁模式(后台与提交过来的json进行对比,只对修改跟新增做出响应,忽略删除 [112](https://github.com/dotnetcore/AgileConfig/pull/112)

Expand Down

0 comments on commit 974515e

Please sign in to comment.