三天上手后台管理系统(附源码)----第二天:侧边栏个人中心模块

  • 新建 /assets/css/user/user_info.css

html,

body {

margin: 0;

padding: 0;

}

body {

background-color: #f2f3f5;

padding: 15px;

}

2.2 绘制基本资料对应的表单


  • 利用 layui 中表单元素来搭建

  • 一共使用 三个 input 输入框的结构

  • 还需要一个 提交按钮 和 重置按钮

提交修改

重置

  • 在页面底部导入如下的脚本
  • user_info.js 中校验表单数据

$(function() {

var form = layui.form

form.verify({

nickname: function(value) {

if (value.length > 6) {

return ‘昵称长度必须在 1 ~ 6 个字符之间!’

}

}

})

})

2.3 获取用户的基本信息


  • 导入 baseAPI

  • user_info.js 中定义并调用 initUserInfo 函数

  • initUserInfo 函数中 调用 $.ajax() 获取用户基本信息

  • 如果返回的 status 为0,那么代表成功,如果不等于,代表失败,利用 layer进行提示

initUserInfo()

// 初始化用户的基本信息

function initUserInfo() {

$.ajax({

method: ‘GET’,

url: ‘/my/userinfo’,

success: function(res) {

if (res.status !== 0) {

return layer.msg(‘获取用户信息失败!’)

}

console.log(res)

}

})

}

2.4 为表单快速赋值


利用 form.val() 进行快速赋值,赋值之前我们需要给 form 表单添加 一个 lay-filter 的属性

  • 为表单指定 lay-filter 属性
  • 调用 form.val() 方法为表单赋值

form.val(‘formUserInfo’, res.data)

  • 使用隐藏域保存用户的 id

2.5 实现表单的重置效果


用户点击了重置按钮后,表单里面的内容应该被重置

  • 阻止表单的默认重置行为

  • 重新调用 initUserInfo() 函数,重新获取用户信息

// 重置表单的数据

$(‘#btnReset’).on(‘click’, function(e) {

// 阻止表单的默认重置行为

e.preventDefault()

initUserInfo()

})

2.6 发起请求更新用户的信息


  • 监听表单提交事件,在事件处理函数里面取消默认行为

  • 查阅接口文档,利用 $.ajax()发起 post 请求

  • 利用 $(this).serialize() 获取表单数据

  • 如果返回的 status 不为0,说明更新失败,及逆行提示

  • 更新成功之后,调用父页面中的方法,重新渲染用户的头像和用户信息

// 监听表单的提交事件

$(‘.layui-form’).on(‘submit’, function(e) {

// 阻止表单的默认提交行为

e.preventDefault()

// 发起 ajax 数据请求

$.ajax({

method: ‘POST’,

url: ‘/my/userinfo’,

data: $(this).serialize(),

success: function(res) {

if (res.status !== 0) {

return layer.msg(‘更新用户信息失败!’)

}

layer.msg(‘更新用户信息成功!’)

// 调用父页面中的方法,重新渲染用户的头像和用户的信息

window.parent.getUserInfo()

}

})

})

🥇三. 重置密码(⭐⭐⭐)

=============================================================================

在这里插入图片描述

3.1 渲染重置密码的页面结构


  • 新建重置密码的页面,user_pwd.html,给侧边栏对应a标签设置 href的路径,以及target属性

  • 利用 layui 的卡片(页面元素 > 面板 > 卡片布局) 搭建结构

  • 利用 layui 的表单元素(页面元素 > 表单)来搭建里面内容

  • 修改下里面的文字内容

Document
修改密码

修改密码

重置

  • /assets/css/user/user_pwd.css 中编写相关样式

html,

body {

margin: 0;

padding: 0;

}

body {

padding: 15px;

background-color: #f2f3f5;

}

.layui-form {

width: 500px;

}

