创建短信发送记录
This commit is contained in:
parent
1d9c3b2fc8
commit
ae3e23bca8
|
|
@ -0,0 +1,16 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function getMsgList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/crm/msg/',
|
||||||
|
method: 'get',
|
||||||
|
params:query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
export function createMsg(data) {
|
||||||
|
return request({
|
||||||
|
url: '/crm/msg/',
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -324,6 +324,12 @@ export const asyncRoutes = [
|
||||||
component: () => import('@/views/system/role'),
|
component: () => import('@/views/system/role'),
|
||||||
meta: { title: '管理员角色', icon: '', perms: ['role_manage'] }
|
meta: { title: '管理员角色', icon: '', perms: ['role_manage'] }
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'msg',
|
||||||
|
name: 'Msg',
|
||||||
|
component: () => import('@/views/system/msg'),
|
||||||
|
meta: { title: '短信发送', icon: '', perms: ['msg_view'] }
|
||||||
|
},
|
||||||
// {
|
// {
|
||||||
// path: 'user/password',
|
// path: 'user/password',
|
||||||
// name: 'ChangePassword',
|
// name: 'ChangePassword',
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,7 @@
|
||||||
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
|
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
</el-form-item> -->
|
</el-form-item> -->
|
||||||
<el-form-item :label="material.type=='文档'?'文件':'视频'" prop="path">
|
<el-form-item :label="material.type=='文档'?'文件':'视频'" prop="path" v-if="dialogVisible">
|
||||||
<el-upload
|
<el-upload
|
||||||
v-if="material.type=='文档'"
|
v-if="material.type=='文档'"
|
||||||
:on-preview="handlePreview"
|
:on-preview="handlePreview"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,145 @@
|
||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<div style="margin-top:10px">
|
||||||
|
<el-input
|
||||||
|
v-model="listQuery.search"
|
||||||
|
placeholder="输入手机号进行搜索"
|
||||||
|
style="width: 200px;"
|
||||||
|
class="filter-item"
|
||||||
|
@keyup.enter.native="handleSearch"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
class="filter-item"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-search"
|
||||||
|
@click="handleSearch"
|
||||||
|
>搜索</el-button>
|
||||||
|
<el-button
|
||||||
|
class="filter-item"
|
||||||
|
type="primary"
|
||||||
|
icon="el-icon-refresh-left"
|
||||||
|
@click="resetFilter"
|
||||||
|
>刷新重置</el-button>
|
||||||
|
<div style="margin-top:10px">
|
||||||
|
<el-button type="primary" slot="reference" @click="handleAdd()">新增</el-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<el-table
|
||||||
|
:data="tableData"
|
||||||
|
style="width: 100%;margin-top:10px;"
|
||||||
|
border
|
||||||
|
stripe
|
||||||
|
fit
|
||||||
|
v-loading="listLoading"
|
||||||
|
highlight-current-row
|
||||||
|
max-height="600"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55"></el-table-column>
|
||||||
|
<el-table-column label="手机号">
|
||||||
|
<template slot-scope="scope">{{ scope.row.phone }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="验证码">
|
||||||
|
<template slot-scope="scope">{{ scope.row.code }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="发送时间">
|
||||||
|
<template slot-scope="scope">{{ scope.row.create_time }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="listQuery.page"
|
||||||
|
:limit.sync="listQuery.limit"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
<el-dialog :visible.sync="dialogVisible" title="新增发送记录" >
|
||||||
|
<el-form :model="msg" label-width="80px" :rules="rule1" ref="Form">
|
||||||
|
<el-form-item label="手机号" prop="phone">
|
||||||
|
<el-input v-model="msg.phone" placeholder="手机号" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="验证码" prop="code">
|
||||||
|
<el-input v-model="msg.code" 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="confirm('Form')">确认</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
import {
|
||||||
|
getMsgList,
|
||||||
|
createMsg
|
||||||
|
} from "@/api/msg";
|
||||||
|
import checkPermission from "@/utils/permission";
|
||||||
|
import Pagination from "@/components/Pagination";
|
||||||
|
const defaultmsg = {
|
||||||
|
phone:null,
|
||||||
|
msg:null
|
||||||
|
};
|
||||||
|
|
||||||
|
const listQuery = {
|
||||||
|
page: 1,
|
||||||
|
limit: 20,
|
||||||
|
search:''
|
||||||
|
};
|
||||||
|
export default {
|
||||||
|
components: { Pagination },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
total: 0,
|
||||||
|
listQuery: listQuery,
|
||||||
|
tableData: [],
|
||||||
|
listLoading: true,
|
||||||
|
msg:{},
|
||||||
|
dialogVisible:false,
|
||||||
|
rule1: {
|
||||||
|
phone: [{ required: true, message: "请输入", trigger: "blur" }],
|
||||||
|
code: [{ required: true, message: "请输入", trigger: "change" }],
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
created() {
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
checkPermission,
|
||||||
|
getList() {
|
||||||
|
this.listLoading = true;
|
||||||
|
getMsgList(this.listQuery).then(response => {
|
||||||
|
this.tableData = response.data.results;
|
||||||
|
this.total = response.data.count;
|
||||||
|
this.listLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
resetFilter() {
|
||||||
|
this.listQuery = listQuery
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
handleSearch() {
|
||||||
|
this.listQuery.page = 1
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
handleAdd() {
|
||||||
|
this.msg = Object.assign({}, defaultmsg);
|
||||||
|
this.dialogVisible = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs["Form"].clearValidate();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
confirm(){
|
||||||
|
createMsg(this.msg).then(res=>{
|
||||||
|
this.$message.success('成功')
|
||||||
|
this.dialogVisible = false
|
||||||
|
this.listQuery = listQuery
|
||||||
|
this.getList()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
@ -70,9 +70,9 @@ App({
|
||||||
globalData: {
|
globalData: {
|
||||||
userInfo: {},
|
userInfo: {},
|
||||||
userinfo: {}, // 服务器传回的消费者信息
|
userinfo: {}, // 服务器传回的消费者信息
|
||||||
host: 'https://apitest.ahctc.cn',
|
//host: 'https://apitest.ahctc.cn',
|
||||||
mediahost: 'https://apitest.ahctc.cn',
|
mediahost: 'https://apitest.ahctc.cn',
|
||||||
//host: 'http://127.0.0.1:8000',
|
host: 'http://127.0.0.1:8000',
|
||||||
//mediahost: 'http://127.0.0.1:8000',
|
//mediahost: 'http://127.0.0.1:8000',
|
||||||
token : '',
|
token : '',
|
||||||
rlogin:true
|
rlogin:true
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import Candidate, Company, Consumer, PaySubject, ConsumerPerm, ConsumerRole
|
from .models import Candidate, Company, Consumer, PaySubject, ConsumerPerm, ConsumerRole, SendCode
|
||||||
from question.models import Question, Questioncat
|
from question.models import Question, Questioncat
|
||||||
from .permission import get_consumerperm_list
|
from .permission import get_consumerperm_list
|
||||||
from rbac.serializers.user_serializer import UserListSerializer
|
from rbac.serializers.user_serializer import UserListSerializer
|
||||||
|
|
@ -78,4 +78,9 @@ class ConsumerDetailSerializer(serializers.ModelSerializer):
|
||||||
class CandidateSerializer(serializers.ModelSerializer):
|
class CandidateSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Candidate
|
model = Candidate
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
|
class MsgSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = SendCode
|
||||||
|
fields='__all__'
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from django.urls import path,include
|
from django.urls import path,include
|
||||||
from .views import CompanyViewSet, \
|
from .views import CompanyViewSet, \
|
||||||
ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, change_remain_count, ConsumerPermViewSet, ConsumerRoleViewSet, candidate, CandidateViewSet
|
ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister, MsgViewSet, change_remain_count, ConsumerPermViewSet, ConsumerRoleViewSet, candidate, CandidateViewSet
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -10,6 +10,7 @@ router.register('company', CompanyViewSet, basename="company")
|
||||||
router.register('consumerrole', ConsumerRoleViewSet, basename="consumerrole")
|
router.register('consumerrole', ConsumerRoleViewSet, basename="consumerrole")
|
||||||
router.register('consumerperm', ConsumerPermViewSet, basename="consumerperm")
|
router.register('consumerperm', ConsumerPermViewSet, basename="consumerperm")
|
||||||
router.register('candidate', CandidateViewSet, basename="candidate")
|
router.register('candidate', CandidateViewSet, basename="candidate")
|
||||||
|
router.register('msg', MsgViewSet, basename="msg")
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('consumer/mplogin/', ConsumerMPLoginView.as_view()),
|
path('consumer/mplogin/', ConsumerMPLoginView.as_view()),
|
||||||
path('consumer/register/', ConsumerRegister.as_view()),
|
path('consumer/register/', ConsumerRegister.as_view()),
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from openpyxl import Workbook, load_workbook
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import action, authentication_classes, permission_classes
|
from rest_framework.decorators import action, authentication_classes, permission_classes
|
||||||
from rest_framework.filters import OrderingFilter, SearchFilter
|
from rest_framework.filters import OrderingFilter, SearchFilter
|
||||||
from rest_framework.mixins import ListModelMixin, RetrieveModelMixin
|
from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
@ -29,7 +29,7 @@ from utils.custom import CommonPagination
|
||||||
from .filters import ConsumerFilter
|
from .filters import ConsumerFilter
|
||||||
from .exports import export_consumer
|
from .exports import export_consumer
|
||||||
from .models import Candidate, Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole
|
from .models import Candidate, Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole
|
||||||
from .serializers import CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer
|
from .serializers import CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer, MsgSerializer
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
from rbac.models import UserProfile
|
from rbac.models import UserProfile
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
|
|
@ -236,10 +236,10 @@ class ConsumerViewSet(ModelViewSet):
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
queryset = self.queryset
|
queryset = self.queryset
|
||||||
queryset = self.get_serializer_class().setup_eager_loading(queryset)
|
queryset = self.get_serializer_class().setup_eager_loading(queryset)
|
||||||
if self.request.user.is_superuser:
|
|
||||||
return queryset
|
|
||||||
if self.request.query_params.get('adminoff', None):
|
if self.request.query_params.get('adminoff', None):
|
||||||
return queryset.filter(create_admin__isnull=True)
|
return queryset.filter(create_admin__isnull=True)
|
||||||
|
if self.request.user.is_superuser:
|
||||||
|
return queryset
|
||||||
roles = self.request.user.roles.values_list('name', flat=True)
|
roles = self.request.user.roles.values_list('name', flat=True)
|
||||||
if '普通管理' in roles:
|
if '普通管理' in roles:
|
||||||
queryset = queryset.filter(create_admin = self.request.user)
|
queryset = queryset.filter(create_admin = self.request.user)
|
||||||
|
|
@ -715,4 +715,15 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
|
||||||
def my(self, request, *args, **kwargs):
|
def my(self, request, *args, **kwargs):
|
||||||
queryset = self.queryset.filter(consumer=request.user)
|
queryset = self.queryset.filter(consumer=request.user)
|
||||||
serializer = self.get_serializer(queryset, many=True)
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class MsgViewSet(CreateModelMixin, ListModelMixin, GenericViewSet):
|
||||||
|
perms_map = [
|
||||||
|
{'get': '*'}, {'post': 'msg_create'}]
|
||||||
|
queryset = SendCode.objects.all()
|
||||||
|
serializer_class = MsgSerializer
|
||||||
|
pagination_class = CommonPagination
|
||||||
|
filter_backends = [DjangoFilterBackend,SearchFilter, OrderingFilter]
|
||||||
|
search_fields = ('phone',)
|
||||||
|
ordering = ['-create_time']
|
||||||
Loading…
Reference in New Issue