-文件管理——清理废弃文件功能

-文件管理——文件来源(导出、用户上传)
-菜单状态、部门状态 禁用后都要过滤掉
pull/3/MERGE
李强 2021-03-27 13:46:51 +08:00
parent e900deb2b4
commit da5bf8c468
23 changed files with 122 additions and 44 deletions

View File

@ -127,7 +127,7 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
return queryset.filter(dept_belong_id=user_dept_id)
# 3. 根据所有角色 获取所有权限范围
role_list = request.user.role.all().values('admin', 'dataScope')
role_list = request.user.role.filter(status='1').values('admin', 'dataScope')
dataScope_list = []
for ele in role_list:
# 3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则返回所有数据
@ -144,7 +144,7 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
dept_list = []
for ele in dataScope_list:
if ele == '2':
dept_list.extend(request.user.role.all().values_list('dept__id', flat=True))
dept_list.extend(request.user.role.filter(status='1').values_list('dept__id', flat=True))
elif ele == '3':
dept_list.append(user_dept_id)
elif ele == '4':

View File

@ -91,7 +91,7 @@ class DeptTreeSerializer(serializers.ModelSerializer):
class Meta:
model = Dept
fields = ('id', 'label', 'parentId')
fields = ('id', 'label', 'parentId','status')
# ================================================= #
@ -216,7 +216,7 @@ class UserProfileSerializer(CustomModelSerializer):
unread_msg_count = serializers.SerializerMethodField(read_only=True)
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
role_list = obj.role.filter(status='1').values_list('admin', flat=True)
if True in list(set(role_list)):
return True
return False
@ -261,7 +261,7 @@ class UserProfileCreateUpdateSerializer(CustomModelSerializer):
})
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
role_list = obj.role.filter(status='1').values_list('admin', flat=True)
if True in list(set(role_list)):
return True
return False

View File

