Java项目:高校图书馆座位预约系统(java+SpringBoot+Vue+ElementUI+mysql)

源码获取:俺的博客首页 "资源" 里下载!

项目介绍

基于SpringBoot Vue的高校图书馆座位预约系统

本项目设计了一个基于Springboot+vue的前后端分离的高校图书馆座位预约系统,采用M(model)V(view)C(controller)三层体系结构,
通过Spring + SpringBoot + Mybatis +Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单。

角色:管理员、学生、老师三种角色,分为前后台;

学生:用户系统,在系统首页可以查看首页,座位信息、交流论坛、公告信息、个人中心等内容

老师:老师登录系统后,可以对首页,个人中心,学生管理、座位信息管理、座位预约管理、签到信息管理、离开信息管理、座位暂离管理、举报信息管理、信用分管理、信用加分管理、信用减分管理等

管理员:管理员登录进入高校图书馆座位预约系统可以查看首页、个人中心、学生管理、教师管理、座位信息管理、座位预约管理、班级信息管理、签到信息管理、离开信息管理、座位暂离管理、举报信息管理、信用分管理、信用加分管理、信用减分管理、交流论坛、系统管理等内容


环境需要

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


技术栈

后端:SpringBoot+Mybaits

前端:Vue+ElementUI+Layui+HTML+CSS+JS


使用说明

项目运行:
1. 使用Navicat或者其它工具,在mysql中创建对应sql文件名称的数据库,并导入项目的sql文件;
2. 使用IDEA/Eclipse/MyEclipse导入项目,导入成功后请执行maven clean;maven install命令,然后运行;
3. 将项目中application.yml配置文件中的数据库配置改为自己的配置;
前台地址:http://localhost:8088/springboot7ss9a/front/index.html
学生:001  密码:001
后台地址:http://localhost:8088/springboot7ss9a/admin/dist/index.html#/login
管理员:abo 密码: abo
学生:001  密码:001
老师:001  密码:001

文档介绍:

首页展示:

座位信息展示:

公告信息展示:

学生管理展示:

 班级信息管理展示:

 教师信息展示:

学生信息展示:

交流论坛展示:

 用户管理控制层:

@Controller
public class UserController {

    @Autowired
    UserServiceImpl userService;

    /*
    * queryUserlike  通过用户姓名进行模糊查询
    * */
    @GetMapping("/queryUserlike/{username}")
    @ResponseBody
    public Msg queryUserlikeId(@RequestParam(value = "pn",defaultValue = "1") Integer pn,
                               @PathVariable("username") String username){
        PageHelper.startPage(pn,20);
        List<User> users = userService.queryByUserName(username);
        PageInfo<User> page=new PageInfo<User>(users,5);
        return Msg.success().add("pageInfo",page);
    }

    /*
    * 前端发送请求后端分页数据,
    * */
    @GetMapping("/userTables")
    @ResponseBody
    public Msg userTables(@RequestParam(value = "pn",defaultValue = "1") Integer pn){
        PageHelper.startPage(pn,7);
        List<User> users = userService.getAll();
        PageInfo<User> page=new PageInfo<User>(users,5);
        return Msg.success().add("pageInfo",page);
    }

    //到tables页面
    @RequestMapping("/usertables")
    public String toUserTables(Map<String,Object> map){
        List<User> users = userService.getAll();
        map.put("users",users);
        return "Tables";
    }

    //点击编辑按键传入userid查询用户,返回用户信息
    @GetMapping("/queryUserByID/{userid}")
    @ResponseBody
    public Msg queryUserID(@PathVariable("userid") Integer userid,Map<String,Object> map){
        User users = userService.getUserByID(userid);
        return Msg.success().add("users",users);
    }
    /*
    * 查询全部用户
    */
    /*@GetMapping("/user22")
    public String getAllUser(Map<String,Object> map){
        List<User> users = userService.getAll();
        map.put("users",users);
        return "Dashboard";
    }*/



