spring boot+layui实现增删改查实战

说明:

    最近在做一个后台,希望用一个现成的前端模板,找了一圈发现Layui比较合适。我知道很多人都有这个需求,为了使大家快速上手,我把自己写的最实用的增删改查案例完整的展示出来。

 

源码地址:

https://gitee.com/indexman/boot-layui-curd

 

Layui官网:https://www.layui.com/doc/

 

后台:spring boot2.0,数据的话用的list没连接数据库。

前端:layui-v2.5.5

 

启动后访问: http://localhost:8080/admin.html

 

页面展示:

 

操作展示:

 

开发步骤:

 

1.搭建spring boot工程,引入layui资源

这一步很简单, 我就省了。

 

2.编写前端页面admin.html

这一步可以拿网上的直接改的。改过之后如下:

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <title>layout 后台大布局 - Layui</title>
    <link rel="stylesheet" href="js/layui/css/layui.css">
</head>

<body class="layui-layout-body">
<div class="layui-layout layui-layout-admin">
    <div class="layui-header">
        <div class="layui-logo">layui 后台布局</div>
        <!-- 头部区域(可配合layui已有的水平导航) -->
        <ul class="layui-nav layui-layout-left">
            <li class="layui-nav-item">
                <a href="">控制台</a>
            </li>
            <li class="layui-nav-item">
                <a href="">商品管理</a>
            </li>
            <li class="layui-nav-item">
                <a href="">用户</a>
            </li>
            <li class="layui-nav-item">
                <a href="javascript:;">其它系统</a>
                <dl class="layui-nav-child">
                    <dd>
                        <a href="">邮件管理</a>
                    </dd>
                    <dd>
                        <a href="">消息管理</a>
                    </dd>
                    <dd>
                        <a href="">授权管理</a>
                    </dd>
                </dl>
            </li>
        </ul>
        <ul class="layui-nav layui-layout-right">
            <li class="layui-nav-item">
                <a href="javascript:;">
                    <img src="http://t.cn/RCzsdCq" class="layui-nav-img"> 贤心
                </a>
                <dl class="layui-nav-child">
                    <dd>
                        <a href="">基本资料</a>
                    </dd>
                    <dd>
                        <a href="">安全设置</a>
                    </dd>
                </dl>
            </li>
            <li class="layui-nav-item">
                <a href="">退了</a>
            </li>
        </ul>
    </div>

    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">所有商品</a>
                    <dl class="layui-nav-child">
                        <dd>
                            <a href="javascript:;">列表一</a>
                        </dd>
                        <dd>
                            <a href="javascript:;">列表二</a>
                        </dd>
                        <dd>
                            <a href="javascript:;">列表三</a>
                        </dd>
                        <dd>
                            <a href="http://www.baidu.com">超链接</a>
                        </dd>
                    </dl>
                </li>
                <li class="layui-nav-item">
                    <a href="javascript:;">解决方案</a>
                    <dl class="layui-nav-child">
                        <dd>
                            <a href="javascript:;">列表一</a>
                        </dd>
                        <dd>
                            <a href="javascript:;">列表二</a>
                        </dd>
                        <dd>
                            <a href="">超链接</a>
                        </dd>
                    </dl>
                </li>
                <li class="layui-nav-item">
                    <a href="">云市场</a>
                </li>
                <li class="layui-nav-item">
                    <a href="">发布商品</a>
                </li>
            </ul>
        </div>
    </div>

    <div class="layui-body">
        <!-- 内容主体区域 -->
        <div style="padding: 15px;">
            <!--<div class="demoTable" style="padding: 15px">
                搜索:
                <div class="layui-inline">
                    <input class="layui-input" id="find" autocomplete="off">
                </div>
                <button class="layui-btn" data-type="reload" id="queryRole">搜索</button>
            </div>-->

            <table id="tb-user" lay-filter="tb-user"></table>

        </div>
    </div>

    <!--编辑表单-->
    <div class="layui-row" id="editUser" style="display:none;">
        <div class="layui-col-md10">
            <form class="layui-form layui-from-pane" id="saveUser" style="margin-top:20px">

                <div class="layui-form-item">
                    <label class="layui-form-label">用户名</label>
                    <div class="layui-input-block">
                        <input type="text" name="name" id="name" required lay-verify="required" autocomplete="off"
                               class="layui-input">
                    </div>
                </div>

                <input type="hidden" name="id" id="id">

                <div class="layui-form-item">
                        <label class="layui-form-label">城市</label>
                        <div class="layui-input-block">
                            <input type="text" name="city" id="city" required lay-verify="required" autocomplete="off"
                                   class="layui-input">
                        </div>
                </div>

                <div class="layui-form-item">
                        <label class="layui-form-label">出生日期</label>
                        <div class="layui-input-block">
                            <input type="text" name="birthday" id="birthday" required lay-verify="required" autocomplete="off"
                                   class="layui-input">
                        </div>
                </div>

                <div class="layui-form-item" style="margin-top:40px" id="check">
                    <div class="layui-input-block">
                        <button class="layui-btn  layui-btn-submit " lay-submit="" lay-filter="saveUser">保存</button>
                        <!--<button type="reset" class="layui-btn layui-btn-primary">重置</button>-->
                    </div>
                </div>
            </form>
        </div>
    </div>

    <script type="text/html" id="toolbarDemo">
        <div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="add"><i class="layui-icon">&#xe608;</i>新增</button>
            <button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="remove"><i class="layui-icon">&#xe640;</i>删除</button>
        </div>
        <!--<div class="layui-btn-container">
            <button class="layui-btn layui-btn-sm" lay-event="getCheckData">获取选中行数据</button>
            <button class="layui-btn layui-btn-sm" lay-event="getCheckLength">获取选中数目</button>
            <button class="layui-btn layui-btn-sm" lay-event="isAll">验证是否全选</button>
        </div>-->
    </script>

    <script type="text/html" id="barDemo">
        <a class="layui-btn layui-btn-sm" lay-event="edit"><i class="layui-icon">&#xe642;</i> </a>
    </script>

    <div class="layui-footer">
        <!-- 底部固定区域 -->
        © layui.com - 底部固定区域
    </div>
