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

-文件管理——文件来源(导出、用户上传)
-菜单状态、部门状态 禁用后都要过滤掉
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) return queryset.filter(dept_belong_id=user_dept_id)
# 3. 根据所有角色 获取所有权限范围 # 3. 根据所有角色 获取所有权限范围
role_list = request.user.role.all().values('admin', 'dataScope') role_list = request.user.role.filter(status='1').values('admin', 'dataScope')
dataScope_list = [] dataScope_list = []
for ele in role_list: for ele in role_list:
# 3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则返回所有数据 # 3.1 判断用户是否为超级管理员角色/如果有1(所有数据) 则返回所有数据
@ -144,7 +144,7 @@ class DataLevelPermissionsFilter(BaseFilterBackend):
dept_list = [] dept_list = []
for ele in dataScope_list: for ele in dataScope_list:
if ele == '2': 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': elif ele == '3':
dept_list.append(user_dept_id) dept_list.append(user_dept_id)
elif ele == '4': elif ele == '4':

View File

@ -91,7 +91,7 @@ class DeptTreeSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Dept 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) unread_msg_count = serializers.SerializerMethodField(read_only=True)
def get_admin(self, obj: UserProfile): 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)): if True in list(set(role_list)):
return True return True
return False return False
@ -261,7 +261,7 @@ class UserProfileCreateUpdateSerializer(CustomModelSerializer):
}) })
def get_admin(self, obj: UserProfile): 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)): if True in list(set(role_list)):
return True return True
return False return False

View File

@ -291,8 +291,8 @@ class UserProfileModelViewSet(CustomModelViewSet):
""" """
userId = request.query_params.get('userId') userId = request.query_params.get('userId')
data = { data = {
'posts': PostSimpleSerializer(Post.objects.all().order_by('postSort'), many=True).data, 'posts': PostSimpleSerializer(Post.objects.filter(status='1').order_by('postSort'), many=True).data,
'roles': RoleSimpleSerializer(Role.objects.all().order_by('roleSort'), many=True).data 'roles': RoleSimpleSerializer(Role.objects.filter(status='1').order_by('roleSort'), many=True).data
} }
if userId: if userId:
instance = self.queryset.get(id=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 rest_framework import serializers
from .models import LoginInfor, OperationLog, CeleryLog 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: class Meta:
model = DictDetails model = DictDetails
fields = '__all__' fields = '__all__'
@ -114,6 +119,10 @@ class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer):
参数设置 创建/更新时的列化器 参数设置 创建/更新时的列化器
""" """
def save(self, **kwargs):
cache.delete('system_configKey')
return super().save(**kwargs)
class Meta: class Meta:
model = ConfigSettings model = ConfigSettings
fields = '__all__' 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/configKey/(?P<pk>.*)/', ConfigSettingsModelViewSet.as_view({'get': 'get_config_key'})),
# 参数管理导出 # 参数管理导出
re_path('config/export/', ConfigSettingsModelViewSet.as_view({'get': 'export'})), 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/type/export/', DictDataModelViewSet.as_view({'get': 'export'})),
# 导出字典详情数据 # 导出字典详情数据
re_path('dict/data/export/', DictDetailsModelViewSet.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', })), 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('celery_log/export/', CeleryLogModelViewSet.as_view({'get': 'export', })),
# 清除废弃文件 # 清除废弃文件
re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })), re_path('clearsavefile/', SaveFileModelViewSet.as_view({'post': 'clearsavefile', })),
] ]
urlpatterns += router.urls urlpatterns += router.urls

View File

@ -1,6 +1,7 @@
import os import os
from django.conf import settings from django.conf import settings
from django.core.cache import cache
from django.db.models import Q from django.db.models import Q
from rest_framework.request import Request 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 DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from ..system.models import MessagePushUser from ..system.models import MessagePushUser
from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \ from ..system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \ DictDetailsCreateUpdateSerializer, ConfigSettingsSerializer, \
ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \ ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \
ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \ ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \
MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer, LoginInforSerializer, \ MessagePushSerializer, MessagePushCreateUpdateSerializer, ExportMessagePushSerializer, LoginInforSerializer, \
@ -78,11 +79,30 @@ class DictDetailsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
queryset = self.queryset.filter(dict_data__dictType=kwargs.get('pk')).order_by('sort') dict_details_dic = cache.get('system_dict_details', {})
if hasattr(self, 'handle_logging'): if not dict_details_dic:
self.handle_logging(request, *args, **kwargs) queryset = self.filter_queryset(self.get_queryset())
serializer = DictDetailsListSerializer(queryset, many=True) queryset_dic = queryset.order_by('sort').values('dict_data__dictType', 'dictLabel', 'dictValue',
return SuccessResponse(serializer.data) '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): def export(self, request: Request, *args, **kwargs):
""" """
@ -122,10 +142,26 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
:param kwargs: :param kwargs:
:return: :return:
""" """
queryset = self.queryset.filter(configKey=kwargs.get('pk')).first()
# if hasattr(self, 'handle_logging'): # if hasattr(self, 'handle_logging'):
# self.handle_logging(request, *args, **kwargs) # 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): def export(self, request: Request, *args, **kwargs):
""" """

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -73,6 +73,20 @@ export function selectDictLabel(datas, value) {
}) })
return actions.join(''); 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) { export function selectDictLabels(datas, value, separator) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -79,6 +79,16 @@
v-hasPermi="['system:dict:type:export:get']" v-hasPermi="['system:dict:type:export:get']"
>导出</el-button> >导出</el-button>
</el-col> </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> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row> </el-row>
@ -181,7 +191,7 @@
<script> <script>
import {addData, delData, exportData, getData, listData, updateData} from "@/api/vadmin/system/dict/data"; 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 { export default {
name: "Data", name: "Data",
@ -237,7 +247,6 @@
}, },
created() { created() {
const dictId = this.$route.params && this.$route.params.dictId; const dictId = this.$route.params && this.$route.params.dictId;
console.log(11111,this.$route.params)
this.getType(dictId); this.getType(dictId);
this.getTypeList(); this.getTypeList();
this.getDicts("sys_normal_disable").then(response => { this.getDicts("sys_normal_disable").then(response => {
@ -263,7 +272,6 @@
getList() { getList() {
this.loading = true; this.loading = true;
listData(this.queryParams).then(response => { listData(this.queryParams).then(response => {
console.log(1212,response.data.count)
this.dataList = response.data.results; this.dataList = response.data.results;
this.total = response.data.count; this.total = response.data.count;
this.loading = false; this.loading = false;
@ -285,7 +293,7 @@
dictLabel: undefined, dictLabel: undefined,
dictValue: undefined, dictValue: undefined,
sort: 0, sort: 0,
status: "0", status: this.selectDictDefault(this.typeOptions),
remark: undefined remark: undefined
}; };
this.resetForm("form"); this.resetForm("form");
@ -379,6 +387,12 @@
}).then(response => { }).then(response => {
this.download(response.data.file_url,response.data.name); 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, id: undefined,
dictName: undefined, dictName: undefined,
dictType: undefined, dictType: undefined,
status: "0", status: this.selectDictDefault(this.statusOptions),
remark: undefined remark: undefined
}; };
this.resetForm("form"); this.resetForm("form");

View File

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

View File

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