This commit is contained in:
caoqianming 2020-03-23 09:15:06 +08:00
parent fc66951a17
commit 4018789af6
24 changed files with 448 additions and 174 deletions

View File

@ -99,10 +99,9 @@
<el-table-column align="center" label="缴费科目">
<template slot-scope="scope" >
<el-tag
v-for="item in scope.row.subjects"
:key="item.id"
effect="dark">
{{ item.name }}
v-for="item in scope.row.subjects_name"
:key="item">
{{ item }}
</el-tag>
</template>
</el-table-column>
@ -156,14 +155,27 @@
<el-input v-model="consumer.username" placeholder="手机号" />
</el-form-item>
<el-form-item label="单位" prop="company">
<el-cascader
v-model="consumer.company.id"
:options="companyData"
:props="{ checkStrictly: true }"
clearable
style="width:100%"
></el-cascader>
</el-form-item>
<el-select v-model="consumer.company" placeholder="单位" style="width:100%">
<el-option
v-for="item in companyData"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="缴费学科" prop="subjects">
<el-select v-model="consumer.subjects" placeholder="缴费学科" style="width:100%" multiple>
<el-option
v-for="item in subjectData"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item> -->
</el-form>
<div style="text-align:right;">
<el-button type="danger" @click="dialogVisible=false">取消</el-button>
@ -181,6 +193,7 @@ import {
updateConsumer,
importConsumer
} from "@/api/crm";
import { getSubjectAll } from "@/api/question"
import { getCompanyList } from "@/api/crm";
import { genTree, deepClone } from "@/utils";
import checkPermission from "@/utils/permission";
@ -192,10 +205,8 @@ const defaultConsumer = {
id: "",
name: "",
username: "",
company: {
id:0,
name:''
},
company: null,
subjects:[]
};
const listQuery = {
page: 1,
@ -237,13 +248,15 @@ export default {
},
filterOrgText: "",
treeLoding: false,
companyData: []
companyData: [],
subjectData: [],
};
},
computed: {},
created() {
this.getList();
this.getCompanyList();
this.getSubjectAll();
},
methods: {
checkPermission,
@ -292,6 +305,11 @@ export default {
this.treeLoding = false;
});
},
getSubjectAll() {
// getSubjectAll().then(response => {
// this.subjectData = genTree(response.data);
// });
},
resetFilter() {
this.listQuery = {
page: 1,
@ -346,18 +364,18 @@ export default {
const isEdit = this.dialogType === "edit";
if (isEdit) {
let consumer = this.consumer
consumer.company = consumer.company.id
updateConsumer(this.consumer.id, consumer).then(() => {
for (let index = 0; index < this.consumerList.length; index++) {
if (this.consumerList[index].id === this.consumer.id) {
this.consumerList.splice(
index,
1,
Object.assign({}, this.consumer)
);
break;
}
}
// for (let index = 0; index < this.consumerList.length; index++) {
// if (this.consumerList[index].id === this.consumer.id) {
// this.consumerList.splice(
// index,
// 1,
// Object.assign({}, this.consumer)
// );
// break;
// }
// }
this.getList()
this.dialogVisible = false;
this.$notify({
title: "成功",
@ -367,9 +385,6 @@ export default {
});
});
} else {
this.consumer.company.id = this.consumer.company.id.pop();
let consumer = this.consumer
consumer.company = consumer.company.id
createConsumer(consumer).then(res => {
// this.consumer = res.data
// this.consumerList.unshift(this.consumer)

View File

@ -15,6 +15,12 @@ App({
if(res.code==200){
this.globalData.token = res.data.token
this.globalData.userInfo = res.data.userinfo
if(res.data.userinfo.username == null){
//匿名用户
wx.reLaunch({
url: '/pages/login/login',
})
}
}
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
test_mini/images/wave.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

@ -10,7 +10,8 @@ Page({
ctms: [],
tm_index: 0,
isright:false,
answerP:false
answerP:false,
tmtotal:0
},
radioChange: function (e) {
var that = this
@ -26,7 +27,7 @@ Page({
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
onLoad: function () {
var that = this
wx.showLoading({})
try {

View File

@ -4,7 +4,6 @@ const app = getApp()
Page({
data: {
motto: 'Hello World',
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo')

View File

@ -7,7 +7,4 @@
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
<view class="usermotto">
<text class="user-motto">{{motto}}</text>
</view>
</view>

View File

@ -15,7 +15,3 @@
.userinfo-nickname {
color: #aaa;
}
.usermotto {
margin-top: 20px;
}

View File

@ -20,10 +20,12 @@ Page({
this.setData({
questioncatId: value.id
})
} else{
wx.switchTab({
url: '/pages/main/main',
})
}
} catch (e) {
wx.navigateBack({
})
}
},

View File

@ -1,66 +1,86 @@
// pages/login/login.js
//index.js
//获取应用实例
const app = getApp()
const api = require("../../utils/request.js");
Page({
/**
* 页面的初始数据
*/
data: {
userInfo: {},
hasUserInfo: false,
canIUse: wx.canIUse('button.open-type.getUserInfo')
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
//事件处理函数
bindViewTap: function () {
wx.navigateTo({
url: '../logs/logs'
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
phoneChange: function (e) {
this.data.phone = e.detail.value
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
codeChange: function (e) {
this.data.code = e.detail.value
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
onLoad: function () {
wx.hideHomeButton()
if (app.globalData.userInfo) {
this.setData({
userInfo: app.globalData.userInfo,
hasUserInfo: true
})
} else if (this.data.canIUse) {
// 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
// 所以此处加入 callback 以防止这种情况
app.userInfoReadyCallback = res => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
} else {
// 在没有 open-type=getUserInfo 版本的兼容处理
wx.getUserInfo({
success: res => {
app.globalData.userInfo = res.userInfo
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
}
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
getUserInfo: function (e) {
app.globalData.userInfo = e.detail.userInfo
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh: function () {
sendMsg : function (e){
api.request('crm/consumer/sendcode', 'GET', {phone:this.data.phone}).then(res => {
wx.showToast({
title: '验证码发送成功!',
icon:'none'
})
})
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom: function () {
onGetInfo : function (e){
this.setData({
userInfo: e.detail.userInfo
})
this.denglu()
},
/**
* 用户点击右上角分享
*/
onShareAppMessage: function () {
goMain: function (){
wx.reLaunch({
url: '/pages/main/main',
})
},
denglu: function () {
api.request('crm/consumer/register/', 'POST', { phone: this.data.phone, code: this.data.code }).then(res => {
getApp().onLaunch()
})
wx.switchTab({
url: '/pages/main/main',
})
}
})
})

View File

@ -1,2 +1,37 @@
<!--pages/login/login.wxml-->
<text>pages/login/login.wxml</text>
<view class="page">
<view class="page__hd">
<view class="page__title">开启学习之旅</view>
<view class="page__desc">为了更好的为您服务,请注册!</view>
</view>
<view class="page__bd">
<view class="weui-cells__title">注册</view>
<view class="weui-cells weui-cells_after-title">
<view class="weui-cell weui-cell_vcode">
<view class="weui-cell__hd">
<view class="weui-label">手机号</view>
</view>
<view class="weui-cell__bd">
<input class="weui-input" placeholder="请输入手机号" bindinput="phoneChange" />
</view>
<view class="weui-cell__ft">
<view class="weui-vcode-btn" bindtap="sendMsg">获取验证码</view>
</view>
</view>
<view class="weui-cell weui-cell_input">
<view class="weui-cell__hd">
<view class="weui-label">验证码</view>
</view>
<view class="weui-cell__bd">
<input class="weui-input" placeholder="请输入验证码" bindinput="codeChange" />
</view>
</view>
</view>
</view>
<button class="weui-btn" type="primary" open-type="getUserInfo" bindgetuserinfo="onGetInfo">授权并登陆</button>
<a class="weui-btn weui-btn_default" bindtap="goMain">浏览进入</a>
</view>
<view class="weui-footer weui-footer_fixed-bottom">
<!-- <view class="weui-footer__text" bindtap="intro">点击下载系统/小程序文档介绍</view> -->
<view class="weui-footer__text">Copyright © 2018-2020 国检集团</view>
<view class="weui-footer__text">中存大数据提供技术支持</view>
</view>

View File

@ -1 +1,21 @@
/* pages/login/login.wxss */
/**index.wxss**/
.userinfo {
display: flex;
flex-direction: column;
align-items: center;
}
.userinfo-avatar {
width: 128rpx;
height: 128rpx;
margin: 20rpx;
border-radius: 50%;
}
.userinfo-nickname {
color: #aaa;
}
.usermotto {
margin-top: 20px;
}

View File

@ -1,5 +1,6 @@
// pages/subject/index.js
const api = require("../../utils/request.js");
Page({
/**
@ -14,11 +15,19 @@ Page({
*/
onLoad: function (options) {
api.request('question/subject/', 'GET').then(res => {
if (res.code == 200) {
var subjectData = res.data
api.request('crm/consumer/subjectpaid', 'GET').then(res => {
for(var i=0;i<subjectData.length;i++){
if(res.data.indexOf(subjectData[i].id)!=-1){
subjectData[i].is_paid = true
}else{
subjectData[i].is_paid = false
}
}
this.setData({
subjectData:res.data
subjectData:subjectData
})
}
})
})
},
@ -71,10 +80,25 @@ Page({
},
chooseSubject: function(e) {
chooseSubject: function (e) {
let subject = e.currentTarget.dataset
wx.setStorageSync('nowSubject', subject)
wx.navigateBack({
})
if(subject.is_paid){
wx.setStorageSync('nowSubject', subject)
wx.navigateBack({
})
}
},
buy: function(e){
if(getApp().globalData.userInfo.username == null){
wx.reLaunch({
url: '/pages/login/login',
})
}else{
wx.showToast({
title: '暂未开放微信支付,请联系管理员',
icon: 'none'
})
}
}
})

View File

@ -5,14 +5,15 @@
<view class="weui-panel__hd">所有学科</view>
<view class="weui-panel__bd">
<block wx:for="{{subjectData}}" wx:key="unique">
<a class="weui-media-box weui-media-box_appmsg" bindtap="chooseSubject" data-id="{{item.id}}" data-name="{{item.name}}">
<a class="weui-media-box weui-media-box_appmsg" bindtap="chooseSubject" data-id="{{item.id}}" data-name="{{item.name}}" data-is_paid="{{item.is_paid}}">
<view class="weui-media-box__hd">
<image class="weui-media-box__thumb" src="/images/fushe.svg" alt></image>
</view>
<view class="weui-media-box__bd">
<h4 class="weui-media-box__title">{{item.name}}</h4>
<view class="weui-media-box__desc">
<span style="font-weight:bold;color:darkblue">已购买</span>
<span style="font-weight:bold;color:darkblue" wx:if="{{item.is_paid}}">已购买</span>
<a class="weui-btn weui-btn_mini weui-btn_primary" bindtap="buy" id="{{item.id}}" wx:else>购买</a>
</view>
</view>
</a>

View File

@ -12,15 +12,16 @@ function request(url, method, data) {
},
success: (res => {
wx.hideLoading();
if (res.data.code >= 400) {
if (res.data.code >= 200 && res.data.code < 400) {
resolve(res.data);
}
else {
wx.showToast({
title: JSON.stringify(res.data.msg),
icon: 'none',
duration: 1000
})
}
resolve(res.data);
}),
fail: (res => {

View File

@ -10,14 +10,14 @@ class ConsumerTokenAuthentication(JSONWebTokenAuthentication):
"""
返回登陆消费者
"""
username = payload['username']
id = payload['user_id']
if not username:
if not id:
msg = _('签名有误.')
raise exceptions.AuthenticationFailed(msg)
try:
consumer = Consumer.objects.get(username=username)
consumer = Consumer.objects.get(id=id)
except Consumer.DoesNotExist:
msg = _('消费者不存在')
raise exceptions.AuthenticationFailed(msg)

View File

@ -0,0 +1,33 @@
# Generated by Django 3.0.4 on 2020-03-22 13:13
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('crm', '0007_auto_20200320_1726'),
]
operations = [
migrations.CreateModel(
name='SendCode',
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_delete', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('phone', models.CharField(max_length=11, verbose_name='发送号码')),
('code', models.CharField(max_length=4, verbose_name='验证码')),
],
options={
'abstract': False,
},
),
migrations.AlterField(
model_name='consumer',
name='username',
field=models.CharField(blank=True, max_length=11, null=True, unique=True, verbose_name='手机号码'),
),
]

View File

@ -5,34 +5,34 @@ from question.models import Questioncat
# Create your models here.
class Company(SoftCommonModel):
"""
'''
客户企业
"""
name = models.CharField(max_length=60, verbose_name="名称", unique=True)
pid = models.ForeignKey("self", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="")
'''
name = models.CharField(max_length=60, verbose_name='名称', unique=True)
pid = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='')
class Meta:
verbose_name = "客户企业"
verbose_name = '客户企业'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Consumer(SoftCommonModel):
"""
'''
学员
"""
name = models.CharField(max_length=200, verbose_name="姓名")
username = models.CharField(max_length=11, default="", verbose_name="手机号码/邮箱", unique=True)
company = models.ForeignKey("Company", null=True, blank=True, on_delete=models.SET_NULL, verbose_name="所属单位")
openid = models.CharField(max_length=200, verbose_name="openid", null=True, blank=True, unique=True)
avatar = models.CharField(default="/media/default/avatar.png",max_length=1000, null=True, blank=True, verbose_name="头像")
nickname = models.CharField(max_length=200, verbose_name="昵称", null=True, blank=True)
subjects = models.ManyToManyField(Questioncat, verbose_name="付费学科", through="PaySubject")
'''
name = models.CharField(max_length=200, verbose_name='姓名')
username = models.CharField(max_length=11, verbose_name='手机号码', unique=True, null=True, blank=True)
company = models.ForeignKey('Company', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属单位')
openid = models.CharField(max_length=200, verbose_name='openid', null=True, blank=True, unique=True)
avatar = models.CharField(default='/media/default/avatar.png',max_length=1000, null=True, blank=True, verbose_name='头像')
nickname = models.CharField(max_length=200, verbose_name='昵称', null=True, blank=True)
subjects = models.ManyToManyField(Questioncat, verbose_name='付费学科', through='PaySubject')
class Meta:
verbose_name = "客户"
verbose_name = '客户'
verbose_name_plural = verbose_name
def __str__(self):
@ -43,4 +43,11 @@ class PaySubject(CommonModel):
付费学科关联表
'''
consumer = models.ForeignKey(Consumer, on_delete=models.CASCADE)
subject = models.ForeignKey(Questioncat, on_delete=models.CASCADE)
subject = models.ForeignKey(Questioncat, on_delete=models.CASCADE)
class SendCode(CommonModel):
'''
验证码发送记录
'''
phone = models.CharField(max_length=11, verbose_name='发送号码')
code = models.CharField(max_length=4, verbose_name= '验证码')

View File

@ -20,18 +20,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')
class Meta:
model = Consumer
fields = '__all__'
depth = 1
class ConsumerCUSerializer(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)
subjects_name = serializers.StringRelatedField(source='subjects', many=True)
class Meta:
model = Consumer

View File

@ -1,5 +1,5 @@
from django.urls import path,include
from .views import CompanyViewSet, ConsumerViewSet, ConsumerMPLoginView
from .views import CompanyViewSet, ConsumerViewSet, ConsumerMPLoginView, ConsumerRegister
from rest_framework import routers
@ -9,5 +9,6 @@ router.register('company', CompanyViewSet, basename="company")
urlpatterns = [
path('consumer/mplogin/', ConsumerMPLoginView.as_view()),
path('consumer/register/', ConsumerRegister.as_view()),
path('', include(router.urls)),
]

View File

@ -9,18 +9,48 @@ from rest_framework import status
from django_filters.rest_framework import DjangoFilterBackend
from openpyxl import Workbook, load_workbook
import requests
from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler
from rest_framework_jwt.serializers import jwt_encode_handler
import json
import random
from rest_framework_jwt.settings import api_settings
from calendar import timegm
from datetime import datetime
import warnings
from utils.custom import CommonPagination
from rbac.permission import RbacPermission
from .models import Company, Consumer, PaySubject
from .serializers import CompanySerializer, ConsumerSerializer, ConsumerCUSerializer
from crm.authentication import ConsumerTokenAuthentication
from .models import Company, Consumer, PaySubject, SendCode
from .serializers import CompanySerializer, ConsumerSerializer
from server import settings
from question.models import Questioncat
from crm.zhenzismsclient import ZhenziSmsClient
appid = 'wx5c39b569f01c27db'
secret = '68762892f8df2b4a0b1940c5250a8dc0'
sms_appid = '104951'
sms_appsecret = '3d0ccaf9-f680-47e3-ad93-9e83093c5a04'
sms_url = 'https://sms_developer.zhenzikj.com'
def jwt_payload_handler(user):
payload = {
'user_id': user.pk,
'exp': datetime.utcnow() + api_settings.JWT_EXPIRATION_DELTA
}
if api_settings.JWT_ALLOW_REFRESH:
payload['orig_iat'] = timegm(
datetime.utcnow().utctimetuple()
)
if api_settings.JWT_AUDIENCE is not None:
payload['aud'] = api_settings.JWT_AUDIENCE
if api_settings.JWT_ISSUER is not None:
payload['iss'] = api_settings.JWT_ISSUER
return payload
class CompanyViewSet(ModelViewSet):
"""
@ -69,23 +99,34 @@ class ConsumerViewSet(ModelViewSet):
serializer_class = ConsumerSerializer
pagination_class = CommonPagination
ordering_fields = ('id',)
ordering = ['id']
ordering = ['company']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ('company',)
search_fields = ('^name',)
def get_serializer_class(self):
if self.action == 'list':
return ConsumerSerializer
else:
return ConsumerCUSerializer
def destroy(self, request, *args, **kwargs): #逻辑删除
instance = self.get_object()
# self.perform_destroy(instance)
instance.is_delete = True
instance.save()
return Response(status=status.HTTP_204_NO_CONTENT)
@action(methods=['get'], detail=False, permission_classes=[], authentication_classes=[ConsumerTokenAuthentication],
url_path='subjectpaid', url_name='subject_paid')
def has_paid(self, request):
"""
当前登陆消费者已付费的学科
"""
queryset = PaySubject.objects.filter(consumer = request.user)
data = queryset.values_list('subject__id',flat=True)
return Response(data)
@action(methods=['get'], detail=False, permission_classes=[], authentication_classes=[],
url_path='sendcode', url_name='code_send')
def sendcode(self, request):
client = ZhenziSmsClient(sms_url, sms_appid, sms_appsecret)
code = random.randint(1000,9999)
phone = request.query_params.get('phone')
params = {'message':'您的验证码为:' + str(code) +',5分钟内有效', 'number': phone}
result = json.loads(client.send(params))
if result['code'] == 0:
SendCode.objects.create(phone=phone, code=code)
return Response(status=status.HTTP_200_OK)
else:
return Response({'error':result['data']})
@action(methods=['post'], detail=False, permission_classes=[IsAuthenticated],
url_path='import', url_name='import_consumer')
@ -155,11 +196,8 @@ class ConsumerMPLoginView(APIView):
info = json.loads(info)
openid = info['openid']
session_key = info['session_key']
try:
consumer = Consumer.objects.get(openid = openid)
serializer = ConsumerSerializer(instance=consumer)
except:
return Response("匿名用户",status=status.HTTP_401_UNAUTHORIZED)
consumer = Consumer.objects.get_or_create(openid = openid)[0]
serializer = ConsumerSerializer(instance=consumer)
payload = jwt_payload_handler(consumer)
token = jwt_encode_handler(payload)
return Response({"token":token,"session_key":session_key, "openid":openid, "userinfo":serializer.data})
@ -168,4 +206,28 @@ class ConsumerLogoutView(APIView):
authentication_classes = ()
permission_classes = ()
def get(self, request, *args, **kwargs):
return Response(status=status.HTTP_200_OK)
return Response(status=status.HTTP_200_OK)
class ConsumerRegister(APIView):
'''
验证码登陆和注册
'''
authentication_classes = [ConsumerTokenAuthentication]
permission_classes = []
def post(self, request, *args, **kwargs):
data = request.data
phone = data.get('phone', None)
code = data.get('code', None)
if phone and code:
obj = SendCode.objects.filter(phone=phone).last()
if code == obj.code: # 验证通过
consumer_queryset = Consumer.objects.filter(username=phone)
if consumer_queryset.exists(): # 是否存在
consumer = consumer_queryset.first()
openid = request.user.openid
request.user.delete(soft=False) # 彻底删除
consumer.openid = openid
consumer.save()
return Response(status=status.HTTP_200_OK)
else:
return Response({'error':'验证码错误!'})

View File

@ -0,0 +1,39 @@
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
class ZhenziSmsClient(object):
def __init__(self, apiUrl, appId, appSecret):
self.apiUrl = apiUrl
self.appId = appId
self.appSecret = appSecret
def send(self, params):
data = params;
data['appId'] = self.appId;
data['appSecret'] = self.appSecret;
requests.packages.urllib3.disable_warnings(InsecureRequestWarning);
response = requests.post(self.apiUrl+'/sms/send.do', data=data, verify=False);
result = str(response.content,'utf-8');
return result;
def balance(self):
data = {
'appId': self.appId,
'appSecret': self.appSecret
}
requests.packages.urllib3.disable_warnings(InsecureRequestWarning);
response = requests.post(self.apiUrl+'/account/balance.do', data=data, verify=False);
result = str(response.content,'utf-8');
return result;
def findSmsByMessageId(self, messageId):
data = {
'appId': self.appId,
'appSecret': self.appSecret,
'messageId': messageId
}
requests.packages.urllib3.disable_warnings(InsecureRequestWarning);
response = requests.post(self.apiUrl+'/smslog/findSmsByMessageId.do', data=data, verify=False);
result = str(response.content,'utf-8');
return result;

View File

@ -16,6 +16,7 @@ from .models import Questioncat, Question
from .serializers import QuestioncatSerializer, QuestionSerializer, SubjectSerializer
from server import settings
from crm.authentication import ConsumerTokenAuthentication
from crm.models import PaySubject
class SubjectViewSet(ModelViewSet):
@ -54,6 +55,8 @@ class SubjectViewSet(ModelViewSet):
if self.request.method == 'GET':
self.permission_classes = []
return [permission() for permission in self.permission_classes]
class QuestioncatViewSet(ModelViewSet):
"""

View File

@ -3,17 +3,35 @@ from django.contrib.auth.models import AbstractUser
import django.utils.timezone as timezone
from django.db.models.query import QuerySet
class SoftDeleteQuerySet(QuerySet):
# 自定义软删除查询基类
class SoftDeletableQuerySetMixin(object):
"""
QuerySet for SoftDeletableModel. Instead of removing instance sets
its ``is_deleted`` field to True.
"""
def delete(self):
"""
Soft delete objects from queryset (set their ``is_deleted``
field to True)
"""
self.update(is_delete=True)
class SoftDeletManager(models.Manager):
'''
仅返回删除的实例
'''
class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet):
pass
class SoftDeletableManagerMixin(object):
"""
Manager that limits the queryset by default to show only not deleted
instances of model.
"""
_queryset_class = SoftDeletableQuerySet
def get_queryset(self):
"""
在这里处理一下QuerySet, 然后返回没被标记位is_delete的QuerySet
Return queryset limited to not deleted entries.
"""
kwargs = {'model': self.model, 'using': self._db}
if hasattr(self, '_hints'):
@ -21,6 +39,10 @@ class SoftDeletManager(models.Manager):
return self._queryset_class(**kwargs).filter(is_delete=False)
class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager):
pass
class SoftCommonModel(models.Model):
create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间', help_text='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间', help_text='修改时间')
@ -29,7 +51,7 @@ class SoftCommonModel(models.Model):
class Meta:
abstract = True
objects = SoftDeletManager()
objects = SoftDeletableManager()
def delete(self, using=None, soft=True, *args, **kwargs):
"""
@ -39,6 +61,7 @@ class SoftCommonModel(models.Model):
self.is_delete = True
self.save(using=using)
else:
return super(SoftCommonModel, self).delete(using=using, *args, **kwargs)
class CommonModel(models.Model):