结对第二次作业--编程实现

222000303陈博源 学生 2023-03-24 17:37:34
这个作业属于哪个课程2023年福大-软件工程实践-W班
这个作业要求在哪里结对第二次作业--编程实现
结对学号222000305、222000303
这个作业的目标实现澳网公开赛可视化程序
其他参考文献...

目录

  • git仓库链接和代码规范链接
  • 项目链接
  • PSP表格
  • 成品展示
  • 每日赛程
  • 选手排名
  • 晋级图
  • 结对讨论过程描述
  • 结对讨论
  • 功能结构图
  • 设计实现过程
  • 设计思路
  • 实际遇到的困难
  • 代码说明
  • 评价结对队友
  • 对陈宇焜的评价
  • 对陈博源的评价

git仓库链接和代码规范链接

结对项目git仓库链接
代码规范链接

项目链接

项目链接

  • 后台服务启动耗时较久,请耐心等待10s

    PSP表格

    PSPPersonal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning计划3030
    • Estimate• 估计这个任务需要多少时间3030
    Development开发16201815
    • Analysis• 需求分析(包括学习新技术)3060
    • Design Spec• 生成设计文档3015
    • Design Review• 设计复审3030
    • Coding Standard• 代码规范 (为目前的开发制定合适的规范)6090
    • Design• 具体设计120180
    • Coding• 具体编码600660
    • Code Review• 代码复审120130
    • Test• 测试(自我测试,修改代码,提交修改)630650
    Reporting报告10580
    • Test Repor• 测试报告00
    • Size Measurement• 计算工作量4540
    • Postmortem & Process Improvement Plan• 事后总结, 并提出过程改进计划6040
    合计17551925

成品展示

本次作业所需数据均爬取自澳大利亚网球公开赛官网【该爬取行为仅用于课程教学】

每日赛程

通过选择日期来切换不同日期的赛程,大赛期间的十四天都能够显示。首页默认是每日赛程。鼠标移动到某一场比赛时需要高亮或显示边框提示。

选手排名

左右显示男单女单前二十名的排名,为了让视觉观感好一点,相邻选手的颜色不同。

晋级图

通过选择比赛类型能看到不同比赛类型的晋级图。鼠标移动到某一场比赛时需要高亮或显示边框提示。

结对讨论过程描述

结对讨论

讨论了下预期的开发安排

img

json数据复杂,分工讨论了一下

img

实际上类直接互相关联,于是……

img

反馈了问题

img

功能结构图

  • 程序进入时首先看到每日赛程,并在顶部保持一个导航栏,可以切换不同界面。

    img

设计实现过程

设计思路

  1. UI:
  • 主页面通过JTabbedPane实现导航栏切换界面,首页为每日赛程。每日赛程界面使用ComboBox选择比赛时间来显示当天赛程,其中应用到CardLayout和JScrollPane,通过循环添加每日赛程子项来填充每日赛程界面。
  • 选手排名界面使用了GridLayout布局和JTable,左右分别显示男单和女单的排名。并通过builder类填充数据。
  • 晋级图可以使用递归的方式从最后一场比赛中遍历左右子树,并根据遍历深度。
  • 由于UI设计代码很多,还可以分离出logic类便于统一管理逻辑。
  1. 数据
  • 数据类根据UI需求设计数据类,并且晋级图的数据类可被每日赛程复用。
  • 可设计builder类从json数据中读取所需要的数据,实际读取方法来自工具类,最终可以map或list形式返回。
  • adapter类将builder类获取的数据转化为UI界面实际需要的数据和数据类型。

img

实际遇到的困难

1.由于父Panel使用BorderLayout导致GridLayout的grid显示出现问题

将GridLayout放在BorderLayout后,由于BorderLayout的中部或者上部会随组件大小改变而自动调整大小,导致Grid在只有一行时需要主动填充空白导致比例不对,
为了解决这个问题,尝试将BorderLayout改为GridLayout,但大小受约束,于是使用GridBagLayout。

2.JScrollPane里有数据却无法显示,原因时JPanel默认布局是FlowLayout,add()参数却使用了BorderLayout,

解决方法是布局设为BorderLayout。

3.本地测试Webswing无法启动程序

通过localhost访问时总是显示断开连接,查询了服务日志后发现java18版本不适用于Webswing

img


于是做了以下操作:1.重新构建项目为java17,2.配置本机java17环境,于是可以正常显示了。

4.部署程序出现的一系列问题

  • 保持进程挂起
    在退出远程访问的终端后,ECS上运行的Webswing也随之退出了,查询了很多资料,有两种解决办法:1.使用screen工具运行。2.使用nohup命令。
    在使用nohup时怎么都无法正确启动服务,即使已经给予权限。于是使用screen后台运行,测试后得到一个后台运行的进程,成功。
  • 无法通过公网访问
    无法使用公网打开正在运行的程序,于是从Webswing出发,查看了程序启动的相关配置,发现权限没有公开,设置好后继续检查访问路径,发现输入是80端口而不是8080。
    接下来可以正常访问了。
    另外,由于没了解清楚ECS的运作方式,中途还改动了ipv4地址导致无法远程连接,最终求助在线工程师。

