15 Commits
Author SHA1 Message Date
zhengxinonlyandGitee dc1e9afe0c !39 修复账号多角色时菜单重复,子菜单ID小于父菜单ID时无法显示的问题
Merge pull request !39 from waizking/N/A
2022-06-16 08:44:53 +00:00
就眠儀式andGitee 6220f979bf !42 update Dockerfile.
Merge pull request !42 from kyqv/N/A
2022-06-16 04:09:10 +00:00
kyqvandGitee 6ec05fd3f9 update Dockerfile.
阿里镜像源问题更新 导致docker 无法安装
2022-06-16 03:45:10 +00:00
不胜舟andGitee 8c3e43b85b !41 修复mysql连接中密码包含@特殊字符时的错误
Merge pull request !41 from stevenhu/N/A
2022-06-02 07:11:05 +00:00
stevenhuandGitee 248145b821 修复mysql连接中密码包含@特殊字符时的错误 2022-06-02 05:08:36 +00:00
就眠儀式andGitee 261a983678 update README.md. 2022-05-13 06:52:00 +00:00
sunshine 1a7e457054 解决bug 2022-05-08 21:29:44 +08:00
不胜舟andGitee 7ae59415e8 update applications/view/passport/__init__.py. 2022-04-12 11:16:54 +00:00
sunshine c50d5e7921 重写sqlalchemy的query,增加序列化方法 2022-04-12 16:55:27 +08:00
sunshine af873bf45e 升级依赖 2022-04-12 16:50:48 +08:00
waizkingandGitee 4384a3000c 修复账号多角色时菜单重复,子菜单ID小于父菜单ID时无法显示的问题 2022-03-21 03:15:25 +00:00
不胜舟andGitee 72a951a2b6 !34 修改数据库的字符集
Merge pull request !34 from zebra/N/A
2022-02-08 10:20:02 +00:00
zebraandGitee 38a5136e69 修改数据库的字符集 2022-02-08 10:18:47 +00:00
不胜舟andGitee 96dbeb0cbd !33 【轻量级 PR】:update applications/configs/config.py.
Merge pull request !33 from VincentFu/N/A
2022-01-25 07:14:04 +00:00
VincentFuandGitee 936c37c65c update applications/configs/config.py.
数据库编码设置为utf8mb4
2022-01-25 07:12:58 +00:00
10 changed files with 51 additions and 38 deletions
+3 -3
View File
@@ -14,11 +14,11 @@ MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_DATABASE=PearAdminFlask
MYSQL_USERNAME=root
MYSQL_PASSWORD=root
MYSQL_PASSWORD=123456
# Redis 配置
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
# REDIS_HOST=127.0.0.1
# REDIS_PORT=6379
# 密钥配置(记得改)
SECRET_KEY='pear-admin-flask'
+1 -3
View File
@@ -1,9 +1,7 @@
FROM python:3.7-alpine
RUN echo http://mirrors.aliyun.com/alpine/v3.12/main > /etc/apk/repositories \
&& echo http://mirrors.aliyun.com/alpine/v3.12/community >> /etc/apk/repositories \
&& apk update \
RUN apk update \
&& apk --update add --no-cache gcc \
&& apk --update add --no-cache g++ \
&& apk --update add --no-cache tzdata \
+1 -3
View File
@@ -8,7 +8,7 @@
开 箱 即 用 的 Flask 快 速 开 发 平 台
</h4>
[预 览](http://flask.pearadmin.com) | [官 网](http://www.pearadmin.com/) | [群聊](https://jq.qq.com/?_wv=1027&k=5OdSmve) | [社区](http://forum.pearadmin.com/)
[预 览](http://flask.pearadmin.com) | [官 网](http://www.pearadmin.com/) | [群聊](https://jq.qq.com/?_wv=1027&k=TkLAKUxC) | [社区](http://forum.pearadmin.com/)
<p align="center">
@@ -90,8 +90,6 @@ Pear Admin Flask
```
#### 项目安装
```bash
+2 -2
View File
@@ -36,12 +36,12 @@ def make_menu_tree():
if p.enable == 0:
continue
# 一二级菜单
if int(p.type) == 0 or int(p.type) == 1:
if int(p.type) in [0,1] and p not in powers:
powers.append(p)
power_schema = PowerOutSchema(many=True) # 用已继承 ma.ModelSchema 类的自定制类生成序列化类
power_dict = power_schema.dump(powers) # 生成可序列化对象
power_dict.sort(key=lambda x: x['id'], reverse=True)
power_dict.sort(key=lambda x: (x['parent_id'], x['id']), reverse=True)
menu_dict = OrderedDict()
for _dict in power_dict:
+1 -1
View File
@@ -22,7 +22,7 @@ def is_exist_database():
def init_database():
db = pymysql.connect(host=HOST, port=int(PORT), user=USERNAME, password=PASSWORD, charset='utf8mb4')
cursor1 = db.cursor()
sql = "CREATE DATABASE IF NOT EXISTS %s" % DATABASE
sql = "CREATE DATABASE IF NOT EXISTS %s CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;" % DATABASE
res = cursor1.execute(sql)
db.close()
return res
+3 -1
View File
@@ -1,5 +1,6 @@
import logging
import os
from urllib.parse import quote_plus as urlquote
class BaseConfig:
@@ -44,7 +45,8 @@ class BaseConfig:
MYSQL_DATABASE = os.getenv('MYSQL_DATABASE') or "PearAdminFlask"
# mysql 数据库的配置信息
SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{urlquote(MYSQL_PASSWORD)}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}?charset=utf8mb4"
# 默认日志等级
LOG_LEVEL = logging.WARN
#
+23 -5
View File
@@ -55,16 +55,34 @@ class Query(BaseQuery):
def logic_all(self):
return self.filter_by(delete_at=None).all()
def all_json(self, schema: Marshmallow().Schema):
return schema(many=True).dump(self.all())
def layui_paginate(self):
"""
layui表格分页
page
limit
"""
return self.paginate(page=request.args.get('page', type=int),
per_page=request.args.get('limit', type=int),
error_out=False)
def layui_paginate_json(self, schema: Marshmallow().Schema):
"""
返回dict
"""
_res = self.paginate(
page=request.args.get('page', type=int),
per_page=request.args.get('limit', type=int),
error_out=False
)
return schema(many=True).dump(_res.items), _res.total, _res.page, _res.per_page
def layui_paginate_db_json(self):
"""
db.query(A.name).layui_paginate_db_json()
"""
_res = self.paginate(page=request.args.get('page', type=int),
per_page=request.args.get('limit', type=int),
error_out=False)
return [dict(i) for i in _res.items], _res.total
db = SQLAlchemy(query_class=Query)
ma = Marshmallow()
+13 -16
View File
@@ -1,15 +1,13 @@
from flask import Blueprint, render_template, request, jsonify
from marshmallow import INCLUDE
from webargs.flaskparser import use_args
from applications.common import curd
from applications.common.utils import validate
from applications.common.utils.http import success_api, fail_api
from applications.common.utils.rights import authorize
from applications.common.utils import validate
from applications.common.utils.validate import xss_escape
from applications.extensions import db
from applications.models import Dept, User
from applications.schemas import DeptOutSchema
from applications.schemas.admin_dept import DeptInSchema
dept_bp = Blueprint('dept', __name__, url_prefix='/dept')
@@ -56,17 +54,17 @@ def tree():
@dept_bp.post('/save')
@authorize("admin:dept:add", log=True)
@use_args(DeptInSchema(), location="json", unknown=True)
def save(args):
def save():
req_json = request.json
dept = Dept(
parent_id=args['parentId'],
dept_name=args['deptName'],
sort=args['sort'],
leader=args['leader'],
phone=args['phone'],
email=args['email'],
status=args['status'],
address=args['address']
parent_id=req_json.get('parentId'),
dept_name=xss_escape(req_json.get('deptName')),
sort=xss_escape(req_json.get('sort')),
leader=xss_escape(req_json.get('leader')),
phone=xss_escape(req_json.get('phone')),
email=xss_escape(req_json.get('email')),
status=xss_escape(req_json.get('status')),
address=xss_escape(req_json.get('address'))
)
r = db.session.add(dept)
db.session.commit()
@@ -77,7 +75,7 @@ def save(args):
@authorize("admin:dept:edit", log=True)
def edit():
_id = request.args.get("deptId")
dept = curd.get_one_by_id(model=Dept,id=_id)
dept = curd.get_one_by_id(model=Dept, id=_id)
return render_template('admin/dept/edit.html', dept=dept)
@@ -115,7 +113,6 @@ def dis_enable():
@authorize("admin:dept:edit", log=True)
def update():
json = request.json
validate.check_data(DeptSchema(unknown=INCLUDE), json)
id = json.get("deptId"),
data = {
"dept_name": validate.xss_escape(json.get("deptName")),
+2 -2
View File
@@ -49,10 +49,10 @@ def login_post():
return fail_api(msg="验证码错误")
user = User.query.filter_by(username=username).first()
if user is None:
if not user:
return fail_api(msg="不存在的用户")
if user.enable is 0:
if user.enable == 0:
return fail_api(msg="用户被暂停使用")
if username == user.username and user.validate_password(password):
+2 -2
View File
@@ -1,8 +1,8 @@
Flask==2.0.2
Flask==2.1.1
Flask-APScheduler==1.12.2
Flask-DebugToolbar==0.11.0
Flask-Migrate==3.1.0
Flask-Login==0.5.0
Flask-Login==0.6.0
Flask_Reuploaded==0.5.0
Flask-SQLAlchemy==2.5.1
flask-marshmallow==0.14.0