# openEA最佳拍档基础应用 **Repository Path**: hakd/perpartner-BasicServerApi ## Basic Information - **Project Name**: openEA最佳拍档基础应用 - **Description**: openEA最佳拍档基础应用 主要用于建设最佳拍档中的所有后台公用的应用子系统,例如用户系统、用户成长系统、积分系统、时间轴系统、标签系统、消息系统等等,属于平台支撑级的子系统源码库 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2022-02-09 - **Last Updated**: 2024-05-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: SpringBoot, Java ## README # openEA最佳拍档基础应用 #### 介绍 openEA最佳拍档基础应用 主要用于建设最佳拍档中的所有后台公用的应用子系统,例如用户系统、用户成长系统、积分系统、时间轴系统、标签系统、消息系统等等,属于平台支撑级的子系统源码库 #### 软件架构 pepartner-common 公共模块 pepartner-framework 提供日志切面、公共配置 pepartner-modules 业务模块 1. pepartner-auth SSO认证中心 2. pepartner-minrest 统一接口 3. pepartner-payment 积分系统 4. pepartner-ssosamples SSO使用示例 5. pepartner-sysuser 用户系统 6. pepartner-timelime 时间轴 pepartner-system 提供用户基础功能,当前供framework引用,可能需要修改 #### 使用说明 1. **前端参数** serverId 用来指定后端子系统,为空或minrest时,后端访问minrest系统;为user时,后端访问用户系统;为pay时,后端访问积分系统 beanName 相当于当前的wf_num,由于后端是通过反射机制执行业务规则,而springboot的javabean交由容器统一管理,需要使用@Service注解指定业务类bean名称,通过beanName从上下文获取业务类执行对应的业务 userId 用户id,切面记录日志使用 nickName 昵称,切面记录日志使用 methodName 方法名,可不传,默认执行run函数,不传方法名时,service类必须提供run函数,并且返回执行结果 …… 其他业务参数 2. 后端逻辑 前端请求统一经过minrest,通过filter将前端请求的所有参数封装成JSONObject,minrest作为消息发布者,根据serverId,将消息发布到对应的topic队列,各子系统作为消费者,从对应队列取出消息消费并把结果返回给minrest,minrest将最终结果返回给前端 3. 业务开发 由于通过反射机制执行业务类,所以不需要写controller 以minrest为例,提供rulelib编写业务代码,由于git只检测文件的变动,不检测空文件夹,无法提交,实际开发时若如下文件夹为空时,自行添加即可。 ![](/perpartner-modules/perpartner-sysuser/src/main/resources/images/1655106778(1).jpg) entity 实体层;为提升代码可读性,可按appid创建文件夹细分 ```java //指定表名 @TableName("sys_user") //使用lombok插件,无需手动编写getter和setter方法 @Data public class SysUser extends BaseEntity { private Long unid; …… private String stepstatus; @TableField(fill = FieldFill.INSERT) private String createtime; @TableField(fill = FieldFill.INSERT) private String updatetime; } ``` mapper dao层 ;为提升代码可读性,可按appid创建文件夹细分 ```java /** * 使用mybatis-plus,集成BaseMapper接口,内部封装了许多CRUD操作 * 若mybatis-plus提供的api无法满足业务需求,可自定义方法,使用@select("select * from xx")注解实现sql **/ @Repository public interface SysUserMapper extends BaseMapper{ } ``` ```Java @Repository public interface TMapper extends BaseMapper { @Select("select * from tableName where unid = #{unid}") T searchById(String unid); @Select("SELECT * FROM tableName ${ew.customSqlSegment} ") List selectList(@Param("ew") QueryWrapper queryWrapper); } ``` ``` join查询可参考timeline模块,TimelineService.getTimelineData()方法 ``` ![](/perpartner-modules/perpartner-sysuser/src/main/resources/images/1655107108(1).jpg) service 业务层 ;为提升代码可读性,可按appid创建文件夹细分 QueryWrapper wrapper = new QueryWrapper<>(); 构造查询条件 ```java /** * @author Administrator */ @Service public class SysUserServiceImpl implements ISysUserService { @Autowired SysUserMapper sysUserMapper; @Override public String checkUserUnique(String userid) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("userid",userid); int count = sysUserMapper.selectCount(wrapper); return count >0?UserConstants.NOT_UNIQUE:UserConstants.UNIQUE; } @Override public String checkUserUnique(String openid, String unionid) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("unionid",unionid); wrapper.eq("openid",openid); int count = sysUserMapper.selectCount(wrapper); return count >0?UserConstants.NOT_UNIQUE:UserConstants.UNIQUE; } @Override public SysUser getUserDetail(String openid, String unionid) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("unionid",unionid); wrapper.eq("openid",openid); SysUser user = sysUserMapper.selectOne(wrapper); Optional opt = Optional.ofNullable(user); return opt.map(sysUser -> user).orElse(null); } @Override public SysUser getUserDetail(String userid) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.and(query-> query.eq("userid",userid) .or().eq("unionid",userid) .or().eq("openid",userid) .or().eq("myopenid",userid)); SysUser user = sysUserMapper.selectOne(wrapper); Optional opt = Optional.ofNullable(user); return opt.map(sysUser -> user).orElse(null); } @Override public List getUserDetail(List userList) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.and( wrap-> wrap.in("userid",userList) .or().in("unionid",userList) .or().in("openid",userList) .or().in("myopenid",userList)); return sysUserMapper.selectList(wrapper); } …… } ``` vo #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)