Browse Source

更新用户信息、批量删除用户、批量修改用户状态、导出用户数据

zhangnaiwen 2 years ago
parent
commit
89310b25f6
1 changed files with 118 additions and 14 deletions
  1. 118 14
      src/app/api/users.py

+ 118 - 14
src/app/api/users.py

@@ -1,4 +1,7 @@
-from flask import request, jsonify
+import json
+from io import BytesIO, StringIO
+
+from flask import request, jsonify, Response
 from flask_restx import Resource, Namespace, reqparse
 from sqlalchemy import insert, select, update, delete
 from sqlalchemy.orm import Session
@@ -33,9 +36,7 @@ class GetUserListApi(Resource):
             stmt = select(User).where(User.account_status == status).offset(page_size * (page - 1)).limit(page_size)
             results = session.execute(stmt).scalars().all()
 
-        data = to_dict(results)
-
-        return jsonify(code=StatesCode.SUCCESS, message="成功", data=data)
+        return jsonify(code=StatesCode.SUCCESS, message="成功", data=to_dict(results))
 
 
 add_user = reqparse.RequestParser(bundle_errors=True)
@@ -134,7 +135,8 @@ class UsersApi(Resource):
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message="用户id或用户状态不能为空")
 
         with Session(engine) as session:
-            session.execute(update(User).where(User.id == user_id).values(account_status=account_status))
+            stmt = update(User).where(User.id == user_id).values(account_status=account_status)
+            session.execute(stmt)
             session.commit()
 
         return jsonify(code=StatesCode.SUCCESS, message="修改用户状态成功")
@@ -149,7 +151,8 @@ class UsersApi(Resource):
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message="用户id不能为空")
 
         with Session(engine) as session:
-            session.execute(delete(User).where(User.id == user_id))
+            stmt = delete(User).where(User.id == user_id)
+            session.execute(stmt)
             session.commit()
 
         return jsonify(code=StatesCode.SUCCESS, message="删除成功")
@@ -158,6 +161,22 @@ class UsersApi(Resource):
 user_details = reqparse.RequestParser(bundle_errors=True)
 user_details.add_argument(name='id', type=int, required=True, location='args', help='用户id')
 
+user_details_update = reqparse.RequestParser(bundle_errors=True)
+user_details_update.add_argument(name='id', type=str, required=True, location='form', help='用户id')
+user_details_update.add_argument(name='username', type=str, required=False, location='form', help='用户名')
+user_details_update.add_argument(name='password', type=str, required=False, location='form', help='密码')
+user_details_update.add_argument(name='photograph', type=str, required=False, location='form', help='照片')
+user_details_update.add_argument(name='name', type=str, required=False, location='form', help='姓名')
+user_details_update.add_argument(name='phone', type=str, required=False, location='form', help='电话')
+user_details_update.add_argument(name='email', type=str, required=False, location='form', help='邮箱')
+user_details_update.add_argument(name='company', type=str, required=False, location='form', help='公司')
+user_details_update.add_argument(name='department', type=str, required=False, location='form', help='部门')
+user_details_update.add_argument(name='role', type=str, required=False, location='form', help='角色')
+user_details_update.add_argument(name='permission', type=str, required=False, location='form', help='权限')
+user_details_update.add_argument(name='on_job_status', type=str, required=False, location='form', help='在职状态')
+user_details_update.add_argument(name='duty', type=str, required=False, location='form', help='职务')
+user_details_update.add_argument(name='nationality', type=str, required=False, location='form', help='国籍')
+
 
 @ns.route('/user_details')
 class GetUsersApi(Resource):
@@ -177,30 +196,108 @@ class GetUsersApi(Resource):
         return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
 
     @ns.doc(id='update_users_details', description='更新用户详情')
-    @ns.expect()
+    @ns.expect(user_details_update)
     def put(self):
         """更新用户详情"""
 
