一、项目前提
1.掌握Java基本语法
2.熟悉使用流程
3.理解面向对象的思想
4.熟练封装,继承,多态的使用
5.熟悉使用接口,异常处理
6.熟悉使用集合
7.熟悉掌握I/O流相关操作
8.可使用自己学习的的拓展知识对项目进行扩充
二、项目说明
据了解,目前在校大学生80%以上有做兼职的需求,兼职打工已经不仅仅是经济困难的学生赚取生活费用的途径。调查显示,全球经济危机对就业产生冲击,用人单位对人员的社会实践能力要求提高,大学期间必要的社会实践既可以提高能力,又为适应社会,减轻家庭经济负担起到了积极的作用;社会中虚假兼职机构、欺骗性中介机构充斥,真伪难辨,学生受骗事件频发,极大的损害了学生的经济利益,甚至对学生的人生安全造成威胁。从校园踏入社会,兼职只是一段小小的插曲,通过兼职丰富阅历、增长社会经验固然是好事,可是毫无戒备的步入社会,不仅会事与愿违,还可能造成不必要的损所以。所以,我们需求设计一个校园兼职平台来方便在校学生找兼职。
本平台根据角色定位不同有不同的模块,首先系统有一个登录注册模块,属于兼职人员的模块有个人信息管理和兼职申请;属于管理员的模块有基本信息维护、兼职信息投放和系统管理。
平台登录注册:用户可以通过账号密码登录平台,如果用户是第一次使用该平台,则可以通过注册方式完成信息录入。平台根据用户输入的账号密码,判断该用户的角色是兼职人员还是管理员,展示不同的操作界面。如果用户忘记密码,可以通过自己的账号和注册时录入的真实姓名找回密码。
个人信息管理:能够对用户的基本信息进行管理,包括个人信息的修改,如学生转到别的专业,此时要修改学生的基本信息;修改密码,为了账户的安全性,可以修改用户的密码。查询信用等级,比如有一个用户一开始可以完成兼职等级最高的工作,但是在这次工作中,未能按时完成工作,于是管理员降低了该用户的信用等级,该用户就不能接高级的兼职工作了。查询余额,用户每次按时完成兼职能得到一笔费用,有逾期会扣除一部分佣金,最后得到总的余额。
兼职申请模块:用户能够查询所有的职位信息,因为信用等级的限制,用户也可以只查询自己能够申请的职位信息。查询到合适的职位用户可以直接申请,申请后到达工作截至时间前完成工作可以提前结束工作得到佣金,如果逾期后完成,管理员会调整用户的信用等级。用户可以查询自己已经完成过的兼职信息和自己正在完成的兼职信息。
基本信息维护模块:管理员能够根据用户完成兼职的情况动态的调整用户的兼职等级状态。管理员可以调整兼职的等级,供用户选择。管理员能够根据兼职的等级不同设置逾期费用扣除比例,比如最高级的兼职逾期一天扣10元,扣除兼职费用后继续扣除用户余额,直到用户余额为0,自动结束工作,结算费用。
兼职信息投放:管理员可以把所有公司的兼职招聘信息发布到网上,根据公司的需求设置岗位所需人员,工资以及兼职的时间段,比如发传单,这份兼职需要周一到周五的上午9点至11点工作,那么在这个时间段已经有了其他工作的用户就不能申请该工作。
系统管理模块:管理员能够删除管理员账户,也能删除平台用户以及一些完成过的兼职信息。管理员能够添加平台用户信息到系统,本平台是针对学生的软件,所以能够注册的只能是学生,所以平台需要提前将学生信息录入系统,用户才能注册账号,如果未能及时录入信息照成无法注册,那么就需要联系管理员进行信息录入。管理员可以添加其他的管理员账户,为了安全起见,管理员和普通用户一样能够修改密码。管理员还能够查询所有的用户信息、管理员账户信息、已经投放的职位信息、已经完成的兼职信息和已经逾期的兼职信息。
三、项目功能结构图
四、基本功能介绍
(1)登录注册功能:用户通过注册进入平台,注册信息包括用户编号(用户编号决定角色类型,学号注册为兼职人员,教师编号注册为管理员),注册后到登录界面输入账号和密码登录平台,注册信息包括:用户编号(学号/教师编号)、密码、姓名、出生日期、性别、电话、所在院系、注册日期等。后期如果忘记了密码,用户通过自己的账号和注册时的姓名找回密码。注意,为了安全起见,只有已经录入系统的用户可以注册账户,本平台提前录入了部分管理员和学生的信息到系统中供大家注册。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
部分源码:
package SoMainMenu;
import Member.Login;
import Member.Register;
import Member.User;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.util.List;
import java.util.Properties;
import java.util.Scanner;
//初始页
public class Begin {
public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException, ParseException {
TSUtility.loadSpecialEffects();
//初始化功能展示
View.Begin();
while (true){
char c=TSUtility.readMenuSelection();
switch (c){
case '1':
//注册页面
Register.register();
break;
case '2':
//登录
Login.login();
break;
case '3':
//忘记密码
// 如果用户忘记密码,可以通过自己的账号和注册时录入的真实姓名找回密码。
ForgetPassword();
break;
case '4':
System.out.print("你确定要退出系统吗?请输入(Y/N):");
char a=TSUtility.readConfirmSelection();
TSUtility.loadSpecialEffects();
if (a=='Y'||a=='y'){
System.out.println("退出成功!欢迎下次使用!");
System.exit(0);
}else {
System.out.println("你选择了NO,未退出系统,欢迎继续使用!");
//初始化功能展示
View.Begin();
break;
}
}
}
}
public static void ForgetPassword() throws InterruptedException, IOException, ClassNotFoundException {
TSUtility.loadSpecialEffects();
//根据用户输入的编号查找对象进行反序列化
System.out.print("请输入您的用户编号:");
int acid=TSUtility.readstock();
List<User> obj=TSUtility.ops();
if (obj.size()!=0) {
int in=0;
for (User u : obj) {
if (acid!= u.getACID()){
in++;
}else {
in=0;
break;
}
}
if (in==0){
//增加用户信息的安全性,根据用户输入的学号或者教师编号确认是否为本人操作
System.out.print("请输入您的学号或教师编号:");
int uid=TSUtility.readstock();
for (User user: obj) {
if (uid!=user.getUID()){
in++;
}else {
in=0;
break;
}
}
if (in==0){
//进一步确认用户信息
System.out.print("请输入您的姓名:");
Scanner sc = new Scanner(System.in);
String name=sc.next();
//for (int i=0;i<obj.size();i++){
//User user= obj.get(i);
for (User user : obj) {
if (!name.equals(user.getName())) {
in++;
} else {
in = 0;
System.out.println("信息验证正确!");
String password;
while (true) {
System.out.print("请输入您的新密码(由数字或大小写字母组成且长度大于等于6位):");
password = TSUtility.judgepassword();
System.out.print("请再次输入密码:");
String password1 = TSUtility.judgepassword();
if (!password.equals(password1)) {
System.out.println("您第二次输入的密码与第一次不一致,请重新输入信息!");
} else break;
}
System.out.println("找回密码成功!请前往登录");
Logins(user);
user.setPassword(password);
//序列化信息
TSUtility.oos(obj);
//回车继续
TSUtility.readReturn();
//初始化功能展示
View.Begin();
return;
}
}
if (in!=0){
System.out.println("您输入的姓名不正确,可能不是本人在操作,系统将终止继续操作");
TSUtility.loadSpecialEffects();
//回车继续
TSUtility.readReturn();
//初始化功能展示
View.Begin();
}
}else {
System.out.println("您输入的学号或编号不正确,可能不是本人在操作,系统将终止继续操作");
TSUtility.loadSpecialEffects();
//回车继续
TSUtility.readReturn();
//初始化功能展示
View.Begin();
}
}else {
System.out.println("您的账号不存在!请先注册!");
//初始化功能展示
View.Begin();
}
}else {
System.out.println("您的账号不存在!请先注册!");
//初始化功能展示
View.Begin();
}
}
//找回密码恢复5次登录次数
public static void Logins(User u) throws IOException {
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\登录次数.txt");
FileReader fr = new FileReader(file);
Properties prop = new Properties();
prop.load(fr);
fr.close();
prop.setProperty(String.valueOf(u.getUID()),"5");
FileWriter fw = new FileWriter(file);
prop.store(fw,null);
fw.close();
}
}
package Member;
import Part_Time.Manager_menu;
import Part_Time.Part_time_menu;
import SoMainMenu.TSUtility;
import SoMainMenu.View;
import java.io.*;
import java.text.ParseException;
import java.util.List;
import java.util.Properties;
import java.util.Set;
//登录页面
public class Login {
public static void login() throws InterruptedException, IOException, ClassNotFoundException, ParseException {
TSUtility.loadSpecialEffects();
//反序列化对象存数组
List<User> user=TSUtility.ops();
System.out.println("******************************");
System.out.println("****** ****");
System.out.println("****** 用户登录页面 ****");
System.out.println("****** ****");
System.out.println("******************************");
System.out.print("请输入帐户编号或者学号(教师编号):");
int id= TSUtility.readstock();
System.out.print("请输入你的密码:");
String password= TSUtility.judgepassword();
TSUtility.loadSpecialEffects();
//if (user!=null){
if (user.size()!=0){
int index=0;
for (User u:user){
if (id==u.getUID()||id==u.getACID()){
Properties prop=Logins(u);
int in=Integer.parseInt(prop.getProperty(String.valueOf(u.getUID())));
while (true){
if (in!=5){
password= TSUtility.judgepassword();
}
if (password.equals(u.getPassword())){
//System.out.println("登录成功!");
Whether(u);
//初始化功能展示
View.Begin();
return;
}else {
in--;
if (in>0) {
System.out.print("您输入的密码不正确!您还有:" + in + "次机会\n请重新输入密码:");
}else {
Logins(u,in,prop);
System.out.println("你的登录次数已使用完,请找回密码!");
//初始化功能展示
View.Begin();
return;
}
}
}
}else {
index++;
}
}
if (index!=0){
System.out.println("您输入的账号不存在!");
System.out.println("登录失败!");
}
}else{
System.out.println("您的账号还未注册!请先注册!");
System.out.println("登录失败!");
}
//初始化功能展示
View.Begin();
}
//登录次数读取文件
public static Properties Logins(User u) throws IOException {
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\登录次数.txt");
FileReader fr = new FileReader(file);
Properties prop = new Properties();
prop.load(fr);
fr.close();
return prop;
}
public static void Logins(User u,int in,Properties prop) throws IOException {
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\登录次数.txt");
FileWriter fr = new FileWriter(file);
prop.setProperty(String.valueOf(u.getUID()),String.valueOf(in));
prop.store(fr,null);
fr.close();
}
public static void Whether(User u) throws InterruptedException, IOException, ClassNotFoundException, ParseException {
StringBuilder s= new StringBuilder(String.valueOf(u.getACID()));
s.delete(1, 6);
//兼职人员2开头,管理人员1开头
if (s.toString().equals("1")){
Manager_menu.manager_menu(u);
}else {
Part_time_menu.Part_timeStaffMenu(u);
}
}
}
再注册中,系统会自动生成一个六位数的用户账号,管理员是以1开头,兼职人员是以2开头,登录时就根据用户账号的首数字系统自动识别是管理员还是兼职人员
package Member;
import SoMainMenu.TSUtility;
import SoMainMenu.View;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
//注册页面
public class Register {
public static void register() throws InterruptedException, IOException, ClassNotFoundException {
TSUtility.loadSpecialEffects();
//注册视图
View.RegisterView();
while (true){
char c=TSUtility.readMenuSelection1();
switch (c){
//用户编号自动生成六位
case '1':
//兼职人员注册
//兼职人员的用户编号自动生成2开头
// MoonlightRegister(c);
// break;
case '2':
//管理人员注册
//管理人员的用户编号自动生成1开头
MoonlightRegister(c);
break;
case '3':
TSUtility.loadSpecialEffects();
//初始化功能展示
View.Begin();
return;
}
}
}
//兼职人员注册
public static void MoonlightRegister(char c) throws IOException, ClassNotFoundException, InterruptedException {
TSUtility.loadSpecialEffects();
//反序列化对象存数组
List<User> obj=TSUtility.ops();
//用户输入注册账号且判断是否已注册过
int uid=id(obj);
if (uid!=0) {
System.out.print("请输入姓名:");
Scanner sc = new Scanner(System.in);
//判断姓名与学号是否对应
String name = Name(uid);
String password;
while (true) {
System.out.print("请输入密码(由数字或大小写字母组成且长度大于等于6位):");
password = TSUtility.judgepassword();
System.out.print("请再次输入密码:");
String password1 = TSUtility.judgepassword();
if (password.equals("")){
System.out.println("密码不能为空,请重新输入信息!");
}else {
if (!password.equals(password1)) {
System.out.println("您第二次输入的密码与第一次不一致,请重新输入信息!");
} else break;
}
}
System.out.print("请输入您的年龄:");
int age = TSUtility.readInt();
String sex;
while (true) {
System.out.print("请输入您的性别:");
sex = sc.next();
if (sex.equals("男") || sex.equals("女")) {
break;
} else {
System.out.println("您输入性别不正确,请正确填写信息!");
}
}
System.out.print("请输入您的联系电话:");
String phone = TSUtility.readstock1();
System.out.print("请输入您所在的院系:");
String department = sc.next();
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String date = sdf.format(d);//注册日期
int acid = acid(obj,c);//账户编号随机生成六位,且帐户编号不能重复
int credit_rating = 3;//信用等级
double balance = 0;//余额
User user = new User();
user.setUID(uid);
user.setName(name);
user.setPassword(password);
user.setAge(age);
user.setSex(sex);
user.setPhone(phone);
user.setDepartment(department);
user.setDate(date);
user.setACID(acid);
user.setCredit_rating(credit_rating);
user.setBalance(balance);
/*ObjectOutputStream ops = new ObjectOutputStream(new FileOutputStream(file));
ops.writeObject(user);
ops.close();*/
obj.add(user);
//序列化对象
TSUtility.oos(obj);
System.out.println("注册成功!请前往登录!");
Logins(user);
System.out.println("您的用户编号为:"+user.getACID());
}
//回车继续
TSUtility.readReturn();
//注册视图
View.RegisterView();
}
//注册成功给予5次登录次数
public static void Logins(User u) throws IOException {
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\登录次数.txt");
if (!file.exists()){
file.createNewFile();
}
FileReader fr = new FileReader(file);
Properties prop = new Properties();
prop.load(fr);
fr.close();
prop.setProperty(String.valueOf(u.getUID()),"5");
FileWriter fw = new FileWriter(file);
prop.store(fw,null);
fw.close();
}
public static String Name(int uid) throws IOException {
Scanner sc=new Scanner(System.in);
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\学生学号与教师编号.txt");
FileReader fr = new FileReader(file);
Properties prop = new Properties();
prop.load(fr);
fr.close();
while (true) {
String name = sc.next();
if (prop.getProperty(String.valueOf(uid)).equals(name)){
return name;
}
System.out.print("您输入的姓名与学号对应的姓名不匹配,请重新输入:");
}
}
public static int id(List<User> obj ) throws IOException {
int uid;
while (true) {
System.out.print("请输入你的学号或教师编号(6位):");
uid = TSUtility.readstock();
//System.out.println(uid);
File file = new File("E:\\DELL\\后端关卡8-16\\关卡16_第二个实践项目\\学生学号与教师编号.txt");
/*if (!file.exists()){
file.createNewFile();
}*/
FileReader fr = new FileReader(file);
Properties prop = new Properties();
prop.load(fr);
fr.close();
Set<Object> objects = prop.keySet();
int index=0;
for (Object key:objects){
if (String.valueOf(uid).equals(key)){
index++;
break;
}
}
//是校内人员才可以注册
if (index!=0) {
if (obj.size()!=0) {
for (User u : obj) {
if (u.getUID() == uid) {
System.out.println("您已注册账号,请勿再注册!");
System.out.println("您的用户编号为:" + u.getACID());
return 0;
}
}
return uid;
} else break;
}else {
System.out.println("你不是校内人员不能进行注册!");
return 0;
}
}
return uid;
}
//用户编号不能重复
public static int acid(List<User> obj,char c){
Random r = new Random();
StringBuilder s= new StringBuilder();
int in=1;
if (c=='1'){
in=2;
}
s.append(in);
while (true) {
for (int i=0;i<5;i++) {
int Acid = r.nextInt(10);
s.append(Acid);
}
if (obj.size()!=0) {
int index=0;
for (User u:obj){
if (u.getACID()==Integer.parseInt(s.toString())){
index++;
s.delete(1,6);
break;
}
}
if (index==0){
break;
}
} else break;
}
return Integer.parseInt(s.toString());
}
}
其中为了保证数据的实时更新,在每一个子功能都用到对数据的序列化或反序列化
(2)个人信息管理:包括个人信息修改、密码修改、查询信用等级和查询余额功能。普通用户登录成功之后,可以修改个人注册时录入的信息,学号和注册时间不可更改,密码单独修改;也可以查询个人的信用等级,若信用等级不是最高,则查询个人信用等级时附加显示“按时完成X次后信用等级恢复至X级”(默认未逾期完成兼职工作3次恢复1级信用等级,等级梯度为1-5级,5级最高)。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(3)兼职申请功能:包括兼职信息查询、申请工作和结束工作。用户登录成功之后,可以查询所有的兼职信息,包括自己能申请的职位和不能申请的职位,也可以只查看自己能申请的职位(是否可申请与信用等级、岗位所需人员、兼职时间相关)。用户还可查看自己已完成的兼职信息和自己正在完成的兼职信息。满足条件的兼职,用户可以申请,开始工作时间为系统当前时间,相对的该兼职岗位对应的所需人员需要减少;完成工作后(逾期完成信用自动降低1级,0级为最低,0级后不可再申请兼职工作),需要计算所得薪酬(所得薪酬和是否逾期、逾期天数相关),若未逾期且信用等级未满,则需要计算恢复信用等级所需的次数,完成时间手动输入,不可小于兼职开始时间。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(4)基本信息维护功能:包括兼职等级设置、用户信用调整和逾期费用扣除比例调整。管理员端登录成功之后,可以调整兼职的等级(兼职等级梯度为一-五级,五级最高,一级最低),普通用户的信用等级>=兼职等级可申请职位,还可以增删兼职的类型,比如开发外包/销售/设计师等。管理员可以根据用户的表现动态地调整用户的信用等级,可越级增减,0级信用的普通用户管理员不可调整其信用等级。管理员还可以调整兼职的逾期费用,每天逾期扣除的费用相同,比如:原定一份兼职总薪资1000元,工作要求10天完成,逾期1天扣除100元,调整后一天扣除200元(扣除兼职费用为0后继续扣除用户余额,直到用户余额为<=0,自动结束工作,结算费用)。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(5)兼职信息投放:包括兼职人员设置、兼职的金额设置、兼职的时间录入以及兼职的其他信息录入。系统管理员登录成功之后可以把所有公司发布的兼职信息录入到平台,录入信息包括:营业执照编号、公司名字、岗位名称、兼职类型、兼职等级、工作内容、需求人数、工作时间等。系统管理员可以根据市场和公司要求,动态调整这些兼职工作的部分内容,比如需求人数、薪水等,工作时间不允许更改。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
(6)系统管理功能:包括对普通用户、管理员和兼职信息的增删查改等。系统提前录入了一些管理员或者学生的信息在系统中,但是未全部录入,所以后续需要注册的用户需要已经录入的管理员登录平台进行信息录入,系统录入仅需要学号/教师编号和姓名即可,此信息供用户注册使用。管理员可以删除普通用户和别的管理员,以及没有用的兼职信息。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
有需求者系统源码联系博主