This commit is contained in:
caoqianming 2021-02-19 14:50:20 +08:00
commit 24b3874c56
11 changed files with 265 additions and 47 deletions

View File

@ -0,0 +1,11 @@
import request from '@/utils/request'
export function getRecord(query) {
return request({
url: '/ability/queryrecord/',
method: 'get',
params: query
})
}

View File

@ -132,6 +132,12 @@ export const asyncRoutes = [
component: () => import('@/views/system/role'),
meta: { title: '角色管理', icon: 'lock', perms: ['role_manage'] }
},
{
path: 'queryrecord',
name: 'queryrecord',
component: () => import('@/views/ability/queryrecord'),
meta: { title: '查询日志', icon: 'table', perms: ['queryrecord_view'] }
},
{
path: 'position',
name: 'Postion',

View File

@ -97,10 +97,28 @@ const actions = {
const { data } = response
if (!data) {
reject('验证失败,重新登录.')
}
const { perms, name, avatar } = data
getInfo(state.token).then(response => {
const { data } = response
if (!data) {
reject('验证失败,重新登录.')
}
const { perms, name, avatar } = data
// perms must be a non-empty array
if (!perms || perms.length <= 0) {
reject('没有任何权限!')
}
commit('SET_PERMS', perms)
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
resolve(data)
}).catch(error => {
reject(error)})
}else{
const { perms, name, avatar } = data
// perms must be a non-empty array
if (!perms || perms.length <= 0) {
@ -111,26 +129,11 @@ const actions = {
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
resolve(data)
}
}).catch(error => {
getInfo(state.token).then(response => {
const { data } = response
if (!data) {
reject('验证失败,重新登录.')
}
const { perms, name, avatar } = data
// perms must be a non-empty array
if (!perms || perms.length <= 0) {
reject('没有任何权限!')
}
commit('SET_PERMS', perms)
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
resolve(data)
}).catch(e=>{})
reject(error)
})
})
},

View File

@ -0,0 +1,108 @@
<template>
<div class="app-container">
<div>
<el-input
v-model="listQuery.search"
placeholder="用户名"
style="width: 400px;"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button
class="filter-item"
type="primary"
icon="el-icon-search"
@click="handleFilter"
>搜索</el-button>
<el-button
class="filter-item"
style="margin-left: 10px;"
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
<el-table
v-loading="listLoading"
:data="tableData.results"
style="width: 100%;margin-top:10px;"
border
fit
stripe
highlight-current-row
max-height="600"
>
<el-table-column label="访问时间">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="用户">
<template slot-scope="scope" v-if="scope.row.user_">{{ scope.row.user_.name }}</template>
</el-table-column>
<el-table-column label="部门">
<template slot-scope="scope" v-if="scope.row.user_">{{ scope.row.user_.dept }}</template>
</el-table-column>
<el-table-column label="访问地址">
<template slot-scope="scope">{{ scope.row.path }}</template>
</el-table-column>
<el-table-column label="ip地址">
<template slot-scope="scope">{{ scope.row.ip }}</template>
</el-table-column>
<el-table-column label="查询字符">
<template slot-scope="scope">{{ scope.row.search }}</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
</div>
</template>
<script>
import { getRecord } from "@/api/queryrecord"
import Pagination from "@/components/Pagination"
export default {
components: { Pagination },
data() {
return {
tableData: {count:0},
listLoading: true,
listQuery: {
page: 1,
page_size: 20
},
};
},
created() {
this.getList();
},
methods: {
getList() {
this.listLoading = true;
getRecord(this.listQuery).then(response => {
if (response.data) {
this.tableData = response.data
}
this.listLoading = false;
});
},
resetFilter() {
this.listQuery = {
page: 1,
page_size: 20
};
this.getList();
},
handleFilter() {
this.listQuery.page = 1;
this.getList();
},
}
};
</script>

View File

