Harbin Institute of Technology Software Process and Tools Assignment 3

Harbin Institute of Technology

Department of Computing / School of Software

2022 Fall Semester

2020 undergraduate course "Software Process and Tools" ( 3.0 credits)

homework report

Assignment 3 : Software Test Report

Name

student ID

Contact information

Shi Zhuofan

120L021011

[email protected]/18974330318

  directory

1 Purpose and requirements of the job .............................................. ................................................... ......... 1

2 Setting up the software testing environment..................................... ................................................... ..... 1

2.1 Setting up a custom test project environment................................... ....................................... 1

2.2 Designate software system test environment to build................................... ............................... 1

2.2.1 Description of environment configuration................................... ................................................... . 2

2.2.2 Description of the construction process................................... ................................................... . 2

3 Software testing process and results................................................... ................................................... .. 2

3.1 White box testing (unit testing)................................... ........................................ 2

3.1.1 Sequential structure program testing................................... ............................................ 2

3.1.2 Branch structure program test................................... ................................................ 5

3.1.3 Loop structure program test................................................... ............................................ 9

3.2 Integration/system testing................................... ................................................... 15

3.2.1 Part of the functional module test of the unified identity authentication system for undergraduates of the school... 15

3.2.2 UI Usability Test and Evaluation of the University's Undergraduate Portal Platform System............................................ 21

  1. Job purpose and requirements

(1) Learn the basic methods of software testing;

(2) Practice the basic process of software testing;

(3) Master the methods of unit testing and integration testing;

(4) Master the basic methods of white box testing and black box testing;

(5) Learn the basic evaluation and user experience of UI;

(6) The homework requirements are mainly completed by individuals independently.

  1. Software testing environment construction
    1. Custom test project environment construction
  1. hardware environment

X64 CPU; 2GHz; 2G RAM; 256GHD Disk or more

  1. Software Environment

Windows7/10 64-bit or above; VirtualBox/Vmware 11 or above; Ubuntu 16.04 LTS 64-bit/Ubuntu Kylin 64-bit or above;

  1. development tools

IDEA

Download IDEA

  1. The IDE is idea, install idea and configure jdk11. , the idea adopts the professional version 2021.2.3. About the 30-day trial limit, I spent a while groping for this problem I encountered before the holiday, and finally adopted a patch cracking trial
  2. Download JDK11 in IDEA and configure JDK11
  1. select program

Software Construction Lab3---Voting System Partial Code

    1. Specify the software system test environment to build

  1. hardware environment

X64 CPU; 2GHz; 2G RAM; 256GHD Disk or more

  1. Software Environment

Windows7/10 64-bit or above; VirtualBox/Vmware 11 or above; Ubuntu 16.04 LTS 64-bit/Ubuntu Kylin 64-bit or above;

  1. browser

Google Chrome

  1. web proxy

EasyConnect school intranet vpn

  1. Select system

Harbin Institute of Technology unified identity authentication, Harbin Institute of Technology today

http://ids-hit-edu-cn-s.ivpn.hit.edu.cn/

      1. Environment configuration description
  1. Windows10 system
  2. Off-campus network, use EasyConnect as VPN to convert to campus network
  3. Google Chrome
      1. Description of the build process
  1. Download and install EasyConnect
  2. Enter i.hit.edu.cn
  3. Login Student ID and Password
  4. Successfully connected to the campus network VPN
  1. Software testing process and results
    1. White box testing (unit testing)
      1. sequential structure program test

3.1.1.1 Test object

