草庐IT

数据库大作业-学生宿舍管理系统

朽木冰天 2023-09-30 原文

简介

此程序是本人大二时期的数据库大作业,初学数据库后所编写的一个程序,是一个学生宿舍管理系统,可实现学生宿舍的管理。

本程序使用Java编写,使用eclipse进行开发,数据库使用MySQL数据库搭配Navicat进行数据管理,程序使用JDBC技术进行数据库连接,使用Java Swing开发图形化界面,整个系统界面美观、功能丰富。本系统点击首页的“更换外观”按钮可切换不同风格的外观,系统分为三个模式,学生模式、宿管模式和系统管理模式,分别面向学生、宿管和系统管理员,不同的模式有不同的功能,详细请见下方介绍。

本系统功能完善且丰富(可以将系统内的各种信息导出为excel文件哦),程序检错能力强,界面简洁好看(每个组件都经过细心调整),但当时偷懒,所以有些代码并没有经过优化,可能有些繁杂,且为了界面美观,有大部分代码都在调整界面组件,请勿介意,读者可自行取其精华去其糟粕。

程序源代码及程序设计说明书可在下方GitHub链接处进行下载,供各位需要的人学习参考。

GitHub链接:学生宿舍管理系统

目录



数据设计

本系统的数据库共有8张表格,数据库表格设计及ER图如下所示,详细数据设计请至开头处GitHub链接处下载数据设计表或程序设计说明书,进行查看。



程序流程

程序大概流程如下图:


功能展示

本程序功能及细节颇多,在此仅展示部分功能,若想了解完整功能及细节,请至文章开头处GitHub链接下载程序,进行体验。

欢迎界面-更换外观

打开本程序,首先来到欢迎界面,在此可选择学生登录和管理员登录,点击右上角“更换外观”可更改系统整体外观,共有5种不同风格的外观。



登录

在欢迎界面点击“学生登录”,然后输入学生账号密码,登录成功系统将进入学生模式;点击“管理员登录”,然后输入宿管账号密码,登录成功系统将进入宿管模式,若账号密码均输入“admin”,系统将进入系统管理模式。




学生模式

学生模式面向的群体是学生,学生输入自己的账号(即学号)和密码后,即可进入学生模式的菜单界面,在此可选择相应功能,学生模式的功能较少,功能如下。



个人信息

“个人信息”功能,可查看自己的个人详细信息。



宿舍报修

“宿舍报修”功能,可在此界面进行宿舍报修,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。



建议与反馈

“建议与反馈”功能,可在此界面进行建议与反馈,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。



修改密码

“修改密码”功能,可在此界面修改自己的密码,需输入旧密码和两次新密码,输入错误会有相应的提示。



系统管理模式

系统管理模式面向的群体是系统管理员,管理员输入指定的账号和密码(均为admin)后,即可进入系统管理模式的菜单界面,在此可选择相应功能,系统管理模式的功能最多最全,可对学生、宿管、宿舍等进行全面管理,具体功能如下。



管理功能

系统管理模式下可对宿舍楼、宿舍、宿管、学生、住宿信息进行全面管理,包括增删改查等,下面以“学生管理”为例展示管理功能。

点击“学生管理”,来到学生管理界面,在此可看到所有学生的简易信息。

点击某个学生行的“查看”按钮,可查看该学生的详细信息,在此可进行学生信息的修改和删除。

如点击“修改学生信息”按钮,则进行学生信息的修改操作,修改完成点击“保存”,信息会在数据库同步更新。

在“学生管理”界面点击上方的“添加”按钮,可向系统中添加学生,输入完整的学生信息并确认添加后,信息将被保存至数据库,成功添加学生。

在“学生管理”界面点击上方的“导出”按钮,可将学生信息导出成excel表格文件。

在“学生管理”界面点击顶部的“查询”按钮,将来到学生信息的查询界面,输入指定条件并点击“查询”,系统将查询出符合条件的学生,如下查询所有2019级的学生。

以上展示了“学生管理”功能,其他管理功能与此类似。

