SpringBoot从零搭建一个项目(四)用户系统架构
一、数据库设计
二、Java架构
整体架构如下:主要分为:持久层、业务层和控制层。
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<User>() {
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<String, String> 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封装,放在下节来说吧。
还没有评论,来说两句吧...