Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
adcdb21d00
@ -4,7 +4,6 @@ from django.db import migrations, models
|
|||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('setting', '0001_initial'),
|
('setting', '0001_initial'),
|
||||||
]
|
]
|
||||||
@ -15,7 +14,7 @@ class Migration(migrations.Migration):
|
|||||||
fields=[
|
fields=[
|
||||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
|
('update_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')),
|
||||||
('type', models.IntegerField(choices=[('0', '邮箱')], default='0', max_length=5, primary_key=True, serialize=False, verbose_name='设置类型')),
|
('type', models.IntegerField(choices=[(0, '邮箱'), (1, '私钥秘钥')], default=0, primary_key=True, serialize=False, verbose_name='设置类型')),
|
||||||
('meta', models.JSONField(default=dict, verbose_name='配置数据')),
|
('meta', models.JSONField(default=dict, verbose_name='配置数据')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
|
|||||||
@ -24,7 +24,7 @@ class SystemSetting(AppModelMixin):
|
|||||||
"""
|
"""
|
||||||
系统设置
|
系统设置
|
||||||
"""
|
"""
|
||||||
type = models.IntegerField(primary_key=True, verbose_name='设置类型', max_length=5, choices=SettingType.choices,
|
type = models.IntegerField(primary_key=True, verbose_name='设置类型', choices=SettingType.choices,
|
||||||
default=SettingType.EMAIL)
|
default=SettingType.EMAIL)
|
||||||
|
|
||||||
meta = models.JSONField(verbose_name="配置数据", default=dict)
|
meta = models.JSONField(verbose_name="配置数据", default=dict)
|
||||||
|
|||||||
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.1.13 on 2024-03-20 12:27
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('users', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='create_time',
|
||||||
|
field=models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='user',
|
||||||
|
name='update_time',
|
||||||
|
field=models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -14,6 +14,7 @@ from django.db import models
|
|||||||
|
|
||||||
from common.constants.permission_constants import Permission, Group, Operate
|
from common.constants.permission_constants import Permission, Group, Operate
|
||||||
from common.db.sql_execute import select_list
|
from common.db.sql_execute import select_list
|
||||||
|
from common.mixins.app_model_mixin import AppModelMixin
|
||||||
from common.util.file_util import get_file_content
|
from common.util.file_util import get_file_content
|
||||||
from smartdoc.conf import PROJECT_DIR
|
from smartdoc.conf import PROJECT_DIR
|
||||||
|
|
||||||
@ -60,7 +61,7 @@ def get_user_dynamics_permission(user_id: str):
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
class User(models.Model):
|
class User(AppModelMixin):
|
||||||
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
|
id = models.UUIDField(primary_key=True, max_length=128, default=uuid.uuid1, editable=False, verbose_name="主键id")
|
||||||
email = models.EmailField(unique=True, verbose_name="邮箱")
|
email = models.EmailField(unique=True, verbose_name="邮箱")
|
||||||
phone = models.CharField(max_length=20, verbose_name="电话", default="")
|
phone = models.CharField(max_length=20, verbose_name="电话", default="")
|
||||||
@ -69,6 +70,8 @@ class User(models.Model):
|
|||||||
password = models.CharField(max_length=150, verbose_name="密码")
|
password = models.CharField(max_length=150, verbose_name="密码")
|
||||||
role = models.CharField(max_length=150, verbose_name="角色")
|
role = models.CharField(max_length=150, verbose_name="角色")
|
||||||
is_active = models.BooleanField(default=True)
|
is_active = models.BooleanField(default=True)
|
||||||
|
create_time = models.DateTimeField(verbose_name="创建时间", auto_now_add=True, null=True)
|
||||||
|
update_time = models.DateTimeField(verbose_name="修改时间", auto_now=True, null=True)
|
||||||
|
|
||||||
USERNAME_FIELD = 'username'
|
USERNAME_FIELD = 'username'
|
||||||
REQUIRED_FIELDS = []
|
REQUIRED_FIELDS = []
|
||||||
|
|||||||
@ -468,17 +468,21 @@ class UserSerializer(ApiMixin, serializers.ModelSerializer):
|
|||||||
class UserInstanceSerializer(ApiMixin, serializers.ModelSerializer):
|
class UserInstanceSerializer(ApiMixin, serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = ['id', 'username', 'email', 'phone', 'nick_name']
|
fields = ['id', 'username', 'email', 'phone', 'is_active', 'role', 'nick_name', 'create_time', 'update_time']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_response_body_api():
|
def get_response_body_api():
|
||||||
return openapi.Schema(
|
return openapi.Schema(
|
||||||
type=openapi.TYPE_OBJECT,
|
type=openapi.TYPE_OBJECT,
|
||||||
required=['id', 'username', 'email', 'password', 'create_time', 'update_time'],
|
required=['id', 'username', 'email', 'phone', 'is_active', 'role', 'nick_name', 'create_time',
|
||||||
|
'update_time'],
|
||||||
properties={
|
properties={
|
||||||
|
'id': openapi.Schema(type=openapi.TYPE_STRING, title="用户id", description="用户id"),
|
||||||
'username': openapi.Schema(type=openapi.TYPE_STRING, title="用户名", description="用户名"),
|
'username': openapi.Schema(type=openapi.TYPE_STRING, title="用户名", description="用户名"),
|
||||||
'email': openapi.Schema(type=openapi.TYPE_STRING, title="邮箱", description="邮箱地址"),
|
'email': openapi.Schema(type=openapi.TYPE_STRING, title="邮箱", description="邮箱地址"),
|
||||||
'phone': openapi.Schema(type=openapi.TYPE_STRING, title="手机号", description="手机号"),
|
'phone': openapi.Schema(type=openapi.TYPE_STRING, title="手机号", description="手机号"),
|
||||||
|
'is_active': openapi.Schema(type=openapi.TYPE_BOOLEAN, title="是否激活", description="是否激活"),
|
||||||
|
'role': openapi.Schema(type=openapi.TYPE_STRING, title="角色", description="角色"),
|
||||||
'nick_name': openapi.Schema(type=openapi.TYPE_STRING, title="昵称", description="昵称"),
|
'nick_name': openapi.Schema(type=openapi.TYPE_STRING, title="昵称", description="昵称"),
|
||||||
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description="修改时间"),
|
'create_time': openapi.Schema(type=openapi.TYPE_STRING, title="创建时间", description="修改时间"),
|
||||||
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description="修改时间")
|
'update_time': openapi.Schema(type=openapi.TYPE_STRING, title="修改时间", description="修改时间")
|
||||||
@ -562,9 +566,9 @@ class UserManageSerializer(serializers.Serializer):
|
|||||||
, message="密码长度6-20个字符,必须字母、数字、特殊字符组合")])
|
, message="密码长度6-20个字符,必须字母、数字、特殊字符组合")])
|
||||||
|
|
||||||
nick_name = serializers.CharField(required=False, error_messages=ErrMessage.char("昵称"), max_length=56,
|
nick_name = serializers.CharField(required=False, error_messages=ErrMessage.char("昵称"), max_length=56,
|
||||||
allow_null=True)
|
allow_null=True, allow_blank=True)
|
||||||
phone = serializers.CharField(required=False, error_messages=ErrMessage.char("手机号"), max_length=20,
|
phone = serializers.CharField(required=False, error_messages=ErrMessage.char("手机号"), max_length=20,
|
||||||
allow_null=True)
|
allow_null=True, allow_blank=True)
|
||||||
|
|
||||||
def is_valid(self, *, raise_exception=True):
|
def is_valid(self, *, raise_exception=True):
|
||||||
super().is_valid(raise_exception=True)
|
super().is_valid(raise_exception=True)
|
||||||
@ -599,9 +603,9 @@ class UserManageSerializer(serializers.Serializer):
|
|||||||
code=ExceptionCodeConstants.EMAIL_FORMAT_ERROR.value.code)])
|
code=ExceptionCodeConstants.EMAIL_FORMAT_ERROR.value.code)])
|
||||||
|
|
||||||
nick_name = serializers.CharField(required=False, error_messages=ErrMessage.char("昵称"), max_length=56,
|
nick_name = serializers.CharField(required=False, error_messages=ErrMessage.char("昵称"), max_length=56,
|
||||||
allow_null=True)
|
allow_null=True, allow_blank=True)
|
||||||
phone = serializers.CharField(required=False, error_messages=ErrMessage.char("手机号"), max_length=20,
|
phone = serializers.CharField(required=False, error_messages=ErrMessage.char("手机号"), max_length=20,
|
||||||
allow_null=True)
|
allow_null=True, allow_blank=True)
|
||||||
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char("是否可用"))
|
is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char("是否可用"))
|
||||||
|
|
||||||
def is_valid(self, *, user_id=None, raise_exception=False):
|
def is_valid(self, *, user_id=None, raise_exception=False):
|
||||||
|
|||||||
@ -1,9 +1,16 @@
|
|||||||
|
import { hasPermission } from '@/utils/permission/index'
|
||||||
import Layout from '@/layout/main-layout/index.vue'
|
import Layout from '@/layout/main-layout/index.vue'
|
||||||
|
import { Role } from '@/utils/permission/type'
|
||||||
const settingRouter = {
|
const settingRouter = {
|
||||||
path: '/setting',
|
path: '/setting',
|
||||||
name: 'setting',
|
name: 'setting',
|
||||||
meta: { icon: 'Setting', title: '系统设置', permission: 'SETTING:READ' },
|
meta: { icon: 'Setting', title: '系统设置', permission: 'SETTING:READ' },
|
||||||
redirect: '/user',
|
redirect: (to: any) => {
|
||||||
|
if (hasPermission(new Role('ADMIN'), 'AND')) {
|
||||||
|
return '/user'
|
||||||
|
}
|
||||||
|
return '/team'
|
||||||
|
},
|
||||||
component: Layout,
|
component: Layout,
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
@ -15,7 +22,8 @@ const settingRouter = {
|
|||||||
title: '用户管理',
|
title: '用户管理',
|
||||||
activeMenu: '/setting',
|
activeMenu: '/setting',
|
||||||
parentPath: '/setting',
|
parentPath: '/setting',
|
||||||
parentName: 'setting'
|
parentName: 'setting',
|
||||||
|
permission: new Role('ADMIN')
|
||||||
},
|
},
|
||||||
component: () => import('@/views/user-manage/index.vue')
|
component: () => import('@/views/user-manage/index.vue')
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user