├── .gitattributes ├── .gitignore ├── Company.sql ├── CompanyQuiry ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── GetFont.py ├── README.md ├── manage.py ├── rbac ├── __init__.py ├── admin.py ├── apps.py ├── forms │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ ├── base.cpython-37.pyc │ │ ├── menu.cpython-37.pyc │ │ ├── role.cpython-37.pyc │ │ └── user.cpython-37.pyc │ ├── base.py │ ├── menu.py │ ├── role.py │ └── user.py ├── middlewares │ ├── __pycache__ │ │ └── rbac.cpython-37.pyc │ └── rbac.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_menu_sort_num.py │ ├── 0003_auto_20191212_1201.py │ ├── 0004_auto_20191212_1459.py │ ├── __init__.py │ └── __pycache__ │ │ ├── 0001_initial.cpython-37.pyc │ │ ├── 0002_menu_sort_num.cpython-37.pyc │ │ ├── 0003_auto_20191212_1201.cpython-37.pyc │ │ ├── 0004_auto_20191212_1459.cpython-37.pyc │ │ └── __init__.cpython-37.pyc ├── models.py ├── service │ ├── __pycache__ │ │ ├── init_permission.cpython-37.pyc │ │ ├── routes.cpython-37.pyc │ │ └── urls.cpython-37.pyc │ ├── init_permission.py │ ├── routes.py │ ├── urls.py │ └── 目录.md ├── static │ ├── __init__.py │ ├── css │ │ ├── commons.css │ │ └── nav.css │ ├── imgs │ │ ├── default.png │ │ ├── iico.png │ │ └── logo.png │ ├── js │ │ └── jquery-3.3.1.min.js │ ├── plugins │ │ ├── bootstrap │ │ │ ├── css │ │ │ │ ├── bootstrap-theme.css │ │ │ │ ├── bootstrap-theme.css.map │ │ │ │ ├── bootstrap-theme.min.css │ │ │ │ ├── bootstrap-theme.min.css.map │ │ │ │ ├── bootstrap.css │ │ │ │ ├── bootstrap.css.map │ │ │ │ ├── bootstrap.min.css │ │ │ │ └── bootstrap.min.css.map │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ │ └── glyphicons-halflings-regular.woff2 │ │ │ └── js │ │ │ │ ├── bootstrap.js │ │ │ │ ├── bootstrap.min.js │ │ │ │ └── npm.js │ │ └── font-awesome │ │ │ ├── HELP-US-OUT.txt │ │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ │ ├── less │ │ │ ├── animated.less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── screen-reader.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ │ └── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ └── rbac │ │ ├── __init__.py │ │ ├── css │ │ ├── __init__.py │ │ └── rbac.css │ │ ├── js │ │ ├── __init__.py │ │ └── rbac.js │ │ ├── 插菜单需要引入 │ │ └── 菜单js和css放这做可插拔 ├── templates │ ├── __init__.py │ ├── layout.html │ └── rbac │ │ ├── __init__.py │ │ ├── breadcrumb.html │ │ ├── change.html │ │ ├── delete.html │ │ ├── distribute_permissions.html │ │ ├── menu_list.html │ │ ├── multi_menu.html │ │ ├── multi_permissions.html │ │ ├── role_list.html │ │ └── user_list.html ├── templatetags │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ └── rbac.cpython-37.pyc │ └── rbac.py ├── tests.py ├── urls.py ├── views │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-37.pyc │ │ ├── menu.cpython-37.pyc │ │ ├── role.cpython-37.pyc │ │ └── user.cpython-37.pyc │ ├── menu.py │ ├── role.py │ └── user.py ├── 【总】权限分配思路.md └── 【总】权限和菜单思路.md ├── stark ├── __init__.py ├── admin.py ├── apps.py ├── forms │ ├── __init__.py │ ├── forms单独渲染插件.md │ └── widgets.py ├── migrations │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-37.pyc ├── models.py ├── service │ ├── __pycache__ │ │ └── v1.cpython-37.pyc │ └── v1.py ├── static │ └── stark │ │ ├── css │ │ ├── commons.css │ │ ├── nav.css │ │ └── search-group.css │ │ ├── imgs │ │ ├── default.png │ │ └── logo.png │ │ ├── js │ │ └── jquery-3.3.1.min.js │ │ └── plugins │ │ ├── bootstrap │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ │ ├── datetimepicker │ │ ├── css │ │ │ ├── bootstrap-datetimepicker.css │ │ │ └── bootstrap-datetimepicker.min.css │ │ └── js │ │ │ ├── bootstrap-datetimepicker.js │ │ │ ├── bootstrap-datetimepicker.min.js │ │ │ └── locales │ │ │ └── bootstrap-datetimepicker.zh-CN.js │ │ └── font-awesome │ │ ├── HELP-US-OUT.txt │ │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── templates │ ├── layout.html │ └── stark │ │ ├── change.html │ │ ├── changelist.html │ │ ├── delete.html │ │ └── forms │ │ ├── __init__.py │ │ └── widgets │ │ ├── __init__.py │ │ └── datetime_picker.html ├── tests.py ├── utils │ ├── __pycache__ │ │ └── pagination.cpython-37.pyc │ └── pagination.py ├── views.py └── 【说明】stark组件使用说明.md ├── static ├── img │ ├── WX20191213-110528.png │ ├── WX20191213-110557.png │ ├── WX20191213-110617.png │ ├── WX20191213-110714.png │ ├── WX20191213-110731.png │ ├── favicon.png │ ├── img1.png │ ├── img2.png │ ├── img3.png │ ├── img4.png │ ├── img5.png │ └── loginBG.jpg ├── js │ └── jquery-3.3.1.min.js └── layui │ ├── css │ ├── layui.css │ ├── layui.mobile.css │ └── modules │ │ ├── code.css │ │ ├── laydate │ │ └── default │ │ │ └── laydate.css │ │ └── layer │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ ├── font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ ├── iconfont.woff │ └── iconfont.woff2 │ ├── images │ └── face │ │ ├── 0.gif │ │ ├── 1.gif │ │ ├── 10.gif │ │ ├── 11.gif │ │ ├── 12.gif │ │ ├── 13.gif │ │ ├── 14.gif │ │ ├── 15.gif │ │ ├── 16.gif │ │ ├── 17.gif │ │ ├── 18.gif │ │ ├── 19.gif │ │ ├── 2.gif │ │ ├── 20.gif │ │ ├── 21.gif │ │ ├── 22.gif │ │ ├── 23.gif │ │ ├── 24.gif │ │ ├── 25.gif │ │ ├── 26.gif │ │ ├── 27.gif │ │ ├── 28.gif │ │ ├── 29.gif │ │ ├── 3.gif │ │ ├── 30.gif │ │ ├── 31.gif │ │ ├── 32.gif │ │ ├── 33.gif │ │ ├── 34.gif │ │ ├── 35.gif │ │ ├── 36.gif │ │ ├── 37.gif │ │ ├── 38.gif │ │ ├── 39.gif │ │ ├── 4.gif │ │ ├── 40.gif │ │ ├── 41.gif │ │ ├── 42.gif │ │ ├── 43.gif │ │ ├── 44.gif │ │ ├── 45.gif │ │ ├── 46.gif │ │ ├── 47.gif │ │ ├── 48.gif │ │ ├── 49.gif │ │ ├── 5.gif │ │ ├── 50.gif │ │ ├── 51.gif │ │ ├── 52.gif │ │ ├── 53.gif │ │ ├── 54.gif │ │ ├── 55.gif │ │ ├── 56.gif │ │ ├── 57.gif │ │ ├── 58.gif │ │ ├── 59.gif │ │ ├── 6.gif │ │ ├── 60.gif │ │ ├── 61.gif │ │ ├── 62.gif │ │ ├── 63.gif │ │ ├── 64.gif │ │ ├── 65.gif │ │ ├── 66.gif │ │ ├── 67.gif │ │ ├── 68.gif │ │ ├── 69.gif │ │ ├── 7.gif │ │ ├── 70.gif │ │ ├── 71.gif │ │ ├── 8.gif │ │ └── 9.gif │ ├── lay │ └── modules │ │ ├── carousel.js │ │ ├── code.js │ │ ├── colorpicker.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── rate.js │ │ ├── slider.js │ │ ├── table.js │ │ ├── transfer.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js │ ├── layui.all.js │ └── layui.js └── web ├── __init__.py ├── admin.py ├── apps.py ├── migrations ├── 0001_initial.py ├── 0002_company.py ├── 0003_auto_20191209_1448.py ├── 0004_food.py ├── 0005_card.py ├── __init__.py └── __pycache__ │ ├── 0001_initial.cpython-37.pyc │ ├── 0002_company.cpython-37.pyc │ ├── 0003_auto_20191209_1448.cpython-37.pyc │ ├── 0004_food.cpython-37.pyc │ ├── 0005_card.cpython-37.pyc │ └── __init__.cpython-37.pyc ├── models.py ├── stark.py ├── templates ├── index.html └── login.html ├── tests.py ├── utils ├── MD5.py ├── __init__.py └── __pycache__ │ ├── MD5.cpython-37.pyc │ └── __init__.cpython-37.pyc └── views ├── __init__.py ├── __pycache__ ├── __init__.cpython-37.pyc ├── base.cpython-37.pyc ├── card.cpython-37.pyc ├── company.cpython-37.pyc ├── food.cpython-37.pyc ├── userinfo.cpython-37.pyc └── views.cpython-37.pyc ├── base.py ├── card.py ├── company.py ├── food.py ├── userinfo.py └── views.py /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js linguist-language=python 2 | *.sql linguist-language=python -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | */.DS_Store 3 | 4 | /.idea 5 | */.idea 6 | 7 | /__pycache__ 8 | */__pycache__ 9 | 10 | -------------------------------------------------------------------------------- /CompanyQuiry/__init__.py: -------------------------------------------------------------------------------- 1 | import pymysql 2 | 3 | # 代替MySQLdb 4 | pymysql.install_as_MySQLdb() 5 | -------------------------------------------------------------------------------- /CompanyQuiry/settings.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 4 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 5 | 6 | 7 | # Quick-start development settings - unsuitable for production 8 | # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ 9 | 10 | # SECURITY WARNING: keep the secret key used in production secret! 11 | SECRET_KEY = 'f86cfj&0t2lg3+orn$_t5fyr=f_5mzk_a99q%qp-f&xyhgu)b#' 12 | 13 | # SECURITY WARNING: don't run with debug turned on in production! 14 | DEBUG = True 15 | 16 | ALLOWED_HOSTS = ["*"] 17 | 18 | 19 | # Application definition 20 | 21 | INSTALLED_APPS = [ 22 | 'django.contrib.admin', 23 | 'django.contrib.auth', 24 | 'django.contrib.contenttypes', 25 | 'django.contrib.sessions', 26 | 'django.contrib.messages', 27 | 'django.contrib.staticfiles', 28 | 'web.apps.WebConfig', 29 | 'rbac.apps.RbacConfig', 30 | 'stark.apps.StarkConfig', 31 | ] 32 | 33 | MIDDLEWARE = [ 34 | 'django.middleware.security.SecurityMiddleware', 35 | 'django.contrib.sessions.middleware.SessionMiddleware', 36 | 'django.middleware.common.CommonMiddleware', 37 | 'django.middleware.csrf.CsrfViewMiddleware', 38 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 39 | 'django.contrib.messages.middleware.MessageMiddleware', 40 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 41 | 'rbac.middlewares.rbac.RbacMiddleware', 42 | ] 43 | 44 | ROOT_URLCONF = 'CompanyQuiry.urls' 45 | 46 | TEMPLATES = [ 47 | { 48 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 49 | 'DIRS': [os.path.join(BASE_DIR, 'templates')] 50 | , 51 | 'APP_DIRS': True, 52 | 'OPTIONS': { 53 | 'context_processors': [ 54 | 'django.template.context_processors.debug', 55 | 'django.template.context_processors.request', 56 | 'django.contrib.auth.context_processors.auth', 57 | 'django.contrib.messages.context_processors.messages', 58 | ], 59 | }, 60 | }, 61 | ] 62 | 63 | WSGI_APPLICATION = 'CompanyQuiry.wsgi.application' 64 | 65 | 66 | # Database 67 | # https://docs.djangoproject.com/en/2.2/ref/settings/#databases 68 | 69 | DATABASES = { 70 | 'default': { 71 | # 连接数据库类型 在末尾写入mysql即可 72 | 'ENGINE': 'django.db.backends.mysql', 73 | # 数据库地址 74 | 'HOST': '127.0.0.1', 75 | # 端口 76 | 'PORT': 3306, 77 | # 数据库名 78 | 'NAME': 'Company', 79 | # 用户 80 | 'USER': 'root', 81 | # 密码 82 | 'PASSWORD': '' 83 | } 84 | } 85 | 86 | 87 | # Password validation 88 | # https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators 89 | 90 | AUTH_PASSWORD_VALIDATORS = [ 91 | { 92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 93 | }, 94 | { 95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 96 | }, 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 102 | }, 103 | ] 104 | 105 | 106 | # admin后台改为中文 107 | # 如果表单名改完自定义中文,在model下的init中设置默认配置 default_app_config = 'apps.blog.apps.BlogConfig' 108 | LANGUAGE_CODE = 'zh-Hans' 109 | 110 | # 时区设置到上海 111 | TIME_ZONE = 'Asia/Shanghai' 112 | 113 | USE_I18N = True 114 | 115 | USE_L10N = True 116 | 117 | USE_TZ = False # 时间过滤 month 不好用时候,改为False (Mysql才会出现) 118 | 119 | 120 | STATIC_URL = '/static/' 121 | STATICFILES_DIRS = [ 122 | os.path.join(BASE_DIR, 'static') # 把新增加的添加到内置的STATICFILES_DIRS内 123 | ] 124 | 125 | # STATIC_ROOT = os.path.join(BASE_DIR, "static") # 生产环境下比较配置否则static找不到 126 | 127 | # 配置用户上传静态文件 media 128 | # 还需要在url.py中进行配置才生效 129 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 130 | # 做别名 131 | MEDIA_URL = '/media/' 132 | 133 | 134 | RBAC_USER_MODEL_CLASS = 'web.models.UserInfo' 135 | 136 | # 权限 key 137 | PERMISSION_SESSION_KEY = "company_permission_url_list_key" # 名字根据项目更改 138 | # 菜单 key 139 | MENU_SESSION_KEY = 'company_menu_list_key' # 名字根据项目更改 140 | 141 | # 访问白名单 142 | VALID_URL_LIST = [ 143 | '/login/', 144 | '/admin/.*', 145 | # '', 146 | ] 147 | 148 | # 需要登录但无需权限的URL 149 | NO_PERMISSION_LIST = [ 150 | '/logout/', 151 | '/index/', 152 | ] 153 | 154 | # 自动收录路由白名单,自动忽略的名单 155 | AUTO_DISCOVER_EXCLUDE = [ 156 | '/admin/.*', 157 | '/login/', 158 | '/logout/', 159 | '/index/', 160 | ] 161 | -------------------------------------------------------------------------------- /CompanyQuiry/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path 3 | from django.conf.urls import url, include 4 | 5 | from web.views import views 6 | from stark.service.v1 import site 7 | 8 | urlpatterns = [ 9 | path('admin/', admin.site.urls), 10 | 11 | # 路由系统 12 | url(r'^stark/', site.urls), 13 | # 权限系统 14 | url(r'^rbac/', include(('rbac.urls', 'rbac'), namespace='rbac')), 15 | 16 | 17 | # 用户 18 | url(r'^login/', views.login, name='login'), 19 | url(r'^logout/', views.logout, name='logout'), 20 | url(r'^index/', views.index, name='index'), 21 | url(r'^$', views.login, name='login'), 22 | ] 23 | -------------------------------------------------------------------------------- /CompanyQuiry/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for CompanyQuiry 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', 'CompanyQuiry.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /GetFont.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # __author__ = "zok" 362416272@qq.com 3 | # Date: 2019-12-05 Python: 3.7 4 | 5 | import requests 6 | import re 7 | 8 | response = requests.get('http://www.fontawesome.com.cn/faicons/') 9 | 10 | ret = re.findall(r'