diff --git a/client/src/views/system/dict.vue b/client/src/views/system/dict.vue
index f3b5926..2366558 100644
--- a/client/src/views/system/dict.vue
+++ b/client/src/views/system/dict.vue
@@ -13,7 +13,6 @@
v-loading="treeLoding"
class="filter-tree"
:data="dictTypeData"
- default-expand-all
highlight-current
:expand-on-click-node="false"
:filter-node-method="filterNode"
@@ -46,11 +45,13 @@
+
+
+
+
-
+
-
+
+
+
+
+ 有效
+ 无效
+
@@ -165,15 +181,16 @@ const defaultDict = {
name: '',
description: '',
sort: 1,
- type: null
+ type: null,
+ is_deleted: false
}
export default {
components: { Pagination, Treeselect },
data() {
return {
- dicttype: defaultDictType,
- dict: defaultDict,
- dictList: { count: 0 },
+ dicttype: Object.assign({}, defaultDictType),
+ dict: Object.assign({}, defaultDict),
+ dictList: [],
listLoading: true,
listQuery: {
page: 1,
@@ -202,7 +219,6 @@ export default {
}
},
created() {
- this.getList()
this.getDictTypeList()
},
methods: {
@@ -219,13 +235,11 @@ export default {
getList() {
this.listLoading = true
getDictList(this.listQuery).then(response => {
- if (response.code >= 200) {
- if (response.data.results) {
+ if (response.data) {
this.dictList = response.data
- }
this.listLoading = false
- }
- })
+ }
+ }).catch(error=>{this.listLoading = false})
},
getDictTypeList() {
this.treeLoding = true
@@ -259,8 +273,8 @@ export default {
this.$refs['Form2'].clearValidate()
})
},
- handleEditDictType(val) {
- this.dicttype = val // copy obj
+ handleEditDictType(data) {
+ this.dicttype = Object.assign({}, data) // copy obj
this.dgT1 = 'edit'
this.dgV1 = true
this.$nextTick(() => {
@@ -277,7 +291,7 @@ export default {
.then(async() => {
const { code } = await deleteDict(scope.row.id)
if (code>=200){
- this.dictList.results.splice(scope.row.index, 1)
+ this.dictList.splice(scope.row.index, 1)
this.$message({
type: 'success',
message: '成功删除!'
diff --git a/server/apps/system/migrations/0012_auto_20200609_1716.py b/server/apps/system/migrations/0012_auto_20200609_1716.py
new file mode 100644
index 0000000..843bde2
--- /dev/null
+++ b/server/apps/system/migrations/0012_auto_20200609_1716.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.0.7 on 2020-06-09 09:16
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0011_auto_20200609_1549'),
+ ]
+
+ operations = [
+ migrations.AlterUniqueTogether(
+ name='dict',
+ unique_together={('name', 'code')},
+ ),
+ ]
diff --git a/server/apps/system/migrations/0013_auto_20200609_1729.py b/server/apps/system/migrations/0013_auto_20200609_1729.py
new file mode 100644
index 0000000..c798288
--- /dev/null
+++ b/server/apps/system/migrations/0013_auto_20200609_1729.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.0.7 on 2020-06-09 09:29
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0012_auto_20200609_1716'),
+ ]
+
+ operations = [
+ migrations.AlterUniqueTogether(
+ name='dict',
+ unique_together={('name', 'code', 'parent')},
+ ),
+ ]
diff --git a/server/apps/system/migrations/0014_auto_20200609_1738.py b/server/apps/system/migrations/0014_auto_20200609_1738.py
new file mode 100644
index 0000000..c53338a
--- /dev/null
+++ b/server/apps/system/migrations/0014_auto_20200609_1738.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.0.7 on 2020-06-09 09:38
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0013_auto_20200609_1729'),
+ ]
+
+ operations = [
+ migrations.AlterUniqueTogether(
+ name='dict',
+ unique_together={('name', 'code', 'type')},
+ ),
+ ]
diff --git a/server/apps/system/migrations/0015_auto_20200609_1749.py b/server/apps/system/migrations/0015_auto_20200609_1749.py
new file mode 100644
index 0000000..7ec9a81
--- /dev/null
+++ b/server/apps/system/migrations/0015_auto_20200609_1749.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.0.7 on 2020-06-09 09:49
+
+import django.contrib.postgres.fields.jsonb
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0014_auto_20200609_1738'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='dict',
+ name='other',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='其它信息'),
+ ),
+ migrations.AddField(
+ model_name='historicaldict',
+ name='other',
+ field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='其它信息'),
+ ),
+ ]
diff --git a/server/apps/system/migrations/0016_auto_20200610_1009.py b/server/apps/system/migrations/0016_auto_20200610_1009.py
new file mode 100644
index 0000000..8c3c40f
--- /dev/null
+++ b/server/apps/system/migrations/0016_auto_20200610_1009.py
@@ -0,0 +1,21 @@
+# Generated by Django 3.0.7 on 2020-06-10 02:09
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0015_auto_20200609_1749'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='dict',
+ name='enabled',
+ ),
+ migrations.RemoveField(
+ model_name='historicaldict',
+ name='enabled',
+ ),
+ ]
diff --git a/server/apps/system/migrations/0017_auto_20200610_1437.py b/server/apps/system/migrations/0017_auto_20200610_1437.py
new file mode 100644
index 0000000..1c70ef0
--- /dev/null
+++ b/server/apps/system/migrations/0017_auto_20200610_1437.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-06-10 06:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0016_auto_20200610_1009'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='dict',
+ name='name',
+ field=models.CharField(max_length=1000, unique=True, verbose_name='名称'),
+ ),
+ migrations.AlterField(
+ model_name='historicaldict',
+ name='name',
+ field=models.CharField(db_index=True, max_length=1000, verbose_name='名称'),
+ ),
+ ]
diff --git a/server/apps/system/migrations/0018_auto_20200610_1457.py b/server/apps/system/migrations/0018_auto_20200610_1457.py
new file mode 100644
index 0000000..0cfe56c
--- /dev/null
+++ b/server/apps/system/migrations/0018_auto_20200610_1457.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.7 on 2020-06-10 06:57
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('system', '0017_auto_20200610_1437'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='dict',
+ name='name',
+ field=models.CharField(max_length=1000, verbose_name='名称'),
+ ),
+ migrations.AlterField(
+ model_name='historicaldict',
+ name='name',
+ field=models.CharField(max_length=1000, verbose_name='名称'),
+ ),
+ ]
diff --git a/server/apps/system/models.py b/server/apps/system/models.py
index 94ad81f..7641fb2 100644
--- a/server/apps/system/models.py
+++ b/server/apps/system/models.py
@@ -5,7 +5,7 @@ from django.db.models.query import QuerySet
from utils.model import SoftModel, BaseModel
from simple_history.models import HistoricalRecords
-
+from django.contrib.postgres.fields import JSONField
@@ -147,10 +147,10 @@ class Dict(SoftModel):
"""
数据字典
"""
- name = models.CharField('名称', max_length=30, unique=True)
+ name = models.CharField('名称', max_length=1000)
code = models.CharField('编号', max_length=30, null=True, blank=True)
description = models.TextField('描述', blank=True, null=True)
- enabled = models.BooleanField('是否有效', default=True)
+ other = JSONField('其它信息', blank=True, null=True)
type = models.ForeignKey(
DictType, on_delete=models.CASCADE, verbose_name='类型')
sort = models.IntegerField('排序', default=1)
@@ -161,6 +161,7 @@ class Dict(SoftModel):
class Meta:
verbose_name = '字典'
verbose_name_plural = verbose_name
+ unique_together = ('name', 'code', 'type')
def __str__(self):
return self.name
diff --git a/server/apps/system/views.py b/server/apps/system/views.py
index bdcdabb..077b179 100644
--- a/server/apps/system/views.py
+++ b/server/apps/system/views.py
@@ -46,11 +46,11 @@ class LogoutView(APIView):
return Response(status=status.HTTP_200_OK)
class TaskViewSet(ModelViewSet):
- queryset = PeriodicTask.objects.all()
+ queryset = PeriodicTask.objects
serializer_class = TaskSerializer
search_fields = ['^name']
filterset_fields = ['enabled']
- ordering = '-pk'
+ ordering = ['-pk']
@@ -60,12 +60,12 @@ class DictTypeViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'dicttype_create',
'put': 'dicttype_update', 'delete': 'dicttype_delete'}
- queryset = DictType.objects.all()
+ queryset = DictType.objects
serializer_class = DictTypeSerializer
pagination_class = None
- search_fields = ['^name']
- ordering_fields = ['id']
- ordering = 'id'
+ search_fields = ['name']
+ ordering_fields = ['pk']
+ ordering = ['pk']
class DictViewSet(ModelViewSet):
@@ -74,11 +74,21 @@ class DictViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'dict_create',
'put': 'dict_update', 'delete': 'dict_delete'}
- queryset = Dict.objects.all()
+ queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的
+ filterset_fields = ['type', 'is_deleted']
serializer_class = DictSerializer
search_fields = ['name']
- ordering_fields = ['id']
- ordering = 'id'
+ ordering_fields = ['sort']
+ ordering = ['is_deleted', 'sort']
+
+ def paginate_queryset(self, queryset):
+ """
+ 如果查询参数里有type,则不分页,否则请求分页
+ """
+ if (self.request.query_params.get('type', None)) or (self.paginator is None):
+ return None
+ return self.paginator.paginate_queryset(queryset, self.request, view=self)
+
class PositionViewSet(ModelViewSet):
@@ -87,12 +97,12 @@ class PositionViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'position_create',
'put': 'position_update', 'delete': 'position_delete'}
- queryset = Position.objects.all()
+ queryset = Position.objects
serializer_class = PositionSerializer
pagination_class = None
search_fields = ['name','description']
- ordering_fields = ['id']
- ordering = 'id'
+ ordering_fields = ['pk']
+ ordering = ['pk']
class TestView(APIView):
@@ -106,13 +116,12 @@ class PermissionViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'perm_create',
'put': 'perm_update', 'delete': 'perm_delete'}
- queryset = Position.objects.all()
- queryset = Permission.objects.all()
+ queryset = Permission.objects
serializer_class = PermissionSerializer
pagination_class = None
search_fields = ['name']
ordering_fields = ['sort']
- ordering = 'id'
+ ordering = ['pk']
class OrganizationViewSet(ModelViewSet):
@@ -121,12 +130,12 @@ class OrganizationViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'org_create',
'put': 'org_update', 'delete': 'org_delete'}
- queryset = Organization.objects.all()
+ queryset = Organization.objects
serializer_class = OrganizationSerializer
pagination_class = None
search_fields = ['name', 'method']
- ordering_fields = ['id']
- ordering = 'id'
+ ordering_fields = ['pk']
+ ordering = ['pk']
class RoleViewSet(ModelViewSet):
@@ -135,12 +144,12 @@ class RoleViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'role_create',
'put': 'role_update', 'delete': 'role_delete'}
- queryset = Role.objects.all()
+ queryset = Role.objects
serializer_class = RoleSerializer
pagination_class = None
search_fields = ['name']
- ordering_fields = ['id']
- ordering = 'id'
+ ordering_fields = ['pk']
+ ordering = ['pk']
class UserViewSet(ModelViewSet):
@@ -149,11 +158,11 @@ class UserViewSet(ModelViewSet):
"""
perms_map = {'get': '*', 'post': 'user_create',
'put': 'user_update', 'delete': 'user_delete'}
- queryset = User.objects.all().order_by('-id')
+ queryset = User.objects.order_by('-id')
serializer_class = UserListSerializer
filterset_class = UserFilter
search_fields = ['username', 'name', 'phone', 'email']
- ordering_fields = ['-id']
+ ordering_fields = ['-pk']
def get_queryset(self):
queryset = self.queryset
@@ -217,7 +226,7 @@ class UserViewSet(ModelViewSet):
'id': user.id,
'username': user.username,
'name': user.name,
- 'roles': user.roles.all().values_list('name', flat=True),
+ 'roles': user.roles.values_list('name', flat=True),
# 'avatar': request._request._current_scheme_host + '/media/' + str(user.image),
'avatar': user.avatar,
'perms': perms,
@@ -230,11 +239,11 @@ class FileViewSet(ModelViewSet):
"""
perms_map = None
parser_classes = [MultiPartParser, JSONParser]
- queryset = File.objects.all()
+ queryset = File.objects
serializer_class = FileSerializer
filterset_fields = ['type']
search_fields = ['name']
- ordering = '-create_time'
+ ordering = ['-create_time']
def perform_create(self, serializer):
fileobj = self.request.data.get('file')
diff --git a/server/utils/model.py b/server/utils/model.py
index f8ded06..ac0501c 100644
--- a/server/utils/model.py
+++ b/server/utils/model.py
@@ -33,14 +33,15 @@ class SoftDeletableManagerMixin(object):
'''
_queryset_class = SoftDeletableQuerySet
- def get_queryset(self):
+ def get_queryset(self, all=False):
'''
Return queryset limited to not deleted entries.
'''
kwargs = {'model': self.model, 'using': self._db}
if hasattr(self, '_hints'):
kwargs['hints'] = self._hints
-
+ if all:
+ return self._queryset_class(**kwargs)
return self._queryset_class(**kwargs).filter(is_deleted=False)