@ -291,8 +291,8 @@ class UserProfileModelViewSet(CustomModelViewSet):
"""
userId = request.query_params.get('userId')
data = {
'posts': PostSimpleSerializer(Post.objects.all().order_by('postSort'), many=True).data,
'roles': RoleSimpleSerializer(Role.objects.all().order_by('roleSort'), many=True).data
'posts': PostSimpleSerializer(Post.objects.filter(status='1').order_by('postSort'), many=True).data,
'roles': RoleSimpleSerializer(Role.objects.filter(status='1').order_by('roleSort'), many=True).data
}
if userId:
instance = self.queryset.get(id=userId)

View File

@ -1,3 +1,4 @@
from django.core.cache import cache
from rest_framework import serializers
from .models import LoginInfor, OperationLog, CeleryLog
@ -79,6 +80,10 @@ class DictDetailsCreateUpdateSerializer(CustomModelSerializer):
字典详情 创建/更新时的列化器
"""
def save(self, **kwargs):
cache.delete('system_dict_details')
return super().save(**kwargs)
class Meta:
model = DictDetails
fields = '__all__'
@ -114,6 +119,10 @@ class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer):
参数设置 创建/更新时的列化器
"""
def save(self, **kwargs):
cache.delete('system_configKey')
return super().save(**kwargs)
class Meta:
model = ConfigSettings
fields = '__all__'

View File

@ -20,10 +20,14 @@ urlpatterns = [
re_path('config/configKey/(?P<pk>.*)/', ConfigSettingsModelViewSet.as_view({'get': 'get_config_key'})),
# 参数管理导出
re_path('config/export/', ConfigSettingsModelViewSet.as_view({'get': 'export'})),
# 清理参数缓存
re_path('config/clearCache/', ConfigSettingsModelViewSet.as_view({'delete': 'clearCache', })),
# 导出字典管理数据
re_path('dict/type/export/', DictDataModelViewSet.as_view({'get': 'export'})),
# 导出字典详情数据
re_path('dict/data/export/', DictDetailsModelViewSet.as_view({'get': 'export'})),
# 清理字典缓存
re_path('dict/type/clearCache/', DictDetailsModelViewSet.as_view({'delete': 'clearCache', })),
# 消息通知导出
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export', })),
# 用户个人消息列表
@ -44,5 +48,6 @@ urlpatterns = [
re_path('celery_log/export/', CeleryLogModelViewSet.as_view({'get': 'export', })),
# 清除废弃文件
re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })),
]
urlpatterns += router.urls

View File

@ -1,6 +1,7 @@
import os
from django.conf import settings
from django.core.cache import cache
from django.db.models import Q
from rest_framework.request import Request
@ -12,7 +13,7 @@ from ..system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFi
from ..system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from ..system.models import MessagePushUser
from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
DictDetailsCreateUpdateSerializer, ConfigSettingsSerializer, \
ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \
ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \
MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer, LoginInforSerializer, \
@ -78,11 +79,30 @@ class DictDetailsModelViewSet(CustomModelViewSet):
:param kwargs:
:return:
"""
queryset = self.queryset.filter(dict_data__dictType=kwargs.get('pk')).order_by('sort')
if hasattr(self, 'handle_logging'):
self.handle_logging(request, *args, **kwargs)
serializer = DictDetailsListSerializer(queryset, many=True)
return SuccessResponse(serializer.data)
dict_details_dic = cache.get('system_dict_details', {})
if not dict_details_dic:
queryset = self.filter_queryset(self.get_queryset())
queryset_dic = queryset.order_by('sort').values('dict_data__dictType', 'dictLabel', 'dictValue',
'is_default')
for ele in queryset_dic:
dictType = ele.pop('dict_data__dictType')
if dictType in dict_details_dic:
dict_details_dic[dictType].append(ele)
else:
dict_details_dic[dictType] = [ele]
cache.set('system_dict_details', dict_details_dic, 84600)
return SuccessResponse(dict_details_dic.get(kwargs.get('pk'), []))
def clearCache(self, request: Request, *args, **kwargs):
"""
清理键值缓存
:param request:
:param args:
:param kwargs:
:return:
"""
cache.delete('system_dict_details')
return SuccessResponse(msg='清理成功!')
def export(self, request: Request, *args, **kwargs):
"""
@ -122,10 +142,26 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
:param kwargs:
:return:
"""
queryset = self.queryset.filter(configKey=kwargs.get('pk')).first()
# if hasattr(self, 'handle_logging'):
# self.handle_logging(request, *args, **kwargs)
return SuccessResponse(msg=queryset.configValue if queryset else '')
config_key_dic = cache.get('system_configKey')
if not config_key_dic:
queryset = self.filter_queryset(self.get_queryset())
config_key_dic = {ele.get('configKey'): ele.get('configValue') for ele in
queryset.values('configValue', 'configKey')}
cache.set('system_configKey', config_key_dic, 84600)
return SuccessResponse(msg=config_key_dic.get(kwargs.get('pk'), ''))
def clearCache(self, request: Request, *args, **kwargs):
"""
清理键值缓存
:param request:
:param args:
:param kwargs:
:return:
"""
cache.delete('system_configKey')
return SuccessResponse(msg='清理成功!')
def export(self, request: Request, *args, **kwargs):
"""

View File

@ -182,7 +182,7 @@ def get_login_location(request, *args, **kwargs):
r = requests.get(apiurl)
content = r.content.decode('GBK')
location = str(content).replace('\r', '').replace('\n', '')[:64]
cache.set(request_ip, location, 8640)
cache.set(request_ip, location, 86400)
return location
except Exception as e:
pass

View File

@ -28,7 +28,7 @@ export function getDept(deptId) {
// 查询部门下拉树结构
export function treeselect() {
return request({
url: '/admin/permission/dept/treeselect/',
url: '/admin/permission/dept/treeselect/?status=1',
method: 'get'
})
}
@ -36,7 +36,7 @@ export function treeselect() {
// 根据角色ID查询部门树结构
export function roleDeptTreeselect(roleId) {
return request({
url: '/admin/permission/dept/roleDeptTreeselect/' + roleId + '/',
url: '/admin/permission/dept/roleDeptTreeselect/' + roleId + '/?status=1',
method: 'get'
})
}

View File

@ -20,7 +20,7 @@ export function getMenu(menuId) {
// 查询菜单下拉树结构
export function treeselect() {
return request({
url: '/admin/permission/menus/treeselect/',
url: '/admin/permission/menus/treeselect/?status=1',
method: 'get'
})
}
@ -28,7 +28,7 @@ export function treeselect() {
// 根据角色ID查询菜单下拉树结构
export function roleMenuTreeselect(roleId) {
return request({
url: '/admin/permission/menus/roleMenuTreeselect/' + roleId + '/',
url: '/admin/permission/menus/roleMenuTreeselect/' + roleId + '/?status=1',
method: 'get'
})
}

View File

@ -20,7 +20,7 @@ export function getConfig(configId) {
// 根据参数键名查询参数值
export function getConfigKey(configKey) {
return request({
url: '/admin/system/config/configKey/' + configKey + '/',
url: '/admin/system/config/configKey/' + configKey + '/?status=1',
method: 'get'
})
}

View File

@ -20,7 +20,7 @@ export function getData(dictCode) {
// 根据字典类型查询字典数据信息
export function getDicts(dictType) {
return request({
url: '/admin/system/dict/get/type/' + dictType + '/',
url: '/admin/system/dict/get/type/' + dictType + '/?status=1',
method: 'get'
})
}

View File

@ -23,6 +23,7 @@ import {
parseTime,
resetForm,
selectDictLabel,
selectDictDefault,
selectDictLabels
} from "@/utils/ruoyi";
import Pagination from "@/components/Pagination";
@ -40,6 +41,7 @@ Vue.prototype.parseTime = parseTime
Vue.prototype.resetForm = resetForm
Vue.prototype.addDateRange = addDateRange
Vue.prototype.selectDictLabel = selectDictLabel
Vue.prototype.selectDictDefault = selectDictDefault
Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.getCrontabData = getCrontabData
Vue.prototype.getIntervalData = getIntervalData

View File

@ -73,6 +73,20 @@ export function selectDictLabel(datas, value) {
})
return actions.join('');
}
// 获取字典默认值
export function selectDictDefault(datas) {
var actions = [];
Object.keys(datas).some((key) => {
if (datas[key].is_default === true) {
actions.push(datas[key].dictValue);
return true;
}
})
if (!actions[0] && datas[0]) {
actions.push(datas[0].dictValue)
}
return actions.join('');
}
// 回显数据字典字符串数组
export function selectDictLabels(datas, value, separator) {

View File

@ -253,7 +253,7 @@ export default {
leader: undefined,
phone: undefined,
email: undefined,
status: "0"
status: this.selectDictDefault(this.statusOptions),
};
this.resetForm("form");
},

View File

@ -401,16 +401,16 @@
name: undefined,
icon: undefined,
web_path: undefined,
menuType: "0",
menuType: this.selectDictDefault(this.menuTypeOptions),
orderNum: undefined,
component_path: undefined,
interface_path: undefined,
perms: undefined,
interface_method: 'GET',
interface_method: this.selectDictDefault(this.interfaceMethodOptions),
isFrame: "1",
isCache: "1",
visible: "1",
status: "1"
visible: this.selectDictDefault(this.visibleOptions),
status: this.selectDictDefault(this.statusOptions)
};
this.resetForm("form");
},

View File

@ -242,7 +242,7 @@ export default {
postCode: undefined,
postName: undefined,
postSort: 0,
status: "0",
status: this.selectDictDefault(this.statusOptions),
remark: undefined
};
this.resetForm("form");

View File

@ -440,7 +440,7 @@ export default {
roleName: undefined,
roleKey: undefined,
roleSort: 0,
status: "0",
status: this.selectDictDefault(this.statusOptions),
menu: [],
dept: [],
menuCheckStrictly: true,

View File

@ -543,7 +543,7 @@
password: undefined,
mobile: undefined,
email: undefined,
gender: undefined,
gender: this.selectDictDefault(this.sexOptions),
is_active: false,
remark: undefined,
postIds: [],

View File

@ -275,8 +275,8 @@ export default {
configName: undefined,
configKey: undefined,
configValue: undefined,
configType: "Y",
status: '0',
configType: this.selectDictDefault(this.typeOptions),
status: this.selectDictDefault(this.statusOptions),
remark: undefined
};
this.resetForm("form");

View File

@ -79,6 +79,16 @@
v-hasPermi="['system:dict:type:export:get']"
>导出</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-refresh"
size="mini"
@click="handleClearCache"
v-hasPermi="['system:dict:type:clearcache:delete']"
>清理缓存</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@ -181,7 +191,7 @@
<script>
import {addData, delData, exportData, getData, listData, updateData} from "@/api/vadmin/system/dict/data";
import {getType, listType} from "@/api/vadmin/system/dict/type";
import {getType, listType, clearCache} from "@/api/vadmin/system/dict/type";
export default {
name: "Data",
@ -237,7 +247,6 @@
},
created() {
const dictId = this.$route.params && this.$route.params.dictId;
console.log(11111,this.$route.params)
this.getType(dictId);
this.getTypeList();
this.getDicts("sys_normal_disable").then(response => {
@ -263,7 +272,6 @@
getList() {
this.loading = true;
listData(this.queryParams).then(response => {
console.log(1212,response.data.count)
this.dataList = response.data.results;
this.total = response.data.count;
this.loading = false;
@ -285,7 +293,7 @@
dictLabel: undefined,
dictValue: undefined,
sort: 0,
status: "0",
status: this.selectDictDefault(this.typeOptions),
remark: undefined
};
this.resetForm("form");
@ -379,6 +387,12 @@
}).then(response => {
this.download(response.data.file_url,response.data.name);
})
},
/** 清理缓存按钮操作 */
handleClearCache() {
clearCache().then(response => {
this.msgSuccess("清理成功");
});
}
}
};

View File

@ -274,7 +274,7 @@ export default {
id: undefined,
dictName: undefined,
dictType: undefined,
status: "0",
status: this.selectDictDefault(this.statusOptions),
remark: undefined
};
this.resetForm("form");

View File

@ -232,9 +232,7 @@
open: false,
//
MessagePushTypeOptions: [],
//
StatusOptions: [],
//
//
MessagePushStatusOptions: [],
//
queryParams: {
@ -307,8 +305,8 @@
content: undefined,
to_path: undefined,
is_reviewed: true,
message_type: "1",
status: '1',
message_type: this.selectDictDefault(this.MessagePushStatusOptions),
status: this.selectDictDefault(this.MessagePushStatusOptions),
};
this.resetForm("form");
},

View File

@ -266,9 +266,9 @@ export default {
this.form = {
noticeId: undefined,
noticeTitle: undefined,
noticeType: undefined,
noticeType: this.selectDictDefault(this.typeOptions),
noticeContent: undefined,
status: "0"
status: this.selectDictDefault(this.statusOptions)
};
this.resetForm("form");
},