简易的GUI图书管理系统(数据库Mysql)
简易的GUI图书管理系统(数据库Mysql)
基本的思路就是一个Mysql的连接工具类,然后就是GUI图形界面显示。我这里主要是使用了DefaultTableModel来添加行数据
图片资源:在setbag中图片可自行寻找。随时替换
一个完善的图书管理系统必须具备的:
1、登录界面
2、显示图书界面
3、操作界面
4、显示操作后的图书界面
那么我们直接来看代码:
connect连接类:
package com.library.liuzhi;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.spi.DirStateFactory.Result;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
/*
* author:Mr.Liu
* date:2020/5/22 10:33
* 在conn_tool中加上基本的增删改查功能
*/
public class conn_tool {
Statement statement;
Connection conn;
public static void main(String[] args) throws Exception {
new conn_tool();
}
public conn_tool() throws Exception {
// 驱动程序名
String driver = "com.mysql.jdbc.Driver";
// URL指向要访问的数据库名Database(注意红色的地方是在插入数据库数据交互时(比如:中文 在数据库显示:???)避免乱码使用了UTF-8)
String url = "jdbc:mysql://localhost:3306/Liuzhi? useUnicode=true&characterEncoding=utf8";
// MySQL配置时的用户名
String username = "root";
// MySQL配置时的密码
String password = "root";
// 加载驱动程序
Class.forName(driver);
// 连续数据库
conn = DriverManager.getConnection(url, username, password);
if (!conn.isClosed()) {
System.out.println("Succeeded connecting to the Database!");
}
}
//添加用户名和密码
public void add_admin(String username, String password) {
try {
// statement用来执行SQL语句
if (!username.equals("") && !password.equals("")) {
String sql = "INSERT INTO admin VALUES ('" + username + "',"
+ "'" + password + "')";
try {
statement = conn.createStatement();
statement.execute(sql);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, "用户名已存在", "Tips",
JOptionPane.ERROR_MESSAGE);
}
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//更新修改数据
public void select_query(String book_con, String book_name,
String book_price) {
try {
statement = conn.createStatement();
// UPDATE library_store SET book_name='Paaa',book_price='10' WHERE
// book_con=001
String sql = "UPDATE library_store SET book_name='" + book_name
+ "',book_price='" + book_price + "'" + " WHERE book_con="
+ book_con;
statement = conn.createStatement();
int count=statement.executeUpdate(sql);
if(count>0){
JOptionPane.showMessageDialog(null, "更新成功", "Tips",
JOptionPane.OK_CANCEL_OPTION);
}else{
JOptionPane.showMessageDialog(null, "更新失败(编号不存在)", "Tips",
JOptionPane.ERROR_MESSAGE);
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//添加图书信息
public boolean add_bookstore(String book_name, String book_con,
String book_price) {
try {
// statement用来执行SQL语句
if (!book_name.equals("") && !book_con.equals("")
&& !book_price.equals("")) {
statement=conn.createStatement();
String sql = "INSERT INTO library_store VALUES ('" + book_name
+ "'," + "'" + book_con + "','" + book_price + "')";
int count=statement.executeUpdate(sql);
if(count>0){
JOptionPane.showMessageDialog(null, "添加数据成功", "Tips",
JOptionPane.OK_CANCEL_OPTION);
}else{
JOptionPane.showMessageDialog(null, "添加失败(编号重复)", "Tips",
JOptionPane.ERROR_MESSAGE);
}
return true;
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, "图书编号已存在", "Tips",
JOptionPane.ERROR_MESSAGE);
}
return false;
}
//刷新数据库数据
public ResultSet update_bookstore() throws Exception {
// statement用来执行SQL语句
statement = conn.createStatement();
String sql = "SELECT * FROM library_store";
ResultSet result = statement.executeQuery(sql);
return result;
}
//删除数据库行数据
public void delete_data(String data) {
// statement用来执行SQL语句
try {
statement = conn.createStatement();
String sql = "DELETE FROM library_store WHERE book_con=" + data;
statement = conn.createStatement();
int count=statement.executeUpdate(sql);
if(count>0){
JOptionPane.showMessageDialog(null, "成功删除", "Tips",
JOptionPane.OK_CANCEL_OPTION);
}else{
JOptionPane.showMessageDialog(null, "编号不存在", "Tips",
JOptionPane.ERROR_MESSAGE);
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// DELETE FROM library_store WHERE book_con=001
}
public boolean Login_Test(String username, String password) {
try {
// statement用来执行SQL语句
statement = conn.createStatement();
String sql = "SELECT username,passwords FROM admin WHERE username='"
+ username + "' AND" + " passwords='" + password + "'";
ResultSet result = statement.executeQuery(sql);
while (result.next()) {
String user = result.getString("username");
String pass = result.getString("passwords");
if (user.equals(username) && pass.equals(password)) {
return true;
} else {
return false;
}
}
result.close();
conn.close();
return false;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
}
2、界面登录
package com.library.liuzhi;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Login_view extends JFrame{
JButton select, reseach;
JLabel jl1,jl2;
JTextField jt1,jt2;
static Login_view log;
public static void main(String[] args) {
log=new Login_view();
}
public Login_view(){
this.setDefaultCloseOperation(0);
this.setSize(new Dimension(450, 450));
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否退出图书管理系统界面";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出管理系统界面",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
jl1=new JLabel("用 户 名:");
jt1=new JTextField(30);
jl1.setBounds(50, 120, 50, 50);
jt1.setBounds(120, 135, 250, 20);
this.add(jl1);
this.add(jt1);
jl2=new JLabel("密 码:");
jt2=new JTextField(30);
jl2.setBounds(50, 180, 50, 50);
jt2.setBounds(120, 195, 250, 20);
this.add(jl2);
this.add(jt2);
select = new JButton("Login");
select.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
boolean flag=new conn_tool().Login_Test(jt1.getText(), jt2.getText());
if(flag){
jt1.setText("");
jt2.setText("");
JOptionPane.showMessageDialog(null, "登录成功", "Tips", JOptionPane.OK_CANCEL_OPTION);
log.dispose();
new book_store().setVisible(true);
}
else{
JOptionPane.showMessageDialog(null, "账号或密码不存在", "Tips", JOptionPane.ERROR_MESSAGE);
jt1.setText("");
jt2.setText("");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
reseach = new JButton("Register");
reseach.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
new conn_tool().add_admin(jt1.getText(), jt2.getText());
jt1.setText("");
jt2.setText("");
} catch (Exception e) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(null, "用户名已存在", "Tips",JOptionPane.OK_CANCEL_OPTION);
}
}
});
select.setBounds(120, 280, 100, 30);
reseach.setBounds(250, 280, 100, 30);
this.add(select);
this.add(reseach);
this.setVisible(true);
setbg();
}
public void setbg(){
((JPanel)this.getContentPane()).setOpaque(false);
ImageIcon img = new ImageIcon("../com.liuzhi.test/1.jpeg");
JLabel background = new JLabel(img);
this.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
}
}
3、显示图书信息界面
package com.library.liuzhi;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagLayout;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeMap;
import java.util.Vector;
import java.util.concurrent.BrokenBarrierException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.border.EmptyBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.text.html.HTMLDocument.Iterator;
import org.junit.Test;
public class book_store extends JFrame {
/**
* @param args
*/
JButton select, add, delete, update;
static book_store book;
DefaultTableModel tableModel;
JTable ja;
JTextField jt;
JLabel jl, j2, j3, j4;
boolean flush_flag = true;
public book_store() {
this.setTitle("Library Store");
this.setDefaultCloseOperation(0);
this.setSize(new Dimension(600, 600));
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否退出图书管理系统界面";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出管理系统界面",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
jl = new JLabel("XXXX图书借阅系统");
jl.setBounds(230, 30, 150, 30);
j2 = new JLabel("图书名称");
j2.setBounds(140, 70, 150, 30);
j3 = new JLabel("图书编号");
j3.setBounds(270, 70, 150, 30);
j4 = new JLabel("图书价格");
j4.setBounds(400, 70, 150, 30);
this.add(jl);
this.add(j2);
this.add(j3);
this.add(j4);
ja = new JTable(0, 3);
tableModel = (DefaultTableModel) ja.getModel();
ja.setBounds(100, 100, 390, 390);
DefaultTableCellRenderer r = new DefaultTableCellRenderer();
r.setHorizontalAlignment(JLabel.CENTER);
ja.setDefaultRenderer(Object.class, r);
ja.setEnabled(false);
this.add(ja);
update = new JButton("Updata");
update.setBounds(50, 500, 120, 30);
add = new JButton("Add");
add.setBounds(175, 500, 120, 30);
delete = new JButton("Delete");
delete.setBounds(300, 500, 120, 30);
select = new JButton("Flush");
select.setBounds(425, 500, 120, 30);
this.add(select);
this.add(add);
this.add(delete);
this.add(update);
onClickListerner(add, 1);
onClickListerner(update, 2);
onClickListerner(delete, 3);
onClickListerner(select, 4);
this.setVisible(true);
setbg();
}
//添加行数据
public void add_row(String bookname, String bookcon, String bookprice) {
tableModel = (DefaultTableModel) ja.getModel();
Object[] all = { bookname, bookcon, bookprice };
tableModel.addRow(all);
}
static boolean flag = true;
static ResultSet result;
public void onClickListerner(JButton click, int i) {
switch (i) {
// 数据表显示增加后的数据
case 1:
click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
flag = true;
new book_add_store().setVisible(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
break;
// 数据表显示所有的被查找的数据
case 2:
click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
flag = true;
new modify_panle().setVisible(true);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
break;
// 数据表显示删除操作后的数据
case 3:
click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
/* 清空数据集合 */
flag = true;
new delete_panle();
}
});
break;
// 刷新整个数据表
case 4:
click.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (flag)
try {
/* 清空数据集合 */
((DefaultTableModel) ja.getModel()).getDataVector()
.clear();
conn_tool tool = new conn_tool();
result = tool.update_bookstore();
while (result.next()) {
String bookname = result.getString("book_name");
String bookcon = result.getString("book_con");
String bookprice = result
.getString("book_price");
add_row(bookname, bookcon, bookprice);
}
flag = false;
result.close();
tool.conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
break;
default:
break;
}
}
//设置窗体背景
public void setbg() {
((JPanel) this.getContentPane()).setOpaque(false);
ImageIcon img = new ImageIcon("../com.liuzhi.test/图片.jpeg");
JLabel background = new JLabel(img);
this.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
background.setBounds(0, 0, img.getIconWidth(), img.getIconHeight());
}
}
//删除操作界面
class delete_panle extends JFrame{
JTextField jt1;
JLabel jl;
JButton ok;
public delete_panle(){
this.setDefaultCloseOperation(0);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setSize(new Dimension(300, 300));
this.setLayout(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否退出图书编号删除界面";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出图书编号删除界面",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
dispose();// 本窗口销毁,释放内存资源// 退出
}
}
});
jl = new JLabel("编号删除");
jl.setBounds(120, 70, 150, 30);
jt1 = new JTextField();
jt1.setBounds(20, 135, 250, 20);
ok = new JButton("确定");
ok.setBounds(100, 180, 80, 20);
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
conn_tool tool=new conn_tool();
tool.delete_data(jt1.getText());
tool.conn.close();
dispose();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
this.add(ok);
this.add(jl);
this.add(jt1);
this.setVisible(true);
}
}
//更新操作界面
class modify_panle extends JFrame {
JTextField jt1, jt2, jt3;
JLabel jl, j2, j3, j4;
JButton ok;
public modify_panle() {
this.setDefaultCloseOperation(0);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setSize(new Dimension(450, 450));
this.setLayout(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否退出图书修改界面";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出修改界面",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
dispose();// 本窗口销毁,释放内存资源// 退出
}
}
});
jl = new JLabel("xxx图书修改界面");
jl.setBounds(150, 30, 150, 30);
j2 = new JLabel("图书名称");
j3 = new JLabel("图书编号");
j4 = new JLabel("图书价格");
jt1 = new JTextField();
jt2 = new JTextField();
jt3 = new JTextField();
j2.setBounds(50, 180, 80, 50);
jt1.setBounds(120, 135, 250, 20);
j3.setBounds(50, 120, 80, 50);
jt2.setBounds(120, 195, 250, 20);
j4.setBounds(50, 240, 80, 50);
jt3.setBounds(120, 255, 250, 20);
ok = new JButton("确定");
ok.setBounds(190, 315, 80, 20);
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
conn_tool tool = new conn_tool();
tool.select_query(jt1.getText(), jt2.getText(),
jt3.getText());
dispose();
tool.conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
this.add(ok);
this.add(jl);
this.add(j2);
this.add(j3);
this.add(j4);
this.add(jt1);
this.add(jt2);
this.add(jt3);
this.setVisible(true);
}
}
//添加操作界面
class book_add_store extends JFrame {
JTextField jt1, jt2, jt3;
JLabel jl, j2, j3, j4;
JButton ok;
public book_add_store() {
this.setDefaultCloseOperation(0);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setSize(new Dimension(450, 450));
this.setLayout(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否退出图书添加界面";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出添加界面",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
dispose();// 本窗口销毁,释放内存资源// 退出
}
}
});
jl = new JLabel("xxx图书添加界面");
jl.setBounds(150, 30, 150, 30);
j2 = new JLabel("图书名称");
j3 = new JLabel("图书编号");
j4 = new JLabel("图书价格");
jt1 = new JTextField();
jt2 = new JTextField();
jt3 = new JTextField();
j2.setBounds(50, 120, 80, 50);
jt1.setBounds(120, 135, 250, 20);
j3.setBounds(50, 180, 80, 50);
jt2.setBounds(120, 195, 250, 20);
j4.setBounds(50, 240, 80, 50);
jt3.setBounds(120, 255, 250, 20);
ok = new JButton("确定");
ok.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
try {
conn_tool tool = new conn_tool();
boolean ll=tool.add_bookstore(jt1.getText(), jt2.getText(), jt3.getText());
dispose();
tool.conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
ok.setBounds(190, 315, 80, 20);
this.add(ok);
this.add(jl);
this.add(j2);
this.add(j3);
this.add(j4);
this.add(jt1);
this.add(jt2);
this.add(jt3);
this.setVisible(false);
}
}
结尾:一个简单的图形界面图书管理系统就做好了,有些地方可能还没做好,希望大家可以指正出来,毕竟学习是无止境的!!!
简易的GUI图书管理系统(数据库Mysql)相关推荐
- 基于 Java+MySQL 的桌面 GUI 图书管理系统【100010417】
基于 Java 的桌面 GUI 图书管理系统 第一章 绪论 1.1 编写目的 明确图书管理系统的详细需求,提供使用单位确认系统的功能和性能,作为软件设计人员的设计依据和使用单位的验收标准,对图书管理系 ...
- java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试
java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计图书管理系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构:B/S架构 开 ...
- 图书管理系统数据库综合应用
图书管理系统数据库综合练习用到下面三个关系表: CARD 借书卡. CNO 卡号,NAME 姓名,CLASS 班级 BOOKS 图书. BNO 书号,BNAME ...
- 图书管理系统-数据库设计
选题背景 依照图书管理系统的要求,完成如下任务 设计适合此应用需求的规范化的数据库: 建立ODBC数据源: 创建数据库连接: 制作一个具有安全性控制(权限管理和视图管理等)的数据库访问程序. 数据项 ...
- 【JavaSE】图书管理系统之MySQL版本
目录 一.项目演示 1. 数据库数据演 2.管理员 3.用户 1.登录注册 2.借阅与归还数据库变换 二.项目分析 三.环境 1.ideal 2.MySQL5.7 3.数据库驱动包 四. ...
- ASP.NET MVC CODE FIRST 图书管理系统 数据库
ASP .NET MVC CODE FIRST 图书管理系统 本项目最后更新于2018-7-4,可能会因为没有更新而失效.如已失效或需要修正,请提issue! 我使用VS2017进行开发,框架是.NE ...
- 图书管理系统 数据库课程实验设计
本课设系软件工程大二学生作,拙笔狂言,恭请斧正. 开发工具:Eclipse 2020-12,Microsoft SQL server 2012 程序语言:Java 引 言 选题题目:图书管理系统 选题 ...
- C# 图书管理系统(MySQL)——属性设计(三)
目录 1.窗体Form属性设计 2. 文本框控件:TextBox(输入用户名及密码) 3.单选按钮控件:RadioButton 4.按钮 :Button 5.下拉框:comboBox 1.窗体Form ...
- 橘猫图书管理系统--数据库原理期末项目
需求分析 图书馆作为文学的聚集地和展示平台,书籍是从古至今文化传递记载的介质.图书馆是高校不可缺少的基础设施,图书馆管理系统是图书馆正常运转的关键.此次数据库课程设计采用C++语言编写程序,实现图书登 ...
最新文章
- SpringSide 3 中的 Struts 2
- 华为mate20 android,华为MateRS对比华为mate20RS,终于让安卓手机坐上了头等舱!
- 牛客网题目——不用四则运算符号,计算两个数字的和
- Okhttp使用简析——Android网络请求框架(一)
- 倾心家教安卓案例开发代码_开发一个APP多少钱?
- markdown的基础语言
- 常见电容器图片_工业机器视觉的常见应用与施努卡VisionMax视觉系统介绍
- 计算机二级java邓伦单_2010年3月计算机等级考试二级Java笔试试题(文字版)
- 阿里面试记录-程序上机
- python银行排队系统仿真_单片机实现银行排队叫号系统Proteus仿真
- Excel导入SQL datetime的处理
- 2021年8月NOC全国中小学信息技术创新与实践大赛 软件创意编程小学高年级组Python决赛题解析
- lattice开发错误集合
- 快速幂与快速矩阵幂(以大数下的斐波那契数列为例)
- h5打开麦克风权限录音_微信H5录音实现
- python作业-5
- 虚拟现实技术需要学计算机吗,虚拟现实学习要掌握哪些核心技术
- [生存志] 第67节 夫差信谗杀伍员
- w311m linux驱动下载,腾达W311MI网卡驱动
- 常见的作业调度和进程调度算法
热门文章
- 告别 .com网址时代,Opera浏览器实现用Emoji符号打开网站
- 计算机安全原理与实践第3版PDF,windows安全原理与技术.pdf
- 简单易懂的理解java开发中的 DO、BO、DTO、VO、AO都是什么✌
- 腾讯2022应届生校招总包40W
- 清华张钹院士专刊文章:迈向第三代人工智能(全文收录)
- Pycharm专业版最新版下载安装(社区版和专业版并存)
- 车载网络技术详解 —— 车载网络系统基础(✨您绝不可错过的呕心力作✨)
- Windows 10系统如何添加网络打印机?
- 财报汇总 | 可口可乐、埃森哲、圆通、海亮教育等9家企业发布业绩
- 面试连环炮之分布式锁