Compare commits

...

8 Commits

20 changed files with 724 additions and 810 deletions

View File

@ -2,7 +2,7 @@
VITE_APP_TITLE=众悦e家管理系统
# 项目本地运行端口号
VITE_PORT=80
VITE_PORT=81
# open 运行 npm run dev 时自动打开浏览器
VITE_OPEN=true

View File

@ -5,7 +5,8 @@ VITE_DEV=true
# 请求路径
#VITE_BASE_URL='https://zysc.fjptzykj.com'
VITE_BASE_URL='http://192.168.1.12:6127'
#VITE_BASE_URL='http://192.168.1.12:6127'
VITE_BASE_URL='http://127.0.0.1:6127'
# 文件上传类型server - 后端上传, client - 前端直连上传,仅支持 S3 服务
VITE_UPLOAD_TYPE=server

View File

@ -0,0 +1,51 @@
import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util'
/** 轮播图属性 */
export interface CarouselProperty {
// 类型:默认 | 卡片
type: 'default' | 'card'
// 指示器样式:点 | 数字
indicator: 'dot' | 'number'
// 是否自动播放
autoplay: boolean
// 播放间隔
interval: number
// 轮播内容
items: CarouselItemProperty[]
// 组件样式
style: ComponentStyle
}
// 轮播内容属性
export interface CarouselItemProperty {
// 类型:图片 | 视频
type: 'img' | 'video'
// 图片链接
imgUrl: string
// 视频链接
videoUrl: string
// 跳转链接
url: string
}
import logo from '@/assets/imgs/DiyEditorImges/组件图标-09.png'
// 定义组件
export const component = {
id: 'CarouselLong',
name: '长轮播图',
// icon: 'system-uicons:carousel',
icon: logo,
property: {
type: 'default',
indicator: 'dot',
autoplay: false,
interval: 3,
items: [
{ type: 'img', imgUrl: 'https://static.iocoder.cn/mall/banner-01.jpg', videoUrl: '' },
{ type: 'img', imgUrl: 'https://static.iocoder.cn/mall/banner-02.jpg', videoUrl: '' }
] as CarouselItemProperty[],
style: {
bgType: 'color',
bgColor: '#fff',
marginBottom: 8
} as ComponentStyle
}
} as DiyComponent<CarouselProperty>

View File