3.2 为密码框定义校验规则


  • 导入相关js脚本 (layui的js > jQuery的js > baseAPI.js > 导入自己的js
  • 导入 form 模块

  • 利用 form.verify() 来定义规则

  • 长度必须是6到12位

  • 不能与旧密码一致

  • 两次密码是否相同

  • 在对应的表单元素中,利用 lay-verify 来设置自定义校验规则

$(function() {

var form = layui.form

form.verify({

pwd: [/1{6,12}$/, ‘密码必须6到12位,且不能出现空格’],

samePwd: function(value) {

if (value === $(‘[name=oldPwd]’).val()) {

return ‘新旧密码不能相同!’

}

},

rePwd: function(value) {

if (value !== $(‘[name=newPwd]’).val()) {

return ‘两次密码不一致!’

}

}

})

})

  • 为密码框分别添加对应的校验规则

修改密码

重置

3.3 发起请求实现重置密码的功能


  • 给form表单绑定 submit 事件,在事件处理函数里面取消默认行为

  • 查阅接口文档,利用 $.ajax() 来发送 post 请求

  • 利用 $(this).serialize() 来设置提交的数据

  • 如果 服务器返回的 status 不等于0,说明失败,利用 layui.layer.msg 来进行提示

  • 如果更新成功,重置一下表单内容

$(‘.layui-form’).on(‘submit’, function(e) {

e.preventDefault()

$.ajax({

method: ‘POST’,

url: ‘/my/updatepwd’,

data: $(this).serialize(),

success: function(res) {

if (res.status !== 0) {

return layui.layer.msg(‘更新密码失败!’)

}

layui.layer.msg(‘更新密码成功!’)

// 重置表单

$(‘.layui-form’)[0].reset()

}

})

})

🥇四. 更换头像

========================================================================

在这里插入图片描述

4.1 初步渲染更换头像页面的结构


  • 创建 /user/user_avatar.html 页面

  • 放入卡片区域 (页面元素 > 面板 > 卡片),修改对应文字信息

  • 在侧边栏对应的 a 标签设置 href 属性 和 target 属性

Document
更换头像

卡片式面板面板通常用于非白色背景色的主体内

从而映衬出边框投影

  • 修改一下对应样式

html,

body {

margin: 0;

padding: 0;

}

body {

padding: 15px;

background-color: #f2f3f5;

}

  • 修改 index.html 中对应链接的属性

更换头像

4.2 实现裁剪区域图片的替换(⭐⭐⭐)


4.2.1 cropper 图片裁剪

  • <head> 中导入 cropper.css 样式表:
  • <body>的结束标签之前,按顺序导入如下的 js 脚本
  • 在卡片的 layui-card-body 主体区域中,定义如下的 HTML 结构

100 x 100

50 x 50

上传

确定

  • 美化的样式

/* 设置卡片主体区域的宽度 */

.layui-card-body {

width: 500px;

}

/* 设置按钮行的样式 */

.row2 {

display: flex;

justify-content: flex-end;

margin-top: 20px;

}

/* 设置裁剪区域的样式 */

.cropper-box {

width: 350px;

height: 350px;

background-color: cyan;

overflow: hidden;

}

/* 设置第一个预览区域的样式 */

.w100 {

width: 100px;

height: 100px;

background-color: gray;

}

/* 设置第二个预览区域的样式 */

.w50 {

width: 50px;

height: 50px;

background-color: gray;

margin-top: 50px;

}

/* 设置预览区域下方文本的样式 */

.size {

font-size: 12px;

color: gray;

text-align: center;

}

/* 设置图片行的样式 */

.row1 {

display: flex;

}

/* 设置 preview-box 区域的的样式 */

.preview-box {

display: flex;

flex-direction: column;

flex: 1;

align-items: center;

}

/* 设置 img-preview 区域的样式 */

.img-preview {

overflow: hidden;

border-radius: 50%;

}

  • 实现基本裁剪效果

  • 获取裁剪区域的 DOM 元素

  • 配置选项: 纵横比、指定预览区域

  • 创建裁剪区域

// 1.1 获取裁剪区域的 DOM 元素

var $image = $(‘#image’)

// 1.2 配置选项

const options = {

// 纵横比

aspectRatio: 1,

// 指定预览区域

preview: ‘.img-preview’

}

// 1.3 创建裁剪区域

$image.cropper(options)

4.2.2 点击弹出文件选择框

  • 默认的文件选择框样式比较丑,所以我们定义这个结构,让其隐藏,给文件选择框指定可以上传的文件类型
  • 下面定义一个按钮,文本是 上传,一旦用户点击按钮,我们手动触发 文件选择框的点击事件

$(‘#btnChooseImage’).on(‘click’, function() {

$(‘#file’).click()

})

4.2.3 更换裁剪区域的图片

  • 给文件选择框绑定 change 事件

  • 用户选择了文件就会触发这个事件,通过 e.target.files 获取用户选择文件列表

  • 通过索引0拿到用户选择的文件

  • 将文件转化为路径

  • 利用 $image 重新初始化裁剪区域

// 为文件选择框绑定 change 事件

$(‘#file’).on(‘change’, function(e) {

// 获取用户选择的文件

var filelist = e.target.files

if (filelist.length === 0) {

return layer.msg(‘请选择照片!’)

}

// 1. 拿到用户选择的文件

var file = e.target.files[0]

// 2. 将文件,转化为路径

var imgURL = URL.createObjectURL(file)

// 3. 重新初始化裁剪区域

$image

.cropper(‘destroy’) // 销毁旧的裁剪区域

.attr(‘src’, imgURL) // 重新设置图片路径

.cropper(options) // 重新初始化裁剪区域

})

4.3 将裁剪后的头像上传到服务器


  • 为确定按钮,绑定点击事件

  • 要拿到用户裁剪之后的头像

  • 创建一个 Canvas 画布,将 Canvas 画布上的内容,转化为 base64 格式的字符串

var dataURL = $image

.cropper(‘getCroppedCanvas’, {

// 创建一个 Canvas 画布

width: 100,

height: 100

})

.toDataURL(‘image/png’)

  • 调用接口,把头像上传到服务器

$.ajax({

method: ‘POST’,

url: ‘/my/update/avatar’,

data: {

avatar: dataURL

},

success: function(res) {

if (res.status !== 0) {

return layer.msg(‘更换头像失败!’)

}

layer.msg(‘更换头像成功!’)

window.parent.getUserInfo()

}

})

4.3.1 了解base64格式的图片

base64格式你会发现是一段字符串,其实base64格式的图片,就是利用一段字符串来描述这张图片

**好处:**能够避免一些额外的图片请求

**缺点:**体积会比原来图片要大 30% 左右

**使用场景:**不适用大图片,一些小图片比较适合使用

4.4 设置头部区域的快捷方式


  • 打开 index.html,修改头部 个人中心 下的三个快捷方式如下
基本资料
更换头像
重置密码

4.5 本地代码推送到 github


  • git branch 查看一下分支

  • git add . 添加到暂存区

  • git commit -m 进行提交到本地仓库

  • git push -u origin user 推送到远程仓库的user分支

  • git checkout master 切换到主分支

  • git merge user 合并分支

  • git push 推送到远程仓库的主分支

🥇 五. 文章分类

=========================================================================

在这里插入图片描述

5.1 创建并显示文章分类页面


  • 创建 /article/art_cate.html 页面,并初始化如下的UI结构
Document

文章类别管理

添加类别

分类名称 分类别名 操作 贤心 2016-11-29 人生就像是一场修行 许闲心 2016-11-28 于千万人之中遇见你所遇见的人,于千万年之中,时间的无涯的荒野里…
  • 定义 /assets/css/article/art_cate.css 美化样式

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

学习笔记

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等

HTML/CSS

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

HTML5 /CSS3

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串

tml>

  • 定义 /assets/css/article/art_cate.css 美化样式

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-FvQRNKCa-1712050017323)]
[外链图片转存中…(img-JNbR9eoS-1712050017323)]
[外链图片转存中…(img-dl7kdjKg-1712050017323)]
[外链图片转存中…(img-dd6utRa3-1712050017324)]
[外链图片转存中…(img-VnDuV3jo-1712050017324)]
[外链图片转存中…(img-aPIMwQbp-1712050017324)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-nwObJCyY-1712050017325)]

