mirror of https://github.com/openspug/spug
更新唯一标识符规则
parent
1a1224cc87
commit
b5e83bdd63
|
@ -5,7 +5,7 @@ from django.views.generic import View
|
||||||
from django.db.models import F
|
from django.db.models import F
|
||||||
from libs import JsonParser, Argument, json_response, auth
|
from libs import JsonParser, Argument, json_response, auth
|
||||||
from apps.app.models import App, Deploy, DeployExtend1, DeployExtend2
|
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.app.utils import fetch_versions, remove_repo
|
||||||
from apps.setting.utils import AppSetting
|
from apps.setting.utils import AppSetting
|
||||||
import json
|
import json
|
||||||
|
@ -14,12 +14,21 @@ import re
|
||||||
|
|
||||||
class AppView(View):
|
class AppView(View):
|
||||||
def get(self, request):
|
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:
|
if request.user.is_supper:
|
||||||
apps = App.objects.all()
|
apps = App.objects.all()
|
||||||
else:
|
else:
|
||||||
ids = request.user.deploy_perms['apps']
|
ids = request.user.deploy_perms['apps']
|
||||||
apps = App.objects.filter(id__in=ids)
|
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(apps)
|
||||||
|
return json_response(error=error)
|
||||||
|
|
||||||
@auth('deploy.app.add|deploy.app.edit|config.app.add|config.app.edit')
|
@auth('deploy.app.add|deploy.app.edit|config.app.add|config.app.edit')
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
|
@ -30,12 +39,15 @@ class AppView(View):
|
||||||
Argument('desc', required=False)
|
Argument('desc', required=False)
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
if error is None:
|
if error is None:
|
||||||
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
|
if not re.fullmatch(r'\w+', form.key, re.ASCII):
|
||||||
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
|
return json_response(error='标识符必须为字母、数字和下划线的组合')
|
||||||
|
|
||||||
app = App.objects.filter(key=form.key).first()
|
app = App.objects.filter(key=form.key).first()
|
||||||
if app and app.id != form.id:
|
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:
|
if form.id:
|
||||||
App.objects.filter(pk=form.id).update(**form)
|
App.objects.filter(pk=form.id).update(**form)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -28,8 +28,8 @@ class EnvironmentView(View):
|
||||||
Argument('desc', required=False)
|
Argument('desc', required=False)
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
if error is None:
|
if error is None:
|
||||||
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
|
if not re.fullmatch(r'\w+', form.key, re.ASCII):
|
||||||
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
|
return json_response(error='标识符必须为字母、数字和下划线的组合')
|
||||||
|
|
||||||
env = Environment.objects.filter(key=form.key).first()
|
env = Environment.objects.filter(key=form.key).first()
|
||||||
if env and env.id != form.id:
|
if env and env.id != form.id:
|
||||||
|
@ -83,8 +83,16 @@ class EnvironmentView(View):
|
||||||
class ServiceView(View):
|
class ServiceView(View):
|
||||||
@auth('config.src.view')
|
@auth('config.src.view')
|
||||||
def get(self, request):
|
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()
|
services = Service.objects.all()
|
||||||
return json_response(services)
|
return json_response(services)
|
||||||
|
return json_response(error=error)
|
||||||
|
|
||||||
@auth('config.src.add|config.src.edit')
|
@auth('config.src.add|config.src.edit')
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
|
@ -95,12 +103,15 @@ class ServiceView(View):
|
||||||
Argument('desc', required=False)
|
Argument('desc', required=False)
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
if error is None:
|
if error is None:
|
||||||
if not re.fullmatch(r'[-\w]+', form.key, re.ASCII):
|
if not re.fullmatch(r'\w+', form.key, re.ASCII):
|
||||||
return json_response(error='标识符必须为字母、数字、-和下划线的组合')
|
return json_response(error='标识符必须为字母、数字和下划线的组合')
|
||||||
|
|
||||||
service = Service.objects.filter(key=form.key).first()
|
service = Service.objects.filter(key=form.key).first()
|
||||||
if service and service.id != form.id:
|
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:
|
if form.id:
|
||||||
Service.objects.filter(pk=form.id).update(**form)
|
Service.objects.filter(pk=form.id).update(**form)
|
||||||
else:
|
else:
|
||||||
|
@ -119,7 +130,8 @@ class ServiceView(View):
|
||||||
if form.id in rel_services:
|
if form.id in rel_services:
|
||||||
rel_apps.append(app.name)
|
rel_apps.append(app.name)
|
||||||
if rel_apps:
|
if rel_apps:
|
||||||
return json_response(error=f'该服务在配置中心已被 "{", ".join(rel_apps)}" 依赖,请解除依赖关系后再尝试删除。')
|
return json_response(
|
||||||
|
error=f'该服务在配置中心已被 "{", ".join(rel_apps)}" 依赖,请解除依赖关系后再尝试删除。')
|
||||||
# auto delete configs
|
# auto delete configs
|
||||||
Config.objects.filter(type='src', o_id=form.id).delete()
|
Config.objects.filter(type='src', o_id=form.id).delete()
|
||||||
ConfigHistory.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('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'),
|
||||||
Argument('envs', type=list, filter=lambda x: len(x), help='请选择环境'),
|
Argument('envs', type=list, filter=lambda x: len(x), help='请选择环境'),
|
||||||
Argument('key', help='请输入Key'),
|
Argument('key', help='请输入Key'),
|
||||||
Argument('is_public', type=bool, help='缺少必要参数'),
|
|
||||||
Argument('value', type=str, default=''),
|
Argument('value', type=str, default=''),
|
||||||
Argument('desc', required=False)
|
Argument('desc', required=False)
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
|
@ -173,7 +184,6 @@ class ConfigView(View):
|
||||||
form, error = JsonParser(
|
form, error = JsonParser(
|
||||||
Argument('id', type=int, help='缺少必要参数'),
|
Argument('id', type=int, help='缺少必要参数'),
|
||||||
Argument('value', type=str, default=''),
|
Argument('value', type=str, default=''),
|
||||||
Argument('is_public', type=bool, help='缺少必要参数'),
|
|
||||||
Argument('desc', required=False)
|
Argument('desc', required=False)
|
||||||
).parse(request.body)
|
).parse(request.body)
|
||||||
if error is None:
|
if error is None:
|
||||||
|
@ -182,7 +192,6 @@ class ConfigView(View):
|
||||||
if not config:
|
if not config:
|
||||||
return json_response(error='未找到指定对象')
|
return json_response(error='未找到指定对象')
|
||||||
config.desc = form.desc
|
config.desc = form.desc
|
||||||
config.is_public = form.is_public
|
|
||||||
if config.value != form.value:
|
if config.value != form.value:
|
||||||
old_value = config.value
|
old_value = config.value
|
||||||
config.value = form.value
|
config.value = form.value
|
||||||
|
@ -314,7 +323,6 @@ def _parse(request, query, data):
|
||||||
item.delete()
|
item.delete()
|
||||||
for key, value in data.items():
|
for key, value in data.items():
|
||||||
query.key = key
|
query.key = key
|
||||||
query.is_public = False
|
|
||||||
query.value = _filter_value(value)
|
query.value = _filter_value(value)
|
||||||
query.updated_at = human_datetime()
|
query.updated_at = human_datetime()
|
||||||
query.updated_by = request.user
|
query.updated_by = request.user
|
||||||
|
|
|
@ -42,7 +42,7 @@ export default observer(function () {
|
||||||
name="key"
|
name="key"
|
||||||
label="唯一标识符"
|
label="唯一标识符"
|
||||||
tooltip="应用的唯一标识符,会作为生成配置的前缀。"
|
tooltip="应用的唯一标识符,会作为生成配置的前缀。"
|
||||||
extra="可以由字母、数字、-和下划线组成。">
|
extra="可以由字母、数字和下划线组成。">
|
||||||
<Input placeholder="请输入唯一标识符,例如:api_order"/>
|
<Input placeholder="请输入唯一标识符,例如:api_order"/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="desc" label="备注信息">
|
<Form.Item name="desc" label="备注信息">
|
||||||
|
|
|
@ -51,26 +51,16 @@ class Rel extends React.Component {
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
visible
|
visible
|
||||||
width={800}
|
width={700}
|
||||||
maskClosable={false}
|
maskClosable={false}
|
||||||
title="配置依赖关系"
|
title="配置服务依赖"
|
||||||
onCancel={() => store.relVisible = false}
|
onCancel={() => store.relVisible = false}
|
||||||
confirmLoading={this.state.loading}
|
confirmLoading={this.state.loading}
|
||||||
footer={hasPermission('config.app.edit_config') ? undefined : null}
|
footer={hasPermission('config.app.edit_config') ? undefined : null}
|
||||||
onOk={this.handleSubmit}>
|
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 tabPosition="left">
|
||||||
<Tabs.TabPane tab="应用依赖" key="app">
|
<Tabs.TabPane tab="应用依赖" key="app">
|
||||||
<Form.Item label="设置依赖的应用">
|
<Form.Item extra="设置依赖后,该应用将能够获取到所依赖应用的配置。">
|
||||||
<Transfer
|
<Transfer
|
||||||
listStyle={{width: 280, minHeight: 300}}
|
listStyle={{width: 280, minHeight: 300}}
|
||||||
titles={['所有应用', '已选应用']}
|
titles={['所有应用', '已选应用']}
|
||||||
|
@ -81,7 +71,7 @@ class Rel extends React.Component {
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Tabs.TabPane>
|
</Tabs.TabPane>
|
||||||
<Tabs.TabPane tab="服务依赖" key="service">
|
<Tabs.TabPane tab="服务依赖" key="service">
|
||||||
<Form.Item label="设置依赖的服务">
|
<Form.Item extra="设置依赖后,该应用将能够获取到所依赖服务的配置。">
|
||||||
<Transfer
|
<Transfer
|
||||||
listStyle={{width: 280, minHeight: 300}}
|
listStyle={{width: 280, minHeight: 300}}
|
||||||
titles={['所有服务', '已选服务']}
|
titles={['所有服务', '已选服务']}
|
||||||
|
|
|
@ -42,7 +42,7 @@ export default observer(function () {
|
||||||
name="key"
|
name="key"
|
||||||
label="唯一标识符"
|
label="唯一标识符"
|
||||||
tooltip="环境的唯一标识符,会在配置中心API中使用,具体请参考官方文档。"
|
tooltip="环境的唯一标识符,会在配置中心API中使用,具体请参考官方文档。"
|
||||||
extra="可以由字母、数字、-和下划线组成。">
|
extra="可以由字母、数字和下划线组成。">
|
||||||
<Input placeholder="请输入唯一标识符,例如:dev"/>
|
<Input placeholder="请输入唯一标识符,例如:dev"/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="desc" label="备注信息">
|
<Form.Item name="desc" label="备注信息">
|
||||||
|
|
|
@ -34,16 +34,12 @@ export default observer(function () {
|
||||||
confirmLoading={loading}
|
confirmLoading={loading}
|
||||||
onOk={handleSubmit}>
|
onOk={handleSubmit}>
|
||||||
<Form form={form} initialValues={store.record} labelCol={{span: 6}} wrapperCol={{span: 14}}>
|
<Form form={form} initialValues={store.record} labelCol={{span: 6}} wrapperCol={{span: 14}}>
|
||||||
<Form.Item required name="name" label="服务名称">
|
<Form.Item required name="name" label="服务名称" tooltip="服务可以理解为一些配置的集合。">
|
||||||
<Input placeholder="请输入服务名称,例如:订单数据库"/>
|
<Input placeholder="请输入服务名称"/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item
|
<Form.Item required name="key" label="唯一标识符" tooltip="服务的唯一标识符,会作为生成配置的前缀。"
|
||||||
required
|
extra="可以由字母、数字和下划线组成。">
|
||||||
name="key"
|
<Input placeholder="请输入唯一标识符"/>
|
||||||
label="唯一标识符"
|
|
||||||
tooltip="服务的唯一标识符,会作为生成配置的前缀。"
|
|
||||||
extra="可以由字母、数字、-和下划线组成。">
|
|
||||||
<Input placeholder="请输入唯一标识符,例如:mysql_order"/>
|
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="desc" label="备注信息">
|
<Form.Item name="desc" label="备注信息">
|
||||||
<Input.TextArea placeholder="请输入备注信息"/>
|
<Input.TextArea placeholder="请输入备注信息"/>
|
||||||
|
|
|
@ -17,7 +17,7 @@ export default observer(function () {
|
||||||
<Breadcrumb>
|
<Breadcrumb>
|
||||||
<Breadcrumb.Item>首页</Breadcrumb.Item>
|
<Breadcrumb.Item>首页</Breadcrumb.Item>
|
||||||
<Breadcrumb.Item>配置中心</Breadcrumb.Item>
|
<Breadcrumb.Item>配置中心</Breadcrumb.Item>
|
||||||
<Breadcrumb.Item>应用配置</Breadcrumb.Item>
|
<Breadcrumb.Item>服务配置</Breadcrumb.Item>
|
||||||
</Breadcrumb>
|
</Breadcrumb>
|
||||||
<SearchForm>
|
<SearchForm>
|
||||||
<SearchForm.Item span={8} title="服务名称">
|
<SearchForm.Item span={8} title="服务名称">
|
||||||
|
|
|
@ -42,7 +42,7 @@ export default observer(function () {
|
||||||
name="key"
|
name="key"
|
||||||
label="唯一标识符"
|
label="唯一标识符"
|
||||||
tooltip="给应用设置的唯一标识符,会用于配置中心的配置生成。"
|
tooltip="给应用设置的唯一标识符,会用于配置中心的配置生成。"
|
||||||
extra="可以由字母、数字、-和下划线组成。">
|
extra="可以由字母、数字和下划线组成。">
|
||||||
<Input placeholder="请输入唯一标识符,例如:api_order"/>
|
<Input placeholder="请输入唯一标识符,例如:api_order"/>
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
<Form.Item name="desc" label="备注信息">
|
<Form.Item name="desc" label="备注信息">
|
||||||
|
|
Loading…
Reference in New Issue