李立农:坚持到最后,我笑得最开心

本文讲述了深圳盛润公司总裁李立农的创业历程。他本学自动化专业,后赴美深造,曾放弃斯坦福博士学位。回国后,他从微电子转向互联网,进军网络证券行业,其网站访问量激增。目前他面临法规考验,公司还将推出中国人自己的浏览器。

李立农:36岁。深圳盛润公司总裁。
座右铭:不言放弃

李立农:坚持到最后,我笑得最开心
本报记者  李学凌
李立农身高马大,但是却长了一张书生脸,正符合他双重性格。在李立农的办公室里有一个小冰箱,里面放了许多饮料和零食,完全没有一般互联网公司,不停向前冲,没日没夜感觉。
李立农经历得太多,他说“人生有许多偶然因素,我的所学和我所做的离得太远。”1979年读大学,对于许多人来说,都是一个难忘的经历。李立农在广州读了4年的自动化专业,被分配到北京石化总公司做实时控制系统。李立农说:“那完全是硬件控制,我对硬件非常了解。”他做梦也想不到人生会发生怎样的变化。1985年,李立农拿到美国密执安大学电子工程系的入学通知,离开祖国去完成他“开发硬件的梦想”。李立农用了两年时间拿到了硕士学位,并且考取了密执安大学的博士学位。这时,他的两个朋友约他到硅谷创业。1987年的硅谷是美国最吸引人的地方,李立农也禁不住诱惑,决定“先工作过几年再学习”。到了硅谷,看到了斯坦福大学,李立农震惊了,“这才是我要来的地方”。不仅仅是斯坦福大学美丽的校园打动了李立农,斯坦福在整个硅谷的影响力使得每一个来到这里的人都为之动容。1989年,李立农拿到了斯坦福大学神经元网络系统(Neural Networks)博士的入学通知,他的导师是美国著名的学者,在麻省理工学院时,他把神经元网络变成了一个学科。李立农信心百倍,想把神经元网络系统硬件化,“硬件一直是我的梦想”。
没有想到,这个导师和李立农的第一次见面就让他永远地离开了心怡多年的学府,再也没有回头的机会。李立农的导师知道他在硅谷的公司,他问李立农“博士毕业后,想干什么?”李立农当然想继续发展他的公司,他希望自己能够做商业。这时他听到了终身难忘的训戒:“如果你希望在商业上有所发展,干脆不要读博士,博士是为学术界准备人才。你要学会在图书馆里查资料,作八股文章。你应该把你的知识放在商业中去,而不是在学院里寻找梦想。”
这段话,让李立农找到了当弟子的感觉。他调头走了。一个能够放弃读斯坦福大学博士的人,必然会有传奇的一生。
李立农开始重新思考自己走过的路:“认为的归纳规律,是学校学习的好的训练方法,但学习的过久,浪费了时间,自己曾经做过许多‘不必要的完美’,在钻牛角尖中度过珍贵的时光。”
硅谷的公司还不错,但是李立农一直没有忘掉自己的肤色。1994年,李立农回到祖国,他想加盟微电子业。在中国开发微电子当然没有美国那么好的环境,但是李立农认为“困难的地方,才有机会留下来”,他不想摘“路边的李子”。
李立农已经30岁了,他说在美国,30岁意味着人生的第二次选择,这个年龄是改行的热点年龄。李立农也想改行,但是自己除了微电子以外,在其他行业没有生存能力。这时他发现了互联网。微电子领域的冲击虽然很大,但是没有互联网冲击大。“这是一个新行业,也是一个未来行业”,在这个行业没有人比你更高。1995年,中国只有1500个网站,50万用户。这样的一个行业风险极大。
李立农也有一些害怕。
网景公司在美国上市了!李立农在日本看到这个消息,打开电脑看着网景公司的股票暴长,他感慨万千。因为自己是做技术出身,从来都不崇拜技术。“我们念工科的人,会忽略互联网,因为我们看不到社会和文化效应”。李立农说:“我还记得在旧金山看到有人使用Sendmail软件,他就很不理解,为什么会有一个公司作这样的产品”因为UNIX下的邮件命令已经很成熟。网景公司和李立农在硅谷的公司是邻居,他的一个朋友看了网景的产品不以为然,说“一点儿都不难,一个星期就可以做一个,而且免费也没有发展”。当网景要求李立农加盟时,他拒绝了。
李立农看着网景的股票价格,痛心疾首。不是因为钱的问题。他感到人生是公平的“人生有许多机会,公平地给每一个人。有些人得到机会发展了,有些人分不清信号和噪音,失去了”。李立农没有想到,一个星期就可以完成的软件,在社会上有这么大的推动力。他发现社会产生了重大变革。
李立农在世界各处游荡,在美国买了许多股票。炒股是他最头痛的事。每到一个国家,他都要打长途电话去问价格,然后快速地记录下来,分析后,在打长途电话到美国下单。李立农说:“1996年的互联网是白纸是的一大滴墨水,你可以像任何方向涂抹,最终会变成不同的图画。”他决定进军互联网股票行业。
“1996年,美国的风险投资是以办公室为圆心,以10英里为半径划圆,在这个范围内的公司才会考虑投资的问题”,李立农曾经做过两家公司,都是风险投资支持的。他终于说服投资商,拿着投资回到中国。这个时间只比搜狐晚一点点。李立农说自己不愿意为此宣传,因为拿到“风险投资是一件很平常的事,我已经拿过许多了”。www.stock200.com这个网站就这样开始了。李立农是做技术出身,他的网站也依靠技术发展,网站面世之后,访问量激增,在国内证券领域的影响力迅速上升。李立农说:“做技术的人,是第一个撞墙的,也会第一个找到出路”。目前国内对网络证券管理的法规正在慢慢出台,李立农面临许多考验,怎么样能够顽强的生存下去。他告诉记者一个秘密:盛润公司很快要推出第一个中国人自己的浏览器,负责这个项目的是他的朋友林玮铭——以前,网景公司的主要技术主管。
李立农说,一个只有几年历史的公司很难和几百年历史的大公司竞争,我们需要保持技术领先。
李立农对互联网感慨万千,他说:“我们像一颗豆芽,能够一夜长长一倍,但是却是很脆弱。要么夭折,要么长成大树。”谈到一些政策对网络证券的限制,李立农说:“我去过黄山,青松之美,在于它能够顽强地在缝隙中成长,我们的意义在与自己的奋斗,我们没有必要化时间,去惋惜那些我们不能完成的事。”
李立农曾经多次放弃过机会,但是他最后告诉记者的却是“永不言放弃”,是的有些放弃,是选择的结果。一旦我们选择了自己的人生,我们就没有时间抱怨世界,用我们的身体向前冲,用我们的嘴巴来微笑。

