附录7-用户列表案例,element-ui

目录

1  效果

1.1  查询所有用户

1.2  添加新用户

1.3  删除用户

1.4  用户详情

2  后端

2.1  查询所有

2.2  添加

2.3  删除

2.4  查询单个

3  前端

3.1  环境

3.2  main.js

3.3  userList.vue

3.4  userInfo.vue


1  效果

1.1  查询所有用户

1.2  添加新用户

如果点击取消就会显示添加失败

1.3  删除用户

点击取消会显示删除失败

点击确定会显示删除成功

1.4  用户详情

2  后端

pymysql一直开着会有一些问题,只能在每一次查询进行一次启停,每一个视图中写一遍就很麻烦,所以用到了请求钩子

from flask import Flask,request
import pymysql
import jsonapp = Flask(__name__)@app.before_request
def before_request():global connconn = pymysql.connect(host='127.0.0.1',user='root',password='12345678',database='my_db_01',charset='utf8')@app.after_request
def after_request(response):conn.commit()conn.close()return response@app.route('/get_users')
def get_users():cursor = conn.cursor()sql = 'SELECT * FROM my_db_01.element_ui_users'cursor.execute(sql)datas = cursor.fetchall()cursor.close()return_results = []for data in datas:results_obj = {}results_obj.__setitem__('id', data[0])results_obj.__setitem__('username', data[1])results_obj.__setitem__('age', data[2])results_obj.__setitem__('position', data[3])results_obj.__setitem__('create_time', data[4])return_results.append(results_obj)return json.dumps(return_results,ensure_ascii=False)@app.route('/get_one_user')
def get_one_user():id = request.args['id']cursor = conn.cursor()sql = 'SELECT * FROM my_db_01.element_ui_users where id=' + idcursor.execute(sql)datas = cursor.fetchall()cursor.close()for data in datas:results_obj = {}results_obj.__setitem__('id', data[0])results_obj.__setitem__('username', data[1])results_obj.__setitem__('age', data[2])results_obj.__setitem__('position', data[3])results_obj.__setitem__('create_time', data[4])return json.dumps(results_obj,ensure_ascii=False)@app.route('/add_user')
def add_user():username = request.args['username']age = request.args['age']position = request.args['position']create_time = request.args['create_time']cursor = conn.cursor()sql = "insert into my_db_01.element_ui_users (username,age,position,create_time) values ('{}',{},{},'{}')".format(username,age,position,create_time)cursor.execute(sql)cursor.close()return json.dumps({'status':0,'message':'添加成功'},ensure_ascii=False)@app.route('/delete_user')
def delete_user():id = request.args['id']cursor = conn.cursor()sql = "delete from my_db_01.element_ui_users where id={}".format(id)cursor.execute(sql)cursor.close()return json.dumps({'status':0,'message':'删除成功'},ensure_ascii=False)if __name__ == '__main__':app.run()

2.1  查询所有

2.2  添加

2.3  删除

2.4  查询单个

3  前端

3.1  环境

3.2  main.js

main.js主要解决了三个问题

  • ElementUI
  • axios
  • vue-router
import { createApp } from 'vue'
import App from './App.vue'
import userInfo from '@/components/userInfo'
import userList from '@/components/userList'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import axios from 'axios'
import {createRouter,createWebHashHistory} from 'vue-router'// 解决 ElTable 自动宽度高度导致的「ResizeObserver loop limit exceeded」问题,参考链接 https://blog.csdn.net/weixin_41296877/article/details/130675694
const debounce = (fn, delay) => {let timer = null;return function () {let context = this;let args = arguments;clearTimeout(timer);timer = setTimeout(function () {fn.apply(context, args);}, delay);}}const _ResizeObserver = window.ResizeObserver;window.ResizeObserver = class ResizeObserver extends _ResizeObserver{constructor(callback) {callback = debounce(callback, 16);super(callback);}}// axios请求部分
// axios.defaults.baseURL = 'http://127.0.0.1:5000'
axios.defaults.baseURL = 'http://localhost:8080'// 路由部分
const router = createRouter({history:createWebHashHistory(),routes:[{path:'/',redirect:'/userList'},{path:'/userList',component:userList},{path:'/userInfo/:id',component:userInfo,props:true}]
})const app = createApp(App)
app.use(ElementPlus)
app.config.globalProperties.$http = axios
app.use(router)
app.mount('#app')

3.3  userList.vue

