智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

12 KiB

PHP后端开发规划

已完成接口

1. 学员课程信息接口

描述: 获取学员课程信息,用于前端CourseInfoCard组件使用

接口: GET /api/getStudentCourseInfo

请求参数:

参数 类型 必填 说明
resource_id int 资源ID
member_id string 会员ID
student_id int 学员ID(优先级高于member_id)

响应示例:

{
  "code": 1,
  "message": "success",
  "data": [
    {
      "id": 1,
      "course_name": "篮球课",
      "total_count": 24,
      "used_count": 8,
      "formal_hours": 20,
      "gift_hours": 4,
      "used_formal_hours": 6,
      "used_gift_hours": 2,
      "leave_count": 1,
      "start_date": "2024-01-01",
      "end_date": "2024-12-31",
      "expiry_date": "2024-06-30",
      "status": "active",
      "course_type": "常规课",
      "teacher_name": "张老师",
      "course_price": 2880.00,
      "class_duration": 90,
      "create_time": "2024-01-01 10:00:00",
      "remark": "备注信息"
    }
  ]
}

涉及数据表:

  • school_customer_resources - 资源表
  • school_student - 学员表
  • school_course - 课程表
  • school_student_course - 学员课程关联表
  • school_course_schedule - 课程排期表
  • school_attendance - 考勤表

SQL查询逻辑参考:

SELECT 
    sc.id,
    sc.course_name,
    ssc.total_count,
    ssc.used_count,
    ssc.formal_hours,
    ssc.gift_hours,
    ssc.used_formal_hours,
    ssc.used_gift_hours,
    ssc.leave_count,
    ssc.start_date,
    ssc.end_date,
    ssc.expiry_date,
    ssc.status,
    sc.course_type,
    sp.name as teacher_name,
    ssc.course_price,
    sc.class_duration,
    ssc.create_time,
    ssc.remark
FROM school_student_course ssc
LEFT JOIN school_course sc ON ssc.course_id = sc.id
LEFT JOIN school_personnel sp ON sc.teacher_id = sp.id
WHERE ssc.student_id = ? 
    AND ssc.resource_id = ?
    [AND ssc.member_id = ?]
ORDER BY ssc.create_time DESC

状态说明:

  • active: 正常使用
  • completed: 课程完结
  • expired: 已过期
  • pending: 待激活

业务逻辑:

  1. 优先使用student_id查询,其次使用member_id
  2. 计算剩余课时:remaining_count = total_count - used_count
  3. 检查课程是否过期,基于expiry_date
  4. 返回完整的课程信息及使用情况
  5. 支持多个课程返回

优化建议:

  • 使用Redis缓存常用查询结果
  • 对学员课程查询添加索引优化
  • 考虑分页处理大量数据

已新增接口

2. 服务列表接口

描述: 获取学员服务记录列表

接口: GET /api/xy/service/list

请求参数:

参数 类型 必填 说明
student_id int 学员ID

响应示例:

{
  "code": 1,
  "message": "操作成功", 
  "data": [
    {
      "id": 1,
      "service_name": "测试服务",
      "preview_image_url": "图片URL",
      "description": "服务描述",
      "service_type": "服务类型",
      "status": "active",
      "logs": [
        {
          "id": 1,
          "status": 1,
          "service_content": "服务内容",
          "service_staff": "教练姓名",
          "service_time": "服务时间",
          "duration": "持续时间",
          "customer_feedback": "客户反馈",
          "service_rating": 5,
          "remark": "备注",
          "course_name": "课程名称",
          "updated_at": "更新时间"
        }
      ],
      "total_count": 3,
      "completed_count": 3
    }
  ]
}

3. 体测记录接口(增删改查)

描述: 体测记录的完整CRUD操作

接口列表:

  • GET /api/xy/physicalTest - 获取体测记录列表
  • GET /api/xy/physicalTest/info - 获取体测记录详情
  • POST /api/xy/physicalTest/add - 添加体测记录
  • POST /api/xy/physicalTest/edit - 编辑体测记录
  • POST /api/xy/physicalTest/delete - 删除体测记录

数据表结构:

