test mini conflict
This commit is contained in:
commit
acff3881cc
|
@ -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'
|
||||
|
|
|
@ -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}/`,
|
||||
|
|
|
@ -13,7 +13,11 @@
|
|||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.pagination-container[data-v-72233bcd] {
|
||||
padding: 2px 2px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
import { scrollTo } from '@/utils/scroll-to'
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -175,8 +175,8 @@ Page({
|
|||
if (isright == false && tm_current.user_answer != undefined) {
|
||||
tm_current.dtime = util.formatTime(new Date())
|
||||
that.data.ctms.unshift(tm_current)
|
||||
if (that.data.ctms.length > 40) {
|
||||
that.data.ctms.length = 40
|
||||
if (that.data.ctms.length > 100) {
|
||||
that.data.ctms.length = 100
|
||||
}
|
||||
}
|
||||
return isright
|
||||
|
|
|
@ -130,7 +130,7 @@ Page({
|
|||
}
|
||||
},
|
||||
isPhone: function(phone){
|
||||
var phoneReg = /^[1][3,4,5,7,8,9][0-9]{9}$/;
|
||||
var phoneReg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
|
||||
if (phoneReg.test(phone)) {
|
||||
return true;
|
||||
} else {
|
||||
|
|
|
@ -10,14 +10,13 @@
|
|||
<view wx:if="{{panduan_count>0}}">{{panduan_count}}道判断题,每题{{panduan_score}}分</view>
|
||||
<view >多选题漏选每个正确选项得1分,错选0分</view>
|
||||
<view >满分{{total_score}};{{pass_score}}以上通过</view>
|
||||
</view>
|
||||
<view class="weui-article">
|
||||
<view class="weui-article__h2">2.答题须知</view>
|
||||
<view style="color:red">进入答题后请不要后退或返回桌面</view>
|
||||
<view>用户可点击上一题/下一题进行切换答题</view>
|
||||
<view>可点击答题卡复查</view>
|
||||
<view>请合理安排时间答题,可提前交卷,超时会自动提交</view>
|
||||
</view>
|
||||
<a class="weui-btn weui-btn_primary" bindtap="startTest">开始考试</a>
|
||||
</view>
|
||||
<a class="weui-btn weui-btn_primary" bindtap="startTest">开始考试</a>
|
||||
|
||||
</view>
|
|
@ -11,17 +11,17 @@
|
|||
<view class="weui-media-box weui-media-box_appmsg">
|
||||
<view class="weui-media-box__bd weui-media-box__bd_in-appmsg">
|
||||
<view class="weui-media-box__title">{{item.cityName}} {{item.examDate}}</view>
|
||||
<view class="weui-media-box__desc">
|
||||
<view class="weui-media-box__desc" style="font-size:12px">
|
||||
考试时间:
|
||||
<span style="font-weight:bold;color:darkblue">{{item.examTime}}</span>
|
||||
<span>-</span>
|
||||
截止报名:
|
||||
<span style="font-weight:bold;color:red;">{{item.endSignDate}}</span>
|
||||
</view>
|
||||
<view class="weui-media-box__desc" wx:if="{{item.linkContact}}">
|
||||
<view class="weui-media-box__desc" wx:if="{{item.linkContact}}" style="font-size:12px">
|
||||
联系电话:{{item.linkContact}}
|
||||
</view>
|
||||
<view class="weui-media-box__desc">
|
||||
<view class="weui-media-box__desc" style="font-size:12px">
|
||||
{{item.planName}}
|
||||
</view>
|
||||
</view>
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
"checkInvalidKey": true,
|
||||
"checkSiteMap": true,
|
||||
"uploadWithSourceMap": true,
|
||||
"compileHotReLoad": false,
|
||||
"babelSetting": {
|
||||
"ignore": [],
|
||||
"disablePlugins": [],
|
||||
"outputPath": ""
|
||||
},
|
||||
"useIsolateContext": true,
|
||||
"useCompilerModule": false,
|
||||
"userConfirmedUseCompilerModuleSwitch": false,
|
||||
"compileHotReLoad": false,
|
||||
"useIsolateContext": true
|
||||
"userConfirmedUseCompilerModuleSwitch": false
|
||||
},
|
||||
"compileType": "miniprogram",
|
||||
"libVersion": "2.10.3",
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue