基于控制台的效果图
一、要求总览(附完整代码)
该项目的目的用于二手车交易
运行开始系统看到主菜单:
1.登陆
2.注册:用户名不能重复
3.最新二手车信息
4.搜索车辆
*5.对比车辆
*6.我的收藏
7.后台管理
8.退出系统
项目要求:
1)选择登陆要求输入用户名密码和验证码,输入错误要求给出相应的提示信息
2)选择注册要求输入用户名,密码,确认密码,邮箱,手机号,注册日期,如果用户名或邮箱或手机号已被使用,则该用户注册失败,也应给与相应的提示信息,邮箱、手机号皆需要验证规则
3)选择最新二手车信息,要求显示最新发布的10辆二手车的信息内容,显示的内容包含车辆的品牌,车型,里程数,价格
呈现的内容如下:
品牌 车型 里程数 价格 发布时间
1.大众 朗逸 54000 75000 2014-7-5
2.
3.
.....
10.
4)以上看到的十辆车的信息可以进行选择后显示车辆的详细信息,详细包含之前呈现的信息以及排量,上牌的时间,离合器类型,同时在信息的下方呈现如下菜单:
1.收藏(必须登陆后才能进行收藏)
2.加入对比
3.购买(只能在登陆后才能看到该菜单项)
4.返回主菜单
5)选择收藏,可以将该车辆收藏至登陆人的"我的收藏",当用户选择主菜单中的"我的收藏"选项时,可以查看登陆人收藏的所有车辆信息,每个人最多只能收藏10辆车,如果收藏第11辆车的时候第一辆移除收藏列表
6)选择加入对比,可以将车辆加入对比列表,对比列表最多只能存储4辆车的信息,如果对比车辆已满,则给出提示信息,同时可以选择是否要将页面跳转至"对比车辆"菜单项
7)选择购买,可以支付登陆人的金额,如果金额不够,则购买失败,否则交易成功,打印凭条
8)选择搜索车辆进入如下菜单:
1.根据品牌搜索
2.根据价格搜索
3.根据上牌日期搜索
9)选择根据品牌搜索,要求呈现当前二手车系统的所有品牌信息,显示如下:
1.大众
2.福特
3.斯柯达
.......
10)选择品牌后,要求呈现该品牌所对应的所有车型,如选择了1后,显示如下:
1.桑塔纳
2.朗逸
3.速腾
4.帕萨特
.......
11)选择车型后查看该车辆的详细信息,显示对应品牌车型所发布的所有二手车的信息,信息呈现的内容同3),可以对车辆进行选择,该功能同4)
12)选择价格搜索,呈现如下菜单:
1. 5万以下
2. 5-10万
3. 10-15万
4. 15万以上
13)选择任意项搜索出对应价格范围的车辆信息,信息呈现内容同3),可以对车辆进行选择,该功能同4)
14)选择上牌日期搜索,输入起始年份和月份以及结束的年份和月份,可以显示对应时间范围中的所有二手车信息,内容呈现同3),可以对车辆进行选择,功能同4)
15)选择对比车辆,呈现如下菜单:
1.查看对比信息
2.删除对比车辆
3.返回上一级菜单
16).选择查看对比信息,可以将之前加入对比的车辆信息进行对比(如果只有一辆车则无法参与对比),对比信息如下:
品牌 雪佛兰 大众
车型 科鲁兹 朗逸
价格 65000 75000
排量 1.6 1.6
里程数 32000 23000
离合器 自动挡 手自一体
上牌时间
返回上一个菜单
17)选择删除对比车辆,需要先显示对比列表中的车辆品牌和车型,选择要删除的车辆,进行删除(删除操作时要给出提示信息)
18)选择我的收藏,可以查看收藏的车辆信息,内容呈现同3),可以选择查看收藏车辆的详细信息,功能同4)
19)选择后台管理,可以呈现如下菜单:
1.品牌管理
2.车型管理
3.发布车辆信息
20)选择品牌管理,可以添加品牌信息
21)选择车型管理,首先呈现所有的品牌信息,选择品牌后呈现如下菜单:
1.添加车型
2.删除车型
22)选择添加车型,可以输入车型名称并将该车型添加至对应的品牌中
23)选择删除车型,显示当前品牌下所有的对应的车型,选择车型后可以删除该车型(该车型对应的二手车都应删除):收藏夹,对比列表中的该车型的车都应该被删除
24)选择发布车辆信息,要求输入车辆的详细信息(要求品牌和车型是通过选择获取的,其余直接键盘输入获取)同时自动根据当前系统时间记录发布车辆的时间
要求:1.分层设计
2.使用单例模式封装数据类
3.Dao层不可出现于用户交互的代码,如输入或者输入等
4.在合适的地方使用try..catch进行异常处理
****5.在合适的地方使用log4j记录日志:记录在文件中
6.用户输入信息必须进行合理性验证
7.进行增删改操作的最后,必须有确认步骤
8.输出中不能有null,false,true等专业词汇
9.程序不能出异常,不能非法退出
二、代码实现
1.Dao
package dao;
import entity.car;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class collection {
private static final List<car> collectlist=new CopyOnWriteArrayList();
private collection(){}
static {
}
public static List<car> getInstance(){return collectlist;}
}
4.
package dao;
import entity.car;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class comparation {
private static final List<car> comparelist=new CopyOnWriteArrayList();
private comparation(){}
static {
}
public static List<car> getInstance(){return comparelist;}
}
5
package dao;
import entity.car;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class dateDB {
private static final List<car> datelist=new CopyOnWriteArrayList();
private dateDB(){}
static {
}
public static List<car> getInstance(){
return datelist;
}
}
6
package dao;
import entity.User;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class iflogin {
private static final List loginlist=new CopyOnWriteArrayList();
private iflogin(){};
static {loginlist.add(0);
loginlist.add(0);
loginlist.add(0);
}
public static List getInstance(){
return loginlist;
}
}
7
package dao;
import entity.car;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class jiageDB {
private static final List<car> jiagelist=new CopyOnWriteArrayList();
private jiageDB(){}
static {
}
public static List<car> getInstance(){
return jiagelist;
}
}
8
package dao;
import entity.basepinpai;
import entity.car;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class pinpaiDB {
private static final List<basepinpai> basepinpailist=new CopyOnWriteArrayList();
private static final List<basepinpai> basechexinglist=new CopyOnWriteArrayList();
private static final List<basepinpai> pinpaichexinglist=new CopyOnWriteArrayList();
private pinpaiDB(){}
static {
basechexinglist.add(new basepinpai("大众","朗逸"));
basechexinglist.add(new basepinpai("大众","速腾"));
basechexinglist.add(new basepinpai("大众","帕萨特"));
basechexinglist.add(new basepinpai("大众","桑塔纳"));
basechexinglist.add(new basepinpai("福特","金牛座"));
basechexinglist.add(new basepinpai("福特","锐际"));
basechexinglist.add(new basepinpai("福特","探险者"));
basechexinglist.add(new basepinpai("福特","福克斯"));
basechexinglist.add(new basepinpai("福特","锐界"));
basechexinglist.add(new basepinpai("斯柯达","明锐"));
basechexinglist.add(new basepinpai("斯柯达","速派"));
basechexinglist.add(new basepinpai("斯柯达","速尊"));
basechexinglist.add(new basepinpai("斯柯达","柯迪亚克"));
basepinpailist.add(new basepinpai("大众",""));
basepinpailist.add(new basepinpai("福特",""));
basepinpailist.add(new basepinpai("斯柯达",""));
}
public static List<basepinpai> getInstance1(){
return basepinpailist;
}
public static List<basepinpai>getInstance2(){
return basechexinglist;
}
public static List<basepinpai>getInstance3(){return pinpaichexinglist;}
}
9
10
package dao;
import entity.User;
import entity.car;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
//
public class UserDB {
// 唯一数据源
private static final List<User> userlist=new CopyOnWriteArrayList();
private UserDB(){
}
// 初始化数据源
static {
List<car> list1=new CopyOnWriteArrayList();
List<car> list2=new CopyOnWriteArrayList();
userlist.add(new User(0,"xxxxxxx","123456","100006@qq.com","12345678901","2021.12.27",list2));
userlist.add(new User(1,"manager","123456","100006@qq.com","12345678901","2021.12.27",list1 ));
userlist.add(new User(0,"test","123456","100006@qq.com","12345678901","2021.12.27",list2));
}
// 返回数据主体
public static List<User> getInstance(){
return userlist;
}
}
2.entity
1
package entity;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class basepinpai {
String chexing;
String pinpai;
public String getChexing() {
return chexing;
}
public void setChexing(String chexing) {
this.chexing = chexing;
}
public String getPinpai() {
return pinpai;
}
public void setPinpai(String pinpai) {
this.pinpai = pinpai;
}
public basepinpai(String pinpai,String chexing) {
this.pinpai = pinpai;
this.chexing=chexing;
}
public basepinpai(String pinpai){
this.pinpai=pinpai;
}
}
2
public String pinpai;
public String chexing;
public int lichen;
public int jiage;
public String fabudate;
public int pailiang;
public String shangpaidate;
public String liheqi;
DecimalFormat df = new DecimalFormat("0.00");
SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd");
public String getPinpai() {
return pinpai;
}
public void setPinpai(String pinpai) {
this.pinpai = pinpai;
}
public String getChexing() {
return chexing;
}
public void setChexing(String chexing) {
this.chexing = chexing;
}
public int getLichen() {
return lichen;
}
public void setLichen(int lichen) {
this.lichen = lichen;
}
public String getJiage() {
return df.format(jiage);
}
public void setJiage(int jiage) {
this.jiage = jiage;
}
public String getFabudate() {
return fabudate;
}
public void setFabudate(String fabudate) {
this.fabudate = fabudate;
}
public int getPailiang() {
return pailiang;
}
public void setPailiang(int pailiang) {
this.pailiang = pailiang;
}
public Date getShangpaidate() {
Date spdate=null;
try {
spdate = myFmt2.parse(shangpaidate);
} catch (ParseException e) {
e.printStackTrace();
}
return spdate;
}
public void setShangpaidate(String shangpaidate) {
this.shangpaidate = myFmt2.format(shangpaidate);
}
public String getLiheqi() {
return liheqi;
}
public void setLiheqi(String liheqi) {
this.liheqi = liheqi;
}
public car(String pinpai, String chexing, int lichen, int jiage, String fabudate, int pailiang, String shangpaidate, String liheqi) {
this.pinpai = pinpai;
this.chexing = chexing;
this.lichen = lichen;
this.jiage = jiage;
this.fabudate = fabudate;
this.pailiang = pailiang;
this.shangpaidate = shangpaidate;
this.liheqi = liheqi;
}
public String toString2() {
return pinpai+" "+chexing+" "+lichen+" "+jiage+" "+fabudate;
}
public String toString1() {
return pinpai+" "+chexing+" "+lichen+" "+jiage+" "+shangpaidate;
}
public String toString4(){return pinpai+" "+chexing;}
public String toString(){
return "品牌:"+pinpai+" 车型: "+chexing+" 里程数: "+lichen+" 价格: "+jiage+" 发布日期: "+fabudate
+" 排量:"+pailiang+" 上牌日期:"+shangpaidate+" 离合器类型:"+liheqi;
}
public String toString3(){return "商品:"+pinpai+" "+chexing+" 价格为"+getJiage()+" ";
}
3
package entity;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class futechexing {private static final List futechexinglist=new CopyOnWriteArrayList();
private futechexing(){}
static {
futechexinglist.add("金牛座");
futechexinglist.add("锐际");
futechexinglist.add("探险者");
futechexinglist.add("福克斯");
futechexinglist.add("锐界");
}
public static List<User> getInstance(){
return futechexinglist;
}
}
4
package entity;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class sikedachexing {
private static final List sikedachexinglist=new CopyOnWriteArrayList();
private sikedachexing(){}
static {
sikedachexinglist.add("明锐");
sikedachexinglist.add("速派");
sikedachexinglist.add("速尊");
sikedachexinglist.add("柯迪亚克");
}
public static List<User> getInstance(){
return sikedachexinglist;
}
}
5
package entity;
import java.util.List;
public class User {
public String name;
public String code;
public String mail;
public String mobile;
public String zhucedate;
public List<car> collcet;
public int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getZhucedate() {
return zhucedate;
}
public void setZhucedate(String zhucedate) {
this.zhucedate = zhucedate;
}
public List getCollcet() {
return collcet;
}
public void setCollcet(List collcet) {
this.collcet =collcet;
}
public User(){};
public User(int type,String name, String code, String mail, String mobile, String zhucedate,List<car> collcet){
this.name=name;
this.code=code;
this.mail=mail;
this.mobile=mobile;
this.zhucedate=zhucedate;
this.collcet=collcet;
this.type=type;
}
public String toString(){
return "账户类型:"+getType()+" 用户名:"+getName()+" 密码:"+getCode()+ " 邮箱:"+getMail()+" 手机号:"+getMobile()+" 注册时间为:"+getZhucedate();
}
}
3.function
1
package function;
import dao.comparation;
import entity.car;
import test.maintest;
import java.util.List;
import java.util.Scanner;
public class compare {
List<car> listcompare= comparation.getInstance();
Scanner sc=new Scanner(System.in);
public void choose(){
System.out.println("请选择您的操作:\n" +
"1.查看对比信息\n" +
"2.删除对比车辆\n" +
"3.返回上一级菜单");
int p=sc.nextInt();
if(p==1) see();
else if (p==2) del();
else if(p==3) maintest.getInstance().index();
}
private void del() {
if(listcompare.size()<1){
System.out.println("对比列表中无车辆,无法进行删除,请重新选择操作");
choose();
}
else {
for(int i=0;i<listcompare.size();i++){
System.out.print((i+1)+". ");
System.out.println(listcompare.get(i).toString4());
}
System.out.println("请选择您想删除的序号——");
int p=sc.nextInt();
if(p>0&&p<=listcompare.size()){
listcompare.remove(p-1);
System.out.println("删除成功!自动返回上一级菜单");
choose();
}
}
}
private void see() {
if (listcompare.size()<2){
System.out.println("未满两辆车,无法对比,请重新选择操作");choose();}
else {
System.out.print("品牌 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).getPinpai()); System.out.print(" ");
}
System.out.print("\n车型 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).chexing); System.out.print(" ");
}
System.out.print("\n价格 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).jiage); System.out.print(" ");
}
System.out.print("\n排量 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).pailiang); System.out.print(" ");
}
System.out.print("\n里程数 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).lichen); System.out.print(" ");
}
System.out.print("\n离合器 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).liheqi); System.out.print(" ");
}
System.out.print("\n上牌时间 ");
for(int i=0;i<listcompare.size();i++){
System.out.print(listcompare.get(i).shangpaidate); System.out.print(" ");
}
System.out.println("输入1返回上一级菜单,输入其他任意数字返回主菜单");
int a=sc.nextInt();
if(a==1)choose();
else maintest.getInstance().index();
}
}
}
2
package function;
import dao.*;
import entity.User;
import test.maintest;
import java.util.List;
import java.util.Scanner;
public class login {
List<User> list = UserDB.getInstance();
List listlogin= iflogin.getInstance();
Scanner scan = new Scanner(System.in);
public void checkUserName() {
if(new UserDao().checklogin()) {
System.out.println("请输入用户名:");
String userName = scan.next();
if (userName.equals("0")) {
System.out.println("谢谢使用!再见!");
} else if (new UserDao().checkUserName(userName)) {
System.out.println("请输入密码!---0键退出");
checkUserPassword(userName);
} else {
System.out.println("用户名输入有误!请重新输入!------0键退出");
checkUserName();
}
}
else {
System.out.println("已有用户正在登陆,请勿重复登录!已返回主菜单!");
maintest.getInstance().index();
}
}
public void checkUserPassword(String name) {
String userPassword = scan.next();
if (userPassword.equals("0")) {
System.out.println("谢谢使用!再见!");
} else if (new UserDao().checkUserPassword(name, userPassword)) {
System.out.println("请输入以下验证码(不区分大小写)!");
checkVercode(name);
} else {
System.out.println("密码错误!请重新输入————");
checkUserPassword(name);
}
}
public void checkVercode(String name) {
String a = new UserDao().vercode();
System.out.println("您的验证码是: " + a + " ");
String v = scan.next();
if (v.equals(a)) {
System.out.println("登陆成功!已返回主界面!");
int indext=new carDao().findindex(name);
listlogin.set(indext,1);
maintest.getInstance().index();
} else {
System.out.println("验证码输入错误,请再试一次!");
checkVercode(name);
}
}
public int index(String name){
return new carDao().findindex(name);
}
}
3
3
4
5
6
8
package function;
import dao.*;
import entity.User;
import entity.car;
import test.maintest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class vehicle {
DecimalFormat df = new DecimalFormat("0.00");
SimpleDateFormat df1 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
List<car> listcar= carDB.getInstance();
List<User> listuser= UserDB.getInstance();
List listlogin= iflogin.getInstance();
List<car> listcollcet= collection.getInstance();
List<car> listcompare= comparation.getInstance();
Scanner sc=new Scanner(System.in);
public void getlatest() {
System.out.println(" 品牌 车型 里程数 价格 发布时间");
for (int i = 0; i < 10; i++) {
System.out.println((i + 1) + "" + listcar.get(i).toString2());
}
getxiangxi(denglu());
}
public int denglu(){
for(int i=0;i<listlogin.size();i++){
if(listlogin.get(i).equals(1))
return i;}
return 0;
}
public int getxiangxi(int index) {
System.out.println("选择您想看的车辆具体信息编号,返回主菜单请输入0");
int a = sc.nextInt();
if (a == 0) maintest.getInstance().index();
else if (a > 0 && a < 11) {
String o=listcar.get(a-1).getChexing();
System.out.println(jutixinxi(a - 1));
caozuo(o,index);
}
else {
System.out.println("您输入的编号错误,重新输入!");
getxiangxi(index);
}
return a;
}
public String jutixinxi(int i) {
if (i >=0 && i < listcar.size()) {
return listcar.get(i).toString();
} else return "选择错误!请重新输入!";
}
public void caozuo(String chexing,int index){
if (listlogin.get(denglu()).equals(1)) {
System.out.println("1.收藏\n2.加入对比\n3.购买\n4.返回主菜单");
int r = sc.nextInt();
if (r == 1) collect(chexing,index);
else if(r==2)compare(chexing,index);
else if(r==3){
System.out.println("请输入您的金额");
double money=sc.nextDouble();
purchase((int) money,chexing);
}
else if(r==4) maintest.getInstance().index();
else {System.out.println("输入错误,请重新选择");
caozuo(chexing,index);}
} else System.out.println("1.收藏(您尚未登录不可使用此功能!选择此项前往登录)\n2.加入对比\n3.购买(您尚未登录不可使用此功能!选择此项前往登录)\n4.返回主菜单");
int s=sc.nextInt();
if(s==1||s==3)new login().checkUserName();
else if(s==2){
compare(chexing,index);
}
else if(s==4) maintest.getInstance().index();
else {
System.out.println("选择错误,请重新选择!");
caozuo(chexing,index);
}
}
public void compare(String chexing,int i) {
if (new carDao().checkcomparation(chexing)) {
listcompare.add(listcar.get(new carDao().findcarindex(chexing)));
System.out.println("加入对比列表成功!已返回上一级菜单");
caozuo(chexing, i);
} else {
System.out.println("该车型已在列表中,不可再次添加!已返回上级菜单");
caozuo(chexing, i);
}
}
public void purchase(int m,String chexing) {
int t=listcar.get(new carDao().findcarindex(chexing)).jiage;
if (m>=t) {
System.out.println("购买成功!购买凭条如下:\n" + listcar.get(new carDao().findcarindex(chexing)).toString2() + "购买时间: " + df1.format(new Date()));
System.out.println("输入任意值返回上一级菜单!");
Object t1 = sc.nextLong();
if (t1 != null) caozuo(chexing,denglu());
else {
System.out.println("");
}
}
else {
System.out.println("金额不足,无法购买!已返回上一级选择菜单!");
caozuo(chexing,denglu());
}
}
public void collect(String chexing,int userindex) {
if (new carDao().checkcollcetion(chexing)) {
listcollcet.clear();
listcollcet.add(listcar.get(new carDao().findcarindex(chexing)));
listuser.get(userindex).collcet.add(listcar.get(new carDao().findcarindex(chexing)));
System.out.println("收藏成功!输入0返回最热二手车信息菜单,输入其他任意数字返回主菜单");
int p = sc.nextInt();
if (p == 0) getlatest();
else maintest.getInstance().index();
}
else {
System.out.println("该车型已在您的收藏列表中");
caozuo(chexing,userindex);
}
}
}
具体文件移步至资源处下载!