学习笔记

主要内容包括html,css,html5,css3,JavaScript,正则表达式,函数,BOM,DOM,jQuery,AJAX,vue等等

HTML/CSS

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

**HTML:**HTML基本结构,标签属性,事件属性,文本标签,多媒体标签,列表 / 表格 / 表单标签,其他语义化标签,网页结构,模块划分

**CSS:**CSS代码语法,CSS 放置位置,CSS的继承,选择器的种类/优先级,背景样式,字体样式,文本属性,基本样式,样式重置,盒模型样式,浮动float,定位position,浏览器默认样式

[外链图片转存中…(img-MmnAvMIt-1712050017325)]

HTML5 /CSS3

**HTML5:**HTML5 的优势,HTML5 废弃元素,HTML5 新增元素,HTML5 表单相关元素和属性

**CSS3:**CSS3 新增选择器,CSS3 新增属性,新增变形动画属性,3D变形属性,CSS3 的过渡属性,CSS3 的动画属性,CSS3 新增多列属性,CSS3新增单位,弹性盒模型

[外链图片转存中…(img-NCPNtyME-1712050017325)]

JavaScript

**JavaScript:**JavaScript基础,JavaScript数据类型,算术运算,强制转换,赋值运算,关系运算,逻辑运算,三元运算,分支循环,switch,while,do-while,for,break,continue,数组,数组方法,二维数组,字符串


  1. \S ↩︎

