北理Todo::待办管理系统
北理TODO代办管理系统开发日志
1.团队成员及分工
1.1小组成员
1.2小组分工:
2.作业展示
2.1项目前景和范围
2.2涉众分析和硬数据采样的过程和结果
涉众编号
|
涉众名称
|
涉众说明
|
涉众期望/行为
|
001 |
普通用户
|
指使用该系统进行个人事务规划的用户,为主要用户,以学生为主
|
1、 进行账号的注册
2、 任务列表为多级列表
3、 可进行备注、设置ddl
4、 可选择某任务是否重复执行(如每周一次)
5、 可设置任务优先级
6、 根据ddl和优先级,系统自动安排每日计划(可以按需修改)
7、 通过设置tag搜索任务
8、接受或分享其他账号的列表
|
002 |
审核人员
|
指维护讨论区环境的人员
|
9、 可以审核或删除讨论区的话题
10、可以删除言论过激的回复内容
|
003 | 系统维护人员 | 指后期维护系统的人员 |
11、能较为方便地维护系统
12、能接受用户反馈并改进系统
|
个人特征
|
主要群体:大学生
|
工作特征
|
技能特点:娴熟使用计算机与智能手机
|
|
对新技术的态度:愿意接受利于事务规划的新技术
|
|
系统使用状况:需要频繁查看、搜索
|
地理和社会特征
|
主要活动场所:学校
|
项目成功标准
|
做到期望2~7
|
个人特征
|
|
工作特征
|
主要工作:进行团体工作规划、制定、分配
|
|
技能特点:娴熟使用计算机与智能手机
|
|
对新技术的态度:希望能对工作有实质帮助
|
地理和社会特征
|
|
项目成功标准
|
能对相关账号精准分配任务
|
个人特征
|
|
工作特征
|
技能特点:擅长计算机
|
地理和社会特征
|
|
项目成功标准
|
对系统能方便地维护与修改
|
-
态度积极,愿意真正提出意见,提供帮助。
-
保证每种涉众都有自己的代表
2.3面谈
时间
|
2021-04-16
|
地点
|
综教A钝角咖啡
|
学院
|
计算机学院 六组
|
会议性质
|
例会
|
主持人
|
沈聪
|
记录人
|
沈聪
|
会议内容
一、涉众范围讨论分析
本项目涉众群体包括学生、系统管理者及系统开发人员。经讨论,学生自行管理自己的待办事项,自行分组以及增删改查,可以在讨论区发表想法,也可以在反馈区反馈。同时系统管理员可以对学生的评论进行回复;学生可自行删除评论。管理员来保证平台的和谐稳定。
二、硬数据采样讨论分析
大多数同学都有过评论和参考评论的经历,所以说项目实现之后用处很大,讨论决定推出以共同学参考。
三、讨论页面设计排版
待办区、讨论区、反馈区
| |||
记录人(签字)
|
|
负责人(签字)
|
|
归档人(签字)
|
|
归档时间
|
|
2.4原型
![](https://img-blog.csdnimg.cn/20210421130933896.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1NoZW5jb25nMjMzMw==,size_16,color_FFFFFF,t_70)
北理TODO代办管理系统开发日志
第二次报告
1.团队成员及分工
1.1小组成员
小组长:康昊
小组成员:沈聪、史星蔚、胡涛、杨昆龙
1.2小组分工:
结构化需求分析概述:杨昆龙
过程建模:史星蔚、康昊
数据建模:沈聪
PPT制作及演讲:胡涛
2.作业展示
2.1结构化需求分析与概述
一.功能分解图
二.需求细分
面向用户体验与应用功能的可行性将需求细分为三种:基本型需求,期望型需求和体验型需求
-
基本型需求
对于代办事项的基础操作及应用完整性的实现
-
期望型需求
代办分享,论坛功能的实现
-
体验型需求
根据代办自动生成专属计划表,多端登陆(app,PC端,网页端,小程序,智能手表,智能手环甚至智能洗衣机等各种智能设备,实现全生态布局)
三.功能优先级划分
- 基础操作
基础操作和应用完整性是北理ToDo最基本的功能,因此优先级最高
- 论坛系统与用户管理系统
论坛系统是本应用的期望性需求之一,也是北理ToDo的核心功能之一,在实现了基本功能之后就会紧接着实现论坛系统与用户管理系统,并且会在产品面试后不断迭代更新,所以论坛系统与用户管理系统的优先级其次
- 多端登录与计划表智能生成
要做就要有梦想,多端登录与计划表的就是我们的梦想,也必将是代办类应用产品的终极形态,这两个功能抓住了代办类应用产品的本质需求,方便与规划。将其优先级排在最后,是要在产品不断成长开发中进行实现
2.2过程建模
一.DFD建模
上下文图:
0层图:
1层图:
二.微规格说明
SELECT CASE
CASE 1(sign in the system)
view all projects
SELECT CASE
CASE 1(set priority)
select a project
choose a task
set priority for this task
CASE 2(search project)
enter keyword
return task containing keyword
CASE 3(create project)
create an empty project
REPEAT
add new task
UNTIL user stop adding
add a ketwrod for this project
CASE 4(delete project or task)
select a project
IF want to delete a task
THEN select a task
delete the task
IF want to delete a project
THEN delete the project
CASE 5(revise a task)
select a project
select a task
revise this task
CASE 6(share project)
select a project
create a link
copy this link
CASE 2(access the forum)
user gains the information of the forum
IF user wants to serch posts
THEN enter keyword
feedback information containing keyword
IF user wants to posts
IF not sign in
THEN sign in the system
IF the published post is approved
THEN upload the post
feedback the audit results to users
三.数据字典
编号 | 字段名 | 中文名 | 数据类型 | 使用地点 | 描述 | 说明 |
1.1 | userId | 账号 | int | 用户登录时 判断用户是否为审核人员时 | userId=8{0-9}8 | 账号由0位数字组成 |
1.2 | userPassword | 密码 | String | 用户登录时 | userPasswrod=6{0-9|a-z|A-Z|_}16 | 密码由6-16位组成,可以使用数字,字母,下划线 |
1.3 | userName | 用户名 | Stirng | 用户登录时 |
|
|
1.4 | isLoggedIn | 登录信息 | boolean | 判断用户是否登录时 |
|
|
|
|
|
|
|
|
|
2.1 | project | 项目 | project | 用户查看、添加、删除项目时 |
|
|
2.2 | task | 任务 | task | 用户查看、添加、删除任务时 |
|
|
2.3 | priority | 优先级 | int | 判断任务重要性并给任务排序时 | priority=[1|2|3|4|5] | 优先级分为5个级别,数字越大优先级越高 |
2.4 | projectKey | 项目关键字 | String | 搜索任务时 | projectKey=1{Chinese}5 | 关键字由1-5个汉字组成 |
|
|
|
|
|
|
|
3.1 | message | 内容 | String | 发表讨论帖时 审核时 |
|
|
3.2 | releasedDate | 发布日期 | date | 显示帖子内容时 |
|
|
3.3 | forumKey | 论坛内容关键字 | String | 用户搜索时 | forumKey=1{CHinese}5 | 关键字由1-5个汉字组成 |
3.4 | feedback | 反馈内容 | String | 将审核结果返回给用户时 |
|
|
2.3数据建模
一.ERD图
北理TODO代办管理系统开发日志
第三次报告
1.团队成员及分工
1.1小组成员
小组长:康昊
小组成员:沈聪、史星蔚、胡涛、杨昆龙
1.2小组分工:
用例图:史星蔚
UML动、静态图:杨昆龙
app开发:康昊、沈聪
需求规格说明文档:胡涛
ppt及演讲:史星蔚
2.作业展示
2.1用例图
2.2UML动态图
2.3UML静态图
2.4需求规格说明文档
2.5部分源码
利用Android Studio开发app,由于知识储备不足,仅实现了前段和数据库的建立,未完成前后端的交互功能
//首页页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:id="@+id/todo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="北理 To Do"
android:textColor="#F3F9FF47"
android:textSize="40sp"
android:layout_marginTop="150px"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/id"
android:layout_width="300dp"
android:layout_height="100px"
android:layout_marginTop="150px"
android:textSize="20sp"
android:layout_gravity="center"
android:hint="用户名"
android:autofillHints="用户名"
android:maxLines="1"
android:background="@drawable/bg_id2" />
<EditText
android:id="@+id/password"
android:layout_width="300dp"
android:layout_height="100px"
android:layout_gravity="center"
android:textSize="20sp"
android:hint="密码"
android:autofillHints="密码"
android:inputType="textPassword"
android:maxLines="1"
android:background="@drawable/bg_id" />
<Button
android:id="@+id/login"
android:layout_width="400px"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="150px"
android:text="登录"
android:backgroundTint="@color/blue"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/password" />
<Button
android:id="@+id/create"
android:layout_width="400px"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="注册"
android:backgroundTint="@color/blue"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/login" />
</LinearLayout>
//注册页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:orientation="vertical"
tools:context=".create">
<EditText
android:id="@+id/ctid"
android:layout_width="800px"
android:layout_height="100px"
android:background="@drawable/bg_id2"
android:gravity="center"
android:layout_marginLeft="400px"
android:layout_marginTop="200px"
android:hint="请输入用户名" />
<EditText
android:id="@+id/ctpassword"
android:layout_width="800px"
android:layout_height="100px"
android:layout_marginLeft="400px"
android:background="@drawable/bg_id3"
android:gravity="center"
android:hint="请输入密码" />
<EditText
android:id="@+id/ctpasswordt"
android:layout_width="800px"
android:layout_height="100px"
android:layout_marginLeft="400px"
android:background="@drawable/bg_id"
android:gravity="center"
android:hint="请再次确认密码" />
<Button
android:id="@+id/createture"
android:layout_width="400px"
android:layout_height="100px"
android:gravity="center_horizontal"
android:layout_marginLeft="600px"
android:text="注册"
app:layout_constraintBottom_toBottomOf="@+id/ctpasswordt"
app:layout_constraintStart_toStartOf="@+id/ctid"
app:layout_constraintTop_toTopOf="@+id/ctid" />
</LinearLayout>
//任务清单页面布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".schedule">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/edtxt"
android:layout_width="281dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:ems="10"
android:hint="输入要查找的tag"
android:inputType="text"
android:maxLength="20" />
<Button
android:id="@+id/search"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="搜索" />
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示所有任务"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/note"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_input_add"
android:layout_gravity="right|bottom"
android:layout_margin="20dp"
android:onClick="adds"/>
</LinearLayout>
</FrameLayout>
//添加任务页面布局
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".add">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题:"/>
<EditText
android:background="@drawable/bg_id3"
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="日期:"/>
<EditText
android:background="@drawable/bg_id3"
android:id="@+id/tag"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标签:"/>
<EditText
android:background="@drawable/bg_id3"
android:id="@+id/deadline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"/>
</LinearLayout>
<Button
android:id="@+id/selcet"
android:layout_gravity="center"
android:layout_width="400px"
android:layout_height="wrap_content"
android:text="设置优先级"
android:onClick="choose"/>
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="内容"/>
<EditText
android:background="@drawable/bg_id4"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="300dp"
android:gravity="left"
android:layout_marginTop="5dp"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
android:onClick="add"/>
</LinearLayout>
</ScrollView>
//首页Button功能,实验页面的跳转和登录成功失败的提示
package com.example.todo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//声明控件
private Button login;
private EditText id;
private EditText password;
private Button create;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到控件
login=findViewById(R.id.login);
id=findViewById(R.id.id);
password=findViewById(R.id.password);
create=findViewById(R.id.create);
//实现跳转
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,create.class);
startActivity(intent);
}
});
login.setOnClickListener(this);
}
public void onClick(View v){
//需要获取输入的用户名和密码
String id=this.id.getText().toString();
String password=this.password.getText().toString();
String ok="登陆成功";
String fail="账号或密码错误";
Intent intent = null;
//正确
if(id.equals("123456")&&password.equals("123456")){
Toast tc0=Toast.makeText(getApplicationContext(),ok,Toast
.LENGTH_SHORT);
tc0.setGravity(Gravity.CENTER,0,0);
tc0.show();
intent = new Intent(MainActivity.this,schedule.class);
startActivity(intent);
}
else{
//弹出toast
Toast tc1=Toast.makeText(getApplicationContext(),fail,Toast
.LENGTH_SHORT);
tc1.setGravity(Gravity.CENTER,0,0);
tc1.show();
}
}
@Override
public void onPointerCaptureChanged(boolean hasCapture) {
}
}
//注册页面功能,同首页,未创建数据库,只有前端显示
package com.example.todo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class create extends AppCompatActivity {
private Button createture;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
createture=findViewById(R.id.createture);
createture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast tc0=Toast.makeText(getApplicationContext(),"注册成功",Toast
.LENGTH_SHORT);
tc0.setGravity(Gravity.CENTER,0,0);
tc0.show();
Intent intent = new Intent(create.this,MainActivity.class);
startActivity(intent);
}
});
}
}
//任务清单页面功能,只有前端显示,未与后端进行交互,查看现有任务,与添加页面跳转,可以通过tag筛选,也可以通过优先级筛选
package com.example.todo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageButton;
public class schedule extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule);
};
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu,menu);
return true;
}
public void list(){
SQLiteDatabase todolist = new MyDatabaseHelper(this, "todolist", null, 1)
.getReadableDatabase();
String sql="SELECT title FROM list";
Cursor list = todolist.query("list", new String[]{"title"}, null, null, null, null, null);
}
public boolean onOptionsItemsSelected(MenuItem item){
switch (item.getItemId()){
case R.id.first:
{
}
case R.id.second:
{
}
case R.id.third:
{
}
case R.id.forth:
{
}
case R.id.fifth:
{
}
default:
{
}
}
return true;
}
public void adds(View view) {
Intent intent=new Intent(schedule.this,add.class);
startActivity(intent);
}
}
//添加任务界面功能,实现了与数据库的交互,可以建立表单储存数据,通过菜单可以选择划分优先级
package com.example.todo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupMenu;
public class add extends AppCompatActivity {
private MyDatabaseHelper dbhelper;
private EditText title,deadline,tag,content;
private String addlist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add);
initview();
dbhelper = new MyDatabaseHelper(this,"todolist",null,1);
}
private void initview() {
title=findViewById(R.id.title);
deadline=findViewById(R.id.deadline);
tag=findViewById(R.id.tag);
content=findViewById(R.id.content);
}
public void add(View view) {
SQLiteDatabase db=dbhelper.getWritableDatabase();
ContentValues values=new ContentValues();
String title2=title.getText().toString().trim();
String deadline2=deadline.getText().toString().trim();
String tag2=tag.getText().toString().trim();
String content2=content.getText().toString().trim();
values.put("title",title2);
values.put("deadline",deadline2);
values.put("tag",tag2);
values.put("addlist",addlist);
values.put("content",content2);
db.insert("list",null,values);
values.clear();
Intent intent = new Intent(add.this,schedule.class);
startActivity(intent);
}
public void choose(View view) {
PopupMenu popupMenu = new PopupMenu(this, view);
popupMenu.inflate(R.menu.choose);
popupMenu.show();
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.choosefirst: {
addlist="第一优先级";
}
case R.id.choosesecond: {
addlist="第二优先级";
}
case R.id.choosethird: {
addlist="第三优先级";
}
case R.id.chooseforth: {
addlist="第四优先级";
}
case R.id.choosefifth: {
addlist="第五优先级";
}
default: {
break;
}
}
return false;
}
;
});
}
}
//建立数据库
package com.example.todo;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
import androidx.annotation.Nullable;
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String table_name = "list";
private Context mContext;
private static final String create_table_sql = "create table "+table_name+" (id integer primary key autoincrement,title text,deadline text,tag text,addlist text,content text);\n";
public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory , intversion){
super(context,name ,factory,version);
mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(create_table_sql);
Toast.makeText(mContext,"Create succeeded", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}