更新唯一标识符规则

4.0
vapao 2022-10-31 11:12:00 +08:00
parent 1a1224cc87
commit b5e83bdd63
8 changed files with 55 additions and 49 deletions

View File

@ -5,7 +5,7 @@ from django.views.generic import View
from django.db.models import F
from libs import JsonParser, Argument, json_response, auth
from apps.app.models import App, Deploy, DeployExtend1, DeployExtend2
from apps.config.models import Config, ConfigHistory
from apps.config.models import Config, ConfigHistory, Service
from apps.app.utils import fetch_versions, remove_repo
from apps.setting.utils import AppSetting
import json
@ -14,12 +14,21 @@ import re
class AppView(View):
def get(self, request):
form, error = JsonParser(
Argument('id', type=int, required=False)
).parse(request.GET)
if error is None:
if request.user.is_supper:
apps = App.objects.all()
else:
ids = request.user.deploy_perms['apps']
apps = App.objects.filter(id__in=ids)
if form.id:
app = apps.filter(pk=form.id).first()
return json_response(app)
return json_response(apps)
return json_response(error=error)
@auth('deploy.app.add|deploy.app.edit|config.app.add|config.app.edit')
def post(self, request):
@ -30,12 +39,15 @@ class AppView(View):
Argument('desc', required=False)
).parse(request.body)
if error is None:
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
if not re.fullmatch(r'\w+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字和下划线的组合')
app = App.objects.filter(key=form.key).first()
if app and app.id != form.id:
return json_response(error=f'唯一标识符 {form.key} 已存在,请更改后重试')
return json_response(error='该识符已存在,请更改后重试')
service = Service.objects.filter(key=form.key).first()
if service:
return json_response(error=f'该标识符已被服务 {service.name} 使用,请更改后重试')
if form.id:
App.objects.filter(pk=form.id).update(**form)
else:

View File

@ -28,8 +28,8 @@ class EnvironmentView(View):
Argument('desc', required=False)
).parse(request.body)
if error is None:
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
if not re.fullmatch(r'\w+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字和下划线的组合')
env = Environment.objects.filter(key=form.key).first()
if env and env.id != form.id:
@ -83,8 +83,16 @@ class EnvironmentView(View):
class ServiceView(View):
@auth('config.src.view')
def get(self, request):
form, error = JsonParser(
Argument('id', type=int, required=False)
).parse(request.GET)
if error is None:
if form.id:
service = Service.objects.get(pk=form.id)
return json_response(service)
services = Service.objects.all()
return json_response(services)
return json_response(error=error)
@auth('config.src.add|config.src.edit')
def post(self, request):
@ -95,12 +103,15 @@ class ServiceView(View):
Argument('desc', required=False)
).parse(request.body)
if error is None:
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
if not re.fullmatch(r'\w+', form.key, re.ASCII):
return json_response(error='标识符必须为字母、数字和下划线的组合')
service = Service.objects.filter(key=form.key).first()
if service and service.id != form.id:
return json_response(error=f'唯一标识符 {form.key} 已存在,请更改后重试')
return json_response(error='该标识符已存在,请更改后重试')
app = App.objects.filter(key=form.key).first()
if app:
return json_response(error=f'该标识符已被应用 {app.name} 使用,请更改后重试')
if form.id:
Service.objects.filter(pk=form.id).update(**form)
else:
@ -119,7 +130,8 @@ class ServiceView(View):
if form.id in rel_services:
rel_apps.append(app.name)
if rel_apps:
return json_response(error=f'该服务在配置中心已被 "{", ".join(rel_apps)}" 依赖,请解除依赖关系后再尝试删除。')
return json_response(
error=f'该服务在配置中心已被 "{", ".join(rel_apps)}" 依赖,请解除依赖关系后再尝试删除。')
# auto delete configs
Config.objects.filter(type='src', o_id=form.id).delete()
ConfigHistory.objects.filter(type='src', o_id=form.id).delete()
@ -151,7 +163,6 @@ class ConfigView(View):
Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'),
Argument('envs', type=list, filter=lambda x: len(x), help='请选择环境'),
Argument('key', help='请输入Key'),
Argument('is_public', type=bool, help='缺少必要参数'),
Argument('value', type=str, default=''),
Argument('desc', required=False)
).parse(request.body)
@ -173,7 +184,6 @@ class ConfigView(View):
form, error = JsonParser(
Argument('id', type=int, help='缺少必要参数'),
Argument('value', type=str, default=''),
Argument('is_public', type=bool, help='缺少必要参数'),
Argument('desc', required=False)
).parse(request.body)
if error is None:
@ -182,7 +192,6 @@ class ConfigView(View):
if not config:
return json_response(error='未找到指定对象')
config.desc = form.desc
config.is_public = form.is_public
if config.value != form.value:
old_value = config.value
config.value = form.value
@ -314,7 +323,6 @@ def _parse(request, query, data):
item.delete()
for key, value in data.items():
query.key = key
query.is_public = False
query.value = _filter_value(value)
query.updated_at = human_datetime()
query.updated_by = request.user

