基于javaweb+mysql的ssm+maven在线考试系统(java+ssm+bootstrap+jsp+jquery+mysql)

基于javaweb+mysql的ssm+maven在线考试系统(java+ssm+bootstrap+jsp+jquery+mysql)

运行环境

Java≥8、MySQL≥5.7、Tomcat≥8

开发工具

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

适用

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

功能说明

基于javaweb+mysql的SSM+Maven在线考试系统(java+ssm+bootstrap+jsp+jquery+mysql)

项目介绍

这个项目是一个基于SSM的在线考试系统,分为考试用户和管理员两种角色。

考试用户功能包括: 个人信息中心 成绩查询 在线答题 我的错题本 我的试卷

管理员功能包括: 试题管理 题型管理 用户管理 年级管理 课程管理 试卷管理

环境需要

1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本; 6.是否maven项目:是;

技术栈

  1. 后端:Spring+SpringMVC+Mybatis 2. 前端:JSP+css+javascript+jQuery+bootstrap

使用说明

  1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件; 2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven; 若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行; 3. 将项目中jdbc.properties配置文件中的数据库配置改为自己的配置; 4. 运行项目,在浏览器中输入http://localhost:8080/online_exam_ssm/toLogin.action 登录 学生账户:zhangsan/123456 后管登录地址:http://localhost:8080/online_exam_ssm/admin/login.action 管理员账户:admin/123456
			
		}
		typeService.update(type);
		return MsgItem.success("编辑题型成功");			
	}
	
	/**
	 * 删除题型信息
	 * @param type
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/delType.action")
	public String delType(int typeId, HttpSession session){
		typeService.delete(typeId);
		return "redirect:/admin/type/toTypePage.action";	
	}
}

@RequestMapping("/home/error")
@Controller
public class ErrorBookController {
		return MsgItem.success("添加试卷成功");
	}
	
	/**
	 * 删除试卷信息
	 * @param paperId	试卷编号,删除多个是,id用逗号分隔开
	 * @param model
	 * @return
	 */
	@RequestMapping("/deletePaper.action")
	public String deletePaper(String paperId, Model model){
		if(paperId != null){
			String ids[] = paperId.split(",");
			for(int i=0;i<ids.length;i++){
				paperService.delete(ids[i]);
			}
		}
		return "redirect:/admin/paper/toPaperPage.action";
	} 
	

	
	/**
	 * 去掉最后一个逗号
	 * @param str
	 * @return
	 */
	public String removeLast(String str){
		//判断最后一个字符是否为逗号,若是截取
		String newStr = str.substring(str.length() -1, str.length());
		if(",".equals(newStr)){
			newStr = str.substring(0, str.length()-1);
		}else{
			newStr = str;
		}
		return newStr;
	}
	
}

		return MsgItem.success("添加年级成功");			
	}
	
	
	
	/**
	 * 删除年级信息
	 * @param type
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/delGrade.action")
	public String delGrade(int gradeId, Model model, HttpSession session){
			gradeService.delete(gradeId);
		return "redirect:/admin/grade/toGradePage.action";			
	}
}

/**
 * 试题类型管理
 *
 */
@RequestMapping("/admin/type")
@Controller
public class TypeController {
	
	@Autowired
	TypeService typeService;
	