    /*
     * 用户删除请求
     */
    @DeleteMapping(value = "/user/{ids}")
    @ResponseBody
    public Msg delEmp(@PathVariable("ids") String ids) {
        if(ids.contains("-")) {
            List<Integer> delids = new ArrayList<Integer>();
            String[] split = ids.split("-");
            for (String string : split) {
                delids.add(Integer.parseInt(string));
            }
            userService.batchUser(delids);
        }else {
            int id = Integer.parseInt(ids);
            userService.deleteUser(id);
        }
        return Msg.success();
    }

    /*
     * 用户更新
     */
    @PutMapping(value = "/user/{userID}")
    @ResponseBody
    public Msg saveEmp(User user) {
        System.out.println(user);
        userService.updateUser(user);
        return Msg.success();
    }

    /*
     * 根据用户ID查询结果
     */
    @GetMapping(value = "user/{id}")
    @ResponseBody
    public Msg getEmp(@PathVariable(value = "id")Integer userID) {
        User user = userService.getUserByID(userID);
        return Msg.success().add("user", user);
    }
    /*
     * 检查用户名是否可用
     */
    @RequestMapping(value = "/checkAddUser")
    @ResponseBody
    public Msg checkAddUser(@RequestParam("username")String userName) {
        //先判断用户名是否合法的表达式
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]+$)";
        boolean c = userName.matches(regex);
        if(!c) {
            return Msg.fail().add("va_msg", "用户名可以是2-5位中文,或者6-16位英文和数字的组合");
        }
        //数据库用户名重复校验
        boolean b = userService.checkUserName(userName);
        if(b) {
            return Msg.success().add("va_msg", "用户名可用");
        }else {
            return Msg.fail().add("va_msg",	"用户名已存在");
        }
    }
    /*校验手机号码格式*/
    @RequestMapping("/checkAddTel")
    @ResponseBody
    public Msg checkAddTel(@RequestParam(value = "usertel")String userTel1) {
        String userTel = userTel1.trim();
        String regex = "(^1\\d{10}$)";
        boolean matches = userTel.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg","");
        }else{
            return Msg.fail().add("va_msg","手机号必须以1开头,11位的数字!");
        }
    }
    /*校验年龄码格式*/
    @RequestMapping("/checkAddAge")
    @ResponseBody
    public Msg checkAddAge(@RequestParam(value = "userage")Integer userAge1) {
        String s = userAge1.toString();
        String userTel = s.trim();
        String regex = "(^\\d{1,3}$)";
        boolean matches = userTel.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg","");
        }else{
            return Msg.fail().add("va_msg","请输入数字");
        }
    }
    /*校验密码格式*/
    @RequestMapping("/checkAddPwd")
    @ResponseBody
    public Msg checkAddPwd(@RequestParam(value = "userpwd")String userPwd1) {
        String userPwd = userPwd1.trim();
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)";
        boolean matches = userPwd.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg","");
        }else{
            return Msg.fail().add("va_msg","密码格式不正确:必须超过6位,小于16位的英文和数字!");
        }
    }
    /****************************************************插入*********
     * 点击保存按钮,新增用户
     * */
    @PostMapping("/insertUser")
    @ResponseBody
    public Msg insertUser(User user){
        user.setUserid(null);
        userService.insertUser(user);
        return Msg.success().add("va_msg","插入成功!");
    }

    //点击更新按钮,更新修改的数据
    @PutMapping("/updateUser")
    @ResponseBody
    public Msg updateUser(User user){
        userService.updateUser(user);
        return Msg.success().add("va_msg","插入成功!");
    }

    //用户删除
    @DeleteMapping("/deleteUser/{userid}")
    @ResponseBody
    public Msg deleteEmployee(@PathVariable("userid") Integer userid){
        boolean b = userService.deleteUser(userid);
        if (b){
            return Msg.success().add("va_msg","用户删除成功!");
        }else {
            return Msg.fail().add("va_msg","用户删除失败!");
        }
    }

    /*
    * 前端ajax请求,查询userid是否在表中存在
    * */
    @GetMapping("/checkUserID")
    @ResponseBody
    public Msg checkUserID(@RequestParam("userid") Integer userid){
        boolean b = userService.checkUserID(userid);
        if(b){
            return Msg.success().add("va_msg","用户名存在!");
        }else {
            return Msg.fail().add("va_msg","用户名不存在,重新输入!");
        }
    }
}