</div>
<script src="js/jquery-1.11.3.min.js"></script>
<script src="js/layui/layui.all.js"></script>
<script>
    var element, layer, laydate, table, form;

    $(function () {
        // 使用模块
        layui.use(['element', 'layer', 'laydate', 'table','form'], function () {
            element = layui.element;
            layer = layui.layer;
            laydate = layui.laydate;
            table = layui.table;
            form = layui.form;
        });

        laydate.render({
            elem:"#birthday",
            type: "date",
            format:"yyyy-MM-dd",
            value: ''
        });

        //第一个实例
        var userTable = table.render({
            elem: '#tb-user'
            , height: 515
            , url: '/api/layui/user/list' //数据接口
            , page: true //开启分页
            , toolbar: '#toolbarDemo'
            /*, response: {
                statusName: 'code', //规定返回的状态码字段为code
                statusCode: 200 //规定成功的状态码味200
            }*/
            /* , parseData: function (res) {
                 return {
                     "code": res.code, //解析接口状态
                     "msg": res.msg, //解析提示文本
                     "data": res.data //解析数据列表
                 }
             }*/
            , cols: [[ //表头
                {type: 'checkbox', fixed: 'left'}
                , {field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left'}
                , {field: 'name', title: '用户名'}
                , {field: 'city', title: '城市'}
                , {
                    field: 'birthday', title: '出生日期', templet: function (d) {
                        var date = new Date(d.birthday)
                        var year = date.getFullYear() + '年';
                        var month = date.getMonth() + 1 + '月';
                        var date = date.getDate() + '日';
                        var date1 = [year, month, date].join('')
                        return date1;
                    }
                }
                , {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 120}
            ]]
        });

        //监听表单提交
        // 修改
        form.on('submit(saveUser)', function(data){
            layer.alert(JSON.stringify(data.field));
            $.ajax({
                url: '/api/layui/user/save',
                type: 'POST',
                contentType: "application/json",
                dataType: "json",
                data: JSON.stringify(data.field),
                success: function (result) {
                    if (result.code == 200) {
                        // layer.msg("修改成功!", {icon: 6});
                        setTimeout(function () {
                            layer.closeAll();//关闭所有的弹出层
                            userTable.reload();
                        }, 300);
                    } else {
                        layer.msg("操作失败!", {icon: 5});
                    }
                }
            });

            return false;

        });

        //工具栏事件
        table.on('toolbar(tb-user)', function (obj) {
            var checkStatus = table.checkStatus(obj.config.id);
            var checkData = checkStatus.data;
            var ids=[];
            switch (obj.event) {
                // 新增
                case 'add':
                    $("#name").val('');
                    $("#city").val('');
                    $("#id").val('');
                    $("#birthday").val('');

                    layer.open({
                        type: 1,
                        offset: '10px',
                        title: "新增用户",
                        area: ['500px', '400px'],
                        content: $("#editUser")
                    });


                    break;
                // 删除
                case 'remove':
                    if(checkData.length==0){
                        layer.alert('请选择要操作的行');
                    }else{
                        layer.confirm('确定要删除吗?',function (index) {
                            for(var i=0; i<checkData.length;i++){
                                ids.push(checkData[i].id);
                            }
                            //layer.alert(JSON.stringify(ids));
                            $.ajax({
                                url: '/api/layui/user/remove',
                                type: 'POST',
                                contentType: "application/json",
                                dataType: "json",
                                data: JSON.stringify(ids),
                                success: function (result) {
                                    if (result.code == 200) {
                                        setTimeout(function () {
                                            layer.closeAll();//关闭所有的弹出层
                                            userTable.reload();
                                        }, 300);
                                    }
                                }
                            });
                        });
                    }
                    break;
                case 'getCheckData':

                    layer.alert(JSON.stringify(data));
                    break;
                case 'getCheckLength':
                    var data = checkStatus.data;
                    layer.msg('选中了:' + data.length + ' 个');
                    break;
                case 'isAll':
                    layer.msg(checkStatus.isAll ? '全选' : '未全选')
                    break;
            }
            ;
        });

        // 监听工具条
        table.on('tool(tb-user)', function (obj) {
            var data = obj.data;
            // 修改
            if (obj.event === 'edit') {
                $("#name").val(data.name);
                $("#city").val(data.city);
                $("#id").val(data.id);
                $("#birthday").val(data.birthday);

                layer.open({
                    type: 1,
                    offset: '10px',
                    title: "修改用户",
                    area: ['500px', '400px'],
                    content: $("#editUser")
                });
            }
        });
    });

</script>
</body>

</html>

 

3.编写后端代码

3.1 创建用户实体

package com.laoxu.test.helloweb.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

/**
 * @Description: 用户实体
 * @Author laoxu
 * @Date 2019/12/21 9:56
 **/
@Data
public class LayuiUser {
    private int id;
    private String name;
    private String city;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd")
    private Date birthday;

    public LayuiUser(){}

    public LayuiUser(int id, String name, String city, Date birthday) {
        this.id = id;
        this.name = name;
        this.city = city;
        this.birthday = birthday;
    }
}

3.2 创建用户DAO

package com.laoxu.test.helloweb.dao;

import com.laoxu.test.helloweb.entity.LayuiUser;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @Description: 操作用户数据
 * @Author laoxu
 * @Date 2019/12/21 10:07
 **/
@Repository
public class LayuiUserDao {
    private static List<LayuiUser> users = new ArrayList<>();

    static {

        for (int i = 1; i <= 100; i += 3) {
            users.add(new LayuiUser(i, "张三" + i, "上海", new Date()));
            users.add(new LayuiUser(i + 1, "李四" + i, "北京", new Date()));
            users.add(new LayuiUser(i + 2, "王二麻" + i, "广州", new Date()));
        }
    }

    //http://www.layui.com/demo/table/user/?page=1&limit=10

    /**
     * 获得所有用户
     */
    public List<LayuiUser> getPager(int page, int limit) {
        List<LayuiUser> list = new ArrayList<>();
        int start = (page - 1) * limit;
        for (int i = start; i < start + limit && i < users.size(); i++) {
            list.add(users.get(i));
        }
        return list;
    }

    /**
     * 获得所有用户
     */
    public List<LayuiUser> getAllUsers() {
        return users;
    }

    /**
     * 添加用户
     */
    public void addUser(LayuiUser user) {
        if (user.getId() <= 0) { // 未设置id
            int index = users.size() - 1; // 获得最后一个用户的索引号
            if (index < 0) { // 如没有一个用户
                user.setId(1); // 编号为1
            } else {
                user.setId(users.get(index).getId() + 1); // 获得最后一个用户的编号+1
            }
        }
        users.add(user);
    }

    /**
     * 删除用户
     */
    public void delUser(int id) {
        LayuiUser delUser = null;
        for (LayuiUser user : users) {
            if (user.getId() == id) {
                delUser = user;
                break;
            }
        }
        users.remove(delUser);
    }

    /**
     * 删除用户(多选)
     */
    public void delUsers(int[] ids) {
        LayuiUser delUser = null;
        for (int i = 0; i < ids.length; i++) {
            for (int j = 0; j < users.size(); j++) {
                if (users.get(j).getId() == ids[i]) {
                    users.remove(j);
                }
            }
        }
    }

    public void updateUser(LayuiUser obj) {
        LayuiUser editUser = null;
        for (LayuiUser user : users) {
            if (user.getId() == obj.getId()) {
                editUser = user;
                break;
            }
        }
        editUser.setName(obj.getName());
        editUser.setCity(obj.getCity());
        editUser.setBirthday(obj.getBirthday());
    }
}

3.3 创建用户Service

package com.laoxu.test.helloweb.service;

import com.laoxu.test.helloweb.dao.LayuiUserDao;
import com.laoxu.test.helloweb.entity.LayuiUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description: 用户service
 * @Author laoxu
 * @Date 2019/12/21 10:42
 **/
@Service
public class LayuiUserService {
    @Autowired
    LayuiUserDao userDao;

    public List<LayuiUser> getPager(int page, int limit){
        return userDao.getPager(page,limit);
    }

    public List<LayuiUser> getAllUsers() {
        return userDao.getAllUsers();
    }

    public void addUser(LayuiUser user) {
        userDao.addUser(user);
    }

    public void delUser(int id) {
        userDao.delUser(id);
    }

    public void delUsers(int[] ids) {
        userDao.delUsers(ids);
    }

    public void updateUser(LayuiUser user) {
        userDao.updateUser(user);
    }

}

3.4 创建用户Controller

 

package com.laoxu.test.helloweb.controller;

import com.laoxu.test.helloweb.dao.LayuiUserDao;
import com.laoxu.test.helloweb.entity.LayuiUser;
import com.laoxu.test.helloweb.entity.ResultBean;
import com.laoxu.test.helloweb.service.LayuiUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Description:  用户controller
 * @Author laoxu
 * @Date 2019/12/21 10:11
 **/
@RestController
@RequestMapping("/api/layui/user")
public class LayuiUserController {
    @Autowired
    LayuiUserService userService;

    @GetMapping("/list")
    public ResultBean list(@RequestParam(defaultValue = "1") Integer page,
                           @RequestParam(defaultValue = "10") Integer limit){
        List<LayuiUser> users = userService.getPager(page,limit);
        int count = userService.getAllUsers().size();

        ResultBean result = new ResultBean(0,"查询成功",count,users);

        return result;
    }

    @PostMapping("/save")
    public ResultBean save(@RequestBody LayuiUser user){
        // 判断是新增还是修改
        if(user.getId()==0){
            userService.addUser(user);
        }else{
            userService.updateUser(user);
        }

        return new ResultBean(200,"保存成功",0,"");
    }

    @PostMapping("/remove")
    public ResultBean modify(@RequestBody int[] ids){
        userService.delUsers(ids);
        return new ResultBean(200,"删除成功",0,"");
    }
}

 

 

 

源码地址:https://gitee.com/indexman/boot-layui-curd

 

 

  • 37
    点赞
  • 254
    收藏
    觉得还不错? 一键收藏
  • 368
    评论
以下是基于Spring Boot、FullCalendar和Layui增删改查完整案例。 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializr,也可以手动创建项目。 2. 添加依赖 在pom.xml文件中添加以下依赖: ``` <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>jquery</artifactId> <version>3.6.0</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>fullcalendar</artifactId> <version>3.10.2</version> </dependency> <dependency> <groupId>org.webjars</groupId> <artifactId>layui</artifactId> <version>2.5.7</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> ``` 3. 创建实体类 创建一个实体类Event,用于表示日历事件: ``` @Entity @Table(name = "event") public class Event { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private Date start; private Date end; private String color; private String description; // getter and setter } ``` 4. 创建Repository 创建一个Repository类EventRepository,用于与数据库进行交互: ``` @Repository public interface EventRepository extends JpaRepository<Event, Long> { } ``` 5. 创建Controller 创建一个Controller类EventController,用于处理HTTP请求: ``` @Controller public class EventController { @Autowired private EventRepository eventRepository; @GetMapping("/") public String index() { return "index"; } @GetMapping("/events") @ResponseBody public List<Event> getEvents() { return eventRepository.findAll(); } @PostMapping("/events") @ResponseBody public Event addEvent(@RequestBody Event event) { return eventRepository.save(event); } @PutMapping("/events/{id}") @ResponseBody public Event updateEvent(@PathVariable Long id, @RequestBody Event event) { event.setId(id); return eventRepository.save(event); } @DeleteMapping("/events/{id}") @ResponseBody public void deleteEvent(@PathVariable Long id) { eventRepository.deleteById(id); } } ``` 6. 创建Thymeleaf模板 创建一个Thymeleaf模板index.html,用于显示日历和表单: ``` <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>FullCalendar + Layui Demo</title> <link href="/webjars/fullcalendar/3.10.2/fullcalendar.min.css" rel="stylesheet"/> <link href="/webjars/layui/2.5.7/css/layui.css" rel="stylesheet"/> <script src="/webjars/jquery/3.6.0/jquery.min.js"></script> <script src="/webjars/fullcalendar/3.10.2/fullcalendar.min.js"></script> <script src="/webjars/layui/2.5.7/layui.all.js"></script> <script th:inline="javascript"> $(document).ready(function () { var calendar = $('#calendar').fullCalendar({ height: 600, editable: true, eventLimit: true, events: { url: '/events', error: function () { alert('there was an error while fetching events!'); } }, eventDrop: function (event, delta, revertFunc) { updateEvent(event); }, eventResize: function (event, delta, revertFunc) { updateEvent(event); }, eventClick: function (event, jsEvent, view) { layer.open({ type: 1, area: ['500px', '400px'], title: '编辑事件', content: $('#eventForm'), btn: ['保存', '取消'], yes: function (index, layero) { var title = $('#title').val(); var start = $('#start').val(); var end = $('#end').val(); var color = $('#color').val(); var description = $('#description').val(); var eventData; if (title) { eventData = { title: title, start: start, end: end, color: color, description: description }; updateEvent(eventData, event.id); calendar.fullCalendar('renderEvent', eventData, true); } else { alert('请填写标题'); return false; } layer.close(index); } }); $('#title').val(event.title); $('#start').val(moment(event.start).format('YYYY-MM-DD HH:mm:ss')); $('#end').val(moment(event.end).format('YYYY-MM-DD HH:mm:ss')); $('#color').val(event.color); $('#description').val(event.description); } }); $('#addEvent').on('click', function () { layer.open({ type: 1, area: ['500px', '400px'], title: '添加事件', content: $('#eventForm'), btn: ['保存', '取消'], yes: function (index, layero) { var title = $('#title').val(); var start = $('#start').val(); var end = $('#end').val(); var color = $('#color').val(); var description = $('#description').val(); var eventData; if (title) { eventData = { title: title, start: start, end: end, color: color, description: description }; $.ajax({ url: '/events', type: 'POST', contentType: 'application/json', data: JSON.stringify(eventData), success: function (event) { eventData.id = event.id; calendar.fullCalendar('renderEvent', eventData, true); } }); } else { alert('请填写标题'); return false; } layer.close(index); } }); }); function updateEvent(eventData, eventId) { if (eventId) { $.ajax({ url: '/events/' + eventId, type: 'PUT', contentType: 'application/json', data: JSON.stringify(eventData), success: function () { calendar.fullCalendar('refetchEvents'); } }); } else { $.ajax({ url: '/events', type: 'POST', contentType: 'application/json', data: JSON.stringify(eventData), success: function (event) { eventData.id = event.id; calendar.fullCalendar('renderEvent', eventData, true); } }); } } }); </script> </head> <body> <div id="calendar"></div> <div id="eventForm" style="display: none;"> <div class="layui-form-item"> <label class="layui-form-label">标题</label> <div class="layui-input-inline"> <input type="text" id="title" name="title" lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">开始时间</label> <div class="layui-input-inline"> <input type="text" id="start" name="start" lay-verify="required" placeholder="请选择开始时间" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">结束时间</label> <div class="layui-input-inline"> <input type="text" id="end" name="end" lay-verify="required" placeholder="请选择结束时间" autocomplete="off" class="layui-input"/> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">颜色</label> <div class="layui-input-inline"> <input type="color" id="color" name="color" value="#3788d8" class="layui-input"/> </div> </div> <div class="layui-form-item layui-form-text"> <label class="layui-form-label">备注</label> <div class="layui-input-block"> <textarea id="description" name="description" placeholder="请输入备注" class="layui-textarea"></textarea> </div> </div> </div> <div class="layui-btn-group"> <button class="layui-btn" id="addEvent">添加事件</button> </div> </body> </html> ``` 7. 运行项目 运行项目,访问http://localhost:8080,即可看到一个包含日历和表单的页面。 现在,你可以添加、编辑和删除日历事件了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值