Browse Source

系统用户套餐时间显示

master
La123123 1 month ago
parent
commit
4a08297432
  1. 100
      im-admin-ui/src/views/im/group/index.vue
  2. 7
      im-admin-ui/src/views/system/user/index.vue
  3. 5
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java
  4. 8
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java
  5. 11
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java
  6. 13
      im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

100
im-admin-ui/src/views/im/group/index.vue

@ -1,7 +1,6 @@
<template> <template>
<div class="p-2"> <div class="p-2">
<transition :enter-active-class="proxy?.animate.searchAnimate.enter" <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
:leave-active-class="proxy?.animate.searchAnimate.leave">
<div v-show="showSearch" class="mb-[10px]"> <div v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
@ -12,15 +11,20 @@
<im-user-select v-model="queryParams.ownerId"></im-user-select> <im-user-select v-model="queryParams.ownerId"></im-user-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createdTime"> <el-form-item label="创建时间" prop="createdTime">
<el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" <el-date-picker
range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" v-model="dateRange"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker> value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> <el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button type="warning" plain icon="Download" @click="handleExport" <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['im:group:export']">导出</el-button>
v-hasPermi="['im:group:export']">导出</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -32,8 +36,7 @@
<el-table-column label="群名" align="center" prop="name" /> <el-table-column label="群名" align="center" prop="name" />
<el-table-column label="群头像" align="center" prop="headImage" width="100"> <el-table-column label="群头像" align="center" prop="headImage" width="100">
<template #default="scope"> <template #default="scope">
<image-preview v-if="scope.row.headImageThumb" :src="scope.row.headImageThumb" <image-preview v-if="scope.row.headImageThumb" :src="scope.row.headImageThumb" :full-src="scope.row.headImage" :width="40" :height="40" />
:full-src="scope.row.headImage" :width="40" :height="40" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="群主" align="center" prop="ownerUserName" /> <el-table-column label="群主" align="center" prop="ownerUserName" />
@ -55,19 +58,15 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-hasPermi="['im:group:query']" <el-button link type="primary" v-hasPermi="['im:group:query']" @click="handleDetail(scope.row)">详情</el-button>
@click="handleDetail(scope.row)">详情</el-button> <el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']" @click="handleUnban(scope.row)">解封</el-button>
<el-button v-if="scope.row.isBanned" link type="danger" v-hasPermi="['im:group:ban']" <el-button v-else link type="danger" v-hasPermi="['im:group:ban']" @click="handleBan(scope.row)">封禁</el-button>
@click="handleUnban(scope.row)">解封</el-button>
<el-button v-else link type="danger" v-hasPermi="['im:group:ban']"
@click="handleBan(scope.row)">封禁</el-button>
<el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button> <el-button link type="primary" @click="handleShowMember(scope.row.id)">查看成员</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card> </el-card>
<!-- 添加或修改群对话框 --> <!-- 添加或修改群对话框 -->
<el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body>
@ -82,8 +81,7 @@
<el-input v-model="form.ownerUserName" /> <el-input v-model="form.ownerUserName" />
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createdTime"> <el-form-item label="创建时间" prop="createdTime">
<el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> <el-date-picker clearable v-model="form.createdTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss"> </el-date-picker>
</el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="是否已解散" prop="dissolve"> <el-form-item label="是否已解散" prop="dissolve">
<dict-tag :options="im_bool" :value="form.dissolve" /> <dict-tag :options="im_bool" :value="form.dissolve" />
@ -104,8 +102,7 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<el-drawer v-model="memberVisible" title="成员列表" :size="900" :close-on-press-escape="false" <el-drawer v-model="memberVisible" title="成员列表" :size="900" :close-on-press-escape="false" :close-on-click-modal="true">
:close-on-click-modal="true">
<member ref="memberRef"></member> <member ref="memberRef"></member>
</el-drawer> </el-drawer>
</div> </div>
@ -149,7 +146,7 @@ const initFormData: GroupForm = {
createdTime: undefined, createdTime: undefined,
isBanned: undefined, isBanned: undefined,
reason: undefined reason: undefined
} };
const data = reactive<PageData<GroupForm, GroupQuery>>({ const data = reactive<PageData<GroupForm, GroupQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
@ -164,12 +161,9 @@ const data = reactive<PageData<GroupForm, GroupQuery>>({
createdTime: undefined, createdTime: undefined,
isBanned: undefined, isBanned: undefined,
reason: undefined, reason: undefined,
params: { params: {}
}
}, },
rules: { rules: {}
}
}); });
const { queryParams, form } = toRefs(data); const { queryParams, form } = toRefs(data);
@ -182,45 +176,43 @@ const getList = async () => {
groupList.value = res.rows; groupList.value = res.rows;
total.value = res.total; total.value = res.total;
loading.value = false; loading.value = false;
} };
/** 表单重置 */ /** 表单重置 */
const reset = () => { const reset = () => {
form.value = { ...initFormData }; form.value = { ...initFormData };
groupFormRef.value?.resetFields(); groupFormRef.value?.resetFields();
} };
/** 搜索按钮操作 */ /** 搜索按钮操作 */
const handleQuery = () => { const handleQuery = () => {
queryParams.value.pageNum = 1; queryParams.value.pageNum = 1;
getList(); getList();
} };
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
dateRange.value = ['', '']; dateRange.value = ['', ''];
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
handleQuery(); handleQuery();
} };
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: GroupVO[]) => { const handleSelectionChange = (selection: GroupVO[]) => {
ids.value = selection.map(item => item.id); ids.value = selection.map((item) => item.id);
single.value = selection.length != 1; single.value = selection.length != 1;
multiple.value = !selection.length; multiple.value = !selection.length;
} };
/** 详情按钮操作 */ /** 详情按钮操作 */
const handleDetail = async (row?: GroupVO) => { const handleDetail = async (row?: GroupVO) => {
reset(); reset();
const _id = row?.id || ids.value[0] const _id = row?.id || ids.value[0];
const res = await getGroup(_id); const res = await getGroup(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
dialog.visible = true; dialog.visible = true;
dialog.title = "用户信息"; dialog.title = '用户信息';
} };
const handleBan = (group: any) => { const handleBan = (group: any) => {
ElMessageBox.prompt('封禁原因:', '确定对该群组进行封禁?', { ElMessageBox.prompt('封禁原因:', '确定对该群组进行封禁?', {
@ -229,43 +221,47 @@ const handleBan = (group: any) => {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消' cancelButtonText: '取消'
}).then(({ value }) => { }).then(({ value }) => {
const data = { id: group.id, reason: value } const data = { id: group.id, reason: value };
ban(data).then(() => { ban(data).then(() => {
group.isBanned = true; group.isBanned = true;
ElMessage.success(`群组'${group.name}'已被封禁`); ElMessage.success(`群组'${group.name}'已被封禁`);
}) });
}) });
} };
const handleUnban = (group: any) => { const handleUnban = (group: any) => {
ElMessageBox.confirm('确定解除该群组的封禁状态?', '提示', { ElMessageBox.confirm('确定解除该群组的封禁状态?', '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消' cancelButtonText: '取消'
}).then(() => { }).then(() => {
const data = { id: group.id } const data = { id: group.id };
unban(data).then(() => { unban(data).then(() => {
group.isBanned = false; group.isBanned = false;
ElMessage.success(`群组'${group.name}'解封成功`); ElMessage.success(`群组'${group.name}'解封成功`);
}) });
}) });
} };
const handleShowMember = (id: number) => { const handleShowMember = (id: number) => {
memberVisible.value = true; memberVisible.value = true;
nextTick(() => memberRef.value.init(id)); nextTick(() => memberRef.value.init(id));
} };
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
dialog.visible = false; dialog.visible = false;
} };
/** 导出按钮操作 */ /** 导出按钮操作 */
const handleExport = () => { const handleExport = () => {
proxy?.download('im/group/export', { proxy?.download(
...queryParams.value 'im/group/export',
}, `group_${new Date().getTime()}.xlsx`) {
} ...queryParams.value
},
`group_${new Date().getTime()}.xlsx`
);
};
onMounted(() => { onMounted(() => {
getList(); getList();

7
im-admin-ui/src/views/system/user/index.vue

@ -96,7 +96,12 @@
<el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" /> <el-table-column v-if="columns[0].visible" key="userId" label="用户编号" align="center" prop="userId" />
<el-table-column v-if="columns[1].visible" key="userName" label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" /> <el-table-column v-if="columns[1].visible" key="userName" label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[2].visible" key="nickName" label="用户昵称" align="center" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column v-if="columns[2].visible" key="nickName" label="用户昵称" align="center" prop="nickName" :show-overflow-tooltip="true" />
<el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" /> <el-table-column key="packageExpireTime" label="套餐过期时间" align="center" prop="packageExpireTime" :show-overflow-tooltip="true">
<template #default="scope">
<span>{{ parseTime(scope.row.packageExpireTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<!-- <el-table-column v-if="columns[3].visible" key="deptName" label="部门" align="center" prop="deptName" :show-overflow-tooltip="true" /> -->
<el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" /> <el-table-column v-if="columns[4].visible" key="phonenumber" label="手机号码" align="center" prop="phonenumber" width="120" />
<el-table-column v-if="columns[5].visible" key="status" label="状态" align="center"> <el-table-column v-if="columns[5].visible" key="status" label="状态" align="center">
<template #default="scope"> <template #default="scope">

5
im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@ -138,4 +138,9 @@ public class SysUserVo implements Serializable {
*/ */
private Long roleId; private Long roleId;
/**
* 套餐到期时间
*/
private Date packageExpireTime;
} }

8
im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/IImAgentAdminService.java

@ -6,6 +6,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection; import java.util.Collection;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -98,6 +99,11 @@ public interface IImAgentAdminService {
*/ */
void updateAgentName(Long sysId,String agentName); void updateAgentName(Long sysId,String agentName);
/**
* 获取套餐到期时间
* @param sysId 系统用户id
* @return 套餐到期时间
*/
Date getPackageExpireTime(Long sysId);
} }

11
im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/ImAgentAdminServiceImpl.java

@ -207,5 +207,16 @@ public class ImAgentAdminServiceImpl implements IImAgentAdminService {
baseMapper.update(null, luw); baseMapper.update(null, luw);
} }
@Override
public Date getPackageExpireTime(Long sysId) {
LambdaQueryWrapper<ImAgentAdmin> lqw = Wrappers.lambdaQuery();
lqw.eq(ImAgentAdmin::getSysId, sysId);
ImAgentAdmin agent = baseMapper.selectOne(lqw);
if(agent == null || agent.getPackageExpireTime() == null){
return null;
}
return agent.getPackageExpireTime();
}
} }

13
im-admin/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@ -33,6 +33,7 @@ import org.dromara.system.domain.vo.SysRoleVo;
import org.dromara.system.domain.vo.SysUserExportVo; import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.mapper.*; import org.dromara.system.mapper.*;
import org.dromara.system.service.IImAgentAdminService;
import org.dromara.system.service.ISysUserService; import org.dromara.system.service.ISysUserService;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
@ -58,10 +59,20 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
private final SysUserRoleMapper userRoleMapper; private final SysUserRoleMapper userRoleMapper;
private final SysUserPostMapper userPostMapper; private final SysUserPostMapper userPostMapper;
private final IImAgentAdminService IImAgentAdminService;
@Override @Override
public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) { public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
return TableDataInfo.build(page); TableDataInfo<SysUserVo> result = TableDataInfo.build(page);
List<SysUserVo> data = result.getRows();
if(ObjectUtil.isNotEmpty(data)) {
for (SysUserVo sysUserVo : data) {
sysUserVo.setPackageExpireTime(IImAgentAdminService.getPackageExpireTime(sysUserVo.getUserId()));
}
}
return result;
} }
/** /**

Loading…
Cancel
Save