This commit is contained in:
学习很差啦
2023-04-07 10:12:01 +08:00
32 changed files with 469 additions and 301 deletions

View File

@@ -139,7 +139,7 @@ export default {
"Button",
{
props: {
type: "success",
type: "primary",
size: "small",
},
style: {

View File

@@ -212,6 +212,7 @@
filterStatus (status) { // 过滤订单状态
const arr = [
{status: 'WAIT_BILL', title: '待结算'},
{status: 'NO_COMPLETED', title: '未完成'},
{status: 'WAIT_CASH', title: '待提现'},
{status: 'COMPLETE_CASH', title: '提现完成'},
{status: 'CANCEL', title: '订单取消'},
@@ -229,6 +230,7 @@
{status: 'WAIT_CASH', color: 'orange'},
{status: 'COMPLETE_CASH', color: 'green'},
{status: 'CANCEL', color: 'red'},
{status: 'NO_COMPLETED', color: 'red'},
{status: 'REFUND', color: 'magenta'},
]
for (let i=0;i<arr.length;i++) {

View File

@@ -1,98 +1,44 @@
<template>
<div class="search">
<Card>
<Form
@keydown.enter.native="handleSearch"
ref="searchForm"
:model="searchForm"
inline
:label-width="70"
class="search-form"
>
<Form @keydown.enter.native="handleSearch" ref="searchForm" :model="searchForm" inline :label-width="70"
class="search-form">
<Form-item label="规格名称" prop="specName">
<Input
type="text"
v-model="searchForm.specName"
placeholder="请输入规格名称"
clearable
style="width: 200px"
/>
<Input type="text" v-model="searchForm.specName" placeholder="请输入规格名称" clearable style="width: 200px" />
</Form-item>
<Button @click="handleSearch" type="primary" class="search-btn"
>搜索</Button
>
<Button @click="handleSearch" type="primary" class="search-btn">搜索</Button>
</Form>
<Row class="operation padding-row">
<Button @click="add" type="primary">添加</Button>
<Button @click="delAll">批量删除</Button>
</Row>
<Table
:loading="loading"
border
:columns="columns"
:data="data"
ref="table"
sortable="custom"
@on-sort-change="changeSort"
@on-selection-change="changeSelect"
>
<Table :loading="loading" border :columns="columns" :data="data" ref="table" sortable="custom"
@on-sort-change="changeSort" @on-selection-change="changeSelect">
</Table>
<Row type="flex" justify="end" class="mt_10">
<Page
:current="searchForm.pageNumber"
:total="total"
:page-size="searchForm.pageSize"
@on-change="changePage"
@on-page-size-change="changePageSize"
:page-size-opts="[10, 20, 50]"
size="small"
show-total
show-elevator
show-sizer
></Page>
<Page :current="searchForm.pageNumber" :total="total" :page-size="searchForm.pageSize" @on-change="changePage"
@on-page-size-change="changePageSize" :page-size-opts="[10, 20, 50]" size="small" show-total show-elevator
show-sizer></Page>
</Row>
</Card>
<Modal
:title="modalTitle"
v-model="modalVisible"
:mask-closable="false"
:width="500"
>
<Modal :title="modalTitle" v-model="modalVisible" :mask-closable="false" :width="500">
<Form ref="form" :model="form" :label-width="100" :rules="formValidate">
<FormItem label="规格名称" prop="specName">
<Input
v-model="form.specName"
maxlength="30"
clearable
style="width: 100%"
/>
<Input v-model="form.specName" maxlength="30" clearable style="width: 100%" />
</FormItem>
{{ form }}
<FormItem label="规格值" prop="specValue">
<Select
v-model="form.specValue"
placeholder="输入后回车添加"
multiple
filterable
allow-create
:popper-append-to-body="false"
popper-class="spec-values-popper"
style="width: 100%; text-align: left; margin-right: 10px"
>
<Option
v-for="item in specValue"
:value="item"
:label="item"
:key="item"
>
<Select v-model="form.specValue" placeholder="输入后回车添加" multiple filterable allow-create
:popper-append-to-body="false" popper-class="spec-values-popper"
style="width: 100%; text-align: left; margin-right: 10px">
<Option v-for="item in specValue" :value="item" :label="item" :key="item">
</Option>
</Select>
</FormItem>
</Form>
<div slot="footer">
<Button type="text" @click="modalVisible = false">取消</Button>
<Button type="primary" :loading="submitLoading" @click="saveSpec"
>提交</Button
>
<Button type="primary" :loading="submitLoading" @click="saveSpec">提交</Button>
</div>
</Modal>
</div>
@@ -310,6 +256,7 @@ export default {
},
//弹出编辑框
edit(v) {
console.log(v);
this.modalType = 1;
this.modalTitle = "编辑";
// 转换null为""
@@ -319,18 +266,19 @@ export default {
}
}
let localVal = v.specValue;
console.log(localVal.split(","))
this.form.specName = v.specName;
this.form.id = v.id;
this.form.specValue = v.specValue;
this.$nextTick(() => {
this.$set(this.form, 'specValue', localVal.split(","))
})
if (localVal && localVal.indexOf("," > 0)) {
this.form.specValue = localVal.split(",");
this.specValue = this.form.specValue;
this.$set(this, "specValue", this.form.specValue);
} else {
this.specValue = [];
}
console.log("form.specValue", this.form);
this.modalVisible = true;
},
// 删除规格

View File

@@ -337,6 +337,7 @@ export default {
// 实例化订单图表
async initOrderChartList(name) {
this.orderChart ? this.orderChart.clear() : ''
const res = await API_Goods.getOrderChart(this.orderParams);
if (res.success) {
this.chartList = res.result;
@@ -446,6 +447,7 @@ export default {
// 浏览量
async getPvChart() {
this.pvChart ? this.pvChart.clear() : ''
API_Member.getStatisticsList(this.params).then((res) => {
if (res.result) {
this.data = res.result;
@@ -464,6 +466,7 @@ export default {
},
// 实例化会员流量图表
async initHistoryMemberChartList() {
this.historyMemberChart ? this.historyMemberChart.clear() : ''
const res = await API_Member.historyMemberChartList();
if (res.success) {
this.chartList = res.result;

View File

@@ -28,18 +28,16 @@
</div>
<div slot="footer" style="text-align: right">
<Button v-if="tab === 'WECHAT'" type="success" size="large" @click="wechatFormDataEdit">保存</Button>
<Button v-if="tab === 'WECHAT'" type="primary" @click="wechatFormDataEdit">保存</Button>
<Button v-else type="success" size="large" @click="wechatMPFormDataEdit">保存</Button>
<Button v-else type="primary" @click="wechatMPFormDataEdit">保存</Button>
</div>
</Modal>
<Card>
<Tabs @on-click="tabPaneChange" v-model="tab">
<TabPane label="微信消息" name="WECHAT">
<div class="search">
<Card>
<Row class="operation mt_10">
<Button @click="weChatSync" type="primary">同步微信消息</Button>
</Row>
@@ -61,14 +59,11 @@
size="small"
></Page>
</Row>
</Card>
</div>
</TabPane>
<TabPane label="微信小程序订阅消息" name="WECHATMP">
<div class="search">
<Card>
<Row class="operation mt_10">
<Button @click="weChatSync('mp')" type="primary">同步微信小程序订阅消息</Button>
</Row>
@@ -91,10 +86,10 @@
size="small"
></Page>
</Row>
</Card>
</div>
</TabPane>
</Tabs>
</Card>
</div>

View File

@@ -67,6 +67,7 @@
<Option value="COMPLETED">已完成</Option>
<Option value="TAKE">待核验</Option>
<Option value="CANCELLED">已取消</Option>
<Option value="STAY_PICKED_UP">待自提</Option>
</Select>
</Form-item>
<Button
@@ -266,6 +267,10 @@ export default {
return h("div", [
h("tag", { props: { color: "geekblue" } }, "待发货"),
]);
} else if (params.row.orderStatus == "STAY_PICKED_UP") {
return h("div", [
h("tag", { props: { color: "geekblue" } }, "待自提"),
]);
} else if (params.row.orderStatus == "DELIVERED") {
return h("div", [
h("tag", { props: { color: "cyan" } }, "已发货"),

View File

@@ -2,10 +2,15 @@
<div class="box">
<Row class="operation">
<Col span="12">
<DatePicker @on-change="search" show-week-numbers type="date" placement="bottom-end" placeholder="选择查看日期"
style="width: 200px"></DatePicker>
<DatePicker
:options="options"
@on-change="search"
type="date"
placement="bottom-end"
placeholder="选择查看日期"
style="width: 200px"
v-model="yestDate"
></DatePicker>
</Col>
</Row>
<Row>
@@ -16,16 +21,15 @@
</p>
</Row>
<div id="container"></div>
</div>
</template>
<script>
import {Chart} from "@antv/g2";
import {getHotWordsHistory} from "@/api/index";
import { Chart } from "@antv/g2";
import { getHotWordsHistory } from "@/api/index";
import affixTime from "@/components/affix-time";
import {Message} from "view-design";
import { Message } from "view-design";
export default {
components: {
@@ -33,37 +37,54 @@ export default {
},
data() {
return {
yestDate:new Date(new Date().getTime() - 24 * 60 * 60 * 1000).toString(),
yestDate:this.$options.filters.unixToDate(
(new Date().getTime() / 1000) - (24 * 60 * 60),
"yyyy年MM月dd日"
),
params: {
date:this.$options.filters.unixToDate(new Date().getTime() / 1000,'yyyy-MM-dd')
date: this.$options.filters.unixToDate(
(new Date().getTime() / 1000) - (24 * 60 * 60),
"yyyy-MM-dd"
),
},
hotWordsChart: "", //图表
hotWordsData: [] //数据
hotWordsData: [], //数据
options: {
disabledDate: (date) => {
if (this.endMonth) {
let endDate = this.getDate(this.endMonth);
return (date && date > endDate) || date > new Date();
} else {
return date && date > new Date();
}
},
},
};
},
computed: {},
methods: {
clickBreadcrumb(val) {
this.params = {...this.params, ...val}
this.params = { ...this.params, ...val };
},
// 初始化图表
async search(val) {
val ? this.params.date = val : ''
console.log(val)
val ? (this.params.date = val) : "";
const res = await getHotWordsHistory(this.params);
if (res.success) {
this.hotWordsData = res.result;
this.hotWordsChart.data(this.hotWordsData)
this.hotWordsChart.data(this.hotWordsData);
this.hotWordsChart.render();
if (!this.hotWordsData) {
Message.error("暂无数据");
}
}
},
handleClickSearch() {
},
handleClickSearch() {},
init() {
let chart = this.hotWordsChart
let chart = this.hotWordsChart;
chart = new Chart({
container: "container",
autoFit: true,
@@ -84,11 +105,11 @@ export default {
chart.tooltip({
showMarkers: false,
});
chart.interval().position("keywords*score");
chart.interval().position("keywords*score").color("#f59b99");
chart.interaction("element-active");
this.hotWordsChart = chart;
this.search();
}
},
},
mounted() {
this.init();
@@ -99,10 +120,12 @@ export default {
<style lang="scss" scoped>
.affix-time {
padding-left: 15px;
}
.box {
min-height: 400px;
margin-left: 50px;
}
</style>

View File

@@ -3,7 +3,7 @@
<div class="affix-time">
<Affix :offset-top="100">
<div class="flex affix-box">
<affixTime :closeShop="true" @selected="clickBreadcrumb"/>
<affixTime :closeShop="true" @selected="clickBreadcrumb" />
<InputNumber
placeholder="展示前N"
@@ -22,8 +22,8 @@
</template>
<script>
import {Chart} from "@antv/g2";
import {getHotWordsStatistics} from "@/api/index";
import { Chart } from "@antv/g2";
import { getHotWordsStatistics } from "@/api/index";
import affixTime from "@/components/affix-time";
export default {
@@ -37,9 +37,9 @@ export default {
searchType: "LAST_SEVEN",
year: "",
month: "",
top: 50
top: 50,
},
columns:[
columns: [
{
title: "热词名称",
key: "keywords",
@@ -49,53 +49,86 @@ export default {
key: "score",
},
],
hotWordsChart:"", //图表
hotWordsData:[] //数据
hotWordsChart: "", //图表
hotWordsData: [], //数据
orderChart: "",
};
},
computed: {},
watch: {
params: {
handler(val) {
this.search();
},
deep: true,
immediate: true,
},
year(val) {
this.params.year = new Date(val).getFullYear();
},
},
methods: {
clickBreadcrumb(val) {
this.params = {...this.params, ...val}
this.params = { ...this.params, ...val };
},
// 初始化图表
async search() {
const res = await getHotWordsStatistics(this.params);
if (res.success) {
this.hotWordsData=res.result;
this.hotWordsChart.data(this.hotWordsData)
this.hotWordsData = res.result;
if (!this.hotWordsChart) {
this.hotWordsChart = new Chart({
container: "container",
autoFit: true,
height: 500,
padding: [50, 20, 50, 20],
});
}
this.init();
}
},
handleClickSearch() {},
init() {
if (this.hotWordsChart) {
this.hotWordsChart.data(this.hotWordsData);
this.hotWordsChart.scale("score", {
alias: "搜索次数",
});
this.hotWordsChart.axis("keywords", {
tickLine: {
alignTick: false,
},
});
this.hotWordsChart.axis("score", false);
this.hotWordsChart.tooltip({
showMarkers: false,
});
this.hotWordsChart
.interval()
.position("keywords*score")
.color("#f59b99");
this.hotWordsChart.interaction("element-active");
// 添加文本标注
// this.hotWordsData.forEach((item) => {
// this.hotWordsChart
// .annotation()
// .text({
// position: [item.keywords, item.score],
// content: item.score,
// style: {
// textAlign: "center",
// },
// offsetY: -30,
// })
// });
this.hotWordsChart.render();
}
},
handleClickSearch() {
},
init(){
let chart = this.hotWordsChart
chart = new Chart({
container: "container",
autoFit: true,
height: 500,
padding: [50, 20, 50, 20],
});
chart.scale("score", {
alias: "搜索次数",
});
chart.axis("keywords", {
tickLine: {
alignTick: false,
},
});
chart.axis("score", false);
chart.tooltip({
showMarkers: false,
});
chart.interval().position("keywords*score");
chart.interaction("element-active");
this.hotWordsChart=chart;
this.search();
}
},
mounted() {
this.init();
@@ -107,5 +140,4 @@ export default {
.affix-time {
padding-left: 15px;
}
</style>

View File

@@ -3,6 +3,7 @@
<Row>
<Col span="24">
<Card class="article-detail">
<Alert>隐私协议在移动端中 设置->关于我们->对应的文章展示</Alert>
<Table :loading="loading" border :columns="columns" :data="data" ref="table">
</Table>
</Card>

View File

@@ -180,6 +180,7 @@ export default {
},
// 初始化数据
init() {
this.orderChart ? this.orderChart.clear() : ''
API_Member.getMemberStatistics(this.params).then((res) => {
if (res.result) {
res.result.forEach((item) => {

View File

@@ -586,6 +586,7 @@ export default {
},
// 实例化订单图表
async initOrderChartList(name) {
this.orderChart ? this.orderChart.clear() : ''
const res = await API_Goods.getOrderChart(this.orderParams);
if (res.success) {
this.chartList = res.result;

View File

@@ -185,6 +185,7 @@ export default {
},
// 初始化数据
init() {
this.orderChart ? this.orderChart.clear() : ''
API_Member.getStatisticsList(this.params).then((res) => {
if (res.result) {
this.data = res.result;

View File

@@ -47,16 +47,16 @@
openTip ? "关闭提示" : "开启提示"
}}</Button>
</Row>
<Row v-show="openTip">
<Alert show-icon>
<span>展示详细内容</span>
<Icon type="ios-bulb-outline" slot="icon"></Icon>
<i-switch size="large" v-model="showDev">
<span slot="open">开发</span>
<span slot="close">普通</span>
</i-switch>
</Alert>
</Row>
<div v-show="openTip">
<Alert show-icon>
<span>展示详细内容</span>
<Icon type="ios-bulb-outline" slot="icon"></Icon>
<i-switch class="switch" size="large" v-model="showDev">
<span slot="open">开发</span>
<span slot="close">普通</span>
</i-switch>
</Alert>
</div>
<Table
v-if="showDev"
@@ -323,3 +323,8 @@ export default {
},
};
</script>
<style lang="scss" scoped>
.switch{
margin-left: 20px;
}
</style>

View File

@@ -49,7 +49,7 @@
<script>
import { setSetting } from "@/api/index";
import { handleSubmit } from "../setting/validate";
import { getPaymentSupportForm } from "@/api/setting";
export default {
data() {
return {

View File

@@ -3,7 +3,8 @@
<Form ref="formValidate" :label-width="150" label-position="right" :model="formValidate" :rules="ruleValidate">
<FormItem label="站点名称" prop="siteName">
<Input v-model="formValidate.siteName" />
<Input style="width:200px;" v-model="formValidate.siteName" />
<span class="desc">配置买家端站点名称</span>
</FormItem>
<FormItem label="icp" prop="icp">
@@ -16,6 +17,7 @@
<img v-if="formValidate.domainLogo" class="img" :src="formValidate.domainLogo" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('domainLogo')">选择图片</Button>
<span class="desc">后台管理左上角logo展示 176</span>
</div>
</FormItem>
<FormItem label="后台Icon" prop="domainIcon">
@@ -24,6 +26,7 @@
<img v-if="formValidate.domainIcon" class="img" :src="formValidate.domainIcon" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('domainIcon')">选择图片</Button>
<span class="desc">后台管理网站icon展示 11</span>
</div>
</FormItem>
<FormItem label="买家端Logo" prop="buyerSideLogo">
@@ -31,6 +34,7 @@
<img v-if="formValidate.buyerSideLogo" class="img" :src="formValidate.buyerSideLogo" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('buyerSideLogo')">选择图片</Button>
<span class="desc">买家端logo展示 176</span>
</div>
</FormItem>
<FormItem label="买家端Icon" prop="buyerSideIcon">
@@ -38,6 +42,7 @@
<img v-if="formValidate.buyerSideIcon" class="img" :src="formValidate.buyerSideIcon" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('buyerSideIcon')">选择图片</Button>
<span class="desc">买家端网站icon展示 11</span>
</div>
</FormItem>
<FormItem label="商家端Logo" prop="storeSideLogo">
@@ -45,6 +50,7 @@
<img v-if="formValidate.storeSideLogo" class="img" :src="formValidate.storeSideLogo" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('storeSideLogo')">选择图片</Button>
<span class="desc">商家端logo展示 176</span>
</div>
</FormItem>
<FormItem label="商家端Icon" prop="storeSideIcon">
@@ -52,11 +58,13 @@
<img v-if="formValidate.storeSideIcon" class="img" :src="formValidate.storeSideIcon" />
<img v-else class="img" src="../../../../assets/emptyImg.png" alt="">
<Button @click="onClickImg('storeSideIcon')">选择图片</Button>
<span class="desc">商家端icon展示 11</span>
</div>
</FormItem>
<FormItem label="站点地址" prop="staticPageAddress">
<Input v-model="formValidate.staticPageAddress" />
<Input style="width:200px;" v-model="formValidate.staticPageAddress" />
</FormItem>
<FormItem label="wap站点地址" prop="staticPageWapAddress">
<Input v-model="formValidate.staticPageWapAddress" />

View File

@@ -7,6 +7,7 @@
<Radio label="false">关闭</Radio>
</RadioGroup>
<span class="desc">商品审核关闭后商家添加商品则无需审核直接上架</span>
</FormItem>
<div class="label-item">
<FormItem class="label-item" label="缩略图宽" prop="abbreviationPictureWidth">

View File

@@ -3,7 +3,9 @@
<Form ref="formValidate" :label-width="150" label-position="right" :model="formValidate" :rules="ruleValidate">
<FormItem label="云IM地址" prop="httpUrl">
<Input v-model="formValidate.httpUrl"/>
<span class="desc">配置买家端联系客服以及商家端登录客服跳转的路径</span>
</FormItem>
<div class="label-btns">
<Button type="primary" @click="submit('formValidate')">保存</Button>
</div>

View File

@@ -6,11 +6,25 @@
<i-switch v-model="formValidate.apply" style="margin-top:7px;"><span slot="open"></span>
<span slot="close"></span>
</i-switch>
</FormItem>
<FormItem label="最低提现金额" prop="minPrice">
<Input class="label-appkey" v-model="formValidate.minPrice" />
</FormItem>
<FormItem label="提现方式" prop="type">
<RadioGroup v-model="formValidate.type">
<Radio label="WECHAT">微信</Radio>
<Radio label="ALI">支付宝</Radio>
</RadioGroup>
</FormItem>
<FormItem label="微信提现应用ID" prop="wechatAppId">
<Input class="label-appkey" v-model="formValidate.wechatAppId" />
</FormItem>
<div class="label-btns">
<Button type="primary" @click="submit('formValidate')">保存</Button>
</div>
</Form>
</div>
@@ -23,6 +37,9 @@ export default {
return {
formValidate: { // 表单数据
apply: true,
minPrice: "",
type: "",
wechatAppId: "",
},
switchTitle: "提现审核是否开启", // 切换title
@@ -42,6 +59,7 @@ export default {
},
// 保存设置
setupSetting() {
setSetting(this.type, this.formValidate).then((res) => {
if (res.success) {
this.$Message.success("保存成功!");

View File

@@ -10,6 +10,11 @@
padding: 10px 0;
}
.desc{
margin-left: 10px;
color: #999;
font-size: 12px;
}
.ivu-input-wrapper {
width: 150px;