CREATE TABLE `school_physical_test` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '体测编号',
`resource_id` int NOT NULL COMMENT '资源ID',
`student_id` int DEFAULT NULL COMMENT '学员ID',
`age` int NOT NULL DEFAULT '0' COMMENT '学员年龄',
`height` decimal(5,2) NOT NULL COMMENT '身高',
`weight` decimal(5,2) NOT NULL COMMENT '体重',
`coach_id` int DEFAULT NULL COMMENT '教练ID',
`seated_forward_bend` decimal(5,2) DEFAULT NULL COMMENT '坐位体前屈',
`sit_ups` decimal(5,2) DEFAULT NULL COMMENT '仰卧起坐',
`push_ups` decimal(5,2) DEFAULT NULL COMMENT '俯卧撑',
`flamingo_balance` decimal(5,2) DEFAULT NULL COMMENT '单脚站立',
`thirty_sec_jump` decimal(5,2) DEFAULT NULL COMMENT '30秒跳绳',
`standing_long_jump` decimal(5,2) DEFAULT NULL COMMENT '立定跳远',
`agility_run` decimal(5,2) DEFAULT NULL COMMENT '敏捷跑',
`balance_beam` decimal(5,2) DEFAULT NULL COMMENT '平衡木',
`tennis_throw` decimal(5,2) DEFAULT NULL COMMENT '网球掷远',
`ten_meter_shuttle_run` decimal(5,2) DEFAULT NULL COMMENT '10米折返跑',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`physical_test_report` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '体测报告附件(多文件)',
PRIMARY KEY (`id`) USING BTREE
)

4. 学习计划接口(基于自定义表单)

描述: 基于diy_form自定义表单的学习计划管理系统

接口列表:

  • GET /api/xy/studyPlan - 获取学习计划列表
  • GET /api/xy/studyPlan/info - 获取学习计划详情
  • POST /api/xy/studyPlan/add - 添加学习计划
  • POST /api/xy/studyPlan/edit - 编辑学习计划
  • POST /api/xy/studyPlan/delete - 删除学习计划
  • POST /api/xy/studyPlan/updateProgress - 更新学习计划进度

数据表: 使用diy_form自定义表单系统

  • school_diy_form - 表单定义 (type='study_plan')
  • school_diy_form_fields - 字段定义
  • school_diy_form_records - 记录数据

响应数据结构:

{
  "code": 1,
  "message": "操作成功",
  "data": [
    {
      "id": 1,
      "student_id": 1,
      "plan_name": "基础体能训练计划",
      "plan_content": "针对学员的基础体能进行系统性训练",
      "plan_type": "体能训练",
      "status": "active",
      "progress": 65,
      "start_date": "2024-01-15",
      "end_date": "2024-03-15",
      "target_goals": "提升学员整体体能水平",
      "learning_materials": "体能训练器材、训练计划表",
      "evaluation_criteria": "体能测试成绩、训练完成度",
      "remark": "备注信息",
      "create_time": "2024-01-10 14:30:00",
      "update_time": "2024-01-10 14:30:00"
    }
  ]
}

前端集成状态

已完成联调的接口:

  1. 课程信息 - getStudentCourseInfo (完整联调,Mock与API一致)
  2. 服务列表 - getStudentServiceList (API正常工作)
  3. 体测记录 - xy_physicalTest (列表API + 增删改查API完整)
  4. 学习计划 - getStudyPlanList (基于自定义表单的完整CRUD)

🔧 技术实现特点:

  • 统一响应格式: 所有接口使用统一的 {code: 1, data: [], msg: "操作成功"} 格式
  • JWT认证: 所有接口通过token头进行身份验证
  • 参数验证: 完整的参数校验和错误处理
  • 数据库事务: 确保数据一致性
  • 错误处理: 完善的异常处理和日志记录

5. 个人资料接口(员工信息管理)

描述: 员工个人资料的查看和编辑功能,涉及基础信息和详细信息两个数据表

接口列表:

  • GET /api/getPersonnelInfo - 获取员工基础信息
  • POST /api/updatePersonnelInfo - 更新员工基础信息
  • GET /api/getPersonnelDetailInfo - 获取员工详细信息
  • POST /api/updatePersonnelDetailInfo - 更新员工详细信息

