# TakeawayGo **Repository Path**: SevDaisy/TakeawayGo ## Basic Information - **Project Name**: TakeawayGo - **Description**: ZUCC 2020 暑假短学期——数据库——外卖助手 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-07-03 - **Last Updated**: 2021-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TakeawayGo ## 日志 ### Day 1(7·3) - 今天做了什么: - 上午先试着画概念模型,然后发现给的EXCEL表格更接近于物理模型 - 于是概念模型画不下去,我就试着直接先写物理模型 - 然后又觉得,在写物理模型不如我自己直接去 Navicat 里面用爽利的 GUI界面建表 - 等在Navicat里面建了三个表,我又感觉这样不太行,太慢太傻 - 此时已经是中午十一点多了。 - 回首之前的迷惑行为,我痛定思痛,不再逃避不再偷懒© - 掏出纸笔,手绘了一波简版ER图,再照着ER图画概念模型,然后转成物理模型再导出SQL脚本 - 直到下午四点出头,第一版大体能用的SQL建表才做出来。于是开始写总结和反思 - 之后,在PD建表语句的基础上,先仅运行建表部分,然后用 Navicat 补充属性字段,自增属性,表和表项注释,然后用 Navicat 导出表的结构 - 晚上九点半,在 Navicat 完成了表的润色,并导出了SQL文件为`Navicat建表(无外键).sql` - 生成 PD建表脚本 Points: - Table name 不能有 Order User 之类的==关键字/保留字==,建议用 Orders 或 Users 代替 - 希望**删空已建**的表,如果有**循环外链导致无法删除**,==最方便==的办法是**直接==删库再重建==**,反正现在是空的库 - 建表脚本不应该被直接执行,可以先==只执行表的定义==部分,而约束条件的定义可稍后再运行 - 所谓的约束条件,主要是指外键。我真的==不想建外键==!!!它有什么用!明天问==问勇哥== - decimal(5,2) 的有效范围是:\[-999.99,999.99\] - 因此,starNum 设为 decimal(3,2)是不够的,应该设为decimal(4,2) - 今天晚上有一点点想把GUI草稿打出来的冲动 ### Day 5 (7·7) - 咳,我也不清楚自己前几天怎么进度这么慢是干什么吃的。 - 前几天实现的内容不再逐步复盘 - 从今天中午做完的地方继续做 - ==想要实现== 应用启动 用户登陆 用户点单 用户支付 用户确认收货 用户评论 这一条需求线的最小Demo - 应用启动,新建一个 `FrmLoading` 的`JFrame`, - `FrmLoading` 上设两个`JButton`,一个用于启动,另一个触发`System.exit(0);` - 点击 `启动程序`,唤出一个`FrmMain`,`FrmMain`就是加载了【用户|骑手|管理员】的主菜单面板 - `FrmMain`会让主菜单面板可见但是暂时为空,他同时唤起一个 `FrmLogin` 的登陆界面 - 在 `FrmLogin` 界面选择用户类型【用户|骑手|管理员】,然后按要求输入帐密,点击登陆 - `FrmLogin` 内的登录代码块设置 `Link.LoginAccountType` 为相关类型,并且设置相应的 `Link.currentUser` 等值为有效值 - `FrmLogin` 弹出弹窗提示登陆成功(这一效果是之前调试用的,一直懒得去除) - 确认此通知后,`FrmLogin` 设置自身为不可见,同时 `FrmMain` 主菜单面板刷新自身,根据 `Link.LoginAccountType` 刷新出按钮组 - 用户点击点单按钮后,后台调用 新唤起一个点单对话框`FrmUserGo`。 - 在 `FrmUserGo` 中分为三个 `JPanel` - 三个 `JPanel` 分别 `mdpTblPanel`,`orderInfoTablePanel`,`toolBarPanel` - `mdpTblPanel` 用来放 级联列表【商家信息|商品分类|商品信息】`this.getContentPane().add(*,BroderLayout.NORTH)` - `orderInfoTablePanel` 用来放 当前创建的订单商品项的完整信息,【商品名|数量|单品折扣金额|单品总售价】 - `toolBarPanel` 用来放订单操作按钮【放弃订单|购入|减少|结算】 - 想要把相关信息展示在`orderInfoTablePanel` - 先准备数据变量 ```java // private BeanOrderProjects currentOrderProjects = null; // 这个列表可以不需要知道哪一项被选中(知道了以后可以做优化,方便是会方便一点) private Object tblOrderProjectsTitles[] = BeanOrderProjects.tableTitles; private Object tblOrderProjectsData[][]; DefaultTableModel tabOrderProjectsModel = new DefaultTableModel(); private JTable dataTableOrderProjects = new JTable(tabOrderProjectsModel); List allOrderProjects = null; ``` - 其中 需要先设置为类添加静态字符串数组 `BeanOrderProjects.tableTitles` - 在 `src/zyy/model/BeanOrderProjects.java `中 - `public static final String[] tableTitles = { "商品名", "数量", "单品折扣金额", "单品总售价" };` - 编写`reload`函数用于重载数据 ```java public void reloadOrderProjectsable() { try { allOrderProjects = Link.orderInfoManager.loadAll(Link.currentOrder.getOrderID()); } catch (BaseException e) { JOptionPane.showMessageDialog(null, e.getMessage(), "错误", JOptionPane.ERROR_MESSAGE); return; } tblOrderProjectsData = new Object[allOrderProjects.size()][BeanOrderProjects.tableTitles.length]; for (int i = 0; i < allOrderProjects.size(); i++) { for (int j = 0; j < BeanOrderProjects.tableTitles.length; j++) tblOrderProjectsData[i][j] = allOrderProjects.get(i).getCell(j); } tabOrderProjectsModel.setDataVector(tblOrderProjectsData, tblOrderProjectsTitles); this.dataTableOrderProjects.validate(); this.dataTableOrderProjects.repaint(); } ``` - 其中,需要调用到`Link.OrderProjectsManager.loadAll(int OrderID)` - 这需要:`OrderProjectsManager.java` , 它里面的loadAll函数,Link里的静态变量定义 - 先在 `src/zyy/control` 里 新建文件 `OrderProjectsManager.java`,然后添加Link里的静态变量 `public static OrderProjectsManager orderInfoManager = new OrderProjectsManager();` - 在类里实现 loadAll 函数:要那些字段?需要确定 sql 语句,然后整理Java代码 - 根据`src/zyy/model/BeanOrderProjects.java `确认字段 ```java public static final String[] tableTitles = { "商品名", "数量", "单品折扣金额", "单品总售价" }; // 主键是: private int ProductID; private int OrderID; // 查询 Link.currentOrder 的 OrderID private int pName; // 商品名 private double opCnt;// 数量 private double opSum;// 单品总售价 private double opDiscount;// 单品折扣金额 ``` - 去Navicat里写sql查询 - `SELECT pName,opCnt,opSum,opDiscount from OrderProjects WHERE OrderID=1;` - 实现 loadAll(int OrderID) 的函数代码 ```java public List loadAll(int OrderID) throws DbException { List result = new ArrayList(); Connection conn = null; try { conn = DBUtil.getConnection(); String sql = "SELECT pName,opCnt,opSum,opDiscount from OrderProjects WHERE OrderID=?"; java.sql.PreparedStatement pst = conn.prepareStatement(sql); pst.setInt(1, OrderID); java.sql.ResultSet rs = pst.executeQuery(); while (rs.next()) { BeanOrderProjects p = new BeanOrderProjects(); result.add(p); } rs.close(); pst.close(); } catch (SQLException e) { e.printStackTrace(); throw new DbException(e); } finally { if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } return result; } ``` - 至此 reload 函数正常了 - 然后就可以把这个Table添加到`orderInfoTablePanel`里 ```java this.orderInfoTablePanel.add(new JScrollPane(this.dataTableOrderProjects)); // 这个列表可以不需要知道哪一项被选中(知道了以后可以做优化,方便是会方便一点) // this.dataTableOrderProjects.addMouseListener(new MouseAdapter() { // @Override // public void mouseClicked(MouseEvent e) { // int i = FrmUserGo.this.dataTableOrderProjects.getSelectedRow(); // if (i < 0) { // return; // } // } // }); ``` - 然后发现这个Panel只占了中间的那1/3宽度,为了把它调宽 ```java orderInfoTablePanel.setLayout(new BorderLayout());// 这一行实现了 宽度占满 这个功能 this.orderInfoTablePanel.add(new JScrollPane(this.dataTableOrderProjects), BorderLayout.CENTER); dataTableOrderProjects.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);// 这一行,似乎很厉害,暂时不知道具体效果 ``` - 用Navicat添加数据来看 - 成功了成功了 - 希望能用按钮来添加和减少商品。 - 准备最小Demo —— 按一下数量 `±1` (而不是调出设定数量的自定义窗口) - 确认 我能拿到当前选择的商品 ### Day 6 (7·8) ### Day 7 (7·9) - `骑手登录` —— `骑手接单` —— `骑手送单` —— `骑手查账` - ## 作业检查 ### Day 1 - ER图: 实际是 CDM/PDM 文件,保存在 /asset 下 - PD建表: /asset/PD建表脚本.sql - Navicate导出表结构: /asset/Navicat建表(无外键).sql #### 介绍 ZUCC 2020 暑假短学期——数据库——外卖助手 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)