座位信息详情控制层: 

@Controller
public class SeatController {
    @Autowired
    SeatServiceImpl seatService;
    /*
    * 获取数据库座位信息,返回map中
    * */
    @GetMapping("/seat")
    public String seat(Map<String,Object> map){
        List<Seat> seats = seatService.getAll();
        map.put("seats",seats);
        return "SeatResver";
    }

    //前端发起请求来修改座位状态,置为0
    @PutMapping("/updateSeatState/{seatid}")
    @ResponseBody
    public Msg updateState(@PathVariable("seatid") Integer seatid){
        boolean b = seatService.updateSeatState(seatid);
        if (b){
            return Msg.success().add("va_msg","状态位置0成功!");
        }else {
            return Msg.fail().add("va_msg","状态位置0失败!");
        }
    }
    //前端发起请求来修改座位状态,置为1
    @PutMapping("/updateSeatStateYY")
    @ResponseBody
    public Msg updateState1(@RequestParam("seatid") Integer seatid,
                            @RequestParam("status") String status){
        boolean b = seatService.updateSeatState1(seatid,status);
        if (b){
            return Msg.success().add("va_msg","预约成功!");
        }else {
            return Msg.fail().add("va_msg","预约失败!");
        }
    }
}

 作为预约信息详情:

@Controller
public class SeatResverController {

    @Autowired
    SeatResverServiceImpl seatResverService;

    /*
    * 点击预约信息的提交按钮,保存该预约信息
    * */
    @PostMapping("/insertSeatResver")
    @ResponseBody
    public Msg insertSeatResver(SeatResver seatResver,@RequestParam("status") String status){
        seatResver.setResverid(null);
        seatResverService.insertSeatResver(seatResver,status);
        return Msg.success().add("va_msg","预约座位信息插入成功!");
    }
    /*
    * 点击预约信息的提交按钮,校验该用户是否已经预约
    * */
    @GetMapping("/checkSeatResverUserID/{userid}")
    @ResponseBody
    public Msg checkSeatResverUserID(@PathVariable("userid") Integer userid){
        boolean b = seatResverService.checkUserID(userid);
        if (b){
            return Msg.fail().add("va_msg","该用户已预约或已上座,请重新输入!");
        }else {
            return Msg.success().add("va_msg","");
        }
    }
    /*
    * 点击取消按钮,删除预约信息(根据座位号)
    * */
    @DeleteMapping("/deleteSeatResver/{seatid}")
    @ResponseBody
    public Msg deleteSeatResver(@PathVariable("seatid") Integer seatid){
        boolean b = seatResverService.deleteSeatResver(seatid);
        if (b){
            return Msg.success().add("va_msg","删除预约信息成功!");
        }else {
            return Msg.fail().add("va_msg","删除预约信息失败!");
        }
    }

    /*
    * 获取全部预约信息,返回到前端展示再页面中
    * */
    @GetMapping("/getSeatResverInfo")
    @ResponseBody
    public Msg getSeatResverInfo(@RequestParam(value = "pn",defaultValue = "1")Integer pn){
        PageHelper.startPage(pn,6);
        List<SeatResver> all = seatResverService.getAll();
        PageInfo<SeatResver> page=new PageInfo<SeatResver>(all,5);
        return Msg.success().add("pageInfo",page);
    }

