前言:
這個章節内容是比較多的,分為前端部分和後端部分。
目錄:
實作效果:增删改查
一、後端部分:
(1)資料庫:
建立一張表user,設定幾個字段,效果如下:
(2)egg邏輯部分:
提供的接口:http://localhost:7001/setUserList
(3)egg具體實作步驟:
1、router.js中添加:
2、建立:app / controller / new / user.js
(1)查,模糊查詢
(2)增
(3)改
(4)删
user.js 源碼:
3、引入mysql:點我
4、跨域問題解決:點我
二、前端部分:
建立vue檔案:testApi.vue
1、初始化查詢清單資料:頁面展示清單,清單資料mouted擷取
2、頁面點選新增:展示彈框,并将彈框内容去除掉,點選新增,将彈框内容發送給後端
3、頁面點選清單裡面具體資料的編輯:彈框,并回填資料,修改将目前資料的id和表格資料傳給後端
4、删除按鈕,點選出現二次确認彈框,點選确認将目前資料的id給後端就行
testApi.vue 源碼:
實作效果:增删改查

一、後端部分:
(1)資料庫:
建立一張表user,設定幾個字段,效果如下:
(2)egg邏輯部分:
提供的接口:http://localhost:7001/setUserList
- get 請求,擷取資料,支援模糊查詢
- post 請求,新增資料
- put 請求,給後端目前資料id,修改内容
- delete 請求,根據資料id删除目前條資料
(3)egg具體實作步驟:
1、router.js中添加:
/**
* 路由配置
* @param app
*/
module.exports = app => {
const { router, controller } = app;
//--------------------------------------------------
// server接口
//--------------------------------------------------
app.get('/setUserList', controller.new.user.getUserList);
app.post('/setUserList', controller.new.user.postUserList);
app.put('/setUserList', controller.new.user.putUserList);
app.delete('/setUserList', controller.new.user.deleteUserList);
}
2、建立:app / controller / new / user.js
(1)查,模糊查詢
select * from user where name like ? % 内容 %
(2)增
this.app.mysql.insert('表名',内容)
(3)改
UPDATE loginlist SET `password` = 'Ad123456' WHERE id = 2
(4)删
delete from user where id = 1
user.js 源碼:
/**
* 使用者資訊路由
* @param app
* @returns {HomeController}
*/
const Controller = require('egg').Controller;
class NewsController extends Controller {
async getUserList() {
//查詢庫裡的user表
let params = this.ctx.query //擷取路徑後面的參數
console.log('使用者的參數:');
console.log(params);
let sql = 'select * from user'
let initSql = sql
let content = [];//參數
let isMore = false;//是否有多個查詢參數
/**
* @模糊查詢-量大的時候效率低
* select * from user where name like ? % 内容 %
* 在user表中全局查找name值 == 内容的
* % 内容 % 全局查找内容
* 内容 % 查找以 内容 開頭的資料
* */
if(params.name){
sql += " where name like ?";
content.push( "%"+params.name+"%" );
isMore = true;
}
if(params.age){
if(isMore){//true代表有多個參數
sql += "and age LIKE ?";//and是兩個條件都必須滿足,or是或的關系
}else{
sql += " WHERE age LIKE ?";
}
content.push( "%"+params.age+"%" )
isMore = true;
}
if(params.address){
if(isMore){//true代表有多個參數
sql += "and address LIKE ?";//and是兩個條件都必須滿足,or是或的關系
}else{
sql += " WHERE address LIKE ?";
}
content.push( "%"+params.address+"%" )
isMore = true;
}
if(params.phone){
if(isMore){//true代表有多個參數
sql += "and phone LIKE ?";//and是兩個條件都必須滿足,or是或的關系
}else{
sql += " WHERE phone LIKE ?";
}
content.push( "%"+params.phone+"%" )
}
//開啟分頁
if(params.page || params.pageSize){
let current = params.page;//目前頁碼
let pageSize = params.pageSize;//一頁展示多少條資料
sql += " limit ?,?";
content.push((current-1)*pageSize,parseInt(pageSize));
}
let allList = await this.app.mysql.query(initSql);
let userList= await this.app.mysql.query(
sql,content
);
this.ctx.body = {
code:200,
masg:'success',
data: {
list:userList,
total:allList.length
}
};
}
/**
* 新增使用者資訊
* INSERT INTO loginlist (aaa,bbb,ccc) VALUES ('"'+111+'","'+222+'","'+333+'"')
* this.app.mysql.insert('表名',内容)
* this.app.mysql.insert('表名',{
* name:123,
* age:1,
* address:西安
* })
*/
//
async postUserList() {
console.log(this.ctx.request.body);
//新增資料-user表
let data = this.ctx.request.body
data.id = parseInt(Math.random()*100000)
let insertResult = await this.app.mysql.insert(
'user', data
);
this.ctx.body = {
code:200,
masg:'success',
data:insertResult
};
}
/**
* 修改使用者資訊
* UPDATE loginlist SET `password` = 'Ad123456' WHERE id = 2(唯一值),修改一個
* UPDATE loginlist SET username = 'admins', `password` = 'Ad123456' WHERE id = 2,修改多個
*/
async putUserList(){
//新增資料-user表
let id = this.ctx.query.id //擷取路徑後面的參數
let data = this.ctx.request.body
let sql = 'update user set '
let isMore = false;//是否有多個查詢參數
if(!id){
this.ctx.body = {
code:200,
masg:'warning',
data:'id沒有傳'
};
return
}
//姓名
if(data.name){
sql += 'name = "'+data.name+'"'
isMore = true
}
//年齡
if(data.age){
if(isMore){
sql += ',age = "'+data.age+'"'
}else{
sql += 'age = "'+data.age+'"'
}
isMore = true
}
//位址
if(data.address){
if(isMore){
sql += ',address = "'+data.address+'"'
}else{
sql += 'address = "'+data.address+'"'
}
isMore = true
}
//手機号
if(data.phone){
if(isMore){
sql += ',phone = "'+data.phone+'"'
}else{
sql += 'phone = "'+data.phone+'"'
}
isMore = true
}
//郵箱位址
if(data.email){
if(isMore){
sql += ',email = "'+data.email+'"'
}else{
sql += 'email = "'+data.email+'"'
}
}
sql += ' where id = ' + id
let insertResult = await this.app.mysql.query(sql)
this.ctx.body = {
code:200,
masg:'success',
data:insertResult
};
}
/**
* 登出使用者接口
* DELETE FROM loginlist WHERE username = 'superman'
*/
async deleteUserList(){
//查詢庫裡的user表
let params = this.ctx.query //擷取路徑後面的參數
console.log('使用者的參數:');
console.log(params);
let sql = 'delete from user where id = '+ params.id
let res = await this.app.mysql.query(
sql
);
this.ctx.body = {
code:200,
masg:'success',
data:res
};
}
/**
* 模糊查詢封裝方法
* @params = auth
* */
async query( auth ) {
const TABLE_NAME = 'user';
const QUERY_STR = 'id, name, age, phone, address';
let sql = `select ${QUERY_STR} from ${TABLE_NAME} where authName like "%${auth.authName}%"`;
const row = await this.app.mysql.query(sql);
return row;
}
}
module.exports = NewsController;
3、引入mysql:點我
4、跨域問題解決:點我
二、前端部分:
建立vue檔案:testApi.vue
1、初始化查詢清單資料:頁面展示清單,清單資料mouted擷取
<el-table
:data="tableInfo.list"
style="width: 100%">
<el-table-column
type="index"
label="序号"
align="center">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
align="center">
</el-table-column>
<el-table-column
prop="age"
label="年齡"
align="center">
</el-table-column>
<el-table-column
prop="address"
label="位址">
</el-table-column>
<el-table-column
prop="phone"
label="手機号">
</el-table-column>
<el-table-column
prop="email"
label="郵箱">
</el-table-column>
<el-table-column
label="操作"
width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="editFun(scope.row)">編輯</el-button>
<el-button type="text" size="small" @click="deleteFun(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
mounted(){
this.initPage()
},
methods: {
/***
* 擷取清單資料
*/
initPage() {
let params = {
page: this.tableInfo.page, //目前頁
pageSize: this.tableInfo.pageSize //一頁展示多少條
}
this.$axios.get('http://localhost:7001/setUserList',{
params
}).then(res => {
this.tableInfo.list = res.data.data.list
this.tableInfo.total = res.data.data.total
}).catch(error => {
this.$message(error.data.message)
})
},
}
2、頁面點選新增:展示彈框,并将彈框内容去除掉,點選新增,将彈框内容發送給後端
3、頁面點選清單裡面具體資料的編輯:彈框,并回填資料,修改将目前資料的id和表格資料傳給後端
4、删除按鈕,點選出現二次确認彈框,點選确認将目前資料的id給後端就行
testApi.vue 源碼:
<template>
<div class="pro_body">
<el-button type='success' @click="addModal">新增</el-button>
<el-table
:data="tableInfo.list"
style="width: 100%">
<el-table-column
type="index"
label="序号"
align="center">
</el-table-column>
<el-table-column
prop="name"
label="姓名"
align="center">
</el-table-column>
<el-table-column
prop="age"
label="年齡"
align="center">
</el-table-column>
<el-table-column
prop="address"
label="位址">
</el-table-column>
<el-table-column
prop="phone"
label="手機号">
</el-table-column>
<el-table-column
prop="email"
label="郵箱">
</el-table-column>
<el-table-column
label="操作"
width="100">
<template slot-scope="scope">
<el-button type="text" size="small" @click="editFun(scope.row)">編輯</el-button>
<el-button type="text" size="small" @click="deleteFun(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
class="work_pagination"
background
:layout="'total,prev, pager, next,sizes'"
:total="tableInfo.total"
:hide-on-single-page="false"
:current-page="tableInfo.page"
:page-size="tableInfo.pageSize"
@current-change="pageChange"
@size-change="pageSizeChange"
>
</el-pagination>
<!--彈框部分-->
<el-dialog
custom-class="modalName"
:visible.sync="modal.show"
:width="modal.type === 'delete'? '470px' : '800px'">
<h3 v-if="modal.type === 'add'" slot="title">新增</h3>
<h3 v-if="modal.type === 'edit'" slot="title">修改</h3>
<h3 v-if="modal.type === 'delete'" slot="title">提示</h3>
<div v-if="modal.type !== 'delete'" class="editNameBody">
<el-form class="editNameFrom" :model="modalFrom" label-width="120px" label-position="right">
<el-form-item label="姓名:">
<el-input v-model="modalFrom.name"></el-input>
</el-form-item>
<el-form-item label="年紀:">
<el-input v-model="modalFrom.age"></el-input>
</el-form-item>
<el-form-item label="手機号:">
<el-input v-model="modalFrom.phone"></el-input>
</el-form-item>
<el-form-item label="郵箱:">
<el-input v-model="modalFrom.email"></el-input>
</el-form-item>
<el-form-item label="位址:">
<el-input v-model="modalFrom.address" type="textarea"></el-input>
</el-form-item>
</el-form>
</div>
<div v-if="modal.type === 'delete'">
<i class="el-icon-warning" style="margin-right:7px;color:#FFAA00;font-size: 16px;"></i>請确認是否删除
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="modal.show = false">取 消</el-button>
<el-button v-if="modal.type === 'add'" type="primary" @click="addUserList">新增</el-button>
<el-button v-if="modal.type === 'edit'" type="primary" @click="editUserList">修改</el-button>
<el-button v-if="modal.type === 'delete'" type="primary" @click="deleteUserList">确 認</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
tableInfo:{
columns:[
{
title: '序号',
type: 'index',
},{
title: '姓名',
prop: 'name',
align: 'center'
},
{
title: '年齡',
prop: 'age',
align: 'center'
},{
title: '位址',
prop: 'address',
align: 'center'
},{
title: '郵箱',
prop: 'email',
align: 'center'
},{
title: '手機号',
prop: 'phone',
align: 'center'
},
{//内容slot
slot: 'operateT'
}
],
list:[],
page:1,
pageSize:10,
total:0,
},
modal:{
show:false,
type:'add'
},
modalFrom:{
name:'',
age:'',
phone:'',
address:'',
email:''
}
};
},
mounted(){
this.initPage()
},
methods: {
/***
* 擷取清單資料
*/
initPage() {
let params = {
page: this.tableInfo.page, //目前頁
pageSize: this.tableInfo.pageSize //一頁展示多少條
}
this.$axios.get('http://localhost:7001/setUserList',{
params
}).then(res => {
this.tableInfo.list = res.data.data.list
this.tableInfo.total = res.data.data.total
}).catch(error => {
this.$message(error.data.message)
})
},
/**
* 目前頁發生改變
* */
pageChange(page) {
this.tableInfo.page = page
this.initPage() //重新整理清單資料
},
/**
* 目前第幾頁發生改變
* */
pageSizeChange(pageSize) {
this.tableInfo.page = 1
this.tableInfo.pageSize = pageSize
this.initPage() //重新整理清單資料
},
//新增彈框
addModal(){
this.modalFrom ={
name:'',
age:'',
phone:'',
address:'',
email:''
}
this.modal.show = true
this.modal.type = 'add'
},
//修改彈框
editFun(row){
this.modalFrom = row
this.modal.show = true
this.modal.type = 'edit'
},
//删除彈框
deleteFun(row){
this.modalFrom = row
this.modal.show = true
this.modal.type = 'delete'
},
addUserList(){
this.$axios({
method:'post',
url:'http://localhost:7001/setUserList',
data:this.modalFrom
}).then(res => {
this.$message.success('新增成功')
this.initPage() //重新整理資料
this.modal.show = false
})
},
editUserList(){
this.$axios({
method:'put',
url:'http://localhost:7001/setUserList',
params:{
id:this.modalFrom.id
},
data:this.modalFrom
}).then(res => {
this.$message.success('修改成功')
this.initPage() //重新整理資料
this.modal.show = false
})
},
deleteUserList(){
this.$axios({
method:'delete',
url:'http://localhost:7001/setUserList',
params:{
id:this.modalFrom.id
}
}).then(res => {
this.$message.success('删除成功')
this.initPage() //重新整理資料
this.modal.show = false
})
}
}
}
</script>
<style >
.modalName{
h3{
padding:10px;
}
}
</style>