基础信息接口

接口: GET /api/getPersonnelInfo

请求参数:

参数 类型 必填 说明
id int 员工ID,不传则获取当前登录用户信息

响应示例:

{
  "code": 1,
  "message": "操作成功",
  "data": {
    "id": 1,
    "name": "张三",
    "head_img": "/uploads/avatar/20240101/avatar.jpg",
    "gender": 1,
    "birthday": "1990-05-15", 
    "phone": "13800138000",
    "email": "zhangsan@example.com",
    "wx": "zhangsan_wx",
    "address": "北京市朝阳区XXX小区",
    "native_place": "山东济南",
    "education": "本科",
    "profile": "个人简介内容",
    "emergency_contact_phone": "13900139000",
    "id_card_front": "/uploads/idcard/front.jpg",
    "id_card_back": "/uploads/idcard/back.jpg",
    "employee_number": "EMP001",
    "status": 2,
    "account_type": "teacher",
    "join_time": "2024-01-01 09:00:00",
    "create_time": "2024-01-01 09:00:00",
    "update_time": "2024-01-01 09:00:00"
  }
}

接口: POST /api/updatePersonnelInfo

请求参数:

{
  "id": 1,
  "name": "张三",
  "head_img": "/uploads/avatar/20240101/avatar.jpg",
  "gender": 1,
  "birthday": "1990-05-15",
  "phone": "13800138000", 
  "email": "zhangsan@example.com",
  "wx": "zhangsan_wx",
  "address": "北京市朝阳区XXX小区",
  "native_place": "山东济南",
  "education": "本科",
  "profile": "个人简介内容",
  "emergency_contact_phone": "13900139000",
  "id_card_front": "/uploads/idcard/front.jpg",
  "id_card_back": "/uploads/idcard/back.jpg"
}

详细信息接口

接口: GET /api/getPersonnelDetailInfo

请求参数:

参数 类型 必填 说明
person_id int 员工ID

响应示例:

{
  "code": 1,
  "message": "操作成功",
  "data": {
    "id": 1,
    "person_id": 1,
    "name": "张三花名",
    "store": "朝阳校区",
    "ethnicity": "汉族",
    "age": 30,
    "tenure": "3年2个月",
    "regular_date": "2024-07-01",
    "is_regular": "是",
    "politics": "群众",
    "university": "北京大学",
    "major": "体育教育",
    "graduation_date": "2015-06-30",
    "household_place": "山东省济南市",
    "household_type": "城镇户口",
    "household_address": "山东省济南市历下区XXX街道",
    "current_address": "北京市朝阳区XXX小区",
    "emergency_contact": "张父",
    "emergency_phone": "13900139000",
    "marital_status": "已婚",
    "bank_card": "6222021234567890123",
    "bank_name": "中国银行北京分行",
    "contract_expire": "2025-12-31",
    "is_rehired": "否",
    "remark": "备注信息",
    "created_at": "2024-01-01 09:00:00",
    "updated_at": "2024-01-01 09:00:00"
  }
}

接口: POST /api/updatePersonnelDetailInfo

请求参数: 与详细信息响应数据格式相同

涉及数据表:

  • school_personnel - 员工基础信息表
  • school_personnel_info - 员工详细信息表

字段重复处理:

基于数据库分析,需要删除以下重复字段:

-- 删除重复字段
ALTER TABLE school_personnel_info 
DROP COLUMN birthday, 
DROP COLUMN education, 
DROP COLUMN native_place;

业务逻辑:

  1. 只读字段: employee_number(员工编号)、tenure(司龄)只能查看不能修改
  2. 司龄计算: 根据join_time自动计算并更新
  3. 图片上传: 支持头像、身份证正反面图片上传
  4. 数据验证:
    • 手机号格式验证
    • 邮箱格式验证
    • 身份证号码验证
  5. 权限控制: 员工只能编辑自己的信息

前端页面:

  • 路径: /pages/common/profile/personal_info.vue
  • 功能: 查看、编辑员工个人资料
  • 特性: 响应式设计、表单验证、图片上传、分段展示

最后更新:2024-12-29 备注:后续接口开发请及时更新此文档