@ -0,0 +1,37 @@
# Generated by Django 3.0.11 on 2020-12-31 07:59
from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('ability', '0017_auto_20201230_1626'),
]
operations = [
migrations.CreateModel(
name='QueryRecord',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('path', models.CharField(max_length=200, verbose_name='访问地址')),
('ip', models.CharField(max_length=200, verbose_name='IP地址')),
('method', models.CharField(default='GET', max_length=100, verbose_name='方法')),
('query', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True)),
('search', models.TextField(blank=True, null=True, verbose_name='搜索字符')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='record_user', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': '查询记录',
'verbose_name_plural': '查询记录',
},
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.0.11 on 2021-01-29 01:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ability', '0018_queryrecord'),
]
operations = [
migrations.AlterField(
model_name='queryrecord',
name='ip',
field=models.CharField(blank=True, max_length=200, null=True, verbose_name='IP地址'),
),
]

View File

@ -3,14 +3,20 @@ from django.db import models
from django.db.models.fields import related
from utils.model import BaseModel
from apps.system.models import Organization, User
# Create your models here.
from django.contrib.postgres.fields import JSONField
# class GetRecord(BaseModel):
# user = models.ForeignKey(User, related_name='record_user', on_delete=models.CASCADE)
# path = models.CharField('访问地址', max_length=100)
# ip = models.CharField('IP地址', max_length=100)
# method = models.CharField('方法', max_length=100, default='GET')
class QueryRecord(BaseModel):
user = models.ForeignKey(User, related_name='record_user', on_delete=models.CASCADE)
path = models.CharField('访问地址', max_length=200)
ip = models.CharField('IP地址', max_length=200, null=True, blank=True)
method = models.CharField('方法', max_length=100, default='GET')
query = JSONField(null=True,blank=True)
search = models.TextField('搜索字符', null=True, blank=True)
class Meta:
verbose_name = '查询记录'
verbose_name_plural = verbose_name
class CMA(BaseModel):

View File

