vue+vuex+vuerouter+element+axios请求本地json文件实现增删改查
时间: 2023-07-29 13:09:38 浏览: 45
好的,下面是示例代码:
1. 在 src 目录下创建一个名为 data 的文件夹,在该文件夹内创建一个名为 data.json 的文件,用于存放数据。
2. 在 main.js 中引入相关库:
```javascript
import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'
import VueRouter from 'vue-router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'
Vue.prototype.$axios = axios
Vue.config.productionTip = false
Vue.use(Vuex)
Vue.use(VueRouter)
Vue.use(ElementUI)
```
3. 在 store.js 中定义 Vuex 的状态管理:
```javascript
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
data: [] // 存放数据的数组
},
mutations: {
setData(state, data) {
state.data = data
},
addData(state, newData) {
state.data.push(newData)
},
deleteData(state, id) {
const index = state.data.findIndex(item => item.id === id)
state.data.splice(index, 1)
},
updateData(state, newData) {
const index = state.data.findIndex(item => item.id === newData.id)
state.data.splice(index, 1, newData)
}
},
actions: {
async fetchData({ commit }) {
const response = await axios.get('/data/data.json')
commit('setData', response.data)
},
addData({ commit }, newData) {
commit('addData', newData)
},
deleteData({ commit }, id) {
commit('deleteData', id)
},
updateData({ commit }, newData) {
commit('updateData', newData)
}
}
})
export default store
```
4. 在 router.js 中定义路由:
```javascript
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from './views/Home.vue'
import Data from './views/Data.vue'
import AddData from './views/AddData.vue'
import EditData from './views/EditData.vue'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/data',
name: 'data',
component: Data
},
{
path: '/data/add',
name: 'addData',
component: AddData
},
{
path: '/data/edit/:id',
name: 'editData',
component: EditData
}
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
```
5. 在 App.vue 中使用 ElementUI 组件:
```html
<template>
<div id="app">
<el-header>
<el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" @select="handleSelect">
<el-menu-item index="/">首页</el-menu-item>
<el-menu-item index="/data">数据</el-menu-item>
</el-menu>
</el-header>
<el-main>
<router-view></router-view>
</el-main>
</div>
</template>
<script>
export default {
name: 'app',
computed: {
activeIndex() {
return this.$route.path
}
},
methods: {
handleSelect(index) {
this.$router.push(index)
}
}
}
</script>
```
6. 在 Data.vue 中显示数据列表,并实现删除操作:
```html
<template>
<div>
<el-table :data="data" style="width: 100%">
<el-table-column prop="id" label="ID"></el-table-column>
<el-table-column prop="name" label="姓名"></el-table-column>
<el-table-column prop="age" label="年龄"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
<el-button type="text" @click="handleDelete(scope.row.id)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-button type="primary" @click="handleAdd">添加</el-button>
</div>
</template>
<script>
export default {
name: 'data',
computed: {
data() {
return this.$store.state.data
}
},
methods: {
handleEdit(row) {
this.$router.push(`/data/edit/${row.id}`)
},
handleDelete(id) {
this.$confirm('确定删除该数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('deleteData', id)
this.$message({
type: 'success',
message: '删除成功!'
})
}).catch(() => {})
},
handleAdd() {
this.$router.push('/data/add')
}
},
created() {
this.$store.dispatch('fetchData')
}
}
</script>
```
7. 在 AddData.vue 中实现添加操作:
```html
<template>
<div>
<el-form :model="formData" label-width="80px">
<el-form-item label="姓名">
<el-input v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="年龄">
<el-input v-model.number="formData.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleAdd">添加</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'addData',
data() {
return {
formData: {
name: '',
age: ''
}
}
},
methods: {
handleAdd() {
const newData = { ...this.formData, id: Date.now() }
this.$store.dispatch('addData', newData)
this.$message({
type: 'success',
message: '添加成功!'
})
this.$router.push('/data')
}
}
}
</script>
```
8. 在 EditData.vue 中实现编辑操作:
```html
<template>
<div>
<el-form :model="formData" label-width="80px">
<el-form-item label="姓名">
<el-input v-model="formData.name"></el-input>
</el-form-item>
<el-form-item label="年龄">
<el-input v-model.number="formData.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleUpdate">更新</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'editData',
data() {
return {
formData: {
id: '',
name: '',
age: ''
}
}
},
methods: {
handleUpdate() {
this.$store.dispatch('updateData', this.formData)
this.$message({
type: 'success',
message: '更新成功!'
})
this.$router.push('/data')
}
},
created() {
const id = this.$route.params.id
const data = this.$store.state.data.find(item => item.id === Number(id))
this.formData = data
}
}
</script>
```
以上就是一个简单的 Vue 前端实现增删改查的示例。需要注意的是,以上代码仅供参考,实际应用中需要根据具体需求进行修改。
相关推荐














