该应用被封禁,请联系管理员
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前页全选【{{ checkedQrcodes.length }}】
+
+
+
+ 批量保存选中下载码到本地
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ appinfo.name }}
+
+ 预览
+ 保存本地
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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)