    /*
    * 模糊查询,seatid
    * */
    @GetMapping("/querySeatlike/{seatid}")
    @ResponseBody
    public Msg getSeatResver(@PathVariable("seatid") Integer seatid
            ,@RequestParam(value = "pn",defaultValue = "1")Integer pn){
        PageHelper.startPage(pn,20);
        List<SeatResver> all = seatResverService.getSeatAll(seatid);
        PageInfo<SeatResver> page=new PageInfo<SeatResver>(all,5);
        return Msg.success().add("pageInfo",page);
    }
}

用户信息管理控制层:

@Controller
public class ManagerController {

    @Autowired
    ManagerServiceImpl managerService;

    //进入忘记密码页面
    @RequestMapping("/forgotPwd")
    public String toForgotPage(){
        return "ForgotPassword";
    }
    @RequestMapping("/forgotPwd2")
    public String toForgotPage2(){
        return "ForgotPassword2";
    }

    @RequestMapping("/logout")
    public String toLoginPage(HttpSession session){
        Enumeration<String> attributeNames = session.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
            session.removeAttribute(attributeNames.nextElement());
        }
        return "Login";
    }

    //进入重置密码页面
    @RequestMapping("/register")
    public String toRegisterPage(){
        return "Register";
    }

    //登陆和忘记密码==》检查用户名是否存在
    @GetMapping("/checkLoginManagerName")
    @ResponseBody
    public Msg checkLoginManagerName(@RequestParam("managername") String managername1){
        String managername = managername1.trim();
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]+$)";

        boolean c = managername.matches(regex);
        if(!c) {
            return Msg.fail().add("va_msg", "用户名是2-5位中文,或者6-16位英文和数字的组合");
        }
        boolean b = managerService.checkManagerName(managername);
        if (b==true){
            return Msg.fail().add("va_msg","用户名不存在!");
        }else {
            return Msg.success().add("va_msg","");
        }
    }
    //注册检查用户名是否存在
    @GetMapping("/checkManagerName")
    @ResponseBody
    public Msg checkManagerName(@RequestParam("managername") String managername1){
        String managername = managername1.trim();
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)|(^[\\u2E80-\\u9FFF]+$)";
        boolean c = managername.matches(regex);
        if(!c) {
            return Msg.fail().add("va_msg", "用户名可以是2-5位中文,或者6-16位英文和数字的组合");
        }
        boolean b = managerService.checkManagerName(managername);
        if (b==true){
            return Msg.success().add("va_msg","用户名可用!");
        }else {
            return Msg.fail().add("va_msg","用户名已存在!");
        }
    }
    //检查手机号是否是十一位
    @GetMapping("/checkManagerTel")
    @ResponseBody
    public Msg checkManagerTel(@RequestParam("managertel") String managertel1){
        String managertel = managertel1.trim();
        String regex = "(^1\\d{10}$)";
        boolean matches = managertel.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg"," ");
        }else{
            return Msg.fail().add("va_msg","手机号必须以1开头,11位的数字!");
        }
    }
    //登陆检查密码
    @GetMapping("/checkLoginManagerPwd")
    @ResponseBody
    public Msg checkLoginManagerPwd(@RequestParam("managerpwd") String managerpwd1){
        String managerpwd = managerpwd1.trim();
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)";
        boolean matches = managerpwd.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg"," ");
        }else{
            return Msg.fail().add("va_msg","密码格式不正确:必须超过6位,小于16位!");
        }
    }
    //注册检查密码
    @GetMapping("/checkManagerPwd")
    @ResponseBody
    public Msg checkManagerPwd(@RequestParam("managerpwd") String managerpwd1){
        String managerpwd = managerpwd1.trim();
        String regex = "(^[a-zA-Z0-9_-]{6,16}$)";
        boolean matches = managerpwd.matches(regex);
        if(matches == true){
            return Msg.success().add("va_msg"," ");
        }else{
            return Msg.fail().add("va_msg","密码格式不正确:必须超过6位,小于16位!");
        }
    }

    /*新增管理员
    **/
    @PostMapping("/registerManager")
    public String registerManger(Manager manager,Map<String,Object> map){
        manager.setManagerid(null);
        boolean flag = managerService.createManager(manager);
        if(flag == true){
            map.put("msg","插入成功!");
            return "redirect:share.html";
        }else{
            map.put("msg","插入失败!");
            return "Register";
        }
    }

    //点击进入按钮校验用户名和密码是否正确
    @PostMapping("/loginD")
    public String loginDashboard(@RequestParam("managername") String managername1,
                                 @RequestParam("managerpwd") String managerpwd1,
                                 Map<String,Object> map, HttpSession session){
        /*
         * ==true没有该用户
         * ==false 用户存在
         * */
        String managername = managername1.trim();
        String managerpwd = managerpwd1.trim();
        if(managername != "" && managerpwd!=""){
            boolean name = managerService.checkManagerName(managername);
            boolean pwd = managerService.checkManagerPwd(managerpwd);
            if(name == false && pwd ==false ){
//                System.out.println("用户名或密码正确!");
                session.setAttribute("username",managername);
                return "redirect:/user22";
            }else{
//                System.out.println("密码错误!");
                map.put("msg","账号密码错误,请重新输入账号和密码!");
                return "Login";
            }
        }else {
            map.put("msg","请输入账号or密码!");
            return "Login";
        }
    }

    /*resetpwd
     * 点击确认修改密码并且返回登陆页面*/
    @PutMapping("/resetpwd")
    public String backLogin(@RequestParam("managername") String managername1,
                            @RequestParam("managerpwd") String managerpwd1,
                            Map<String,Object> map){
        String managername = managername1.trim();
        String managerpwd = managerpwd1.trim();
        if (managername != "" && managerpwd != ""){
            boolean tel = managerService.checkManagerName(managername);
            if(tel == true){
                map.put("msg","账号不存在,请重新输入!");
                return "ForgotPassword";
            }else {
                int i = managerService.updateUserPwd(managername,managerpwd);
                map.put("msg","reset success!");
                if(i>0){
                    return "redirect:/share.html";
                }else {
                    return "ForgotPassword";
                }
            }
        }else {
            map.put("msg","账号或新密码为空,请输入!");
            return "ForgotPassword";
        }
    }
    @PutMapping("/resetpwd2")
    public String backLogin2(@RequestParam("managername") String managername1,
                            @RequestParam("managerpwd") String managerpwd1,
                            Map<String,Object> map){
        String managername = managername1.trim();
        String managerpwd = managerpwd1.trim();
        if (managername != "" && managerpwd != ""){
            boolean tel = managerService.checkManagerName(managername);
            if(tel == true){
                map.put("msg","账号不存在,请重新输入!");
                return "ForgotPassword2";
            }else {
                int i = managerService.updateUserPwd(managername,managerpwd);
                map.put("msg","reset success!");
                if(i>0){
                    return "redirect:/forgotPwd2";
                }else {
                    return "ForgotPassword2";
                }
            }
        }else {
            map.put("msg","账号或新密码为空,请输入!");
            return "ForgotPassword2";
        }
    }

}