source code

  1. //immutable
  2. public class VoteType {
  3.  // key is the option name, value is the score corresponding to the option name
  4.  private Map<String, Integer> options = new HashMap<>();
  5.  // Rep Invariants
  6.  //  The option name key cannot be "", and spaces are not allowed
  7.  // The number of options.size() options needs to be >=2
  8.  // Abstract Function
  9.  // AF(String,Integer)-> Option where key is the option name and value is the score corresponding to the option name
  10.  // Safety from Rep Exposure
  11.  //  all data fields are private
  12.  //  Use Collections.unmodifiableMap() to convert to an immutable type and return it to the outside
  13.  /**
  14.   *
  15.   * @param options voteType corresponding option name and score
  16.   */
  17.  public VoteType(Map<String,Integer> options) {
  18.   this.options=new HashMap<>(options);
  19.   checkRep();
  20.  }

flow chart

 According to the incoming Map, create a voting type object

Figure 3.1.1.1 Flowchart

3.1.1.2 Test case design

Classification

rules

sample

There are no voting options

blank

Null

Voting options exist

Key meets the conditions

options2.put(" Like ", 2);

options2.put(" Don't like ",0);

options2.put(" It doesn't matter ",1);

Key does not meet the conditions

options3.put(" I like it very much ", 2);

options3.put(" ",0);

options3.put(" Don't care ", 1);

3.1.1.3 Test process and results

Test steps:

  1. Stub program creation options
  2. Stub program given options variable
  3. Use junit to judge

   For VoteType(Map<String,Integer> options)

   1. There is no voting option

   2. Voting option exists

   2.1Key is eligible

   2.2 Key does not meet the conditions

result:

 

 

3.1.1.4 Compilation of Driver or Stub program

  1.  /**
  2.   *  for VoteType(Map<String,Integer> options)
  3.   * 1. There is no voting option
  4.   * 2. Voting option exists
  5.   * 2.1Key is eligible
  6.   * 2.2Key is not eligible
  7.   */
  8.  @Test
  9.  public void VoteTypeTest_NotRegex()
  10.  {
  11.   Map<String, Integer> options = new HashMap<>();
  12.   VoteType voteType = new VoteType(options);
  13.   assertEquals(options,voteType.getOptions());
  14.   Map<String, Integer> options2 = new HashMap<>();
  15.   options2.put( " like" , 2 );
  16.   options2.put( " Dislike" , 0 );
  17.   options2.put( " Don't care" , 1 );
  18.   VoteType voteType2 = new VoteType(options2);
  19.   assertEquals(options2,voteType2.getOptions());
  20. //  Map<String, Integer> options3 = new HashMap<>();
  21. // options3.put(" I really like it", 2);
  22. //  options3.put(" ",0);
  23. // options3.put(" Don't care", 1);
  24. //  VoteType voteType3 = new VoteType(options3);
  25. //  assertFalse(false,voteType3.getOptions());
  26.  }
      1. Branch structure program testing

3.1.2.1 Test object

source code

  1. public VoteType(String regex) throws IllegalArgumentException{
  2.   // The parameter of split is a regular expression, '|' needs to be escaped
  3.   String[] inputOptions = regex.split("\\|");
  4.   // get "likes" (2)
  5.   // or get "support"
  6.   if(inputOptions.length < 2) {
  7.    throw  new  IllegalArgumentException( " Illegal input: less than two options" );
  8.   }
  9.   Pattern regexWithNum = Pattern.compile("\"(\\S+)\"\\(([-]?\\d+)\\)");
  10.   Pattern regexWithoutNum = Pattern.compile("\"(\\S+)\"");
  11.   int  unMatchFlag= 0 ; // Number of mismatches
  12.   // first try to match the pattern with numbers
  13.   for (String option : inputOptions) {
  14.    Matcher m = regexWithNum.matcher(option);
  15.    if(!m.matches())
  16.    {
  17.     unMatchFlag++; // If the current does not match, the number of mismatches +1
  18.     break;
  19.    }
  20.    if (m.group(1).length() > 5)
  21.     throw  new  IllegalArgumentException( " The length of the option name exceeds 5" );
  22.    options.put(m.group(1), Integer.valueOf(m.group(2)));
  23.   }
  24.   if(unMatchFlag==0)
  25.   {
  26.    checkRep();
  27.    return;
  28.   }
  29.   // match equal weight format without numbers
  30.   for (String option : inputOptions) {
  31.    Matcher m = regexWithoutNum.matcher(option);
  32.    if(!m.matches())
  33.    {
  34.     unMatchFlag++; // If the current does not match, the number of mismatches +1
  35.     break;
  36.    }
  37.    if (m.group(1).length() > 5)
  38.     throw  new  IllegalArgumentException( " The length of the option name exceeds 5" );
  39.    options.put(m.group(1), 1);
  40.   }
  41.   if (unMatchFlag== 2 ) // Represents no match
  42.    throw  new  IllegalArgumentException( " Neither case matches" );
  43.   checkRep();
  44.  }

flow chart

 Create a voting type object based on a string that satisfies specific grammar rules

@param regex A string containing vote type information following a specific syntax (to be considered in Task 12)

The syntax rules for this string are as follows:

// "like" (2) | "dislike" (0) | "don't care" (1)

// Among them, the text part enclosed in double quotes is a voting option, the length of which does not exceed 5, which does not

// Spaces are allowed; the number enclosed in parentheses is the score corresponding to the voting option, which can be a positive integer, 0

// Or negative integers, no decimals, positive integers do not need to use "+", but negative integers need to use "-"; different

// The voting options are separated by "|".

// can also be used in the following form:

// "for" | "against" | "abstain"

// Compared to the example above, the difference is that there are no fractions. This situation shows that the weight of each voting option is the same

Figure 3.1.1.1 Flowchart

 

3.1.2.2 Test case design

Classification

rules

sample

matches a numeric pattern

Does not contain negative numbers

" Like "(2)|" Dislike "(0)|" Don't care "(1)

Contains negative numbers

" Like "(-2)|" Dislike "(0)|" Don't care "(1)

match no digit pattern

No more than 5 lengths

" Support "|" Against "|" Abstain "

more than 5 lengths

" Support "|" Against "|" Abstain "|" Super Support "|" Super Abstain "|" Super Super Support "

Can't match normal pattern

" Support (1)"|" Against "|" Abstain "

3.1.2.3 Test process and results

Test steps:

  1. Stub program creation options
  2. Stub program given options variable
  3. Use junit to judge

   Test success:

    1. Test with numbers

    1.1 does not contain negative numbers

    1.2 with negative numbers

   2. Test without numbers

   The test throws an exception:

    1, more than 5 lengths

2. The format is wrong

result:

3.1.2.4 Compilation of Driver or Stub program

  1.  /**
  2.   *  for VoteType(String regex)
  3.   *  test successful:
  4.   * 1. Test with numbers
  5.   * 1.1 does not contain negative numbers
  6.   * 1.2 includes negative numbers
  7.   * 2. Test without numbers
  8.   *  The test throws an exception:
  9.   * 1 , more than 5 lengths
  10.   * 2. The format is wrong
  11.   */
  12.  @Test
  13.  public void VoteTypeTest_regex()
  14.  {
  15.   //" Like"(2)|"Dislike"(0)|"Don't care"(1)
  16.   Map<String, Integer> options = new HashMap<>();
  17.   options.put( " like" , 2 );
  18.   options.put( " Dislike" , 0 );
  19.   options.put( " Don't care" , 1 );
  20.   VoteType voteType =  new  VoteType( "\" like\"(2)|\"dislike\"(0)|\"doesn't matter\"(1)" );
  21.   assertEquals(options,voteType.getOptions());
  22.   //" Like"(-2)|"Dislike"(0)|"Don't care"(1)
  23.   Map<String, Integer> options3 = new HashMap<>();
  24.   options3.put( " Like" , -2 );
  25.   options3.put( " Dislike" , 0 );
  26.   options3.put( " Don't care" , 1 );
  27.   VoteType voteType3 =  new  VoteType( "\" like\"(-2)|\"dislike\"(0)|\"doesn't matter\"(1)" );
  28.   assertEquals(options3,voteType3.getOptions());
  29.   //" Support"|"Against"|"Abstain"
  30.   // No score defaults to 1
  31.   Map<String, Integer> options2 = new HashMap<>();
  32.   options2.put( " support" , 1 );
  33.   options2.put( " oppose" , 1 );
  34.   options2.put( " abstain" , 1 );
  35.   VoteType voteType2 =  new  VoteType( "\" Support\"|\"Against\"|\"Abstain\"" );
  36.   assertEquals(options2,voteType2.getOptions());
  37.   assertThrows(IllegalArgumentException.class,()-> new  VoteType( "\" Super support\"|\"Against\"|\"Abstention\"" ), " The length of the option name exceeds 5" );
  38.   assertThrows(IllegalArgumentException.class,()-> new  VoteType( "\" support\"(1)|\"against\"|\"abstain\"" ), " neither case matches" );
  39.  }

      1. Loop structure program test

3.1.3.1 Test object

source code

  1.  /**
  2.   *  Responsible for checking the validity of the ballot and marking it in addVote
  3.   *  @param  vote  vote
  4.   *  @param  voter  _
  5.   */
  6.  public void checkVote(Vote<C> vote,Voter voter)
  7.  {
  8.   Set<VoteItem<C>> voteItems = vote.getVoteItems();
  9.   for  (VoteItem<C> voteItem : voteItems) {
  10.    if(!candidates.contains(voteItem.getCandidate()))
  11.    {
  12.     voteIsLegal.put(vote, false ); // Includes candidates who are not in this voting
  13.     return;
  14.    }
  15.    if(!voteType.checkLegality(voteItem.getVoteValue()))
  16.    {
  17.     voteIsLegal.put(vote, false ); // An option value that is not allowed in this vote appears in a ballot
  18.     return;
  19.    }
  20.    for (VoteItem<C> voteItem2 : voteItems)
  21.    {
  22.     if(voteItem2!=voteItem && voteItem2.getCandidate().equals(voteItem.getCandidate()))
  23.     {
  24.      voteIsLegal.put(vote, false ); // There are multiple votes for the same candidate in one ballot
  25.      return;
  26.     }
  27.    }
  28.   }
  29.   for (C candidate : candidates) {
  30.    if(!vote.candidateIncluded(candidate))
  31.    {
  32.     voteIsLegal.put(vote, false ); // A ballot does not contain all the candidates in this voting activity
  33.     return;
  34.    }
  35.   }
  36.   // If there is no exception
  37.   voteIsLegal.put(vote, true ); // Identified as legal
  38.  }

flow chart:

Figure 3.1.3.2.1 Flowchart

3.1.3.2 Test case design

 checkVote test

   Four Tests for Sharing Illegal Ballots

   Illegal ballots:

   One ballot does not include all candidates in the poll

   A ballot includes candidates who are not in the poll

   An option value that is not allowed for this vote appears in a ballot

   Multiple votes for the same candidate in one ballot

Candidate candidate1.candidate2, candidate3, candidate4

Voter vr1, ballot is empty

Voter vr2, candidate5, candidate1, candidate2, candidate3 in the ballot

Voter vr3, there are candidate1.candidate2, candidate3, and candidate4 in the ballot, but the option value "like" that is not allowed in this voting appears

Voter vr3, there are candidate1.candidate2, candidate5, candidate4 in the ballot

Voter vr4, there are candidate1.candidate2, candidate3, candidate5 in the ballot

Classification

rules

sample

0 cycles

Jump directly from loop entry to loop exit

Voter vr1, ballot is empty

1 cycle

Find errors in loop initialization

Voter vr2, candidate5, candidate1, candidate2, candidate3 in the ballot

2 cycles

Check for bugs that can only be exposed when looping multiple times

Voter vr3, there are candidate1.candidate2, candidate3, and candidate4 in the ballot, but the option value "like" that is not allowed in this voting appears

m cycles

At this time, m<n is also an error that can only be exposed when checking multiple cycles

Voter vr3, there are candidate1.candidate2, candidate5, candidate4 in the ballot

Maximum number of cycles

Voter vr4, there are candidate1.candidate2, candidate3, candidate5 in the ballot

3.1.3.3 Test process and results

Test steps:

Candidate candidate1.candidate2, candidate3, candidate4

Voter vr1, ballot is empty

Voter vr2, candidate5, candidate1, candidate2, candidate3 in the ballot

Voter vr3, there are candidate1.candidate2, candidate3, and candidate4 in the ballot, but the option value "like" that is not allowed in this voting appears

Voter vr3, there are candidate1.candidate2, candidate5, candidate4 in the ballot

Voter vr4, there are candidate1.candidate2, candidate3, candidate5 in the ballot

  1. create voter
  2. set voter weight
  3. Set poll type
  4. create candidates
  5. create voting item
  6. create poll
  7. Create a poll
  8. update voter vote

result:

 

3.1.3.4 Compilation of Driver or Stub program

 

  1.  /**
  2.   *  is the second abnormal condition detected by statisticTest:
  3.   * ( also a test for checkVote)
  4.   *  Four tests sharing illegal ballots
  5.   * *  Illegal ballot case
  6.   * * ?  A ballot does not include all candidates in this poll
  7.   * * ?  A ballot contains candidates who are not in this poll
  8.   * * ?  An option value that is not allowed for this vote appears in a ballot
  9.   * * ?  Multiple votes for the same candidate in one ballot
  10.   *  Specific test example:
  11.  * candidate candidate1.candidate2, candidate3, candidate4
  12.  * voter vr1, ballot is empty
  13.  * Voter vr2, candidate5, candidate1, candidate2, candidate3 in the ballot
  14.  * Voter vr3, there are candidate1.candidate2, candidate3, and candidate4 in the ballot, but the option value "like" that is not allowed in this voting appears
  15.  * Voter vr3, there are candidate1.candidate2, candidate5, candidate4 in the ballot
  16.  * Voter vr4, there are candidate1.candidate2, candidate3, candidate5 in the ballot
  17.   */
  18.  @Test
  19.  void checkVote_statistics_BuHeFaTest() {
  20.   //  Create 2 voters
  21.   Voter vr1 = new Voter("v1");
  22.   Voter vr2 = new Voter("v2");
  23.   Voter vr3 = new Voter("v3");
  24.   Voter vr4 = new Voter("v4");
  25.   //  Set the weight of 2 voters
  26.   Map<Voter, Double> weightedVoters = new HashMap<>();
  27.   weightedVoters.put(vr1, 1.0);
  28.   weightedVoters.put(vr2, 1.0);
  29.   weightedVoters.put(vr3, 1.0);
  30.   weightedVoters.put(vr4, 1.0);
  31.   / /  Set the voting type
  32.   Map<String, Integer> types = new HashMap<>();
  33.   types.put("Support"1);
  34.   types.put("Oppose"-1);
  35.   types.put("Waive"0);
  36.   VoteType voteType = new VoteType(types);
  37.   //  Create a candidate object: Candidate
  38.   Person p1 = new Person("candidate1"19);
  39.   Person p2 = new Person("candidate2"20);
  40.   Person p3 = new Person("candidate3"20);
  41.   ArrayList<Person> candidates = new ArrayList<>();
  42.   candidates.add(p1);
  43.   candidates.add(p2);
  44.   //  Create voting items, the first three are voting items of voter vr1 for three candidates, and the last three are voting items of vr2
  45.   VoteItem<Person> vi11 = new VoteItem<>(p1, "Support");
  46.   Set<VoteItem<Person>> voteItems1 = new HashSet<>();
  47.   voteItems1.add(vi11);
  48.   VoteItem<Person> vi21 = new VoteItem<>(p1, "Oppose");
  49.   VoteItem<Person> vi22 = new VoteItem<>(p3, "Waive");
  50.   Set<VoteItem<Person>> voteItems2 = new HashSet<>();
  51.   voteItems2.add(vi21);
  52.   voteItems2.add(vi22);
  53.   VoteItem<Person> vi31 = new VoteItem<>(p1, "Oppose");
  54.   VoteItem<Person> vi32 = new VoteItem<>(p2, "like");
  55.   Set<VoteItem<Person>> voteItems3 = new HashSet<>();
  56.   voteItems3.add(vi31);
  57.   voteItems3.add(vi32);
  58.   VoteItem<Person> vi41 = new VoteItem<>(p1, "Support");
  59.   VoteItem<Person> vi42 = new VoteItem<>(p1, "Oppose");
  60.   Set<VoteItem<Person>> voteItems4 = new HashSet<>();
  61.   voteItems4.add(vi41);
  62.   voteItems4.add(vi42);
  63.   //  Create votes for 2 voters vr1 and vr2
  64.   Vote<Person> rv1 = new Vote<Person>(voteItems1, new GregorianCalendar(2019614161530));
  65.   Vote<Person> rv2 = new Vote<Person>(voteItems2, new GregorianCalendar(2019614161530));
  66.   Vote<Person> rv3 = new Vote<Person>(voteItems3, new GregorianCalendar(2019614161530));
  67.   Vote<Person> rv4 = new Vote<Person>(voteItems4, new GregorianCalendar(2019614161530));
  68. //  System.out.println("rv1 = " + rv1);
  69. //  System.out.println("rv2 = " + rv2);
  70.   //  Create poll event
  71.   GeneralPollImpl<Person> poll= new GeneralPollImpl<Person>();
  72.   //  Set the basic information of voting: name, date, voting type, number of votes
  73.   String  name =  " Representative Election" ;
  74.   GregorianCalendar date = new GregorianCalendar(2019614161530);
  75.   int quantity = 1;
  76.   poll.setInfo(name, date, voteType, quantity);
  77.   //  Add voters and their weight
  78.   poll.addVoters(weightedVoters);
  79.   poll.addCandidates(candidates);
  80.   //  Increase the votes of three voters
  81.   poll.addVote(rv1, vr1);
  82.   poll.addVote(rv2, vr2);
  83.   poll.addVote(rv3, vr3);
  84.   poll.addVote(rv4, vr4);
  85.   GeneralPollImpl election =  poll;
  86.   Map<Vote<Person>, Boolean> voteIsLegal = election.getVoteIsLegal();
  87.   for (Map.Entry<Vote<Person>, Boolean> voteBooleanEntry : voteIsLegal.entrySet()) {
  88.    Boolean isLegal = voteBooleanEntry.getValue();
  89.    assertEquals(false, isLegal);
  90.   }
  91.  }
    1. Integration /system testing

http://i-hit-edu-cn.ivpn.hit.edu.cn:1080/index#/app/home/index

      1. Part of the functional module test of the school's unified identity authentication system for undergraduates

3.2.1.1 Test case design

Unified identity authentication system for undergraduates

test sample

expected outcome

Final Results

Test for blank username and password inputs

Prompt for blank input

Test blank password input

Prompt for blank password input

Test correct user name and password input login

Login successfully, jump to the home page

Test Harbin Institute of Technology APP scan code login

Login successfully, jump to the home page

Test QQ login

Login successfully, jump to the home page

× Cannot log in with qq

Test WeChat login

Login successfully, jump to the home page

Password-free login within one week of testing

You can successfully log in without password within a week, and jump to the home page

×Unable to avoid password within a week

Test Forgot Password Retrieve Password

Password retrieved successfully

Test account activation function

Jump to the account activation page to complete the function

Test login page help documentation

The documentation can explain most of the problems when logging in

3.2.1.2 Test process and results

  1. Test for blank username and password inputs

 

Result: prompt please enter username

Meet expectations√

  1. Test blank password input

 

Result: prompt please enter password

Meet expectations√

  1. Test correct user name and password input login

 

Result: Successful login and jump to the home page

Meet expectations√

  1. Test Harbin Institute of Technology APP scan code login

 

Result: The code scanning box pops up and you can finally log in successfully

Meet expectations√

  1. Test QQ login

 

Result: Failed, calling QQ login may have some bugs that have not been resolved in the future

Did not meet expectations×

  1. Test WeChat login

 

Result: The code scanning box pops up and you can finally log in successfully

Meet expectations√

  1. Password-free login within one week of testing

 

Result: If you have not logged in without password within a week, you will be prompted to log in again before the week is over

Did not meet expectations×

  1. Test Forgot Password Retrieve Password

 

Result: Jump to the forgotten password page successfully, and you can try to change the password

Meet expectations√

  1. Test account activation function

 

Result: Jump to the account activation page successfully, and the account can be activated

Meet expectations√

  1. Test login page help documentation

 

Result: successfully jump to the help document

Meet expectations√

      1. UI usability test and evaluation of the school's undergraduate portal platform system

3.2.2.1 Test case design

test sample

expected outcome

Final Results

The default value, jump to the default value if the login is successful

Display the homepage by default

Input verification, verify whether the entered student number meets the specifications

Prompt that the student number does not meet the specifications

×Unable to prompt the standard format of student number

System response, quick response after clicking a function

Quickly jump to a new page

×Compared to other websites, the speed is slow

Information feedback, whether to give prompts for deleted school news

Prompt that the content has been deleted

3.2.2.2 Test process and results

  1. The default value, jump to the default value if the login is successful

Result: If you log in successfully, you will be redirected to the home page

Meet expectations√

  1. Input verification, verify whether the entered student number meets the specifications

Result: There is no error in the fixed format of the user name, but a simple error in the user name or password

Did not meet expectations×

  1. System response, quick response after clicking a function

结果:快速点击多个校内新闻,跳转打开速度较慢

不符合预期×

  1. 信息反馈,对于已经删除的校内新闻是否会给出提示

结果:校内过时新闻会提示访问页面不存在

符合预期√

3.2.2.3 UI可用性即用户体验评价结果

当前效果

可以改进为

在主页面的动态效果太少,多数是静态效果

可以多一点动态新闻图片展示

每一条新闻没有评论功能

添加评论功能

没有快速点开个人常用应用

添加某个用户自己最常用的应用列表

没有网站指引说明

添加网站指引说明

主页一大篇幅我的待办功能略显鸡肋

可以调整我的待办的位置

Guess you like

Origin blog.csdn.net/qq_35798433/article/details/130691485