增加订单功能

pull/12/head
youngS 4 years ago
parent 1fcf10575d
commit fb973da90e
  1. 65
      fir_client/src/components/FirApps.vue
  2. 13
      fir_client/src/components/FirHeader.vue
  3. 7
      fir_client/src/components/FirSuperSignBase.vue
  4. 352
      fir_client/src/components/FirUserOrders.vue
  5. 30
      fir_client/src/restful/index.js
  6. 31
      fir_client/src/router/index.js
  7. 2
      fir_ser/api/admin.py
  8. 50
      fir_ser/api/models.py
  9. 4
      fir_ser/api/urls.py
  10. 12
      fir_ser/api/utils/serializer.py
  11. 13
      fir_ser/api/utils/storage/caches.py
  12. 10
      fir_ser/api/utils/utils.py
  13. 135
      fir_ser/api/views/order.py
  14. 8
      fir_ser/api/views/supersign.py

@ -27,7 +27,9 @@
</div>
</div>
<div class="package-actions">
<button type="button" class="btn" @click="buy(packages)">购买</button>
<button type="button" class="btn" @click="buy(packages)" :disabled="buy_button_disable">
购买
</button>
</div>
</div>
@ -334,7 +336,7 @@
</div>
<div>
<el-button class="action" size="small" icon="el-icon-shopping-cart-1"
@click="show_buy_download_times=true"></el-button>
@click="show_package_prices"></el-button>
</div>
</el-col>
@ -472,7 +474,7 @@
</template>
<script>
import {getapps, apputils, analyseApps, getuploadurl} from "../restful";
import {getapps, apputils, analyseApps, getuploadurl, get_package_prices, my_order} from "../restful";
import {
getScrollHeight,
getScrollTop,
@ -511,33 +513,42 @@
uploadsuccess: 0,
loadingobj: null,
show_buy_download_times: false,
data_package_prices: [{
"name": "1k_times",
"title": "1k_times",
"description": "1k_times",
"price": 2500,
"package_size": 1000,
"download_count_gift": 111
}, {
"name": "10k_times",
"title": "10k_times",
"description": "10k_times",
"price": 22500,
"package_size": 10000,
"download_count_gift": 222
}, {
"name": "100k_times",
"title": "100k_times",
"description": "100k_times",
"price": 200000,
"package_size": 100000,
"download_count_gift": 333
}]
data_package_prices: [],
buy_button_disable: false,
}
}, methods: {
show_package_prices() {
get_package_prices(res => {
if (res.code === 1000) {
this.show_buy_download_times = true;
this.data_package_prices = res.data;
} else {
this.$message.error("获取价格异常");
this.show_buy_download_times = false;
}
}, {})
},
buy(packages) {
// eslint-disable-next-line no-console
console.log(packages)
this.buy_button_disable = true;
my_order(res => {
if (res.code === 1000) {
this.$message.success("下订单成功,正在跳转,请去我的订单进行支付");
// eslint-disable-next-line no-unused-vars
this.timmer = setTimeout(data => {
this.$router.push({"name": 'FirUserOrders'});
this.buy_button_disable = false;
}, 2000);
} else {
this.$message.error("异常" + res.msg);
this.buy_button_disable = false;
}
}, {
methods: 'POST', data: {
price_id: packages.name
}
})
},
showUDID(appinfo) {
let udidstr = '';

@ -51,7 +51,7 @@
</el-dropdown-item>
<el-dropdown-item command="supersign" v-if="$store.state.userinfo.supersign_active">超级签名
</el-dropdown-item>
<el-dropdown-item command="myorder">订单信息</el-dropdown-item>
<el-dropdown-item command="exit">退出</el-dropdown-item>
</el-dropdown-menu>
@ -89,6 +89,8 @@
type: 'success',
message: '重新生成成功!'
});
} else {
this.$message.error("失败了 " + data.msg)
}
}, {methods: 'PUT', token: this.token});
},
@ -103,15 +105,18 @@
this.$store.dispatch('doucurrentapp', {});
this.$router.push({"name": 'FirSuperSignBase', params: {act: "iosdeveloper"}})
} else if (command === 'apitoken') {
this.dialogVisible = true;
apitoken(data => {
if (data.code === 1000) {
this.token = data.data.token;
this.dialogVisible = true;
} else {
this.dialogVisible = false;
this.$message.error("获取失败了 " + data.msg)
}
}, {methods: 'GET', token: this.token});
} else if (command === 'myorder') {
this.$router.push({"name": 'FirUserOrders'})
} else if (command === 'exit') {
logout(data => {
if (data.code === 1000) {

@ -755,12 +755,5 @@
border-radius: 1%;
}
/*.goback {*/
/* display: block;*/
/* cursor: pointer;*/
/* position: absolute;*/
/* top: 0;*/
/* right: 0;*/
/*}*/
</style>

@ -0,0 +1,352 @@
<template>
<el-main>
<el-dialog
:visible.sync="show_order_info"
width="780px"
:close-on-click-modal="false"
:close-on-press-escape="false"
title="订单详情"
top="6vh"
center>
<div>
<el-form :model="current_order_info"
label-width="80px" style="margin:0 auto;">
<el-form-item label-width="110px" label="平台订单ID">
<el-input :value="current_order_info.order_number"/>
</el-form-item>
<el-form-item label-width="110px" label="第三方订单ID">
<el-input :value="current_order_info.payment_number"/>
</el-form-item>
<el-form-item label-width="110px" label="付款方式">
<el-input :value="format_payment_type(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="订单状态">
<el-input :value="format_status_type(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="订单类型">
<el-input :value="format_order_type(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="实付金额">
<el-input :value="format_actual_amount(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="购买数量">
<el-input
v-model="current_order_info.actual_download_times"/>
</el-form-item>
<el-form-item label-width="110px" label="赠送数量">
<el-input
v-model="current_order_info.actual_download_gift_times"/>
</el-form-item>
<el-form-item label-width="110px" label="订单创建时间">
<el-input :value="format_create_time(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="订单支付时间">
<el-input :value="format_pay_time(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="订单取消时间">
<el-input :value="format_cancel_time(current_order_info)"/>
</el-form-item>
<el-form-item label-width="110px" label="备注">
<el-input :value="current_order_info.description"/>
</el-form-item>
</el-form>
</div>
<span slot="footer">
如对订单有疑问请联系 nineven@qq.com
</span>
</el-dialog>
<div>
<el-input
style="width: 30%;margin-right: 30px;margin-bottom: 10px"
v-model="order_id_seach"
clearable
placeholder="输入订单ID"/>
<el-button type="primary" icon="el-icon-search" @click="handleCurrentChange(pagination.currentPage)">
搜索
</el-button>
<el-table
:data="order_info_list"
border
stripe
style="width: 100%">
<el-table-column
fixed
prop="order_number"
label="系统订单ID">
</el-table-column>
<el-table-column
prop="status"
label="状态"
align="center"
width="130">
<template slot-scope="scope">
<div v-if="scope.row.status === 1">
<el-button @click="goto_pay(scope.row)"
type="primary" size="small"> 去支付
</el-button>
</div>
<div v-else-if="scope.row.status === 0">
<el-button @click="click_order_info(scope.row)"
type="success" size="small"> {{ format_status_type(scope.row)}}
</el-button>
</div>
<div v-else-if="scope.row.status === 4 || scope.row.status ===5">
<el-button @click="click_order_info(scope.row)"
type="danger" size="small"> {{ format_status_type(scope.row)}}
</el-button>
</div>
<div v-else>
<el-button @click="click_order_info(scope.row)"
type="warning" size="small"> {{ format_status_type(scope.row)}}
</el-button>
</div>
</template>
</el-table-column>
<el-table-column
:formatter="format_actual_amount"
prop="actual_amount"
label="实付金额"
width="100">
</el-table-column>
<el-table-column
prop="actual_download_times"
label="购买数量"
width="120">
</el-table-column>
<el-table-column
prop="actual_download_gift_times"
label="赠送数量"
width="100">
</el-table-column>
<el-table-column
:formatter="format_create_time"
prop="created_time"
label="订单创建时间"
>
</el-table-column>
<el-table-column
fixed="right"
label="查看详细"
width="100">
<template slot-scope="scope">
<el-button
size="mini"
@click="click_order_info(scope.row)">详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-top: 20px;margin-bottom: 20px">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pagination.currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pagination.pagesize"
layout="total,sizes, prev, pager, next"
:total="pagination.total">
</el-pagination>
</div>
</el-main>
</template>
<script>
import {my_order, userinfos} from "../restful";
export default {
name: "FirUserOrders",
data() {
return {
order_info_list: [],
order_id_seach: "",
pagination: {"currentPage": 1, "total": 0, "pagesize": 10},
order_type_choices: [],
status_choices: [],
payment_type_choices: [],
show_order_info: false,
current_order_info: {},
}
},
methods: {
goto_pay(order) {
// eslint-disable-next-line no-console
console.log(order)
my_order(res => {
//
if (res.code === 1000) {
this.$message.success("支付成功");
this.get_data_from_tabname();
} else {
this.$message.error("失败了 " + res.msg)
}
}, {
methods: 'PUT', data: {order_number: order.order_number},
})
},
click_order_info(order) {
this.show_order_info = true;
this.current_order_info = order;
},
handleSizeChange(val) {
this.pagination.pagesize = val;
this.get_data_from_tabname({
"size": this.pagination.pagesize,
"page": this.pagination.currentPage
})
},
handleCurrentChange(val) {
this.pagination.currentPage = val;
this.get_data_from_tabname({
"size": this.pagination.pagesize,
"page": this.pagination.currentPage
})
},
get_data_from_tabname(data = {}) {
data.order_id = this.order_id_seach.replace(/^\s+|\s+$/g, "");
this.MyOrderFun(data)
},
format_choices(key, obj) {
for (let i = 0; i < obj.length; i++) {
if (key === obj[i].id) {
return obj[i].name
}
}
return "未知"
},
format_payment_type(row) {
return this.format_choices(row.payment_type, this.payment_type_choices)
},
format_status_type(row) {
return this.format_choices(row.status, this.status_choices)
},
format_order_type(row) {
return this.format_choices(row.order_type, this.order_type_choices)
},
format_actual_amount(row) {
return '¥ ' + (row.actual_amount / 100).toString()
},
format_create_time(row) {
return this.format_time(row.created_time)
},
format_pay_time(row) {
return this.format_time(row.pay_time)
},
format_cancel_time(row) {
return this.format_time(row.cancel_time)
},
format_time(stime) {
if (stime) {
stime = stime.split(".")[0].split("T");
return stime[0] + " " + stime[1]
} else
return '';
},
MyOrderFun(params) {
const loading = this.$loading({
lock: true,
text: '执行中,请耐心等待...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
});
my_order(data => {
if (data.code === 1000) {
this.order_info_list = data.data;
this.pagination.total = data.count;
this.payment_type_choices = data.payment_type_choices;
this.status_choices = data.status_choices;
this.order_type_choices = data.order_type_choices;
} else if (data.code === 1008) {
this.$message.error(data.msg);
} else {
this.$message.error("操作失败")
}
loading.close();
}, {methods: 'GET', data: params})
},
getUserInfoFun() {
userinfos(data => {
if (data.code === 1000) {
this.$store.dispatch("doUserinfo", data.data);
} else {
this.$message.error("用户信息获取失败")
}
}, {"methods": "GET"})
},
}, mounted() {
this.getUserInfoFun();
this.get_data_from_tabname()
}, filters: {}
}
</script>
<style scoped>
.el-main {
margin: 10px auto 100px;
width: 1166px;
position: relative;
padding-bottom: 1px;
background-color: #bfe7f9;
color: #9b9b9b;
-webkit-font-smoothing: antialiased;
border-radius: 1%;
}
</style>

@ -483,3 +483,33 @@ export function iosdevicesudid(callBack, params, load = true) {
true
);
}
/**获取充值价格信息 */
export function get_package_prices(callBack, params, load = true) {
getData(
'GET',
USERSEVER + '/package_prices',
params,
data => {
callBack(data);
},
load,
true,
true
);
}
/**用户订单 */
export function my_order(callBack, params, load = true) {
getData(
params.methods,
USERSEVER + '/orders',
params.data,
data => {
callBack(data);
},
load,
true,
true
);
}

@ -11,25 +11,6 @@ VueRouter.prototype.push = function push(location) {
};
// import FirIndex from "@/components/FirIndex";
// import FirApps from "@/components/FirApps";
// import FirLogin from "@/components/FirLogin";
// import FirRegist from "@/components/FirRegist";
// import FirDownload from "@/components/FirDownload";
// import FirAppBase from "@/components/FirAppBase";
// import FirAppInfosBase from "@/components/FirAppInfosBase";
// import FirAppInfostimeline from "@/components/FirAppInfostimeline";
// import FirAppInfosbaseinfo from "@/components/FirAppInfosbaseinfo";
// import FirAppInfossecurity from "@/components/FirAppInfossecurity";
// import FirAppInfosdevices from "@/components/FirAppInfosdevices";
// import FirAppInfoscombo from "@/components/FirAppInfoscombo";
// import FirUserProfileBase from "@/components/FirUserProfileBase";
// import FirUserProfileInfo from "@/components/FirUserProfileInfo";
// import FirUserProfileChangePwd from "@/components/FirUserProfileChangePwd";
// import FirUserProfileStorage from "@/components/FirUserProfileStorage";
//
// import FirSuperSignBase from "@/components/FirSuperSignBase";
const router = new VueRouter({
mode: 'history',
routes: [
@ -175,6 +156,18 @@ const router = new VueRouter({
}
]
},
{
path: '/orders',
component: () => import("@/components/FirAppBase"),
children: [
{
path: '',
name: 'FirUserOrders',
component: () => import("@/components/FirUserOrders"),
}
]
},
{
path: '/register',
name: 'FirRegist',

@ -14,3 +14,5 @@ admin.site.register(AppIOSDeveloperInfo)
admin.site.register(APPSuperSignUsedInfo)
admin.site.register(APPToDeveloper)
admin.site.register(UDIDsyncDeveloper)
admin.site.register(Price)
admin.site.register(Order)

@ -344,3 +344,53 @@ class DeveloperDevicesID(models.Model):
def __str__(self):
return "%s-%s-%s-%s" % (self.id, self.app_id, self.developerid, self.udid)
######################################## 订单表 ########################################
class Order(models.Model):
"""订单"""
payment_type_choices = ((0, '微信'), (1, '支付宝'), (2, '优惠码'), (4, '银联'))
payment_type = models.SmallIntegerField(choices=payment_type_choices)
payment_number = models.CharField(max_length=128, verbose_name="支付第3方订单号", null=True, blank=True)
order_number = models.CharField(max_length=128, verbose_name="订单号", unique=True) # 考虑到订单合并支付的问题
account = models.ForeignKey("UserInfo", on_delete=models.CASCADE)
actual_amount = models.BigIntegerField(verbose_name="实付金额,单位分")
actual_download_times = models.BigIntegerField(verbose_name="实际购买的数量", default=0)
actual_download_gift_times = models.BigIntegerField(verbose_name="实际赠送的数量", default=0)
status_choices = ((0, '交易成功'), (1, '待支付'), (2, '退费申请中'), (3, '已退费'), (4, '主动取消'), (5, '超时取消'))
status = models.SmallIntegerField(choices=status_choices, verbose_name="状态")
order_type_choices = ((0, '用户下单'), (1, '后台充值'),)
order_type = models.SmallIntegerField(choices=order_type_choices, default=0, verbose_name="订单类型")
pay_time = models.DateTimeField(blank=True, null=True, verbose_name="付款时间")
cancel_time = models.DateTimeField(blank=True, null=True, verbose_name="订单取消时间")
created_time = models.DateTimeField(verbose_name="订单创建时间", auto_now_add=True)
description = models.TextField('备注', blank=True, null=True, default='')
def __str__(self):
return "%s-%s-%s" % (self.account, self.order_number, self.actual_amount / 100)
class Price(models.Model):
name = models.CharField(max_length=128, unique=True, verbose_name="下载包唯一名称")
title = models.CharField(max_length=128, verbose_name="下载包名称")
description = models.CharField(max_length=128, verbose_name="下载包描述")
price = models.BigIntegerField(null=False, verbose_name="下载包价格,单位分")
package_size = models.BigIntegerField(null=False, verbose_name="下载包次数")
download_count_gift = models.IntegerField(default=0, null=False, verbose_name="赠送下载次数")
is_enable = models.BooleanField(default=True, verbose_name="是否启用该价格")
updated_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
verbose_name = '价格列表'
verbose_name_plural = "价格列表"
unique_together = ('price', 'package_size')
def save(self, *args, **kwargs):
if Price.objects.filter(is_enable=True).count() > 3: # 最多3个启用的价格表
raise
super(Price, self).save(*args, **kwargs)
def __str__(self):
return "%s-%s-%s-%s" % (self.name, self.price, self.package_size, self.download_count_gift)

@ -23,7 +23,7 @@ from api.views.download import ShortDownloadView
from api.views.uploads import AppAnalyseView, UploadView
from api.views.storage import StorageView
from api.views.receiveudids import IosUDIDView
from api.views.order import PriceView, OrderView
from api.views.supersign import DeveloperView, SuperSignUsedView, AppUDIDUsedView
# router=DefaultRouter()
@ -49,5 +49,7 @@ urlpatterns = [
re_path("^supersign/developer$", DeveloperView.as_view()),
re_path("^supersign/devices$", SuperSignUsedView.as_view()),
re_path("^supersign/udid$", AppUDIDUsedView.as_view()),
re_path("^package_prices$", PriceView.as_view()),
re_path("^orders$", OrderView.as_view()),
]

@ -320,3 +320,15 @@ class DeviceUDIDSerializer(serializers.ModelSerializer):
def get_bundle_name(self, obj):
return obj.app_id.name
class PriceSerializer(serializers.ModelSerializer):
class Meta:
model = models.Price
exclude = ["id"]
class OrdersSerializer(serializers.ModelSerializer):
class Meta:
model = models.Order
exclude = ["id"]

@ -350,5 +350,18 @@ def consume_user_download_times(user_id, app_id, amount=1):
return True
def add_user_download_times(user_id, download_times=0):
with cache.lock("%s_%s" % ('consume_user_download_times', user_id)):
try:
UserInfo.objects.filter(pk=user_id).update(download_times=F('download_times') + download_times)
enable_user_download_times_flag(user_id)
for app_obj in Apps.objects.filter(pk=user_id):
del_cache_response_by_short(app_obj.app_id)
return True
except Exception as e:
logger.error("%s download_times less then 0. Exception:%s" % (user_id, e))
return False
def check_user_has_all_download_times(user_id):
return get_user_free_download_times(user_id) > 0 or check_user_can_download(user_id)

@ -3,7 +3,7 @@
# project: 5月
# author: liuyu
# date: 2020/5/7
import os, re, json, requests
import os, re, json, requests, datetime, random
from fir_ser.settings import SUPER_SIGN_ROOT, SERVER_DOMAIN, CAPTCHA_LENGTH, MEDIA_ROOT
from api.models import APPSuperSignUsedInfo, APPToDeveloper, \
UDIDsyncDeveloper, UserInfo, AppReleaseInfo, AppScreenShot
@ -335,3 +335,11 @@ def clean_storage_data(user_obj, storage_obj=None):
for apptodev_obj in APPToDeveloper.objects.filter(app_id=app_release_obj.app_id).all():
storage_obj.delete_file(apptodev_obj.binary_file, app_release_obj.release_type)
return True
def get_order_num(order_type=1):
now = datetime.datetime.now()
date_str = "{0}{1}{2}{3}{4}{5}{6}".format(order_type, now.year, now.month, now.day, now.hour, now.minute,
now.second)
return date_str + str(random.randint(1000, 9999)) + str(random.randint(1000, 9999)) + str(
random.randint(1000, 9999))

@ -0,0 +1,135 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 3月
# author: NinEveN
# date: 2021/3/29
from rest_framework.views import APIView
from api.utils.response import BaseResponse
from api.utils.auth import ExpiringTokenAuthentication
from rest_framework.response import Response
from api.models import UserInfo, Price, Order
from api.utils.serializer import PriceSerializer, OrdersSerializer
from rest_framework.pagination import PageNumberPagination
from api.utils.utils import get_order_num
from api.utils.storage.caches import add_user_download_times
import logging
from django.utils import timezone
logger = logging.getLogger(__name__)
class PageNumber(PageNumberPagination):
page_size = 10 # 每页显示多少条
page_size_query_param = 'size' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制
class OrderView(APIView):
authentication_classes = [ExpiringTokenAuthentication, ]
def get(self, request):
res = BaseResponse()
order_id = request.query_params.get("order_id", None)
order_obj_lists = Order.objects.filter(account=request.user)
if order_id:
order_obj_lists = order_obj_lists.filter(order_number=order_id)
page_obj = PageNumber()
order_info_serializer = page_obj.paginate_queryset(queryset=order_obj_lists.order_by("-created_time"),
request=request,
view=self)
order_info = OrdersSerializer(order_info_serializer, many=True, )
res.data = order_info.data
res.count = order_obj_lists.count()
res.payment_type_choices = []
choices_list = list(Order.payment_type_choices)
for auth_t in choices_list:
res.payment_type_choices.append({'id': auth_t[0], 'name': auth_t[1]})
res.status_choices = []
choices_list = list(Order.status_choices)
for auth_t in choices_list:
res.status_choices.append({'id': auth_t[0], 'name': auth_t[1]})
res.order_type_choices = []
choices_list = list(Order.order_type_choices)
for auth_t in choices_list:
res.order_type_choices.append({'id': auth_t[0], 'name': auth_t[1]})
return Response(res.dict)
def post(self, request):
res = BaseResponse()
price_id = request.data.get("price_id", None)
if price_id:
price_obj = Price.objects.filter(name=price_id).first()
if price_obj:
try:
Order.objects.create(payment_type=0, order_number=get_order_num(),
account=request.user, status=1, order_type=0, actual_amount=price_obj.price,
actual_download_times=price_obj.package_size,
actual_download_gift_times=price_obj.download_count_gift)
return Response(res.dict)
except Exception as e:
logger.error("%s 订单 %s 保存失败 Exception:%s" % (request.user, price_id, e))
res.code = 1003
res.msg = "订单保存失败"
else:
logger.error("%s 价格 %s 获取失败" % (request.user, price_id))
res.code = 1002
res.msg = "价格获取失败"
else:
res.code = 1001
res.msg = "错误的价格"
return Response(res.dict)
def put(self, request):
res = BaseResponse()
order_number = request.data.get("order_number", None)
if order_number:
order_obj = Order.objects.filter(account=request.user, order_number=order_number, status=1).first()
if order_obj:
download_times = order_obj.actual_download_times + order_obj.actual_download_gift_times
try:
order_obj.status = 0
now = timezone.now()
if not timezone.is_naive(now):
now = timezone.make_naive(now, timezone.utc)
order_obj.pay_time = now
n_download_times = UserInfo.objects.filter(pk=request.user.id).values('download_times').first()
order_obj.description = "充值成功,充值下载次数 %s ,现总共可用次数 %s" % (
download_times, n_download_times.get("download_times", 0))
order_obj.save()
add_user_download_times(request.user.id, download_times)
except Exception as e:
logger.error("%s 订单 %s 更新失败 Exception:%s" % (request.user, order_number, e))
res.code = 1003
return Response(res.dict)
else:
logger.error("%s 订单 %s 获取失败" % (request.user, order_number))
res.code = 1003
res.msg = "订单获取失败,或订单已经支付"
else:
res.code = 1001
res.msg = "订单有误"
return Response(res.dict)
class PriceView(APIView):
authentication_classes = [ExpiringTokenAuthentication, ]
def get(self, request):
res = BaseResponse()
price_obj_lists = Price.objects.filter(is_enable=True).all().order_by("updated_time").order_by("price")
res.data = PriceSerializer(price_obj_lists, many=True).data
return Response(res.dict)
def delete(self, request, price_id):
res = BaseResponse()
return Response(res.dict)
def put(self, request, price_id):
res = BaseResponse()
return Response(res.dict)

@ -19,7 +19,7 @@ import logging
logger = logging.getLogger(__file__)
class AppsPageNumber(PageNumberPagination):
class PageNumber(PageNumberPagination):
page_size = 10 # 每页显示多少条
page_size_query_param = 'size' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
@ -42,7 +42,7 @@ class DeveloperView(APIView):
developer_obj2 = developer_obj.filter(issuer_id=appid)
developer_obj = developer_obj1 | developer_obj2
page_obj = AppsPageNumber()
page_obj = PageNumber()
app_page_serializer = page_obj.paginate_queryset(queryset=developer_obj.order_by("-updated_time"),
request=request,
view=self)
@ -238,7 +238,7 @@ class SuperSignUsedView(APIView):
if bundleid:
SuperSignUsed_obj = SuperSignUsed_obj.filter(app_id__bundle_id=bundleid)
page_obj = AppsPageNumber()
page_obj = PageNumber()
app_page_serializer = page_obj.paginate_queryset(queryset=SuperSignUsed_obj.order_by("-created_time"),
request=request,
view=self)
@ -263,7 +263,7 @@ class AppUDIDUsedView(APIView):
if bundleid:
AppUDID_obj = AppUDID_obj.filter(app_id__bundle_id=bundleid)
page_obj = AppsPageNumber()
page_obj = PageNumber()
app_page_serializer = page_obj.paginate_queryset(queryset=AppUDID_obj.order_by("-created_time"),
request=request,
view=self)

Loading…
Cancel
Save