@ -0,0 +1,33 @@
<template>
<!-- 无图片 -->
<div class="h-250px flex items-center justify-center bg-gray-3" v-if="property.items.length === 0">
<Icon icon="tdesign:image" class="text-gray-8 text-120px!" />
</div>
<div v-else class="relative">
<el-carousel height="calc(100vh - 50px)" :type="property.type === 'card' ? 'card' : ''"
:autoplay="property.autoplay" :interval="property.interval * 1000"
:indicator-position="property.indicator === 'number' ? 'none' : undefined" @change="handleIndexChange">
<el-carousel-item v-for="(item, index) in property.items" :key="index">
<el-image class="h-full w-full" :src="item.imgUrl" />
</el-carousel-item>
</el-carousel>
<div v-if="property.indicator === 'number'"
class="absolute bottom-10px right-10px rounded-xl bg-black p-x-8px p-y-2px text-10px text-white opacity-40">{{
currentIndex }} / {{ property.items.length }}</div>
</div>
</template>
<script setup lang="ts">
import { CarouselProperty } from './config'
/** 轮播图 */
defineOptions({ name: 'Carousel' })
defineProps<{ property: CarouselProperty }>()
const currentIndex = ref(0)
const handleIndexChange = (index: number) => {
currentIndex.value = index + 1
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,106 @@
<template>
<ComponentContainerProperty v-model="formData.style">
<el-form label-width="80px" :model="formData">
<el-card header="样式设置" class="property-group" shadow="never">
<el-form-item label="样式" prop="type">
<el-radio-group v-model="formData.type">
<el-tooltip class="item" content="默认" placement="bottom">
<el-radio-button label="default">
<Icon icon="system-uicons:carousel" />
</el-radio-button>
</el-tooltip>
<el-tooltip class="item" content="卡片" placement="bottom">
<el-radio-button label="card">
<Icon icon="ic:round-view-carousel" />
</el-radio-button>
</el-tooltip>
</el-radio-group>
</el-form-item>
<el-form-item label="指示器" prop="indicator">
<el-radio-group v-model="formData.indicator">
<el-radio label="dot">小圆点</el-radio>
<el-radio label="number">数字</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否轮播" prop="autoplay">
<el-switch v-model="formData.autoplay" />
</el-form-item>
<el-form-item label="播放间隔" prop="interval" v-if="formData.autoplay">
<el-slider
v-model="formData.interval"
:max="10"
:min="0.5"
:step="0.5"
show-input
input-size="small"
:show-input-controls="false"
/>
<el-text type="info">单位</el-text>
</el-form-item>
</el-card>
<el-card header="内容设置" class="property-group" shadow="never">
<Draggable v-model="formData.items" :empty-item="{ type: 'img' }">
<template #default="{ element }">
<el-form-item label="类型" prop="type" class="m-b-8px!" label-width="40px">
<el-radio-group v-model="element.type">
<el-radio label="img">图片</el-radio>
<el-radio label="video">视频</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
label="图片"
class="m-b-8px!"
label-width="40px"
v-if="element.type === 'img'"
>
<UploadImg
v-model="element.imgUrl"
draggable="false"
height="80px"
width="100%"
class="min-w-80px"
/>
</el-form-item>
<template v-else>
<el-form-item label="封面" class="m-b-8px!" label-width="40px">
<UploadImg
v-model="element.imgUrl"
draggable="false"
height="80px"
width="100%"
class="min-w-80px"
/>
</el-form-item>
<el-form-item label="视频" class="m-b-8px!" label-width="40px">
<UploadFile
v-model="element.videoUrl"
:file-type="['mp4']"
:limit="1"
:file-size="100"
class="min-w-80px"
/>
</el-form-item>
</template>
<el-form-item label="链接" class="m-b-8px!" label-width="40px">
<AppLinkInput v-model="element.url" />
</el-form-item>
</template>
</Draggable>
</el-card>
</el-form>
</ComponentContainerProperty>
</template>
<script setup lang="ts">
import { CarouselProperty } from './config'
import { usePropertyForm } from '@/components/DiyEditor/util'
//
defineOptions({ name: 'CarouselProperty' })
const props = defineProps<{ modelValue: CarouselProperty }>()
const emit = defineEmits(['update:modelValue'])
const { formData } = usePropertyForm(props.modelValue, emit)
</script>
<style scoped lang="scss"></style>

View File

@ -3,7 +3,7 @@ import {ComponentStyle, DiyComponent} from '@/components/DiyEditor/util'
/** 积分商城属性 */
export interface PromotionPointProperty {
// 布局类型:单列 | 三列
layoutType: 'oneColBigImg' | 'oneColSmallImg' | 'twoCol'
layoutType: 'oneColBigImg' | 'oneColSmallImg' | 'twoCol' | 'oneColSwiper'
// 商品字段
fields: {
// 商品名称

View File

@ -1,90 +1,66 @@
<template>
<div ref="containerRef" :class="`box-content min-h-30px w-full flex flex-row flex-wrap`">
<div
v-for="(spu, index) in spuList"
:key="index"
:style="{
...calculateSpace(index),
...calculateWidth(),
borderTopLeftRadius: `${property.borderRadiusTop}px`,
borderTopRightRadius: `${property.borderRadiusTop}px`,
borderBottomLeftRadius: `${property.borderRadiusBottom}px`,
borderBottomRightRadius: `${property.borderRadiusBottom}px`
}"
class="relative box-content flex flex-row flex-wrap overflow-hidden bg-white"
>
<div ref="containerRef" class="box-content min-h-30px w-full flex flex-row flex-wrap"
:class="{ 'one-Col-swiper': property.layoutType === 'oneColSwiper' }">
<div v-for="(spu, index) in spuList" :key="index" :style="{
...calculateSpace(index),
...calculateWidth(),
borderTopLeftRadius: `${property.borderRadiusTop}px`,
borderTopRightRadius: `${property.borderRadiusTop}px`,
borderBottomLeftRadius: `${property.borderRadiusBottom}px`,
borderBottomRightRadius: `${property.borderRadiusBottom}px`
}" class="relative box-content flex flex-row flex-wrap overflow-hidden bg-white"
:class="{ 'one-Col-swiper-item': property.layoutType === 'oneColSwiper' }">
<!-- 角标 -->
<div v-if="property.badge.show" class="absolute left-0 top-0 z-1 items-center justify-center">
<el-image :src="property.badge.imgUrl" class="h-26px w-38px" fit="cover" />
</div>
<!-- 商品封面图 -->
<div
:class="[
'h-140px',
{
'w-full': property.layoutType !== 'oneColSmallImg',
'w-140px': property.layoutType === 'oneColSmallImg'
}
]"
>
<div :class="[
'h-140px',
{
'w-full': property.layoutType !== 'oneColSmallImg',
'w-140px': property.layoutType === 'oneColSmallImg'
}
]">
<el-image :src="spu.picUrl" class="h-full w-full" fit="cover" />
</div>
<div
:class="[
' flex flex-col gap-8px p-8px box-border',
{
'w-full': property.layoutType !== 'oneColSmallImg',
'w-[calc(100%-140px-16px)]': property.layoutType === 'oneColSmallImg'
}
]"
>
<div v-if="property.layoutType !== 'oneColSwiper'" :class="[
' flex flex-col gap-8px p-8px box-border',
{
'w-full': property.layoutType !== 'oneColSmallImg',
'w-[calc(100%-140px-16px)]': property.layoutType === 'oneColSmallImg'
}
]">
<!-- 商品名称 -->
<div
v-if="property.fields.name.show"
:class="[
'text-14px ',
{
truncate: property.layoutType !== 'oneColSmallImg',
'overflow-ellipsis line-clamp-2': property.layoutType === 'oneColSmallImg'
}
]"
:style="{ color: property.fields.name.color }"
>
<div v-if="property.fields.name.show" :class="[
'text-14px ',
{
truncate: property.layoutType !== 'oneColSmallImg',
'overflow-ellipsis line-clamp-2': property.layoutType === 'oneColSmallImg'
}
]" :style="{ color: property.fields.name.color }">
{{ spu.name }}
</div>
<!-- 商品简介 -->
<div
v-if="property.fields.introduction.show"
:style="{ color: property.fields.introduction.color }"
class="truncate text-12px"
>
<div v-if="property.fields.introduction.show" :style="{ color: property.fields.introduction.color }"
class="truncate text-12px">
{{ spu.introduction }}
</div>
<div>
<!-- 积分 -->
<span
v-if="property.fields.price.show"
:style="{ color: property.fields.price.color }"
class="text-16px"
>
<span v-if="property.fields.price.show" :style="{ color: property.fields.price.color }" class="text-16px">
{{ spu.point }}积分
{{ !spu.pointPrice || spu.pointPrice === 0 ? '' : `+${fenToYuan(spu.pointPrice)}` }}
</span>
<!-- 市场价 -->
<span
v-if="property.fields.marketPrice.show && spu.marketPrice"
:style="{ color: property.fields.marketPrice.color }"
class="ml-4px text-10px line-through"
>
<span v-if="property.fields.marketPrice.show && spu.marketPrice"
:style="{ color: property.fields.marketPrice.color }" class="ml-4px text-10px line-through">
{{ fenToYuan(spu.marketPrice) }}
</span>
</div>
<div class="text-12px">
<!-- 销量 -->
<span
v-if="property.fields.salesCount.show"
:style="{ color: property.fields.salesCount.color }"
>
<span v-if="property.fields.salesCount.show" :style="{ color: property.fields.salesCount.color }">
已兑{{ (spu.pointTotalStock || 0) - (spu.pointStock || 0) }}
</span>
<!-- 库存 -->
@ -94,24 +70,15 @@
</div>
</div>
<!-- 购买按钮 -->
<div class="absolute bottom-8px right-8px">
<div class="absolute bottom-8px right-8px" v-if="property.layoutType !== 'oneColSwiper'">
<!-- 文字按钮 -->
<span
v-if="property.btnBuy.type === 'text'"
:style="{
background: `linear-gradient(to right, ${property.btnBuy.bgBeginColor}, ${property.btnBuy.bgEndColor}`
}"
class="rounded-full p-x-12px p-y-4px text-12px text-white"
>
<span v-if="property.btnBuy.type === 'text'" :style="{
background: `linear-gradient(to right, ${property.btnBuy.bgBeginColor}, ${property.btnBuy.bgEndColor}`
}" class="rounded-full p-x-12px p-y-4px text-12px text-white">
{{ property.btnBuy.text }}
</span>
<!-- 图片按钮 -->
<el-image
v-else
:src="property.btnBuy.imgUrl"
class="h-28px w-28px rounded-full"
fit="cover"
/>
<el-image v-else :src="property.btnBuy.imgUrl" class="h-28px w-28px rounded-full" fit="cover" />
</div>
</div>
</div>
@ -199,4 +166,17 @@ const calculateWidth = () => {
}
</script>
<style lang="scss" scoped></style>
<style lang="scss" scoped>
.one-Col-swiper {
flex-wrap: nowrap;
overflow: auto;
}
.one-Col-swiper-item {
width: 130px !important;
min-width: 130px;
height: 130px;
margin-left: 8px !important;
margin-top: 0 !important;
}
</style>

View File

@ -22,6 +22,11 @@
<Icon icon="fluent:text-column-two-24-filled" />
</el-radio-button>
</el-tooltip>
<el-tooltip class="item" content="单行滑动" placement="bottom">
<el-radio-button value="oneColSwiper">
<Icon icon="system-uicons:carousel" />
</el-radio-button>
</el-tooltip>
<!--<el-tooltip class="item" content="三列" placement="bottom">
<el-radio-button value="threeCol">
<Icon icon="fluent:text-column-three-24-filled" />
@ -104,34 +109,16 @@
</el-card>
<el-card class="property-group" header="商品样式" shadow="never">
<el-form-item label="上圆角" prop="borderRadiusTop">
<el-slider
v-model="formData.borderRadiusTop"
:max="100"
:min="0"
:show-input-controls="false"
input-size="small"
show-input
/>
<el-slider v-model="formData.borderRadiusTop" :max="100" :min="0" :show-input-controls="false"
input-size="small" show-input />
</el-form-item>
<el-form-item label="下圆角" prop="borderRadiusBottom">
<el-slider
v-model="formData.borderRadiusBottom"
:max="100"
:min="0"
:show-input-controls="false"
input-size="small"
show-input
/>
<el-slider v-model="formData.borderRadiusBottom" :max="100" :min="0" :show-input-controls="false"
input-size="small" show-input />
</el-form-item>
<el-form-item label="间隔" prop="space">
<el-slider
v-model="formData.space"
:max="100"
:min="0"
:show-input-controls="false"
input-size="small"
show-input
/>
<el-slider v-model="formData.space" :max="100" :min="0" :show-input-controls="false" input-size="small"
show-input />
</el-form-item>
</el-card>
</el-form>

View File

@ -0,0 +1,57 @@
import { ComponentStyle, DiyComponent } from '@/components/DiyEditor/util'
/** 富文本属性 */
export interface RichtextProperty {
richText: string
borderRadius: number
// 上圆角
borderRadiusTop: number
// 下圆角
borderRadiusBottom: number
// 间隔
space: number
// 组件样式
style: ComponentStyle
// 宽
width: number
// 高
height: number
// 上
top: number
// 左
left: number
}
import logo from '@/assets/imgs/DiyEditorImges/组件图标-20.png'
export const plugins = [
'advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount',
];
export const toolbar = [
'code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen',
];
// 定义组件
export const component = {
id: 'Richtext',
name: '富文本',
icon: logo,
property: {
borderRadius: 0,
borderRadiusTop: 0,
borderRadiusBottom: 0,
space: 0,
richText: '哈哈',
width: 100,
height: 100,
top: 0,
left: 0,
style: {
bgType: 'color',
bgColor: '#fff',
marginBottom: 8
} as ComponentStyle
}
} as DiyComponent<RichtextProperty>

View File

