diff --git a/fir_client/src/components/FirDownload.vue b/fir_client/src/components/FirDownload.vue index f6dd237..0464f8a 100644 --- a/fir_client/src/components/FirDownload.vue +++ b/fir_client/src/components/FirDownload.vue @@ -1672,6 +1672,24 @@ button:focus { } } +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) { + #actions { + display: block + } +} + +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) { + #actions { + display: block + } +} + +@media only screen and (min-device-width: 1024px) and (max-device-width: 1366px) and (orientation: landscape) { + #actions { + display: block + } +} + #actions.type-android { display: block } diff --git a/fir_client/src/components/FirHeader.vue b/fir_client/src/components/FirHeader.vue index bb19535..801a408 100644 --- a/fir_client/src/components/FirHeader.vue +++ b/fir_client/src/components/FirHeader.vue @@ -59,6 +59,7 @@ 订单信息 联系我们 + 下载码 退出 @@ -137,6 +138,8 @@ export default { this.$router.push({"name": 'FirUserAdvert'}) } else if (command === 'myorder') { this.$router.push({"name": 'FirUserOrders'}) + } else if (command === 'qrcode') { + this.$router.push({"name": 'FirUserQrcode'}) } else if (command === 'contact') { this.$router.push({"name": 'FirContact'}) } else if (command === 'exit') { diff --git a/fir_client/src/components/ShortDownload.vue b/fir_client/src/components/ShortDownload.vue index ce322ad..5552d30 100644 --- a/fir_client/src/components/ShortDownload.vue +++ b/fir_client/src/components/ShortDownload.vue @@ -1780,6 +1780,7 @@ button:focus { background: 0 } + @media only screen and (min-device-width: 320px) and (max-device-width: 480px) and (-webkit-min-device-pixel-ratio: 2) { #actions { display: block @@ -1816,6 +1817,24 @@ button:focus { } } +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: landscape) { + #actions { + display: block + } +} + +@media only screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait) { + #actions { + display: block + } +} + +@media only screen and (min-device-width: 1024px) and (max-device-width: 1366px) and (orientation: landscape) { + #actions { + display: block + } +} + #actions.type-android { display: block } diff --git a/fir_client/src/components/apps/FirAppInfosBase.vue b/fir_client/src/components/apps/FirAppInfosBase.vue index c2f54e5..6561efa 100644 --- a/fir_client/src/components/apps/FirAppInfosBase.vue +++ b/fir_client/src/components/apps/FirAppInfosBase.vue @@ -13,20 +13,6 @@ class="bundleid short" > {{ short_full_url }} - {{ master_release.release_type |getapptype }} - - {{ appinfos.count_hits }} - - BundleID - -  {{ appinfos.bundle_id }} - - - {{ master_release.minimum_os_version }}  或者高版本 - 超级签 + {{ master_release.release_type |getapptype }} + + {{ appinfos.count_hits }} + + BundleID + +  {{ appinfos.bundle_id }} + + + {{ master_release.minimum_os_version }}  或者高版本 + 超级签 +
该应用被封禁,请联系管理员 diff --git a/fir_client/src/components/apps/FirApps.vue b/fir_client/src/components/apps/FirApps.vue index 140a1ba..6090e53 100644 --- a/fir_client/src/components/apps/FirApps.vue +++ b/fir_client/src/components/apps/FirApps.vue @@ -1063,9 +1063,6 @@ export default { }, onUploadChange(file, fileList) { - if (fileList && fileList.length > 1) { - this.multiupload = true; - } this.multiFileList = fileList; // eslint-disable-next-line no-unused-vars this.timer = setTimeout(data => { @@ -1075,6 +1072,9 @@ export default { } clearTimeout(this.timer); }, 300); + if (fileList && fileList.length > 1) { + this.multiupload = true; + } }, delApp() { let loadingobj = this.$loading({ diff --git a/fir_client/src/components/user/FirSuperSignBase.vue b/fir_client/src/components/user/FirSuperSignBase.vue index 97b5e35..a921498 100644 --- a/fir_client/src/components/user/FirSuperSignBase.vue +++ b/fir_client/src/components/user/FirSuperSignBase.vue @@ -744,7 +744,9 @@ 搜索 - + 总消耗设备数 【 + {{ app_rank_number }} 】 + { + this.iosdevicesudidFun('DELETE', {id: scope.row.id, aid: scope.row.app_id}, scope); + }).catch(() => { + this.$message({ + type: 'info', + message: '已取消删除' + }); + }); }, handleSizeChange(val) { this.pagination.pagesize = val; @@ -1271,6 +1285,7 @@ export default { if (data.code === 1000) { this.app_rank_lists = data.data; this.pagination.total = data.count; + this.app_rank_number = data.number } else { this.$message.error("信息获取失败了 " + data.msg); } diff --git a/fir_client/src/components/user/FirUserQrcode.vue b/fir_client/src/components/user/FirUserQrcode.vue new file mode 100644 index 0000000..8bfa731 --- /dev/null +++ b/fir_client/src/components/user/FirUserQrcode.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/fir_client/src/restful/index.js b/fir_client/src/restful/index.js index b3955d4..b188a64 100644 --- a/fir_client/src/restful/index.js +++ b/fir_client/src/restful/index.js @@ -709,6 +709,21 @@ export function advertinfo(callBack, params, load = true) { ); } +/**下载码大屏 */ +export function qrcodeinfo(callBack, params, load = true) { + getData( + params.methods, + USERSEVER + '/qrcode', + params.data, + data => { + callBack(data); + }, + load, + true, + true + ); +} + /**签名账单 */ export function DeviceBillInfo(callBack, params, load = true) { getData( diff --git a/fir_client/src/router/index.js b/fir_client/src/router/index.js index 61dfb89..a2979c4 100644 --- a/fir_client/src/router/index.js +++ b/fir_client/src/router/index.js @@ -164,6 +164,12 @@ const router = new VueRouter({ meta: {label: '自定义广告'}, component: () => import("@/components/user/FirUserAdvert"), }, + { + path: 'qrcode', + name: 'FirUserQrcode', + meta: {label: '下载码'}, + component: () => import("@/components/user/FirUserQrcode"), + }, { path: 'supersign-help', name: 'FirSuperSignHelp', @@ -194,6 +200,7 @@ const router = new VueRouter({ path: '/:short', name: 'FirDownload', component: () => import("@/components/FirDownload"), + // component: () => import("@/components/ShortDownload"), }, ] diff --git a/fir_ser/api/urls.py b/fir_ser/api/urls.py index 575a6fc..db6fdbe 100644 --- a/fir_ser/api/urls.py +++ b/fir_ser/api/urls.py @@ -16,7 +16,7 @@ Including another URLconf from django.urls import re_path from api.views.advert import UserAdInfoView -from api.views.apps import AppsView, AppInfoView, AppReleaseInfoView +from api.views.apps import AppsView, AppInfoView, AppReleaseInfoView, AppsQrcodeShowView from api.views.domain import DomainCnameView, DomainInfoView from api.views.download import ShortDownloadView from api.views.login import LoginView, UserInfoView, RegistView, AuthorizationView, ChangeAuthorizationView, \ @@ -55,6 +55,7 @@ urlpatterns = [ re_path("^analyse$", AppAnalyseView.as_view()), re_path("^advert$", UserAdInfoView.as_view()), re_path("^report$", ReportView.as_view()), + re_path("^qrcode$", AppsQrcodeShowView.as_view()), re_path("^supersign/developer$", DeveloperView.as_view()), re_path("^supersign/devices$", SuperSignUsedView.as_view()), re_path("^supersign/udid$", AppUDIDUsedView.as_view()), diff --git a/fir_ser/api/views/apps.py b/fir_ser/api/views/apps.py index d21d06e..24dccdf 100644 --- a/fir_ser/api/views/apps.py +++ b/fir_ser/api/views/apps.py @@ -98,8 +98,6 @@ class AppsView(APIView): app_serializer = AppsListSerializer(app_page_serializer, many=True, context={"storage": Storage(request.user)}) - res.userinfo = {} - res.has_next = {} res.data = app_serializer.data res.has_next = page_obj.page.has_next() return Response(res.dict) @@ -372,3 +370,34 @@ class AppReleaseInfoView(APIView): res = get_release_apps(request, res, app_serializer, app_obj, Storage(request.user)) return Response(res.dict) + + +class AppsQrcodeShowView(APIView): + authentication_classes = [ExpiringTokenAuthentication, ] + + def get(self, request): + + app_type = request.query_params.get("type", None) + act_type = request.query_params.get("act", None) + res = BaseResponse() + if app_type == "android": + filter_data = {"user_id": request.user, "type": 0} + + elif app_type == "ios": + filter_data = {"user_id": request.user, "type": 1} + else: + filter_data = {"user_id": request.user} + + if act_type == "combo": + filter_data["has_combo"] = None + + apps_obj = Apps.objects.filter(**filter_data) + page_obj = AppsPageNumber() + app_page_serializer = page_obj.paginate_queryset(queryset=apps_obj.order_by("-updated_time"), request=request, + view=self) + + app_serializer = AppsListSerializer(app_page_serializer, many=True, context={"storage": Storage(request.user)}) + + res.data = app_serializer.data + res.has_next = page_obj.page.has_next() + return Response(res.dict) diff --git a/fir_ser/api/views/supersign.py b/fir_ser/api/views/supersign.py index 8c28301..c561cd7 100644 --- a/fir_ser/api/views/supersign.py +++ b/fir_ser/api/views/supersign.py @@ -6,7 +6,7 @@ import datetime import logging -from django.db.models import Count, Q +from django.db.models import Count, Q, Sum from django.http.response import FileResponse from rest_framework.pagination import PageNumberPagination from rest_framework.response import Response @@ -443,6 +443,7 @@ class DeviceUsedRankInfoView(APIView): app_used_sign_objs = app_used_sign_objs.values('app_id__app_id', 'app_id__name', 'app_id__bundle_id').annotate( count=Count('app_id__app_id')).order_by('-count') res.count = app_used_sign_objs.count() + res.number = app_used_sign_objs.aggregate(Sum('count')).get('count__sum') app_used_sign_infos = page_obj.paginate_queryset(queryset=app_used_sign_objs, request=request, view=self)