@ -2,6 +2,23 @@ from rest_framework import serializers
from .models import *
from apps.system.serializers import OrganizationSerializer
class QueryRecordSerializer(serializers.ModelSerializer):
user_ = serializers.SerializerMethodField()
class Meta:
model = QueryRecord
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('user')
return queryset
def get_user_(self, obj):
data = {'name':'', 'dept':''}
data['name'] = obj.user.name if obj.user.name else obj.user.username
data['dept'] = obj.user.dept.name if obj.user.dept else ""
return data
class CMASerializer(serializers.ModelSerializer):
"""

View File

@ -1,6 +1,6 @@
from django.urls import path, include
from rest_framework import routers
from .views import CMAViewSet, CNASViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet
from .views import CMAViewSet, CNASViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet, QueryRecordListViewSet
router = routers.DefaultRouter()
router.register('cma', CMAViewSet, basename="cma")
@ -8,6 +8,7 @@ router.register('cnas', CNASViewSet, basename="cnas")
router.register('qualification', QualificationViewSet, basename="qualification")
router.register('qualificationother', QualificationotherViewSet, basename="qualificationother")
router.register('inspection', InspectionViewSet, basename="inspection")
router.register('queryrecord', QueryRecordListViewSet, basename="queryrecord")
urlpatterns = [
path('', include(router.urls))
]

View File

@ -1,5 +1,6 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from .models import *
from .serializers import *
from rest_framework.decorators import action
@ -25,14 +26,22 @@ class RecordMixin():
`request.user` or `request.auth` is accessed.
"""
user = request.user
# if request.method == 'GET':
# print(json.dumps(request.query_params), request.method, request.path)
if request.method == 'GET':
QueryRecord.objects.create(user=user,path=request.path,ip=request.META.get('HTTP_X_FORWARDED_FOR'),method=\
request.method,search=request.query_params.get('search',None),query=request.query_params)
class QueryRecordListViewSet(ListModelMixin, GenericViewSet):
perms_map = {'get': 'queryrecord_view'}
queryset = QueryRecord.objects.all()
serializer_class = QueryRecordSerializer
search_fields = ['user__name', 'user__dept__name']
ordering = ['-create_time']
class CMAViewSet(RecordMixin, ModelViewSet):
"""
CMA检测能力增删改查
"""
perms_map = {'get': '*', 'post': 'cma_create',
perms_map = {'get': 'cma_view', 'post': 'cma_create',
'put': 'cma_update', 'delete': 'cma_delete'}
queryset = CMA.objects.all()
serializer_class = CMASerializer
@ -136,11 +145,11 @@ class CMAViewSet(RecordMixin, ModelViewSet):
return Response(status = status.HTTP_200_OK)
from django.db.models.query import QuerySet
class QualificationViewSet(ModelViewSet):
class QualificationViewSet(RecordMixin, ModelViewSet):
"""
资质能力增删改查
"""
perms_map = {'get': '*', 'post': 'qualificaiton_create',
perms_map = {'get': 'qualification_view', 'post': 'qualificaiton_create',
'put': 'qualification_update', 'delete': 'qualification_delete'}
queryset = Qualification.objects.all()
serializer_class = QualificationSerializer
@ -187,11 +196,11 @@ class QualificationViewSet(ModelViewSet):
return Response(status = status.HTTP_200_OK)
else:
return Response('不支持非xlsx格式', status = status.HTTP_400_BAD_REQUEST)
class QualificationotherViewSet(PageOrNot,ModelViewSet):
class QualificationotherViewSet(RecordMixin, PageOrNot,ModelViewSet):
"""
资质能力增删改查
"""
perms_map = {'get': '*', 'post': 'qualificationother_create',
perms_map = {'get': 'qualification_view', 'post': 'qualificationother_create',
'put': 'qualificationother_update', 'delete': 'qualificationother_delete'}
queryset = Qualificationother.objects.all()
serializer_class = QualificationotherSerializer
@ -220,11 +229,11 @@ class QualificationotherViewSet(PageOrNot,ModelViewSet):
ret.append({'text':i[group_by]+'('+ str(i['count']) +')','value':i[group_by]})
return Response(ret)
class InspectionViewSet(ModelViewSet):
class InspectionViewSet(RecordMixin, ModelViewSet):
"""
检验能力增删改查
"""
perms_map = {'get': '*', 'post': 'inspection_create',
perms_map = {'get': 'inspection_view', 'post': 'inspection_create',
'put': 'inspection_update', 'delete': 'inspection_delete'}
queryset = Inspection.objects.all()
serializer_class = InspectionSerializer
@ -292,11 +301,11 @@ class InspectionViewSet(ModelViewSet):
return Response(status = status.HTTP_200_OK)
class CNASViewSet(ModelViewSet):
class CNASViewSet(RecordMixin, ModelViewSet):
"""
CNAS检测能力增删改查
"""
perms_map = {'get': '*', 'post': 'cnas_create',
perms_map = {'get': 'cma_view', 'post': 'cnas_create',
'put': 'cnas_update', 'delete': 'cnas_delete'}
queryset = CNAS.objects.all()
serializer_class = CNASSerializer
@ -347,7 +356,6 @@ class CNASViewSet(ModelViewSet):
os.chdir(fulldir)
CNAS.objects.all().delete()
with zipfile.ZipFile(fullpath,'r') as zzz:
print(zzz)
zzz.extractall(fulldir)
for root, dirs, files in os.walk(fulldir):
for f in files:
@ -437,7 +445,6 @@ def import_cnas(filename, path):
data['sszx'] = sszx
datalist.append(CNAS(**data))
i = i + 1
print(i,data)
CNAS.objects.bulk_create(datalist)
def import_cma2(filename, path):

View File

@ -1,8 +1,12 @@
from .settings import *
DEBUG = False
DEBUG = True
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'cma',
'USER': 'cma',
'PASSWORD': 'cma123',
'HOST': '172.16.80.102',
'PORT': '5432',
}
}