要实现Vue3和Spring Boot框架下的Element Plus附件上传和浏览功能,可以按照以下步骤进行操作:
1. 前端实现
在Vue3项目中,可以使用Element Plus提供的el-upload组件进行上传,同时利用axios发送上传请求,具体实现可以参考上一篇回答的代码示例。
在附件浏览的功能中,可以使用Element Plus提供的el-dialog组件和el-table组件,具体实现可以参考以下代码示例:
vue
<template>
<el-upload
class="upload-demo"
action="/api/upload"
:on-success="handleSuccess"
:file-list="fileList"
multiple
:limit="3"
:on-exceed="handleExceed"
:headers="headers">
<el-button size="small" type="primary">点击上传</el-button>
只能上传jpg/png文件,且不超过500kb
</el-upload>
<el-button type="primary" @click="showDialog">查看附件</el-button>
<el-dialog title="附件列表" :visible.sync="dialogVisible" width="50%">
<el-table :data="fileTableData" border>
<el-table-column prop="filename" label="文件名"></el-table-column>
<el-table-column prop="size" label="文件大小"></el-table-column>
<el-table-column label="操作">
<template v-slot="scope">
下载
</template>
</el-table-column>
</el-table>
</el-dialog>
</template>
<script>
import axios from 'axios'
export default {
data() {
return {
fileList: [],
headers: {
Authorization: 'Bearer ' + localStorage.getItem('token'),
},
dialogVisible: false,
fileTableData: [],
}
},
methods: {
handleSuccess(response, file, fileList) {
this.$message.success('上传成功')
this.fileList = fileList
},
handleExceed(files, fileList) {
this.$message.warning(当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${fileList.length + files.length} 个文件)
},
showDialog() {
axios.get('/api/files')
.then(response => {
this.fileTableData = response.data
this.dialogVisible = true
})
.catch(error => {
console.log(error)
})
},
},
}
</script>
其中,/api/files接口可以用来获取已上传的附件列表,返回的数据格式可以是一个包含文件名和文件大小的对象数组,例如:
json
[
{ "filename": "file1.txt", "size": "123KB" },
{ "filename": "file2.jpg", "size": "456KB" },
{ "filename": "file3.pdf", "size": "789KB" }
]
2. 后端实现
在Spring Boot项目中,可以使用Spring Boot提供的MultipartFile类来处理上传的附件,同时可以使用Spring Boot提供的ResponseEntity类来处理下载请求,具体实现可以参考以下代码示例:
java
@RestController
@RequestMapping("/api")
public class FileController {
private static final String UPLOAD_FOLDER = "uploads/";
@PostMapping("/upload")
public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String filename = file.getOriginalFilename();
String filepath = Paths.get(UPLOAD_FOLDER, filename).toString();
Files.write(Paths.get(filepath), file.getBytes());
return ResponseEntity.ok().build();
} catch (IOException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
@GetMapping("/files")
public ResponseEntity> getFiles() {
List<FileMetadata> files = new ArrayList<>();
File uploadFolder = new File(UPLOAD_FOLDER);
if (uploadFolder.exists()) {
File[] fileList = uploadFolder.listFiles();
if (fileList != null && fileList.length > 0) {
for (File file : fileList) {
FileMetadata metadata = new FileMetadata(file.getName(), humanReadableByteCount(file.length()));
files.add(metadata);
}
}
}
return ResponseEntity.ok(files);
}
@GetMapping("/download/{filename:.+}")
public ResponseEntity<Resource> downloadFile(@PathVariable String filename) {
Path filepath = Paths.get(UPLOAD_FOLDER, filename);
Resource resource;
try {
resource = new UrlResource(filepath.toUri());
} catch (MalformedURLException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
if (resource.exists() && resource.isReadable()) {
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename);
return ResponseEntity.ok().headers(headers).body(resource);
} else {
return ResponseEntity.notFound().build();
}
}
private static String humanReadableByteCount(long bytes) {
if (bytes < 1024) {
return bytes + "B";
}
int exp = (int) (Math.log(bytes) / Math.log(1024));
String pre = "KMGTPE".charAt(exp - 1) + "i";
return String.format("%.1f%sB", bytes / Math.pow(1024, exp), pre);
}
private static class FileMetadata {
private final String filename;
private final String size;
public FileMetadata(String filename, String size) {
this.filename = filename;
this.size = size;
}
public String getFilename() {
return filename;
}
public String getSize() {
return size;
}
}
}
其中,/api/download/{filename}接口可以用来处理下载请求,返回的是一个附件文件流,可以在前端实现中通过a标签的href属性来实现下载。




