Compare commits

...
21 Commits
Author SHA1 Message Date
zsh 812c6d263f 状态 2024-12-28 13:59:26 +08:00
wuyajie 40b6b8d447 优化状态标签及字段命名,修复重复代码 2024-12-28 09:58:48 +08:00
zsh ef98909864 bug 2024-12-27 17:40:09 +08:00
zsh 9026b27169 修改bug 2024-12-27 17:25:22 +08:00
zsh a02c8656c6 封禁 2024-12-27 15:54:06 +08:00
zsh 858c27502c 活动状态 2024-12-27 15:30:50 +08:00
zsh 4bd54e8fb1 bug 2024-12-27 15:19:23 +08:00
wuyajie d6b952ecc5 优化商品和景点管理,调整状态显示及下拉加载逻辑 2024-12-27 15:12:57 +08:00
wuyajie e3f734b8d3 修复类型定义及UI更新,优化活动问答和用户邀请功能 2024-12-27 14:20:26 +08:00
zsh 9768b04c88 封禁bug 2024-12-27 14:18:06 +08:00
zsh 95a14f596c map 2024-12-27 11:39:34 +08:00
wuyajie 4d0e340fee 修复IP图片状态逻辑并优化用户积分记录显示 2024-12-27 09:10:38 +08:00
zsh efa9a05d6e bug 2024-12-27 09:04:49 +08:00
wuyajie 10ab6380c4 添加推荐接口及优化评论、笔记、标签等组件显示 2024-12-27 08:30:27 +08:00
zsh dc43a2d40b bug 2024-12-26 16:10:18 +08:00
zsh 90bd7911e6 bug 2024-12-26 15:50:45 +08:00
zsh e09ad2fcc8 优化ui 2024-12-26 14:41:42 +08:00
zsh 27b81b2096 活动bug 2024-12-26 13:09:29 +08:00
zsh 8dd38e5a93 活动预览 2024-12-26 13:09:28 +08:00
wuyajie 648ceef0e6 优化接口参数类型及UI显示细节 2024-12-26 11:47:45 +08:00
zsh dfda574ca2 修改笔记预览样式 2024-12-25 17:34:46 +08:00
48 changed files with 1620 additions and 714 deletions
+6 -12
View File
@@ -8,7 +8,7 @@ export interface ActivityVO {
* 活动名称 * 活动名称
*/ */
activityName: string; activityName: string;
activityId: string | number;
/** /**
* 活动描述 * 活动描述
*/ */
@@ -83,7 +83,6 @@ export interface ActivityVO {
* 操作时间 * 操作时间
*/ */
updateTime: string; updateTime: string;
} }
export interface ActivityForm extends BaseEntity { export interface ActivityForm extends BaseEntity {
@@ -151,16 +150,14 @@ export interface ActivityForm extends BaseEntity {
* 发布状态 0-未发布 1-审核中 2-发布 * 发布状态 0-未发布 1-审核中 2-发布
*/ */
status?: string; status?: string;
} }
export interface ActivityQuery extends PageQuery { export interface ActivityQuery extends PageQuery {
/** /**
* 活动名称 * 活动名称
*/ */
activityName?: string; activityName?: string;
activityId?: string | number;
/** /**
* 活动描述 * 活动描述
*/ */
@@ -216,11 +213,8 @@ export interface ActivityQuery extends PageQuery {
*/ */
status?: string; status?: string;
/** /**
* 日期范围参数 * 日期范围参数
*/ */
params?: any; params?: any;
} }
+2 -2
View File
@@ -43,9 +43,9 @@ export const addBanned = (data: BannedForm) => {
* 修改举报 * 修改举报
* @param data * @param data
*/ */
export const updateBanned = (data: BannedForm) => { export const updatemanage = (data: BannedForm) => {
return request({ return request({
url: '/manage/banned', url: '/manage/report',
method: 'put', method: 'put',
data: data data: data
}); });
+3
View File
@@ -48,6 +48,7 @@ export interface BannedVO {
* 状态(0=已发布,1=已下架) * 状态(0=已发布,1=已下架)
*/ */
handlingStatus: number; handlingStatus: number;
nickName?: string | number;
/** /**
* 1=用户,2=笔记,3=活动,4=评论 * 1=用户,2=笔记,3=活动,4=评论
@@ -106,6 +107,7 @@ export interface BannedForm extends BaseEntity {
* 状态(0=已发布,1=已下架) * 状态(0=已发布,1=已下架)
*/ */
handlingStatus?: number; handlingStatus?: number;
nickName?: string | number;
/** /**
* 1=用户,2=笔记,3=活动,4=评论 * 1=用户,2=笔记,3=活动,4=评论
@@ -120,6 +122,7 @@ export interface BannedQuery extends PageQuery {
* 被举报内容id * 被举报内容id
*/ */
contentId?: string | number; contentId?: string | number;
nickName?: string | number;
/** /**
* 被举报用户ID * 被举报用户ID
+4 -4
View File
@@ -47,7 +47,7 @@ export interface DyUserVO {
/** /**
* 会员等级 * 会员等级
*/ */
leveId: string | number; levelId: string | number;
/** /**
* 生日 * 生日
@@ -154,7 +154,7 @@ export interface DyUserForm extends BaseEntity {
/** /**
* 会员等级 * 会员等级
*/ */
leveId?: string | number; levelId?: string | number;
/** /**
* 生日 * 生日
@@ -199,7 +199,7 @@ export interface DyUserForm extends BaseEntity {
/** /**
* 封禁天数 * 封禁天数
*/ */
banDays?: number; banDays?: number | string;
/** /**
* 经度 * 经度
@@ -251,7 +251,7 @@ export interface DyUserQuery extends PageQuery {
/** /**
* 会员等级 * 会员等级
*/ */
leveId?: string | number; levelId?: string | number;
/** /**
* 生日 * 生日
+11
View File
@@ -95,3 +95,14 @@ export const productCategoryall = (query?: MkJigsawQuery): AxiosPromise<MkJigsaw
params: query params: query
}); });
}; };
/**
* 参与游戏人数
* @param query
*/
export const mkJoinlist = (query?: MkJigsawQuery): AxiosPromise<MkJigsawVO[]> => {
return request({
url: '/manage/mkJoin/list',
method: 'get',
params: query
});
};
+2 -2
View File
@@ -65,7 +65,7 @@ export const delNotebook = (id: string | number | Array<string | number>) => {
* 查询标签 * 查询标签
* @param id * @param id
*/ */
export const tagall = (): AxiosPromise<NotebookVO> => { export const tagall = () => {
return request({ return request({
url: '/manage/tag/all', url: '/manage/tag/all',
method: 'get' method: 'get'
@@ -75,7 +75,7 @@ export const tagall = (): AxiosPromise<NotebookVO> => {
* 查询景点 * 查询景点
* @param query * @param query
*/ */
export const contentall = (query?: NotebookQuery): AxiosPromise<NotebookVO> => { export const contentall = (query?: any) => {
return request({ return request({
url: '/manage/content/all', url: '/manage/content/all',
method: 'get', method: 'get',
+1 -1
View File
@@ -77,7 +77,7 @@ export const getRegionTree = (query?: RouteForm) => {
* 住宿下拉列表 * 住宿下拉列表
* @param query * @param query
*/ */
export const hotelall = (query?: RouteForm) => { export const hotelall = (query?: any) => {
return request({ return request({
url: '/manage/hotel/all', url: '/manage/hotel/all',
method: 'get', method: 'get',
+12
View File
@@ -105,3 +105,15 @@ export const commentList = (query: any): AxiosPromise<ArticleVO[]> => {
params: query params: query
}); });
}; };
/**
*
* @param query
* @returns
*/
export const recommend = (query: any) => {
return request({
url: '/manage/notebook/recommend-list',
method: 'get',
params: query
});
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

+25 -19
View File
@@ -1,28 +1,14 @@
<template> <template>
<div> <div>
<el-upload <el-upload v-if="type === 'url'" :action="upload.url" :before-upload="handleBeforeUpload"
v-if="type === 'url'" :on-success="handleUploadSuccess" :on-error="handleUploadError" class="editor-img-uploader" name="file"
:action="upload.url" :show-file-list="false" :headers="upload.headers">
:before-upload="handleBeforeUpload"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
class="editor-img-uploader"
name="file"
:show-file-list="false"
:headers="upload.headers"
>
<i ref="uploadRef"></i> <i ref="uploadRef"></i>
</el-upload> </el-upload>
</div> </div>
<div class="editor"> <div class="editor">
<quill-editor <quill-editor ref="quillEditorRef" v-model:content="content" content-type="html" :options="options" :style="styles"
ref="quillEditorRef" @text-change="(e: any) => $emit('update:modelValue', content)" />
v-model:content="content"
content-type="html"
:options="options"
:style="styles"
@text-change="(e: any) => $emit('update:modelValue', content)"
/>
</div> </div>
</template> </template>
@@ -102,6 +88,7 @@ const styles = computed(() => {
if (props.height) { if (props.height) {
style.height = `${props.height}px`; style.height = `${props.height}px`;
} }
style.width = '1000px';
return style; return style;
}); });
@@ -166,77 +153,96 @@ const handleUploadError = (err: any) => {
.editor-img-uploader { .editor-img-uploader {
display: none; display: none;
} }
.editor, .editor,
.ql-toolbar { .ql-toolbar {
white-space: pre-wrap !important; white-space: pre-wrap !important;
line-height: normal !important; line-height: normal !important;
} }
.quill-img { .quill-img {
display: none; display: none;
} }
.ql-snow .ql-tooltip[data-mode='link']::before { .ql-snow .ql-tooltip[data-mode='link']::before {
content: '请输入链接地址:'; content: '请输入链接地址:';
} }
.ql-snow .ql-tooltip.ql-editing a.ql-action::after { .ql-snow .ql-tooltip.ql-editing a.ql-action::after {
border-right: 0; border-right: 0;
content: '保存'; content: '保存';
padding-right: 0; padding-right: 0;
} }
.ql-snow .ql-tooltip[data-mode='video']::before { .ql-snow .ql-tooltip[data-mode='video']::before {
content: '请输入视频地址:'; content: '请输入视频地址:';
} }
.ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before { .ql-snow .ql-picker.ql-size .ql-picker-item::before {
content: '14px'; content: '14px';
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before, .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before {
content: '10px'; content: '10px';
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before, .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before {
content: '18px'; content: '18px';
} }
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before, .ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before { .ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before {
content: '32px'; content: '32px';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before { .ql-snow .ql-picker.ql-header .ql-picker-item::before {
content: '文本'; content: '文本';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before {
content: '标题1'; content: '标题1';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before {
content: '标题2'; content: '标题2';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before {
content: '标题3'; content: '标题3';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before {
content: '标题4'; content: '标题4';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before {
content: '标题5'; content: '标题5';
} }
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before, .ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before { .ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before {
content: '标题6'; content: '标题6';
} }
.ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before { .ql-snow .ql-picker.ql-font .ql-picker-item::before {
content: '标准字体'; content: '标准字体';
} }
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before, .ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before { .ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before {
content: '衬线字体'; content: '衬线字体';
} }
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before, .ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before { .ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before {
content: '等宽字体'; content: '等宽字体';
+78 -31
View File
@@ -2,17 +2,25 @@
<!-- 带有搜索地点的地图 --> <!-- 带有搜索地点的地图 -->
<div> <div>
<el-form-item :label="title"> <el-form-item :label="title">
<el-input <el-select
v-model="form.address" v-model="searchLocation"
:placeholder="`请输入${title}`" filterable
class="input-with-select" remote
reserve-keyword
clearable
placeholder="请输入地址信息"
:remote-method="remoteMethod"
@change="selectChnange"
style="width: 300px" style="width: 300px"
@keyup.enter="debouncedSearch(form.address)"
> >
<template #append> <el-option
<el-button :icon="Search" @click="debouncedSearch(form.address)" /> v-for="item in locationOptions"
</template> :key="item.id"
</el-input> :label="item.title + '&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp' + item.province + ' - ' + item.city"
:value="item.province + item.city + item.title"
/>
<!-- :value="item.ad_info.province+item.ad_info.city+item.title" /> -->
</el-select>
</el-form-item> </el-form-item>
<tlbs-map <tlbs-map
ref="map" ref="map"
@@ -26,6 +34,15 @@
> >
<tlbs-multi-marker :geometries="geometries" :styles="styles" :options="options" /> <tlbs-multi-marker :geometries="geometries" :styles="styles" :options="options" />
</tlbs-map> </tlbs-map>
<el-form-item label="详细地址" prop="address" style="margin-top: 15px">
<el-input v-model="form.address" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
<el-form-item label="经度" prop="longitude">
<el-input v-model="form.longitude" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
<el-form-item label="纬度" prop="latitude">
<el-input v-model="form.latitude" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
</div> </div>
</template> </template>
@@ -33,6 +50,7 @@
import { Search } from '@element-plus/icons-vue'; import { Search } from '@element-plus/icons-vue';
import { propTypes } from '@/utils/propTypes'; import { propTypes } from '@/utils/propTypes';
import { jsonp } from 'vue-jsonp'; import { jsonp } from 'vue-jsonp';
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
import { debounce } from '@/utils/debounce.js'; import { debounce } from '@/utils/debounce.js';
import { OssVO } from '@/api/system/oss/types'; import { OssVO } from '@/api/system/oss/types';
import { listByIds } from '@/api/system/oss'; import { listByIds } from '@/api/system/oss';
@@ -72,7 +90,39 @@ const form = ref(
regionCode: '' regionCode: ''
} }
); );
const searchLocation = ref(props.datas.address||''); // 搜索地点
const locationOptions = ref([]); //腾讯地图返回的搜索地址列表
watch(() => props.modelValue); watch(() => props.modelValue);
// 地理位置 输入实时搜索
const remoteMethod = (query: string) => {
if (query !== '') {
// 调用腾讯地图API进行搜索,并展示在地图上
// geocoder(query).then((result) => {
// console.log(result);
// });
console.log(query);
// jsonp(`https://apis.map.qq.com/ws/place/v1/search?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&boundary=nearby(20.018883,110.348801,1000)&output=jsonp`, {}).then((res) => {
jsonp(
`https://apis.map.qq.com/ws/place/v1/suggestion?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&region=三亚市&region_fix=0&output=jsonp`,
{}
).then((res) => {
// if (res.region.title!=='海南省') {
// proxy?.$modal.msgError('仅支持海南省地理位置');
// return
// }
if (res.status == 0) {
locationOptions.value = res.data;
}
});
}
};
// 选择地理位置 下拉框值变化
const selectChnange = (val: string) => {
if (val) {
debouncedSearch(searchLocation.value);
}
};
// 点击地点,获取经纬度及地址信息 // 点击地点,获取经纬度及地址信息
const onClick = (e: any) => { const onClick = (e: any) => {
jsonp( jsonp(
@@ -81,20 +131,19 @@ const onClick = (e: any) => {
).then((data) => { ).then((data) => {
if (data.status == 0) { if (data.status == 0) {
if (form.value) { if (form.value) {
// form.value.address = form.value.address =
// data.result.address_component.province + data.result.address_component.province +
// data.result.address_component.city + data.result.address_component.city +
// data.result.address_component.district + data.result.address_component.district +
// data.result.address_component.street + data.result.address_component.street +
// data.result.address_component.street_number; data.result.address_component.street_number + data.result.formatted_addresses.recommend;
form.value.latitude = data.result.location.lat; form.value.latitude = data.result.location.lat;
form.value.longitude = data.result.location.lng; form.value.longitude = data.result.location.lng;
form.value.address = data.result.formatted_addresses.recommend; // form.value.address = data.result.formatted_addresses.recommend;
// form.value.city = data.result.address_component.city; // form.value.city = data.result.address_component.city;
// form.value.region = data.result.ad_info.adcode; //行政区划编码 // form.value.region = data.result.ad_info.adcode; //行政区划编码
form.value.regionCode = data.result.ad_info.adcode; //行政区划编码 form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
center.value.lat = data.result.location.lat; center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
center.value.lng = data.result.location.lng;
searchLocation.value = data.result.formatted_addresses.recommend; searchLocation.value = data.result.formatted_addresses.recommend;
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
console.log(form.value); console.log(form.value);
@@ -119,21 +168,20 @@ const performSearch = async (text) => {
jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => { jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => {
console.log(data); console.log(data);
if (data.status == 0) { if (data.status == 0) {
center.value.lat = data.result.location.lat; form.value.address =
center.value.lng = data.result.location.lng; data.result.address_components.province +
// form.value.address = data.result.address_components.city +
// data.result.address_components.province + data.result.address_components.district +
// data.result.address_components.city + data.result.address_components.street +
// data.result.address_components.district + data.result.address_components.street_number + data.result.title;
// data.result.address_components.street +
// data.result.address_components.street_number;
form.value.latitude = data.result.location.lat; form.value.latitude = data.result.location.lat;
form.value.longitude = data.result.location.lng; form.value.longitude = data.result.location.lng;
// form.value.region = data.result.ad_info.adcode; //行政区划编码 // form.value.region = data.result.ad_info.adcode; //行政区划编码
// form.value.regionCode = data.result.ad_info.adcode; //行政区划编码 // form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
form.value.address = data.result.formatted_addresses.recommend; // form.value.address = text;
// form.value.city = data.result.address_components.city; // form.value.city = data.result.address_components.city;
center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
console.log(form.value); console.log(form.value);
emit('modelValue', form.value); emit('modelValue', form.value);
@@ -148,16 +196,15 @@ const performSearch = async (text) => {
const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒 const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒
const map = ref(null); const map = ref(null);
const center = ref({ lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 }); const center = ref({ lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 });
const zoom = ref(20); const zoom = ref(147);
const control = reactive({ const control = reactive({
scale: {}, scale: {},
zoom: { zoom: {
position: 'topLeft' position: 'topLeft'
} }
}); });
const searchLocation = ref(''); // 搜索地点 const geometries = ref([{ styleId: 'marker', position: { lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 } }]);
const geometries = ref([{ styleId: 'marker', position: { lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 } }]);
const styles = reactive({ const styles = reactive({
marker: { marker: {
width: 20, width: 20,
+142
View File
@@ -0,0 +1,142 @@
<template>
<div class="note">
<div class="content">
<img src="" />
<div class="title">{{ form.activityName }}</div>
<div class="description">
<div><img src="../../assets/images/num.png" />活动人数{{ form.activityUserCount }}</div>
<div><img src="../../assets/images/time.png" />活动时间{{ form.activityTime }}</div>
<div><img src="../../assets/images/laba.png" />报名截至{{ form.registrationDeadline }}</div>
<div><img src="../../assets/images/moeny.png" />活动费用{{ form.paymentMethod == 1 ? '发起人收款' : '免费' }}</div>
<div><img src="../../assets/images/address.png" />活动地址{{ form.activityLocation }}</div>
</div>
<div>
<div style="font-size: 14px;font-weight: 600;line-height:30px">活动介绍</div>
<div>{{ form.activityDescription }}</div>
</div>
<div>
<div style="font-size: 14px;font-weight: 600;line-height:30px">活动流程</div>
<div v-for="(item, index) in listdatatime">
<div style="display: flex; align-items: center">
<div style="width: 10px; height: 10px; background-color: #000; border-radius: 50%"></div>
<div>{{ item.activityTime }}&nbsp;</div>
<div>{{ item.planContent }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { string } from 'vue-types';
import { contentall, tagall } from '@/api/manage/notebook';
import { hotelall } from '@/api/manage/route';
const sys_user_tagOptions = ref([]); //标签库
const sys_user_contentOptions = ref([]); //标签库
const props = defineProps({
form: {
type: [String, Object, Array],
default: () => {}
},
listdatatime: {
type: [String, Object, Array],
default: () => {}
}
});
const form = ref(props.form);
const listdatatime = ref(props.listdatatime);
const getContent = async () => {
const res = await contentall({ status: 2 });
const arr = await hotelall({ status: 1 });
sys_user_contentOptions.value = res.concat(arr); //地点
};
const getTag = async () => {
const res = await tagall();
sys_user_tagOptions.value = res; //标签库
};
/**
* 标签格式化
*/
const formatTag = (tagId: string | null) => {
let tagString = '';
// for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
// const element = sys_user_tagOptions.value[i];
// if (tagId?.includes(element.id)) {
// tagString += ',' + element.title;
// }
// }
for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
const element = sys_user_tagOptions.value[i];
if (tagId != null) {
let filteredArray = tagId.split(',').filter((item) => item == element.id);
if (filteredArray.length > 0) {
tagString += '#' + element.title;
}
}
}
return tagString;
};
/**
* 标记地点格式化
*/
const formatlocation = (tagId: string | null) => {
let tagString = '';
let arrlist = tagId?.split(',').map(Number);
for (let i = 0; i < sys_user_contentOptions.value.length; i++) {
const element = sys_user_contentOptions.value[i];
for (let j = 0; j < arrlist.length; j++) {
const conten = arrlist[j];
if (conten == element.id) {
tagString += ',' + element.name;
}
}
}
return tagString.substring(1);
};
onMounted(() => {
getTag(); //标签库
getContent();
});
</script>
<style scoped lang="scss">
.note {
margin: 0 auto;
width: 350px;
height: 700px;
background: url('../../assets/images/bgm.png') no-repeat;
background-size: 100% 100%;
padding-top: 70px;
.content {
width: 88%;
height: 580px;
overflow-y: auto;
margin: 0 auto;
.title {
width: 95%;
font-weight: 600;
padding-top: 300px;
margin: 0 auto;
font-size: 16px;
}
.description {
margin-top: 15px;
border-radius: 20px;
padding: 10px;
line-height: 30px;
background-color: #f3efe8;
img {
width: 15px;
height: 15px;
margin-right: 5px;
}
}
}
}
.content::-webkit-scrollbar {
display: none;
}
.content::-webkit-scrollbar {
width: 0px;
}
</style>
+57 -32
View File
@@ -7,58 +7,73 @@
<!-- <img :src="comment.avatar" alt="用户昵称" class="avatar"> --> <!-- <img :src="comment.avatar" alt="用户昵称" class="avatar"> -->
<image-preview :src="comment.avatar" :width="25" :height="25" /> <image-preview :src="comment.avatar" :width="25" :height="25" />
<div class="username"> <div class="username">
<div style="margin-right: 5px;"> <div style="margin-right: 5px">
{{ comment.nickName }} {{ comment.nickName }}
</div> </div>
<div v-if="comment.parentId" class="reply-to"></div> <!-- <div v-if="comment.parentId" class="reply-to"></div>
<div v-if="comment.parentId" class="reply-to-username">{{ comment.replyNickName }}</div> <div v-if="comment.parentId" class="reply-to-username">{{ comment.replyNickName }}</div> -->
</div> </div>
</div> </div>
<div class="user-details"> <div class="user-details">
<div class="comment-content">{{ comment.content }}</div> <div class="comment-content">{{ comment.content }}</div>
<div class="comment-info"> <div class="comment-info">
<span class="comment-time">{{ comment.createTime }}</span> <span class="comment-time">{{ comment.createTime }}</span>
<span class="ip-address">IP: {{ comment.address?comment.address:'未知' }}</span> <span class="ip-address">IP: {{ comment.address ? comment.address : '未知' }}</span>
</div> </div>
</div> </div>
<!-- <div v-if="comment.replies && comment.replies.length" class="replies"> <div v-if="comment.daList && comment.daList.length" class="replies">
<div v-for="reply in comment.replies" :key="reply.id" class="reply-item"> <div v-for="reply in comment.daList" :key="reply.id" class="reply-item">
<div class="user-info"> <div class="user-info">
<img :src="reply.avatar" alt="回复用户昵称" class="avatar"> <!-- <img :src="reply.avatar" alt="" class="avatar"> -->
<div class="user-details"> <image-preview :src="reply.avatar" :width="25" :height="25" />
<div class="username">回复 {{ reply.username }}</div> <div class="">
<div class="comment-content">{{ reply.content }}</div> <div class="username">
<div class="comment-info"> <span>{{ reply.nickName }}</span>
<span class="comment-time">{{ reply.time }}</span> <div class="reply-to"></div>
<span class="ip-address">IP: {{ reply.ipAddress }}</span> <span>{{ reply.replyNickName }}</span>
</div>
<div class="comment-content" style="margin-left: 10px">{{ reply.content }}</div>
<div class="comment-info" style="margin-left: 10px">
<span class="comment-time">{{ reply.createTime }}</span>
<span class="ip-address">IP: {{ reply.address ? reply.address : '未知' }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> --> </div>
</div> </div>
</div> </div>
<pagination v-show="total > 0" id="table_page" :total="total" v-model:page="queryParams.pageNum" <pagination
v-model:limit="queryParams.pageSize" @pagination="getCommentList" /> v-show="total > 0"
id="table_page"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getCommentList"
/>
</div> </div>
</template> </template>
<script setup lang="ts" name="commentList"> <script setup lang="ts" name="commentList">
import { ref, reactive, onMounted, nextTick } from 'vue'; import { ref, reactive, onMounted, nextTick } from 'vue';
import {commentList } from '@/api/manage/scenic'; import { commentList } from '@/api/manage/scenic';
//导入父组件传递的值 //导入父组件传递的值
const props = defineProps({ const props = defineProps({
bizId:{ bizId: {
type: Number, type: Number,
default: null, default: null
},
type: {
type: Number,
default: null
} }
}); });
const queryParams = reactive({ const queryParams = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
bizId: null, bizId: null,
status: 0, type: props.type
}); });
// 监听父组件传递的tagIds,当tagIds发生变化时,重新获取数据 // 监听父组件传递的tagIds,当tagIds发生变化时,重新获取数据
watch( watch(
@@ -75,7 +90,7 @@ watch(
}, },
{ immediate: true } { immediate: true }
); );
const total=ref(0) const total = ref(0);
const loading = ref(false); const loading = ref(false);
const commentListData = ref([]); const commentListData = ref([]);
// 导入父组件定义的函数 // 导入父组件定义的函数
@@ -85,11 +100,11 @@ const emit = defineEmits(['hideDialog']);
*/ */
const getCommentList = async () => { const getCommentList = async () => {
loading.value = true; loading.value = true;
let res=await commentList(queryParams).finally(() => (loading.value = false)); let res = await commentList(queryParams).finally(() => (loading.value = false));
console.log('评论列表:',res); console.log('评论列表:', res);
total.value=res.total; total.value = res.total;
commentListData.value = res.rows; commentListData.value = res.rows;
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.commentList { .commentList {
@@ -113,13 +128,15 @@ const getCommentList = async () => {
.reply-to { .reply-to {
width: 0; width: 0;
height: 0; height: 0;
margin-top: 5px;
border-top: 6px solid transparent; border-top: 6px solid transparent;
/* 上边框透明 */ /* 上边框透明 */
border-bottom: 6px solid transparent; border-bottom: 6px solid transparent;
/* 下边框透明 */ /* 下边框透明 */
border-left: 6px solid #999; border-left: 6px solid #999;
/* 左边框为箭头颜色,这里设为黑色,可按需更改 */ /* 左边框为箭头颜色,这里设为黑色,可按需更改 */
margin: 0px 8px;
margin-top: 5px;
} }
.reply-to-username { .reply-to-username {
@@ -130,21 +147,29 @@ const getCommentList = async () => {
.user-details { .user-details {
margin-left: 35px; margin-left: 35px;
}
.comment-content { .comment-content {
color: #000; color: #000;
font-size: 16px; font-size: 16px;
padding: 3px 0px; padding: 3px 0px;
}
} }
} }
} }
.ip-address { .ip-address {
margin-left: 15px; margin-left: 15px;
} }
.replies {
margin-left: 35px;
.reply-item {
margin-top: 5px;
padding: 5px 0px;
}
}
#table_page { #table_page {
height: 50px !important; height: 50px !important;
margin-top: 10px !important; margin-top: 10px !important;
+119
View File
@@ -0,0 +1,119 @@
<template>
<div class="note">
<div class="content">
<img src="" />
<div class="title">{{ form.title }}</div>
<div v-html="form.content"></div>
<div class="tagid">{{ formatTag(form.tagId) }}</div>
<div class="address" v-if="form.location">
<img src="../../assets/images/address.png" />
{{ formatlocation(form.location) }}
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { string } from 'vue-types';
import { contentall, tagall } from '@/api/manage/notebook';
import { hotelall } from '@/api/manage/route';
const sys_user_tagOptions = ref([]); //标签库
const sys_user_contentOptions = ref([]); //标签库
const props = defineProps({
form: {
type: [String, Object, Array],
default: () => {}
}
});
const form = ref(props.form);
const getContent = async () => {
const res = await contentall({ status: 2 });
const arr = await hotelall({ status: 1 });
sys_user_contentOptions.value = res.concat(arr); //地点
};
const getTag = async () => {
const res = await tagall();
sys_user_tagOptions.value = res; //标签库
};
/**
* 标签格式化
*/
const formatTag = (tagId: string | null) => {
let tagString = '';
// for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
// const element = sys_user_tagOptions.value[i];
// if (tagId?.includes(element.id)) {
// tagString += ',' + element.title;
// }
// }
for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
const element = sys_user_tagOptions.value[i];
if (tagId != null) {
let filteredArray = tagId.split(',').filter((item) => item == element.id);
if (filteredArray.length > 0) {
tagString += '#' + element.title;
}
}
}
return tagString;
};
/**
* 标记地点格式化
*/
const formatlocation = (tagId: string | null) => {
let tagString = '';
let arrlist = tagId?.split(',').map(Number);
for (let i = 0; i < sys_user_contentOptions.value.length; i++) {
const element = sys_user_contentOptions.value[i];
for (let j = 0; j < arrlist.length; j++) {
const conten = arrlist[j];
if (conten == element.id) {
tagString += ',' + element.name;
}
}
}
return tagString.substring(1);
};
onMounted(() => {
getTag(); //标签库
getContent();
});
</script>
<style scoped lang="scss">
.note {
margin: 0 auto;
width: 350px;
height: 700px;
background: url('../../assets/images/bgm.png') no-repeat;
background-size: 100% 100%;
padding-top: 70px;
.content {
width: 88%;
height: 580px;
overflow-y: auto;
margin: 0 auto;
.title {
font-weight: 600;
padding-top: 300px;
margin: 0 auto;
}
.tagid {
color: #1c84c6;
}
.address {
line-height: 40px;
color: #2b2f3a;
img {
width: 15px;
height: 15px;
}
}
}
}
.content::-webkit-scrollbar {
display: none;
}
.content::-webkit-scrollbar {
width: 0px;
}
</style>
+52 -22
View File
@@ -3,12 +3,15 @@
<div> <div>
<el-table :height="props.autoTableHeight" v-loading="loading" :data="props.articleList" <el-table :height="props.autoTableHeight" v-loading="loading" :data="props.articleList"
@selection-change="handleSelectionChange" border> @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center" v-if="props.parentName != 'dyUser'" /> <!-- <el-table-column type="selection" width="55" align="center" v-if="props.parentName != 'dyUser'" /> -->
<!-- <el-table-column label="ID" align="center" prop="id" v-if="props.parentName != 'dyUser'" /> --> <!-- <el-table-column label="ID" align="center" prop="id" v-if="props.parentName != 'dyUser'" /> -->
<el-table-column label="笔记标题" align="center" prop="title" width="180px" /> <el-table-column label="笔记标题" align="center" prop="title" width="180px" />
<el-table-column label="笔记封面" align="center" prop="" width="80px" /> <el-table-column label="笔记封面" align="center" prop="" width="80px" />
<el-table-column label="笔记类别" align="center" prop="" width="80px" /> <el-table-column label="标记地点" align="center" prop="location">
<el-table-column label="标记地点" align="center" prop="location" width="180px" /> <template #default="scope">
<span>{{ formatlocation(scope.row.location) }}</span>
</template>
</el-table-column>
<el-table-column label="标签" align="center" prop=""> <el-table-column label="标签" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span>{{ formatTag(scope.row.tagId.toString()) }}</span> <span>{{ formatTag(scope.row.tagId.toString()) }}</span>
@@ -25,16 +28,16 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="点赞数" align="center" prop="agreeCount" width="80px"> <el-table-column label="点赞数" align="center" prop="agreeCount" width="80px">
<template #default="scope"> <!-- <template #default="scope">
<el-button link type="primary" @click="handleComment(scope.row)">12</el-button> <el-button link type="primary" @click="handleComment(scope.row)">12</el-button>
</template> </template> -->
</el-table-column> </el-table-column>
<el-table-column label="发布状态" align="center" prop=""> <el-table-column label="发布状态" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.status == 0 ? '未发布' : scope.row.status == 1 ? '审核中' : scope.row.status == 2 ? '已发布' : '草稿' }}</span> <span>{{ scope.row.status == 0 ? '未发布' : scope.row.status == 1 ? '审核中' : scope.row.status == 2 ? '已发布' : '草稿' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作人" align="center" prop="updateByName" /> <!-- <el-table-column label="操作人" align="center" prop="updateByName" /> -->
<el-table-column label="操作时间" align="center" prop="updateTime" width="180px" /> <el-table-column label="操作时间" align="center" prop="updateTime" width="180px" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" <el-table-column label="操作" align="center" class-name="small-padding fixed-width"
v-if="props.parentName != 'dyUser' && props.parentName != 'scenic'"> v-if="props.parentName != 'dyUser' && props.parentName != 'scenic'">
@@ -54,8 +57,6 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" id="table_page" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getTableList" />
<!-- 笔记详情弹层 --> <!-- 笔记详情弹层 -->
<el-dialog title="笔记详情" v-model="noteDetail.visible" width="500px" append-to-body> <el-dialog title="笔记详情" v-model="noteDetail.visible" width="500px" append-to-body>
<div> <div>
@@ -88,6 +89,9 @@
import { ref, reactive, onMounted, nextTick } from 'vue'; import { ref, reactive, onMounted, nextTick } from 'vue';
import { string } from 'vue-types'; import { string } from 'vue-types';
import { listByTagIdNotebook } from '@/api/manage/scenic'; import { listByTagIdNotebook } from '@/api/manage/scenic';
import { tagall,contentall } from '@/api/manage/notebook';
import { hotelall } from '@/api/manage/route';
//导入父组件传递的值 //导入父组件传递的值
const props = defineProps({ const props = defineProps({
@@ -107,10 +111,10 @@ const props = defineProps({
type: String, type: String,
default: () => '' default: () => ''
}, },
sys_user_tagOptions: { // sys_user_tagOptions: {
type: Array, // type: Array,
default: () => [] // default: () => []
} // }
}); });
const total = ref(0); const total = ref(0);
const loading = ref(false); const loading = ref(false);
@@ -153,14 +157,16 @@ const handleComment = async (row: any) => {
} }
// 监听父组件传递的tagIds,当tagIds发生变化时,重新获取数据 // 监听父组件传递的tagIds,当tagIds发生变化时,重新获取数据
watch( watch(
() => props.noteBookTagIds, () => props.articleList,
(newVal, oldVal) => { (newVal, oldVal) => {
console.log(newVal); console.log(newVal);
queryParams.tagIds = newVal; queryParams.tagIds = newVal;
if (newVal) { if (newVal) {
//获取数据 //获取数据
nextTick(() => { nextTick(() => {
getTableList(); // getTableList();
getTag();
getContent();
}); });
} }
}, },
@@ -186,14 +192,8 @@ const handleDelete = (row: any) => {
*/ */
const formatTag = (tagId: string | null) => { const formatTag = (tagId: string | null) => {
let tagString = ''; let tagString = '';
// for (let i = 0; i < props.sys_user_tagOptions.length; i++) { for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
// const element:any = props.sys_user_tagOptions[i]; const element:any = sys_user_tagOptions.value[i];
// if (tagId?.includes(element.id)) {
// tagString += ',' + element.title;
// }
// }
for (let i = 0; i < props.sys_user_tagOptions.length; i++) {
const element:any = props.sys_user_tagOptions[i];
if (tagId!=null) { if (tagId!=null) {
let filteredArray = tagId.split(',').filter((item) => item==element.id); let filteredArray = tagId.split(',').filter((item) => item==element.id);
if (filteredArray.length>0) { if (filteredArray.length>0) {
@@ -203,6 +203,36 @@ const formatTag = (tagId: string | null) => {
} }
return tagString.substring(1); return tagString.substring(1);
}; };
const sys_user_contentOptions = ref([]); //标签库
// 获取地点
const getContent = async () => {
const res = await contentall({ status: 2 });
const arr = await hotelall({ status: 1 });
sys_user_contentOptions.value = res.concat(arr); //地点
};
// 获取标签
const sys_user_tagOptions=ref([]);//
const getTag = async () => {
const res = await tagall();
Object.assign(sys_user_tagOptions.value,res);
};
/**
* 标记地点格式化
*/
const formatlocation = (tagId: string | null) => {
let tagString = '';
let arrlist = tagId?.split(',').map(Number);
for (let i = 0; i < sys_user_contentOptions.value.length; i++) {
const element = sys_user_contentOptions.value[i];
for (let j = 0; j < arrlist.length; j++) {
const conten = arrlist[j];
if (conten == element.id) {
tagString += ',' + element.name;
}
}
}
return tagString.substring(1);
};
// 导入父组件定义的函数 // 导入父组件定义的函数
const emit = defineEmits(['hideDialog', 'handleUpdate', 'handleDelete']); const emit = defineEmits(['hideDialog', 'handleUpdate', 'handleDelete']);
</script> </script>
+166 -7
View File
@@ -14,7 +14,11 @@
</el-table-column> </el-table-column>
<!-- <el-table-column label="排序" align="center" prop="" /> --> <!-- <el-table-column label="排序" align="center" prop="" /> -->
<el-table-column label="活动人数" align="center" prop="activityUserCount" /> <el-table-column label="活动人数" align="center" prop="activityUserCount" />
<el-table-column label="报名人数" align="center" prop="registrationCount" /> <el-table-column label="报名人数" align="center" prop="registrationCount">
<template #default="scope">
<el-button link type="primary" @click="baominglist(scope.row)">{{ scope.row.registrationCount }}</el-button>
</template>
</el-table-column>
<el-table-column label="活动流程" align="center" prop="" width="100px"> <el-table-column label="活动流程" align="center" prop="" width="100px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="chakanhandle(scope.row)">查看详情</el-button> <el-button link type="primary" @click="chakanhandle(scope.row)">查看详情</el-button>
@@ -22,17 +26,17 @@
</el-table-column> </el-table-column>
<el-table-column label="问答" align="center" prop="" width="100px"> <el-table-column label="问答" align="center" prop="" width="100px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="wendalist(scope.row)">查看详情</el-button> <el-button link type="primary" @click="wendalistid(scope.row)">查看详情</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发布状态" align="center" prop="status" width="100px"> <el-table-column label="发布状态" align="center" prop="status" width="100px">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 1" type="primary">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">发布</el-tag>
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发布时间" align="center" prop="publishTime" /> <el-table-column label="操作时间" align="center" prop="updateTime" />
<el-table-column label="操作" align="center" width="150px" fixed="right" class-name="small-padding fixed-width" <el-table-column label="操作" align="center" width="150px" fixed="right" class-name="small-padding fixed-width"
v-if="props.parentName != 'dyUser'"> v-if="props.parentName != 'dyUser'">
<template #default="scope"> <template #default="scope">
@@ -51,12 +55,78 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 报名人数弹窗-->
<el-dialog v-model="numdialog.visible" title="报名人数" width="60%" append-to-body>
<el-table v-loading="loading" :height="500" border :data="numdialog.activityUsersList">
<el-table-column v-if="true" label="序号" align="center" prop="id" fixed width="80px" />
<el-table-column label="昵称" align="center" fixed prop="nickname" width="180px" />
<el-table-column label="头像" align="center" fixed prop="avatar" width="80px" />
<el-table-column label="性别" align="center" prop="sex">
<template #default="scope">
<dict-tag :options="sys_user_sex" :value="scope.row.sex" />
</template>
</el-table-column>
<el-table-column label="报名宣言" align="center" prop="declaration" show-overflow-tooltip />
<el-table-column label="介绍照片" align="center" prop="introducePhoto" />
<el-table-column label="微信号" align="center" prop="wechat" />
<el-table-column label="报名时间" align="center" prop="createTime" width="180px" />
<el-table-column label="报名结果" align="center" prop="status" width="180px">
<template #default="scope">
<el-tag v-if="scope.row.status == 1" type="info">通过</el-tag>
<el-tag v-if="scope.row.status == 0" type="primary">待挑选</el-tag>
<!-- <el-tag v-if="scope.row.status == 3" type="primary">拒绝</el-tag>-->
</template>
</el-table-column>
</el-table>
<pagination v-show="numdialog.total > 0" id="table_page" v-model:page="numdialog.params.pageNum"
v-model:limit="numdialog.params.pageSize" :total="numdialog.total" @pagination="baominglist" />
<template #footer>
<div class="dialog-footer">
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<!-- 查看活动流程 -->
<el-dialog v-model="seedialog.visible" :title="seedialog.title" width="60%" append-to-body>
<activitylink :form="form" :listdatatime="seedialog.listdatatime"></activitylink>
</el-dialog>
<!-- 问答弹窗-->
<el-dialog v-model="wendadialog.visible" title="问答" width="40%" append-to-body>
<div v-if="wendadialog.Answeringlist.length>0">
<div style="height: 400px;overflow: auto;">
<div v-for="item in wendadialog.Answeringlist" style="line-height: 30px; padding: 0 20px">
<div style="display: flex; justify-content: space-between">
<div style="font-weight: 600; font-size: 14px">Q:{{ item.declaration }}</div>
<div style="font-size: 12px">{{ item.quserName }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ item.createTime }}
</div>
</div>
<div style="font-size: 12px">A:{{ item.answer }}</div>
</div>
</div>
<pagination v-show="wendadialog.total > 0" id="table_page" v-model:page="wendadialog.params.pageNum"
v-model:limit="wendadialog.params.pageSize" :total="wendadialog.total" @pagination="wendalistid" />
</div>
<div v-else>
<el-empty description="暂无数据" />
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
<script setup lang="ts" name="partyList"> <script setup lang="ts" name="partyList">
import { ref, reactive, onMounted, nextTick } from 'vue'; import { ref, reactive, onMounted, nextTick } from 'vue';
import {
getActivity,
activityprocess,
activityUsersList,
activityAnsweringlist
} from '@/api/manage/activity';
//导入父组件传递的值 //导入父组件传递的值
const props = defineProps({ const props = defineProps({
partyList: { partyList: {
@@ -72,8 +142,26 @@ const props = defineProps({
default: () => '' default: () => ''
} }
}); });
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { sys_user_sex } = toRefs<any>(
proxy?.useDict('sys_user_sex')
);
const loading = ref(false); const loading = ref(false);
const form = reactive({
id: undefined,
activityName: undefined,
activityDescription: undefined,
sortNum: undefined,
activityUserCount: undefined,
registrationCount: undefined,
isSelected: undefined,
activityTime: undefined,
registrationDeadline: undefined,
publisherAddress: undefined,
activityLocation: undefined,
paymentMethod: undefined,
status: undefined
});
/** 多选框选中数据 */ /** 多选框选中数据 */
const handleSelectionChange = (selection: any) => { const handleSelectionChange = (selection: any) => {
// ids.value = selection.map((item) => item.id); // ids.value = selection.map((item) => item.id);
@@ -89,6 +177,77 @@ const handleUpdate = async (row?: any) => {
const handleDelete = (row: any) => { const handleDelete = (row: any) => {
emit('handleDelete', row); emit('handleDelete', row);
}; };
const cancel = () => {
numdialog.visible = false;
numdialog.params.pageNum = 1;
numdialog.params.activityId = undefined;
wendadialog.visible = false;
wendadialog.params.pageNum = 1;
wendadialog.params.activityId = undefined;
}
// 报名人数弹窗
const numdialog = reactive({
visible: false,
type:'',
title:'',
total:0,
activityUsersList:[],
params:{
pageNum: 1,
pageSize: 10,
activityId: undefined
}
});
// 查看报名人数
const baominglist = async (row:any) => {
if (row.id) {
numdialog.params.activityId = row.id;
}
const res = await activityUsersList(numdialog.params);
numdialog.activityUsersList = res.rows;
numdialog.total = res.total;
numdialog.visible = true;
};
// 查看活动流程
const seedialog = reactive({
visible: false,
title: '活动流程',
form: {},
listdatatime: [{ activityTime: '', planContent: '' }],
});
const chakanhandle = async (row: any) => {
const res = await getActivity(row.id);
const arr = await activityprocess({ activityId: row.id });
console.log(arr);
// = arr.data;
Object.assign(form, res.data);
// Object.assign(listdatatime.value, arr.data);
seedialog.listdatatime = arr.data;
seedialog.visible = true;
}
// 问答弹窗
const wendadialog = reactive({
visible: false,
title: '问答',
total: 0,
params:{
pageNum: 1,
pageSize: 10,
activityId: undefined
},
Answeringlist:[]
});
const wendalistid = async (row:any) => {
if (row.id) {
wendadialog.params.activityId = row.id;
}
loading.value = true;
const res = await activityAnsweringlist(wendadialog.params).finally(()=>{loading.value = false});
console.log(res);
wendadialog.Answeringlist = res.rows;
wendadialog.total = res.total;
wendadialog.visible = true;
};
// 导入父组件定义的函数 // 导入父组件定义的函数
const emit = defineEmits(['hideDialog', 'handleUpdate', 'handleDelete']); const emit = defineEmits(['hideDialog', 'handleUpdate', 'handleDelete']);
</script> </script>
-76
View File
@@ -1,82 +1,6 @@
<template> <template>
<div class="app-container home"> <div class="app-container home">
<el-row :gutter="20">
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>岛游后台管理系统</h2>
<p>
岛游后台管理系统 是基于 RuoYi-Vue 针对 分布式集群 场景升级(不兼容原框架)
<br />
* 前端开发框架 Vue3TSElement Plus<br />
* 后端开发框架 Spring Boot<br />
* 容器框架 Undertow 基于 Netty 的高性能容器<br />
* 权限认证框架 Sa-Token 支持多终端认证系统<br />
* 关系数据库 MySQL 适配 8.X 最低 5.7<br />
* 缓存数据库 Redis 适配 6.X 最低 4.X<br />
* 数据库框架 Mybatis-Plus 快速 CRUD 增加开发效率<br />
* 数据库框架 p6spy 更强劲的 SQL 分析<br />
* 多数据源框架 dynamic-datasource 支持主从与多种类数据库异构<br />
* 序列化框架 Jackson 统一使用 jackson 高效可靠<br />
* Redis客户端 Redisson 性能强劲API丰富<br />
* 分布式限流 Redisson 全局请求IP集群ID 多种限流<br />
* 分布式锁 Lock4j 注解锁工具锁 多种多样<br />
* 分布式幂等 Lock4j 基于分布式锁实现<br />
* 分布式链路追踪 SkyWalking 支持链路追踪网格分析度量聚合可视化<br />
* 分布式任务调度 SnailJob 高性能 高可靠 易扩展<br />
* 文件存储 Minio 本地存储<br />
* 文件存储 七牛阿里腾讯 云存储<br />
* 监控框架 SpringBoot-Admin 全方位服务监控<br />
* 校验框架 Validation 增强接口安全性 严谨性<br />
* Excel框架 Alibaba EasyExcel 性能优异 扩展性强<br />
* 文档框架 SpringDocjavadoc 无注解零入侵基于java注释<br />
* 工具类框架 HutoolLombok 减少代码冗余 增加安全性<br />
* 代码生成器 适配MPSpringDoc规范化代码 一键生成前后端代码<br />
* 部署方式 Docker 容器编排 一键部署业务集群<br />
* 国际化 SpringMessage Spring标准国际化方案<br />
</p>
<p><b>当前版本:</b> <span>v5.2.3</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
</el-col>
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>RuoYi-Cloud-Plus多租户微服务管理系统</h2>
<p>
RuoYi-Cloud-Plus 微服务通用权限管理系统 重写 RuoYi-Cloud 全方位升级(不兼容原框架)
<br />
* 前端开发框架 Vue3TSElement UI<br />
* 后端开发框架 Spring Boot<br />
* 微服务开发框架 Spring CloudSpring Cloud Alibaba<br />
* 容器框架 Undertow 基于 XNIO 的高性能容器<br />
* 权限认证框架 Sa-TokenJwt 支持多终端认证系统<br />
* 关系数据库 MySQL 适配 8.X 最低 5.7<br />
* 关系数据库 Oracle 适配 11g 12c<br />
* 关系数据库 PostgreSQL 适配 13 14<br />
* 关系数据库 SQLServer 适配 2017 2019<br />
* 缓存数据库 Redis 适配 6.X 最低 5.X<br />
* 分布式注册中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
* 分布式配置中心 Alibaba Nacos 采用2.X 基于GRPC通信高性能<br />
* 服务网关 Spring Cloud Gateway 响应式高性能网关<br />
* 负载均衡 Spring Cloud Loadbalancer 负载均衡处理<br />
* RPC远程调用 Apache Dubbo 原生态使用体验高性能<br />
* 分布式限流熔断 Alibaba Sentinel 无侵入高扩展<br />
* 分布式事务 Alibaba Seata 无侵入高扩展 支持 四种模式<br />
* 分布式消息队列 Apache Kafka 高性能高速度<br />
* 分布式消息队列 Apache RocketMQ 高可用功能多样<br />
* 分布式消息队列 RabbitMQ 支持各种扩展插件功能多样性<br />
* 分布式搜索引擎 ElasticSearch 业界知名<br />
* 分布式链路追踪 Apache SkyWalking 链路追踪网格分析度量聚合可视化<br />
* 分布式日志中心 ELK 业界成熟解决方案<br />
* 分布式监控 PrometheusGrafana 全方位性能监控<br />
* 其余与 Vue 版本一致<br />
</p>
<p><b>当前版本:</b> <span>v2.2.2</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
</el-col>
</el-row>
<el-divider />
</div> </div>
</template> </template>
+21 -80
View File
@@ -36,9 +36,13 @@
<el-table v-loading="loading" :height="autoTableHeight" :data="activityList" border @selection-change="handleSelectionChange"> <el-table v-loading="loading" :height="autoTableHeight" :data="activityList" border @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column v-if="true" label="ID" align="center" prop="id" fixed width="180px" /> <el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="活动名称" align="center" fixed prop="activityName" width="180px" /> <el-table-column label="活动名称" align="center" fixed prop="activityName" width="180px" />
<el-table-column label="活动描述" align="center" fixed prop="activityDescription" width="180px" show-overflow-tooltip /> <el-table-column label="活动描述" align="center" prop="activityDescription" width="180px" show-overflow-tooltip />
<el-table-column label="活动图片" align="center" prop="" /> <el-table-column label="活动图片" align="center" prop="" />
<el-table-column label="活动人数" align="center" prop="activityUserCount" /> <el-table-column label="活动人数" align="center" prop="activityUserCount" />
<el-table-column label="报名人数" align="center" prop="registrationCount"> <el-table-column label="报名人数" align="center" prop="registrationCount">
@@ -73,38 +77,25 @@
<el-table-column label="发布状态" align="center" prop="status" width="100px"> <el-table-column label="发布状态" align="center" prop="status" width="100px">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="warning">草稿</el-tag> <el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">审核中</el-tag> <el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
<el-tag v-if="scope.row.status == 3" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="发布时间" align="center" prop="publishTime" />
<el-table-column label="发布人员" align="center" prop="publishName" /> <el-table-column label="发布人员" align="center" prop="publishName" />
<el-table-column label="操作人员" align="center" prop="updateName" />
<el-table-column label="操作时间" align="center" prop="updateTime" width="180px" /> <el-table-column label="操作时间" align="center" prop="updateTime" width="180px" />
<el-table-column label="操作" align="center" width="150px" fixed="right" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" width="150px" fixed="right" class-name="small-padding fixed-width">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.userZombie == true"> <div v-if="scope.row.userZombie == true">
<el-button <el-button v-if="scope.row.status == 0" v-hasPermi="['system:article:edit']" link type="primary" @click="handleUpdate(scope.row, 1)"
v-if="scope.row.status == 0 || scope.row.status == 1"
v-hasPermi="['system:article:edit']"
link
type="primary"
@click="handleUpdate(scope.row, 1)"
>编辑</el-button >编辑</el-button
> >
<el-button v-if="scope.row.status == 0" v-hasPermi="['system:article:edit']" link type="primary" @click="saveupdate(scope.row, 1)" <el-button v-if="scope.row.status == 0" v-hasPermi="['system:article:edit']" link type="primary" @click="saveupdate(scope.row, 0)"
>发布</el-button >发布</el-button
> >
<el-button v-if="scope.row.status == 3" v-hasPermi="['system:article:edit']" link type="primary" @click="saveupdate(scope.row, 2)" <el-button v-if="scope.row.status == 2" v-hasPermi="['system:article:edit']" link type="primary" @click="saveupdate(scope.row, 2)"
>撤销发布</el-button >撤销发布</el-button
> >
<el-button <el-button v-if="scope.row.status == 0" v-hasPermi="['system:article:remove']" link type="primary" @click="handleDelete(scope.row)"
v-if="scope.row.status == 0 || scope.row.status == 1"
v-hasPermi="['system:article:remove']"
link
type="primary"
@click="handleDelete(scope.row)"
>删除</el-button >删除</el-button
> >
</div> </div>
@@ -204,57 +195,7 @@
</el-dialog> </el-dialog>
<!-- 查看活动流程 --> <!-- 查看活动流程 -->
<el-dialog v-model="seedialog.visible" :title="seedialog.title" width="60%" append-to-body> <el-dialog v-model="seedialog.visible" :title="seedialog.title" width="60%" append-to-body>
<el-form ref="activityFormRef" :model="form" :rules="rules" label-width="120px"> <activitylink :form="form" :listdatatime="listdatatime"></activitylink>
<el-form-item label="活动名称">
<div>{{ form.activityName }}</div>
</el-form-item>
<el-form-item label="活动描述">
<div>{{ form.activityDescription }}</div>
</el-form-item>
<el-form-item label="活动人数">
<div>{{ form.activityUserCount }}</div>
</el-form-item>
<div style="display: flex">
<el-form-item label="活动时间">
<div>{{ form.activityTime }}</div>
</el-form-item>
<el-form-item label="报名截至时间">
<div>{{ form.registrationDeadline }}</div>
</el-form-item>
</div>
<div style="display: flex">
<el-form-item label="发布者地址">
<div>{{ form.publisherAddress }}</div>
</el-form-item>
<el-form-item label="活动地点">
<div>{{ form.activityLocation }}</div>
</el-form-item>
</div>
<el-form-item label="收费方式">
<el-radio-group v-model="form.paymentMethod" disabled>
<el-radio :value="1">发起人收款</el-radio>
<el-radio :value="0">免费</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="挑选玩友">
<el-radio-group v-model="form.isSelected" disabled>
<el-radio :value="1">挑选</el-radio>
<el-radio :value="0">不挑选</el-radio>
</el-radio-group>
<span style="margin-left: 30px; font-size: 12px; color: #707070">勾选后发起人需要逐个审核报名者确认是否通过报名</span>
</el-form-item>
<el-form-item label="活动流程"> </el-form-item>
<div v-for="(item, index) in listdatatime">
<div style="display: flex; align-items: center">
<el-form-item label="时间">
<div>{{ item.activityTime }}</div>
</el-form-item>
<el-form-item label="计划的活动内容">
<div>{{ item.planContent }}</div>
</el-form-item>
</div>
</div>
</el-form>
</el-dialog> </el-dialog>
<!-- 问答弹窗--> <!-- 问答弹窗-->
<el-dialog v-model="wendadialog.visible" title="问答" width="40%" append-to-body> <el-dialog v-model="wendadialog.visible" title="问答" width="40%" append-to-body>
@@ -349,10 +290,9 @@ const publisherAddress = ref({});
const Mapvalue = ref({}); const Mapvalue = ref({});
const Mapvaluetwo = ref({}); const Mapvaluetwo = ref({});
const note_publish_list = ref([ const note_publish_list = ref([
{ label: '已发布', value: 3 },
{ label: '审核中', value: 2 },
{ label: '未发布', value: 0 }, { label: '未发布', value: 0 },
{ label: '草稿', value: 1 } { label: '审核中', value: 1 },
{ label: '已发布', value: 2 }
]); ]);
const activityFormRef = ref<ElFormInstance>(); const activityFormRef = ref<ElFormInstance>();
const getMapValue = (value: any) => { const getMapValue = (value: any) => {
@@ -513,10 +453,10 @@ const saveupdate = async (row?: ActivityVO, type) => {
const res = await getActivity(_id); const res = await getActivity(_id);
const arr = await activityprocess({ activityId: _id }); const arr = await activityprocess({ activityId: _id });
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
form.value.status = type == 1 ? 2 : 0; form.value.status = type == 0 ? 1 : 0;
const test = type == 1 ? '发布' : '撤销发布'; const test = type == 0 ? '发布' : '撤销发布';
const _ids = row?.activityName || ids.value; const _ids = row?.activityName || ids.value;
await proxy?.$modal.confirm('是否确认' + test + '活动信息编号为' + _ids + '的数据项?').finally(() => (loading.value = false)); await proxy?.$modal.confirm('是否确认' + test + '活动名称为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await updateActivity(form.value).finally(() => (buttonLoading.value = false)); await updateActivity(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess(test + '成功'); proxy?.$modal.msgSuccess(test + '成功');
await getList(); await getList();
@@ -575,8 +515,9 @@ const submitForm = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: ActivityVO) => { const handleDelete = async (row?: ActivityVO) => {
const _ids = row?.activityName || ids.value; const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除活动信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false)); const _idsname = row?.activityName || ids.value;
await proxy?.$modal.confirm('是否确认删除活动名称为"' + _idsname + '"的数据项?').finally(() => (loading.value = false));
await delActivity(_ids); await delActivity(_ids);
proxy?.$modal.msgSuccess('删除成功'); proxy?.$modal.msgSuccess('删除成功');
await getList(); await getList();
+25 -11
View File
@@ -40,7 +40,12 @@
<el-table v-loading="loading" :height="autoTableHeight" border :data="articleList" <el-table v-loading="loading" :height="autoTableHeight" border :data="articleList"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" /> --> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column label="ID" align="center" prop="id" v-if="true" width="180px" /> <!-- <el-table-column label="ID" align="center" prop="id" v-if="true" width="180px" /> -->
<el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="标题" align="center" prop="title" /> <el-table-column label="标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" width="80px"> <el-table-column label="内容" align="center" prop="content" width="80px">
<template #default="scope"> <template #default="scope">
@@ -58,7 +63,7 @@
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag> <el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">已发布</el-tag> <el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="更新时间" align="center" prop="updateTime" width="120"> <el-table-column label="更新时间" align="center" prop="updateTime" width="120">
@@ -69,9 +74,9 @@
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160px"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-if="scope.row.status == 0" @click="updateRow(scope.row,'2')" <el-button link type="primary" v-if="scope.row.status == 0" @click="updateRow(scope.row,1)"
v-hasPermi="['manage:article:edit']">发布</el-button> v-hasPermi="['manage:article:edit']">发布</el-button>
<el-button link type="primary" v-if="scope.row.status == 2" @click="updateRow(scope.row,'0')" <el-button link type="primary" v-if="scope.row.status == 2" @click="updateRow(scope.row,0)"
v-hasPermi="['manage:article:edit']">撤销发布</el-button> v-hasPermi="['manage:article:edit']">撤销发布</el-button>
<el-tooltip content="编辑" placement="top" v-if="scope.row.status == 0"> <el-tooltip content="编辑" placement="top" v-if="scope.row.status == 0">
<el-button link type="primary" @click="handleUpdate(scope.row)" <el-button link type="primary" @click="handleUpdate(scope.row)"
@@ -88,13 +93,14 @@
<pagination id="table_page" v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" <pagination id="table_page" 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-dialog :title="dialog.title" v-model="dialog.visible" width="700px" append-to-body> <el-dialog :title="dialog.title" v-model="dialog.visible" :width="dialogWidth" append-to-body>
<el-form ref="articleFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="articleFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="文章标题" prop="title"> <el-form-item label="文章标题" prop="title">
<el-input v-model="form.title" placeholder="请输入文章标题" /> <el-input v-model="form.title" placeholder="请输入文章标题" />
</el-form-item> </el-form-item>
<el-form-item label="标签" prop="tagId_copy"> <el-form-item label="标签" prop="tagId_copy">
<el-select class="inputWidth" v-model="form.tagId_copy" multiple filterable placeholder="请选择标签" clearable> <el-select class="inputWidth" v-model="form.tagId_copy" multiple filterable placeholder="请选择标签" clearable
@visible-change="getTagList">
<el-option v-for="dict in sys_user_tagOptions" :key="dict.id" :label="dict.title" <el-option v-for="dict in sys_user_tagOptions" :key="dict.id" :label="dict.title"
:value="String(dict.id)" /> :value="String(dict.id)" />
</el-select> </el-select>
@@ -131,7 +137,7 @@
import { listTag,tagAll } from '@/api/manage/tag'; import { listTag,tagAll } from '@/api/manage/tag';
import { listArticle, getArticle, delArticle, addArticle, updateArticle } from '@/api/manage/article'; import { listArticle, getArticle, delArticle, addArticle, updateArticle } from '@/api/manage/article';
import { ArticleVO, ArticleQuery, ArticleForm } from '@/api/manage/article/types'; import { ArticleVO, ArticleQuery, ArticleForm } from '@/api/manage/article/types';
const dialogWidth=ref(window.innerWidth*0.6+'px');
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const sys_user_tagOptions = ref([]); //标签库 const sys_user_tagOptions = ref([]); //标签库
const autoTableHeight = ref<number>(750); const autoTableHeight = ref<number>(750);
@@ -281,16 +287,22 @@ const handleUpdate = async (row?:any) => {
dialog.visible = true; dialog.visible = true;
dialog.title = "修改文章"; dialog.title = "修改文章";
} }
const getTagList = async (visible: boolean) => {
if (visible) {
getTag(); //标签库
}
}
/** /**
* *
* @param row 发布,撤销发布 * @param row 发布,撤销发布
* @param type * @param type
*/ */
const updateRow = async (row: any, type: string) => { const updateRow = async (row: any, type: number) => {
await proxy?.$modal.confirm('是否确认' + (type == '0' ? '撤销发布' : '发布') + '名称为"' + row.title + '"的数据项?'); await proxy?.$modal.confirm('是否确认' + (type == 0 ? '撤销发布' : '发布') + '名称为"' + row.title + '"的数据项?');
row.status = type; Object.assign(form.value, row);
form.value.status = type;
buttonLoading.value = true; buttonLoading.value = true;
await updateArticle(row).finally(() => (buttonLoading.value = false)); await updateArticle(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
getList(); getList();
}; };
@@ -313,6 +325,8 @@ const submitForm = () => {
proxy?.$modal.msgSuccess("操作成功"); proxy?.$modal.msgSuccess("操作成功");
dialog.visible = false; dialog.visible = false;
await getList(); await getList();
}else{
proxy?.$modal.msgError("缺少必填项");
} }
}); });
} }
+1 -1
View File
@@ -44,7 +44,7 @@
<el-table-column label="状态" align="center" prop="" width="90px"> <el-table-column label="状态" align="center" prop="" width="90px">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 0" type="info">未上架</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未上架</el-tag>
<el-tag v-if="scope.row.status == 1" type="success">已上架</el-tag> <el-tag v-if="scope.row.status == 1" type="primary">已上架</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180px"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180px">
+108 -40
View File
@@ -24,16 +24,17 @@
<el-option v-for="dict in dy_user_status" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in dy_user_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="会员等级" prop="leveId"> <el-form-item label="会员等级" prop="levelId">
<!-- <el-input class="inputWidth" v-model="queryParams.leveId" placeholder="请输入会员等级" clearable <!-- <el-input class="inputWidth" v-model="queryParams.levelId" placeholder="请输入会员等级" clearable
@keyup.enter="handleQuery" /> --> @keyup.enter="handleQuery" /> -->
<el-select class="inputWidth" v-model="queryParams.leveId" placeholder="请选择会员等级" clearable> <el-select class="inputWidth" v-model="queryParams.levelId" placeholder="请选择会员等级" clearable>
<el-option v-for="dict in levelList" :key="dict.id" :label="dict.levelName" :value="dict.id" /> <el-option v-for="dict in levelList" :key="dict.id" :label="dict.levelName" :value="dict.id" />
</el-select> </el-select>
</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 icon="Refresh" @click="resetQuery">重置</el-button> v-hasPermi="['manage:dyUser:query']">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery" v-hasPermi="['manage:dyUser:query']">重置</el-button>
<!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:dyUser:edit']" <!-- <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['manage:dyUser:edit']"
>封禁</el-button >封禁</el-button
> --> > -->
@@ -48,13 +49,22 @@
<el-table :height="autoTableHeight" v-loading="loading" :data="dyUserList" @selection-change="handleSelectionChange" <el-table :height="autoTableHeight" v-loading="loading" :data="dyUserList" @selection-change="handleSelectionChange"
style="width: 100%" border> style="width: 100%" border>
<!-- <el-table-column fixed type="selection" width="55" align="center" /> --> <!-- <el-table-column fixed type="selection" width="55" align="center" /> -->
<el-table-column fixed label="用户ID" align="center" prop="id" /> <el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<!-- <el-table-column fixed label="用户ID" align="center" prop="id" /> -->
<el-table-column fixed label="帐号状态" align="center" prop="status"> <el-table-column fixed label="帐号状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="dy_user_status" :value="scope.row.status" /> <dict-tag :options="dy_user_status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed label="会员等级" align="center" prop="levelName" /> <el-table-column fixed label="会员等级" align="center" prop="levelId">
<template #default="scope">
<span>{{ levelList.find(item => item.id === scope.row.levelId)?.levelName }}</span>
</template>
</el-table-column>
<el-table-column fixed label="昵称" align="center" prop="nickName" /> <el-table-column fixed label="昵称" align="center" prop="nickName" />
<el-table-column label="用户性别" align="center" prop="sex"> <el-table-column label="用户性别" align="center" prop="sex">
<template #default="scope"> <template #default="scope">
@@ -81,60 +91,69 @@
</el-table-column> </el-table-column>
<el-table-column width="55" label="年龄" align="center" prop="age" /> <el-table-column width="55" label="年龄" align="center" prop="age" />
<el-table-column width="150" label="常住地" align="center" prop="address" /> <el-table-column width="150" label="常住地" align="center" prop="address" />
<el-table-column width="70" label="星座" align="center" prop="constellation" /> <el-table-column width="80" label="星座" align="center" prop="constellation">
<template #default="scope">
<dict-tag :options="dy_user_sign" :value="scope.row.constellation" />
</template>
</el-table-column>
<el-table-column width="100" label="职业" align="center" prop="occupation" /> <el-table-column width="100" label="职业" align="center" prop="occupation" />
<el-table-column width="120" label="简介" align="center" prop="remark" /> <el-table-column width="120" label="简介" align="center" prop="remark" />
<el-table-column width="80" label="IP形象" align="center" prop="" /> <el-table-column width="80" label="IP形象" align="center" prop="" />
<el-table-column width="80" label="发布笔记" align="center" prop=""> <el-table-column width="80" label="发布笔记" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openNoteListDialog(scope.row)">12</span> @click="openNoteListDialog(scope.row)">{{ scope.row.notebookCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="90" label="发布的活动" align="center" prop=""> <el-table-column width="90" label="发布的活动" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openPartyListDialog(scope.row)">15</span> @click="openPartyListDialog(scope.row)">{{ scope.row.pubMateCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="80" label="关注的人" align="center" prop="" /> <el-table-column width="80" label="关注的人" align="center" prop="focusCount" />
<el-table-column width="80" label="粉丝数" align="center" prop="" /> <el-table-column width="80" label="粉丝数" align="center" prop="fanCount" />
<el-table-column width="90" label="到过的景点" align="center" prop=""> <el-table-column width="90" label="到过的景点" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openScenicListDialog(scope.row)">20</span> @click="openScenicListDialog(scope.row)">{{ scope.row.scenicSpotCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="90" label="点亮的城市" align="center" prop=""> <el-table-column width="90" label="点亮的城市" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openCityListDialog(scope.row)">25</span> @click="openCityListDialog(scope.row)">{{ scope.row.cityCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="110" label="获得的明信片" align="center" prop=""> <el-table-column width="110" label="获得的明信片" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openPostcardListDialog(scope.row)">12</span> @click="openPostcardListDialog(scope.row)">{{ scope.row.postcardCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="80" label="我的愿望" align="center" prop="" /> <el-table-column width="150" label="我的愿望" align="center" prop="wish" show-overflow-tooltip />
<el-table-column width="80" label="我的背包" align="center" prop="" /> <el-table-column width="80" label="我的背包" align="center" prop="" />
<el-table-column width="90" label="获得的物品" align="center" prop="" /> <el-table-column width="90" label="获得的物品" align="center" prop="obtainedItemsCount">
<el-table-column width="70" label="积分" align="center" prop="score" /> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openObtainedItemsListDialog(scope.row)">{{ scope.row.obtainedItemsCount }}</span>
</template>
</el-table-column>
<el-table-column width="70" label="积分" align="center" prop="userScore" />
<el-table-column width="90" label="我的订单" align="center" prop=""> <el-table-column width="90" label="我的订单" align="center" prop="">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer" @click="openOrderListDialog(scope.row)">查看详情</span> <span style="color: dodgerblue; cursor: pointer" @click="openOrderListDialog(scope.row)">查看详情</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="80" label="邀请人数" align="center" prop=""> <el-table-column width="100" label="邀请人数(大转盘)" align="center" prop="inviteCount">
<template #default="scope"> <template #default="scope">
<span style="color: dodgerblue; cursor: pointer; text-decoration: underline" <span style="color: dodgerblue; cursor: pointer; text-decoration: underline"
@click="openInviteListDialog(scope.row)">35</span> @click="openInviteListDialog(scope.row)">{{ scope.row.inviteCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="80" label="处理方式" align="center" prop=""> <el-table-column width="80" label="处理方式" align="center" prop="">
<template #default="scope"> <template #default="scope">
<dict-tag :options="dy_user_status" :value="scope.row.status" /> <dict-tag v-if="scope.row.status!=0" :options="dy_user_status" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="150" label="封禁理由" align="center" prop="reason" show-overflow-tooltip> <el-table-column width="150" label="封禁理由" align="center" prop="reason" show-overflow-tooltip>
@@ -142,14 +161,14 @@
<dict-tag :options="dy_user_ban_mode" :value="scope.row.reason" /> <dict-tag :options="dy_user_ban_mode" :value="scope.row.reason" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="80" label="封禁天数" align="center" prop="banDays"> <el-table-column width="80" label="封禁天数" align="center" prop="">
<template #default="scope"> <template #default="scope">
<dict-tag :options="dy_user_ban_days" :value="scope.row.banDays" /> <dict-tag v-if="scope.row.banDays!='0'" :options="dy_user_ban_days" :value="scope.row.banDays" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="90" label="操作人" align="center" prop="" /> <el-table-column width="90" label="操作人" align="center" prop="" />
<el-table-column width="120" label="操作时间" align="center" prop="" /> <el-table-column width="120" label="操作时间" align="center" prop="" />
<el-table-column fixed="right" label="操作" min-width="120"> <el-table-column fixed="right" label="操作" min-width="120" align="center">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" size="small" v-hasPermi="['manage:dyUser:edit']" v-if="scope.row.status == 0" <el-button link type="primary" size="small" v-hasPermi="['manage:dyUser:edit']" v-if="scope.row.status == 0"
@click="openbanned(scope.row)">封禁</el-button> @click="openbanned(scope.row)">封禁</el-button>
@@ -173,8 +192,8 @@
</el-form-item> </el-form-item>
<el-form-item label="处理方式" prop="status"> <el-form-item label="处理方式" prop="status">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio v-for="dict in dy_user_status" :key="dict.value" :label="dict.label" <el-radio v-for="dict in dy_user_status" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"
:value="parseInt(dict.value)">{{ dict.label }}</el-radio> v-show="dict.value != '0'">{{ dict.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="处理天数" prop="banDays"> <el-form-item label="处理天数" prop="banDays">
@@ -270,7 +289,7 @@
</template> </template>
</el-dialog> </el-dialog>
<!-- 用户邀请人数 --> <!-- 用户邀请人数 -->
<el-dialog title="邀请人数" v-model="inviteListDialog.visible" width="500px" append-to-body> <el-dialog title="邀请人数(大转盘)" v-model="inviteListDialog.visible" width="500px" append-to-body>
<el-table :height="300" v-loading="loading" :data="inviteListDialog.inviteList" border> <el-table :height="300" v-loading="loading" :data="inviteListDialog.inviteList" border>
<el-table-column label="用户名称" align="center" fixed prop="nickName" /> <el-table-column label="用户名称" align="center" fixed prop="nickName" />
<el-table-column label="用户头像" align="center" fixed prop="" /> <el-table-column label="用户头像" align="center" fixed prop="" />
@@ -297,6 +316,23 @@
</div> </div>
</template> </template>
</el-dialog> </el-dialog>
<!-- 用户邀请人数 -->
<el-dialog title="获得物品" v-model="obtainedItemsDialog.visible" width="500px" append-to-body>
<el-table :height="300" v-loading="loading" :data="obtainedItemsDialog.obtainedList" border>
<el-table-column label="名称" align="center" fixed prop="" />
<el-table-column label="来源" align="center" fixed prop="" />
<el-table-column label="获得时间" align="center" fixed prop="" />
<el-table-column label="邮寄/使用状态" align="center" fixed prop="" />
</el-table>
<pagination v-show="obtainedItemsDialog.total > 0" :total="obtainedItemsDialog.total"
v-model:page="obtainedItemsDialog.params.pageNum" v-model:limit="obtainedItemsDialog.params.pageSize"
@pagination="openInviteListDialog" />
<template #footer>
<div class="dialog-footer">
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
@@ -308,8 +344,8 @@ import { listDyUser, getDyUser, delDyUser, addDyUser, updateDyUser,userSights,us
import { DyUserVO, DyUserQuery, DyUserForm } from '@/api/manage/dyUser/types'; import { DyUserVO, DyUserQuery, DyUserForm } from '@/api/manage/dyUser/types';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { dy_user_ban_days, dy_user_status, sys_user_sex, dy_user_ban_mode } = toRefs<any>( const { dy_user_ban_days, dy_user_status, sys_user_sex, dy_user_ban_mode,dy_user_sign } = toRefs<any>(
proxy?.useDict('dy_user_ban_days', 'dy_user_status', 'sys_user_sex', 'dy_user_ban_mode') proxy?.useDict('dy_user_ban_days', 'dy_user_status', 'sys_user_sex', 'dy_user_ban_mode','dy_user_sign')
); );
const orderLists = ref([]); //用户订单列表 const orderLists = ref([]); //用户订单列表
const scenicList = ref([]); //用户点亮的景点 const scenicList = ref([]); //用户点亮的景点
@@ -344,7 +380,7 @@ const initFormData: DyUserForm = {
loginIp: undefined, loginIp: undefined,
loginDate: undefined, loginDate: undefined,
remark: undefined, remark: undefined,
leveId: undefined, levelId: undefined,
birthday: undefined, birthday: undefined,
age: undefined, age: undefined,
address: undefined, address: undefined,
@@ -369,7 +405,7 @@ const data = reactive<PageData<DyUserForm, DyUserQuery>>({
status: undefined, status: undefined,
loginIp: undefined, loginIp: undefined,
loginDate: undefined, loginDate: undefined,
leveId: undefined, levelId: undefined,
birthday: undefined, birthday: undefined,
age: undefined, age: undefined,
address: undefined, address: undefined,
@@ -437,6 +473,8 @@ const cancel = () => {
inviteListDialog.params.pageNum = 1; inviteListDialog.params.pageNum = 1;
orderListDialog.visible = false; orderListDialog.visible = false;
orderListDialog.params.pageNum = 1; orderListDialog.params.pageNum = 1;
obtainedItemsDialog.visible = false;
obtainedItemsDialog.params.pageNum = 1;
}; };
/** 表单重置 */ /** 表单重置 */
@@ -514,8 +552,8 @@ const handleStatus = async (row: DyUserVO) => {
await proxy?.$modal.confirm('是否确认解封用户昵称为"' + row.nickName + '"的数据项?') await proxy?.$modal.confirm('是否确认解封用户昵称为"' + row.nickName + '"的数据项?')
Object.assign(form.value, row); Object.assign(form.value, row);
form.value.status = 0; form.value.status = 0;
form.value.reason = null; form.value.reason = '';
form.value.banDays=null form.value.banDays='0';
loading.value = true; loading.value = true;
await updateDyUser(form.value).finally(() => (loading.value = false)); await updateDyUser(form.value).finally(() => (loading.value = false));
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
@@ -540,7 +578,8 @@ const openNoteListDialog = async (row?: any) => {
if (row.id) { if (row.id) {
noteListDialog.params.userId = row?.id; noteListDialog.params.userId = row?.id;
} }
let res = await listNotebook(noteListDialog.params); loading.value = true;
let res = await listNotebook(noteListDialog.params).finally(()=>{loading.value = false});
noteListDialog.articleList=res.rows; noteListDialog.articleList=res.rows;
noteListDialog.total=res.total; noteListDialog.total=res.total;
noteListDialog.visible = true; noteListDialog.visible = true;
@@ -563,7 +602,8 @@ const openPartyListDialog = async (row: any) => {
if (row.id) { if (row.id) {
partyListDialog.params.userId = row?.id; partyListDialog.params.userId = row?.id;
} }
let res = await listActivity(partyListDialog.params); loading.value = true;
let res = await listActivity(partyListDialog.params).finally(()=>{loading.value = false});;
partyListDialog.partyList = res.rows; partyListDialog.partyList = res.rows;
partyListDialog.total = res.total; partyListDialog.total = res.total;
partyListDialog.visible = true; partyListDialog.visible = true;
@@ -589,7 +629,8 @@ const openScenicListDialog = async (row: DyUserVO) => {
if (row.id) { if (row.id) {
scenicListDialog.params.userId = row?.id; scenicListDialog.params.userId = row?.id;
} }
let res = await userSights(scenicListDialog.params); loading.value = true;
let res = await userSights(scenicListDialog.params).finally(()=>{loading.value = false});;
scenicListDialog.scenicList = res.rows; scenicListDialog.scenicList = res.rows;
scenicListDialog.total = res.total; scenicListDialog.total = res.total;
scenicListDialog.visible = true; scenicListDialog.visible = true;
@@ -615,7 +656,8 @@ const openCityListDialog = async (row: DyUserVO) => {
if (row.id) { if (row.id) {
cityListDialog.params.userId = row?.id; cityListDialog.params.userId = row?.id;
} }
let res = await userCity(cityListDialog.params); loading.value = true;
let res = await userCity(cityListDialog.params).finally(()=>{loading.value = false});;
cityListDialog.cityList = res.rows; cityListDialog.cityList = res.rows;
cityListDialog.total = res.total; cityListDialog.total = res.total;
cityListDialog.visible = true; cityListDialog.visible = true;
@@ -638,7 +680,8 @@ const openPostcardListDialog = async (row: DyUserVO) => {
if (row.id) { if (row.id) {
postcardListDialog.params.userId = row?.id; postcardListDialog.params.userId = row?.id;
} }
let res = await userPostcard(postcardListDialog.params); loading.value = true;
let res = await userPostcard(postcardListDialog.params).finally(()=>{loading.value = false});;
postcardListDialog.postcardList = res.rows; postcardListDialog.postcardList = res.rows;
postcardListDialog.total = res.total; postcardListDialog.total = res.total;
postcardListDialog.visible = true; postcardListDialog.visible = true;
@@ -661,12 +704,36 @@ const openOrderListDialog = async (row: DyUserVO) => {
if (row.id) { if (row.id) {
orderListDialog.params.userId = row?.id; orderListDialog.params.userId = row?.id;
} }
let res = await userOrders(orderListDialog.params); loading.value = true;
let res = await userOrders(orderListDialog.params).finally(()=>{loading.value = false});;
orderListDialog.postcardList = res.rows; orderListDialog.postcardList = res.rows;
orderListDialog.total = res.total; orderListDialog.total = res.total;
orderListDialog.visible = true; orderListDialog.visible = true;
orderListDialog.visible = true; orderListDialog.visible = true;
}; };
/**
* 获得的物品
*/
const obtainedItemsDialog = reactive({
visible: false,
total: 0,
obtainedList: [],
params: {
userId: null,
pageNum: 1,
pageSize: 10,
},
})
const openObtainedItemsListDialog = async (row: DyUserVO) => {
if (row.id) {
obtainedItemsDialog.params.userId = row?.id;
}
loading.value = true;
let res = await userOrders(obtainedItemsDialog.params).finally(()=>{loading.value = false});;
obtainedItemsDialog.obtainedList = res.rows;
obtainedItemsDialog.total = res.total;
obtainedItemsDialog.visible = true;
};
/** /**
* 用户邀请列表 * 用户邀请列表
*/ */
@@ -684,7 +751,8 @@ const openInviteListDialog = async (row: DyUserVO) => {
if (row.id) { if (row.id) {
inviteListDialog.params.userId = row?.id; inviteListDialog.params.userId = row?.id;
} }
let res = await userInvite(inviteListDialog.params); loading.value = true;
let res = await userInvite(inviteListDialog.params).finally(()=>{loading.value = false});;
inviteListDialog.inviteList = res.rows; inviteListDialog.inviteList = res.rows;
inviteListDialog.total = res.total; inviteListDialog.total = res.total;
inviteListDialog.visible = true; inviteListDialog.visible = true;
+85 -46
View File
@@ -10,12 +10,14 @@
<el-form-item label="发布状态" prop="status"> <el-form-item label="发布状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择发布状态" style="width: 200px" @keyup.enter="handleQuery"> <el-select v-model="queryParams.status" placeholder="请选择发布状态" style="width: 200px" @keyup.enter="handleQuery">
<el-option label="未发布" value="0" /> <el-option label="未发布" value="0" />
<el-option label="已发布" value="1" /> <el-option label="审核中" value="1" />
<el-option label="已发布" value="2" />
</el-select> </el-select>
</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 v-hasPermi="['manage:hotel:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -23,30 +25,20 @@
</transition> </transition>
<el-card shadow="never"> <el-card shadow="never">
<template #header> <el-table v-loading="loading" :data="hotelList" border>
<el-row :gutter="10" class="mb8"> <el-table-column fixed label="序号" align="center" width="80">
<el-col :span="1.5"> <template #default="scope">
<el-button v-hasPermi="['manage:hotel:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</el-col> </template>
<el-col :span="1.5"> </el-table-column>
<el-button v-hasPermi="['manage:hotel:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"
>删除</el-button
>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="hotelList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column v-if="true" label="ID" align="center" prop="id" />
<el-table-column label="住宿商家名称" align="center" prop="name" /> <el-table-column label="住宿商家名称" align="center" prop="name" />
<el-table-column label="商家图片" align="center" prop="imageUrl" /> <el-table-column label="商家图片" align="center" prop="imageUrl" />
<el-table-column label="商家地理位置" align="center" prop="address" /> <el-table-column label="商家地理位置" align="center" prop="address" />
<el-table-column label="联系方式" align="center" prop="number" /> <el-table-column label="联系方式" align="center" prop="number" />
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 1" type="primary">已发布</el-tag> <el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
@@ -54,16 +46,16 @@
<el-table-column label="更新时间" align="center" prop="updateTime" width="180" /> <el-table-column label="更新时间" align="center" prop="updateTime" width="180" />
<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-tooltip v-if="scope.row.status != 1" content="编辑" placement="top"> <el-tooltip v-if="scope.row.status == 0" content="编辑" placement="top">
<el-button v-hasPermi="['manage:hotel:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button> <el-button v-hasPermi="['manage:hotel:edit']" link type="primary" @click="handleUpdate(scope.row)">编辑</el-button>
</el-tooltip> </el-tooltip>
<el-tooltip v-if="scope.row.status != 1" content="删除" placement="top"> <el-tooltip v-if="scope.row.status == 0" content="删除" placement="top">
<el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button> <el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleDelete(scope.row)">删除</el-button>
</el-tooltip> </el-tooltip>
<el-tooltip v-if="scope.row.status == 0" content="发布" placement="top"> <el-tooltip v-if="scope.row.status == 0" content="发布" placement="top">
<el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleEdit(scope.row)">发布</el-button> <el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleEdit(scope.row)">发布</el-button>
</el-tooltip> </el-tooltip>
<el-tooltip v-if="scope.row.status == 1" content="撤销发布" placement="top"> <el-tooltip v-if="scope.row.status == 2" content="撤销发布" placement="top">
<el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleEdit(scope.row)">撤销发布</el-button> <el-button v-hasPermi="['manage:hotel:remove']" link type="primary" @click="handleEdit(scope.row)">撤销发布</el-button>
</el-tooltip> </el-tooltip>
</template> </template>
@@ -97,17 +89,24 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="地理位置" prop="address"> <el-form-item label="地理位置" prop="address">
<!-- <el-input v-model="searchLocation" type="text" placeholder="请输入地址信息" clearable /> --> <!-- <el-input v-model="searchLocation" type="text" placeholder="请输入地址信息" clearable /> -->
<el-input <el-select
v-model="form.address" v-model="searchLocation"
filterable
remote
reserve-keyword
clearable
placeholder="请输入地址信息" placeholder="请输入地址信息"
class="input-with-select" :remote-method="remoteMethod"
style="width: 300px" @change="selectChnange"
@keyup.enter="debouncedSearch(form.address)"
> >
<template #append> <el-option
<el-button :icon="Search" @click="debouncedSearch(form.address)" /> v-for="item in locationOptions"
</template> :key="item.id"
</el-input> :label="item.title + '&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp' + item.province + ' - ' + item.city + '-' + item.district"
:value="item.province + item.city + item.title"
/>
<!-- :value="item.ad_info.province+item.ad_info.city+item.title" /> -->
</el-select>
</el-form-item> </el-form-item>
<tlbs-map <tlbs-map
v-if="dialog.visible" v-if="dialog.visible"
@@ -122,6 +121,15 @@
> >
<tlbs-multi-marker :geometries="geometries" :styles="styles" :options="options" /> <tlbs-multi-marker :geometries="geometries" :styles="styles" :options="options" />
</tlbs-map> </tlbs-map>
<el-form-item label="详细地址" prop="address" style="margin-top: 15px">
<el-input v-model="form.address" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
<el-form-item label="经度" prop="longitude">
<el-input v-model="form.longitude" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
<el-form-item label="纬度" prop="latitude">
<el-input v-model="form.latitude" placeholder="输入地理位置或点击度图上的地点" disabled />
</el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</el-form> </el-form>
@@ -153,6 +161,7 @@ const idsname = ref([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const locationOptions = ref([]); //腾讯地图返回的搜索地址列表
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const hotelFormRef = ref<ElFormInstance>(); const hotelFormRef = ref<ElFormInstance>();
@@ -261,8 +270,9 @@ const handleAdd = () => {
reset(); reset();
dialog.visible = true; dialog.visible = true;
dialog.title = '添加住宿'; dialog.title = '添加住宿';
geometries.value = [{ styleId: 'marker', position: { lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 } }]; searchLocation.value = '';
center.value = { lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 }; geometries.value = [{ styleId: 'marker', position: { lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 } }];
center.value = { lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 };
}; };
/** 修改按钮操作 */ /** 修改按钮操作 */
@@ -274,6 +284,7 @@ const handleUpdate = async (row?: HotelVO) => {
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
center.value = { lat: row.latitude, lng: row.longitude }; center.value = { lat: row.latitude, lng: row.longitude };
geometries.value = [{ styleId: 'marker', position: { lat: row.latitude, lng: row.longitude } }]; geometries.value = [{ styleId: 'marker', position: { lat: row.latitude, lng: row.longitude } }];
searchLocation.value = form.value.address;
dialog.visible = true; dialog.visible = true;
dialog.title = '修改住宿'; dialog.title = '修改住宿';
}; };
@@ -313,12 +324,12 @@ const handleEdit = async (row?: HotelVO) => {
const res = await getHotel(_id); const res = await getHotel(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
const _idname = row?.name; const _idname = row?.name;
const text = row?.status != 1 ? '是否确认发布商家名称为' : '是否撤销发布商家名称为'; const text = row?.status == 0 ? '是否确认发布商家名称为"' : '是否撤销发布商家名称为"';
const messages = row?.status != 1 ? '发布成功' : '撤销成功'; const messages = row?.status == 0 ? '发布成功' : '撤销成功';
await proxy?.$modal.confirm(text + _idname + '"的数据项?').finally(() => (loading.value = false)); await proxy?.$modal.confirm(text + _idname + '"的数据项?').finally(() => (loading.value = false));
const template = { const template = {
...row, ...row,
status: row.status == 1 ? 0 : 1, status: row.status == 0 ? 1 : 0,
regionCode: row?.county || row?.city || row?.province regionCode: row?.county || row?.city || row?.province
}; };
// form.value.name = row.name // form.value.name = row.name
@@ -326,7 +337,35 @@ const handleEdit = async (row?: HotelVO) => {
proxy?.$modal.msgSuccess(messages); proxy?.$modal.msgSuccess(messages);
await getList(); await getList();
}; };
// 地理位置 输入实时搜索
const remoteMethod = (query: string) => {
if (query !== '') {
// 调用腾讯地图API进行搜索,并展示在地图上
// geocoder(query).then((result) => {
// console.log(result);
// });
console.log(query);
// jsonp(`https://apis.map.qq.com/ws/place/v1/search?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&boundary=nearby(20.018883,110.348801,1000)&output=jsonp`, {}).then((res) => {
jsonp(
`https://apis.map.qq.com/ws/place/v1/suggestion?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&region=三亚市&region_fix=0&output=jsonp`,
{}
).then((res) => {
// if (res.region.title!=='海南省') {
// proxy?.$modal.msgError('仅支持海南省地理位置');
// return
// }
if (res.status == 0) {
locationOptions.value = res.data;
}
});
}
};
// 选择地理位置 下拉框值变化
const selectChnange = (val: string) => {
if (val) {
debouncedSearch(searchLocation.value);
}
};
//输入位置,搜索位置 //输入位置,搜索位置
const performSearch = async (text) => { const performSearch = async (text) => {
// 这里简单模拟延迟,模拟真实的异步请求耗时 // 这里简单模拟延迟,模拟真实的异步请求耗时
@@ -343,20 +382,20 @@ const performSearch = async (text) => {
jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => { jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => {
console.log(data); console.log(data);
if (data.status == 0) { if (data.status == 0) {
center.value.lat = data.result.location.lat;
center.value.lng = data.result.location.lng;
form.value.address = form.value.address =
data.result.address_components.province + data.result.address_components.province +
data.result.address_components.city + data.result.address_components.city +
data.result.address_components.district + data.result.address_components.district +
data.result.address_components.street + data.result.address_components.street +
data.result.address_components.street_number; data.result.address_components.street_number +
data.result.title;
form.value.latitude = data.result.location.lat; form.value.latitude = data.result.location.lat;
form.value.longitude = data.result.location.lng; form.value.longitude = data.result.location.lng;
// form.value.region = data.result.ad_info.adcode; //行政区划编码 // form.value.region = data.result.ad_info.adcode; //行政区划编码
form.value.regionCode = data.result.ad_info.adcode; //行政区划编码 form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
// form.value.province = data.result.address_components.province; // form.value.province = data.result.address_components.province;
// form.value.city = data.result.address_components.city; // form.value.city = data.result.address_components.city;
center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
} else if (data.status == 348) { } else if (data.status == 348) {
//地址信息不明确,需弹出提示 //地址信息不明确,需弹出提示
@@ -379,15 +418,15 @@ const onClick = (e: any) => {
data.result.address_component.city + data.result.address_component.city +
data.result.address_component.district + data.result.address_component.district +
data.result.address_component.street + data.result.address_component.street +
data.result.address_component.street_number; data.result.address_component.street_number +
data.result.formatted_addresses.recommend;
form.value.latitude = data.result.location.lat; form.value.latitude = data.result.location.lat;
form.value.longitude = data.result.location.lng; form.value.longitude = data.result.location.lng;
// form.value.province = data.result.address_component.province; // form.value.province = data.result.address_component.province;
// form.value.city = data.result.address_component.city; // form.value.city = data.result.address_component.city;
// form.value.region = data.result.ad_info.adcode; //行政区划编码 // form.value.region = data.result.ad_info.adcode; //行政区划编码
form.value.regionCode = data.result.ad_info.adcode; //行政区划编码 form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
center.value.lat = data.result.location.lat; center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
center.value.lng = data.result.location.lng;
searchLocation.value = data.result.formatted_addresses.recommend; searchLocation.value = data.result.formatted_addresses.recommend;
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
} }
@@ -397,8 +436,8 @@ const onClick = (e: any) => {
const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒 const debouncedSearch = debounce(performSearch, 300); // 创建防抖后的搜索函数,延迟设为300毫秒
const map = ref(null); const map = ref(null);
const center = ref({ lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 }); const center = ref({ lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 });
const zoom = ref(20); const zoom = ref(17);
const control = reactive({ const control = reactive({
scale: {}, scale: {},
zoom: { zoom: {
@@ -406,7 +445,7 @@ const control = reactive({
} }
}); });
const searchLocation = ref(''); // 搜索地点 const searchLocation = ref(''); // 搜索地点
const geometries = ref([{ styleId: 'marker', position: { lat: form.value.latitude || 39.145902, lng: form.value.longitude || 117.17546 } }]); const geometries = ref([{ styleId: 'marker', position: { lat: form.value.latitude || 20.018883, lng: form.value.longitude || 110.348801 } }]);
const styles = reactive({ const styles = reactive({
marker: { marker: {
width: 20, width: 20,
+7 -5
View File
@@ -12,8 +12,9 @@
<el-form-item label="发布状态" prop="status"> <el-form-item label="发布状态" prop="status">
<el-select v-model="queryParams.status" class="inputWidth" placeholder="请选择发布状态" clearable <el-select v-model="queryParams.status" class="inputWidth" placeholder="请选择发布状态" clearable
@keyup.enter="handleQuery"> @keyup.enter="handleQuery">
<el-option label="已发布" :value="1" />
<el-option label="未发布" :value="0" /> <el-option label="未发布" :value="0" />
<el-option label="审核中" :value="1" />
<el-option label="已发布" :value="2" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -41,8 +42,9 @@
<el-table-column label="排序" align="center" prop="shor" /> <el-table-column label="排序" align="center" prop="shor" />
<el-table-column label="发布状态" align="center" prop="status"> <el-table-column label="发布状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 1" type="success">发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">发布</el-tag>
<el-tag v-else type="info">未发布</el-tag> <el-tag v-else-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-else-if="scope.row.status == 1" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建者" align="center" prop="createName" /> <el-table-column label="创建者" align="center" prop="createName" />
@@ -56,7 +58,7 @@
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="handleStatus(scope.row,1)" v-if="scope.row.status == 0" <el-button link type="primary" @click="handleStatus(scope.row,1)" v-if="scope.row.status == 0"
v-hasPermi="['manage:ipImage:edit']">发布</el-button> v-hasPermi="['manage:ipImage:edit']">发布</el-button>
<el-button link type="primary" @click="handleStatus(scope.row,0)" v-if="scope.row.status==1" <el-button link type="primary" @click="handleStatus(scope.row,0)" v-if="scope.row.status==2"
v-hasPermi="['manage:ipImage:edit']">撤销发布</el-button> v-hasPermi="['manage:ipImage:edit']">撤销发布</el-button>
<el-tooltip content="编辑" placement="top"> <el-tooltip content="编辑" placement="top">
<el-button link type="primary" @click="handleUpdate(scope.row)" v-if="scope.row.status == 0" <el-button link type="primary" @click="handleUpdate(scope.row)" v-if="scope.row.status == 0"
@@ -244,7 +246,7 @@ const submitForm = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: IpImageVO) => { const handleDelete = async (row?: IpImageVO) => {
const _ids = row?.id || ids.value; const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除IP形象编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); await proxy?.$modal.confirm('是否确认删除IP形象为"' + row.ipName + '"的数据项?').finally(() => loading.value = false);
await delIpImage(_ids); await delIpImage(_ids);
proxy?.$modal.msgSuccess("删除成功"); proxy?.$modal.msgSuccess("删除成功");
await getList(); await getList();
+12 -8
View File
@@ -37,7 +37,8 @@
</el-table-column> </el-table-column>
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.status == 0 ? '未发布' : '已发布' }}</span> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建者" align="center" prop="createName" /> <el-table-column label="创建者" align="center" prop="createName" />
@@ -115,7 +116,7 @@
</el-select> </el-select>
<span style="margin: 0px 10px;"> + </span> <span style="margin: 0px 10px;"> + </span>
<el-select v-model="item.goodsId" placeholder="请选择" style="width: 120px" <el-select v-model="item.goodsId" placeholder="请选择" style="width: 120px"
:disabled="dialog.type == 'preview'" clearable> :disabled="dialog.type == 'preview'" clearable @visible-change="getProductAllList">
<el-option v-for="item in productAllList" :key="item.id" :label="item.productName" :value="item.id" /> <el-option v-for="item in productAllList" :key="item.id" :label="item.productName" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -222,9 +223,9 @@ import { listProductCategory } from '@/api/manage/productCategory';
import { listVendor } from '@/api/manage/vendor'; import { listVendor } from '@/api/manage/vendor';
onMounted(() => { onMounted(() => {
getList(); getList();
getProductAllList(true); //商品列表
getlistVendor(); //供应商列表 getlistVendor(); //供应商列表
getProductCategoryList(); //商品类别列表 getProductCategoryList(); //商品类别列表
getProductAllList(); //商品列表 下拉选择 不分页
}); });
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const mkConfigList = ref<MkConfigVO[]>([]); const mkConfigList = ref<MkConfigVO[]>([]);
@@ -504,13 +505,16 @@ const getlistVendor = async () => {
listVendorList.value = res.rows; listVendorList.value = res.rows;
} }
/** /**
* 商品列表 下拉选择 * 商品列表 下拉选择 //商品列表 下拉选择 不分页
*/ */
const productAllList=ref([]); const productAllList=ref([]);
const getProductAllList=()=>{ const getProductAllList=(e:any)=>{
productAll({status:1}).then(res=>{ console.log(e);
Object.assign(productAllList.value,res.data) if (e) {
}) productAll({status:2}).then(res=>{
Object.assign(productAllList.value,res.data)
})
}
} }
/** /**
* 格式化商品类别名称 * 格式化商品类别名称
+214 -24
View File
@@ -15,6 +15,7 @@
<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 v-hasPermi="['manage:mkJigsaw:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -22,23 +23,14 @@
</transition> </transition>
<el-card shadow="never"> <el-card shadow="never">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['manage:mkJigsaw:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="mkJigsawList"> <el-table v-loading="loading" :data="mkJigsawList">
<el-table-column label="任务名称" align="center" prop="name" /> <el-table-column label="任务名称" align="center" prop="name" show-overflow-tooltip />
<el-table-column label="任务类别" align="center" prop="category"> <el-table-column label="任务类别" align="center" prop="category">
<template #default="scope"> <template #default="scope">
<dict-tag :options="mk_jigsaw_task_catagory" :value="scope.row.category" /> <dict-tag :options="mk_jigsaw_task_catagory" :value="scope.row.category" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="商品ID" align="center" prop="productId" /> <el-table-column label="商品ID" align="center" prop="productId" show-overflow-tooltip />
<el-table-column label="商品名称" align="center" prop="productName" /> <el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="商品类别" align="center" prop="productCategory"> <el-table-column label="商品类别" align="center" prop="productCategory">
<template #default="scope"> <template #default="scope">
@@ -53,8 +45,16 @@
</el-table-column> </el-table-column>
<el-table-column label="拼图数量" align="center" prop="jigsawConfigCount" /> <el-table-column label="拼图数量" align="center" prop="jigsawConfigCount" />
<el-table-column label="设置得奖人数" align="center" prop="awardConfigCount" /> <el-table-column label="设置得奖人数" align="center" prop="awardConfigCount" />
<el-table-column label="参与人数" align="center" prop="joinCount" /> <el-table-column label="参与人数" align="center" prop="joinCount">
<el-table-column label="实际得奖人数" align="center" prop="awardCount" /> <template #default="scope">
<el-button type="primary" link @click="handleJoin(scope.row)">{{ scope.row.joinCount }}</el-button>
</template>
</el-table-column>
<el-table-column label="实际得奖人数" align="center" prop="awardCount">
<template #default="scope">
<el-button link type="primary" @click="handleAward(scope.row)">{{ scope.row.awardCount }}</el-button>
</template>
</el-table-column>
<el-table-column label="拼图碎片获得人数" align="center" prop="awardCount"> <el-table-column label="拼图碎片获得人数" align="center" prop="awardCount">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link @click="imagesui(scope.row)">查看详情</el-button> <el-button type="primary" link @click="imagesui(scope.row)">查看详情</el-button>
@@ -73,9 +73,9 @@
<el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag> <el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建人" align="center" prop="createName" /> <el-table-column label="创建人" align="center" prop="createName" show-overflow-tooltip />
<el-table-column label="创建时间" align="center" prop="createTime" /> <el-table-column label="创建时间" align="center" prop="createTime" show-overflow-tooltip />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150px">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.status == 0" v-hasPermi="['manage:mkJigsaw:edit']" link type="primary" @click="handleUpdate(scope.row, 2)" <el-button v-if="scope.row.status == 0" v-hasPermi="['manage:mkJigsaw:edit']" link type="primary" @click="handleUpdate(scope.row, 2)"
>编辑</el-button >编辑</el-button
@@ -130,8 +130,8 @@
start-placeholder="选择开始时间" start-placeholder="选择开始时间"
end-placeholder="选择结束时间" end-placeholder="选择结束时间"
format="YYYY-MM-DD HH:mm:ss" format="YYYY-MM-DD HH:mm:ss"
date-format="YYYY/MM/DD ddd" date-format="YYYY/MM/DD"
time-format="A hh:mm:ss" time-format="HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
:picker-options="{ disabledDate: dateOptions }" :picker-options="{ disabledDate: dateOptions }"
@change="mkdatetime" @change="mkdatetime"
@@ -195,20 +195,20 @@
<div>{{ form.startDate }}~{{ form.endDate }}</div> <div>{{ form.startDate }}~{{ form.endDate }}</div>
</el-form-item> </el-form-item>
<el-form-item label="设置拼图数量"> <el-form-item label="设置拼图数量">
<div>{{form.jigsawConfigCount}}</div> <div>{{ form.jigsawConfigCount }}</div>
</el-form-item> </el-form-item>
<el-form-item label="得奖人数"> <el-form-item label="得奖人数">
<div>{{form.awardConfigCount}}</div> <div>{{ form.awardConfigCount }}</div>
</el-form-item> </el-form-item>
<el-form-item label="控制得奖拼图"> <el-form-item label="控制得奖拼图">
<el-select v-model="form.controlJigsawIndex" placeholder="请选择控制得奖拼图" style="width: 300px" @change="selectnumlist" disabled> <el-select v-model="form.controlJigsawIndex" placeholder="请选择控制得奖拼图" style="width: 300px" disabled @change="selectnumlist">
<el-option v-for="dict in numlist" :key="dict.label" :label="dict.label" :value="dict.label"></el-option> <el-option v-for="dict in numlist" :key="dict.label" :label="dict.label" :value="dict.label"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<div class="numlistclasss"> <div class="numlistclasss">
<div v-for="item in numlistdata" :key="item.name"> <div v-for="item in numlistdata" :key="item.name">
<el-form-item :label="`${item.name}:可获得概率`"> <el-form-item :label="`${item.name}:可获得概率`">
<div>{{item.probability}}%</div> <div>{{ item.probability }}%</div>
</el-form-item> </el-form-item>
</div> </div>
</div> </div>
@@ -222,6 +222,79 @@
<el-table-column prop="joinCount" label="获得人数" /> <el-table-column prop="joinCount" label="获得人数" />
</el-table> </el-table>
</el-dialog> </el-dialog>
<!-- 拼图参与人数-->
<el-dialog v-model="mkpeoplenum.visible" :title="mkpeoplenum.title" width="50%" append-to-body>
<el-table :data="mkpeoplenumdata" border style="width: 100%">
<el-table-column prop="nickName" label="用户昵称" width="180" />
<el-table-column prop="avatar" label="用户图片" width="180" />
<el-table-column prop="createTime" label="参与时间" />
</el-table>
<pagination
v-show="mkpeopletotal > 0"
v-model:page="mkpeoplenumParams.pageNum"
v-model:limit="mkpeoplenumParams.pageSize"
:total="mkpeopletotal"
@pagination="getList"
/>
</el-dialog>
<!-- 获奖人员 -->
<el-dialog v-model="mkReward.visible" title="获奖人员" width="600px" append-to-body>
<div>
<el-table :data="mkRewardUserLists" border style="width: 100%">
<el-table-column prop="userId" label="用户ID" />
<el-table-column prop="nickName" label="昵称" />
<el-table-column prop="" label="获得奖品">
<template #default="scope">
<el-button link type="primary" @click="getproductInfo(scope.row.productId)">查看详情</el-button>
</template>
</el-table-column>
</el-table>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
<!-- 奖品详情 -->
<el-dialog v-model="productInfo.visible" title="奖品详情" width="600px" append-to-body>
<div>
<el-form ref="" :model="productInfo.form" label-width="70px">
<el-row :gutter="10" style="margin-bottom: 10px; margin-right: 5px !important">
<el-col :span="8">
<el-form-item label="商品名称" prop="">
<span>{{ productInfo.form.productName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="商品类别" prop="">
<span>{{ formatCategoryName(productInfo.form.categoryId) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="供应商" prop="">
<span>{{ formatVendorName(productInfo.form.vendorId) }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="商品图片" prop="">
<image-preview :src="productInfo.form.image" :width="100" :height="100" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="商品说明" prop="">
<span>{{ productInfo.form.productShows }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="cancelProductInfo()"> </el-button>
</div>
</template>
</el-dialog>
</div> </div>
</template> </template>
@@ -234,9 +307,13 @@ import {
updateMkJigsaw, updateMkJigsaw,
productall, productall,
mkJigsawDetaillist, mkJigsawDetaillist,
productCategoryall productCategoryall,
mkJoinlist
} from '@/api/manage/mkJigsaw'; } from '@/api/manage/mkJigsaw';
import { MkJigsawVO, MkJigsawQuery, MkJigsawForm } from '@/api/manage/mkJigsaw/types'; import { MkJigsawVO, MkJigsawQuery, MkJigsawForm } from '@/api/manage/mkJigsaw/types';
import { mkRewardUserList } from '@/api/manage/mkConfig';
import { listProductCategory } from '@/api/manage/productCategory';
import { getProduct } from '@/api/manage/product';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { mk_jigsaw_task_catagory } = toRefs<any>(proxy?.useDict('mk_jigsaw_task_catagory')); const { mk_jigsaw_task_catagory } = toRefs<any>(proxy?.useDict('mk_jigsaw_task_catagory'));
@@ -249,12 +326,14 @@ const ids = ref<Array<string | number>>([]);
const single = ref(true); const single = ref(true);
const multiple = ref(true); const multiple = ref(true);
const total = ref(0); const total = ref(0);
const mkpeopletotal = ref(0);
const value2 = ref(''); const value2 = ref('');
const queryFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>();
const mkJigsawFormRef = ref<ElFormInstance>(); const mkJigsawFormRef = ref<ElFormInstance>();
const imagegoodsoptions = ref([]); const imagegoodsoptions = ref([]);
const goodsdata = ref([]); const goodsdata = ref([]);
const imagelistdata = ref([]); const imagelistdata = ref([]);
const mkpeoplenumdata = ref([]);
const note_publish_list = ref([ const note_publish_list = ref([
{ label: '已发布', value: 2 }, { label: '已发布', value: 2 },
{ label: '审核中', value: 1 }, { label: '审核中', value: 1 },
@@ -266,11 +345,40 @@ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: ''
}); });
const mkRewardUserParams = reactive({
pageNum: 1,
pageSize: 10,
bizId: null
});
const taskid = ref('');
const mkReward = reactive({
visible: false
});
const productInfo = reactive({
visible: false,
form: {
image: null,
vendorId: null,
categoryId: null,
productName: null,
productShows: null
}
});
const mkpeoplenumParams = reactive({
pageNum: 1,
pageSize: 10,
bizId: null,
type: 2
});
const mksave = reactive<DialogOption>({ const mksave = reactive<DialogOption>({
visible: false, visible: false,
title: '拼图详情' title: '拼图详情'
}); });
const mkpeoplenum = reactive<DialogOption>({
visible: false,
title: '参与人数'
});
const imagedialog = reactive<DialogOption>({ const imagedialog = reactive<DialogOption>({
visible: false, visible: false,
title: '拼图碎片获得人数' title: '拼图碎片获得人数'
@@ -364,6 +472,7 @@ const getList = async () => {
const cancel = () => { const cancel = () => {
reset(); reset();
dialog.visible = false; dialog.visible = false;
mkReward.visible = false;
}; };
/** 表单重置 */ /** 表单重置 */
@@ -395,6 +504,8 @@ const handleSelectionChange = (selection: MkJigsawVO[]) => {
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
reset(); reset();
getlistVendor(); //供应商列表
getProductCategoryList(); //商品类别列表
dialog.visible = true; dialog.visible = true;
goodsdata.value = []; goodsdata.value = [];
value2.value = []; value2.value = [];
@@ -570,10 +681,89 @@ const mkdatetime = () => {
form.value.endDate = value2.value[1]; form.value.endDate = value2.value[1];
} }
}; };
//参与人数
const handleJoin = async (row) => {
taskid.value = row.id;
getmkpeoplenlist();
};
const getmkpeoplenlist = async () => {
mkpeoplenumParams.bizId = taskid;
const res = await mkJoinlist(mkpeoplenumParams);
mkpeoplenumdata.value = res.rows;
mkpeopletotal.value = res.total;
mkpeoplenum.visible = true;
};
//关闭奖品详情
const cancelProductInfo = () => {
productInfo.visible = false;
};
/**
* 查看奖品详情
* @param productId
*/
const getproductInfo = async (productId: any) => {
const res = await getProduct(productId);
productInfo.form = res.data;
productInfo.visible = true;
};
const mkRewardUserLists = ref([]);
const handleAward = async (row: any) => {
loading.value = true;
mkRewardUserParams.bizId = row.id;
const res = await mkRewardUserList(mkRewardUserParams).finally(() => (loading.value = false));
mkRewardUserLists.value = res.rows;
mkReward.visible = true;
// dialog.title = "修改营销配置";
};
/**
* 供应商列表
*/
const listVendorList = ref([]);
const getlistVendor = async () => {
let res = await listVendor({ pageNum: 1, pageSize: 9999 });
listVendorList.value = res.rows;
};
/**
* 格式化 供应商名称
* @param id
*/
const formatVendorName = (id: any) => {
for (let i = 0; i < listVendorList.value.length; i++) {
const element = listVendorList.value[i];
if (element.id == id) {
return element.vendorName;
}
}
};
/**
* 商品类别列表
*/
const productCategoryList = ref([]);
const getProductCategoryList = async () => {
let res = await listProductCategory({ pageNum: 1, pageSize: 9999 });
productCategoryList.value = res.rows;
};
/**
* 格式化商品类别名称
* @param row
*/
const formatCategoryName = (id: any) => {
for (let i = 0; i < productCategoryList.value.length; i++) {
const element = productCategoryList.value[i];
if (element.id == id) {
return element.category;
}
}
};
onMounted(() => { onMounted(() => {
getList(); getList();
getproductall(); getproductall();
goodleibie(); goodleibie();
getlistVendor(); //供应商列表
getProductCategoryList(); //商品类别列表
}); });
</script> </script>
<style> <style>
+17 -9
View File
@@ -14,8 +14,9 @@
<!-- <el-input class="inputWidth" v-model="queryParams.sortNum" placeholder="请输入排序" clearable <!-- <el-input class="inputWidth" v-model="queryParams.sortNum" placeholder="请输入排序" clearable
@keyup.enter="handleQuery" /> --> @keyup.enter="handleQuery" /> -->
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="inputWidth"> <el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="inputWidth">
<el-option label="已上架" :value="1"></el-option>
<el-option label="未上架" :value="0"></el-option> <el-option label="未上架" :value="0"></el-option>
<el-option label="审核中" :value="1"></el-option>
<el-option label="已上架" :value="2"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@@ -31,7 +32,11 @@
<el-table v-loading="loading" border :data="mkPostcardList" :height="autoTableHeight" <el-table v-loading="loading" border :data="mkPostcardList" :height="autoTableHeight"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column label="ID" align="center" prop="id" v-if="true" width="150" /> <el-table-column label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="明信片名称" align="center" prop="name" /> <el-table-column label="明信片名称" align="center" prop="name" />
<el-table-column label="关联景点" align="center" prop="articleId"> <el-table-column label="关联景点" align="center" prop="articleId">
<template #default="scope"> <template #default="scope">
@@ -53,7 +58,9 @@
<!-- 0-未上架 1-已上架 --> <!-- 0-未上架 1-已上架 -->
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.status == 1 ? '已上架' : '未上架'}}</span> <el-tag v-if="scope.row.status == 0" type="info">未上架</el-tag>
<el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="primary">已上架</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="创建者" align="center" prop="updateByName" /> <el-table-column label="创建者" align="center" prop="updateByName" />
@@ -62,7 +69,7 @@
<template #default="scope"> <template #default="scope">
<el-button link type="primary" @click="handleStatus(scope.row,'1')" v-if="scope.row.status == 0" <el-button link type="primary" @click="handleStatus(scope.row,'1')" v-if="scope.row.status == 0"
v-hasPermi="['manage:mkPostcard:edit']">上架</el-button> v-hasPermi="['manage:mkPostcard:edit']">上架</el-button>
<el-button link type="primary" @click="handleStatus(scope.row,'0')" v-if="scope.row.status == 1" <el-button link type="primary" @click="handleStatus(scope.row,'0')" v-if="scope.row.status == 2"
v-hasPermi="['manage:mkPostcard:edit']">下架</el-button> v-hasPermi="['manage:mkPostcard:edit']">下架</el-button>
<el-tooltip content="编辑" placement="top" v-if="scope.row.status == 0"> <el-tooltip content="编辑" placement="top" v-if="scope.row.status == 0">
<el-button link type="primary" @click="handleUpdate(scope.row)" <el-button link type="primary" @click="handleUpdate(scope.row)"
@@ -85,7 +92,7 @@
<el-input v-model="form.name" placeholder="请输入明信片名称" /> <el-input v-model="form.name" placeholder="请输入明信片名称" />
</el-form-item> </el-form-item>
<el-form-item label="关联景点" prop="articleId"> <el-form-item label="关联景点" prop="articleId">
<el-select v-model="form.articleId" placeholder="请选择关联景点" clearable> <el-select v-model="form.articleId" placeholder="请选择关联景点" clearable @visible-change="getContentAll">
<el-option v-for="(item,index) in contentAllList" :key="item.id" :label="item.name" <el-option v-for="(item,index) in contentAllList" :key="item.id" :label="item.name"
:value="item.id"></el-option> :value="item.id"></el-option>
</el-select> </el-select>
@@ -210,9 +217,11 @@ const getList = async () => {
* 查询景点下拉列表 * 查询景点下拉列表
*/ */
const contentAllList= ref([]); const contentAllList= ref([]);
const getContentAll = async () => { const getContentAll = async (e:any) => {
const res = await contentAll({type:'0',status:2}); if (e) {
Object.assign(contentAllList.value, res); const res = await contentAll({type:'0',status:2});
Object.assign(contentAllList.value, res);
}
} }
/** 取消按钮 */ /** 取消按钮 */
const cancel = () => { const cancel = () => {
@@ -350,7 +359,6 @@ const handlePostcard = async (row:MkPostcardVO)=>{
} }
onMounted(() => { onMounted(() => {
getList(); getList();
getContentAll();
nextTick(() => { nextTick(() => {
autoTableHeight.value = proxy?.autoTableHeight(); autoTableHeight.value = proxy?.autoTableHeight();
}); });
+74 -70
View File
@@ -1,33 +1,32 @@
<!-- 笔记管理 --> <!-- 笔记管理 -->
<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">
<el-form-item label="笔记标题" prop="id"> <el-form-item label="笔记标题" prop="id">
<el-input v-model="queryParams.title" placeholder="请输入笔记标题" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.title" placeholder="请输入笔记标题" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="发布人" prop="title"> <el-form-item label="发布人" prop="updateByName">
<el-input v-model="queryParams.title" placeholder="请输入发布人" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.updateByName" placeholder="请输入发布人" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="标记地点" prop="cover"> <el-form-item label="标记地点" prop="cover">
<!-- <el-input v-model="queryParams.cover" placeholder="请输入标记地点" clearable @keyup.enter="handleQuery" />--> <!-- <el-input v-model="queryParams.cover" placeholder="请输入标记地点" clearable @keyup.enter="handleQuery" />-->
<el-select v-model="queryParams.cover" placeholder="请选择标记地点" style="width: 240px"> <el-select v-model="queryParams.location" placeholder="请选择标记地点" style="width: 240px">
<el-option v-for="item in sys_user_contentOptions" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in sys_user_contentOptions" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="发布状态" prop="tagId"> <el-form-item label="发布状态" prop="tagId">
<!-- <el-input v-model="queryParams.tagId" placeholder="请输入标签" clearable @keyup.enter="handleQuery" /> --> <!-- <el-input v-model="queryParams.tagId" placeholder="请输入标签" clearable @keyup.enter="handleQuery" /> -->
<el-select v-model="queryParams.tagId" placeholder="请选择发布状态" style="width: 240px" <el-select v-model="queryParams.status" placeholder="请选择发布状态" style="width: 240px" @keyup.enter="handleQuery">
@keyup.enter="handleQuery">
<el-option v-for="item in statusoptions" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in statusoptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</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 v-hasPermi="['manage:notebook:add']" type="primary" plain icon="Plus" @click="handleAdd">新增 </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@@ -35,41 +34,26 @@
</transition> </transition>
<el-card shadow="never"> <el-card shadow="never">
<template #header> <el-table v-loading="loading" :data="notebookList" border @selection-change="handleSelectionChange">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button v-hasPermi="['manage:notebook:add']" type="primary" plain icon="Plus" @click="handleAdd">新增
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button v-hasPermi="['manage:notebook:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"-->
<!-- >删除-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="1.5">
<el-button v-hasPermi="['manage:notebook:export']" type="warning" plain icon="Download"
@click="handleExport">导出 </el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="loading" :data="notebookList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" />--> <!-- <el-table-column type="selection" width="55" align="center" />-->
<el-table-column v-if="true" label="ID" align="center" prop="id" /> <el-table-column label="序号" align="center" width="80">
<el-table-column label="笔记标题" align="center" prop="title" /> <template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="笔记标题" align="center" prop="title" show-overflow-tooltip />
<el-table-column label="笔记封面" align="center" prop="cover"> <el-table-column label="笔记封面" align="center" prop="cover">
<template #default="scope"> <template #default="scope">
<image-preview :src="scope.row.cover" :width="50" :height="50" /> <image-preview :src="scope.row.cover" :width="40" :height="40" />
<!-- <image-preview :src="scope.row.productImageUrl" /> --> <!-- <image-preview :src="scope.row.productImageUrl" /> -->
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="标记地点" align="center" prop="location"> <el-table-column label="标记地点" align="center" prop="location" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span>{{ formatlocation(scope.row.location) }}</span> <span>{{ formatlocation(scope.row.location) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="标签" align="center" prop="tagId"> <el-table-column label="标签" align="center" prop="tagId" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
<span>{{ formatTag(scope.row.tagId) }}</span> <span>{{ formatTag(scope.row.tagId) }}</span>
</template> </template>
@@ -90,9 +74,9 @@
<el-table-column label="发布状态" align="center" prop="status"> <el-table-column label="发布状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="warning">草稿</el-tag> <el-tag v-if="scope.row.status == 1" type="warning">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">审核中</el-tag> <el-tag v-if="scope.row.status == 2" type="success">已发布</el-tag>
<el-tag v-if="scope.row.status == 3" type="primary">已发布</el-tag> <el-tag v-if="scope.row.status == 3" type="primary">草稿</el-tag>
<!-- <image-preview :src="scope.row.productImageUrl" /> --> <!-- <image-preview :src="scope.row.productImageUrl" /> -->
</template> </template>
@@ -101,23 +85,38 @@
<el-table-column label="操作时间" align="center" prop="updateTime" width="200px" /> <el-table-column label="操作时间" align="center" prop="updateTime" width="200px" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150px"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150px">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.status == 0||scope.row.status == 1" v-hasPermi="['manage:notebook:edit']" link <div v-if="scope.row.userZombie == true">
type="primary" @click="handleUpdate(scope.row)">编辑</el-button> <el-button
<el-button v-if="scope.row.status == 0" v-hasPermi="['manage:notebook:edit']" link type="primary" v-if="scope.row.status == 0 || scope.row.status == 3"
@click="fabudata(scope.row)">发布</el-button> v-hasPermi="['manage:notebook:edit']"
<el-button v-if="scope.row.status == 3" v-hasPermi="['manage:notebook:edit']" link type="primary" link
@click="fabudata(scope.row)">撤销发布</el-button> type="primary"
<!-- <el-tooltip content="发布" placement="top">--> @click="handleUpdate(scope.row)"
<!-- <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>--> >编辑</el-button
<!-- </el-tooltip>--> >
<el-button v-if="scope.row.status == 0||scope.row.status == 1" v-hasPermi="['manage:notebook:remove']" link <el-button v-if="scope.row.status == 0" v-hasPermi="['manage:notebook:edit']" link type="primary" @click="fabudata(scope.row)"
type="primary" @click="handleDelete(scope.row)">删除</el-button> >发布</el-button
>
<el-button v-if="scope.row.status == 2" v-hasPermi="['manage:notebook:edit']" link type="primary" @click="fabudata(scope.row)"
>撤销发布</el-button
>
<!-- <el-tooltip content="发布" placement="top">-->
<!-- <el-button v-hasPermi="['manage:notebook:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button>-->
<!-- </el-tooltip>-->
<el-button
v-if="scope.row.status == 0 || scope.row.status == 3"
v-hasPermi="['manage:notebook:remove']"
link
type="primary"
@click="handleDelete(scope.row)"
>删除</el-button
>
</div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
:total="total" @pagination="getList" />
</el-card> </el-card>
<!-- 添加或修改笔记对话框 --> <!-- 添加或修改笔记对话框 -->
<el-dialog v-model="dialog.visible" :title="dialog.title" width="60%" append-to-body> <el-dialog v-model="dialog.visible" :title="dialog.title" width="60%" append-to-body>
@@ -146,7 +145,7 @@
<div style="display: flex; justify-content: space-between"> <div style="display: flex; justify-content: space-between">
<div> <div>
<el-button :loading="buttonLoading" type="primary" @click="yulansave"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="yulansave"> </el-button>
<el-button @click="submitForm('1')">存草稿</el-button> <el-button @click="submitForm('3')">存草稿</el-button>
</div> </div>
<div> <div>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
@@ -156,16 +155,13 @@
</template> </template>
</el-dialog> </el-dialog>
<!-- 笔记详情--> <!-- 笔记详情-->
<el-dialog v-model="concentdialog.visible" title="笔记详情" width="50%" append-to-body> <el-dialog v-model="concentdialog.visible" title="笔记详情" width="500px" append-to-body>
<div>{{ form.title }}</div> <note :form="form"></note>
<div>{{ formatTag(form.tagId) }}</div>
<div>{{ formatlocation(form.location) }}</div>
<div v-html="form.content"></div>
</el-dialog> </el-dialog>
<!-- 评论详情 --> <!-- 评论详情 -->
<el-dialog v-model="comment.visible" title="评论详情" width="600px" append-to-body> <el-dialog v-model="comment.visible" title="评论详情" width="600px" append-to-body>
<div class="commentList"> <div class="commentList">
<commentRows :biz-id="comment.bizId"></commentRows> <commentRows :biz-id="comment.bizId" :type="1"></commentRows>
</div> </div>
<template #footer> <template #footer>
<div class="dialog-footer noTopPadding"> <div class="dialog-footer noTopPadding">
@@ -224,10 +220,10 @@ const props = defineProps({
const addressvalue = ref(''); const addressvalue = ref('');
const statusoptions = ref([ const statusoptions = ref([
{ label: '已发布', value: 3 },
{ label: '审核中', value: 2 },
{ label: '未发布', value: 0 }, { label: '未发布', value: 0 },
{ label: '草稿', value: 1 } { label: '审核中', value: 1 },
{ label: '已发布', value: 2 },
{ label: '草稿', value: 3 }
]); ]);
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
@@ -305,9 +301,9 @@ const formatTag = (tagId: string | null) => {
// } // }
for (let i = 0; i < sys_user_tagOptions.value.length; i++) { for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
const element = sys_user_tagOptions.value[i]; const element = sys_user_tagOptions.value[i];
if (tagId!=null) { if (tagId != null) {
let filteredArray = tagId.split(',').filter((item) => item==element.id); let filteredArray = tagId.split(',').filter((item) => item == element.id);
if (filteredArray.length>0) { if (filteredArray.length > 0) {
tagString += '' + element.title; tagString += '' + element.title;
} }
} }
@@ -345,7 +341,7 @@ const getTag = async () => {
}; };
const getContent = async () => { const getContent = async () => {
const res = await contentall({ status: 2 }); const res = await contentall({ status: 2 });
const arr = await hotelall({ status: 1 }); const arr = await hotelall({ status: 2 });
sys_user_contentOptions.value = res.concat(arr); //地点 sys_user_contentOptions.value = res.concat(arr); //地点
}; };
@@ -371,6 +367,9 @@ const handleQuery = () => {
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
queryParams.value.status = ''; queryParams.value.status = '';
queryParams.value.title = '';
queryParams.value.location = '';
queryParams.value.updateByName = '';
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
handleQuery(); handleQuery();
}; };
@@ -385,7 +384,12 @@ const handleSelectionChange = (selection: NotebookVO[]) => {
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
reset(); reset();
getTag(); //标签库
getContent();
dialog.visible = true; dialog.visible = true;
tagvalue.value = '';
addressvalue.value = '';
dialog.title = '添加笔记'; dialog.title = '添加笔记';
}; };
@@ -395,8 +399,8 @@ const handleUpdate = async (row?: NotebookVO) => {
const _id = row?.id || ids.value[0]; const _id = row?.id || ids.value[0];
const res = await getNotebook(_id); const res = await getNotebook(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
tagvalue.value = form.value.tagId.split(','); tagvalue.value = form.value.tagId && form.value.tagId.split(',');
addressvalue.value = form.value.location.split(','); addressvalue.value = form.value.tagId && form.value.location.split(',');
dialog.visible = true; dialog.visible = true;
dialog.title = '修改笔记'; dialog.title = '修改笔记';
}; };
@@ -407,10 +411,10 @@ const fabudata = async (row?: NotebookVO) => {
const _idtitle = row?.title; const _idtitle = row?.title;
const res = await getNotebook(_id); const res = await getNotebook(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
form.value.status = row.status == 3 ? 0 : 2; form.value.status = row.status == 2 ? 0 : 1;
const text = row.status == 3 ? '撤销发布' : '确认发布'; const text = row.status == 2 ? '撤销发布' : '确认发布';
const textmessage = row.status == 3 ? '撤销发布成功' : '发布成功'; const textmessage = row.status == 2 ? '撤销发布成功' : '发布成功';
await proxy?.$modal.confirm('是否' + text + '笔记标题为' + _idtitle + '"的数据项?').finally(() => (loading.value = false)); await proxy?.$modal.confirm('是否' + text + '笔记标题为"' + _idtitle + '"的数据项?').finally(() => (loading.value = false));
await updateNotebook(form.value).finally(() => (buttonLoading.value = false)); await updateNotebook(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess(`${textmessage}`); proxy?.$modal.msgSuccess(`${textmessage}`);
await getList(); await getList();
@@ -423,8 +427,8 @@ const contenttext = async (row?: NotebookVO) => {
}; };
/** 提交按钮 */ /** 提交按钮 */
const submitForm = async (type) => { const submitForm = async (type) => {
form.value.tagId = tagvalue.value.join(','); form.value.tagId = tagvalue.value == '' ? '' : tagvalue.value.join(',');
form.value.location = addressvalue.value.join(','); form.value.location = addressvalue.value == '' ? '' : addressvalue.value.join(',');
form.value.cover = ''; form.value.cover = '';
form.value.status = Number(type); form.value.status = Number(type);
form.value.content = form.value.content == '<p><br></p>' ? '' : form.value.content; form.value.content = form.value.content == '<p><br></p>' ? '' : form.value.content;
+13 -6
View File
@@ -71,7 +71,11 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单号" align="center" prop="orderNumber" /> <el-table-column label="订单号" align="center" prop="orderNumber" />
<el-table-column label="来源" align="center" prop="source" width="80px" /> <el-table-column label="来源" align="center" prop="source" width="80px">
<template #default="scope">
<dict-tag :options="dy_order_source" :value="scope.row.source" />
</template>
</el-table-column>
<el-table-column label="商品名称" align="center" prop="productName" /> <el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="商品图片" align="center" prop="productImageUrl" width="100"> <el-table-column label="商品图片" align="center" prop="productImageUrl" width="100">
<template #default="scope"> <template #default="scope">
@@ -86,7 +90,9 @@
<el-table-column label="供应商" align="center" prop="vendorId" /> <el-table-column label="供应商" align="center" prop="vendorId" />
<el-table-column label="订单状态" align="center" prop="orderStatus"> <el-table-column label="订单状态" align="center" prop="orderStatus">
<template #default="scope"> <template #default="scope">
<dict-tag :options="dy_order_status" :value="scope.row.orderStatus" /> <!-- <dict-tag :options="dy_order_status" :value="scope.row.orderStatus" /> -->
<el-tag v-if="scope.row.orderStatus == 0" type="info">未发货</el-tag>
<el-tag v-if="scope.row.orderStatus == 1" type="primary">已发货</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="物流名称" align="center" prop="logisticsName" /> <el-table-column label="物流名称" align="center" prop="logisticsName" />
@@ -94,8 +100,8 @@
<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-if="scope.row.orderStatus == 0" v-hasPermi="['manage:orders:edit']" <el-button link type="primary" v-if="scope.row.orderStatus == 0" v-hasPermi="['manage:orders:edit']"
@click="handleOrderStatus(scope.row,'1')">发货</el-button> @click="handleOrderStatus(scope.row,1)">发货</el-button>
<el-button link type="primary" @click="handleOrderStatus(scope.row,'0')" v-if="scope.row.orderStatus == 1" <el-button link type="primary" @click="handleOrderStatus(scope.row,0)" v-if="scope.row.orderStatus == 1"
v-hasPermi="['manage:orders:edit']">撤销发货</el-button> v-hasPermi="['manage:orders:edit']">撤销发货</el-button>
</template> </template>
</el-table-column> </el-table-column>
@@ -267,9 +273,10 @@ const handleAdd = () => {
*/ */
const handleOrderStatus = async (row: OrdersVO,type:string|number) => { const handleOrderStatus = async (row: OrdersVO,type:string|number) => {
await proxy?.$modal.confirm('是否确认' + (type == '0' ? '撤销发货' : '发货') + '商品名称为"' + row.productName + '"的数据项?'); await proxy?.$modal.confirm('是否确认' + (type == '0' ? '撤销发货' : '发货') + '商品名称为"' + row.productName + '"的数据项?');
row.orderStatus = type; Object.assign(form.value, row);
form.value.orderStatus = type;
buttonLoading.value = true; buttonLoading.value = true;
await updateOrders(row).finally(() => (buttonLoading.value = false)); await updateOrders(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
getList(); getList();
} }
+10 -3
View File
@@ -10,7 +10,7 @@
<el-input class="inputWidth" v-model="queryParams.productName" placeholder="请输入商品名称" clearable <el-input class="inputWidth" v-model="queryParams.productName" placeholder="请输入商品名称" clearable
@keyup.enter="handleQuery" /> @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="商品状态" prop="productShows"> <el-form-item label="商品状态" prop="status">
<el-select class="inputWidth" v-model="queryParams.status" placeholder="请选择商品状态" clearable> <el-select class="inputWidth" v-model="queryParams.status" placeholder="请选择商品状态" clearable>
<el-option v-for="dict in sys_shelf_status" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in sys_shelf_status" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
@@ -32,7 +32,12 @@
<el-table v-loading="loading" border :height="autoTableHeight" :data="productList" <el-table v-loading="loading" border :height="autoTableHeight" :data="productList"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column label="商品ID" align="center" prop="id" v-if="true" width="180px" /> <!-- <el-table-column label="商品ID" align="center" prop="id" v-if="true" width="180px" /> -->
<el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="商品名称" align="center" prop="productName" /> <el-table-column label="商品名称" align="center" prop="productName" />
<el-table-column label="商品类别" align="center" prop="categoryId"> <el-table-column label="商品类别" align="center" prop="categoryId">
<template #default="scope"> <template #default="scope">
@@ -49,6 +54,8 @@
<el-table-column label="商品状态" align="center" prop="status"> <el-table-column label="商品状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="sys_shelf_status" :value="scope.row.status" /> <dict-tag :options="sys_shelf_status" :value="scope.row.status" />
<!-- <el-tag v-if="scope.row.status == 0" type="info">未上架</el-tag>
<el-tag v-if="scope.row.status == 1" type="primary">已上架</el-tag> -->
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="供应商" align="center" prop="vendorId"> <el-table-column label="供应商" align="center" prop="vendorId">
@@ -69,7 +76,7 @@
<el-button link type="primary" @click="handleStatus(scope.row,'1')" v-hasPermi="['manage:product:edit']" <el-button link type="primary" @click="handleStatus(scope.row,'1')" v-hasPermi="['manage:product:edit']"
v-if="scope.row.status==0">上架</el-button> v-if="scope.row.status==0">上架</el-button>
<el-button link type="primary" @click="handleStatus(scope.row,'0')" v-hasPermi="['manage:product:edit']" <el-button link type="primary" @click="handleStatus(scope.row,'0')" v-hasPermi="['manage:product:edit']"
v-if="scope.row.status==1">下架</el-button> v-if="scope.row.status==2">下架</el-button>
<el-tooltip content="编辑" placement="top" v-if="scope.row.status==0"> <el-tooltip content="编辑" placement="top" v-if="scope.row.status==0">
<el-button link type="primary" @click="handleUpdate(scope.row)" <el-button link type="primary" @click="handleUpdate(scope.row)"
v-hasPermi="['manage:product:edit']">编辑</el-button> v-hasPermi="['manage:product:edit']">编辑</el-button>
+2 -2
View File
@@ -133,7 +133,7 @@ const productCategoryFormRef = ref<ElFormInstance>();
const wishParams = reactive({ const wishParams = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
id: undefined, productCategoryId: undefined,
}) })
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
@@ -274,7 +274,7 @@ const handleMakeWish = async (row: ProductCategoryVO) => {
return return
} }
loading.value = true; loading.value = true;
wishParams.id= row.id; wishParams.productCategoryId= row.id;
getWishUserList(); getWishUserList();
makeWish.visible = true; makeWish.visible = true;
} }
+91 -38
View File
@@ -5,20 +5,21 @@
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form ref="queryFormRef" :model="queryParams" :inline="true">
<el-form-item label="用户昵称" prop="contentId"> <el-form-item label="用户昵称" prop="contentId">
<el-input v-model="queryParams.contentId" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.nickName" placeholder="请输入用户昵称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="账号状态" prop="handlingStatus"> <el-form-item label=" 状态">
<el-select v-model="queryParams.handlingStatus" placeholder="请选择状态" clearable> <el-select v-model="queryParams.handlingStatus" placeholder="请选择状态" clearable>
<!-- <el-option v-for="dict in dy_banned_handling_status" :key="dict.value" :label="dict.label" :value="dict.value" />--> <el-option label="未处理" value="0" />
<el-option label="已处理" value="1" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="性别" prop="handlingStatus"> <el-form-item label="性别">
<el-select v-model="queryParams.sex" placeholder="请选择用户性别" clearable> <el-select v-model="queryParams.sex" placeholder="请选择用户性别" clearable>
<el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in sys_user_sex" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="会员等级" prop="handlingStatus"> <el-form-item label="会员等级">
<el-select v-model="queryParams.handlingStatus" placeholder="请选择状态" clearable> <el-select v-model="queryParams.levelId" placeholder="请选择状态" clearable>
<el-option v-for="dict in dy_banned_handling_status" :key="dict.id" :label="dict.levelName" :value="dict.id" /> <el-option v-for="dict in dy_banned_handling_status" :key="dict.id" :label="dict.levelName" :value="dict.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -42,25 +43,25 @@
</template> </template>
<el-table v-loading="loading" :data="bannedList"> <el-table v-loading="loading" :data="bannedList">
<el-table-column v-if="queryParams.type == 1" label="笔记名称" align="center" prop="contentId" > <el-table-column v-if="queryParams.type == 1" label="笔记名称" align="center" prop="contentId">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link>查看笔记</el-button> <el-button type="primary" link :disabled="scope.row.handlingStatus == 1">{{ scope.row.contentName }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="queryParams.type == 2" label="活动名称" align="center" prop="contentId" > <el-table-column v-if="queryParams.type == 2" label="活动名称" align="center" prop="contentId">
<template #default="scope"> <template #default="scope">
<el-button type="primary" link>查看活动</el-button> <el-button type="primary" link :disabled="scope.row.handlingStatus == 1">{{ scope.row.contentName }}</el-button>
</template>
</el-table-column>
<el-table-column v-if="queryParams.type == 3" label="评论内容" align="center" prop="contentId">
<template #default="scope">
<el-button type="primary" link :disabled="scope.row.handlingStatus == 1">{{ scope.row.contentName }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="queryParams.type == 3" label="评论内容" align="center" prop="contentId" >
<template #default="scope">
<el-button type="primary" link>查看笔记</el-button>
</template>
</el-table-column>
<el-table-column label="用户ID" align="center" prop="reportUserId" /> <el-table-column label="用户ID" align="center" prop="reportUserId" />
<el-table-column label="会员等级" align="center" prop="userLevel"> <el-table-column label="会员等级" align="center" prop="userLevel">
<template #default="scope"> <template #default="scope">
<div>{{formatlevel(scope.row.levelId)}}</div> <div>{{ formatlevel(scope.row.levelId) }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="昵称" align="center" prop="nickName" /> <el-table-column label="昵称" align="center" prop="nickName" />
@@ -70,21 +71,56 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="头像" align="center" prop="avatar" /> <el-table-column label="头像" align="center" prop="avatar" />
<el-table-column label="举报理由" align="center" prop="reportReason" width="200px" show-overflow-tooltip /> <el-table-column label="举报理由" align="center" prop="reportReason" width="150px" show-overflow-tooltip />
<el-table-column label="举报人" align="center" prop="informerUserName" /> <el-table-column label="举报人" align="center" prop="informerUserName" />
<el-table-column label="举报时间" align="center" prop="createTime" width="200px" /> <el-table-column label="举报时间" align="center" prop="createTime" width="200px" />
<el-table-column label="操作时间" align="center" prop="updateTime" width="200px" /> <el-table-column label="操作时间" align="center" prop="updateTime" width="200px" />
<el-table-column label="操作人" align="center" prop="updateName" width="150px" /> <el-table-column label="操作人" align="center" prop="updateName" width="150px" />
<el-table-column label="状态" align="center" prop="handlingStatus" > <el-table-column label="用户状态" align="center" prop="status" width="150px">
<template #default="scope">
<el-tag v-if="scope.row.status == 1" type="info">禁言</el-tag>
<el-tag v-if="scope.row.status == 2" type="warning">封禁</el-tag>
<el-tag v-if="scope.row.status == 0" type="primary">正常</el-tag>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="handlingStatus">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.handlingStatus == 0" type="info">未处理</el-tag> <el-tag v-if="scope.row.handlingStatus == 0" type="info">未处理</el-tag>
<el-tag v-if="scope.row.handlingStatus == 1" type="warning">已处理</el-tag> <el-tag v-if="scope.row.handlingStatus == 1" type="warning">已处理</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150px"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160px">
<template #default="scope"> <template #default="scope">
<el-button v-hasPermi="['manage:report:edit']" link type="primary" @click="handleUpdate(scope.row)">封禁</el-button> <el-button v-hasPermi="['manage:report:edit']" link type="primary" :disabled="scope.row.status != 0" @click="handleUpdate(scope.row)"
<el-button v-hasPermi="['manage:report:remove']" link type="primary" @click="handleDelete(scope.row)">删除{{ radio1 }}</el-button> >封禁</el-button
>
<el-button
v-if="queryParams.type == 1"
v-hasPermi="['manage:report:remove']"
link
type="primary"
:disabled="scope.row.handlingStatus == 1"
@click="handleDelete(scope.row)"
>删除笔记</el-button
>
<el-button
v-if="queryParams.type == 2"
v-hasPermi="['manage:report:remove']"
link
type="primary"
:disabled="scope.row.handlingStatus == 1"
@click="handleDelete(scope.row)"
>删除活动</el-button
>
<el-button
v-if="queryParams.type == 3"
v-hasPermi="['manage:report:remove']"
link
type="primary"
:disabled="scope.row.handlingStatus == 1"
@click="handleDelete(scope.row)"
>删除评论</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -94,13 +130,13 @@
<!-- 添加或修改举报对话框 --> <!-- 添加或修改举报对话框 -->
<el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body>
<el-form ref="bannedFormRef" :model="form" :rules="rules" label-width="80px"> <el-form ref="bannedFormRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="封禁原因" prop="banReason"> <el-form-item label="封禁原因" prop="reason">
<el-select v-model="form.reason" placeholder="请选择封禁理由" clearable> <el-select v-model="form.reason" placeholder="请选择封禁理由" clearable>
<el-option v-for="dict in dy_banned_ban_reason" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in dy_banned_ban_reason" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="处理方式" prop="handlingMethod"> <el-form-item label="处理方式" prop="status">
<el-radio-group v-model="form.handlingMethod"> <el-radio-group v-model="form.status">
<el-radio value="1" size="large">禁言</el-radio> <el-radio value="1" size="large">禁言</el-radio>
<el-radio value="2" size="large">封禁</el-radio> <el-radio value="2" size="large">封禁</el-radio>
</el-radio-group> </el-radio-group>
@@ -122,8 +158,9 @@
</template> </template>
<script setup name="Banned" lang="ts"> <script setup name="Banned" lang="ts">
import { listBanned, getBanned, delBanned, addBanned, updateBanned, userLevelall } from '@/api/manage/banned'; import { listBanned, getBanned, delBanned, addBanned, updatemanage, userLevelall } from '@/api/manage/banned';
import { BannedVO, BannedQuery, BannedForm } from '@/api/manage/banned/types'; import { BannedVO, BannedQuery, BannedForm } from '@/api/manage/banned/types';
import { delNotebook } from '@/api/manage/notebook';
const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { dy_banned_handling_method, sys_user_sex, dy_banned_ban_reason, dy_user_ban_days } = toRefs<any>( const { dy_banned_handling_method, sys_user_sex, dy_banned_ban_reason, dy_user_ban_days } = toRefs<any>(
@@ -171,6 +208,7 @@ const data = reactive<PageData<BannedForm, BannedQuery>>({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
nickName: undefined,
contentId: undefined, contentId: undefined,
reportUserId: undefined, reportUserId: undefined,
reportReason: undefined, reportReason: undefined,
@@ -187,13 +225,13 @@ const data = reactive<PageData<BannedForm, BannedQuery>>({
id: [{ required: true, message: '唯一标识ID不能为空', trigger: 'blur' }], id: [{ required: true, message: '唯一标识ID不能为空', trigger: 'blur' }],
contentId: [{ required: true, message: '被举报内容id不能为空', trigger: 'blur' }], contentId: [{ required: true, message: '被举报内容id不能为空', trigger: 'blur' }],
reportUserId: [{ required: true, message: '被举报用户ID不能为空', trigger: 'blur' }], reportUserId: [{ required: true, message: '被举报用户ID不能为空', trigger: 'blur' }],
reportReason: [{ required: true, message: '举报理由不能为空', trigger: 'blur' }], reason: [{ required: true, message: '封禁理由不能为空', trigger: 'blur' }],
reportDetails: [{ required: true, message: '举报详细信息不能为空', trigger: 'blur' }], reportDetails: [{ required: true, message: '举报详细信息不能为空', trigger: 'blur' }],
informerUserId: [{ required: true, message: '举报人id不能为空', trigger: 'blur' }], informerUserId: [{ required: true, message: '举报人id不能为空', trigger: 'blur' }],
banReason: [{ required: true, message: '封禁理由不能为空', trigger: 'blur' }], banReason: [{ required: true, message: '封禁理由不能为空', trigger: 'blur' }],
banDays: [{ required: true, message: '封禁天数不能为空', trigger: 'blur' }], banDays: [{ required: true, message: '封禁天数不能为空', trigger: 'blur' }],
handlingMethod: [{ required: true, message: '处理方式(0=未处理,1=已下架)不能为空', trigger: 'change' }], handlingMethod: [{ required: true, message: '处理方式(0=未处理,1=已下架)不能为空', trigger: 'change' }],
handlingStatus: [{ required: true, message: '状态(0=已发布,1=已下架)不能为空', trigger: 'change' }] status: [{ required: true, message: '处理方式不能为空', trigger: 'change' }]
} }
}); });
@@ -229,6 +267,10 @@ const handleQuery = () => {
/** 重置按钮操作 */ /** 重置按钮操作 */
const resetQuery = () => { const resetQuery = () => {
queryFormRef.value?.resetFields(); queryFormRef.value?.resetFields();
queryParams.value.nickName = '';
queryParams.value.sex = '';
queryParams.value.handlingStatus = '';
queryParams.value.levelId = '';
handleQuery(); handleQuery();
}; };
@@ -250,22 +292,24 @@ const handleAdd = () => {
const handleUpdate = async (row?: BannedVO) => { const handleUpdate = async (row?: BannedVO) => {
reset(); reset();
const _id = row?.id || ids.value[0]; const _id = row?.id || ids.value[0];
const res = await getBanned(_id); // const res = await getBanned(_id);
Object.assign(form.value, res.data); Object.assign(form.value,row);
dialog.visible = true; dialog.visible = true;
dialog.title = `封禁【${row.nickname}`; dialog.title = `封禁【${row.nickName}`;
}; };
/** 提交按钮 */ /** 提交按钮 */
const submitForm = () => { const submitForm = () => {
bannedFormRef.value?.validate(async (valid: boolean) => { bannedFormRef.value?.validate(async (valid: boolean) => {
const arr = {
...form.value,
id: form.value.reportUserId,
type: queryParams.value.type,
deleteType: 0
};
if (valid) { if (valid) {
buttonLoading.value = true; buttonLoading.value = true;
if (form.value.id) { await updatemanage(arr).finally(() => (buttonLoading.value = false));
await updateBanned(form.value).finally(() => (buttonLoading.value = false));
} else {
await addBanned(form.value).finally(() => (buttonLoading.value = false));
}
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false; dialog.visible = false;
await getList(); await getList();
@@ -275,9 +319,18 @@ const submitForm = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: BannedVO) => { const handleDelete = async (row?: BannedVO) => {
const _ids = row?.id || ids.value; const _ids = row?.contentId;
await proxy?.$modal.confirm('是否确认删除举报编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false)); const _idsname = row?.contentName;
await delBanned(_ids); const arr = {
id: row?.id,
contentId: row?.contentId,
type: queryParams.value.type,
handlingStatus: 1,
deleteType: 1
};
const text = queryParams.value.type == 1 ? '笔记名称为“' : queryParams.value.type == 2 ? '活动名称为“' : '评论内容为“';
await proxy?.$modal.confirm('是否确认删除' + text + _idsname + '"的数据项?').finally(() => (loading.value = false));
await updatemanage(arr);
proxy?.$modal.msgSuccess('删除成功'); proxy?.$modal.msgSuccess('删除成功');
await getList(); await getList();
}; };
+63 -44
View File
@@ -1,35 +1,34 @@
<!-- 路线导航管理列表 --> <!-- 路线导航管理列表 -->
<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" id="search_div" class="mb-[10px]"> <div v-show="showSearch" id="search_div" class="mb-[10px]">
<el-card shadow="hover"> <el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70px"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70px">
<el-form-item label="线路标题" prop=""> <el-form-item label="线路标题" prop="">
<el-input v-model="queryParams.title" class="inputWidth" placeholder="请输入线路标题" clearable <el-input v-model="queryParams.title" class="inputWidth" placeholder="请输入线路标题" clearable @keyup.enter="handleQuery" />
@keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="发布状态" prop=""> <el-form-item label="发布状态" prop="">
<el-select v-model="queryParams.status" class="inputWidth" placeholder="请选择发布状态" clearable> <el-select v-model="queryParams.status" class="inputWidth" placeholder="请选择发布状态" clearable>
<el-option v-for="dict in note_publish_list" :key="dict.value" :label="dict.label" <el-option v-for="dict in note_publish_list" :key="dict.value" :label="dict.label" :value="dict.value" />
:value="dict.value" />
</el-select> </el-select>
</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 v-hasPermi="['system:Route:add']" type="primary" plain icon="Plus" <el-button v-hasPermi="['system:Route:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
@click="handleAdd">新增</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
</div> </div>
</transition> </transition>
<el-table v-loading="loading" :height="autoTableHeight" :data="RouteList" border <el-table v-loading="loading" :height="autoTableHeight" :data="RouteList" border @selection-change="handleSelectionChange">
@selection-change="handleSelectionChange"> <el-table-column fixed label="序号" align="center" width="80">
<el-table-column label="ID" align="center" prop="id" width="180px" fixed /> <template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="线路标题" align="center" prop="title" width="150px" show-overflow-tooltip fixed /> <el-table-column label="线路标题" align="center" prop="title" width="150px" show-overflow-tooltip fixed />
<el-table-column label="线路封面" align="center" prop="" /> <el-table-column label="线路封面" align="center" prop="" />
<el-table-column label="线路标签" align="center" prop="tagId" width="150px" show-overflow-tooltip> <el-table-column label="线路标签" align="center" prop="tagId" width="150px" show-overflow-tooltip>
@@ -73,27 +72,47 @@
<el-table-column label="发布状态" align="center" prop="status"> <el-table-column label="发布状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="warning">草稿</el-tag> <el-tag v-if="scope.row.status == 1" type="warning">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">审核中</el-tag> <el-tag v-if="scope.row.status == 2" type="success">已发布</el-tag>
<el-tag v-if="scope.row.status == 3" type="primary">已发布</el-tag> <el-tag v-if="scope.row.status == 3" type="primary">草稿</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160px" fixed="right"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160px" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button v-if="scope.row.status == 0 || scope.row.status == 1" v-hasPermi="['system:Route:edit']" link <el-button
type="primary" @click="handleUpdate(scope.row)">编辑</el-button> v-if="scope.row.status == 0 || scope.row.status == 3"
<el-button v-if="scope.row.status == 0 || scope.row.status == 1" v-hasPermi="['system:Route:remove']" link v-hasPermi="['system:Route:edit']"
type="primary" @click="handleDelete(scope.row)">删除</el-button> link
<el-button v-if="scope.row.status == 0" v-hasPermi="['system:Route:remove']" link type="primary" type="primary"
@click="savelistrow(scope.row)">发布</el-button> @click="handleUpdate(scope.row)"
<el-button v-if="scope.row.status == 3" v-hasPermi="['system:Route:remove']" link type="primary" >编辑</el-button
@click="savelistrow(scope.row)">撤销发布</el-button> >
<el-button
v-if="scope.row.status == 0 || scope.row.status == 3"
v-hasPermi="['system:Route:remove']"
link
type="primary"
@click="handleDelete(scope.row)"
>删除</el-button
>
<el-button v-if="scope.row.status == 0" v-hasPermi="['system:Route:remove']" link type="primary" @click="savelistrow(scope.row)"
>发布</el-button
>
<el-button v-if="scope.row.status == 2" v-hasPermi="['system:Route:remove']" link type="primary" @click="savelistrow(scope.row)"
>撤销发布</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" id="table_page" v-model:page="queryParams.pageNum" <pagination
v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> v-show="total > 0"
id="table_page"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
<!-- 添加或修改景点租赁管理对话框 --> <!-- 添加或修改景点租赁管理对话框 -->
<el-dialog v-model="dialog.visible" :title="dialog.title" width="60%" append-to-body> <el-dialog v-model="dialog.visible" :title="dialog.title" width="60%" append-to-body>
<el-form ref="RouteFormRef" :model="form" :rules="rules" label-width="120px"> <el-form ref="RouteFormRef" :model="form" :rules="rules" label-width="120px">
@@ -110,9 +129,8 @@
<el-option v-for="item in sys_user_tagOptions" :key="item.id" :label="item.title" :value="item.id" /> <el-option v-for="item in sys_user_tagOptions" :key="item.id" :label="item.title" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="涉及的行政区域" prop="treevalue"> <el-form-item label="涉及的行政区域" prop="region">
<el-cascader v-model="treevalue" :options="regiontree" :props="props" clearable placeholder="请选择涉及的行政区域" <el-cascader v-model="treevalue" :options="regiontree" :props="props" clearable placeholder="请选择涉及的行政区域" style="width: 400px" />
style="width: 400px" />
</el-form-item> </el-form-item>
<div style="display: flex"> <div style="display: flex">
<el-form-item label="行程天数" prop="routeDays"> <el-form-item label="行程天数" prop="routeDays">
@@ -163,7 +181,7 @@
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button :loading="buttonLoading" type="primary" @click="yulanform"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="yulanform"> </el-button>
<el-button :loading="buttonLoading" type="primary" @click="submitForm('1')"> 稿</el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm('3')"> 稿</el-button>
<el-button :loading="buttonLoading" type="primary" @click="submitForm('0')"> </el-button> <el-button :loading="buttonLoading" type="primary" @click="submitForm('0')"> </el-button>
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
</div> </div>
@@ -176,15 +194,13 @@
<el-input v-model="routeDetailsList.title" placeholder="请输入标题" style="width: 500px" /> <el-input v-model="routeDetailsList.title" placeholder="请输入标题" style="width: 500px" />
</el-form-item> </el-form-item>
<el-form-item label="描述"> <el-form-item label="描述">
<el-input v-model="routeDetailsList.description" placeholder="请输入描述" style="width: 500px" autosize <el-input v-model="routeDetailsList.description" placeholder="请输入描述" style="width: 500px" autosize type="textarea" />
type="textarea" />
</el-form-item> </el-form-item>
<el-form-item label="添加地点"> <el-form-item label="添加地点">
<el-button type="primary" @click="addjingdain">添加景点</el-button> <el-button type="primary" @click="addjingdain">添加景点</el-button>
</el-form-item> </el-form-item>
<div v-for="(item, index) in routeDetailsList.lowerList" class="articlelist"> <div v-for="(item, index) in routeDetailsList.lowerList" class="articlelist">
<CircleClose v-if="index != 0" style="width: 2em; height: 2em; position: relative; left: 98%" <CircleClose v-if="index != 0" style="width: 2em; height: 2em; position: relative; left: 98%" @click="delLowerList(index)" />
@click="delLowerList(index)" />
<el-form-item label="添加地点"> <el-form-item label="添加地点">
<el-select v-model="item.articleId" placeholder="请选择标记地点" size="large" style="width: 500px"> <el-select v-model="item.articleId" placeholder="请选择标记地点" size="large" style="width: 500px">
<el-option v-for="item in sys_user_contentOptions" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in sys_user_contentOptions" :key="item.id" :label="item.name" :value="item.id" />
@@ -294,10 +310,10 @@ const treevalue = ref('');
const hotelallvalue = ref(''); const hotelallvalue = ref('');
const note_publish_list = ref([ const note_publish_list = ref([
{ label: '已发布', value: 3 },
{ label: '审核中', value: 2 },
{ label: '未发布', value: 0 }, { label: '未发布', value: 0 },
{ label: '草稿', value: 1 } { label: '审核中', value: 1 },
{ label: '已发布', value: 2 },
{ label: '草稿', value: 3 }
]); ]);
const regiontree = ref([]); const regiontree = ref([]);
const props = { multiple: true, value: 'id' }; const props = { multiple: true, value: 'id' };
@@ -383,7 +399,7 @@ const data = reactive<PageData<RouteForm, RouteQuery>>({
routeDriveHour: [{ required: true, message: '行驶时长', trigger: 'blur' }], routeDriveHour: [{ required: true, message: '行驶时长', trigger: 'blur' }],
routeMileage: [{ required: true, message: '行程里数', trigger: 'blur' }], routeMileage: [{ required: true, message: '行程里数', trigger: 'blur' }],
routeDays: [{ required: true, message: '行程天数', trigger: 'blur' }], routeDays: [{ required: true, message: '行程天数', trigger: 'blur' }],
region: [{ required: true, message: '涉及的行政区', trigger: 'blur' }], region: [{ required: true, message: '涉及的行政区不能为空', trigger: 'blur' }],
tagId: [{ required: true, message: '标签不能为空', trigger: 'blur' }], tagId: [{ required: true, message: '标签不能为空', trigger: 'blur' }],
title: [{ required: true, message: '线路标题', trigger: 'blur' }] title: [{ required: true, message: '线路标题', trigger: 'blur' }]
} }
@@ -491,6 +507,9 @@ const handleSelectionChange = (selection: RouteVO[]) => {
/** 新增按钮操作 */ /** 新增按钮操作 */
const handleAdd = () => { const handleAdd = () => {
reset(); reset();
getContent();
getTag();
gethotelall();
dialog.visible = true; dialog.visible = true;
dialog.title = '添加路线'; dialog.title = '添加路线';
bookrouteDetailsList.value = []; bookrouteDetailsList.value = [];
@@ -510,9 +529,9 @@ const formatTag = (tagId: string | null) => {
// } // }
for (let i = 0; i < sys_user_tagOptions.value.length; i++) { for (let i = 0; i < sys_user_tagOptions.value.length; i++) {
const element = sys_user_tagOptions.value[i]; const element = sys_user_tagOptions.value[i];
if (tagId!=null) { if (tagId != null) {
let filteredArray = tagId.split(',').filter((item) => item==element.id); let filteredArray = tagId.split(',').filter((item) => item == element.id);
if (filteredArray.length>0) { if (filteredArray.length > 0) {
tagString += '' + element.title; tagString += '' + element.title;
} }
} }
@@ -536,7 +555,7 @@ const handleUpdate = async (row?: RouteVO) => {
/** 提交按钮 */ /** 提交按钮 */
const submitForm = async (type) => { const submitForm = async (type) => {
form.value.tagId = tagvalue?.value.length != 0 ? tagvalue?.value.join(',') : ''; form.value.tagId = tagvalue?.value.length != 0 ? tagvalue?.value.join(',') : '';
form.value.region = treevalue?.value ? JSON.stringify(treevalue?.value) : ''; form.value.region = treevalue?.value.length ==0?'': JSON.stringify(treevalue?.value);
form.value.status = Number(type); form.value.status = Number(type);
form.value.routeDetailsList = bookrouteDetailsList.value; form.value.routeDetailsList = bookrouteDetailsList.value;
if (type == 1) { if (type == 1) {
@@ -606,7 +625,7 @@ const getTag = async () => {
sys_user_tagOptions.value = res; //标签库 sys_user_tagOptions.value = res; //标签库
}; };
const gethotelall = async () => { const gethotelall = async () => {
const res = await hotelall({ status: 1 }); const res = await hotelall({ status: 2 });
sys_user_hotelall.value = res; sys_user_hotelall.value = res;
}; };
@@ -668,10 +687,10 @@ const savelistrow = async (row, type) => {
const _id = row?.id || ids.value[0]; const _id = row?.id || ids.value[0];
const res = await getRoute(_id); const res = await getRoute(_id);
Object.assign(form.value, res.data); Object.assign(form.value, res.data);
form.value.status = type == 1 ? 2 : 0; form.value.status = row.status == 0 ? 1 : 0;
const test = type == 1 ? '发布' : '撤销发布'; const test = type == 0 ? '发布' : '撤销发布';
const _ids = row?.title || ids.value; const _ids = row?.title || ids.value;
await proxy?.$modal.confirm('是否确认' + test + '行程标题为' + _ids + '的数据项?').finally(() => (loading.value = false)); await proxy?.$modal.confirm('是否确认' + test + '行程标题为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
await updateRoute(form.value).finally(() => (buttonLoading.value = false)); await updateRoute(form.value).finally(() => (buttonLoading.value = false));
proxy?.$modal.msgSuccess(test + '成功'); proxy?.$modal.msgSuccess(test + '成功');
await getList(); await getList();
+110 -39
View File
@@ -63,6 +63,11 @@
<el-table :height="autoTableHeight" v-loading="loading" :data="articleList" <el-table :height="autoTableHeight" v-loading="loading" :data="articleList"
@selection-change="handleSelectionChange" border> @selection-change="handleSelectionChange" border>
<el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="ID" align="center" prop="id" fixed v-if="false" width="50px" /> <el-table-column label="ID" align="center" prop="id" fixed v-if="false" width="50px" />
<el-table-column label="景点名称" align="center" prop="name" fixed v-if="queryParams.type == '0'" width="180px" /> <el-table-column label="景点名称" align="center" prop="name" fixed v-if="queryParams.type == '0'" width="180px" />
<el-table-column label="商家名称" align="center" prop="name" fixed v-if="queryParams.type != '0'" width="180px" /> <el-table-column label="商家名称" align="center" prop="name" fixed v-if="queryParams.type != '0'" width="180px" />
@@ -105,34 +110,37 @@
<el-button link type="primary" @click="handleDetail(scope.row)">查看</el-button> <el-button link type="primary" @click="handleDetail(scope.row)">查看</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="喜欢数量" align="center" prop="likeCount" /> <el-table-column label="相关笔记" align="center" prop="recommendNotebookCount">
<el-table-column label="收藏数量" align="center" prop="collectionCount" />
<el-table-column label="相关笔记" align="center" prop="pubNotebookCount">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">11{{ <el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">{{
scope.row.noteNumber }}</el-button> scope.row.recommendNotebookCount }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="笔记评论数" align="center" prop="notebookCommentCount" width="90px"> <el-table-column :label="queryParams.type == '0' ?'景点评论数':queryParams.type == '1' ?'租车评论数':'游艇评论数'" align="center"
prop="commentCount" width="90px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">11{{ <el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">{{
scope.row.noteNumber }}</el-button> scope.row.commentCount }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="笔记点赞数" align="center" prop="notebookAgreeCount" width="90px"> <el-table-column :label="queryParams.type == '0' ?'景点喜欢数':queryParams.type == '1' ?'租车喜欢数':'游艇喜欢数'" align="center"
prop="agreeCount" width="90" />
<el-table-column :label="queryParams.type == '0' ?'景点收藏数':queryParams.type == '1' ?'租车收藏数':'游艇收藏数'" align="center"
prop="collectionCount" width="90" />
<!-- <el-table-column label="点赞数" align="center" prop="notebookAgreeCount" width="90px">
<template #default="scope"> <template #default="scope">
<el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">11{{ <el-button link type="primary" v-if="scope.row.status!==3" @click="handleNote(scope.row)">1{{
scope.row.noteNumber }}</el-button> scope.row.notebookAgreeCount }}</el-button>
</template> </template>
</el-table-column> </el-table-column> -->
<!-- 0-未发布 1-审核中 2-发布 --> <!-- 0-未发布 1-审核中 2-发布 -->
<el-table-column label="发布状态" align="center" prop="status" width="100"> <el-table-column label="发布状态" align="center" prop="status" width="100">
<template #default="scope"> <template #default="scope">
<!-- <span>{{ scope.row.status == 0 ? '未发布' : scope.row.status == 1 ? '审核中' : scope.row.status == 2 ? '已发布' : '草稿' }}</span> --> <!-- <span>{{ scope.row.status == 0 ? '未发布' : scope.row.status == 1 ? '审核中' : scope.row.status == 2 ? '已发布' : '草稿' }}</span> -->
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag> <el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="warning">审核中</el-tag> <el-tag v-if="scope.row.status == 1" type="success">审核中</el-tag>
<el-tag v-if="scope.row.status == 2" type="success">已发布</el-tag> <el-tag v-if="scope.row.status == 2" type="primary">已发布</el-tag>
<el-tag v-if="scope.row.status == 3" type="danger">草稿</el-tag> <el-tag v-if="scope.row.status == 3" type="warning">草稿</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作人" align="center" prop="updateByName" width="120px" /> <el-table-column label="操作人" align="center" prop="updateByName" width="120px" />
@@ -226,7 +234,8 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="标签" prop="tagId_copy"> <el-form-item label="标签" prop="tagId_copy">
<el-select class="inputWidth" v-model="form.tagId_copy" multiple filterable placeholder="请选择标签" clearable> <el-select class="inputWidth" v-model="form.tagId_copy" multiple filterable placeholder="请选择标签" clearable
@visible-change="getTagList">
<el-option v-for="dict in sys_user_tagOptions" :key="dict.id" :label="dict.title" <el-option v-for="dict in sys_user_tagOptions" :key="dict.id" :label="dict.title"
:value="String(dict.id)" /> :value="String(dict.id)" />
</el-select> </el-select>
@@ -244,12 +253,19 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="地理位置" prop="introduce"> <el-form-item label="地理位置" prop="introduce">
<!-- <el-input v-model="searchLocation" type="text" placeholder="请输入地址信息" clearable /> --> <!-- <el-input v-model="searchLocation" type="text" placeholder="请输入地址信息" clearable /> -->
<el-input v-model="searchLocation" placeholder="请输入地址信息" class="input-with-select" <!-- <el-input v-model="searchLocation" placeholder="请输入地址信息" class="input-with-select"
@keyup.enter="debouncedSearch(searchLocation)"> @keyup.enter="debouncedSearch(searchLocation)">
<template #append> <template #append>
<el-button @click="debouncedSearch(searchLocation)" :icon="Search" /> <el-button @click="debouncedSearch(searchLocation)" :icon="Search" />
</template> </template>
</el-input> </el-input> -->
<el-select v-model="searchLocation" filterable remote reserve-keyword clearable placeholder="请输入地址信息"
@change="selectChnange" :remote-method="remoteMethod">
<el-option v-for="item in locationOptions" :key="item.id"
:label="item.title + '&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp' +''+ item.province+' - '+item.city+`${item.district?' - '+item.district:''}`+''"
:value="item.province+item.city+item.title" />
<!-- :value="item.ad_info.province+item.ad_info.city+item.title" /> -->
</el-select>
</el-form-item> </el-form-item>
<tlbs-map style="margin-left: 80px" ref="map" api-key=" <tlbs-map style="margin-left: 80px" ref="map" api-key="
6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO" :center="center" :zoom="zoom" :control="control" @click="onClick"> 6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO" :center="center" :zoom="zoom" :control="control" @click="onClick">
@@ -398,9 +414,12 @@
</template> </template>
</el-dialog> </el-dialog>
<!-- 相关笔记 --> <!-- 相关笔记 -->
<el-dialog title="相关笔记" v-model="noteBookVisible" width="1200px" append-to-body> <el-dialog title="相关笔记" v-model="noteListDialog.visible" width="1200px" append-to-body>
<noteList :autoTableHeight="300" :sys_user_tagOptions="sys_user_tagOptions" :noteBookTagIds="noteBookTagIds" <noteList :autoTableHeight="300" :sys_user_tagOptions="sys_user_tagOptions" parentName="scenic"
parentName="scenic" :type="queryParams.type" :id="form.id"></noteList> :articleList="noteListDialog.articleList" :type="queryParams.type" :id="form.id"></noteList>
<pagination v-show="noteListDialog.total > 0" :total="noteListDialog.total"
v-model:page="noteListDialog.params.pageNum" v-model:limit="noteListDialog.params.pageSize"
@pagination="handleNote" />
<template #footer> <template #footer>
<div class="dialog-footer"> <div class="dialog-footer">
<el-button @click="cancel('noteBookVisible')">关 闭</el-button> <el-button @click="cancel('noteBookVisible')">关 闭</el-button>
@@ -412,7 +431,7 @@
<script setup name="Article" lang="ts"> <script setup name="Article" lang="ts">
import { listTag,tagAll } from '@/api/manage/tag'; import { listTag,tagAll } from '@/api/manage/tag';
import { listArticle, getArticle, delArticle, addArticle, updateArticle, listByTagIdNotebook } from '@/api/manage/scenic'; import { listArticle, getArticle, delArticle, addArticle, updateArticle, listByTagIdNotebook,recommend } from '@/api/manage/scenic';
import { ArticleVO, ArticleQuery, ArticleForm } from '@/api/manage/scenic/types'; import { ArticleVO, ArticleQuery, ArticleForm } from '@/api/manage/scenic/types';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { getToken } from '@/utils/auth'; import { getToken } from '@/utils/auth';
@@ -442,6 +461,7 @@ const dialog = reactive<DialogOption>({
title: '', title: '',
type:'' type:''
}); });
const locationOptions = ref([]); //腾讯地图返回的搜索地址列表
const noteLists = ref([]); // 相关笔记列表 const noteLists = ref([]); // 相关笔记列表
const previewRef = ref(null); const previewRef = ref(null);
const previewVisible = ref(false); //预览弹层 const previewVisible = ref(false); //预览弹层
@@ -602,6 +622,37 @@ const getTag = async () => {
const res = await tagAll(); const res = await tagAll();
sys_user_tagOptions.value = res; //标签库 sys_user_tagOptions.value = res; //标签库
}; };
const getTagList = async (visible: boolean) => {
if (visible) {
getTag(); //标签库
}
}
// 地理位置 输入实时搜索
const remoteMethod = (query: string) => {
if (query !== '') {
// 调用腾讯地图API进行搜索,并展示在地图上
// geocoder(query).then((result) => {
// console.log(result);
// });
console.log(query);
// jsonp(`https://apis.map.qq.com/ws/place/v1/search?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&boundary=nearby(20.018883,110.348801,1000)&output=jsonp`, {}).then((res) => {
jsonp(`https://apis.map.qq.com/ws/place/v1/suggestion?key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&keyword=${encodeURI(query)}&region=三亚市&region_fix=0&output=jsonp`, {}).then((res) => {
// if (res.region.title!=='海南省') {
// proxy?.$modal.msgError('仅支持海南省地理位置');
// return
// }
if (res.status == 0) {
locationOptions.value = res.data;
}
});
}
}
// 选择地理位置 下拉框值变化
const selectChnange = (val:string) => {
if (val) {
debouncedSearch(searchLocation.value)
}
}
//输入位置,搜索位置 //输入位置,搜索位置
const performSearch = async (text) => { const performSearch = async (text) => {
// 这里简单模拟延迟,模拟真实的异步请求耗时 // 这里简单模拟延迟,模拟真实的异步请求耗时
@@ -610,22 +661,21 @@ const performSearch = async (text) => {
if (text === '') { if (text === '') {
console.log('搜索内容为空'); console.log('搜索内容为空');
} else { } else {
console.log('搜索内容为:', text); // console.log('搜索内容为:', text);
// 调用腾讯地图API进行搜索,并展示在地图上 // 调用腾讯地图API进行搜索,并展示在地图上
// geocoder(text).then((result) => { // geocoder(text).then((result) => {
// console.log(result); // console.log(result);
// }); // });
jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => { jsonp(`https://apis.map.qq.com/ws/geocoder/v1/?address=${text}&key=${'6XFBZ-SAVLT-JGIX2-VOLMK-6S2H3-XUBGO'}&output=jsonp`, {}).then((data) => {
console.log(data); // console.log(data);
if (data.status == 0) { if (data.status == 0) {
center.value.lat = data.result.location.lat;
center.value.lng = data.result.location.lng;
form.value.address = form.value.address =
data.result.address_components.province + data.result.address_components.province +
data.result.address_components.city + data.result.address_components.city +
data.result.address_components.district + data.result.address_components.district +
data.result.address_components.street + data.result.address_components.street +
data.result.address_components.street_number; data.result.address_components.street_number+
data.result.title;
form.value.latitude = data.result.location.lat; form.value.latitude = data.result.location.lat;
form.value.longitude = data.result.location.lng; form.value.longitude = data.result.location.lng;
form.value.region = data.result.ad_info.adcode; //行政区划编码 form.value.region = data.result.ad_info.adcode; //行政区划编码
@@ -633,6 +683,7 @@ const performSearch = async (text) => {
// form.value.province = data.result.address_components.province; // form.value.province = data.result.address_components.province;
// form.value.city = data.result.address_components.city; // form.value.city = data.result.address_components.city;
center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
} else if (data.status == 348) { } else if (data.status == 348) {
//地址信息不明确,需弹出提示 //地址信息不明确,需弹出提示
@@ -662,9 +713,8 @@ const onClick = (e: any) => {
// form.value.city = data.result.address_component.city; // form.value.city = data.result.address_component.city;
form.value.region = data.result.ad_info.adcode; //行政区划编码 form.value.region = data.result.ad_info.adcode; //行政区划编码
form.value.regionCode = data.result.ad_info.adcode; //行政区划编码 form.value.regionCode = data.result.ad_info.adcode; //行政区划编码
center.value.lat = data.result.location.lat; center.value = { lat: data.result.location.lat, lng: data.result.location.lng };
center.value.lng = data.result.location.lng; searchLocation.value = data.result.formatted_addresses?.recommend;
searchLocation.value = data.result.formatted_addresses.recommend;
geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }]; geometries.value = [{ styleId: 'marker', position: { lat: data.result.location.lat, lng: data.result.location.lng } }];
} }
} }
@@ -679,6 +729,7 @@ const getList = async () => {
queryParams.value.tagId = queryParams.value.tagId.toString(); queryParams.value.tagId = queryParams.value.tagId.toString();
} }
const res = await listArticle(queryParams.value).finally(() => (loading.value = false)); const res = await listArticle(queryParams.value).finally(() => (loading.value = false));
articleList.value=[];
res.rows.forEach((element: any) => { res.rows.forEach((element: any) => {
if (element.region == null) { if (element.region == null) {
element.region = element.city; element.region = element.city;
@@ -702,6 +753,8 @@ const cancel = (type: string) => {
dialog.visible = false; dialog.visible = false;
noteBookVisible.value = false; noteBookVisible.value = false;
noteBookTagIds.value = ''; // 清空标签 noteBookTagIds.value = ''; // 清空标签
noteListDialog.visible = false;
noteListDialog.params.pageNum=1;
}; };
/** 表单重置 */ /** 表单重置 */
@@ -832,11 +885,26 @@ const handleDetail = async (row?: ArticleVO) => {
*/ */
const noteBookVisible = ref(false); const noteBookVisible = ref(false);
const noteBookTagIds = ref(''); //相关笔记的标签id const noteBookTagIds = ref(''); //相关笔记的标签id
const noteListDialog = reactive({
visible: false,
total: 0,
articleList:[],
params:{
articleId: null,
pageNum: 1,
pageSize: 10,
}
});
// 相关笔记 请求列表
const handleNote = async (row?: ArticleVO) => { const handleNote = async (row?: ArticleVO) => {
noteBookTagIds.value = ''; // noteBookTagIds.value = '';
noteBookTagIds.value = row?.tagId as string; // noteBookTagIds.value = row?.tagId as string;
noteBookVisible.value = true; if (row.id) {
console.log(row.tagId); noteListDialog.params.articleId = row?.id;
}
let res = await recommend(noteListDialog.params);
noteListDialog.articleList=res.rows;
noteListDialog.visible = true;
}; };
/** 新增景点,商家提交按钮 */ /** 新增景点,商家提交按钮 */
const submitForm = async (type: string) => { const submitForm = async (type: string) => {
@@ -853,7 +921,8 @@ const submitForm = async (type: string) => {
if (form.value.id) { if (form.value.id) {
await updateArticle(form.value).finally(() => (buttonLoading.value = false)); await updateArticle(form.value).finally(() => (buttonLoading.value = false));
} else { } else {
await addArticle(form.value).finally(() => (buttonLoading.value = false)); let res = await addArticle(form.value).finally(() => (buttonLoading.value = false));
form.value.id = res.msg;
} }
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
// dialog.visible = false; // dialog.visible = false;
@@ -882,6 +951,8 @@ const submitForm = async (type: string) => {
proxy?.$modal.msgSuccess('操作成功'); proxy?.$modal.msgSuccess('操作成功');
dialog.visible = false; dialog.visible = false;
await getList(); await getList();
}else{
proxy?.$modal.msgError("缺少必填项");
} }
}); });
}; };
+9 -3
View File
@@ -29,6 +29,11 @@
<el-table v-loading="loading" :height="autoTableHeight" :data="tagList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :height="autoTableHeight" :data="tagList" @selection-change="handleSelectionChange">
<!-- <el-table-column type="selection" width="55" align="center" /> --> <!-- <el-table-column type="selection" width="55" align="center" /> -->
<el-table-column fixed label="序号" align="center" width="80">
<template #default="scope">
<span>{{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="标签ID" align="center" prop="id" v-if="false" width="70px" /> <el-table-column label="标签ID" align="center" prop="id" v-if="false" width="70px" />
<el-table-column label="标签名称" align="center" prop="title" /> <el-table-column label="标签名称" align="center" prop="title" />
<el-table-column label="排序" align="center" prop="sort" /> <el-table-column label="排序" align="center" prop="sort" />
@@ -96,7 +101,8 @@ const tagFormRef = ref<ElFormInstance>();
const dialog = reactive<DialogOption>({ const dialog = reactive<DialogOption>({
visible: false, visible: false,
title: '' title: '',
type:''
}); });
const initFormData: TagForm = { const initFormData: TagForm = {
@@ -108,7 +114,7 @@ const data = reactive<PageData<TagForm, TagQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 20,
title: undefined, title: undefined,
sort: undefined, sort: undefined,
params: {} params: {}
@@ -207,7 +213,7 @@ const submitForm = () => {
/** 删除按钮操作 */ /** 删除按钮操作 */
const handleDelete = async (row?: TagVO) => { const handleDelete = async (row?: TagVO) => {
const _ids = row?.id || ids.value; const _ids = row?.id || ids.value;
await proxy?.$modal.confirm('是否确认删除标签编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false)); await proxy?.$modal.confirm('是否确认删除标签名称为"' + row.title + '"的数据项?').finally(() => (loading.value = false));
await delTag(_ids); await delTag(_ids);
proxy?.$modal.msgSuccess('删除成功'); proxy?.$modal.msgSuccess('删除成功');
await getList(); await getList();
+4 -2
View File
@@ -52,7 +52,9 @@
</el-table-column> </el-table-column>
<el-table-column label="状态" align="center" prop="status"> <el-table-column label="状态" align="center" prop="status">
<template #default="scope"> <template #default="scope">
<dict-tag :options="dy_user_level_status" :value="scope.row.status" /> <!-- <dict-tag :options="dy_user_level_status" :value="scope.row.status" /> -->
<el-tag v-if="scope.row.status == 0" type="info">未发布</el-tag>
<el-tag v-if="scope.row.status == 1" type="primary">已发布</el-tag>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="等级名称" align="center" prop="levelName" /> <!-- <el-table-column label="等级名称" align="center" prop="levelName" />
@@ -142,7 +144,7 @@ const data = reactive<PageData<UserLevelForm, UserLevelQuery>>({
form: { ...initFormData }, form: { ...initFormData },
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 20,
levelName: undefined, levelName: undefined,
status: undefined, status: undefined,
score: undefined, score: undefined,
+22 -23
View File
@@ -1,3 +1,4 @@
<!-- 积分记录 -->
<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"
@@ -37,30 +38,28 @@
</div> </div>
</transition> </transition>
<el-card shadow="never"> <el-table v-loading="loading" :height="autoTableHeight" :data="userScoreList"
<el-table v-loading="loading" :height="autoTableHeight" :data="userScoreList" @selection-change="handleSelectionChange">
@selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" />
<el-table-column type="selection" width="55" align="center" /> <el-table-column label="用户昵称" align="center" prop="nickName" />
<el-table-column label="用户昵称" align="center" prop="nickName" /> <el-table-column label="积分获得时间" align="center" prop="updateTime" />
<el-table-column label="积分获得时间" align="center" prop="updateTime" /> <el-table-column label="获得类型" align="center" prop="bizType">
<el-table-column label="获得类型" align="center" prop="bizType"> <template #default="scope">
<template #default="scope"> <dict-tag :options="dy_source" :value="scope.row.bizType" />
<dict-tag :options="dy_source" :value="scope.row.bizType" /> </template>
</template> </el-table-column>
</el-table-column> <el-table-column label="操作内容" align="center" prop="bizName" />
<el-table-column label="操作内容" align="center" prop="bizName" /> <!-- <el-table-column label="业务id" align="center" prop="sourceId" /> -->
<!-- <el-table-column label="业务id" align="center" prop="sourceId" /> --> <!-- <el-table-column label="来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " align="center" prop="source" /> -->
<!-- <el-table-column label="来源类型(0=签到 1=发笔记 2=扔瓶子 3=评论 4=点赞 5=分享 6=收藏 7=地图点亮) " align="center" prop="source" /> --> <el-table-column label="积分" align="center" prop="score">
<el-table-column label="积分" align="center" prop="score"> <template #default="scope">
<template #default="scope"> <span>{{ scope.row.score > 0 ? '+' + scope.row.score+' 积分' : scope.row.score}}</span>
<span>{{ scope.row.score > 0 ? '+' + scope.row.score+' 积分' : scope.row.score}}</span> </template>
</template> </el-table-column>
</el-table-column> </el-table>
</el-table>
<pagination v-show="total > 0" id="table_page" :total="total" v-model:page="queryParams.pageNum" <pagination v-show="total > 0" id="table_page" :total="total" v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize" @pagination="getList" /> v-model:limit="queryParams.pageSize" @pagination="getList" />
</el-card>
</div> </div>
</template> </template>
+5 -5
View File
@@ -28,11 +28,11 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:client:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['system:client:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:client:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"> <!-- <el-button v-hasPermi="['system:client:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">-->
修改 <!-- 修改-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:client:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> <el-button v-hasPermi="['system:client:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
删除 删除
+5 -5
View File
@@ -40,11 +40,11 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:config:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['system:config:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:config:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"> <!-- <el-button v-hasPermi="['system:config:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">-->
修改 <!-- 修改-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
删除 删除
+3 -3
View File
@@ -35,9 +35,9 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button> <!-- <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">修改</el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
删除 删除
+5 -5
View File
@@ -30,11 +30,11 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:notice:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['system:notice:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:notice:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" <!-- <el-button v-hasPermi="['system:notice:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"-->
>修改</el-button <!-- >修改</el-button-->
> <!-- >-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:notice:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> <el-button v-hasPermi="['system:notice:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
删除 删除
+5 -5
View File
@@ -68,11 +68,11 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button> <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" <!-- <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"-->
>修改</el-button <!-- >修改</el-button-->
> <!-- >-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">
删除 删除
+3 -3
View File
@@ -42,9 +42,9 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button> <el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">修改</el-button> <!-- <el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">修改</el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-hasPermi="['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">删除</el-button> <el-button v-hasPermi="['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">删除</el-button>
</el-col> </el-col>
+20 -20
View File
@@ -62,31 +62,31 @@
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button> <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()"> <!-- <el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">-->
修改 <!-- 修改-->
</el-button> <!-- </el-button>-->
</el-col> <!-- </el-col>-->
<el-col :span="1.5"> <el-col :span="1.5">
<el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()"> <el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()">
删除 删除
</el-button> </el-button>
</el-col> </el-col>
<el-col :span="1.5"> <!-- <el-col :span="1.5">-->
<el-dropdown class="mt-[1px]"> <!-- <el-dropdown class="mt-[1px]">-->
<el-button plain type="info"> <!-- <el-button plain type="info">-->
更多 <!-- 更多-->
<el-icon class="el-icon--right"><arrow-down /></el-icon <!-- <el-icon class="el-icon&#45;&#45;right"><arrow-down /></el-icon-->
></el-button> <!-- ></el-button>-->
<template #dropdown> <!-- <template #dropdown>-->
<el-dropdown-menu> <!-- <el-dropdown-menu>-->
<el-dropdown-item icon="Download" @click="importTemplate">下载模板</el-dropdown-item> <!-- <el-dropdown-item icon="Download" @click="importTemplate">下载模板</el-dropdown-item>-->
<el-dropdown-item icon="Top" @click="handleImport"> 导入数据</el-dropdown-item> <!-- <el-dropdown-item icon="Top" @click="handleImport"> 导入数据</el-dropdown-item>-->
<el-dropdown-item icon="Download" @click="handleExport"> 导出数据</el-dropdown-item> <!-- <el-dropdown-item icon="Download" @click="handleExport"> 导出数据</el-dropdown-item>-->
</el-dropdown-menu> <!-- </el-dropdown-menu>-->
</template> <!-- </template>-->
</el-dropdown> <!-- </el-dropdown>-->
</el-col> <!-- </el-col>-->
<right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar> <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar>
</el-row> </el-row>
</template> </template>