wip:(重构接口实现方式4)

This commit is contained in:
zhengxinonly
2022-05-11 23:31:58 +08:00
parent 0d25b479e5
commit 36250fad43
7 changed files with 71 additions and 68 deletions
+4 -4
View File
@@ -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'])
+30 -33
View File
@@ -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()
+19 -16
View File
@@ -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 -1
View File
@@ -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
+2 -2
View File
@@ -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,
+13 -11
View File
@@ -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)
# 记录登录日志 # 记录登录日志
+2 -1
View File
@@ -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',
// 请求成功之后返回的数据 // 请求成功之后返回的数据