wip:(重构接口实现方式4)
This commit is contained in:
@@ -8,15 +8,15 @@ from .roles import RoleRoleApi, RolePowerApi, role_deletes, role_enable_resource
|
|||||||
|
|
||||||
|
|
||||||
def register_rights_api(api_bp):
|
def register_rights_api(api_bp):
|
||||||
register_api(DepartmentsApi, 'rights_dept_api', '/dept/department/', pk='dept_id', app=api_bp)
|
register_api(DepartmentsApi, 'rights_dept_api', '/dept/department/', pk='_id', app=api_bp)
|
||||||
api_bp.add_url_rule('/dept/department/<int:dept_id>/status',
|
api_bp.add_url_rule('/dept/department/<int:_id>/status',
|
||||||
view_func=DeptEnableAPI.as_view('dept_status_api'),
|
view_func=DeptEnableAPI.as_view('dept_status_api'),
|
||||||
methods=['PUT', ])
|
methods=['PUT', ])
|
||||||
api_bp.add_url_rule('/rights/rights',
|
api_bp.add_url_rule('/rights/rights',
|
||||||
view_func=RightsApi.as_view('dept_rights_api'),
|
view_func=RightsApi.as_view('dept_rights_api'),
|
||||||
methods=['GET', 'DELETE'])
|
methods=['GET', 'DELETE'])
|
||||||
|
|
||||||
register_api(PowerApi, 'rights_power_api', '/power/', pk='_id', app=api_bp)
|
register_api(PowerApi, 'rights_power_api', '/rights/power/', pk='_id', app=api_bp)
|
||||||
api_bp.add_url_rule('/rights/configs',
|
api_bp.add_url_rule('/rights/configs',
|
||||||
endpoint='rights_config_api',
|
endpoint='rights_config_api',
|
||||||
view_func=admin_configs_resource,
|
view_func=admin_configs_resource,
|
||||||
@@ -25,7 +25,7 @@ def register_rights_api(api_bp):
|
|||||||
endpoint='rights_menu_api',
|
endpoint='rights_menu_api',
|
||||||
view_func=admin_menu_resource,
|
view_func=admin_menu_resource,
|
||||||
methods=['GET'])
|
methods=['GET'])
|
||||||
api_bp.add_url_rule('/power/<int:right_id>/<action>',
|
api_bp.add_url_rule('/rights/power/<int:_id>/<action>',
|
||||||
endpoint='rights_power_action_api',
|
endpoint='rights_power_action_api',
|
||||||
view_func=right_power_enable_resource,
|
view_func=right_power_enable_resource,
|
||||||
methods=['PUT'])
|
methods=['PUT'])
|
||||||
|
|||||||
@@ -1,17 +1,31 @@
|
|||||||
|
import typing as t
|
||||||
|
|
||||||
from flask import jsonify
|
from flask import jsonify
|
||||||
from flask.views import MethodView
|
from flask.views import MethodView
|
||||||
from flask_restful import reqparse
|
from flask_pydantic import validate
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from common.utils.http import success_api, fail_api
|
from common.utils.http import success_api, fail_api
|
||||||
from extensions import db
|
from extensions import db
|
||||||
from models import DepartmentModel, UserModel
|
from models import DepartmentModel, UserModel
|
||||||
|
|
||||||
|
|
||||||
|
class DeptModel(BaseModel):
|
||||||
|
address: t.Optional[str]
|
||||||
|
dept_name: t.Optional[str] = Field(alias='deptName')
|
||||||
|
email: t.Optional[str]
|
||||||
|
leader: t.Optional[str]
|
||||||
|
parent_id: t.Optional[str] = Field(alias='parentId')
|
||||||
|
phone: t.Optional[str]
|
||||||
|
sort: t.Optional[int]
|
||||||
|
status: t.Optional[int]
|
||||||
|
|
||||||
|
|
||||||
class DepartmentsApi(MethodView):
|
class DepartmentsApi(MethodView):
|
||||||
|
|
||||||
def get(self, dept_id):
|
def get(self, _id):
|
||||||
if dept_id:
|
if _id:
|
||||||
dept = DepartmentModel.query.filter_by(id=dept_id).first()
|
dept = DepartmentModel.query.filter_by(id=_id).first()
|
||||||
dept_data = {
|
dept_data = {
|
||||||
'id': dept.id,
|
'id': dept.id,
|
||||||
'dept_name': dept.dept_name,
|
'dept_name': dept.dept_name,
|
||||||
@@ -46,18 +60,9 @@ class DepartmentsApi(MethodView):
|
|||||||
}
|
}
|
||||||
return jsonify(res)
|
return jsonify(res)
|
||||||
|
|
||||||
def post(self):
|
@validate()
|
||||||
parser = reqparse.RequestParser()
|
def post(self, body: DeptModel):
|
||||||
parser.add_argument('address', type=str)
|
res = body
|
||||||
parser.add_argument('deptName', type=str, dest='dept_name')
|
|
||||||
parser.add_argument('email', type=str)
|
|
||||||
parser.add_argument('leader', type=str)
|
|
||||||
parser.add_argument('parentId', type=int, dest='parent_id')
|
|
||||||
parser.add_argument('phone', type=str)
|
|
||||||
parser.add_argument('sort', type=int)
|
|
||||||
parser.add_argument('status', type=int)
|
|
||||||
|
|
||||||
res = parser.parse_args()
|
|
||||||
|
|
||||||
dept = DepartmentModel(
|
dept = DepartmentModel(
|
||||||
parent_id=res.parent_id,
|
parent_id=res.parent_id,
|
||||||
@@ -74,17 +79,9 @@ class DepartmentsApi(MethodView):
|
|||||||
|
|
||||||
return success_api(message="成功")
|
return success_api(message="成功")
|
||||||
|
|
||||||
def put(self, dept_id):
|
@validate()
|
||||||
parser = reqparse.RequestParser()
|
def put(self, _id, body: DeptModel):
|
||||||
parser.add_argument('address', type=str)
|
res = body
|
||||||
parser.add_argument('deptName', type=str, dest='dept_name')
|
|
||||||
parser.add_argument('email', type=str)
|
|
||||||
parser.add_argument('leader', type=str)
|
|
||||||
parser.add_argument('phone', type=str)
|
|
||||||
parser.add_argument('sort', type=int)
|
|
||||||
parser.add_argument('status', type=int)
|
|
||||||
|
|
||||||
res = parser.parse_args()
|
|
||||||
data = {
|
data = {
|
||||||
"dept_name": res.dept_name,
|
"dept_name": res.dept_name,
|
||||||
"sort": res.sort,
|
"sort": res.sort,
|
||||||
@@ -94,15 +91,15 @@ class DepartmentsApi(MethodView):
|
|||||||
"status": res.status,
|
"status": res.status,
|
||||||
"address": res.address
|
"address": res.address
|
||||||
}
|
}
|
||||||
res = DepartmentModel.query.filter_by(id=dept_id).update(data)
|
res = DepartmentModel.query.filter_by(id=_id).update(data)
|
||||||
if not res:
|
if not res:
|
||||||
return fail_api(message="更新失败")
|
return fail_api(message="更新失败")
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return success_api(message="更新成功")
|
return success_api(message="更新成功")
|
||||||
|
|
||||||
def delete(self, dept_id):
|
def delete(self, _id):
|
||||||
ret = DepartmentModel.query.filter_by(id=dept_id).delete()
|
ret = DepartmentModel.query.filter_by(id=_id).delete()
|
||||||
UserModel.query.filter_by(dept_id=dept_id).update({"dept_id": None})
|
UserModel.query.filter_by(dept_id=_id).update({"dept_id": None})
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
if ret:
|
if ret:
|
||||||
return success_api(message="删除成功")
|
return success_api(message="删除成功")
|
||||||
@@ -110,8 +107,8 @@ class DepartmentsApi(MethodView):
|
|||||||
|
|
||||||
|
|
||||||
class DeptEnableAPI(MethodView):
|
class DeptEnableAPI(MethodView):
|
||||||
def put(self, dept_id):
|
def put(self, _id):
|
||||||
d = DepartmentModel.query.get(dept_id)
|
d = DepartmentModel.query.get(_id)
|
||||||
if d:
|
if d:
|
||||||
d.status = not d.status
|
d.status = not d.status
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
import copy
|
import copy
|
||||||
|
from typing import Optional
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
from flask import request, jsonify, current_app
|
from flask import request, jsonify, current_app
|
||||||
from flask.views import MethodView
|
from flask.views import MethodView
|
||||||
from flask_login import current_user
|
from flask_login import current_user
|
||||||
from flask_restful import reqparse
|
from flask_pydantic import validate
|
||||||
|
|
||||||
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from common.utils.http import success_api, fail_api
|
from common.utils.http import success_api, fail_api
|
||||||
from extensions import db
|
from extensions import db
|
||||||
@@ -160,15 +163,15 @@ def batch_remove_power(ids):
|
|||||||
remove_power(_id)
|
remove_power(_id)
|
||||||
|
|
||||||
|
|
||||||
parser_power = reqparse.RequestParser(bundle_errors=True)
|
class PowerModel(BaseModel):
|
||||||
parser_power.add_argument('icon', type=str)
|
icon: str
|
||||||
parser_power.add_argument('openType', type=str, dest='open_type')
|
open_type: Optional[str] = Field(alias='openType')
|
||||||
parser_power.add_argument('parentId', type=str, dest='parent_id')
|
parent_id: Optional[str] = Field(alias='parentId')
|
||||||
parser_power.add_argument('powerCode', type=str, dest='power_code')
|
power_code: Optional[str] = Field(alias='powerCode')
|
||||||
parser_power.add_argument('powerName', type=str, dest='power_name')
|
power_name: Optional[str] = Field(alias='powerName')
|
||||||
parser_power.add_argument('powerType', type=str, dest='power_type')
|
power_type: Optional[str] = Field(alias='powerType')
|
||||||
parser_power.add_argument('powerUrl', type=str, dest='power_url')
|
power_url: Optional[str] = Field(alias='powerUrl')
|
||||||
parser_power.add_argument('sort', type=int, dest='sort')
|
sort: Optional[int] = Field(alias='sort')
|
||||||
|
|
||||||
|
|
||||||
class RightsApi(MethodView):
|
class RightsApi(MethodView):
|
||||||
@@ -204,9 +207,9 @@ class RightsApi(MethodView):
|
|||||||
|
|
||||||
|
|
||||||
class PowerApi(MethodView):
|
class PowerApi(MethodView):
|
||||||
|
@validate()
|
||||||
def post(self):
|
def post(self, body: PowerModel):
|
||||||
res = parser_power.parse_args()
|
res = body
|
||||||
power = RightModel(
|
power = RightModel(
|
||||||
icon=res.icon,
|
icon=res.icon,
|
||||||
open_type=res.open_type,
|
open_type=res.open_type,
|
||||||
@@ -245,9 +248,9 @@ class PowerApi(MethodView):
|
|||||||
else:
|
else:
|
||||||
return fail_api(message="删除失败")
|
return fail_api(message="删除失败")
|
||||||
|
|
||||||
def put(self, _id):
|
@validate()
|
||||||
|
def put(self, _id, body: PowerModel):
|
||||||
res = parser_power.parse_args()
|
res = body
|
||||||
data = {
|
data = {
|
||||||
"icon": res.icon,
|
"icon": res.icon,
|
||||||
"open_type": res.open_type,
|
"open_type": res.open_type,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
from flask.views import MethodView
|
from flask.views import MethodView
|
||||||
|
|
||||||
from flask_restful import Resource, reqparse
|
from flask_restful import reqparse
|
||||||
|
|
||||||
from common.utils.http import table_api, success_api, fail_api
|
from common.utils.http import table_api, success_api, fail_api
|
||||||
from extensions import db
|
from extensions import db
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ class FilePhotoAPI(MethodView):
|
|||||||
|
|
||||||
def get(self, photo_id):
|
def get(self, photo_id):
|
||||||
if photo_id is None:
|
if photo_id is None:
|
||||||
page = request.args.get('page', type=int)
|
page = request.args.get('page', type=int, default=1)
|
||||||
limit = request.args.get('limit', type=int)
|
limit = request.args.get('limit', type=int, default=10)
|
||||||
photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at)
|
photo_paginate = PhotoModel.query.order_by(desc(PhotoModel.create_at)
|
||||||
).paginate(page=page,
|
).paginate(page=page,
|
||||||
per_page=limit,
|
per_page=limit,
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ from flask import render_template, make_response
|
|||||||
from flask import session, redirect, url_for
|
from flask import session, redirect, url_for
|
||||||
from flask.views import MethodView
|
from flask.views import MethodView
|
||||||
from flask_login import current_user, login_user
|
from flask_login import current_user, login_user
|
||||||
from flask_restful import reqparse
|
from flask_pydantic import validate
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
from common.gen_captcha import add_auth_session
|
from common.gen_captcha import add_auth_session
|
||||||
from common.utils.http import fail_api, success_api
|
from common.utils.http import fail_api, success_api
|
||||||
@@ -10,6 +11,12 @@ from common.utils.rights import record_logging
|
|||||||
from models import UserModel
|
from models import UserModel
|
||||||
|
|
||||||
|
|
||||||
|
class LoginModel(BaseModel):
|
||||||
|
username: str
|
||||||
|
password: str
|
||||||
|
captcha: str
|
||||||
|
|
||||||
|
|
||||||
class LoginAPI(MethodView):
|
class LoginAPI(MethodView):
|
||||||
|
|
||||||
def get(self):
|
def get(self):
|
||||||
@@ -17,19 +24,14 @@ class LoginAPI(MethodView):
|
|||||||
return redirect(url_for('admin.index'))
|
return redirect(url_for('admin.index'))
|
||||||
return make_response(render_template('index/login.html'))
|
return make_response(render_template('index/login.html'))
|
||||||
|
|
||||||
def post(self):
|
@validate()
|
||||||
login_req = reqparse.RequestParser(bundle_errors=True)
|
def post(self, body: LoginModel):
|
||||||
login_req.add_argument('username', type=str, help='请输入用户名', required=True)
|
|
||||||
login_req.add_argument('password', type=str, help='请输入密码', required=True)
|
|
||||||
login_req.add_argument('captcha', type=str, help='请输入验证码', required=True)
|
|
||||||
req = login_req.parse_args()
|
|
||||||
|
|
||||||
s_code = session.get("code", None)
|
s_code = session.get("code", None)
|
||||||
session["code"] = None
|
session["code"] = None
|
||||||
|
|
||||||
if req.captcha != s_code:
|
if body.captcha != s_code:
|
||||||
return fail_api(message="验证码错误")
|
return fail_api(message="验证码错误")
|
||||||
user = UserModel.query.filter_by(username=req.username).first()
|
user = UserModel.query.filter_by(username=body.username).first()
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
return fail_api(message="不存在的用户")
|
return fail_api(message="不存在的用户")
|
||||||
@@ -37,7 +39,7 @@ class LoginAPI(MethodView):
|
|||||||
if user.enable == 0:
|
if user.enable == 0:
|
||||||
return fail_api(message="用户被暂停使用")
|
return fail_api(message="用户被暂停使用")
|
||||||
|
|
||||||
if user.validate_password(req.password):
|
if user.validate_password(body.password):
|
||||||
# 登录
|
# 登录
|
||||||
login_user(user)
|
login_user(user)
|
||||||
# 记录登录日志
|
# 记录登录日志
|
||||||
|
|||||||
@@ -53,7 +53,8 @@
|
|||||||
let btn = button.load({ elem: '.login' })
|
let btn = button.load({ elem: '.login' })
|
||||||
$.ajax({
|
$.ajax({
|
||||||
url: '/api/v1/passport/login',
|
url: '/api/v1/passport/login',
|
||||||
data: data.field,
|
data: JSON.stringify(data.field),
|
||||||
|
contentType: 'application/json',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
// 请求成功之后返回的数据
|
// 请求成功之后返回的数据
|
||||||
|
|||||||
Reference in New Issue
Block a user