	@RequestMapping("/toTypePage.action")
	public String toTypePage(@RequestParam(value="page", defaultValue="1") int page,
			Type type,Model model, HttpSession session){
		PageInfo<Type> pageInfo = typeService.findByPage(type, page, 5);
		List<Type> dataList = pageInfo.getList();

     * @param session
     * @return
     */
    @ResponseBody
    @RequestMapping("/userLogin.action")
    public MsgItem checkUser(User user, Model model, HttpSession session) {
        if (StringUtils.isEmpty(user.getUserName())) {
            return MsgItem.error("请填写用户名");
        }
        if (StringUtils.isEmpty(user.getUserPwd())) {
            return MsgItem.error("请填写密码");
        }
        User loginUser = userService.loginCheck(user);
        if (loginUser == null) {
            return MsgItem.error("用户名或密码错误");
        }
        if (loginUser.getUserType() != 2) {
            return MsgItem.error("用户类型不匹配");
        }
        session.setAttribute("adminName", loginUser.getUserName());
        session.setAttribute("adminUser", loginUser);
        return MsgItem.success("登录成功");
    }

    /**
     * 判断账户信息是否存在
     *
     * @param name

     * @return
     */
    @RequestMapping("/checkAccount.action")
    public String checkAccount(String userId, Model model) {
        User userInfo = userService.get(userId);
        if (userInfo != null) {
            model.addAttribute("message", "该账号已经存在");
        } else {
            model.addAttribute("message", "<font color='green'>验证通过</font>");
        }
        model.addAttribute("userId", userId);
        return "/admin/info-reg";
    }

    /**
	public List<Type> qryTypePage(@RequestParam(value="page", defaultValue="1") int page,
			Type type,Model model, HttpSession session){
		PageInfo<Type> pageInfo = typeService.findByPage(type, page, 5);
		List<Type> dataList = pageInfo.getList();
		model.addAttribute("dataList", dataList);
		model.addAttribute("pageInfo", pageInfo);
		return dataList;			
	}
	
	/**
	 * 删除题型信息
	 * @param typeId	题型编号,删除多个是,id用逗号分隔开
	 * @param model
	 * @return
	 */
	@RequestMapping("/deleteType.action")
	public String deleteType(String typeId, Model model){
		if(typeId != null){
			String ids[] = typeId.split(",");
			for(int i=0;i<ids.length;i++){
				typeService.delete(Integer.parseInt(ids[i]));
			}
		}
		return "redirect:/admin/type/toTypePage.action";
	} 
	/**
	 * 跳转到添加用户信息页面
	 * @param user
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/toAddType.action")
	public String toAddType(Type type, Model model, HttpSession session){
		return "/admin/type/add";			
	}
	
	/**
	 * 添加题型信息
	 * @param user
	 * @param model
	 * @return
	 */
	@ResponseBody
    /**
     * 注销登录
     *

     * @param session
     * @return
     */
    @RequestMapping("/exitSys.action")
    public String exitSys(User user, Model model, HttpSession session) {
        if (session.getAttribute("userName") != null) {
            session.removeAttribute("userName");
            session.removeAttribute("adminUser");
            return "forward:/admin/login.action";
        }
        return "/admin/login";
    }

    //跳转到题库录入页面
    @RequestMapping(value = "/toQueDep.action", method = RequestMethod.POST)
    public String toQueDep(Model model, HttpSession session) {
        return "/admin/info-reg";
    }

    //获取所有的用户信息
    @RequestMapping("/getAllUser.action")
    public String getAllUserInfo(@RequestParam(value = "page", defaultValue = "1") int page,
                                 User user, Model model, HttpSession session) {
        PageInfo<User> pageInfo = userService.findByPage(user, page, 5);
        List<User> dataList = pageInfo.getList();
        model.addAttribute("dataList", dataList);
        model.addAttribute("pageInfo", pageInfo);
        return "/admin/user/list";
    }

    //获取所有的用户信息
    @RequestMapping("/qryAllUser.action")
    @ResponseBody
    public List<User> qryAllUser(@RequestParam(value = "page", defaultValue = "1") int page,
                                 User user, Model model, HttpSession session) {
        PageInfo<User> pageInfo = userService.findByPage(user, page, 5);
        List<User> dataList = pageInfo.getList();
        model.addAttribute("dataList", dataList);
        model.addAttribute("pageInfo", pageInfo);
        return dataList;
    }

    /**
     * 跳转到添加用户信息页面
     *
		for(ErrorBook book:bookList) {
			Question question = book.getQuestion();
			int difficulty = question.getDifficulty();
			if(difficulty==0) {
				simple=simple+1;
			}else if(difficulty==1) {
				commonly=commonly+1;
			}else {
				difficultys=difficultys+1;
			}
		}
		int total=simple+commonly+difficultys;
		model.addAttribute("simple",simple);
		model.addAttribute("commonly",commonly);
		model.addAttribute("difficultys",difficultys);
		model.addAttribute("total",total);
		model.addAttribute("errorBook", bookList);
		session.setAttribute("active", "error");
		return "/user/mybooks";			
	}
	
	//跳转到前台登录页面
	@RequestMapping("/getBooks.action")
	public String getBooks(User user, Model model, HttpSession session){
		List<Grade> gradeList = gradeService.find(new Grade());
		List<Course> courseList = courseService.find(new Course());
		List<Type> typeList = typeService.find(new Type());
		List<ErrorBook> errorBookList = bookService.getBookInfo(new HashMap());
		model.addAttribute("grade", gradeList);
		model.addAttribute("course", courseList);
		model.addAttribute("type", typeList);
		return "/user/mybooks";			
	}
	
}

			}
		}
		
		if(selList.size()>0){
			Type type = typeService.get(7);
			model.addAttribute("selectQ", type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("selList", selList);
		}
		
		if(inpList.size()>0){
			Type type = typeService.get(8);
			model.addAttribute("inpQ", type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("inpList", inpList);
		}
		
		if(desList.size()>0){
			Type type = typeService.get(9);
			model.addAttribute("desQ",  type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("desList", desList);
		}
		model.addAttribute("paper", paper);
		return "/user/test_paper";			
	}
	
	/**
	 * 自动评分
	 * @param paper
	 * @param model
	 * @param session
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping("/dealPaper.action")
	@ResponseBody
	public MsgItem dealPaper(Paper paper, Model model, HttpSession session) throws UnsupportedEncodingException{
		User user = (User) session.getAttribute("user");
		if(user==null) {
			return MsgItem.error("请先登录");
		}
		 int paperId = paper.getPaperId();
		//答案临时存放
		String ans = paper.getScore();
		ans = URLDecoder.decode(ans,"UTF-8");
		String [] answer = null;

     * @return
     */
    @ResponseBody
    @RequestMapping("/addUser.action")
    public MsgItem addUser(@Validated User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return MsgItem.error("请填写正确的数据");
        }
        User findByUserName = userService.findByUserName(user.getUserName());
        if (findByUserName != null) {
            return MsgItem.error("账户名称已存在");
        }
        userService.insert(user);
        return MsgItem.success("添加用户成功");
    }

