创建短信发送记录

This commit is contained in:
caoqianming 2021-06-18 13:29:36 +08:00
parent 1d9c3b2fc8
commit ae3e23bca8
8 changed files with 195 additions and 11 deletions

View File

@ -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
})
}

View File

@ -324,6 +324,12 @@ export const asyncRoutes = [
component: () => import('@/views/system/role'),
meta: { title: '管理员角色', icon: '', perms: ['role_manage'] }
},
{
path: 'msg',
name: 'Msg',
component: () => import('@/views/system/msg'),
meta: { title: '短信发送', icon: '', perms: ['msg_view'] }
},
// {
// path: 'user/password',
// name: 'ChangePassword',

View File

@ -116,7 +116,7 @@
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</el-form-item> -->
<el-form-item :label="material.type=='文档'?'文件':'视频'" prop="path">
<el-form-item :label="material.type=='文档'?'文件':'视频'" prop="path" v-if="dialogVisible">
<el-upload
v-if="material.type=='文档'"
:on-preview="handlePreview"

View File

@ -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>

View File

@ -70,9 +70,9 @@ App({
globalData: {
userInfo: {},
userinfo: {}, // 服务器传回的消费者信息
host: 'https://apitest.ahctc.cn',
//host: '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',
token : '',
rlogin:true

View File

@ -1,5 +1,5 @@
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 .permission import get_consumerperm_list
from rbac.serializers.user_serializer import UserListSerializer
@ -79,3 +79,8 @@ class CandidateSerializer(serializers.ModelSerializer):
class Meta:
model = Candidate
fields = '__all__'
class MsgSerializer(serializers.ModelSerializer):
class Meta:
model = SendCode
fields='__all__'

View File

@ -1,6 +1,6 @@
from django.urls import path,include
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
@ -10,6 +10,7 @@ router.register('company', CompanyViewSet, basename="company")
router.register('consumerrole', ConsumerRoleViewSet, basename="consumerrole")
router.register('consumerperm', ConsumerPermViewSet, basename="consumerperm")
router.register('candidate', CandidateViewSet, basename="candidate")
router.register('msg', MsgViewSet, basename="msg")
urlpatterns = [
path('consumer/mplogin/', ConsumerMPLoginView.as_view()),
path('consumer/register/', ConsumerRegister.as_view()),

View File

@ -11,7 +11,7 @@ from openpyxl import Workbook, load_workbook
from rest_framework import status
from rest_framework.decorators import action, authentication_classes, permission_classes
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.response import Response
from rest_framework.views import APIView
@ -29,7 +29,7 @@ from utils.custom import CommonPagination
from .filters import ConsumerFilter
from .exports import export_consumer
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 rbac.models import UserProfile
from django.http import Http404
@ -236,10 +236,10 @@ class ConsumerViewSet(ModelViewSet):
def get_queryset(self):
queryset = self.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):
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)
if '普通管理' in roles:
queryset = queryset.filter(create_admin = self.request.user)
@ -716,3 +716,14 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet):
queryset = self.queryset.filter(consumer=request.user)
serializer = self.get_serializer(queryset, many=True)
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']