实验室记账项目(java+Mysql+jdbc)
前言:
因为自己学习能力有限和特殊情况必须要找一个项目来做,但是上网搜的那些项目有两种(一种是技术太多,自己能力不够;一种是技术太少,项目太简单)导致都不适合本人,本人现有技术只有Mysql和java和jdbc,因此就自己搞了一个项目,用来当作账本用;
时间太短,不能保证健壮性和效率(见谅),我在文章中会提到哪里可以优化(蓝色部分),我是真的没时间了,你们感兴趣了可以自己设计。
功能
此账本系统包括用户登录和记账记录,所有信息都会存到数据库中。
用户的姓名、密码等信息;记账的时间、原因、人物等都会涉及
包括:添加新成员、删除成员、汇入资金、使用资金、查询余额、查询记录、修改密码
数据库和表的设计
create database laboratory_charge;
use laboratory_charge;/*** 创建学生表* 姓名 学号 班级*/
create table stu_info(name varchar(10) primary key,stu_id varchar(15),grade varchar(20));/** 创建实验室成员表* 姓名 网名 密码 */
create table lab_member(name varchar(10) ,vir_name varchar(10),password varchar(20),constraint lab_member_name foreign key (name) references stu_info(name)
);create table Balance(balance decimal(8,2),charge_number int primary key auto_increment);/*** 创建记账记录* 姓名 时间 原因 使用金额 汇入金额 剩余资金 借款编号
*/
create table charge_list(charge_number int primary key auto_increment,name varchar(10) not null,reason varchar(255),time date ,u_money decimal(8,2),a_money decimal(8,2),balance decimal(8,2));alter table charge_list modify u_money decimal(8,2) default 0;alter table charge_list modify a_money decimal(8,2) default 0;
共包含四张表
学生信息表
name varchar(10) primary key:name作为主键约束,且不能为空也不能重复,在之后的实验室成员表中会关联到它的name;
stu_id varchar(15):学生的学号
grade varchar(20):学生的年级信息
实验室成员表
name varchar(10) :没什么可说的,一会要关联
vir_name varchar(10):网名信息
password varchar(20):登录的密码
constraint lab_member_name foreign key (name) references stu_info(name):关联操作,因为当时的想法是一定先有学生才有的实验室成员嘛。
记账记录
charge_number int primary key auto_increment:自增长列且不重复的实验室编号
name varchar(10) not null:名字
reason varchar(255):记账的原因,你是因为什么想要改变资金的
time date :记录时间,与Java中sql包下的date一个类型
u_money decimal(8,2):使用的金额,我在之后对他进行了修改(默认值为0,因为用了这两个中的任意一个,另一个绝对为0),其实应该用double的,单都差不多,主要是因为java里面只能用double(我的技术问题)。
a_money decimal(8,2):同上
balance decimal(8,2):记录实验室剩余金额
修改默认值为0的操作
alter table charge_list
modify u_money decimal(8,2) default 0;
alter table charge_list
modify a_money decimal(8,2) default 0;
余额记录
create table Balance(
balance decimal(8,2),//经过第几次账本记录后剩余的金额
charge_number int primary key auto_increment//记录账本记录的次数,本来应该关联一下记账表中的此字段的,但是时间不够,没来及多想
);
java中代码的实现
import com.mysql.cj.jdbc.Driver;
import java.sql.*;
import java.sql.Date;
import java.util.*;/*** ClassName: ${NAME}** @author 奈奈朵* @vesion 17* @Create 2024/2/26 19:22*/
public class Main {public static final Scanner scan = new Scanner(System.in);public static void main(String[] args) throws SQLException, ClassNotFoundException {Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/laboratory_charge","root","121400bjy.");Statement statement = connection.createStatement();try {menu(statement);}finally {connection.close();statement.close();scan.close();};}public static void menu(Statement statement) throws SQLException, ClassNotFoundException {
// DriverManager.registerDriver(new Driver());
// new Driver();boolean judge = true;System.out.println("*****欢迎使用实验室记账系统*****");System.out.println("******************************");while(judge) {System.out.println(" 1.登录 2.退出 3.新用户 ");int cho = scan.nextInt();String master = null;if (cho != 3) {while (true) {if (cho != 2) {System.out.println("请输入用户名:");String username = scan.next();master = username;System.out.println("请输入你的密码:");String password = scan.next();String sql = "select lm.password\n" +"from lab_member lm\n" +"where lm.name = '" + username + "'";ResultSet resultSet = statement.executeQuery(sql);String truepw = null;while (resultSet.next()) {truepw = resultSet.getString("password");System.out.println(truepw);}if (password.equals(truepw)) {System.out.println("*****登陆成功,欢迎使用!*****");menu1(statement,master);break;} else {System.out.println("密码错误!请选择");System.out.println(" 1.登录 2.退出 ");cho = scan.nextInt();if (cho == 2) {return;}}} else {return;}}}else {addmember(statement);}}}public static void menu1(Statement statement ,String master) throws SQLException {if ("小羽".equals(master)) {while (true) {System.out.println("--1.邀请成员 2.踢出成员--");System.out.println("--3.资金汇入 4.资金支出--");System.out.println("--5.查询余额 6.修改密码--");System.out.println("--7.查询记录 8.退出 --");System.out.println("选择你要执行的业务:");int choose = scan.nextInt();switch (choose) {case 1:addmember(statement);break;case 2:deletemember(statement);break;case 3:abmoney(statement);break;case 4:usmoney(statement);break;case 5:double balance = 0;balance = getBalance(statement);System.out.println("实验室剩余资金为"+ balance +"元!");break;case 6:modifypas(statement,master);break;case 7:alllist(statement);break;case 8:break;}if (choose == 8) {break;}}} else {while (true) {System.out.println("--1.资金汇入 2.资金支出--");System.out.println("--3.查询余额 4.修改密码--");System.out.println("--5.查询记录 6.退出 --");System.out.println("选择你要执行的业务:");int choose = scan.nextInt();switch (choose) {case 1:abmoney(statement);break;case 2:usmoney(statement);break;case 3:double balance = 0;balance = getBalance(statement);System.out.println("实验室剩余资金为"+ balance +"元!");break;case 4:modifypas(statement,master);break;case 5:alllist(statement);break;case 6:break;}if (choose == 6) {break;}}}}/*** 添加新成员**/public static void addmember(Statement statement) throws SQLException {System.out.println("正在创建新用户!");System.out.println("请输入你的姓名:");String username = scan.next();System.out.println("请输入你的密码(不能超过20个字符):");String password = scan.next();System.out.println("请输入你的网名:");String vir_name = scan.next();System.out.println("请输入你的学号:");String stu_id= scan.next();System.out.println("请输入你的班级信息:");String grade= scan.next();String sql1 = "insert into stu_info values('"+username+"','" + stu_id + "','" +grade + "');";String sql2 = "insert into lab_member values('"+username+"','" + vir_name + "','" +password + "');";int i = statement.executeUpdate(sql1);int j = statement.executeUpdate(sql2);System.out.println("创建成功!");}/*** 删除成员* @param statement* @throws SQLException*/public static void deletemember(Statement statement) throws SQLException {System.out.println("请输入删除姓名:");String username = scan.next();String sql1 ="delete from lab_member \n" +"where name = '"+ username +"';";String sql2 ="delete from stu_info \n" +"where name = '"+ username +"';";int i = statement.executeUpdate(sql1);int j = statement.executeUpdate(sql2);System.out.println("删除成功!");}/*** 汇入资金* @param statement* @throws SQLException*/public static void abmoney(Statement statement) throws SQLException {System.out.println("你的姓名是:");String name = scan.next();System.out.println("原因:");String reason = scan.next();System.out.println("所汇入的金额为:");double money = scan.nextDouble();double balance = getBalance(statement)+money;Date date = null;String sqlGetTime = "select current_date() ;";ResultSet resultSet = statement.executeQuery(sqlGetTime);while(resultSet.next()){date = resultSet.getDate(1);}String sql = "insert into charge_list (name,reason,time,u_money,a_money,balance)\n" +"values(\n" +"'毕竞羽',\n" +"'"+reason+"',\n" +"'"+date+"',\n" +"0,\n" +money+",\n" +balance+"\n" +");";int i = statement.executeUpdate(sql);sql = "insert into Balance (balance)\n" +"values(\n" +balance+"\n" +")";int j = statement.executeUpdate(sql);System.out.println("记录成功!");}/*** 使用资金* @param statement* @throws SQLException*/public static void usmoney(Statement statement) throws SQLException {System.out.println("你的姓名是:");String name = scan.next();System.out.println("原因:");String reason = scan.next();System.out.println("所申请的金额为:");double money = scan.nextDouble();double balance = getBalance(statement)-money;Date date = null;String sqlGetTime = "select current_date() ;";ResultSet resultSet = statement.executeQuery(sqlGetTime);while(resultSet.next()){date = resultSet.getDate(1);}String sql = "insert into charge_list (name,reason,time,u_money,a_money,balance)\n" +"values(\n" +"'毕竞羽',\n" +"'"+reason+"',\n" +"'"+date+"',\n" +money+",\n" +"0,\n" +balance+"\n" +");";int i = statement.executeUpdate(sql);sql = "insert into Balance (balance)\n" +"values(\n" +balance+"\n" +")";int j = statement.executeUpdate(sql);System.out.println("记录成功!");}/*** 查询余额* @param statement* @return* @throws SQLException*/public static double getBalance(Statement statement) throws SQLException {String sql = "select b.balance\n" +"from balance b \n" +"order by charge_number desc \n" +"limit 0,1;";ResultSet resultSet = statement.executeQuery(sql);double money =0;while(resultSet.next()){money = resultSet.getDouble("balance");}return money;}/**修改密码*/public static void modifypas(Statement statement,String name) throws SQLException {String password = null;while(true){System.out.println("请输入新密码:");password = scan.next();System.out.println("请再次确认新密码:");String copy_password1 = scan.next();if(password.equals(copy_password1)){break;}else{System.out.println("两次密码不相同!请重新操作:");}}String sql = "\n" +"update lab_member \n" +"set password = '"+ password +"' \n" +"where name = '"+ name +"';";int i = statement.executeUpdate(sql);System.out.println("修改成功!");};/*** 账单* @param statement*/public static void alllist(Statement statement) throws SQLException {String sql = "select * \n" +"from charge_list ;";ResultSet resultSet = statement.executeQuery(sql);List<Map> list= new ArrayList<Map>();ResultSetMetaData metaData = resultSet.getMetaData();int clumn = metaData.getColumnCount();while(resultSet.next()){Map map = new HashMap();for (int i = 1; i < clumn; i++) {Object value = resultSet.getObject(i);String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,value);}list.add(map);}System.out.println(list);}
}
主方法
先注册驱动,创建连接,创建小汽车(之后的每次往返都用这个小汽车);
并且把关闭资源的操作全放在finally中。
注册驱动的方法不限,你想怎么注册就怎么注册,能用就行
这里的小汽车statement应该用prepareStatement代替,它的好处我不多说了,所以可以优化一下
Class.forName("com.mysql.cj.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/laboratory_charge","root","121400bjy.");Statement statement = connection.createStatement();try {menu(statement);}finally {connection.close();statement.close();scan.close();};
菜单一
最初的界面
这个过程存在这样的问题:就是登录失败后,他不会保留原来的名字,而是让你重新输入名字和账号,所以感兴趣的人这里可以优化一下让使用更方便
public static void menu(Statement statement) throws SQLException, ClassNotFoundException {
// DriverManager.registerDriver(new Driver());
// new Driver();boolean judge = true;System.out.println("*****欢迎使用实验室记账系统*****");System.out.println("******************************");while(judge) {System.out.println(" 1.登录 2.退出 3.新用户 ");int cho = scan.nextInt();String master = null;if (cho != 3) {while (true) {if (cho != 2) {System.out.println("请输入用户名:");String username = scan.next();master = username;System.out.println("请输入你的密码:");String password = scan.next();String sql = "select lm.password\n" +"from lab_member lm\n" +"where lm.name = '" + username + "'";ResultSet resultSet = statement.executeQuery(sql);String truepw = null;while (resultSet.next()) {truepw = resultSet.getString("password");System.out.println(truepw);}if (password.equals(truepw)) {System.out.println("*****登陆成功,欢迎使用!*****");menu1(statement,master);break;} else {System.out.println("密码错误!请选择");System.out.println(" 1.登录 2.退出 ");cho = scan.nextInt();if (cho == 2) {return;}}} else {return;}}}else {addmember(statement);}}}
菜单二
还记得我为什么传进去登陆姓名master吗,我定义里应该是只要是小羽,他的菜单就比别人多两个功能(增删成员),所以说小羽这个字符串可以更改为你认为的主人。
这里的查询余额操作之所以单独做了有返回值的出来是因为资金汇入和支出的方法里会使用到他。
有没有感觉我while用了好多,你可以自己想你的思路,优化代码。
public static void menu1(Statement statement ,String master) throws SQLException {if ("小羽".equals(master)) {while (true) {System.out.println("--1.邀请成员 2.踢出成员--");System.out.println("--3.资金汇入 4.资金支出--");System.out.println("--5.查询余额 6.修改密码--");System.out.println("--7.查询记录 8.退出 --");System.out.println("选择你要执行的业务:");int choose = scan.nextInt();switch (choose) {case 1:addmember(statement);break;case 2:deletemember(statement);break;case 3:abmoney(statement);break;case 4:usmoney(statement);break;case 5:double balance = 0;balance = getBalance(statement);System.out.println("实验室剩余资金为"+ balance +"元!");break;case 6:modifypas(statement,master);break;case 7:alllist(statement);break;case 8:break;}if (choose == 8) {break;}}} else {while (true) {System.out.println("--1.资金汇入 2.资金支出--");System.out.println("--3.查询余额 4.修改密码--");System.out.println("--5.查询记录 6.退出 --");System.out.println("选择你要执行的业务:");int choose = scan.nextInt();switch (choose) {case 1:abmoney(statement);break;case 2:usmoney(statement);break;case 3:double balance = 0;balance = getBalance(statement);System.out.println("实验室剩余资金为"+ balance +"元!");break;case 4:modifypas(statement,master);break;case 5:alllist(statement);break;case 6:break;}if (choose == 6) {break;}}}}
添加新成员
因为数据库中学生表的name和实验室成员表中name关联的影响,所以我们创建新用户时要先向学生表插入信息再向实验室成员表中插入信息。
这里的方法也有问题:创建的新成员名字如果和已存在的成员名重复,那么它会直接报错,所以其实可以优化,先查询这个新用户的名字是否已存在表中,根据结果进行之后的操作
另外就是,我们其实可以先向数据库发送创建触发器的指令,再插入实验室成员表前插入学生表,就不用再java里编写2个sql语句发送了。
public static void addmember(Statement statement) throws SQLException {System.out.println("正在创建新用户!");System.out.println("请输入你的姓名:");String username = scan.next();System.out.println("请输入你的密码(不能超过20个字符):");String password = scan.next();System.out.println("请输入你的网名:");String vir_name = scan.next();System.out.println("请输入你的学号:");String stu_id= scan.next();System.out.println("请输入你的班级信息:");String grade= scan.next();String sql1 = "insert into stu_info values('"+username+"','" + stu_id + "','" +grade + "');";String sql2 = "insert into lab_member values('"+username+"','" + vir_name + "','" +password + "');";int i = statement.executeUpdate(sql1);int j = statement.executeUpdate(sql2);System.out.println("创建成功!");}
删除成员
我们其实可以先向数据库发送创建触发器的指令,在插入学生表前先删除实验室成员表,就不用再java里编写2个sql语句发送了。和添加一样的优化
如果删除的成员名字不在表中会进行报错,所以这里也可以优化,而且优化很大,交给你们了
public static void deletemember(Statement statement) throws SQLException {System.out.println("请输入删除姓名:");String username = scan.next();String sql1 ="delete from lab_member \n" +"where name = '"+ username +"';";String sql2 ="delete from stu_info \n" +"where name = '"+ username +"';";int i = statement.executeUpdate(sql1);int j = statement.executeUpdate(sql2);System.out.println("删除成功!");}
汇入资金
先用方法得到汇入资金后的剩余余额,因为在记录中会要求导入剩余余额,其他的不难理解
public static void abmoney(Statement statement) throws SQLException {System.out.println("你的姓名是:");String name = scan.next();System.out.println("原因:");String reason = scan.next();System.out.println("所汇入的金额为:");double money = scan.nextDouble();double balance = getBalance(statement)+money;Date date = null;String sqlGetTime = "select current_date() ;";ResultSet resultSet = statement.executeQuery(sqlGetTime);while(resultSet.next()){date = resultSet.getDate(1);}String sql = "insert into charge_list (name,reason,time,u_money,a_money,balance)\n" +"values(\n" +"'毕竞羽',\n" +"'"+reason+"',\n" +"'"+date+"',\n" +"0,\n" +money+",\n" +balance+"\n" +");";int i = statement.executeUpdate(sql);sql = "insert into Balance (balance)\n" +"values(\n" +balance+"\n" +")";int j = statement.executeUpdate(sql);System.out.println("记录成功!");}
使用资金
和汇入资金差不多
public static void usmoney(Statement statement) throws SQLException {System.out.println("你的姓名是:");String name = scan.next();System.out.println("原因:");String reason = scan.next();System.out.println("所申请的金额为:");double money = scan.nextDouble();double balance = getBalance(statement)-money;Date date = null;String sqlGetTime = "select current_date() ;";ResultSet resultSet = statement.executeQuery(sqlGetTime);while(resultSet.next()){date = resultSet.getDate(1);}String sql = "insert into charge_list (name,reason,time,u_money,a_money,balance)\n" +"values(\n" +"'毕竞羽',\n" +"'"+reason+"',\n" +"'"+date+"',\n" +money+",\n" +"0,\n" +balance+"\n" +");";int i = statement.executeUpdate(sql);sql = "insert into Balance (balance)\n" +"values(\n" +balance+"\n" +")";int j = statement.executeUpdate(sql);System.out.println("记录成功!");}
查询余额
因为我有单独搞了一张表专门记录操作后的余额,因此实验室最后一次记录就是最新的余额,按序号倒叙排从0开始的第一个就是最新余额
public static double getBalance(Statement statement) throws SQLException {String sql = "select b.balance\n" +"from balance b \n" +"order by charge_number desc \n" +"limit 0,1;";ResultSet resultSet = statement.executeQuery(sql);double money =0;while(resultSet.next()){money = resultSet.getDouble("balance");}return money;}
修改密码
提前传入登陆的master给name修改name本人的密码
public static void modifypas(Statement statement,String name) throws SQLException {String password = null;while(true){System.out.println("请输入新密码:");password = scan.next();System.out.println("请再次确认新密码:");String copy_password1 = scan.next();if(password.equals(copy_password1)){break;}else{System.out.println("两次密码不相同!请重新操作:");}}String sql = "\n" +"update lab_member \n" +"set password = '"+ password +"' \n" +"where name = '"+ name +"';";int i = statement.executeUpdate(sql);System.out.println("修改成功!");};
记账记录
得到的结果集可以用一个元素类型为map的list来存储,一行数据等于一个map对象,key为列的名称,value为改列的数据;随着游标往后下走,,直到无数据
这里的列的名称可以用别名,且显示出来的结果记录观感差,可以试着让他更美观、可读一些
public static void alllist(Statement statement) throws SQLException {String sql = "select * \n" +"from charge_list ;";ResultSet resultSet = statement.executeQuery(sql);List<Map> list= new ArrayList<Map>();ResultSetMetaData metaData = resultSet.getMetaData();int clumn = metaData.getColumnCount();while(resultSet.next()){Map map = new HashMap();for (int i = 1; i < clumn; i++) {Object value = resultSet.getObject(i);String columnLabel = metaData.getColumnLabel(i);map.put(columnLabel,value);}list.add(map);}System.out.println(list);}
jar包的导入
我已经资源绑定了
需要导入这三个,而且记得右键lib点add……操作
后言:
我会试着把这些放到githup里面,你们有时间的话一定要优化试试,原本的代码健壮性和效率很差,再提醒一次蓝色的部分为可以优化部分,如果你认为有其他的部分可以优化也可以评论区提出来。
此项目适合刚学完jdbc的(已经有mysql和java基础)学生,如果是大佬请找别的项目,不喜勿喷。
相关文章:

实验室记账项目(java+Mysql+jdbc)
前言: 因为自己学习能力有限和特殊情况必须要找一个项目来做,但是上网搜的那些项目有两种(一种是技术太多,自己能力不够;一种是技术太少,项目太简单)导致都不适合本人,本人现有技术只…...

spring boot 整合 minio存储 【使用篇】
zi导入依赖 <!--minio--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version></dependency> yml配置(默认配置) spring:# 配置文件上传大小限制s…...

【Redis】深入理解 Redis 常用数据类型源码及底层实现(5.详解List数据结构)
本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇~前4篇可移步( ̄∇ ̄)/ 【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)-CSDN博客 【Redis】深入理解 Redis 常用数据类型源码及底…...

Vue+Flask电商后台管理系统
在这个项目中,我们将结合Vue.js前端框架和python后端框架Flask,打造一个功能强大、易于使用的电商后台管理系统 项目演示视频: VueFlask项目 目录 前端环境(Vue.js): 后端环境(python-Flask&…...
SpringBoot保姆级入门文档
目录 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig 1、SpringBoot的优点 2、和Spring、SpringMVC的对比 3、Xml 和 JavaConfig Spring 使用 Xml 作为容器配置文件,在 3.0 以后加入了 JavaConfig,使用 java 类做配置文件使…...
Springboot同一台服务器部署多个项目,导致redis混淆,如何根据不同项目区分
在Spring Boot应用中,如果在同一台服务器上部署了多个项目,并且每个项目都使用Redis作为缓存或存储,为了避免Redis数据混淆,你需要确保各个项目在访问Redis时使用不同的数据库索引号、键前缀或者连接配置。 以下是一些区分不同项目Redis数据的方法: 使用不同数据库索引:…...

redis启动错误
错误: Creating Server TCP listening socket 127.0.0.1:6379: bind: No error redis-server.exe redis.windows.conf redis-cli.exe shutdown auth "yourpassword"...

单片机烧录方式 -- IAP、ISP和ICP
目录 背景 1 什么是ICP 2 什么是ISP 3 什么是IAP 4 总结 背景 对于51单片机,我们使用STC-ISP上位机软件通过串口进行程序的烧写;对于STM32系列单片机,我们既可以通过串口烧写程序,也能通过JLink或是STLink进行程序的烧写&am…...
数据结构(C语言版)01
//顺序存储 int main(){ int ans[5]{1,1,1,1,3};//定义并初始化 printf("%d",ans[4]); return 0; } //链式存储 Typdef struct Lnode{ElemType data;struct Lnode *next; }Londe,*LinKlist;Londe *L; L(LinkList)malloc(sizeof(Lnode)); A->nextB;B->nextC;…...
Node.js-文件读取输入
Node.js-文件读取输入 fs模块(操作文件的模块) 读取 fs.readFile(path[, options], callback);[]里面 是可选参数,表示以什么样的编码 格式读取path是路径callback表示读取完成后的回调函数 例子 fs.readFile (‘./files/11.txt…...

时隔一年的测评:gpt3.5发展到什么程度了?
名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、简要介绍1、chatgpt是什么?2、主要特点3、工作原理4、应用限制5、使…...

[RCTF2015]EasySQL1 题目分析与详解
一、题目介绍: 1、题目来源: BUUCTF网址 2、题目介绍: 拿到flag。 二、解题思路: 我们发现题目首页有登录和注册账号两个选项,我们首先尝试注册账号,尝试注册username为admin的账号,输入密码…...

开源的 Python 数据分析库Pandas 简介
阅读本文之前请参阅-----如何系统的自学python Pandas 是一个开源的 Python 数据分析库,它提供了高性能、易用的数据结构和数据分析工具。Pandas 特别适合处理表格数据,例如时间序列数据、异构数据等。以下是对 Pandas 的简明扼要的介绍,包括…...

LeetCode 2125.银行中的激光束数量
银行内部的防盗安全装置已经激活。给你一个下标从 0 开始的二进制字符串数组 bank ,表示银行的平面图,这是一个大小为 m x n 的二维矩阵。 bank[i] 表示第 i 行的设备分布,由若干 ‘0’ 和若干 ‘1’ 组成。‘0’ 表示单元格是空的࿰…...
【探索AI】Sora - 探索AI视频模型的无限可能
Sora - 探索AI视频模型的无限可能 随着人工智能技术的飞速发展,AI视频模型已成为科技领域的新热点。而在这个浪潮中,OpenAI推出的首个AI视频模型Sora,以其卓越的性能和前瞻性的技术,引领着AI视频领域的创新发展。让我们将一起探讨…...

NGINX的重写与反向代理机制解析
目录 引言 一、重写功能 (一)if指令 1.判断访问使用的协议 2.判断文件 (二)return指令 1.设置返回状态码 2.返回指定内容 3.指定URL (三)set指令 1.手动输入变量值 2.调用其它变量值为自定义变…...

JVM的深入理解
1、JVM(Java虚拟机):我们java编译时候,下通过把avac把.java文件转换成.class文件(字节码文件),之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令(翻译官角色)…...

JavaWeb——007MYSQL(DQL多表设计)
# 数据库开发-MySQL 一级目录二级目录三级目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…...
深度学习500问——Chapter01:数学基础
文章目录 前言 1.1 向量和矩阵 1.1.1 标量、向量、矩阵、张量之间的联系 1.1.2 张量与矩阵的区别 1.1.3 矩阵和向量相乘结果 1.1.4 向量和矩阵的范数归纳 1.1.5 如何判断一个矩阵为正定 1.2 导数和偏导数 1.2.1 导数偏导计算 1.2.2 导数和偏导数有什么区别 1.3 特征值和特征向量…...

day03_登录注销(前端接入登录,异常处理, 图片验证码,获取用户信息接口,退出功能)
文章目录 1. 前端接入登录1.1 修改前端代码1.2 跨域请求1.2.1 跨域请求简介1.2.2 COSR概述CORS简介CORS原理 1.2.3 CORS解决跨域 2. 异常处理2.1 提示空消息分析2.2 系统异常分类2.3 异常处理2.2.1 方案一2.2.2 方案二 3. 图片验证码3.1 图片验证码意义3.2 实现思路3.3 后端接口…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...