View File

@ -42,7 +42,7 @@ export default observer(function () {
name="key"
label="唯一标识符"
tooltip="应用的唯一标识符,会作为生成配置的前缀。"
extra="可以由字母、数字、-和下划线组成。">
extra="可以由字母、数字和下划线组成。">
<Input placeholder="请输入唯一标识符例如api_order"/>
</Form.Item>
<Form.Item name="desc" label="备注信息">

View File

@ -51,26 +51,16 @@ class Rel extends React.Component {
return (
<Modal
visible
width={800}
width={700}
maskClosable={false}
title="配置依赖关系"
title="配置服务依赖"
onCancel={() => store.relVisible = false}
confirmLoading={this.state.loading}
footer={hasPermission('config.app.edit_config') ? undefined : null}
onOk={this.handleSubmit}>
<Alert
closable
showIcon
type="info"
message="小提示"
style={{margin: '0 80px 20px'}}
description={[
<p key={1}>设置依赖的应用仅会获取到其<span style={{color: 'red'}}>公共</span></p>,
<p key={2}>服务不存在公共和私有配置的概念所以会获取到依赖服务的所有配置信息</p>
]}/>
<Tabs tabPosition="left">
<Tabs.TabPane tab="应用依赖" key="app">
<Form.Item label="设置依赖的应用">
<Form.Item extra="设置依赖后,该应用将能够获取到所依赖应用的配置。">
<Transfer
listStyle={{width: 280, minHeight: 300}}
titles={['所有应用', '已选应用']}
@ -81,7 +71,7 @@ class Rel extends React.Component {
</Form.Item>
</Tabs.TabPane>
<Tabs.TabPane tab="服务依赖" key="service">
<Form.Item label="设置依赖的服务">
<Form.Item extra="设置依赖后,该应用将能够获取到所依赖服务的配置。">
<Transfer
listStyle={{width: 280, minHeight: 300}}
titles={['所有服务', '已选服务']}

View File

@ -42,7 +42,7 @@ export default observer(function () {
name="key"
label="唯一标识符"
tooltip="环境的唯一标识符会在配置中心API中使用具体请参考官方文档。"
extra="可以由字母、数字、-和下划线组成。">
extra="可以由字母、数字和下划线组成。">
<Input placeholder="请输入唯一标识符例如dev"/>
</Form.Item>
<Form.Item name="desc" label="备注信息">

View File

@ -34,16 +34,12 @@ export default observer(function () {
confirmLoading={loading}
onOk={handleSubmit}>
<Form form={form} initialValues={store.record} labelCol={{span: 6}} wrapperCol={{span: 14}}>
<Form.Item required name="name" label="服务名称">
<Input placeholder="请输入服务名称,例如:订单数据库"/>
<Form.Item required name="name" label="服务名称" tooltip="服务可以理解为一些配置的集合。">
<Input placeholder="请输入服务名称"/>
</Form.Item>
<Form.Item
required
name="key"
label="唯一标识符"
tooltip="服务的唯一标识符,会作为生成配置的前缀。"
extra="可以由字母、数字、-和下划线组成。">
<Input placeholder="请输入唯一标识符例如mysql_order"/>
<Form.Item required name="key" label="唯一标识符" tooltip="服务的唯一标识符,会作为生成配置的前缀。"
extra="可以由字母、数字和下划线组成。">
<Input placeholder="请输入唯一标识符"/>
</Form.Item>
<Form.Item name="desc" label="备注信息">
<Input.TextArea placeholder="请输入备注信息"/>

View File

@ -17,7 +17,7 @@ export default observer(function () {
<Breadcrumb>
<Breadcrumb.Item>首页</Breadcrumb.Item>
<Breadcrumb.Item>配置中心</Breadcrumb.Item>
<Breadcrumb.Item>应用配置</Breadcrumb.Item>
<Breadcrumb.Item>服务配置</Breadcrumb.Item>
</Breadcrumb>
<SearchForm>
<SearchForm.Item span={8} title="服务名称">

View File

@ -42,7 +42,7 @@ export default observer(function () {
name="key"
label="唯一标识符"
tooltip="给应用设置的唯一标识符,会用于配置中心的配置生成。"
extra="可以由字母、数字、-和下划线组成。">
extra="可以由字母、数字和下划线组成。">
<Input placeholder="请输入唯一标识符例如api_order"/>
</Form.Item>
<Form.Item name="desc" label="备注信息">