源码获取:俺的博客首页 "资源" 里下载!

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
图书馆座位预约系统 一、主要功能 学生用户: 座位状态(可预约/已预约;电影院选座模式:可选座位显示为绿色;不可选座位显示为红色) 座位类型:单人(1楼)、双人(2楼)、四人(3楼)(需填写至少三人信息方可申请四人座位)、隔间(需填写至少三人信息方可申请四人座位);每种类型的座位为6×6摆放; 预约功能:学生凭学号登录该系统进行座位预约;与图书馆刷卡系统配合使用(此处能够模拟实现即可) 预约规则: 1.预约时间需提前至少30min;可自由选择座位剩余座位以及时常; 2.预约成功后,在预约时间的前后30min内刷卡进入图书馆视为有效; 3.进入图书馆时间超过预约时间30min预约失效,该座位状态变为可预约,其他同学可进行预约(假如有人定了八点到的,如果她八点没到,座位可以帮她保留30分钟;如果她30分钟之内来了,正常使用;如果30分钟后没来就将座位开放,其他同学可预约); 4.距离最迟进入图书馆的合法时间还剩10min时弹出警告框: a)内容:“座位预约即将失效,请按时进入图书馆学习; b)功能键:【确认】退出警告框; c)功能键:【取消预约】转入取消预约座位界面; 5.若该生未在有效时间进入图书馆预约座位信誉分-1(总分3分),弹出警告框; a)内容:“由于您未能按时进入图书馆,本次信誉分-1” b)功能键:【详细信息】转入个人信息界面; 当信誉分减为0时,该生将被拉入信誉黑名单(此时不可申请座位),一周后恢复白名单;累计三次进入信誉黑名单需辅导员开证明再恢复白名单。 6.提前离开可使用结束使用功能;若未结束使用,刷卡离开2h后座位自动收回,座位状态变为可预约,可由其他同学预约使用同时该生信誉分-1(具体同5)。 (这个功能主要是防止有人申请了一天的座位大是刷个卡就走了,这样依然存在资源浪费现象;所以如果中途刷卡外出座位可以保留2h;2h之后座位收回,变为可预约状态供其他同学使用) 7.正常使用结束时提前10min弹出警告框 a)内容:剩余时间不足10min,如需继续使用请续时! b)功能键【不续时】:正常结束后该座位恢复“可预约”状态; c)功能键【续时】:进入续时界面 预约时常区间( 1h;上午(8:30-11:59);下午(12:00-17:59);晚上(18:00-21:40);全天 ) 续时功能​:(1)可选择继续使用当前座位;选择时常即可( 1h;上午(8:30-11:59);下 午(12:00-17:59);晚上(18:00-21:40);全天 ); (2)重新申请其他座位,即预约界面; 收藏心仪座位功能:学生可根据个人喜好添加心仪座位进入【我的收藏】,收藏夹的座位设置【一键预约】,若所收藏的座位为“可预约”状态则可通过点击【一键预约】进行预约,提示“预约成功,请在规定时间进入图书馆”;若为“已预约”状态,点击【一键预约】时提示“该座位已满!再看看其他座位吧!” 留言功能: (1)学生可在留言区给管理员(可查看留言者信息)留言进行:问题反馈、提问等;学生有权限查看其他留言但不可查看留言者信息;学生可对留言进行点赞;按点赞次数排序留言; (2)管理员可删除不良留言; 学生编辑、修改个人信息:学号、密码、联系电话、邮箱、当前信誉分。 统计当前在线总人数; 普通用户登录、管理员登录: (1)密码正确进入主页面,否则提示【密码错误,请重新输入】进入重新登录界面;管理员可以【修改管理员信息】; (2)若是系统管理员:2个功能块【账号信息】、【班级信息】; (3)若是座位管理员:进入座位表界面;可对座位表进行增删改查等操作; 管理员用户: (1)系统管理员 系统管理员可以登录管理员界面,进行班级信息管理,账号管理; 班级信息管理:可以添加、修改、删除、查看班级及班级信息; 可以修改存在班级的辅导员; 可以通过Excel文件的形式批量上传信息; 账号管理:可以添加,删除,修改账号;重置用户密码为初始值;将用户移出黑名单; (2)座位管理员 座位管理员可以添加,删除,修改座位信息,可以通过Excel文件的形式批量上传信息; (3)学生表信息:学号(主键)、账号密码、性别、班级、当前信誉分、邮箱、联系电话; (4)座位信息表:座位编号(主键)、座位当前状态、座位类型,备注; (5)预约表:座位编号、预约人学号、预约时段、剩余时间;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OldWinePot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值