前端009-vue框架
vue-admin-element https://panjiachen.github.io/vue-element-admin-site/zh/
基于vue的生态做的很好,提供的很多的文档,中文。并且有视频。
vue
element == element ui
vue-cli实现(脚手架)
内置了 i18 国际化解决方案 提供了中文
1、安装:
# 克隆项目
git clone https://github.com/PanJiaChen/vue-element-admin.git # 进入项目目录
cd vue-element-admin # 安装依赖
npm install # FQ安装 npm == linux 中 yum 包管理工具 npm时候node的包管理工具
# node_modules # 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org # 需要启动mock服务
# 运行 mock
# python mock.py # 本地开发 启动项目
npm run dev # 项目的根目录
2、框架中重点关注:
├── src # 源代码
│ ├── api # 所有请求 *
│ ├── assets # 主题 字体等静态资源
│ ├── components # 全局公用组件 *
│ ├── directive # 全局指令
│ ├── filters # 全局 filter
│ ├── icons # 项目所有 svg icons
│ ├── lang # 国际化 language
│ ├── layout # 全局 layout
│ ├── router # 路由 *
│ ├── store # 全局 store管理
│ ├── styles # 全局样式
│ ├── utils # 全局公用方法
│ ├── vendor # 公用vendor
│ ├── views # views 所有页面 *
│ ├── App.vue # 入口页面
│ ├── main.js # 入口文件 加载组件 初始化等
│ └── permission.js # 权限管理
3、目标:
parameter.html 迁移到 vue-admin框架
parameter.html 就是基于elementui实现的 vue-element-admin 框架也是基于 vue和element-ui实现的
前端 3 大块
js、css、html
导入模块,导出模块:
第一种
export { parameterRouter } // 导出模块
import { parameterRouter } from './modules/parameter' 第二种
export default { // 只能导出一个
name: 'parameter'
}
import chartsRouter from './modules/charts' // 不带大括号的都是 和 export default结合使用的
代码爆红:
代码爆红是由于框架增加了代码格式验证
需要修改根目录下 .eslintrc.js 中rules改为 rules:{}
4、新建页面:
4.1 配置路由
例:src/router/parameter.js
import Layout from '@/layout' //导入一个模块,菜单模块
const parameterRouter = { //定义一个常量
path: '/main', //路径
component: Layout,
redirect: 'noRedirect', //重定向
meta: {
icon: 'lock',
roles: ['qa'] // 权限
},
children: [
{
path: 'parameter',
component: () => import('@/views/parameter/index'),
name: '参数管理',
meta: { title: '参数管理', icon: 'table' }
}
]
} export { parameterRouter } //导出模块,当你想要外部应用你的模块,要用export,多个变量用,隔开 export{a,b}
4.2 在src/router/index.js中导入模块
/* Router Modules */
import componentsRouter from './modules/components'
import chartsRouter from './modules/charts'
import tableRouter from './modules/table'
import nestedRouter from './modules/nested'
import { parameterRouter } from './modules/parameter'
export const asyncRoutes = [
parameterRouter,
{
path: '/permission',
component: Layout,
redirect: '/permission/page',
alwaysShow: true, // will always show the root menu
name: 'Permission',
meta: {
title: 'permission',
icon: 'lock',
roles: ['qa', 'editor'] // you can set roles in root nav
}
]
asyncRoutes:受权限控制的模块
constantRoutes:全部模块,不受权限控制
导入成功后,在左侧菜单栏处,能看到新增页面
4.3 在Views目录创建 对应业务的文件夹,文件夹下有默认的一个index.vue parameter.html
例:src/views/parameter目下有个index.vue
<template>
<div class="app-container">
<div id="bar">
<!--搜索、筛选-->
<el-form :inline="true" class="demo-form-inline">
<el-form-item>
<el-input placeholder="搜索" v-model="filter_query.search"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="add_collection">添加</el-button>
</el-form-item>
</el-form>
</div>
<div id="table">
<el-table
ref="multipleTable"
:data="tableData"
tooltip-effect="dark"
style="width: 100%"
v-loading="loading" element-loading-text="玩命加载中...">
<el-table-column
prop="id"
label="ID">
</el-table-column>
<el-table-column
prop="name"
label="参数名称">
</el-table-column>
<el-table-column
prop="desc"
label="描述"
show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="value"
label="参数值"
show-overflow-tooltip>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handle_edit(scope.row)">编辑
</el-button>
<el-button
size="mini"
type="danger"
@click="handle_delete(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table> </div>
<div id="edit">
<el-dialog :title="dialog_title" :visible.sync="dialogFormVisible" v-loading="loading"
element-loading-text="玩命加载中..."> <el-form :model="form"> <el-form-item label="参数名称" :label-width="formLabelWidth">
<el-input v-model="form.name" style="width: 50%" placeholder="请输入参数名称"></el-input>
</el-form-item>
<el-form-item label="描述" :label-width="formLabelWidth">
<el-input type="textarea" v-model="form.desc" style="width: 50%" placeholder="请输入参数描述"></el-input> </el-form-item>
<el-form-item label="参数值" :label-width="formLabelWidth">
<el-input v-model="form.value" style="width: 50%" placeholder="请输入参数值"></el-input>
</el-form-item> </el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="operate" :loading="button_loading">确 定</el-button>
</div>
</el-dialog>
</div>
<div id="pagination">
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="filter_query.limit"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</div>
</div>
</template> <script>
import { getParameter, deleteParameter, putParameter, postParameter } from '@/api/parameter' export default {
name: 'parameter',
mounted() {
this.get_page_data()
},
data: function() {
return {
currentPage: 1,
total: 0,
filter_query: {
search: undefined,
limit: 10,
page: 1
},
tableData: [],
dialogFormVisible: false,
dialog_title: '添加',
form: {
name: '',
value: '',
desc: ''
},
formLabelWidth: '120px',
value: [],
loading: false,
button_loading: false,
id: undefined
}
},
methods: {
handleSizeChange(val) {
this.filter_query.limit = val
this.filter_query.page = 1
this.get_page_data()
},
handleCurrentChange(val) {
this.filter_query.page = val
this.get_page_data()
},
data_to_string(data) {
let tmp = new FormData()
for (var key in data) {
tmp.append(key, data[key])
}
return tmp
},
get_page_data: function() {
this.loading = true //
getParameter(this.filter_query).then((response) => {
this.tableData = response.data.data
this.total = response.data.count
this.loading = false //
})
},
search: function() {
this.filter_query.page = 1
this.get_page_data()
},
handle_edit(row) {
// this.form = Object.assign({}, {name: row.name, value: row.value, desc: row.desc}); //深拷贝
this.form = { name: row.name, value: row.value, desc: row.desc } //深拷贝
this.form.id = row.id
this.dialog_title = '编辑'
this.dialogFormVisible = true //打开模态框
},
handle_delete(row) {
this.$confirm('确认删除当前参数吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
deleteParameter({ id: row.id }).then((response) => {
if (response.data.code == 0) {
this.$message({
type: 'success',
message: '删除成功'
})
this.get_page_data()
} else {
this.$message({
type: 'error',
message: response.data.msg
})
}
}).catch((error) => {
this.$message({
type: 'error',
message: error
})
}) }).catch(() => {
this.$message({
type: 'info',
message: '取消删除'
})
}) },
add_collection() {
this.reset_form()
this.dialog_title = '添加'
this.dialogFormVisible = true
},
reset_form() {
//form数据置为空
this.form = {
name: '',
desc: '',
value: ''
}
},
operate() {
this.button_loading = true
if (this.dialog_title == '添加') {
postParameter(this.data_to_string(this.form)).then((response) => {
this.button_loading = false
if (response.data.code == 0) {
this.dialogFormVisible = false //关闭模态框
this.get_page_data()
} else {
this.$message({
type: 'error',
message: response.data.msg
})
}
}).catch((error) => {
this.button_loading = false
this.$message({
type: 'error',
message: error
})
})
} else if (this.dialog_title == '编辑') {
putParameter(this.data_to_string(this.form)).then((response) => {
this.button_loading = false
if (response.data.code == 0) {
this.dialogFormVisible = false //关闭模态框
this.get_page_data()
} else {
this.$message({
type: 'error',
message: response.data.msg
})
}
}).catch((error) => {
this.button_loading = false
this.$message({
type: 'error',
message: error
})
})
} }
}
}
</script> <style scoped> </style>
4.4 创建API,和后台请求的接口,每开发一个模块,需要在src/api目录下创建一个针对这个模块的API接口
例:src/api/parameter.js
import request from '@/utils/request' //@代表src目录 //获取参数信息
export function getParameter(params) {
return request({
url: 'http://127.0.0.1:8000/api/parameter',
method: 'get',
params:params
})
} //删除参数信息
export function deleteParameter(params) {
return request({
url: 'http://127.0.0.1:8000/api/parameter',
method: 'delete',
params:params
})
} export function putParameter(data) {
return request({
url: 'http://127.0.0.1:8000/api/parameter',
method: 'put',
data:data
})
} export function postParameter(data) {
return request({
url: 'http://127.0.0.1:8000/api/parameter',
method: 'post',
data:data
})
}
4.5 src/utils/requests.js 实际是对axios进行封装,最后暴露一个模块
import request from '@/utils/request' //@代表src目录
export function getParameter(params) {
return request({
url: 'http://127.0.0.1:8000/api/parameter',
method: 'get',
params:params
})
}
//引用
//getParameter(this.filter_query)相当于axios()
get_page_data: function() {
this.loading = true //
getParameter(this.filter_query).then((response) => {
this.tableData = response.data.data
this.total = response.data.count
this.loading = false //
})
},
4、pycharm安装vue插件
File--Settings--Plugins
搜索vue,选择第一个vue.js,Install
安装成功后,重启pycharm
前端009-vue框架的更多相关文章
- 与前端(使用vue框架)对接的问题
1.跨域问题 跨域问题是: 浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain ...
- 前端三大主流框架的对比React、Vue、Angular
前端三大主流框架的对比React.Vue.Angular React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站, 并于 2013年 5 月开源.React 拥有较高的 ...
- 在基于ABP框架的前端项目Vue&Element项目中采用电子签名的处理
在前面随笔介绍了<在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理>的处理,有的时候,我们在流程中或者一些文件签署的时候,需要签上自己的大名,一 ...
- 前端vue框架 脚手架
1.安装node.js最新版本2.cmd下输入 1.node -v得到版本号检测是否安装成功 版本号要在6.9以上 2.npm -v 版本号要在3.10以上3.安装脚手架 1.npm install ...
- Vue.js高效前端开发 • 【Ant Design of Vue框架基础】
全部章节 >>>> 文章目录 一.Ant Design of Vue框架 1.Ant Design介绍 2.Ant Design of Vue安装 3.Ant Design o ...
- Vue框架Element的事件传递broadcast和dispatch方法分析
前言 最近在学习饿了么的Vue前端框架Element,发现其源码中大量使用了$broadcast和$dispatch方法,而Element使用的是Vue2.0版本,众所周知在Vue 1.0升级到2.0 ...
- 0基础菜鸟学前端之Vue.js
简介:0基础前端菜鸟,啃了将近半月前端VUE框架,对前端知识有了初步的了解.下面总结一下这段时间的学习心得. 文章结构 前端基础 Vue.js简介 Vue.js常用指令 Vue.js组件 Vue.js ...
- Vue框架之双向绑定事件
Vue框架之双向绑定事件 首先介绍下Vue框架的语法 vue通过 {{temp}} 来渲染变量 {{count+100}} # 求和 v-text # 为标签插入text文本 v-html # 为标签 ...
- vue框架入门和ES6介绍
vue框架入门和ES6介绍 vue-mvvm模式,vue是一种轻量级的前端框架,主要为模板渲染,数据同步,组件化,模块化,路由等. https://cn.vuejs.org/ 源码:https://g ...
- VUE框架的初识
VUE框架的初识 初步了解Vue.js框架(渐进式前端框架) Vue.js是一种轻量级的前端MVVM框架.同时吸收了React(组件化)和Angular(灵活指令页面操作)的优点.是一套构建用户界面的 ...
随机推荐
- 项目中添加lib依赖
Project Structure-->Artifacts
- GO学习-(30) Go语言操作kafka
go操作kafka Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和接收 ...
- Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息. 本文链接:https://blog.csdn.net/qq_38161040/art ...
- Docker学习(11) Dockerfile指令
Dockerfile指令 指令格式 FROM MAINTAINER RUN EXPOSE CMD ENTRYPOINT ADD COPY VOLUME WORKDIR ENV USER ONBUILD ...
- 八、数据拟合分析seaborn
本文的主要目的是记住最主要的函数,具体的用法还得查API文档. 首先导入包: 1 %matplotlib inline 2 import numpy as np 3 import pandas as ...
- THINKPHP_(7)_THINKPHP6的controller模型接收前端页面通过ajax返回的数据,会因为一个div而失败
这个随笔比较短. 同样的前端页面代码,修改了一下,后端模型接收不到数据. 利用beyond compare软件比对两个前端文件, 发现多了一个</div>标签. 多了一个</div& ...
- 九、部署audit监控文件
审计的目的是基于事先配置的规则生成日志,记录可能发生在系统上的事件(正常或非正常行为的事件),审计不会为系统提供额外的安全保护,但她会发现并记录违反安全策略的人及其对应的行为. 审计能够记录的日志内容 ...
- OOP第三次总结Blog
1. 前言 相比于前一次Blog题目集,此次七八九题目集偏重于类的继承.多态性使用方法以及接口的应用;在设计层面,强调模式复用,不断的迭代,若前期设计不合理,则后续的题目增加新的功能(即可扩展性)将会 ...
- 【题解】覆盖问题 BZOJ1052 HAOI2007 二分
题目描述 某 人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用 3个LL的正方形塑料薄膜将小树遮起来.我 ...
- 【题解】ball 数论
题目 题目描述: 众所周知的是Dr.Bai 穷困潦倒负债累累,最近还因邦邦的出现被班上的男孩子们几乎打入冷宫,所以Dr.Bai 决定去打工赚钱. Dr.Bai 决定做玩♂球的工作,工作内容如下. 老板 ...