├── Linux_version ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── admin.cpython-37.pyc │ ├── apps.cpython-37.pyc │ ├── forms.cpython-37.pyc │ ├── models.cpython-37.pyc │ ├── urls.cpython-37.pyc │ └── views.cpython-37.pyc ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-37.pyc │ │ └── __init__.cpython-37.pyc ├── models.py ├── tests.py ├── urls.py └── views.py ├── README.md ├── ios_super_signature ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── settings.cpython-37.pyc │ ├── urls.cpython-37.pyc │ └── wsgi.cpython-37.pyc ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── media └── Readme.md ├── mobileprovision ├── mysign └── updateprofile.rb ├── requirements.txt ├── static ├── css │ ├── ios │ │ ├── Readme.md │ │ ├── index.css │ │ └── swiper.css │ └── pc │ │ ├── bootstrap.min.css │ │ ├── index.css │ │ ├── login.css │ │ ├── modal.css │ │ ├── posted.css │ │ ├── style.css │ │ ├── sup.css │ │ └── tube.css ├── images │ ├── favicon_g.png │ ├── ios │ │ ├── 001.png │ │ ├── 002.png │ │ ├── 003.jpg │ │ ├── 004.png │ │ ├── 005.png │ │ └── 006.png │ └── pc │ │ ├── 001.png │ │ ├── 002.png │ │ ├── 003.png │ │ ├── 004.png │ │ ├── 005.jpg │ │ ├── 006.png │ │ ├── 007.png │ │ └── 008.png ├── js │ ├── ios │ │ ├── clip.js │ │ ├── download.js │ │ ├── finger2.min.js │ │ ├── jquery-1.12.4.min.js │ │ └── swiper.js │ └── pc │ │ ├── bootstrap.min.js │ │ └── jquery.min.js └── mobileconfig │ ├── company.mobileprovision │ └── udid.mobileconfig └── templates ├── ios ├── appinstall.plist ├── install_app.html └── install_mobileconfig.html └── pc ├── basetemplate.html ├── confirmskip.html ├── distribution.html ├── index.html ├── lawsregulations.html ├── leftnavtemplate.html ├── login.html ├── nologinskip.html ├── register.html └── topnavtemplate.html /Linux_version/__init__.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | default_app_config = 'Linux_version.apps.AppConfig' -------------------------------------------------------------------------------- /Linux_version/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/apps.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/apps.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/forms.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/forms.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from . import models 3 | 4 | class UserInfo(admin.ModelAdmin): 5 | list_display = ['username','email','has_confirmed','buy_devices_count','registration_datetime'] 6 | 7 | class Email_Confirm(admin.ModelAdmin): 8 | list_display = ['user','code','c_time'] 9 | 10 | class IpaPackage(admin.ModelAdmin): 11 | list_display = ['userinfo','display_name','version','distribution_url','upload_datetime','installed_amount'] 12 | 13 | class UDID(admin.ModelAdmin): 14 | list_display = ['userinfo','product','udid','request_distribution_url','deveploer_account','request_datetime'] 15 | 16 | class DeveloperAccount(admin.ModelAdmin): 17 | list_display = ['username','used_device_count'] 18 | 19 | 20 | admin.site.register(models.UserInfo,UserInfo) 21 | admin.site.register(models.ConfirmString,Email_Confirm) 22 | admin.site.register(models.UDID,UDID) 23 | admin.site.register(models.DeveloperAccount,DeveloperAccount) 24 | admin.site.register(models.IpaPackage,IpaPackage) 25 | 26 | admin.site.site_title = '后台管理' 27 | admin.site.site_header = 'Giao超级签名管理平台' 28 | admin.site.index_title = 'IOS超级签名' -------------------------------------------------------------------------------- /Linux_version/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class LinuxVersionConfig(AppConfig): 5 | name = 'Linux_version' 6 | verbose_name = '分发平台' 7 | -------------------------------------------------------------------------------- /Linux_version/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from captcha.fields import CaptchaField 3 | 4 | class LoginForm(forms.Form): 5 | """登录表单""" 6 | username = forms.CharField(max_length=128, min_length=6, label='用户名', 7 | widget=forms.TextInput(attrs={'placeholder': "Username", 'autofocus': ''})) 8 | password = forms.CharField(max_length=128, min_length=8, label='密码', 9 | widget=forms.PasswordInput(attrs={'placeholder': "Password"})) 10 | captcha = CaptchaField(label='验证码',error_messages={'invalid':'验证码错误'}) 11 | 12 | class RegisterForm(forms.Form): 13 | """注册表单""" 14 | username = forms.CharField(label='用户名', max_length=128, min_length=6, widget=forms.TextInput) 15 | password1 = forms.CharField(label='密码', max_length=128, min_length=8, widget=forms.PasswordInput) 16 | password2 = forms.CharField(label='确认密码', max_length=128, min_length=8, widget=forms.PasswordInput) 17 | email = forms.EmailField(label='邮箱地址', widget=forms.EmailInput) 18 | captcha = CaptchaField(label='验证码',error_messages={'invalid':'验证码错误'}) 19 | 20 | class UploadFileForm(forms.Form): 21 | """文件上传表单""" 22 | file = forms.FileField(label='选择文件') -------------------------------------------------------------------------------- /Linux_version/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.3 on 2019-09-29 14:30 2 | 3 | import Linux_version.models 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='DeveloperAccount', 18 | fields=[ 19 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('username', models.CharField(max_length=64, unique=True, verbose_name='开发者账号')), 21 | ('password', models.CharField(max_length=128, verbose_name='密码')), 22 | ('p12_file', models.FileField(upload_to=Linux_version.models.p12_path, verbose_name='P12文件路径')), 23 | ('used_device_count', models.IntegerField(default=0, verbose_name='已使用设备数量')), 24 | ], 25 | options={ 26 | 'verbose_name': '开发者账号', 27 | 'verbose_name_plural': '开发者账号', 28 | }, 29 | ), 30 | migrations.CreateModel( 31 | name='UserInfo', 32 | fields=[ 33 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 34 | ('username', models.CharField(max_length=128, unique=True, verbose_name='用户名')), 35 | ('password', models.CharField(max_length=128, verbose_name='密码')), 36 | ('email', models.EmailField(max_length=254, unique=True, verbose_name='邮箱')), 37 | ('has_confirmed', models.BooleanField(default=False, verbose_name='是否确认')), 38 | ('buy_devices_count', models.IntegerField(default=0, verbose_name='购买下载量')), 39 | ('registration_datetime', models.DateTimeField(auto_now_add=True, verbose_name='注册时间')), 40 | ], 41 | options={ 42 | 'verbose_name': '用户信息', 43 | 'verbose_name_plural': '用户信息', 44 | 'ordering': ['-registration_datetime'], 45 | }, 46 | ), 47 | migrations.CreateModel( 48 | name='UDID', 49 | fields=[ 50 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 51 | ('product', models.CharField(blank=True, max_length=64, null=True, verbose_name='设备型号')), 52 | ('udid', models.CharField(max_length=128, verbose_name='设备UDID')), 53 | ('request_distribution_url', models.CharField(blank=True, max_length=240, null=True, verbose_name='请求的分发链接')), 54 | ('request_datetime', models.DateTimeField(auto_now_add=True, verbose_name='请求时间')), 55 | ('deveploer_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='Linux_version.DeveloperAccount', verbose_name='重签的开发者账号')), 56 | ('userinfo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Linux_version.UserInfo', verbose_name='所属用户')), 57 | ], 58 | options={ 59 | 'verbose_name': 'IOS设备信息', 60 | 'verbose_name_plural': 'IOS设备信息', 61 | 'ordering': ['-request_datetime'], 62 | }, 63 | ), 64 | migrations.CreateModel( 65 | name='IpaPackage', 66 | fields=[ 67 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 68 | ('ipaupload_path', models.FileField(upload_to=Linux_version.models.user_directory_path, verbose_name='文件相对路径')), 69 | ('absolute_path', models.CharField(blank=True, max_length=256, null=True, verbose_name='文件绝对路径')), 70 | ('display_name', models.CharField(default='Not Found App Name', max_length=64, verbose_name='App名称')), 71 | ('bundid_before', models.CharField(blank=True, max_length=128, null=True, verbose_name='原Bundle ID')), 72 | ('bundid_after', models.CharField(blank=True, max_length=128, null=True, verbose_name='重签后Bundle ID')), 73 | ('version', models.CharField(blank=True, max_length=32, null=True, verbose_name='版本')), 74 | ('appid_name', models.CharField(blank=True, max_length=128, null=True, verbose_name='AppID名称')), 75 | ('distribution_url', models.URLField(blank=True, null=True, verbose_name='分发链接')), 76 | ('file_size', models.FloatField(blank=True, default=0.0, null=True, verbose_name='文件大小(M)')), 77 | ('installed_amount', models.IntegerField(blank=True, default=0, null=True, verbose_name='安装数量')), 78 | ('upload_datetime', models.DateTimeField(auto_now_add=True, verbose_name='上传时间')), 79 | ('userinfo', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Linux_version.UserInfo', verbose_name='所属用户')), 80 | ], 81 | options={ 82 | 'verbose_name': 'IPA包信息', 83 | 'verbose_name_plural': 'IPA包信息', 84 | 'ordering': ['-upload_datetime'], 85 | }, 86 | ), 87 | migrations.CreateModel( 88 | name='ConfirmString', 89 | fields=[ 90 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 91 | ('code', models.CharField(max_length=256, verbose_name='确认码')), 92 | ('c_time', models.DateTimeField(auto_now_add=True, verbose_name='生成时间')), 93 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='Linux_version.UserInfo', verbose_name='用户')), 94 | ], 95 | options={ 96 | 'verbose_name': '邮件确认码', 97 | 'verbose_name_plural': '邮件确认码', 98 | 'ordering': ['-c_time'], 99 | }, 100 | ), 101 | ] 102 | -------------------------------------------------------------------------------- /Linux_version/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/migrations/__init__.py -------------------------------------------------------------------------------- /Linux_version/migrations/__pycache__/0001_initial.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/migrations/__pycache__/0001_initial.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/Linux_version/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /Linux_version/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.db.models.signals import pre_delete 3 | from django.dispatch.dispatcher import receiver 4 | 5 | 6 | class UserInfo(models.Model): 7 | """用户信息""" 8 | username = models.CharField(max_length=128, unique=True, verbose_name='用户名') 9 | password = models.CharField(max_length=128, verbose_name='密码') 10 | email = models.EmailField(unique=True, verbose_name='邮箱') 11 | has_confirmed = models.BooleanField(default=False, verbose_name='是否确认') 12 | buy_devices_count = models.IntegerField(default=0, verbose_name='购买下载量') 13 | registration_datetime = models.DateTimeField(auto_now_add=True, verbose_name='注册时间') 14 | 15 | def __str__(self): 16 | return self.username 17 | 18 | class Meta: 19 | ordering = ['-registration_datetime'] 20 | verbose_name = '用户信息' 21 | verbose_name_plural = '用户信息' 22 | 23 | 24 | class ConfirmString(models.Model): 25 | """用户邮件注册确认""" 26 | code = models.CharField(max_length=256, verbose_name='确认码') 27 | user = models.OneToOneField(to='UserInfo', on_delete=models.CASCADE, verbose_name='用户') 28 | c_time = models.DateTimeField(auto_now_add=True, verbose_name='生成时间') 29 | 30 | def __str__(self): 31 | return self.user.username 32 | 33 | class Meta: 34 | ordering = ['-c_time'] 35 | verbose_name = '邮件确认码' 36 | verbose_name_plural = '邮件确认码' 37 | 38 | 39 | class UDID(models.Model): 40 | """IOS设备信息""" 41 | userinfo = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, verbose_name='所属用户') 42 | product = models.CharField(max_length=64, blank=True, null=True, verbose_name='设备型号') 43 | udid = models.CharField(max_length=128, verbose_name='设备UDID') 44 | request_distribution_url = models.CharField(max_length=240, blank=True, null=True, verbose_name='请求的分发链接') 45 | deveploer_account = models.ForeignKey(to='DeveloperAccount', on_delete=models.CASCADE, blank=True, null=True, 46 | verbose_name='重签的开发者账号') 47 | request_datetime = models.DateTimeField(auto_now_add=True, verbose_name='请求时间') 48 | 49 | def __str__(self): 50 | return self.udid 51 | 52 | class Meta: 53 | ordering = ['-request_datetime'] 54 | verbose_name = 'IOS设备信息' 55 | verbose_name_plural = 'IOS设备信息' 56 | 57 | 58 | def p12_path(instance, filename): 59 | """苹果开发者账号models回调函数""" 60 | return '/'.join(['p12_files', instance.username, filename]) 61 | 62 | 63 | class DeveloperAccount(models.Model): 64 | """苹果开发者账号""" 65 | username = models.CharField(max_length=64, unique=True, verbose_name='开发者账号') 66 | password = models.CharField(max_length=128, verbose_name='密码') 67 | p12_file = models.FileField(upload_to=p12_path, verbose_name='P12文件路径') 68 | used_device_count = models.IntegerField(default=0, verbose_name='已使用设备数量') 69 | 70 | def __str__(self): 71 | return self.username 72 | 73 | class Meta: 74 | verbose_name = '开发者账号' 75 | verbose_name_plural = '开发者账号' 76 | 77 | 78 | @receiver(pre_delete, sender=DeveloperAccount) 79 | def p12_file_delete(sender, instance, **kwargs): 80 | """删除P12对象时,一并删除上传的文件""" 81 | instance.p12_file.delete(False) 82 | 83 | 84 | def user_directory_path(instance, filename): 85 | """IPA包信息models回调函数""" 86 | return '/'.join(['ipa_files', instance.userinfo.username, filename]) 87 | 88 | 89 | class IpaPackage(models.Model): 90 | """IPA包信息""" 91 | userinfo = models.ForeignKey(to='UserInfo', on_delete=models.CASCADE, verbose_name='所属用户') 92 | ipaupload_path = models.FileField(upload_to=user_directory_path, verbose_name='文件相对路径') 93 | absolute_path = models.CharField(max_length=256, verbose_name='文件绝对路径', blank=True, null=True) 94 | display_name = models.CharField(max_length=64, default='Not Found App Name', verbose_name='App名称') 95 | bundid_before = models.CharField(max_length=128, blank=True, null=True, verbose_name='原Bundle ID') 96 | bundid_after = models.CharField(max_length=128, blank=True, null=True, verbose_name='重签后Bundle ID') 97 | version = models.CharField(max_length=32, blank=True, null=True, verbose_name='版本') 98 | appid_name = models.CharField(max_length=128, blank=True, null=True, verbose_name='AppID名称') 99 | distribution_url = models.URLField(blank=True, null=True, verbose_name='分发链接') 100 | file_size = models.FloatField(default=0.0, blank=True, null=True, verbose_name='文件大小(M)') 101 | installed_amount = models.IntegerField(default=0, blank=True, null=True, verbose_name='安装数量') 102 | upload_datetime = models.DateTimeField(auto_now_add=True, verbose_name='上传时间') 103 | 104 | def __str__(self): 105 | return self.display_name 106 | 107 | class Meta: 108 | ordering = ['-upload_datetime'] 109 | verbose_name = 'IPA包信息' 110 | verbose_name_plural = 'IPA包信息' 111 | 112 | 113 | @receiver(pre_delete, sender=IpaPackage) 114 | def ipa_file_delete(sender, instance, **kwargs): 115 | """删除IPAPackage对象时,一并删除上传的文件""" 116 | instance.ipaupload_path.delete(False) 117 | -------------------------------------------------------------------------------- /Linux_version/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | -------------------------------------------------------------------------------- /Linux_version/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | from django.urls import include 4 | from django.conf import settings 5 | from django.conf.urls import url 6 | from django.views.static import serve 7 | 8 | urlpatterns = [ 9 | path('', views.index, name='index'), 10 | path('lawsregulations/', views.laws, name='laws'), 11 | path('login/', views.login, name='login'), 12 | path('logout/', views.logout, name='logout'), 13 | path('nologinskip/', views.nologinskip, name='nologinskip'), 14 | path('register/', views.register, name='register'), 15 | path('emailconfirm/', views.email_confirm, name='emailconfirm'), 16 | path('captcha/', include('captcha.urls')), 17 | path('DistributionManagement/', views.distribution_management, name='distribute_management'), 18 | path('IpaPackageUpload/', views.ipapackage_upload, name='ipapackageupload'), 19 | 20 | path('udid/receive/', views.udid_receive, name='udid_receive'), 21 | path('installapp/', views.installapp, name='installapp'), 22 | path('resignapp/', views.resignapp, name='resignapp'), 23 | path('ipa_files//.plist', views.request_plist, name='request_plist'), 24 | path('ipa_files//', views.ios_request, name='ios_request'), 25 | url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}), 26 | ] 27 | -------------------------------------------------------------------------------- /Linux_version/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, HttpResponse, redirect 2 | from django.contrib import messages 3 | from django.views.decorators.csrf import csrf_exempt 4 | from django.urls import reverse 5 | from django.conf import settings 6 | from django.core.mail import EmailMultiAlternatives 7 | from . import models 8 | from . import forms 9 | import re, os, subprocess, time, zipfile, plistlib, string, random, hashlib, datetime, json 10 | 11 | 12 | ######################################################## PC端 ######################################################### 13 | 14 | def hash_code(s, salt='mysite'): 15 | h = hashlib.sha256() 16 | s += salt 17 | h.update(s.encode()) 18 | return h.hexdigest() 19 | 20 | 21 | def make_confirm_string(user): 22 | now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 23 | code = hash_code(user.username, now) 24 | models.ConfirmString.objects.create(code=code, user=user) 25 | return code 26 | 27 | 28 | def send_email(username, password, email, code): 29 | subject = '来自%s的注册确认邮件' % (settings.WEBSITE_DOMAIN,) 30 | text_content = '''感谢注册%s,这里是ios分发平台站点,如果你看到这条消息, 31 | 说明你的邮箱服务器不提供HTML链接功能,请联系管理员!''' % (settings.WEBSITE_DOMAIN,) 32 | html_content = '''

感谢注册%s

33 |

您的用户名:%s , 密码:%s

34 |

请点击站点链接完成注册确认!

35 |

此链接有效期为%s天!