    /**
     * 删除用户信息
     *
 Id 用户账号,删除多个是,id用逗号分隔开

     * @return
     */
    @RequestMapping("/deleteUser.action")
    public String deleteUser(String userId, Model model) {
        if (userId != null) {
            String ids[] = userId.split(",");
            for (int i = 0; i < ids.length; i++) {
                userService.delete(ids[i]);
            }
        }
        return "redirect:/admin/getAllUser.action";
    }

    /**
     * 用户身份信息审核(通过)
     *

     * @return
     */
    @RequestMapping("/passinfo.action")
    public String passUserInfo(@RequestParam("ids") String ids) {
        User us = new User();
        String currentIds[] = ids.split(",");
        for (int i = 0; i < currentIds.length; i++) {
            us.setUserId(Integer.parseInt(currentIds[i]));
            us.setUserState(1);
            userService.update(us);
	@RequestMapping("/toAddGrade.action")
	public String toAddGrade(Course course, Model model, HttpSession session){
		List<Course> dataList = courseService.find(course);
		model.addAttribute("courselList", dataList);
		return "/admin/grade/add";			
	}
	
	/**
	 * 添加年级信息
	 * @param user
	 * @param model
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/addGrade.action")
	public MsgItem addGrade(@Validated Grade grade,BindingResult bindingResult){
		if(bindingResult.hasErrors()) {
			return MsgItem.error("请填写正确的数据");
		}
		Grade findByName = gradeService.findByName(grade.getGradeName());
		if(findByName!=null) {
			return MsgItem.error("该年级名称已存在");
		}
		gradeService.insert(grade);
		return MsgItem.success("添加年级成功");			
	}
	
	
	
	/**
	 * 删除年级信息
	 * @param type
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/delGrade.action")
	public String delGrade(int gradeId, Model model, HttpSession session){
			gradeService.delete(gradeId);
		return "redirect:/admin/grade/toGradePage.action";			
	}
}

	 * @param model
	 * @param session
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/updateUserInfo.action")
	public MsgItem updateUserInfo(@Validated User user,BindingResult bindingResult,String newPwd, Model model, HttpSession session){
		if(bindingResult.hasErrors()) {
			return MsgItem.error("请填写正确的数据");
		}
		if(newPwd!= null && newPwd.trim().length()>0){
			String data = MD5Util.getData(newPwd);
			user.setUserPwd(data);
		}
		userService.update(user);
		user = userService.get(user.getUserId());
		session.setAttribute("user", user);
		return MsgItem.success("个人信息修改成功");			
	}

	//跳转到登录页面
	@RequestMapping("/user/exitSys.action")
	public String exitSystem(User user, Model model, HttpSession session){
		if(session.getAttribute("userName")!= null){
			session.removeAttribute("userName");
			session.removeAttribute("user");
			return "redirect:/index/toLogin.action";
		}
		return "redirect:/toLogin.action";	
	}

	//跳转到前台登录页面
	@RequestMapping("/toAbout.action")
	public String toAbout(User user, Model model, HttpSession session){
		User loginUser = (User) session.getAttribute("user");
		model.addAttribute("user", loginUser);
		return "/user/about";			
	}
}

		map.put("paperId", paperId);
		map.put("userId", loginUser.getUserId());
		Paper paper = paperService.getPaperDetail(map);
		Question question = null;
		String []ids = paper.getQuestionId().split(",");
		List<Question> selList = new ArrayList<Question>();
		List<Question> inpList = new ArrayList<Question>();
		List<Question> desList = new ArrayList<Question>();
		for(int i = 0;i<ids.length;i++){
			question = questionService.get(Integer.parseInt(ids[i]));
			if("7".equals(question.getTypeId())){//单选
				selList.add(question);
			}
			if("8".equals(question.getTypeId())){//填空
				inpList.add(question);
			}
			if("9".equals(question.getTypeId())){//简答题
				desList.add(question);
			}
		}
		
		if(selList.size()>0){
			Type type = typeService.get(7);
			model.addAttribute("selectQ", type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("selList", selList);
		}
		
		if(inpList.size()>0){
			Type type = typeService.get(8);
			model.addAttribute("inpQ", type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("inpList", inpList);
		}
		
		if(desList.size()>0){
			Type type = typeService.get(9);
			model.addAttribute("desQ",  type.getTypeName()+"("+type.getScore()+")");
			model.addAttribute("desList", desList);
		}
		model.addAttribute("paper", paper);
		return "/user/test_paper";			
	}
	
	/**
	 * 自动评分
	 * @param paper
	 * @param model

/**
 * 试卷管理Controller
 *
 */
@RequestMapping("/admin/paper")
@Controller
public class PaperController {

	@Autowired
	PaperService paperService;
	@Autowired
	CourseService courseService;
	@Autowired
	TypeService typeService;
	@Autowired
	GradeService gradeService;
	@Autowired
	QuestionService questionService;
	/**
	 * 跳转到试卷管理页面
	 * @param course
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/toPaperPage.action")
	public String toPaperPage(@RequestParam(value="page", defaultValue="1") int page,
	/**
	 * 添加课程信息
	 * @param user
	 * @param model
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/addCourse.action")
	public MsgItem addCourse(@Validated Course course, BindingResult result){
		if (result.hasErrors()) {
			return MsgItem.error("请填写正确的数据");
        }
		Course findByName = courseService.findByName(course.getCourseName());
		if(findByName!=null) {
			return MsgItem.error("该课程名已存在");
		}
		course.setCourseState("0");
		courseService.insert(course);
		return MsgItem.success("课程添加成功");			
	}
	
	/**
	 * 查看课程信息
	 * @param type
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/toQryCourse.action")
	public String toQryType(int courseId, Model model, HttpSession session){
		Course courseInfo = courseService.get(courseId);
		model.addAttribute("course", courseInfo);
		return "/admin/course-qry";			
	}
	
	/**
	 * 跳转到更新课程信息页面
	 * @param type
	 * @param model
	 * @param session
	 * @return
        if (userInfo != null) {
            model.addAttribute("message", "该账号已经存在");
        } else {
            model.addAttribute("message", "<font color='green'>验证通过</font>");
        }
        model.addAttribute("userId", userId);
        return "/admin/info-reg";
    }

    /**
     * ajax验证用户账号是否存在
     *
 Id

     * @return
     */
    @RequestMapping("/userRegist.action")
    @ResponseBody
    public MsgItem userRegist(String userId, Model model, HttpSession session) {
        MsgItem msgItem = new MsgItem();
        User user = userService.get(userId);
        if (user != null) {
            msgItem.setErrorNo("1");
            msgItem.setErrorInfo("账号已经存在");
        } else {
            msgItem.setErrorNo("0");
            msgItem.setErrorInfo("<font color='green'>验证通过</font>");
        }
        return msgItem;
    }

    /**
     * 注销登录
     *

     * @param session
     * @return
     */
    @RequestMapping("/exitSys.action")
    public String exitSys(User user, Model model, HttpSession session) {
        if (session.getAttribute("userName") != null) {
            session.removeAttribute("userName");
            session.removeAttribute("adminUser");
				if("9".equals(ques.getTypeId())){//为简答题的时候
					String strA = answer1;
					String strB = URLDecoder.decode(str2, "UTF-8");//转码
					//计算相似
					double d = Computeclass.SimilarDegree(strA, strB);
					BigDecimal bg = new BigDecimal(d*5).setScale(1, RoundingMode.DOWN);
			        d = bg.doubleValue();
			        endScore+=d;
			        if(d<=2){//如果小于2分,认定错误
			        	book.setQuestion(ques);
						book.setCourseId(ques.getCourseId());
						book.setGradeId(ques.getGradeId());
						book.setUserAnswer(str2);
						bookService.insert(book);
			        }
				}
			}
		}
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		Date currentTime = new Date();//得到当前系统时间  
		String endTime = formatter.format(currentTime); //将日期时间格式化  
		map.put("beginTime", paper.getBeginTime());
		map.put("endTime", endTime);
		map.put("score", endScore);
		//将考试的试卷状态改为2
		map.put("paperState", "2");
		paperService.updateUserPaper(map);
		return MsgItem.success("试卷提交成功,本次考试得分:"+endScore +"分");		
	}
	
	/**
	 * 考试页面
	 * @param paperId
	 * @param userId
	 * @param model
	 * @param session
	 * @return
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@RequestMapping("/paperDetail.action")
	public String qryPaperDetail(String paperId,String userId,Model model, HttpSession session){
		User user = (User) session.getAttribute("user");
		if(user==null) {
			return "redirect:../../index/toLogin.action";
		}
		Map map = new HashMap();
		map.put("paperId", paperId);
		map.put("userId", user.getUserId());
		Paper paper = paperService.getPaperDetail(map);
		Question question = null;
		String []ids = paper.getQuestionId().split(",");
		List<Question> selList = new ArrayList<Question>();
		List<Question> inpList = new ArrayList<Question>();
		List<Question> desList = new ArrayList<Question>();

@RequestMapping("/home/error")
@Controller
public class ErrorBookController {
	@Autowired
	ErrorBookService bookService;
	@Autowired
	GradeService gradeService;
	@Autowired
	CourseService courseService;
	@Autowired
	TypeService typeService;
	@Autowired
	UserService userService;
	//跳转到我的错题本页面
	@RequestMapping("/toMyBooksPage.action")
	public String toMyBooksPage(User user, Model model, HttpSession session){
		User loginUser = (User) session.getAttribute("user");
		if(loginUser==null) {
			return "redirect:../../index/toLogin.action";
		}
		List<Grade> gradeList = gradeService.find(new Grade());
		List<Course> courseList = courseService.find(new Course());
		List<Type> typeList = typeService.find(new Type());
		Map map = new HashMap();
		map.put("userId", loginUser.getUserId());
		List<ErrorBook> bookList = bookService.getBookInfo(map);
		model.addAttribute("grade", gradeList);
		model.addAttribute("course", courseList);
		model.addAttribute("type", typeList);
		int simple=0;
		int commonly=0;
		int difficultys=0;

/**
 * 年级Controller
 *
 */
@RequestMapping("/admin/grade")
@Controller
public class GradeController {

	@Autowired
	GradeService gradeService;
	@Autowired
	CourseService courseService;
	
	/**
	 * 跳转到年级页面
	 * @param course
	 * @param model
	 * @param session
	 * @return
	 */
	@RequestMapping("/toGradePage.action")
	public String toGradePage(@RequestParam(value="page", defaultValue="1") int page,
			Grade grade,Model model, HttpSession session){
		PageInfo<Grade> pageInfo = gradeService.findByPage(grade, page, 5);
		List<Grade> dataList = pageInfo.getList();
		Course course=null;
		for(Grade g : dataList){
			String courseName= "";
			String id = g.getCourseId();
			if(id != null){
				String ids[] = id.split(",");
				for(int i=0;i<ids.length;i++){
					course = courseService.get(Integer.parseInt(ids[i]));
					courseName+=course.getCourseName()+",";
				}
			}
			//判断最后一个字符是否为逗号,若是截取
			String str = courseName.substring(courseName.length() -1, courseName.length());
			if(",".equals(str)){
				str = courseName.substring(0, courseName.length()-1);

请添加图片描述

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

使用到的技术:redis、amcharts、maven、html5、ajax、js、jquery以及css,关系型数据库采用的是mysql。 文件夹中有可以直接导入使用的数据库,以及可以导入试卷的excel表格格式. 该项目分为学生模块,和教师模块。 教师模块:教师可以通过导入Excel表格的方式进行添加试卷,如果Excel表中有不合法的数据,会在前台提醒哪一行哪一列出了什么问题,添加试卷后,教师可以发布试卷,试卷发布后,学生就可以答题,每张试卷都有作答时长,作答时间结束,将会自动提交试卷。考试结束后,教师可以发布答案。对于修改试卷,教师可以先选择所要修改的试卷,对于试卷可以修改试卷的名称以及考试时长,要想修改试题可以点击编辑试题,进行批量修改。 学生模块:注册登录进入学生考试平台,选择考卷,进行作答,试卷分为单选题、多选题以及判断题,分值各不相同,对于多选题错答不得分,漏答得一半的分。在作答期间,学生可以先保存,保存的内容存储在Redis中。若点击提交,提交后直接显示成绩。提交后就不能再进入考试。要想看正确答案,得等到考试结束,教师发布成绩后,才可以看到。 学生可以看到自己的作答历史,每道题之前学生的答案以及该题正确的答案都很清晰的标注出来。为了方便学生统计自己的成绩,本系统采用了amcharts技术根据学生的历次成绩制作了柱状图和折线图结合的图表。学生可以很直观地看到自己成绩的波动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值