-        return {"code": StatesCode.SUCCESS, "message": "成功", "data": ""}
+        user_id = request.form.get('id')
+        username = request.form.get('username')
+        password = request.form.get('password')
+        photograph = request.form.get('photograph')
+        name = request.form.get('name')
+        phone = request.form.get('phone')
+        email = request.form.get('email')
+        company = request.form.get('company')
+        department = request.form.get('department')
+        role = request.form.get('role')
+        permission = request.form.get('permission')
+        on_job_status = request.form.get('on_job_status')
+        duty = request.form.get('duty')
+        nationality = request.form.get('nationality')
+
+        with Session(engine) as session:
+            stmt = update(User).where(User.id == user_id).values(
+                user_name=username,
+                password=User().generate_password(password),
+                photograph=photograph,
+                name=name,
+                phone=phone,
+                email=email,
+                company=company,
+                department=department,
+                role=role,
+                permission=permission,
+                on_job_status=on_job_status,
+                duty=duty,
+                nationality=nationality,
+            )
+            session.execute(stmt)
+            session.commit()
+
+        return jsonify(code=StatesCode.SUCCESS, message='修改成功')
+
+
+batch_delete_user = reqparse.RequestParser(bundle_errors=True)
+batch_delete_user.add_argument(name='users_id', type=str, required=True, location='form', help='用户id列表')
 
 
 @ns.route('/batch_delete_user')
 class BatchDeleteUserApi(Resource):
     @ns.doc(id='batch_delete_users', description='批量删除用户')
-    @ns.expect()
+    @ns.expect(batch_delete_user)
     def delete(self):
         """批量删除用户"""
+        users_id = request.form.get('users_id')
+
+        if users_id is not None:
+            users_id = json.loads(users_id)
+        else:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='用户id不能为空')
+
+        with Session(engine) as session:
+            stmt = select(User).where(User.id.in_(users_id))
+            results = session.execute(stmt).scalars().all()
+
+            for result in results:
+                session.delete(result)
+            session.commit()
+
+        return jsonify(code=StatesCode.SUCCESS, message='批量删除成功')
 
-        return {"code": StatesCode.SUCCESS, "message": "成功", "data": "user004"}
+
+batch_modify_user_status = reqparse.RequestParser(bundle_errors=True)
+batch_modify_user_status.add_argument(name='users_id', type=list, required=True, location='form', help='用户id列表')
+batch_modify_user_status.add_argument(name='status', type=int, required=True, location='form',
+                                      help='用户状态 0为正常,1为禁用')
 
 
 @ns.route('/batch_modify_user_status')
 class BatchModifyUsersStatusApi(Resource):
-    @ns.doc(id='get_users_details', description='批量修改用户状态,激活、禁用')
-    @ns.expect()
+    @ns.doc(id='batch_modify_user_status', description='批量修改用户状态,激活、禁用')
+    @ns.expect(batch_modify_user_status)
     def put(self):
         """批量修改用户状态,激活、禁用"""
-        return {"code": StatesCode.SUCCESS, "message": "成功", "data": ""}
+
+        users_id = request.form.get('users_id')
+        account_status = request.form.get('status')
+
+        if users_id is not None and account_status is not None:
+            users_id = json.loads(users_id)
+        else:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='用户id和状态不能为空')
+
+        values = []
+        for user_id in users_id:
+            values.append({"id": user_id, "account_status": account_status})
+
+        with Session(engine) as session:
+            session.execute(
+                update(User),
+                values
+            )
+            session.commit()
+
+        return jsonify(code=StatesCode.SUCCESS, message='批量修改用户状态成功')
 
 
 @ns.route('/export_data')
@@ -209,4 +306,11 @@ class ExportDataApi(Resource):
     @ns.expect()
     def get(self):
         """导出用户数据"""
-        return {"code": StatesCode.SUCCESS, "message": "成功", "data": ""}
+        with Session(engine) as session:
+            stmt = select(User)
+            results = session.execute(stmt).scalars().all()
+
+        response = Response(StringIO(json.dumps(to_dict(results))))
+        response.headers['Content-Type'] = 'application/octet-stream'
+        response.headers['Content-Disposition'] = 'attachment; filename=%s' % 'users.json'
+        return response