寝室分配

“寝室分配”功能,可自动为学生分配寝室,代替手动分配,以节省人力,若想精确分配、按意愿分配寝室,则需手动在“住宿管理”界面进行分配。



出入登记

“出入登记”功能,可登记学生出入宿舍楼的记录,可添加、删除、导出、查询出入记录,点击上方“登记”按钮,添加出入记录,输入相应信息,其中输入学号后将自动显示相应姓名,点击界面右侧的“获取当前时间”,可自动获取当前时间并自动输入。




宿舍报修

“宿舍报修”功能,在此界面可查看到所有学生提交的宿舍报修信息,点击“查看”按钮,可查看详细的报修信息,报修详细界面中可处理报修、删除报修,宿舍报修信息亦可导出和查询。




建议与反馈

“建议与反馈”功能,在此界面可查看到所有学生提交的建议与反馈,点击“查看”按钮,可进入详细界面查看详细内容,也可在此进行删除,建议与反馈亦可导出。




删库跑路

“删库跑路”功能,此功能需输入密码“ESCAPE”,然后点击“确认删库跑路”按钮,即可删除本系统的数据库进行跑路 ,此功能成功执行后,将自动退出程序,系统将无法继续使用。



宿管模式

宿管模式面向的群体是宿管,宿管输入自己的账号(即编号)和密码后,即可进入宿管模式的菜单界面,在此可选择相应功能,宿管模式的功能与系统管理模式类似,不同之处在于,宿管模式下宿管仅能对自己所管理的宿舍楼进行操作,由于两者功能类似,故在此不再展示宿管模式的功能,读者可下载程序自行进行体验。



代码展示

本程序代码巨多且有详细注释,在此仅展示部分重要代码,完整代码请至文章开头处GitHub链接下载程序,进行了解。

为了系统界面的美观强迫症患者 ,所以本程序的很多代码都在调整界面组件,请别介意。

Info类

信息类,定义各种对象的类,如:宿舍、学生、宿管等。

import java.util.*;
import java.text.*;

//各种信息类
public class Info {
	
}

class Floor { //宿舍楼
	String floor_num; //楼号
	int layer_amount; //层数
	int room_amount; //房间数
	String category; //类别
	String sex; //居住时间
	String admin_num; //宿管编号
	public Floor(String floor_num, String layer_amount, String room_amount, String category, String sex, String admin_num) {
		this.floor_num=floor_num;
		this.layer_amount=Integer.parseInt(layer_amount);
		this.room_amount=Integer.parseInt(room_amount);
		this.category=category;
		this.sex=sex;
		this.admin_num=admin_num;
	}
}

class Dormitory { //宿舍
	String floor_num; //楼号
	int layer; //楼层
	int room_num; //宿舍号
	int bed_total; //总床位数
	int bed_surplus; //剩余床位数
	int price; //单价
	public Dormitory(String floor_num, String layer, String room_num, String bed_total, String bed_surplus, String price) {
		this.floor_num=floor_num;
		this.layer=Integer.parseInt(layer);
		this.room_num=Integer.parseInt(room_num);
		this.bed_total=Integer.parseInt(bed_total);
		this.bed_surplus=Integer.parseInt(bed_surplus);
		this.price=Integer.parseInt(price);
	}
}

class Admin { //宿管
	String admin_num; //编号
	String password; //密码
	String name; //姓名
	String sex; //性别
	String phone; //手机
	public Admin(String admin_num, String password, String name, String sex, String phone) {
		this.admin_num=admin_num;
		this.password=password;
		this.name=name;
		this.sex=sex;
		this.phone=phone;
	}
}

class Student { //学生
	String stu_num; //学号
	String password; //密码
	String name; //姓名
	String sex; //性别
	int birth; //出生日期
	int grade; //年级
	String faculty; //院系
	String clas; //班级
	String phone; //手机号
	String yes_no; //是否入住
	public Student(String stu_num, String password, String name, String sex, String birth, String grade, String faculty, String clas, String phone, String yes_no) {
		this.stu_num=stu_num;
		this.password=password;
		this.name=name;
		this.sex=sex;
		this.birth=Integer.parseInt(birth);
		this.grade=Integer.parseInt(grade);
		this.faculty=faculty;
		this.clas=clas;
		this.phone=phone;
		this.yes_no=yes_no;
	}
}

