软件开发与创新课程第一次作业——对于网上订书系统的一些改进
这篇博客是我自己软件开发与创新课程的第一次的作业。
1)博客介绍
本文中网上订书系统源码来自室友在大二上c++课程的大作业。所以本文分析和改进所运用的编程语言以C++为主。
此外,由于小编自己仍处于学习中,仅是大二的一名初学者,博客中若是有什么错误,望各位大佬在评论中不吝指出。
2)原网上订书系统代码分析
1 #include <string> 2 #include <fstream> 3 #include <iostream> 4 #include <windows.h> 5 using namespace std; 6 7 /*普通人标识为1,会员标识为2,贵宾为3*/ 8 long int orderid = 00000000;//全局变量,订单号 9 bool readbuyer = false;//全局变量,控制buyer数据库的开启关闭 10 bool readbook = false; //全局变量,控制book数据库的开启关闭 11 class buyer { 12 protected: 13 string name; 14 int buyerID; //唯一识别号(号码不可重复) 15 string address; 16 double pay; 17 public: 18 buyer(); 19 buyer(string n, int b, string a, double p = 0); 20 string getbuyname(); 21 string getaddress(); 22 int getid(); 23 double getpay(); 24 virtual void display() = 0; 25 virtual void setpay(double = 0) = 0; 26 virtual void setbuyerinfo() = 0; 27 }; 28 class member :public buyer { 29 protected: 30 int leaguer_grade; 31 public: 32 member(string n, int b, int l, string a, double p) :buyer(n, b, a, p) 33 { 34 leaguer_grade = l; 35 if (!readbuyer) 36 setbuyerinfo(); 37 } 38 void setbuyerinfo(); 39 void display(); 40 void setpay(double p); 41 }; 42 class honoured_guest :public buyer { 43 double discount_rate; 44 public: 45 honoured_guest(string n, int b, double r, string a, double p) :buyer(n, b, a, p) 46 { 47 discount_rate = r; 48 if (!readbuyer) 49 setbuyerinfo(); 50 } 51 void setbuyerinfo(); 52 void display(); 53 void setpay(double p); 54 }; 55 class layfolk :public buyer { 56 public: 57 layfolk(string n, int b, string a, double p) :buyer(n, b, a, p) 58 { 59 if (!readbuyer)setbuyerinfo(); 60 } 61 void setbuyerinfo(); 62 void display(); 63 void setpay(double p); 64 }; 65 66 /*全局变量*/ 67 layfolk* normalman[20] = { NULL }; 68 member* memberman[20] = { NULL }; 69 honoured_guest* guestman[20] = { NULL }; 70 int normalnow = 0, membernow = 0, guestnow = 0; 71 72 buyer::buyer() 73 { 74 name = ""; 75 buyerID = 0; 76 address = ""; 77 pay = 0; 78 } 79 buyer::buyer(string n, int b, string a, double p) 80 { 81 name = n; 82 buyerID = b; 83 address = a; 84 pay = p; 85 } 86 double buyer::getpay() 87 { 88 return pay; 89 } 90 string buyer::getaddress() 91 { 92 return address; 93 } 94 string buyer::getbuyname() 95 { 96 return name; 97 } 98 int buyer::getid() 99 { 100 return buyerID; 101 } 102 void member::setbuyerinfo() 103 { 104 ofstream fout("buyerinfo.dat", ios::app | ios::out); 105 if (!fout) 106 { 107 cout << "Cannot open buyerinfo.dat !(error 1)\n"; 108 exit(1); 109 } 110 fout << '\n' << 2 << ' ' << buyerID << ' ' << name << ' ' << address << ' ' << leaguer_grade; 111 fout.close(); 112 } 113 void member::display() 114 { 115 cout << "姓名:" << name << '\t'; 116 cout << "ID:" << buyerID << '\t'; 117 cout << "会员级别:" << leaguer_grade << '\n'; 118 cout << "地址:" << address << '\n' << '\n'; 119 } 120 void member::setpay(double p) 121 { 122 switch (leaguer_grade) 123 { 124 case 1: 125 pay = 0.95 * p + pay; 126 break; 127 case 2: 128 pay = 0.90 * p + pay; 129 break; 130 case 3: 131 pay = 0.85 * p + pay; 132 break; 133 case 4: 134 pay = 0.80 * p + pay; 135 break; 136 case 5: 137 pay = 0.70 * p + pay; 138 break; 139 default: 140 cout << "\n会员级别错误!(error 2)\n\n"; 141 system("pause"); 142 exit(2); 143 break; 144 } 145 } 146 147 void honoured_guest::setbuyerinfo() 148 { 149 ofstream fout("buyerinfo.dat", ios::app | ios::out); 150 if (!fout) 151 { 152 cout << "Cannot open buyerinfo.dat !(error 1)\n"; 153 exit(1); 154 } 155 fout << '\n' << 3 << ' ' << buyerID << ' ' << name << ' ' << address << ' ' << discount_rate; 156 fout.close(); 157 } 158 void honoured_guest::display() 159 { 160 cout << "姓名:" << name << '\t'; 161 cout << "ID:" << buyerID << '\t'; 162 cout << "贵宾折扣:" << discount_rate * 100 << '%' << '\n'; 163 cout << "地址:" << address << '\n' << '\n'; 164 } 165 void honoured_guest::setpay(double p) 166 { 167 pay = (1 - discount_rate) * p + pay; 168 } 169 void layfolk::setbuyerinfo() 170 { 171 ofstream fout("buyerinfo.dat", ios::app | ios::out); 172 if (!fout) 173 { 174 cout << "Cannot open buyerinfo.dat !(error 1)\n"; 175 system("pause"); 176 exit(1); 177 } 178 fout << '\n' << 1 << ' ' << buyerID << ' ' << name << ' ' << address; 179 fout.close(); 180 } 181 void layfolk::display() 182 { 183 cout << "姓名:" << name << '\t'; 184 cout << "ID:" << buyerID << '\t'; 185 cout << "普通用户" << '\n'; 186 cout << "地址:" << address << '\n' << '\n'; 187 } 188 void layfolk::setpay(double p) 189 { 190 pay = p + pay; 191 } 192 193 class book { 194 protected: 195 string book_ID; 196 string book_name; 197 string author; 198 string publishing; 199 double price; 200 public: 201 book(); 202 book(string b_id, string b_n, string au, string pu, double pr); 203 void display(); 204 string getbook_ID(); 205 string getbook_name(); 206 string getauthor(); 207 string getpublishing(); 208 double getprice(); 209 void setbookinfo(); 210 friend void showallbooks(); 211 }; 212 213 book* bbook[20] = { NULL };//全局变量 214 int booknow = 0;//全局变量 215 216 book::book() 217 { 218 book_ID = ""; 219 book_name = ""; 220 author = ""; 221 publishing = ""; 222 price = 0; 223 } 224 book::book(string b_id, string b_n, string au, string pu, double pr) 225 { 226 book_ID = b_id; 227 book_name = b_n; 228 author = au; 229 publishing = pu; 230 price = pr; 231 if (!readbook) 232 setbookinfo(); 233 } 234 void book::setbookinfo() 235 { 236 ofstream ffout("bookinfo.dat", ios::app | ios::out); 237 if (!ffout) 238 { 239 cout << "Cannot open bookinfo.dat !(error 3)\n"; 240 system("pause"); 241 exit(3); 242 } 243 ffout << '\n' << book_ID << ' ' << book_name << ' ' << author << ' ' << publishing << ' ' << price; 244 ffout.close(); 245 } 246 void showallbooks() 247 { 248 int i; 249 string b_ID; 250 string b_name; 251 string au; 252 string pu; 253 double pr; 254 ifstream ffin("bookinfo.dat", ios::in); 255 if (!ffin) 256 { 257 cout << "Cannot open bookinfo.dat !(error 4)\n"; 258 system("pause"); 259 exit(4); 260 } 261 cout << "库中所有图书列表:\n\n"; 262 for (i = 1; ffin.eof() == 0; i++) 263 { 264 ffin >> b_ID >> b_name >> au >> pu >> pr; 265 cout << i << "、"; 266 cout << "书号:" << b_ID << '\t'; 267 cout << "书名:" << b_name << '\t'; 268 cout << "作者:" << au << '\n'; 269 cout << "出版社:" << pu << '\t'; 270 cout << "定价:" << pr << '\n'; 271 } 272 ffin.close(); 273 cout << "\n\n"; 274 } 275 276 void book::display() 277 { 278 cout << "书号:" << book_ID << '\t'; 279 cout << "书名:" << book_name << '\t'; 280 cout << "作者:" << author << '\n'; 281 cout << "出版社:" << publishing << '\t'; 282 cout << "定价:" << price << '\n'; 283 } 284 string book::getbook_ID() 285 { 286 return book_ID; 287 } 288 string book::getbook_name() 289 { 290 return book_name; 291 } 292 string book::getauthor() 293 { 294 return author; 295 } 296 string book::getpublishing() 297 { 298 return publishing; 299 } 300 double book::getprice() 301 { 302 return price; 303 } 304 305 void savenoworder()//存当前订单号,关闭应用后下次开启可继续用 306 { 307 ofstream ffout("intro_order.dat", ios::trunc | ios::out); 308 if (!ffout) 309 { 310 cout << "Cannot open intro_order.dat !(error 6)\n"; 311 system("pause"); 312 exit(6); 313 } 314 ffout << orderid; 315 ffout.close(); 316 } 317 318 long int createorder(buyer* nowbuyer, book** choosebook, int howmanybook) //存订单 319 { 320 int i; 321 ofstream fout("orderinfo.dat", ios::app | ios::out); 322 if (!fout) 323 { 324 cout << "Cannot open orderinfo.dat !(error 5)\n"; 325 system("pause"); 326 exit(5); 327 } 328 fout << '\n' << nowbuyer->getid() << ' ' << nowbuyer->getbuyname() << ' ' << nowbuyer->getaddress(); 329 for (i = 0; i < howmanybook; i++) 330 { 331 book* chb; 332 chb = *(choosebook + i); 333 fout << '\n' << '\t' << chb->getbook_ID() << ' ' << chb->getbook_name(); 334 } 335 fout << "\n\t" << orderid; 336 fout.close(); 337 orderid++; 338 savenoworder(); 339 return orderid - 1; 340 } 341 342 void startorder() 343 { 344 ifstream ffin("intro_order.dat", ios::in); 345 if (!ffin) 346 { 347 cout << "未找到起始订单号文件,\ 348 \n请手动在主程序所在目录下创建intro_order.dat文件,\ 349 \n并写入orderinfo.dat文件末位订单号+1的八位数字。\n"; 350 system("pause"); 351 exit(7); 352 } 353 ffin >> orderid; 354 } 355 356 int initbuyerinfo() //每次打开程序后先读取文件中的买家信息并写入类 357 { 358 ifstream fffin("buyerinfo.dat", ios::in); 359 if (!fffin) 360 return 0; 361 362 readbuyer = true; //写入模式,屏蔽库 363 364 int t; //存买家身份 365 string na; 366 int bu; 367 string ad; 368 int le; //如会员则赋值 369 double di; //如贵宾则赋值 370 for (; fffin.eof() == 0;) 371 { 372 fffin >> t; 373 switch (t) 374 { 375 case 1: 376 fffin >> bu >> na >> ad; 377 normalman[normalnow] = new layfolk(na, bu, ad, 0); 378 normalnow++; 379 break; 380 case 2: 381 fffin >> bu >> na >> ad >> le; 382 memberman[membernow] = new member(na, bu, le, ad, 0); 383 membernow++; 384 break; 385 case 3: 386 fffin >> bu >> na >> ad >> di; 387 guestman[guestnow] = new honoured_guest(na, bu, di, ad, 0); 388 guestnow++; 389 break; 390 default : 391 cout << "\n\n读取buyerinfo.dat时遇到未知等级信息。\n\n"; 392 system("pause"); 393 exit(9); 394 } 395 } 396 readbuyer = false; //写入模式结束,开启库 397 return 1; 398 } 399 400 int initbookinfo() //每次打开程序后先读取文件中的书籍信息并写入类 401 { 402 ifstream fffin("bookinfo.dat", ios::in); 403 if (!fffin) 404 return 0; 405 406 readbook = true; //写入模式,屏蔽库 407 408 string b_ID; 409 string b_name; 410 string au; 411 string pu; 412 double pr; 413 for (; fffin.eof() == 0;) 414 { 415 fffin >> b_ID >> b_name >> au >> pu >> pr; 416 bbook[booknow] = new book(b_ID, b_name, au, pu, pr); 417 booknow++; 418 } 419 readbook = false; //写入模式结束,开启库 420 return 1; 421 } 422 423 class show { 424 public: 425 void showwelcome(); 426 void showaddbuyer(); 427 void showaddbook(); 428 void showbuybook(); 429 }; 430 show nn;//全局变量,显示界面 431 void show::showwelcome() 432 { 433 system("cls"); 434 int i; 435 cout << "*----------------------------------------------------------------*" << "\n\n"; 436 cout << " 欢迎使用葛宝书籍交易平台1.0" << "\n\n"; 437 cout << " 1、买书" << "\n"; 438 cout << " 2、添加书籍信息" << "\n\n"; 439 cout << "*----------------------------------------------------------------*" << "\n\n"; 440 cout << "请输入:"; 441 cin >> i; 442 if (i == 1) 443 nn.showbuybook(); 444 else if (i == 2) 445 nn.showaddbook(); 446 else 447 { 448 cout << "输入错误"; 449 system("pause"); 450 nn.showwelcome(); 451 } 452 } 453 void show::showbuybook() 454 { 455 system("cls"); 456 int choose = 0, i = 0, j, howmanybook = 0; 457 book** choosebook = new book * [20]; 458 for (j = 0; j < 20; j++) 459 choosebook[j] = NULL; 460 461 showallbooks(); 462 cout << "\n\n请选择要购买的书籍(按 0 结束选择):" << endl; 463 cin >> choose; 464 if (choose == 0) 465 { 466 467 nn.showwelcome(); 468 } 469 else { 470 for (; choose != 0;) 471 { 472 if (choose - 1 <= booknow) 473 { 474 choosebook[i++] = bbook[choose - 1]; 475 cout << "选择成功!继续选择。(按 0 结束选择)" << endl; 476 cin >> choose; 477 } 478 else 479 { 480 cout << "输入错误!\n"; 481 system("pause"); 482 nn.showwelcome(); 483 } 484 } 485 system("cls"); 486 cout << "\n\n" << "请确认您选的图书:" << endl; 487 for (i = 0; choosebook[i] != NULL; i++) 488 { 489 cout << i + 1 << "、"; 490 cout << "书号:" << choosebook[i]->getbook_ID() << '\t'; 491 cout << "书名:" << choosebook[i]->getbook_name() << '\t'; 492 cout << "作者:" << choosebook[i]->getauthor() << '\n'; 493 cout << "出版社:" << choosebook[i]->getpublishing() << '\t'; 494 cout << "定价:" << choosebook[i]->getprice() << '\n'; 495 howmanybook++; 496 } 497 for (;;) { 498 cout << "\n\n确认按 1 ,取消按 0:"; 499 cin >> i; 500 if (i == 1) 501 { 502 cout << "\n\n是否为新用户(1是,0否):"; 503 cin >> i; 504 if (i == 0) 505 { 506 int nowid, t = 0; 507 buyer* nowbuyer = NULL; 508 cout << "\n\n请输入ID卡号(4位号码):"; 509 cin >> nowid; 510 switch (nowid / 1000) 511 { 512 case 1: 513 for (i = 0; normalman[i] != NULL; i++) 514 { 515 if (normalman[i]->getid() == nowid) 516 { 517 t = 1; 518 nowbuyer = normalman[i]; 519 break; 520 } 521 } 522 break; 523 case 2: 524 for (i = 0; memberman[i] != NULL; i++) 525 { 526 cout << "test"; 527 if (memberman[i]->getid() == nowid) 528 { 529 t = 1; 530 nowbuyer = memberman[i]; 531 break; 532 } 533 } 534 break; 535 case 3: 536 for (i = 0; guestman[i] != NULL; i++) 537 { 538 if (guestman[i]->getid() == nowid) 539 { 540 t = 1; 541 nowbuyer = guestman[i]; 542 break; 543 } 544 } 545 break; 546 default: 547 cout << "\n卡号输入有误!" << endl; 548 } 549 if (t == 1) 550 { 551 system("cls"); 552 cout << "\n\n尊敬的" << nowbuyer->getbuyname() << "顾客您好!\n\n"; 553 cout << "您的订单信息:\n\n"; 554 for (i = 0; i < howmanybook; i++) 555 { 556 cout << i + 1 << "、"; 557 cout << "书号:" << choosebook[i]->getbook_ID() << '\t'; 558 cout << "书名:" << choosebook[i]->getbook_name() << '\t'; 559 cout << "作者:" << choosebook[i]->getauthor() << '\n'; 560 cout << "出版社:" << choosebook[i]->getpublishing() << '\t'; 561 cout << "定价:" << choosebook[i]->getprice() << '\n'; 562 nowbuyer->setpay(choosebook[i]->getprice()); 563 } 564 Sleep(1000); 565 if (nowbuyer->getpay() < 0) 566 { 567 cout << "\n\n结算异常!终止交易!(exit 8)\n\n"; 568 system("pause"); 569 exit(8); 570 } 571 cout << "\n\t您需要支付:" << nowbuyer->getpay() << "\n\n"; 572 Sleep(3000); 573 long int xx; 574 xx = createorder(nowbuyer, choosebook, howmanybook); 575 cout << "订单创建中………"; 576 Sleep(5000); 577 cout << "\n\n\t支付成功!\n\n"; 578 system("pause"); 579 system("cls"); 580 cout << "\n\n您的购书信息:\n\n"; 581 cout << "\t姓名:" << nowbuyer->getbuyname() << ' ' << "收货地址:" << nowbuyer->getaddress() << "\n\n"; 582 cout << "\t购书信息:\n\n"; 583 for (i = 0; i < howmanybook; i++) 584 { 585 cout << i + 1 << "、"; 586 cout << "书号:" << choosebook[i]->getbook_ID() << '\t'; 587 cout << "书名:" << choosebook[i]->getbook_name() << '\t'; 588 cout << "作者:" << choosebook[i]->getauthor() << '\n'; 589 cout << "出版社:" << choosebook[i]->getpublishing() << '\t'; 590 cout << "定价:" << choosebook[i]->getprice() << '\n'; 591 nowbuyer->setpay(choosebook[i]->getprice()); 592 } 593 cout << "\n\t订单号:" << xx << "\n\n"; 594 t = 0; 595 howmanybook = 0; 596 nowid = 0; 597 } 598 else 599 { 600 int x; 601 cout << "\n查无此卡号!\n" << endl; 602 cout << "返回按 0:"; 603 cin >> x; 604 nn.showwelcome(); 605 t = 0; 606 howmanybook = 0; 607 nowid = 0; 608 } 609 } 610 else 611 { 612 howmanybook = 0; 613 } 614 system("pause"); 615 break; 616 } 617 else if (i == 0) 618 { 619 cout << "取消订单成功!" << endl; 620 621 delete[]choosebook; 622 system("pause"); 623 break; 624 } 625 else 626 cout << "输入有误!" << endl; 627 } 628 nn.showwelcome(); 629 } 630 } 631 632 void show::showaddbook() 633 { 634 string b_ID; 635 string b_name; 636 string au; 637 string pu; 638 double pr; 639 system("cls"); 640 cout << "欢迎进入图书信息录入系统\n\n"; 641 cout << "\t请输入书籍 ISBN 号:"; 642 cin >> b_ID; 643 cout << "\n\t请输入书籍名称:"; 644 cin >> b_name; 645 cout << "\n\t请输入书籍作者:"; 646 cin >> au; 647 cout << "\n\t请输入书籍出版社:"; 648 cin >> pu; 649 cout << "\n\t请输入定价:"; 650 cin >> pr; 651 bbook[booknow++] = new book(b_ID, b_name, au, pu, pr); 652 cout << "\t创建中………请稍等\n"; 653 Sleep(500); 654 cout << "\n\t创建成功\n!"; 655 system("pause"); 656 nn.showwelcome(); 657 } 658 659 int main() 660 { 661 int i; 662 book* c[2]; 663 buyer* b[4]; 664 startorder(); 665 if (!initbuyerinfo()) 666 { 667 normalman[normalnow++] = new layfolk("林小茶", 1001, "北京", 0); 668 guestman[guestnow++] = new honoured_guest("王瑶瑶", 3001, 0.6, "上海", 0); 669 memberman[membernow++] = new member("赵红艳", 2001, 5, "广州", 0); 670 normalman[normalnow++] = new layfolk("林小北", 1002, "南京", 0); 671 } 672 b[0] = normalman[0]; 673 b[1] = memberman[0]; 674 b[2] = guestman[0]; 675 b[3] = normalman[1]; 676 677 if (!initbookinfo()) 678 { 679 bbook[booknow++] = new book("7-302-04504-6", "C++程序设计", "谭浩强", "清华", 25); 680 bbook[booknow++] = new book("7-402-03388-9", "数据结构", "许卓群", "北大", 20); 681 } 682 c[0] = bbook[0]; 683 c[1] = bbook[1]; 684 nn.showwelcome(); 685 return 0; 686 }
原作者先是建立了readbuyer、readbook两个全局变量来控制buyer、book两个数据库的开启和关闭,实际上就是控制文件的读写。之后便是建立了book类和buyer类来记录和控制用户、书籍的数据。