''' % ( 36 | settings.WEBSITE_DOMAIN, code, settings.WEBSITE_DOMAIN, username, password, settings.CONFIRM_DAYS) 37 | msg = EmailMultiAlternatives(subject, text_content, settings.EMAIL_HOST_USER, [email]) 38 | msg.attach_alternative(html_content, 'text/html') 39 | msg.send() 40 | 41 | 42 | def get_ipapackage_information(path): 43 | information = [] 44 | f = zipfile.ZipFile(path) 45 | file_pattern = re.compile(r'Payload/[^/]*.app/Info.plist') 46 | for paths in f.namelist(): 47 | m = file_pattern.match(paths) 48 | if m is not None: 49 | content = f.read(m.group()) 50 | plist_root = plistlib.loads(content) 51 | information.append(plist_root['CFBundleIdentifier']) # BundleID 52 | information.append(plist_root['CFBundleShortVersionString']) # version 53 | try: 54 | information.append(plist_root['CFBundleDisplayName']) # Displayname 55 | except: 56 | information.append('Not Found App Name') 57 | return information 58 | 59 | 60 | def index(request): 61 | """网站首页""" 62 | return render(request, 'pc/index.html') 63 | 64 | 65 | def laws(request): 66 | """法律法规""" 67 | return render(request, 'pc/lawsregulations.html') 68 | 69 | 70 | def register(request): 71 | """用户注册""" 72 | if request.session.get('is_login', None): 73 | return redirect('index') 74 | if request.method == 'POST': 75 | register_form = forms.RegisterForm(request.POST) 76 | message = '请检查填写的内容' 77 | if register_form.is_valid(): 78 | username = register_form.cleaned_data.get('username') 79 | password1 = register_form.cleaned_data.get('password1') 80 | password2 = register_form.cleaned_data.get('password2') 81 | email = register_form.cleaned_data.get('email') 82 | if password1 != password2: 83 | message = '两次输入的密码不一致' 84 | return render(request, 'pc/register.html', locals()) 85 | else: 86 | same_name_user = models.UserInfo.objects.filter(username=username) 87 | if same_name_user: 88 | message = '用户名已存在' 89 | return render(request, 'pc/register.html', locals()) 90 | 91 | same_email_user = models.UserInfo.objects.filter(email=email) 92 | if same_email_user: 93 | message = '该邮箱已被注册' 94 | return render(request, 'pc/register.html', locals()) 95 | 96 | new_user = models.UserInfo() 97 | new_user.username = username 98 | new_user.password = password1 99 | new_user.email = email 100 | new_user.save() 101 | 102 | code = make_confirm_string(new_user) 103 | try: 104 | send_email(username, password1, email, code) 105 | except: 106 | message = '邮件发送失败' 107 | return render(request, 'pc/confirmskip.html', locals()) 108 | 109 | message = '注册成功!请前往邮箱进行确认,正在跳转至登录...' 110 | return render(request, 'pc/confirmskip.html', locals()) 111 | else: 112 | return render(request, 'pc/register.html', locals()) 113 | register_form = forms.RegisterForm() 114 | return render(request, 'pc/register.html', locals()) 115 | 116 | 117 | def email_confirm(request): 118 | """注册邮件确认""" 119 | code = request.GET.get('code', None) 120 | message = '' 121 | try: 122 | confirm = models.ConfirmString.objects.get(code=code) 123 | except: 124 | message = '无效的确认请求...' 125 | return render(request, 'pc/confirmskip.html', locals()) 126 | c_time = confirm.c_time 127 | now = datetime.datetime.now() 128 | if now > c_time + datetime.timedelta(settings.CONFIRM_DAYS): 129 | confirm.user.delete() 130 | message = '您的邮件已经过期,请重新注册...' 131 | return render(request, 'pc/confirmskip.html', locals()) 132 | else: 133 | confirm.user.has_confirmed = True 134 | confirm.user.save() 135 | confirm.delete() 136 | message = '邮箱确认成功,正在跳转至登录...' 137 | return render(request, 'pc/confirmskip.html', locals()) 138 | 139 | 140 | def login(request): 141 | """用户登录""" 142 | if request.session.get('is_login', None): 143 | return redirect('index') 144 | if request.method == 'POST': 145 | login_form = forms.LoginForm(request.POST) 146 | message = '请检查填写的内容' 147 | if login_form.is_valid(): 148 | username = login_form.cleaned_data.get('username') 149 | password = login_form.cleaned_data.get('password') 150 | try: 151 | user = models.UserInfo.objects.get(username=username) 152 | except: 153 | message = '用户不存在' 154 | return render(request, 'pc/login.html', locals()) 155 | 156 | if not user.has_confirmed: 157 | message = '该用户还未经过邮件确认' 158 | return render(request, 'pc/login.html', locals()) 159 | if user.password == password: 160 | request.session['is_login'] = True 161 | request.session['user_id'] = user.id 162 | request.session['user_name'] = user.username 163 | return redirect('index') 164 | else: 165 | message = '密码错误' 166 | return render(request, 'pc/login.html', locals()) 167 | else: 168 | return render(request, 'pc/login.html', locals()) 169 | else: 170 | login_form = forms.LoginForm() 171 | return render(request, 'pc/login.html', locals()) 172 | 173 | 174 | def logout(request): 175 | """用户注销""" 176 | if not request.session.get('is_login', None): 177 | return redirect('login') 178 | del request.session['is_login'] 179 | del request.session['user_id'] 180 | del request.session['user_name'] 181 | return redirect('index') 182 | 183 | 184 | def nologinskip(request): 185 | """未登录跳转""" 186 | return render(request, 'pc/nologinskip.html') 187 | 188 | 189 | def distribution_management(request): 190 | """超级签名应用""" 191 | if not request.session.get('is_login', None): 192 | return redirect('nologinskip') 193 | user_id = request.session.get('user_id', None) 194 | 195 | if request.GET.get('delete') == 'true': 196 | Query_Information = models.IpaPackage.objects.filter(userinfo_id=user_id, 197 | distribution_url=request.GET.get('distribution_url')) 198 | Query_Information.delete() 199 | return redirect(reverse('distribute_management')) 200 | 201 | try: 202 | user_Package_information = models.IpaPackage.objects.filter(userinfo_id=user_id) 203 | UDID_Information = models.UDID.objects.filter(userinfo_id=user_id) 204 | for Package in user_Package_information: 205 | for udid_info in UDID_Information: 206 | if udid_info.request_distribution_url == Package.distribution_url: 207 | Install_Count = UDID_Information.filter(request_distribution_url=Package.distribution_url).values( 208 | 'udid', 'request_distribution_url').order_by('request_distribution_url').distinct().count() 209 | user_Package_information.filter(distribution_url=udid_info.request_distribution_url).update( 210 | installed_amount=Install_Count) 211 | USER_PACKAGE_INFORMATION = models.IpaPackage.objects.filter(userinfo_id=user_id) 212 | User_Buy_Devices_Count = models.UserInfo.objects.filter(id=user_id)[0].buy_devices_count 213 | User_Used_Devices_Count = models.UDID.objects.filter(userinfo_id=user_id).values('udid').order_by( 214 | 'udid').distinct().count() 215 | if User_Buy_Devices_Count == 0: 216 | Percent = 0 217 | else: 218 | Percent = int(round(User_Used_Devices_Count / User_Buy_Devices_Count, 2) * 100) 219 | except: 220 | message = 'Database query Error, please contact webmaster!' 221 | return render(request, 'pc/distribution.html', locals()) 222 | 223 | return render(request, 'pc/distribution.html', locals()) 224 | 225 | 226 | def ipapackage_upload(request): 227 | """IPA包上传""" 228 | if not request.session.get('is_login', None): 229 | return redirect('nologinskip') 230 | username = request.session.get('user_name', None) 231 | if request.method == 'POST': 232 | upload_form = forms.UploadFileForm(request.POST, request.FILES) 233 | if upload_form.is_valid(): 234 | instance = models.IpaPackage() 235 | instance.ipaupload_path = request.FILES['file'] 236 | user = models.UserInfo.objects.get(username=username) 237 | instance.userinfo = user 238 | instance.save() 239 | try: 240 | file_size = round(instance.ipaupload_path.size / 1024 / 1024, 2) # 文件大小 241 | absolute_path = os.path.join(settings.MEDIA_ROOT, instance.ipaupload_path.name) # IPA文件绝对路径 242 | information = get_ipapackage_information(absolute_path) 243 | bundid_before = information[0] 244 | version = information[1] 245 | display_name = information[2] 246 | bundid_after = bundid_before + settings.DOMAIN_POSTFIX + ''.join( 247 | random.sample(string.ascii_letters + string.digits, 6)) 248 | appidName = bundid_after.replace('.', '') 249 | remove_extend = ''.join(instance.ipaupload_path.name.split('.')[:-1]) 250 | if remove_extend: 251 | distribution_url = 'http://%s/%s' % (settings.WEBSITE_DOMAIN, remove_extend) 252 | else: 253 | distribution_url = 'http://%s/%s' % (settings.WEBSITE_DOMAIN, instance.ipaupload_path.name) 254 | instance.bundid_before = bundid_before 255 | instance.bundid_after = bundid_after 256 | instance.version = version 257 | instance.display_name = display_name 258 | instance.appid_name = appidName 259 | instance.distribution_url = distribution_url 260 | instance.absolute_path = absolute_path 261 | instance.file_size = file_size 262 | instance.save() 263 | except: 264 | instance.delete() 265 | message = {'detail_message': 'Error:IPA包信息提取错误,请检查后重新上传!如有疑问,请联系网站管理员'} 266 | return HttpResponse(json.dumps(message), content_type="application/json") 267 | message = {'detail_message': 'Success:文件上传成功!'} 268 | else: 269 | message = {'detail_message': '不允许上传空文件哟!'} 270 | return HttpResponse(json.dumps(message), content_type="application/json") 271 | if request.method == 'GET': 272 | return render(request, 'pc/distribution.html', locals()) 273 | 274 | 275 | ######################################################## IOS端 ######################################################### 276 | 277 | def ios_request(request, username, ipafilename): 278 | if username == 'udid_submit' and ipafilename == 'udid_submit': 279 | product = request.GET.get('product') 280 | udid = request.GET.get('udid') 281 | if product and udid: 282 | request.session['product'] = product 283 | request.session['udid'] = udid 284 | message_storage = messages.get_messages(request) 285 | for User_IOS_Request in message_storage: 286 | if User_IOS_Request.level == 50: 287 | request.session['request_distribution_url'] = str(User_IOS_Request) 288 | elif User_IOS_Request.level == 51: 289 | request.session['Userinfo_id'] = str(User_IOS_Request) 290 | elif User_IOS_Request.level == 52: 291 | request.session['UserName'] = str(User_IOS_Request) 292 | else: 293 | pass 294 | else: 295 | return HttpResponse('

Error: Get your UDID Failure!

') 296 | return redirect(reverse('installapp')) 297 | else: 298 | distribute_url = models.IpaPackage.objects.filter(distribution_url=request.build_absolute_uri()) 299 | if not distribute_url: 300 | return HttpResponse('

Error: 没有查询到分发链接,请检查链接是否正确!

') 301 | app_size = distribute_url[0].file_size 302 | version = distribute_url[0].version 303 | User_IOS_Request_Url = 50 304 | User_IOS_Request_UserID = 51 305 | User_IOS_Request_UserName = 52 306 | messages.add_message(request, User_IOS_Request_Url, message=distribute_url[0].distribution_url) 307 | messages.add_message(request, User_IOS_Request_UserID, message=distribute_url[0].userinfo_id) 308 | messages.add_message(request, User_IOS_Request_UserName, message=distribute_url[0].userinfo.username) 309 | return render(request, 'ios/install_mobileconfig.html', locals()) 310 | 311 | 312 | @csrf_exempt 313 | def udid_receive(request): 314 | """获取设备UDID""" 315 | if request.method == 'POST': 316 | data = request.body 317 | data_utf = data.decode('utf8', errors='ignore') 318 | data_format = re.split("|", data_utf)[1] 319 | remove_bin = "".join(data_format.split('\n\t')).strip() 320 | data_list = re.split("|||", remove_bin) 321 | remove_space = [i.strip() for i in data_list if i.strip() != ''] 322 | if 'UDID' in remove_space: 323 | udid = remove_space[remove_space.index('UDID') + 1] 324 | product = remove_space[remove_space.index('PRODUCT') + 1].replace(' ', '') 325 | else: 326 | return HttpResponse('

Error:Get UDID Fail!

') 327 | else: 328 | return HttpResponse('

Error:Your Request Method is GET!

') 329 | return redirect( 330 | reverse('ios_request', 331 | kwargs={'username': 'udid_submit', 'ipafilename': 'udid_submit'}) + '?product=%s&udid=%s' % ( 332 | product, udid), permanent=True) 333 | 334 | 335 | def installapp(request): 336 | return render(request, 'ios/install_app.html') 337 | 338 | 339 | def resignapp(request): 340 | """后台重签App""" 341 | ##### 获取session ##### 342 | try: 343 | product = request.session.get('product') 344 | udid = request.session.get('udid') 345 | request_distribution_url = request.session.get('request_distribution_url') 346 | Userinfo_id = request.session.get('Userinfo_id') 347 | UserName = request.session.get('UserName') 348 | del request.session['product'] 349 | del request.session['udid'] 350 | del request.session['request_distribution_url'] 351 | del request.session['Userinfo_id'] 352 | del request.session['UserName'] 353 | except: 354 | message = {'error_message': 'Error(10001):获取信息失败,请清除浏览器记录以及缓存后重新打开分发链接安装!', 'code': 2} 355 | return HttpResponse(json.dumps(message), content_type="application/json") 356 | 357 | ##### 判断当前分发用户是否有足够的下载数 ##### 358 | try: 359 | User_Buy_Device_Count = models.UserInfo.objects.filter(id=Userinfo_id)[0].buy_devices_count 360 | except: 361 | message = {'error_message': 'Error(10002):获取信息失败,请重新打开分发链接安装!', 'code': 2} 362 | return HttpResponse(json.dumps(message), content_type="application/json") 363 | if User_Buy_Device_Count > 0: 364 | if models.UDID.objects.filter(userinfo_id=Userinfo_id, udid=udid): # udid已存在当前用户下,则获取之前注册的开发者账号密码 365 | Account_ID = models.UDID.objects.filter(udid=udid)[0].deveploer_account 366 | Account_username = Account_ID.username 367 | Account_password = Account_ID.password 368 | Account_keychain = Account_ID.iphone_distribute_number 369 | else: # 新注册设备 370 | if models.UDID.objects.filter(Userinfo_id=Userinfo_id).values('udid').order_by( 371 | 'udid').distinct().count() >= User_Buy_Device_Count: # 判断下载数是否还有剩余 372 | message = {'error_message': 'Error(10004):可用的下载设备数量已达峰值,请联系开发者购买超级签名数量!', 'code': 2} 373 | return HttpResponse(json.dumps(message), content_type="application/json") 374 | else: 375 | ##### 获取可用开发者账号 ##### 376 | Get_Account = models.DeveloperAccount.objects.filter(used_devices_count__lt=100) 377 | if not Get_Account: 378 | message = {'error_message': 'Error(10005):App 安装失败! 可用IOS超级签名账号已达上限,请联系分发平台处理!', 'code': 2} 379 | return HttpResponse(json.dumps(message), content_type="application/json") 380 | else: 381 | Account_username = Get_Account[0].username 382 | Account_password = Get_Account[0].password 383 | Account_keychain = Get_Account[0].iphone_distribute_number 384 | else: 385 | message = {'error_message': 'Error(10003):开发者尚未购买可下载设备的数量!无法安装此app', 'code': 2} 386 | return HttpResponse(json.dumps(message), content_type="application/json") 387 | 388 | ##### 获取IPA包中可用信息 ##### 389 | IPAPackage_Model = models.IpaPackage.objects.filter(distribution_url=request_distribution_url) 390 | bundid_after = IPAPackage_Model[0].bundid_after + Account_keychain[0:6] # 取开发者账号发布证书的前六位字符串,防止跨账号之后bundid冲突 391 | appid_name = IPAPackage_Model[0].appid_name + Account_keychain[0:6] 392 | ipa_absolute_path = IPAPackage_Model[0].absolute_path 393 | ipa_upload_path = IPAPackage_Model[0].ipaupload_path 394 | 395 | ##### 更新配置描述文件 ##### 396 | Ruby_Script_Path = os.getcwd() + '/ios_super_signature/scripts/updateprofile.rb' 397 | if os.path.exists('./ios_super_signature/scripts/%s' % UserName) == False: 398 | os.mkdir('./ios_super_signature/scripts/%s' % UserName) 399 | Ruby_Command = "ruby %s %s '%s' %s %s %s '%s' '%s'" % ( 400 | Ruby_Script_Path, Account_username, Account_password, product, 401 | udid, UserName, bundid_after, appid_name) 402 | try: 403 | Update_mobileprovision_State = subprocess.Popen(Ruby_Command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 404 | shell=True).wait(timeout=120) 405 | except subprocess.TimeoutExpired as Timeout_Error: 406 | message = {'error_message': 'Error(10006):Update mobileprovision File timeout, please contact the developer!', 407 | 'code': 2} 408 | return HttpResponse(json.dumps(message), content_type="application/json") 409 | except Exception as Other_Error: 410 | message = { 411 | 'error_message': 'Error(10007):Update mobileprovision File Unknown Error!please contact the developer!', 412 | 'code': 2} 413 | return HttpResponse(json.dumps(message), content_type="application/json") 414 | if Update_mobileprovision_State == 0: # update success 415 | print("udid:%s update mobileprovision file success!" % (udid,)) 416 | deveploer_account_id = models.DeveloperAccount.objects.filter(username=Account_username)[0].id 417 | models.UDID.objects.create(product=product, udid=udid, request_distribution_url=request_distribution_url, 418 | Userinfo_id=Userinfo_id, deveploer_account_id=deveploer_account_id) # 更新完配置文件后写库 419 | mobileprovision_file_exist_state = os.path.exists( 420 | './ios_super_signature/scripts/%s/%s.mobileprovision' % (UserName, appid_name,)) 421 | if mobileprovision_file_exist_state == False: 422 | time.sleep(10) 423 | if mobileprovision_file_exist_state == False: 424 | message = { 425 | 'error_message': 'Error(10008):Download mobileprovision file Fail, please contact the developer!', 426 | 'code': 2} 427 | return HttpResponse(json.dumps(message), content_type="application/json") 428 | else: 429 | # 可能错误:双重认证、跨账号之后bundid_after冲突 430 | print("Error(10009) udid:%s update mobileprovision file fail!" % (udid,)) 431 | message = {'error_message': 'Error(10009):Update mobileprovision File Fail, please contact the developer!', 432 | 'code': 2} 433 | return HttpResponse(json.dumps(message), content_type="application/json") 434 | 435 | ##### resignAPP ##### 436 | P12_File_Path = models.DeveloperAccount.objects.filter(Developer_Account=deveploer_account_id)[0].p12_file 437 | if not P12_File_Path: 438 | print('Error(20010):Developer Account %s P12 file get Fail,please check Database!' % (Account_username,)) 439 | message = {'error_message': 'Error(20010):P12 File Get Fail!,Resign APP Fail,please contact the developer!', 440 | 'code': 2} 441 | return HttpResponse(json.dumps(message), content_type="application/json") 442 | Resign_Command = 'mysisn -f -k ./ios_super_signature/media/%s -m ./ios_super_signature/scripts/%s/%s.mobileprovision -o %s.signed %s' % ( 443 | P12_File_Path, UserName, appid_name, ipa_absolute_path, ipa_absolute_path) 444 | try: 445 | Resign_State = subprocess.Popen(Resign_Command, stdout=subprocess.PIPE, shell=True).wait(timeout=60) 446 | except subprocess.TimeoutExpired as Timeout_Error: 447 | message = {'error_message': 'Error(20011):Resign app timeout, please contact the developer!', 'code': 2} 448 | return HttpResponse(json.dumps(message), content_type="application/json") 449 | except Exception as Other_Error: 450 | message = {'error_message': 'Error(20012):Resign app Unknown Error, please contact the developer!', 'code': 2} 451 | return HttpResponse(json.dumps(message), content_type="application/json") 452 | if Resign_State == 0: 453 | pass 454 | else: 455 | message = {'error_message': 'Error(20013):Resign app Fail, please contact the developer!', 'code': 2} 456 | return HttpResponse(json.dumps(message), content_type="application/json") 457 | 458 | response = {'ipa_upload_path': '%s' % ipa_upload_path, 'code': 1} 459 | return HttpResponse(json.dumps(response), content_type="application/json") 460 | 461 | 462 | def request_plist(request, username, ipafilename): 463 | return render(request, 'ios/appinstall.plist', context={'username': username, 'ipafilename': ipafilename}) 464 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # IOS超级签名(Linux版本) 2 | 3 | 4 | -------------------------------------------------------------------------------- /ios_super_signature/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/ios_super_signature/__init__.py -------------------------------------------------------------------------------- /ios_super_signature/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/ios_super_signature/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /ios_super_signature/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/ios_super_signature/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /ios_super_signature/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/ios_super_signature/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /ios_super_signature/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/ios_super_signature/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /ios_super_signature/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 4 | SECRET_KEY = '=)4&7)+@*8p%am@7w4$_je*ul!4&s(05^=wy&yq=4y)(n7e8=n' 5 | DEBUG = True 6 | ALLOWED_HOSTS = ['*'] 7 | 8 | INSTALLED_APPS = [ 9 | 'django.contrib.admin', 10 | 'django.contrib.auth', 11 | 'django.contrib.contenttypes', 12 | 'django.contrib.sessions', 13 | 'django.contrib.messages', 14 | 'django.contrib.staticfiles', 15 | 'Linux_version.apps.LinuxVersionConfig', 16 | 'captcha', 17 | ] 18 | 19 | MIDDLEWARE = [ 20 | 'django.middleware.security.SecurityMiddleware', 21 | 'django.contrib.sessions.middleware.SessionMiddleware', 22 | 'django.middleware.common.CommonMiddleware', 23 | 'django.middleware.csrf.CsrfViewMiddleware', 24 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 25 | 'django.contrib.messages.middleware.MessageMiddleware', 26 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 27 | ] 28 | 29 | ROOT_URLCONF = 'ios_super_signature.urls' 30 | 31 | TEMPLATES = [ 32 | { 33 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 34 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 35 | 'APP_DIRS': True, 36 | 'OPTIONS': { 37 | 'context_processors': [ 38 | 'django.template.context_processors.debug', 39 | 'django.template.context_processors.request', 40 | 'django.contrib.auth.context_processors.auth', 41 | 'django.contrib.messages.context_processors.messages', 42 | 'django.template.context_processors.media', 43 | ], 44 | }, 45 | }, 46 | ] 47 | 48 | WSGI_APPLICATION = 'ios_super_signature.wsgi.application' 49 | 50 | DATABASES = { 51 | 'default': { 52 | 'ENGINE': 'django.db.backends.sqlite3', 53 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 54 | } 55 | } 56 | 57 | AUTH_PASSWORD_VALIDATORS = [ 58 | { 59 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 60 | }, 61 | { 62 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 63 | }, 64 | { 65 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 66 | }, 67 | { 68 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 69 | }, 70 | ] 71 | 72 | LANGUAGE_CODE = 'zh-hans' 73 | TIME_ZONE = 'Asia/Shanghai' 74 | USE_I18N = True 75 | USE_L10N = True 76 | USE_TZ = False 77 | 78 | """静态资源、文件配置""" 79 | STATIC_URL = '/static/' 80 | STATIC_ROOT = os.path.join(BASE_DIR, 'static_all') 81 | STATICFILES_DIRS = [ 82 | os.path.join(BASE_DIR, 'static'), 83 | ] 84 | MEDIA_URL = '/media/' 85 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 86 | 87 | """邮箱配置""" 88 | EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 89 | EMAIL_HOST = 'smtp.163.com' 90 | EMAIL_PORT = 25 91 | EMAIL_HOST_USER = '' 92 | EMAIL_HOST_PASSWORD = '' 93 | CONFIRM_DAYS = 1 94 | 95 | """验证码配置""" 96 | CAPTCHA_LENGTH = 4 97 | CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_null',) 98 | 99 | """session cookie 有效期""" 100 | SESSION_COOKIE_AGE = 86400 101 | SESSION_EXPIRE_AT_BROWSER_CLOSE = True 102 | 103 | """网站URL配置""" 104 | WEBSITE_DOMAIN = '192.168.200.25:8000' 105 | 106 | """公司域名后缀(用于bundle after)""" 107 | DOMAIN_POSTFIX = '.com.xxxxx.' 108 | -------------------------------------------------------------------------------- /ios_super_signature/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path,include 3 | 4 | urlpatterns = [ 5 | path('background_manage/', admin.site.urls), 6 | path('',include('Linux_version.urls')), 7 | ] 8 | -------------------------------------------------------------------------------- /ios_super_signature/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django.core.wsgi import get_wsgi_application 4 | 5 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ios_super_signature.settings') 6 | 7 | application = get_wsgi_application() 8 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ios_super_signature.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /media/Readme.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/media/Readme.md -------------------------------------------------------------------------------- /mobileprovision/mysign: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/mobileprovision/mysign -------------------------------------------------------------------------------- /mobileprovision/updateprofile.rb: -------------------------------------------------------------------------------- 1 | require "spaceship" 2 | require 'pathname' 3 | require 'mysql2' 4 | # -*- coding: UTF-8 -*- 5 | 6 | account_username = ARGV[0] 7 | account_password = ARGV[1] 8 | name = ARGV[2] 9 | udid = ARGV[3] 10 | username = ARGV[4] 11 | bundid_after = ARGV[5] 12 | appid_name = ARGV[6] 13 | 14 | dir_path = Pathname.new(File.dirname(__FILE__)).realpath 15 | 16 | Spaceship.login("#{account_username}","#{account_password}") 17 | device = Spaceship.device.create!(name: "#{name}", udid: "#{udid}") 18 | 19 | app = Spaceship.app.find("#{bundid_after}") 20 | if app 21 | profiles_adhoc = Spaceship.provisioning_profile.ad_hoc.all.find { |p| p.name == "#{appid_name}" } 22 | profiles_adhoc.devices = Spaceship.device.all 23 | profiles_adhoc.update! 24 | profile = Spaceship.provisioning_profile.ad_hoc.all.find { |p| p.name == "#{appid_name}" } 25 | File.write("#{dir_path}/#{username}/#{appid_name}.mobileprovision",profile.download) 26 | else 27 | new_app = Spaceship.app.create!(bundle_id:"#{bundid_after}",name:"#{appid_name}") 28 | cert = Spaceship::Portal.certificate.production.all.first 29 | Provision_profile = Spaceship.provisioning_profile.ad_hoc.create!(bundle_id:"#{bundid_after}",certificate:cert,name:"#{appid_name}") 30 | File.write("#{dir_path}/#{username}/#{appid_name}.mobileprovision",Provision_profile.download) 31 | end 32 | 33 | devices_count = Spaceship.device.all.length 34 | client = Mysql2::Client.new(:host => "", 35 | :username => "", 36 | :password => '', 37 | :port =>"", 38 | :database => "" 39 | ) 40 | client.query("update ios_distribute_developeraccount set used_devices_count=#{devices_count} where username=\"#{account_username}\"") 41 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | django-simple-captcha==0.5.12 -------------------------------------------------------------------------------- /static/css/ios/Readme.md: -------------------------------------------------------------------------------- 1 | a -------------------------------------------------------------------------------- /static/css/ios/index.css: -------------------------------------------------------------------------------- 1 | html, 2 | body, 3 | div, 4 | p, 5 | ul, 6 | li, 7 | h1, 8 | h2, 9 | h3, 10 | h4, 11 | h5, 12 | h6 { 13 | margin: 0; 14 | padding: 0; 15 | } 16 | body { 17 | font-family: -apple-system; 18 | font-size: 12px; 19 | color: #000; 20 | background: #fff; 21 | } 22 | 23 | body, 24 | html { 25 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 26 | } 27 | 28 | button, 29 | input { 30 | border: none; 31 | background: none; 32 | outline: 0; 33 | } 34 | 35 | a { 36 | text-decoration: none; 37 | } 38 | 39 | ul, 40 | li { 41 | list-style: none; 42 | } 43 | 44 | strong, 45 | b, 46 | em { 47 | font-weight: normal; 48 | font-style: normal; 49 | } 50 | 51 | .btn { 52 | display: block; 53 | width: 100%; 54 | padding: 4px 15px; 55 | background: rgba(4, 119, 249, 1); 56 | border: rgba(4, 119, 249, 1) 1px solid; 57 | border-radius: 15px; 58 | text-align: center; 59 | color: #fff; 60 | font-size: 14px; 61 | } 62 | 63 | .btn i { 64 | width: .3rem; 65 | height: .3rem; 66 | text-indent: -99999px; 67 | position: relative; 68 | display: inline-block; 69 | vertical-align: middle; 70 | margin: -.06rem .1rem 0 .1rem; 71 | box-sizing: border-box; 72 | border-radius: 15px; 73 | border: 1px solid rgba(225, 225, 225, .2); 74 | border-right-color: #fff; 75 | overflow: hidden; 76 | animation: three-quarters-loader 700ms infinite cubic-bezier(0, 0, .75, .91); 77 | } 78 | 79 | .btn.grey { 80 | border-color: #cacaca; 81 | background: #cacaca; 82 | } 83 | 84 | .step3 em { 85 | display: none; 86 | } 87 | 88 | .download-loading { 89 | position: relative; 90 | background: #dbdde2; 91 | overflow: hidden; 92 | width: 100px !important; 93 | } 94 | 95 | .download-loading i { 96 | display: none; 97 | } 98 | 99 | .download-loading span { 100 | position: relative; 101 | z-index: 1; 102 | } 103 | .download-loading span b { 104 | display: inline-block; 105 | vertical-align: middle; 106 | margin-top: -2px; 107 | width: 50px; 108 | } 109 | .download-loading em { 110 | display: block; 111 | position: absolute; 112 | display: block; 113 | top: 0; 114 | left: 0; 115 | width: 0; 116 | height: 100%; 117 | background: rgba(4, 119, 249, 1); 118 | } 119 | 120 | @keyframes three-quarters-loader { 121 | from { 122 | transform: rotate(0); 123 | } 124 | 125 | to { 126 | transform: rotate(360deg) 127 | } 128 | } 129 | 130 | .btn-mini { 131 | display: inline-block; 132 | width: auto; 133 | } 134 | 135 | .clr:after { 136 | display: table; 137 | clear: both; 138 | overflow: hidden; 139 | } 140 | 141 | .clr { 142 | zoom: 1; 143 | } 144 | .blue-color { 145 | color: #0070c9 !important; 146 | } 147 | /* banner */ 148 | .contain-page { 149 | max-width: 750px; 150 | margin: 0 auto; 151 | } 152 | 153 | .app-banner { 154 | display: none; 155 | } 156 | 157 | .app-banner img { 158 | display: block; 159 | width: 100%; 160 | height: 4rem; 161 | } 162 | 163 | /* info */ 164 | .app-info { 165 | display: flex; 166 | padding: 20px 0; 167 | width: 87.5%; 168 | margin: 0 auto; 169 | background: #fff; 170 | } 171 | 172 | .app-logo { 173 | width: 28vw; 174 | margin-right: 10px; 175 | } 176 | 177 | .app-logo img { 178 | display: block; 179 | width: 100%; 180 | border-radius: 20px; 181 | } 182 | 183 | .app-info-rig { 184 | flex: 1; 185 | } 186 | 187 | .app-info-rig strong { 188 | display: block; 189 | margin-top: 6px; 190 | margin-left: 3.28358%; 191 | font-size: 20px; 192 | font-weight: bold; 193 | } 194 | 195 | .app-info-rig p { 196 | margin: .3em 0 0 3.28358%; 197 | font-size: 14px; 198 | color: #8A8A90; 199 | } 200 | .app-info-rig .clr { 201 | margin-top: 1.8em; 202 | } 203 | .arouse { 204 | float: right; 205 | height: 30px; 206 | line-height: 30px; 207 | border-radius: 15px; 208 | text-align: center; 209 | font-size: 12px; 210 | color: rgba(6, 122, 254, 1); 211 | } 212 | .arouse b { 213 | display:inline-block; 214 | vertical-align:middle; 215 | width:20px; 216 | height:20px; 217 | line-height:20px; 218 | margin:-2px 5px 0 0; 219 | text-align:center; 220 | background:rgba(6, 122, 254, 1); 221 | color: #fff; 222 | border-radius:100%; 223 | 224 | } 225 | /* 评价 */ 226 | .app-show { 227 | display: flex; 228 | padding: 0 0 20px; 229 | width: 87.5%; 230 | margin: 0 auto; 231 | background: #fff; 232 | color: #8E8F92; 233 | } 234 | 235 | .app-score { 236 | flex: 1; 237 | } 238 | 239 | .app-score strong, 240 | .app-age strong { 241 | font-size: 16px; 242 | font-weight: bold; 243 | } 244 | 245 | .app-score p, 246 | .app-age p { 247 | color: #d8d8d8; 248 | font-size: 12px; 249 | } 250 | 251 | .app-score img { 252 | width: 80px; 253 | margin-left: 5px; 254 | } 255 | 256 | .app-age { 257 | text-align: right; 258 | } 259 | 260 | 261 | /* intro */ 262 | .app-intro,.comment-box,.information-box { 263 | margin: 0 auto; 264 | padding: 20px 0; 265 | width: 87.5%; 266 | border-top: 1px solid #e5e5e5; 267 | } 268 | 269 | .app-title { 270 | margin-bottom: .85em; 271 | font-size: 20px; 272 | } 273 | 274 | .app-intro-con { 275 | position: relative; 276 | line-height: 1.8; 277 | font-size: 14px; 278 | height: 5.4em; 279 | overflow: hidden; 280 | } 281 | 282 | .app-intro-con.open { 283 | height: auto; 284 | } 285 | 286 | .app-intro-con span { 287 | display: none; 288 | position: absolute; 289 | right: 0; 290 | bottom: 0; 291 | padding-left: 1em; 292 | background: #fff; 293 | color: #067AFE; 294 | } 295 | 296 | /* 过程 */ 297 | .app-flow { 298 | display: none; 299 | margin: .5rem .4rem 0; 300 | } 301 | 302 | .appSteps { 303 | position: relative; 304 | counter-reset: step; 305 | margin: .4rem 0 .5rem; 306 | display: flex; 307 | } 308 | 309 | .appSteps li { 310 | list-style-type: none; 311 | font-size: 0.9rem; 312 | text-align: center; 313 | width: 50%; 314 | position: relative; 315 | float: left; 316 | color: rgb(164, 164, 164); 317 | } 318 | 319 | .appSteps li .step { 320 | display: block; 321 | width: .54rem; 322 | height: .54rem; 323 | background-color: rgb(233, 239, 245); 324 | line-height: .54rem; 325 | border-radius: 100%; 326 | font-size: .32rem; 327 | color: #fff; 328 | text-align: center; 329 | font-weight: 700; 330 | margin: 0 auto .16rem; 331 | } 332 | 333 | .appSteps li p { 334 | font-size: .24rem; 335 | } 336 | 337 | .appSteps li::after { 338 | content: ''; 339 | width: 60%; 340 | height: 1px; 341 | background-color: rgb(233, 239, 245); 342 | position: absolute; 343 | left: -30%; 344 | top: .27rem; 345 | z-index: -1; 346 | } 347 | 348 | .appSteps li:first-child::after { 349 | display: none; 350 | } 351 | 352 | .appSteps.step01 li:nth-of-type(1) .step { 353 | background-color: rgb(51, 135, 255); 354 | } 355 | 356 | .appSteps.step02 li:nth-of-type(1) .step { 357 | background-color: rgb(233, 239, 245); 358 | text-indent: -9999px; 359 | position: relative; 360 | } 361 | 362 | .appSteps.step02 li:nth-of-type(2) .step { 363 | background-color: rgb(51, 135, 255); 364 | } 365 | 366 | .appSteps.step02 li:nth-of-type(2)::after { 367 | background-color: rgb(51, 135, 255); 368 | } 369 | 370 | .appSteps.step02 li:nth-of-type(1) .step::after { 371 | content: ""; 372 | position: absolute; 373 | top: 50%; 374 | left: 50%; 375 | width: .26rem; 376 | height: .21rem; 377 | background-image: url("../imgs/gou.png"); 378 | background-repeat: no-repeat; 379 | background-size: 100% 100%; 380 | transform: translate(-50%, -50%); 381 | } 382 | 383 | .appSteps.step03 li:nth-of-type(1) .step { 384 | background-color: rgb(233, 239, 245); 385 | text-indent: -9999px; 386 | position: relative; 387 | } 388 | 389 | .appSteps.step03 li:nth-of-type(2) .step { 390 | background-color: rgb(233, 239, 245); 391 | text-indent: -9999px; 392 | position: relative; 393 | } 394 | 395 | .appSteps.step03 li:nth-of-type(3) .step { 396 | background-color: rgb(51, 135, 255); 397 | } 398 | 399 | .appSteps.step03 li:nth-of-type(2)::after { 400 | background-color: rgb(51, 135, 255); 401 | } 402 | 403 | .appSteps.step03 li:nth-of-type(3)::after { 404 | background-color: rgb(51, 135, 255); 405 | } 406 | 407 | .appSteps.step03 li:nth-of-type(1) .step::after { 408 | content: ""; 409 | position: absolute; 410 | top: 50%; 411 | left: 50%; 412 | width: .26rem; 413 | height: .21rem; 414 | background-image: url("../imgs/gou.png"); 415 | background-repeat: no-repeat; 416 | background-size: 100% 100%; 417 | transform: translate(-50%, -50%); 418 | } 419 | 420 | .appSteps.step03 li:nth-of-type(2) .step::after { 421 | content: ""; 422 | position: absolute; 423 | top: 50%; 424 | left: 50%; 425 | width: .26rem; 426 | height: .21rem; 427 | background-image: url("../imgs/gou.png"); 428 | background-repeat: no-repeat; 429 | background-size: 100% 100%; 430 | transform: translate(-50%, -50%); 431 | } 432 | 433 | .appSteps.step04 li:nth-of-type(1)::after, 434 | .appSteps.step04 li:nth-of-type(2)::after, 435 | .appSteps.step04 li:nth-of-type(3)::after { 436 | background-color: rgb(51, 135, 255); 437 | } 438 | 439 | .appSteps.step04 li:nth-of-type(1) .step, 440 | .appSteps.step04 li:nth-of-type(2) .step, 441 | .appSteps.step04 li:nth-of-type(3) .step { 442 | background-color: rgb(233, 239, 245); 443 | text-indent: -9999px; 444 | position: relative; 445 | } 446 | 447 | .appSteps.step04 li:nth-of-type(1) .step::after, 448 | .appSteps.step04 li:nth-of-type(2) .step::after, 449 | .appSteps.step04 li:nth-of-type(3) .step::after { 450 | content: ""; 451 | position: absolute; 452 | top: 50%; 453 | left: 50%; 454 | width: .26rem; 455 | height: .21rem; 456 | background-image: url("../imgs/gou.png"); 457 | background-repeat: no-repeat; 458 | background-size: 100% 100%; 459 | transform: translate(-50%, -50%); 460 | } 461 | 462 | /* 引导 */ 463 | .app-guide { 464 | display: none; 465 | margin: .85rem .3rem 1rem .1rem; 466 | } 467 | 468 | .app-guide img { 469 | display: block; 470 | width: 100%; 471 | } 472 | 473 | .app-guide li { 474 | margin-top: .3rem; 475 | } 476 | 477 | .app-guide p { 478 | margin: .15rem .1rem 0 .3rem; 479 | } 480 | 481 | .app-guide p em { 482 | font-weight: bold; 483 | } 484 | 485 | /* 评分及评论 */ 486 | .comment-con { 487 | display: flex; 488 | } 489 | 490 | .comment-left { 491 | flex: 1; 492 | } 493 | 494 | .comment-left strong { 495 | font-size: 60px; 496 | line-height: 43px; 497 | color: #4A4A4E; 498 | font-weight: bold; 499 | } 500 | 501 | .comment-left p { 502 | width: 91px; 503 | text-align: center; 504 | color: #7B7B7B; 505 | margin-top: 10px; 506 | } 507 | 508 | .comment-star-list li { 509 | line-height: 1; 510 | } 511 | .comment-right { 512 | width: 63.38308%; 513 | } 514 | .comment-right p { 515 | margin-top: 5px; 516 | color: #7B7B7B; 517 | text-align: right; 518 | } 519 | 520 | .comment-star, 521 | .comment-progress { 522 | display: inline-block; 523 | vertical-align: middle; 524 | } 525 | 526 | .comment-star { 527 | position: relative; 528 | width: 46px; 529 | height: 7px; 530 | } 531 | 532 | .comment-star img { 533 | display: block; 534 | width: 100%; 535 | height: 100%; 536 | } 537 | 538 | .comment-star div { 539 | position: absolute; 540 | left: 0; 541 | top: 0; 542 | height: 100%; 543 | background: #fff; 544 | } 545 | 546 | .comment-progress { 547 | position: relative; 548 | width: calc(100% - 56px); 549 | height: 2px; 550 | background: #E9E9EC; 551 | border-radius: 2px; 552 | } 553 | 554 | .comment-progress div { 555 | position: absolute; 556 | width: 0; 557 | height: 2px; 558 | background: #4A4A4E; 559 | border-radius: 2px; 560 | } 561 | 562 | .comment-star-list li:nth-child(1) .comment-progress div { 563 | width: 90%; 564 | } 565 | 566 | .comment-star-list li:nth-child(2) .comment-progress div { 567 | width: 10%; 568 | } 569 | 570 | .comment-star-list li:nth-child(2) .comment-star div { 571 | width: 20%; 572 | } 573 | 574 | .comment-star-list li:nth-child(3) .comment-star div { 575 | width: 40%; 576 | } 577 | 578 | .comment-star-list li:nth-child(4) .comment-star div { 579 | width: 60%; 580 | } 581 | 582 | .comment-star-list li:nth-child(5) .comment-star div { 583 | width: 80%; 584 | } 585 | 586 | /* 信息 */ 587 | 588 | 589 | .information-list li { 590 | display: flex; 591 | line-height: 3.5; 592 | border-bottom: #F2F2F2 1px solid; 593 | ; 594 | } 595 | 596 | .information-list li .l { 597 | color: #737379; 598 | } 599 | 600 | .information-list li .r { 601 | flex: 1; 602 | text-align: right; 603 | } 604 | .information-list li .r p { 605 | display: inline-block; 606 | vertical-align: middle; 607 | width: 80%; 608 | line-height: 1.2; 609 | } 610 | .information-list li:last-child { 611 | border: none; 612 | } 613 | 614 | /* 展开 */ 615 | .open-btn { 616 | float: right; 617 | font-size: .26rem; 618 | line-height: .48rem; 619 | color: #067AFE; 620 | } 621 | 622 | .hidden { 623 | display: none; 624 | } 625 | 626 | .mask { 627 | z-index: 2; 628 | display: none; 629 | position: fixed; 630 | top: 0; 631 | right: 0; 632 | bottom: 0; 633 | left: 0; 634 | background: rgba(0, 0, 0, .5); 635 | } 636 | 637 | .mask img { 638 | position: absolute; 639 | top: 0; 640 | right: 0; 641 | width: 80%; 642 | } 643 | 644 | .disclaimer { 645 | padding: 10px; 646 | color: rgba(153, 153, 153, 1); 647 | background: rgba(249, 249, 249, 1); 648 | } 649 | /* 弹框流程 */ 650 | .mask-box { 651 | z-index: 2; 652 | position: relative; 653 | display: none; 654 | } 655 | 656 | .mask-colsed { 657 | z-index: 2; 658 | position: absolute; 659 | right: 15px; 660 | top: 15px; 661 | width: 20px; 662 | } 663 | 664 | .mask-colsed img { 665 | display: block; 666 | width: 100%; 667 | } 668 | 669 | .mask-bg { 670 | position: fixed; 671 | top: 0; 672 | right: 0; 673 | bottom: 0; 674 | left: 0; 675 | background: rgba(0, 0, 0, .2) 676 | } 677 | 678 | .mask-pop { 679 | position: fixed; 680 | top: 50%; 681 | left: 50%; 682 | width: 80%; 683 | max-width: 300px; 684 | transform: translate(-50%, -50%); 685 | background: #fff; 686 | border-radius: 20px; 687 | overflow: hidden; 688 | } 689 | .video-pop { 690 | width: 250px; 691 | background:none; 692 | overflow:visible; 693 | } 694 | .video-pop .prism-player { 695 | background:none; 696 | } 697 | .video-pop .mask-colsed { 698 | right: -25px; 699 | top:0; 700 | } 701 | .video-pop #video { 702 | display: block; 703 | width: 100%; 704 | } 705 | /* */ 706 | .copy-url-img { 707 | display: block; 708 | width: 100%; 709 | } 710 | 711 | .copy-url { 712 | position: relative; 713 | margin: 20px 30px; 714 | height: 36px; 715 | line-height: 36px; 716 | background: #F1F6F9; 717 | border-radius: 18px; 718 | overflow: hidden; 719 | } 720 | 721 | .copy-url input { 722 | padding-left: 20px; 723 | color: #9A9A99; 724 | } 725 | 726 | .copy-url button { 727 | position: absolute; 728 | right: 0; 729 | top: 0; 730 | padding: 0 15px; 731 | height: 36px; 732 | line-height: 36px; 733 | background: linear-gradient(90deg, rgba(34, 125, 249, 1), rgba(0, 203, 250, 1)); 734 | color: #fff; 735 | border-radius: 0 18px 18px 0; 736 | } 737 | 738 | /* */ 739 | .file-info { 740 | display: block; 741 | margin: 30px 0 20px; 742 | font-size: 14px; 743 | color: #00B0F9; 744 | text-align: center; 745 | 746 | } 747 | 748 | .file-box { 749 | z-index: 2; 750 | display: none; 751 | position: fixed; 752 | top: 50%; 753 | left: 50%; 754 | padding: 20px; 755 | width: 70%; 756 | max-width: 300px; 757 | transform: translate(-50%, -50%); 758 | background: #fff; 759 | border-radius: 20px; 760 | 761 | } 762 | 763 | .file-box h3 { 764 | text-align: center; 765 | font-size: 16px; 766 | color: #3A3A3A; 767 | 768 | } 769 | 770 | .file-con { 771 | margin: 20px 0; 772 | font-size: 14px; 773 | color: #777; 774 | } 775 | 776 | .file-con strong { 777 | display: block; 778 | margin-top: 20px; 779 | color: #333; 780 | } 781 | 782 | .file-con p { 783 | margin-top: 8px; 784 | } 785 | 786 | .colsed-btn { 787 | display: block; 788 | margin: 0 auto; 789 | width: 80%; 790 | height: 40px; 791 | line-height: 40px; 792 | background: linear-gradient(90deg, rgba(32, 124, 249, 1), rgba(0, 205, 250, 1)); 793 | border-radius: 20px; 794 | font-size: 14px; 795 | color: #fff; 796 | text-align: center; 797 | } 798 | 799 | /* swiper */ 800 | .swiper-container { 801 | width: 100%; 802 | } 803 | 804 | .swiper-slide img { 805 | display: block; 806 | width: 100%; 807 | } 808 | 809 | .swiper-slide p { 810 | margin: 10px 0; 811 | text-align: center; 812 | font-size: 14px; 813 | color: #0491F7; 814 | } 815 | 816 | .mask-pop .swiper-container .swiper-pagination { 817 | position: static; 818 | } 819 | 820 | .swiper-pagination-bullet { 821 | background: #DBF0FD; 822 | opacity: 1; 823 | } 824 | 825 | .swiper-pagination-bullet-active { 826 | background: #0491F7; 827 | 828 | } 829 | 830 | /* 加载框 */ 831 | .loading-box { 832 | position: fixed; 833 | top: 0; 834 | right: 0; 835 | bottom: 0; 836 | left: 0; 837 | background: rgba(255, 255, 255, .9) 838 | } 839 | 840 | .loading-box span { 841 | display: block; 842 | position: absolute; 843 | top: 50%; 844 | left: 50%; 845 | margin: -.8rem 0 0 -.8rem; 846 | width: 1.6rem; 847 | height: 1.6rem; 848 | box-sizing: border-box; 849 | border-radius: 100%; 850 | border: .08rem solid rgba(22, 39, 65, .2); 851 | border-right-color: #2A9FF6; 852 | overflow: hidden; 853 | animation: three-quarters-loader 700ms infinite cubic-bezier(0, 0, .75, .91); 854 | } 855 | /* 电脑展示 */ 856 | .pc-box { 857 | display: none; 858 | text-align: center; 859 | } 860 | .pc-box .info { 861 | font-size: 16px; 862 | font-weight: bold; 863 | } 864 | .pc-logo { 865 | width: 160px; 866 | border-radius: 20px; 867 | overflow: hidden; 868 | margin: 20px auto 0; 869 | } 870 | .pc-logo img { 871 | display: block; 872 | width: 100%; 873 | } 874 | .pc-box > p { 875 | font-size: 20px; 876 | font-weight: 400; 877 | line-height: 1.5em; 878 | } 879 | .pc-box .code { 880 | width: 231px; 881 | height: 231px; 882 | } 883 | /* 图片展示 */ 884 | .imgs-box { 885 | width: 87.5%; 886 | margin: 0 auto 20px; 887 | } 888 | .imgs-box .swiper-slide { 889 | display: inline-block; 890 | vertical-align: bottom; 891 | width: auto; 892 | margin: 0; 893 | margin-right: 3.3vw; 894 | padding: 0; 895 | padding-bottom: .75em; 896 | white-space: normal; 897 | font-size: 12px; 898 | } 899 | .imgs-box .swiper-slide img { 900 | display: block; 901 | width: auto; 902 | height: auto; 903 | min-width: 52vw; 904 | max-width: 82vw; 905 | max-height: 65vh; 906 | border-radius: 10px; 907 | } -------------------------------------------------------------------------------- /static/css/ios/swiper.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Swiper 3.4.2 3 | * Most modern mobile touch slider and framework with hardware accelerated transitions 4 | * 5 | * http://www.idangero.us/swiper/ 6 | * 7 | * Copyright 2017, Vladimir Kharlampidi 8 | * The iDangero.us 9 | * http://www.idangero.us/ 10 | * 11 | * Licensed under MIT 12 | * 13 | * Released on: March 10, 2017 14 | */ 15 | .swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:35%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-moz-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-moz-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}} -------------------------------------------------------------------------------- /static/css/pc/index.css: -------------------------------------------------------------------------------- 1 | .bogo-banner-text { 2 | position: absolute; 3 | margin-left: 150px; 4 | } 5 | 6 | .banner-index{ 7 | width: 100%; 8 | height: 570px; 9 | background: url('../img/banner_bac.png') no-repeat; 10 | background-size: 100% 100%; 11 | } 12 | .bogo-index-tiyan { 13 | background: #29cead; 14 | border-radius: 5px; 15 | font-size: 2rem; 16 | font-weight: 400; 17 | color: rgba(255, 255, 255, 1); 18 | text-align: center; 19 | box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5); 20 | width: 160px; 21 | height: 48px; 22 | line-height: 48px; 23 | transition: all 0.2s; 24 | -webkit-transition: all 0.2s; 25 | -moz-transition: all 0.2s; 26 | -o-transition: all 0.2s; 27 | cursor: pointer; 28 | margin-top: 50px; 29 | } 30 | 31 | .tech-module{ 32 | height: 599px; 33 | width: 100%; 34 | background-color: #fff; 35 | overflow: hidden; 36 | } 37 | .tech-module-box{ 38 | width: 1200px; 39 | height: 447px; 40 | background: url('../images/abg.png') no-repeat; 41 | background-size: 100% 100%; 42 | margin: 0 auto; 43 | } 44 | .tech-module-box-a{ 45 | width: 25%; 46 | float: left; 47 | margin-top: 70px; 48 | } 49 | .tech-module-box-b{ 50 | width:260px; 51 | height:274px; 52 | background:rgba(255,255,255,1); 53 | border-radius:20px; 54 | margin: 0 auto; 55 | box-shadow: 0px 0px 5px #c0c0c0; 56 | text-align: center; 57 | } 58 | .tech-module-box-b img{ 59 | width: 141px; 60 | height: 141px; 61 | margin-top: 39px; 62 | } 63 | .tech-module-box-b p{ 64 | font-size:22px; 65 | font-weight:bold; 66 | color:rgba(52,52,52,1); 67 | } 68 | .tech-top{ 69 | text-align: center; 70 | margin-top: 40px; 71 | } 72 | .tech-top p{ 73 | font-size: 20px; 74 | } 75 | .bogo-chengji{ 76 | width: 100%; 77 | height:740px; 78 | background:rgba(244,250,249,1); 79 | overflow: hidden; 80 | } 81 | .bogo-chengji-left{ 82 | float: left; 83 | margin-top: 200px; 84 | } 85 | 86 | 87 | #main-menu-user li.user { 88 | display: none 89 | } 90 | 91 | .banner { 92 | width: 100%; 93 | height: 570px; 94 | text-align: center; 95 | overflow: hidden; 96 | } 97 | 98 | .banner_inner { 99 | width: 1000%; 100 | } 101 | 102 | .banner_box { 103 | width: 100%; 104 | height: 570px; 105 | background: url('http://ffqiniu.bugukj.com/banner_bac.png') no-repeat; 106 | background-size: 100% 100%; 107 | float: left; 108 | overflow: hidden; 109 | } 110 | 111 | .banner-box-box { 112 | width: 1200px; 113 | margin: 0 auto; 114 | } 115 | 116 | .banner-box-top { 117 | float: left; 118 | text-align: left; 119 | columns: #fff; 120 | margin-top: 113px; 121 | } 122 | 123 | .banner-box-top h2 { 124 | color: #fff; 125 | margin-bottom: 48px; 126 | font-size: 52px; 127 | } 128 | 129 | .banner-box-top p { 130 | font-size: 22px; 131 | line-height: 48px; 132 | color: #fff; 133 | margin-bottom: 50px; 134 | } 135 | 136 | .banner-box-top a { 137 | padding: 12px 28px; 138 | background: #fff; 139 | color: #3BCDAE; 140 | text-decoration: none; 141 | border-radius: 32px; 142 | font-size: 22px; 143 | } 144 | 145 | .banner_ul { 146 | height: 100px; 147 | position: absolute; 148 | z-index: 99; 149 | margin-left: 45%; 150 | margin-top: 500px; 151 | } 152 | 153 | .banner_ul li { 154 | width: 15px; 155 | height: 15px; 156 | border-radius: 50%; 157 | background: #c0c0c0; 158 | float: left; 159 | cursor: pointer; 160 | margin-left: 10px; 161 | list-style: none; 162 | } 163 | 164 | .banner-box-box img { 165 | height: 436px; 166 | float: right; 167 | margin-top: 60px; 168 | } 169 | 170 | .banner_ul .active { 171 | background: #fff; 172 | } 173 | 174 | 175 | .bogo-chengji-left { 176 | float: left; 177 | margin-top: 220px; 178 | } 179 | 180 | .bogo-chengji-center { 181 | width: 752px; 182 | height: 592px; 183 | background: url(http://ffqiniu.bugukj.com/achievement_bc.png) no-repeat; 184 | background-size: 100% 100%; 185 | margin: 0 auto; 186 | margin-top: 32px; 187 | } 188 | 189 | .bogo-chengji-center-a { 190 | width: 120px; 191 | text-align: center; 192 | color: #fff; 193 | position: absolute; 194 | } 195 | 196 | .bogo-chengji-center-a p { 197 | font-size: 14px; 198 | } 199 | 200 | .bogo-chengji-center-a h4 { 201 | font-size: 30px; 202 | } 203 | 204 | .bogo-chengji-a { 205 | margin-top: 186px; 206 | margin-left: 40px; 207 | } 208 | 209 | .bogo-chengji-b { 210 | margin-top: 430px; 211 | margin-left: 160px; 212 | } 213 | 214 | .bogo-chengji-c { 215 | width: 160px; 216 | margin-top: 440px; 217 | margin-left: 420px; 218 | } 219 | 220 | .bogo-chengji-d { 221 | margin-top: 190px; 222 | margin-left: 600px; 223 | } 224 | -------------------------------------------------------------------------------- /static/css/pc/login.css: -------------------------------------------------------------------------------- 1 | .login-box{ 2 | width:1050px; 3 | height:650px; 4 | background:rgba(255,255,255,1); 5 | box-shadow:0px 3px 7px 0px rgba(0, 0, 0, 0.35); 6 | border-radius:10px; 7 | margin: 0 auto; 8 | margin-top: 50px; 9 | overflow: hidden; 10 | } 11 | .login-box-logo{ 12 | width: 198px; 13 | height: 136px; 14 | margin-bottom: 36px; 15 | } 16 | .login-box-bottom{ 17 | width: 100%; 18 | margin-top: 36px; 19 | } 20 | .login-box-bottom-left{ 21 | width: 463px; 22 | height: 361px; 23 | margin-left: 29px; 24 | float: left; 25 | } 26 | .login-box-bottom-right{ 27 | width: 450px; 28 | float: right; 29 | margin-right: 29px; 30 | } 31 | .form-group input{ 32 | width: 420px; 33 | background: #fff; 34 | border: 0; 35 | outline:none; 36 | height: 50px; 37 | 38 | margin-top: 10px; 39 | } 40 | .captcha-f{ 41 | width: 420px; 42 | height: 50px; 43 | border-bottom: solid 1px #DBDBDB; 44 | margin-bottom: 10px; 45 | } 46 | .captcha-f input{ 47 | width: 259px; 48 | height: 49px; 49 | background: #fff; 50 | border: 0; 51 | outline:none; 52 | } 53 | .form-group-ou input{ 54 | border-bottom: solid 1px #DBDBDB; 55 | } 56 | .register-left{ 57 | float: left; 58 | } 59 | .register-left a{ 60 | color: #3BCDAE; 61 | font-size: 16px; 62 | } 63 | .findpassword-right{ 64 | float: right;; 65 | margin-right: 29px; 66 | } 67 | .findpassword-right a{ 68 | color: #999; 69 | font-size: 16px; 70 | } -------------------------------------------------------------------------------- /static/css/pc/modal.css: -------------------------------------------------------------------------------- 1 | .check_file { 2 | position: relative; 3 | display: inline-block; 4 | cursor: pointer; 5 | font-size: 18px; 6 | color: #fff; 7 | text-align: center; 8 | overflow: hidden; 9 | border-radius: 5px; 10 | background-color: rgb(41, 142, 255); 11 | width: 200px; 12 | height: 50px; 13 | line-height: 50px; 14 | } 15 | .check_file input { 16 | margin-bottom: 10px; 17 | position: absolute; 18 | font-size: 100px; 19 | right: 0; 20 | top: 0; 21 | opacity: 0; 22 | } 23 | .check_file:hover { 24 | background-color: rgb(41, 111, 255); 25 | color: #fff; 26 | } 27 | .scroll-layer { 28 | max-height: 750px; 29 | overflow-y: auto; 30 | overflow-x: hidden 31 | } 32 | 33 | .scroll-layer::-webkit-scrollbar { 34 | width: 2px 35 | } 36 | ::-webkit-scrollbar-thumb { 37 | background-color: #c5ccd4; 38 | -webkit-border-radius: 10px; 39 | outline: 2px solid #c6ced7; 40 | outline-offset: -2px; 41 | border: 2px solid #c6ced7 42 | } 43 | 44 | ::-webkit-scrollbar-track-piece { 45 | background-color: transparent; 46 | -webkit-border-radius: 0 47 | } 48 | 49 | ::-webkit-scrollbar { 50 | width: 6px; 51 | height: 9px 52 | } 53 | 54 | .add-app[data-aqxd] { 55 | margin-top: 20px; 56 | height: 100px; 57 | } 58 | 59 | .add-app .ivu-steps[data-aqxd] { 60 | width: 450px; 61 | margin: 0 auto; 62 | } 63 | 64 | .add-app .ivu-steps .ivu-steps-item[data-aqxd] { 65 | position: relative; 66 | } 67 | 68 | .add-app .ivu-steps .ivu-steps-item .ivu-steps-title[data-aqxd] { 69 | position: absolute; 70 | left: 20px; 71 | top: 40px 72 | } 73 | 74 | .ivu-steps { 75 | font-size: 0; 76 | width: 100%; 77 | line-height: 1.5 78 | } 79 | 80 | .add-app .ivu-steps-item:first-child { 81 | float: none; 82 | text-align: center; 83 | } 84 | 85 | .add-app .ivu-steps-item:first-child .ivu-steps-main { 86 | position: absolute; 87 | top: 55px; 88 | left: -7px; 89 | font-size: 16px 90 | } 91 | 92 | li[data-aqxd], ul[data-aqxd] { 93 | list-style: none 94 | } 95 | 96 | .ivu-steps .ivu-steps-tail { 97 | width: 100%; 98 | padding: 0 10px; 99 | position: absolute; 100 | left: 0; 101 | top: 13px 102 | } 103 | 104 | .ivu-steps .ivu-steps-tail > i { 105 | display: inline-block; 106 | width: 100%; 107 | height: 1px; 108 | vertical-align: top; 109 | background: #e8eaec; 110 | border-radius: 1px; 111 | position: relative 112 | } 113 | 114 | .ivu-steps .ivu-steps-tail > i:after { 115 | content: ""; 116 | width: 0; 117 | height: 100%; 118 | background: #e8eaec; 119 | opacity: 0; 120 | position: absolute; 121 | top: 0 122 | } 123 | .ivu-steps-tail { 124 | top: 20px !important 125 | } 126 | .ivu-steps .ivu-steps-head { 127 | background: #fff 128 | } 129 | .ivu-steps .ivu-steps-head, .ivu-steps .ivu-steps-main { 130 | position: relative; 131 | display: inline-block; 132 | vertical-align: top; 133 | right: 10px; 134 | bottom: 9px; 135 | } 136 | .ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner { 137 | background: #dfe1e6 138 | } 139 | .ivu-steps-item.ivu-steps-status-wait .ivu-steps-content, .ivu-steps-item.ivu-steps-status-wait .ivu-steps-title { 140 | color: #999 141 | } 142 | .add-app-item-info[data-aqxd] { 143 | margin-top: -22px 144 | } 145 | .add-app-item-info dl[data-aqxd] { 146 | width: 90%; 147 | margin-left: 10% 148 | } 149 | .add-app-item-info dl dd[data-aqxd] { 150 | margin-bottom: 5px; 151 | line-height: 2 152 | } 153 | .add-app-item[data-aqxd] { 154 | text-align: center; 155 | padding-top: 20px; 156 | } 157 | .add-p[data-aqxd] { 158 | margin: 17px 0 31px 159 | } 160 | .ivu-steps-item.ivu-steps-status-wait .ivu-steps-head-inner span { 161 | color: #fff 162 | } 163 | 164 | .ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner > .ivu-steps-icon, .ivu-steps-item.ivu-steps-status-process .ivu-steps-head-inner span { 165 | color: #fff 166 | } 167 | 168 | .add-app-item-info dl .point[data-aqxd]:before { 169 | content: " "; 170 | display: inline-block; 171 | vertical-align: middle; 172 | width: 6px; 173 | height: 6px; 174 | margin-right: 10px; 175 | background: #2a9ff6; 176 | border-radius: 50% 177 | } 178 | .add-app .ivu-steps-head-inner { 179 | width: 40px; 180 | height: 40px; 181 | line-height: 40px; 182 | font-size: 20px; 183 | font-weight: 700; 184 | border: 0 185 | } 186 | 187 | .ivu-steps .ivu-steps-head-inner { 188 | display: block; 189 | color: #2d8cf0; 190 | width: 180px; 191 | /*height: 49px;*/ 192 | line-height: 45px; 193 | text-align: center; 194 | /*border: 1px solid #ccc;*/ 195 | /*border-radius: 10%;*/ 196 | font-size: 30px; 197 | /*-webkit-transition: background-color .2s ease-in-out;*/ 198 | /*transition: background-color .2s ease-in-out;*/ 199 | } 200 | .add-app .ivu-steps-item:nth-child(2) { 201 | width: 200px !important 202 | } 203 | 204 | .add-app .ivu-steps-item:nth-child(2) .ivu-steps-main { 205 | position: absolute; 206 | top: 55px; 207 | left: 5px; 208 | font-size: 16px 209 | } 210 | 211 | .add-app .ivu-steps-item:nth-child(3) { 212 | width: 40px !important 213 | } 214 | 215 | .add-app .ivu-steps-item:nth-child(3) .ivu-steps-main { 216 | position: absolute; 217 | top: 55px; 218 | left: -7px; 219 | font-size: 16px 220 | } 221 | 222 | .add-app .ivu-steps-item:nth-child(3) .ivu-steps-main .ivu-steps-title { 223 | width: 70px 224 | } -------------------------------------------------------------------------------- /static/css/pc/posted.css: -------------------------------------------------------------------------------- 1 | .secou{ 2 | width: 60%; 3 | height: 45px; 4 | line-height: 45px; 5 | border-radius: 5px; 6 | float: left; 7 | } 8 | .secou input{ 9 | width: 95%; 10 | height: 29px; 11 | padding: 5px 5px; 12 | border: none; 13 | } 14 | .secou-button{ 15 | width: 9%; 16 | float: left; 17 | } 18 | .secou-button input { 19 | width: 100%; 20 | height: 45px; 21 | border: none; 22 | background:rgba(255,255,255,1); 23 | box-shadow:0px 3px 17px 0px #c0c0c0; 24 | border-radius:10px; 25 | color: #3BCDAE; 26 | margin-left: 20px; 27 | } 28 | .secou-right{ 29 | width: 14%; 30 | height: 45px; 31 | background:rgba(59,205,174,1); 32 | box-shadow:0px 3px 17px 0px rgba(0, 0, 0, 0.07); 33 | border-radius:10px; 34 | text-align: center; 35 | line-height: 45px; 36 | color: #fff; 37 | float: right; 38 | cursor: pointer; 39 | } 40 | .secou-fleft{ 41 | width: 10%; 42 | height: 45px; 43 | background:#0097FF; 44 | box-shadow:0px 3px 17px 0px rgba(0, 0, 0, 0.07); 45 | border-radius:10px; 46 | text-align: center; 47 | line-height: 45px; 48 | color: #fff; 49 | float: left; 50 | cursor: pointer; 51 | margin-left: 4%; 52 | } 53 | .supindex-right-top{ 54 | width: 47.5%; 55 | height: 158px; 56 | margin-bottom: 20px; 57 | border-radius: 5px; 58 | padding: 15px 10px; 59 | float: left; 60 | } 61 | .supindex-right-top-text{ 62 | font-size: 18px; 63 | } 64 | .supindex-right-bottom{ 65 | width: 80%; 66 | margin: 0 auto; 67 | margin-top: 30px; 68 | } 69 | .sup-index-public-text{ 70 | font-size:22px; 71 | color: #0097ff; 72 | font-weight: bold; 73 | float: left; 74 | } 75 | .sup-index-public-text2{ 76 | font-size: 16px; 77 | float: right; 78 | color: #999; 79 | margin-top: 10px; 80 | } 81 | .supindex-right-bottom-a{ 82 | height: 40px; 83 | } 84 | .supindex-right-bottom-b{ 85 | width: 100%; 86 | background: #ccc; 87 | height: 6px; 88 | border-radius: 3px; 89 | overflow: hidden; 90 | } 91 | .supindex-right-bottom-b-a{ 92 | width: 80%; 93 | height: 6px; 94 | background: #0097FF; 95 | } 96 | .sup-index-public-textp{ 97 | font-size:22px; 98 | color: #FD9705; 99 | font-weight: bold; 100 | float: left; 101 | } 102 | 103 | .supindex-right-bottom-b-b{ 104 | width: 80%; 105 | height: 6px; 106 | background: #FD9705; 107 | } -------------------------------------------------------------------------------- /static/css/pc/style.css: -------------------------------------------------------------------------------- 1 | @CHARSET "UTF-8"; 2 | body { 3 | padding-top: 70px; 4 | background: #f0f0f0; 5 | } 6 | 7 | body.body-white { 8 | background: #fff; 9 | } 10 | 11 | .navbar-fixed-top, .navbar-fixed-bottom { 12 | position: fixed; 13 | } 14 | 15 | .navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top { 16 | margin-right: 0px; 17 | margin-left: 0px; 18 | } 19 | 20 | .navbar .nav .user { 21 | padding: 0; 22 | line-height: 70px; 23 | } 24 | 25 | .navbar .nav .user .headicon { 26 | margin: 0 5px; 27 | height: 30px; 28 | } 29 | 30 | .navbar .nav .user .caret { 31 | vertical-align: middle; 32 | margin: 0 5px; 33 | } 34 | 35 | /*tc widget*/ 36 | .tc-main { 37 | margin-top: 80px; 38 | } 39 | 40 | /*tc-box*/ 41 | .tc-box { 42 | background: #fff; 43 | padding: 5px 10px; 44 | margin: 0 0 10px 0; 45 | } 46 | 47 | .body-white .tc-box{ 48 | border: solid 1px #eee; 49 | } 50 | 51 | .tc-box.first-box { 52 | margin: 0 0 10px 0; 53 | } 54 | 55 | .tc-box.article-box { 56 | padding: 5px 20px; 57 | } 58 | 59 | /*tc-box end */ 60 | 61 | /* The blog boxes */ 62 | /*.tc-gridbox { 63 | background-color: #ececec; 64 | -webkit-border-radius: 0px; 65 | -moz-border-radius: 0px; 66 | border-radius: 0px; 67 | -webkit-box-shadow: 0px 1px 1px #a8a8a8; 68 | -moz-box-shadow: 0px 1px 1px #a8a8a8; 69 | box-shadow: 0px 1px 1px #a8a8a8; 70 | margin-bottom: 40px; 71 | }*/ 72 | .tc-gridbox-container { 73 | width: 25%; 74 | float: left; 75 | } 76 | 77 | .tc-gridbox { 78 | -webkit-border-radius: 0px; 79 | -moz-border-radius: 0px; 80 | border-radius: 0px; 81 | border: solid 1px #eee; 82 | background: #fff; 83 | cursor: pointer; 84 | } 85 | 86 | .tc-gridbox { 87 | margin: 0 10px 20px 10px; 88 | } 89 | 90 | .tc-gridbox:hover { 91 | -webkit-box-shadow: 0 0 10px 1px rgba(50, 50, 50, 0.1); 92 | -moz-box-shadow: 0 0 10px 1px rgba(50, 50, 50, 0.1); 93 | box-shadow: 0 0 10px 1px rgba(50, 50, 50, 0.1); 94 | } 95 | 96 | .tc-gridbox a { 97 | text-decoration: none; 98 | } 99 | 100 | @media ( min-width: 768px) and (max-width: 979px) { 101 | .tc-gridbox { 102 | display: block; 103 | float: none; 104 | width: 95%; 105 | } 106 | } 107 | 108 | @media ( max-width: 979px) { 109 | .tc-gridbox-container { 110 | display: block; 111 | float: none; 112 | width: 100%; 113 | } 114 | 115 | .tc-gridbox { 116 | margin: 0 0 10px 0; 117 | } 118 | } 119 | 120 | .tc-gridbox .header { 121 | padding-top: 0px; 122 | padding-right: 0px; 123 | padding-left: 0px; 124 | text-align: center; 125 | background: #fff; 126 | } 127 | 128 | .tc-gridbox .footer { 129 | padding: 5px 14px 5px 14px; 130 | text-align: right; 131 | background: #fff; 132 | } 133 | 134 | .tc-gridbox .header .item-image { 135 | overflow: hidden; 136 | width: 100%; 137 | height: 0; 138 | padding-bottom: 100%; 139 | } 140 | 141 | .tc-gridbox .header img { 142 | margin-bottom: 5px; 143 | width: 100%; 144 | /*-webkit-transition: all 0.8s ease-in-out;*/ 145 | /*-moz-transition: all 0.8s ease-in-out;*/ 146 | /*-o-transition: all 0.8s ease-in-out;*/ 147 | /*-ms-transition: all 0.8s ease-in-out;*/ 148 | /*transition: all 0.8s ease-in-out;*/ 149 | } 150 | 151 | .tc-gridbox .header img:hover { 152 | 153 | /*-webkit-transform: scale(1.2) rotate(2deg);*/ 154 | /*-moz-transform: scale(1.2) rotate(2deg);*/ 155 | /*-o-transform: scale(1.2) rotate(2deg);*/ 156 | /*-ms-transform: scale(1.2) rotate(2deg);*/ 157 | /*transform: scale(1.2) rotate(2deg);*/ 158 | } 159 | 160 | .tc-gridbox .header h3 { 161 | color: #454a4e; 162 | margin: 0 5px; 163 | font-size: 16px; 164 | text-overflow: ellipsis; 165 | overflow: hidden; 166 | line-height: 24px; 167 | } 168 | 169 | .tc-gridbox .header h3 a, 170 | .tc-gridbox .header h3 a:focus, 171 | .tc-gridbox .header h3 a:hover { 172 | color: #454a4e; 173 | white-space: nowrap; 174 | } 175 | 176 | .tc-gridbox .header .meta { 177 | color: #5a6065; 178 | } 179 | 180 | .tc-gridbox .header hr { 181 | border-top-color: #eee; 182 | border-bottom: none; 183 | margin: 5px 0; 184 | } 185 | 186 | .tc-gridbox .body { 187 | padding-right: 14px; 188 | padding-left: 14px; 189 | margin-bottom: 14px; 190 | color: #343a3f; 191 | } 192 | 193 | .tc-gridbox .body a { 194 | color: #666; 195 | } 196 | 197 | .tc-gridbox .body a:hover { 198 | color: #428bca; 199 | } 200 | 201 | .tc-gridbox .btn { 202 | float: right; 203 | margin-right: 10px; 204 | margin-bottom: 18px; 205 | } 206 | 207 | /*masonary*/ 208 | 209 | .masonary-container .item { 210 | margin-bottom: 20px; 211 | } 212 | 213 | .masonary-container .item h3 { 214 | line-height: 100%; 215 | } 216 | 217 | .masonary-container .grid-sizer, .masonary-container .item { 218 | width: 24.9%; 219 | margin: 10px 0.05%; 220 | float: left; 221 | zoom: 1; 222 | } 223 | 224 | @media ( max-width: 479px) { 225 | .masonary-container .grid-sizer, .masonary-container .item { 226 | width: 98%; 227 | margin: 10px 1%; 228 | float: left; 229 | zoom: 1; 230 | } 231 | } 232 | 233 | @media ( min-width: 480px) and (max-width: 767px) { 234 | .masonary-container .grid-sizer, .masonary-container .item { 235 | width: 48%; 236 | margin: 10px 1%; 237 | float: left; 238 | zoom: 1; 239 | } 240 | } 241 | 242 | /*list Boxes 243 | ------------------------------------*/ 244 | .list-boxes { 245 | overflow: hidden; 246 | padding: 15px 20px; 247 | margin-bottom: 25px; 248 | background: #fff; 249 | -webkit-transition: all 0.3s ease-in-out; 250 | -moz-transition: all 0.3s ease-in-out; 251 | -o-transition: all 0.3s ease-in-out; 252 | transition: all 0.3s ease-in-out; 253 | word-wrap: break-word; 254 | word-break: break-all; 255 | border: solid 1px #eee; 256 | } 257 | 258 | .list-boxes:hover { 259 | border: solid 1px #ddd; 260 | } 261 | 262 | .list-boxes h2 a { 263 | color: #555; 264 | } 265 | 266 | .list-boxes:hover h2 a { 267 | color: #f90; 268 | } 269 | 270 | .list-boxes .list-actions a { 271 | font-size: 16px; 272 | text-decoration: none; 273 | } 274 | 275 | .list-boxes p a { 276 | color: #72c02c; 277 | } 278 | 279 | .list-boxes .list-boxes-img li i { 280 | color: #72c02c; 281 | font-size: 12px; 282 | margin-right: 5px; 283 | } 284 | 285 | .list-boxes .list-boxes-img img { 286 | display: block; 287 | margin: 5px 10px 10px 0; 288 | } 289 | 290 | .list-boxes h2 { 291 | margin-top: 0; 292 | font-size: 20px; 293 | line-height: 20px; 294 | } 295 | 296 | .list-boxes ul.list-boxes-rating li { 297 | display: inline; 298 | } 299 | 300 | .list-boxes ul.list-boxes-rating li i { 301 | color: #f8be2c; 302 | cursor: pointer; 303 | font-size: 16px; 304 | } 305 | 306 | .list-boxes ul.list-boxes-rating li i:hover { 307 | color: #f8be2c; 308 | } 309 | 310 | /*list Colored Boxes*/ 311 | .list-boxes-colored p, 312 | .list-boxes-colored h2 a, 313 | .list-boxes-colored .list-boxes-img li, 314 | .list-boxes-colored .list-boxes-img li i { 315 | color: #fff; 316 | } 317 | 318 | /*Red list Box*/ 319 | .list-boxes-red { 320 | background: #e74c3c; 321 | } 322 | 323 | /*Blue list Box*/ 324 | .list-boxes-blue { 325 | background: #3498db; 326 | } 327 | 328 | /*Grey list Box*/ 329 | .list-boxes-grey { 330 | background: #95a5a6; 331 | } 332 | 333 | /*Turquoise list Box*/ 334 | .list-boxes-sea { 335 | background: #1abc9c; 336 | } 337 | 338 | /*Turquoise Top Bordered list Box*/ 339 | .list-boxes-top-sea { 340 | border-top: solid 2px #1abc9c; 341 | } 342 | 343 | .list-boxes-top-sea:hover { 344 | border-top-color: #16a085; 345 | } 346 | 347 | /*Yellow Top Bordered list Box**/ 348 | .list-boxes-top-yellow { 349 | border-top: solid 2px #f1c40f; 350 | } 351 | 352 | .list-boxes-top-yellow:hover { 353 | border-top-color: #f39c12; 354 | } 355 | 356 | /*Orange Left Bordered list Box**/ 357 | .list-boxes-left-orange { 358 | border-left: solid 2px #e67e22; 359 | } 360 | 361 | .list-boxes-left-orange:hover { 362 | border-left-color: #d35400; 363 | } 364 | 365 | /*Green Left Bordered list Box**/ 366 | .list-boxes-left-green { 367 | border-left: solid 2px #72c02c; 368 | } 369 | 370 | .list-boxes-left-green:hover { 371 | border-left-color: #5fb611; 372 | } 373 | 374 | /*Green Right Bordered list Box**/ 375 | .list-boxes-right-u { 376 | border-right: solid 2px #72c02c; 377 | } 378 | 379 | .list-boxes-right-u:hover { 380 | border-right-color: #5fb611; 381 | } 382 | 383 | /*comments*/ 384 | .comment { 385 | margin-bottom: 10px; 386 | } 387 | 388 | .comment .avatar { 389 | height: 40px; 390 | width: 40px; 391 | } 392 | 393 | .comment-body { 394 | overflow: hidden; 395 | } 396 | 397 | .comment-content { 398 | padding-bottom: 2px; 399 | word-break: break-all; 400 | word-wrap: break-word; 401 | } 402 | 403 | .comment > .pull-left { 404 | margin-right: 10px; 405 | } 406 | 407 | .comment .time { 408 | color: #ccc; 409 | font-size: 12px; 410 | line-height: 14px; 411 | } 412 | 413 | .comment-postbox-wraper { 414 | 415 | } 416 | 417 | .comment-postbox { 418 | width: 100%; 419 | padding: 10px; 420 | } 421 | 422 | .comment-reply-box { 423 | position: relative; 424 | } 425 | 426 | .comment-reply-box .textbox { 427 | width: 100% 428 | } 429 | 430 | .comment-reply-submit .btn { 431 | margin-top: 20px; 432 | } 433 | 434 | /*ranking box*/ 435 | 436 | .ranking ul li { 437 | padding: 5px 0; 438 | height: 36px; 439 | line-height: 36px; 440 | overflow: hidden; 441 | text-overflow: ellipsis; 442 | white-space: nowrap; 443 | border-bottom: 1px dashed #f0f0f0; 444 | } 445 | 446 | .ranking ul.unstyled li i { 447 | margin-right: 5px; 448 | } 449 | 450 | .ranking li i { 451 | display: inline-block; 452 | width: 20px; 453 | height: 20px; 454 | line-height: 20px; 455 | margin-right: 15px; 456 | font-style: normal; 457 | font-weight: bold; 458 | color: #FFF; 459 | text-align: center; 460 | vertical-align: middle; 461 | background-color: #aaa; 462 | } 463 | 464 | .ranking li.top3 i { 465 | background: #FC9B0B; 466 | } 467 | 468 | /*comment ranking box*/ 469 | .comment-ranking .comment-ranking-inner { 470 | padding: 10px; 471 | background: #f7f7f7; 472 | position: relative; 473 | margin-bottom: 10px; 474 | /*border-top: solid 2px #eee;*/ 475 | } 476 | 477 | .comment-ranking .comment-ranking-inner, 478 | .comment-ranking .comment-ranking-inner:after, 479 | .comment-ranking .comment-ranking-inner:before { 480 | transition: all 0.3s ease-in-out; 481 | -o-transition: all 0.3s ease-in-out; 482 | -ms-transition: all 0.3s ease-in-out; 483 | -moz-transition: all 0.3s ease-in-out; 484 | -webkit-transition: all 0.3s ease-in-out; 485 | } 486 | 487 | .comment-ranking .comment-ranking-inner:after, 488 | .comment-ranking .comment-ranking-inner:before { 489 | width: 0; 490 | height: 0; 491 | right: 0px; 492 | bottom: 0px; 493 | content: " "; 494 | display: block; 495 | position: absolute; 496 | } 497 | 498 | .comment-ranking .comment-ranking-inner:after { 499 | border-top: 15px solid #eee; 500 | border-right: 15px solid transparent; 501 | border-left: 0px solid transparent; 502 | border-left-style: inset; /*FF fixes*/ 503 | border-right-style: inset; /*FF fixes*/ 504 | } 505 | 506 | .comment-ranking .comment-ranking-inner:before { 507 | border-bottom: 15px solid #fff; 508 | border-right: 0 solid transparent; 509 | border-left: 15px solid transparent; 510 | border-left-style: inset; /*FF fixes*/ 511 | border-bottom-style: inset; /*FF fixes*/ 512 | } 513 | 514 | .comment-ranking .comment-ranking-inner:hover { 515 | border-color: #FC9B0B; 516 | border-top-color: #FC9B0B; 517 | background: #f0f0f0; 518 | } 519 | 520 | .comment-ranking .comment-ranking-inner:hover:after { 521 | border-top-color: #FC9B0B; 522 | } 523 | 524 | .comment-ranking .comment-ranking-inner span.comment-time { 525 | color: #777; 526 | display: block; 527 | font-size: 11px; 528 | } 529 | 530 | .comment-ranking .comment-ranking-inner a { 531 | text-decoration: none; 532 | } 533 | 534 | .comment-ranking .comment-ranking-inner a:hover { 535 | text-decoration: underline; 536 | } 537 | 538 | .comment-ranking .comment-ranking-inner i.fa { 539 | top: 2px; 540 | color: #bbb; 541 | font-size: 18px; 542 | position: relative; 543 | } 544 | 545 | /*ThinkCMF Photos*/ 546 | ul.tc-photos { 547 | margin: 0; 548 | } 549 | 550 | .tc-photos li { 551 | display: inline; 552 | } 553 | 554 | .tc-photos li a { 555 | text-decoration: none; 556 | } 557 | 558 | .tc-photos li img { 559 | opacity: 0.6; 560 | width: 50px; 561 | height: 50px; 562 | margin: 0 2px 8px; 563 | border: 1px solid #ddd; 564 | } 565 | 566 | .tc-photos li img:hover { 567 | opacity: 1; 568 | border: 1px solid #f90; 569 | /* box-shadow: 0 0 0 1px #f90; */ 570 | } 571 | 572 | /**/ 573 | 574 | /*Blog Posts 575 | ------------------------------------*/ 576 | .posts .dl-horizontal a { 577 | } 578 | 579 | .posts .dl-horizontal { 580 | margin-bottom: 15px; 581 | overflow: hidden; 582 | } 583 | 584 | .posts .dl-horizontal dt { 585 | width: 60px; 586 | float: left; 587 | } 588 | 589 | .posts .dl-horizontal dt .img-wraper { 590 | display: block; 591 | width: 55px; 592 | height: 55px; 593 | padding: 1px; 594 | margin-top: 2px; 595 | border: solid 1px #ddd; 596 | } 597 | 598 | .posts .dl-horizontal dt img { 599 | width: 100%; 600 | height: 100%; 601 | /* width: 55px; 602 | height: 55px; 603 | padding: 1px; 604 | margin-top: 2px; 605 | border: solid 1px #ddd; */ 606 | } 607 | 608 | .posts .dl-horizontal dd { 609 | margin-left: 70px; 610 | } 611 | 612 | .posts .dl-horizontal dd p { 613 | margin: 0; 614 | } 615 | 616 | .posts .dl-horizontal dd a { 617 | font-size: 14px; 618 | line-height: 16px !important; 619 | } 620 | 621 | .posts .dl-horizontal dd a:hover { 622 | text-decoration: none; 623 | } 624 | 625 | .posts .dl-horizontal:hover dt img, 626 | .posts .dl-horizontal:hover dd a { 627 | color: #FC9B0B; 628 | border-color: #FC9B0B !important; 629 | -webkit-transition: all 0.4s ease-in-out; 630 | -moz-transition: all 0.4s ease-in-out; 631 | -o-transition: all 0.4s ease-in-out; 632 | transition: all 0.4s ease-in-out; 633 | } -------------------------------------------------------------------------------- /static/css/pc/sup.css: -------------------------------------------------------------------------------- 1 | .sup-banner{ 2 | width: 100%; 3 | height: 570px; 4 | overflow: hidden; 5 | background:url('http://ffqiniu.bugukj.com/banner_bac.png') no-repeat; 6 | background-size: 100% 100%; 7 | margin-top: 71px; 8 | 9 | } 10 | .sup-banner-box{ 11 | width: 1200px; 12 | margin: 0 auto; 13 | overflow: hidden; 14 | } 15 | 16 | .banner-box-top{ 17 | float: left; 18 | text-align: left; 19 | columns: #fff; 20 | margin-top: 130px; 21 | margin-left: 5px; 22 | } 23 | .banner-box-top h2{ 24 | color: #fff; 25 | margin-bottom: 48px; 26 | font-size: 52px; 27 | } 28 | 29 | .banner-box-top p{ 30 | font-size: 22px; 31 | line-height: 48px; 32 | color: #fff; 33 | margin-bottom: 50px; 34 | } 35 | 36 | .banner-box-top a{ 37 | padding: 13px 28px; 38 | background: #fff; 39 | color: #3BCDAE; 40 | text-decoration: none; 41 | border-radius:32px; 42 | font-size: 22px; 43 | border: none; 44 | margin-top: 3px; 45 | } 46 | .banner-box-top a:hover{ 47 | color: #3BCDAE; 48 | } 49 | .sup-banner-box img{ 50 | height: 436px; 51 | margin-top: 70px; 52 | float: right; 53 | margin-top: 60px; 54 | 55 | } 56 | .sup-bottom{ 57 | width: 100%; 58 | height: 464px; 59 | background-color: #F4FAF9; 60 | } 61 | .sup-bottom-box{ 62 | width: 1200px; 63 | margin: 0 auto; 64 | } 65 | .sup-bottom-box-a{ 66 | width: 33.33%; 67 | float: left; 68 | } 69 | .sup-bottom-box-b{ 70 | 71 | width:361px; 72 | height:274px; 73 | background:rgba(255,255,255,1); 74 | border-radius:10px 10px 10px 10px; 75 | margin: 0 auto; 76 | overflow: hidden; 77 | margin-top: 94px; 78 | } 79 | .sup-bottom-box-b-top { 80 | width: 297px; 81 | height: 100px; 82 | margin: 0 auto; 83 | margin-top: 38px; 84 | } 85 | .sup-bottom-box-b-top h4{ 86 | font-size: 22px; 87 | line-height: 40px; 88 | margin-top: 30px; 89 | float: left; 90 | } 91 | .sup-bottom-box-b-top img{ 92 | float: right; 93 | margin-top: 10px; 94 | } 95 | .sup-bottom-box-b p{ 96 | width: 297px; 97 | color: #999; 98 | margin: 0 auto; 99 | } 100 | .sup-bottom-box-apleft{ 101 | font-size: 36px; 102 | columns: #333; 103 | line-height: 57px; 104 | font-weight: bold; 105 | margin-top: 180px; 106 | } 107 | .sup-bottom-box-c{ 108 | border:2px solid rgba(55,205,173,1); 109 | box-shadow:0px 15px 20px 0px rgba(62,105,116,0.1); 110 | } -------------------------------------------------------------------------------- /static/css/pc/tube.css: -------------------------------------------------------------------------------- 1 | /** 2 | * @Author: JokenLiu 3 | * @Date: 2018-01-15 17:44:29 4 | * @Email: 190646521@qq.com 5 | * @Project: Demon 6 | * @Filename: tube.css 7 | * @Last modified by: Jason 8 | * @Last modified time: 2018-03-22 09:18:28 9 | * @Copyright: DemonLive 10 | */ 11 | 12 | html { 13 | height: 100%; 14 | } 15 | 16 | body { 17 | height: 100%; 18 | margin: 0; 19 | } 20 | 21 | .bogo-reg-content { 22 | margin: auto; 23 | } 24 | 25 | .bogo-user-auth-status { 26 | color: red; 27 | width: 100%; 28 | text-align: center; 29 | margin-top: 50px; 30 | } 31 | 32 | .container { 33 | width: 1200px; 34 | padding-left: 0 !important; 35 | margin: 0 auto; 36 | } 37 | 38 | .navbar-header { 39 | width: 16.8%; 40 | } 41 | 42 | .pad-left_right { 43 | 44 | } 45 | 46 | .navbar-header a { 47 | width: 100%; 48 | text-align: center; 49 | background: #29cead; 50 | color: #fff !important; 51 | font-size: 24px; 52 | } 53 | 54 | .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { 55 | margin-left: 0 !important; 56 | } 57 | 58 | #main-menu { 59 | width: 60%; 60 | } 61 | 62 | #main-menu .menu-item { 63 | width: 15%; 64 | } 65 | 66 | #main-menu .menu-item a { 67 | width: 100%; 68 | text-align: center; 69 | color: #000 !important; 70 | font-size: 16px; 71 | } 72 | 73 | #main-menu-user { 74 | margin-right: 10px; 75 | } 76 | 77 | .tube_left { 78 | height: 100%; 79 | margin: 0; 80 | padding: 0; 81 | } 82 | 83 | .tube-left1 { 84 | background: #fff; 85 | /*margin-top: 70px;*/ 86 | height: 100%; 87 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.1), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 88 | } 89 | 90 | /* 鎴戠殑宸︿晶 */ 91 | .tube-lgs { 92 | height: 50px; 93 | line-height: 50px; 94 | margin-top: 30px; 95 | } 96 | 97 | .tube-lyy { 98 | height: 50px; 99 | line-height: 50px; 100 | } 101 | 102 | .tube-bg { 103 | background: #eff2f4; 104 | } 105 | 106 | .tube-lgs i, .tube-lyy i { 107 | color: #819199; 108 | font-size: 18px; 109 | } 110 | 111 | .tube-lgs span, .tube-lyy span { 112 | padding-left: 20px; 113 | font-size: 16px; 114 | color: #424242; 115 | } 116 | 117 | .tube-bor { 118 | border: 1px solid #f4f4f4; 119 | margin: 10px 0px; 120 | } 121 | 122 | .tube-hei { 123 | height: calc(100% - 190px); 124 | width: 100%; 125 | overflow-x: hidden; 126 | overflow-y: scroll; 127 | } 128 | 129 | .tube-hei::-webkit-scrollbar { 130 | display: none; 131 | } 132 | 133 | .tube-type { 134 | width: 100%; 135 | height: 70px; 136 | border-bottom: 1px solid #f4f4f4; 137 | } 138 | 139 | .tube-img { 140 | height: 60px; 141 | padding-right: 0px !important; 142 | line-height: 60px; 143 | } 144 | 145 | .tube-img img { 146 | width: 80%; 147 | border-radius: 5%; 148 | } 149 | 150 | .tube-title { 151 | margin-top: 10px; 152 | height: 50px; 153 | } 154 | 155 | .tube-title1 { 156 | height: 25px; 157 | line-height: 25px; 158 | color: #5a5959; 159 | font-size: 16px; 160 | overflow: hidden; 161 | } 162 | 163 | .tube-title2 { 164 | height: 25px; 165 | line-height: 25px; 166 | color: #9e9e9e; 167 | font-size: 16px; 168 | } 169 | 170 | .tube-bgs:hover { 171 | background: #eff2f4; 172 | } 173 | 174 | /* 鎴戠殑搴旂敤鍙充晶 */ 175 | .tube-right { 176 | height: 100%; 177 | border-top: 1px solid #dddddd; 178 | padding: 10px 30px !important; 179 | } 180 | 181 | .tube-zil { 182 | height: 60px; 183 | line-height: 60px; 184 | margin-top: 10px; 185 | font-size: 20px; 186 | font-weight: 600; 187 | } 188 | 189 | 190 | .tube-user { 191 | height: auto; 192 | 193 | } 194 | 195 | .box_card { 196 | background: #fff; 197 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); 198 | } 199 | 200 | .tube_user_info { 201 | height: 140px; 202 | line-height: 50px; 203 | border-radius: 5px; 204 | } 205 | 206 | .tube-down-info { 207 | height: 140px; 208 | line-height: 140px; 209 | width: 31.4%; 210 | margin-left: 20px; 211 | border-radius: 5px; 212 | } 213 | 214 | .tube-down-info img { 215 | height: auto; 216 | } 217 | 218 | .tube-user-auth-info { 219 | height: 120px; 220 | margin-top: 25px; 221 | width: 150px; 222 | } 223 | 224 | .tube-user-name { 225 | height: 30px; 226 | line-height: 30px; 227 | font-size: 16px; 228 | color: #5a5959; 229 | } 230 | 231 | .tube-user-ren { 232 | height: 30px; 233 | line-height: 30px; 234 | font-size: 14px; 235 | } 236 | 237 | .boot-font { 238 | font-size: 16px; 239 | color: #00d5ed; 240 | top: 0px !important; 241 | } 242 | 243 | .boot-text { 244 | font-size: 14px; 245 | color: #878787; 246 | margin-left: 10px; 247 | } 248 | 249 | .tube-jpy { 250 | line-height: 140px; 251 | height: 140px; 252 | text-align: center; 253 | background: #3bca4c; 254 | color: #fff; 255 | } 256 | 257 | .tube-jpy i { 258 | font-size: 50px; 259 | } 260 | 261 | .glyphicon { 262 | top: 15px; 263 | } 264 | 265 | .tube-bord { 266 | border-left: 1px solid #ccc; 267 | border-right: 1px solid #ccc; 268 | } 269 | 270 | .tube-down-count { 271 | background: black; 272 | line-height: 140px; 273 | } 274 | 275 | .tube-yu { 276 | margin-top: 30px; 277 | font-size: 1vw; 278 | color: #686565; 279 | height: 30px; 280 | line-height: 30px; 281 | text-align: center; 282 | } 283 | 284 | .tube-yue { 285 | height: 20px; 286 | line-height: 20px; 287 | text-align: center; 288 | } 289 | 290 | .tube-yue span, .tube-chong span { 291 | font-size: 0.9vw; 292 | font-weight: 600; 293 | } 294 | 295 | .tube-chong { 296 | height: 30px; 297 | line-height: 30px; 298 | text-align: center; 299 | } 300 | 301 | .tube-chong a { 302 | padding: 1px 15px; 303 | background: #3bca4c; 304 | border-radius: 10px; 305 | color: #fff; 306 | } 307 | 308 | .tube-chong a:hover, .tube-tiz a:hover { 309 | text-decoration: none; 310 | } 311 | 312 | .tube-jpys { 313 | line-height: 140px; 314 | height: 140px; 315 | text-align: center; 316 | background: #00c5e3; 317 | color: #fff; 318 | } 319 | 320 | .tube-jpys i { 321 | font-size: 50px; 322 | } 323 | 324 | /* 甯哥敤 */ 325 | .tube-panel { 326 | padding: 10px; 327 | border-radius: 4px; 328 | } 329 | 330 | .table { 331 | margin-bottom: 0px !important; 332 | } 333 | 334 | .table .thead tr { 335 | background: #f5f6f8; 336 | color: black; 337 | } 338 | 339 | .table tbody tr { 340 | color: #5f5b5b; 341 | height: 80px; 342 | } 343 | 344 | .tube-row { 345 | height: 50px; 346 | } 347 | 348 | .tube-row img { 349 | height: 100%; 350 | border-radius: 50%; 351 | } 352 | 353 | .tube-yingy { 354 | height: 25px; 355 | line-height: 25px; 356 | } 357 | 358 | .tube-ying-t { 359 | height: 25px; 360 | line-height: 25px; 361 | color: #aeaeae; 362 | } 363 | 364 | .tube-tiz a { 365 | color: #fff; 366 | text-decoration: none !important; 367 | } 368 | 369 | .tube-tiz1 { 370 | background: #3bca4c !important; 371 | } 372 | 373 | /* 搴旂敤绠$悊璇︽儏 */ 374 | .details-til { 375 | height: 300px; 376 | margin-top: 35px; 377 | border-radius: 4px; 378 | } 379 | 380 | .details-type { 381 | height: 100px; 382 | margin-top: 20px; 383 | } 384 | 385 | .details-type-tou { 386 | height: 100%; 387 | } 388 | 389 | .details-type-to { 390 | height: 80%; 391 | } 392 | 393 | .details-type-to img { 394 | height: 100%; 395 | border-radius: 20px; 396 | margin-top: 10%; 397 | } 398 | 399 | .details-type-p { 400 | height: 60px; 401 | margin-top: 25px; 402 | } 403 | 404 | .details-type-p1 { 405 | font-size: 18px; 406 | margin-bottom: 10px; 407 | } 408 | 409 | .details-type-p2-1 { 410 | border-radius: 3px; 411 | border: 1px solid #22b040; 412 | color: #22b040; 413 | font-size: 10px; 414 | padding: 0 3px; 415 | margin-left: 2px; 416 | cursor: pointer; 417 | } 418 | 419 | .details-type-p2-2 { 420 | color: #828282; 421 | font-size: 1rem; 422 | } 423 | 424 | .details-type-p i { 425 | color: #6a6969; 426 | } 427 | 428 | .details-but, .details-but2,.details-but3{ 429 | margin-top: 40px; 430 | } 431 | 432 | .details-but a { 433 | padding: 5px 30px; 434 | background: #42cccc; 435 | color: #fff; 436 | 437 | font-size: 14px; 438 | box-sizing: border-box; 439 | text-align: right; 440 | color: #fff; 441 | border-radius: 3px; 442 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 443 | cursor: pointer; 444 | font-family: PingFang SC; 445 | } 446 | 447 | .details-but2 a { 448 | padding: 5px 30px; 449 | background: #46c691; 450 | font-size: 14px; 451 | box-sizing: border-box; 452 | text-align: right; 453 | color: #fff; 454 | border-radius: 3px; 455 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 456 | cursor: pointer; 457 | font-family: PingFang SC; 458 | } 459 | 460 | .details-ner { 461 | height: 100px; 462 | } 463 | 464 | .details-ner-lei { 465 | height: 100px; 466 | border-top: 1px solid #ccc; 467 | } 468 | 469 | .details-ner-lei-1 { 470 | height: 30px; 471 | line-height: 30px; 472 | margin-top: 20px; 473 | } 474 | 475 | .details-ner-lei-2 { 476 | color: #848484; 477 | word-wrap: break-word 478 | } 479 | 480 | .details-ner-lei-3 img:hover { 481 | width: 120px; 482 | height: 120px; 483 | } 484 | 485 | .table .thead1 tr { 486 | background: #fff; 487 | color: #000; 488 | } 489 | 490 | .details-tiz a { 491 | background: #ff7f14; 492 | } 493 | 494 | .tube-tiz12 { 495 | background: #f51919 !important; 496 | } 497 | 498 | /* 搴旂敤绠$悊缂栬緫 */ 499 | .editor-use { 500 | border: none; 501 | border-radius: 4px; 502 | background: #fff; 503 | } 504 | 505 | .editor-left { 506 | margin: 50px 50px; 507 | } 508 | 509 | #top { 510 | padding-top: 50px !important; 511 | } 512 | 513 | .list-group-item { 514 | border: 1px solid #e6e6e6 !important; 515 | padding: 20px 15px !important; 516 | } 517 | 518 | .posted-edit-t{ 519 | width: 12.5%; 520 | float: left; 521 | margin-top: 40px; 522 | border-top: 1px #eee solid; 523 | } 524 | 525 | /*浜岀淮鐮佸畾浣�*/ 526 | .erweim { 527 | position: relative; 528 | } 529 | 530 | .erweidw { 531 | position: absolute; 532 | top: 0px; 533 | right: 30px; 534 | } 535 | 536 | .erweidw { 537 | width: 80px; 538 | height: 80px; 539 | margin-right: -10px; 540 | display: none; 541 | } 542 | 543 | .erweidw img { 544 | width: 100%; 545 | } 546 | 547 | .ermxz { 548 | width: 75px; 549 | } 550 | 551 | .ermxz img { 552 | width: 100%; 553 | } 554 | 555 | .bor-xian { 556 | border: 1px solid #ccc; 557 | } 558 | 559 | .erweidws { 560 | position: absolute; 561 | top: -50px; 562 | right: 60px; 563 | display: none; 564 | } 565 | 566 | /*淇敼鏂囦欢鍚�*/ 567 | .editor-left1 { 568 | background: #dfdfdf; 569 | width: 100%; 570 | height: 200px; 571 | } 572 | .editor-form-box{ 573 | width: 100%; 574 | height: 120px; 575 | } 576 | .editor-left2 { 577 | width: 100px; 578 | height: 100px; 579 | margin: 0px auto; 580 | float: left; 581 | 582 | } 583 | 584 | .editor-left2 img { 585 | width: 100%; 586 | border-radius: 50%; 587 | } 588 | 589 | .editor-left4, .editor-left3 { 590 | text-align: center; 591 | float: left; 592 | margin-top: 10px; 593 | } 594 | .editor-left3{ 595 | margin-right: 50px; 596 | } 597 | .editor-left3 a { 598 | padding: 8px 12px; 599 | background: #3BCDAE; 600 | color: #fff; 601 | text-decoration: none !important; 602 | margin-top: 10px; 603 | font-size: 14px; 604 | box-sizing: border-box; 605 | text-align: right; 606 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 607 | cursor: pointer; 608 | font-family: PingFang SC; 609 | } 610 | 611 | .editor-left4 a { 612 | padding: 8px 12px; 613 | background: #0097FF; 614 | color: #fff; 615 | text-decoration: none !important; 616 | 617 | margin-top: 10px; 618 | font-size: 14px; 619 | box-sizing: border-box; 620 | text-align: right; 621 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 622 | cursor: pointer; 623 | font-family: PingFang SC; 624 | } 625 | .user-login { 626 | font-family: PingFang SC, Helvetica Neue, Helvetica, Hiragino Sans GB, Microsoft YaHei, \\5FAE\8F6F\96C5\9ED1, Arial, sans-serif !important; 627 | color: #082155 !important; 628 | font-weight: 500 !important; 629 | font-size: 20px !important; 630 | } 631 | 632 | .tab-pane { 633 | width: 100%; 634 | } 635 | 636 | /*鍚堝苟*/ 637 | .hebing-img { 638 | width: 100%; 639 | height: 50px; 640 | background: #f3f3f3; 641 | } 642 | 643 | .hebing-img1 { 644 | width: 50%; 645 | margin: 0 auto; 646 | } 647 | 648 | .hebing-img1 img { 649 | width: 100%; 650 | border-radius: 50%; 651 | } 652 | 653 | .hebing-top { 654 | margin-top: 20px; 655 | } 656 | 657 | .hebing-title { 658 | text-align: center; 659 | height: 40px; 660 | line-height: 40px; 661 | background: #c9c7c5; 662 | color: #fff; 663 | } 664 | 665 | .hebing-but { 666 | padding-top: 50px; 667 | padding-left: 37%; 668 | } 669 | 670 | .hebing-but a { 671 | padding: 10px 100px; 672 | border-radius: 10px; 673 | background: #3cae35; 674 | color: #fff; 675 | text-decoration: none !important; 676 | } 677 | 678 | .bogo-global-btn{ 679 | font-size: 14px; 680 | box-sizing: border-box; 681 | text-align: right; 682 | padding: 8px 10px; 683 | color: #fff; 684 | border-radius: 3px; 685 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 686 | background-color: #46c691;!important; 687 | cursor: pointer; 688 | font-family: PingFang SC; 689 | } 690 | 691 | .bogo-global-del-btn{ 692 | font-size: 14px; 693 | box-sizing: border-box; 694 | text-align: right; 695 | padding: 8px 18px; 696 | color: #fff; 697 | border-radius: 3px; 698 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 699 | background-color: red;!important; 700 | cursor: pointer; 701 | font-family: PingFang SC; 702 | } 703 | 704 | .bogo-recharge-btn{ 705 | margin-top: 10px; 706 | font-size: 14px; 707 | box-sizing: border-box; 708 | text-align: right; 709 | padding: 0px 16px; 710 | color: #fff; 711 | border-radius: 3px; 712 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 713 | background-color: red;!important; 714 | cursor: pointer; 715 | font-family: PingFang SC; 716 | 717 | } 718 | .add_certificate_content{ 719 | padding: 50px; 720 | margin-top: 30px; 721 | } 722 | .btn_add_certificate{ 723 | font-size: 14px; 724 | box-sizing: border-box; 725 | text-align: right; 726 | padding: 8px 18px; 727 | color: #fff; 728 | border-radius: 3px; 729 | box-shadow: 0 2px 4px 0 rgba(153,172,204,.47); 730 | background-color: #46c691;!important; 731 | cursor: pointer; 732 | font-family: PingFang SC; 733 | } 734 | 735 | .dev-aa{ 736 | float: left; 737 | padding: 0px 10px; 738 | } 739 | .dev-aa a{ 740 | width: 100%; 741 | text-align: center; 742 | color: #000 !important; 743 | font-size: 16px;line-height: 70px; 744 | text-decoration: none; 745 | } 746 | .dev-aa:hover{ 747 | padding: 0px 10px; 748 | background: #eff2f4; 749 | } 750 | .tube-panel-bottom{ 751 | border-radius:5px; 752 | } 753 | 754 | .body-all{ 755 | background: #ECEEEE 756 | } 757 | .editor-button-right{ 758 | float: right; 759 | } 760 | .editor-button-left{ 761 | float: left; 762 | } -------------------------------------------------------------------------------- /static/images/favicon_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/favicon_g.png -------------------------------------------------------------------------------- /static/images/ios/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/001.png -------------------------------------------------------------------------------- /static/images/ios/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/002.png -------------------------------------------------------------------------------- /static/images/ios/003.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/003.jpg -------------------------------------------------------------------------------- /static/images/ios/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/004.png -------------------------------------------------------------------------------- /static/images/ios/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/005.png -------------------------------------------------------------------------------- /static/images/ios/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/ios/006.png -------------------------------------------------------------------------------- /static/images/pc/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/001.png -------------------------------------------------------------------------------- /static/images/pc/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/002.png -------------------------------------------------------------------------------- /static/images/pc/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/003.png -------------------------------------------------------------------------------- /static/images/pc/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/004.png -------------------------------------------------------------------------------- /static/images/pc/005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/005.jpg -------------------------------------------------------------------------------- /static/images/pc/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/006.png -------------------------------------------------------------------------------- /static/images/pc/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/007.png -------------------------------------------------------------------------------- /static/images/pc/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/images/pc/008.png -------------------------------------------------------------------------------- /static/js/ios/clip.js: -------------------------------------------------------------------------------- 1 | !function (t, e) { 2 | "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.ClipboardJS = e() : t.ClipboardJS = e() 3 | }(this, function () { 4 | return function (n) { 5 | var o = {}; 6 | 7 | function r(t) { 8 | if (o[t]) return o[t].exports; 9 | var e = o[t] = {i: t, l: !1, exports: {}}; 10 | return n[t].call(e.exports, e, e.exports, r), e.l = !0, e.exports 11 | } 12 | 13 | return r.m = n, r.c = o, r.d = function (t, e, n) { 14 | r.o(t, e) || Object.defineProperty(t, e, {enumerable: !0, get: n}) 15 | }, r.r = function (t) { 16 | "undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t, Symbol.toStringTag, {value: "Module"}), Object.defineProperty(t, "__esModule", {value: !0}) 17 | }, r.t = function (e, t) { 18 | if (1 & t && (e = r(e)), 8 & t) return e; 19 | if (4 & t && "object" == typeof e && e && e.__esModule) return e; 20 | var n = Object.create(null); 21 | if (r.r(n), Object.defineProperty(n, "default", { 22 | enumerable: !0, 23 | value: e 24 | }), 2 & t && "string" != typeof e) for (var o in e) r.d(n, o, function (t) { 25 | return e[t] 26 | }.bind(null, o)); 27 | return n 28 | }, r.n = function (t) { 29 | var e = t && t.__esModule ? function () { 30 | return t.default 31 | } : function () { 32 | return t 33 | }; 34 | return r.d(e, "a", e), e 35 | }, r.o = function (t, e) { 36 | return Object.prototype.hasOwnProperty.call(t, e) 37 | }, r.p = "", r(r.s = 0) 38 | }([function (t, e, n) { 39 | "use strict"; 40 | var r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { 41 | return typeof t 42 | } : function (t) { 43 | return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t 44 | }, i = function () { 45 | function o(t, e) { 46 | for (var n = 0; n < e.length; n++) { 47 | var o = e[n]; 48 | o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) 49 | } 50 | } 51 | 52 | return function (t, e, n) { 53 | return e && o(t.prototype, e), n && o(t, n), t 54 | } 55 | }(), a = o(n(1)), c = o(n(3)), u = o(n(4)); 56 | 57 | function o(t) { 58 | return t && t.__esModule ? t : {default: t} 59 | } 60 | 61 | var l = function (t) { 62 | function o(t, e) { 63 | !function (t, e) { 64 | if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") 65 | }(this, o); 66 | var n = function (t, e) { 67 | if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 68 | return !e || "object" != typeof e && "function" != typeof e ? t : e 69 | }(this, (o.__proto__ || Object.getPrototypeOf(o)).call(this)); 70 | return n.resolveOptions(e), n.listenClick(t), n 71 | } 72 | 73 | return function (t, e) { 74 | if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); 75 | t.prototype = Object.create(e && e.prototype, { 76 | constructor: { 77 | value: t, 78 | enumerable: !1, 79 | writable: !0, 80 | configurable: !0 81 | } 82 | }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) 83 | }(o, c.default), i(o, [{ 84 | key: "resolveOptions", value: function () { 85 | var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; 86 | this.action = "function" == typeof t.action ? t.action : this.defaultAction, this.target = "function" == typeof t.target ? t.target : this.defaultTarget, this.text = "function" == typeof t.text ? t.text : this.defaultText, this.container = "object" === r(t.container) ? t.container : document.body 87 | } 88 | }, { 89 | key: "listenClick", value: function (t) { 90 | var e = this; 91 | this.listener = (0, u.default)(t, "click", function (t) { 92 | return e.onClick(t) 93 | }) 94 | } 95 | }, { 96 | key: "onClick", value: function (t) { 97 | var e = t.delegateTarget || t.currentTarget; 98 | this.clipboardAction && (this.clipboardAction = null), this.clipboardAction = new a.default({ 99 | action: this.action(e), 100 | target: this.target(e), 101 | text: this.text(e), 102 | container: this.container, 103 | trigger: e, 104 | emitter: this 105 | }) 106 | } 107 | }, { 108 | key: "defaultAction", value: function (t) { 109 | return s("action", t) 110 | } 111 | }, { 112 | key: "defaultTarget", value: function (t) { 113 | var e = s("target", t); 114 | if (e) return document.querySelector(e) 115 | } 116 | }, { 117 | key: "defaultText", value: function (t) { 118 | return s("text", t) 119 | } 120 | }, { 121 | key: "destroy", value: function () { 122 | this.listener.destroy(), this.clipboardAction && (this.clipboardAction.destroy(), this.clipboardAction = null) 123 | } 124 | }], [{ 125 | key: "isSupported", value: function () { 126 | var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : ["copy", "cut"], 127 | e = "string" == typeof t ? [t] : t, n = !!document.queryCommandSupported; 128 | return e.forEach(function (t) { 129 | n = n && !!document.queryCommandSupported(t) 130 | }), n 131 | } 132 | }]), o 133 | }(); 134 | 135 | function s(t, e) { 136 | var n = "data-clipboard-" + t; 137 | if (e.hasAttribute(n)) return e.getAttribute(n) 138 | } 139 | 140 | t.exports = l 141 | }, function (t, e, n) { 142 | "use strict"; 143 | var o, r = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { 144 | return typeof t 145 | } : function (t) { 146 | return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t 147 | }, i = function () { 148 | function o(t, e) { 149 | for (var n = 0; n < e.length; n++) { 150 | var o = e[n]; 151 | o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(t, o.key, o) 152 | } 153 | } 154 | 155 | return function (t, e, n) { 156 | return e && o(t.prototype, e), n && o(t, n), t 157 | } 158 | }(), a = n(2), c = (o = a) && o.__esModule ? o : {default: o}; 159 | var u = function () { 160 | function e(t) { 161 | !function (t, e) { 162 | if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") 163 | }(this, e), this.resolveOptions(t), this.initSelection() 164 | } 165 | 166 | return i(e, [{ 167 | key: "resolveOptions", value: function () { 168 | var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}; 169 | this.action = t.action, this.container = t.container, this.emitter = t.emitter, this.target = t.target, this.text = t.text, this.trigger = t.trigger, this.selectedText = "" 170 | } 171 | }, { 172 | key: "initSelection", value: function () { 173 | this.text ? this.selectFake() : this.target && this.selectTarget() 174 | } 175 | }, { 176 | key: "selectFake", value: function () { 177 | var t = this, e = "rtl" == document.documentElement.getAttribute("dir"); 178 | this.removeFake(), this.fakeHandlerCallback = function () { 179 | return t.removeFake() 180 | }, this.fakeHandler = this.container.addEventListener("click", this.fakeHandlerCallback) || !0, this.fakeElem = document.createElement("textarea"), this.fakeElem.style.fontSize = "12pt", this.fakeElem.style.border = "0", this.fakeElem.style.padding = "0", this.fakeElem.style.margin = "0", this.fakeElem.style.position = "absolute", this.fakeElem.style[e ? "right" : "left"] = "-9999px"; 181 | var n = window.pageYOffset || document.documentElement.scrollTop; 182 | this.fakeElem.style.top = n + "px", this.fakeElem.setAttribute("readonly", ""), this.fakeElem.value = this.text, this.container.appendChild(this.fakeElem), this.selectedText = (0, c.default)(this.fakeElem), this.copyText() 183 | } 184 | }, { 185 | key: "removeFake", value: function () { 186 | this.fakeHandler && (this.container.removeEventListener("click", this.fakeHandlerCallback), this.fakeHandler = null, this.fakeHandlerCallback = null), this.fakeElem && (this.container.removeChild(this.fakeElem), this.fakeElem = null) 187 | } 188 | }, { 189 | key: "selectTarget", value: function () { 190 | this.selectedText = (0, c.default)(this.target), this.copyText() 191 | } 192 | }, { 193 | key: "copyText", value: function () { 194 | var e = void 0; 195 | try { 196 | e = document.execCommand(this.action) 197 | } catch (t) { 198 | e = !1 199 | } 200 | this.handleResult(e) 201 | } 202 | }, { 203 | key: "handleResult", value: function (t) { 204 | this.emitter.emit(t ? "success" : "error", { 205 | action: this.action, 206 | text: this.selectedText, 207 | trigger: this.trigger, 208 | clearSelection: this.clearSelection.bind(this) 209 | }) 210 | } 211 | }, { 212 | key: "clearSelection", value: function () { 213 | this.trigger && this.trigger.focus(), window.getSelection().removeAllRanges() 214 | } 215 | }, { 216 | key: "destroy", value: function () { 217 | this.removeFake() 218 | } 219 | }, { 220 | key: "action", set: function () { 221 | var t = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : "copy"; 222 | if (this._action = t, "copy" !== this._action && "cut" !== this._action) throw new Error('Invalid "action" value, use either "copy" or "cut"') 223 | }, get: function () { 224 | return this._action 225 | } 226 | }, { 227 | key: "target", set: function (t) { 228 | if (void 0 !== t) { 229 | if (!t || "object" !== (void 0 === t ? "undefined" : r(t)) || 1 !== t.nodeType) throw new Error('Invalid "target" value, use a valid Element'); 230 | if ("copy" === this.action && t.hasAttribute("disabled")) throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute'); 231 | if ("cut" === this.action && (t.hasAttribute("readonly") || t.hasAttribute("disabled"))) throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes'); 232 | this._target = t 233 | } 234 | }, get: function () { 235 | return this._target 236 | } 237 | }]), e 238 | }(); 239 | t.exports = u 240 | }, function (t, e) { 241 | t.exports = function (t) { 242 | var e; 243 | if ("SELECT" === t.nodeName) t.focus(), e = t.value; else if ("INPUT" === t.nodeName || "TEXTAREA" === t.nodeName) { 244 | var n = t.hasAttribute("readonly"); 245 | n || t.setAttribute("readonly", ""), t.select(), t.setSelectionRange(0, t.value.length), n || t.removeAttribute("readonly"), e = t.value 246 | } else { 247 | t.hasAttribute("contenteditable") && t.focus(); 248 | var o = window.getSelection(), r = document.createRange(); 249 | r.selectNodeContents(t), o.removeAllRanges(), o.addRange(r), e = o.toString() 250 | } 251 | return e 252 | } 253 | }, function (t, e) { 254 | function n() { 255 | } 256 | 257 | n.prototype = { 258 | on: function (t, e, n) { 259 | var o = this.e || (this.e = {}); 260 | return (o[t] || (o[t] = [])).push({fn: e, ctx: n}), this 261 | }, once: function (t, e, n) { 262 | var o = this; 263 | 264 | function r() { 265 | o.off(t, r), e.apply(n, arguments) 266 | } 267 | 268 | return r._ = e, this.on(t, r, n) 269 | }, emit: function (t) { 270 | for (var e = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[t] || []).slice(), o = 0, r = n.length; o < r; o++) n[o].fn.apply(n[o].ctx, e); 271 | return this 272 | }, off: function (t, e) { 273 | var n = this.e || (this.e = {}), o = n[t], r = []; 274 | if (o && e) for (var i = 0, a = o.length; i < a; i++) o[i].fn !== e && o[i].fn._ !== e && r.push(o[i]); 275 | return r.length ? n[t] = r : delete n[t], this 276 | } 277 | }, t.exports = n 278 | }, function (t, e, n) { 279 | var d = n(5), h = n(6); 280 | t.exports = function (t, e, n) { 281 | if (!t && !e && !n) throw new Error("Missing required arguments"); 282 | if (!d.string(e)) throw new TypeError("Second argument must be a String"); 283 | if (!d.fn(n)) throw new TypeError("Third argument must be a Function"); 284 | if (d.node(t)) return s = e, f = n, (l = t).addEventListener(s, f), { 285 | destroy: function () { 286 | l.removeEventListener(s, f) 287 | } 288 | }; 289 | if (d.nodeList(t)) return a = t, c = e, u = n, Array.prototype.forEach.call(a, function (t) { 290 | t.addEventListener(c, u) 291 | }), { 292 | destroy: function () { 293 | Array.prototype.forEach.call(a, function (t) { 294 | t.removeEventListener(c, u) 295 | }) 296 | } 297 | }; 298 | if (d.string(t)) return o = t, r = e, i = n, h(document.body, o, r, i); 299 | throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList"); 300 | var o, r, i, a, c, u, l, s, f 301 | } 302 | }, function (t, n) { 303 | n.node = function (t) { 304 | return void 0 !== t && t instanceof HTMLElement && 1 === t.nodeType 305 | }, n.nodeList = function (t) { 306 | var e = Object.prototype.toString.call(t); 307 | return void 0 !== t && ("[object NodeList]" === e || "[object HTMLCollection]" === e) && "length" in t && (0 === t.length || n.node(t[0])) 308 | }, n.string = function (t) { 309 | return "string" == typeof t || t instanceof String 310 | }, n.fn = function (t) { 311 | return "[object Function]" === Object.prototype.toString.call(t) 312 | } 313 | }, function (t, e, n) { 314 | var a = n(7); 315 | 316 | function i(t, e, n, o, r) { 317 | var i = function (e, n, t, o) { 318 | return function (t) { 319 | t.delegateTarget = a(t.target, n), t.delegateTarget && o.call(e, t) 320 | } 321 | }.apply(this, arguments); 322 | return t.addEventListener(n, i, r), { 323 | destroy: function () { 324 | t.removeEventListener(n, i, r) 325 | } 326 | } 327 | } 328 | 329 | t.exports = function (t, e, n, o, r) { 330 | return "function" == typeof t.addEventListener ? i.apply(null, arguments) : "function" == typeof n ? i.bind(null, document).apply(null, arguments) : ("string" == typeof t && (t = document.querySelectorAll(t)), Array.prototype.map.call(t, function (t) { 331 | return i(t, e, n, o, r) 332 | })) 333 | } 334 | }, function (t, e) { 335 | if ("undefined" != typeof Element && !Element.prototype.matches) { 336 | var n = Element.prototype; 337 | n.matches = n.matchesSelector || n.mozMatchesSelector || n.msMatchesSelector || n.oMatchesSelector || n.webkitMatchesSelector 338 | } 339 | t.exports = function (t, e) { 340 | for (; t && 9 !== t.nodeType;) { 341 | if ("function" == typeof t.matches && t.matches(e)) return t; 342 | t = t.parentNode 343 | } 344 | } 345 | }]) 346 | }); -------------------------------------------------------------------------------- /static/js/ios/download.js: -------------------------------------------------------------------------------- 1 | var ua = navigator.userAgent; 2 | var unfold = '更多'; 3 | var packUp = '收起'; 4 | var copyTip = '链接复制成功,快去打开吧~'; 5 | var copyTipFalse = '链接复制失败,请手动复制url地址'; 6 | var openBrower = '请在自带浏览器中打开此网页'; 7 | var unit = '万'; 8 | var more = '更多'; 9 | var statePre = '软件准备中...'; 10 | var stateDown = '下载中'; 11 | var stateIns = '软件安装中...请至桌面查看'; 12 | var s = '秒'; 13 | var open = '打开'; 14 | var openDes = '在桌面打开'; 15 | var faileTip = '应用加载失败,请重试'; 16 | var only = '该应用只支持iOS,需在iOS设备Safari中访问及安装'; 17 | var lang = (navigator.systemLanguage ? navigator.systemLanguage : navigator.language); 18 | var lang = lang.substr(0, 2); 19 | if (!(lang == 'zh')) { 20 | unfold = 'more'; 21 | packUp = 'pack up'; 22 | copyTip = 'Copied successfully. Go and open it.'; 23 | openBrower = 'Open this page in your own browser'; 24 | unit = 'w'; 25 | more = 'More'; 26 | statePre = 'preparing...'; 27 | stateDown = 'Downloading'; 28 | stateIns = 'Installing...'; 29 | open = 'Open'; 30 | s = 's'; 31 | openDes = 'Open on the desktop'; 32 | faileTip = 'Failed to load, please try again'; 33 | only = 'Only supports iOS and needs to be accessed and installed on iOS device Safari.'; 34 | } 35 | $(function () { 36 | $('.mask-colsed').on('click', function () { 37 | $(this).parents('.mask-box').hide(); 38 | }); 39 | var copyBtn = new ClipboardJS('.copy-url button'); 40 | copyBtn.on('success', function (e) { 41 | alert(copyTip); 42 | $('.safari-tips').hide(); 43 | }); 44 | copyBtn.on('error', function (e) { 45 | alert(copyTipFalse); 46 | $('.safari-tips').hide(); 47 | }); 48 | $('.arouse').click(function () { 49 | $('.step-tips').show(); 50 | swiperFn(); 51 | }); 52 | if (localStorage.isPlist == 1) { 53 | $('.step1').hide(); 54 | $('.step2').hide(); 55 | $('.step3').hide(); 56 | $('.step4').show(); 57 | } 58 | //复制按键 59 | $('.copy-url input').val(location.host); 60 | //判定手机|pc 判定ios|Android 61 | if (/(iPhone|iPad|iPod|iOS)/i.test(ua)) { 62 | if ((/Safari/.test(ua) && !/Chrome/.test(ua) && !/baidubrowser/.test(ua))) { 63 | } else { 64 | var ual = ua.toLowerCase(); 65 | var isWeixin = ual.indexOf('micromessenger') != -1; 66 | if (isWeixin) { 67 | $('.mask').show(); 68 | $("html").add("body").css({"overflow": "hidden"}) 69 | } else { 70 | $('.safari-tips').show(); 71 | } 72 | } 73 | } else if (/(Android)/i.test(ua)) { 74 | var ual = ua.toLowerCase(); 75 | var isWeixin = ual.indexOf('micromessenger') != -1; 76 | if (isWeixin) { 77 | alert(openBrower) 78 | } 79 | } else { 80 | $('.contain-page').hide(); 81 | $('.pc-box').show(); 82 | } 83 | //动态控制更多显示 84 | var introBox = $('.app-intro-con'); 85 | for (var j = 0; j < introBox.length; j++) { 86 | var introHeight = introBox.eq(j).find('p').height(); 87 | var introBoxHeight = introBox.eq(j).height(); 88 | if (introHeight > introBoxHeight) { 89 | introBox.eq(j).find('span').show(); 90 | } else { 91 | introBox.eq(j).css('height', 'auto') 92 | introBox.eq(j).find('span').hide(); 93 | } 94 | } 95 | $('.app-intro-con span').on('click', function () { 96 | var $this = $(this); 97 | if ($this.html() == '更多' || $this.html() == 'more') { 98 | $('.app-intro-con').addClass('open'); 99 | $this.hide() 100 | } else { 101 | $('.app-intro-con').removeClass('open'); 102 | $this.html(unfold) 103 | } 104 | }); 105 | }); 106 | 107 | function bindInstallBtnEvent_new(setNum) { 108 | if (/(iPhone|iPad|iPod|iOS)/i.test(ua)) { 109 | if ((/Safari/.test(ua) && !/Chrome/.test(ua) && !/baidubrowser/.test(ua))) { 110 | if (setNum == 1) { 111 | $('.step3').html(stateDown);//下载中 112 | window.location.href = $(this).attr("data-url"); 113 | } else { 114 | //时钟计时且显示正在准备 115 | $('.step1').hide(); 116 | $('.step2').show(); 117 | $('.step2 span').html(statePre); 118 | $('.step3').hide(); 119 | $('.step4').hide(); 120 | $.ajax({ 121 | url: 'http://192.168.200.25:8000/resignapp/?t=1&taskId=zxcasd2qsadasdasdasdzxas&down_session=123', 122 | dataType: "json", 123 | success: function (rs) { 124 | if (rs.code == 1) { 125 | clearInterval(i); 126 | $('.step1').hide(); 127 | $('.step2').hide(); 128 | $('.step3').html(stateIns).show(); 129 | $('.step4').hide(); 130 | localStorage.setItem("isPlist", 1); 131 | window.location.href = "itms-services:///?action=download-manifest&url=https://192.168.200.25:8000/" + rs.ipa_upload_path + ".plist"; 132 | } else { 133 | //alert(faileTip); 134 | alert(rs.error_message); 135 | console.log(rs.code); 136 | } 137 | }, 138 | error: function (rs) { 139 | alert(faileTip); 140 | } 141 | }); 142 | var countDownTime = 150; 143 | i = setInterval(function () { 144 | //如果返回值不对 就继续下载秒数倒数 145 | if (countDownTime > 0) { 146 | $('#time').html(countDownTime + s); 147 | countDownTime--; 148 | } else { 149 | //如果下载秒数已经结束就显示下载失败 150 | clearInterval(i); 151 | $('.step3').addClass('download-loading'); 152 | $('.step3 span').html("准备文件失败" + ' ' + 1 + '%') 153 | $('.download-loading em').css("width", 1 + '%'); 154 | } 155 | }, 1000); 156 | } 157 | } else { 158 | $('.step1').click(function () { 159 | alert(only); 160 | }); 161 | } 162 | } else if (/(Android)/i.test(ua)) { 163 | $('.step1').click(function () { 164 | alert(only); 165 | }); 166 | } 167 | } 168 | 169 | function swiperFn() { 170 | alert("视频安装已关闭"); 171 | /*var swiper = new Swiper('.step-swiper', { 172 | pagination: '.step-swiper .swiper-pagination', 173 | paginationClickable: true, 174 | onSlideChangeEnd: function (swiper) { 175 | swiper.update(); 176 | } 177 | });*/ 178 | } -------------------------------------------------------------------------------- /static/mobileconfig/company.mobileprovision: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yhitee/ios_signature/7279d954a005155e5a14c9b5d58243a41b021930/static/mobileconfig/company.mobileprovision -------------------------------------------------------------------------------- /static/mobileconfig/udid.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadContent 6 | 7 | URL 8 | http://192.168.200.25:8000/udid/receive/ 9 | DeviceAttributes 10 | 11 | UDID 12 | IMEI 13 | ICCID 14 | VERSION 15 | PRODUCT 16 | 17 | 18 | Challenge 19 | optional challenge 20 | PayloadOrganization 21 | 授权安装APP进入下一步 = 22 | PayloadDisplayName 23 | 获取UDID--【点击安装】 = 24 | PayloadVersion 25 | 1 26 | PayloadUUID 27 | 3C4DC7D2-E475-3375-489C-0FVASDQWECCAS001BDGETUDID = 28 | PayloadIdentifier 29 | xxxxx.com.profile-service 30 | PayloadDescription 31 | 配置文件仅用于获取设备UDID,实际上不会安装在您的设备上。 = 32 | PayloadType 33 | Profile Service 34 | 35 | 36 | -------------------------------------------------------------------------------- /templates/ios/appinstall.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | items 6 | 7 | 8 | assets 9 | 10 | 11 | kind 12 | software-package 13 | url 14 | https://192.168.200.25:8000/media/{{ ipafilename }}.signed.ipa 15 | 16 | 17 | kind 18 | display-image 19 | url 20 | https://192.168.200.25:8000/40x40.png 21 | 22 | 23 | kind 24 | full-size-image 25 | url 26 | https://192.168.200.25:8000/512x512.png 27 | 28 | 29 | metadata 30 | 31 | bundle-identifier 32 | com.xxxxx.xx 33 | bundle-version 34 | 1.0 35 | kind 36 | software 37 | title 38 | App 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /templates/ios/install_app.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | App安装 20 | 21 | 22 |
23 |
24 | 27 |
28 | APP安装 29 |

工具

30 |
31 | ?安装教程 32 | 免费安装 33 | 34 | 35 | 36 |
37 |
38 |
39 |
40 |
41 | 4.9 42 |

3.41万个评分

43 |
44 |
45 | 3+ 46 |

年龄

47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 |
55 |
56 | 57 |
58 |

简介

59 |
60 |

61 | 更多 62 |
63 |
64 |
65 |

66 | 评分及评论

67 |
68 |
69 | 4.9 70 |

满分 5 分

71 |
72 |
73 |
    74 |
  • 75 |
    76 | 77 |
    78 |
    79 |
    80 |
    81 |
    82 |
  • 83 |
  • 84 |
    85 | 86 |
    87 |
    88 |
    89 |
    90 |
    91 |
  • 92 |
  • 93 |
    94 | 95 |
    96 |
    97 |
    98 |
    99 |
    100 |
  • 101 |
  • 102 |
    103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
  • 110 |
  • 111 |
    112 | 113 |
    114 |
    115 |
    116 |
    117 |
    118 |
  • 119 |
120 |

3.41万个评分

121 |
122 |
123 |
124 |
125 |

新功能

126 |
127 |

版本

128 |
129 |
130 |
131 |

信息

132 |
    133 |
  • 134 | 销售商 135 |
    136 |
  • 137 |
  • 138 | 大小 139 |
    140 |
  • 141 |
  • 142 | 类别 143 |
    工具
    144 |
  • 145 |
  • 146 | 兼容性 147 |
    148 |

    需要 iOS 8.0 或更高版本。与 iPhone、iPad 和 iPod touch 兼容。

    149 |
    150 |
  • 151 |
  • 152 | 语言 153 |
    简体中文
    154 |
  • 155 |
  • 156 | 年龄分级 157 |
    限4岁以上
    158 |
  • 159 |
  • 160 | 价格 161 |
    免费
    162 |
  • 163 |
  • 164 | 隐私政策 165 |
    166 |
  • 167 |
168 |
169 |
170 | 免责声明:
171 | 本网站仅提供下载托管,应用内容相关事项由开发者负责,与本网站无关。 172 |
173 |
174 | 175 |
176 |
177 |
178 |
179 | 180 | 181 |
182 | 183 | 184 |
185 |
186 |
187 |
188 |
189 | 192 |

APP超级签名

193 |
请使用手机访问下载
194 |
195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /templates/ios/install_mobileconfig.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | App安装 20 | 21 | 22 |
23 |
24 | 27 |
28 | APP安装 29 |

工具

30 |
31 | ?安装教程 32 | 免费安装 33 | 34 | 35 | 36 |
37 |
38 |
39 |
40 |
41 | 4.9 42 |

3.41万个评分

43 |
44 |
45 | 3+ 46 |

年龄

47 |
48 |
49 |
50 |
51 |
52 | 53 |
54 |
55 |
56 | 57 |
58 |

简介

59 |
60 |

61 | 更多 62 |
63 |
64 |
65 |

66 | 评分及评论

67 |
68 |
69 | 4.9 70 |

满分 5 分

71 |
72 |
73 |
    74 |
  • 75 |
    76 | 77 |
    78 |
    79 |
    80 |
    81 |
    82 |
  • 83 |
  • 84 |
    85 | 86 |
    87 |
    88 |
    89 |
    90 |
    91 |
  • 92 |
  • 93 |
    94 | 95 |
    96 |
    97 |
    98 |
    99 |
    100 |
  • 101 |
  • 102 |
    103 | 104 |
    105 |
    106 |
    107 |
    108 |
    109 |
  • 110 |
  • 111 |
    112 | 113 |
    114 |
    115 |
    116 |
    117 |
    118 |
  • 119 |
120 |

3.41万个评分

121 |
122 |
123 |
124 |
125 |

新功能

126 |
127 |

版本 {{ version }}

128 |
129 |
130 |
131 |

信息

132 |
    133 |
  • 134 | 销售商 135 |
    136 |
  • 137 |
  • 138 | 大小 139 |
    {{ app_size }} M
    140 |
  • 141 |
  • 142 | 类别 143 |
    工具
    144 |
  • 145 |
  • 146 | 兼容性 147 |
    148 |

    需要 iOS 8.0 或更高版本。与 iPhone、iPad 和 iPod touch 兼容。

    149 |
    150 |
  • 151 |
  • 152 | 语言 153 |
    简体中文
    154 |
  • 155 |
  • 156 | 年龄分级 157 |
    限4岁以上
    158 |
  • 159 |
  • 160 | 价格 161 |
    免费
    162 |
  • 163 |
  • 164 | 隐私政策 165 |
    166 |
  • 167 |
168 |
169 |
170 | 免责声明:
171 | 本网站仅提供下载托管,应用内容相关事项由开发者负责,与本网站无关。 172 |
173 |
174 | 175 |
176 |
177 |
178 |
179 | 180 | 181 |
182 | 183 | 184 |
185 |
186 |
187 |
188 |
189 | 192 |

APP超级签名

193 |
请使用手机访问下载
194 |
195 | 196 | 197 | 198 | 199 | 200 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /templates/pc/basetemplate.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | {% block title %}{% endblock %} | Giao分发 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {% block style %}{% endblock %} 18 | 19 | 20 | {% block body %} 21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /templates/pc/confirmskip.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 邮件确认 | Giao分发 7 | 8 | 9 | 19 | 20 | 21 |
22 |

23 | {{ message }} 跳转 等待时间: 5 24 |

25 |
26 | 39 | 40 | -------------------------------------------------------------------------------- /templates/pc/distribution.html: -------------------------------------------------------------------------------- 1 | {% extends 'pc/basetemplate.html' %} 2 | {% load static %} 3 | {% block title %}分发管理{% endblock %} 4 | {% block style %} 5 | 6 | 7 | {% endblock %} 8 | 9 | {% block body %} 10 | 11 | 12 | {% include 'pc/topnavtemplate.html' %} 13 | 14 |
15 | 16 | {% include 'pc/leftnavtemplate.html' %} 17 | 18 | 19 |
20 |
超级签名应用
21 | 22 |
23 |
24 |

公有池下载数量

25 |
26 |
27 |

{{ User_Used_Devices_Count }}次

28 |

共{{ User_Buy_Devices_Count }}次

29 |
30 |
31 |
32 |
33 |
34 |
35 | 36 |
37 | {% csrf_token %} 38 |
39 | 40 | 41 |
42 |
43 | 44 |
45 |
46 | 47 |
48 | 购买设备 49 |
50 | 51 | 52 |
53 | 发布应用 54 |
55 | 56 | 119 | 120 | 126 |
127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | {% for Packages in USER_PACKAGE_INFORMATION %} 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | {% if User_Buy_Devices_Count == 0 %} 152 | 153 | {% else %} 154 | 155 | {% endif %} 156 | 159 | 160 | {% endfor %} 161 | 162 | {% if message %} 163 |

{{ message }}

164 | {% endif %} 165 | 166 |
应用名称版本捆绑ID文件大小下载链接安装量上传时间上架状态操作
{{ Packages.display_name }}{{ Packages.version }}{{ Packages.bundid_before }}{{ Packages.file_size }} M{{ Packages.distribution_url }}{{ Packages.installed_amount }}{{ Packages.upload_datetime }}OffOn 157 | 删除
167 | 168 | 169 |
170 |
171 |
172 | 173 |
174 | 175 | 176 | 223 | 224 | {% endblock %} -------------------------------------------------------------------------------- /templates/pc/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'pc/basetemplate.html' %} 2 | {% load static %} 3 | {% block title %}首页{% endblock %} 4 | {% block style %} 5 | 6 | {% endblock %} 7 | 8 | {% block body %} 9 | 10 | 11 | {% include 'pc/topnavtemplate.html' %} 12 | 13 |
14 |
15 | 21 |
22 |
23 |
24 | 25 |
26 |
27 |
28 |

不一样的 iOS 签名
不一样的优点

29 |
30 |
31 |
32 |
33 |

IOS 超级签名

34 | 35 |
36 |

因机制与企业签名不同,掉签概率远低于企业签名
37 | 即便掉签,也只影响少数用户
38 | 同一台设备下载安装该应用不限制下载次数
39 | 按设备数量收费

40 |
41 |
42 |
43 |
44 |
45 |

IOS 企业签名

46 | 47 |
48 |

随着苹果审核越来越严格,掉签风险逐日剧增
49 | 每次掉签重新获客,成本极高
50 | 每次下载计算企业签名下载次数
51 | 按下载次数收费

52 |
53 |
54 |
55 |
56 | 57 | 58 | 59 | {% endblock %} -------------------------------------------------------------------------------- /templates/pc/leftnavtemplate.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | -------------------------------------------------------------------------------- /templates/pc/login.html: -------------------------------------------------------------------------------- 1 | {% extends 'pc/basetemplate.html' %} 2 | {% load static %} 3 | {% block title %}登录{% endblock %} 4 | {% block style %} 5 | 6 | {% endblock %} 7 | 8 | {% block body %} 9 | 10 | 61 | 62 | 63 | 72 | 73 | {% endblock %} -------------------------------------------------------------------------------- /templates/pc/nologinskip.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | 4 | 5 | 6 | 登录跳转 | Giao分发 7 | 8 | 9 | 19 | 20 | 21 |
22 |

:)

23 |

请登录

24 |

25 |

26 | 页面自动 跳转 等待时间: 3 27 |

28 |
29 | 42 | 43 | -------------------------------------------------------------------------------- /templates/pc/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'pc/basetemplate.html' %} 2 | {% load static %} 3 | {% block title %}注册{% endblock %} 4 | {% block style %} 5 | 6 | {% endblock %} 7 | 8 | {% block body %} 9 | 10 | 74 | 75 | 76 | 77 | 109 | 110 | {% endblock %} -------------------------------------------------------------------------------- /templates/pc/topnavtemplate.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | --------------------------------------------------------------------------------