class Stay { //住宿
	String stu_num; //学号
	String name; //姓名
	String floor_num; //楼号
	int layer; //楼层
	int room_num; //宿舍号
	Date time; //入住时间
	public Stay(String stu_num, String name, String floor_num, String layer, String room_num, String time) {
		SimpleDateFormat timeFormat=new SimpleDateFormat("yyyy-MM-dd");
		this.stu_num=stu_num;
		this.name=name;
		this.floor_num=floor_num;
		this.layer=Integer.parseInt(layer);
		this.room_num=Integer.parseInt(room_num);
		try {
			this.time=timeFormat.parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

class InOut { //出入
	String stu_num; //学号
	String name; //姓名
	String floor_num; //楼号
	String category; //类别
	Date time; //时间
	public InOut(String stu_num, String name, String floor_num, String category, String time) {
		SimpleDateFormat timeFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		this.stu_num=stu_num;
		this.name=name;
		this.floor_num=floor_num;
		this.category=category;
		try {
			this.time=timeFormat.parse(time);
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

class Repair { //报修
	String stu_num; //学号
	String name; //姓名
	String floor_num; //楼号
	int layer; //楼层
	int room_num; //宿舍号
	String info; //报修详细
	String yes_no; //是否处理
	public Repair(String stu_num, String name, String floor_num, String layer, String room_num, String info, String yes_no) {
		this.stu_num=stu_num;
		this.name=name;
		this.floor_num=floor_num;
		this.layer=Integer.parseInt(layer);
		this.room_num=Integer.parseInt(room_num);
		this.info=info;
		this.yes_no=yes_no;
	}
}

class Advice { //建议与反馈
	String stu_num; //学号
	String name; //姓名
	String info; //详细信息
	public Advice(String stu_num, String name, String info) {
		this.stu_num=stu_num;
		this.name=name;
		this.info=info;
	}
}

class Stu { //学生,用于分配宿舍的信息
	String stu_num; //学号
	int grade; //年级
	String faculty; //院系
	String clas; //班级
	public Stu(String stu_num, String grade, String faculty, String clas) {
		this.stu_num=stu_num;
		this.grade=Integer.parseInt(grade);
		this.faculty=faculty;
		this.clas=clas;
	}
}

class Dor { //宿舍,用于分配宿舍的信息
	String floor_num; //楼号
	int layer; //楼层
	int room_num; //宿舍号
	int bed_surplus; //剩余床位数
	public Dor(String floor_num, String layer, String room_num, String bed_surplus) {
		this.floor_num=floor_num;
		this.layer=Integer.parseInt(layer);
		this.room_num=Integer.parseInt(room_num);
		this.bed_surplus=Integer.parseInt(bed_surplus);
	}
}

HomePage类

主页类,main方法包含在此类中,是程序的入口,定义了系统的欢迎界面、登录界面和更换外观功能,以及JDBC操作等。

import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class HomePage { //主页类
	static JFrame mainJFrame=new JFrame("学生宿舍管理系统");
	static Container con=mainJFrame.getContentPane();
	static boolean flag; //是否为管理员
	static int appearance=0; //当前外观
	static JLabel lb_appearance=new JLabel("<html>当前外观:<br>默认</html>"); //当前外观
	static Connection connection=null;
	
	public static void main(String[] args) {
		mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainJFrame.setResizable(false);
		con.setLayout(null);
		welcomePage();
	}
	
	public static void welcomePage() { //欢迎界面
		mainJFrame.setSize(550,400);
		mainJFrame.setLocationRelativeTo(null);
		JPanel pn=new JPanel();
		pn.setSize(550,400);
		pn.setLayout(null);
		JLabel lb1=new JLabel("欢迎使用"),lb2=new JLabel("学生宿舍管理系统");
		JButton bt1=new JButton("学生登录"),bt2=new JButton("管理员登录"),bt_changeAppearance=new JButton("更换外观",new ImageIcon("image/更换外观.png"));
		lb1.setFont(new Font("黑体",0,35));
		lb1.setBounds(200,30,150,100);
		lb2.setFont(new Font("黑体",0,35));
		lb2.setBounds(128,100,300,80);
		bt1.setFont(new Font("黑体",0,22));
		bt1.setBounds(70,210,170,70);
		bt1.setCursor(new Cursor(Cursor.HAND_CURSOR));
		lb_appearance.setFont(new Font("黑体",0,17));
		lb_appearance.setBounds(5,5,150,40);
		bt2.setFont(new Font("黑体",0,22));
		bt2.setBounds(310,210,170,70);
		bt2.setCursor(new Cursor(Cursor.HAND_CURSOR));
		bt_changeAppearance.setFont(new Font("黑体",0,17));
		bt_changeAppearance.setBounds(420,10,130,25);
		bt_changeAppearance.setContentAreaFilled(false);
		bt_changeAppearance.setBorderPainted(false);
		bt_changeAppearance.setCursor(new Cursor(Cursor.HAND_CURSOR));
		pn.add(lb1);
		pn.add(lb2);
		pn.add(lb_appearance);
		pn.add(bt1);
		pn.add(bt2);
		pn.add(bt_changeAppearance);
		con.add(pn);
		mainJFrame.setVisible(true);
		bt1.addActionListener(new ActionListener() { //进入学生登录界面
			public void actionPerformed(ActionEvent e) {
				flag=false;
				con.remove(pn);
				mainJFrame.repaint();
				loginPage();
				mainJFrame.validate();
			}
		});
		bt2.addActionListener(new ActionListener() { //进入管理员登录界面
			public void actionPerformed(ActionEvent e) {
				flag=true;
				con.remove(pn);
				mainJFrame.repaint();
				loginPage();
				mainJFrame.validate();
			}
		});
		bt_changeAppearance.addMouseListener(new MouseListener() { //更换整体界面外观
			public void mouseEntered(MouseEvent arg0) {
				bt_changeAppearance.setForeground(Color.blue);
			}
			public void mouseExited(MouseEvent arg0) {
				bt_changeAppearance.setForeground(null);
			}
			public void mouseClicked(MouseEvent arg0) {
				try {
					appearance++;
					String lookAndFeel=null;
					switch(appearance) {
					case 1: //Windows风格
						lookAndFeel="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
						lb_appearance.setText("<html>当前外观:<br>Windows</html>");
						break;
					case 2: //Nimbus风格
						lookAndFeel="com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
						lb_appearance.setText("<html>当前外观:<br>Nimbus</html>");
						break;
					case 3: //Windows Classic风格
						lookAndFeel="com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
						lb_appearance.setText("<html>当前外观:<br>Windows Classic</html>");
						break;
					case 4://Motif风格
						lookAndFeel="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
						lb_appearance.setText("<html>当前外观:<br>Motif</html>");
						break; 
					case 5: //默认风格
						lookAndFeel="javax.swing.plaf.metal.MetalLookAndFeel";
						lb_appearance.setText("<html>当前外观:<br>默认</html>");
						break;
					}
					UIManager.setLookAndFeel(lookAndFeel);
					SwingUtilities.updateComponentTreeUI(mainJFrame);
					if(appearance==5)
						appearance=0;
		        } catch(Exception ex) {
		        	System.out.println(ex);
		        }
			}
			public void mousePressed(MouseEvent arg0){}
			public void mouseReleased(MouseEvent arg0){}
		});
	}
	
	public static void loginPage() { //登录界面
		mainJFrame.setSize(550,400);
		mainJFrame.setLocationRelativeTo(null);
		JPanel pn=new JPanel();
		pn.setSize(550,400);
		pn.setLayout(null);
		JButton bt1=new JButton("返回",new ImageIcon("image/返回.png")),bt2=new JButton("登  录");
		JTextField tf=new JTextField();
		JPasswordField pf=new JPasswordField();
		JLabel lb1,lb2=new JLabel("账号:"),lb3=new JLabel("密码:");
		if(flag) {
			lb1=new JLabel("管理员登录");
			lb1.setFont(new Font("黑体",0,35));
			lb1.setBounds(185,30,180,100);
		}
		else {
			lb1=new JLabel("学生登录");
			lb1.setFont(new Font("黑体",0,35));
			lb1.setBounds(200,30,150,100);
		}
		lb2.setFont(new Font("黑体",0,25));
		lb2.setBounds(100,100,80,100);
		lb3.setFont(new Font("黑体",0,25));
		lb3.setBounds(100,150,80,100);
		tf.setFont(new Font("黑体",0,25));
		tf.setBounds(170,130,230,40);
		pf.setFont(new Font(null,0,25));
		pf.setBounds(170,180,230,40);
		bt2.setFont(new Font("黑体",0,25));
		bt2.setBounds(200,250,150,60);
		bt2.setCursor(new Cursor(Cursor.HAND_CURSOR));
		bt1.setFont(new Font("黑体",0,17));
		bt1.setBounds(1,10,92,25);
		bt1.setContentAreaFilled(false);
		bt1.setBorderPainted(false);
		bt1.setCursor(new Cursor(Cursor.HAND_CURSOR));
		pn.add(lb1);
		pn.add(lb2);
		pn.add(lb3);
		pn.add(tf);
		pn.add(pf);
		pn.add(bt1);
		pn.add(bt2);
		con.add(pn);
		bt1.addMouseListener(new MouseListener() { //返回到欢迎界面
			public void mouseEntered(MouseEvent arg0) {
				bt1.setForeground(Color.blue);
			}
			public void mouseExited(MouseEvent arg0) {
				bt1.setForeground(null);
			}
			public void mouseClicked(MouseEvent arg0) {
				con.remove(pn);
				mainJFrame.repaint();
				welcomePage();
				mainJFrame.validate();
			}
			public void mousePressed(MouseEvent arg0){}
			public void mouseReleased(MouseEvent arg0){}
		});
		bt2.addActionListener(new ActionListener() { //登录,连接数据库获取账号密码并检验,正确则进入功能界面
			public void actionPerformed(ActionEvent e) {
				databaseConnection(); //连接MySQL数据库
				if(flag) //进行管理员账号密码检验
					new Login().adminLogin(tf.getText(),String.valueOf(pf.getPassword()));
				else //进行学生账号密码检验
					new Login().studentLogin(tf.getText(),String.valueOf(pf.getPassword()));;
			}
		});
	}
	
	public static void databaseConnection() { //连接MySQL数据库
		final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver"; //JDBC驱动名
	    final String DB_URL="jdbc:mysql://localhost:3306/dormitory_system?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; //数据库URL
	    final String USER="root"; //数据库用户名
	    final String PASS="root"; //数据库密码
	    try {
	    	Class.forName(JDBC_DRIVER); //加载JDBC驱动
	    	connection=DriverManager.getConnection(DB_URL,USER,PASS); //连接数据库
	    }catch(SQLException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
	}
}

Login类

登录类,用于进行登录验证,包括学生、宿管、系统管理员的登录。

import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Login { //登录类
	JLabel lb_tips=new JLabel(); //提示窗口的内容
	
	public void adminLogin(String account,String password) { //管理员登录(包括系统管理员和宿管)
		boolean flag=false; //是否查找到相应账号密码
		if(account.equals("admin") && password.equals("admin")) { //检验是否为系统管理员账号密码,若是,则进入系统管理员功能界面
			lb_tips.setText("登录成功!");
			loginTips();
			new SysAdminFunction();
			HomePage.mainJFrame.dispose();
		}
		else { //若不是,则进行宿管账号密码检测
			String admin_num=null, pass; //宿管账号密码
			try {
				String sql="SELECT admin_num, password FROM admin"; //SQL语句
				PreparedStatement ps; //创建PreparedStatement类对象ps,用来执行SQL语句
				ps=HomePage.connection.prepareStatement(sql); //把操作数据库返回的结果保存到ps中
	            ResultSet rs=ps.executeQuery(sql); //ResultSet类,用来存放获取的结果集
	            while(rs.next()){ //遍历结果集
	            	admin_num=rs.getString("admin_num");
	                pass=rs.getString("password");
	                if(account.equals(admin_num) && password.equals(pass)) {
	                	flag=true;
	                	break;
	                }
	            }
	            rs.close();
	            ps.close();
			}catch(SQLException e){
	            e.printStackTrace();
	        }
			if(flag) { //若宿管账号密码正确,则进入宿管功能界面
				lb_tips.setText("登录成功!");
				loginTips();
				new DorAdminFunction(admin_num);
				HomePage.mainJFrame.dispose();
			}
			else { //若账号密码错误,则进行提示
				lb_tips.setText("账号或密码错误!");
				loginTips();
				try {
					HomePage.connection.close(); //关闭数据库连接
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public void studentLogin(String account,String password) { //学生登录
		boolean flag=false; //是否查找到相应账号密码
		String stu_num=null, pass; //学生账号密码
		try {
			String sql="SELECT stu_num, password FROM student"; //SQL语句
			PreparedStatement ps; //创建PreparedStatement类对象ps,用来执行SQL语句
			ps=HomePage.connection.prepareStatement(sql); //把操作数据库返回的结果保存到ps中
            ResultSet rs=ps.executeQuery(sql); //ResultSet类,用来存放获取的结果集
            while(rs.next()) { //遍历结果集
            	stu_num=rs.getString("stu_num");
                pass=rs.getString("password");
                if(account.equals(stu_num) && password.equals(pass)) {
                	flag=true;
                	break;
                }
            }
            rs.close();
            ps.close();
		}catch(SQLException e){
            e.printStackTrace();
        }
		if(flag) { //若学生账号密码正确,则进入学生功能界面
			lb_tips.setText("登录成功!");
			loginTips();
			new StudentFunction(stu_num);
			HomePage.mainJFrame.dispose();
		}
		else { //若账号密码错误,则进行提示
			lb_tips.setText("账号或密码错误!");
			loginTips();
			try {
				HomePage.connection.close(); //关闭数据库连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	
	public void loginTips() { //登录时弹出的提示信息窗口
		JDialog tips=new JDialog(HomePage.mainJFrame,"  提示",true);
		JPanel pn_tips=new JPanel();
		JButton bt_tips=new JButton("确 定");
		tips.setSize(450,200);
		tips.setLocationRelativeTo(null);
		tips.setResizable(false);
		tips.setLayout(null);
		pn_tips.setBounds(0,30,450,70);
		lb_tips.setFont(new Font("黑体",0,25));
		bt_tips.setFont(new Font("黑体",0,20));
		bt_tips.setBounds(175,100,100,50);
		bt_tips.setCursor(new Cursor(Cursor.HAND_CURSOR));
		pn_tips.add(lb_tips);
		tips.add(pn_tips);
		tips.add(bt_tips);
		bt_tips.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				tips.dispose();
			}
		});
		tips.setVisible(true);
	}
}

… …
其他代码请见程序源码!

后记

本文章是为了记录下作者自己的过往,同时供各位学习参考,文章主要展示程序功能,详细程序代码及介绍请至文章开头处GitHub链接下载相应资源。

本程序仅供学习和参考,请勿抄袭或另作他用。

感谢观看,有什么问题可在下方评论区进行评论,若觉得本文章写得不错,还请点个赞呢。

关注我,收看更多精彩!( • ̀ω•́ )✧求点赞、评论、收藏、关注

有关数据库大作业-学生宿舍管理系统的更多相关文章

  1. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  5. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  6. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  9. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