App.vue代码:<!– @fenghua: 2401_87008233 3024798541@qq.com @Date: 2025-09-05 18:56:30 @LastEditors: 2401_87008233 3024798541@qq.com @LastEditTime: 2025-09-08 19:08:38 @FilePath: \NanChange:\Vue代码\hou_tai\src\App.vue @Description: Copyright © 2025 by ${fenghua}, All Rights Reserved. –> <script setup lang="ts"> import { ref, computed, onMounted } from 'vue' import { Search } from '@element-plus/icons-vue' import { ElMessageBox } from 'element-plus'; import { tableData } from './comm/ts' const input1 = ref('') import './comm/css.css'; import axios from 'axios'; // 新增 axios 库 // 初始化表格数据 const tableDataRef = ref<any[]>([]); const pageSize4 = ref(10) const currentPage4 = ref(1) const nextId = ref(1); // 新增:从数据库获取数据 const fetchData = async () => { try { const response = await axios.get('http://localhost:3000/api/administrators'); const data = response.data; // 转换数据结构 const convertedData = data.map((item: any, index: number) => ({ date: (index + 1).toString(), name: item.admin_name, status: true, // 默认启用状态 address: new Date(item.login_time).toLocaleString().replace(/\//g, '-'), id: item.id // 保留数据库ID })); tableDataRef.value = convertedData; nextId.value = convertedData.length + 1; } catch (error) { console.error('获取数据失败:', error); ElMessageBox.alert('数据库连接失败,请检查后端服务', '错误', { type: 'error' }); } }; // 挂载时获取数据 onMounted(() => { fetchData(); }); // 计算属性,过滤后的数据 const filteredData = computed(() => { if (!input1.value.trim()) { return tableDataRef.value; } const searchTerm = input1.value.trim().toLowerCase(); return tableDataRef.value.filter(item => item.name.toLowerCase().includes(searchTerm) ); }); // 计算属性,分页后的数据 const pagedData = computed(() => { const start = (currentPage4.value - 1) * pageSize4.value; const end = start + pageSize4.value; return filteredData.value.slice(start, end); }); // 数据函数 const handleCreate = () => { ElMessageBox.prompt('请输入角色类型名称', '新建角色', { confirmButtonText: '确定', cancelButtonText: '取消', inputPattern: /\S+/, // 非空验证 inputErrorMessage: '角色类型不能为空' }).then(({ value }) => { // 创建新数据对象 const newItem = { date: nextId.value.toString(), // 序号 name: value, // 角色类型 status: true, // 默认启用状态 address: new Date().toLocaleString().replace(/\//g, '-') }; // 添加到表格数据开头 tableDataRef.value.unshift(newItem); // 重新排序所有数据 reindexData(); }).catch(() => { // 用户取消操作 }); } // 删除函数 const handleDelete = (rowDate: string) => { ElMessageBox.confirm('确定删除该条数据吗?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { // 查找要删除项的索引 const index = tableDataRef.value.findIndex(item => item.date === rowDate); if (index !== -1) { // 从数据源中删除该项 tableDataRef.value.splice(index, 1); // 重新排序所有数据 reindexData(); } }).catch(() => { // 用户取消操作 }); } // 重新排序数据的函数 const reindexData = () => { // 重新排序所有数据的序号 tableDataRef.value.forEach((item, index) => { item.date = (index + 1).toString(); }); // 更新下一个ID值 nextId.value = tableDataRef.value.length + 1; // 重置搜索条件和分页 input1.value = ''; currentPage4.value = 1; } // 页码改变处理函数 const handleSizeChange = (val: number) => { pageSize4.value = val; currentPage4.value = 1; } // 编辑函数 const handleEdit = (rowDate: string) => { const row = tableDataRef.value.find(item => item.date === rowDate); if (!row) return; ElMessageBox.prompt('请输入新的角色类型名称', '编辑角色', { confirmButtonText: '确定', cancelButtonText: '取消', inputValue: row.name, // 预填充当前值 inputPattern: /\S+/, // 非空验证 inputErrorMessage: '角色类型不能为空' }).then(({ value }) => { // 更新角色名称 row.name = value; // 更新操作时间为当前时间 row.address = formatDate(new Date()); }).catch(() => { // 用户取消操作 }); } // 格式化日期 const formatDate = (date: Date): string => { const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } const handleCurrentChange = (val: number) => { console.log(`current page: ${val}`) currentPage4.value = val; } const parentBorder = ref(false) const preserveExpanded = ref(false) </script> <template> <div class="template"> <div class="common-layout"> <el-container> <el-header class="header"> <!-- 左侧输入框 --> <el-input v-model="input1" style="width: 300px" size="large" placeholder="请输入租户名称" :suffix-icon="Search" clearable @keyup.enter="currentPage4 = 1" /> <!-- 右侧新建框 --> <el-button type="primary" @click="handleCreate">十 新建</el-button> </el-header> <!-- /主题内容 --> <el-main class="zhuti"> <!-- 响应式数据 --> <el-table :data="pagedData" height="550" style="width: 100%"> <el-table-column prop="date" label="序号" width="100" /> <el-table-column prop="name" label="角色类型" width="180" /> <el-table-column label="用户组状态" width="340" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" /> </template> </el-table-column> <el-table-column prop="address" label="操作时间" width="280" /> <el-table-column label="操作" width="300" class="tupian"> <template v-slot="scope"> <!-- 修改这里获取行数据 --> <img src="/image/bianji.png" alt="编辑" width="20px" style="margin-right: 30px; cursor: pointer;" @click="handleEdit(scope.row.date)"> <img src="/image/qunzu.png" alt="" width="20px" style="margin-right: 30px;"> <img src="/image/zengjia.png" alt="" width="20px" style="margin-right: 30px;"> <!-- 为删除图标添加点击事件 --> <img src="/image/shanchu.png" alt="删除" width="20px" style="margin-right: 30px; cursor: pointer;" @click="handleDelete(scope.row.date)"> </template> </el-table-column> <el-table-column :border="parentBorder" :preserve-expanded-content="preserveExpanded" /> </el-table> <!-- 分页器 --> <div class="demo-pagination-block fenyeqi"> <el-pagination background v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[10, 20, 50, 100]" :total="filteredData.length" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </el-main> </el-container> </div> </div> </template> <style scoped></style> server.js代码:/* @fenghua: 2401_87008233 3024798541@qq.com @Date: 2025-09-08 19:11:03 @LastEditors: 2401_87008233 3024798541@qq.com @LastEditTime: 2025-09-08 20:11:04 @FilePath: \NanChange:\Vue代码\hou_tai\src\server.js @Description: Copyright © 2025 by ${fenghua}, All Rights Reserved. */ const express = require(‘express’); const mysql = require(‘mysql2’); const cors = require(‘cors’); const app = express(); app.use(cors()); // 数据库连接配置 const pool = mysql.createPool({ host: ‘localhost:14482’, port: 3306, user: ‘root’, password: ‘123456’, database: ‘admin_system’, waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); // 管理员数据API app.get(‘/admin_system/administrators’, async (res) => { try { const [rows] = await pool.promise().query( SELECT id, admin_name, login_time FROM administrators ORDER BY login_time DESC ); res.json(rows); } catch (error) { console.error(‘数据库查询错误:’, error); res.status(500).json({ error: ‘数据库查询失败’ }); } }); // 启动服务器 const PORT = 3000; app.listen(PORT, () => { console.log(后端服务运行在 http://localhost:${PORT}); }); 数据格式要这样的:/* * @fenghua: 2401_87008233 3024798541@qq.com * @Date: 2025-09-05 19:41:38 * @LastEditors: 2401_87008233 3024798541@qq.com * @LastEditTime: 2025-09-06 22:50:08 * @FilePath: \NanChange:\Vue代码\hou_tai\src\comm\ts.ts * @Description: * * Copyright (c) 2025 by ${fenghua}, All Rights Reserved. */ // 生成指定范围内的随机整数 function getRandomInt(min: number, max: number): number { return Math.floor(Math.random() * (max - min + 1)) + min; } // 生成2022年的随机时间戳 function generateRandomDate(): string { const month = getRandomInt(1, 12); const maxDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; const day = getRandomInt(1, maxDays); const hours = getRandomInt(0, 23).toString().padStart(2, '0'); const minutes = getRandomInt(0, 59).toString().padStart(2, '0'); const seconds = getRandomInt(0, 59).toString().padStart(2, '0'); return ` 2022-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours}:${minutes}:${seconds}`; } // 生成随机管理员名称 function generateRandomName(): string { const adminTypes = [ "系统管理员", "超级系统管理员", "网络管理员", "数据库管理员", "安全管理员", "应用管理员", "服务器管理员", "高级系统管理员", '蔡徐坤', '程立农', '一只小风华' ]; return adminTypes[getRandomInt(0, adminTypes.length - 1)]; } // 生成测试数据 export const tableData = Array.from({ length: 100 }, (_, index) => ({ date: (index + 1).toString(), name: index === 0 ? "系统管理员:超级管理员" : generateRandomName(), // 确保第一条有特殊格式 address: generateRandomDate() })); 请按照以上代码详细的创建一个数据库并能使用
09-09
数据为:/* * @fenghua: 2401_87008233 3024798541@qq.com * @Date: 2025-09-05 19:41:38 * @LastEditors: 2401_87008233 3024798541@qq.com * @LastEditTime: 2025-09-06 22:50:08 * @FilePath: \NanChange:\Vue代码\hou_tai\src\comm\ts.ts * @Description: * * Copyright (c) 2025 by ${fenghua}, All Rights Reserved. */ // 生成指定范围内的随机整数 function getRandomInt(min: number, max: number): number { return Math.floor(Math.random() * (max - min + 1)) + min; } // 生成2022年的随机时间戳 function generateRandomDate(): string { const month = getRandomInt(1, 12); const maxDays = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; const day = getRandomInt(1, maxDays); const hours = getRandomInt(0, 23).toString().padStart(2, '0'); const minutes = getRandomInt(0, 59).toString().padStart(2, '0'); const seconds = getRandomInt(0, 59).toString().padStart(2, '0'); return ` 2022-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')} ${hours}:${minutes}:${seconds}`; } // 生成随机管理员名称 function generateRandomName(): string { const adminTypes = [ "系统管理员", "超级系统管理员", "网络管理员", "数据库管理员", "安全管理员", "应用管理员", "服务器管理员", "高级系统管理员", '蔡徐坤', '程立农', '一只小风华' ]; return adminTypes[getRandomInt(0, adminTypes.length - 1)]; } // 生成测试数据 export const tableData = Array.from({ length: 100 }, (_, index) => ({ date: (index + 1).toString(), name: index === 0 ? "系统管理员:超级管理员" : generateRandomName(), // 确保第一条有特殊格式 address: generateRandomDate() })); 主页为:<!-- * @fenghua: 2401_87008233 3024798541@qq.com * @Date: 2025-09-05 18:56:30 * @LastEditors: 2401_87008233 3024798541@qq.com * @LastEditTime: 2025-09-07 22:45:17 * @FilePath: \NanChange:\Vue代码\hou_tai\src\App.vue * @Description: * * Copyright (c) 2025 by ${fenghua}, All Rights Reserved. --> <script setup lang="ts"> import { ref, computed } from 'vue' import { Search } from '@element-plus/icons-vue' import { tableData } from './comm/ts' import { ElMessageBox } from 'element-plus'; import './comm/css.css'; const input1 = ref('') import './comm/css.css'; // 将导入的tableData转为响应式引用 const tableDataRef = ref([...tableData]); const pageSize4 = ref(10) //每页显示数量 const currentPage4 = ref(1) // 初始页为1 // 计算属性,过滤后的数据 const filteredData = computed(() => { if (!input1.value.trim()) { return tableDataRef.value; } const searchTerm = input1.value.trim().toLowerCase(); return tableDataRef.value.filter(item => item.name.toLowerCase().includes(searchTerm) ); }); // 计算属性,分页后的数据 const pagedData = computed(() => { const start = (currentPage4.value - 1) * pageSize4.value; const end = start + pageSize4.value; return filteredData.value.slice(start, end); }); // 序号计数 const nextId = ref(tableDataRef.value.length + 1); // 数据函数 const handleCreate = () => { ElMessageBox.prompt('请输入角色类型名称', '新建角色', { confirmButtonText: '确定', cancelButtonText: '取消', inputPattern: /\S+/, // 非空验证 inputErrorMessage: '角色类型不能为空' }).then(({ value }) => { // 创建新数据对象 const newItem = { date: nextId.value.toString(), // 序号 name: value, // 角色类型 status: true, // 默认启用状态 address: new Date().toLocaleString().replace(/\//g, '-') }; // 添加到表格数据开头 tableDataRef.value.unshift(newItem); // 重新排序所有数据 reindexData(); }).catch(() => { // 用户取消操作 }); } // 删除函数 const handleDelete = (rowDate: string) => { ElMessageBox.confirm('确定删除该条数据吗?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { // 查找要删除项的索引 const index = tableDataRef.value.findIndex(item => item.date === rowDate); if (index !== -1) { // 从数据源中删除该项 tableDataRef.value.splice(index, 1); // 重新排序所有数据 reindexData(); } }).catch(() => { // 用户取消操作 }); } // 重新排序数据的函数 const reindexData = () => { // 重新排序所有数据的序号 tableDataRef.value.forEach((item, index) => { item.date = (index + 1).toString(); }); // 更新下一个ID值 nextId.value = tableDataRef.value.length + 1; // 重置搜索条件和分页 input1.value = ''; currentPage4.value = 1; } // 页码改变处理函数 const handleSizeChange = (val: number) => { pageSize4.value = val; currentPage4.value = 1; } const handleCurrentChange = (val: number) => { console.log(`current page: ${val}`) currentPage4.value = val; } const parentBorder = ref(false) const preserveExpanded = ref(false) </script> <template> <div class="template"> <div class="common-layout"> <el-container> <el-header class="header"> <!-- 左侧输入框 --> <el-input v-model="input1" style="width: 300px" size="large" placeholder="请输入租户名称" :suffix-icon="Search" clearable @keyup.enter="currentPage4 = 1" /> <!-- 右侧新建框 --> <el-button type="primary" @click="handleCreate">十 新建</el-button> </el-header> <!-- /主题内容 --> <el-main class="zhuti"> <!-- 响应式数据 --> <el-table :data="pagedData" height="550" style="width: 100%"> <el-table-column prop="date" label="序号" width="100" /> <el-table-column prop="name" label="角色类型" width="180" /> <el-table-column label="用户组状态" width="340" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" /> </template> </el-table-column> <el-table-column prop="address" label="操作时间" width="280" /> <el-table-column label="操作" width="300" class="tupian"> <template v-slot="scope"> <!-- 修改这里获取行数据 --> <img src="/image/bianji.png" alt="" width="20px" style="margin-right: 30px;"> <img src="/image/qunzu.png" alt="" width="20px" style="margin-right: 30px;"> <img src="/image/zengjia.png" alt="" width="20px" style="margin-right: 30px;"> <!-- 为删除图标添加点击事件 --> <img src="/image/shanchu.png" alt="删除" width="20px" style="margin-right: 30px; cursor: pointer;" @click="handleDelete(scope.row.date)"> </template> </el-table-column> <el-table-column :border="parentBorder" :preserve-expanded-content="preserveExpanded" /> </el-table> <!-- 分页器 --> <div class="demo-pagination-block fenyeqi"> <el-pagination background v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[10, 20, 50, 100]" :total="filteredData.length" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </el-main> </el-container> </div> </div> </template> <style scoped></style> 请给<img src="/image/bianji.png" alt="" width="20px" style="margin-right: 30px;"> 加个编辑信息的功能
09-08
<!-- * @fenghua: 2401_87008233 3024798541@qq.com * @Date: 2025-09-05 18:56:30 * @LastEditors: 2401_87008233 3024798541@qq.com * @LastEditTime: 2025-09-08 19:00:22 * @FilePath: \NanChange:\Vue代码\hou_tai\src\App.vue * @Description: * * Copyright (c) 2025 by ${fenghua}, All Rights Reserved. --> <script setup lang="ts"> import { ref, computed } from 'vue' import { Search } from '@element-plus/icons-vue' import { tableData } from './comm/ts' import { ElMessageBox } from 'element-plus'; const input1 = ref('') import './comm/css.css'; import { mysql } from 'mysql' const conn = mysql.createConnection({ host: 'localhost', user: 'root', password: '123456', database: 'user' }); // 将导入的tableData转为响应式引用 const tableDataRef = ref([...tableData]); const pageSize4 = ref(10) //每页显示数量 const currentPage4 = ref(1) // 初始页为1 // 计算属性,过滤后的数据 const filteredData = computed(() => { if (!input1.value.trim()) { return tableDataRef.value; } const searchTerm = input1.value.trim().toLowerCase(); return tableDataRef.value.filter(item => item.name.toLowerCase().includes(searchTerm) ); }); // 计算属性,分页后的数据 const pagedData = computed(() => { const start = (currentPage4.value - 1) * pageSize4.value; const end = start + pageSize4.value; return filteredData.value.slice(start, end); }); // 序号计数 const nextId = ref(tableDataRef.value.length + 1); // 数据函数 const handleCreate = () => { ElMessageBox.prompt('请输入角色类型名称', '新建角色', { confirmButtonText: '确定', cancelButtonText: '取消', inputPattern: /\S+/, // 非空验证 inputErrorMessage: '角色类型不能为空' }).then(({ value }) => { // 创建新数据对象 const newItem = { date: nextId.value.toString(), // 序号 name: value, // 角色类型 status: true, // 默认启用状态 address: new Date().toLocaleString().replace(/\//g, '-') }; // 添加到表格数据开头 tableDataRef.value.unshift(newItem); // 重新排序所有数据 reindexData(); }).catch(() => { // 用户取消操作 }); } // 删除函数 const handleDelete = (rowDate: string) => { ElMessageBox.confirm('确定删除该条数据吗?', '警告', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { // 查找要删除项的索引 const index = tableDataRef.value.findIndex(item => item.date === rowDate); if (index !== -1) { // 从数据源中删除该项 tableDataRef.value.splice(index, 1); // 重新排序所有数据 reindexData(); } }).catch(() => { // 用户取消操作 }); } // 重新排序数据的函数 const reindexData = () => { // 重新排序所有数据的序号 tableDataRef.value.forEach((item, index) => { item.date = (index + 1).toString(); }); // 更新下一个ID值 nextId.value = tableDataRef.value.length + 1; // 重置搜索条件和分页 input1.value = ''; currentPage4.value = 1; } // 页码改变处理函数 const handleSizeChange = (val: number) => { pageSize4.value = val; currentPage4.value = 1; } // 编辑函数 const handleEdit = (rowDate: string) => { const row = tableDataRef.value.find(item => item.date === rowDate); if (!row) return; ElMessageBox.prompt('请输入新的角色类型名称', '编辑角色', { confirmButtonText: '确定', cancelButtonText: '取消', inputValue: row.name, // 预填充当前值 inputPattern: /\S+/, // 非空验证 inputErrorMessage: '角色类型不能为空' }).then(({ value }) => { // 更新角色名称 row.name = value; // 更新操作时间为当前时间 row.address = formatDate(new Date()); }).catch(() => { // 用户取消操作 }); } // 格式化日期 const formatDate = (date: Date): string => { const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); const seconds = date.getSeconds().toString().padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } const handleCurrentChange = (val: number) => { console.log(`current page: ${val}`) currentPage4.value = val; } const parentBorder = ref(false) const preserveExpanded = ref(false) </script> <template> <div class="template"> <div class="common-layout"> <el-container> <el-header class="header"> <!-- 左侧输入框 --> <el-input v-model="input1" style="width: 300px" size="large" placeholder="请输入租户名称" :suffix-icon="Search" clearable @keyup.enter="currentPage4 = 1" /> <!-- 右侧新建框 --> <el-button type="primary" @click="handleCreate">十 新建</el-button> </el-header> <!-- /主题内容 --> <el-main class="zhuti"> <!-- 响应式数据 --> <el-table :data="pagedData" height="550" style="width: 100%"> <el-table-column prop="date" label="序号" width="100" /> <el-table-column prop="name" label="角色类型" width="180" /> <el-table-column label="用户组状态" width="340" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" /> </template> </el-table-column> <el-table-column prop="address" label="操作时间" width="280" /> <el-table-column label="操作" width="300" class="tupian"> <template v-slot="scope"> <!-- 修改这里获取行数据 --> <img src="/image/bianji.png" alt="编辑" width="20px" style="margin-right: 30px; cursor: pointer;" @click="handleEdit(scope.row.date)"> <img src="/image/qunzu.png" alt="" width="20px" style="margin-right: 30px;"> <img src="/image/zengjia.png" alt="" width="20px" style="margin-right: 30px;"> <!-- 为删除图标添加点击事件 --> <img src="/image/shanchu.png" alt="删除" width="20px" style="margin-right: 30px; cursor: pointer;" @click="handleDelete(scope.row.date)"> </template> </el-table-column> <el-table-column :border="parentBorder" :preserve-expanded-content="preserveExpanded" /> </el-table> <!-- 分页器 --> <div class="demo-pagination-block fenyeqi"> <el-pagination background v-model:current-page="currentPage4" v-model:page-size="pageSize4" :page-sizes="[10, 20, 50, 100]" :total="filteredData.length" layout="total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </el-main> </el-container> </div> </div> </template> <style scoped></style> 拿我数据库的内容 数据库名称neiron HOST 为:localhost:39859。 数据库内容为: -- 创建数据库 CREATE DATABASE IF NOT EXISTS admin_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE admin_system; -- 创建管理员表 CREATE TABLE IF NOT EXISTS administrators ( id INT AUTO_INCREMENT PRIMARY KEY, admin_id VARCHAR(20) NOT NULL UNIQUE COMMENT '管理员编号', admin_name VARCHAR(50) NOT NULL COMMENT '管理员名称', login_time DATETIME NOT NULL COMMENT '登录时间', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', INDEX idx_admin_name (admin_name), INDEX idx_login_time (login_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='管理员登录记录表'; -- 插入测试数据的存储过程 DELIMITER $$ CREATE PROCEDURE generate_admin_data() BEGIN DECLARE i INT DEFAULT 1; DECLARE admin_name VARCHAR(50); DECLARE login_time DATETIME; -- 管理员类型列表 DECLARE admin_types VARCHAR(500) DEFAULT '系统管理员,超级系统管理员,网络管理员,数据库管理员,安全管理员,应用管理员,服务器管理员,高级系统管理员,蔡徐坤,程立农,一只小风华'; WHILE i <= 100 DO -- 生成随机管理员名称 IF i = 1 THEN SET admin_name = '系统管理员:超级管理员'; ELSE SET admin_name = TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(admin_types, ',', FLOOR(1 + RAND() * 11)), ',', -1)); END IF; -- 生成2022年的随机时间 SET login_time = CONCAT( '2022-', LPAD(FLOOR(1 + RAND() * 12), 2, '0'), '-', LPAD(FLOOR(1 + RAND() * 28), 2, '0'), ' ', LPAD(FLOOR(RAND() * 24), 2, '0'), ':', LPAD(FLOOR(RAND() * 60), 2, '0'), ':', LPAD(FLOOR(RAND() * 60), 2, '0') ); -- 插入数据 INSERT INTO administrators (admin_id, admin_name, login_time) VALUES ( CONCAT('ADM', LPAD(i, 5, '0')), admin_name, login_time ); SET i = i + 1; END WHILE; END$$ DELIMITER ; -- 执行存储过程生成数据 CALL generate_admin_data(); -- 删除存储过程 DROP PROCEDURE IF EXISTS generate_admin_data; -- 查询示例 SELECT * FROM administrators ORDER BY login_time DESC LIMIT 10; -- 常用的查询语句示例 -- 1. 按管理员名称查询 SELECT * FROM administrators WHERE admin_name LIKE '%系统管理员%'; -- 2. 按时间范围查询 SELECT * FROM administrators WHERE login_time BETWEEN '2022-01-01 00:00:00' AND '2022-12-31 23:59:59'; -- 3. 统计每个管理员的登录次数 SELECT admin_name, COUNT(*) as login_count FROM administrators GROUP BY admin_name ORDER BY login_count DESC; -- 4. 按月统计登录次数 SELECT DATE_FORMAT(login_time, '%Y-%m') as month, COUNT(*) as login_count FROM administrators GROUP BY DATE_FORMAT(login_time, '%Y-%m') ORDER BY month;
09-09
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值