基于javaweb+mysql的jsp+servlet医院挂号预约管理系统(管理员、用户)(java+jsp+servlet+mysql)

基于javaweb+mysql的jsp+servlet医院挂号预约管理系统(管理员、用户)(java+jsp+servlet+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

eclipse/idea/myeclipse/sts等均可配置运行

适用

课程设计,大作业,毕业设计,项目练习,学习演示等

功能说明

管理员:登录、管理员、医生、病人、预约挂号、科室管理

普通用户:注册、登录、预约挂号、挂号查询

普通用户(前台)

管理员(后台)

技术框架

CSS JavaScript JSP Servlet JDBC MySQL

基于javaweb+mysql的JSP+Servlet医院挂号预约管理系统(管理员、用户)(java+jsp+servlet+mysql)


public class RegisterServlet extends HttpServlet {

	private RegisterService registerService = new RegisterServiceImp();
	private PatientService patientService = new PatientServiceImp();
	private DoctorService doctorService = new DoctorServiceImp();
	private OfficeService officeService = new OfficeServiceImp();

	public RegisterServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log

	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		// 得到值
				filename += Math.round(Math.random() * 1000000);
				filename += ext;
				filepath += filename;
				// 文件另存为
				file.setCharset("UTF-8");
				file.saveAs(filepath, SmartUpload.SAVE_VIRTUAL);
			}
			// 获取smartupload封装的request
			req = su.getRequest();
			// 得到值
			String docName = req.getParameter("docName");
			// String docImg=request.getParameter("docImg");
			int money = Integer.valueOf(req.getParameter("money"));
			String docTime = req.getParameter("docTime"); // 需要将其转化成sql里面的日期
			int sumCount = Integer.valueOf(req.getParameter("sumCount"));
			// int lessCount=Integer.valueOf(request.getParameter("lessCount"));
			// String docStatus=request.getParameter("docStatus");
			int offId = Integer.valueOf(req.getParameter("offId"));// 得到的就是offId
			Date timeDate = DateUtil.getBirthDate(docTime);
			// 插入数据库
			// /Doctor doctor=new Doctor(docName,Integer.valueOf(offId));
			Doctor doctor = new Doctor(docName, filepath, money, timeDate,
					sumCount, sumCount, "正常", offId);
			boolean b = doctorService.add(doctor);
			if (b) {// 成功// 跳转到列表,要更新
				showList(request, response);
			} else {
				// 插入失败
				request.setAttribute("error", "添加失败");
				request.getRequestDispatcher("/admin/addDoctor.jsp").forward(
						request, response);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 修改
	public void gotoModify(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 初始化下拉列表框
		List<Office> offList = officeService.getList(null, null);// ??、
		// 保存值,跳转到页面
		request.setAttribute("offList", offList);
		// 初始化值,初始化docName,初始化offName
		// 得到页面的docId,查询数据库,得到对象,初始化页面
		String docId = request.getParameter("docId");
		Doctor doc = doctorService.get(Integer.valueOf(docId));
		Office office = officeService.get(doc.getOffId());
		DoctorDto dto = new DoctorDto(); // 用dto封装
		dto.setDocId(doc.getDocId());
		dto.setDocName(doc.getDocName());
		dto.setOffName(office.getOffName());

public class PatientServlet extends HttpServlet {
	private PatientService patientService = new PatientServiceImp();
	private RegisterService registerService = new RegisterServiceImp();

	public PatientServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		// 得到值
		String method = request.getParameter("method");
		if (method.equals("showList")) {
			request.setAttribute("error", "请您输入姓名");
			request.getRequestDispatcher("/admin_login.jsp").forward(request,
					response);
			return;
		}
		if (password == null || password.equals("")) {
			request.setAttribute("error", "请您输入密码");
			request.getRequestDispatcher("/admin_login.jsp").forward(request,
					response);
			return;
		}
		if (imgTxt == null || imgTxt.trim().equals("")) {
			request.setAttribute("error", "验证码不能空");
			request.getRequestDispatcher("/admin_login.jsp").forward(request,
					response);
			return;
		}
		// 查找数据库,匹配管理员
		Admin admin = adminService.getAdmin(adminName);
		if (admin != null) {
			// 查找到有该管理员
			if (!password.trim().equals(admin.getAdminPassword())) {
				request.setAttribute("error", "密码错误");
				request.getRequestDispatcher("/admin_login.jsp").forward(
						request, response);
			} else {
				// 匹配验证码
				String str = (String) request.getSession().getAttribute("str");
			
				if (imgTxt.equals(str)) {
					// 登录成功,跳到后台管理页面
					// 将管理员保存到到session中
					request.getSession().setAttribute("admin", admin);
					request.getRequestDispatcher("/admin/index.jsp").forward(
							request, response);
				} else {
					
					request.setAttribute("error", "验证码错误");
					request.getRequestDispatcher("/admin_login.jsp").forward(
							request, response);
				}
			}
		} else {
			// 没有此管理员
				response);
	}

	public void modify(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String adminId = request.getParameter("adminId");
		String adminName = request.getParameter("adminName");
		String password = request.getParameter("password");

		Admin admin = new Admin(adminName, password);
		admin.setAdminId(Integer.valueOf(adminId)); // 根据id修改
		boolean b = adminService.modify(admin);
		if (b) {
			// 修改成功
			showList(request, response);

		} else {
			request.setAttribute("error", "修改管理员信息失败");
			request.getRequestDispatcher("/admin/updateAdmin.jsp").forward(
					request, response);
		}
	}

	public void gotoModify(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 得到admin,初始化界面,
		String adminId = request.getParameter("adminId");
		Admin admin = adminService.getAdmin(Integer.valueOf(adminId));
		request.setAttribute("admin", admin);
		request.getRequestDispatcher("/admin/updateAdmin.jsp").forward(request,
				response);

	}

	// 根据管理员id删除
	public void delete(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 删除单个传来的值
		String adminId = request.getParameter("adminId");

		// 删除多个传来的值
		String str = request.getParameter("adminIdArr");// 得到id的字符串,然后分割成数组

		boolean b = false;
		if (str != null && !str.trim().equals("")) {
			String arrId[] = str.split(","); // 将字符串分割成数组,得到所有复选框的value,即管理员id
			for (int i = 0; i < arrId.length; i++) {
				System.out.println(arrId[i]);
				b = adminService.delete(Integer.valueOf(arrId[i]));
			}
		} else {

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String method = request.getParameter("method");

		if (method.equals("add")) {

			// 添加用户
			add(request, response);

		} else if (method.equals("adminLogin")) {

			// 管理员登录
			adminLogin(request, response);

		} else if (method.equals("showList")) {

			// 显示管理员列表
			showList(request, response);

		} else if (method.equals("gotoModify")) {

			// 进入修改
			gotoModify(request, response);

		} else if (method.equals("modify")) {

			// 修改之后
			modify(request, response);

		} else if (method.equals("delete")) {

			// 删除用户
			delete(request, response);

		} else if (method.equals("loginOut")) {
			// 退出登录

			loginOut(request, response);
		}

	}

	// 判断是否重名
	public boolean isReName(String adminName, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		boolean reName = false;
		// 判断不能重名
		List<Admin> list = adminService.getAdminList(null, null); // 得到列表,查询所有的
		return b;

	}

	public void frontShowList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// 前台显示
		String offId = request.getParameter("offId");// 前台挂号时,通过选择科室得到下面的医生

		// 挂号时,选择医生,把医生id传过来
		String docId = request.getParameter("docId");
		if (docId != null) {
			// 跳到“挂号开始”页面
			Doctor doctor = doctorService.get(Integer.valueOf(docId));
			Office office = officeService.get(doctor.getOffId());
			request.setAttribute("office", office);
			request.setAttribute("doctor", doctor);
			request.getRequestDispatcher("/guhaoStart.jsp").forward(request,
					response);

		} else {
			// 选择科室时,显示科室下面的医生
			List<Doctor> doctorList = doctorService.getByOffId(Integer
					.valueOf(offId));
			Office office = officeService.get(Integer.valueOf(offId));
			request.setAttribute("office", office); // 医生列表中需要显示科室名称
			request.setAttribute("docList", doctorList);
			request.getRequestDispatcher("/showDoctor.jsp").forward(request,
					response);
		}

	}

	public void selectDocList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 分页
		PageData pageData = new PageData();
		// 得到当前页
		String currentPage = request.getParameter("currentPage");
		if (currentPage != null) {
			pageData.setCurrentPage(Integer.valueOf(currentPage));
		}
		// 得到每页行数
		String pageRows = request.getParameter("pageRows");
		if (pageRows != null) {
			pageData.setPageRows(Integer.valueOf(pageRows));
		// 判断不能重名
		List<Admin> list = adminService.getAdminList(null, null); // 得到列表,查询所有的
		if (list != null) {
			for (int i = 0; i < list.size(); i++) {
				if (list.get(i).getAdminName().equals(adminName)) {
					reName = true;
					break;
				}
			}
		}

		return reName;
	}

	public void add(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 添加管理员

		String adminName = request.getParameter("adminName");
		String password = request.getParameter("password");
		String rePassword = request.getParameter("rePassword");

		if (adminName == null || adminName.trim().equals("")) {
			request.setAttribute("error", "用户名不能为空");
			request.getRequestDispatcher("/admin/admin_add.jsp").forward(
					request, response);
			return;
		}
		if (password == null || password.trim().equals("")) {
			request.setAttribute("error", "密码不能为空");
			request.getRequestDispatcher("/admin/admin_add.jsp").forward(
					request, response);
			return;
		}
		if (rePassword == null || rePassword.trim().equals("")) {
			request.setAttribute("error", "确认密码不能为空");
			request.getRequestDispatcher("/admin/admin_add.jsp").forward(
					request, response);
			return;
		}
		if (!rePassword.equals(password)) {
			request.setAttribute("error", "两次密码不一致");
			request.getRequestDispatcher("/admin/admin_add.jsp").forward(

public class AdminServlet extends HttpServlet {

	private AdminService adminService = new AdminServiceImpl();

	public AdminServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String method = request.getParameter("method");

		if (method.equals("add")) {

			// 添加用户
			add(request, response);

		} else if (method.equals("adminLogin")) {

			// 管理员登录
			adminLogin(request, response);

		} else if (method.equals("showList")) {

			// 显示管理员列表
			showList(request, response);

		} else if (method.equals("gotoModify")) {
			throws ServletException, IOException {
		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		// 得到值
		String method = request.getParameter("method");
		if (method.equals("frontShowList")) {
			// 显示诊室列表
			frontShowList(request, response);

		} else if (method.equals("showList")) {
			// 显示诊室列表
			showList(request, response);

		} else if (method.equals("add")) {

			add(request, response);

		} else if (method.equals("modify")) {

			modify(request, response);

		} else if (method.equals("gotoModify")) {

			gotoModify(request, response);

		} else if (method.equals("delete")) {

			delete(request, response);
		}

	}

	public void frontShowList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 分页
		PageData pageData = new PageData();
		// 得到当前页
		String currentPage = request.getParameter("currentPage");
		if (currentPage != null) {
			pageData.setCurrentPage(Integer.valueOf(currentPage));
		}
		// 得到每页行数
		String pageRows = request.getParameter("pageRows");
		if (pageRows != null) {
			String arrId[] = str.split(","); // 将字符串分割成数组,得到所有复选框的value,即管理员id
			for (int i = 0; i < arrId.length; i++) {
				System.out.println(arrId[i]);
				b = adminService.delete(Integer.valueOf(arrId[i]));
			}
		} else {

			if (adminId != null) {
				b = adminService.delete(Integer.valueOf(adminId));
			} else {
				// 都为空的时候
				JOptionPane.showMessageDialog(null, "您还没有选择删除的人");// 跳出去
				showList(request, response);
				return;
			}

		}

		if (!b) {

			request.setAttribute("errDelete", "删除管理员失败");
		}

		showList(request, response);

	}

	public void loginOut(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 退出登录,销毁session

		request.getSession().invalidate();
		request.getRequestDispatcher("/admin_login.jsp").forward(request,
				response);

	}

	public void adminLogin(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String adminName = request.getParameter("adminName");
		String password = request.getParameter("password");
		// 删除单个传来的值
		String adminId = request.getParameter("adminId");

		// 删除多个传来的值
		String str = request.getParameter("adminIdArr");// 得到id的字符串,然后分割成数组

		boolean b = false;
		if (str != null && !str.trim().equals("")) {
			String arrId[] = str.split(","); // 将字符串分割成数组,得到所有复选框的value,即管理员id
			for (int i = 0; i < arrId.length; i++) {
				System.out.println(arrId[i]);
				b = adminService.delete(Integer.valueOf(arrId[i]));
			}
		} else {

			if (adminId != null) {
				b = adminService.delete(Integer.valueOf(adminId));
			} else {
				// 都为空的时候
				JOptionPane.showMessageDialog(null, "您还没有选择删除的人");// 跳出去
				showList(request, response);
				return;
			}

		}

		if (!b) {

			request.setAttribute("errDelete", "删除管理员失败");
		}

		showList(request, response);

	}

	public void loginOut(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 退出登录,销毁session

		request.getSession().invalidate();
		request.getRequestDispatcher("/admin_login.jsp").forward(request,
				response);

	}

		doPost(request, response);
		
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//生成验证码
		int width=70;
		int height=35;
		
		BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//TYPE_INT_RGB 表示一个图像,它具有合成整数像素的 8 位 RGB 颜色分量。
        
		//获取画笔 
		Graphics g=img.getGraphics();
		//设置图片颜色边框
		g.setColor(Color.white);
		g.fillRect(0, 0, width, height);  //rect矩形
		//设置边框颜色
		g.setColor(Color.black);
		g.drawRect(0, 0, width-1, height-1);
		
		//生成文字,随机
		Random random=new Random();
		int num=random.nextInt(8999)+1000;
		String str=String.valueOf(num);
		//讲str设置到session中去
		request.getSession().setAttribute("str", str);
		g.setColor(Color.red);
		g.setFont(new Font("黑体",Font.ITALIC,30));
		g.drawString(str, 5, 25); //10,20是坐标位置,其实坐标0,0是左下角,这是画文字的区别
		
		//生成干扰线,产生两个坐标
		for(int i=0;i<10;i++){
			int x0=random.nextInt(width);
			int y0=random.nextInt(height);
			int x1=random.nextInt(width);
			int y1=random.nextInt(height);
			g.drawLine(x1, y1, x0, y0);
		}
		
		
		//?
		ImageIO.write(img, "JPEG", response.getOutputStream());
		
		
	}

	
	public void init() throws ServletException {
		// Put your code here
	}
			return;
		}

		if (b) {
			// 添加成功
			// JOptionPane.showMessageDialog(null, "注册管理员成功");
			showList(request, response);
		} else {
			// 添加失败,返回到添加页面
			request.setAttribute("error", "添加管理员失败");
			request.getRequestDispatcher("/admin/admin_add.jsp").forward(
					request, response);
		}

	}

	// 显示管理员列表
	public void showList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String checkName = request.getParameter("checkName"); // 得到名字,根据姓名查找时用
		// 分页
		PageData pageData = new PageData();
		// 得到当前页
		String currentPage = request.getParameter("currentPage");
		if (currentPage != null) {
			pageData.setCurrentPage(Integer.valueOf(currentPage));
		}
		// 得到每页行数
		String pageRows = request.getParameter("pageRows");
		if (pageRows != null) {
			pageData.setPageRows(Integer.valueOf(pageRows));
		}
		// 得到总行数
		int rowsCount = adminService.getRowsCount(checkName);
		pageData.setRowsCount(rowsCount);
		// 计算总页数
		int pageCount = 0;
		if (rowsCount % pageData.getPageRows() == 0) {
			pageCount = rowsCount / pageData.getPageRows();
		} else {
			pageCount = rowsCount / pageData.getPageRows() + 1;
		}
		pageData.setPageCount(pageCount);
		List<Admin> adminList = adminService.getAdminList(checkName, pageData); // 得到所有的
		// 保存
		request.setAttribute("adminList", adminList);
		request.setAttribute("page", pageData); // 将page传过去
		request.setAttribute("checkName", checkName);// 不让名字清空
		request.getRequestDispatcher("/admin/adminList.jsp").forward(request,
				response);
	}

	public void modify(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		} else {
			request.setAttribute("error", "修改管理员信息失败");
			request.getRequestDispatcher("/admin/updateAdmin.jsp").forward(
					request, response);
		}
	}

	public void gotoModify(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 得到admin,初始化界面,
		String adminId = request.getParameter("adminId");
		Admin admin = adminService.getAdmin(Integer.valueOf(adminId));
		request.setAttribute("admin", admin);
		request.getRequestDispatcher("/admin/updateAdmin.jsp").forward(request,
				response);

	}

	// 根据管理员id删除
	public void delete(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 删除单个传来的值
		String adminId = request.getParameter("adminId");

		// 删除多个传来的值
		String str = request.getParameter("adminIdArr");// 得到id的字符串,然后分割成数组

		boolean b = false;
		if (str != null && !str.trim().equals("")) {
			String arrId[] = str.split(","); // 将字符串分割成数组,得到所有复选框的value,即管理员id
			for (int i = 0; i < arrId.length; i++) {
				System.out.println(arrId[i]);
				b = adminService.delete(Integer.valueOf(arrId[i]));
			}
		} else {

			if (adminId != null) {
				b = adminService.delete(Integer.valueOf(adminId));
			} else {
				// 都为空的时候
				JOptionPane.showMessageDialog(null, "您还没有选择删除的人");// 跳出去
				showList(request, response);
				return;
			pageData.setPageRows(Integer.valueOf(pageRows));
		}
		// 得到总行数
		int rowsCount = patientService.getRowsCount(checkName);	
		pageData.setRowsCount(rowsCount);	
		// 计算总页数
		int pageCount = 0;

		if (rowsCount % pageData.getPageRows() == 0) {
			pageCount = rowsCount / pageData.getPageRows();
		} else {
			pageCount = rowsCount / pageData.getPageRows() + 1;
		}
		pageData.setPageCount(pageCount);
		// 先查询数据库
		List<Patient> pList = patientService.getList(checkName, pageData);// 查询所有的
		// 查看是否有预约,有预约姓名显示红色,没有预约显示黑色,删除时就只能删除黑色的
		for (Patient p : pList) {
			boolean isReg = isHasReg(p.getpId(), request, response);
			if (isReg) {
				p.setColor("red");
			} else {
				p.setColor("black");
			}
		}
		// 跳到页面,并将值传过去
		request.setAttribute("pList", pList);
		request.setAttribute("page", pageData); // 将page传过去
		request.setAttribute("checkName", checkName);// 不让名字清空
		// 预约挂号中链接病人姓名得到信息
		String regPId = request.getParameter("regPId");
		if (regPId != null) {
			// 显示单条病人信息
			Patient patient = patientService.get(Integer.valueOf(regPId));
			request.setAttribute("patient", patient);
			request.getRequestDispatcher("/admin/regShowPatient.jsp").forward(
					request, response);
		} else {
			
			request.getRequestDispatcher("/admin/patientList.jsp").forward(
					request, response);
		}
	}

	// 添加
	public void add(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 得到值
		String name = request.getParameter("name");
		String password = request.getParameter("password");
			HttpServletResponse response) throws ServletException, IOException {
		boolean b = false; // 默认没有预约
		Register register = registerService.getByDocId(docId);
		if (register == null) {
			b = false;// 没有预约
		} else {
			b = true;// 有预约
		}
		return b;

	}

	public void frontShowList(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		// 前台显示
		String offId = request.getParameter("offId");// 前台挂号时,通过选择科室得到下面的医生

		// 挂号时,选择医生,把医生id传过来
		String docId = request.getParameter("docId");
		if (docId != null) {
			// 跳到“挂号开始”页面
			Doctor doctor = doctorService.get(Integer.valueOf(docId));
			Office office = officeService.get(doctor.getOffId());
			request.setAttribute("office", office);
			request.setAttribute("doctor", doctor);
			request.getRequestDispatcher("/guhaoStart.jsp").forward(request,
					response);

		} else {
			// 选择科室时,显示科室下面的医生
			List<Doctor> doctorList = doctorService.getByOffId(Integer
					.valueOf(offId));
			Office office = officeService.get(Integer.valueOf(offId));
			request.setAttribute("office", office); // 医生列表中需要显示科室名称
			request.setAttribute("docList", doctorList);
			request.getRequestDispatcher("/showDoctor.jsp").forward(request,
					response);
		}

	}

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值