feat: 修改应用创建部分逻辑,为以后支持多数据库预留接口

This commit is contained in:
zhengkunwang223 2023-03-06 14:18:05 +08:00 committed by ssongliu
parent 2d7215308e
commit 74dcba6d25
3 changed files with 91 additions and 112 deletions

View file

@ -258,95 +258,6 @@ func (a AppService) Install(ctx context.Context, req request.AppInstallCreate) (
return &appInstall, nil
}
//func (a AppService) SyncInstalled(installId uint) error {
// appInstall, err := appInstallRepo.GetFirst(commonRepo.WithByID(installId))
// if err != nil {
// return err
// }
//
// containerNames, err := getContainerNames(appInstall)
// if err != nil {
// return err
// }
//
// cli, err := docker.NewClient()
// if err != nil {
// return err
// }
// containers, err := cli.ListContainersByName(containerNames)
// if err != nil {
// return err
// }
// var (
// errorContainers []string
// notFoundContainers []string
// runningContainers []string
// )
//
// for _, n := range containers {
// if n.State != "running" {
// errorContainers = append(errorContainers, n.Names[0])
// } else {
// runningContainers = append(runningContainers, n.Names[0])
// }
// }
// for _, old := range containerNames {
// exist := false
// for _, new := range containers {
// if common.ExistWithStrArray(old, new.Names) {
// exist = true
// break
// }
// }
// if !exist {
// notFoundContainers = append(notFoundContainers, old)
// }
// }
//
// containerCount := len(containers)
// errCount := len(errorContainers)
// notFoundCount := len(notFoundContainers)
// normalCount := len(containerNames)
// runningCount := len(runningContainers)
//
// if containerCount == 0 {
// appInstall.Status = constant.ContainerNotFound
// appInstall.Message = "container is not found"
// return appInstallRepo.Save(&appInstall)
// }
// if errCount == 0 && notFoundCount == 0 {
// appInstall.Status = constant.Running
// return appInstallRepo.Save(&appInstall)
// }
// if errCount == normalCount {
// appInstall.Status = constant.Error
// }
// if notFoundCount == normalCount {
// appInstall.Status = constant.Stopped
// }
// if runningCount < normalCount {
// appInstall.Status = constant.UnHealthy
// }
//
// var errMsg strings.Builder
// if errCount > 0 {
// errMsg.Write([]byte(string(rune(errCount)) + " error containers:"))
// for _, e := range errorContainers {
// errMsg.Write([]byte(e))
// }
// errMsg.Write([]byte("\n"))
// }
// if notFoundCount > 0 {
// errMsg.Write([]byte(string(rune(notFoundCount)) + " not found containers:"))
// for _, e := range notFoundContainers {
// errMsg.Write([]byte(e))
// }
// errMsg.Write([]byte("\n"))
// }
// appInstall.Message = errMsg.String()
// return appInstallRepo.Save(&appInstall)
//}
func (a AppService) GetAppUpdate() (*response.AppUpdateRes, error) {
res := &response.AppUpdateRes{
CanUpdate: false,

View file

@ -56,6 +56,25 @@ export namespace App {
default: any;
envKey: string;
key?: string;
values?: ServiceParam[];
child?: FromFieldChild;
params?: FromParam[];
}
export interface FromFieldChild extends FromField {
services: App.AppService[];
}
export interface FromParam {
type: string;
key: string;
value: string;
envKey: string;
}
export interface ServiceParam {
label: '';
value: '';
}
export interface AppInstall {

View file

@ -35,11 +35,47 @@
:label="service.label"
></el-option>
</el-select>
<span v-if="p.type === 'service' && !p.services" style="margin-left: 5px">
<el-link type="primary" :underline="false" @click="toPage(p.key)">
{{ $t('app.toInstall') }}
</el-link>
</span>
<el-row :gutter="10" v-if="p.type == 'apps'">
<el-col :span="12">
<el-form-item :prop="p.prop">
<el-select
v-model="form[p.envKey]"
@change="getServices(p.child.envKey, form[p.envKey], p)"
style="width: 100%"
>
<el-option
v-for="service in p.values"
:label="service.label"
:key="service.value"
:value="service.value"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item :prop="p.childProp">
<el-select
v-model="form[p.child.envKey]"
v-if="p.child.type == 'service'"
@change="changeService(form[p.child.envKey], p.services)"
>
<el-option
v-for="service in p.services"
:key="service.label"
:value="service.value"
:label="service.label"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col>
<span v-if="p.child.type === 'service' && p.services.length === 0">
<el-link type="primary" :underline="false" @click="toPage(form[p.envKey])">
{{ $t('app.toInstall') }}
</el-link>
</span>
</el-col>
</el-row>
</el-form-item>
</div>
</template>
@ -57,6 +93,7 @@ interface ParamObj extends App.FromField {
services: App.AppService[];
prop: string;
disabled: false;
childProp: string;
}
const emit = defineEmits(['update:form', 'update:rules']);
@ -120,18 +157,30 @@ const handleParams = () => {
form[p.envKey] = p.default;
}
if (p.required) {
if (p.type === 'service') {
if (p.type === 'service' || p.type === 'apps') {
rules[p.envKey] = [Rules.requiredSelect];
if (p.child) {
p.childProp = p.child.envKey;
if (p.child.type === 'service') {
rules[p.child.envKey] = [Rules.requiredSelect];
}
}
} else {
rules[p.envKey] = [Rules.requiredInput];
if (p.rule && p.rule != '') {
rules[p.envKey].push(Rules[p.rule]);
}
}
if (p.rule && p.rule != '') {
rules[p.envKey].push(Rules[p.rule]);
}
}
if (p.key) {
if (p.type === 'apps') {
getServices(p.child.envKey, p.default, p);
p.child.services = [];
form[p.child.envKey] = '';
}
if (p.type === 'service') {
getServices(p.envKey, p.key, p);
p.services = [];
form[p.envKey] = '';
getServices(p.envKey, p.key, pObj);
}
emit('update:rules', rules);
updateParam();
@ -139,28 +188,28 @@ const handleParams = () => {
}
};
const getServices = async (envKey: string, key: string | undefined, pObj: ParamObj) => {
const getServices = async (childKey: string, key: string | undefined, pObj: ParamObj | undefined) => {
pObj.services = [];
await GetAppService(key).then((res) => {
pObj.services = res.data;
pObj.services = res.data || [];
form[childKey] = '';
if (res.data && res.data.length > 0) {
form[envKey] = res.data[0].value;
if (res.data[0].config) {
Object.entries(res.data[0].config).forEach(([k, v]) => {
params.value.formFields.forEach((field) => {
if (field.envKey === k) {
form[k] = v;
}
});
form[childKey] = res.data[0].value;
if (pObj.params) {
pObj.params.forEach((param: App.FromParam) => {
if (param.key === key) {
form[param.envKey] = param.value;
}
});
}
updateParam();
changeService(form[childKey], pObj.services);
}
});
};
const changeService = (value: string, services: App.AppService[]) => {
services.forEach((item) => {
if (item.value === value) {
if (item.value === value && item.config) {
Object.entries(item.config).forEach(([k, v]) => {
if (form.hasOwnProperty(k)) {
form[k] = v;