├── .gitattributes ├── .idea ├── encodings.xml ├── inspectionProfiles │ └── Project_Default.xml ├── misc.xml ├── modules.xml ├── myProjects.iml ├── vcs.xml └── workspace.xml ├── Pipfile ├── Pipfile.lock ├── README.md ├── __pycache__ └── manage.cpython-37.pyc ├── db.sqlite3 ├── manage.py ├── myProjects ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── settings.cpython-37.pyc │ ├── urls.cpython-37.pyc │ └── wsgi.cpython-37.pyc ├── settings.py ├── urls.py └── wsgi.py └── myapp ├── __init__.py ├── __pycache__ ├── __init__.cpython-37.pyc ├── admin.cpython-37.pyc ├── apps.cpython-37.pyc ├── models.cpython-37.pyc ├── urls.cpython-37.pyc └── views.cpython-37.pyc ├── admin.py ├── apps.py ├── db.py ├── migrations ├── __init__.py └── __pycache__ │ └── __init__.cpython-37.pyc ├── models.py ├── static └── myapp │ ├── css │ ├── font-awesome │ │ ├── css │ │ │ ├── fa-brands.css │ │ │ ├── fa-brands.min.css │ │ │ ├── fa-regular.css │ │ │ ├── fa-regular.min.css │ │ │ ├── fa-solid.css │ │ │ ├── fa-solid.min.css │ │ │ ├── fontawesome-all.css │ │ │ ├── fontawesome-all.min.css │ │ │ ├── fontawesome.css │ │ │ └── fontawesome.min.css │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ ├── simple-line-icons │ │ ├── css │ │ │ └── simple-line-icons.css │ │ └── fonts │ │ │ ├── Simple-Line-Icons.eot │ │ │ ├── Simple-Line-Icons.svg │ │ │ ├── Simple-Line-Icons.ttf │ │ │ ├── Simple-Line-Icons.woff │ │ │ └── Simple-Line-Icons.woff2 │ └── styles.css │ ├── js │ ├── bootstrap │ │ └── js │ │ │ └── bootstrap.min.js │ ├── chart.js │ │ ├── chart.js │ │ └── chart.min.js │ ├── echarts │ │ ├── echarts-gl.min.js │ │ ├── echarts-stat │ │ │ └── ecStat.min.js │ │ ├── echarts.min.js │ │ └── wordcloud │ │ │ └── echarts-wordcloud.min.js │ ├── extension │ │ ├── bmap.min.js │ │ └── dataTool.min.js │ ├── jquery │ │ ├── jquery.js │ │ └── jquery.min.js │ ├── map │ │ ├── js │ │ │ ├── china-contour.js │ │ │ ├── china.js │ │ │ ├── province │ │ │ │ ├── anhui.js │ │ │ │ ├── aomen.js │ │ │ │ ├── beijing.js │ │ │ │ ├── chongqing.js │ │ │ │ ├── fujian.js │ │ │ │ ├── gansu.js │ │ │ │ ├── guangdong.js │ │ │ │ ├── guangxi.js │ │ │ │ ├── guizhou.js │ │ │ │ ├── hainan.js │ │ │ │ ├── hebei.js │ │ │ │ ├── heilongjiang.js │ │ │ │ ├── henan.js │ │ │ │ ├── hubei.js │ │ │ │ ├── hunan.js │ │ │ │ ├── jiangsu.js │ │ │ │ ├── jiangxi.js │ │ │ │ ├── jilin.js │ │ │ │ ├── liaoning.js │ │ │ │ ├── neimenggu.js │ │ │ │ ├── ningxia.js │ │ │ │ ├── qinghai.js │ │ │ │ ├── shandong.js │ │ │ │ ├── shanghai.js │ │ │ │ ├── shanxi.js │ │ │ │ ├── shanxi1.js │ │ │ │ ├── sichuan.js │ │ │ │ ├── taiwan.js │ │ │ │ ├── tianjin.js │ │ │ │ ├── xianggang.js │ │ │ │ ├── xinjiang.js │ │ │ │ ├── xizang.js │ │ │ │ ├── yunnan.js │ │ │ │ └── zhejiang.js │ │ │ └── world.js │ │ └── json │ │ │ ├── china-cities.json │ │ │ ├── china-contour.json │ │ │ ├── china.json │ │ │ ├── province │ │ │ ├── anhui.json │ │ │ ├── aomen.json │ │ │ ├── beijing.json │ │ │ ├── chongqing.json │ │ │ ├── fujian.json │ │ │ ├── gansu.json │ │ │ ├── guangdong.json │ │ │ ├── guangxi.json │ │ │ ├── guizhou.json │ │ │ ├── hainan.json │ │ │ ├── hebei.json │ │ │ ├── heilongjiang.json │ │ │ ├── henan.json │ │ │ ├── hubei.json │ │ │ ├── hunan.json │ │ │ ├── jiangsu.json │ │ │ ├── jiangxi.json │ │ │ ├── jilin.json │ │ │ ├── liaoning.json │ │ │ ├── neimenggu.json │ │ │ ├── ningxia.json │ │ │ ├── qinghai.json │ │ │ ├── shandong.json │ │ │ ├── shanghai.json │ │ │ ├── shanxi.json │ │ │ ├── shanxi1.json │ │ │ ├── sichuan.json │ │ │ ├── taiwan.json │ │ │ ├── tianjin.json │ │ │ ├── xianggang.json │ │ │ ├── xinjiang.json │ │ │ ├── xizang.json │ │ │ ├── yunnan.json │ │ │ └── zhejiang.json │ │ │ └── world.json │ ├── popper.js │ │ └── popper.min.js │ └── showInPage │ │ ├── detail.js │ │ └── index.js │ └── keywords.json ├── templates └── myapp │ ├── detail_page.html │ ├── home.html │ ├── index.html │ ├── monitor_page.html │ └── test.html ├── tests.py ├── urls.py └── views.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=Python 2 | *.css linguist-language=Python 3 | *.html linguist-language=Python 4 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/myProjects.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 29 | 31 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | django = "*" 10 | 11 | [requires] 12 | python_version = "3.7" 13 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "627ef89f247ecee27e9ef0dabe116108d09c47abf171c900a8817befa64f9dd2" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "django": { 20 | "hashes": [ 21 | "sha256:6fcc3cbd55b16f9a01f37de8bcbe286e0ea22e87096557f1511051780338eaea", 22 | "sha256:bb407d0bb46395ca1241f829f5bd03f7e482f97f7d1936e26e98dacb201ed4ec" 23 | ], 24 | "index": "pypi", 25 | "version": "==2.2.1" 26 | }, 27 | "pytz": { 28 | "hashes": [ 29 | "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", 30 | "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" 31 | ], 32 | "version": "==2019.1" 33 | }, 34 | "sqlparse": { 35 | "hashes": [ 36 | "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177", 37 | "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873" 38 | ], 39 | "version": "==0.3.0" 40 | } 41 | }, 42 | "develop": {} 43 | } 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # myProjects 2 | > 项目是对爬取的职位数据进行可视化显示,用到的插件是百度的echarts 3 | *** 4 | > 语言:Python 5 | 6 | > 框架:Django 7 | 8 | > 数据库:MongoDB 9 | 10 | > 数据来源:自己编写的职位信息爬虫从国内几个某著名招聘网站中抓取的信息 11 | 12 | > 处理逻辑简单,没有用到比较流行的AI基础,就是简单的统计分析,然后可是话(ps:自己坐着玩,小白一个,大神勿喷) 13 | 14 | > 可视化控件:百度echarts 15 | 16 | *** 17 | # 项目运行效果如下图 18 | 19 | ![image](https://github.com/Chauncey2/images/blob/master/index.png) 20 | 21 | # 互联网 22 | ![image](https://github.com/Chauncey2/images/blob/master/IT0.png) 23 | 24 | ![image](https://github.com/Chauncey2/images/blob/master/IT.png) 25 | ***** 26 | Djaong选用NoSQL真的是相当于砍掉了它的半壁江山啊~! 27 | -------------------------------------------------------------------------------- /__pycache__/manage.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/__pycache__/manage.cpython-37.pyc -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/db.sqlite3 -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myProjects.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /myProjects/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myProjects/__init__.py -------------------------------------------------------------------------------- /myProjects/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myProjects/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /myProjects/__pycache__/settings.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myProjects/__pycache__/settings.cpython-37.pyc -------------------------------------------------------------------------------- /myProjects/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myProjects/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /myProjects/__pycache__/wsgi.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myProjects/__pycache__/wsgi.cpython-37.pyc -------------------------------------------------------------------------------- /myProjects/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for myProjects project. 3 | 4 | Generated by 'django-admin startproject' using Django 2.2.1. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.2/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/2.2/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'vk*vxgor^3e3d&a&&!_w5ygdw)=gqp#46g_7=6z)_3)&f365dt' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | # 注册myapp(自己创建的app需要在此处注册,否则django识别不到) 34 | INSTALLED_APPS = [ 35 | 'myapp.apps.MyappConfig', 36 | 'django.contrib.admin', 37 | 'django.contrib.auth', 38 | 'django.contrib.contenttypes', 39 | 'django.contrib.sessions', 40 | 'django.contrib.messages', 41 | 'django.contrib.staticfiles', 42 | ] 43 | 44 | MIDDLEWARE = [ 45 | 'django.middleware.security.SecurityMiddleware', 46 | 'django.contrib.sessions.middleware.SessionMiddleware', 47 | 'django.middleware.common.CommonMiddleware', 48 | 'django.middleware.csrf.CsrfViewMiddleware', 49 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 50 | 'django.contrib.messages.middleware.MessageMiddleware', 51 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 | ] 53 | 54 | ROOT_URLCONF = 'myProjects.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | 'DIRS': [os.path.join(BASE_DIR, 'templates').replace('\\','/')], 60 | 'APP_DIRS': True, 61 | 'OPTIONS': { 62 | 'context_processors': [ 63 | 'django.template.context_processors.debug', 64 | 'django.template.context_processors.request', 65 | 'django.contrib.auth.context_processors.auth', 66 | 'django.contrib.messages.context_processors.messages', 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = 'myProjects.wsgi.application' 73 | 74 | 75 | # Database 76 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 77 | from mongoengine import connect 78 | connect("JobInfo") 79 | 80 | DATABASES = { 81 | 'default': { 82 | 'ENGINE': 'django.db.backends.sqlite3', 83 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 84 | } 85 | } 86 | 87 | 88 | # Password validation 89 | # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 90 | 91 | AUTH_PASSWORD_VALIDATORS = [ 92 | { 93 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 94 | }, 95 | { 96 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 97 | }, 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 100 | }, 101 | { 102 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 103 | }, 104 | ] 105 | 106 | 107 | # Internationalization 108 | # https://docs.djangoproject.com/en/2.2/topics/i18n/ 109 | 110 | LANGUAGE_CODE = 'en-us' 111 | 112 | TIME_ZONE = 'UTC' 113 | 114 | USE_I18N = True 115 | 116 | USE_L10N = True 117 | 118 | USE_TZ = True 119 | 120 | 121 | # Static files (CSS, JavaScript, Images) 122 | # https://docs.djangoproject.com/en/2.2/howto/static-files/ 123 | 124 | STATIC_URL = '/static/' 125 | -------------------------------------------------------------------------------- /myProjects/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.contrib import admin 3 | from django.urls import path,include 4 | 5 | urlpatterns = [ 6 | path('myapp/',include('myapp.urls')), 7 | path('admin/', admin.site.urls), 8 | ] 9 | -------------------------------------------------------------------------------- /myProjects/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for myProjects 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', 'myProjects.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /myapp/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__init__.py -------------------------------------------------------------------------------- /myapp/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/__pycache__/admin.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/admin.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/__pycache__/apps.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/apps.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/__pycache__/models.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/models.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/__pycache__/urls.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/urls.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/__pycache__/views.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/__pycache__/views.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /myapp/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MyappConfig(AppConfig): 5 | name = 'myapp' 6 | -------------------------------------------------------------------------------- /myapp/db.py: -------------------------------------------------------------------------------- 1 | from pymongo import * 2 | import operator 3 | import numpy as np 4 | import re 5 | 6 | HOST='127.0.0.1' 7 | PORT=27017 8 | DATABASE_NAME='JobInfo' 9 | COLLECTION_NAME='test' 10 | 11 | 12 | # 每个行业的关键字参数 13 | jobKey={ 14 | 0:['软件','互联网','系统集成','计算机','IT','硬件'], 15 | 1:['金融','投资','银行','证券','财产','理财','审计','基金','精算','保险','信托'], 16 | 2:['房地产','建筑','土木','工业','化工','物业','售楼'], 17 | 3:['贸易','销售','物流','零售','外贸','仓库','仓储','质量'], 18 | 4:['教育','传媒','广告','教师','编导','老师','策划','制片','美术','公关'], 19 | 5:['服务','客服','售后','旅游','医疗','护理'], 20 | 6:['市场','销售','SEO','活动','营销','农/林'], 21 | 7:['人事','财务','行政','人力','主管','出纳','会计'], 22 | } 23 | 24 | # 每个行业的工作职位名称关键字 25 | jobNameKey={ 26 | 0:['java','ui','web','前端','net','PHP','python','android','算法','数据分析','人工智能','电气','电子','测试','硬件' 27 | ,'深度学习','知识图谱','数据挖掘','机器学习','运营','大数据'], 28 | 1:['金融','投资','银行','证券','财产','理财','审计','信托','期货','操盘手','基金','精算','保险'], 29 | 2:['房地产','建筑','土木','工业','化工','土建','施工','电气','物业'], 30 | 3:['贸易','销售','物流','零售','外贸','仓库','仓储','质量','采购','货运'], 31 | 4:['教育','传媒','广告','教师','编导','老师','策划','制片','美术','公关' 32 | ,'幼教','记者','文案','平面设计','网页设计','插画师','工业设计','视觉设计'], 33 | 5:['服务','客服','售后','旅游','美容','美发','美甲','教练','收银','保安','保洁','保姆'], 34 | 6:['市场','销售','SEO','活动','营销','农/林'], 35 | 7:['人事','财务','行政','人力','主管','出纳','会计','税务','财务主管','法务主管','前台'], 36 | } 37 | 38 | # 首页视图函数 39 | def index_data(): 40 | conn = conn = MongoClient(HOST, PORT) 41 | db = conn[DATABASE_NAME] 42 | mycollection = db[COLLECTION_NAME] 43 | 44 | # 根据城市进行分组,获取城市职位数目数据,返回数组游标 45 | pipline=[ 46 | {"$group":{"_id":"$city","count":{"$sum":1}}} 47 | ] 48 | cursor=mycollection.aggregate(pipline) 49 | 50 | # 遍历游标,获取职位数据 51 | result_map=[] 52 | for item in cursor: 53 | data={"name":item['_id'],"value":item['count']} 54 | result_map.append(data) 55 | 56 | # 对城市进行排序,输出前一百条数据 57 | result_map=sorted(result_map,key=operator.itemgetter('value'))[-100:] 58 | 59 | # 获取dataAxis值和data1 60 | dataAxis=[] 61 | data1=[] 62 | for i in range(len(result_map)): 63 | dataAxis.append(result_map[i]['name']) 64 | data1.append(result_map[i]['value']) 65 | 66 | # 获取数据最大值 67 | yMax=np.max(data1) 68 | 69 | # 柱状图数据(封装为list) 70 | result_bar=[dataAxis,data1,yMax] 71 | result=[result_map,result_bar] 72 | 73 | # 获取饼状图数据 74 | pipline_pie=[ 75 | {"$group":{"_id":"$jobType","count":{"$sum":1}}} 76 | ] 77 | cursor2=mycollection.aggregate(pipline_pie) 78 | pie_jobType_list=['互联网','金融','房地产/建筑','贸易/销售','教育/传媒','服务业','市场/销售','人事/行政'] 79 | temp_cursor2=[] 80 | 81 | # 游标是一次迭代,不可回退,因此要用临时变量存储 82 | for item in cursor2: 83 | temp_cursor2.append(item) 84 | 85 | pie_dict_data=[] 86 | for i in range(len(pie_jobType_list)): 87 | value=0 88 | for item in temp_cursor2: 89 | if judge_contain_str(item["_id"],i): 90 | value+=item['count'] 91 | data={"value":value,"name":pie_jobType_list[i]} 92 | pie_dict_data.append(data) 93 | 94 | # print(pie_dict_data) 95 | 96 | result_pie=[pie_jobType_list,pie_dict_data] 97 | result.append(result_pie) 98 | 99 | conn.close() 100 | return result 101 | 102 | # 获取地图数据 103 | def get_map_data(page): 104 | conn=conn=MongoClient(HOST,PORT) 105 | db = conn[DATABASE_NAME] 106 | mycollection = db[COLLECTION_NAME] 107 | 108 | pipline=[ 109 | {'$group': {'_id': {'city':'$city','jobType':'$jobType'}, 'value': {'$sum': 1}}} 110 | ] 111 | 112 | cursor =mycollection.aggregate(pipline) 113 | 114 | city_key=set() 115 | temp_data=list() 116 | 117 | for item in cursor: 118 | city_key.add(item['_id']['city']) 119 | temp_data.append(item) 120 | 121 | result=[] 122 | 123 | for city in city_key: 124 | value = 0 125 | for item in temp_data: 126 | if item['_id']['city'] ==city: 127 | if judge_contain_str(item['_id']['jobType'],page): 128 | value+=item['value'] 129 | data={"_id":city,"value":value} 130 | result.append(data) 131 | 132 | conn.close() 133 | return result 134 | 135 | # 右侧上部柱状图,带滑动 136 | def top100_city_data(page): 137 | 138 | rel = get_map_data(page) 139 | # 对数据进行排序 140 | sorted_result = sorted(rel, key=operator.itemgetter('value')) 141 | 142 | # 取Top5的数据 143 | data = sorted_result[-100:] 144 | city_list = list() 145 | num_list = list() 146 | 147 | for i in range(len(data)): 148 | city_list.append(data[i]['_id']) 149 | num_list.append(data[i]['value']) 150 | 151 | yMax=np.max(num_list) 152 | result = [city_list, num_list,yMax] 153 | return result 154 | 155 | 156 | # 右侧上部柱状图(原函数) 157 | def top5level(page): 158 | 159 | rel=get_map_data(page) 160 | # 对数据进行排序 161 | sorted_result=sorted(rel,key=operator.itemgetter('value')) 162 | 163 | # 取Top5的数据 164 | data=sorted_result[-5:] 165 | city_list=list() 166 | num_list=list() 167 | 168 | for i in range(len(data)): 169 | city_list.append(data[i]['_id']) 170 | num_list.append(data[i]['value']) 171 | 172 | result=[city_list,num_list] 173 | return result 174 | 175 | # 右侧下部饼状图 176 | def to5LevelCityPie(page): 177 | rel=top5level(page) 178 | city=rel[0] 179 | pie_data=[] 180 | for i in range(len(rel[0])): 181 | pie_data.append({'value':rel[1][i],'name':city[i]}) 182 | 183 | result=[city,pie_data] 184 | return result 185 | 186 | # 词云 187 | def wordCloud(page): 188 | conn = conn = MongoClient(HOST, PORT) 189 | db = conn[DATABASE_NAME] 190 | mycollection = db[COLLECTION_NAME] 191 | 192 | pipline = [ 193 | {'$group': {'_id': {'skill':'$extractSkillTag','jobType':'$jobType'}}} 194 | ] 195 | cursor = mycollection.aggregate(pipline) 196 | 197 | skill_key=set() 198 | skill_all = [] 199 | # 获取技能词条并去重 200 | for item in cursor: 201 | # 对技能词条分类 202 | if judge_contain_str(item['_id']['jobType'],page): 203 | for i in range(len(item['_id']['skill'])): 204 | skill_key.add(item['_id']['skill'][i]) 205 | skill_all.append(item['_id']['skill'][i]) 206 | 207 | # 统计词频 208 | result=[] 209 | # data={"name": , "value": } 210 | for i in skill_key: 211 | value=0 212 | for item in skill_all: 213 | if item.__contains__(i): 214 | value+=1 215 | data={"name":i,"value":value} 216 | result.append(data) 217 | 218 | 219 | 220 | # 对结果排序,并取前100个词条 221 | result=sorted(result,key=operator.itemgetter('value')) 222 | result=result[-100:] 223 | 224 | # 关闭数据库连接 225 | conn.close() 226 | return result 227 | 228 | # 职位排名前五 229 | def getTop5JobNum(page): 230 | # 连接数据库 231 | conn = conn = MongoClient(HOST, PORT) 232 | db = conn[DATABASE_NAME] 233 | mycollection = db[COLLECTION_NAME] 234 | 235 | piplne=[ 236 | {'$group': {'_id': {'jobType':'$jobType','jobName':'$jobName'},"count":{"$sum":1}}} 237 | ] 238 | cursor=mycollection.aggregate(piplne) 239 | 240 | temp_cursor=[] 241 | for item in cursor: 242 | temp_cursor.append(item) 243 | 244 | # 筛选对应工作中类的数据 245 | jobType_data=[] 246 | for item in temp_cursor: 247 | if judge_contain_str(item["_id"]["jobType"],page): 248 | data={"jobName":item["_id"]["jobName"],"value":item["count"]} 249 | jobType_data.append(data) 250 | 251 | result_dict=[] 252 | for jk in jobNameKey[page]: 253 | value=0 254 | for item in jobType_data: 255 | if judge_jobName_str(item['jobName'],jk): 256 | value+=item['value'] 257 | data={'jobName':jk,'value':value} 258 | result_dict.append(data) 259 | 260 | # 如何合并教育产业中,教师和老师的值? 261 | if page==4: 262 | value=0 263 | temp=result_dict 264 | for item in temp: 265 | if item['jobName']=='老师' or item["jobName"]=="教师": 266 | value+=item['value'] 267 | result_dict.remove(item) 268 | data={"jobName":"教师","value":value} 269 | result_dict.append(data) 270 | 271 | # 对获取结果进行排序 272 | result_dict=sorted(result_dict,key=operator.itemgetter("value"))[-5:] 273 | 274 | jobNameList=['product'] 275 | value=['Top5职位'] 276 | for item in result_dict: 277 | jobNameList.append(item["jobName"]) 278 | value.append(item["value"]) 279 | 280 | 281 | result=[jobNameList,value] 282 | conn.close() 283 | return result 284 | 285 | # 工作经验与平均薪资 286 | def exp_salary(page): 287 | conn = conn = MongoClient(HOST, PORT) 288 | db = conn[DATABASE_NAME] 289 | mycollection = db[COLLECTION_NAME] 290 | 291 | pipline = [ 292 | {'$group': {'_id': {'exp':'$workingExp','salary':'$salary','jobType':"$jobType"},'count':{"$sum":1}}} 293 | ] 294 | cursor = mycollection.aggregate(pipline) 295 | 296 | # 对分组数据进行分类 297 | exp_salary_list=[] 298 | 299 | for item in cursor: 300 | if judge_contain_str(item["_id"]['jobType'],page): 301 | if item["_id"]["salary"] !=['薪资面议']: 302 | if item["_id"]["salary"]=='1K以下' or item["_id"]["salary"]=='校招' : 303 | item["_id"]["salary"]=[0,1000] 304 | salary_list = np.array(item["_id"]["salary"], dtype='float_') 305 | average_salary = np.mean(salary_list) # 用numpy库计算平均薪资 306 | data = {"exp": item["_id"]["exp"], "salary": int(average_salary),"count":item["count"]} 307 | exp_salary_list.append(data) 308 | else: 309 | salary_list = np.array(item["_id"]["salary"], dtype='float_') 310 | average_salary = np.mean(salary_list) # 用numpy库计算平均薪资 311 | data = {"exp": item["_id"]["exp"], "salary": int(average_salary),"count":item["count"]} 312 | exp_salary_list.append(data) 313 | 314 | # print("经验和薪资的关系分组结果",len(exp_salary_list)) 315 | 316 | # 针对工作年薪进行分组统计,职位数和平均薪资 317 | a1,a2,a3,a4,a5,a6,a7=0,0,0,0,0,0,0 318 | b1, b2, b3, b4, b5, b6, b7 = 0, 0, 0, 0, 0, 0, 0 319 | for item in exp_salary_list: 320 | # print(item) 321 | if item["exp"]=="不限": 322 | a1+=item["salary"]*item["count"] 323 | b1+=item["count"] 324 | 325 | if item["exp"]=="无经验": 326 | a2 += item["salary"]*item["count"] 327 | b2 += item["count"] 328 | 329 | if item["exp"]=="1年以下": 330 | a3 += item["salary"]*item["count"] 331 | b3 += item["count"] 332 | 333 | if item["exp"]==[1,3]: 334 | a4 += item["salary"]*item["count"] 335 | b4 += item["count"] 336 | 337 | if item["exp"]==[3,5]: 338 | a5 += item["salary"]*item["count"] 339 | b5 += item["count"] 340 | 341 | if item["exp"]==[5,10]: 342 | a6 += item["salary"]*item["count"] 343 | b6 += item["count"] 344 | 345 | if item["exp"]=="10年以上": 346 | a7+= item["salary"]*item["count"] 347 | b7 += item["count"] 348 | 349 | result=[] 350 | exp_job_num=[b1,b2,b3,b4,b5,b6,b7] 351 | # 使用numpy将数据取整 352 | exp_average_salary=np.array([a1/b1,a2/b2,a3/b3,a4/b4,a5/b5,a6/b6,a7/b7],dtype="int_") 353 | 354 | # print("经验和薪资之间的关系",exp_job_num) 355 | # print("经验和薪资之间的关系平均薪资", exp_average_salary) 356 | 357 | data1={"exp_job_num":exp_job_num} 358 | data2={"exp_average_salary":list(exp_average_salary)} 359 | 360 | result.append(data1) 361 | result.append(data2) 362 | 363 | conn.close() 364 | 365 | return result 366 | 367 | # 学历与平均薪资 368 | def level_salary(page): 369 | conn = conn = MongoClient(HOST, PORT) 370 | db = conn[DATABASE_NAME] 371 | mycollection = db[COLLECTION_NAME] 372 | 373 | # 修改bug,增加计数字段 374 | pipline = [ 375 | {'$group': {'_id': {'eduLevel':'$eduLevel', 'salary': '$salary', 'jobType': "$jobType"},'count':{'$sum':1}}} 376 | ] 377 | cursor = mycollection.aggregate(pipline) 378 | 379 | # 对分组数据进行分类 380 | edu_salary_list = [] 381 | data_tag=0 382 | for item in cursor: 383 | data_tag+=1 384 | # print(item) 385 | if judge_contain_str(item["_id"]['jobType'], page): 386 | if item["_id"]["salary"] != ['薪资面议']: 387 | if item["_id"]["salary"] == '1K以下'or item["_id"]["salary"]=='校招': 388 | item["_id"]["salary"] = [0, 1000] 389 | salary_list = np.array(item["_id"]["salary"], dtype='float_') 390 | average_salary = np.mean(salary_list) # 用numpy库计算平均薪资 391 | 392 | # data = {"eduLevel": item["_id"]["eduLevel"], "salary": int(average_salary)} 393 | data={"eduLevel": item["_id"]["eduLevel"], "salary": int(average_salary),"count":item['count']} 394 | edu_salary_list.append(data) 395 | 396 | else: 397 | salary_list = np.array(item["_id"]["salary"], dtype='float_') 398 | average_salary = np.mean(salary_list) # 用numpy库计算平均薪资 399 | data = {"eduLevel": item["_id"]["eduLevel"], "salary": int(average_salary),"count":item['count']} 400 | edu_salary_list.append(data) 401 | 402 | # 针对工作年薪进行分组统计,职位数和平均薪资 403 | a1, a2, a3, a4, a5, a6, a7 ,a8= 0, 0, 0, 0, 0, 0, 0,0 # 薪资和 404 | b1, b2, b3, b4, b5, b6, b7 ,b8 = 0, 0, 0, 0, 0, 0, 0,0 # 职位数 405 | 406 | # print("筛选之后的互联网行业职位数:",len(edu_salary_list),'游标中的数据',data_tag) 407 | 408 | for item in edu_salary_list: 409 | if item["eduLevel"] == "不限": 410 | a1 += item["salary"] 411 | b1 += item['count'] 412 | 413 | if item["eduLevel"] == "中技": 414 | a2 += item["salary"] 415 | b2 += item['count'] 416 | 417 | if item["eduLevel"] == "中专": 418 | a3 += item["salary"] 419 | b3 += item['count'] 420 | 421 | if item["eduLevel"] == "高中": 422 | a4 += item["salary"] 423 | b4 += item['count'] 424 | 425 | if item["eduLevel"] == "大专": 426 | a5 += item["salary"] 427 | b5 += item['count'] 428 | 429 | if item["eduLevel"] == "本科": 430 | a6 += item["salary"] 431 | b6 += item['count'] 432 | 433 | if item["eduLevel"] == "硕士": 434 | a7 += item["salary"] 435 | b7 += item['count'] 436 | 437 | if item["eduLevel"] == "博士": 438 | a8+= item["salary"] 439 | b8 += item['count'] 440 | 441 | result = [] 442 | edu_average_salary=[] 443 | salary=[a1, a2, a3, a4, a5, a6, a7 ,a8] 444 | edu_job_num = [b1, b2, b3, b4, b5, b6, b7,b8] 445 | 446 | # print("每个学历对应的职位数据",edu_job_num) 447 | 448 | # 使用numpy将数据取整 449 | for i in range(len(salary)): 450 | if salary[i] is not 0: 451 | temp=salary[i]/edu_job_num[i] 452 | edu_average_salary.append(temp) 453 | else: 454 | edu_average_salary.append(0) 455 | 456 | edu_average_salary = np.array(edu_average_salary, dtype="int_") 457 | data1 = {"edu_job_num": edu_job_num} 458 | data2 = {"edu_average_salary": list(edu_average_salary)} 459 | 460 | result.append(data1) 461 | result.append(data2) 462 | 463 | conn.close() 464 | return result 465 | 466 | # 辅助分组函数1 467 | def judge_jobName_str(jobName,jk): 468 | pattern_str=jk 469 | regx = re.compile(pattern_str, re.I) 470 | if regx.search(jobName) is not None: 471 | return True 472 | return False 473 | 474 | # 辅助分组函数2 475 | def judge_contain_jobstr(jobName,page): 476 | for i in jobNameKey[page]: 477 | if jobName.__contains__(i): 478 | return True 479 | return False 480 | 481 | # 辅助分组函数3 482 | def judge_contain_str(jobType,page): 483 | # 对数据根据八个类别进行分组 484 | for i in jobKey[page]: 485 | if jobType.__contains__(i): 486 | return True 487 | return False 488 | 489 | 490 | def crawl_monitor_page(): 491 | conn = conn = MongoClient(HOST, PORT) 492 | db = conn[DATABASE_NAME] 493 | mycollection = db["crawler"] 494 | 495 | result=mycollection.find({}) 496 | data=[] 497 | for item in result: 498 | data.append(item) 499 | 500 | data=data[-10:-1] 501 | 502 | 503 | 504 | return data 505 | 506 | if __name__ == '__main__': 507 | 508 | # getTop5JobNum(4) 509 | # crawl_monitor_page() 510 | # index_data() 511 | exp_salary(0) 512 | # level_salary(0) 513 | -------------------------------------------------------------------------------- /myapp/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/migrations/__init__.py -------------------------------------------------------------------------------- /myapp/migrations/__pycache__/__init__.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/migrations/__pycache__/__init__.cpython-37.pyc -------------------------------------------------------------------------------- /myapp/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | import mongoengine 3 | 4 | 5 | class zhilian(mongoengine.Document): 6 | 7 | jobType = mongoengine.StringField() 8 | jobName = mongoengine.StringField() 9 | emplType = mongoengine.StringField() 10 | eduLevel = mongoengine.StringField() 11 | companyName = mongoengine.StringField() 12 | salary = mongoengine.ListField() 13 | welfare = mongoengine.ListField() 14 | city = mongoengine.StringField() 15 | workingExp = mongoengine.ListField() 16 | infoComLink = mongoengine.StringField() 17 | positionUrl = mongoengine.StringField() 18 | extractSkillTag = mongoengine.ListField() 19 | releaseTime=mongoengine.StringField() 20 | -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-brands.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Brands'; 7 | font-style: normal; 8 | font-weight: normal; 9 | src: url("../webfonts/fa-brands-400.eot"); 10 | src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } 11 | 12 | .fab { 13 | font-family: 'Font Awesome 5 Brands'; } 14 | -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-brands.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands} -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-regular.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 400; 9 | src: url("../webfonts/fa-regular-400.eot"); 10 | src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } 11 | 12 | .far { 13 | font-family: 'Font Awesome 5 Free'; 14 | font-weight: 400; } 15 | -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-regular.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400} -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: 'Font Awesome 5 Free'; 7 | font-style: normal; 8 | font-weight: 900; 9 | src: url("../webfonts/fa-solid-900.eot"); 10 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } 11 | 12 | .fa, 13 | .fas { 14 | font-family: 'Font Awesome 5 Free'; 15 | font-weight: 900; } 16 | -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/css/fa-solid.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.0.2 by @fontawesome - http://fontawesome.com 3 | * License - http://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900} -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.eot -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.woff -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.eot -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.woff -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/font-awesome/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /myapp/static/myapp/css/simple-line-icons/css/simple-line-icons.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'simple-line-icons'; 3 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0'); 4 | src: url('../fonts/Simple-Line-Icons.eot?v=2.4.0#iefix') format('embedded-opentype'), url('../fonts/Simple-Line-Icons.woff2?v=2.4.0') format('woff2'), url('../fonts/Simple-Line-Icons.ttf?v=2.4.0') format('truetype'), url('../fonts/Simple-Line-Icons.woff?v=2.4.0') format('woff'), url('../fonts/Simple-Line-Icons.svg?v=2.4.0#simple-line-icons') format('svg'); 5 | font-weight: normal; 6 | font-style: normal; 7 | } 8 | /* 9 | Use the following CSS code if you want to have a class per icon. 10 | Instead of a list of all class selectors, you can use the generic [class*="icon-"] selector, but it's slower: 11 | */ 12 | .icon-user, 13 | .icon-people, 14 | .icon-user-female, 15 | .icon-user-follow, 16 | .icon-user-following, 17 | .icon-user-unfollow, 18 | .icon-login, 19 | .icon-logout, 20 | .icon-emotsmile, 21 | .icon-phone, 22 | .icon-call-end, 23 | .icon-call-in, 24 | .icon-call-out, 25 | .icon-map, 26 | .icon-location-pin, 27 | .icon-direction, 28 | .icon-directions, 29 | .icon-compass, 30 | .icon-layers, 31 | .icon-menu, 32 | .icon-list, 33 | .icon-options-vertical, 34 | .icon-options, 35 | .icon-arrow-down, 36 | .icon-arrow-left, 37 | .icon-arrow-right, 38 | .icon-arrow-up, 39 | .icon-arrow-up-circle, 40 | .icon-arrow-left-circle, 41 | .icon-arrow-right-circle, 42 | .icon-arrow-down-circle, 43 | .icon-check, 44 | .icon-clock, 45 | .icon-plus, 46 | .icon-minus, 47 | .icon-close, 48 | .icon-event, 49 | .icon-exclamation, 50 | .icon-organization, 51 | .icon-trophy, 52 | .icon-screen-smartphone, 53 | .icon-screen-desktop, 54 | .icon-plane, 55 | .icon-notebook, 56 | .icon-mustache, 57 | .icon-mouse, 58 | .icon-magnet, 59 | .icon-energy, 60 | .icon-disc, 61 | .icon-cursor, 62 | .icon-cursor-move, 63 | .icon-crop, 64 | .icon-chemistry, 65 | .icon-speedometer, 66 | .icon-shield, 67 | .icon-screen-tablet, 68 | .icon-magic-wand, 69 | .icon-hourglass, 70 | .icon-graduation, 71 | .icon-ghost, 72 | .icon-game-controller, 73 | .icon-fire, 74 | .icon-eyeglass, 75 | .icon-envelope-open, 76 | .icon-envelope-letter, 77 | .icon-bell, 78 | .icon-badge, 79 | .icon-anchor, 80 | .icon-wallet, 81 | .icon-vector, 82 | .icon-speech, 83 | .icon-puzzle, 84 | .icon-printer, 85 | .icon-present, 86 | .icon-playlist, 87 | .icon-pin, 88 | .icon-picture, 89 | .icon-handbag, 90 | .icon-globe-alt, 91 | .icon-globe, 92 | .icon-folder-alt, 93 | .icon-folder, 94 | .icon-film, 95 | .icon-feed, 96 | .icon-drop, 97 | .icon-drawer, 98 | .icon-docs, 99 | .icon-doc, 100 | .icon-diamond, 101 | .icon-cup, 102 | .icon-calculator, 103 | .icon-bubbles, 104 | .icon-briefcase, 105 | .icon-book-open, 106 | .icon-basket-loaded, 107 | .icon-basket, 108 | .icon-bag, 109 | .icon-action-undo, 110 | .icon-action-redo, 111 | .icon-wrench, 112 | .icon-umbrella, 113 | .icon-trash, 114 | .icon-tag, 115 | .icon-support, 116 | .icon-frame, 117 | .icon-size-fullscreen, 118 | .icon-size-actual, 119 | .icon-shuffle, 120 | .icon-share-alt, 121 | .icon-share, 122 | .icon-rocket, 123 | .icon-question, 124 | .icon-pie-chart, 125 | .icon-pencil, 126 | .icon-note, 127 | .icon-loop, 128 | .icon-home, 129 | .icon-grid, 130 | .icon-graph, 131 | .icon-microphone, 132 | .icon-music-tone-alt, 133 | .icon-music-tone, 134 | .icon-earphones-alt, 135 | .icon-earphones, 136 | .icon-equalizer, 137 | .icon-like, 138 | .icon-dislike, 139 | .icon-control-start, 140 | .icon-control-rewind, 141 | .icon-control-play, 142 | .icon-control-pause, 143 | .icon-control-forward, 144 | .icon-control-end, 145 | .icon-volume-1, 146 | .icon-volume-2, 147 | .icon-volume-off, 148 | .icon-calendar, 149 | .icon-bulb, 150 | .icon-chart, 151 | .icon-ban, 152 | .icon-bubble, 153 | .icon-camrecorder, 154 | .icon-camera, 155 | .icon-cloud-download, 156 | .icon-cloud-upload, 157 | .icon-envelope, 158 | .icon-eye, 159 | .icon-flag, 160 | .icon-heart, 161 | .icon-info, 162 | .icon-key, 163 | .icon-link, 164 | .icon-lock, 165 | .icon-lock-open, 166 | .icon-magnifier, 167 | .icon-magnifier-add, 168 | .icon-magnifier-remove, 169 | .icon-paper-clip, 170 | .icon-paper-plane, 171 | .icon-power, 172 | .icon-refresh, 173 | .icon-reload, 174 | .icon-settings, 175 | .icon-star, 176 | .icon-symbol-female, 177 | .icon-symbol-male, 178 | .icon-target, 179 | .icon-credit-card, 180 | .icon-paypal, 181 | .icon-social-tumblr, 182 | .icon-social-twitter, 183 | .icon-social-facebook, 184 | .icon-social-instagram, 185 | .icon-social-linkedin, 186 | .icon-social-pinterest, 187 | .icon-social-github, 188 | .icon-social-google, 189 | .icon-social-reddit, 190 | .icon-social-skype, 191 | .icon-social-dribbble, 192 | .icon-social-behance, 193 | .icon-social-foursqare, 194 | .icon-social-soundcloud, 195 | .icon-social-spotify, 196 | .icon-social-stumbleupon, 197 | .icon-social-youtube, 198 | .icon-social-dropbox, 199 | .icon-social-vkontakte, 200 | .icon-social-steam { 201 | font-family: 'simple-line-icons'; 202 | speak: none; 203 | font-style: normal; 204 | font-weight: normal; 205 | font-variant: normal; 206 | text-transform: none; 207 | line-height: 1; 208 | /* Better Font Rendering =========== */ 209 | -webkit-font-smoothing: antialiased; 210 | -moz-osx-font-smoothing: grayscale; 211 | } 212 | .icon-user:before { 213 | content: "\e005"; 214 | } 215 | .icon-people:before { 216 | content: "\e001"; 217 | } 218 | .icon-user-female:before { 219 | content: "\e000"; 220 | } 221 | .icon-user-follow:before { 222 | content: "\e002"; 223 | } 224 | .icon-user-following:before { 225 | content: "\e003"; 226 | } 227 | .icon-user-unfollow:before { 228 | content: "\e004"; 229 | } 230 | .icon-login:before { 231 | content: "\e066"; 232 | } 233 | .icon-logout:before { 234 | content: "\e065"; 235 | } 236 | .icon-emotsmile:before { 237 | content: "\e021"; 238 | } 239 | .icon-phone:before { 240 | content: "\e600"; 241 | } 242 | .icon-call-end:before { 243 | content: "\e048"; 244 | } 245 | .icon-call-in:before { 246 | content: "\e047"; 247 | } 248 | .icon-call-out:before { 249 | content: "\e046"; 250 | } 251 | .icon-map:before { 252 | content: "\e033"; 253 | } 254 | .icon-location-pin:before { 255 | content: "\e096"; 256 | } 257 | .icon-direction:before { 258 | content: "\e042"; 259 | } 260 | .icon-directions:before { 261 | content: "\e041"; 262 | } 263 | .icon-compass:before { 264 | content: "\e045"; 265 | } 266 | .icon-layers:before { 267 | content: "\e034"; 268 | } 269 | .icon-menu:before { 270 | content: "\e601"; 271 | } 272 | .icon-list:before { 273 | content: "\e067"; 274 | } 275 | .icon-options-vertical:before { 276 | content: "\e602"; 277 | } 278 | .icon-options:before { 279 | content: "\e603"; 280 | } 281 | .icon-arrow-down:before { 282 | content: "\e604"; 283 | } 284 | .icon-arrow-left:before { 285 | content: "\e605"; 286 | } 287 | .icon-arrow-right:before { 288 | content: "\e606"; 289 | } 290 | .icon-arrow-up:before { 291 | content: "\e607"; 292 | } 293 | .icon-arrow-up-circle:before { 294 | content: "\e078"; 295 | } 296 | .icon-arrow-left-circle:before { 297 | content: "\e07a"; 298 | } 299 | .icon-arrow-right-circle:before { 300 | content: "\e079"; 301 | } 302 | .icon-arrow-down-circle:before { 303 | content: "\e07b"; 304 | } 305 | .icon-check:before { 306 | content: "\e080"; 307 | } 308 | .icon-clock:before { 309 | content: "\e081"; 310 | } 311 | .icon-plus:before { 312 | content: "\e095"; 313 | } 314 | .icon-minus:before { 315 | content: "\e615"; 316 | } 317 | .icon-close:before { 318 | content: "\e082"; 319 | } 320 | .icon-event:before { 321 | content: "\e619"; 322 | } 323 | .icon-exclamation:before { 324 | content: "\e617"; 325 | } 326 | .icon-organization:before { 327 | content: "\e616"; 328 | } 329 | .icon-trophy:before { 330 | content: "\e006"; 331 | } 332 | .icon-screen-smartphone:before { 333 | content: "\e010"; 334 | } 335 | .icon-screen-desktop:before { 336 | content: "\e011"; 337 | } 338 | .icon-plane:before { 339 | content: "\e012"; 340 | } 341 | .icon-notebook:before { 342 | content: "\e013"; 343 | } 344 | .icon-mustache:before { 345 | content: "\e014"; 346 | } 347 | .icon-mouse:before { 348 | content: "\e015"; 349 | } 350 | .icon-magnet:before { 351 | content: "\e016"; 352 | } 353 | .icon-energy:before { 354 | content: "\e020"; 355 | } 356 | .icon-disc:before { 357 | content: "\e022"; 358 | } 359 | .icon-cursor:before { 360 | content: "\e06e"; 361 | } 362 | .icon-cursor-move:before { 363 | content: "\e023"; 364 | } 365 | .icon-crop:before { 366 | content: "\e024"; 367 | } 368 | .icon-chemistry:before { 369 | content: "\e026"; 370 | } 371 | .icon-speedometer:before { 372 | content: "\e007"; 373 | } 374 | .icon-shield:before { 375 | content: "\e00e"; 376 | } 377 | .icon-screen-tablet:before { 378 | content: "\e00f"; 379 | } 380 | .icon-magic-wand:before { 381 | content: "\e017"; 382 | } 383 | .icon-hourglass:before { 384 | content: "\e018"; 385 | } 386 | .icon-graduation:before { 387 | content: "\e019"; 388 | } 389 | .icon-ghost:before { 390 | content: "\e01a"; 391 | } 392 | .icon-game-controller:before { 393 | content: "\e01b"; 394 | } 395 | .icon-fire:before { 396 | content: "\e01c"; 397 | } 398 | .icon-eyeglass:before { 399 | content: "\e01d"; 400 | } 401 | .icon-envelope-open:before { 402 | content: "\e01e"; 403 | } 404 | .icon-envelope-letter:before { 405 | content: "\e01f"; 406 | } 407 | .icon-bell:before { 408 | content: "\e027"; 409 | } 410 | .icon-badge:before { 411 | content: "\e028"; 412 | } 413 | .icon-anchor:before { 414 | content: "\e029"; 415 | } 416 | .icon-wallet:before { 417 | content: "\e02a"; 418 | } 419 | .icon-vector:before { 420 | content: "\e02b"; 421 | } 422 | .icon-speech:before { 423 | content: "\e02c"; 424 | } 425 | .icon-puzzle:before { 426 | content: "\e02d"; 427 | } 428 | .icon-printer:before { 429 | content: "\e02e"; 430 | } 431 | .icon-present:before { 432 | content: "\e02f"; 433 | } 434 | .icon-playlist:before { 435 | content: "\e030"; 436 | } 437 | .icon-pin:before { 438 | content: "\e031"; 439 | } 440 | .icon-picture:before { 441 | content: "\e032"; 442 | } 443 | .icon-handbag:before { 444 | content: "\e035"; 445 | } 446 | .icon-globe-alt:before { 447 | content: "\e036"; 448 | } 449 | .icon-globe:before { 450 | content: "\e037"; 451 | } 452 | .icon-folder-alt:before { 453 | content: "\e039"; 454 | } 455 | .icon-folder:before { 456 | content: "\e089"; 457 | } 458 | .icon-film:before { 459 | content: "\e03a"; 460 | } 461 | .icon-feed:before { 462 | content: "\e03b"; 463 | } 464 | .icon-drop:before { 465 | content: "\e03e"; 466 | } 467 | .icon-drawer:before { 468 | content: "\e03f"; 469 | } 470 | .icon-docs:before { 471 | content: "\e040"; 472 | } 473 | .icon-doc:before { 474 | content: "\e085"; 475 | } 476 | .icon-diamond:before { 477 | content: "\e043"; 478 | } 479 | .icon-cup:before { 480 | content: "\e044"; 481 | } 482 | .icon-calculator:before { 483 | content: "\e049"; 484 | } 485 | .icon-bubbles:before { 486 | content: "\e04a"; 487 | } 488 | .icon-briefcase:before { 489 | content: "\e04b"; 490 | } 491 | .icon-book-open:before { 492 | content: "\e04c"; 493 | } 494 | .icon-basket-loaded:before { 495 | content: "\e04d"; 496 | } 497 | .icon-basket:before { 498 | content: "\e04e"; 499 | } 500 | .icon-bag:before { 501 | content: "\e04f"; 502 | } 503 | .icon-action-undo:before { 504 | content: "\e050"; 505 | } 506 | .icon-action-redo:before { 507 | content: "\e051"; 508 | } 509 | .icon-wrench:before { 510 | content: "\e052"; 511 | } 512 | .icon-umbrella:before { 513 | content: "\e053"; 514 | } 515 | .icon-trash:before { 516 | content: "\e054"; 517 | } 518 | .icon-tag:before { 519 | content: "\e055"; 520 | } 521 | .icon-support:before { 522 | content: "\e056"; 523 | } 524 | .icon-frame:before { 525 | content: "\e038"; 526 | } 527 | .icon-size-fullscreen:before { 528 | content: "\e057"; 529 | } 530 | .icon-size-actual:before { 531 | content: "\e058"; 532 | } 533 | .icon-shuffle:before { 534 | content: "\e059"; 535 | } 536 | .icon-share-alt:before { 537 | content: "\e05a"; 538 | } 539 | .icon-share:before { 540 | content: "\e05b"; 541 | } 542 | .icon-rocket:before { 543 | content: "\e05c"; 544 | } 545 | .icon-question:before { 546 | content: "\e05d"; 547 | } 548 | .icon-pie-chart:before { 549 | content: "\e05e"; 550 | } 551 | .icon-pencil:before { 552 | content: "\e05f"; 553 | } 554 | .icon-note:before { 555 | content: "\e060"; 556 | } 557 | .icon-loop:before { 558 | content: "\e064"; 559 | } 560 | .icon-home:before { 561 | content: "\e069"; 562 | } 563 | .icon-grid:before { 564 | content: "\e06a"; 565 | } 566 | .icon-graph:before { 567 | content: "\e06b"; 568 | } 569 | .icon-microphone:before { 570 | content: "\e063"; 571 | } 572 | .icon-music-tone-alt:before { 573 | content: "\e061"; 574 | } 575 | .icon-music-tone:before { 576 | content: "\e062"; 577 | } 578 | .icon-earphones-alt:before { 579 | content: "\e03c"; 580 | } 581 | .icon-earphones:before { 582 | content: "\e03d"; 583 | } 584 | .icon-equalizer:before { 585 | content: "\e06c"; 586 | } 587 | .icon-like:before { 588 | content: "\e068"; 589 | } 590 | .icon-dislike:before { 591 | content: "\e06d"; 592 | } 593 | .icon-control-start:before { 594 | content: "\e06f"; 595 | } 596 | .icon-control-rewind:before { 597 | content: "\e070"; 598 | } 599 | .icon-control-play:before { 600 | content: "\e071"; 601 | } 602 | .icon-control-pause:before { 603 | content: "\e072"; 604 | } 605 | .icon-control-forward:before { 606 | content: "\e073"; 607 | } 608 | .icon-control-end:before { 609 | content: "\e074"; 610 | } 611 | .icon-volume-1:before { 612 | content: "\e09f"; 613 | } 614 | .icon-volume-2:before { 615 | content: "\e0a0"; 616 | } 617 | .icon-volume-off:before { 618 | content: "\e0a1"; 619 | } 620 | .icon-calendar:before { 621 | content: "\e075"; 622 | } 623 | .icon-bulb:before { 624 | content: "\e076"; 625 | } 626 | .icon-chart:before { 627 | content: "\e077"; 628 | } 629 | .icon-ban:before { 630 | content: "\e07c"; 631 | } 632 | .icon-bubble:before { 633 | content: "\e07d"; 634 | } 635 | .icon-camrecorder:before { 636 | content: "\e07e"; 637 | } 638 | .icon-camera:before { 639 | content: "\e07f"; 640 | } 641 | .icon-cloud-download:before { 642 | content: "\e083"; 643 | } 644 | .icon-cloud-upload:before { 645 | content: "\e084"; 646 | } 647 | .icon-envelope:before { 648 | content: "\e086"; 649 | } 650 | .icon-eye:before { 651 | content: "\e087"; 652 | } 653 | .icon-flag:before { 654 | content: "\e088"; 655 | } 656 | .icon-heart:before { 657 | content: "\e08a"; 658 | } 659 | .icon-info:before { 660 | content: "\e08b"; 661 | } 662 | .icon-key:before { 663 | content: "\e08c"; 664 | } 665 | .icon-link:before { 666 | content: "\e08d"; 667 | } 668 | .icon-lock:before { 669 | content: "\e08e"; 670 | } 671 | .icon-lock-open:before { 672 | content: "\e08f"; 673 | } 674 | .icon-magnifier:before { 675 | content: "\e090"; 676 | } 677 | .icon-magnifier-add:before { 678 | content: "\e091"; 679 | } 680 | .icon-magnifier-remove:before { 681 | content: "\e092"; 682 | } 683 | .icon-paper-clip:before { 684 | content: "\e093"; 685 | } 686 | .icon-paper-plane:before { 687 | content: "\e094"; 688 | } 689 | .icon-power:before { 690 | content: "\e097"; 691 | } 692 | .icon-refresh:before { 693 | content: "\e098"; 694 | } 695 | .icon-reload:before { 696 | content: "\e099"; 697 | } 698 | .icon-settings:before { 699 | content: "\e09a"; 700 | } 701 | .icon-star:before { 702 | content: "\e09b"; 703 | } 704 | .icon-symbol-female:before { 705 | content: "\e09c"; 706 | } 707 | .icon-symbol-male:before { 708 | content: "\e09d"; 709 | } 710 | .icon-target:before { 711 | content: "\e09e"; 712 | } 713 | .icon-credit-card:before { 714 | content: "\e025"; 715 | } 716 | .icon-paypal:before { 717 | content: "\e608"; 718 | } 719 | .icon-social-tumblr:before { 720 | content: "\e00a"; 721 | } 722 | .icon-social-twitter:before { 723 | content: "\e009"; 724 | } 725 | .icon-social-facebook:before { 726 | content: "\e00b"; 727 | } 728 | .icon-social-instagram:before { 729 | content: "\e609"; 730 | } 731 | .icon-social-linkedin:before { 732 | content: "\e60a"; 733 | } 734 | .icon-social-pinterest:before { 735 | content: "\e60b"; 736 | } 737 | .icon-social-github:before { 738 | content: "\e60c"; 739 | } 740 | .icon-social-google:before { 741 | content: "\e60d"; 742 | } 743 | .icon-social-reddit:before { 744 | content: "\e60e"; 745 | } 746 | .icon-social-skype:before { 747 | content: "\e60f"; 748 | } 749 | .icon-social-dribbble:before { 750 | content: "\e00d"; 751 | } 752 | .icon-social-behance:before { 753 | content: "\e610"; 754 | } 755 | .icon-social-foursqare:before { 756 | content: "\e611"; 757 | } 758 | .icon-social-soundcloud:before { 759 | content: "\e612"; 760 | } 761 | .icon-social-spotify:before { 762 | content: "\e613"; 763 | } 764 | .icon-social-stumbleupon:before { 765 | content: "\e614"; 766 | } 767 | .icon-social-youtube:before { 768 | content: "\e008"; 769 | } 770 | .icon-social-dropbox:before { 771 | content: "\e00c"; 772 | } 773 | .icon-social-vkontakte:before { 774 | content: "\e618"; 775 | } 776 | .icon-social-steam:before { 777 | content: "\e620"; 778 | } 779 | -------------------------------------------------------------------------------- /myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.eot -------------------------------------------------------------------------------- /myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.ttf -------------------------------------------------------------------------------- /myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.woff -------------------------------------------------------------------------------- /myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chauncey2/myProjects/d4b6ef5138e9841485bb183051147e5dd368fda3/myapp/static/myapp/css/simple-line-icons/fonts/Simple-Line-Icons.woff2 -------------------------------------------------------------------------------- /myapp/static/myapp/js/echarts/echarts-stat/ecStat.min.js: -------------------------------------------------------------------------------- 1 | !function(r,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.ecStat=t():r.ecStat=t()}(this,function(){return function(r){function t(e){if(n[e])return n[e].exports;var o=n[e]={exports:{},id:e,loaded:!1};return r[e].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=r,t.c=n,t.p="",t(0)}([function(r,t,n){var e;e=function(r){return{clustering:n(11),regression:n(13),statistics:n(14),histogram:n(12)}}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){return r=null===r?NaN:+r,"number"==typeof r&&!isNaN(r)}function n(r){return isFinite(r)&&r===Math.round(r)}return{isNumber:t,isInteger:n}}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){if(!a(r))throw new Error("Invalid data type, you should input an array");var t=[],n=u(r);if(1===n.length)for(var e=0;e=1)return r[n-1];var e=(n-1)*t,o=Math.floor(e),a=r[o],u=r[o+1];return a+(u-a)*(e-o)}}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){for(var t=[];n(r);)t.push(r.length),r=r[0];return t}function n(r){return"[object Array]"===l.call(r)}function e(r,t){for(var n=[],e=0;et?1:r0)e=o;else{if(!(a<0))return o+1;n=o+1}}return n}function f(r,t,n){if(r&&t){if(r.map&&r.map===c)return r.map(t,n);for(var e=[],o=0,a=r.length;ot&&(t=r[n]);return t}var e=n(1),o=e.isNumber;return t}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){var t=r.length;return t?e(r)/r.length:0}var e=n(10);return t}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){for(var t=1/0,n=0;n=2){for(var n,e=a(r),u=0,i=0;ie&&(e=r[f][i]);o=e-n;for(var f=0;f0?d[m-1]:d[m]-u===l?u:d[m]-l,x[m].x1=m50?50:t},scott:function(r,t,n){return Math.ceil((n-t)/(3.5*u(r)*Math.pow(r.length,-1/3)))},freedmanDiaconis:function(r,t,n){return r.sort(s),Math.ceil((n-t)/(2*(a(r,.75)-a(r,.25))*Math.pow(r.length,-1/3)))},sturges:function(r){return Math.ceil(Math.log(r.length)/Math.LN2)+1}};return t}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r,t){for(var n=0;nMath.abs(r[n][e])&&(e=o);for(var a=n;a=n;f--)r[f][i]-=r[f][n]/r[n][n]*r[n][i]}for(var l=new Array(t),s=r.length-1,o=r.length-2;o>=0;o--){for(var u=0,n=o+1;n=0;f--)x+=f>1?Math.round(g[f]*Math.pow(10,f+1))/Math.pow(10,f+1)+"x^"+f+" + ":1===f?Math.round(100*g[f])/100+"x + ":Math.round(100*g[f])/100;return{points:d,parameter:g,expression:x}}},u=function(r,t,n){return a[r](t,n)};return u}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){var t={};return t.max=n(6),t.deviation=n(5),t.mean=n(7),t.median=n(15),t.min=n(8),t.quantile=n(3),t.sampleVariance=n(9),t.sum=n(10),t}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){function t(r){return e(r,.5)}var e=n(3);return t}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))},function(r,t,n){var e;e=function(r){var t=n(2),e=t.getPrecision;return function(r,t,n,o){var a=arguments.length;a<2?(t=r,r=0,n=1):a<3?n=1:a<4?(n=+n,o=e(n)):o=+o;for(var u=Math.ceil(((t-r)/n).toFixed(o)),i=new Array(u+1),f=0;f=Math.sqrt(50)?a*=10:u>=Math.sqrt(10)?a*=5:u>=Math.sqrt(2)&&(a*=2),+(t>=r?a:-a).toFixed(-o)}}.call(t,n,t,r),!(void 0!==e&&(r.exports=e))}])}); -------------------------------------------------------------------------------- /myapp/static/myapp/js/extension/bmap.min.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | 22 | !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("echarts")):"function"==typeof define&&define.amd?define(["exports","echarts"],e):e(t.bmap={},t.echarts)}(this,function(t,o){"use strict";function l(t,e){this._bmap=t,this.dimensions=["lng","lat"],this._mapOffset=[0,0],this._api=e,this._projection=new BMap.MercatorProjection}function n(a,r){return r=r||[0,0],o.util.map([0,1],function(t){var e=r[t],o=a[t]/2,n=[],i=[];return n[t]=e-o,i[t]=e+o,n[1-t]=i[1-t]=r[1-t],Math.abs(this.dataToPoint(n)[t]-this.dataToPoint(i)[t])},this)}var f;l.prototype.dimensions=["lng","lat"],l.prototype.setZoom=function(t){this._zoom=t},l.prototype.setCenter=function(t){this._center=this._projection.lngLatToPoint(new BMap.Point(t[0],t[1]))},l.prototype.setMapOffset=function(t){this._mapOffset=t},l.prototype.getBMap=function(){return this._bmap},l.prototype.dataToPoint=function(t){var e=new BMap.Point(t[0],t[1]),o=this._bmap.pointToOverlayPixel(e),n=this._mapOffset;return[o.x-n[0],o.y-n[1]]},l.prototype.pointToData=function(t){var e=this._mapOffset;return[(t=this._bmap.overlayPixelToPoint({x:t[0]+e[0],y:t[1]+e[1]})).lng,t.lat]},l.prototype.getViewRect=function(){var t=this._api;return new o.graphic.BoundingRect(0,0,t.getWidth(),t.getHeight())},l.prototype.getRoamTransform=function(){return o.matrix.create()},l.prototype.prepareCustoms=function(t){var e=this.getViewRect();return{coordSys:{type:"bmap",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:o.util.bind(this.dataToPoint,this),size:o.util.bind(n,this)}}},l.dimensions=l.prototype.dimensions,l.create=function(t,m){var c,d=m.getDom();t.eachComponent("bmap",function(t){var e=m.getZr().painter,o=e.getViewportRoot();if("undefined"==typeof BMap)throw new Error("BMap api is not loaded");if(f=f||function(){function t(t){this._root=t}return(t.prototype=new BMap.Overlay).initialize=function(t){return t.getPanes().labelPane.appendChild(this._root),this._root},t.prototype.draw=function(){},t}(),c)throw new Error("Only one bmap component can exist");if(!t.__bmap){var n=d.querySelector(".ec-extension-bmap");n&&(o.style.left="0px",o.style.top="0px",d.removeChild(n)),(n=document.createElement("div")).style.cssText="width:100%;height:100%",n.classList.add("ec-extension-bmap"),d.appendChild(n);var i=t.__bmap=new BMap.Map(n),a=new f(o);i.addOverlay(a),e.getViewportRootOffset=function(){return{offsetLeft:0,offsetTop:0}}}i=t.__bmap;var r=t.get("center"),p=t.get("zoom");if(r&&p){var s=new BMap.Point(r[0],r[1]);i.centerAndZoom(s,p)}(c=new l(i,m)).setMapOffset(t.__mapOffset||[0,0]),c.setZoom(p),c.setCenter(r),t.coordinateSystem=c}),t.eachSeries(function(t){"bmap"===t.get("coordinateSystem")&&(t.coordinateSystem=c)})},o.extendComponentModel({type:"bmap",getBMap:function(){return this.__bmap},setCenterAndZoom:function(t,e){this.option.center=t,this.option.zoom=e},centerOrZoomChanged:function(t,e){var o=this.option;return!(function(t,e){return t&&e&&t[0]===e[0]&&t[1]===e[1]}(t,o.center)&&e===o.zoom)},defaultOption:{center:[104.114129,37.550339],zoom:5,mapStyle:{},mapStyleV2:{},roam:!1}}),o.extendComponentView({type:"bmap",render:function(i,t,a){function e(t,e){if(!r){var o=p.parentNode.parentNode.parentNode,n=[-parseInt(o.style.left,10)||0,-parseInt(o.style.top,10)||0];p.style.left=n[0]+"px",p.style.top=n[1]+"px",s.setMapOffset(n),i.__mapOffset=n,a.dispatchAction({type:"bmapRoam"})}}var r=!0,o=i.getBMap(),p=a.getZr().painter.getViewportRoot(),s=i.coordinateSystem;function n(){r||a.dispatchAction({type:"bmapRoam"})}o.removeEventListener("moving",this._oldMoveHandler),o.removeEventListener("zoomend",this._oldZoomEndHandler),o.addEventListener("moving",e),o.addEventListener("zoomend",n),this._oldMoveHandler=e,this._oldZoomEndHandler=n;var m=i.get("roam");m&&"scale"!==m?o.enableDragging():o.disableDragging(),m&&"move"!==m?(o.enableScrollWheelZoom(),o.enableDoubleClickZoom(),o.enablePinchToZoom()):(o.disableScrollWheelZoom(),o.disableDoubleClickZoom(),o.disablePinchToZoom());var c=i.__mapStyle,d=i.get("mapStyle")||{},l=JSON.stringify(d);JSON.stringify(c)!==l&&(Object.keys(d).length&&o.setMapStyle(d),i.__mapStyle=JSON.parse(l));var f=i.__mapStyle2,h=i.get("mapStyleV2")||{},u=JSON.stringify(h);JSON.stringify(f)!==u&&(Object.keys(h).length&&o.setMapStyleV2(h),i.__mapStyle2=JSON.parse(u)),r=!1}}),o.registerCoordinateSystem("bmap",l),o.registerAction({type:"bmapRoam",event:"bmapRoam",update:"updateLayout"},function(t,e){e.eachComponent("bmap",function(t){var e=t.getBMap(),o=e.getCenter();t.setCenterAndZoom([o.lng,o.lat],e.getZoom())})});t.version="1.0.0"}); 23 | -------------------------------------------------------------------------------- /myapp/static/myapp/js/extension/dataTool.min.js: -------------------------------------------------------------------------------- 1 | 2 | /* 3 | * Licensed to the Apache Software Foundation (ASF) under one 4 | * or more contributor license agreements. See the NOTICE file 5 | * distributed with this work for additional information 6 | * regarding copyright ownership. The ASF licenses this file 7 | * to you under the Apache License, Version 2.0 (the 8 | * "License"); you may not use this file except in compliance 9 | * with the License. You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, 14 | * software distributed under the License is distributed on an 15 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | * KIND, either express or implied. See the License for the 17 | * specific language governing permissions and limitations 18 | * under the License. 19 | */ 20 | 21 | 22 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("echarts")):"function"==typeof define&&define.amd?define(["exports","echarts"],t):t(e.dataTool={},e.echarts)}(this,function(e,t){"use strict";var i=Array.prototype.map;function l(e,t,r){if(e&&t){if(e.map&&e.map===i)return e.map(t,r);for(var a=[],o=0,n=e.length;o 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |
17 | 18 |
19 |
20 |
21 | 22 | 23 |
24 |
25 |
26 |
27 | 28 | 29 |
30 |
31 | 32 |
33 |
34 | 35 |
36 |
37 | 38 |
39 |
41 |
42 |
43 |
44 | 45 |
46 |
48 |
49 |
50 |
52 |
53 |
54 |
55 |
56 |
57 | 58 | 67 | 68 | 69 | {% endblock %} -------------------------------------------------------------------------------- /myapp/templates/myapp/home.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | 8 | 招聘网站职位数据挖掘与分析 9 | 10 | 11 | 12 | 13 | 14 | 15 | {% block jsmodel %} {% endblock %} 16 | 17 | 18 |
19 | 20 | 21 | 27 | 28 |
29 | 30 | 100 | 101 | {% block content %} 102 | 103 | {% endblock %} 104 |
105 | 106 |
107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /myapp/templates/myapp/index.html: -------------------------------------------------------------------------------- 1 | {% extends 'myapp/home.html' %} 2 | {% load static %} 3 | {% block content %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 |
16 | 17 |
18 |
19 |
20 | 21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 33 | 34 | 35 | {% endblock %} 36 | -------------------------------------------------------------------------------- /myapp/templates/myapp/monitor_page.html: -------------------------------------------------------------------------------- 1 | {% extends 'myapp/home.html' %} 2 | {% load static %} 3 | {% block content %} 4 | { 5 | 27 | 28 |
29 |

爬虫监控

30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | {% for item in jobData%} 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | {% endfor %} 47 |
职位类型职位名称工作城市薪资待遇公司名称
{{item.jobType}}{{item.jobName}}{{item.city}}{{item.salary}}{{item.companyName}}
48 | 49 |
50 |
51 | 52 | 58 | 59 | {% endblock %} 60 | 61 | -------------------------------------------------------------------------------- /myapp/templates/myapp/test.html: -------------------------------------------------------------------------------- 1 | {% extends 'myapp/home.html' %} 2 | {% load static %} 3 | {% block content %} 4 | { 5 | 6 |
7 |
8 | 9 |
10 |
11 | 12 | {% endblock %} 13 | 14 | -------------------------------------------------------------------------------- /myapp/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /myapp/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name='myapp' 5 | urlpatterns=[ 6 | path(r'',views.index,name='index'), 7 | path(r'detail//',views.detail,name='detail_page'), 8 | path(r'monitoring/',views.monitor,name='monitor_page'), 9 | # 测试页面 10 | path(r'test/',views.test,name='test'), 11 | 12 | ] -------------------------------------------------------------------------------- /myapp/views.py: -------------------------------------------------------------------------------- 1 | from django.views.decorators.cache import cache_page 2 | from django.shortcuts import render 3 | from.models import zhilian 4 | from .db import * 5 | 6 | import json 7 | 8 | 9 | @cache_page(24*3600) 10 | def index(request): 11 | data=index_data() 12 | 13 | # 地图数据 14 | map_data=data[0] 15 | 16 | # 右侧上部柱状图数据 17 | ringt_top_data=data[1] 18 | 19 | # 右侧下部数据 20 | right_bottom_data=data[2] 21 | 22 | return render(request, 'myapp/index.html',context={ 23 | 'map_data':map_data, 24 | 'ringt_top_data':ringt_top_data, 25 | 'right_bottom_data':right_bottom_data, 26 | }) 27 | 28 | @cache_page(24*3600) 29 | def detail(request,page): 30 | ''' 31 | 详情页视图函数 32 | :param request: 33 | :return: 34 | ''' 35 | 36 | # 筛选地图数据 37 | mapData=get_map_data(page) 38 | 39 | # 各城市职位排名 40 | rightTop=top100_city_data(page) 41 | 42 | # 各城市职位数所占比重 43 | rightBottom=to5LevelCityPie(page) 44 | 45 | # 词云 46 | wordCloudData=wordCloud(page) 47 | 48 | # Top5职位柱状图 49 | top5JobNum=getTop5JobNum(page) 50 | 51 | # 工作年限与薪资 52 | salary_exp=exp_salary(page) 53 | 54 | # 学历与薪资 55 | salary_level=level_salary(page) 56 | 57 | 58 | return render(request,'myapp/detail_page.html',{ 59 | 'map_data':mapData, 60 | 'right_top':rightTop, 61 | 'right_bottom':rightBottom, 62 | 'word_cloud_data':wordCloudData, 63 | 'top5JobNum':top5JobNum, 64 | 'salary_exp':salary_exp, 65 | 'salary_level':salary_level 66 | }) 67 | 68 | 69 | def monitor(request): 70 | data=crawl_monitor_page() 71 | context={"jobData":data} 72 | return render(request,"myapp/monitor_page.html",context) 73 | 74 | 75 | def test(request): 76 | keys=list() 77 | with open('./myapp/static/myapp/keywords.json','r',encoding='utf-8') as f: 78 | keys=json.loads(f.read()) 79 | sum = 0 80 | for key in keys[0]['Job_keywords']: 81 | result = zhilian.objects(jobType__icontains=key).count() 82 | sum += result 83 | 84 | job_data_all = zhilian.objects.values_list('city') 85 | data=job_data_all.count() 86 | 87 | return render(request,'myapp/test.html') 88 | 89 | --------------------------------------------------------------------------------