SpringBoot从零搭建一个项目(四)用户系统架构

一、数据库设计
SpringBoot从零搭建一个项目(四)用户系统架构_第1张图片
二、Java架构
整体架构如下:
SpringBoot从零搭建一个项目(四)用户系统架构_第2张图片主要分为:持久层、业务层和控制层。
1、数据集合
省略get和set方法

public class User {
	private Integer id;
	private String nickName;
	private String avatarUrl;
	private String openid;
	private String unionid;
	private String createDate;
}

2、持久层

@Repository
public class UserDao {

	@Autowired
	private JdbcTemplate jdbcTemplate;

	/**
	 * 根据openid查询用户
	 * @param openid
	 * @return
	 */
	public User findUserByOpenid(String openid) {
		String sql = "select * from user where openid = ?";
		User user = null;
		try {
			user = jdbcTemplate.queryForObject(sql, new String[] { openid }, new RowMapper() {
				public User mapRow(ResultSet rs, int rowNum) throws SQLException {
					User user = new User();
					user.setId(rs.getInt("id"));
					user.setNickName(rs.getString("nickName"));
					user.setAvatarUrl(rs.getString("avatarUrl"));
					user.setCreateDate(rs.getString("create_date"));
					user.setOpenid(rs.getString("openid"));
					return user;
				}
			});
		} catch (Exception e) {
			// TODO: handle exception
		}
		return user;
	}

	/**
	 * 新增
	 * 
	 * @param user
	 * @return
	 */
	public int addUser(final User user) {
		final String sql = "insert into user (nickName,avatarUrl,openid,unionid) values(?,?,?,?)";
		KeyHolder keyHolder = new GeneratedKeyHolder();
		jdbcTemplate.update(new PreparedStatementCreator() {

			public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
				PreparedStatement ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
				ps.setString(1, user.getNickName());
				ps.setString(2, user.getAvatarUrl());
				ps.setString(3, user.getOpenid());
				ps.setString(4, user.getUnionid());
				return ps;
			}

		}, keyHolder);
		return keyHolder.getKey().intValue();
	}
}

类名上使用@Repository修饰,自动注入JdbcTemplate 操作数据库。
2、业务层

public interface IUserService {
	User findUserByOpenid(String openid);
	int addUser(User user);
}

上面是接口定义。

@Service
public class UserService implements IUserService {
	
	@Autowired
	private UserDao userDao;

	public int addUser(User user) {
		return userDao.addUser(user);
	}

	public User findUserByOpenid(String openid) {
		return userDao.findUserByOpenid(openid);
	}

}

业务层实现,使用@Service修饰,自动注入持久层。
3、控制层

@RestController
@RequestMapping("/user")
public class UserController extends BaseController {
	
	@Autowired
	private IUserService userService;
	
	@Autowired
	private WxConfig wxConfig;

	@RequestMapping("/login")
	public String registerAndLogin(
			@RequestParam("code") String code,
			@RequestParam("nickName") String nickName,
			@RequestParam("avatarUrl") String avatarUrl) {
		
		 // 配置请求参数
        Map param = new HashMap();
        param.put("appid", wxConfig.getAppid());
        param.put("secret", wxConfig.getAppsecret());
        param.put("js_code", code);
        param.put("grant_type", "authorization_code");
        // 发送请求
        String wxResult = HttpClientUtil.doGet(wxConfig.getLoginUrl(), param);
        JSONObject jsonObject = JSONObject.fromObject(wxResult);
        // 获取参数返回的
        int errcode = jsonObject.optInt("errcode");
        if (errcode != 0) {
			// 失败
        	return fail();
		}
        String session_key = jsonObject.optString("session_key");
        String openid = jsonObject.optString("openid");
        String unionid = jsonObject.optString("unionid");
        String errmsg = jsonObject.optString("errmsg");
        
        User user = userService.findUserByOpenid(openid);
        if (user != null) {
    		return success(user);
		}
        
        user = new User();
        user.setNickName(nickName);
        user.setAvatarUrl(avatarUrl);
        user.setOpenid(openid);
        user.setUnionid(unionid);
        user.setCreateDate(new Date().toString());
        int id = userService.addUser(user);
        user.setId(id);

		return success(user);
	}
}

使用@RestController修饰,注入业务层。@RequestMapping指定访问路径,这里的路径是/user/login,全路径:http://127.0.0.1:8083/user/login?code=1&nickName=2&avatarUrl=3

这里返回我做了json封装,放在下节来说吧。

你可能感兴趣的:(SpringBoot)