二次简化设计文档


  1. 开发目的:

    练手,熟悉入职需要用到的技能。

  2. 显性功能要求:

    功能 描述
    用户管理 多用户系统,有用户的概念。
    菜品列表 记录饭菜产品的名称、价格、外观等写死,供用户选择。
    用户下单 用户下单订购。
  3. 功能分析:

    发现必须的隐性支持功能。

    功能 描述
    id 类型 名称
    1






    用户管理 所有用户在此表统一管理,减少和功能的表数量。

    具备完整的增删改查能力。

    界面可以简单、丑。
    2 组管理 程序模块在数组或集合中写明 (写死) 可以使用此功能的组的 id 。

    具备完整的增删改查能力。

    界面可以简单、丑。
    3 [用户-组] 管理 记录用户和组的关联关系;
    即某个用户属于哪些组、某个组包含哪些用户;
    权限验证功能藉此决定当前用户是否有权执行指定的功能。

    具备完整的增删改查能力。

    界面可以简单、丑。
    4 菜品管理 记录饭菜产品的名称、价格;可能会记录图片的路径;

    具备完整的增删改查能力。

    界面可以简单、丑。

    评审展望未来时考虑:
    1. 增加图片上传。
    2. 将图上传的图片存入数据库。
    5 订单历史管理 记录订单历史数据,包括时间、地点、人物、事件、结果。

    具备完整的增删改查能力。

    界面可以简单、丑。
    - 通用
    功能

    用户身份认证 决定用户是否可以注册、认证及访问某些功能

    没有用户界面、但所有用户都会用到内部支持功能。
    11 用户登录 给所有人 (绝大多数是外部的订餐用户) 用,界面需要精美。
    13 用户注册 给所有人 (绝大多数是外部的订餐用户) 用,界面需要精美。

    考虑简化掉。
    14 菜品浏览 仅具备查询能力写死在页面上。

    给所有人 (绝大多数是外部的订餐用户) 用,界面需要精美。
    21 店方功能集 菜品管理 简化掉,通过向特定组开放 [系统维护·菜品管理] 功的权限来替代。

    具备完整的增删改查能力。

    界面可以简单、丑。
    22 订单查询 店方查询订单历史数据。

    仅具备查询能力。

    界面可以简单、丑。
    31 食客功能集 下单 给订餐用户 (绝大多数是外部用户) 用,界面需要精美。
    33 订单查询 食客查询自己的订单的历史数据。

    仅具备查询自己的订单的能力。

    给订餐用户 (绝大多数是外部用户) 用,界面需要精美。
  4. 表设计:

    1. 用户表

      直接为 [系统维护功能集·用户管理] 功能服务。

      通过 [通用功能集·用户身份认证] 功能间接服务于其他功能。

      建表语句 解释
      create table shine_user(
      	id     number(5)     primary key,
      	name   varchar2(40) not null unique,
      	passwd varchar2(40) not null,
      	remark varchar2(50)
      )
      表名
      ID 主键 (非空,唯一)
      登录名 非空,唯一
      登录密码 非空
      备注
      create sequence shine_seq_user_id start with 1 increment by 1;
    2. 组表

      直接为 [系统维护功能集·组管理] 功能服务。

      通过 [通用功能集·用户身份认证] 功能间接服务于其他功能。

      建表语句 解释
      create table shine_group(
      	id     number(...)   primary key,
      	name   varchar2(...) not null unique,
      	stat   boolean       not null,
      	remark varchar2(...)
      )
      表名
      ID 主键 (非空,唯一)
      组名 非空,唯一
      状态;true 为启用,false 为禁用 非空
      备注
      -
    3. [用户-组] 关联表

      直接为 [系统维护功能集·[用户-组] 管理] 功能服务。

      通过 [通用功能集·用户身份认证] 功能间接服务于其他功能。

      建表语句 解释
      create table shine_ugm(
      	id       number(...)   primary key,
      	user_id  number(...),
      	group_id number(...),
      	remark   varchar2(...)
      	CONSTRAINT ... (user_id, group_id)
      )
      表名
      ID 主键 (非空,唯一)
      用户 ID ,取自用户表 ID
      组 ID ,取自组表 ID
      备注
      约束 用户 ID 和组 ID 的组合不准重复
      -
    4. 产品表

      直接为 [系统维护功能集·菜品管理] 功能服务。

      间接服务于 [通用功能集·菜品浏览] 功能和 [食客功能集·下单] 功能。

      建表语句 解释
      create table shine_product(
      	id       number(...)   primary key,
      	name     varchar2(...) not null unique,
      	unit     varchar2(...) not null,
      	price    number(...)   not null,
      	img_path varchar2(...),
      	remark   varchar2(...)
      )
      表名
      ID 主键 (非空,唯一)
      饭菜名 非空,唯一
      单位,一份、一碗、3 个…… 非空
      单价 非空
      图片路径
      备注
      预留
    5. 订单历史表

      直接为 [食客功能集·下单] 功能服务。

      建表语句 解释
      create table shine_order(
      	id            number(5)     primary key,
      	user_id       number(5)     not null,
      	user_detail  varchar2(400) not null,
      	order_date   date          not null,
      	order_detail varchar2(50) not null,
      	order_sum    number(7,2)   not null,
      	remark       varchar2(100)
      )
      表名
      ID 主键 (非空,唯一)
      用户 ID 非空
      用户详细信息 非空
      发生日期 非空
      产品详细信息 非空
      金额小计 非空
      备注
      create sequence shine_seq_order_id start with 1 increment by 1;
  5. 水平层次设计、划分

    功能 \ 分层 UI 层 层间 控制器层 功能层
    描述 页面划分 控制器 控制逻辑 功能组件 支持组件
    系统
    维护
    功能

    1 用户管理 增删改查通用界面,
    可以简单、丑。
    1. 列表页:

      含有添加、详细、修改、删除按钮。

    2. 详细页:

      含有列表、添加、修改、删除按钮。

    3. 添加页:

      含有添加表单、保存、列表按钮。

    4. 结果页:

      自动重定向到列表页。

    XML 目标页:
    从 request

    中提取 XML
    节点树,
    输出为 XML
    文档。
    用户管理 正常流程主要步骤:
    1. 调用 [连接组件] 取得连接。

    2. 调用 [用户身份认证组件] 验证是否可以使用此功能。

    3. 调用 [本功能组件] 处理用户请求,产生原始响应数据。

    4. 无论好坏,调用 [连接组件] 关闭连接。

    5. 调用 [XML 包装组件] 处理原始响应数据,产生 XML 节点树。

    6. 将 XML 节点树存入 request 。

    7. 以“转发”方式跳转至目标页面。
      (按当前设计,只有一个目标页)

    错误流程:
    1. 调用 [XML 包装组件] 处理错误信息,产生 XML 节点树。

    2. 将 XML 节点树存入 request 。

    3. 以“转发”方式跳转至目标页面。
      (按当前设计,只有一个目标页)

    用户数据增删改查组件,依赖:
    • 用户表 DAO :
      • 全字段增
      • 分页查询
      • 按id查询
      • 按id全字段修改
      • 按id删除
    用户表 DAO :
    • 全字段增
    • 分页查询
    • 按id查询
    • 按id全字段修改
    • 按id删除
    • 特殊能力:↓
    • 按name查询
    2 组管理 组管理 组数据增删改查组件,依赖:
    • 组表 DAO :
      • 全字段增
      • 分页查询
      • 按id查询
      • 按id全字段修改
      • 按id删除
    组表 DAO :
    • 全字段增
    • 分页查询
    • 按id查询
    • 按id全字段修改
    • 按id删除
    • 特殊能力:↓
    • 按指定的多个id查询存
    3 [用户-组] 管理 [用户-组] 管理 [用户-组] 关联数据增删改查组件,依赖:
    • [用户-组] 关联表 DAO :
      • 全字段增
      • 分页查询,关联用户表和组表
      • 按id查询,关联用户表和组表
      • 按id全字段修改
      • 按id删除
    [用户-组] 关联表 DAO :
    • 全字段增
    • 分页查询,关联用户表和组表
    • 按id查询,关联用户表和组表
    • 按id全字段修改
    • 按id删除
    • 特殊能力:↓
    • 按用户id查询
    4 菜品管理 菜品管理 菜品增删改查组件,依赖:
    • 菜品表 DAO :
      • 全字段增
      • 分页查询
      • 按id查询
      • 按id全字段修改
      • 按id删除
    菜品表 DAO :
    • 全字段增
    • 分页查询
    • 按id查询
    • 按id全字段修改
    • 按id删除
    5 订单历史管理 订单历史管理 订单历史增删改查组件,依赖:
    • 订单历史 DAO
    订单历史表 DAO :
    • 全字段增
    • 分页查询
    • 按id查询
    • 按id全字段修改
    • 按id删除
    • 特殊能力:↓
    • 按用户id分页查询
    • 按id和用户id查询
    通用
    功能

    - 用户身份认证 没有。 用户身份认证 特殊,未定。 用户身份认证组件,依赖:
    • 用户表 DAO :
      • 按id查询
      • 特殊条件查询:
        按name查询(以比对passwd)
    • [用户-组] 关联表 DAO :
      • 特殊条件查询:
        按用户id查询
    • 组表 DAO :
      • 特殊条件查询:
        按指定的多个id查询存在性和stat
    数据库连接组件:
    • 从连接池获取连接
    • 关闭一切可关闭的东西
    11 用户登录 专用界面,
    要精美。
    1. 登录页:
      含有用户名和密码输入区及登录按钮。

    2. 注册页:
      含有用户名和密码输入区及注册按钮。

    3. 结果页:
      自动重定向到首页。

    4. 首页:
      含有到各功能页面的链接。

    正常流程主要步骤:
    1. 调用 [连接组件] 取得连接。

    2. 调用 [用户身份认证组件] 验证此用户是否可以登录,
      产生原始响应数据。

    3. 无论好坏,调用 [连接组件] 关闭连接。

    4. 调用 [XML 包装组件] 处理原始响应数据,产生 XML 节点树。

    5. 将 XML 节点树存入 request 。

    6. 以“转发”方式跳转至目标页面。
      (按当前设计,只有一个目标页)

    启动组件:
    • 以可配置的方式检查是否所有所需组件已加载;如果没有,则加载。
    12 用户注册 用户注册 正常流程主要步骤:
    1. 调用 [连接组件] 取得连接。

    2. 调用 [用户身份认证组件] 验证此用户是否可以注册。

    3. 调用 [本功能组件] 处理用户请求,产生原始响应数据。

    4. 无论好坏,调用 [连接组件] 关闭连接。

    5. 调用 [XML 包装组件] 处理原始响应数据,产生 XML 节点树。

    6. 将 XML 节点树存入 request 。

    7. 以“转发”方式跳转至目标页面。
      (按当前设计,只有一个目标页)

    用户注册组件,依赖:
    • 用户表 DAO :
      • 全字段增
    XML 包装组件:
    • 把执行结果、状态包装成 DOM 结果节点
    • 把通用 DQL 结果包装成 DOM 列表节点
    • 把其他特别的东西包装成 DOM 节点
    13 菜品浏览
    1. 菜品浏览页:
      可以多选,加入纯前端“购物车”;
      前端 JavaScript 处理完成后才提交。

    菜品浏览 - 菜品查询组件,依赖:
    • 菜品表 DAO :
      • 分页查询
      • 按id查询
    店方
    功能

    22 订单查询 增删改查通用界面,
    可以简单、丑。
    订单查询 店方订单查询组件,依赖:
    • 订单历史表 DAO :
      • 分页查询
      • 按id查询
    食客
    功能

    31 下单 专用界面,
    要精美。
    1. 下单结果页。
    下单 正常流程主要步骤:
    1. 调用 [连接组件] 取得连接。

    2. 调用 [用户身份认证组件] 验证是否可以使用此功能。

    3. 调用 [本功能组件] 处理用户请求,产生原始响应数据。

    4. 无论好坏,调用 [连接组件] 关闭连接。

    5. 调用 [XML 包装组件] 处理原始响应数据,产生 XML 节点树。

    6. 将 XML 节点树存入 request 。

    7. 以“转发”方式跳转至目标页面。
      (按当前设计,只有一个目标页)

    订单生成组件,依赖:
    • 订单历史表 DAO :
      • 全字段增
    32 订单查询
    1. 列表页。
    订单查询 食客订单查询组件,依赖:
    • 订单历史表 DAO :
      • 特殊条件查询:
        按用户id分页查询
      • 特殊条件查询:
        按id和用户id查询
  6. 任务清单

    任务类型、序号 任务包 规划 功能要求 实现 执行人




    1.1 项目目录结构组织 完成。
    项目根目录 (待命名)
    |
    |-	doc/ (文档目录)
    |	|
    |	|-	design_doc/ (设计文档目录)
    |	|
    |	`-	java_doc/ (半自动生成的 API 文档目录)
    |
    |-	WebContent/ (要部署到 Tomcat 的内容)
    |	|
    |	|-	gsm/ (Group.Shine.Meal-Ording-System ,亮亮组订餐系统)
    |	|	|
    |	|	|-	css/ (CSS 文件存放路径)
    |	|	|
    |	|	|-	images/ (图片文件存放路径)
    |	|	|	|
    |	|	|	|-	big/ (用作前景、背景的大图片)
    |	|	|	|
    |	|	|	`-	icons/ (图标文件存放路径)
    |	|	|
    |	|	|-	javascript/ (JavaScript 文件存放路径)
    |	|	|	|
    |	|	|	|-	jquery/ (jQuery 文件存放路径)
    |	|	|	|	|
    |	|	|	|	`-	…….js (jQuery 文件)
    |	|	|	|
    |	|	|	`-	……/ (自定义 JavaScript 文件存放路径)
    |	|	|		|
    |	|	|		|-	…….js (自定义 JavaScript 文件)
    |	|	|		|-	…….js
    |	|	|		`-	…….js
    |	|	|
    |	|	`-	pages/ (页面存放路径)
    |	|		|
    |	|		|-	…….html (页面)
    |	|		|-	…….html
    |	|		|-	…….jsp
    |	|		`-	…….jsp
    |	|
    |	`-	WEB-INF/ (站点核心目录)
    |		|
    |		|-	web.xml (站点核心配置文件)
    |		|
    |		|-	conf/ (配置文件存放路径)
    |		|	|
    |		|	|-	db.conf (数据库连接配置文件)
    |		|	|
    |		|	`-	servlet_frg.xml (Servlet 配置片段文件)
    |		|
    |		|-	src/ (Java 源代码存放路径)
    |		|	|
    |		|	`-	group.shine.mos (主包名:亮亮组餐饮订单系统)
    |		|		|
    |		|		|-	info.txt (项目文件列表及变更记录)
    |		|		|
    |		|		|-	basement (和数据库不直接相关的基础支持类包)
    |		|		|
    |		|		|-	controller (控制器类所在包)
    |		|		|
    |		|		|-	db (数据库操作类所在包)
    |		|		|	|
    |		|		|	`-	dao (DAO 类所在包)
    |		|		|		|
    |		|		|		`-	oracle (用于 Oracle 数据库的 DAO 类所在包)
    |		|		|
    |		|		|-	entity (实体类所在包)
    |		|		|
    |		|		`-	function (功能组件所在包)
    |		|
    |		|-	classes/ (编译后的 Java 二进制程序存放路径)
    |		|	|
    |		|	|-	…….class (编译后的 Java 二进制程序)
    |		|	|-	…….class
    |		|	`-	…….class
    |		|
    |		|-	lib/ (压缩的 Java 二进制程序存放路径)
    |		|	|
    |		|	|-	tfw-base.aij.jar (基本工具包)
    |		|	|
    |		|	|-	tfw-web-base.aij.jar (和 web 相关的工具包)
    |		|	|
    |		|	|-	…….jar (压缩的 Java 二进制程序)
    |		|	|-	…….jar
    |		|	`-	…….jar
    |		|
    |		`-	pages/ (被保护的页面的存放路径)
    |			|
    |			|-	…….html (被保护的页面)
    |			|-	…….html
    |			|-	…….jsp
    |			`-	…….jsp
    |
    |-	tmp/ (杂七杂八的文件的临时堆放处)
    |
    `-	export.sh (项目打包、导出脚本)
    
    完成。 计念
    1.2 公共项目搭建 完成。 SVN URL :http://svn.tedu.cn/svn/1607se/admin72/tedu_shine_mos
    用 户 名:admin72
    密    码:ipekms
    完成。 计念
    1.3 统一运行及开发环境 X 统一运行及开发环境:
    1. 确认项目组各机 $JAVA_HOME 、$CATALINA_HOME 、$PATH 、$CLASSPATH 已配置好。

    2. 确认项目组各机可独立运行小型 Java 程序及 Tomcat ,Tomcat 可管理。

    3. 确认项目组各机 Eclipse 安装了 Tomcat 插件;初步教使用 Tomcat 插件,供自愿使用。

    4. 确认项目组各机可正常操作 SVN 。

    X 计念




    2.1 富信息结果 完成。

    group.shine.mos.basement.result._boolean.BooleanResult

    group.shine.mos.basement.result._int.IntResult

    含有丰富的参考信息的返回结果:

    • isOK()

      返回“执行是否成功”标志。

    • getContent()

      返回结果中包含的有效内容。

    • getTextDescription()

      返回结果的文本描述。

    • getThrowable()

      返回结果中携带的异常。

    完成。 计念
    2.2 启动组件 X 启动组件,检查以下项是否已加载;未加载则加载:
    • 数据库连接组件
    • UserDAO
    • GroupDAO
    • UgmDAO
    • ProductDAO
    • OrderDAO
    X 未分配
    2.3 数据库连接组件 完成。

    group.shine.mos.db.DBTool

    • 成员变量:
      • datasource

        一个连接池对象。

    • 功能:
      • connectT(String strFileName)

        从文件中读取配置信息,连接数据库; 如果连接成功,返回:
        [true, 数据库连接, "Connected.", null]; 如果连接过程发生异常,抛出此异常。

      • connectP(String strFileName)

        调用 connectT(String strFileName) ; 如果发生异常,打印异常并返回:
        [false, 数据库连接, "Failed.", 导致连接失败的异常]

      • connectE(String strFileName)

        调用 connectT(String strFileName) ; 如果发生异常,返回:
        [false, 数据库连接, "Failed.", 导致连接失败的异常] (不打印任何东西,贪污掉)

      • closeT(Object o)

        检查传入的对象,如果为空,返回 [false, o, "null.", null]
        如果不是 AutoCloseable 类型;如果不是,返回 [false, o, "Not closable.", null]
        如果是 Connection 类型,检查此对象是否已关闭;
        关闭此对象;如果关闭成功,返回 [true, o, "Closed.", null];否则返回 [false, o, "Failed.", null]
        如果发生异常,抛出异常。

      • closeP(Object o)

        调用 closeT(Object o) ; 如果发生异常,打印异常并返回:
        [false, o, "Failed.", 导致连关闭败的异常]

      • closeE(Object o)

        调用 closeT(Object o) ; 如果发生异常,返回:
        [false, o, "Failed.", 导致连关闭败的异常] (不打印任何东西,贪污掉)

      • finalize(...)

        关闭连接池。

    完成。 计念、段新伟
    2.4 DOM 包装组件 完成。

    group.shine.mos.basement.DomTool

    • 功能:
      • data2dom(Object objStat, String strTextDesc, Throwable t, String[] str1dColNames, Object[][] o2dValueMatrix)

        将传入的数据包装成 DOM 树,形如:

        "result"
        |
        |-	属性:stat (状态) 、desc (文字描述)
        |
        |-	子节点 rows (行)
        |	|
        |	|-	子节点 row (行)
        |	|	|
        |	|	`-	属性:字段名="值" 字段名="值" 字段名="值" ……
        |	|
        |	|-	子节点 row (行)
        |	|-	……
        |	`-	子节点 row (行)
        |
        `-	子节点 exception
        	|
        	`-	文本内容:e.toString()
        
        返回 DOM 对象。
    完成。 计念



    3.1 用户实体类 完成。

    group.shine.mos.entity.User

    • 成员变量:
      • 见数据库表
    • 功能:
      • 各字段的 setter / getter

      • User()

        无参构造方法,需要用 setter 设置各字段的值。

      • User(...)

        有参构造方法,构造的同时设置好各字段的值。

      • toString()

        在一行内输出:“字段名=字段值, 字段名=字段值, …… 字段名=字段值”。

      • getColumnNames()

        返回字段名数组。

      • getColumnValues()

        按和字段名数组相同的顺序,生成和返回字段值数组。

    完成。 刘雄、陈建君
    3.2 组实体类 基本完成,
    零星调整。

    group.shine.mos.entity.Group

    • 成员变量:
      • 见数据库表
    • 功能:
      • 各字段的 setter / getter

      • Group()

        无参构造方法,需要用 setter 设置各字段的值。

      • Group(...)

        有参构造方法,构造的同时设置好各字段的值。

      • toString()

        在一行内输出:“字段名=字段值, 字段名=字段值, …… 字段名=字段值”。

      • getColumnNames()

        返回字段名数组。

      • getColumnValues()

        按和字段名数组相同的顺序,生成和返回字段值数组。

    X 未分配
    3.3 [用户-组] 关联实体类 基本完成,
    零星调整。

    group.shine.mos.entity.UserGroupMapping

    • 成员变量:
      • 见数据库表
    • 功能:
      • 各字段的 setter / getter

      • UserGroupMapping()

        无参构造方法,需要用 setter 设置各字段的值。

      • UserGroupMapping(...)

        有参构造方法,构造的同时设置好各字段的值。

      • toString()

        在一行内输出:“字段名=字段值, 字段名=字段值, …… 字段名=字段值”。

      • getColumnNames()

        返回字段名数组。

      • getColumnValues()

        按和字段名数组相同的顺序,生成和返回字段值数组。

    X 未分配
    3.4 菜品实体类 基本完成,
    零星调整。

    group.shine.mos.entity.Product

    • 成员变量:
      • 见数据库表
    • 功能:
      • 各字段的 setter / getter

      • Product()

        无参构造方法,需要用 setter 设置各字段的值。

      • Product(...)

        有参构造方法,构造的同时设置好各字段的值。

      • toString()

        在一行内输出:“字段名=字段值, 字段名=字段值, …… 字段名=字段值”。

      • getColumnNames()

        返回字段名数组。

      • getColumnValues()

        按和字段名数组相同的顺序,生成和返回字段值数组。

    X 未分配
    3.5 订单历史实体类 完成。

    group.shine.mos.entity.Order

    • 成员变量:
      • 见数据库表
    • 功能:
      • 各字段的 setter / getter

      • Order()

        无参构造方法,需要用 setter 设置各字段的值。

      • Order(...)

        有参构造方法,构造的同时设置好各字段的值。

      • toString()

        在一行内输出:“字段名=字段值, 字段名=字段值, …… 字段名=字段值”。

      • getColumnNames()

        返回字段名数组。

      • getColumnValues()

        按和字段名数组相同的顺序,生成和返回字段值数组。

    完成。 刘雄、陈建君
    DAO

    4.0 通用抽象 DAO 完成。

    group.shine.mos.db.dao.oracle.GenericDAO<T>

    • 成员变量:
      • String strTableName

        表名——必须是真正的表、或者允许写入的简单视图。

      • String[] strIdColumnName

        字段名。

      • String strIdColName

        ID 字段名

      • String strQueryTableName

        查询用的表名——这个“表”可以不是一个真正的表,而是联合查询拼出的虚拟表或者视图。

      • String[] str1dQueryColumnNames

        查询用的字段名。

    • 主要功能:
      • GenericDAO(String strTableName, String[] str1dColumnNames, String strIdColumnName, String strQueryTableName, String[] str1dQueryColumnNames)

        构造 DAO 对象及 SQL 模板。

      • save(Connection cnct, Bean<T> bean)

        按构造时传入的字段顺序将 bean 拆解成数组,
        拼 DML (无视 bean 自身携带的 id),将单条记录插入表中,
        将插入产生的 id 填回 bean 中,返回插入结果:
        [状态, Bean<T>, 文字描述, 异常]

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

        按构造时传入的字段名拼 DQL ,做分页查询
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean 列表,
        返回查询结果:
        [状态, 列表<Bean<T>>, 文字描述, 异常]

      • findById(Connection cnct, Object objId)

        按照 id 查询单条记录
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean ,
        返回查询结果:
        [状态, Bean<T>, 文字描述, 异常]

      • updateById(Connection cnct, Bean<T> bean)

        按构造时传入的字段顺序将 bean 拆解成数组,
        拼 DML ,按照 bean 携带的 id 修改单条记录 (注意 id 为 null 时不得执行)
        返回修改结果:
        [状态, 影响的行数, 文字描述, 异常]

      • removeById(Connection cnct, Object objId)

        按照 id 删除单条记录 (注意 id 为 null 时不得执行)
        返回修改结果:
        [状态, 影响的行数, 文字描述, 异常]

    • 辅助功能:
      • bean2array(Bean bean)

        按构造时传入的字段顺序将 Bean 拆解成数组,供 SQL 操作用,
        由子类实现。

      • array2bean(Object[] o1dRecord)

        按构造时传入的字段顺序将数组构建成 Bean ,供上层逻辑用,
        由子类实现。

      • getXXX()

        供子类访问本类的私有字段。

    完成。 计念
    4.0.1 验证 SQL 语句 完成。 验证 SQL 语句:
    • id 列绑定序列的表的插入语句。
    • Java 程序插入数据从 PreparedStatement 取得 id 列的之。
    完成。 计念
    4.1 用户表 DAO 完成。

    group.shine.mos.db.dao.oracle.UserDAO

    • 成员变量:
      • -
    • 由基类完成的通用功能:
      • save(Connection cnct, User bean)

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

      • findById(Connection cnct, Object objId)

      • updateById(Connection cnct, User bean)

      • removeById(Connection cnct, Object objId)

    • 由本类完成的特殊功能:
      • UserDAO(String strQueryTableName, String[] str1dQueryColNames, String strUpdateTableName, String[] str1dUpdateColNames, strIdColName)

        调用基类构造函数,传入构造所用的参数。

      • findByName(Connection cnct, User bean)

        按构造时传入的字段名拼 DQL ,按照 bean 携带的 name 查询所有记录
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean 列表,
        返回查询结果:
        [状态, 列表<User>, 文字描述, 异常]

    完成。 计念
    4.2 组表 DAO X 组表 DAO :
    • 成员变量:
      • -
    • 由基类完成的通用功能:
      • save(Connection cnct, Group bean)

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

      • findById(Connection cnct, Object objId)

      • updateById(Connection cnct, Group bean)

      • removeById(Connection cnct, Object objId)

    • 由本类完成的特殊功能:
      • GroupDAO(String strQueryTableName, String[] str1dQueryColNames, String strUpdateTableName, String[] str1dUpdateColNames, strIdColName)

        调用基类构造函数,传入构造所用的参数。

      • findByIds(Connection cnct, Object[] o1dIds)

        按构造时传入的字段名拼 DQL ,按照当前传入的各 id 查询所有记录
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean 列表,
        返回查询结果:
        [状态, 列表<Group>, 文字描述, 异常]

    X 未分配
    4.3 [用户-组] 关联表 DAO X [用户-组] 关联表 DAO :
    • 成员变量:
      • -
    • 由基类完成的通用功能:
      • save(Connection cnct, UGM bean)

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

      • findById(Connection cnct, Object objId)

      • updateById(Connection cnct, UGM bean)

      • removeById(Connection cnct, Object objId)

    • 由本类完成的特殊功能:
      • UgmDAO(String strQueryTableName, String[] str1dQueryColNames, String strUpdateTableName, String[] str1dUpdateColNames, strIdColName)

        调用基类构造函数,传入构造所用的参数。

      • findByUserId(Connection cnct, Object objUserId)

        按构造时传入的字段名拼 DQL ,按照当前传入的用户 id 查询所有记录
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean 列表,
        返回查询结果:
        [状态, 列表<UGM>, 文字描述, 异常]

    X 未分配
    4.4 菜品表 DAO X 菜品表 DAO :
    • 成员变量:
      • -
    • 由基类完成的通用功能:
      • save(Connection cnct, Product bean)

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

      • findById(Connection cnct, Object objId)

      • updateById(Connection cnct, Product bean)

      • removeById(Connection cnct, Object objId)

    • 由本类完成的特殊功能:
      • ProductDAO(String strQueryTableName, String[] str1dQueryColNames, String strUpdateTableName, String[] str1dUpdateColNames, strIdColName)

        调用基类构造函数,传入构造所用的参数。

    X 未分配
    4.5 订单历史表 DAO 完成。

    group.shine.mos.db.dao.oracle.OrderDAO

    • 成员变量:
      • -
    • 由基类完成的通用功能:
      • save(Connection cnct, Order bean)

      • list(Connection cnct, int intPageStartSeq, int intPageSize)

      • findById(Connection cnct, Object objId)

      • updateById(Connection cnct, Order bean)

      • removeById(Connection cnct, Object objId)

    • 由本类完成的特殊功能:
      • OrderDAO(String strQueryTableName, String[] str1dQueryColNames, String strUpdateTableName, String[] str1dUpdateColNames, strIdColName)

        调用基类构造函数,传入构造所用的参数。

      • findByUserId(Connection cnct, Object objUserId, int intPageStartSeq, int intPageSize)

        按构造时传入的字段名拼 DQL ,按照当前传入的用户 id 分页查询所有记录
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean 列表,
        返回查询结果:
        [状态, 列表<Order>, 文字描述, 异常]

      • findByIdAndUserId(Connection cnct, Object objId, Object objUserId)

        按构造时传入的字段名拼 DQL ,按照当前传入的 id 和用户 id 查询
        按构造时传入的查询字段名从结果集中提取数据、构建 Bean ,
        返回查询结果:
        [状态, Order, 文字描述, 异常]

    完成。 计念





    5.1 系统维护功能集·用户管理 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 UserDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]
      注意:过滤掉密码字段!

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]
      注意:过滤掉密码字段!

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]
      注意:过滤掉密码字段!

    • updateById(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]
      注意:过滤掉密码字段!

    • removeById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, 影响的行数, 文字描述, 异常]

    X 未分配
    5.2 系统维护功能集·组管理 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 GroupDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • updateById(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • removeById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, 影响的行数, 文字描述, 异常]

    X 未分配
    5.3 系统维护功能集·[用户-组] 关联管理 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 UgmDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • updateById(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • removeById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, 影响的行数, 文字描述, 异常]

    X 未分配
    5.4 系统维护功能集·菜品管理 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 ProductDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • updateById(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • removeById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, 影响的行数, 文字描述, 异常]

    X 未分配
    5.5 系统维护功能集·订单历史管理 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 OrderDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • updateById(...)

      从 request 中取得参数,封装成 bean ,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • removeById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, 影响的行数, 文字描述, 异常]

    X 未分配
    5.11 通用功能集·用户身份认证 完成。 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 UserDAO 是否存在,不存在则创建,用其类名充当 key ;
      检查 GroupDAO 是否存在,不存在则创建,用其类名充当 key ;
      检查 UgmDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • login(...)

      从 request 中取得参数,封装成 bean ,调用 UserDAO 根据用户名查询用户记录,
      判断记录是否存在、是否重复,及验证用户密码,
      过滤掉密码字段,在 session 中放置登录标志,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • userInf(...)

      调用 UserDAO 根据用户 id 查询用户记录,
      过滤掉密码字段,返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    • logout(...)

      消除当前用户的登录标志,返回操作结果:
      [状态, null, 文字描述, 异常]

    • checkPermission(...)

      检查当前用户是否存在;
      检查当前用户所属的组;
      检查当前用户所属的组有多少是有效的;
      检查当前用户所属的有效组是否和给定的组id (某个功能中写死的组id的数组) 有交集:
      [状态, null, 文字描述, 异常]

    完成。 计念
    5.13 通用功能集·用户注册 完成。 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 UserDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • register(...)

      从 request 中取得参数,封装成 bean ,
      调用 UserDAO 根据用户名查询用户记录,判断记录是否存在、是否重复、是否可注册,
      调用 UserDAO 插入用户记录,过滤掉密码字段,返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    完成。 计念
    5.14 通用功能集·菜品浏览 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 ProductDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    X 未分配
    5.21 店方功能集·订单查询 X 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 OrderDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • list(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值矩阵], 文字描述, 异常]

    • findById(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,
      返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    X 未分配
    5.31 食客功能集·下单 完成。 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 OrderDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • save(...)

      从 request 中取得参数,拼装出完整的订单信息
      封装成 bean ,调用 DAO 进行数据库操作,返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    完成。 计念
    5.32 食客功能集·订单查询 完成。 接收 request 中的参数,据此调用 DAO ,实现数据操作:
    • operate(...)

      公用入口方法:
      检查 OrderDAO 是否存在,不存在则创建,用其类名充当 key ;
      从 request 中取得参数,以此决定调用下述某个具体功能。

    • findByIdAndUserId(...)

      从 request 中取得参数,调用 DAO 进行数据库操作,返回操作结果:
      [状态, [字段名数组, 字段类型数组, 字段值数组], 文字描述, 异常]

    完成。 计念




    6.1 控制器 1 完成。 集中式控制器:
    • service(HttpRequest request, HttpResponce response)

      控制器方法,执行逻辑:

      1. 检查请求中携带的功能号,决定是否需要连接数据库
        (例如“注销”,目前考虑不需要连接数据库) 。

      2. 如果需要连接数据库,检查 [数据库连接组件] 是否存在;
        如果不存在则创建,用其类名做 key ;创建失败则转程序出错处理。

      3. 如果需要连接数据库,调用 [数据库连接组件] 取得数据库连接。

      4. 检查请求中携带的功能号,决定是否需要做身份认证
        (例如“注销”,目前考虑不需要做身份认证) 。

      5. 如果需要做身份认证,检查 [用户身份认证组件] 是否存在;
        如果不存在则创建,用其类名做 key ;创建失败则转程序出错处理。

      6. 调用 [用户身份认证组件] 的 operation(...) ,检查当前用户是被允许使用所请求的功能;
        如果检查不通过,转业务出错处理。

      7. 检查功能号对应的 [业务功能组件] 是否存在;
        如果不存在则创建,用其类名做 key ;创建失败则转程序出错处理。

      8. 调用 [业务功能组件] 的 operation(...) ,
        [业务功能组件] 进一步从 request 中提取参数、决定具体操作行为;
        取得 (正确或错误的) 操作结果。

      9. 无论前述流程中是否有错误,调用 [数据库连接组件] 关闭 (或归还) 数据库连接
        (null 或连接已关闭之类状况由 [数据库连接组件] 智能处理) 。

      10. 检查 [XML 包装组件] 是否存在,如果不存在则创建,用其类名做 key ;
        创建失败则转输出出错处理。

      11. 调用 [XML 包装组件] 的 operate(...) ,将原始操作结果包装为 DOM 树。

      12. 将 DOM 树转发至 [XML 目标页] ,由其生成 XML 文档,发给浏览器。

    完成。 计念
    服务器端 View 层 6.1 XML 目标页 完成。 从 request 中取得 DOM 树,格式化成 XML 文档。 完成。 计念


    UI
    7.1 多功能动态边栏、消息栏 完成。 由 JavaScript 动态生成公共边栏和消息栏、动态绑定函数,
    提供用户信息刷新、注销及多种 AJAX 回调函数。

    各页面只需要引用相关的 JavaScript 文件和 CSS 文件,
    即可产生公共边栏、消息栏,并使用相关功能; 无需在页面另行插入 HTML ,不污染原页面。
    完成。 计念
    7.2 综合功能样板页 完成。 未美化的综合功能样板页,供前端组员参考。 完成。 计念
    7.3 食客历史订单页 完成。 纯 AJAX 分页显示食客历史订单。 完成。 计念
    7.4 登陆、注册页面 完成。 完成用户登录及注册功能 完成。 王亮
    7.5 餐厅选择页面 完成。 用户餐厅选择功能 完成。 孙新祥
    7.6 菜品挑选页面 完成。 用户进行菜品挑选操作 完成。 段新伟
    7.7 购物车、支付页面 完成。 用户查看购物车,下单功能 完成。 龚建秋
    Oracle 8.1 相关数据存储 完成。 用户资料,历史订单存储 完成。 钟付航