代码说明

  • 通过循环从json数组中读取Competition的每个所需要的数据
        for (int i=0;i< matches.size();i++) {
            Competition cpt=new Competition();
            JSONObject match=matches.getJSONObject(i);
            //读取court名
            String courtId = (String) JSONPath.eval(match, "$.court_id");
            cpt.setCourt((String) findById(courtId,"courts","name"));
            //读取回合名
            String roundId = (String) JSONPath.eval(match, "$.round_id");
            cpt.setRound((String)findById(roundId,"rounds","name"));
            //读取比赛类型
            String eventId = (String) JSONPath.eval(match, "$.event_uuid");
            cpt.setMatchType((String)findById(eventId,"events","name"));
            //读取比赛状态
            String status= (String) JSONPath.eval(match,"$.match_status.name");
            cpt.setStatus(status);
            //读取比赛时长
            String duration= (String) JSONPath.eval(match,"$.duration");
            String[] time=duration.split(":");
            cpt.setDuration(time[0]+"h"+time[1]+"m");
            //读取比分
            JSONArray teams=match.getJSONArray("teams");
            setScores(teams,cpt);
            //读取选手信息
            setPlayers(cpt);
            list.add(cpt);
        }
  • 由于用到许多相互索引的id,并且需要跳转,封装fastjson的方法来复用,实际应用场景符合json数据格式
    private Object findById(String id, String arrayName,String back){
        JSONObject jsonObj= (JSONObject) object.getJSONArray(arrayName).stream()
                .filter(obj->((JSONObject)obj).getString("uuid").equals(id))
                .findFirst()
                .orElse(null);
        return JSONPath.eval(jsonObj,"$."+back);
    }
  • 主界面代码,通过JTabbedPane切换界面 ,这里还可以用绑定按钮监听的方式,但是代码需要更多。
    public MainForm() {
        super("澳大利亚网球公开赛2023");;
        tabbedPane = new JTabbedPane();
        scheduleForm = new ScheduleForm();
        rankForm = new RankForm();
        advanceForm = new AdvanceForm();

        tabbedPane.addTab("每日赛程",scheduleForm);
        tabbedPane.addTab("选手排名",rankForm);
        tabbedPane.addTab("晋级图",advanceForm);
        add(tabbedPane, BorderLayout.CENTER);

        String[] head=new String[]{"每日赛程","选手排名","晋级图"};
        for(int i=0;i<tabbedPane.getTabCount();i++){
            JPanel tab=new JPanel();
            tab.setPreferredSize(new Dimension(100,20));
            JLabel label=new JLabel(head[i]);
            tab.add(label);
            tabbedPane.setTabComponentAt(i,tab);
        }

        setSize(1200, 720);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
  • 每日赛程里需要循环生成赛程信息,根据自定义的Json工具类和builder类,需要预先从文件里读取再填充到组件上。
    由于一点点的短期历史遗留问题,只能先写死循环条件和字符串。
        // 从json数据中读取信息并通过builder转化为数据对象数组
    for (int d = 0; d < 14; d++) {
        String directoryName = "0" + date + ".json";
        JSONObject jsonObject = JsonParserUtil.readJsonObject("schedule/" + directoryName);
        date++;
        CompetitionsBuilder builder = new CompetitionsBuilder(jsonObject);
        ArrayList<Competition> arrayList = builder.build();
        // ……
}
        // 配置所需要生成的panel
        JScrollPane jScrollPane;
        JPanel scheduleJPanel1 = new JPanel(new GridLayout(0, 1, 1, 65));
        JPanel scheduleJPanel2 = new JPanel(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();
        JPanel scheduleJPanel3 = new JPanel(new GridLayout(0, 3, 15, 10));
        String courtName = "";
        for (int i = 0; i < arrayList.size(); i++) {
            Competition competition = arrayList.get(i);
                if (!courtName.equals(competition.getCourt())) {
                    courtName = competition.getCourt();

                }
            ScheduleItem scheduleItem = new ScheduleItem(competition);
            scheduleJPanel3.add(scheduleItem);
            if (i == arrayList.size() - 1 || !courtName.equals(arrayList.get(i + 1).getCourt())) {
                JLabel courtJLabel = new JLabel(courtName);
                Font font = new Font("Serif", Font.BOLD, 25);
                courtJLabel.setFont(font);
                courtJLabel.setMinimumSize(new Dimension(100, 30));
                c.gridx = 0;
                c.gridy = 0;
                c.weightx = 0;
                c.weighty = 0;
                c.anchor = GridBagConstraints.CENTER;
                scheduleJPanel2.add(courtJLabel, c);
                c.gridy++;
                c.weightx = 0;
                c.weighty = 0;
                c.anchor = GridBagConstraints.NORTH;
                JScrollPane pane = new JScrollPane(scheduleJPanel3);
                pane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 0));
                scheduleJPanel2.add(pane, c);
                scheduleJPanel1.add(scheduleJPanel2);
                scheduleJPanel2 = new JPanel(new GridBagLayout());
                scheduleJPanel3 = new JPanel(new GridLayout(0, 3, 15, 10));
            }
        }
        jScrollPane = new JScrollPane(scheduleJPanel1);
        jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPaneArrayList.add(jScrollPane);


评价结对队友

对陈宇焜的评价

代码能力好,读取JSON文件和页面逻辑代码是由他写的,说实话是真的好用。人也很好沟通交流,遇到问题的时候能够帮我解决、改BUG。和他一组做项目还算轻松,不会很累。

对陈博源的评价

能够及时发现我的错误并反馈,执行效率十分高,在推进项目进度时能够很好地完成所需要的部分并保证几乎无编译bug。善于发现和理解很多细节,比如帮助我分析json数据,检测bug等。

...全文
268 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

688

社区成员

发帖
与我相关
我的任务
社区描述
2023年福州大学软件工程实践课程W班的教学社区
软件工程团队开发软件构建 高校 福建省·福州市
社区管理员
  • FZU_SE_teacherW
  • 张书旖
  • 郭渊伟
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