This commit is contained in:
dute7liang
2024-01-02 23:32:11 +08:00
parent 2f918497c3
commit 322bd479e2
15 changed files with 177 additions and 41 deletions

View File

@@ -173,7 +173,7 @@ mybatis-plus:
dbConfig: dbConfig:
# 主键类型 # 主键类型
# AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID # AUTO 自增 NONE 空 INPUT 用户输入 ASSIGN_ID 雪花 ASSIGN_UUID 唯一 UUID
idType: ASSIGN_ID idType: AUTO
# 逻辑已删除值 # 逻辑已删除值
logicDeleteValue: 2 logicDeleteValue: 2
# 逻辑未删除值 # 逻辑未删除值

View File

@@ -145,17 +145,17 @@ public class CaiLoginManager {
try { try {
UserInvite check = userInviteService.getByUserId(user.getId()); UserInvite check = userInviteService.getByUserId(user.getId());
if(check == null){ if(check == null){
UserInfo userInfo = userInfoService.getByUserId(user.getId()); UserInfo inviteUserInfo = userInfoService.getByUserId(inviteUser.getId());
UserInvite userInvite = new UserInvite(); UserInvite userInvite = new UserInvite();
userInvite.setUserId(user.getId()); userInvite.setUserId(user.getId());
userInvite.setInviteId(user.getInviteId()); userInvite.setInviteId(user.getInviteId());
userInvite.setVideoIncomeRate(userInfo.getVideoIncomeRate()); userInvite.setVideoIncomeRate(inviteUserInfo.getVideoIncomeRate());
userInvite.setGuardIncomeRate(userInfo.getGuardIncomeRate()); userInvite.setGuardIncomeRate(inviteUserInfo.getGuardIncomeRate());
userInvite.setGiftIncomeRate(userInfo.getGiftIncomeRate()); userInvite.setGiftIncomeRate(inviteUserInfo.getGiftIncomeRate());
userInvite.setPayIncomeRate(userInfo.getPayIncomeRate()); userInvite.setPayIncomeRate(inviteUserInfo.getPayIncomeRate());
if(inviteUser.getIsUnion() == 1){ if(inviteUser.getIsUnion() == 1){
BigDecimal unionOneRate = systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_ONE_INCOME_RATE); BigDecimal unionOneRate = systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_ONE_INCOME_RATE);
BigDecimal videoIncome = NumberUtil.add(userInfo.getVideoIncomeRate(), unionOneRate); BigDecimal videoIncome = NumberUtil.add(inviteUserInfo.getVideoIncomeRate(), unionOneRate);
userInvite.setVideoIncomeRate(videoIncome); userInvite.setVideoIncomeRate(videoIncome);
} }
userInviteService.save(userInvite); userInviteService.save(userInvite);
@@ -178,6 +178,7 @@ public class CaiLoginManager {
if(checkUnionUser != null){ if(checkUnionUser != null){
UnionUser unionUser = new UnionUser(); UnionUser unionUser = new UnionUser();
unionUser.setUnionId(union.getId()); unionUser.setUnionId(union.getId());
unionUser.setUnionUserId(union.getUserId());
unionUser.setUserId(user.getId()); unionUser.setUserId(user.getId());
unionUser.setVideoDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE)); unionUser.setVideoDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE));
unionUser.setGiftDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE)); unionUser.setGiftDivide(systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.DEFAULT_UNION_VIDEO_INCOME_RATE));

View File