@ -0,0 +1,202 @@
<template>
<div class="mobile-page">
<div class="box" :style="boxStyle" v-html="props.property.richText"></div>
</div>
</template>
<script setup lang="ts">
import { RichtextProperty } from './config'
defineOptions({ name: 'Richtext' })
const props = defineProps<{ property: RichtextProperty }>()
const boxStyle = computed(() => {
return [
{ 'border-radius': props.property.borderRadius ? props.property.borderRadius + 'px' : '0' },
{
background: `linear-gradient(${props.property.style.bgColor}, ${props.property.style.bgColor})`,
},
{ margin: props.property.style.marginTop + 'px' + ' ' + props.property.style.marginRight + 'px' + ' ' + props.property.style.marginBottom + 'px' + ' ' + props.property.style.marginLeft + 'px' + ' ' },
];
})
</script>
<style scoped lang="scss">
.mobile-page {
width: 100% !important;
min-height: 100px;
}
.box {
width: 100%;
min-height: 100px;
padding: 10px;
background: #f5f5f5;
}
</style>
<!-- <template>
<div class="mobile-page" v-if="configObj">
<div class="box" :style="boxStyle" v-html="richText"></div>
</div>
</template>
<script>
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEBCRMEB
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
import { mapState, mapMutations } from 'vuex';
export default {
name: 'z_ueditor',
cname: '富文本',
configName: 'c_ueditor_box',
icon: 't-icon-zujian-fuwenben',
type: 2, // 0 1 2
defaultName: 'richTextEditor', //
props: {
index: {
type: null,
default: -1,
},
num: {
type: null,
},
},
computed: {
...mapState('mobildConfig', ['defaultArray']),
//
boxStyle() {
return [
{ 'border-radius': this.configObj.bgStyle.val ? this.configObj.bgStyle.val + 'px' : '0' },
{
background: `linear-gradient(${this.configObj.bgColor.color[0].item}, ${this.configObj.bgColor.color[1].item})`,
},
{ margin: this.configObj.mbConfig.val + 'px' + ' ' + this.configObj.lrConfig.val + 'px' + ' ' + 0 },
];
},
},
watch: {
pageData: {
handler(nVal, oVal) {
this.setConfig(nVal);
},
deep: true,
},
num: {
handler(nVal, oVal) {
let data = this.$store.state.mobildConfig.defaultArray[nVal];
this.setConfig(data);
},
deep: true,
},
defaultArray: {
handler(nVal, oVal) {
let data = this.$store.state.mobildConfig.defaultArray[this.num];
this.setConfig(data);
},
deep: true,
},
},
data() {
return {
//
defaultConfig: {
name: 'richTextEditor',
timestamp: this.num,
setUp: {
tabVal: 0,
cname: '富文本',
},
//
bgColor: {
title: '背景颜色',
tabTitle: '颜色设置',
color: [
{
item: '#FFFFFF',
},
{
item: '#FFFFFF',
},
],
default: [
{
item: '#FFFFFF',
},
{
item: '#FFFFFF',
},
],
},
lrConfig: {
title: '左右边距',
tabTitle: '边距设置',
val: 12,
min: 0,
},
mbConfig: {
title: '页面间距',
val: 10,
min: 0,
},
bgStyle: {
tabTitle: '圆角设置',
title: '背景圆角',
name: 'bgStyle',
val: 0,
min: 0,
max: 30,
},
richText: {
tabTitle: '富文本内容',
val: '',
},
},
pageData: {},
richText: '',
configObj: null,
};
},
mounted() {
this.$nextTick(() => {
if (this.num) {
this.pageData = this.$store.state.mobildConfig.defaultArray[this.num];
this.setConfig(this.pageData);
}
});
},
methods: {
setConfig(data) {
if (!data) return;
if (data) {
this.configObj = data;
this.richText = data.richText.val;
}
},
},
};
</script>
<style scoped lang="scss">
.mobile-page ::v-deep video {
width: 100% !important;
}
.box {
min-height: 100px;
padding: 10px;
background: #f5f5f5;
::v-deep img {
max-width: 100%;
height: auto;
}
}
</style>
-->

View File

@ -0,0 +1,55 @@
<template>
<ComponentContainerProperty v-model="formData.style">
<!-- 表单 -->
<el-form label-width="80px" :model="formData" class="m-t-8px">
<!-- <el-text tag="p"> 富文本设置 </el-text> -->
<el-form-item label-width="0" prop="richText">
<Editor api-key="ooit62s6gekozi4cmblbsvdwhl34mxcgrkzu4wr8yqmsqxmw" v-model="formData.richText"
:init="tinymceConfig" initial-value="Welcome to TinyMCE!" />
</el-form-item>
<!-- <el-text type="info" size="small"> 每格尺寸187 * 187 </el-text> -->
<!-- <textarea :id="tinymceId" class="textarea" /> -->
</el-form>
</ComponentContainerProperty>
</template>
<script setup lang="ts">
import { useVModel } from '@vueuse/core'
import { RichtextProperty } from './config';
// import { MagicCubeProperty } from '@/components/DiyEditor/components/mobile/MagicCube/config'
// import { plugins, toolbar } from './config';
// import loadTinymce from '@/utils/loadTinymce';
// import { debounceNew } from '@/utils';
/** 富文本属性面板 */
defineOptions({ name: 'RichtextProperty' });
const props = defineProps<{ modelValue: RichtextProperty }>();
const emit = defineEmits(['update:modelValue']);
const formData = useVModel(props, 'modelValue', emit);
const tinymceConfig = {
toolbar_mode: 'sliding',
plugins: [
// Core editing features
'anchor', 'autolink', 'charmap', 'codesample', 'emoticons', 'image', 'link', 'lists', 'media', 'searchreplace', 'table', 'visualblocks', 'wordcount',
// Your account includes a free trial of TinyMCE premium features
// Try the most popular premium features until Apr 24, 2025:
'checklist', 'mediaembed', 'casechange', 'formatpainter', 'pageembed', 'a11ychecker', 'tinymcespellchecker', 'permanentpen', 'powerpaste', 'advtable', 'advcode', 'editimage', 'advtemplate', 'ai', 'mentions', 'tinycomments', 'tableofcontents', 'footnotes', 'mergetags', 'autocorrect', 'typography', 'inlinecss', 'markdown', 'importword', 'exportword', 'exportpdf'
],
toolbar: 'undo redo | blocks fontfamily fontsize | bold italic underline strikethrough | link image media table mergetags | addcomment showcomments | spellcheckdialog a11ycheck typography | align lineheight | checklist numlist bullist indent outdent | emoticons charmap | removeformat',
tinycomments_mode: 'embedded',
tinycomments_author: 'Author name',
mergetags_list: [
{ value: 'First.Name', title: 'First Name' },
{ value: 'Email', title: 'Email' },
],
ai_request: (request, respondWith) => respondWith.string(() => Promise.reject('See docs to implement AI Assistant')),
};
</script>
<style scoped lang="scss"></style>

