admin perm

This commit is contained in:
caoqianming 2020-08-23 22:21:55 +08:00
parent 598d7ae998
commit 2715e99450
9 changed files with 271 additions and 13 deletions

View File

@ -3,7 +3,14 @@
<router-view />
</div>
</template>
<style >
.el-table td, .el-table th {
padding: 6px
}
.el-dialog__body {
padding: 16px 12px;
}
</style>
<script>
export default {
name: 'App'

View File

@ -21,6 +21,15 @@ export function updateCompany(id, data) {
data
})
}
export function transferCompany(id, data) {
return request({
url: `/crm/company/${id}/transfer/`,
method: 'put',
data
})
}
export function deleteCompany(id) {
return request({
url: `/crm/company/${id}/`,

View File

@ -13,7 +13,11 @@
/>
</div>
</template>
<style scoped>
.pagination-container[data-v-72233bcd] {
padding: 2px 2px;
}
</style>
<script>
import { scrollTo } from '@/utils/scroll-to'

View File

@ -108,7 +108,7 @@ export const asyncRoutes = [
path: 'company',
name: 'Company',
component: () => import('@/views/crm/company.vue'),
meta: { title: '客户企业', icon: '', perms: ['company_manage'] }
meta: { title: '客户企业', icon: '', perms: ['company_view'] }
},
{
path: 'consumer',

View File

@ -8,7 +8,7 @@
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button type="primary" @click="handleAdd" icon="el-icon-plus">新增</el-button>
<el-button type="primary" @click="handleAdd" icon="el-icon-plus" v-if ="checkPermission(['company_create'])">新增</el-button>
<el-button
class="filter-item"
type="primary"
@ -38,8 +38,14 @@
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column label="所属">
<template slot-scope="scope">
<span>{{ scope.row.create_admin_name }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button-group>
<el-button
type="primary"
size="small"
@ -54,6 +60,13 @@
icon="el-icon-delete"
:disabled="!checkPermission(['company_delete'])"
></el-button>
<el-button
v-if="checkPermission(['company_transfer'])"
type="primary"
size="small"
@click="transfer(scope)"
>移交</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
@ -79,7 +92,7 @@
</template>
<script>
import { getCompanyList, createCompany, deleteCompany, updateCompany } from "@/api/crm";
import { getCompanyList, createCompany, deleteCompany, updateCompany, transferCompany } from "@/api/crm";
import { deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"
@ -209,7 +222,21 @@ export default {
return false;
}
});
}
},
transfer(scope) {
this.$prompt('请输入管理员账号以确认将('+scope.row.name + ')及其学员转交给他', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
// inputPattern: /[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?/,
// inputErrorMessage: ''
}).then(({ value }) => {
transferCompany(scope.row.id, {'admin':value}).then(res=>{
this.$message.success('转交成功!')
this.getList()
})
}).catch(() => {
});
}
}
};
</script>

View File