@@ -3,6 +3,7 @@ package com.ruoyi.cai.controller.admin;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.Union; import com.ruoyi.cai.domain.Union;
import com.ruoyi.cai.dto.admin.query.UsercodeReq;
import com.ruoyi.cai.dto.admin.vo.UnionAdminVo; import com.ruoyi.cai.dto.admin.vo.UnionAdminVo;
import com.ruoyi.cai.service.UnionService; import com.ruoyi.cai.service.UnionService;
import com.ruoyi.common.annotation.Log; import com.ruoyi.common.annotation.Log;
@@ -66,13 +67,10 @@ public class UnionController extends BaseController {
@Log(title = "工会列表", businessType = BusinessType.INSERT) @Log(title = "工会列表", businessType = BusinessType.INSERT)
@RepeatSubmit() @RepeatSubmit()
@PostMapping() @PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody Union bo) { public R<Void> add(@Validated(AddGroup.class) @RequestBody UsercodeReq bo) {
return toAjax(unionService.save(bo)); return toAjax(unionService.saveUnion(bo.getUsercode()));
} }
/**
* 修改工会列表
*/
@SaCheckPermission("cai:userUnion:edit") @SaCheckPermission("cai:userUnion:edit")
@Log(title = "工会列表", businessType = BusinessType.UPDATE) @Log(title = "工会列表", businessType = BusinessType.UPDATE)
@RepeatSubmit() @RepeatSubmit()
@@ -82,15 +80,12 @@ public class UnionController extends BaseController {
} }
/** /**
* 删除工会列表 * 解散工会
*
* @param ids 主键串
*/ */
@SaCheckPermission("cai:userUnion:remove") @SaCheckPermission("cai:userUnion:remove")
@Log(title = "工会列表", businessType = BusinessType.DELETE) @Log(title = "工会列表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{id}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") public R<Void> dissolve(@NotNull(message = "主键不能为空") @PathVariable Long id) {
@PathVariable Long[] ids) { return toAjax(unionService.dissolve(id));
return toAjax(unionService.removeBatchByIds(Arrays.asList(ids)));
} }
} }

View File

@@ -1,8 +1,10 @@
package com.ruoyi.cai.controller.admin; package com.ruoyi.cai.controller.admin;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.User; import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.domain.UserCodeGen;
import com.ruoyi.cai.dto.admin.query.ResetPasswordReq; import com.ruoyi.cai.dto.admin.query.ResetPasswordReq;
import com.ruoyi.cai.dto.admin.query.UserUpdateAdminReq; import com.ruoyi.cai.dto.admin.query.UserUpdateAdminReq;
import com.ruoyi.cai.dto.admin.vo.UserAdminVo; import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
@@ -19,12 +21,15 @@ import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.core.validate.EditGroup;
import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* 用户 * 用户
@@ -51,6 +56,24 @@ public class UserController extends BaseController {
return TableDataInfo.build(result); return TableDataInfo.build(result);
} }
@GetMapping("/getByUsercode")
public R<User> getByUsercode(String usercode){
return R.ok(userService.getByUserCode(usercode));
}
@GetMapping("/listByUserCode")
public R<List<String>> listByUserCode(String usercode,int limit){
if(limit == 0){
limit = 40;
}
List<User> users = userService.list(Wrappers.lambdaQuery(User.class)
.select(User::getUsercode)
.like(StringUtils.isNotEmpty(usercode), User::getUsercode, usercode)
.last("limit " + limit));
return R.ok(users.stream().map(User::getUsercode).collect(Collectors.toList()));
}
/** /**
* 获取用户详细信息 * 获取用户详细信息
* *
@@ -97,16 +120,10 @@ public class UserController extends BaseController {
return R.ok(); return R.ok();
} }
/**
* 删除用户
*
* @param ids 主键串
*/
@SaCheckPermission("cai:user:remove") @SaCheckPermission("cai:user:remove")
@Log(title = "用户", businessType = BusinessType.DELETE) @Log(title = "用户", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{id}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") public R<Void> remove(@NotNull(message = "主键不能为空") @PathVariable Long id) {
@PathVariable Integer[] ids) { return toAjax(userService.removeUser(id));
return toAjax(userService.removeBatchByIds(Arrays.asList(ids)));
} }
} }

View File