View File

@ -76,7 +76,7 @@ export interface PageConfig {
components: PageComponent[]
}
// 页面组件只保留组件ID组件属性
export interface PageComponent extends Pick<DiyComponent<any>, 'id' | 'property'> {}
export interface PageComponent extends Pick<DiyComponent<any>, 'id' | 'property'> { }
// 属性表单监听
export function usePropertyForm<T>(modelValue: T, emit: Function): { formData: Ref<T> } {
@ -119,7 +119,7 @@ export const PAGE_LIBS = [
'MenuList',
'Popover',
'FloatingActionButton',
"MenuGridTow"
"MenuGridTow"
]
},
{
@ -128,11 +128,13 @@ export const PAGE_LIBS = [
components: [
'ImageBar',
'Carousel',
'CarouselLong',
'TitleBar',
'VideoPlayer',
'Divider',
'MagicCube',
'HotZone'
'HotZone',
'Richtext'
]
},
{ name: '商品组件', extended: true, components: ['ProductCard', 'ProductList'] },

View File

@ -1,76 +0,0 @@
<template>
<Dialog title="审核" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="通过凭证" prop="voucher">
<!-- <el-input v-model="formData.auditReason" type="textarea" placeholder="请输入驳回原因" />-->
<UploadImg v-model="formData.voucher" :max-count="1" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as BrokerageWithdrawApi from '@/api/mall/trade/brokerage/withdraw'
import {Upload} from "@element-plus/icons-vue";
import {approveBrokerageWithdrawClosing} from "@/api/mall/trade/brokerage/withdraw";
const message = useMessage() //
const dialogVisible = ref(false) //
const formLoading = ref(false) // 12
const formData = ref({
id: undefined,
voucher: undefined
})
const formRules = reactive({
voucher: [{ required: true, message: '凭证不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (id: number) => {
dialogVisible.value = true
resetForm()
formData.value.id = id
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
if (!formRef) return
const valid = await formRef.value.validate()
if (!valid) return
//
formLoading.value = true
try {
const data = formData.value as unknown as BrokerageWithdrawApi.BrokerageWithdrawVO
await BrokerageWithdrawApi.approveBrokerageWithdrawClosing(data)
message.success('通过成功')
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
voucher: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -1,180 +0,0 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="代理商余额:" prop="agentPrice">
<span> {{fenToYuan(formData.agentPrice) || '-'}} </span>
<!-- <el-input v-model="formData.agentPrice" placeholder="请输入代理商id" :disabled="true"/>-->
</el-form-item>
<el-form-item label="可提现金额:" prop="brokeragePrice">
<span> {{fenToYuan(formData.brokeragePrice) || '-'}} </span>
<!-- <el-input v-model="formData.brokeragePrice" placeholder="请输入可提现金额" :disabled= "true"/>-->
</el-form-item>
<el-form-item label="冻结金额:" prop="frozenPrice">
<span> {{fenToYuan(formData.frozenPrice) || '-'}} </span>
<!-- <el-input v-model="formData.frozenPrice" placeholder="请输入冻结金额" :disabled= "true"/>-->
</el-form-item>
<el-form-item label="结算类型:" prop="closingType">
<el-radio-group v-model="formData.closingType">
<el-radio :value="1">钱包</el-radio>
<el-radio :value="2">银行</el-radio>
<el-radio :value="3">微信</el-radio>
<el-radio :value="4">支付宝</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="真实姓名:" prop="realName">
<span>{{(formData.realName) || '-'}} </span>
</el-form-item>
<el-form-item v-if="formData.closingType === 3" label="微信账号:" prop="wechatAccount">
<span>{{(formData.wechatAccount) || '-'}} </span>
</el-form-item>
<el-form-item v-if="formData.closingType === 3" label="微信收款码:" prop="wechatAccountQrCodeUrl">
<UploadImg v-model="formData.wechatAccountQrCodeUrl" :disabled="true"/>
</el-form-item>
<el-form-item v-if="formData.closingType === 4" label="支付宝账号:" prop="alipayAccount">
<span>{{(formData.alipayAccount || '-')}} </span>
</el-form-item>
<el-form-item v-if="formData.closingType === 4" label="支付宝收款码:" prop="alipayAccountQrCodeUrl">
<UploadImg v-model="formData.alipayAccountQrCodeUrl" :disabled="true"/>
</el-form-item>
<el-form-item v-if="formData.closingType === 2" label="开户银行:" prop="bankName">
<span>{{(formData.bankName) || '-'}} </span>
</el-form-item>
<el-form-item v-if="formData.closingType === 2" label="银行账号:" prop="bankCardNo">
<span>{{(formData.bankCardNo) || '-'}} </span>
</el-form-item>
<el-form-item label="申请金额:" prop="supplyPrice">
<el-input-number v-model="formData.supplyPrice" :min="1" :precision="2" :step="0.01"/>
</el-form-item>
<el-form-item label="备注:" prop="remark">
<el-input type="textarea" v-model="formData.remark" placeholder="请输入平台备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as BrokerageWithdrawApi from '@/api/mall/trade/brokerage/withdraw'
import { fenToYuan, jsonParse } from '@/utils'
/** 结算记录 表单 */
defineOptions({ name: 'ClosingRecordForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
agentPrice: undefined,
brokeragePrice: undefined,
frozenPrice: undefined,
closingType: undefined,
wechatAccountQrCodeUrl: undefined,
aliyAccountQrCodeUrl: undefined,
realName: undefined,
accountNo: undefined,
bankName: undefined,
bankCardNo: undefined,
supplyPrice: undefined,
remark: undefined,
wechatAccount: undefined,
aliyAccount: undefined,
agentId: undefined,
agentName: undefined,
})
const formRules = reactive({
closingType: [{ required: true, message: '结算类型不能为空', trigger: 'change' }],
supplyPrice: [{ required: true, message: '申请金额不能为空', trigger: 'change' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
formData.value = await BrokerageWithdrawApi.getBrokerageSupplyInfo()
formData.value.closingType = 1
formData.value.supplyPrice = 1
console.log("form:",formData.value)
/*// 修改时设置数据
if (id) {
formLoading.value = true
try {
} finally {
formLoading.value = false
}
}*/
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as BrokerageWithdrawApi.withDrawSupplyVO
if (formType.value === 'create') {
const submitData = JSON.parse(JSON.stringify(data))
submitData.supplyPrice = submitData.supplyPrice * 100
console.log("formData:",data)
await BrokerageWithdrawApi.createWithDraw(submitData)
message.success(t('common.createSuccess'))
}
/* else {
await ClosingRecordApi.updateClosingRecord(data)
message.success(t('common.updateSuccess'))
}*/
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
agentPrice: undefined,
brokeragePrice: undefined,
frozenPrice: undefined,
closingType: undefined,
wechatAccountQrCodeUrl: undefined,
aliyAccountQrCodeUrl: undefined,
realName: undefined,
accountNo: undefined,
bankName: undefined,
bankCardNo: undefined,
supplyPrice: undefined,
remark: undefined,
wechatAccount: undefined,
aliyAccount: undefined,
agentId: undefined,
agentName: undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -1,318 +0,0 @@
<template>
<doc-alert title="【交易】分销返佣" url="https://doc.iocoder.cn/mall/trade-brokerage/" />
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="用户编号" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入用户编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="提现类型" prop="type">
<el-select
v-model="queryParams.type"
placeholder="请选择提现类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_WITHDRAW_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="账号" prop="accountNo">
<el-input
v-model="queryParams.accountNo"
placeholder="请输入账号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="提现银行" prop="bankName">
<el-select
v-model="queryParams.bankName"
placeholder="请选择提现银行"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.BROKERAGE_BANK_NAME)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.BROKERAGE_WITHDRAW_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="申请时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
@click="openClosingForm('create')"
v-hasPermi="['trade:brokerage-withdraw:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 申请结算
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['trade:brokerage-withdraw:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="编号" align="left" prop="id" min-width="60px" />
<el-table-column label="用户信息" align="left" min-width="120px">
<template #default="scope">
<div>编号{{ scope.row.userId }}</div>
<div>昵称{{ scope.row.userNickname }}</div>
<div>代理商名称{{ scope.row.agentName }}</div>
</template>
</el-table-column>
<el-table-column label="提现金额" align="left" prop="price" min-width="80px">
<template #default="scope">
<div> {{ fenToYuan(scope.row.price) }}</div>
<div>手续费{{ fenToYuan(scope.row.feePrice) }}</div>
</template>
</el-table-column>
<el-table-column label="提现方式" align="left" prop="type" min-width="120px">
<template #default="scope">
<div v-if="scope.row.type === BrokerageWithdrawTypeEnum.WALLET.type"> 余额 </div>
<div v-else>
{{ getDictLabel(DICT_TYPE.BROKERAGE_WITHDRAW_TYPE, scope.row.type) }}
<span v-if="scope.row.accountNo">账号{{ scope.row.accountNo }}</span>
</div>
<template v-if="scope.row.type === BrokerageWithdrawTypeEnum.BANK.type">
<div>真实姓名{{ scope.row.name }}</div>
<div>
银行名称
<dict-tag :type="DICT_TYPE.BROKERAGE_BANK_NAME" :value="scope.row.bankName" />
</div>
<div>开户地址{{ scope.row.bankAddress }}</div>
</template>
</template>
</el-table-column>
<el-table-column label="收款码" align="left" prop="accountQrCodeUrl" min-width="70px">
<template #default="scope">
<el-image
v-if="scope.row.accountQrCodeUrl"
:src="scope.row.accountQrCodeUrl"
class="h-40px w-40px"
:preview-src-list="[scope.row.accountQrCodeUrl]"
preview-teleported
/>
<span v-else></span>
</template>
</el-table-column>
<el-table-column
label="申请时间"
align="left"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="备注" align="left" prop="remark" />
<el-table-column label="状态" align="left" prop="status" min-width="120px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BROKERAGE_WITHDRAW_STATUS" :value="scope.row.status" />
<div v-if="scope.row.auditTime" class="text-xs">
时间{{ formatDate(scope.row.auditTime) }}
</div>
<div v-if="scope.row.auditReason" class="text-xs">
原因{{ scope.row.auditReason }}
</div>
</template>
</el-table-column>
<el-table-column label="操作" align="left" width="110px" fixed="right">
<template #default="scope">
<template v-if="scope.row.status === BrokerageWithdrawStatusEnum.AUDITING.status">
<el-button
link
type="primary"
@click="openApproveForm(scope.row.id)"
v-hasPermi="['trade:brokerage-withdraw:audit']"
>
通过
</el-button>
<el-button
link
type="danger"
@click="openForm(scope.row.id)"
v-hasPermi="['trade:brokerage-withdraw:audit']"
>
驳回
</el-button>
</template>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<BrokerageWithdrawRejectForm ref="formRef" @success="getList" />
<ClosingRecordForm ref="closingFormRef" @success="getList" />
<ClosingRecordAgreeForm ref="approveFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import * as BrokerageWithdrawApi from '@/api/mall/trade/brokerage/withdraw'
import BrokerageWithdrawRejectForm from '@/views/mall/trade/brokerage/withdraw/BrokerageWithdrawRejectForm.vue'
import { BrokerageWithdrawStatusEnum, BrokerageWithdrawTypeEnum } from '@/utils/constants'
import ClosingRecordForm from "@/views/agent/closingrecord/ClosingRecordForm.vue";
import ClosingRecordAgreeForm from "@/views/agent/closingrecord/ClosingRecordAgreeForm.vue";
import { fenToYuanFormat } from '@/utils/formatter'
import { fenToYuan } from '@/utils'
import download from "@/utils/download";
defineOptions({ name: 'BrokerageWithdraw' })
const { t } = useI18n() //
const exportLoading = ref(false) //
const message = useMessage() //
const loading = ref(true) //
const total = ref(0) //
const list = ref([]) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: null,
type: null,
name: null,
accountNo: null,
bankName: null,
status: null,
auditReason: null,
auditTime: [],
remark: null,
createTime: []
})
const queryFormRef = ref() //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await BrokerageWithdrawApi.getBrokerageWithdrawPage(queryParams)
list.value = data.list
total.value = data.total
console.log("list:",list)
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (id: number) => {
formRef.value.open(id)
}
/** 添加/修改操作 */
const closingFormRef = ref()
const openClosingForm = (type: string,id?: number) => {
closingFormRef.value.open(type,id)
}
/** 添加/修改操作 */
const approveFormRef = ref()
const openApproveForm = (id: number) => {
approveFormRef.value.open(id)
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await BrokerageWithdrawApi.exportBrokerageWithDraw(queryParams)
download.excel(data, '结算管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 审核通过 */
const handleApprove = async (id: number) => {
try {
loading.value = true
await message.confirm('确定要审核通过吗?')
await BrokerageWithdrawApi.approveBrokerageWithdraw(id)
await message.success(t('common.success'))
await getList()
} finally {
loading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -1,118 +0,0 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="订单id" prop="orderId">
<el-input v-model="formData.orderId" placeholder="请输入订单id" />
</el-form-item>
<el-form-item label="订单支付金额,单位:分" prop="price">
<el-input v-model="formData.price" placeholder="请输入订单支付金额,单位:分" />
</el-form-item>
<el-form-item label="分红金额,单位: 分" prop="bonus">
<el-input v-model="formData.bonus" placeholder="请输入分红金额,单位: 分" />
</el-form-item>
<el-form-item label="代理商id" prop="agentId">
<el-input v-model="formData.agentId" placeholder="请输入代理商id" />
</el-form-item>
<el-form-item label="支付状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { BonusApi, BonusVO } from '@/api/agent/bonus'
/** 代理商分红明细 表单 */
defineOptions({ name: 'BonusForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
orderId: undefined,
price: undefined,
bonus: undefined,
agentId: undefined,
status: undefined,
})
const formRules = reactive({
orderId: [{ required: true, message: '订单id不能为空', trigger: 'blur' }],
price: [{ required: true, message: '订单支付金额,单位:分不能为空', trigger: 'blur' }],
bonus: [{ required: true, message: '分红金额,单位: 分不能为空', trigger: 'blur' }],
agentId: [{ required: true, message: '代理商id不能为空', trigger: 'blur' }],
status: [{ required: true, message: '支付状态不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await BonusApi.getBonus(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as BonusVO
if (formType.value === 'create') {
await BonusApi.createBonus(data)
message.success(t('common.createSuccess'))
} else {
await BonusApi.updateBonus(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
orderId: undefined,
price: undefined,
bonus: undefined,
agentId: undefined,
status: undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -206,8 +206,7 @@
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<BonusForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
@ -215,7 +214,6 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { AgentOrderApi, AgentOrderVO } from '@/api/agent/order'
import BonusForm from './BonusForm.vue'
import {InfoApi} from "@/api/agent/info";
import { fenToYuanFormat } from '@/utils/formatter'
import {useRouter,useRoute} from "vue-router";

View File

@ -87,7 +87,7 @@
// (page: DiyPageApi.DiyPageVO) => page.name === templateItems[1].name
// )
currentFormData.value = formData.value!.pages[selectedTemplateItem.value]
console.log(selectedTemplateItem.value, 'selectedTemplateItem.value11111111111111')
// console.log(selectedTemplateItem.value, 'selectedTemplateItem.value11111111111111')
}
//

View File

@ -0,0 +1,137 @@
<template>
<div class="main">
<div class="mainTop">
<div>商品分类</div>
<div class="right">
<div class="save" @click="save">保存</div>
<div class="cz" @click="cz">重置</div>
</div>
</div>
<div class="mainBottom">
<div class='item' :class="currItem == 1 ? 'on' : ''" @click="clickItem(1)">
<img class="img"
src="https://zysc.fjptzykj.com/admin-api/infra/file/25/get/9349d776503051646314323aced460314415a04c943dc220e9e5b86362f864dd.png" />
<div class="text">样式1</div>
</div>
<!-- <div class='item' :class="currItem == 2 ? 'on' : ''" @click="clickItem(2)">
<img class="img"
src="https://zysc.fjptzykj.com/admin-api/infra/file/25/get/909ef630cff7cdc957962ae782ee9a882c86c35732140b1c9e013341fa559126.jpg" />
<div class="text">样式2</div>
</div> -->
</div>
</div>
</template>
<script setup lang="ts">
// TODO @ decorate index.vue
import * as DiyTemplateApi from '@/api/mall/promotion/diy/template'
import { useTagsdivStore } from '@/store/modules/tagsdiv'
import { DiyComponentLibrary, PAGE_LIBS } from '@/components/DiyEditor/util' // DIY DiyEditor
import { toNumber } from 'lodash-es'
const message = useMessage() //
const currItem = ref();
function clickItem(val) {
currItem.value = val;
}
function cz(val) {
currItem.value = 1;
}
function save() {
setProjuctClass(currItem.value);
// console.log("")
}
//
const setProjuctClass = async (id) => {
// const res = await DiyTemplateApi.setDiyProjuctClass(id);
// console.log(res, "sssss");
// if (res) {
message.success('保存成功')
// }
}
//
const getProjuctClass = async () => {
const res = await DiyTemplateApi.getDiyProjuctClass();
currItem.value = res
}
getProjuctClass()
</script>
<style lang="scss" scoped>
.main {
display: flex;
flex-wrap: wrap;
.mainTop {
width: 100%;
margin: 10px 10px;
background: white;
padding: 10px 20px;
font-weight: 700;
display: flex;
justify-content: space-between;
align-items: center;
.right {
display: flex;
div {
padding: 5px 15px;
font-weight: 400;
font-size: 14px;
}
.save {
background: #0256FF;
margin-right: 10px;
color: white;
cursor: pointer;
}
.cz {
border: 1px solid #cccccc;
cursor: pointer;
}
}
}
.mainBottom {
width: 100%;
margin: 10px 10px;
background: white;
padding: 30px 30px;
display: flex;
.item {
margin-right: 20px;
text-align: center;
border-radius: 12px;
cursor: pointer;
&.on {
.text {
color: #0256ff;
}
.img {
border: 2px solid #0256ff;
}
}
.img {
width: 260px;
border-radius: 12px;
border: 2px solid white;
}
.text {
margin-top: 10px;
}
}
}
}
</style>

View File

@ -61,7 +61,7 @@ public class agentOrderController {
@Operation(summary = "获得代理商交易订单分页")
@PreAuthorize("@ss.hasPermission('agent:order:query')")
public CommonResult<PageResult<BrokerageRecordRespDTO>> getOrderPage(BrokerageRecordPageReqDTO reqVO) {
List<AdminUserRespDTO> userList = adminUserApi.getAdminUserByCode("super_admin");
/* List<AdminUserRespDTO> userList = adminUserApi.getAdminUserByCode("super_admin");
List<AdminUserRespDTO> users = adminUserApi.getAdminUserByCode("dfhg");
Long userId = getLoginUserId();
if(!userList.get(0).getId().equals(userId) && !users.get(0).getId().equals(userId)){
@ -72,7 +72,7 @@ public class agentOrderController {
else{
return success(PageResult.empty());
}
}
}*/
// 查询订单
List<BrokerageRecordRespDTO> list = brokerageRecordApi.getBrokerageRecordPage(reqVO);
PageResult<BrokerageRecordRespDTO> pageResult = new PageResult<BrokerageRecordRespDTO>(list, Long.valueOf(list.size()));
@ -101,7 +101,7 @@ public class agentOrderController {
public void exportInfoExcel(@Valid BrokerageRecordPageReqDTO reqVO,
HttpServletResponse response) throws IOException {
reqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AdminUserRespDTO> userList = adminUserApi.getAdminUserByCode("super_admin");
/*List<AdminUserRespDTO> userList = adminUserApi.getAdminUserByCode("super_admin");
List<AdminUserRespDTO> users = adminUserApi.getAdminUserByCode("dfhg");
Long userId = getLoginUserId();
AgentInfoDO agentInfoDO = new AgentInfoDO();
@ -110,7 +110,7 @@ public class agentOrderController {
if(agentInfoDO != null){
reqVO.setAgentId(agentInfoDO.getId());
}
}
}*/
// 查询订单
List<BrokerageRecordRespDTO> list = brokerageRecordApi.getBrokerageRecordPage(reqVO);
String productInfo = "";
@ -126,9 +126,6 @@ public class agentOrderController {
brokerageRecordRespDTO.setProductInfo(productInfo);
brokerageRecordRespDTO.setBelong(belong);
}
if(!userList.get(0).getId().equals(userId) && !users.get(0).getId().equals(userId) && agentInfoDO == null){
list = new ArrayList<>();
}
// 导出 Excel
ExcelUtils.write(response, "分销订单.xls", "数据", BrokerageRecordRespDTO.class
,list);