1、说说 application/json 和 application/x-www-form-urlencoded 二者之间的区别。
Content-Type字段
关于字符的编码,HTTP/1.0规定,头信息必须是ASCII码,后面的数据可以是任何格式。因此,服务器回应的时候,必须告诉客户端,数据是什么格式,这就是
Content-Type
字段的作用
application/json
和application/x-www-form-urlencoded
都是比较常见的post
提交数据的方式
现在越来越多的人把application/json
作为请求头,用来告诉服务端消息主题是序列化后的JSON字符串。由于JSON规范的流行,除了低版本IE之外的各大浏览器都原生支持JSON.stringify
,服务端语言也都有处理JSON的函数,使用JSON不会遇上什么麻烦
浏览器的原生form
表单,如果不设置enctype
属性(规定在发送表单数据之前如何对其进行编码),那么最终就会以application/x-www-form-urlencoded
方式提交数据
除此之外还有multipart/form-data
,我们在表单上传文件时,必须让form
的enctype
等于这个值
Content-Type:application/json
:请求体中的数据会以JSON字符串的形式发送到后端- 优势:前端不需要关系数据结构的复杂度,后端解析方便
- 问题:少数的浏览器不兼容
Content-Type:application/x-www-form-urlencoded
:请求体中的数据会以普通表单形式(键值对?key1=value1&key2=value2)发送到后端- 优势:所有浏览器都兼容
- 问题:在数据结构极其复杂的时候,服务端数据解析会变得很难
Content-Type:multipart/form-data
:它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。上传文件时将文件转换成二进制数据进行传输,不涉及转码二者之间的转换
axios使用post
发送数据时,默认是直接把json
放到请求体中提交到后端的。也就是说,我们的Content-Type
变成了application/json
,这是axios默认的请求头content-type类型。但是实际我们后端要求的'Content-Type': 'application/x-www-form-urlencoded'
为多见,这就与我们不符合。所以很多人会在这里犯错误,导致请求数据获取不到。
我们可以使用qs
库对数据进行编码来转换:
import qs from 'qs'
const data = { 'bar': 123 }
const options = {
method: 'POST',
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: qs.stringify(data),
url,
}
axios(options)
由于我们通过qs.stringify()
转换之后的data
,axios会自动把ContentType设置为application/x-www-form-urlencoded
,我们不再需要手动添加
- 如果data是普通对象,则ContentType是
application/json
- 如果data是
qs.stringify()
转换之后的数据,则ContentType会被设置为application/x-www-form-urlencoded
如果data是formData对象,则contentType是
mulitpart/form-data
2、说一说在前端这块,角色管理你是如何设计的。
封装成列表资源组件,外层使用一个card
卡片,头部是一个form
表单写的搜索框来搜索列表数据,主体是一个table
表格来渲染拿到的数据。主体上方有添加角色的按钮,列表中每条数据除了信息的渲染都拥有 菜单/资源的分配以及编辑和删除四种操作。
角色的添加和编辑可以共享一个组件,利用父子组件通信来处理对话框的关闭和数据刷新以及编辑角色的id传递
角色的分配菜单/分配资源功能,通过分别封装tree
树形控件来实现,需要注意的是通过开启props
将路由路径参数映射到组件的props
数据中来实现解耦3、@vue/cli 跟 vue-cli 相比,@vue/cli 的优势在哪?
@vue/cli和vue-cli的区别
@vue/cli
是指新版本的Vue CLI 3.x 或 4.x,包的名称做了修改vue-cli
则是指老版本的Vue CLI 1.x 或 2.x
由于Vue CLI 3和Vue CLI 4的区别不大,为了方便阅读,后边统一规范为Vue CLI2与Vue CLI4的区别
1、安装、卸载命令
#Vue CLI2:
安装:npm install -g vue-cli 或 cnpm install -g vue-cli
卸载:npm uninstall -g vue-cli 或 cnpm uninstall -g vue-cli
#Vue CLI4:
安装:npm install -g @vue/cli 或 cnpm install -g @vue/cli
卸载:npm uninstall -g @vue/cli 或 cnpm uninstall -g @vue/cli
2、项目创建命令
# Vue CLI2:
vue init webpack vue-cli2 # vue-cli2 为项目名称,项目名称不能出现大写字母
# Vue CLI4:
vue create vue-cli4 # vue-cli4 为项目名称,项目名称也不能出现大写字母
3、项目目录结构
# Vue CLI2 新建项目,目录结构:
.
├── build # webpack 相关配置文件(都已配置好,一般不需要进行配置)
├── config # vue 基本配置文件(我们可以配置监听端口、打包输出等)
├── node_modules # 第三⽅包存储⽬录
├── src
│ ├── assets # 公共资源⽬录,放图⽚等资源
│ ├── components # 公共组件⽬录
│ ├── router # 路由相关模块
│ ├── App.vue # 根组件,最终被替换渲染到 index.html ⻚⾯中 #app ⼊⼝节点
│ └── main.js # 整个项⽬的启动⼊⼝模块
├── static # vue 基本配置文件(我们可以配置监听端口、打包输出等)
├── .bablerc # babel 编译参数
├── .editorconfig # EditorConfig 帮助开发⼈员定义和维护跨编辑器(或IDE)的统⼀的代码⻛格
├── .gitignore # Git 的忽略配置⽂件,告诉Git项⽬中要忽略的⽂件或⽂件夹
├── .postcssrc.js # 转换 CSS 的工具
├── index.html # 主页
├── package-lock.json # 记录安装时的包的版本号,以保证⾃⼰或其他⼈在 npm i nstall 时⼤家的依赖能保证⼀致
├── package.json # 包说明⽂件,记录了项⽬中使⽤到的第三⽅包依赖信息等内容
└── README.md # 说明⽂档
# Vue CLI4 新建项目,目录结构:
.
├── node_modules # 第三⽅包存储⽬录
├── public # 静态资源⽬录,任何放置在 public ⽂件夹的静态资源都会被简单的复制,⽽不经过 webpack
│ ├── favicon.ico
│ └── index.html
├── src
│ ├── assets # 公共资源⽬录,放图⽚等资源
│ ├── components # 公共组件⽬录
│ ├── router # 路由相关模块
│ ├── store # 容器相关模块
│ ├── views # 路由⻚⾯组件存储⽬录
│ ├── App.vue # 根组件,最终被替换渲染到 index.html ⻚⾯中 #app ⼊⼝节点
│ └── main.js # 整个项⽬的启动⼊⼝模块
├── .gitignore # Git 的忽略配置⽂件,告诉Git项⽬中要忽略的⽂件或⽂件夹
├── babel.config.js # Babel 配置⽂件
├── package-lock.json # 记录安装时的包的版本号,以保证⾃⼰或其他⼈在 npm i nstall 时⼤家的依赖能保证⼀致
├── package.json # 包说明⽂件,记录了项⽬中使⽤到的第三⽅包依赖信息等内容
└── README.md # 说明⽂档
从两个新建的项目目录结构来看,差别很大:Vue CLI4新建的项目,根目录结构内少了之前的build
、config
、static
文件,配置文件也少了几个,连index.html
都没有了,但多了一个public
文件夹
3、项目启动命令
# Vue CLI2:
npm run dev
"scripts": {
"dev": "webpack-dev-server --inline ==progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js"
}
# Vue CLI4:
npm run serve
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build"
}
@vue/cli的优势
1、Vuecli的初衷