Technical Stack
Backend Framework: Spring Boot
Spring Boot is designed to create standalone, production-grade Spring-based applications with minimal configuration. Its convension-over-configuration approach reduces boilerplate code, allowing developers to focus on business logic. The framework includes embedded servers (Tomcat, Undertow, Jetty), enabling deployment as executable JARs via java -jar. Spring Boot also provides Actuator for runtime monitoring and a rich set of starters for security, data access, messaging, and caching.
Frontend Framework: Vue.js
Vue.js is a progressive JavaScript framework for building user interfaces and single-page applications. Its reactive data binding system simplifies view and state management. Vue's component-based architecture promotes code reuse and testability. The framework boasts a vibrant ecosystem with plugins, tools, and extensive documentation.
Core Code
The following code snippets illustrate the application's entry point and a user controller.
Appplication Entry Point
package com;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
@MapperScan(basePackages = {"com.dao"})
public class SpringbootSchemaApplication extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(SpringbootSchemaApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
return applicationBuilder.sources(SpringbootSchemaApplication.class);
}
}
User Controller
package com.controller;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;
import com.entity.YonghuEntity;
import com.entity.view.YonghuView;
import com.service.YonghuService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MPUtil;
import com.utils.MapUtils;
import com.utils.CommonUtil;
import java.io.IOException;
@RestController
@RequestMapping("/yonghu")
public class YonghuController {
@Autowired
private YonghuService yonghuService;
@Autowired
private TokenService tokenService;
@IgnoreAuth
@RequestMapping(value = "/login")
public R login(String username, String password, String captcha, HttpServletRequest request) {
YonghuEntity u = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", username));
if(u==null || !u.getMima().equals(password)) {
return R.error("Account or password incorrect");
}
String token = tokenService.generateToken(u.getId(), username, "yonghu", "User");
return R.ok().put("token", token);
}
@IgnoreAuth
@RequestMapping("/register")
public R register(@RequestBody YonghuEntity yonghu) {
YonghuEntity u = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", yonghu.getYonghuzhanghao()));
if(u!=null) {
return R.error("User already exists");
}
Long uId = new Date().getTime();
yonghu.setId(uId);
yonghuService.insert(yonghu);
return R.ok();
}
@RequestMapping("/logout")
public R logout(HttpServletRequest request) {
request.getSession().invalidate();
return R.ok("Logout successful");
}
@RequestMapping("/session")
public R getCurrUser(HttpServletRequest request) {
Long id = (Long)request.getSession().getAttribute("userId");
YonghuEntity u = yonghuService.selectById(id);
return R.ok().put("data", u);
}
@IgnoreAuth
@RequestMapping(value = "/resetPass")
public R resetPass(String username, HttpServletRequest request) {
YonghuEntity u = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", username));
if(u==null) {
return R.error("Account does not exist");
}
u.setMima("123456");
yonghuService.updateById(u);
return R.ok("Password reset to: 123456");
}
@RequestMapping("/page")
public R page(@RequestParam Map<String, Object> params, YonghuEntity yonghu, HttpServletRequest request) {
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params));
return R.ok().put("data", page);
}
@IgnoreAuth
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params, YonghuEntity yonghu, HttpServletRequest request) {
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
PageUtils page = yonghuService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, yonghu), params), params));
return R.ok().put("data", page);
}
@RequestMapping("/lists")
public R list(YonghuEntity yonghu) {
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
ew.allEq(MPUtil.allEQMapPre(yonghu, "yonghu"));
return R.ok().put("data", yonghuService.selectListView(ew));
}
@RequestMapping("/query")
public R query(YonghuEntity yonghu) {
EntityWrapper<YonghuEntity> ew = new EntityWrapper<YonghuEntity>();
ew.allEq(MPUtil.allEQMapPre(yonghu, "yonghu"));
YonghuView yonghuView = yonghuService.selectView(ew);
return R.ok("User query successful").put("data", yonghuView);
}
@RequestMapping("/info/{id}")
public R info(@PathVariable("id") Long id) {
YonghuEntity yonghu = yonghuService.selectById(id);
return R.ok().put("data", yonghu);
}
@IgnoreAuth
@RequestMapping("/detail/{id}")
public R detail(@PathVariable("id") Long id) {
YonghuEntity yonghu = yonghuService.selectById(id);
return R.ok().put("data", yonghu);
}
@RequestMapping("/save")
public R save(@RequestBody YonghuEntity yonghu, HttpServletRequest request) {
if(yonghuService.selectCount(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", yonghu.getYonghuzhanghao()))>0) {
return R.error("User account already exists");
}
yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
YonghuEntity u = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", yonghu.getYonghuzhanghao()));
if(u!=null) {
return R.error("User already exists");
}
yonghu.setId(new Date().getTime());
yonghuService.insert(yonghu);
return R.ok();
}
@RequestMapping("/add")
public R add(@RequestBody YonghuEntity yonghu, HttpServletRequest request) {
if(yonghuService.selectCount(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", yonghu.getYonghuzhanghao()))>0) {
return R.error("User account already exists");
}
yonghu.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
YonghuEntity u = yonghuService.selectOne(new EntityWrapper<YonghuEntity>().eq("yonghuzhanghao", yonghu.getYonghuzhanghao()));
if(u!=null) {
return R.error("User already exists");
}
yonghu.setId(new Date().getTime());
yonghuService.insert(yonghu);
return R.ok();
}
@RequestMapping("/update")
@Transactional
public R update(@RequestBody YonghuEntity yonghu, HttpServletRequest request) {
if(yonghuService.selectCount(new EntityWrapper<YonghuEntity>().ne("id", yonghu.getId()).eq("yonghuzhanghao", yonghu.getYonghuzhanghao()))>0) {
return R.error("User account already exists");
}
yonghuService.updateById(yonghu);
return R.ok();
}
@RequestMapping("/delete")
public R delete(@RequestBody Long[] ids) {
yonghuService.deleteBatchIds(Arrays.asList(ids));
return R.ok();
}
}
System Testing
Purpose
System testing is a critical phase in the development lifecycle. It ensures the application meets quality standards and is the final check before release. The goal is to identify defects, verify that the system aligns with the requirements specification, and enhance user experience by simulating various scenarios.
Functional Testing
Functional tests were conducted using black-box techniques. Test cases cover input validation, boundary values, required fields, and permission checks. For example, the login module verifies credentials against stored data, and access controls are enforced based on user roles.
Conclusion
The system passed functional and performance tests, meeting the design requirements. The testing process confirmed that all modules operate correctly and that the user interface is intuitive. Source code and deployment instructions are available upon request.