CMS后台管理系统我讲课特色:方法论:授人以鱼不如授人以渔一、宏观思维:全局解剖(架构层面)二、微观思路:每一行代码解剖三、哲学思想:结合马克思哲学讲解代码,分析表象与本质基于SpringBoot、Shiro、Mybatis的权限后台管理系统。基于经典技术组合(Spring Boot、Apache Shiro、MyBatis、Thymeleaf)主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。系统需求· JDK >= 1.8· MySQL >= 5.5· Maven >= 3.0主要特性· 完全响应式布局(支持电脑、平板、手机等所有主流设备)· 强大的一键生成功能(包括控制器、模型、视图、菜单等)· 支持多数据源,简单配置即可实现切换。· 支持按钮及数据权限,可自定义部门数据权限。· 对常用js插件进行二次封装,使js代码变得简洁,更加易维护· 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击· Maven多项目依赖,模块及插件分项目,尽量松耦合,方便模块升级、增减模块。· 国际化支持,服务端及客户端支持· 完善的日志记录体系简单注解即可实现技术选型1、系统环境· Java EE 8· Servlet 3.0· Apache Maven 32、主框架· Spring Boot 2.0· Spring Framework 5.0· Apache Shiro 1.43、持久层· Apache MyBatis 3.4· Alibaba Druid 1.14、视图层· Bootstrap 3.3· Thymeleaf 3.0内置功能· 用户管理:用户是系统操作者,该功能主要完成系统用户配置。· 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。· 岗位管理:配置系统用户所属担任职务。· 菜单管理:配置系统菜单,操作权限,按钮权限标识等。· 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。· 字典管理:对系统中经常使用的一些较为固定的数据进行维护。· 参数管理:对系统动态配置常用参数。· 通知公告:系统通知公告信息发布维护。· 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。· 登录日志:系统登录日志记录查询包含登录异常。· 在线用户:当前系统中活跃用户状态监控。· 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。· 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。· 系统接口:根据业务代码自动生成相关的api接口文档。· 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。· 在线构建器:拖动表单元素生成相应的HTML代码。· 连接池监视:监视当期系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。项目介绍核心技术SpringBoot框架1、介绍Spring Boot是一款开箱即用框架,提供各种默认配置来简化项目配置。让我们的Spring应用变的更轻量化、更快的入门。 在主程序执行main函数就可以运行。你也可以打包你的应用为jar并通过使用java -jar来运行你的Web应用。它遵循约定优先于配置的原则, 使用SpringBoot只需很少的配置,大部分的时候直接使用默认的配置即可。可以与Spring Cloud的微服务无缝结合。Spring Boot2.0 环境要求必须是jdk8或以上版本,Tomcat8或以上版本2、优点· 使编码变得简单: 推荐使用注解。· 使配置变得简单: 自动配置、快速构建项目、快速集成新技术能力 没有冗余代码生成和XML配置的要求· 使部署变得简单: 内嵌Tomcat、Jetty、Undertow等web容器,无需以war包形式部署· 使监控变得简单: 自带项目监控Shiro安全控制1、介绍Apache Shiro是Java的一个安全框架。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。其不仅可以用在 JavaSE环境,也可以用在 JavaEE 环境。2、优点· 易于理解的 Java Security API· 简单的身份认证,支持多种数据源· 对角色的简单的授权,支持细粒度的授权· 不跟任何的框架或者容器捆绑,可以独立运行3、特性Authentication身份认证/登录,验证用户是不是拥有相应的身份Authorization授权,即验证权限,验证某个已认证的用户是否拥有某个权限,即判断用户是否能做事情 SessionManagement会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中Cryptography加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储Caching缓存,比如用户登录后,其用户信息,拥有的角色/权限不必每次去查,提高效率ConcurrencyShiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去Testing提供测试支持RunAs允许一个用户假装为另一个用户(如果他们允许)的身份进行访问RememberMe记住我,这是非常常见的功能,即一次登录后,下次再来的话不用登录了4、架构Subject主体,代表了当前的“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫, 机器人等;即一个抽象概念;所有Subject都绑定到SercurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者SecurityManage安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject; 可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互Realm域,Shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager要验证用户身份, 那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以有1个或多个Realm,我们一般在应用中都需要实现自己的RealmSessionManager如果写过Servlet就应该知道Session的概念,Session需要有人去管理它的生命周期,这个组件就是SessionManagerSessionDAODAO大家都用过,数据库访问对象,用于会话的CRUD,比如我们想把Session保存到数据库,那么可以实现自己的SessionDAO,也可以写入缓存,以提高性能CacheManager缓存控制器,来管理如用户,角色,权限等的缓存的;因为这些数据基本上很少去改变,放到缓存中后可以提高访问的性能应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager; 我们需要给Shrio的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断,Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。Shiro不会去维护用户,维护权限;这些需要自己去设计/提供;然后通过响应的接口注入给Shiro即可Thymeleaf模板1、介绍Thymeleaf是一个用于Web和独立Java环境的模板引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。能轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。 与其它模板引擎(比如FreeMaker)相比,Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用(更加方便前后端分离,比如方便类似VUE前端设计页面),抛弃JSP吧。 Thymeleaf 3.0是一个完全彻底重构的模板引擎,极大的减少内存占用和提升性能和并发性,避免v2.1版因大量的输出标记的集合产生的资源占用。 Thymeleaf 3.0放弃了大多数面向DOM的处理机制,变成了一个基于事件的模板处理器,它通过处理模板标记或文本并立即生成其输出,甚至在新事件之前响应模板解析器/缓存事件。Thymeleaf是Spring Boot官方的推荐使用模板。2、优点· 国际化支持非常简单· 语法简单,功能强大。内置大量常用功能,使用非常方便· 可以很好的和Spring集成· 静态html嵌入标签属性,浏览器可以直接打开模板文件,便于前后端联调· Spring Boot 官方推荐,用户群广
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值