分类

课内:
不限
类型:
不限 毕业设计 课程设计 小学期 大作业
汇编语言 C语言 C++ JAVA C# JSP PYTHON PHP
数据结构与算法 操作系统 编译原理 数据库 计算机网络 软件工程 VC++程序设计
游戏 PC程序 APP 网站 其他
评分:
不限 10 9 8 7 6 5 4 3 2 1
年份:
不限 2018 2019 2020 2021

资源列表

  • 基于C语言的简单文件系统的实现

    1 题目介绍通过具体的文件存储空间的管理、文件物理结构、目录结构和文件操作的实现,加深对文件系统内部的数据结构、功能以及实现过程的理解。
    1.1 要求
    在内存中开辟一个虚拟磁盘空间作为文件存储分区,在其上实现一个简单的基于多级目录的单用户单任务系统中的文件系统。在推出该文件系统的使用时,应将虚拟磁盘上的内容以一个文件的方式保存到磁盘上,一遍下次可以将它恢复到内存的虚拟磁盘中
    文件物理结构可采用显式链接或其他结构
    空闲磁盘空间的管理可选择FAT表、位示图或其他办法
    文件目录结构采用多级目录结构。为简单起见,可以不使用索引结点,每个目录项应包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护
    需要提供一以下操作命令
    my_format my_mkdir my_rmdir my_ls my_cd my_create my_open my_close my_write my_read my_rm my_exitsys

    2 实验思路2.1 程序设计思想
    在该虚拟文件系统启动时,申请一块内存作为磁盘空间
    将这块内存空间进行格式化,本系统仿照的是FAT16文件系统,其结构如下
    | 1块 | 2块 | 2块 | 995块 | | :—: | :—: | :—: | :—: | | 引导块 | FAT1 | FAT2 | 数据区 |
    格式化时,主要包括引导块,FAT1,FAT2,的一些初始化工作。例如设置文件魔数,文件系统的信息,FAT1,FAT2的信息等等
    根据用户输入的命令,调用对应的my_函数

    程序流程图如下:

    2.2 关键数据结构设计2.2.1 文件控制块typedef struct FCB{ char filename[8]; // 文件名 char exname[3]; // 文件扩展名 unsigned char attribute; // 文件属性字段(目录or文件) unsigned short time; // 创建时间 unsigned short date; // 创建日期 unsigned short first; // 起始盘块号 unsigned short length; // 文件长度 char free; // 表示目录项是否为空} fcb;
    2.2.2 文件分配表typedef struct FAT { unsigned short id;} fat;
    2.2.3 用户打开文件表当打开一个文件时,必须将文件的目录项中的所有内容全部复制到内存中,同时还要记录有关文件操作的动态信息,如读写指针的值等。在本实例中实现的是一个用于单用户单任务系统的文件系统,为简单起见,我们把用户文件描述符表和内存FCB表合在一起,称为用户打开文件表,表项数目为10,即一个用户最多可同时打开10个文件。然后用一个数组来描述,则数组下标即某个打开文件的描述符。另外,我们在用户打开文件表中还设置了一个字段“char dir[80]”,用来记录每个打开文件所在的目录名,以方便用户打开不同目录下具有相同文件名的不同文件。
    typedef struct USEROPEN{ char filename[8]; char exname[3]; unsigned char attribute; unsigned short time; unsigned short date; unsigned short first; unsigned short length; char free; int dirno; // 父目录文件起始盘块号 int diroff; // 该文件对应的 fcb 在父目录中的逻辑序号 char dir[MAXOPENFILE][80]; // 全路径信息 int count; char fcbstate; // 是否修改 1是 0否 char topenfile; // 0: 空 openfile} useropen;
    2.2.4 引导块BLOCK0在引导块中主要存放逻辑磁盘的相关描述信息,比如磁盘块大小、磁盘块数量、文件分配表、根目录区、数据区在磁盘上的起始位置等。如果是引导盘,还要存放操作系统的引导信息。本实例是在内存的虚拟磁盘中创建一个文件系统,因此所包含的内容比较少,只有磁盘块大小、磁盘块数量、数据区开始位置、根目录文件开始位置等。
    typedef struct BLOCK { char magic_number[8]; char information[200]; unsigned short root; unsigned char* startblock;} block0;
    2.3 全局变量定义指向虚拟磁盘的起始地址
    unsigned char* myvhard;
    用户打开文件表数组
    useropen openfilelist[MAXOPENFILE];
    记录虚拟磁盘上的数据区开始位置
    unsigned char* startp;
    2.4 虚拟磁盘空间布局由于真正的磁盘操作需要涉及到设备的驱动程序,所以本实例是在内存中申请一块空间作为虚拟磁盘使用,我们的文件系统就建立在这个虚拟磁盘上。虚拟磁盘一共划分成1000个磁盘块,每个块1024个字节,其布局格式是模仿FAT文件系统设计的,其中引导块占一个盘块,两张FAT各占2个盘块,剩下的空间全部是数据区,在对虚拟磁盘进行格式化的时候,将把数据区第1块(即虚拟磁盘的第6块)分配给根目录文件,如下图所示:

    3 核心代码与实验结果及实验结果分析3.1 核心代码与实验结果格式化磁盘
    void my_format(){ /** * 初始化前五个磁盘块 * 设定第六个磁盘块为根目录磁盘块 * 初始化 root 目录: 创建 . 和 .. 目录 * 写入 FILENAME 文件 (写入磁盘空间) */ block0* boot = (block0*)myvhard; strcpy(boot->magic_number, "10101010"); strcpy(boot->information, "fat file system"); boot->root = 5; boot->startblock = myvhard + BLOCKSIZE * 5; fat* fat1 = (fat*)(myvhard + BLOCKSIZE); fat* fat2 = (fat*)(myvhard + BLOCKSIZE * 3); int i; for (i = 0; i < 6; i++) { fat1[i].id = END; fat2[i].id = END; } for (i = 6; i < 1000; i++) { fat1[i].id = FREE; fat2[i].id = FREE; } // 5th block is root fcb* root = (fcb*)(myvhard + BLOCKSIZE * 5); strcpy(root->filename, "."); strcpy(root->exname, "di"); root->attribute = 0; // dir file time_t rawTime = time(NULL); struct tm* time = localtime(&rawTime); // 5 6 5 bits root->time = time->tm_hour * 2048 + time->tm_min * 32 + time->tm_sec / 2; // 7 4 5 bits; year from 2000 root->date = (time->tm_year - 100) * 512 + (time->tm_mon + 1) * 32 + (time->tm_mday); root->first = 5; root->free = 1; root->length = 2 * sizeof(fcb); fcb* root2 = root + 1; memcpy(root2, root, sizeof(fcb)); strcpy(root2->filename, ".."); for (i = 2; i < (int)(BLOCKSIZE / sizeof(fcb)); i++) { root2++; strcpy(root2->filename, ""); root2->free = 0; } FILE* fp = fopen(FILENAME, "w"); fwrite(myvhard, SIZE, 1, fp); fclose(fp);}
    创建目录

    调用do_read读入当前目录文件到内存,检查新建文件目录是否重名分配一个空闲的打开文件表项分配一个空闲的盘块在当前目录中问新建目录寻找一个空闲的目录项设置FCB,文件的属性信息创建特殊的两个目录项‘.’,‘..’返回
    void my_mkdir(char* dirname){ /** * 当前目录:当前打开目录项表示的目录 * 该目录:以下指创建的目录 * 父目录:指该目录的父目录 * 如: * 我现在在 root 目录下, 输入命令 mkdir a/b/bb * 表示 在 root 目录下的 a 目录下的 b 目录中创建 bb 目录 * 这时,父目录指 b,该目录指 bb,当前目录指 root * 以下都用这个表达,简单情况下,当前目录和父目录是一个目录 * 来不及了,先讨论简单情况,即 mkdir bb */ int i = 0; char text[MAX_TEXT_SIZE]; char* fname = strtok(dirname, "."); char* exname = strtok(NULL, "."); if (exname != NULL) { printf("you can not use extension\n"); return; } // 读取父目录信息 openfilelist[currfd].count = 0; int filelen = do_read(currfd, openfilelist[currfd].length, text); fcb* fcbptr = (fcb*)text; // 查找是否重名 for (i = 0; i < (int)(filelen / sizeof(fcb)); i++) { if (strcmp(dirname, fcbptr[i].filename) == 0 && fcbptr->attribute == 0) { printf("dir has existed\n"); return; } } // 申请一个打开目录表项 int fd = get_free_openfilelist(); if (fd == -1) { printf("openfilelist is full\n"); return; } // 申请一个磁盘块 unsigned short int block_num = get_free_block(); if (block_num == END) { printf("blocks are full\n"); openfilelist[fd].topenfile = 0; return; } // 更新 fat 表 fat* fat1 = (fat*)(myvhard + BLOCKSIZE); fat* fat2 = (fat*)(myvhard + BLOCKSIZE * 3); fat1[block_num].id = END; fat2[block_num].id = END; // 在父目录中找一个空的 fcb,分配给该目录 ??未考虑父目录满的情况?? for (i = 0; i < (int)(filelen / sizeof(fcb)); i++) { if (fcbptr[i].free == 0) { break; } } openfilelist[currfd].count = i * sizeof(fcb); openfilelist[currfd].fcbstate = 1; // 初始化该 fcb fcb* fcbtmp = (fcb*)malloc(sizeof(fcb)); fcbtmp->attribute = 0; time_t rawtime = time(NULL); struct tm* time = localtime(&rawtime); fcbtmp->date = (time->tm_year - 100) * 512 + (time->tm_mon + 1) * 32 + (time->tm_mday); fcbtmp->time = (time->tm_hour) * 2048 + (time->tm_min) * 32 + (time->tm_sec) / 2; strcpy(fcbtmp->filename, dirname); strcpy(fcbtmp->exname, "di"); fcbtmp->first = block_num; fcbtmp->length = 2 * sizeof(fcb); fcbtmp->free = 1; do_write(currfd, (char*)fcbtmp, sizeof(fcb), 2); // 设置打开文件表项 openfilelist[fd].attribute = 0; openfilelist[fd].count = 0; openfilelist[fd].date = fcbtmp->date; openfilelist[fd].time = fcbtmp->time; openfilelist[fd].dirno = openfilelist[currfd].first; openfilelist[fd].diroff = i; strcpy(openfilelist[fd].exname, "di"); strcpy(openfilelist[fd].filename, dirname); openfilelist[fd].fcbstate = 0; openfilelist[fd].first = fcbtmp->first; openfilelist[fd].free = fcbtmp->free; openfilelist[fd].length = fcbtmp->length; openfilelist[fd].topenfile = 1; strcat(strcat(strcpy(openfilelist[fd].dir, (char*)(openfilelist[currfd].dir)), dirname), "/"); // 设置 . 和 .. 目录 fcbtmp->attribute = 0; fcbtmp->date = fcbtmp->date; fcbtmp->time = fcbtmp->time; strcpy(fcbtmp->filename, "."); strcpy(fcbtmp->exname, "di"); fcbtmp->first = block_num; fcbtmp->length = 2 * sizeof(fcb); do_write(fd, (char*)fcbtmp, sizeof(fcb), 2); fcb* fcbtmp2 = (fcb*)malloc(sizeof(fcb)); memcpy(fcbtmp2, fcbtmp, sizeof(fcb)); strcpy(fcbtmp2->filename, ".."); fcbtmp2->first = openfilelist[currfd].first; fcbtmp2->length = openfilelist[currfd].length; fcbtmp2->date = openfilelist[currfd].date; fcbtmp2->time = openfilelist[currfd].time; do_write(fd, (char*)fcbtmp2, sizeof(fcb), 2); // 关闭该目录的打开文件表项,close 会修改父目录中对应该目录的 fcb 信息 /** * 这里注意,一个目录存在 2 个 fcb 信息,一个为该目录下的 . 目录文件,一个为父目录下的 fcb。 * 因此,这俩个fcb均需要修改,前一个 fcb 由各个函数自己完成,后一个 fcb 修改由 close 完成。 * 所以这里,需要打开文件表,再关闭文件表,实际上更新了后一个 fcb 信息。 */ my_close(fd); free(fcbtmp); free(fcbtmp2); // 修改父目录 fcb fcbptr = (fcb*)text; fcbptr->length = openfilelist[currfd].length; openfilelist[currfd].count = 0; do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); openfilelist[currfd].fcbstate = 1;}
    进入目录

    Open指定的目录名,调用read读入该父目录到内存检查新的当前目录名是否存在关闭原当前目录设置当前目录为该目录
    void my_cd(char* dirname){ int i = 0; int tag = -1; int fd; if (openfilelist[currfd].attribute == 1) { // if not a dir printf("you are in a data file, you could use 'close' to exit this file\n"); return; } char* buf = (char*)malloc(10000); openfilelist[currfd].count = 0; do_read(currfd, openfilelist[currfd].length, buf); fcb* fcbptr = (fcb*)buf; // 查找目标 fcb for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (strcmp(fcbptr->filename, dirname) == 0 && fcbptr->attribute == 0) { tag = 1; break; } } if (tag != 1) { printf("my_cd: no such dir\n"); return; } else { // . 和 .. 检查 if (strcmp(fcbptr->filename, ".") == 0) { return; } else if (strcmp(fcbptr->filename, "..") == 0) { if (currfd == 0) { // root return; } else { currfd = my_close(currfd); return; } } else { // 其他目录 fd = get_free_openfilelist(); if (fd == -1) { return; } openfilelist[fd].attribute = fcbptr->attribute; openfilelist[fd].count = 0; openfilelist[fd].date = fcbptr->date; openfilelist[fd].time = fcbptr->time; strcpy(openfilelist[fd].filename, fcbptr->filename); strcpy(openfilelist[fd].exname, fcbptr->exname); openfilelist[fd].first = fcbptr->first; openfilelist[fd].free = fcbptr->free; openfilelist[fd].fcbstate = 0; openfilelist[fd].length = fcbptr->length; strcat(strcat(strcpy(openfilelist[fd].dir, (char*)(openfilelist[currfd].dir)), dirname), "/"); openfilelist[fd].topenfile = 1; openfilelist[fd].dirno = openfilelist[currfd].first; openfilelist[fd].diroff = i; currfd = fd; } }}
    删除目录

    Read读入当前目录文件内容到内存,检查要删除的文件目录是否存在检查该目录是否为空检查是否已经打开,打开用close则关闭回收给目录文件的磁盘块修改该目录文件的目录项修改用户打开表项的长度信息返回
    void my_rmdir(char* dirname){ int i, tag = 0; char buf[MAX_TEXT_SIZE]; // 排除 . 和 .. 目录 if (strcmp(dirname, ".") == 0 || strcmp(dirname, "..") == 0) { printf("can not remove . and .. special dir\n"); return; } openfilelist[currfd].count = 0; do_read(currfd, openfilelist[currfd].length, buf); // 查找要删除的目录 fcb* fcbptr = (fcb*)buf; for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (fcbptr->free == 0) continue; if (strcmp(fcbptr->filename, dirname) == 0 && fcbptr->attribute == 0) { tag = 1; break; } } if (tag != 1) { printf("no such dir\n"); return; } // 无法删除非空目录 if (fcbptr->length > 2 * sizeof(fcb)) { printf("can not remove a non empty dir\n"); return; } // 更新 fat 表 int block_num = fcbptr->first; fat* fat1 = (fat*)(myvhard + BLOCKSIZE); int nxt_num = 0; while (1) { nxt_num = fat1[block_num].id; fat1[block_num].id = FREE; if (nxt_num != END) { block_num = nxt_num; } else { break; } } fat1 = (fat*)(myvhard + BLOCKSIZE); fat* fat2 = (fat*)(myvhard + BLOCKSIZE * 3); memcpy(fat2, fat1, BLOCKSIZE * 2); // 更新 fcb fcbptr->date = 0; fcbptr->time = 0; fcbptr->exname[0] = '\0'; fcbptr->filename[0] = '\0'; fcbptr->first = 0; fcbptr->free = 0; fcbptr->length = 0; openfilelist[currfd].count = i * sizeof(fcb); do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); // 删除目录需要相应考虑可能删除 fcb,也就是修改父目录 length // 这里需要注意:因为删除中间的 fcb,目录有效长度不变,即 length 不变 // 因此需要考虑特殊情况,即删除最后一个 fcb 时,极有可能之前的 fcb 都是空的,这是需要 // 循环删除 fcb (以下代码完成),可能需要回收 block 修改 fat 表等过程(do_write 完成) int lognum = i; if ((lognum + 1) * sizeof(fcb) == openfilelist[currfd].length) { openfilelist[currfd].length -= sizeof(fcb); lognum--; fcbptr = (fcb *)buf + lognum; while (fcbptr->free == 0) { fcbptr--; openfilelist[currfd].length -= sizeof(fcb); } } // 更新父目录 fcb fcbptr = (fcb*)buf; fcbptr->length = openfilelist[currfd].length; openfilelist[currfd].count = 0; do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); openfilelist[currfd].fcbstate = 1;}
    列出目录和文件项命令

    Read当前目录到内存读出目录文件的信息,显示到屏幕上返回
    void my_ls(){ // 判断是否是目录 if (openfilelist[currfd].attribute == 1) { printf("data file\n"); return; } char buf[MAX_TEXT_SIZE]; int i; // 读取当前目录文件信息(一个个fcb), 载入内存 openfilelist[currfd].count = 0; do_read(currfd, openfilelist[currfd].length, buf); // 遍历当前目录 fcb fcb* fcbptr = (fcb*)buf; for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (fcbptr->free == 1) { if (fcbptr->attribute == 0) { printf("<DIR> %-8s\t%d/%d/%d %d:%d\n", fcbptr->filename, (fcbptr->date >> 9) + 2000, (fcbptr->date >> 5) & 0x000f, (fcbptr->date) & 0x001f, (fcbptr->time >> 11), (fcbptr->time >> 5) & 0x003f); } else { printf("<---> %-8s\t%d/%d/%d %d:%d\t%d\n", fcbptr->filename, (fcbptr->date >> 9) + 2000, (fcbptr->date >> 5) & 0x000f, (fcbptr->date) & 0x001f, (fcbptr->time >> 11), (fcbptr->time >> 5) & 0x003f, fcbptr->length); } } }}
    新建文件命令

    分配一个空闲的打开文件表项检查新文件的父目录是否打开Read该父目录的文件到内存,并检测新建的文件名是否重名检查是否有空闲盘块寻找空闲的目录项准备好新文件的FCB调用close关闭打开的父目录文件返回
    int my_create(char* filename){ // 非法判断 if (strcmp(filename, "") == 0) { printf("please input filename\n"); return -1; } if (openfilelist[currfd].attribute == 1) { printf("you are in data file now\n"); return -1; } openfilelist[currfd].count = 0; char buf[MAX_TEXT_SIZE]; do_read(currfd, openfilelist[currfd].length, buf); int i; fcb* fcbptr = (fcb*)buf; // 检查重名 for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (fcbptr->free == 0) { continue; } if (strcmp(fcbptr->filename, filename) == 0 && fcbptr->attribute == 1) { printf("the same filename error\n"); return -1; } } // 申请空 fcb; fcbptr = (fcb*)buf; for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (fcbptr->free == 0) break; } // 申请磁盘块并更新 fat 表 int block_num = get_free_block(); if (block_num == -1) { return -1; } fat* fat1 = (fat*)(myvhard + BLOCKSIZE); fat* fat2 = (fat*)(myvhard + BLOCKSIZE * 3); fat1[block_num].id = END; memcpy(fat2, fat1, BLOCKSIZE * 2); // 修改 fcb 信息 strcpy(fcbptr->filename, filename); time_t rawtime = time(NULL); struct tm* time = localtime(&rawtime); fcbptr->date = (time->tm_year - 100) * 512 + (time->tm_mon + 1) * 32 + (time->tm_mday); fcbptr->time = (time->tm_hour) * 2048 + (time->tm_min) * 32 + (time->tm_sec) / 2; fcbptr->first = block_num; fcbptr->free = 1; fcbptr->attribute = 1; fcbptr->length = 0; openfilelist[currfd].count = i * sizeof(fcb); do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); // 修改父目录 fcb fcbptr = (fcb*)buf; fcbptr->length = openfilelist[currfd].length; openfilelist[currfd].count = 0; do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); openfilelist[currfd].fcbstate = 1;}
    删除文件命令

    检查要删除的文件的父目录是否已打开Read父目录到内存检查文件是否打开回收磁盘快清空该文件的目录项修改用户打开文件表项中的长度信息返回
    void my_rm(char* filename){ char buf[MAX_TEXT_SIZE]; openfilelist[currfd].count = 0; do_read(currfd, openfilelist[currfd].length, buf); int i, flag = 0; fcb* fcbptr = (fcb*)buf; // 查询 for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (strcmp(fcbptr->filename, filename) == 0 && fcbptr->attribute == 1) { flag = 1; break; } } if (flag != 1) { printf("no such file\n"); return; } // 更新 fat 表 int block_num = fcbptr->first; fat* fat1 = (fat*)(myvhard + BLOCKSIZE); int nxt_num = 0; while (1) { nxt_num = fat1[block_num].id; fat1[block_num].id = FREE; if (nxt_num != END) block_num = nxt_num; else break; } fat1 = (fat*)(myvhard + BLOCKSIZE); fat* fat2 = (fat*)(myvhard + BLOCKSIZE * 3); memcpy(fat2, fat1, BLOCKSIZE * 2); // 清空 fcb fcbptr->date = 0; fcbptr->time = 0; fcbptr->exname[0] = '\0'; fcbptr->filename[0] = '\0'; fcbptr->first = 0; fcbptr->free = 0; fcbptr->length = 0; openfilelist[currfd].count = i * sizeof(fcb); do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); // int lognum = i; if ((lognum + 1) * sizeof(fcb) == openfilelist[currfd].length) { openfilelist[currfd].length -= sizeof(fcb); lognum--; fcbptr = (fcb *)buf + lognum; while (fcbptr->free == 0) { fcbptr--; openfilelist[currfd].length -= sizeof(fcb); } } // 修改父目录 . 目录文件的 fcb fcbptr = (fcb*)buf; fcbptr->length = openfilelist[currfd].length; openfilelist[currfd].count = 0; do_write(currfd, (char*)fcbptr, sizeof(fcb), 2); openfilelist[currfd].fcbstate = 1;}
    打开文件命令

    检查该文件名是否存在Read该父目录到内存检查用户打开的文件表中是否有空闲表项为该文件填写空白用户打开文件表项内容返回
    int my_open(char* filename){ char buf[MAX_TEXT_SIZE]; openfilelist[currfd].count = 0; do_read(currfd, openfilelist[currfd].length, buf); int i, flag = 0; fcb* fcbptr = (fcb*)buf; // 重名检查 for (i = 0; i < (int)(openfilelist[currfd].length / sizeof(fcb)); i++, fcbptr++) { if (strcmp(fcbptr->filename, filename) == 0 && fcbptr->attribute == 1) { flag = 1; break; } } if (flag != 1) { printf("no such file\n"); return -1; } // 申请新的打开目录项并初始化该目录项 int fd = get_free_openfilelist(); if (fd == -1) { printf("my_open: full openfilelist\n"); return -1; } openfilelist[fd].attribute = 1; openfilelist[fd].count = 0; openfilelist[fd].date = fcbptr->date; openfilelist[fd].time = fcbptr->time; openfilelist[fd].length = fcbptr->length; openfilelist[fd].first = fcbptr->first; openfilelist[fd].free = 1; strcpy(openfilelist[fd].filename, fcbptr->filename); strcat(strcpy(openfilelist[fd].dir, (char*)(openfilelist[currfd].dir)), filename); openfilelist[fd].dirno = openfilelist[currfd].first; openfilelist[fd].diroff = i; openfilelist[fd].topenfile = 1; openfilelist[fd].fcbstate = 0; currfd = fd; return 1;}
    关闭文件命令

    检查fd的有效性检查用户打开文件表表项的fcbstate字段回收该文件占据的用户打开文件表表项返回
    int my_close(int fd){ if (fd > MAXOPENFILE || fd < 0) { printf("my_close: fd error\n"); return -1; } int i; char buf[MAX_TEXT_SIZE]; int father_fd = -1; fcb* fcbptr; for (i = 0; i < MAXOPENFILE; i++) { if (openfilelist[i].first == openfilelist[fd].dirno) { father_fd = i; break; } } if (father_fd == -1) { printf("my_close: no father dir\n"); return -1; } if (openfilelist[fd].fcbstate == 1) { do_read(father_fd, openfilelist[father_fd].length, buf); // update fcb fcbptr = (fcb*)(buf + sizeof(fcb) * openfilelist[fd].diroff); strcpy(fcbptr->exname, openfilelist[fd].exname); strcpy(fcbptr->filename, openfilelist[fd].filename); fcbptr->first = openfilelist[fd].first; fcbptr->free = openfilelist[fd].free; fcbptr->length = openfilelist[fd].length; fcbptr->time = openfilelist[fd].time; fcbptr->date = openfilelist[fd].date; fcbptr->attribute = openfilelist[fd].attribute; openfilelist[father_fd].count = openfilelist[fd].diroff * sizeof(fcb); do_write(father_fd, (char*)fcbptr, sizeof(fcb), 2); } // 释放打开文件表 memset(&openfilelist[fd], 0, sizeof(useropen)); currfd = father_fd; return father_fd;}
    写文件命令

    检查fd的有效性提示用户输入写方式提示用户输入内容调用do_write()将键入的内容写入到文件中返回写入的字节数
    int my_write(int fd){ if (fd < 0 || fd >= MAXOPENFILE) { printf("my_write: no such file\n"); return -1; } int wstyle; while (1) { // 1: 截断写,清空全部内容,从头开始写 // 2. 覆盖写,从文件指针处开始写 // 3. 追加写,字面意思 printf("1:Truncation 2:Coverage 3:Addition\n"); scanf("%d", &wstyle); if (wstyle > 3 || wstyle < 1) { printf("input error\n"); } else { break; } } char text[MAX_TEXT_SIZE] = "\0"; char texttmp[MAX_TEXT_SIZE] = "\0"; printf("please input data, line feed + $$ to end file\n"); getchar(); while (gets(texttmp)) { if (strcmp(texttmp, "$$") == 0) { break; } texttmp[strlen(texttmp)] = '\n'; strcat(text, texttmp); } text[strlen(text)] = '\0'; do_write(fd, text, strlen(text) + 1, wstyle); openfilelist[fd].fcbstate = 1; return 1;}
    3.2 实验结果分析创建虚拟磁盘并格式化

    显示工作目录的所有文件和文件夹

    创建文件夹

    进入文件夹并创建文件

    打开文件并写入文件并读取文件

    关闭文件

    退出虚拟文件系统
    3 评论 335 下载 2018-11-13 08:39:25 下载需要8点积分
  • 基于JSP和MySQL实现的模拟当当网购书网站

    摘 要随着科学技术的进步,计算机行业的迅速发展,大大提高人们的工作效率。计算机信息处理系统的引进已彻底改变了许多系统的经营管理 。
    网上书店可以方便用户,足不出户就能购买到自己想要的书,也可以方便书店节约经营成本,通过对当当网调查研究,开发了此购书系统。本系统解决了网上购书的常用基本问题以及相关统计工作。本系统中包含5个功能模块:用户模块,购物车模块,主页面模块,订单模块,以及后台管理模块。
    本系统采用MVC模式进行项目的总体设计,使用jsp进行网页界面的设计,以及采用了开源框架Struts2,它采用了当今软件设计的最新技术,具有开发效率高、设计灵活、生成的软件界面友好美观等特点。本系统中通过JDBC驱动和数据库进行无缝连接,后端的数据库是mysql,也是一个开源的数据库系统,该数据库具有较高的完整性,一致性和安全性。Web服务器采用:Tomcat,是一个世界上广泛使用的支持JSP和Servlets的Web服务器。它在Java运行时上能够很好地运行并支持Web应用部署。所以用Tomcat做网上购书的后台服务器能够很好的完成任务。
    关键词:当当网;购书;jsp网页开发语言;struts2框架;tomcat服务器
    AbstractWith the progress of science and technology, the rapid development of the computer industry, improve people’s working efficiency greatly.The introduction of computerized information systems have been changed many systems management.
    Online bookstores can be user-friendly, remain within doors can buy the books they want, can also facilitate the bookstore to save operating costs, based on the investigation on dangdang.com, developed this book system.This system solves the online book commonly used basic problems and the related statistical work.This system contains 5 modules: user module, shopping cart module, main page module, module orders, as well as the background management module.
    This system uses MVC mode to undertake the project design, the use of JSP webpage interface design, as well as the open source Struts2 framework, it adopted a software design of the latest technology, with the development of high efficiency, flexible design, generation of friendly software interface handsome features.In this system, through the JDBC drive and database for seamless connectivity, a back-end database is mysql, is an open source database system, the database has a high integrity, consistency and safety.The Web server: Tomcat, is one of the world’s widely used to support JSP and Servlets Web server.It is in the Java runtime to run well and support Web application deployment.So done with Tomcat online book background server can be very good to complete the task.
    Key words:dangdang.com,book, tomcat,jsp,struts2
    第一章 绪论1.1 论文研究背景网上书店通过人与电子通信方式的结合,依靠计算机网络,以通讯技术为基础,实现图书销售的网上交易。网上书店同传统的店面书店相比,传统的书店前期投入大,管理难,顾客来源受地域影响,而网上书店却不受这些影响。它快捷,便利,顾客选择自由,顾客来源广。网上书店的经营方式和销售渠道是全新的,它24小时的全天候和全方位服务是店面书店所不能及的,成本低廉更是开设网上书店的主要原因,而与其他商品相比,书籍运送几乎不怕碰撞碎裂,不具时效性,同时书本具有功能单一,形式简单,易于判断和选择而独具优势,最适合于网上交易,再次是单价低,降低了消费者第一次在网络购物的门槛,所以网上书店成为了电子商务的先锋。
    1.2 模拟当当网购书网站的意义开发此软件目的是使其具有强大的实用价值,即它可以满足中小型书店进行网上售书需求,使其拥有自己的网上书店。在生活中有许多中小书店,由于经济问题或没有技术支持而没有属于自己的网上书店。寻求一个适用于中小型书店的网上购书系统是必要的。顺应了采用现代信息技术手段的电子商务的发展趋势,克服了传统购物模式中耗费人力、物力的弊端。
    开发此软件的另一个目的是针对目前当当网的模拟,以便于对网上书店有所了解,熟悉开发一般网上购物系统的步骤,发现在线购物开发过程中所面临的问题。
    1.3 网上购书网站的发展现状国际上网上书店前景看好,而国内的网上书店,数量上也有了新的增长。旌旗,卓越亚马逊,China-Pub,当当网等网上书店的出现,证明了网上书店的前景的良好。现在国家正在积极建设三网融合,网络对人们生活的影响将越来越大,人们对网上购物的认同度也越来越高。这些情况表明,目前开展网上书店业务具有非常大的市场空间。
    西方国家网络书城概况:世界上第一家网络书城是1991年在美国联机公司AOL采购网络上建立的”阅读美国书店”,目前最有名的是美国西雅图亚马逊图书公司的亚马逊网上书店。它创建于1995年,供书达310余万种,每年顾客达500万人次,其价格优惠20-50%。金融结算制度完善,配送服务高效。实现了零库存运转。英国网上书店中有较著名的有Internet书店,德国的网上书店主要有图书在线网上书店。著名调查公司AC尼尔森的一项研究显示:63%的中国网民曾在网上购物。而在中国大地上,最受欢迎的网上商品是书籍,56%的网上购物者选择网上买书。
    中国网上购书的比例是全球最高的。网上书店是网络环境下图书发行的典型代表,也是未来的发展趋势。
    1.4 本文所做的工作本文简要介绍了网上书店系统的开发与设计。网上购书系统由前台和后台两个层面组成。前台主要面向消费者,包括a.主页面(图书类别模块(公共页面,被各子页面引用),编辑推荐模块,热销图书模块,最新上架以及新书热卖榜模块),其中从主页面跳转到的具体模块有:1.根据用户选择的图书类型列出图书列表的图书列表模块(其里面还具体包括:分页浏览,模糊查询,对图书按需求排序),点击相应图书可以跳转到相应图书详细页面2.点击相应图书跳转到相应图书详细页面。b.购物车模块c.用户功能模块d.订单模块。后台主要面向销售者,包括用户管理、商品管理等。
    1.5 本文的结构安排为了使您在短时间内了解该论文,将本论文内容介绍如下:

    第一章 绪论,介绍论文的课题研究背景、目的和意义,发展现状,并简要说明论文的主要工作和结构安排
    第二章 介绍设计中所用到的基本技术,包括数据库、JSP、B/S模式、tomcat
    第三章 对系统的整体进行设计,首先进行需求分析,包括对数据库需求、页面需求、功能需求等进行分析。然后完成了对系统的功能模块和数据库的设计
    第四章 前台的设计与实现
    第五章 后台的设计与实现
    第六章 对系统进行了测试分析,对全文研究工作进行总结,以及体会

    第二章 可行性分析可行性分析就是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。该系统的可行性分析包括以下几个方面的内容。
    2.1 社会可行性图书销售管理是书店经营管理中的核心环节,也是一个书店能否取得效益的关键。在传统工作模式下,图书销售管理工作大部分是由手工操作完成的,工作效率很低,并且不能及时查询书店图书入库、销售、退货等信息,影响了书店的正常运作。随着计算机信息化管理的普及,书店迫切要求拥有一个能够快速、准确处理商品数据的图书销售管理系统,从而做到合理生产、及时销售、库存量最小和减少商品积压,保证企业能够取得最佳的经济效益。
    2.2 技术可行性Java是一种可以撰写跨平台应用软件的面向对象的设计语言,具有简单、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的特点。
    电子商务要求程序代码具有基本的要求:安全、可靠、同时要求能与运行于不同平台的机器的全世界客户开展业务。Java以其强安全性、平台无关性、硬件结构无关性、语言简洁同时面向对象,在网络编程语言中占据无可比拟的优势,成为实现电子商务系统的首选语言。
    数据库方面Mysql已经可以满足一般的数据要求,其体积小、速度快、总体拥有成本低,对于一般的个人使用者和中小型企业来说,mysql提供的功能已经绰绰有余,但本文还提供了Oracle数据库配置接口,可以更换数据库。
    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目。由于有Sun公司的支持,最新的Servlet和JSP技术都能在Tomact中得到体现。
    Tomcat是一个世界上广泛使用的支持JSP和Servlets的Web服务器。它在Java运行时上能够很好地运行并支持Web应用部署。所以用Tomcat做网上书城的后台服务器能够很好的完成任务。
    硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。
    所以以JAVA+Mysql+Tomcat来设计开发网上书城系统具有良好的技术可行性。
    2.3 操作可行性目前,大多数计算机都能运行该系统,该系统的安装、调试、运行不会改变原计算机系统的设置和布局,并且系统界面简单,提示信息完整,由相关人员指导便能够方便的操作此软件。
    2.4 系统的技术介绍2.4.1 JSP介绍JSP(JavaServer Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(*.jsp)。用JSP开发的Web应用是跨平台的,即能在Linux下运行,也能在其他操作系统上运行。JSP技术使用Java编程语言编写类XML的tags和scriptlets,来封装产生动态网页的处理逻辑。网页还能通过tags和scriptlets访问存在于服务端的资源的应用逻辑。JSP将网页逻辑与网页设计和显示分离,支持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。 Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序段,然后将执行结果连同JSP文件中的HTML代码一起返回给客户。插入的Java程序段可以操作数据库、重新定向网页等,以实现建立动态网页所需要的功能。JSP与Java Servlet一样,是在服务器端执行的,通常返回该客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。JSP的1.0规范的最后版本是1999年9月推出的,12月又推出了1.1规范。目前较新的是JSP1.2规范,JSP2.0规范的征求意见稿也已出台。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Java Servlet 是JSP的技术基础,而且大型的Web应用程序的开发需要Java Servlet和JSP配合才能完成。JSP具备了Java技术的简单易用,完全的面向对象,具有平台无关性且安全可靠,主要面向因特网的所有特点。
    2.4.2 Mysql介绍MySQL是一个数据库管理系统
    一个数据库是一个结构化的数据集合。它可以是从一个简单的销售表到一个美术馆、或者一个社团网络的庞大的信息集合。如果要添加、访问和处理存储在一个计算机数据库中的数据,你就需要一个像MySQL这样的数据库管理系统。从计算机可以很好的处理大量的数据以来,数据库管理系统就在计算机处理中和独立应用程序或其他部分应用程序一样扮演着一个重要的角色。
    MySQL是一个关系数据库管理系统
    关系数据库把数据存放在分立的表格中,这比把所有数据存放在一个大仓库中要好得多,这样做将增加你的速度和灵活性。“MySQL”中的SQL代表“Structured Query Language”(结构化查询语言)。SQL是用于访问数据库的最通用的标准语言,它是由ANSI/ISO定义的SQL标准。SQL标准发展自1986年以来,已经存在多个版本:SQL-86,SQL-92,SQL:1999,SQL:2003,其中SQL:2003是该标准的当前版本。
    MySQL是开源的
    开源意味着任何人都可以使用和修改该软件,任何人都可以从Internet上下载和使用MySQL而不需要支付任何费用。如果你愿意,你可以研究其源代码,并根据你的需要修改它。MySQL使用GPL(GNU General Public License,通用公共许可),在 httpt://www.fsf.org/licenses 中定义了你在不同的场合对软件可以或不可以做什么。如果你觉得GPL不爽或者想把MySQL的源代码集成到一个商业应用中去,你可以向MySQL AB购买一个商业许可版本。
    MySQL服务器是一个快的、可靠的和易于使用的数据库服务器
    如果这是你正在寻找的,你可以试一试。MySQL服务器还包含了一个由用户紧密合作开发的实用特性集。你可以在MySQL AB的 http://www.mysql.com/it-resources/benchmarks/ 上找到MySQL服务器和其他数据库管理系统的性能比较。
    MySQL服务器原本就是开发比已存在的数据库更快的用于处理大的数据库的解决方案,并且已经成功用于高苛刻生产环境多年。尽管MySQL仍在开发中,但它已经提供一个丰富和极其有用的功能集。它的连接性、速度和安全性使MySQL非常适合访问在Internet上的数据库。
    MySQL服务器工作在客户/服务器或嵌入系统中
    MySQL数据库服务器是一个客户/服务器系统,它由多线程SQL服务器组成,支持不同的后端、多个不同的客户程序和库、管理工具和广泛的应用程序接口(APIs)。
    MySQL也可以是一个嵌入的多线程库,你可以把它连接到你的应用中而得到一个小、快且易于管理的产品。
    有大量的MySQL软件可以使用
    幸运的是,你可以找到你所喜爱的已经支持MySQL数据库服务器的软件和语言。
    2.4.3 Tomcat介绍Tomcat 是apache的开源项目之一,Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。Tomcat 是一个轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为7.0.26 Release。
    2.4.4 B/S模式体系结构B/S结构,即Browser/Server(浏览器/服务器)结构,随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。B/S结构,主要是利用了不断成熟的浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统结构技术。随着Windows 2000/Windows 2003将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构[6]。
    B/S结构是真正的三层结构,它以访问WEB数据库中心,HTTP为传输协议,客户通过浏览器(Browser)访问WEB服务器和与其相连的后台数据库,称之为B/S(Browser/Server)模式。其三级结构组成如下图所示[7]:

    图中从左到右,分为三层:

    第一层是客服端即浏览器:主要完成客户与后台的交互及最终查询结果的输出功能。在客户端向指定的Web服务器提出服务请求,Web服务器用HTTP协议把所需文件资料传给用户,客户机接受传来的主页文件,并把它显示在Web浏览器上
    第二层Web服务器是功能层:完成客户的应用功能,即Web服务器接受客户请求,首先需要执行相应的扩展应用程序与数据库进行连接,通过Access等方式向数据库服务器提出数据处理申请,而后等数据库服务器将数据处理的结果提交给Web服务器,再由Web服务器传送回客户端
    第三层数据库服务器是数据层:数据库服务器应客户请求独立地进行各种处理

    与传统的C/S模式相比,B/S结构把处理功能全部移植到了服务器端,用户的请求通过浏览器发出,无论是使用和数据库维护上都比传统模式更加经济方便。而且使维护任务层次化:管理员负责服务器硬件日常管理和维护,系统维护人员负责后台数据库数据更新维护。因此,本系统采用B/S模式体系结构作为系统的体系结构。
    2.4.5 系统开发平台及运行环境系统的开发是在 MyEclipse8.5 + mysql 环境下进行的。

    操作系统:Windows 7及以上
    服务器软件:tomcat
    浏览器:Internet Explorer6.0及以上版本

    第三章 需求分析3.1 用户功能模块分析顾客功能模块用例图

    顾客功能模块流程图

    3.2 后台功能模块分析管理员功能模块用例图

    管理员功能模块流程图

    3.3 数据库需求分析开发本系统采用的是mysql数据库,通过对系统进行的需求分析,系统流程设计以及系统功能结构的确定,规划出系统中使用的主要有以下各表。
    图书信息表、产品信息表、图书栏目(分类)表、订单信息表、订单明细表、用户信息表、用户地址信息表,管理员表。关联关系如下图3.3:

    d_book表



    字段名称
    数据类型
    长度
    说明
    约束




    Id
    int
    12
    ID号
    primary


    Author
    varchar
    200
    作者
    NOT NULL


    publishing
    varchar
    200
    出版社
    NOT NULL


    publish_time
    bigint
    20
    出版时间
    NOT NULL


    word_number
    varchar
    15
    字数
    Default NULL


    which_edtion
    varchar
    15
    版本
    Default NULL


    print_time
    int
    20
    印刷时间
    Default NULL


    print_number
    varchar
    15
    印刷号
    Default NULL


    isbn
    varchar
    25
    图书编号
    Default NULL


    author_summary
    text

    作者简介
    NOT NULL


    catalogue
    text

    书本概况
    NOT NULL



    d_product表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    product_name
    varchar
    100
    产品名称
    Not null


    description
    text
    100
    商品描述
    Default null


    add_time
    bigint
    20
    添加时间
    Default null


    fixed_price
    double

    书本原价
    Not null


    dang_price
    double

    当当价格
    Not null


    Key_words
    Varchar
    200
    是否推荐
    Default null


    has_deleted
    int
    1
    是否下架
    Not null default ‘0’


    product_pic
    varchar
    200
    产品图片
    default null



    d_category表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    turn
    int
    10
    排序顺序
    not null


    en_name
    varchar
    200
    英文名
    not null


    name
    varchar
    200
    中文名
    not null


    description
    varchar
    200
    描述信息
    not null


    parent_id
    int
    10
    上层目录id



    d_category_product表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    product_id
    int
    10
    产品id
    not null


    cat_id
    int
    10
    分类名称
    not null



    d_item表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    product_id
    int
    10
    产品id
    not null


    order_id
    int
    10
    订单id
    not null


    product_name
    Varchar
    100
    产品名称
    Not null


    dang_price
    Double

    书城价格
    Not null


    product_num
    Int
    10
    产品数量
    Not null


    amount
    Double

    总价
    Not null



    d_order表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    user_id
    int
    10
    用户号
    not null


    status
    int
    10
    状态
    not null


    order_time
    bigint
    20
    订单时间
    not null


    order_desc
    varchar
    100
    订单描述
    default null


    total_price
    double

    订单总价
    not null



    d_receive_address表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    user_id
    int
    10
    用户id
    not null


    receive_name
    varchar
    20
    接收者名称
    not null


    full_address
    varchar
    200
    详细地址
    not null


    postal_code
    varchar
    8
    邮编
    not null


    mobile
    varchar
    15
    移动电话
    default null


    phone
    varchar
    20
    电话
    default null



    d_user表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    email
    varchar
    50
    电子邮箱
    not null unique


    password
    varchar
    50
    密码
    not null


    user_integral
    int
    12
    是否被锁定
    not null default ‘0’


    is_email_verify
    char
    3
    是否通过邮箱验证



    email_verify_code
    varchar
    50
    邮箱验证码
    default null


    last_login_time
    bigint

    最后登录时间
    null


    last_login_ip
    bigint

    最后登录ip
    default null



    d_admin表



    字段名称
    数据类型
    长度
    说明
    约束




    id
    int
    12
    id号
    primary key


    email
    varchar
    50
    邮箱
    not null


    password
    varchar
    50
    密码
    not null



    第四章 前台的设计与实现前台主要分为四个模块:用户功能模块,主页面模块,购物车模块,订单模块。
    4.1 搭建项目框架
    创建项目 web project

    项目名称:dang
    添加开发需要类库

    添加开发struts 6个基本类库
    commons-fileupload-1.2.1.jarcommons-io-1.3.2.jarfreemarker-2.3.15.jarognl-2.7.3.jarstruts2-core-2.1.8.1.jarxwork-core-2.1.6.jar
    MySQL数据连接驱动
    mysql-connector-java-5.1.16-bin.jar

    搭建struts基本框架

    完成页面跳转
    分包

    com.wlj.web.action.cart:与购物车相关的Actioncom.wlj.web.action.main:与主页面相关的Actioncom.wlj.web.action.order:与订单管理相关的Actioncom.wlj.web.action.user:与用户相关的Actioncom.wlj.web.action.manage:与后台管理相关的Actioncom.wlj.web.action BaseAction.java 所有action的父类com.wlj.web.interceptor:项目需要拦截器com.wlj.web.util:项目开发工具类com.wlj.web.dao:数据访问层操作com.wlj.web.entity:实体类操作
    配合文件分包

    config/struts/struts.xml:开发struts公共信息 config/struts/struts-cart.xml:购物车action配置信息config/struts/struts-main.xml:书籍管理action配置信息config/struts/struts-order.xml:订单管理action配置信息config/struts/struts-user.xml:用户管理action配置信息config/struts/struts-admin.xml:后台管理action配置信息config/props:属性文件(包括数据库的数据db.sql文件,以及连接数据库的属性文件)在web.xml中添加配置修改默认路径<filter>...<init-param> <param-name>config</param-name> <!--加载多个配置文件用逗号隔开(,)--> <param-value> struts-default.xml, struts-plugin.xml, config/struts/struts.xml </param-value></init-param></filter> <filter-mapping>...</filter-mapping>

    页面分层

    WebRoot
    common:公共页面css:项目所有需要样式文件images:项目中所有图片js:项目开发使用js脚本productImages:产品图片productImages_c:产品大图
    WEB-INF
    cart:购物车相关页面main:主页面中各子页面order:订单相关页面user:用户相关页面manager:后台管理相关页面

    创建数据库

    打开dd.sql文件,运行其语句:
    create database dd;use dd;添加表和测试数据


    4.2 用户模块实现用户模块主要实现用户的注册、登录、找回密码、管理个人信息。
    4.2.1 用户注册
    Jascript的表单验证,而对于用户email,不仅要保证格式正确,而且要保证唯一性,所以还采用了ajax技术,到数据库查询相关数据,结果返回一个boolean值,如果为true,则说明该邮箱可以使用。反之,则该邮箱不能使用,必须重新填写。
    如下图为邮箱格式不正确的提示信息:

    下图为邮箱格式正确但不符合唯一性的提示信息:

    而对于验证码,每打开注册页面,浏览器根据链接就会向服务器的相关action发送请求验证码的需求。服务器返回一张图片给浏览器时,同时将验证码的实际数据绑定在session中,每当用户提交时,就会进行ajax验证,看是否与session中绑定的验证码数据一致,如不一致则重新换一张验证码图片,提示验证码输入错误。如下图4.1.1.3为当用户输入验证码错误时,服务器又重新换了张验证码图片。

    4.2.2 验证邮箱具体的邮箱相关设置还没有实现,但本程序实现了其的主要思想逻辑。即当用户注册完毕时,就已经把邮箱验证码录入到数据库相关用户的信息记录中。如果要具体实现,只需打开邮箱接收相应邮箱验证码即可。在这一步,本程序就已经把邮箱验证码从数据库中取出,用户不必再去自己的邮箱中获取。

    4.2.3 用户登录
    用户登录也才用javascript表单验证,当用户输入的邮箱,密码格式都正确时才能提交(关于忘记密码后找回密码,以下章节将会具体给出)。提交完成后,服务器将会到数据库查询是否有满足的用户。如有还要判断用户是否被锁定,如没被锁定(有没有锁定主要根据user表中integral字段来判断),则返回登录成功的主页面且绑定用户对象到session中,否则返回登录页面,并提示相关错误信息,用户必须重新登录。

    登录成功后,主页面根据相应绑定的session中的loginUser对象。

    用户退出,服务器将会把session中绑定的LoginUser对象移除。

    4.2.4 用户管理个人信息
    用户可以查看个人信息(修改密码,修改昵称),查看历史订单以及自己填写的所有地址信息。

    其中用户昵称修改采用ajax技术(在用户昵称满足javascript表单验证的前提下),即当用户填写的昵称与先前昵称不一样,就向服务器发送请求,修改相应用户记录中昵称字段。并返回修改是否成功信息。
    修改密码,是根据用户注册时选择的找回密码问题来找回密码。


    当用户修改密码成功时必须重新登录。
    用户查看历史订单页面,采用了二次封装javascript的jquery框架,使得页面更美化。


    用户查看订单的送货地址,并且可以修改相应的送货地址(用户输入的修改信息也必须满足javascript表单验证),当点击修改按钮后,浏览器把表单里的相应address对象以及用户id传送给服务器,服务器再到数据库修改相应用户地址记录。而后还是返回本页面。

    4.3 主页面模块实现浏览地址:localhost:8080/dangdang-wlj

    主页面模块的实现:主页面(图书类别模块(公共页面,被各子页面引用),编辑推荐模块,热销图书模块,最新上架以及新书热卖榜模块),其中从主页面跳转到的具体模块有:1.根据用户选择的图书类型列出图书列表的图书列表模块(其里面还具体包括:分页浏览,模糊查询,对图书按需求排序),点击相应图书可以跳转到相应图书详细页面2.点击相应图书跳转到相应图书详细页面
    4.3.1 图书类别模块(公共页面,被各子页面引用)
    主要涉及到数据库的查询,查询category表,调用categoryDaoImpl类的findMain(int id)函数以及findByParentId(Category vo),程序如下:
    通过父类id=1,求出其子类集合,结果返回最初的子类集合,此次再在子类中又递归调用本方法,来设置子类对应的子类集合。
    */public List<Category> findByParentId(Category vo) throws Exception { List<Category> categorys = new ArrayList<Category>(); Connection conn =null; PreparedStatement pstmt=null; ResultSet rs=null; Category category = null; String sql ="select * from d_category where parent_id= ?"; try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, vo.getId()); rs = pstmt.executeQuery(); while(rs.next()){ category = new Category(); category.setDescription(rs.getString("description")); category.setEnName(rs.getString("en_name")); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setParentId(rs.getInt("parent_id")); category.setTurn(rs.getInt("turn")); category.setChildCategorys(findByParentId(category)); categorys.add(category); } } catch (Exception e) { e.printStackTrace(); throw e; }finally{ DBUtil.close(rs, pstmt, conn); } return categorys ;}public List<Category> findMain(int id) throws Exception { List<Category> categorys = new ArrayList<Category>(); Connection conn =null; PreparedStatement pstmt=null; ResultSet rs=null; Category category = null; String sql ="select * from d_category where id = ?"; try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, id); rs = pstmt.executeQuery(); if(rs.next()){ category = new Category(); category.setDescription(rs.getString("description")); category.setEnName(rs.getString("en_name")); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setParentId(rs.getInt("parent_id")); category.setTurn(rs.getInt("turn")); category.setChildCategorys(findByParentId(category)); categorys.add(category); } } catch (Exception e) { e.printStackTrace(); throw e; }finally{ DBUtil.close(rs, pstmt, conn); } return categorys ;}
    4.3.2 编辑推荐
    编辑推荐主要是由管理员来管理,管理员通过商品管理来推荐,或取消推荐图书。主要是查询product表中的keywords字段,如果keywords的值等于recommend则推荐此书。查询出所有带有recommend的图书然后显示出来。
    4.3.3 热销图书
    模块涉及到数据库的多表查询,关联product,book,category_product,item表,然后查询出订单项中销量最多的图书,以降序显示出来。程序在BookDaoImpl类中,程序代码如下:
    热销图书查询(要查询全部类型的图书,所以catId=1)
    public List<Book> findBookByCatId(Category category, String sortWay, int currPage, int pageSize) throws Exception { List<Book> books = new ArrayList<Book>(); Book book = new Book(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; // oracle 中nvl mysql 中 ifnull String sql = "selectdistinctp.has_deleted,p.keywords,b.author,b.id, p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0) num1 " + "from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join ( " + "select distinct product_id,sum(product_num) num from _item group by product_id ) cou " + "on cou. product_id = b.id " + "where cat_id = ? " + "order by " + sortWay + ",b.id asc limit ?,? "; try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, category.getId()); pstmt.setInt(2, (currPage - 1) * pageSize); pstmt.setInt(3, pageSize); rs = pstmt.executeQuery(); while (rs.next()) { book = new Book(); book.setAuthor(rs.getString("b.author")); book.setSales(rs.getInt("num1")); book.setHasDeleted(rs.getInt("p.has_deleted")); book.setKeywords(rs.getString("p.keywords")); book.setId(rs.getInt("b.id")); book.setProductName(rs.getString("p.product_name")); book.setAuthor(rs.getString("b.author")); book.setPublishing(rs.getString("b.publishing")); book.setPublishTime(new Date(rs.getLong("b.publish_time"))); book.setDescription(rs.getString("p.description")); book.setFixedPrice(rs.getDouble("p.fixed_price")); book.setDangPrice(rs.getDouble("p.dang_price")); book.setProductPic(rs.getString("p.product_pic")); book.setAddTime(new Date(rs.getLong("p.add_time"))); books.add(book); } } catch (Exception e) { e.printStackTrace(); throw e; } finally { DBUtil.close(rs, pstmt, conn); } return books;}
    4.3.4 最新上架图书
    最新上架图书主要根据product表中的add_time字段来判断,然后降序显示出来。
    具体sql语句如下:
    Select p.id,author,publishing,publish_time,product_name,description,fixed_price,dang_price,product_pic from d_book b join d_product p on b.id = p.id order by p.add_time desc limit 1,4 ;
    4.3.5 新书热卖榜
    新书热卖榜主要涉及到数据库中的表product,book,item,category_product关联查询。这里有涉及到按多个字段排序order by b.publish_time desc,cou.num desc,具体sql语句如下:
    select distinct b.id, p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0)from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join select distinct product_id,sum(product_num) num from d_item group by product_id ) cou on cou. product_id = b.id where cat_id = 1 order by b.publish_time desc,cou.num desc limit 1,3;
    4.3.6 图书列表

    图书列表左栏的实现:用户通过主页面的类别栏的链接进入此模块,在进入前,会把用户点击的类别对象传递给服务器,服务器通过相应类别查询出其他的兄弟类别及相应类别的藏书量。

    相应的程序实现代码如下:
    /* * 通过父类id来查询子类集合,而后再关联d_category_product表以求出对应子类里的藏书数量*/public List<Category> findCategoryInfoByParentId(Category vo) throws Exception { List<Category> categorys = new ArrayList<Category>(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; Category category = null; String sql ="select c.id,c.name,c.en_name,c.parent_id, count(cp.product_id) count_product " + "from d_category c left join d_category_product cp on c.id = cp.cat_id " + "where c.parent_id = ? " + "group by c.id"; try { conn = DBUtil.getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setInt(1, vo.getParentId()); rs = pstmt.executeQuery(); while(rs.next()){ category = new Category(); category.setEnName(rs.getString("c.en_name")); category.setId(rs.getInt("c.id")); category.setName(rs.getString("c.name")); category.setParentId(rs.getInt("c.parent_id")); category.setCountProduct(rs.getInt("count_product")); categorys.add(category); } } catch (Exception e) { e.printStackTrace(); throw e; } finally{ DBUtil.close(rs, pstmt,conn); } return categorys;}
    图书列表右栏的实现:主要涉及复杂的数据库查询,其中查询语句根据浏览器传递过来的参数,进行多种方式排序,根据页数显示相应数据,以及模糊查询,具体sql语句如下,其中问号以及黑体字是浏览器相应传过来的参数。
    select distinct p.has_deleted,b.id,p.product_name,b.author,b.publishing,b.publish_time,p.description,p.fixed_price,p.dang_price,p.product_pic,p.add_time,ifnull(cou.num,0) " + "from d_category_product cp join d_product p on cp.product_id = p.id join d_book b on p.id = b.id left join ( " + "select distinct product_id,sum(product_num) num from d_item group by product_id ) cou " + "on cou. product_id = b.id " + "where cat_id = ? "+ "and (p.product_name like '%"+key+"%' or b.author like '%"+key+"%' or b.publishing like '%"+key+"%' ) "+ "order by "+sortWay+ " limit ?,? ";
    4.3.7 图书详细信息实现
    根据用户点击的图书id,关联查询数据库中的product,book表,而后显示出来。
    具体sql语句如下,其中问号是浏览器传过来的图书id:
    select * from d_book b join d_product p on b.id=p.id" + " where b.id=?;
    4.4 购物车模块实现
    购物车实现主要包括:购物车的添加,购物车商品的数量更改,购物车商品的删除,以及恢复购物车中删除的商品。
    4.4.1 购物车的添加当用户点击购买按钮,ajax技术会向服务器发送请求,如果先前没有载入购物车,服务器会把cookie里对应用户绑定的数据(有购物车数据,与恢复购物车数据)载入,并绑定mycart以及recart对象到session中,其中mycart,recart都是一个集合,里面存储着用户加入购物车的cartItem对象。当购物车商品内容发生改变,就得重新绑定用户cookie值。而后再设置cookie保存时间为一年,就能保证当用户关闭浏览器,再次打开时购物车商品还在。载入购物车完毕时,再把用户点击的相应商品添加到mycart集合里,具体操作由Mycart.java类实现。
    4.4.2 购物车商品的数量更改首先用户输入的要更改的商品数量必须是数字,否则javascirpt表单验证将不会发送请求。当用户输入数字合法时,如果输入数字为0,商品将被移除到恢复购物车集合,否则会更改对应商品的数量。
    4.4.3 购物车商品的删除根据商品的id,把cart集合里的对应商品项cartItem移除,然后在cartRe集合中添加相应的被删除的商品项cartItem。
    4.4.4 购物车商品的恢复即把相应cartRe恢复购物车中的商品移除,移除的cartItem商品项添加到cart购物车中。
    4.5 下订单模块实现当用户点击结算按钮将出现如下页面:

    用户确认信息后点击下一步将出现如下页面:

    服务器将会返回用户以前购买商品时填写过的一些地址。当用户选择以前填写过地址,浏览器将会采用ajax技术向服务器发送请求,返回所选择地址相应信息,并采用javascirpt的dom操作,把地址信息显示在表单文本框中,以只读格式显示,如图4.5.2。用户可以选择以前填写的收货地址,也可以填写新地址,当填写新地址,会进行javascript的表单验证,当格式合法时,用户的新地址方可插入到数据库中。

    而后点击下一步将出现订单成功页面,服务器将清空购物车中的信息。
    第五章 后台管理的设计与实现后台管理主要包括四个模块:管理员登录,用户管理,商品添加,商品管理,安全退出
    5.1 管理员登录登录网址:localhost:8080/dangdang-wlj/admin/loginAction

    Javascript首先进行表单验证,当输入格式正确时,才会向服务器发送请求。服务器根据管理员输入的信息到数据库中admin表查询,如存在信息一致的记录,则服务器将绑定loginAdmin对象至session中,返回管理页面。否则返回登录页面,并提示用户密码或帐号输入错误信息。

    默认登录帐号邮箱:admin@qq.com
    密码:111111

    5.2 用户管理
    用户表是以用户消费金额来降序排序。
    管理员可以对目前注册过的会员进行管理,包括用户锁定以及删除。
    其中用户的锁定与解锁状态是根据表user中的userIntegral字段来判断,当userIntegral == 1表示用户已经被锁定。反之,可以对用户进行锁定。用户登录后将会提示用户被锁定的信息。
    5.3 商品添加

    其中商品信息添加中的选择图书类别,采用了javascript的dom操作。
    当点击添加按钮将向服务器发送请求。如添加成功还是返回当前页面。并提示添加成功字眼。否则将跳转到出错页面。如下图5.3.2为添加成功页面。

    其中上传图片是通过struts2提供的拦截器来实现。
    <interceptor-ref name="fileUpload"/><interceptor-ref name="basicStack"/>
    上传图片包括图书小图,以及图书大图,小图默认存放路径为webRoot/productImages,大图默认存放路径为webRoot/productImage_c;用户也可以直接把要添加商品的图片拷贝到对应的文件夹中去。
    当用户点击上传按钮,将出现下图:

    当商品信息以及图片都添加成功后,到主页面中去将看到商品已经添加到最新上架栏目里。

    5.4 商品管理
    管理员可以查看商品信息,商品表是按照商品的销量降序排序。
    可以对商品进行推荐/取消推荐操作。被推荐的商品将出现在主页面中的编辑推荐栏目中。
    也可以对商品进行下架/上架操作。其中上架下架主要是通过product的has_deleted字段来判断,当has_deleted==1表示该商品已下架,否则反之。当管理员将此商品下架,则主页面中该商品条目中将不会出现购买按钮,会提示该商品已经下架。

    5.5 安全退出当管理员点击安全退出链接,服务器会把session中的loginAdmin对象移除,而后返回到登录页面。
    第六章 系统测试6.1 测试目的与目标在此系统进行初步实现之后,开始进行对系统进行测试,找出系统中存在的Bug,通过测试,用提交的Bug报告来为以后软件的改进提供标准和参考,能够在以后的系统改进中找到依据。
    测试后的软件各模块基本功能能够顺利进行,尽可能的提高软件的健壮性。
    6.2 测试方法系统的测试有两种方法分别为黑盒测试和白盒测试。
    黑盒测试又称为功能测试,在程序接口进行,只检查程序功能是否能够按照规格说明书的规定正确使用,程序是否能适当地接收输入数据并发生正确的输出信息,而且要能够保持外部信息的完整性。
    白盒测试又叫结构测试,完全了解程序的结构和处理过程,这种方法按照程序内部的逻辑测试程序,检验程序中每条通路是否都能按照预定要求正确工作。
    本系统开发过程进行的测试步骤如下:
    模块测试:也叫单元测试,目的是保证每一个模块作为一个单元能正确运行,本测试所发现的往往是编码和详细设计的错误,主要评价模块的下述五个特点:模块接口,局部数据结构,重要的执行路径,出错处理通路,影响上述各方面特性的边界条件。
    模块测试主要由代码审查和软件测试两部分组成。
    集成测试:包括系统测试和子系统测试。集成测试是组装软件的系统技术,主要目标是发现与接口有关的问题。集成测试有两种方法:非渐增式和渐增式,但比较而言,渐增式方法比较好,因为:编写的测试软件较少,开销较小;较早地发现模块间的接口错误;错误位置容易判断;测试更彻底。
    因此,本系统集成测试采用渐增式测试中的混合法,即对软件结构中较上层使用自顶而下的测试方法,而对软件结构中较下层,使用的是自底向上方法,两者结合,这是对模块较多时测试的一种折衷方法。
    验收测试:这一步是验证软件的有效性。目的是向未来的用户表明系统能够像预定的那样工作,验收测试一般使用黑盒测试法,验收测试有两种可能的结果:功能和特性与用户的要求有差距;功能和性能与用户要求一致,软件是可以接受的。这个阶段发现的问题往往和需求分析阶段的差距有关。
    平行运行。所谓平行运行就是同时运行。新开发出来的系统和将被它取代的旧系统,以便比较新旧两个系统的处理结果。目的有:可以在准生产环境中运行新系统而有不冒风险;用户能有一段熟悉新系统的时间;可以验证用户指南和使用手册之类的文档;能够以准生产模式对新系统进行全负荷测试,可以用测试结果验证性能指标。
    6.3 测试结论把开始的代码写得越好,它出现的错误也就越少,你也就越能相信所做过的测试是彻底的。系统化测试以一种有序方式设法探测潜在的麻烦位置。同样,毛病最可能出现在边界,这可以通过手工的或者程序的方式检查。自动进行测试是最理想的,用得越多越好,因为机器不会犯错误、不会疲劳、不会用臆想某此实际无法工作的东西能行来欺骗自己。回归测试检查一个程序是否能产生与它们过去相同的输出。在做了小改变之后就测试是一种好技术,能帮助我们将出现问题的范围局部化,因为新问题一般就出现在新代码里面。
    测试和排错常常被说成是一个阶段,实际上它们根本不是同一件事。简单地说,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,排错是在你已经知道程序有问题时要做的事情。而测试则是在你在认为程序能工作的情况下,为设法打败它而进行的一整套确定的系统化的试验。
    Edsger Dijkstra有一个非常有名的说法:测试能够说明程序中有错误,但却不能说明其中没有错误。他的希望是,程序可以通过某种构造过程正确地做出来,这样就不再会有错误了,因此测试也就不必要了。这确实是个美好生活的目标,但是,对今天的实际程序而言,这仍然还只是一个理想。所以应该集中精力讨论如何测试,如何才能够更快地发现程序错误,如何才可以使得工作更有成效、效率更高。
    系统存在不足
    系统不足:由于制作时间有限,自身所学知识的贫乏,页面做的比较粗糙,整个系统的功能还不是很完善。

    分页浏览可以采用ajax,为了不影响用户体验,应尽量使用ajax技术
    购物车中的载入以及存储cookie可以用json对象
    购物车的数据应该存进数据库中,减免服务器压力

    后台管理界面不够友善,后台具体还可以添加修改商品信息功能,根据用户的需求排序(如按商品出版时间,上架时间….)商品表
    使用spring框架,将使得本系统更符合软件工程思想,使得软件各层完全解藕,更易于后期维护,以及方便对数据库事务操作和对象状态管理
    随着数据的增多,为了方便数据的录入,应考虑实现大数据量导入数据库的技术

    改进方案及方向
    对于此系统要从美观、功能和技术上三个方面做重点改进。在美观方面还要不断的提高自己的审美观,要熟练的掌握网页开发工具,功能方面要扩大系统的功能,使得以前没有实现的功能能够实现,对已有的功能要进行修改扩冲,技术方面虽然系统的基本功能已经实现,但制作还是比较粗糙,很多方面还是没有考虑仔细。
    总结经过几个月的不断学习和设计开发加上老师同学的帮助,终于完成了我的毕业设计题目“模拟当当网购书网站”的开发,在开题报告阶段我参阅了大量的中外文献,对所开发系统的现状,国际发展情况以及未来发展趋势有了深入的了解;在整个系统的需求分析过程中对开发前期工作地流程步骤有了深入的掌握;在开发过程我进一步学习了Java的基础语法,和一些网页设计美工方面的知识,以便使系统有更好的美观性,在编写过程中也规范了许多编码习惯,数据库设计阶段我尝试了几个不同版本的数据库,它们在配置操作上各有不同,又各有优缺点,在它们的一些基本操作上也有了进一步提高。在配置开发工具过程中对Tomcat和MyEclipse的连接部署有了清晰地认识,在使用第三方插件struts2时,对其配置文件Struts-config.xml的作用也有了相当的了解, 对开发Web程序的步骤框架页有了总体性认识。
    在整个系统开发的过程中,我学到了很大新的知识,以前学过的许多知识点在运用过程中也有了更为深入的分析,这是我大学期间做过的规模最大的项目
    在这个过程中也体会到了如何将书本知识转化到实际的应用中。
    参考文献[1] 王立福. 软件工程(第二版)[M]. 北京:北京大学出版社.2002.
    [2] 张秋余,杨玥. 基于用例的需求建模方法[J]. 计算机工程与设计,2006,19:3539-3541.
    [3] MattheMacDonal.管理信息系统[J].电子工业出版社.2003.Vol.3(8):102-108.
    [4] 张秋余,杨玥. 基于用例的需求建模方法[J]. 计算机工程与设计,2006,19:3539-3541.
    [5] John W. Satzinger, Robert B. Jackson, Stephen D. Burd. [Z]. 北京:人民邮电出版社, 2008.
    [6] 王珊,萨师炫.数据库系统概论(第三版)[M]. 北京:高等教育出版社.2002
    [7] 张海潘.软件工程[J].清华大学出版社.2003年11月
    [8] 张波. 网络答疑系统的设计与实现[D]. 长春:吉林大学软件学院,2005.
    [9] 陆荣幸,郁洲. J2EE平台上MVC设计模式的研究与实现[J]. 计算机应用研究,2003,03:144-146.
    [10] 孙卫琴,李洪称. Tomcat与Java Web开发技术详解[M]. 北京:电子工业出版社,2003.
    [11] 何成万,余秋惠. MVC模型2及软件框架Struts的研究[J]. 计算机工程,2002,06274-276.
    [12] Marty Hall,Larry Brown著,赵学良译. Servlet与JSP核心编程(第2版)[M]. 北京:清华大学出版社,2004.
    [13] 戴继周. 基于Web的网络教学平台的设计与实现[D]. 长春:吉林大学计算机应用技术专业,2004
    [14] 尹朝庆. 计算机系统结构教程[M]. 北京:清华大学出版社.2005.
    [15] 张海藩. 软件工程导论(第四版)[M]. 北京:清华大学出版社,2003.
    [16] 张维明. 信息系统原理与工程. 电子工业出版社. 2002年1月
    1 评论 13 下载 2020-12-02 11:47:10 下载需要12点积分
  • 基于ASP.NET和SQL Server 2012实现的OnlineMart电商网站

    摘 要OM电商系统,可以让顾客全面了解商品的详细信息,消除网上购物的信息不对称问题。通过商品分类来组织众多的商品,方便顾客找到所需要的商品。提供客服顾客互动机制,提高顾客的参与度。通过设计合理的订单处理流程,提高顾客的购物体验。提供多种支付方式,满足不同客户的付款需求。
    我们网站主要对客户进行了需求分析,功能模块划分,以及对数据库进行了设计,对我们的网站进行了整体的构建,分析了网站所做的工作。
    我们的网站就是一个基于 SQL Server 2012 数据库为开发平台,以ASP.NET 为开发工具。采用asp.net技术作为前台,整个系统的功能以用户需求为主,使用方便。后台采用了SQL Server 2012,有效的保证了数据的完整性和有效性,提高了系统的安全性,并使系统维护更加简便。
    关键词:SQL Server 2012; ASP.NET;数据库技术
    第1章 项目分析OM电商系统是一个能够满足数据库管理的网站,即具备一个数据库管理系统的基本功能,包括数据的增加,删除,修改,查询等,以便于用户查看,操作,和查询相关商品信息。此外,系统具有用户和管理员登录功能,这样可以提高数据的安全性和可靠性。
    因此通过分析确定了本系统的功能如下:普通用户方面,登陆后可以查看所有商品,购买商品,修改个人信息;管理员方面,可以对普通用户的信息进行录入(包括更新,删除,修改),可以对商品的信息进行录入(包括更新,删除,修改) ,也可以对用户登录注册管理及权限设置,系统主页面管理等等。
    1.1 问题描述用户通过各种方式,查看商城所提供的商品。对于有购买意向的商品,注册登陆之后,用户可以将商品加入到购物车。用户也可以调整购物车中的商品,确定是否购买。也可以继续浏览商品。用户根据购物车中的商品确认运费,指定送货地址,生成订单。选择付款方式,完成订单付款,生成已付款订单。如果不付款,订单保留初始状态,初始状态的订单可以删除。 管理员根据已付款订单安排发货。发货后,订单变成已发货状态。用户收到货物确认后,订单变成已完成状态。
    1.2 技术分析本系统就是一个基于 SQL Server 2012 数据库为开发平台,以ASP.NET 为开发工具。采用asp.net技术作为前台,整个系统的功能以用户需求为主,使用方便。后台采用了SQL Server 2012,有效的保证了数据的完整性和有效性,提高了系统的安全性,并使系统维护更加简便。采用三层架构搭建,网站使用带有js,css,html的母版页,DAL层使用L2S技术。
    1.3 工程进度计划该系统需要三个星期的时间,我们的整体计划是前一个星期先进行软件需求分析划分出系统的大功能模块,每个大功能模块有哪些小功能模块,第二个星期进行概要设计,包括系统的基本处理流程、模块划分、功能分配、运行设计、数据结构设计和出错处理设计等,第三第四星期进行详细设计,描述实现具体模块所涉及到的主要算法、数据结构、类的层次结构及调用关系,然后开始具体的编写程序工作,最后是测试,每个模块都进行测试。
    第2章 系统分析与设计OM电商系统主要功能是为客户提供一个便捷的电器购买系统。用户需要登陆注册,管理个人中心及购物车,管理员需要管理商品及用户信息。

    建立数据库,分析网站结构,设计出合适的表和字段
    确定表之间的关系
    编写代码,连接数据库,实现相关的功能

    2.1 系统分析2.1.1 基本功能
    用户注册:所有人都可以注册成为顾客用户
    登录/注销:未登录游客只能浏览和查看商品
    个人资料管理:查看和修改个人资料、状态、账务
    密码管理:修改或重置密码

    2.1.2 前台购物
    首页展示:首页列出商品,当前用户、购物车、查找商品按钮等信息。所有人可以查看
    浏览商品:分页列出满足条件的商品清单。所有人可以查看
    商品明细:某个指定商品的详细信息。所有人可以查看
    购物车:查看和管理购物车中的商品。所有人可以查看

    2.1.3 顾客后台
    我的订单:查看顾客的全部订单和订单详情,执行订单确认、付款、取消等操作
    我的地址:查看和管理顾客的全部送货地址

    2.1.4 管理员后台
    商品管理:浏览全部商品,允许添加、修改、删除商品
    订单管理:浏览全部顾客订单,允许发货或取消订单
    账号管理:浏览顾客账号,允许添加、修改、删除非法顾客账号
    分类管理:浏览所有商品分类,允许添加、修改、删除商品分类

    2.1.5 参与者
    用户
    客服员
    采购员
    管理员

    2.2 系统设计在OM电商系统解决方案中新建LSS.BLL、LSS.DAL和LSS.Entites四个类库项目。各组件之间的关系中,BLL层不但需要和DAL层交互,而且还负责和ASP.NET的成员资格组件交互,成员资格组件将通过前述Web.config文件中配置的成员资格提供者组件完成和数据库的交互,以完成管理用户任务。
    2.2.1 功能结构图
    2.2.2 系统体系结构设计OM电商系统采用三层架构,OM电商系统的实体层、DAL、BLL和UI层,每一层都用一个单独的项目来实现。如图2.2所示。

    2.3 数据库设计根据数据库设计概要我们写出了用户表,管理员表,商品表等表,订单表,有商品,用户,管理员等实体,管理员可以对商品信息和用户信息进行管理,用户可以对商品进行收藏,添加购物车以及付款购买。
    2.3.1 E-R图
    2.3.2关系模式
    用户(姓名,性别,年龄,邮箱,电话号码,密码,ID,身份证)
    管理员(姓名,性别,年龄,电话号码,密码,登陆名)
    商品(商品编号,商品名称,价格,类别,数量)
    订单(订单编号,用户姓名,用户ID,时间,地址,价格)

    2.3.3 表的设计根据数据库设计概要,我们最终得出数据库中需要的有:用户表,管理员表,商品表,订单表。
    用户表Users



    字段名称(列名)
    数据类型
    说明
    约束




    UserID
    char(8)
    用户ID
    primary key


    UserName
    String
    用户姓名



    Age
    char(2)
    年龄



    UserSex
    char(2)
    性别



    UserTel
    char(11)
    电话号码



    Email
    String
    邮箱



    IDCard
    nvchar
    身份证



    管理员表Admin



    字段名称(列名)
    数据类型
    说明
    约束




    AdminID
    char(8)
    登录名
    primary key


    AdminName
    String
    管理员姓名



    AdminPwd
    char(2)
    密码



    AdminAge
    char(2)
    年龄



    AdminSex
    char(11)
    性别



    AdminTel
    String
    电话号码



    商品表Goods



    字段名称(列名)
    数据类型
    说明
    约束




    GoodsID
    char(8)
    商品ID
    primary key


    GoodsName
    char(8)
    商品名称



    GoodsPhoto
    vchar(500)
    商品图片



    GoodsType
    char(6)
    商品种类



    GoodsNum
    char(5)
    商品数量



    Weight
    int
    商品重量



    订单表Order



    字段名称(列名)
    数据类型
    说明
    约束




    ID
    bigint
    订单ID
    primary key


    UserID
    int
    用户ID



    UserName
    nvarchar
    用户名称



    Address
    nvarchar
    地址



    OrderPrice
    numeric(10, 2)
    订单价格



    PayTime
    datetime
    订单时间



    第3章 实现与测试3.1 首页系统运行后,首先进入网站首页面,如图3-1所示。包括商品浏览,商品搜索,商品信息详情等,商品按类别分类。用户可以在此页面进行查看商品以及进入其他页面。
    首页Default.aspx页面嵌套在Site.master母版页中,具体的浏览效果如下图所示,该页面的主要功能的实现是通过mysql数据库来实现,以及使用sql语句来实现对商品的浏览,搜索和查看,而且需要运用数据控件进行商品分类,对代码技术要求高。
    布局总体可以分为content_left和content_right两个<div>区块,对应商品分类超链接和商品清单。开发时考虑到商品分类内容偏少,因此在其下方添加了一个推荐商品栏目。
    代码中的注释部分表示的局部区域也都是通过DIV布局实现的,例如推荐商品栏目分为头部content_heading和清单grid_box两个<div>区块,具体页面框架代码如下:
    <div class="content"> <div class="content_heading"> <div class="heading_title"> <h3>所有分类</h3> </div> <div class="clear"> </div> </div>
    各区域中每个商品展示,也是一个<div>元素,以商品清单中单个商品的展示为例,每个商品的内容都包含在<div>元素中。
    代码中float属性实现平铺,通过控制width属性占比值,就可以控制一行中平铺的商品数量,例如15.8%的效果就是每行展示5个商品。如果将width属性调整为22.2%,那么每行展示4个商品,通过DIV+CSS实现平铺。代码如下:
    .grid_grid { display: block; float: left; margin: 1% 1% 1% 0; width: 15.8%; padding: 1.5%; text-align: center; position: relative;}
    下述代码中的catSvr.GetData()方法就是前面用于后台商品分类管理的同一个BLL层方法。获取推荐商品goodsSvr.GetTop10()方法中使用了LINQ降序排序OrderByDescending()方法和限制获取记录数Take()方法:
    CategoryService catSvr = new CategoryService();rpCategory.DataSource = catSvr.GetData(null);rpCategory.DataBind();

    3.2 超级管理员后台系统运行进入首页后,管理员可以点击进入网站后台,管理员可以通过后台对商品和用户进行管理,如图3.2所示。
    在LSS.Web项目中新增Admin文件夹,然后在其中新增Admin.master母版页,该母版页为嵌套在Site.master母版页中的嵌套母版页。
    Admin.master母版页的页面代码框架为:
    <asp:Content ID="contMain" ContentPlaceHolderID="MainContent" runat="server"><li><a href="Category.aspx"><i class="icon-font"></i>分类管理</a></li><li><a href="#"><i class="icon-font"></i>用户管理</a><a href="Users.aspx"><i class="icon-font"></i>用户列表</a></li><li><a href="UserAdd.aspx"><i class="icon-font"></i>添加用户</a></li></ul></li></asp:Content>
    管理主菜单分为两级,并且菜单文字前面有一个图标。
    其中两级菜单利用嵌套的HTML列表来实现,下面是示例页面代码,实际的超链接需要替换成ASP.NET的HyperLink控件。
    整个管理菜单只有一个应用了sidebar-list样式类的ul列表。每个菜单为一个li列表项。
    由于采用三层架构,首先需要在BLL层中添加相应的服务和方法,然后在页面中调用这些方法来获取所需要的统计数据。

    3.3 后台管理业务后台管理有自己的菜单如图3.3所示,因此也需要自己的母版页。在LSS.Web下添加Back文件夹,在其中添加嵌套在Site.Master母版页中的Back.master母版页。
    业务后台的菜单需要根据用户角色来动态决定显示的内容,具体代码如下:
    <asp:Content ID="contMain" ContentPlaceHolderID="MainContent" runat="server"><li runat="server" id="miGoods"><a href="#"><i class="icon-font"></i>商品管理</a><li><a href="Goods.aspx"><i class="icon-font"></i>商品列表</a></li><li><a href="GoodsAdd.aspx"><i class="icon-font"></i>添加商品</a></li></ul></li><lirunat="server"id="miOrders"><ahref="Orders.aspx"><iclass="icon-font"></a></li></asp>
    一级菜单项是一个<li>元素,为了能够通过服务端代码控制这个元素,需要为<li>标记添加runat=”Server”属性,并指定id属性。上述代码中一共设置了3个一级菜单的<li>元素,它们的id属性值分别是miGoods、miOrders和miUsers,在Back.master页面的Page_Load()方法中可通过代码设置菜单项是否可见。
    根据角色动态显示菜单项仅仅避免了无效菜单项的展示,在B/S系统中不能有效控制权限,因为用户可以在浏览器地址栏中输入URL来直接访问对应模块。因此,必须同时进行权限的配置,在Back文件夹中添加Web.config文件,并编写权限控制配置代码,以此来增加网站的安全性以及可用性。
    商品查找条件的设计需要综合考虑数据实体的属性和业务操作的特征,这里设计了上架时间、商品分类、关键字和上架状态4项。其中商品分类为下拉框,其选择项除了全部分类以外需要从数据库的Categroy表中获取。

    3.4 网站母版页商品查找分为根据商品分类查找和根据关键字查找两种途径,如图3.4所示。根据商品分类查找通过单击商品分类超链接进行,商品分类超链接的页面代码如下:
    <div class="grid_box"><div class="grid_list"><asp:HyperLink ID="hlCategory" runat="server" Text="全部" NavigateUrl="~/Default.aspx"></asp:HyperLink></div><asp:Repeater ID="rpCategory" runat="server"><ItemTemplate><div class="grid_list"><asp:HyperLink ID="hlCategory" runat="server" Text='<%#Eval("Name")%>' NavigateUrl='<%#Eval("ID","~/Default.aspx?catid={0}")%>'></asp:HyperLink</div></ItemTemplate></asp:Repeater>
    上述代码中,首先是一个表示取消分类限制的“全部”超链接,然后是用Repeater控件生成的商品分类超链接清单。单击某个商品分类超链接,就会请求Default.aspx首页,同时通过URL传递catid查询参数。
    登陆,购物车和我的商城链接使用css样式表设计,使其固定到右上角。

    参考文献[1] 童爱红. Visual C#.NET应用教程[M]. 北京:人民邮电出版社,2004.3
    [2] 李兰友 杨晓光. Visual C#.NET程序设计[M] 北京:清华大学出版社,2004.5
    [3] 韩玉民. 计算机专业英语教学研究与实践 [J].计算机与信息技术,2008,(6):106-107.
    [4] When mouse use computer.[EB/OL]. http://www.danscartoons.com/comp_demo101.gif, 2008-12-26.
    1 评论 16 下载 2020-12-24 11:37:25 下载需要10点积分
  • 基于ssm框架和mysql的教务管理系统

    1、绪论“教务网络管理系统”针对学校学生情况对学生各学年的成绩进行有效的管理。能够快速的查询出学生的各科成绩,以及所在班级等各种用途。
    2、需求分析能够存储一定数量的学生信息,并方便有效地进行相应的数据操作和管理,这主要包括学生信息的录入、删除和修改。学生各科成绩的多少关键字查询。
    能够对一定数量的读者进行相应的信息存储和管理,这其中包括查询学生的信息的登记、删除及修改各科考试成绩的查询。学生资料的统计和查询。
    能够提供一定的安全机制,提供数据信息授权访问,防止随意删改,同时提供信息备份服务。使网站更加容易管理和维护,不需要对过多人员培训,提高工作效率。
    3、设计本系统主要面对3个对象:管理员、教职工、学生。
    3.1 业务功能分析功能结构

    E-R图

    管理员状态图

    学生状态图

    教师状态图

    3.1.1 学生模块
    所选课程:显示所有的选修课程以及上课时间和地点等详细信息
    已选课程:显示所有已选好课程,包括学分、上课时间、上课地点、授课老师
    已修课程:显示所有已经修完,老师已经给成绩的课程

    3.1.2 教师模块
    我的课程:显示自己授课的课程列表,已经对学生进行打分
    3.1.3 管理员模块
    课程管理:当课程已经有学生选课成功时,将不能删除
    学生管理:添加学生信息时,其信息也会被添加到登陆表
    教师管理:主要对教师的信息进行管理

    3.2 数据库搭建3.2.1 数据库设计学院表(college)



    字段名称
    类型
    约束
    描述




    collegeID
    int(11)
    NOT NULL PRIMARY KEY
    学院ID


    collegeNAME
    varchar(200)
    NOT NULL
    学院名



    课程表(course)



    字段名称
    类型
    约束
    描述




    courseID
    int(11)
    NOT NULL PRIMARY KEY
    课程ID


    courseNAME
    varchar(200)
    NOT NULL
    课程名称


    teacherID
    int(11)
    NOT NULL
    教师ID


    courseTime
    varchar(200)
    DEFAULT NULL
    上课时间


    classRoom
    varchar(200)
    DEFAULT NULL
    上课地点


    courseWeek
    int(200)
    DEFAULT NULL
    上课周数


    courseType
    varchar(20)
    DEFAULT NULL
    课程类型


    collegeID
    intr(11)
    NOT NULL
    所属学院


    score
    int(11)
    NOT NULL
    学分



    角色表(role)



    字段名称
    类型
    约束
    描述




    roleID
    int(11)
    NOT NULL PRIMARY KEY
    角色ID


    roleNAME
    varchar(20)
    NOT NULL
    角色名称


    permissions
    varchar(255)
    DEFAULT NULL
    权限



    选课表(selectedcourse)



    字段名称
    类型
    约束
    描述




    courseID
    int(11)
    NOT NULL PRIMARY KEY
    选课ID


    studentID
    int(11)
    NOT NULL
    学生ID


    mark
    int(11)
    DEFAULT NULL
    成绩



    学生表(student)



    字段名称
    类型
    约束
    描述




    userID
    int(11)
    NOT NULL AUTO_INCREMENT PRIMARY KEY
    学生ID


    userNAME
    varchar(200)
    NOT NULL
    学生姓名


    sex
    varchar(20)
    DEFAULT NULL
    性别


    birthYear
    date
    DEFAULT NULL
    出生日期


    grade
    date
    DEFAULT NULT
    入学日期


    collegeID
    int(11)
    NOT NULT
    院系ID



    教师表(teacherr)



    字段名称
    类型
    约束
    描述




    userID
    int(11)
    NOT NULL AUTO_INCREMENT PRIMARY KEY
    教师ID


    userNAME
    varchar(200)
    NOT NULL
    教师姓名


    sex
    varchar(20)
    DEFAULT NULL
    性别


    birthYear
    date
    NOT NULL
    出生日期


    degree
    varchar(20)
    DEFAULT NULL
    学历


    title
    varchar(255)
    DEFAULT NULL
    职称


    grade
    date
    DEFAULT NULL
    入职时间


    collegeID
    int(11)
    NOT NULL
    院系



    登陆表(userlogin)



    字段名称
    类型
    约束
    描述




    userID
    int(11)
    NOT NULL AUTO_INCREMENT PRIMARY KEY
    用户ID


    userNAME
    varchar(200)
    NOT NULL
    用户姓名


    password
    varchar(200)
    NOT NULL
    用户密码


    role
    int(11)
    NOT NULL
    角色权限



    3.2.2 数据库实现学院表
    DROP TABLE IF EXISTS `college`;CREATE TABLE `college` ( `collegeID` int(11) NOT NULL, `collegeName` varchar(200) NOT NULL COMMENT '课程名', PRIMARY KEY (`collegeID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    课程表
    DROP TABLE IF EXISTS `course`;CREATE TABLE `course` ( `courseID` int(11) NOT NULL, `courseName` varchar(200) NOT NULL COMMENT '课程名称', `teacherID` int(11) NOT NULL, `courseTime` varchar(200) DEFAULT NULL COMMENT '开课时间', `courseRoom` varchar(200) DEFAULT NULL COMMENT '开课地点', `courseWeek` int(200) DEFAULT NULL COMMENT '学时', `courseType` varchar(20) DEFAULT NULL COMMENT '课程类型', `collegeID` int(11) NOT NULL COMMENT '所属院系', `score` int(11) NOT NULL COMMENT '学分', PRIMARY KEY (`courseID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    角色表
    DROP TABLE IF EXISTS `role`;CREATE TABLE `role` ( `roleID` int(11) NOT NULL, `roleName` varchar(20) NOT NULL, `permissions` varchar(255) DEFAULT NULL COMMENT '权限', PRIMARY KEY (`roleID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    选课表
    DROP TABLE IF EXISTS `selectedcourse`;CREATE TABLE `selectedcourse` ( `courseID` int(11) primary key NOT NULL, `studentID` int(11) NOT NULL, `mark` int(11) DEFAULT NULL COMMENT '成绩') ENGINE=InnoDB DEFAULT CHARSET=utf8;
    学生表
    DROP TABLE IF EXISTS `student`;CREATE TABLE `student` ( `userID` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(200) NOT NULL, `sex` varchar(20) DEFAULT NULL, `birthYear` date DEFAULT NULL COMMENT '出生日期', `grade` date DEFAULT NULL COMMENT '入学日期', `collegeID` int(11) NOT NULL COMMENT '院系id', PRIMARY KEY (`userID`)) ENGINE=InnoDB AUTO_INCREMENT=10007 DEFAULT CHARSET=utf8;
    教师表
    DROP TABLE IF EXISTS `teacher`;CREATE TABLE `teacher` ( `userID` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(200) NOT NULL, `sex` varchar(20) DEFAULT NULL, `birthYear` date DEFAULT NULL COMMENT '出生日期', `degree` varchar(20) DEFAULT NULL COMMENT '学历', `title` varchar(255) DEFAULT NULL COMMENT '职称', `grade` date DEFAULT NULL COMMENT '入职时间', `collegeID` int(11) NOT NULL COMMENT '院系', PRIMARY KEY (`userID`)) ENGINE=InnoDB AUTO_INCREMENT=1004 DEFAULT CHARSET=utf8;
    用户登陆表
    DROP TABLE IF EXISTS `userlogin`;CREATE TABLE `userlogin` ( `userID` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(200) NOT NULL, `password` varchar(200) NOT NULL, `role` int(11) NOT NULL DEFAULT '2' COMMENT '角色权限', PRIMARY KEY (`userID`)) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
    4、编码4.1 后台功能实现4.1.1 College pojo类package com.system.po;public class College { private Integer collegeid; private String collegename; public Integer getCollegeid() { return collegeid; } public void setCollegeid(Integer collegeid) { this.collegeid = collegeid; } public String getCollegename() { return collegename; } public void setCollegename(String collegename) { this.collegename = collegename == null ? null : collegename.trim(); }}
    4.1.2 cpllege servic类package com.system.service;import com.system.po.College;import java.util.List;public interface CollegeService { List<College> finAll() throws Exception;}
    4.1.3 college impl类package com.system.service.impl;import com.system.mapper.CollegeMapper;import com.system.po.College;import com.system.po.CollegeExample;import com.system.service.CollegeService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class CollegeServiceImpl implements CollegeService { @Autowired private CollegeMapper collegeMapper; public List<College> finAll() throws Exception { CollegeExample collegeExample = new CollegeExample(); CollegeExample.Criteria criteria = collegeExample.createCriteria(); criteria.andCollegeidIsNotNull(); return collegeMapper.selectByExample(collegeExample); }}
    4.1.4 college mapper 映射package com.system.mapper;import com.system.po.College;import com.system.po.CollegeExample;import org.apache.ibatis.annotations.Param;import java.util.List;public interface CollegeMapper { int countByExample(CollegeExample example); int deleteByExample(CollegeExample example); int deleteByPrimaryKey(Integer collegeid); int insert(College record); int insertSelective(College record); List<College> selectByExample(CollegeExample example); College selectByPrimaryKey(Integer collegeid); int updateByExampleSelective(@Param("record") College record, @Param("example") CollegeExample example); int updateByExample(@Param("record") College record, @Param("example") CollegeExample example); int updateByPrimaryKeySelective(College record); int updateByPrimaryKey(College record);}
    4.1.5 login controller层package com.system.controller; import com.system.po.Userlogin;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controllerpublic class LoginController { //登录跳转 @RequestMapping(value = "/login", method = {RequestMethod.GET}) public String loginUI() throws Exception { return "../../login"; } //登录表单处理 @RequestMapping(value = "/login", method = {RequestMethod.POST}) public String login(Userlogin userlogin) throws Exception { //Shiro实现登录 UsernamePasswordToken token = new UsernamePasswordToken(userlogin.getUsername(), userlogin.getPassword()); Subject subject = SecurityUtils.getSubject(); //如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常 subject.login(token); if (subject.hasRole("admin")) { return "redirect:/admin/showStudent"; } else if (subject.hasRole("teacher")) { return "redirect:/teacher/showCourse"; } else if (subject.hasRole("student")) { return "redirect:/student/showCourse"; } return "/login"; }}
    4.2 前端页面实现4.2.1 菜单页面实现<%@ page contentType="text/html;charset=UTF-8" language="java" %><div class="col-md-2"> <ul class="nav nav-pills nav-stacked" id="nav"> <li><a href="${pageContext.request.contextPath}/student/showCourse">所有课程<span class="badge pull-right"></span></a></li> <li><a href="${pageContext.request.contextPath}/student/selectedCourse">已选课程<span class="badge pull-right"></span></a></li> <li><a href="${pageContext.request.contextPath}/student/overCourse">已修课程<span class="badge pull-right"></span></a></li> <li><a href="${pageContext.request.contextPath}/student/passwordRest">修改密码<sapn class="" /></a></li> <li><a href="${pageContext.request.contextPath}/logout">退出系统<sapn class="" /></a></li> </ul></div>
    4.2.2 头页面实现<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--shiro标签--%><%@taglib prefix="shiro" uri="http://shiro.apache.org/tags" %><!-- 顶栏 --><div class="container" id="top"> <div class="row"> <div class="col-md-12"> <!--加入导航条标题--> <div class="navbar navbar-default" role="navigation">  <div class="navbar-header">   <a href="##" class="navbar-brand">广东白云学院教务网络管理系统(学生)</a>  </div> <form action="##" class="navbar-form navbar-right" rol="search"> <div class="dropdown"> <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" style="margin-right: 20px; "> <%--登录用户名--%> <span class=""><shiro:principal/></span> <span class=""></span> </button> <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1"> <li role="presentation"> <a role="menuitem" tabindex="-1" href="#"> <span class="glyphicon glyphicon-cog pull-right"></span> 修改个人信息 </a> </li> <!-分割线---> <li role="presentation" class="divider"></li> <li role="presentation"> <a role="menuitem" tabindex="-1" href="/Baiyun/logout"> <span class="glyphicon glyphicon-off pull-right"></span> 注销 </a> </li> </ul> </div> </form> </div> </div> </div></div>
    4.2.3 学生显示页面<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %><!DOCTYPE html><html><head> <title>课程信息显示</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- 引入bootstrap --> <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/css/bootstrap.min.css"> <!-- 引入JQuery bootstrap.js--> <script src="${pageContext.request.contextPath}/js/jquery-3.2.1.min.js"></script> <script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script> <%--<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">--%></head><body> <!-- 顶栏 --> <jsp:include page="top.jsp"></jsp:include> <!-- 中间主体 --> <div class="container" id="content"> <div class="row"> <jsp:include page="menu.jsp"></jsp:include> <div class="col-md-10"> <div class="panel panel-default"> <div class="panel-heading"> <div class="row"> <h1 class="col-md-5">课程列表</h1> <form class="bs-example bs-example-form col-md-5" role="form" style="margin: 20px 0 10px 0;" action="${pageContext.request.contextPath}/admin/selectCourse" id="form1" method="post"> <div class="input-group"> <input type="text" class="form-control" placeholder="请输入课程名" name="findByName"> <span class="input-group-addon btn" onclick="document.getElementById('form1').submit" id="sub">搜索</span> </div> </form> </div> </div> <table class="table table-bordered"> <thead> <tr> <th>课程号</th> <th>课程名称</th> <th>授课老师编号</th> <th>上课时间</th> <th>上课地点</th> <th>周数</th> <th>课程类型</th> <th>学分</th> <th>操作</th> </tr> </thead> <tbody> <c:forEach items="${courseList}" var="item"> <tr> <td>${item.courseid}</td> <td>${item.coursename}</td> <td>${item.teacherid}</td> <td>${item.coursetime}</td> <td>${item.classroom}</td> <td>${item.courseweek}</td> <td>${item.coursetype}</td> <td>${item.score}</td> <td> <button class="btn btn-default btn-xs btn-info" onClick="location.href='/Baiyun/student/stuSelectedCourse?id=${item.courseid}'">选课</button> <!--弹出框--> </td> </tr> </c:forEach> </tbody> </table> <div class="panel-footer"> <c:if test="${pagingVO != null}"> <nav style="text-align: center"> <ul class="pagination"> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.upPageNo}">«上一页</a></li> <li class="active"><a href="">${pagingVO.curentPageNo}</a></li> <c:if test="${pagingVO.curentPageNo+1 <= pagingVO.totalCount}"> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.curentPageNo+1}">${pagingVO.curentPageNo+1}</a></li> </c:if> <c:if test="${pagingVO.curentPageNo+2 <= pagingVO.totalCount}"> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.curentPageNo+2}">${pagingVO.curentPageNo+2}</a></li> </c:if> <c:if test="${pagingVO.curentPageNo+3 <= pagingVO.totalCount}"> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.curentPageNo+3}">${pagingVO.curentPageNo+3}</a></li> </c:if> <c:if test="${pagingVO.curentPageNo+4 <= pagingVO.totalCount}"> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.curentPageNo+4}">${pagingVO.curentPageNo+4}</a></li> </c:if> <li><a href="${pageContext.request.contextPath}/student/showCourse?page=${pagingVO.totalCount}">最后一页»</a></li> </ul> </nav> </c:if> </div> </div> </div> </div> </div> <div class="container" id="footer"> <div class="row"> <div class="col-md-12"></div> </div> </div></body> <script type="text/javascript"> <%--设置菜单中--%> $("#nav li:nth-child(1)").addClass("active") <c:if test="${pagingVO != null}"> if (${pagingVO.curentPageNo} == ${pagingVO.totalCount}) { $(".pagination li:last-child").addClass("disabled") }; if (${pagingVO.curentPageNo} == ${1}) { $(".pagination li:nth-child(1)").addClass("disabled") }; </c:if> function confirmd() { var msg = "您真的确定要删除吗?!"; if (confirm(msg)==true){ return true; }else{ return false; } } $("#sub").click(function () { $("#form1").submit(); }); </script></html>
    5、测试5.1 登陆测试
    5.2 管理员界面测试5.2.1 管理学生
    5.2.2 学生添加

    5.2.3 查询学生测试
    5.2.4 修改学生测试

    5.2.5 删除学生测试
    5.2.6 重置密码
    5.2.7 退出系统
    5.3 学生功能测试
    5.3.1 选课
    5.3.2 退课
    5.3.3 已修
    5.4 教师页面
    5.4.1 成绩打分


    6、总结使用SSM框架,非常的不熟悉,本来使用maven工程创建项目,但在配置时,有些war包下载不下来,后转为建造web项目。此项目基本代码都来源于网络和课本,虽然这样,但我在弄这整个项目过程中,知道SSM框架的大体流程,在完成这个项目前并不知道需要去配置web.xml这个文件夹,因为我建的时servlet是3.1的,并没有web.xml这个文件,而我在网络上有学到servl3.0开始可以注解,不用web.xml这个文件。导致项目一直运行不成功,后来才在网络上查到有其他框架时候要配置web.xml文件。在运行过程中还出现过中文变成问号的问题,虽然用了两个多星期来完成这个项目,基本是在用他人的东西,但在这个过程中我加深了对spring 、springmvc、mybatis的理解及它们之间是如何整合的。
    5 评论 89 下载 2020-07-14 11:11:33 下载需要14点积分
  • 基于SSM和MySQL的企业人事管理系统的设计与实现

    摘 要随着现代计算机网络技术的不断完善,和经济的不断发展,传统的管 理技术已经不再满足整个企业的需要,更多的企业则注重计算机信息管理, 而人事管理系统是典型的计算机信息管理之一,企业可以借助于它进行人 事管理,达到事半功倍。随着企业的雇佣人数的增加,从而有效地管理人 员信息成为必然。人事管理系统的开发主要包括后台数据库的管理和维护,以及前台程序开发两个方面。本篇文章分析了人事管理系统的组成情况以 及一些基本的功能模块,包括系统功能的框架分析,系统开发的软硬件环 境分析,和系统的数据库逻辑设计分析,以及系统的数据流程分析。该系 统主要利用 Java 语言和 IntelliJ IDEA 软件进行设计开发,在文中进行了详细的介绍。该系统是小型企业的人事管理系统,它简单实用,安全性高, 能够基本上满足企业人事管理的需要,实现了对企业员工信息的整体化,系统化和自动化。
    关键词:人事管理;IntelliJ IDEA;系统化
    1 绪论随着科学技术的的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻人事,它已进入人类社会的各个领域并发挥着越来越重要的作用。作为计算机应用的一部分,使用计算机对人事信息进行管理,具有着传统系统无法比拟的优点。因此,开发这样的系统,对单位人事管理工作进行有效电子化管理,化简为繁的手工操作,提高工作效率是很有意义的。
    现代的社会中,办公自动化进入社会的每一个角落已经势不可挡,而人事管理系统时办公自动化的一个小小体现,它为人事管理大量又复杂的员工数据工作提供了方便,提高了人事管理工作的效率,为办公自动化的普及奠定了基础。人个现代化企业事业单位不可或缺的部分,它的内容对于企事业的管理者来说至关重要。人事管理系统应该能够为管理者提供充足的信息和快捷的查询手段。但很多单位并没有对人事工作进行电子化管理,还是那种管理人员多,管理效率低,决策依据少的尴尬局面。
    人事管理系统是典型的计算机信息管理系统之一,它开发主要包括后台数据库的建立和维护以及前端应用程序的开发。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用,界面美观等特点。人事管理系统可以提供丰富的功能,降低人事管理工作的强度,提高其公司人事管理工作的效率,并依靠系统的强大的功能为人事管理的使用创造良好的条件,从而能够适应其公司人事管理的要求,推动其公司人事管理的信息化建设。
    1.1 设计背景随着经济体制的快速发展,对于企业、事业单位的人事管理部门来说,非常需要的一 个操作方便、功能实用、能满足本企业对员工信息管理及需求的系统。在企业选择人事管理系统时,主要存在以下几个方面的要求:

    可以真正的实现对企业的人事管理
    系统的功能要符合本企业的实际情况
    系统的功能操作要方便、易懂,不要有多余或复杂的操作
    可以方便地对人事信息进行输出打印

    1.2 设计意义本系统就是基于本公司的人事管理而设计的,是对公司的人事资料进行管理,为人事管理人员提供了一套操作简单、使用可靠、界面友好、易于管理和使用的处理工具。本系统对人事各种数据进行统一处理,避免数据存取、数据处理的重复,提高工作效率,减少了系统数据处理的复杂性。本系统不仅使公司人事管理人员从繁重的工作中解脱出来,而且提高了人事管理的效率,提高了人事管理的科学性,方便了用户查询、管理人员进行管理。
    人事管理是现代企业管理工作不可缺少的一部分,是适应现代企业管理尺度的要求、推动企业人事管理走向科学化、规范化的必要条件。只有人事管理规范了,才能在其他方面更好的发展。为了适应现代企业或公司经营发展的需要,人事管理也从以前的手工管理逐渐被规范化的管理信息系统所代替。众所周知,当今社会为信息社会,世界已进入在计算机信息管理领域中激烈竞争的年代。因此,为提高企业工作效率‘保证企业人事管理质量,人事管理便成当今企事业单位中不可缺少的一部分。它适应时代潮流,是现代企业制度发展的要求,推动企业人事管理科学化,规范化的必要条件“科学技术是第一生产力,只有人事管理规范化,其他事情才能办好。为适应现代企事业单位管理规范化,经营发展战略的需要,人事管理也应由原来的手工管理逐渐被规范化的信息管理系统所 代替。因此,要想加强人事管理,单纯依靠以前的手工管理,不尽浪费大量的人力,物力,财力,而且效率不高。所以人事管理信息系统能够为高层领导者提供准确的人员信息,以便领导者了解企业各个部门的人员构成,安排好工作计划使企业变得更高效,更具有生命力。因此,开发人事管理系统更具有一定的社会现实意义。
    1.3 设计思路能够录入人事的基本资料,在操作上能够完成诸如添加、修改、删除、查询、新用户的设置及密码修改等方面的工作,基本满足人事日常业务的需要。
    人事管理信息系统主要包含员工基本信息,工作情况,学历,职位情况等各方面信息,内容比较简单。同时还综合了其他系统的功能,总结归纳出所需现有的功能。主要是为人事信息进行服务,对职位的变动、员工资料查询,公告信息查看等功能。总体上说具有编辑,查询,员工管理等功能。
    在如今的社会中如果再用手工管理这样一个庞大的业务,那不仅对人的脑、身体都带来很多的不便,所以我们现在是很需要这样的一个系统来管理,我的这个设计是最基本的管理。提高系统开发水平和应用的目的。
    本系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,又便于未参与开发的技术维护人员补充、维护。
    本系统应具备数据库维护功能,及时根据用户需求进行数据的添加、删除、修改、备份等操作。
    总之,在人事管理系统的开发过程中,我们应该充分考虑这些基本原则,这样,我们做的系统才能够具有一定的生命周期。
    2 需求分析基于其他企业人事管理软件的不足,要求能够制作一个可以方便、快捷的对员工信息进行添加、修改、删除的操作,为了能够更好的存储职工的信息,可以将职工的信息添加到 Word 文档,这样,不但便于保存,还可以通过 Word 文档进行打印。 根据企业对人事管理的要求,指定企业人事管理系统目标如下:

    操作简单方便、界面简洁美观
    在查看员工信息时,可以对当前员工的家庭情况等进行添加、修改、删除操作
    方便快捷的全方位查询所有数据
    可以将员工信息以表格的形式插入到 Word 文档中
    实现数据库的备份、还原及清空操作
    由于该系统使用对象较多,要有较好的权限管理
    能够在当前运行的系统中重新进行登录
    系统能够运行稳定、安全可靠

    2.1 需求描述管理员进入主界面,软件开始运行,提供用户登录功能,不同的用户登录操作的功能不同,非管理员用户登录只能查看一些公告信息等,而管理员登录后,可以进行用户管理丶部门管理、职位管理、员工管理、公告管理等功能。管理员可以通过点击部门管理进入里面,可以添加部门、查看部门信息、删除部门等操作。在主界面,管理员可以随意选择自己的操作达到最终的目的。
    人事管理系统的主要作用就是为用户管理不同部门的员工,能够有效的完成人事管理的日常工作;将零散的、杂乱无章的人员信息进行一些整理,方便用户的查询、汇总以及分析。一个完整的人事管理系统应实现以下基本功能。

    部门管理:能够维护体现部门间的组织关系,反映部门的基本信息,能够进行部门的增加撤消,以及部门信息(如部门名称、负责人名称等)的修改
    职位管理:用户管理:能够对系统用户进行编辑、增加或删除,并指定用户的权限
    员工信息的管理:维护员工的基本信息,用户可以进行员工档案信息的录入及更改,其中包括员工的基本信息,要求这些员上档案信息可以进行新增、删除、修改操作,同时可以进行浏览和查询的操作
    公告管理:可以查询所有公告或根据公告名称,公告内容进行模糊查询

    2.2 用例建模用户进行登录后,可以进行部门管理丶岗位管理丶员工管理丶公告管理和用户管理的增、删、改查操作,不同的用户具有不同的角色,分配的功能也不相同。如图:
    员工用例模型

    管理员用例模型

    2.3 用例描述2.3.1 用户管理用例描述
    用户管理用例描述

    用例编号:CASE01用例名称:用户管理用例描述:系统管理员对用户的信息进行 CRUD 操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了用户或修改了用户信息或删除了系统中已经存在的用户或查看某个用户的信息活动步骤
    系统管理员登录系统用户点击【新增】按钮,弹出新建用户界面,系统管理员输入用户信息,点击【保存】按钮,系统对输入的信息进行验证,将合法的信息保存,然后显示新增后的用户列表系统管理员在用户列表中选择某个用户,点击【修改】,弹出用户修改界面,显示用户的当前信息,管理员更改用户信息,点击【保存】,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的用户列表系统管理员在用户列表中选择某个用户,点击【删除】,弹出删除提示框,当用户确定删除后,系统将当前用户信息删除,并返回到用户列表,显示删除后的用户列表数据格式:用户信息(用户 ID、用户名,密码,登录名,状态)

    部门管理用例描述

    用例编号:CASE02用例名称:部门管理用例描述:系统管理员对部门的信息进行 CRUD 操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了部门或修改了部门信息或删除了系统中已经存在的部门或查看某个部门的信息活动步骤
    系统管理员登录系统管理员点击【新增】按钮,弹出新建部门界面,系统管理员输入部门信息,点击【保存】按钮,系统对输入的信息进行验证,将合法的 信息保存,然后显示新增后的部门列表系统管理员在部门列表中选择某个部门,点击【修改】,弹出部门修改界面,显示部门的当前信息,管理员更改部门信息,点击【保存】, 系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的部门列表系统管理员在部门列表中选择某个部门,点击【删除】,弹出删除提示框,当部门确定删除后,系统将当前部门信息删除,并返回到部门列表,显示删除后的部门列表
    数据格式:部门信息(部门 ID 丶部门名称丶详细信息丶部门编号丶部门地址)
    职位管理用例描述

    用例编号:CASE03用例名称:职位管理用例描述:系统管理员对职位的信息进行 CRUD 操作前置条件:系统管理员成功登录系统
    后置条件:系统管理员在系统中新增了职位或修改了职位信息或删除了系统中已经存在的职位或查看某个职位的信息
    活动步骤
    系统管理员登录系统管理员点击【新增】按钮,弹出新建职位界面,系统管理员输入职位信息,点击【保存】按钮,系统对输入的信息进行验证,将合法的 信息保存,然后显示新增后的职位列表系统管理员在职位列表中选择某个职位,点击【修改】,弹出职位修改界面,显示职位的当前信息,管理员更改职位信息,点击【保存】, 系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的 职位列表系统管理员在职位列表中选择某个职位,点击【删除】,弹出删除提示框,当职位确定删除后,系统将当前职位信息删除,并返回到职 位列表,显示删除后的职位列表数据格式:职位信息(职位 ID 丶职位编号丶职位描述)

    员工管理用例描述

    用例编号:CASE04用例名称:员工管理用例描述:系统管理员对员工的信息进行 CRUD 操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了员工或修改了员工信息或删除了系统中已经存在的员工或查看某个员工的信息活动步骤
    系统管理员登录系统管理员点击【新增】按钮,弹出新建员工界面,系统管理员输入员工信息,点击【保存】按钮,系统对输入的信息进行验证,将合法的 信息保存,然后显示新增后的员工列表系统管理员在员工列表中选择某个员工,点击【修改】,弹出员工修改界面,显示员工的当前信息,管理员更改员工信息,点击【保存】,系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的员工列表系统管理员在员工列表中选择某个员工,点击【删除】,弹出删除提示框,当员工确定删除后,系统将当前员工信息删除,并返回到员 工列表,显示删除后的员工列表 数据格式:员工信息(员工 ID,姓名,性别,手机号码,邮箱,地址,学历等)

    公告管理用例描述

    用例编号:CASE05用例名称:公告管理用例描述:系统管理员对公告的信息进行 CRUD 操作前置条件:系统管理员成功登录系统后置条件:系统管理员在系统中新增了公告或修改了公告信息或删除了系统中已经存在的公告或查看某个公告的信息活动步骤
    系统管理员登录系统管理员点击【新增】按钮,弹出新建公告界面,系统管理员输入公告信息,点击【保存】按钮,系统对输入的信息进行验证,将合法的 信息保存,然后显示新增后的公告列表系统管理员在公告列表中选择某个公告,点击【修改】,弹出公告修改界面,显示公告的当前信息,管理员更改公告信息,点击【保存】, 系统对输入的信息进行验证,将合法的信息保存,然后显示修改后的公告列表系统管理员在公告列表中选择某个公告,点击【删除】,弹出删除提示框,当公告确定删除后,系统将当前公告信息删除,并返回到公告列表,显示删除后的公告列表
    数据格式:公告信息(公告 ID 丶公告标题,内容,发布日期)

    3 系统设计3.1 数据库设计本系统采用的是 mysql 数据库,Mysql 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的关系数据库管理系统应用软件之一。由瑞典 MySQL AB 公司开 发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
    3.1.1 概念模型
    3.1.2 逻辑模型
    3.1.3 数据库脚本



    3.2 系统架构设计本系统采用 Spring+SpringMVC+MyBatis 三大框架搭建,全过程使用注解式开发, 使用 spring 来管理所有的 bean 对象,不再需要我们去显式地new一个对象,而是让 Spring 框架帮你来完成这一切。使用 SpringMVC 在项目中拦截用户请求,它的核心 Servlet 即 DispatcherServlet 承担中介或是前台这样的职责,将用户请求通过 HandlerMapping 去匹配 Controller,Controller 就是具体对应请求所执行的操作。而 mybatis 则是对 jdbc 的封装,它让数据库底层操作变的透明。mybatis 的操作都是围绕 一个 sqlSessionFactory 实例展开的。mybatis 通过配置文件关联到各实体类的 Mapper 文件,Mapper 文件中配置了每个类对数据库所需进行的 sql 语句映射。在每次与数据库 交互时,通过 sqlSessionFactory 拿到一个 sqlSession,再执行 sql 命令。
    3.3 模块设计3.3.1 项目执行流程页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。
    4 产品实现4.1 部门管理模块实现4.1.1 界面设计部门管理列表界面

    部门管理添加界面

    部门管理修改界面

    4.1.2 功能实现部门管理 Controller 层代码实现:


    部门管理 service 层实现:


    部门管理 dao 层实现:

    4.2 职位管理模块实现4.2.1 界面设计职位管理列表界面

    职位管理添加界面

    职位管理修改界面

    4.2.2 功能实现职位管理 Controller 层代码实现:


    职位管理 Service 层代码实现:


    职位管理 Dao 层代码实现:

    4.3 员工管理模块实现4.3.1 界面设计员工管理列表界面

    员工管理添加界面

    员工管理修改界面

    4.3.2 功能实现员工管理 Controller 层代码实现:



    员工管理 Service 层代码实现:


    员工管理 Dao 层代码实现:


    4.4 公告管理模块实现4.4.1 界面设计角色管理列表界面

    角色管理添加界面

    角色管理修改界面

    4.4.2 功能实现公告管理 Controller 层代码实现:


    公告管理 Service 层代码实现:


    公告管理 Dao 层代码实现:

    4.5 用户管理模块实现4.5.1 界面设计 角色管理列表界面

    角色管理添加界面

    角色管理修改界面

    4.5.2 功能实现用户管理 Controller 层代码实现:


    用户管理 Service 层代码实现:


    用户管理 Dao 层代码实现:

    5 结论5.1 毕业设计成果特点本系统主要是面向管理者群体。方便用户信息的管理、查询和更改,减少人员的重复劳动,节约大量人力和物力。企业人事管理系统的出现,解决了老式的纸质管理的弊端,使企业的人事管理工作系统化、规范化、自动化,降低了企业人事管理工作的强度,从而提高企业人事管理的效率。
    5.2 不足之处或遗留未予解决的问题因为本系统是基于个人的理解来进行开发的,所以考虑到还有很多不足之处和一些还遗留未解决的问题:

    对于框架的底层实现原理不清楚,只能做到运用却不理解,这是之后需要学习的
    对于建用例图,E-R 图等等运用还不是很熟练,这是后面我需要进行学习和提升的地方
    对于 AdminTEL 前端框架里模态框实现下拉列表回写数据的功能没有得到解决,还有 jquery 的一些事件处理和属性选择运用的不是很熟练,这是我后面需要进行学习的地方

    参考文献[1] 刘浩. Java 从入门到精通[M]. 北京:人民邮电出版社,2010:7-10.
    [2] 印旻. Java 语言与面向对象程序设计[M]. 北京:清华大学出版社,2000:88-102.
    [3] 萨师煊 ,王珊. 数据库系统概论[M]. 北京:高等教育出版社,2005:23-57.
    [4] 王玉英. 基于 JSP 的 MySQL 数据库访问技术[J]. 现代计算机:专业版
    [5] 赵钢. JSP Servlet+EJB 的 Web 模式应用研究[J]. 电子设计工程
    [6] 肖英. 解决 JSP/Servlet 开发中的中文乱码问题[J]. 科技传播
    [7] 戴维尔,JavaScript 程序员教程,电子工业出版社
    [8]安训国.数据结构(第四版).大连:大连理工大学出版社,2009.6
    7 评论 49 下载 2020-08-25 11:28:07 下载需要13点积分
  • 基于B树实现的图书管理系统

    1 需求分析1.1 数据结构分析图书管理系统中图书管理模块包括图书类型定义:书号(int),现存量(int),总存量(int),出版时间(int),价格(float),书名,作者名为字符型,借阅指针为读者类型;
    读者类型定义:ID号(int),姓名为字符型。
    B树(2-3树)类型定义:关键字个数和关键字数组为整型,另外还有指向双亲的指针,指向子树的指针;
    B树查找结果类型定义:结点指针,关键字序号和查找标志变量为整型。
    1.2 输出的形式输出界面以用户于计算机的交互方式进行,在输出窗口上显示“特定的提示信息”之后,由用户按提示在键盘上输入演示程序中规定的运算命令,相应的输入数据和运算结果显示在下面。由于时间和能力有限,该管理系统没有用文件存放数据,所有数据放在内存中存放(后来做了改进版就有了),但是选做的功能就还没有实现。其基本业务都是以书号为关键字进行,采用了(2-3树)对书号建立索引,以提高效率。
    1.3 程序所能达到的功能1.3.1 采编入库
    新书购入,将书号,书名,作者,册数,出版时间以及价格添加入图书管理系统中,如果这种书在系统中已存在,则只将总库存量增加,每增加一个书号则以凹入表的形式显示B树形状。
    1.3.2 清除库存
    实现某本书的全部信息删除操作,每清除一个书号则以凹入表的形式显示B树形状。
    1.3.3 图书借阅
    如果树的库存量大于零时则执行出借,登记借阅者的图书证号和姓名。
    1.3.4 图书归还
    注销借阅者信息,并改变该书的现存量。
    1.3.5 查看图书馆全部图书
    用表格输出所有图书的信息。
    1.3.6 查看某图书信息
    查看指定某一本书的全部信息。
    1.3.7 查看某本书的借阅者信息
    表格输出某本书的全部借阅者信息。
    1.3.8 读取图书信息
    从文件中读取所有图书的信息以及所有借阅者的信息
    1.4 测试数据
    入库书号:35, 16, 18, 70, 5, 50, 22, 60, 13, 17, 12 , 45, 25, 42, 15, 90, 30, 7
    然后清除:45, 90, 50, 22, 42
    其余数据自行设计。由空树开始,每插入删除一个关键字后就显示B树的状态。

    2 概要设计2.1 所有数据类型的定义采用KeyType类型(本次实验默认为int)为元素类型实现抽象数据类型BTree。
    ADT BTree{
    数据对象
    T是具有相同特征的数据元素集合。
    数据关系
    若D为空集,则称为空树;

    树中每个结点最多含有m棵子树
    若根结点不是叶子结点,则至少有2个子树
    除根结点之外的所有非终端结点至少有┌m/2┐棵子树
    每个非终端结点中包含信息:(n,A0,K1,A1,K2,A2,…,Kn,An)。其中:

    Ki(1<=i<=n)为关键字,且关键字按升序排序指针Ai(0<=i<=n)指向子树的根结点,Ai-1指向子树中所有结点的关键字均小于Ki,且大于Ki-1
    关键字的个数n必须满足:┌m/2┐-1<=n<=m-1。 (5)所有的叶子节点都在同一层,子叶结点不包含任何信息


    基本操作
    result SearchBTree(BTree T, int k);

    初始条件:树T存在
    操作结果:在m阶B数T上查找关键字k,返回p{pt,i,tag}

    Status InsertBTree(BTree &T, int k, BTree q, int i, Record *recptr);

    初始条件:树T存在
    操作结果:在B树T上结点p->pt的key[i]和key[i+1]之间插入关键字k

    Status DeleteBTree(BTree &T, int k);

    初始条件:B树上p结点存在
    操作结果:删除B树T上结点p->pt的关键字k

    void BTreeTraverse(BTree T, void(*visit)(BTree));

    初始条件:树T存在
    操作结果:用visit()函数遍历B树

    void DestroyBTree(BTree T);

    初始条件:树T存在操作结果:销毁B树
    } ADT BTree
    ADT Library{
    数据对象
    T是具有相同特征的数据元素集合。
    数据关系
    数据元素同属于一个集合。
    基本操作
    void InitLibrary(BTree &L);

    操作结果:初始化书库L为空书库
    void InsertBook(BTree &L, BookType B, result res);

    初始条件:书库L和B存在,result包含B书在书库中的位置或应该插入的位置
    操作结果:如果书库中已存在B树,则只将B树库存量增加,否则插入B书到书库L中

    int DeleteBook(BTree &L, BookType B);

    初始条件:书库L和B存在
    操作结果:如果书库中存在B书,则从书库中删除B书的信息,并返回OK,否则返回ERROR

    void BorrowBook(BTree L, BookType B, ReaderType R);

    初始条件:书库L存在,B书时书库中的书并且可被读者R借阅
    操作结果:借出一本B书,并登记借阅者信息

    int ReturnBook(BTree L, int booknum, int IDnum, BookType &B, ReaderType &R);

    初始条件:书库L存在
    操作结果:若书库L中有读者R借阅B书的记录,则注销该记录,改变B书现存量,并返回OK,书不存在或物该读者记录则返回ERROR

    void PrintAllbooks(BTree L);

    初始条件:书库L存在
    操作结果:显示所有图书的信息

    int ShowBookinfo(BTree L, int booknum);

    初始条件:书库L存在
    操作结果:若书库L中存在书B,则显示B书基本信息并返回OK,否则返回ERROR

    void PrintBorrower(ReaderType R);

    操作结果:输出某本书所有借阅者的信息
    } ADT Library
    2.2 主程序的流程
    2.3 各程序模块之间的调用关系
    3 详细设计函数和过程的调用关系图

    4 调试分析4.1 调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析此次的课程设计的重难点应该在于B树的定义以及删除操作,由于我设计性实验选的也是B树,有几个操作函数大同小异,不过要在原来的基础上增加一些东西,例如在原有的关键字的基础上加上与关键字对应的图书结点,因此算法需要一些小改动。
    一开始程序跑不起来,一看居然68个错误,可是大致看下来都是不太正常的提示,所以在这个地方卡了蛮久的时间,好在经过不断的调试,发现是头文件里各个数据结构的顺序放倒了,更改顺序后只剩下寥寥几个小错误,大大增长了把程序做好的希望。
    此次实验的不足在于这个图书管理系统的存储是建立在内存上的,故程序退出数据得不到保存,每次都得重新输入(经过改进已经解决这个问题)。每个功能比较独立,相互联系不算多,仅仅是完成各部分需求的算法,采编入库,清除库存和显示信息相对逻辑关系强一点。由于个人能力的局限以及时间上的紧迫,此次的选做要求没有实现,系统功能的不够完整和联系不够紧密是我以后要提高的地方。
    4.2 算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想设B树的阶为m,(书号)关键字个数为N

    SearchBTree最好情况为O(1),最坏时比较的结点数不超过log[m/2]((N+1)/2)+1
    因为B树总是在最后一层插入,因此InsertBTree操作比较的结点数也不超过log[m/2]((N+1)/2)+1
    DeleteBTree最好情况为被删关键字在最下层结点而且删除后该结点关键字个数不小于m/2,时间复杂度O(1);最坏情况为删除后需要合并父节点直到到根节点,需比较2 *(log[m/2]((N+1)/2)+1)次
    InsertBook、DeleteBook时间复杂度与B树的插入和删除基本相同
    BorrowBook、ReturnBook除了需要SearchBTree,还与该书借阅人数成正比

    4.3 经验和体会
    按照指导书给出的实习报告规范的步骤,先进行需求分析、概要设计,再进行详细设计,能使实际问题从抽象到具体,能从整体上把握程序的功能方向
    通过划分成几个模块,单独编写每个模块的基本操作,再组合在一起,细分了程序的功能,降低设计的难度,方便了程序的调试、修改和组合
    本次设计实在被B树的指针折磨透了,我深深的体会到:编码时必须对程序的算法了如指掌,对可能出现的每一种情况都处理周到,不然对于复杂的(像B树的删除)函数将会无所适从
    编码时就应该尽量把程序写正确,避免产生错误,这样可能远比调试时才来发现问题、解决问题用的时间少得多,效率高得多
    测试时要注意测试的完备性
    编码时要形成一种自己的风格,同时要注意这种风格应该是大众所接受的,要保持程序的可读性

    5 用户使用说明
    本程序的运行环境为Windows 10操作系统,编译环境是VS 2015
    执行文件为BTree_Library.exe,打开BTree_Library.exe,显示欢迎界面



    输入管理员密码:5372


    进入图书管理系统


    选择1新书入库后提示输入入库书号,读入书号后程序会查找是否已存在,如已存在则提示输入新增加数量,如不存在则提示输入图书其他书名、著者、等信息,插入后显示B树状态
    选择2清除库存后,提示输入删除书号,如果存在该书则提示是否确认删除,如无该书则提示不存在。删除后显示B树状态
    选择3图书出借后,提示输入书号,如该书存在则显示该书,提示输入借阅证号和借阅者姓名,判断如果能借阅则输出借阅成功,否则输出不能借阅;如无该书则提示不存在该书
    选择4图书归还后,提示输入归还书号和借阅证号,如存在该借阅记录则提示还书成功,否则提示不存在该书或无该读者借书记录
    选择5查看图书馆所有图书后,以表格形式输出图书管理系统的总库存
    选择6查看某图书信息后,以表格形式输出该图书的库存情况以及作者等相关信息
    选择7查看某树借阅者信息后,以表格形式输出该图书的所有借阅者的信息
    选择8将文件中的图书内容和借阅者资料导入
    选择0则退出系统

    6 测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
    将全部数据输入后用凹入表形式显示B树:

    使用功能5:用表格输出图书馆总库存:

    选择功能2:清空某一本书的库存

    清除45后的凹入表:

    用功能2依次清除:45, 90, 50, 22, 42后的凹入表表示如下:

    选择功能3:借阅图书,输入要借的图书号,借阅者的姓名和ID号

    选择功能6:查看某一本图书的信息,并以表格形式输出。

    选择功能4:归还图书

    当图书号不存在时,输出书库中不存在此书

    当借书时该图书的库存已空,则提示库存不足,借阅失败!

    选择功能7:查看某本书的借阅者信息

    输入功能8:从文件中导入图书信息和借阅者信息
    5 评论 294 下载 2018-11-05 22:49:53 下载需要13点积分
  • 基于Android系统手机通讯录管理软件的设计与开发

    摘要谷歌在安卓领域投入了大量精力来开发,使得安卓技术得以广泛推广,现安卓移动平台设备在市场上已经得到大量推广及普及。在Android移动终端操作系统的快速发展,Android的各种手机软件也大量增长。当然,在手机终端中,手机通讯录是手机终端必不可少的基础功能,其质量直接影响着用户对手机使用的体验与感觉。手机通讯管理软件不仅仅只是能够简单添加联系人以及联系方式的功能,而今已发展成为多种形式,丰富了联系人的信息,存储了更多的内容。此课程设计研究的这个项目,主要实现添加联系人的多种联系方式的功能。
    本软件采用Android Studio+Android SDK集成环境,应用程序编程语言采用Java高级语言开发。通过对通讯录中的联系人的管理,来方便用户通讯更加便捷,联系人的数据保存更加安全。在对Android手机通讯管理软件进行详细的系统设计时,对功能进行详细的划分并对其功能做了详细的介绍,列出了一些主要功能流程图。
    关键词:通讯录 Android 数据库 SQLite
    第一章 绪论1.1 项目研究背景经过多年的发展,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。因此,移动终端的应用软件和需要的服务将会有很大的发展空间。
    Android是一套真正意义上的开放性移动设备综合平台,它包括操作系统、中间件和一些关键的平台应用。Android最大特点在于它是一个开放的体系架构,具有非常好的开发和调试环境,而且还支持各种可扩展的用户体验,Android里面具有非常丰富的图形系统,对多媒体的支持功能和非常强大的浏览器。
    Android平台的开放性等特点既能促进技术的创新,又有助于降低开发成本,还可以使运营商能非常方便地制定特色化的产品。
    1.2 项目研究的目的及意义随着4G网络的使用,移动终端不再仅是通讯网络的终端,还将成为互联网的终端。在Google和Android手机联盟的共同推动下,Android在众多手机操作系统中脱颖而出,受到广大消费者的欢迎。
    手机通讯录作为手机的基本功能之一,每天我们都在频繁地使用着。根据手机功能使用调查显示,有9成以上的消费者使用手机通讯录功能。随着手机通讯录功能的不断加强与完善,手机通讯录对于人们的意义,已不仅仅像记事簿一样显示通讯地址,而是向着个性化、人性化的方向发展。通讯录从无到有,大大丰富了内容,同时结构也发生了革命性变化,而且随着手机的发展,相信更优秀的通讯录会越来越受到社会各层人士的喜爱。
    1.3 系统主要实现内容通过对Android技术的相关研究,了解Android源码实现原理以及过程,从而设计出一款能够使用的手机通讯录。
    这款手机通讯录实现的相关内容如下:

    简洁、实用的操作界面
    联系人的增删改查
    分类的增删改查
    呼叫联系人
    登录、注册、修改密码
    群组的增删改查
    导入导出联系人
    支持模糊查询手机通讯录

    第二章 系统分析2.1 系统可行性分析2.1.1 技术可行性Java 应用编程接口为Java应用提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java 应用程序就可运行。现在Java平台已经嵌入了几乎所有的操作系统。这样Java程序可以只编译一次,就可以在各种系统中运行。
    本软件用的是Java开发语言,在Android Studio集成开发环境下,调试容易。当前的计算机硬件配置或则现有安卓手机的硬件配置也完全能满足开发的需求,因此技术上是绝独可行的。
    2.1.2 经济可行性开发该系统所需的相关资料可以通过已存在的相关系统进行调查采集,所需的软件系统、硬件平台等都易于获得,且不需要Android平台机器,用模拟器即可实现开发研究,开发成本低,容易实现,从经济角度来看,该系统可行。
    2.1.3 操作可行性不管是安卓平台的手机,还是计算机,其成本的下降,导致计算机,安卓手机购买成本的降低.这套系统是利用自己的计算机,且使用安卓模拟器,使开发出来的系统有友好的用户界面、操作简单,因此在操作上是可行的。
    2.2 Android通讯录的使用意义该系统针对的主要用户是Android手机用户。Android手机通信管理系统包括以下主要内容:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等功能。要设计一个良好的手机通讯录,就必须首先明确该应用环境对系统的要求。
    第三章 系统概要设计3.1 系统总体设计Android手机通讯管理软件主要功能模块包括:联系人增删改查、呼叫联系人、分类增删改查、多条件搜索、导入导出联系人、修改密码等。

    3.2 处理流程设计3.2.1 业务流程图用户首次进入手机通讯管理软件后,会进入用户注册界面,当用户注册成功之后,输入密码即可看到联系人列表界面。联系人列表界面右下方显示增加联系人按钮。上方可以进行联系人的多条件搜索。同时长按某个联系人可实现编辑删除功能。当然点击联系人也可以看到详细信息。界面中显示我的群组列表,打开之后即可进行群组的增删改查功能。点击菜单键,显示通讯录的导入导出功能以及修改密码功能。
    3.2.2 数据增加流程图添加联系人时,数据由用户输入,点击确定按钮,判断数据是否合法(及用户名是否为空),合法则插入到数据库;不合法,提示错误信息,让用户重新输入。流程如图所示:

    3.2.3 数据修改流程图编辑联系人时,点击编辑联系人菜单,输入修改后的数据,点击确定按钮,判断数据是否合法,合法,则更新数据库;不合法,则返回错误信息。 流程如图所示:

    3.2.4 数据删除流程当用户选定一个联系人时,单击删除联系人菜单,提示用户是否删除,点击确定按钮,则从数据库中删除此条记录。数据删除流程如图所示:

    3.3 数据库设计3.3.1 SQLite数据库简介SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低。
    本系统采用的是Android系统自带的SQLite轻型数据库数据库。因此占用资源非常小。
    3.3.3 数据库表结构首先创建数据库,在数据库中创建表用来存储联系人数据,其中包括联系人姓名、手机号、群组ID、地址等联系方式。创建群组表用来保存ID和群组名称等信息。两个表联合配合。表结构如图所示:

    第四章 系统详细设计4.1 联系人浏览模块进入手机通讯管理软件后,看到的第一个界面是联系人列表界面。该列表是由ListView控件生成的,打开数据库(如果数据库不存在则创建数据库,并创建数据表),查找数据库中所有的联系人,并把联系人姓名和移动电话号码以及职位这填充到ListView的adapter中。每一行显示一个联系人的姓名和手机号码,联系人的显示的顺序是根据插入数据库的顺序显示的。点击某个联系人会进入查看联系人界面,可以查看联系人的详细信息,对联系人进行编辑、删除、拨打电话、导入导出通讯录等。

    点击[菜单]按钮时,就会显示主菜单项,其中包括:修改密码、导出数据、导入数据。
    点击添加按钮,会进入添加联系人界面,可以输入联系人相关信息,完成联系人添加功能。点击上方搜索栏目,会进入联系人查找界面,可以进行联系人查找,搜索想要找的联系人。
    点击菜单按钮,打开修改密码、导出通讯录、导出通讯录等功能。

    长按列表的某一行时,会弹出长按菜单,其中包括:拨号、编辑联系人、删除联系人。点击查看联系人菜单会进入查看联系人界面。点击编辑联系人菜单会进入编辑联系人编辑界面。点击删除联系人时,会弹出对话框,询问是否删除联系人,点击确定,则从数据库中删除该联系人。

    4.2 查看联系人模块在联系人浏览界面点击某个联系人,则会跳转到该界面。该界面使用TextView把从数据库中调出的联系人的详细信息显示出来,这里面包括联系人姓名、手机号、地址等详细信息。

    4.3 编辑联系人模块编辑联系人界面使用EditView控件显示并修改联系人的详细信息。联系人的所有信息,处于可编辑状态,手机号和座机号的EditView设定为只能输入数字。修改完信息后点击确定按钮,触发确定按钮点击监听事件,从而对数据库中该联系人的信息进行更新, 然后自动返回联系人浏览界面。点击取消按钮会返回联系人浏览界面。

    4.4 查找联系人模块这里采用的查找方法是SQL模糊查询,可以只输入联系人姓名中的一部分,即可查找到所有包含该部分的联系人,并在ListView中显示出来所有的联系人的姓名和手机号码。可实现查找职位、手机号码、名字等信息。

    4.5 修改密码点击菜单,可以查看该软件的修改密码、导入导出等情况。并可实现全部功能。

    4.6 分类管理点击我的群组界面,可以查看群组并且显示群组。在里面可以对群组进行增删改查操作。
    72 评论 334 下载 2019-01-30 17:27:39 下载需要14点积分
  • 基于JSP和Mysql的公司员工管理系统

    摘 要随着互联网技术越来越普及,全球的经济形态也随之发生了巨大的变化,转变为以信息化技术为主的新经济形态。而企业想要应对新经济时代带来的挑战,谋求更好的发展,就需要利用信息技术将庞大的数据运用到企业的各项工作中。所以开发一款科学合理的、方便现代人使用的员工管理系统,可以提高公司的人力资源管理效率,从而增加企业的市场占有率和总体竞争力,让企业在经济全球化竞争中处于优势地位。
    关键词:信息化;新经济;提高效率;公司员工管理系统
    1 绪论1.1 设计背景企业作为一个国家经济的重要组成部分,然而随着公司的发展壮大,公司员工也随之增多,每 年公司对员工管理的成本也在增加,面临的各种问题也在增多。当公司的规模尚小时,老式的纸质 化管理方式还可以比较容易的完成对员工信息与事务的管理,但随着公司规模越来越大,人员与事 务的增多,这种老式的方法就会出现非常多弊端,例如:纸质文档非常难以保存、查询起来非常方 便、耗费了大量人力资本但工作效率却依然十分低,工作时的出错率还高等很多问题,这种方法已 经跟不上时代的发展了。所以开发一款科学合理的、方便现代人使用的员工管理系统十分有必要。
    1.2 设计意义利用计算机开发一个员工管理系统来对人力资源进行管理,具有老式的纸质化管理所无法比拟的优 点。例如:查找起来十分迅速准确、可存储数据量大、安全保密性能好、成本相对低等。这些优点 对于提高企业对员工和事务管理工作的效率,从而增加企业的市场占有率和总体竞争力,让企业在 经济全球化竞争中处于优势地位十分有帮助。并且运用信息技术将庞大的数据运用到企业的各项工 作中,是企业面对新经济形态挑战强而有力的应对手段。
    1.3 设计思路公司员工管理系统采用了经典的 M-V-C 开发模式,利用的技术有 java 语言开发、面向对象的分析和 设计思想、相关网页脚本语言,使用 Myeclipse 作为开发工具,使用 Mysql 作为数据库工具,设计出 来的系统基本可以完成公司人事部门对员工的各种管理工作。
    2 需求分析2.1 需求描述员工管理系统是一个企业内部的后台系统,所以只能供企业内部的管理员来使用,管理员通过分配 的用户名和密码就能登录系统。管理员在成功登陆系统后,就可以实现各种对员工的管理操作,比 如对职位部门信息、签到考勤信息、奖励与惩罚信息、薪金信息、员工的信息进行管理,也可以对 自己的登录信息进行修改,以及消息查询等。
    2.2 用例建模管理员在成功登录系统后,可以对企业职员相关信息、职位和部门信息、签到考勤信息、奖励与惩 罚信息、职员薪金信息、自己的登录信息及个人信息等进行管理。

    2.3 用例描述2.3.1 个人信息用例描述
    目的:管理员登陆后可以查看自己收到消息和通知,自己的基本信息并可以更改自己登陆系统的密码操作等
    事件流:管理员想要对个人信息进行操作时,本用例开始执行

    管理员登录系统成功点击个人信息板块首先会显示个人的基本信息点击查看消息按钮会显示个人收到的消息点击修改密码按钮可以进行修改密码操作用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员点击个人信息板块查看自己了的基本信息、点击消息按钮,进行了更改登录密码操作

    2.3.2 员工管理用例描述
    目的:管理员在登陆系统后可以查看公司所有职员的基本信息,并可以录入相关员工、更改员工信息、开除员工操作
    事件流:管理员想要对职员的信息进行各种操作时,本用例开始执行

    管理员登录系统成功点击员工管理板块,先会列出所有的员工点击查看详细按钮会显示员工的详细信息点击删除员工按钮会将员工删除点击增添员工按钮可以录入员工信息点击编辑员工按钮可以编辑员工信息用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员查点击了查看了相关职员的详细信息、并进行了录入新的员工操作、开除一个 或多个员工操作、修改员工信息操作

    2.3.3 部门管理用例描述
    目的:管理员在登陆系统后可以查看公司的各个职位部门信息,并可以设立新的部门,修改已存在 的部门,移除已存在的部门操作
    事件流:管理员想要对部门信息进行各种操作时,本用例开始执行

    管理员登录系统成功点击部门管理板块会列出所有的部门点击查看按钮会显示员工的详细信息点击移除部门按钮会将部门移除点击增添部门按钮可以新增部门点击编辑部门按钮可以编辑部门信息用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员查点击了查看详细职位部门按钮、进行了移除部门操作、设立新部门操作、更 改部门信息操作

    2.3.4 考勤管理用例描述
    目的:管理员在登陆员工系统后可以查看已发布的签到考勤信息,并且可以对其进行更改操作,或 发布一条新的签到考勤信息、删除已存在考勤信息
    事件流:管理员想要对考勤信息进行管理操作时,本用例开始执行

    管理员登录系统成功点击考勤管理板块会显示考勤信息列表点击查看按钮会显示考勤的详细信息点击删除考勤按钮会将考勤信息删除点击发布考勤按钮可以新增考勤信息点击编辑考勤按钮可以编辑考勤信息用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员进行了发布新的签到考勤操作、查看了已存在签到考勤、更改已存在的签到考勤操作、移除相关考勤信息操作

    2.3.5 奖惩管理用例描述
    目的:管理员在登陆系统后可以查询职员的奖励与惩罚信息、并且可以修改奖励与惩罚、增加奖励 或者惩罚、移除奖惩信息操作
    事件流:管理员想要对奖励与惩罚信息进行各种操作时,本用例开始执行

    管理员登录系统成功点击奖惩管理板块会显示奖惩列表点击查看按钮会显示奖惩的详细信息点击删除奖惩勤按钮会将奖惩信息删除点击增添奖惩按钮可以新增奖惩信息点击修改奖惩按钮可以编辑奖惩信息用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员查点击了查看详细的奖励与惩罚信息、增加新的奖励或惩罚、更改奖惩信息操 作、移除奖惩信息操作

    2.3.6 工资管理用例描述
    目的: 管理员在登陆系统后可以查看每个员工对应的薪金信息、更改薪金信息、移除相关工资信息、 添加员工的薪金信息操作
    事件流:管理员想要对工资信息进行各种操作时,本用例开始执行

    管理员登录系统成功点击工资管理板块会列出所以工资信息点击查看按钮会显示工资的详细信息点击删除工资按钮会将工资信息删除点击新增工资按钮可以新增工资信息点击编辑工资按钮可以编辑工资信息用例结束
    前置条件:管理员登录系统成功
    后置条件:管理员查点击了查看详细工资信息、更新工资、发布新的工资、移除工资按钮。

    3 系统设计3.1 数据库设计3.1.1 数据库整体设计本系统采用 MySQL 数据库,数据库名为 personal,,数据库系统中包括八张数据表。分别是员工信 息表、职位信息表、奖惩信息表、薪金信息表、部门信息表、考勤信息表、个人信息表。

    3.1.2 数据库脚本




    3.2 系统架构设计公司员工管理系统采用了 M-V-C 的设计思想,所谓 MVC,即 Model-View-Controller。

    Model 层:在本系统中 com.model 包中存放了项目所有的实体类,在包 com.dao 中存放了 项目所需的所有的数据操作接口,两者共同实现了系统所需的全部的增删改查等数据操作
    Controller 层:在本系统中 com.action 包中存放了所有的对 Servlet 进行的各种请求操作
    View 层:在本系统中用根据不同功能设计的网页来表现视图部分

    3.3 模块设计3.3.1 功能模块设计
    4 产品实现4.1 登录模块的实现4.1.1 界面设计登录界面

    4.1.2 功能实现
    4.2 考勤管理模块实现4.2.1 界面设计考勤管理信息列表界面

    考勤管理增添界面

    考勤管理详细界面

    考勤管理编辑界面

    4.2.2 功能实现Com.dao / CheckonDao 主要代码


    4.3 工资管理模块实现4.3.1 界面设计工资管理列表界面

    工资管理增添界面

    工资管理详细界面

    工资管理编辑界面

    4.3.2 功能实现招聘管理 com.dao / Reward 主要代码


    4.4 部门管理模块实现4.4.1 界面设计部门管理列表界面

    部门管理增添界面

    部门管理增添界面

    部门管理编辑界面

    4.4.2 功能实现

    4.5 员工管理模块实现4.5.1 界面设计员工管理列表界面

    员工管理增添界面

    员工管理详细界面

    员工管理编辑界面

    4.5.2 功能实现

    5 产品测试5.1 测试方法与策略测试方法:黑盒测试法
    5.2 考勤管理模块测试


    序号
    测试用例
    预期结果
    实测结果
    测试状态




    1
    考勤信息查看
    系 统 会 显 示 所 有的考勤信息
    与 预 期 的 结 果相符
    1


    2
    考勤信息增添
    可 以 成 功 增 添 考勤信息
    与 预 期 的 结 果相符
    1


    3
    考勤信息编辑
    可 以 成 功 编 辑 考勤信息
    与 预 期 的 结 果相符
    1


    4
    考勤信息删除
    可 以 成 功 删 除 考勤信息
    与 预 期 结 果 相符
    1



    5.3 工资管理模块测试


    序号
    测试用例
    预期结果
    实测结果
    测试状态




    1
    工资信息查看
    系 统 会 显 示 所 有的工资信息
    与 预 期 的 结 果相符
    1


    2
    工资信息增添
    可 以 成 功 增 添 工资信息
    与 预 期 的 结 果相符
    1


    3
    工资信息编辑
    可 以 成 功 编 辑 工资信息
    与 预 期 的 结 果相符
    1


    4
    工资信息删除
    可 以 成 功 删 除 工资信息
    与 预 期 结 果 相符
    1



    5.4 部门管理模块测试


    序号
    测试用例
    预期结果
    实测结果
    测试状态




    1
    部门信息查看
    系 统 会 显 示 所 有的部门信息
    与 预 期 的 结 果相符
    1


    2
    部门信息增添
    可 以 成 功 增 添 部门信息
    与 预 期 的 结 果相符
    1


    3
    部门信息编辑
    可 以 成 功 编 辑 部门信息
    与 预 期 的 结 果相符
    1


    4
    部门信息删除
    可 以 成 功 删 除 部门信息
    与 预 期 结 果 相符
    1



    5.4 员工管理模块测试


    序号
    测试用例
    预期结果
    实测结果
    测试状态




    1
    员工信息查看
    系 统 会 显 示 所 有的员工信息
    与 预 期 的 结 果相符
    1


    2
    员工信息增添
    可 以 成 功 增 添 员工信息
    与 预 期 的 结 果相符
    1


    3
    员工信息编辑
    可 以 成 功 编 辑 员工信息
    与 预 期 的 结 果相符
    1


    4
    员工信息删除
    可 以 成 功 删 除 员工信息
    与 预 期 结 果 相符
    1



    6 结论6.1 毕业设计成果特点公司员工管理系统设计的逻辑也比较合理,加之页面设计的也比较友好,所以操作起来十分顺畅。 员工管理系统的出现,解决了老式的纸质管理方法的弊端,提高了企业在人事方面的管理效率,从 而增加企业的市场占有率和总体竞争力。
    6.2 不足之处或遗留未予解决的问题这个系统基本上是根据个人的理解来进行设计与实现的,所以在开发过程中还是有很多问题是没有 考虑全面的,同时也有许多问题自己无法解决,还有很多可以进一步完善的地方:

    由于自己对前端不是很精通,所以在页面的设计方面有点过于简单和不美观了。在设计每 个 jsp 页面的过程中,虽然参考了网上的素材模板,但由于时间和技术的局限性,很多地方未能结合 自己的代码来美观的实现,这也提醒我后面的学习需要注意到对于前端页面这一方面的提升
    有些功能设计的欠缺考虑,与实际的员工管理事务有一定差距
    对于框架的理解与运用还比较差,也是后面学习所需要注意的

    参考文献[1]胡敏.Web 系统下提高 MySQL 数据库安全性的研究与实现[D]. 北京邮电大学, 2015.
    [2]杨磊, 陈凌云. 精通 Eclipse Web 开发:Java 体系结构、工具、框架及整合应用[M]. 人民邮电 出版社, 2006.
    [3]李志峥,杨社堂. 基于 B/S 结构下的软件系统测试研究[J]. 图书情报导刊, 2006, 16(7):232-234.]
    [4] 张勇.基于 J2EE 架构的企业人事管理系统的研究与开发[D]. 电子科技大学, 2013.
    [5] 陶幸辉, 宋志刚. 软件系统测试类型及测试用例设计[J]. 科技、经济、市场, 2011(6):3-5.
    3 评论 27 下载 2020-08-26 10:31:50 下载需要12点积分
  • 基于C#和Sql Server的图书管理系统

    1 课程设计意义与目标1.1 课程设计的意义《可视化编程技术课程设计》是在学生学习完《可视化编程技术》以后进行的设计性集中实践课程,通过课程集中实践,目的是使学生能加深对理论教学内容的理解,学会可视化编程技术的综合应用,培养学生分析问题的解决问题的能力。
    1.2 课程设计的目标通过课程集中实践,要求学生加深对讲授内容的理解,累积经验、学会独立上机调试程序;并且逐步达到综合运用封装、继承和多态等C#难点知识,更深地理解面向对象程序设计的基本概念与方法,从而学会利用C#语言解决一般应用问题,能设利用可视化编程技术开发复杂和综合性的计算机管理信息系统,并为后续专业课程的学习奠定程序设计基础。
    2 课程设计的题目2.1 设计题目概述
    图书管理系统
    2.2 开发环境搭建
    开发语言:C#
    开发工具:Visual Studio 2010
    数据库管理工具:SQL Server 2008

    3 系统的设计与实现3.1 物理数据模型设计




    3.2 主要界面设计
    界面中用了textbox,label,combobox,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件。在用户类别可以选择用户类型,管理员。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示。
    功能:可以增加,修改,删除图书。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。

    密码修改:可以更改当前用户登录的密码,旧密码符合条件,新密码和旧密码不能相同,新密码和确认密码的相同的条件。

    界面中用了textbox,label,combobox,dataGridView,textbox用于获取数据输入,combobox用于数据选取,button用于单击事件,dataGridView用于数据显示,用户借书,管理员可以查看用户的借书记录。模糊查询在下面有具体介绍。

    管理员信息管理:可以对管理员进行增添改查。

    书库管理:对书库进行增删改查。

    书库查询:按地区分类和按书库编号分类,第二个combobox会自动加载所有记录的值供你选择。

    书库管理:用来增加书库,删除,修改。

    用户管理:对用户的增删改查。

    用户登录之后的界面。

    管理员登录之后的界面。
    4 调试过程中出现的问题及解决办法4.1 数组索引超出界限解决方法:利用断点调试,重新赋值。

    4.2 从试图获取数据时,应添加新的字段
    5 个人体会及建议在这次课设中,基本都是在学习新知识的过程,从powerdesigner到动软生成软件,让我知道了这个工具的强大之处,渐渐开始会用一点,在第一天晚上想重做一遍学生信息管理系统,不料,动软生成的路径没改,直接给覆盖了,所以只能重头再来,在这时就有想法想做个不一样的系统,上学期用C++做了个图书管理系统,有点印象,就选择做这个,一开始一直模范着你给的day1,day2,day3,看不懂BLL,DAL,MODEL之间的关系,经过思考,理解了他们之间的关系,BLL负责储存方法相当于API,DAL负责储存数据,MODEL负责各个对象的类,后面理解了就开始自己写,用户负责借书,用户的增删改,添加用户,管理员负责查询书库,书库的增删改查,查询图书,图书的增删改查,借书记录的增删改查,在这个过程中不仅了解了动软生成软件的机制,而且可熟练的利用这个工具,在这个工具的基础之上,我写出了更多好用的函数供自己使用。在windows应用开发上了解更多控件和控件属性的使用和结合,可以做出功能和界面相对完整的程序,总之,在这次课设中受益匪浅。
    14 评论 449 下载 2019-03-10 21:28:03 下载需要14点积分
  • 基于JAVA实现的超级马里奥(Super Mario)游戏

    一、项目简介刚进入的时候会有一个界面,为地图编辑器。可以使用此编辑器进行地图编辑,地图编辑器的内容包括:关卡、向左箭头、带有金币的砖块、带有花朵的砖块带有蘑菇的砖块、带有星星的砖块、普通砖块、向左运动的板栗仔、向右运动的板栗仔、向左运动的乌龟、向右运动的乌龟、金币、带有食人花的管道、普通管道、洞、向右的箭头、橡皮擦、可以使用鼠标点击图标然后拖动到面板上点击面板进行地图编辑,橡皮擦可以擦除已经建立好的模型。
    部署完地图之后可以选择下一关进行下一个关卡的编辑,也可以点击开始游戏开始游戏。游戏开始后从编辑的第一关卡开始进行闯关,人物可以移动通过ad键进行控制,可以跳跃,通过k控制,跳的时候可以跳到管子和砖块上面。
    人物有两种状态:大马里奥和小马里奥。小玛丽奥可以撞普通的砖块或者带有包含物的砖块使得砖块可以向上稍微移动,砖块上的一些包含物也会随着砖块移动。大马里奥可以顶破普通砖块。
    怪物分为三种,分别为:板栗仔、乌龟和食人花。马里奥可以通过跳跃的方式踩死怪物,板栗仔在被踩的时候会变扁,乌龟被踩的时候。走动状态会变成龟壳状态,龟壳状态被碰到可以变成跑动的龟壳状态,跑动的龟壳可以杀死马里奥。板栗仔和其他的乌龟。运动的龟壳在运动的时候被马里奥踩到会变成静止的龟壳,食人花长在管道中,会定时出现对管道上方的物体进行攻击,当马里奥踩在管道上的时候不会出现。
    还有三种物体是包含在砖块中的,分别是星星、蘑菇、花朵。马里奥自下向上顶砖块之后砖块上方会生长出相应的植物星星和蘑菇会向右方向行走,花朵会在原地。马里奥可以通过触碰的方式吃掉植物,不同植物有不同的加成效果。其中,吃掉蘑菇之后会变成大马里奥。吃掉星星之后会变成无敌状态。吃掉花朵之后会有发射子弹的技能。
    任何物品,尤其是可移动物,包括子弹,在碰到洞之后会掉落到洞中人物掉落之后会损失一命,人物一共有五条生命。每次正面碰到乌龟或者板栗仔,或者掉落到洞中之后便会损失一条生命,每次损失生命则该关卡从头开始当五条生命全部损失之后便会到game over状态。
    当马里奥走到地图的最后一个模型之后的位置的时候说明本关通过,本关通过时会有马里奥跳下拉动旗帜旗帜拉倒底端的时候会向右跑到城堡位置。跑到城堡位置即属于本关卡已经通过,则消除所有的加成状态转到下一关卡。
    最后通关所有的关卡即为game ends,跳跃的时候有重力效应,降落的会越来越快游戏界面上方会有剩余生命,当前时间为0的时候会损失一命,还有计分系统。当玩家杀死怪物,或者吃掉某种可生长物,或者过关的时候都会获取相应的分数加成。分数显示在面板上方。吃掉金币会有金币数量统计,统计结果在生命右边。本项目的亮点在于应用ioc技术的地图编辑器和精美的人物模型。
    二、需求分析人物跳跃的重力,条约落下的时候碰到其他的硬物可以停止下落。踩死怪物。怪物死亡方式不同展现的画面不同。吃东西,有属性加成。大马里奥顶破砖块。小玛丽奥顶砖块砖块可跟随移动。砖块上方的东西可以跟随移动。地图编辑功能。声音功能。人物胜利拉旗进城堡。
    三、系统设计
    本项目共有20个公共类,5个接口。分成三种类,分别是:控制类、模型类、工具类
    功能方面有两大块,分别是地图编辑器和正式游戏
    地图编辑器部分使用了spring框架的ioc技术

    程序功能流程图如下图所示:

    控制类中有两个类分别为Main和Control作用分别为控制地图编辑,地图编辑的思路如下:玩家点击图标之后鼠标的状态变成点击的图标的状态值,本类中有一个map键值分别为Integer和model鼠标移动到某位置点击之后会使integer加一。构造出相应的model然后put到map中如果用户点击的是橡皮擦。那么会计算哪一个类在橡皮擦点击的位置,并且把相应的位置的model设为忽略。最后解析这个map构造xml文件和保存着各个类的数量的一个properties文件Control类通过解析xml和properties文件解析关卡信息还原用户编辑的地图。
    还有一个全局的properties为game.properties保存着关卡数目。在点击开始游戏之后开始运行Control类中的work方法。Work方法的作用是初始化整个游戏的完整页面读入xml中的内容实例化对象存到容器中。然后启动paintThread线程画出面板,启动其他的必要线程进行工作,根据用户的操作对容器中的对象的一些参数进行改变呈现不同的视觉效果。
    四、系统实现本项目由于需要实现用户自由设计地图,所以应该尽量降低耦合度,从全局的角度出发,对类的设计应该分为实物模型,统筹控制,工具,抽象出来的接口。接下来一一介绍。类结构图如下图所示:

    统筹控制包含Main和Control在上一部分已经介绍。接口被抽象出来以下几种:

    Dangerous类所有的可以杀死主角的实物模型类应该去实现该接口
    Flint类,砖块和管子应该去实现该接口。Growable接口,所有的可以被马里奥从砖块中顶出的实物模型应该实现该接口。Kill接口,所有的可以伤害到别的实物模型类的类都应该实现该接口。Moveable接口,所有的可以移动的物体都应该实现该接口

    实物模型类一共有12个:

    Badflower类是食人花类,实现Dangerous接口
    Bullet类是子弹类,实现Moveable和Kill接口
    Flower类是吃了以后可以发射子弹的类,实现了Growable接口
    Hole类是地面上存在的洞类。没有去实现任何接口
    Mario类,是主角类,实现了Moveable,Kill接口
    Money类,因为可以直接被主角吃掉并且在砖块上被顶出之后不需要生长移动过程所以不实现任何接口
    Monster类是板栗仔,实现了Dangerous,Moveable接口
    Mushroom类是吃了以后变大的蘑菇类实现了Growable和Moveable接口
    Pipe是管道类实现了Flint接口
    Star是吃了以后变成无敌状态的星星,实现了Growable和Moveable接口
    Turtle是乌龟类,实现了Dangerous,Kill,Moveable接口
    Wall是砖块类,实现了Flint方法

    还有6个工具类,其中的方法和字段大部分是静态的和final的:

    ApplicationUtil类可以通过传入的关卡值去加载spring上下文,为程序提供对象实例
    CrashType定义了一些物体之间的碰撞类型的常量
    ImageTool类中包含了程序用到的所有的图片以及为了克服延迟加载而写的事先加载所有图片的方法
    Null类是一个Growable类的空实现,因为在构造砖块的时候定义构造方法里面应当传入所包含的可生长物,而在使用spring框架进行实例化得时候不允许出现null.本人又极不愿意在写另外一种构造方法,所以索性构造一个Growable接口的空实现类,通过传出特殊的Type值进行识别
    Property类,用于解析配置文件,获取数据
    SoundTool类包含所有的使用到的音乐,以及静态的播放音乐的方法

    五、调试改错在实现的过程中出现了很多错误。比如声音播放问题和人物碰撞检测的问题等。不过最后解决的还算满意。
    六、美工素材本项目是一个人写的,代码和图片美工都是自己实现的。由于互联网上找不到相关素材,所以本人现学的ps,通过录制游戏中的人物动作分帧截图,使用抠图等技术自己做的图。
    七、总结要有统筹整个项目的意识。对整个项目有总体的把握。类的编写应当事先分好类,分清楚每种类的任务。最大化解耦,以免改动的时候涉及到过多的地方。分清楚每个类的任务。合理设计避免冗余。
    八、关键代码碰撞检测部分代码:
    public int getCrashType(int down,int direction,Rectangle rec1,Rectangle rec2)//rec1为wall,rec2为Mario 获取撞击类型 { //rec1是硬物。rec2是移动物 if(die)return CrashType.NO_CRASH; int rec1X=(rec1.x+rec1.x+rec1.width)>>1; int rec1Y=(rec1.y+rec1.y+rec1.height)>>1; int rec2X=(rec2.x+rec2.x+rec2.width)>>1; int rec2Y=(rec2.y+rec2.y+rec2.height)>>1; int width=rec1.width+rec2.width; int hight=rec1.height+rec2.height; if(rec2Y>=rec1Y) { if(rec1X>=rec2X) { if(down!=1||(rec1X-rec2X)/((double)width)>((rec2Y-rec1Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_L;else { if(control.getMario().isCanWork())work(); control.getMario().down(); return CrashType.WALL_D; } }else { if(down!=1||(rec2X-rec1X)/((double)width)>((rec2Y-rec1Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_R;else { if(control.getMario().isCanWork())work(); control.getMario().down(); return CrashType.WALL_D; } } }else { if(rec1X>=rec2X) { if((rec1X-rec2X)/((double)width)>=((rec1Y-rec2Y)/(double)hight)+CrashType.POINT) return CrashType.WALL_L;else { return CrashType.WALL_U; } }else { if((rec2X-rec1X)/((double)width)>=((rec1Y-rec2Y)/(double)hight)+CrashType.POINT)return CrashType.WALL_R;else return CrashType.WALL_U; } } }
    马里奥跳跃代码:
    private class JumpThread extends Thread//跳的线程 { private int n=jumpHight; public void run() { if(down==-1)return; if(downThread!=null) { downThread.stop(); downThread=null; } if(jumpThread!=null) { jumpThread.stop(); jumpThread=null; } jumpThread=this; //while(!Control.isALL_START()){try{sleep(Control.TIME);} catch (InterruptedException e){}} SoundTool.play(SoundTool.jumpSound); try { int site=locaY; double count=Math.sqrt((2*0.085*n)); for(int i=site;count>0;i-=(count-=0.1))//向上跳的时候改变状态 { if(getCrashType()&&(crashType==CrashType.WALL_D||crashType==CrashType.WUWL||crashType==CrashType.WUWR))//如果发现从下撞击了硬物则跳出向上的过程改为向下 { down=-1; break; } locaY=i; sleep(10); down=1; } new Down().start(); }catch(Exception e) { e.printStackTrace(); } down=0; } }
    马里奥降落代码:
    private class Down extends Thread//二类下落线程 //控制最终下落的线程如果在正常下落时由于碰撞被打断则启动该线程监视是否需要再次落下 { public void run() { if(down==1)return; //while(!Control.isALL_START()){try{sleep(Control.TIME);} catch (InterruptedException e){}} if(downThread!=null) { downThread.stop(); } downThread=this; // System.out.println("enter down!"); // while(down!=-1&&locaY!=control.getCutLine())//没有落地面上一直在循环 while(locaY<control.getCutLine()) { boolean flag=false;// int site=locaY; // System.out.println(crashType+" "+down+" "+canWork); if((getCrashType()&&(crashType==CrashType.NO_CRASH)&&(down!=1))||canWork==false)//多线程重要判断应该靠紧 { flag=true;//已经下落 double count=1; for(int i=site;i<=control.getCutLine();i+=(count+=0.1)) { down=-1; locaY=i; downSpeed=count; // System.out.println(i+" "+control.getCutLine()); if(getCrashType()&&(crashType==CrashType.WALL_U||crashType==CrashType.PIPE_U||crashType==CrashType.WUWL||crashType==CrashType.WUWR))//如果在某个硬物的上方、启动二类下落线程且退出本线程 { down=0;//落道硬物上面则运动状态为0 downSpeed=0; downThread=null; new Down().start(); setCanWork(true); return; } try { sleep(10); } catch (InterruptedException e) { down=0; downThread=null; downSpeed=1; setCanWork(true); new Down().start(); } } locaY=control.getCutLine(); } if(flag)//在该线程中如果已经下落则跳出 { if(!control.getMario().isDownDie()) for(int j=0;j<control.getHoles().size();j++) { if(control.getHoles().get(j).canPaint()) control.getHoles().get(j).DownDie(control.getMario()); } if(!control.getMario().isDownDie())downSpeed=1; down=0; downThread=null; setCanWork(true); return; } } }
    8 评论 403 下载 2018-10-31 12:18:12 下载需要11点积分
  • 基于php的校园二手信息网站的设计与开发

    摘 要二手信息网站,为二手物品交易提供了网上平台。如今,随着电子商务的不断发展完善,大学校园也需要一个能为学生提供二手物品交易的专用网站,以便发布各种商品信息。
    本设计具有一般电子商务的功能,且体现出校园风格。该系统提供的功能包括注册、查询信息、发布信息、找回密码等。本系统的特点在于应用了PHP技术。它是一种简单的动态脚本语言,具有开放源码、执行速度快的特点。该技术还支持广泛的数据库连接,具有大量的扩展库,安全性能高,易学易用。
    本文首先介绍了该系统的可行性和应用工具,并就系统的需求性和PHP的优势进行了阐述;接着进行系统分析,并设计了本系统所用到的基于MYSQL数据库的数据表结构;然后对该系统各功能模块进行了详细设计;最后,针对系统在代码优化和加密方面的不足做出总结。
    关键词:二手信息;PHP;MySQL;APACHE;MD5;SESSION
    AbstractSecond-hand informationwebsite provides a second-hand goods transactions online platform. Now, withthe continuous development of e-commerce perfect, University campus also needsan able to provide our students with the second-hand goods transactionsdedicated web site, in order to disseminate information of various commodities.
    E-commerce’s generalfunction can find in this design, and reflects the style of the campus.Functions include user registration, information inquiry, disseminateinformation and retrieve passwords in the system. The system has a majorcharacteristic of PHP applications which is a simple dynamic scripting languagethat is open source, faster implementation characteristics. And it supports awide range of database connections, with a lot of extensions, security is alsovery high performance, easy to learn and use.
    This paper introducesthe feasibility of the system and application tools, described the needs of thesystem and the advantages of PHP, then the systems analysis, design and MYSQL-based database system used in the data table structure, Then the functionof the system modules and the detailed design and code is a major achievement.Description and testing of the system encountered a character coding using thedatabase errors; by setting MYSQL and linking coding solve this error. Finally,summarize the system of encryption and code optimization for the shortage.
    Key words: Second-Hand Information;PHP; MySQL; APACHE; MD5; SESSION
    1 引 言1.1 课题的背景随着Internet 爆炸式的发展,中国自加入WTO以来,电子商务在国内也迅速的发展了起来,现在互联网上各种电子商务网站更是迅速的增长。还在校园的我也深受其中的影响,开发一个对在校学生适用的网站,希望能给大家提供方便的服务。
    作为一个大学生,深有体会,从身上的衣服到大家所用的书籍、文具以至各种生活常用品,用上一段时间就会被淘汰,有的同学干脆扔掉,很是浪费还污染了环境。也有的同学想到卖掉,苦于难寻买家,将其卖给收费品的。这样就造成了物不能尽其用。
    为了解决这种资源的浪费,所以开发了校园二手信息网站,借助于低交易成本的Internet。为大家提供一个低成本、快速迅捷的信息发布平台。新系统开发过程中严格按照系统开发步骤进行,在系统调研、分析、设计到系统的实施的全过程中,力求其科学性和合理性。
    1.2 可行性分析可行性分析的任务是从技术上、经济上、社会上、法律上分析需要解决的问题是否存在可行的解。
    1.2.1 技术可行性该系统采用BS模式设计,在高校的校园网上运行。学生可以通过接入校园网的计算机,访问二手信息网站。本系统是一个比较普通的BS模式的信息发布系统,在技术上具有可行性。
    1.2.2 经济可行性现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,为大家节约了大量的资源,为此主要表现有以下几个方面:

    本系统的运行可以代替废物买卖贴示,避免一些不必要的麻烦
    本系统的运行可以节省许多资源
    本系统的运行可以大大的提高废物再利用
    本系统可以使敏感文档更加安全

    所以,本系统在经济上是可行的。
    1.2.3 运行可行性系统为一个小型的信息管理系统,所耗费的资源非常的小,一般的电脑无论是硬件还是软件都能够满足条件,因此,本系统在运行上是可行的。
    1.2.4 法律可行性系统纯为私人设计,在开发过程中没有涉及合同、责任等与法律相抵触的方面。因此,本系统在法律上是可行的。
    2 理论基础知识介绍2.1 PHP技术2.1.1 PHP简介PHP是一种简单的、面向对象的、解释型的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。PHP具有和Java类似的Class关键字。因为不需要虚拟机,以致速度比Java快5倍。PHP正迅速变成一种标准的、多用途的、面向对象的脚本语言。PHP不仅可用来开发Web应用程序,也可以开发普通应用程序。
    PHP是Hypertex tPre-Processor(超文本预处理器)的缩写,它是一种服务器端的HTML脚本编程语言。PHP语法上与C相似,可运行在Apache, Netscape/iPlanet,和Microsoft IIS Web服务器上。PHP作为一种工具,可以让你创建动态的Web页面。应用PHP的网页与常规的HTML页面并无二致,你可以用同样的方式来创建、编辑它们。PHP允许你直接在HTML文件里写入简单的脚本,这一点与JavaScript非常相似。而不同的是,PHP不依赖于浏览器,是服务器端的语言,而JavaScript却是一种客户端的嵌在HTML中的语言。概念上,PHP与Netscape的LiveWirePro产品,Microsoft的ASP以及Sun Microsystem的JSP相似。
    2.1.1.1 PHP的强劲之处在于:PHP是一项最优秀的技术。其它技术,如PERL,Python,VB Script,ASP相对来说,都是陈旧低劣的。即使是Java/JSP,也在PHP之下。其特点如下:

    兼容性:PHP5.0程序可与旧版本兼容
    易学易用:PHP的语法类似C及Per,所以有程序编写经验者很快即可上手
    开放的来源:PHP的原始码及编译后文件可免费下载
    可扩充:使用者可新增模块以扩充PHP引擎之功能
    跨平台:PHP程序可在数种主要作业平台及Web服务器上执行
    支持多种数据库:PHP支持十余钟数据库,且编写存取数据库资料的程序相当容易

    PHP是最好的,因为它面向对象,并且吸收了C/C++/Java/PERL的精华。PHP可以替代PERL,Python,Java,C,C++,AWK,Unix Shell脚本,Visual Basic和其它语言。PHP直接运行,而且是由C写成的。PHP可以运行在Apache,Microsoft IIS等多种Web服务器上。PHP太容易使用了,你可以用它在非常短的时间里,非常迅速的开发出非常复杂的Web。
    PHP最大的优势在于PHP自身完全是由C语言写成的,因此可广泛运行于各种平台之上,如BeOS,UNIX,MS Windows,Apple Macintosh,IBMOS/2以及其它更多的操作系统。而Windows下开发的PHP代码也可以不经过任何改变,就用于UNIX/Linux上。
    2.1.1.2 PHP网页执行流程PHP与传统网页不同,一般的HTML网页在加载时,会直接将网页全部传到使用者的计算机中,然而在使用者的计算机上执行程序,展示内容;PHP则是刚好相反,它主要的用途是在网站服务器端的网页开发,程序员可以通过程序的控制,让网站与访问者交互,进而设计出迷人的动态网页。例如:会员登录、资料认证网页等。如下图:

    2.1.2 PHP安装下载PHP安装程序 http://www.php.net/downloads.php最新版的为PHP5.1 ,Windows的PHP安装分为两种方式,一种是源代码安装方式,一种是EXE安装方式,双击即可安装。本文主要说一下源代码安装过程。
    下载“PHP-5.0.3-Win32.rar”。然后解压缩下载到的 RAR文件到c:\php
    复制 c:\php\php5ts.dll 到 c:\windows\system32。(有时候为了方便,在PHP文件夹中点击搜索*.dll把搜索到的所有文件夹都复制到system32中也可以)复制 c:\php\php.ini-recommended(或者是php.ini-dist)为 c:\windows\php.ini然后打开 c:\windows\php.ini修改如下几个地方:
    如果是在生产服务器上,可以不用修改下面这两行
    error_reporting=E_ALL & ~E_NOTICEdisplay_errors = On(这里是修改PHP的错误提示,OFF为不提示,有些数据库链接非错误信息也会被PHP当做错误信息输出,建议用作Web服务器的关闭!)
    指示 PHP 扩展库所在文件夹。
    extension_dir="c:\php\ext
    以下两个是超时时间:一般是60-120。
    max_execution_time=90 max_input_time=90post_max_size=8M(6-10M最佳)upload_max_filesize=8M(上传附件大小最大)default_socket_timeout=90(端口时间60-120)session.gc_maxlifetime=3600(session默认存活时间,秒)session.save_path="c:\php\sessiondata"(Session的存储目录)extension=php_mysql.dll(支持MySQL数据库)extension=php_gd2.dll(支持生成真彩图片)```php###2.1.3 验证安装用记事本写几行代码:```php<? phpinfo();?>保存为网站根目录下为phpinfo.php文件。然后启动浏览器,访问 http://localhost/phpinfo.php ,如果看到如下画面就证明PHP安装成功了!

    2.2 MySQL 简介MySQL是一个广受Linux社区人们喜爱的半商业的数据库。MySQL是可运行在大多数的Linux平台(i386,Sparc,etc),以及少许非Linux甚至非Unix平台。
    2.2.1 MySQL 简介2.2.1.1 安装可以在MySQL站点上获得大多数主要的软件包格式(RPM、DBE、TGZ、RAR)。RAR格式的安装没有多大麻烦,并且无需初始配置;直接解压缩运行安装文件即可进行安装。MySQL的守护进程(mysqld)消耗很少的内存并在只有在执行真正的查询时才装载到处理器上,这意味着对小型数据库来说,MySQL可以相当轻松地使用而不会对其他系统功能有太大的影响。
    2.2.1.2 数据类型字段支持大量数据类型是件好事。通常的整数、浮点数、字符串和数字均以多种长度表示,并支持变长的BLOB(Binary Large Object)类型。对整数字段由自动增量选项,日期时间字段也能很好的表示。
    2.2.1.3 SQL兼容性它也缺乏一些常用的SQL功能,没有子选择(在查询中的查询)。视图(View)也没了。当然大多数子查询可以用简单的连接子句重写,但有时用两个嵌套的查询思考问题比一个大连接容易。同样,视图仅仅为程序员隐蔽where子句,但这正是程序员们期望的另一种便利。
    2.2.1.4 存储过程和触发器MySQL没有一种存储过程(Stored Procedure)语言,这是对习惯于企业级数据库的程序员的最大限制。多语句SQL命令必须通过客户方代码来协调,这种情形是借助于相当健全的查询语言和赋予客户端锁定和解锁表的能力,这样才允许的多语句运行。
    2.2.1.5 参考完整性MySQL的主要的缺陷之一是缺乏标准的RI机制;然而,MySQL的创造者也不是对其用户的愿望置若罔闻,并且提供了一些解决办法。其中之一是支持唯一索引。Rule限制的缺乏(在给定字段域上的一种固定的范围限制)通过大量的数据类型来补偿。不简单地提供检查约束(一个字段相对于同一行的另一个字段的之值的限制)、外部关键字和经常与RI相关的“级联删除”功能。有趣的是,当不支持这些功能时,SQL分析器容忍这些语句的句法。这样做目的是易于移植数据库到MySQL中。这是一个很好的尝试,并且它确实未来支持该功能留下方便之门;然而,那些没有仔细阅读文档的人可能误以为这些功能实际上是存在的。
    2.2.1.6 安全性自始至终我对MySQL最大的抱怨是其安全系统,它唯一的缺点是复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变。通常的SQL GRANT/REVOKE语句到最近的版本才被支持,但是至少他们现在有了。 MySQL的编写者广泛地记载了其特定的安全性系统,但是它确实需要一条可能是别无它法的学习过程。
    2.2.1.7 备份和恢复、数据导入/导出强制参考一致性的缺乏显著地简化备份和恢复,单靠数据导入/导出就可完美复制这一功能。LOAD DATA INFILE命令给了数据导入很大的灵活性。Select INTO命令实现了数据导出的相等功能。另外,既然MySQL不使用原始的分区,所有的数据库数据能用一个文件系统备份保存。数据库活动能被记载。与通常的数据库日志不同(存储记录变化或在记录映像之前/之后),MySQL记载实际的SQL语句。这允许数据库被恢复到失败前的那一点,但是不允许提交(commit)和回卷(rollback)操作。
    2.2.1.8 连接性MySQL客户库是客户/服务器结构的C语言库,它意味着一个客户能查询驻留在另一台机器的一个数据库。然而MySQL真正的强项处于该库中的语言“包装器(wrapper)”,Perl、Pathon和PHP只是一部分。Apache的Web服务器也有许多模块例如目录存取文件等允许各种各样的Apache配置信息(例如目录存取文件)使用MySQL,应用程序接口简单、一致并且完整。
    2.2.2 数据库引擎MyISAM强调了快速读取操作,这是为什么MySQL受到了Web开发如此青睐的主要原因:在Web开发中所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(InternetPresenceProvider,IPP)只允许使用MyISAM格式。MyISAM存储格式自版本3.23以来是MySQL中的缺省类型,它有下列特点:

    如果操作系统自身允许更大的文件,那么文件比ISAM存储方法的大
    数据以低字节优先的机器独立格式存储。这表示可将表从一种机器拷贝到另一种机器,即使它们的体系结构不同也可以拷贝
    数值索引值占的存储空间较少,因为它们是按高字节优先存储的。索引值在低位字节中变化很快,因此高位字节更容易比较
    AUTO_INCREMENT处理比ISAM的表更好
    减少了几个索引限制。例如,可对含NULL值的列进行索引,还可以对BLOB和TEXT类型的列进行索引

    为了改善表的完整性检查,每个表都具有一个标志,在myisamchk对表进行过检查后,设置该标志。可利用myisamchk-fast跳过对自前次检查以来尚未被修改过表的检查,这样使此管理任务更快。表中还有一个指示表是否正常关闭的标志。如果服务器关闭不正常,或机器崩溃,此标志可用来检测出服务器起动时需要检查的表。
    2.3 Apache简介Apache是世界使用排名第一的Web服务器,它可以运行在几乎所有广泛使用的计算机平台上。
    Apache源于NCSAhttpd服务器。经过多次修改,他成为了世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
    本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
    Apache服务器拥有以下特性:

    支持最新的HTTP/1.1通信协议
    拥有简单而强有力的基于文件的配置过程
    支持通用网关接口
    支持基于IP和基于域名的虚拟主机
    支持多种方式的HTTP认证
    集成Perl处理模块
    集成代理服务器模块
    支持实时监视服务器状态和定制服务器日志
    支持服务器端包含指令(SSI)
    支持安全Socket层(SSL)
    提供用户会话过程的跟踪
    支持Fast CGI
    通过第三方模块可以支持Java Servlets

    3 系统分析与数据库设计3.1 系统功能需求分析根据一般电子商务系统功能分析,将系统分为管理员、用户两大模块。系统管理员模块包括:系统配置管理、会员信息管理、网站新闻管理、物品信息管理、管理员管理、登录日志管理。用户模块包括:安全登录、找回密码、查询信息、发布信息、会员注册、物品类别、物品信息管理、会员信息修改。刚进入网站的非会员能够在此网站浏览和搜索信息,不仅能浏览二手信息还能浏览到热门信息。经过注册成为会员便能发布信息。此系统还考虑到用户利用穷举法破解密码,专门设置了用户和管理员登录日志,以便及时了解和防范。
    3.2 系统模块关系图根据系统功能需求建立的模块关系图如下图:

    3.3 系统E-R图本实例根据上面的模块关系图规划出的实体有管理员、二手信息机及新闻、用户、会员实体、各实体的E-R图及其关系描述如下(带下划线的为主键):
    会员实体E-R图

    二手信息实体E-R图

    新闻实体E-R图

    管理员实体E-R图

    超级管理远实体E-R图同管理员实体E-R图类似,无权限属性(省略)。
    各实体的关系E-R图描述如下:

    3.4 数据库设计3.4.1 数据库表之间的关系数据库表



    序号
    数据库表
    数据库存储内容




    1
    ershou_adminstage
    存储管理员和会员的登录日志


    2
    ershou_class
    存储二手信息的类别信息


    3
    ershou_pinglun
    存储会员对物品信息的评论


    4
    ershou_news
    存储新闻


    5
    ershou_user
    存储会员的相关信息


    6
    ershou_wupin
    存储以发布的物品信息


    7
    ershou_manager
    存储管理员的信息



    数据表关系图如下:

    3.4.2 数据表结构的详细设计用户资料表(ershou_user)



    序号
    字段名
    字段类别
    说明
    备注




    1
    user_name
    varchar(20)
    用户的账号名称
    主键


    2
    user_pass
    varchar(20)
    用户的帐号密码



    3
    user_question
    varchar(50)
    找回密码提问



    4
    user_angser
    varchar(50)
    找回密码答案



    5
    user_mphone
    varchar(12)
    移动电话



    6
    user_phone
    varchar(12)
    座机



    7
    user_school
    varchar(60)
    所在学校



    8
    user_email
    Varchar(80)
    电子邮箱



    9
    user_date
    datetime
    注册时间



    10
    user_qq
    Int
    QQ号



    11
    user_kt
    Int
    标志
    默认为0



    类别信息表(ershou_class)



    序号
    字段名
    字段类别
    说明
    备注




    1
    class_name
    varchar(20)
    类别名称
    主键


    2
    class_order
    int
    大类顺序标记小类为默认的0
    默认值为0


    3
    class_cid
    int
    小类顺序标记大类为默认的0
    默认值为0



    用户与管理员登录日志信息表(ershou_adminstage)



    序号
    字段名
    字段类别
    说明
    备注




    1
    manager_name
    varchar(20)
    登录名
    主键


    2
    manager_action
    varchar(50)
    登录动作



    3
    manager_ip
    varchar(30)
    登录ip



    4
    manager_time
    datetime
    登录时间



    5
    manager_state
    int
    登录状态
    默认为0


    6
    manager_if
    Int
    判断为管理员还是用户
    默认为0



    评论表(ershou_pinglun)



    序号
    字段名
    字段类别
    说明
    备注




    1
    pid
    int
    Id
    主键


    2
    pinglun_wid
    int
    物品id
    默认值为0


    3
    user_name
    varchar(20)
    会员名



    4
    pinglun_nr
    varchar(200)
    内容



    5
    Pinglun_time
    datetime
    时间



    网站新闻表(ershou_news)



    序号
    字段名
    字段类别
    说明
    备注




    1
    nid
    tinyint(6)
    设置新闻编号



    2
    news_title
    varchar(100)
    设置新闻标题



    3
    news_class
    varchar(20)
    设置新闻类别



    4
    news_ly
    varchar(30)
    新闻来源



    5
    news_jishu
    int
    浏览次数
    默认值为0


    6
    news_nr
    text
    新闻内容



    7
    news_time
    datetime
    设置添加时间



    8
    news_guoqi
    Char(2)
    设置是否过期
    默认值为1


    9
    news_name
    varchar(20)
    发表新闻的管理员帐号
    主键



    物品信息表(ershou_wupin)



    序号
    字段名
    字段类别
    说明
    备注




    1
    wid
    int
    物品id
    主键


    2
    bclass_name
    varchar(20)
    所属大类别



    3
    class_name
    varchar(20)
    所属小类别



    4
    wuping_name
    varchar(40)
    物品名称



    5
    wuping_jishu
    int
    浏览次数
    默认设置为0


    6
    wuping_nr
    text
    物品介绍



    7
    user_name
    varchar(20)
    用户帐号



    8
    wuping_time
    datetime
    发表时间



    9
    wuping_guoqi
    int
    交易状态
    默认设置为1



    管理员信息表(ershou_manager)



    序号
    字段名
    字段类别
    说明
    备注




    2
    manager_name
    varchar(20)
    管理员名称
    主键


    3
    manager_pass
    varchar(20)
    管理员密码



    4
    manager_sup
    int
    标志为管理员权限
    默认值为0



    3.5 系统安全MD5是在Web应用程序中最常用的密码加密算法。由于MD5是不可逆的,因而经过MD5计算得到后的密文,不能通过逆向算法得到原文。所谓MD5,即”Message-Digest Algorithm 5(信息-摘要算法)”,它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。MD5的最大作用在于,将不同格式的大容量文件信息在用数字签名软件来签署私人密钥前”压缩”成一种保密的格式,关键之处在于——这种”压缩”是不可逆的。
    在Web应用程序中使用MD5加密文本密码的初衷,就是为了防止数据库中保存的密码不幸泄露后被直接获得。但攻击者不但拥有数据量巨大的密码字典,而且建立了很多MD5原文/密文对照数据库,能快速地找到常用密码的MD5密文,是破译MD5密文的高效途径。然而,MD5密文数据库所使用的是最常规的MD5加密算法:原文—>MD5—>密文。因此,使用字符串次序干涉MD5算法,使现成的MD5密文数据库无所作为。此函数是把MD5运算后的密文字符串的顺序调转后,再进行一次MD5运算。函数代码如下:
    function md5_5($psw) { //得到数据的密文 $ psw = md5($psw); //再把密文字符串的字符顺序调转 $ psw = strrev($psw); //最后再进行一次MD5运算并返回 return md5($psw); }
    4 系统的实现4.1 系统的主要功能归纳起来,系统的功能大约有以下几点:用户注册,信息查询,发布信息,找回密码等。
    4.1.1 注册为了实现不同地域的学生通过网络、不择时间地自主填写并上传自己的基本档案(不合要求的档案可以由管理员及时清除),需要录入基本的个人信息。
    4.1.1.1 步骤
    开始注册
    填写个人信息
    提交(如失败返回填写页面重填写;如果重名错误,显示提示信息)
    进入登录界面
    登录成功,进入主界面

    4.1.1.2 主要验证代码://值存在则继续执行if(($_GET["ac"]=="in")and(isset($_POST["user_name"]))) { //判断验证码是否正确 if($_POST["ac_uthnum"]==$_SESSION["user_authnum"]) { $user_name=$_POST["user_name"]; $user_name=trim($user_name); $user_pass1=$_POST["user_pass"]; $user_pass1=trim($user_pass1); $user_pass=md5_5($user_pass1);//密码进行MD5加密 $user_question=$_POST["user_question"]; $user_angser1=$_POST["user_angser"]; $user_angser1=trim($user_angser1); $user_angser=md5_5($user_angser1);//密码进行MD5加密 $user_school=$_POST["user_school"]; $user_phone=$_POST["user_phone"]; $user_mphone=$_POST["user_mphone"]; $user_qq=$_POST["user_qq"]; $user_email=$_POST["user_email"]; $user_kt="1"; //查询是否存在当前注册用户名 $query="select count(*) count from ershou_user where user_name='$user_name'"; $result=mysql_query($query); while($info=mysql_fetch_array($result)) { $count=$info["count"]; } if($count==0){//不存在才执行注册 $sqladd = "INSERT INTO ershou_user SET user_name='$user_name', user_pass='$user_pass', user_question='$user_question', user_angser='$user_angser', user_school='$user_school', user_phone='$user_phone', user_mphone='$user_mphone', user_qq='$user_qq', user_email='$user_email', user_kt='$user_kt', user_date=NOW()"; else{//存在相同用户名则重新填写 echo '<table width="100%" border="0" cellPadding="0" cellSpacing="0"> <tr> <td height="300" align="center"><img src="images/warning.gif" border="0" /> 该会员已存在 <a href="javascript:history.back()">返回</a>重新填写 </td> </tr> </table>';} }
    4.1.1.3 主要窗口如下图:
    4.1.2 搜索信息为了实现快速浏览网站信息,各用户可以根据所须信息类别并填写查询关键字,很快的找出需要的信息。
    4.1.2.1 步骤:
    填写信息类别
    修改或删除信息类别
    浏览信息类别

    4.1.2.2 主要代码$sql ="select count(*) count from ershou_wupin where bclass_name='$bclass_name' and wupin_name like '%$searchcontent%'"; $result=mysql_query($sql) or die(mysql_errno().": ".mysql_error()."\n"); $rs=mysql_fetch_object($result); $recountCount=$rs->count; $show=20; $totalPage=ceil($recountCount/$show); $page = (isset($_GET['page']) && $_GET['page']>=0)? $_GET['page']: 0; $isLast = ($page==($totalPage-1))? true: false; $hasNoPre = ($page==0)? true: false; $hasNoNext = ($page==$totalPage-1)? true: false; $isFirst = ($page==0)? true:false; $start = $page*$show; if($recountCount==0){ //搜索结果不为0则显示未找到echo '<tr><td height="25" align="center">未找到!</td></tr>';} else{ $sqlwupin="select * from ershou_wupin where bclass_name='$bclass_name' and wupin_name like '%$searchcontent%' ORDER BY wupin_time desc limit $start,20"; $resultwupin = mysql_query($sqlwupin) or die(mysql_errno().": ".mysql_error()."\n"); while($rswupin=mysql_fetch_object($resultwupin)){ $wupin_name=$rswupin->wupin_name; $wupin_time=$rswupin->wupin_time; $date_format=date("m/d",strtotime($wupin_time)); $wid=$rswupin->wid; echo '<tr><td height="25">  <font color="#333333">['.$rswupin->class_name.']</font> <a href="wupin.php?wid='.$wid.'" target="_blank"><font color="#333333">'.TrimChinese($wupin_name,"80").'</font></a> <font color="#666666"> ('.$date_format.') </font></td></tr>';}}
    4.1.2.3 主要窗口如下图:
    4.1.3 发布信息实现用户发布二手信息,建立一个简单易操作的信息发布平台。
    4.1.3.1 步骤:
    输入标题
    选择类别
    输入内容
    选择有效标志

    4.1.3.2 主要代码<?//处理内容提交if(($_GET["ac"]=="in")&&(isset($_POST["wupin_name"]))){ $wupin_name=$_POST["wupin_name"]; $class_name=$_POST["class_name"]; $wupin_nr=$_POST["wupin_nr"]; $wupin_img=$_POST["wupin_img"]; $user_name=$_POST["user_name"]; $wupin_time=$_POST["wupin_time"]; $wupin_guoqi=$_POST["wupin_guoqi"];//查询所属大类的id号$sqlbclass="select * from ershou_class where class_name='$class_name'"; $resultbclass=mysql_query($sqlbclass); while($infobclass=mysql_fetch_array($resultbclass)) { $class_cid=$infobclass["class_cid"];} //根据大类的id号 查询出大类名称 $sqlbclass1="select * from ershou_class where cid='$class_cid'"; $resultbclass1=mysql_query($sqlbclass1); while($infobclass1=mysql_fetch_array($resultbclass1)) { $bclass_name=$infobclass1["class_name"];} $sqlup = "INSERT INTO ershou_wupin SET bclass_name='$bclass_name',wupin_name='$wupin_name',class_name='$class_name',wupin_nr='$wupin_nr',user_name='$user_name',wupin_guoqi='$wupin_guoqi',wupin_time=NOW()"; if(@mysql_query($sqlup)) { msg("增加成功!","#ff0000"); echo '<meta http-equiv ="Refresh" content = "1 ; URL=wupin_manager.php">'; } else { echo"<p>Error: ".mysql_error()."</p>"; }}?>
    4.1.3.3 窗口如下图:
    4.1.4 密码找回实现找回密码,大意丢失密码的拥护根据所须填写注册时的问题答案,就能更改密码。
    4.1.4.1 步骤:
    填写用户名
    填写答案跟新密码
    提交密码

    4.1.4.2 主要代码如下:<? $user_name1=$_POST["user_name"];//前页隐藏表单提交过来的的当前用户名 $user_angser2=$_POST["user_angser"]; $user_name1=trim($user_name1); $user_angser2=trim($user_angser2); $user_angser1=md5_5($user_angser2);//填写的答案进行加密 以去和数据库的值对比 $user_pass2=$_POST["user_pass1"];//读取新密码 $user_pass2=trim($user_pass2); $user_pass1=md5_5($user_pass2);//加密 $sql="select * from ershou_user WHERE user_name='$user_name1'"; $result = mysql_query($sql) or die(mysql_errno().": ".mysql_error()."\n"); $rs=mysql_fetch_object($result); $user_angser=$rs->user_angser; if($user_angser!=$user_angser1){//数据库答案与输入的不相同 就提示 echo '<tr bgcolor="#f3f3f3"> <td height="50" align="center">答案错误!请<a href="user_repw.php"><font color="#ff0000">返回</font></a></td></tr>';}//输入的答案正确和输入了新密码就提交修改的用户密码 elseif($user_angser1==$user_angser) { $sqlup="UPDATE ershou_user SET user_pass='$user_pass1' where user_name='$user_name1'"; if(@mysql_query($sqlup)) { echo '<img src="images/success.gif" border="0" />'; msg("修改成功,返回登录","#ff0000"); echo '<meta http-equiv ="Refresh" content = "1 ; URL=user_login.php">'; } else { echo"<p>Error: ".mysql_error()."</p>"; } } ?>
    4.1.4.3 主要窗口如下:
    4.1.5 数据库连接代码<?######MySQL数据库信息######$DBhost = "localhost"; //主机名$DBuser = "root"; //用户名$DBpass = ""; //密码$DBname = "ershou"; //数据库名mysql_connect($DBhost,$DBuser,$DBpass) or die("无法连接到数据库!");mysql_query("SET NAMES GBK");mysql_select_db ($DBname);?>
    4.2 创建界面4.2.1首页:网站首页是用户进入系统的第一个界面,因此,简洁、友好、清晰醒目是设计时要考虑的风格。样式如图所示:

    4.2.2 管理员管理主界面:管理员输入正确地用户名和口令后,就可进入管理主界面。管理主界面是管理员维护网站使用的界面,因此要求简单明了,容易操作。样式如下图:

    5 系统测试5.1 本地服务器测试本系统是基于Windows平台,在PHP、MYSQL、Apache的环境下运行的;启动Apache应用服务器,打开Internet Explorer,在URL地址中输入 http://localhost ,即可打开系统首页。经过测试,本系统已经能够顺利完成系统要求的基本功能,达到预期目标。
    5.2 远程服务器测试在Linux、PHP、MYSQL、Apache的环境下;用户远程访问此系统,页面会出现乱码。就此问题经过如下分析,并给出解决方案:系统显示信息时出现了中文文字显示的问题。系统文件乱码的出现是由于编码(charset)设置错误,导致浏览器以错误的编码来解析。
    此系统测试时遇到的主要是数据库连接编码,指的是进行数据库操作时以哪种编码与数据库传输数据,由于Linux操作系统上数据库采用UTF8编码,而网页的页面申明编码是GB2312。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用:
    Mysql_query ("SET NAMES GBK");
    来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。
    此问题解决后,继续测试系统。能够顺利完成系统要求的基本功能,系统在远程服务器上运行成功。
    7 评论 147 下载 2019-01-06 17:36:59 下载需要12点积分
  • 基于ASP.NET的公共管理信息交流系统

    一、需求分析随着计算机技术的不断应用和提高,计算机已经深入到社会生活的各个角落,用户也纷纷通过网络去实现自己的生活,做到足不出户又能满足需求。而像58同城、论坛等正是应市场需求,所产生的一系列产品。而为了提高公共信息交流网在市场的竞争力,这个项目综合了二手市场、房源交易、招聘平台等方面的信息,为人们提供了便利的服务。
    1.1 编写目的本需求的编写是为了提供用户查询房源信息,售卖自己的闲置物品,为就业市场提供便捷服务,同时也为了方便管理员管理信息、内部维护而设计的公共管理信息交流系统。
    1.2 背景与范围
    项目名称:公共管理信息交流系统
    用户:一般用户及管理员

    二、系统功能本系统的主要功能有:用户的注册和登录,查看各种信息,在平台进行房源交易或者物品交易,可以足不出户了解就业信息,管理员可以查看用户信息,查看并修改或删除各版块的信息,对用户进行选择查看信息并操作。
    三、系统流程图
    四、数据库设计这个项目采用了关系数据库和XML数据存储相结合,运用起来比单数据库要灵活
    tb_imfornation表

    tb_user表

    五、详细设计及实现主页面

    代码


    房屋租售信息查看页面

    信息查询按钮代码


    因为一般用户的功能后面几个模块基本差不多,所以不进行过多描述,接下来介绍一下管理员模块的功能。
    管理员登录模块



    管理员页面



    信息审核页面





    信息管理页面




    六、心得体会这次的.net的网页开发让我初步对于ASP.NET有了一些了解,关于如何运用各种控件来进行自己网站的设计和网页的制作,如何连接到数据库进行网站的动态变化等等有了很多的提高和了解,初步实现了网站的开发,提高了自己的动手能力。
    1 评论 8 下载 2020-07-15 10:13:11 下载需要13点积分
  • 基于JSP和SQL Server的网上花店销售系统的设计与实现

    摘 要随着时代的快速发展,我们的生活已经离不开计算机网络,而电子商务的快速发展正在改变着人们的生活方式。随着各种网上购物平台的不断兴起,人们早已习惯了不用出门就买到自己需要的东西。但是针对鲜花销售这方面的网络平台还很少,因此设计一个网上花店销售系统很有前景。
    网上花店销售系统采用JSP+Servlet+JavaBean的MVC模式,将数据对象、业务逻辑以及用户界面分离。该系统分为用户和管理员两个角色。用户注册登录后可以浏览鲜花,浏览公告,购买鲜花,管理员登录后可以对系统进行管理和维护。
    网上花店销售系统对于用户来说操作方便,满足了用户随时随地购买鲜花的需求,不仅为用户节省了时间,还提高了用户的购买效率。对于花店老板而言,不仅提高了销售效率还降低了时间和人工成本。
    关键词:销售系统;JSP;MVC;网上花店
    AbstractWith the rapid development of the times, our lives have been inseparable from the computer network, and the rapid development of e-commerce is changing people’s way of life. With the continuous rise of a variety of online shopping platform, people have long been accustomed to buy their own needs do not have to go out. But for the sale of flowers on the network platform is still very small, so the design of an online florist sales system is promising.
    Online flower florist system using JSP + Servlet + Javabean MVC model, the data object, business logic and user interface are separate. The system includes two roles: user and administrator. After registering, user can browse the flowers, browse the announcement, buy flowers, Administrators can manage and maintain the system after logging.
    Online florist sales system for the user is easy to operate, It fulfills the needs of users to buy flowers anytime and anywhere.This system not only saves user’s time, but also improve the user’s purchasing efficiency. For the flower shop owner, this system not only improve the sales efficiency but also reduce the time and labor costs.
    Key words: sales system; JSP; MVC; online florist
    1 绪论1.1 现状分析鲜花销售行业最初是鲜花销售商个体进行实体销售,后来经过发展形成了鲜花进入批发市场再进行分销的形式。传统的鲜花销售模式是以实体花店为主体,直到后来由于网络的迅速发展,电子商务的介入使鲜花销售发生了很大的变化。随着人们生活水平的提高以及对生活品质的要求,鲜花销售行业发展的前景也越来越好。目前,很多大的鲜花销售品牌已经开始了鲜花的网上销售,方便了消费者购买鲜花的需求,节约了大量的时间。但很多个体鲜花销售商的鲜花销售依然不够景气,还停留在传统花店的状态。这样不仅消费者必须亲自进入花店进行购买,再加上鲜花包装等一系列工序,浪费了大量的时间,而且鲜花销售商也会由于实体销售的缺陷降低销售额。另外,传统花店销售由于地域性的约束和客户范围的划分,使得传统花店的客户受到限制。因此发展网上花店销售系统就显得比较重要,也比较有前景。这样能扩展鲜花消费市场,实现利润增长。网上花店销售系统的实现不仅缩短了鲜花上市时间,节约了成本,方便了消费者购买,方便管理员管理,节约了大量时间和大量的人力物力,还增强了人们之间的感情交流等。
    1.2 研究意义传统的实体鲜花销售存在很多的限制,该系统致力于满足用户随时随地在网上挑选购买鲜花的需求。对于花店老板而言,可以提高工作效率,使网上鲜花管理工作系统化、规范化、自动化,提高整个购买鲜花流程的效率,使总体水平上升到一个新的高度。与传统花店相比,网上花店有其不可比拟的优势。首先网上花店的运营成本较低,职员人数较少,也不需要很大的运营场地。其次网上花店有传播信息迅速、容量大、范围广、可交互等特点。不仅如此,网上花店的建立,可以更好的满足消费者的需求。通过这种网络工具为消费者带来方便,同时促进浏览此网站用户的购买欲,提高销售效率。
    网上花店系统给用户提供了一整套完整的网上鲜花订购流程,使用户足不出户直接进行网上购物,给消费者带来了很大的方便。随着人类社会的发展,人际交往变得越来越重要。在这个繁忙的社会,人们很少有时间能见面交流感情,在特殊的日子里送给好友一束鲜花是用于联络感情的很好方式,因此受到广大消费者的欢迎。与此同时,商家也不再需要在商店里被动的等待顾客,完全可以坐在家里就轻松的卖出自己的商品,获得利润。计算机的存储与快速查询功能大大提高了网上花店管理的效率,并且还提高了查询并购买鲜花的精确度。方便快速的操作,不仅可减少从前的漏洞,还可以减少因工作的冗余出现的错误,更重要的是该系统的操作非常简单,推广起来比较容易。
    1.3 研究方法网上花店销售系统将采用瀑布模型的方式,先对目前鲜花销售的情况进行概述,然后对开发系统的环境以及技术进行简要介绍,之后对开发网上花店销售系统进行可行性分析、需求分析、总体设计、详细设计、编程实现以及测试直到实现最终理想的效果。本文将详细阐述整个实现过程。
    2 系统的开发环境及技术简介2.1 系统开发环境简介2.1.1 MyEclipse简介MyEclipse企业级工作平台作为对Eclipse IDE的扩展,它的功能体现在可以在数据库和JavaEE的开发、发布、应用程序服务器的整合方面极大的提高工作效率。MyEclipse几乎包括了目前所有主流开源产品的专属Eclipse开发工具,它作为功能丰富的JavaEE集成开发环境,在功能方面包括了完备的编码、调试、测试和发布,十分完整地支持HTML、Struts 2、Spring、JSP、CSS、JavaScript、Servlet、Hibernate、JDBC数据库链接工具等。JavaEE模型;Web开发工具;EJB开发工具;应用程序服务器的连接器;JavaEE项目部署服务;数据库服务;MyEclipse整合帮助是MyEclipse的7类特征。在Eclipse中,对于以上每一种功能上的类别都存在相应的功能部件,以及一系列可以用来实现它们的插件。MyEclipse这种结构上的模块化为它带来了很多优势,可以让开发人员在基本不影响其他模块的前提下,可以单独的扩展和升级任一模块。
    2.1.2 Tomcat简介Tomcat服务器是一个免费的开放源代码的Web应用服务器。运行时占用的系统资源小;扩展性好;支持负载平衡与邮件服务等开发应用系统常用的功能这几个特点使得其很受编程人员的喜欢。任何一个编程人员都可以更改它或在其中加入新的功能,因此Tomcat服务器还在不断的改进和完善中。 Tomcat是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是调试和开发JSP程序的第一选择。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应对HTML页面的访问请求。实际上Tomcat部分是Apache服务器的扩展,但它是独立运行的,所以当你运行Tomcat时,它实际上是作为一个与Apache独立的进程单独运行的。
    2.1.3 SQL Server简介SQL Server 是一个关系数据库管理系统,常用的有SQL Server 2000,SQL Server 2005,SQL Server 2008等版本。SQL Server 2008是微软公司2008年推出的数据库产品。它紧密结合了微软公司的各类主要产品,与Windows操作系统、Office办公软件、Visual Studio开发平台的最新技术进行了衔接。其各项指标在同类产品中都堪称优秀,而且图形化的管理界面十分便于学习与使用。SQL Server 2008具有很多新的特点,它是可信任的,使得公司可以以很高的安全性、可靠性和可扩展性来运行他们最关键任务的应用程序。它是高效的,使得公司可以降低开发和管理他们的数据基础设施的时间和成本。它是智能的,提供了一个全面的平台,可以在你的用户需要的时候给他发送观察和信息。
    2.2 系统开发技术简介2.2.1 JSP简介JSP全称Java Server Pages,是一种动态网页开发技术。JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端请求以后对这些Java代码进行处理,然后将生成的HTML页面返回给客户端的浏览器。Servlet是JSP的技术基础,而且大型的Web应用程序的开发需要Servlet和JSP配合才能完成。JSP具备了Java技术简单易用的特点,完全地面向对象,具有平台无关性、主要面向因特网且安全可靠。简单的理解,JSP就是HTML页面+Java代码,但是JSP中能写的内容还不止这些,可以包含HTML标签,CSS,JavaScript,JAVA代码,EL表达式,引入并使用其他标签库,例如JSTL标签库、Struts 2标签库等。浏览器可以直接运行HTML页面,但是不能直接运行JSP页面,JSP是需要在拥有JSP引擎的服务器中运行的,例如Tomcat服务器。所以JSP是运行在服务器端的,运行完之后,把动态生成的HTML页面再使用IO流写回给浏览器,浏览器接收并且解析后再呈现出来效果。JSP的生命周期分为编译阶段,初始化阶段,执行阶段,销毁阶段。
    2.2.2 Javabean简介JavaBean 是一种Java语言写成的可重用组件。为了编写JavaBean,类必须是特定的和公共的,并且具有无参数的构造器。JavaBean通过提供一个符合一致设计模式的公共方法公开内部域的成员属性。众所周知,属性名与此模式相一致,其他java类可以通过自省机制发现和操纵这些JavaBean的属性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。JavaBean可分为两种:一种是有用户界面的JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中对其直接进行可视化操作。一个JavaBean由3部分组成:属性、方法、事件。
    2.2.3 Servlet简介Servlet是一个基于JAVA技术的Web组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容,Servlet是平台独立的Java类,编写一个Servlet实际上就是按照Servlet规范编写一个Java类,Servlet被编译为平台独立的字节码,可以被动态地加载到支持 Java技术的Web服务器中运行。Servlet容器也叫Servlet引擎,是Web服务器或者应用服务器的一部分,用户在发送请求和响应之上提供网络服务,Servlet不能独立运行,必须被部署到Servlet容器中,由容器实例化和调用Servlet的方法,Servlet容器在Servlet的生命周期内包含和管理Servlet。Servlet是单实例多线程的运行方式,每个请求在一个独立的线程中运行,提供服务的Servlet实例只有一个Servlet 具有可升级性,能响应更多的请求,因为Servlet容器使用一个线程而不是操作系统进程,线程占用的资源要小,Servlet使用标准的API,被更多的Web服务器所支持。Servlet使用Java语言编写,拥有更多的Java程序语言的优点,Servlet可以访问Java平台丰富的类库,使得各种应用的开发更为容易,Servlet容器给Servlet提供额外的功能。
    2.2.4 JDBC简介对系统来说数据库连接应该说是最为重要的部分,Java中连接数据库的技术是JDBC。JDBC作为一种用于执行SQL语句的Java API,具备为多种关系数据库提供统一访问的功能,JDBC是由一组用Java语言编写的类和接口组成的。为了达到可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序的目的,JDBC提供了一种基准。众所周知,JDBC API、JDBC驱动程序和JDBC驱动程序管理器是JDBC的三个部分,即可以通过Java.sql包来提供JDBC API,JDBC API上仅仅设计为了利用数据库而提供的类的接口,提供JDBC驱动的软件商来实际完成这个接口。当JDBC API制作的程序进行数据调用时,JDBC驱动发挥它的作用,实际连接数据库并且进行相应的处理, JDBC API的接口类也由JDBC驱动提供。
    两层模型(C/S)和三层模型(B/S)同样都是JDBC API支持数据库访问的。在两层模型(C/S)中,Java Applet或应用程序与数据库会直接进行对话,与所访问的特定数据库管理系统进行通讯时需要一个JDBC驱动程序,数据库收到被用户送来的SQL语句,而用户将会收到其被送回的结果。客户机/服务器配置指的是数据库可以位于另一台计算机上,用户通过网络连接到上面。其中客户机就是我们平时常说的用户的计算机,而服务器是我们常说的提供数据库的计算机,网络是Internet。在三层模型(B/S)中,服务的”中间层”先是收到命令,然后由服务的“中间层”将SQL语句交给数据库,数据库需要对SQL语句进行处理并将所得结果送回到中间层,最后用户将会收到中间层所得的结果。JDBC是用于直接调用SQL命令的“低级”接口。它在这方面的功能极佳,相比其它的数据库,它连接API易于使用,与此同时它也被设计成为了一种基础接口,高级接口和工具可以建立在它之上。很明显,JDBC具有如下优点:JDBC支持不同的关系数据库,JDBC使得开发人员不需要再使用复杂的驱动器调用命令和函数,可以将常用的JDBC数据库连接封装成一个类等。
    2.2.5 SQL语言简介SQL全称是结构化查询语言(Structured Query Language),SQL语言结构简洁,功能强大,简单易学。SQL语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。SQL语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。SQL语言不仅是一个功能强大的通用的关系数据库标准语言,而且还是一种介于关系演算和代数之间的语言,其功能之强大体现在查询、操纵、定义和控制这四个方面。SQL语言包含以下六个部分:

    数据查询语言
    数据操作语言
    事务处理语言
    数据控制语言
    数据定义语言
    指针控制语言

    作为非过程化的语言,SQL一次只对一个记录进行处理,自动对数据提供导航。SQL不对单个记录进行操作,它不仅可对记录集进行操作,还允许用户在高层的数据结构上工作。对于所有SQL语句,输入的是接受集合,输出的是返回集合。SQL的集合特性允许一条SQL语句的结果作为另一条SQL语句的输入。SQL可用于所有用户的DB活动模型,这里所指的用户包括系统管理员、数据库管理员、 应用程序员、决策支持系统人员以及许多其它类型的终端用户等。基本的SQL命令简单易学,一般情况下只需很少时间就能学会,即使是高级的命令在几天也内便可掌握。SQL语言则将所有任务统一在了一种语言中。用户之所以可将使用SQL的技能从一个关系数据库管理系统转到另一个,是因为所有主要的关系数据库管理系统都支持SQL语言。
    3 可行性研究3.1 经济可行性经济可行性,主要考虑的是系统开发涉及到的一些相关费用问题,企业是否可以支撑这些费用,通常来分析,软件系统开发主要包括的费用有设备购买费用,人员开发成本,设备维护更新成本,以及其他零散费用等,这些费用中,人员开发费用相对较高,但是本次系统开发规模小,周期短,所设计的开发费用不高,因此企业不必担心此方面问题。再则就是设备购买费用,一般保持电脑,交换机,网络,服务器等,这些都是一次性购买,费用也不高。因此,对于企业来讲,问题不大,经济上可以接受。通过对现已存在的相关系统进行调查,开发该系统所需的相关资料可以由此采集。同时所需的应用软件、系统硬件也便于获得,因此该系统开发成本不高。在引进该系统之后,不可否认,与传统方式相比可以节省不少人力、物力及财力,因为它的确具有效率高、质量高、成本低以及实用性高的特点。所以,站在经济的角度来讲,网上花店销售系统被认定为是可行的。
    3.2 技术可行性技术可行性主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。首先,系统采用的是JAVA开发技术,这项技术比较全面,实用广泛,没有实现不了的功能需求;其次该网站采用了SQL Server2008数据库,它能够处理大量数据,同时保持数据的完整性并提供许多高级管理功能,它的灵活性、安全性和易用性为数据库编程提供了良好的条件;最后开发工具,采用的是MyEclipse,工具中具有框架函数等,可以直接引用。因此,系统的软件开发平台已成熟可行。硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,价格越来越低,其硬件平台完全能满足此系统的需要。
    3.3 操作可行性操作可行性主要是考虑系统完成后,用户使用的是否便利,是否可以达到用户的操作要求。该系统界面设计充分考虑浏览用户的习惯,鲜花信息浏览,公告浏览,鲜花搜索,用户注册,用户登录,用户挑选鲜花加入购物车,用户将购物车的鲜花生成订单,用户查看订单,用户管理个人信息等功能操作方便。除此之外,对于管理员而言,管理界面一目了然,对于系统的管理和维护也很容易。更重要的是所有网页设计清新、简洁、合理,不会让用户感到视觉疲劳,可操作性强。
    3.4 法律可行性法律可行性主要是看新系统的开发会不会在社会上或政治上引起侵权,有无违法问题。网上花店销售系统开发过程中所有技术资料都是合法的;在开发过程中是不存在知识产权问题的;未抄袭其他系统,故不存在侵犯版权问题;开发过程中不会涉及任何法律责任。
    4 需求分析4.1 数据描述4.1.1 数据流图数据流图简称DFD,它从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。网上花店销售系统的数据流图如图4-1所示。

    在该数据流图中方框表示数据的原点或终点,原点和终点是系统之外的实体。椭圆表示变换数据的处理,也称之为加工,它对数据流进行某些操作或变换。箭头表示数据流,数据流是数据在系统中的运行方向。双杠表示数据存储文件,是用来暂时存储数据的。网上花店销售系统的实体有两个,分别为用户和管理员,用户对应于在网上购买鲜花的顾客,管理员对应于网上花店的老板。此系统中的加工对于用户来说有浏览鲜花、查看分类、管理用户信息、管理购物车、生成并查看订单、查看公告,对管理员来说有鲜花管理、分类管理、用户管理、订单管理、公告管理。此系统中的数据存储包括鲜花信息、分类信息、用户信息、购物车信息、订单信息和公告信息,在实际的实现中应该将这些信息存储在对应的表里,虽然鲜花信息、分类信息、用户信息、订单信息和公告信息是用户和管理员共享的,但是由于权限的不同用户对于鲜花信息、分类信息以及公告信息只有查看的权限,管理员对于这些信息有增、删、改的权限。在数据流图中反映为加工的不同。
    用户在系统中可以浏览鲜花、查看分类、管理用户信息、管理购物车、生成并查看订单、查看公告,本系统中用户数据流图如图4-2所示。

    管理员在系统中可以进行鲜花管理、分类管理、用户管理、订单管理、公告管理,其中管理员可以对鲜花、分类和公告进行添加、修改、查看和删除,对用户进行查看和删除,对订单进行查看和处理。本系统中管理员数据流图如图4-3所示。

    4.1.2 数据字典数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑、外部实体等进行定义和描述,其目的是对数据流程图中的各个元素做出详细的说明。图4-1中数据流条目如下所示:

    用户信息=用户ID+用户名+密码+姓名+角色+手机号+地址
    鲜花信息=鲜花ID+鲜花名+鲜花图片+上架时间+分类ID+分类名+价格+是否推荐+点击数+鲜花销量+鲜花描述
    公告信息=公告ID+标题+内容+添加时间
    分类信息=分类ID+分类名称
    购物车信息=购物车ID+用户ID+鲜花ID+鲜花名+价格+购买数量
    订单信息=订单ID+订单状态+用户ID+用户姓名+用户手机+收货地址+订单详情+订单号+备注+生成时间+总价

    根据数据流条目得到数据项条目如表4-1所示。



    名称
    类型
    长度
    别名




    id
    int
    11
    用户ID


    username
    varchar
    255
    用户名


    password
    varchar
    255
    密码


    xingming
    varchar
    255
    姓名


    role
    int
    11
    角色


    dianhua
    varchar
    255
    手机号


    dizhi
    varchar
    255
    地址


    id
    int
    11
    鲜花ID


    pname
    varchar
    255
    鲜花名


    imgpath
    varchar
    255
    鲜花图片


    createtime
    varchar
    255
    上架时间


    fname
    varchar
    255
    分类名


    jiage
    double

    价格


    tuijian
    varchar
    255
    是否推荐


    dianjishu
    int
    11
    点击数


    xiaoliang
    int
    11
    鲜花销量


    miaoshu
    text

    鲜花描述


    id
    int
    11
    公告ID


    biaoti
    varchar
    255
    标题


    neirong
    text

    内容


    shijian
    varchar
    255
    添加时间


    id
    int
    11
    分类ID


    fname
    varchar
    255
    分类名称


    id
    int
    11
    购物车ID


    shuliang
    int
    11
    购买数量


    id
    int
    11
    订单ID


    status
    varchar
    255
    订单状态


    xiangqing
    text

    订单详情


    orderid
    varchar
    255
    订单号


    beizhu
    varchar
    255
    备注


    shijian
    varchar
    255
    生成时间


    zongjia
    double

    总价



    4.1.3 系统IPO图IPO图是输入—处理—输出图(Input-Process-Output)的简称。基本形式是画三个方框,在左边框中列出有关输入数据,在中间框内列出主要处理,在右边框中列出产生的输出数据。网上花店销售系统的输入数据主要是用户信息以及鲜花信息,处理主要针对用户、鲜花分类、鲜花详情、购物车以及订单,输出数据对应于处理过程。该系统IPO图如图4-4所示。

    4.2 功能需求4.2.1 功能划分本网上花店销售系统主要分为前台操作和后台管理两部分。

    前台操作

    前台作为与用户直接交互的界面,在考虑功能的同时,也考虑了操作的简洁和方便性,目的是让大多数不太懂电脑操作的用户也能轻松的享受该系统带来的便利前台主要功能包括:首页(主界面)、鲜花搜索、鲜花分类、花店公告、鲜花浏览、用户注册、用户登录、订购鲜花、查看购物车、查看订单等
    后台管理

    后台管理考虑了花店管理的操作简单方便后台主要功能包括:分类管理、鲜花管理、公告管理、订单管理、用户管理

    4.2.2 功能描述
    首页(主界面):提供简洁美观的主界面,界面陈列系统提供功能,用户和管理员通过选择各个功能来达到自己所需的目的
    用户注册:新用户通过填写注册表单,将自己的详细信息输入并提交系统,系统会通过与数据库的连接以及表单限定的格式来检查合法性。注册成功后可以进行订购等其他功能
    用户登录:用户通过输入“用户名”和“密码”进行登录,系统会通过与数据库的连接来检查合法性,如果存在则登录成功继续接下来的功能,如果不存在则返回登录界面
    鲜花浏览:用户可以通过选择该功能看到本系统鲜花的详细介绍
    加入购物车:用户可以通过该功能选择自己要购买的鲜花并放入购物车,在购物车也可以进行数量的修改并且生成订单。但要首先登录才可以实现该功能
    生成订单:用户可以把购物车里的鲜花下订单
    查看订单:用户可以查询自己的订单,但首先必须登录
    修改个人信息:用户可以修改个人资料
    管理员分类管理:管理员可以对系统首页的分类进行增加、查看、修改、删除
    管理员鲜花管理:管理员可以对系统首页的鲜花进行增加、查看、修改、删除
    管理员公告管理:管理员可以对系统首页的公告进行增加、查看、修改、删除
    管理员订单管理:管理员可以对用户的订单进行查看、处理
    管理员用户管理:管理员可以对系统已经注册的用户进行查看、删除

    4.3 性能需求网上花店销售系统在日常处理中的响应速度为秒级,达到实时要求,以及时反馈信息。在进行统计分析时,根据所需数据量的不同而从秒级到分钟级,原则是保证操作人员不会因为速度问题而影响工作效率。系统处理的准确性和及时性是系统的必要性能。在系统设计和开发过程中,要充分考虑系统当前和将来可能承受的工作量,使系统的处理能力和响应时间能够满足用户对信息处理的求。由于网上花店销售系统的查询功能对于整个系统的功能和性能完成举足轻重,作为系统的很多数据源,其准确性很大程度上决定了网上花店销售系统的成败。在系统开发过程中,必须采用一定的方法保证系统的准确性。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用Java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。当操作发生变化时,一些功能同样能够实现。因为在实现各项功能时了,把功能划分成了不同的模块,各模块之间互不干扰,而且JavaBean都采用类的形式,每个功能都封装成一个类,当运行环境发生变化时,对程序会有一些影响,但打上补丁就可以继续运行了。总体上讲,本系统具有一定的自适应性。
    4.4 运行需求
    硬件条件:英特尔酷睿2 CPU、1GB 内存、20GB以上硬盘的PC机
    软件条件:Windows 7操作系统

    当系统遇到问题时,首先查看运行环境是否更改;如果更改,只修复运行环境即可;若未更改,查看系统中各个模块之间的接口是否有问题,可通过调试改正错误。数据库最严重的问题是数据库损坏,此时最好是从备份恢复数据库。如果是由于存储问题导致部分数据库文件损坏,但数据库还可以连接,这种情况采用导出数据库的表结果和数据的方法来恢复数据库。解决数据库的性能问题,可以从以下方面入手,检查数据库的配置,如缓冲池,排序堆等是否处理;检查数据库是否收集过统计信息,准确的统计信息对语句优化起着重要的作用;对sql语句进行优化;查看是否有系统资源瓶颈。
    4.5 其他需求网上花店销售系统是直接面对使用人员的,而使用人员往往对计算机并不是非常熟悉。这就要求系统能够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使用用户熟悉的术语和中文信息的界面。针对用户可能出现的使用问题,要提供足够的在线帮助,缩短用户对系统熟悉的过程。网上花店系统中涉及到的数据是相当重要的信息,系统要提供方便的手段供系统维护人员进行数据的备份,日常的安全管理,系统意外崩溃时数据的恢复等工作。
    5 总体设计5.1 系统功能模块设计网上花店销售系统一共分为前台和后台两大模块,两个模块之间虽然在表面上是相互独立的,但是在对数据库的访问上是紧密相连的,各个模块访问的是同一个数据库,只是所访问的表不同。
    网上花店销售系统的前台功能模块分为:

    鲜花展示模块:鲜花展示模块主要是向用户展示网上花店的鲜花,主要分为鲜花搜索和鲜花分类两个子模块。用户可以通过鲜花搜索直接查询自己想要了解的鲜花,也可以通过鲜花分类查找某一类的鲜花
    公告展示模块:公告展示模块是管理员发布的与网上花店系统相关的公告信息,可以包括系统的使用或者最新的优惠活动等。用户登录系统后,可以查看公告信息,以此来最快的了解系统
    购买鲜花模块:购买鲜花模块主要是完成用户在网上的购物的流程。购买鲜花模块分为加入购物车和生成订单两个子模块
    用户管理模块:用户管理模块分为用户注册、用户登录、用户修改信息三个子模块

    网上花店销售系统前台功能模块图如图5-1所示。

    用户进行购买鲜花时,先进行注册,然后进行登录,登录系统后用户可以浏览鲜花,把需要购买的鲜花加入购物车,把购物车的鲜花生成订单。用户购买鲜花时序图如图5-2所示。

    网上花店销售系统的后台功能模块分为:

    分类管理模块:分类管理模块主要是实现管理员对系统分类的管理,使得用户可以按照分类挑选鲜花,方便了用户的挑选,管理员通过这个模块可以向系统添加新的分类,查看已有的分类,修改已有的分类,删除旧的分类
    鲜花管理模块:鲜花管理模块主要是实现管理员对系统鲜花的管理,该模块对整个系统至关重要。管理员通过这个模块可以向系统添加新的鲜花,查看已有的鲜花,修改已有的鲜花,删除旧的鲜花
    订单管理模块:订单管理模块主要是实现管理员对系统订单的管理,管理员通过这个模块可以查看用户下的订单并对订单做出相应的处理
    公告管理模块:公告管理模块主要是实现管理员对系统公告的管理,这样用户进入系统后可以通过浏览公告获取网上花店销售系统的最新资讯,并且可以在最短的时间内对系统有基本的了解。管理员通过这个模块可以向系统添加新的公告,查看已有的公告,修改已有的公告,删除旧的公告
    用户管理模块:用户管理模块主要是实现管理员对已注册用户的管理,管理员通过这个模块可以查看用户的信息或者删除用户

    网上花店销售系统后台功能模块图如图5-3所示。

    5.2 数据库设计5.2.1 概念结构设计描述概念模型的有力工具是E-R模型,E-R模型是用E-R图来描述现实世界的概念模型。E-R模型包括实体、属性、实体之间的联系等。接下来将用E-R图对网上花店销售系统进行概念结构设计,包括各实体间的E-R图及各实体的详细属性E-R图。其中实体型用矩形表示,矩形框内写明实体名。属性用椭圆形表示,并用无向边将其与相应的实体型连接起来。联系用菱形表示,菱形框内写明联系名,并用无向边分别与有关实体型连接起来,同时在无向边旁标上联系的类型。
    本网上花店销售系统的实体有管理员,用户,公告,订单,分类,鲜花。下面将分别设计各实体的E-R图。
    用户E-R图如图5-4所示。

    在该E-R图中,对于用户实体,用户可以浏览公告,因此用户实体和公告实体是浏览关系,用户可以选购鲜花,因此用户实体和鲜花实体是选购关系,用户可以查看分类,因此用户实体和分类实体是查看关系,用户可以管理自己的购物车,因此用户实体和购物车实体是管理关系,用户可以查看自己的订单,因此用户实体和订单实体是查看关系,用户在系统中是被管理员管理的,因此用户和管理员是被管理的关系。
    管理员E-R图如图5-5所示。

    在该E-R图中,对于管理员实体,管理员可以对系统的公告、订单、分类、鲜花进行管理,对已注册的用户进行管理,因此它与其他实体的关系都是管理关系。
    用户实体的属性有ID、用户名、密码、姓名、角色、手机号、地址。用户详细属性E-R图如图5-6所示。

    鲜花实体的属性有ID、鲜花名、鲜花图片、上架时间、分类ID、分类名、价格、是否推荐、点击数、鲜花销量、鲜花描述。鲜花详细属性E-R图如图5-7所示。

    公告实体的属性有ID、标题、内容、添加时间。公告详细属性E-R图如图5-8所示。

    分类实体的属性有ID、分类名称。分类详细属性E-R图如图5-9所示。

    购物车实体的属性有ID、用户ID、鲜花ID、鲜花名、价格、购买数量。购物车详细属性E-R图如图5-10所示。

    订单实体的属性有ID、订单状态、用户ID、用户姓名、用户手机、收货地址、订单详情、订单号、备注、生成时间、总价。订单详细属性E-R图如图5-11所示。

    5.2.2 逻辑结构设计逻辑结构设计的任务就是把概念结构设计阶段设计好的基本E-R图转换为与选用数据库管理系统产品所支持的数据模型相符合的逻辑结构。数据库设计时注意保证在整个系统运行和业务操作过程中,数据库都能便于访问和查询,同时还需要考虑到要尽量节省数据库操作时的响应时间,尽可能的提高数据库对程序和业务请求的响应速度。
    根据概念结构设计阶段的E-R图,设计数据库表结构如下。
    t_Fenlei分类表
    该表存放分类ID及分类名称。t_Fenlei分类表如表5-1所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    fname
    varchar
    255
    分类名称



    t_Product鲜花表
    该表存放鲜花信息,主要包括鲜花名、鲜花图片、上架时间、价格、鲜花销量、鲜花描述等信息。分类表和该表相关联,因此表中还包含了分类ID以及分类名。t_Product鲜花表如表5-2所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    pname
    varchar
    255
    鲜花名


    imgpath
    varchar
    255
    鲜花图片


    createtime
    varchar
    255
    上架时间


    fenleiid
    varchar
    255
    分类ID,外键


    fname
    varchar
    255
    分类名


    jiage
    double

    价格


    tuijian
    varchar
    255
    是否推荐


    dianjishu
    int
    11
    点击数


    xiaoliang
    int
    11
    鲜花销量


    miaoshu
    text

    鲜花描述



    t_Gonggao公告表
    该表存放公告信息,主要包括标题、内容、添加时间。t_Gonggao公告表如表5-3所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    biaoti
    varchar
    255
    标题


    neirong
    text

    内容


    shijian
    varchar
    255
    添加时间



    t_Gouwuche购物车表
    该表存放购物车ID、以及用户ID、鲜花ID、鲜花名、价格、购买数量。t_Gouwuche购物车表如表5-4所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    userid
    int
    11
    用户ID,外键


    pid
    int
    11
    鲜花ID,外键


    pname
    varchar
    255
    鲜花名


    jiage
    double

    价格


    shuliang
    int
    11
    购买数量



    t_User用户表
    该表中存放用户的基本信息,普通用户和管理员共用此表,主要包括用户ID、用户名、密码、姓名、角色、手机号、地址信息。普通用户和管理员通过角色的值进行区分, 0表示普通用户,1表示系统管理员。t_User用户表如表5-5所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    username
    varchar
    255
    用户名


    password
    varchar
    255
    密码


    xingming
    varchar
    255
    姓名


    role
    int
    11
    角色


    dianhua
    varchar
    255
    手机号


    dizhi
    varchar
    255
    地址



    t_Dingdan订单表
    该表存放订单ID、订单状态、以及关联表里的用户ID、用户姓名等信息。t_Dingdan订单表如表5-6所示。



    名称
    类型
    长度
    备注




    id
    int
    11
    主键


    status
    varchar
    255
    订单状态


    userid
    int
    11
    用户ID 外键


    xingming
    varchar
    255
    用户姓名


    dianhua
    varchar
    255
    用户手机


    dizhi
    varchar
    255
    收货地址


    xiangqing
    text

    订单详情


    orderid
    varchar
    255
    订单号


    beizhu
    varchar
    255
    备注


    shijian
    varchar
    255
    生成时间


    zongjia
    double

    总价



    6 详细设计与实现根据总体设计部分对于功能模块的划分,在详细设计中采用JSP+Servlet+Javabean的MVC模式,其中系统的显示由JSP页面完成,用Javabean封装对象,业务的逻辑处理由Servlet完成,对于数据库的操作写在dao包的文件里。
    6.1 系统对象的设计与实现系统中总共包括七个对象,分别为用户,管理员,公告,鲜花,类别,购物车和订单。系统的类图如图6-1所示。

    在实现过程中将这七个对象封装成bean对象,其中管理员和用户的封装对象内容相同,故二者共用一个对象,用属性role进行区分,0表示用户,1表示系统管理员。六个对象对应于代码中的Dingdan.java,Fenlei.java,Gonggao.java,Gouwuche.java,Product.java,User.java。以User.java为例,关键代码如下:
    public class User { private int id;//主键 private String username;//用户名 private String password;//密码 private String xingming;//姓名 private int role;//用户角色 0表示用户,1表示系统管理员 private String dianhua;//手机 private String dizhi;//收货地址}
    6.2 系统首页的设计与实现该系统首页页面风格简单明了,上边横条可以选择注册和登录,左侧有鲜花搜索,鲜花分类,销量排行榜以及花店公告,用户可以根据自己的需求浏览相关内容。页面右侧是鲜花列表,用户可以通过点击相应的链接查看详情或者加入购物车。首页页面的设计如图6-2所示。

    具体的实现过程是:index.jsp文件主要包括鲜花列表部分,在index.jsp页面引入黄色横条的head.jsp以及左侧的left.jsp。
    6.3 系统前台功能的设计与实现6.3.1 用户注册模块的设计与实现用户注册需要填写相应的信息,主要包括用户名、密码、确认密码、姓名、收货地址以及手机号码。用户注册页面的设计如图6-3所示。

    该页面对应代码中的register.jsp,该页面对输入的每一个数据都有格式上的要求,用户名不能为空且必须是数字,字母或者下划线,密码不能为空且至少6位,确认密码要和密码一致,姓名,收货地址以及手机号都不能为空,手机号码还要符合正确的格式。当用户进行注册时,页面首先会对输入的数据格式进行检验,若输入错误会有相应的提示。除此之外,当用户输入正确的格式的数据之后,点击了注册按钮,系统会在数据库进行比对,若用户名已经被注册,系统也会弹出相应的提示,若用户名还未注册则将数据插入数据库,提示注册成功并跳转到首页。具体的实现过程是在IndexServlet.java中对注册进行逻辑处理,在UserDao.java中对数据库进行操作。
    该页面关键代码如下:
    <form action="indexServlet/register" method="post" onsubmit="return checkform()"> <label>用户名:</label> <input type="text" class="form_input" name="username" id="usernameid" /> <label>密码:</label> <input type="password" class="form_input" name="password" id="passwordid"/> <label>确认密码:</label> <input type="password" class="form_input" name="password2" id="password2id"/> <label>姓名:</label> <input type="text" class="form_input" name="xingming" id="xingmingid"/> <label>收货地址:</label> <input type="text" class="form_input" name="dizhi" id="dizhiid"/> <label>手机:</label> <input type="text" class="form_input" name="dianhua" id="dianhuaid"/> <input type="submit" class="form_submit" value="注册" /></form>
    用户在注册时,第一不能有空值,第二两次密码的输入要一致,第三各项数据的格式要正确。除此之外,用户名不可以是已经注册过的。用户注册程序流程图如图6-4所示。

    6.3.2 用户登录模块的设计与实现用户登录需要填写用户名以及密码,登录页面的设计如图6-5所示:

    该页面对应代码中的login.jsp,用户名和密码都不能为空,否则页面会进行相应的提示,当输入用户名和密码点击登录之后,系统会在数据库中查找,若有匹配的数据则提示登录成功并跳转到首页,否则提示用户名或密码不正确。具体的实现过程是在IndexServlet.java中对登录进行逻辑处理,在UserDao.java中对数据库进行操作。
    该页面关键代码如下:
    <form action="indexServlet/login" method="post" onsubmit="return checkform()"><label>用户名:</label><input type="text" class="form_input" name="username" id="usernameid" /><label>密码:</label><input type="password" class="form_input" name="password" id="passwordid"/><input type="submit" class="form_submit" value="登录" /></form>
    用户在登录时,用户名和密码要一致,如果正确才可以登录成功,否则登录失败需要重新输入登录信息。用户登录程序流程图如图6-6所示。

    6.3.3 公告浏览模块的设计与实现用户在首页可以浏览花店公告,通过点击花店公告的标题可以查看花店公告的详细信息。花店公告页面以及公告详情页面设计如图6-7以及6-8所示。
    花店公告页面

    公告详情页面

    具体的实现过程是,当用户点击花店公告的标题时,通过IndexServlet.java的gonggaoupdate方法获取对象,然后通过GonggaoDao.java对数据库进行操作,最后将对象传到gonggao.jsp页面。
    公告详情页面关键代码如下:
    <form action="${url }" method="post" onsubmit="return checkform()"><div class="form"><div class="form_row"><label>公告标题:</label>${bean.biaoti }</div><div class="form_row"><label>内容:</label>${bean.neirong }</div><div class="form_row"><label>发布时间:</label>${bean.shijian }</div><div class="form_row"><input type="button" class="form_submit" value="返回" onclick="javascript:history.go(-1);"/> </div> <div class="clear"></div></div></form>
    6.3.4 鲜花列表模块的设计与实现用户在系统首页的鲜花列表可以浏览鲜花,鲜花列表包括鲜花名,图片,分类名,鲜花价格,以及查看详情和加入购物车两种操作。点击查看详情后页面会跳转到鲜花信息详情页面。鲜花列表页面以及鲜花信息详情页面如图6-9以及6-10所示。
    鲜花列表页面

    鲜花信息详情页面

    鲜花列表页面对应代码中的index.jsp,鲜花信息详情页面对应代码中的product.jsp,具体实现方式是当用户点击查看详情时,在IndexServlet.java中用productupdate方法进行具体处理,之后把对象传到product.jsp页面。当用户点击鲜花列表或鲜花信息详情页面的加入购物车时,如果用户已经登录,那么系统跳转到我的购物车页面。否则,系统会提示用户先登录并跳转到登录页面。
    6.3.5 用户购物车模块的设计与实现我的购物车页面,包括鲜花名,单价,购买时间,小计。用户可以修改购买数量或者删除购物车里的东西,也可以点击链接跳转到订单页面。我的购物车页面设计如图6-11所示。

    我的购物车页面对应代码中的gouwuchelist.jsp,当用户点击鲜花列表或鲜花信息详情页面的加入购物车时,在IndexServlet.java中用gouwucheadd2方法进行添加商品到购物车操作,在GouwucheDao.java里对数据库进行操作,将所选鲜花数据插入数据库。我的购物车页面的变更删除分别用IndexServlet.java的gouwucheupdate2方法和gouwuchedelete方法实现。
    6.3.6 用户订单模块的设计与实现我的订单页面,包括订单号,收货人姓名,订单状态,生成时间,总价,以及查看订单详情的操作。用户也可以查看和搜索自己的订单。我的订单页面如图6-12所示。

    我的订单页面对应代码中的orderlist.jsp,查询订单的操作在indexServlet/orderlist中实现,查看订单详情的操作在indexServlet/dingdanupdate3中实现,其中对数据库的操作在DingdanDao.java中完成。
    6.3.7 用户信息管理模块的设计与实现用户可以在个人信息页面对自己的信息进行管理,主要是对姓名,手机号以及收货地址的更改,可以在修改密码页面进行密码的修改。用户信息页面的设计与修改密码的设计如图6-13以及6-14所示。
    个人信息页面

    修改密码页面

    个人信息页面对应代码中的userupdate.jsp,修改密码页面对应代码中的passwordupdate.jsp,修改个人信息在是在indexServlet/userupdate2中完成的,修改密码是在indexSe rvlet/passwordupdate2中完成的,操作数据库的部分在UserDao.java中完成。
    6.4 系统后台功能的设计与实现6.4.1 系统后台页面的设计与实现管理员登录成功后会进入系统后台页面,主要包括左侧的主菜单以及中间的欢迎页面。主菜单包括,分类管理,鲜花管理,公告管理,订单管理,用户管理。系统后台页面如图6-15所示。

    管理员在此页面可以通过点击左侧主菜单进行相应的管理。关键代码如下:
    <ul> <li><a href="<%=basePath2 %>manageServlet/fenleilist" >分类管理</a></li> <li><a href="<%=basePath2 %>manageServlet/productlist" >鲜花管理</a></li> <li><a href="<%=basePath2 %>manageServlet/gonggaolist" >公告管理</a></li> <li><a href="<%=basePath2 %>manageServlet/dingdanlist" >订单管理</a></li> <li><a href="<%=basePath2 %>manageServlet/userlist" >用户管理</a></li></ul>
    6.4.2 分类管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的分类,也可以增加新的分类。该系统分类管理页面如图6-16所示。

    分类管理页面对应代码中的fenleilist.jsp,添加新分类以及查看和修改分别对应fenl eiadd.jsp,fenleiupdate3.jsp,fenleiupdate.jsp,管理员进行操作时,系统通过在ManageSer vlet.java中的方法实现,对数据库的操作在FenleiDao.java中实现。
    6.4.3 鲜花管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的鲜花,也可以增加新的鲜花。该系统鲜花管理页面如图6-17所示。

    鲜花管理页面对应代码中的productlist.jsp,添加新商品对应productadd.jsp,上传图片对应productupdate5.jsp,查看和修改分别对应productupdate3.jsp,productupdate.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在ProductDao.java中实现。
    6.4.4 公告管理功能的设计与实现管理员通过此功能可以查看、修改、删除已经存在的公告,也可以增加新的公告。该系统公告管理页面如图6-18所示。

    公告管理页面对应代码中的gonggaolist.jsp,添加新公告对应gonggaoadd.jsp,查看和修改分别对应gonggaoupdate3.jsp,gonggaoupdate.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在GonggaoDao.java中实现。
    6.4.5 订单管理功能的设计与实现管理员通过此功能可以查看和处理订单。该系统订单管理页面如图6-19所示。

    订单管理页面对应代码中的dingdanlist.jsp,查看订单详情对应dingdanupdate3.jsp,管理员进行操作时,系统通过在ManageServlet.java中的方法实现,对数据库的操作在DingdanDao.java中实现。
    6.4.6 用户管理功能的设计与实现管理员通过此功能可以查看和删除用户。该系统用户管理页面如图6-20所示。

    用户管理页面对应代码中的userlist.jsp,管理员进行查询用户和删除用户操作的时候,系统通过在ManageServlet.java中的方法实现,对数据库的操作在UserDao.java中实现。
    7 系统的调试与测试7.1 程序调试调试是在测试发现错误之后排除错误的过程。调试的目的是为了解决存在的错误,即对错误定位、分析并找出原因改正错误,因此调试也称为纠错。软件调试是一项具有很强技巧性的工作,调试是一个通过外部表现找出原因的思维分析过程。常用的调试技术是消去原因法,即通过思考,分析列出发生错误的所有可能原因,逐个排除,最后找出真正的原因。试探法、归纳法、折半查找法、演绎法都属于消去原因法。
    7.2 程序测试7.2.1 测试的内容功能测试:用户注册登录后进行鲜花选购、查看公告等功能,与此同时查看数据库内容是否同步更改,若更改成功则说明程序正确,反之说明程序错误。同理以管理员身份进行登录,对公告、用户等进行查看更改,查看数据库的变化。

    链接测试:在点击菜单按钮之后,查看跳转的页面是否正确
    极限测式:可以通过频繁登录与退出数据库这类频繁的操作来对系统进行测试等

    7.2.2 测试用例根据系统的功能,测试用例为以下几方面:

    用户的注册和登录以及退出,管理员的登录以及退出
    用户浏览鲜花,将鲜花加入购物车,对购物车的鲜花数量进行更改,生成订单,提交订单,查看订单,修改个人信息
    管理员对分类、鲜花、公告进行增、删、改、查,对订单和用户进行查、删

    具体的测试细节为:

    用户注册测试:用户注册时,填写各项信息,首先是各项信息空值的测试,其次是各项数据的数据格式的测试
    用户及管理员登录测试:用户及管理员登录时只需填写用户名和密码,因此测试时主要对用户名和密码的匹配性进行测试
    用户及管理员退出测试:用户和管理员的退出主要是通过点击“退出系统”按钮,因此实际测试中只需测试用户点击按钮后是否能够正确跳转
    浏览鲜花测试:浏览鲜花时用户可以点击查看详情去获取鲜花的详细信息,因此实际测试中只需测试用户点击按钮后是否能够正确跳转到相应的鲜花详情页面
    加入购物车测试:鲜花列表以及鲜花详情页面都有包含加入购物车功能,因此实际测试中需要在两个页面都测试用户点击按钮后是否能够正确跳转到购物车页面
    管理购物车测试:在购物车页面,用户可以对购物车里的鲜花数量进行更改,可以删除购物车里的鲜花,因此实际测试中需对这两方面进行测试
    生成订单测试:用户点击生成订单页面会跳转到确认订单收货信息页面,因此实际测试中要测试用户点击链接后能否正确跳转
    提交订单测试:用户提交订单后会跳转到订单页面,因此实际测试中要测试用户点击提交按钮后页面能否正确跳转以及数据库信息是否相应改变
    用户管理个人信息测试:用户可以更改自己的姓名、收货地址和手机,更改后数据库数据会有相应改变,因此实际测试中要测试用户点击提交按钮后页面能否正确弹出更改成功的信息以及数据库信息是否相应改变
    管理员分类管理测试:管理员在网上花店后台对于分类的管理主要是对分类的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的分类是否改变以及数据库中的分类数据是否相应的改变
    管理员鲜花管理测试:管理员在网上花店后台对于鲜花的管理主要是对鲜花的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的鲜花是否改变以及数据库中的鲜花数据是否相应的改变
    管理员公告管理测试:管理员在网上花店后台对于鲜花的管理主要是对公告的增加、修改、查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行增加、修改和删除操作时前台显示的公告是否改变以及数据库中的公告数据是否相应的改变
    管理员订单管理测试:管理员在网上花店后台对于订单的管理主要是对订单的查询和处理,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行处理操作时订单是否显示已处理并且数据库中的订单数据是否相应的改变
    管理员用户管理测试:管理员在网上花店后台对于用户的管理主要是对用户的查询和删除,因此实际测试中要测试管理员进行查询操作时是否能正确显示查询信息,管理员进行删除操作时数据库中的用户数据是否相应的删除

    7.2.3 测试结果通过上一小节对测试细节的分析,对系统进行相应的测试,具体的测试结果如表7-1、表7-2以及表7-3所示。
    在表中有四项内容:

    名称:指测试的对象
    操作:指测试过程中进行的操作方法
    预期结果:指对测试操作产生结果的预测
    实际结果:指实际对系统进行测试时产生的结果

    登录注册测试结果



    名称
    操作
    预期结果
    实际结果




    用户注册测试
    在注册表单输入各种格式的数据
    格式正确则注册成功,反之失败
    同预期


    用户登录测试
    在登录表单输入未注册和已注册数据
    与数据库数据一致则登录成功,反之失败
    同预期


    管理员登录测试
    在登录表单输入正确数据及错误数据
    与数据库数据一致则登录成功,反之失败
    同预期


    用户退出测试
    点击退出系统
    正确退出
    同预期


    管理员退出测试
    点击退出系统
    正确退出
    同预期



    用户操作测试结果



    名称
    操作
    预期结果
    实际结果




    浏览鲜花测试
    点击首页的鲜花列表相应链接
    跳转到相应鲜花界面
    同预期


    加入购物车测试
    点击加入购物车按钮
    跳转正确并且数据库相应改变
    同预期


    管理购物车测试
    对购物车内容进行增、删
    跳转正确并且数据库相应改变
    同预期


    生成订单测试
    点击生成订单按钮
    跳转正确
    同预期


    提交订单测试
    点击提交订单按钮
    跳转正确并且数据库相应改变
    同预期


    管理个人信息测试
    修改个人信息并提交
    跳转正确并且数据库相应改变
    同预期



    管理员操作测试结果



    名称
    操作
    预期结果
    实际结果




    分类管理测试
    在分类管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    鲜花管理测试
    在鲜花管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    公告管理测试
    在公告管理界面进行增删改查
    跳转正确并且数据库相应改变
    同预期


    订单管理测试
    在订单管理界面进行查看和处理
    跳转正确并且数据库相应改变
    同预期


    用户管理测试
    在用户管理界面查看和删除用户
    跳转正确并且数据库相应改变
    同预期



    结论完成了网上花店销售系统的设计,系统前台实现了用户在线浏览所有鲜花,按需求搜索相关鲜花,浏览系统公告以及注册登录后对鲜花选购的操作和购物结束后对订单信息的查看。系统后台实现了管理员对鲜花、分类、公告、订单、用户的管理。
    所设计系统中有一些优点,第一系统安全性高,本系统使用者分为管理员和用户两个角色,当其登录系统时,对其身份进行严格认证;第二采用隔离与访问控制,本系统根据用户的工作需求来分析,对用户权限进行了严格的控制,比如,用户只能浏览鲜花信息而不能修改,系统管理员就可以添加、删除、修改鲜花信息;第三操作简便,该系统本着方便易用的目的进行设计,无论是管理员还是用户都不需要具备专业的计算机知识,只要懂得计算机的一些基本操作,就可以轻松的对花店进行使用,这样做更加贴近用户,使用户使用方便,提高用户的体验。
    但本系统也有一些不足,比如界面相对比较简单,功能相对有限。所以该系统还可以继续完善。
    参考文献[1] 万常选,刘云生. 电子商务的技术及其应用[J]. 计算机工程与应用. 2002(07) .
    [2] 王知强,郑炜. 基于UML的动态企业建模的研究与实现[J]. 哈尔滨商业大学学报(自然科学版). 2005(02) .
    [3] 文灿华,张伟. 基于JSP的网上商城的设计与实现[J]. 电脑知识与技术. 2010(31) .
    [4] 鲁晓东,李育龙,杨健编著.JSP软件工程案例精解[M]. 电子工业出版社, 2005.
    [5] 杨学瑜等编著.JSP入门与提高[M]. 清华大学出版社, 2002.
    [6] 张琳. 网上购物系统的设计与开发[J]. 科技信息(学术研究). 2007(24).
    [7] 陈春蓉. 网上购物系统的设计与开发[J]. 软件导刊. 2009(08).
    [8] 万华. 基于JSP的网上购物系统的实现[J]. 现代计算机(专业版). 2002(10).
    [9] Enhancing Java server availability with JAS. Reinhard Klemm,Navjot Singh. Software. Practice \& Experience . 2001.
    [10] D.C.Ghita.JavaScript Generators. Studia Universitatis Babes-Bolyai:Series Informatica . 2010.
    [11] Jeffrey A Hoffer,Joey F. George.Modern SystemsAnalysis and Design. 2003.
    12 评论 213 下载 2020-08-03 19:01:00 下载需要14点积分
  • 基于python和mysql实现成绩管理系统

    一、需求分析1.1 背景
    软件名称:学生选课与成绩管理系统
    用户:学生,老师

    1.2 任务目标
    提供学生选课与退课功能
    提供老师登入成绩功能
    系统复合实际使用要求,人机界面交互友好,操作方便

    1.3 运行环境python 3.6 mysql
    二、关系模型S(SNO,SNAME,SEX,AGE,SDEPT,LOGN,PSWD)C(CNO,CNAME,CDEPT,TNAME)T(TNO,TNAME,LOGN,PSWD)SC(SNO,CNO,GRADE)
    三、E-R图
    四、项目实现4.1 建立数据库按关系模式写出数据库结构

    4.2 界面设计4.2.1 用户登录页面
    4.2.2 学生选课界面
    4.2.3 教师管理界面
    6 评论 263 下载 2019-06-29 20:45:32 下载需要15点积分
  • 基于Java Web和Mysql的汽车租赁系统设计与实现

    摘 要今天,现如今的中国的经济正处于稳定的上升阶段,现在每个家庭基本上都有一部汽车作为代步工具,根据中汽协11月份发表的10月份汽车产销数据可知,中国车市已经连续四个月下滑,这意味着中国的家庭对于汽车这个商品的购买欲望已暂时趋于缓和,这个时候从一个渐趋于饱和的市场去开拓市场,事倍功半。
    这个汽车租赁管理系统针对手中有可出租车辆资源的客户或公司设计,主要实现了用户的注册、登录功能,租赁人在实体店选好车型后,可在该系统的租赁界面,填写订单,实现了添加订单功能,编辑订单,删除订单的操作。这个项目是基于JavaWeb开发的一个汽车租赁系统,使用了eclipse,MySQL,Tomact8.0,xampp,Navicat for MySQL工具进行项目开发及功能测试。
    这个产品的想法,出自于每天日常的出行,尤其是走入社会后,住房可能与公司的上班地点相间太远,又或者周六日和朋友短途出去游玩,拥有一辆汽车就很有必要性了,刚进入社会的大部分人,都是没有经济能力去支付购买一辆车的费用,更何况提车后的油费,保养费,停车费等等,而共享汽车刚好可以弥补这一块空白期。
    关键词:汽车;租赁;互联网
    1 绪论1.1 系统开发背景与意义今天,现如今的中国的经济正处于稳定的上升阶段,现在每个家庭基本上都有一部汽车作为代步工具,根据中汽协11月份发表的10月份汽车产销数据可知,中国车市已经连续四个月下滑,这意味着中国的家庭对于汽车这个商品的购买欲望已暂时趋于缓和,这个时候从一个渐趋于饱和的市场去开拓市场,事倍功半。
    这个汽车租赁管理系统针对手中有可出租车辆资源的客户或公司设计,主要实现了用户的注册、登录功能,租赁人在实体店选好车型后,可在该系统的租赁界面,填写订单,实现了添加订单功能,编辑订单,删除订单的操作.
    这个项目是基于JavaWeb开发的一个汽车租赁系统,使用了eclipse,MySQL,Tomact8.0,xampp,Navicat for MySQL工具进行项目开发及功能测试.
    1.2 文章的研究内容
    HTML:整个项目的界面,是用户对这个系统的第一印象,界面需满足用户的基本审美要求,简单易懂
    功能源码:包括jsp、sevlet,dao类(实现功能代码)、对应数据库表单的实体类,封装好的一个打通数据库通道的类
    数据库(MySQL):储存整个项目所所长生的信息,比如用户登录账号的注册信息、租赁人的订单信息
    Tomact的版本运行

    这个项目实现了用户的通过浏览器,进行注册或登录项目的操作,用户登录成功后可以通过订单展示查看所有的历史订单,可以在订单展示页面进行编辑订单和删除订单的操作;鼠标左键单击添加订单按钮,会跳转进入添加订单页面,进行添加新的订单操作。
    开发环境:Eclipse、MySQL、Tomact8.0
    整个系统采用了jsp,servlet,session,jdbc等技术。
    1.3 文章的组织结构这个章节的内容:

    第一章大致对开发的这套程序做一个讲解,让大家了解这个系统开发的意义
    第二章主要讨论了项目与管理人员的需求以及实现项目功能的一些核心技术
    第三章详细介绍了系统的业务建设与设计。对系统的管理人员与及系统功能需求进行了讲解

    第四章主要对这个系统的实现进行了详细地解释,最后对所有工作进行说明总结

    2 系统需求分析与关键技术2.1 可行性分析2.1.1 经济可行性这个项目的开发,主要是为了管理员可以方便的对客户基本信息、车辆信息进行登记和储存,方便公司后期做数据分析。
    2.1.2 技术可行性这个产品的运行,需要一台装有Eclipse ,配置好java开发环境和Tmocat8.0服务器的电脑,测试环境是360极速浏览器的兼容模式,可以实现所有开发好的功能,界面简洁,功能很容易上手操作。
    2.1.3 运营可行性互联网时代,办公基本上离不开电脑,大数据的也是基于大量的网上的数据进行分析,所有的信息最后基本都汇总到了各个云服务器,此次开发的这个汽车租赁系统界面简洁明了,管理人员可以轻松的掌握所有功能,做这个项目时充分考虑了管理人员用电脑和手机的习惯,运营可行性高。
    2.2 功能分析2.2.1 登录注册功能这个功能主要是对管理员的信息进行收集,实行可以登录。

    注册:用户进入系统的起始页,有两个按钮,分别是登录和注册,点击注册按钮可以进入注册界面,进行登录人员的信息的收集,并且把信息注入数据库中,实现信息的收集
    登录:注册的人进入系统的起始页,分别在账号和password输入框内输入曾经注册过的信息,按下登录图标,即可进入产品的功能界面

    2.2.2 信息的增删改查功能管理员进入系统后可以操作增加订单,添加用户,修改订单信息,删除订单,查询指定租赁人的功能。

    添加用户:管理员可以在界面添加新的人员登录此系统,进行相关功能的操作
    添加订单:管理员订单左侧菜单栏中的添加订单,即可进图添加订单页,进行租赁客户的相关信息登记
    查询:管理员添加数据后,点击左侧的菜单栏中的订单展示,即可查看所有订单的信息,订单展示页上方添加了一个身份证号的查询框,实现了对数据库中的订单实施精准查询
    修改:订单展示页面的每条订单后面都有一个编辑按钮,这个图标可以对该条信息进行修改,单击图标,就能进入编辑页面,对该条订单进行edit和保存
    删除;订单展示页面的每条订单后面都有一个删除按钮,此按钮可以对该条订单实施删除操作,若改订单已完结,即可进行订单的删除


    2.2.3 分页功能分页功能主要面对显示客户信息更优化管理。基于显示客户信息的基础上考虑到客户的数量进行合理化的分页进行管理,每6条客户信息为一个页面,可以进行比较好的可视化管理。
    2.3 关键技术2.3.1 jQuery框架jQuery里面涵盖了html,css,js的基本元素,并且将这些我们使用频繁的元素进行了更好的优化,让程序员使用提供的比较舒服的体验,节省了许多的时间进行代码的书写。此项目中系统主页,与栏目的子页使用了此项技术。
    2.3.2 分页技术分页这个技术是使用mysql进行查询我所需要的数据,然后每个页面设置所能展示的数据条数,设置当前数据条数然后根据对数据的总数进行分页,可以点击页面数与上下页的链接进行页面之间的浏览。
    2.3.3 精准查询精准查询功能,因为身份证号码的唯一性,这个项目是根据订单表里面的身份证号来进行进准查询,管理员可以在订单展示界面,输入租赁人的身份证号,即可在大量数据中准确的找到该订单的详细信息。
    3 业务建模与设计3.1 系统的整体设计先要把这个程序的大概想出来,下面就是对系统代码的解说图3-1进行设计:

    文件夹介绍
    src文件夹下有bean包有Lease实体类(订单)和User实体类(登录用户);dao包下有两个的LeaseDao类和UserDao类,实现用户注册登录,订单的增删改查功能接口的方法; servlet包下有servlet接口及实现类, util包有打通数据库的Dbutil类。
    WebCt文件夹

    WebCt文件夹有系统需要用到的的jsp页面
    css文件夹涵盖项目网页需要用的的样式
    img文件夹涵盖项目网页需要用的图片
    js文件夹包含网页的动态代码
    META-INF文件夹:这个包用来配置控制程序的正常运行,使得功能可以运转。文件中的manifest.mf文件,是用jar打包时自动产生的
    WEB-INF文件夹:有一个web.xml配置文件

    3.2 业务用例建模3.2.1 角色分析此系统中有管理员一个角色,管理员可以可添加新的订单,对历史订单进行编辑,删除操作,可以使用身份证精准查询出租赁人的订单。
    3.2.2 用例分析如下是程序的关系,就是更好能看清系统的功能,这图为3-2(管理模块):

    从上面的用例图可以知道,这系统只有一个角色,就是管路员,管路员登录系统,能查询单子的信息,生成一个单子,把他给摧毁,edit某个单子的信息。
    3.3 业务流程建模由流程图图3-3 说明管理人员先进入网站,进行系统登入,如果没有注册信息就先注册信息再进入系统,进入系统后可以进行添加订单信息,编辑订单信息,删除订单信息,查询订单信息,退出系统等一系列操作。

    3.4 系统数据库的设计下面进行数据库的打样。要完成客户需求构建出E-R图。然后根据E-R图设计表单。
    3.4.1 E-R图设计订单信息的实体的E-R图,如图3-4所示:

    用户信息的实体的E-R图,如图3-5所示:

    3.4.2 物理表设计管理人员注册表
    (注:id是自增长的不需要输入,用户注册需要输入账号,密码,输入邮箱)

    客户信息表

    上面有两个数据库的表格,分别是客户信息表,用户信息表。
    客户信息表的成员有:id(主键,自增长的,标识为一,是实现删除功能,编辑功能的重要参数),Name(是租赁客户的名字),Phone(是客户的手机号码),IDcard(是客户的身份证号码,这个参数是用来辅助完成精准查询的重要参数),Cartype(是客户选择租赁的车型),Create date(是该笔订单生成的时间,用于订单列表展示,默认按创建日期降序排列)。
    4 系统的实现与应用4.1 登录注册功能模块4.1.1 登录注册功能第一次使用这款产品,需要先注册一个账号,方可进入项目进行后续操作。
    注册展示图

    登录展示图

    MySQL数据库管理人员注册表

    注册页面的前端代码

    登录的前端代码

    注册页面的dao层代码(DAO)

    注册的Servlet层

    登陆的dao层代码

    4.2 系统的管理功能模块4.2.1 添加订单信息管理人员进入系统添加客户信息

    MySQL数据库订单信息表

    添加订单的DAO层功能代码

    添加订单的Servlet层

    4.2.2 修改订单信息管理人员点击显示管理信息后点击操作下的编辑按钮跳转到如图:


    修改订单的DAO层功能代码

    修改订单的servlet代码,抓取要修改的订单数据,传入修改界面

    抓取修改后要保存的订单信息,保存到数据库

    4.2.3 删除订单信息管理员点击展示管理信息后操作栏目下有产出的按钮如图:

    删除功能的DAO层代码

    4.3 分页功能模块管理人员面对大量的数据需要进行合理的分页来管理,查看这些数据如图:


    分页功能Dao层代码

    分页功能servlet代码

    分页功能的JSP代码


    4.4 精准查询管理员可以根据订单租赁人的身份证号实施精准查询:


    精准查询的DAO层代码

    精准查询的servlet代码

    精准查询的JSP代码

    精准查询的dao层代码


    5 结论这三个月的独立开发周期,让自己成长了很多,对于Java面对象编程理解的更加深刻,像jsp如何把值传到后台,后台如何接受前端传过来的值,以前总是模棱两可,现在对这些小知识点掌握的程度更深,整个项目做下来,虽然功能都是一些简单的功能,但是真的实实在在的感受到了Java基础加强了一遍理解,也更有信心去投新的简历。
    10 评论 46 下载 2020-08-24 12:30:42 下载需要12点积分
显示 15 到 30 ,共 15 条
eject