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 @@
字典详情
- 新增 +
+ 新增 +
+ + + - - + +

点击左侧类型查看字典

- + /> --> @@ -122,11 +128,21 @@ + + + + - + - + + + + + 有效 + 无效 +
@@ -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)