@@ -29,6 +29,7 @@ public class UnionUser implements Serializable {
* 工会id * 工会id
*/ */
private Long unionId; private Long unionId;
private Long unionUserId;
/** /**
* 用户id * 用户id
*/ */

View File

@@ -1,5 +1,6 @@
package com.ruoyi.cai.domain; package com.ruoyi.cai.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
@@ -22,7 +23,7 @@ public class UserForbid implements Serializable {
/** /**
* *
*/ */
@TableId(value = "id") @TableId(value = "id",type = IdType.INPUT)
private Long id; private Long id;
/** /**
* 类型 1 封用户uid 2.封设备uuid 3.imei 4.mac * 类型 1 封用户uid 2.封设备uuid 3.imei 4.mac

View File

@@ -0,0 +1,8 @@
package com.ruoyi.cai.dto.admin.query;
import lombok.Data;
@Data
public class UsercodeReq {
private String usercode;
}

View File

@@ -27,5 +27,6 @@ public class AnchorAdminVo extends Anchor {
private Integer gender; private Integer gender;
private Integer age; private Integer age;
private Long city; private Long cityId;
private String city;
} }

View File

@@ -17,4 +17,8 @@ public interface UnionService extends IService<Union> {
Page<UnionAdminVo> pageAdmin(PageQuery pageQuery, UnionAdminVo bo); Page<UnionAdminVo> pageAdmin(PageQuery pageQuery, UnionAdminVo bo);
Union getByUserId(Long userId); Union getByUserId(Long userId);
boolean dissolve(Long id);
boolean saveUnion(String usercode);
} }

View File

@@ -39,4 +39,5 @@ public interface UserService extends IService<User> {
void resetPassword(String mobile, String password); void resetPassword(String mobile, String password);
boolean removeUser(Long id);
} }

View File

@@ -3,12 +3,15 @@ package com.ruoyi.cai.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.Union; import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.admin.vo.UnionAdminVo; import com.ruoyi.cai.dto.admin.vo.UnionAdminVo;
import com.ruoyi.cai.mapper.UnionMapper; import com.ruoyi.cai.mapper.UnionMapper;
import com.ruoyi.cai.service.UnionService; import com.ruoyi.cai.service.*;
import com.ruoyi.common.core.domain.PageQuery; import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 工会列表Service业务层处理 * 工会列表Service业务层处理
@@ -19,6 +22,15 @@ import org.springframework.stereotype.Service;
@Service @Service
public class UnionServiceImpl extends ServiceImpl<UnionMapper, Union> implements UnionService { public class UnionServiceImpl extends ServiceImpl<UnionMapper, Union> implements UnionService {
@Autowired
private UnionUserService unionUserService;
@Autowired
private UserInviteService inviteService;
@Autowired
private UserInfoService userInfoService;
@Autowired
private UserService userService;
@Override @Override
public Page<UnionAdminVo> pageAdmin(PageQuery pageQuery, UnionAdminVo bo) { public Page<UnionAdminVo> pageAdmin(PageQuery pageQuery, UnionAdminVo bo) {
return baseMapper.pageAdmin(pageQuery.build(),bo); return baseMapper.pageAdmin(pageQuery.build(),bo);
@@ -28,4 +40,47 @@ public class UnionServiceImpl extends ServiceImpl<UnionMapper, Union> implements
public Union getByUserId(Long userId) { public Union getByUserId(Long userId) {
return this.getOne(Wrappers.lambdaQuery(Union.class).eq(Union::getUserId,userId).last("limit 1")); return this.getOne(Wrappers.lambdaQuery(Union.class).eq(Union::getUserId,userId).last("limit 1"));
} }
@Override
@Transactional(rollbackFor = Exception.class)
public boolean dissolve(Long id) {
Union union = this.getById(id);
if(union == null){
throw new ServiceException("工会不存在");
}
boolean b = this.removeById(id);
if(!b){
throw new ServiceException("工会不存在");
}
unionUserService.remove(Wrappers.lambdaQuery(UnionUser.class).eq(UnionUser::getUnionId,id));
UserInfo userInfo = userInfoService.getByUserId(union.getUserId());
inviteService.update(Wrappers.lambdaUpdate(UserInvite.class)
.eq(UserInvite::getInviteId,union.getUserId())
.set(UserInvite::getVideoIncomeRate,userInfo.getVideoIncomeRate())
.set(UserInvite::getGiftIncomeRate,userInfo.getGuardIncomeRate())
.set(UserInvite::getGuardIncomeRate,userInfo.getGuardIncomeRate())
.set(UserInvite::getPayIncomeRate,userInfo.getPayIncomeRate()));
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean saveUnion(String usercode) {
User user = userService.getByUserCode(usercode);
if(user == null){
throw new ServiceException("用户不存在");
}
boolean update = userService.update(Wrappers.lambdaUpdate(User.class).eq(User::getId, user.getId())
.eq(User::getIsUnion, 0)
.set(User::getIsUnion, 1));
if(!update){
throw new ServiceException("新建工会失败,工会已存在");
}
Union union = new Union();
union.setUserId(user.getId());
union.setName("工会"+user.getUsercode());
union.setEnableRate(true);
this.save(union);
return true;
}
} }

View File

@@ -4,8 +4,7 @@ import cn.dev33.satoken.secure.BCrypt;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.Anchor; import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.dto.admin.vo.UserAdminVo; import com.ruoyi.cai.dto.admin.vo.UserAdminVo;
import com.ruoyi.cai.dto.app.query.index.GreetQuery; import com.ruoyi.cai.dto.app.query.index.GreetQuery;
import com.ruoyi.cai.dto.app.query.index.UserQuery; import com.ruoyi.cai.dto.app.query.index.UserQuery;
@@ -20,6 +19,7 @@ import com.ruoyi.common.helper.LoginHelper;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 用户Service业务层处理 * 用户Service业务层处理
@@ -43,6 +43,16 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
private UserGiftService userGiftService; private UserGiftService userGiftService;
@Autowired @Autowired
private UserOnlineService userOnlineService; private UserOnlineService userOnlineService;
@Autowired
private UserInfoService userInfoService;
@Autowired
private UserInviteService userInviteService;
@Autowired
private AccountService accountService;
@Autowired
private UserCountService userCountService;
@Autowired
private DynamicImagesService dynamicImagesService;
@Override @Override
public User getByUsername(String username) { public User getByUsername(String username) {
@@ -152,4 +162,50 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
.eq(User::getMobile,mobile) .eq(User::getMobile,mobile)
.set(User::getPassword,BCrypt.hashpw(password))); .set(User::getPassword,BCrypt.hashpw(password)));
} }
@Autowired
private UserGreetService userGreetService;
@Autowired
private UserMemberService userMemberService;
@Autowired
private UserForbidService userForbidService;
@Autowired
private AnchorApplyService anchorApplyService;
@Override
@Transactional(rollbackFor = Exception.class)
public boolean removeUser(Long id) {
User user = this.getById(id);
if(user == null){
throw new ServiceException("用户不存在");
}
if(user.getIsUnion() == 1){
throw new ServiceException("该用户为会长,无法删除,请先前往工会列表解散工会");
}
if(user.getType() == 1){
throw new ServiceException("该员工为内部员工,禁止删除");
}
boolean b = this.removeById(id);
if(!b){
throw new ServiceException("用户不存在");
}
userOnlineService.remove(Wrappers.lambdaQuery(UserOnline.class).eq(UserOnline::getUserId, id));
userInfoService.remove(Wrappers.lambdaQuery(UserInfo.class).eq(UserInfo::getUserId, id));
userInviteService.remove(Wrappers.lambdaQuery(UserInvite.class).eq(UserInvite::getUserId, id));
userInviteService.remove(Wrappers.lambdaQuery(UserInvite.class).eq(UserInvite::getInviteId, id));
accountService.remove(Wrappers.lambdaQuery(Account.class).eq(Account::getUserId, id));
userCountService.remove(Wrappers.lambdaQuery(UserCount.class).eq(UserCount::getUserId, id));
anchorService.remove(Wrappers.lambdaQuery(Anchor.class).eq(Anchor::getUserId, id));
userAlbumService.remove(Wrappers.lambdaQuery(UserAlbum.class).eq(UserAlbum::getUserId, id));
dynamicService.remove(Wrappers.lambdaQuery(Dynamic.class).eq(Dynamic::getUserId, id));
dynamicImagesService.remove(Wrappers.lambdaQuery(DynamicImages.class).eq(DynamicImages::getUserId, id));
userFollowService.remove(Wrappers.lambdaQuery(UserFollow.class).eq(UserFollow::getUserId, id));
userFollowService.remove(Wrappers.lambdaQuery(UserFollow.class).eq(UserFollow::getFollowUser, id));
userGreetService.remove(Wrappers.lambdaQuery(UserGreet.class).eq(UserGreet::getUserId,id));
userMemberService.remove(Wrappers.lambdaQuery(UserMember.class).eq(UserMember::getUserId,id));
userForbidService.remove(Wrappers.lambdaQuery(UserForbid.class).eq(UserForbid::getId,id));
anchorApplyService.remove(Wrappers.lambdaQuery(AnchorApply.class).eq(AnchorApply::getId,id));
return true;
}
} }

View File

@@ -25,6 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
t1.*,t2.age,t2.avatar,t2.usercode,t2.nickname,t2.mobile,t2.gender,t2.age,t2.city t1.*,t2.age,t2.avatar,t2.usercode,t2.nickname,t2.mobile,t2.gender,t2.age,t2.city
from cai_anchor t1 from cai_anchor t1
left join cai_user t2 on t1.user_id = t2.id left join cai_user t2 on t1.user_id = t2.id
order by t1.create_time desc
</select> </select>
<select id="pageApp" resultType="com.ruoyi.cai.dto.app.vo.AnchorListVo"> <select id="pageApp" resultType="com.ruoyi.cai.dto.app.vo.AnchorListVo">
select t1.avatar,t1.gender,t1.city,t1.nickname,t1.usercode,t1.city_id,t1.city,t2.give_score select t1.avatar,t1.gender,t1.city,t1.nickname,t1.usercode,t1.city_id,t1.city,t2.give_score

View File

@@ -25,13 +25,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="pageAdmin" resultType="com.ruoyi.cai.dto.admin.vo.UserInviteAdminVo"> <select id="pageAdmin" resultType="com.ruoyi.cai.dto.admin.vo.UserInviteAdminVo">
select t1.*, select t1.*,
t2.usercode,t2.mobile, t2.usercode,t2.mobile,
t3.usercode as invite_usercode,t3.mobile as invite_mobile,t3.is_union as invite_is_union, t3.usercode as invite_usercode,t3.mobile as invite_mobile,t3.is_union as invite_is_union
t5.name as union_name
from cai_user_invite t1 from cai_user_invite t1
left join cai_user t2 on t1.user_id = t2.id left join cai_user t2 on t1.user_id = t2.id
left join cai_user t3 on t1.invite_id = t3.id left join cai_user t3 on t1.invite_id = t3.id
left join cai_union_user t4 on t1.user_id = t4.user_id
left join cai_union t5 on t4.union_id = t5.id
<where> <where>
<if test="bo.mobile != null and bo.mobile != ''"> <if test="bo.mobile != null and bo.mobile != ''">
and t2.mobile = #{bo.mobile} and t2.mobile = #{bo.mobile}
@@ -45,9 +42,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="bo.inviteUsercode != null and bo.inviteUsercode != ''"> <if test="bo.inviteUsercode != null and bo.inviteUsercode != ''">
and t3.usercode = #{bo.inviteUsercode} and t3.usercode = #{bo.inviteUsercode}
</if> </if>
<if test="bo.unionName != null and bo.unionName != ''">
and t5.name like concat('%',#{bo.unionName},'%')
</if>
</where> </where>
</select> </select>

View File

@@ -25,6 +25,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and t1.city = #{query.city} and t1.city = #{query.city}
</if> </if>
</where> </where>
order by t2.last_login_time desc
</select> </select>
<select id="pageApp" resultType="com.ruoyi.cai.dto.app.vo.user.UserListVo"> <select id="pageApp" resultType="com.ruoyi.cai.dto.app.vo.user.UserListVo">
select t1.avatar,t1.gender,t1.city,t1.city_id,t1.nickname,t1.usercode,t1.age,t2.last_live_time select t1.avatar,t1.gender,t1.city,t1.city_id,t1.nickname,t1.usercode,t1.age,t2.last_live_time