Skip to content

Commit

Permalink
Merge branch 'master' into publish
Browse files Browse the repository at this point in the history
# Conflicts:
#	AgileConfig.Server.Apisite/AgileConfig.Server.Apisite.csproj
  • Loading branch information
kklldog committed Nov 8, 2021
2 parents 99f2b16 + 66b52c5 commit 4f05968
Show file tree
Hide file tree
Showing 15 changed files with 582 additions and 732 deletions.
35 changes: 35 additions & 0 deletions AgileConfig.Server.Apisite/Controllers/ConfigController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -774,5 +774,40 @@ public async Task<IActionResult> CancelSomeEdit([FromBody]List<string> ids, stri
success = true
});
}

[TypeFilter(typeof(PremissionCheckAttribute), Arguments = new object[] { "Config.EvnSync", Functions.Config_Add })]
[HttpPost]
public async Task<IActionResult> SyncEnv([FromBody]List<string> toEnvs,[FromQuery]string appId, [FromQuery]string currentEnv)
{
if (toEnvs == null)
{
throw new ArgumentNullException("toEnvs");
}
if (string.IsNullOrEmpty(appId))
{
throw new ArgumentNullException("appId");
}
if (string.IsNullOrEmpty(currentEnv))
{
throw new ArgumentNullException("currentEnv");
}

var app = await _appService.GetAsync(appId);
if (app == null)
{
return Json(new
{
success = false,
message = $"应用({appId})不存在。"
});
}

var result = await _configService.EnvSync(appId, currentEnv, toEnvs);

return Json(new
{
success = result
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ private static string GetEnvFromArgs(IDictionary<string, object> args, IConfigSe
{
"Config.AddRange",(args, premission, config)=> { var model = args.ActionArguments["model"]; return (model as List<ConfigVM>)?.FirstOrDefault()?.AppId; }
},
{
"Config.EnvSync",(args, premission, config)=> { var appId = args.ActionArguments["appId"]; return appId?.ToString(); }
},
{
"Config.Edit",(args, premission, config)=> { var model = args.ActionArguments["model"]; return (model as IAppIdModel)?.AppId; }
},
Expand Down
9 changes: 9 additions & 0 deletions AgileConfig.Server.IService/IConfigService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,5 +169,14 @@ public interface IConfigService: IDisposable
/// <param name="publishTimelineId"></param>
/// <returns></returns>
Task<bool> RollbackAsync(string publishTimelineId, string env);

/// <summary>
/// 同步到环境
/// </summary>
/// <param name="appId"></param>
/// <param name="currentEnv"></param>
/// <param name="toEnvs"></param>
/// <returns></returns>
Task<bool> EnvSync(string appId, string currentEnv, List<string> toEnvs);
}
}
55 changes: 55 additions & 0 deletions AgileConfig.Server.Service/ConfigService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -738,5 +738,60 @@ public async Task<bool> RollbackAsync(string publishTimelineId, string env)

return await dbcontext.SaveChangesAsync() > 0;
}

public async Task<bool> EnvSync(string appId, string currentEnv, List<string> toEnvs)
{
var currentEnvConfigs = await this.GetByAppIdAsync(appId, currentEnv);

foreach (var env in toEnvs)
{
var envConfigs = await this.GetByAppIdAsync(appId, env);
var addRanges = new List<Config>();
var updateRanges = new List<Config>();
foreach (var currentEnvConfig in currentEnvConfigs)
{
var envConfig = envConfigs.FirstOrDefault(x => GenerateKey(x) == GenerateKey(currentEnvConfig));
if (envConfig == null)
{
//没有相同的配置,则添加
currentEnvConfig.Id = Guid.NewGuid().ToString("N");
currentEnvConfig.Env = env;
currentEnvConfig.CreateTime = DateTime.Now;
currentEnvConfig.UpdateTime = DateTime.Now;
currentEnvConfig.Status = ConfigStatus.Enabled;
currentEnvConfig.EditStatus = EditStatus.Add;
currentEnvConfig.OnlineStatus = OnlineStatus.WaitPublish;//全部设置为待发布状态
addRanges.Add(currentEnvConfig);
}
else
{
// 如果有了相同的键,如果值不同,则更新
if (envConfig.Value != currentEnvConfig.Value)
{
envConfig.UpdateTime = DateTime.Now;
envConfig.Value = currentEnvConfig.Value;
if (envConfig.EditStatus == EditStatus.Commit)
{
envConfig.EditStatus = EditStatus.Edit;
}
envConfig.OnlineStatus = OnlineStatus.WaitPublish;
updateRanges.Add(envConfig);
}
}
}

if (addRanges.Count > 0)
{
await this.AddRangeAsync(addRanges, env);
}
if (updateRanges.Count > 0)
{
await this.UpdateAsync(updateRanges, env);
}
}

return true;
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import { getEnvList } from "@/utils/authority";
import { Button, message, Modal, Space, Table, Upload, Checkbox } from "antd";
import { CheckboxValueType } from "antd/lib/checkbox/Group";
import React, { useState } from 'react';
import { envSync } from "../service";
const CheckboxGroup = Checkbox.Group;
export type EnvSyncFormProps = {
appId: string,
currentEnv: string,
ModalVisible: boolean;
onCancel: () => void;
onSaveSuccess: ()=> void;
};

const EnvSync : React.FC<EnvSyncFormProps> = (props)=>{
const [checkedList, setCheckedList] = React.useState<CheckboxValueType[]>([]);
const envList = getEnvList();
const onChange = (list:CheckboxValueType[]) => {
setCheckedList(list);
};

return (
<Modal
title="同步环境"
visible={props.ModalVisible}
onCancel={
()=>{
props.onCancel();
}
}
onOk={
async ()=> {
if (!checkedList.length) {
message.error('请至少勾选一个环境');
return;
}
const hide = message.loading('正在同步');
try {
const result = await envSync(props.appId, props.currentEnv, checkedList.map(item=>item.toString()));
const success = result.success;
if (success) {
props.onSaveSuccess();
message.success('同步成功!');
} else {
message.error('同步失败');
}
}
catch (e) {
message.error('同步失败');
}
finally {
hide();
}
}
}
>
将当前 {props.currentEnv} 环境的配置同步到:
<div style={{marginTop:20}}>
<CheckboxGroup options={envList.filter(x=> x !== props.currentEnv)} value={checkedList} onChange={onChange} />
</div>
</Modal>
);
}

export default EnvSync;
51 changes: 29 additions & 22 deletions AgileConfig.Server.UI/react-ui-antd/src/pages/Configs/index.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import { CiCircleOutlined, DeleteOutlined, PlusOutlined, RollbackOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
import { DeleteOutlined, PlusOutlined, RollbackOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
import { ModalForm, ProFormText, ProFormTextArea } from '@ant-design/pro-form';
import { PageContainer } from '@ant-design/pro-layout';
import ProTable, { ActionType, ProColumns, TableDropdown } from '@ant-design/pro-table';
import { Badge, Button, Drawer, FormInstance, Input, List, message, Modal, Radio, Space, Tag } from 'antd';
import React, { useState, useRef, useEffect } from 'react';
import { queryApps } from '../Apps/service';
import UpdateForm from './comps/updateForm';
import { ConfigListItem, PublishDetialConfig } from './data';
import { queryConfigs, delConfig,delConfigs, addConfig, editConfig, queryConfigPublishedHistory, getWaitPublishStatus, publish, cancelEdit, exportJson, cancelSomeEdit } from './service';
Expand All @@ -18,6 +17,7 @@ import AuthorizedEle from '@/components/Authorized/AuthorizedElement';
import functionKeys from '@/models/functionKeys';
import VersionHistory from './comps/versionHistory';
import { getEnvList } from '@/utils/authority';
import EnvSync from './comps/EnvSync';

const { TextArea } = Input;
const { confirm } = Modal;
Expand Down Expand Up @@ -181,12 +181,12 @@ const handleExportJson = async (appId: string, env:string) => {
const configs: React.FC = (props: any) => {
const appId = props.match.params.app_id;
const appName = props.match.params.app_name;
const [appEnums, setAppEnums] = useState<any>();
const [createModalVisible, setCreateModalVisible] = useState<boolean>(false);
const [updateModalVisible, setUpdateModalVisible] = useState<boolean>(false);
const [modifyLogsModalVisible, setmodifyLogsModalVisible] = useState<boolean>(false);
const [jsonImportFormModalVisible, setjsonImportFormModalVisible] = useState<boolean>(false);
const [versionHistoryFormModalVisible, setVersionHistoryFormModalVisible] = useState<boolean>(false);
const [EnvSyncModalVisible, setEnvSyncModalVisible] = useState<boolean>(false);
const [currentRow, setCurrentRow] = useState<ConfigListItem>();
const [selectedRowsState, setSelectedRows] = useState<ConfigListItem[]>([]);
const [configPublishedHistory, setModifyLogs] = useState<PublishDetialConfig[]>([]);
Expand All @@ -206,23 +206,6 @@ const configs: React.FC = (props: any) => {
const addFormRef = useRef<FormInstance>();
let _publishLog:string = '';
const intl = useIntl();
const getAppEnums = async () => {
const result = await queryApps({})
const obj = {};
result.data.forEach((x) => {
obj[x.id] = {
text: x.name
}
});

return obj;
}
useEffect(() => {
getAppEnums().then(x => {
console.log('app enums ', x);
setAppEnums({ ...x });
});
}, []);
useEffect(() => {
getWaitPublishStatus(appId, currentEnv).then(x => {
console.log('WaitPublishStatus ', x);
Expand Down Expand Up @@ -547,7 +530,7 @@ const configs: React.FC = (props: any) => {
<AuthorizedEle key="6" judgeKey={functionKeys.Config_Edit} appId={appId} >
{
selectedRowsState.length > 0 ?
<Button key="button" type="primary" icon={<DeleteOutlined />}
<Button type="primary" icon={<DeleteOutlined />}
className="danger"
onClick={
()=>{
Expand All @@ -572,13 +555,19 @@ const configs: React.FC = (props: any) => {
</AuthorizedEle>
,
<AuthorizedEle key="1" judgeKey={functionKeys.Config_Publish} appId={appId}>
<Button key="button" onClick={()=>{ setVersionHistoryFormModalVisible(true) }}>
<Button onClick={()=>{ setVersionHistoryFormModalVisible(true) }}>
{
'历史版本'
}
</Button>
</AuthorizedEle>
,
<AuthorizedEle key="5" judgeKey={functionKeys.Config_Add} appId={appId} >
<Button onClick={()=>{ setEnvSyncModalVisible(true) }}>
同步环境
</Button>
</AuthorizedEle>
,
<AuthorizedEle key="3" judgeKey={functionKeys.Config_Add} appId={appId}>
<Button onClick={()=>{ setjsonImportFormModalVisible(true) }}>
{
Expand Down Expand Up @@ -651,6 +640,24 @@ const configs: React.FC = (props: any) => {
versionHistoryModalVisible ={versionHistoryFormModalVisible}>
</VersionHistory>
}
{
EnvSyncModalVisible&&
<EnvSync currentEnv={currentEnv}
appId={appId}
ModalVisible={EnvSyncModalVisible}
onSaveSuccess={
()=>{
setEnvSyncModalVisible(false);
actionRef.current?.reload();
}
}
onCancel={
()=>{
setEnvSyncModalVisible(false);
}
} >
</EnvSync>
}
<ModalForm
formRef={addFormRef}
title={intl.formatMessage({id:'pages.configs.from.add.title'})}
Expand Down
10 changes: 10 additions & 0 deletions AgileConfig.Server.UI/react-ui-antd/src/pages/Configs/service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,14 @@ export async function exportJson(appId: string, env:string) {
},
responseType: "blob"
});
}

export async function envSync(appId: string, currentEnv:string, toEnvs:string[]) {
return request('/config/syncenv?currentEnv=' + currentEnv, {
method: 'POST',
params:{
appId: appId
},
data: toEnvs
});
}
Loading

0 comments on commit 4f05968

Please sign in to comment.