person.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. """Person API routes."""
  2. from flask_restx import Namespace, Resource, fields
  3. from app.services.person_service import PersonService
  4. from app.utils.auth_decorator import require_auth
  5. person_ns = Namespace('persons', description='人员管理接口')
  6. # API models for Swagger documentation
  7. person_model = person_ns.model('Person', {
  8. 'id': fields.Integer(readonly=True, description='人员ID'),
  9. 'name': fields.String(required=True, description='人员姓名'),
  10. 'created_at': fields.String(readonly=True, description='创建时间'),
  11. 'updated_at': fields.String(readonly=True, description='更新时间')
  12. })
  13. person_input = person_ns.model('PersonInput', {
  14. 'name': fields.String(required=True, description='人员姓名')
  15. })
  16. person_update = person_ns.model('PersonUpdate', {
  17. 'id': fields.Integer(required=True, description='人员ID'),
  18. 'name': fields.String(required=True, description='人员姓名')
  19. })
  20. person_delete = person_ns.model('PersonDelete', {
  21. 'id': fields.Integer(required=True, description='人员ID')
  22. })
  23. # Response models
  24. success_response = person_ns.model('SuccessResponse', {
  25. 'success': fields.Boolean(description='操作是否成功'),
  26. 'data': fields.Raw(description='返回数据'),
  27. 'message': fields.String(description='消息')
  28. })
  29. error_response = person_ns.model('ErrorResponse', {
  30. 'success': fields.Boolean(description='操作是否成功'),
  31. 'error': fields.String(description='错误信息'),
  32. 'code': fields.String(description='错误代码')
  33. })
  34. @person_ns.route('')
  35. class PersonList(Resource):
  36. """Resource for listing all persons."""
  37. @person_ns.doc('list_persons')
  38. @person_ns.response(200, 'Success', success_response)
  39. @require_auth
  40. def get(self):
  41. """获取所有人员列表"""
  42. persons = PersonService.get_all()
  43. return {
  44. 'success': True,
  45. 'data': persons,
  46. 'message': 'Persons retrieved successfully'
  47. }, 200
  48. @person_ns.route('/<int:id>')
  49. @person_ns.param('id', '人员ID')
  50. class PersonDetail(Resource):
  51. """Resource for getting a single person."""
  52. @person_ns.doc('get_person')
  53. @person_ns.response(200, 'Success', success_response)
  54. @person_ns.response(404, 'Person not found', error_response)
  55. @require_auth
  56. def get(self, id):
  57. """根据ID获取人员信息"""
  58. person, error = PersonService.get_by_id(id)
  59. if error:
  60. return {
  61. 'success': False,
  62. 'error': error,
  63. 'code': 'NOT_FOUND'
  64. }, 404
  65. return {
  66. 'success': True,
  67. 'data': person,
  68. 'message': 'Person retrieved successfully'
  69. }, 200
  70. @person_ns.route('/create')
  71. class PersonCreate(Resource):
  72. """Resource for creating a person."""
  73. @person_ns.doc('create_person')
  74. @person_ns.expect(person_input)
  75. @person_ns.response(200, 'Success', success_response)
  76. @person_ns.response(400, 'Validation error', error_response)
  77. @require_auth
  78. def post(self):
  79. """创建新人员"""
  80. data = person_ns.payload
  81. name = data.get('name', '')
  82. person, error = PersonService.create(name)
  83. if error:
  84. code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR'
  85. return {
  86. 'success': False,
  87. 'error': error,
  88. 'code': code
  89. }, 400
  90. return {
  91. 'success': True,
  92. 'data': person,
  93. 'message': 'Person created successfully'
  94. }, 200
  95. @person_ns.route('/update')
  96. class PersonUpdate(Resource):
  97. """Resource for updating a person."""
  98. @person_ns.doc('update_person')
  99. @person_ns.expect(person_update)
  100. @person_ns.response(200, 'Success', success_response)
  101. @person_ns.response(400, 'Validation error', error_response)
  102. @person_ns.response(404, 'Person not found', error_response)
  103. @require_auth
  104. def post(self):
  105. """更新人员信息"""
  106. data = person_ns.payload
  107. person_id = data.get('id')
  108. name = data.get('name', '')
  109. if not person_id:
  110. return {
  111. 'success': False,
  112. 'error': 'Person ID is required',
  113. 'code': 'VALIDATION_ERROR'
  114. }, 400
  115. person, error = PersonService.update(person_id, name)
  116. if error:
  117. if '未找到' in error:
  118. return {
  119. 'success': False,
  120. 'error': error,
  121. 'code': 'NOT_FOUND'
  122. }, 404
  123. code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR'
  124. return {
  125. 'success': False,
  126. 'error': error,
  127. 'code': code
  128. }, 400
  129. return {
  130. 'success': True,
  131. 'data': person,
  132. 'message': 'Person updated successfully'
  133. }, 200
  134. @person_ns.route('/delete')
  135. class PersonDelete(Resource):
  136. """Resource for deleting a person."""
  137. @person_ns.doc('delete_person')
  138. @person_ns.expect(person_delete)
  139. @person_ns.response(200, 'Success', success_response)
  140. @person_ns.response(404, 'Person not found', error_response)
  141. @require_auth
  142. def post(self):
  143. """删除人员"""
  144. data = person_ns.payload
  145. person_id = data.get('id')
  146. if not person_id:
  147. return {
  148. 'success': False,
  149. 'error': 'Person ID is required',
  150. 'code': 'VALIDATION_ERROR'
  151. }, 400
  152. success, error = PersonService.delete(person_id)
  153. if error:
  154. return {
  155. 'success': False,
  156. 'error': error,
  157. 'code': 'NOT_FOUND'
  158. }, 404
  159. return {
  160. 'success': True,
  161. 'data': None,
  162. 'message': 'Person deleted successfully'
  163. }, 200