为了便于区分用户的会员等级,计算订单费用,建立了buyer类的三个子类:member类(普通用户)、honoured_guest类(会员)、layfolk类(贵宾)。还通过normalman、memberman、guestman三个数组来存储用户的数据,并用normalmow、membernow、guestnow三个整型变量来记录各种类型用户的个数。
此外,值得一提的就是为了便于记录设立了三个dat文件来存储书籍、用户、订单的信息,使用了setbuyerinfo、setbookinfo、savenoworder、createorder、startorder等函数具体操控信息的生成和读写。这样文件读写的方式可以更加简洁直观地管理员知晓系统中的数据,方便管理及后续的账单生成等操作的进行。至于,室友生成的是dat文件,而不是txt文件,还是要解释一下,在我的理解和查阅的资料中来说,本系统下生成txt文件还是dat文件本质上没有什么差别,只是dat是以二进制格式存入数据的,txt是以文本格式(ASCII码)存入的罢了。具体生成什么文件,在本系统中仅仅是习惯问题而已。
总体上来说,系统总体上功能齐全,界面简单直接,是一份优秀的大作业。但今天把它那出来总归还是有可以改进的地方的。
3) 存在的问题



我们从上图中不难看出该系统中存在缺少创建新用户的功能。仅仅是在前端显示时做了一个假的框架。
4)改进方案
我们可以先以函数的方式创建一个“添加新用户”的新功能,并将这个函数拼接在“买书”这个功能下方补全功能。
改进后添加的showaddbuyer函数:
1 void show::showaddbuyer() 2 { 3 string nam, addr; 4 int i; 5 int level = 1; 6 double rate = 0.0; 7 system("cls"); 8 cout << "欢迎进入添加用户系统:\n\n"; 9 cout << "请输入用户姓名:"; 10 cin >> nam; 11 cout << "\n请输入用户收货地址:"; 12 cin >> addr; 13 cout << "\n请选择用户类型(普通用户 1,会员 2, 贵宾 3):"; 14 cin >> i; 15 switch (i) 16 { 17 case 1: 18 normalman[normalnow++] = new layfolk(nam, 1001 + normalnow, addr, 0); 19 cout << "\t创建中………请稍等\n"; 20 Sleep(500); 21 cout << "\t创建成功!\n"; 22 cout << "\t您的卡号:\t" << 1000 + normalnow << "\t请妥善保管,遗失概不负责。\n\n"; 23 break; 24 case 2: 25 cout << "\n会员等级:"; 26 cin >> level; 27 memberman[membernow++] = new member(nam, 2001 + membernow, level, addr, 0); 28 cout << "\t创建中………请稍等\n"; 29 Sleep(500); 30 cout << "\t创建成功!\n"; 31 cout << "\t您的卡号:\t" << 2000 + membernow << "\t请妥善保管,遗失概不负责。\n\n"; 32 break; 33 case 3: 34 cout << "\n贵宾折扣(小数形式):"; 35 cin >> rate; 36 guestman[guestnow++] = new honoured_guest(nam, 3001 + guestnow, 1 - rate, addr, 0); 37 cout << "\t创建中………请稍等\n"; 38 Sleep(500); 39 cout << "\t创建成功!\n"; 40 cout << "\t您的卡号:\t" << 3000 + guestnow << "\t请妥善保管,遗失概不负责。\n\n"; 41 break; 42 default: 43 cout << "\n\t选择错误!\n"; 44 system("pause"); 45 nn.showwelcome(); 46 } 47 system("pause"); 48 nn.showwelcome(); 49 }
之后将showaddbuyer函数添加在showbuybook这个函数下方

这样一来,整个系统的功能就相对完整,在顾客一端注册账户、买书,订单生成都可以实现,功能齐全,管理员角度来说,添加书籍、查看各种数据的方式也相对简便,订单也简洁明了。
5)改进效果
界面截图





浙公网安备 33010602011771号