团队项目冲刺-day2

news/2024/11/17 19:17:44/文章来源:https://www.cnblogs.com/CuteDucK/p/18550926

每天举行站立式会议

昨天已完成的工作

成员 任务
徐嘉炜 组织会议,说明项目进度,指导项目发展
陈祥意 参与会议,简要讲述应用程序测试的各个模块
林楦 参与会议,讲述有关功能界面的UI开发
陈大锴 参与会议,协调开发技术与实际需求,记录需求
蔡家显 参与会议,讲述测试时的注意事项
陈祖民 参与会议,讲述有关登录界面的UI开发
肖商 参与会议,详细讲述测试模块的测试用例

今天计划完成的工作

成员 任务
徐嘉炜 开发登录界面交互逻辑
陈祥意 测试网络API
林楦 开发注册UI界面
陈大锴 开发注册界面交互逻辑
蔡家显 汇总测试记录
陈祖民 开发登录UI界面
肖商 生成各个测试模块的测试案例

工作中遇到的困难

UI界面与交互逻辑开发需要同步,所以需要UI组付出比较大的努力。

项目燃尽图

适当的项目程序/模块的最新(运行)截图

最新模块的代码

package com.timi.musicimport android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompatclass MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_main)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)insets}}
}package com.timi.musicimport android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.Navigation
import com.google.android.material.snackbar.Snackbar
import com.timi.music.databinding.FragmentLoginBinding
import com.timi.utils.Logger
import com.timi.utils.isClickEffective
import com.timi.utils.makeToastclass LoginFragment : Fragment(), OnClickListener {companion object{private const val TAG = "LoginFragment"}private lateinit var binding: FragmentLoginBindingprivate lateinit var navController: NavControllerprivate val loginViewModel: LoginViewModel by lazy {ViewModelProvider(this)[LoginViewModel::class.java]}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {binding = FragmentLoginBinding.inflate(inflater, container, false)return binding.root}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {navController = Navigation.findNavController(view)observeChange()initListener()if (Logger.currentLevel < 5){binding.btnLoginFragmentTest.visibility = View.GONE}}/*** 检测LoginViewModel中变量的变化*/private fun observeChange(){loginViewModel.apply {//验证码发送返回结果captchaCode.observe(viewLifecycleOwner){if (it != 0){if (it == 200){Logger.i(TAG, "登录验证码发送成功.")makeToast("验证码发送成功!")}else{Logger.i(TAG, "验证码发送失败.")makeToast("验证码发送失败!请检查你的手机号是否正确!")}captchaCode.value = 0   //重置变量}}//游客登陆返回结果touristData.observe(viewLifecycleOwner){it?.apply {if (this.code == 200){//登录后跳转至主程序Logger.i(TAG, "游客登陆成功.")makeToast("游客登陆成功!")//携带cookie跳转至CentreActivitystartActivity(Intent(context, CentreActivity::class.java).apply {//toString防止cookie为null引发空指针异常putExtra("cookie", cookie.toString())})}else{Logger.w(TAG, "游客登陆失败.")makeToast("游客登陆失败")}touristData.value = null}}}}private fun initListener(){binding.apply {btnLoginFragmentLogin.setOnClickListener(this@LoginFragment)btnLoginFragmentRegister.setOnClickListener(this@LoginFragment)btnLoginFragmentSendCode.setOnClickListener(this@LoginFragment)btnLoginFragmentTouristLogin.setOnClickListener(this@LoginFragment)binding.btnLoginFragmentTest.setOnClickListener(this@LoginFragment)}}override fun onClick(v: View?) {when(v){binding.btnLoginFragmentLogin -> {if (checkInput()){
//                    if (tryLogin()){
//
//                    }}}binding.btnLoginFragmentRegister -> navController.navigate(R.id.action_loginFragment_to_registerFragment)binding.btnLoginFragmentSendCode -> getCode()binding.btnLoginFragmentTouristLogin -> {if (v.isClickEffective()) loginViewModel.touristLoginRequest()}binding.btnLoginFragmentTest -> {if (v.isClickEffective()){startActivity(Intent(context, CentreActivity::class.java).apply {putExtra("cookie", "")})}}}}private fun getCode(){if (binding.edtLoginFragmentPhoneNumber.text.length != 11){//如果输入格式不满足要求,无法获取验证码makeToast("请输入11位手机号!")}else{loginViewModel.codeRequest(binding.edtLoginFragmentPhoneNumber.text.toString())}}private fun checkInput(): Boolean{return if (binding.edtLoginFragmentPhoneNumber.text.toString().isNotEmpty()){if (binding.edtLoginFragmentCode.text.toString().isNotEmpty()){true}else{Snackbar.make(requireView(), "请输入验证码!", Snackbar.LENGTH_SHORT).show()false}}else{Snackbar.make(requireView(), "请输入手机号!", Snackbar.LENGTH_SHORT).show()false}}//    private fun tryLogin(): Boolean{
//
//    }
}package com.timi.musicimport com.timi.music.bean.Captcha
import com.timi.music.bean.CaptchaService
import com.timi.music.bean.Tourist
import com.timi.music.bean.TouristService
import com.timi.utils.Logger
import com.timi.utils.ServiceBuilder
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Responseclass LoginModel {private val TAG = "LoginModel"/*** 发出获取验证码请求*/fun codeRequest(loginVM: LoginViewModel,phoneNumber: String){val captchaService = ServiceBuilder.create(CaptchaService::class.java)captchaService.getCaptchaData(phoneNumber).enqueue(object : Callback {override fun onResponse(call: Call, response: Response) {response.body()?.apply {Logger.i(TAG, "注册验证码请求:$this")loginVM.captchaCode.value = this.code}}override fun onFailure(call: Call, t: Throwable) {t.printStackTrace()}})}/*** 进行游客登陆*/fun touristLoginRequest(loginVM: LoginViewModel){val touristService = ServiceBuilder.create(TouristService::class.java)touristService.getTouristData().enqueue(object : Callback{override fun onResponse(call: Call, response: Response) {response.body()?.apply {Logger.i(TAG, "游客登陆请求:$this")loginVM.touristData.value = this}}override fun onFailure(call: Call, t: Throwable) {t.printStackTrace()}})}
}package com.timi.musicimport androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.timi.music.bean.Touristclass LoginViewModel: ViewModel() {private val TAG = "LoginViewModel"private val loginModel: LoginModel by lazy { LoginModel() }val captchaCode = MutableLiveData()        //验证码发送返回结果val touristData = MutableLiveData()        //游客登陆返回结果init {captchaCode.value = 0touristData.value = null}/*** 发出获取验证码请求*/fun codeRequest(phoneNumber: String){loginModel.codeRequest(this, phoneNumber)}fun touristLoginRequest(){loginModel.touristLoginRequest(this)}
}package com.timi.musicimport android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.View.OnClickListener
import android.view.ViewGroup
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.NavController
import androidx.navigation.Navigation
import com.timi.music.databinding.FragmentRegisterBinding
import com.timi.utils.Logger
import com.timi.utils.makeToastclass RegisterFragment : Fragment(), OnClickListener{companion object {private const val TAG = "RegisterFragment"}private lateinit var binding: FragmentRegisterBindingprivate lateinit var navigationController: NavControllerprivate val registerViewModel: RegisterViewModel by lazy {ViewModelProvider(this)[RegisterViewModel::class.java]}override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View {binding = FragmentRegisterBinding.inflate(inflater, container, false)return binding.root}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {navigationController = Navigation.findNavController(view)observeChange()initListener()}/*** 检测RegisterViewModel中变量的变化*/private fun observeChange(){registerViewModel.apply {captchaCode.observe(viewLifecycleOwner){if (it != 0){if (it == 200){Logger.i(TAG, "注册验证码发送成功.")makeToast("验证码发送成功!")}else{Logger.i(TAG, "验证码发送失败.")makeToast("验证码发送失败!请检查你的手机号是否正确!")}captchaCode.value = 0   //重置变量}}}}private fun initListener(){binding.ivRegisterFragmentBack.setOnClickListener(this)binding.btnRegisterFragmentGetCode.setOnClickListener(this)}override fun onClick(v: View?) {when(v){binding.ivRegisterFragmentBack -> navigationController.navigateUp() //返回到LoginFragmentbinding.btnRegisterFragmentGetCode -> getCode()     //请求发送注册验证码}}/*** 获取手机验证码*/private fun getCode(){if (binding.edtRegisterFragmentPhoneNumber.text.length != 11){//如果输入格式不满足要求,无法获取验证码makeToast("请输入11位手机号!")}else{registerViewModel.codeRequest(binding.edtRegisterFragmentPhoneNumber.text.toString())}}
}package com.timi.musicimport android.util.Log
import com.timi.music.bean.Captcha
import com.timi.music.bean.CaptchaService
import com.timi.utils.ServiceBuilder
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Responseclass RegisterModel {private val TAG = "RegisterModel"/*** 发出获取验证码请求*/fun codeRequest(registerVM: RegisterViewModel,phoneNumber: String){val captchaService = ServiceBuilder.create(CaptchaService::class.java)captchaService.getCaptchaData(phoneNumber).enqueue(object : Callback{override fun onFailure(call: Call, t: Throwable) {t.printStackTrace()}override fun onResponse(call: Call, response: Response) {response.body()?.apply {Log.i(TAG, "注册验证码请求:${this}")registerVM.captchaCode.value = this.code}}})}
}package com.timi.musicimport androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModelclass RegisterViewModel: ViewModel() {private val registerModel: RegisterModel by lazy { RegisterModel() }val captchaCode = MutableLiveData()        //验证码发送返回的结果init {captchaCode.value = 0}/*** 发出获取验证码请求*/fun codeRequest(phoneNumber: String){registerModel.codeRequest(this, phoneNumber)}
}

运行结果的截图


每日每人总结

成员 总结
徐嘉炜 登录注册模块已经做得比较完善,团队各个小组都发挥了各自的优势
陈祥意 测试模块已经全部通过,可以进行下一个模块的测试
林楦 基础的UI界面已经定好,可以在不改变数据对象的前提下继续美化UI界面
陈大锴 代码在逻辑上基本没有问题,也说是有一点成就,希望下一个模块的开发也顺顺利利。
蔡家显 在测试的方式上,可以写一些自动化脚本进行测试,但是手写测试案例还是有用的,希望能够学到更多的测试方法
陈祖民 UI界面的交互比较简洁明了,是一个有点,可以往简约风格方面发展,期待主功能界面的UI界面开发
肖商 测试用例发送和接收的报文均为有效报文,测试成功的喜悦促使着我们进一步开发下一个模块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835481.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂maven

一、什么是mavenmaven是一个项目管理工具,通过pom.xml文件的配置获取jar包不用手动的去添加jar包就是在java项目和web项目上裹了一层maven,本质上java项目还是java项目,web项目还是web项目,但是包裹了maven之后,就可以使用maven提供的一些功能,即通过pom.xml添加jar包 就…

浅析注意力(Attention)机制

Attention顾名思义,说明这项机制是模仿人脑的注意力机制建立的,我们不妨从这个角度展开理解 2.1 人脑的注意力机制 人脑的注意力机制,就是将有限的注意力资源分配到当前关注的任务,或关注的目标之上,暂时忽略其他不重要的因素,这是人类利用有限的注意力资源从大量信息中快…

HBase架构与基础命令

HBase架构与基础命令 一、了解HBase 官方文档:https://hbase.apache.org/1.1 HBase概述HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化或者半结构化,非结构化的数据(底层是字节数组做存储的) HBase是Hadoop的生态系统之一,是建立在…

Blender 效果制作:制作起伏不平的路面

前置准备正常纹理贴图,置换贴图,法线贴图,粗糙贴图方法一首先用UV坐标,纹理贴图,法线贴图,粗糙贴图构建材质将网格细分多一点,并采用置换修改器,置换修改器使用置换贴图获得成图方法二首先用UV坐标,纹理贴图,法线贴图,粗糙贴图构建材质细分网格将【置换】改成“置换…

团队作业4-第5篇Scrum博客

团队作业4-第5篇Scrum博客 1 站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作:已初步完成数据库记录的备份、恢复和退出功能及账目记录的增删改功能今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 右键实现增删改功能 黄锐 2h主界面模块 报告界…

PCFN

import torch import torch.nn as nn import torch.nn.functional as Fclass PCFN(nn.Module):使用带有GELU的激活函数的1*1卷积对扩展的隐藏空间进行跨信道交互。 然后将隐藏特征分割成两块 对其中一块使用3*3卷积核GELU激活函数 编码局部上下文将处理后的结果和另一块合并def…

Linux 内核如何装载和启动一个可执行程序

张晓攀+原创作品转载请注明出处+《Linux内核分析》MOOC课程https://mooc.study.163.com/course/1000029000 实验七——Linux 内核如何装载和启动一个可执行程序 一、实验过程 1.从github上下载相关代码2.然后用test_exec.c 替换test.c,再重新编译生成根文件系统3.启动调试内核…

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现

java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现@目录背景说明前言Runtime.exec()常见的几种陷阱以及避免方法陷阱1:IllegalThreadStateException陷阱2:Runtime.exec()可能hang住,甚至死锁陷阱3:不同平台上,命令的兼容性陷阱4:错把Runtime.exec()的…

昆工891数据库系统原理强化课程

--昆工昆明理工大学、计算机技术、人工智能、软件工程、网络空间安全、891计算机专业核心综合、计算机系统结构、计算机软件与理论、网络与信息安全、计算机应用技术、综合程序设计、通信工程、817信号与系统、信号与信息处理、通信与信息系统

第7篇Scrum博客

1.站立式会议 1.1 会议照片1.2 会议内容 昨天已完成的工作: 昨天已基本实现用条形图,折线图,饼图展示数据界面功能。 今天计划完成的工作项目模块 需要实现的功能 负责人 预计用时主界面模块 整合代码,查漏补缺 王伊若 5h主界面模块 主界面设计 王伊若 2h主界面模块 查询界…

Ant Design Vue组件安装

https://www.antdv.com/docs/vue/getting-started-cn