前言

这是一个前后端分离的项目,后端使用Java进行开发,而前端通过微信小程序实现。

功能结构

天气小程序功能架构

可从上图得知,部分功能已去除:

  • 消息
    • 消息推送
    • 紧急情况推送
  • 用户
    • 个人中心

模型设计

用户信息(UserInfo)

  • id Long 主键
  • oid String OpenID
  • uid String UnionID
  • name String 昵称
  • phone_num String 手机号
  • avatar String 头像地址
  • authState String 登录状态
    • Silence 静默登录(目前程序的访问是需要存在登录态的)
    • Authorized 已授权
  • createTime Timestamp 记录创建时间
  • updateTime Timestamp 记录更新时间

行政区划信息(DistrictInfo)

使用全国行政区划信息填充,含空间数据,数据粒度到区县。目前仅支持国内数据。

  • id Long 主键
  • name String 行政区名称
  • grade Integer 行政区级别
    • 1:省级行政区
    • 2:地级行政区
    • 3:县级行政区
    • 4:乡镇级行政区
  • code String 行政区代码
  • centerPoint Point 行政区中心点(空间数据)
  • bounds Geometry 行政区边界(空间数据)

关注城市(FollowCity)

  • id Long 主键
  • userId Long 用户ID
  • districtId Long 行政区划ID
  • districtName String 行政区划名称
  • districtCode String 行政区划编码
  • orderNum Integer 序号,自然数,从1开始
  • createTime Timestamp 记录创建时间

天气信息

由于天气数据均来自第三方,目前数据格式于和风天气对齐。

通过对和风天气响应数据结构研究,抽象出基础响应,实际响应均继承该基础响应类,并实现getDataColumn方法,以标记对应数据列。

目前使用代理方式进行第三方接口调用,且将结构对齐交由前端进行,所以此处并未进行强格式定义。

基础响应信息

package org.fuyi.weather.infra.common.entity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.io.Serializable;

/**
 * 天气代理实体基础类
 *
 * @author: <a href="mailto:thread.zhou@gmail.com">Fuyi</a>
 * @time: 2022/2/1 下午3:22
 * @since: 1.0
 */
public abstract class AbstractWeatherProxyWrappedEntity implements Serializable {

    private static final long serialVersionUID = 5559333755209092109L;
    /**
     * API状态码,具体含义请参考状态码
     * 参考 <a>https://dev.qweather.com/docs/resource/status-code/</a>
     */
    private String code;
    /**
     * 当前API的最近更新时间
     * 参考 <a>https://dev.qweather.com/docs/resource/glossary/#update-time</a>
     */
    private String updateTime;
    /**
     * 当前数据的响应式页面,便于嵌入网站或应用
     */
    private String fxLink;

    private JSONObject refer;

    private JSON data;

    public AbstractWeatherProxyWrappedEntity() {
    }

		// 标记数据列
		public abstract String getDataColumn();

		// get and set method.
    ...
}

实时空气数据(例)

package org.fuyi.weather.domain.entity;

import lombok.*;
import org.fuyi.weather.infra.common.constant.WeatherProxyConstant;
import org.fuyi.weather.infra.common.entity.AbstractWeatherProxyWrappedEntity;

/**
 * @author: <a href="mailto:thread.zhou@gmail.com">Fuyi</a>
 * @time: 2022/2/1 下午4:07
 * @since: 1.0
 */
@Data
@Builder
@NoArgsConstructor
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = false)
public class AirRealTimeEntity extends AbstractWeatherProxyWrappedEntity {
    @Override
    public String getDataColumn() {
				// WeatherProxyConstant.DataColumn.NOW --> "now"
        return WeatherProxyConstant.DataColumn.NOW;
    }
}

参考

说明

如有冒犯,我在这里先向您道歉,还请联系我进行处理

email: thread_zhou@126.com