service服务层
service服务曾在系统或者插件下service文件夹下,service的作用是实现相关业务的功能逻辑,同时为接口提供相关的数据结构。
- 打开系统你会发现service下有admin,api,core子项文件夹,这里是系统将不同的端口放在一起统一管理,包括后期插件开发也是分成不同端口管理。其中admin实现adminapi相关的业务逻辑,api实现api接口相关业务逻辑,core是业务中与接口无关的功能逻辑。
比如开发订单业务,admin考虑订单列表,订单详情,订单发货功能;api考虑订单创建,会员订单查询,订单收货等等。admin与api都会考虑订单列表,但是查询的角度不同,都会考虑订单生成,发货,收货,支付等相关功能逻辑,这样就放在core下面,为admin以及api提供深层的业务逻辑,本质上core数据业务逻辑的底层部分,admin以及api数据逻辑中表层部分,表层部分与接口往往一一对应,而底层的逻辑往往是不分端口的,更加根本的业务逻辑,这也是niucloud设计思路的一部分。
- 系统为了管理方便,对应的admin以及api下面也是分成不同的功能子项的,比如系统下面分成addon,member,auth,sys,user等,包括接口也是分成功能子项,两者往往是对应的,然后功能子项里面书写功能。
- 在功能子项里面书写相关的逻辑功能,这里与其他springboot项目相同,定义service接口,命名规范:I+主题+service,实现是impl,service的接收对象命名为param或者实体类,service处理后的返回数据可以是实体类,也可以是视图对象Vo,放在vo文件夹下面。
下面是关于站点相关的service服务实例
- 创建service接口类,命名规范是ISiteService
package com.niu.core.service.admin.site;
import com.niu.core.common.domain.PageResult;
import com.niu.core.entity.addon.Addon;
import com.niu.core.entity.site.Site;
import com.niu.core.entity.site.SiteGroup;
import com.niu.core.service.admin.site.param.SiteAddParam;
import com.niu.core.service.admin.site.param.SiteEditParam;
import com.niu.core.service.admin.site.param.SiteParam;
import com.niu.core.service.admin.site.param.SiteSearchParam;
import com.niu.core.common.domain.PageParam;
import com.niu.core.service.admin.site.vo.SiteInfoVo;
import com.niu.core.service.admin.site.vo.SiteListVo;
import java.util.List;
import java.util.Map;
/**
* 站点服务接口
*/
public interface ISiteService {
/**
* 站点列表
* @param pageParam 分页参数
* @param searchParam 搜索参数
* @return PageResult<SiteListVo>
*/
PageResult<SiteListVo> list(PageParam pageParam, SiteSearchParam searchParam);
/**
* 站点详情
* @param id 主键ID
* @return SiteInfoVo
*/
SiteInfoVo info(Integer id);
/**
* 站点添加
* @param addParam 添加参数
*/
void add(SiteAddParam addParam);
/**
* 站点编辑
* @param id 主键
* @param editParam 编辑参数
*/
void edit(Integer id, SiteEditParam editParam);
/**
* 站点删除
* @param id 主键ID
*/
void del(Integer id);
/**
* 关闭站点
* @param siteId
*/
void closeSite(Integer siteId);
/**
* 开启站点
* @param siteId
*/
void openSite(Integer siteId);
/**
* 获取站点的菜单列表
* @param siteId
* @param status
* @return
*/
Map<String, List<String>> getSiteApiList(Integer siteId, Integer status);
/**
* 通过条件检索 站点数量
* @param siteSearchParam
* @return
*/
Integer getSiteCountByCondition(SiteSearchParam siteSearchParam);
/**
* 获取站点的插件
* @return
*/
List<Addon> getSiteAddons();
/**
*
*
* @param site
* @param siteGroup
*/
void siteAddonChange(Site site, SiteGroup siteGroup);
}
- 站点创建,站点查询相关参数放在param下面,同时在param里面进行数据验证
package com.niu.core.service.admin.site.param;
import lombok.Data;
import java.io.Serializable;
/**
* 站点参数
*/
@Data
public class SiteSearchParam implements Serializable {
private static final long serialVersionUID = 1L;
private String keywords;
private Integer status;
private Integer groupId;
private String[] createTime;
private String[] expireTime;
private String app;
private String siteDomain;
private String appType;
}
package com.niu.core.service.admin.site.param;
import lombok.Data;
import java.io.Serializable;
import javax.validation.constraints.*;
/**
* 站点参数
*/
@Data
public class SiteParam implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "siteId参数缺失")
private Integer siteId;
@NotNull(message = "siteName参数缺失")
private String siteName;
@NotNull(message = "groupId参数缺失")
private Integer groupId;
@NotNull(message = "keywords参数缺失")
private String keywords;
@NotNull(message = "appType参数缺失")
private String appType;
@NotNull(message = "logo参数缺失")
private String logo;
@NotNull(message = "desc参数缺失")
private String desc;
@NotNull(message = "status参数缺失")
private Integer status;
@NotNull(message = "latitude参数缺失")
private String latitude;
@NotNull(message = "longitude参数缺失")
private String longitude;
@NotNull(message = "provinceId参数缺失")
private Integer provinceId;
@NotNull(message = "cityId参数缺失")
private Integer cityId;
@NotNull(message = "districtId参数缺失")
private Integer districtId;
@NotNull(message = "address参数缺失")
private String address;
@NotNull(message = "fullAddress参数缺失")
private String fullAddress;
@NotNull(message = "phone参数缺失")
private String phone;
@NotNull(message = "businessHours参数缺失")
private String businessHours;
@NotNull(message = "expireTime参数缺失")
private Long expireTime;
@NotNull(message = "frontEndName参数缺失")
private String frontEndName;
@NotNull(message = "frontEndLogo参数缺失")
private String frontEndLogo;
@NotNull(message = "frontEndIcon参数缺失")
private String frontEndIcon;
@NotNull(message = "icon参数缺失")
private String icon;
@NotNull(message = "memberNo参数缺失")
private Integer memberNo;
@NotNull(message = "app参数缺失")
private String app;
@NotNull(message = "addons参数缺失")
private String addons;
@NotNull(message = "initalledAddon参数缺失")
private String initalledAddon;
@NotNull(message = "siteDomain参数缺失")
private String siteDomain;
}
3.站点列表,站点详情相关数据结构放在vo下面
package com.niu.core.service.admin.site.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.enums.member.StatusEnum;
import com.niu.core.enums.site.SiteStatusEnum;
import lombok.Data;
import java.io.Serializable;
/**
* Site列表视图
*/
@Data
public class SiteListVo implements Serializable {
private static final long serialVersionUID = 1L;
/** 主键 */
private Integer siteId;
/** 站点名称 */
private String siteName;
/** 分组ID(0:不限制) */
private Integer groupId;
/** 站点套餐名称 */
private String groupName;
/** 关键字 */
private String keywords;
/** 站点类型 */
private String appType;
/** 站点logo */
private String logo;
/** 简介 */
private String desc;
/** 状态 1-正常 0-体验期 2-已到期 */
private Integer status;
/** 纬度 */
private String latitude;
/** 经度 */
private String longitude;
/** 省 */
private Integer provinceId;
/** 市 */
private Integer cityId;
/** 区 */
private Integer districtId;
/** 详细地址 */
private String address;
/** 完整地址 */
private String fullAddress;
/** 客服电话 */
private String phone;
/** 营业时间 */
private String businessHours;
/** 创建时间 */
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long createTime;
/** 到期时间(如果是0 无限期) */
@JsonSerialize(using = BeanJsonSerializer.LongDateToStringSerializer.class)
private Long expireTime;
/** 前台名称*/
private String frontEndName;
/** 前台logo */
private String frontEndLogo;
/** 前台icon */
private String frontEndIcon;
/** 网站图标 */
private String icon;
/** 最大会员码值 */
private String memberNo;
/** 站点应用 */
@JsonSerialize(using = BeanJsonSerializer.StringToJSONObjectSerializer.class)
private String app;
/** 站点包含的插件 */
@JsonSerialize(using = BeanJsonSerializer.StringToJSONObjectSerializer.class)
private String addons;
/** 站点已执行初始化方法的插件 */
private String initalledAddon;
/** 站点域名 */
private String siteDomain;
/** 站点管理员 */
private SiteAdminVo admin;
/** 状态名称 */
private String statusName;
public String getStatusName() {
return SiteStatusEnum.getNameByCode(this.status);
}
}
package com.niu.core.service.admin.site.vo;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.niu.core.common.domain.BeanJsonSerializer;
import com.niu.core.entity.addon.Addon;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* Site视图
*/
@Data
public class SiteInfoVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer siteId; // 主键
private String siteName; // 站点名称
private Integer groupId; // 分组ID(0:不限制)
private String groupName; //分组名称
private String keywords; // 关键字
private String appType; // 站点类型
private String logo; // 站点logo
private String desc; // 简介
private Integer status; // 状态 1-正常 0-体验期 2-已到期
private String latitude; // 纬度
private String longitude; // 经度
private Integer provinceId; // 省
private Integer cityId; // 市
private Integer districtId; // 区
private String address; // 详细地址
private String fullAddress; // 完整地址
private String phone; // 客服电话
private String businessHours; // 营业时间
private Long expireTime; // 到期时间(如果是0 无限期)
private String frontEndName; // 前台名称
private String frontEndLogo; // 前台logo
private String frontEndIcon; // 前台icon
private String icon; // 网站图标
private String memberNo; // 最大会员码值
@JsonSerialize(using = BeanJsonSerializer.StringToJsonSerializer.class)
private String app; // 站点应用
@JsonSerialize(using = BeanJsonSerializer.StringToJsonSerializer.class)
private String addons; // 站点包含的插件
private List<Addon> siteAddons;
private List<Addon> apps;
private List<String> addonKeys;
private String initalledAddon; // 站点已执行初始化方法的插件
private String siteDomain; // 站点域名
}
最后站点实现类,在impl下面命名SiteServiceImpl