@ -0,0 +1,147 @@
<template>
<div >
<div >
<el-input
v-model="listQuery.search"
placeholder="输入名称进行搜索"
style="width: 200px;"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
<el-button
class="filter-item"
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
<el-table
:data="tableData.results"
style="width: 100%;margin-top:10px;"
border
fit
v-loading="listLoading"
highlight-current-row
max-height="600"
row-key="id"
default-expand-all
:tree-props="{children: 'children', hasChildren: 'hasChildren'}"
@row-dblclick="handleChose2"
>
<el-table-column type="index" width="50"></el-table-column>
<el-table-column label="单位名称">
<template slot-scope="scope">{{ scope.row.name }}</template>
</el-table-column>
<el-table-column label="创建日期">
<template slot-scope="scope">
<span>{{ scope.row.create_time }}</span>
</template>
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button
type="primary"
size="small"
@click="handleChose(scope)"
>选择</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.limit"
@pagination="getList"
/>
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'编辑单位':'新增单位'" >
<el-form :model="company" label-width="80px" label-position="right" :rules="rule1" ref="companyForm">
<el-form-item label="名称" prop="name">
<el-input v-model="company.name" placeholder="名称" />
</el-form-item>
</el-form>
<div style="text-align:right;">
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
<el-button type="primary" @click="confirmCompany('companyForm')">确认</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { getCompanyList, createCompany, deleteCompany, updateCompany } from "@/api/crm";
import { deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
import Pagination from "@/components/Pagination"
const defaultCompany = {
id: "",
name: "",
};
const listQuery = {
page: 1,
limit: 10,
search: "",
perm:'all'
}
export default {
name:'Companychoose',
components: { Pagination },
data() {
return {
company: {
id: "",
name: "",
},
listQuery:listQuery,
tableData: {count:0},
listLoading: true,
dialogVisible: false,
dialogType: "new",
rule1: {
name: [{ required: true, message: "请输入名称", trigger: "blur" }],
// pid: [{ required: true, message: "", trigger: "change" }]
// password: [
// { required: true, message: "", trigger: "change" }
// ],
},
};
},
computed: {},
created() {
this.getList();
},
methods: {
checkPermission,
getList() {
this.listLoading = true
getCompanyList(this.listQuery).then(response => {
this.tableData = response.data
this.listLoading = false
});
},
resetFilter() {
this.listQuery = {
page: 1,
limit: 10,
search: "",
perm:'all'
};
this.getList();
},
handleFilter() {
this.listQuery.page = 1;
this.getList();
},
handleChose(scope) {
this.$emit('handleChose',scope.row);
},
handleChose2(row, column, event){
this.$emit('handleChose',row);
}
}
};
</script>

View File

@ -228,14 +228,25 @@
<el-input v-model="consumer.username" placeholder="手机号" />
</el-form-item>
<el-form-item label="单位" prop="company">
<el-select
<el-input
placeholder="单位"
v-model="consumer.company_.name"
readonly
>
<el-button slot="append" icon="el-icon-search" @click="choose()"></el-button>
</el-input>
<!-- <el-select
v-model="consumer.company"
placeholder="单位"
style="width:100%"
clearable
filterable
remote
:loading="treeLoding"
:remote-method="searchCompany"
loading-text
no-match-text
>
<el-option
v-for="item in companyData"
@ -243,7 +254,7 @@
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-select> -->
</el-form-item>
<el-form-item label="缴费学科" prop="subjects">
<el-select v-model="consumer.subjects" placeholder="缴费学科" style="width:100%" multiple>
@ -281,6 +292,15 @@
<el-button type="primary" @click="confirmUser('consumerForm')">确认</el-button>
</div>
</el-dialog>
<el-dialog
title="选择企业"
:visible.sync="dgVisiable"
:close-on-click-modal="false"
width="80%"
:append-to-body="true"
>
<Companychose ref="Companychose" @handleChose="chooseComplete"></Companychose>
</el-dialog>
</div>
</template>
@ -305,12 +325,14 @@ import { upUrl } from "@/api/file";
import { getUserList } from "@/api/user"
import { getToken } from "@/utils/auth";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
import Companychose from "@/views/crm/companychose"
const defaultConsumer = {
id: "",
name: "",
username: "",
company: null,
company_:{},
subjects: [],
workscope: null,
role:3
@ -321,7 +343,7 @@ const listQuery = {
search: ""
};
export default {
components: { Pagination },
components: { Pagination, Companychose },
watch: {
filterOrgText(val) {
this.$refs.tree.filter(val);
@ -329,6 +351,7 @@ export default {
},
data() {
return {
dgVisiable:false,
tableKey: 0,
showCreate: true,
upUrl: upUrl(),
@ -470,7 +493,7 @@ export default {
},
searchCompany(val) {
this.treeLoding = true;
getCompanyList({search:val}).then(response => {
getCompanyList({search:val, perm:'all'}).then(response => {
this.companyData = genTree(response.data.results);
this.treeLoding = false;
});
@ -512,6 +535,9 @@ export default {
},
handleEdit(scope) {
this.consumer = Object.assign({}, scope.row); // copy obj
if(this.consumer.company_ == null){
this.consumer.company_ = {}
}
this.dialogType = "edit";
this.dialogVisible = true;
this.$nextTick(() => {
@ -659,7 +685,18 @@ export default {
this.adminOptions = genTree(res.data.results)
})
}
}
},
choose() {
this.dgVisiable = true;
},
chooseComplete(val) {
this.dgVisiable = false;
if (val) {
this.consumer.company_ = val
this.consumer.company = val.id
}
},
}
};
</script>

View File

@ -21,6 +21,7 @@ class CompanySerializer(serializers.ModelSerializer):
"""
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
create_admin_name = serializers.StringRelatedField(source='create_admin', read_only=True)
class Meta:
model = Company
fields = '__all__'
@ -33,6 +34,7 @@ class ConsumerSerializer(serializers.ModelSerializer):
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
company_name = serializers.StringRelatedField(source='company', read_only=True)
company_ = CompanySerializer(source='company', read_only=True)
subjects_name = serializers.StringRelatedField(source='subjects', many=True, read_only=True)
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
role_name = serializers.StringRelatedField(source='role', read_only=True)

View File

@ -32,6 +32,7 @@ from .models import Company, Consumer, PaySubject, SendCode, ConsumerPerm, Consu
from .serializers import CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer
import requests
from lxml import etree
from rbac.models import UserProfile
appid = 'wxf1e9471c93f05ad6'
secret = '4bf7f9bd6c52634586bbe792a1f0a834'
@ -95,7 +96,7 @@ class CompanyViewSet(ModelViewSet):
客户企业增删改查
"""
perms_map = [
{'get': 'company_list'}, {'post': 'company_create'},
{'get': 'company_view'}, {'post': 'company_create'},
{'put': 'company_update'}, {'delete': 'company_delete'}]
queryset = Company.objects.filter(is_delete=0).all()
serializer_class = CompanySerializer
@ -105,12 +106,36 @@ class CompanyViewSet(ModelViewSet):
ordering_fields = ('id',)
ordering = ['-id']
def get_queryset(self):
queryset = self.queryset
if self.request.query_params.get('perm', None):
return queryset
if not self.request.user.is_superuser:
queryset = queryset.filter(create_admin = self.request.user)
return queryset
@action(methods=['put'], detail=True, url_name='company_transfer',perms_map=[{'*':'company_transfer'}])
def transfer(self, request, *args, **kwargs):
"""
转交
"""
obj = self.get_object()
adminname = request.data.get('admin', None)
if adminname and UserProfile.objects.filter(username=adminname).exists():
adminobj = UserProfile.objects.get(username=adminname)
obj.create_admin = adminobj
obj.save()
Consumer.objects.filter(company=obj).update(create_admin=adminobj)
return Response(status=status.HTTP_200_OK)
else:
return Response({"error":"账号错误"})
class ConsumerViewSet(ModelViewSet):
"""
学员增删改查
"""
perms_map = [
{'get': 'consumer_list'}, {'post': 'consumer_create'},
{'get': 'consumer_view'}, {'post': 'consumer_create'},
{'put': 'consumer_update'}, {'delete': 'consumer_delete'}]
queryset = Consumer.objects.all()
serializer_class = ConsumerSerializer