<template><!-- 按钮 --><el-button type="primary" style="margin-bottom: 20px;" @click="dialogFormVisible = true" >添加新用户</el-button><!-- 表格 --><el-table :data="userList" border stripe style="width: 100%"><el-table-column type="index" label="#" /><el-table-column prop="username" label="姓名" /><el-table-column prop="age" label="年龄" /><el-table-column prop="position" label="头衔" /><el-table-column label="创建时间"><template #default="scope">{{ format_time(scope.row.create_time) }}</template></el-table-column><el-table-column label="操作"><template #default="scope"><div><router-link :to="'/userInfo/'+scope.row.id">详情</router-link>&nbsp;<a href="javascript:void(0)" :delete_user_id="scope.row.id" @click="delete_user(scope.row.id)">删除</a></div></template></el-table-column></el-table><!-- 提示框 --><el-dialog v-model="dialogFormVisible" title="添加新用户" @close="dialogClose()"><el-form :model="add_user_form" :rules="add_user_form_rules" ref="add_user_form"><el-form-item label="用户姓名" :label-width="formLabelWidth" prop="username"><el-input v-model="add_user_form.username" autocomplete="off"/></el-form-item><el-form-item label="用户年龄" :label-width="formLabelWidth" prop="age"><el-input v-model.number="add_user_form.age" autocomplete="off" /></el-form-item><el-form-item label="用户头衔" :label-width="formLabelWidth" prop="position"><el-input v-model="add_user_form.position" autocomplete="off" /></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="dialogFormVisible = false">取消</el-button><el-button type="primary" @click="add_user();">确认</el-button></span></template></el-dialog></template><script>
import { ElMessage, ElMessageBox } from 'element-plus'export default {name: 'userList',data() {return {userList: [],add_user_form: {username: '',age: '',position: '',create_time: new Date()},dialogFormVisible: false,formLabelWidth: '100px',add_user_form_rules: {username: [{ required: true, message: '请输入名称', trigger: 'blur' },{ min: 1, max: 15, message: '最小长度为1,最大长度为15', trigger: 'blur' },],age: [{ required: true, message: '请输入名称', trigger: 'blur' },{ validator:this.checkAge,trigger:'blur' }],position: [{ required: true, message: '请输入头衔', trigger: 'blur' },{ min: 1, max: 10, message: '最小长度为1,最大长度为10', trigger: 'blur' },],}}},methods: {get_users() {this.$http.get('/get_users').then((res) =>{this.userList=res.data})},format_time(unformat_time) {const dt = new Date(unformat_time)const year = dt.getFullYear()const month = (dt.getMonth() + 1) > 9 ? (dt.getMonth() + 1) : '0' + (dt.getMonth() + 1)const day = (dt.getDate()) > 9 ? (dt.getDate()) : '0' + (dt.getDate())const hour = (dt.getHours()) > 9 ? (dt.getHours()) : '0' + (dt.getHours())const minute = (dt.getMinutes()) > 9 ? (dt.getMinutes()) : '0' + (dt.getMinutes())const second = (dt.getSeconds()) > 9 ? (dt.getSeconds()) : '0' + (dt.getSeconds())return `${year}-${month}-${day} ${hour}:${minute}:${second}`},add_user() {this.$refs.add_user_form.validate((valid)=>{if (valid) {ElMessageBox.confirm('是否添加新用户?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',// type: 'info',// center: true,}).then(() => {this.$http.get('/add_user',{params:this.add_user_form}).then(()=>{this.get_users()this.dialogFormVisible = false})ElMessage({type: 'success',message: '添加成功',})}).catch(() => {ElMessage({type: 'info',message: '添加失败',})})}})},delete_user(delete_user_id) {ElMessageBox.confirm('此操作将永久删除该用户,是否继续?','提示',{confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning',// center: true,}).then(() => {this.$http.get('/delete_user',{params:{id:delete_user_id}}).then(()=>{this.get_users()this.dialogFormVisible = false})ElMessage({type: 'success',message: '删除成功',})}).catch(() => {ElMessage({type: 'info',message: '删除失败',})})},checkAge(rule,value,callback) {if (!value) {return callback(new Error('年龄是必填项'))}if (!Number.isInteger(value)) {return callback(new Error('你需要填写整数数字'))}if (value<1 || value>150) {return callback(new Error('年龄的值应在1-150之间'))}callback()},dialogClose() {this.$refs.add_user_form.resetFields()}},created() {this.get_users()}
}
</script><style scoped>
.el-input {width: 95%;height: 40px;
}
</style>

3.4  userInfo.vue

<template><el-card class="box-card"><template #header><div class="card-header"><span>用户详情</span><el-button class="button" text @click="this.$router.push('/userList')">返回</el-button></div></template><div class="text item">姓名 {{ username }}</div><div class="text item">年龄 {{ age }}</div><div class="text item">头衔 {{ position }}</div></el-card></template><script>export default {props:['id'],data() {return {username:'',age:'',position:''}},methods:{get_one_user() {this.$http.get('/get_one_user',{params:{id:this.id}}).then((res) =>{this.username=res.data.usernamethis.age=res.data.agethis.position=res.data.position})},},created() {this.get_one_user()}}
</script><style>
.card-header {display: flex;justify-content: space-between;align-items: center;
}.text {font-size: 14px;
}.item {margin-bottom: 18px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15128.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Chrome将更换HTTPS的“小绿锁”图标

HTTPS 是一种用于安全地传输数据的网络协议。HTTPS 是在 HTTP 协议的基础上添加了 SSL/TLS 协议&#xff0c;通过对数据进行加密&#xff0c;从而保证数据传输的安全性。HTTPS 常用于保护敏感信息&#xff0c;如个人身份信息、银行账户信息、信用卡信息等。 目前市面上所有的浏…

适合Docker的场景以及不适合的场景

文章来自&#xff1a;When to use and when not to use Docker和7 Cases When You Should Not Use Docker&#xff0c;以及互联网网上的一些零散内容。这篇文章只是基于我自己的理解&#xff0c;进行简单的概述。 适合的场景 你的团队不是一成不变的。 当有新的成员加入&#…

Openlayers实战:回显多点、多线段、多多边形

Openlayers地图中,回显数据是非常重要的。 继上一示例回显点、线、圆形、多边形后。本示例回显多线,多点,多个多边形。用到了MultiPoint,MultiLineString,MultiPolygon。 多个信息的显示可以采用循环的方式,单个显示点、线、面。 但是循环方式是要多次计算的,而MultiPoint…

FreeRTOS ~(六)信号量 ~ (1/3)信号量解决同步缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;1/3&#xff09;同步的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;1/5&#xff09;队列解决同步缺陷 举例子说明&#xff1a;利用信号量解决前述的"同步的缺陷&…

运动控制介绍

运动控制介绍 1 介绍1.1 概述1.2 运动控制的基本架构1.3 常见的控制功能1.4 运动控制研究的问题分类位置变化问题周期式旋转速度变化问题 1.5 知识体系1.6 路径规划 和 轨迹规划区别与联系1.7 运动控制系统 2 《运动控制系统》[班华 李长友 主编] 摘要1 绪论1.1 运动控制研究的…

【数据仓库】FineBI数据可视化使用体验

FineBI介绍 FineBI是新一代自助式BI工具,企业客户多,服务范围广.凭借finebi简单流畅的操作,强劲的大数据性能和自助式的分析体验。 1&#xff0c;对个人用户来说&#xff0c;免费的无限期试用&#xff0c;解锁所有功能&#xff0c;除了限制两个并发访问&#xff0c;个人用户可以…

CSS 两行文字两端对齐与字符间距的处理

前言 &#x1f44f;CSS 文字对齐与字符间距的处理&#xff0c;在这里&#xff0c;你可以了解到文字渐变&#xff0c;letter-spacing&#xff0c;text-align&#xff0c;text-align-last&#xff0c;filter等&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关…

42. 会话划分问题

文章目录 题目需求思路一实现一题目来源 题目需求 现有页面浏览记录表&#xff08;page_view_events&#xff09;如下&#xff0c;每行数据代表&#xff1a;每个用户的每次页面访问记录。 规定若同一用户的相邻两次访问记录时间间隔小于60s&#xff0c;则认为两次浏览记录属于…

CSS 内容盒子与边框盒子

这篇比较重要&#xff0c;会不断更新❗ 文章目录 &#x1f447;内容盒子开发者工具的使用border 边框padding 内边距margin 外边距盒子整体尺寸元素默认样式与CSS重置元素分类块级标记行级标记行内块标记 display样式内容溢出裁剪掉溢出部分滚动条 圆角边框 border-radius ✌边…

学无止境·MySQL③

单表查询 题一创建表并插入数据薪水修改为5000将姓名为张三的员工薪水修改为3000元将姓名为李四的员工薪水修改为4000元&#xff0c;gener改为女 题一 1.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09;&#xff…

Day976.如何安全、快速地接入OAuth 2.0? -OAuth 2.0

如何安全、快速地接入OAuth 2.0&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于如何安全、快速地接入OAuth 2.0&#xff1f;的内容。 授权服务将 OAuth 2.0 的复杂性都揽在了自己身上&#xff0c;这也是授权服务为什么是 OAuth 2.0 体系的核心的原因之…

c++读取字符串字符时出错

这是我做的一个c爬虫程序但是在抓取网页的时候string类型传递出现了问题 以下是图片代码 url的值是 "http://desk.zol.com.cn/" 我不知道为什么数据传递会出问题 请大佬指教 后面重新启动一遍编译器查一查断点有突然没问题了 &#xff0c;真是个玄学的问题。我还以…