This commit is contained in:
X1627315083
2024-08-30 16:51:08 +08:00
parent bc62a77b72
commit 39e3418029
17 changed files with 1102 additions and 29 deletions

View File

@@ -0,0 +1,149 @@
import axios from 'axios'
// import qs from 'qs'
// import message from '@/components/public/message/src'
import router from '@/router/index'
import {getCookie} from '@/tool/cookie'
// import cookie from '@/tools/cookie.js'
axios.defaults.timeout = 60000 * 60; //响应时间
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头
axios.defaults.withCredentials = true; //跨域携带cookie
import { message } from 'ant-design-vue';
axios.defaults.baseURL = process.env.VUE_APP_BASE_URL; //配置接口地址
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {
//在发送请求之前做某件事
if(config.method === 'post' || config.method === 'put' || config.method === 'delete'){
// config.data = qs.stringify(config.data);
// config.data = JSON.stringify(config.data);
}
config.headers.Authorization = getCookie('token');
return config;
},(error) =>{
return Promise.reject(error);
});
//返回状态判断(添加响应拦截器)
axios.interceptors.response.use((res) =>{
if (res.data) {
if (res.data.errCode === 0) {
return Promise.resolve(res.data.data);
} else if(!res.data.errMsg){
let obj = {
data:res.data,
type:res.headers['content-type'],
name:res.headers['content-disposition'],
}
return Promise.resolve(obj);
}else{
message.error(res.data.errMsg)
return Promise.reject(res.data);
}
} else{
message.error(res.data.errMsg)
return Promise.reject(res.data);
}
}, function(error) {
if(error?.response?.status === 401){
router.replace('/login')
return Promise.reject()
}
let data_new = error?.response?.data
message.error(data_new?.errMsg || 'Error: server exception')
return Promise.reject(data_new);
});
export const Https = {
httpUrls: {
interfaceUrl: '',
accountLogin:'/api/account/login', //登入
accountLogout:'/api/account/logout',//登出
queryStorePage:'/api/store/queryStorePage',//门店分页列表
sotreSaveOrEdit:'/api/store/saveOrEdit',//新增或编辑门店
storeDelete:'/api/store/delete',//删除门店
labelQueryStorePage:'/api/label/queryStorePage',//标签分页列表
labelSaveOrEdit:'/api/label/saveOrEdit', //新增或编辑标签
labelDelete:'/api/label/delete',//删除标签
accountQueryUserPage:'/api/account/queryUserPage',//用户分页列表
storeQueryAll:'/api/store/queryAll',//下拉-查询所有店铺
roleQueryRolePage:'/api/role/queryRolePage', //角色分页列表
roleQueryAll:'/api/role/queryAll', // 下拉-查询所有角色
accountSaveOrEdit:'/api/account/saveOrEdit',//添加或编辑账号
accountEnable:'/api/account/enable', // 禁用-停用账户
accountDelete:'/api/account/delete',//删除账户
roleQueryPermissionList:'/api/role/queryPermissionList',//查询权限列表
roleSaveOrEdit:'/api/role/saveOrEdit', //新增或编辑角色
roleDelete:'/api/role/delete', //删除角色
queryProductPage:'/api/product/queryProductPage',//商品分页列表
queryProductLabel:'/api/label/queryProductLabel',//下拉-查询所有商品标签
queryProductAssortmentPage:'/api/product/queryProductAssortmentPage',//商品搭配分页列表
attributeQueryAll:'/api/attribute/queryAll',//下拉-查询所有属性值
productConfirmUpload:'/api/product/confirmUpload',
countWorkBench:'/api/product/countWorkBench',//首页工作台统计
batchUploadProductRelation:'/api/product/batchUploadProductRelation',//批量上传商品后传对应的关联信息,新增商品
productDelete:'/api/product/delete', //删除商品
countProductUpdateProcess:'/api/product/countProductUpdateProcess', //统计商品批量上传进度
productEdit:'/api/product/edit',//编辑商品
productDetail:'/api/product/detail',//商品详情
doOnSale:'/api/product/doOnSale', //上架-下架商品
queryUsrPermission:'/api/role/queryUsrPermission',//菜单权限
queryProductStore:'/api/store/queryProductStore', //下拉-查询所有商品店铺
exportProduct:'/api/product/exportProduct', //商品导出
miTuExportPage:'/api/miTuExport/miTuExportPage', //获取导出报表列表
miTuExportExport:'/api/miTuExport/export', //商品导出
salesIncentivesAddTask:'/api/salesIncentives/addTask', //创建激励任务
salesIncentivesQueryPage:'/api/salesIncentives/queryPage', //激励任务列表
salesIncentivesSalesRanking:'/api/salesIncentives/salesRanking', //激励任务列表
},
axiosGet(url,config) {
return new Promise((resolve, reject) => {
axios.get(url,config).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosPut(url, data) {
return new Promise((resolve, reject) => {
axios.put(url, data).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosPost(url, data,config) {
return new Promise((resolve, reject) => {
axios.post(url, data,config).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosDelete(url, newData) {
return new Promise((resolve, reject) => {
axios.delete(url,{data:newData}).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
}

View File

@@ -0,0 +1,149 @@
import axios from 'axios'
// import qs from 'qs'
// import message from '@/components/public/message/src'
import router from '@/router/index'
import {getCookie} from '@/tool/cookie'
// import cookie from '@/tools/cookie.js'
axios.defaults.timeout = 60000 * 60; //响应时间
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'; //配置请求头
axios.defaults.withCredentials = true; //跨域携带cookie
import { message } from 'ant-design-vue';
axios.defaults.baseURL = process.env.VUE_APP_BASE_URL; //配置接口地址
console.log(process.env.VUE_APP_BASE_URL);
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {
//在发送请求之前做某件事
if(config.method === 'post' || config.method === 'put' || config.method === 'delete'){
// config.data = qs.stringify(config.data);
// config.data = JSON.stringify(config.data);
}
config.headers.Authorization = getCookie('token');
return config;
},(error) =>{
return Promise.reject(error);
});
//返回状态判断(添加响应拦截器)
axios.interceptors.response.use((res) =>{
if (res.data) {
if (res.data.errCode === 0) {
return Promise.resolve(res.data.data);
} else if(!res.data.errMsg){
let obj = {
data:res.data,
type:res.headers['content-type'],
name:res.headers['content-disposition'],
}
return Promise.resolve(obj);
}else{
message.error(res.data.errMsg)
return Promise.reject(res.data);
}
} else{
message.error(res.data.errMsg)
return Promise.reject(res.data);
}
}, function(error) {
if(error?.response?.status === 401){
router.replace('/login')
return Promise.reject()
}
let data_new = error?.response?.data
message.error(data_new?.errMsg || 'Error: server exception')
return Promise.reject(data_new);
});
export const Https = {
httpUrls: {
interfaceUrl: '',
accountLogin:'/api/account/login', //登入
accountLogout:'/api/account/logout',//登出
queryStorePage:'/api/store/queryStorePage',//门店分页列表
sotreSaveOrEdit:'/api/store/saveOrEdit',//新增或编辑门店
storeDelete:'/api/store/delete',//删除门店
labelQueryStorePage:'/api/label/queryStorePage',//标签分页列表
labelSaveOrEdit:'/api/label/saveOrEdit', //新增或编辑标签
labelDelete:'/api/label/delete',//删除标签
accountQueryUserPage:'/api/account/queryUserPage',//用户分页列表
storeQueryAll:'/api/store/queryAll',//下拉-查询所有店铺
roleQueryRolePage:'/api/role/queryRolePage', //角色分页列表
roleQueryAll:'/api/role/queryAll', // 下拉-查询所有角色
accountSaveOrEdit:'/api/account/saveOrEdit',//添加或编辑账号
accountEnable:'/api/account/enable', // 禁用-停用账户
accountDelete:'/api/account/delete',//删除账户
roleQueryPermissionList:'/api/role/queryPermissionList',//查询权限列表
roleSaveOrEdit:'/api/role/saveOrEdit', //新增或编辑角色
roleDelete:'/api/role/delete', //删除角色
queryProductPage:'/api/product/queryProductPage',//商品分页列表
queryProductLabel:'/api/label/queryProductLabel',//下拉-查询所有商品标签
queryProductAssortmentPage:'/api/product/queryProductAssortmentPage',//商品搭配分页列表
attributeQueryAll:'/api/attribute/queryAll',//下拉-查询所有属性值
productConfirmUpload:'/api/product/confirmUpload',
countWorkBench:'/api/product/countWorkBench',//首页工作台统计
batchUploadProductRelation:'/api/product/batchUploadProductRelation',//批量上传商品后传对应的关联信息,新增商品
productDelete:'/api/product/delete', //删除商品
countProductUpdateProcess:'/api/product/countProductUpdateProcess', //统计商品批量上传进度
productEdit:'/api/product/edit',//编辑商品
productDetail:'/api/product/detail',//商品详情
doOnSale:'/api/product/doOnSale', //上架-下架商品
queryUsrPermission:'/api/role/queryUsrPermission',//菜单权限
queryProductStore:'/api/store/queryProductStore', //下拉-查询所有商品店铺
exportProduct:'/api/product/exportProduct', //商品导出
miTuExportPage:'/api/miTuExport/miTuExportPage', //获取导出报表列表
miTuExportExport:'/api/miTuExport/export', //商品导出
salesIncentivesAddTask:'/api/salesIncentives/addTask', //创建激励任务
salesIncentivesQueryPage:'/api/salesIncentives/queryPage', //激励任务列表
salesIncentivesSalesRanking:'/api/salesIncentives/salesRanking', //激励任务列表
},
axiosGet(url,config) {
return new Promise((resolve, reject) => {
axios.get(url,config).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosPut(url, data) {
return new Promise((resolve, reject) => {
axios.put(url, data).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosPost(url, data,config) {
return new Promise((resolve, reject) => {
axios.post(url, data,config).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
axiosDelete(url, newData) {
return new Promise((resolve, reject) => {
axios.delete(url,{data:newData}).then(response => {
resolve(response)
}).catch((error) => {
reject(error)
})
});
},
}

View File

@@ -0,0 +1,46 @@
const {defineConfig} = require('@vue/cli-service')
const path = require('path');
module.exports = defineConfig({
transpileDependencies: ['vuetify'],
lintOnSave:false,//关闭语法检查
devServer: {
// hot: true, // 热更新
port: '8060',
proxy: {
"/api": {
// target: 'http://18.167.251.121:5568', //后端接口地址
target: 'http://192.168.1.9:5560/', //后端接口地址
// target: 'http://18.167.251.121:10220/', //后端接口地址
changeOrigin: true, //是否允许跨越
}
},
},
pluginOptions: {
"style-resources-loader": {
preProcessor: "less",
patterns: [
// 存放less变量文件的路径
path.resolve(__dirname, "./src/assets/style/style.less")
]
}
},
css: {
loaderOptions: {
less: {
lessOptions: {
modifyVars: {
'primary-color': '#ec6800'
},
javascriptEnabled: true,
},
},
},
}
})

View File

@@ -0,0 +1,46 @@
const {defineConfig} = require('@vue/cli-service')
const path = require('path');
module.exports = defineConfig({
transpileDependencies: ['vuetify'],
lintOnSave:false,//关闭语法检查
devServer: {
// hot: true, // 热更新
port: '8060',
proxy: {
"/api": {
// target: 'http://18.167.251.121:5568', //后端接口地址
// target: 'http://192.168.1.9:5560/', //后端接口地址
target: 'http://18.167.251.121:10220/', //后端接口地址
changeOrigin: true, //是否允许跨越
}
},
},
pluginOptions: {
"style-resources-loader": {
preProcessor: "less",
patterns: [
// 存放less变量文件的路径
path.resolve(__dirname, "./src/assets/style/style.less")
]
}
},
css: {
loaderOptions: {
less: {
lessOptions: {
modifyVars: {
'primary-color': '#ec6800'
},
javascriptEnabled: true,
},
},
},
}
})

View File

@@ -5,7 +5,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>Mixi</title>
<title>SARA</title>
<link href="https://fonts.font.im/css?family=Roboto:400,500,700,700i" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700;900&display=swap" rel="stylesheet">
</head>

View File

@@ -1,6 +1,6 @@
{
"id": "3922178",
"name": "mixi",
"name": "sara",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",

View File

@@ -1,6 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id */
src: url('iconfont.ttf?t=1709533486156') format('truetype');
font-family: "iconfont"; /* Project id 4452518 */
src: url('iconfont.woff2?t=1723432108642') format('woff2'),
url('iconfont.woff?t=1723432108642') format('woff'),
url('iconfont.ttf?t=1723432108642') format('truetype');
}
.iconfont {
@@ -11,6 +13,22 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-renwuliebiao:before {
content: "\e60a";
}
.icon-paiming_paiming:before {
content: "\e6dc";
}
.icon-jiazai--kuai:before {
content: "\e8b7";
}
.icon-renwu:before {
content: "\e653";
}
.icon-xiazaiwenjian:before {
content: "\e600";
}

Binary file not shown.

Binary file not shown.

View File

@@ -63,6 +63,16 @@ const routes: Array<RouteRecordRaw> = [
path:'exportExcil',
name:'exportExcil',
component: _import_custom('childView/exportExcil.vue'),
},
{
path:'growingThroughLifeTask',
name:'growingThroughLifeTask',
component: _import_custom('childView/growingThroughLife/growingThroughLifeTask.vue'),
},
{
path:'growingThroughLifeList',
name:'growingThroughLifeList',
component: _import_custom('childView/growingThroughLife/growingThroughLifeList.vue'),
},
// {
// path:'excil1',

View File

@@ -11,7 +11,7 @@ axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded
axios.defaults.withCredentials = true; //跨域携带cookie
import { message } from 'ant-design-vue';
axios.defaults.baseURL = process.env.VUE_APP_BASE_URL; //配置接口地址
console.log(process.env.VUE_APP_BASE_URL);
//POST传参序列化(添加请求拦截器)
axios.interceptors.request.use((config) => {
//在发送请求之前做某件事
@@ -97,6 +97,9 @@ export const Https = {
exportProduct:'/api/product/exportProduct', //商品导出
miTuExportPage:'/api/miTuExport/miTuExportPage', //获取导出报表列表
miTuExportExport:'/api/miTuExport/export', //商品导出
salesIncentivesAddTask:'/api/salesIncentives/addTask', //创建激励任务
salesIncentivesQueryPage:'/api/salesIncentives/queryPage', //激励任务列表
salesIncentivesSalesRanking:'/api/salesIncentives/salesRanking', //激励任务列表
},
axiosGet(url,config) {

View File

@@ -106,31 +106,46 @@ export default defineComponent({
key:'/home/exportExcil',
isShow:false,
},
{
code:'MOTIVATIONAL_TASKS',
name:'Motivational Tasks',
route:'/home/growingThroughLifeTask',
icon:'icon-renwuliebiao',
key:'/home/growingThroughLifeTask',
isShow:false,
},
{
code:'MOTIVATIONAL_RANKING',
name:'Motivational Ranking',
route:'/home/growingThroughLifeList',
icon:'icon-paiming_paiming',
key:'/home/growingThroughLifeList',
isShow:false,
},
// {
// name:'Export Excil',
// code:'EXPORT_EXCIL',
// route:'/home/exportExcil',
// icon:'icon-xiazaiwenjian',
// name:'Growing Through Life',
// code:'GROWING_THROUGH_LIFE',
// route:'',
// icon:'icon-renwu',
// key:'sub3',
// key:'/home/exportExcil',
// expandIcon:'icon-xialajiantouxiao',
// isShow:true,
// isShow:false,
// children:[
// {
// code:'USER_MANAGER',
// name:'User Management',
// route:'/home/excil1',
// code:'GROWING_THROUGH_LIFE_TASK',
// name:'Task Management',
// route:'/home/growingThroughLifeTask',
// icon:'',
// key:'/home/excil1',
// isShow:true,
// key:'/home/growingThroughLifeTask',
// isShow:false,
// },
// {
// code:'ROLE_MANAGER',
// name:'Access Permission',
// route:'/home/excil2',
// code:'GROWING_THROUGH_LIFE_LIST',
// name:'Performance',
// route:'/home/growingThroughLifeList',
// icon:'',
// key:'/home/excil2',
// isShow:true,
// key:'/home/growingThroughLifeList',
// isShow:false,
// },
// ]
// }

View File

@@ -15,7 +15,7 @@
></a-select>
</filterComponent>
<filterComponent :title="'Export Time'">
<a-range-picker size="large" v-model:value="date" :show-time="{ format: 'HH:mm:ss' }" format="YYYY-MM-DD HH:mm:ss" valueFormat="YYYY-MM-DD HH:mm:ss" :placeholder="['Start Time', 'End Time']"/>
<a-range-picker size="large" v-model:value="date" format="YYYY-MM-DD" valueFormat="YYYY-MM-DD" :placeholder="['Start Time', 'End Time']"/>
</filterComponent>
</div>
</div>
@@ -38,7 +38,8 @@
<template v-slot:bodyCell="{column,record, index}" >
<template v-if="column.dataIndex === 'operation'">
<div class="operate_list">
<div class="operate_item" @click="setExport(record,index)">Export</div>
<div class="operate_item" v-if="!record.operation" @click="setExport(record,index,column)">Export</div>
<div class="operate_item icon" v-else><span class="iconfont icon-jiazai--kuai"></span></div>
</div>
</template>
</template>
@@ -81,7 +82,7 @@ export default defineComponent({
},
])
let collectionList = ref([])
let collectionList:any = ref([])
let labelTypeList:any = ref([
{ value:'week',label:'Week'},
{ value:'month',label:'Month'},
@@ -102,8 +103,8 @@ export default defineComponent({
size:pageSize.value,
fileName:filter.name,
span:filter.type,
endTime:filter?.date?.[1]?filter.date[1]:'',
startTime:filter?.date?.[0]?filter.date[0]:'',
endTime:filter?.date?.[1]?filter.date[1] + ' ' +'00:00:00':'',
startTime:filter?.date?.[0]?filter.date[0] + ' ' +'23:59:59':'',
}
tableLoading.value = true
Https.axiosPost(Https.httpUrls.miTuExportPage, data).then(
@@ -115,7 +116,10 @@ export default defineComponent({
getExportList()
}else{
collectionList.value = rv.content
let operation = {
operation:false
}
collectionList.value.forEach((obj:any) => Object.assign(obj, operation));
total = rv.total
}
}
@@ -139,7 +143,8 @@ export default defineComponent({
getExportList()
}
let setExport = (data:any,index:any) =>{
let setExport = (data:any,index:any,column:any) =>{
collectionList.value[index].operation = true
Https.axiosGet(Https.httpUrls.miTuExportExport+`/${data.id}`,{responseType: 'blob'}).then((rv)=>{
let name = rv.name.split('=')[1];
let url = window.URL.createObjectURL(new Blob([rv.data], { type: rv.type }));
@@ -151,6 +156,7 @@ export default defineComponent({
link.click();
URL.revokeObjectURL(link.href)
document.body.removeChild(link);
collectionList.value[index].operation = false
})
}
@@ -199,6 +205,17 @@ export default defineComponent({
font-weight: 400;
color: #343579;
cursor: pointer;
&.icon{
animation: spin 1s linear infinite;
@keyframes spin {
0%{
transform: rotate(0deg);
}
100%{
transform: rotate(360deg);
}
}
}
}
}
}

View File

@@ -0,0 +1,193 @@
<template>
<div class="label_manage_page list_page">
<div class="list_page_content">
<div class="list_top_content">
<div class="list_top_search_content">
<div class="search_content_left">
<filterComponent :title="'Date'"><a-range-picker v-model:value="addTime" size="large" :placeholder="['Start Time', 'End Time']" format="YYYY-MM-DD" valueFormat="YYYY-MM-DD"/></filterComponent>
</div>
</div>
<div class="list_top_button_content">
<a-button class="primary_button btn-margin-r-20" type="primary" size="large" @click="searchList()">Seach</a-button>
<a-button class="default_button" size="large" @click="resetList()">Reset</a-button>
</div>
</div>
<div class="list_table_content">
<a-table :columns="columns" :data-source="collectionList" @change="changePage" :loading="tableLoading"
:pagination="{
showSizeChanger:true,
current: currentPage,
pageSize:pageSize,
total: total,
showQuickJumper:true,
bordered:false,
pageSizeOptions:['10','20','50'],
}">
<!-- <template v-slot:bodyCell="{column,record, index}" >
<template v-if="column.dataIndex === 'operation'">
<div class="operate_list">
<div class="operate_item" @click="editLabel(record)">Edit</div>
<div class="operate_item" @click="deleteLabel(record,index)">Delete</div>
</div>
</template>
</template> -->
</a-table>
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent,ref,reactive,toRefs,UnwrapRef,onMounted,createVNode } from "vue";
import filterComponent from '@/component/filterComponent.vue'
import { Moment } from 'moment';
import { message,Modal } from "ant-design-vue";
import { WarningOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { formatTime, startTime, endTime } from "@/tool/util"
export default defineComponent({
name:'labelManage',
components:{filterComponent},
setup(){
let filter:any = reactive({
addTime:ref<Moment[]>([])
})
let tableLoading = ref(false)
let columns = reactive([
{ title: 'Sales Name', align:'center', ellipsis: true, dataIndex: 'salesmanName', key: 'salesmanName' },
{ title: 'Target Value', align:'center', ellipsis: true, dataIndex: 'incentiveNum', key: 'incentiveNum' },
// { title: 'Add Time', align:'center', ellipsis: true, dataIndex: 'createDate', key: 'createDate',customRender:(record:any)=>{
// let time = formatTime(record.text / 1000, 'YYYY-MM-DD hh:mm:ss')
// return time },
// },
])
let collectionList = ref([])
let currentPage = ref(1)
let pageSize = ref(10)
let total = ref(1)
let formRef = ref();
let formState = ref({
id: '',
name: '',
type:[],
remarks:'',
});
let changePage = (e:any) =>{
currentPage.value = e.current
pageSize.value = e.pageSize
getLabelist()
}
let getLabelist = () =>{
console.log(filter.addTime);
let startTime,endTime
if(filter.addTime && filter.addTime.length){
startTime = filter.addTime[0] +' 00:00:00'
endTime = filter.addTime[1] +' 23:59:59'
}
let data = {
startTime:startTime,
// startTime:filter.addTime && filter.addTime.length ? startTime(filter.addTime[0]) : '',
// endTime:filter.addTime && filter.addTime.length ? endTime(filter.addTime[1]) : '',
endTime:endTime,
page:currentPage.value,
size:pageSize.value
}
tableLoading.value = true
Https.axiosPost(Https.httpUrls.salesIncentivesSalesRanking, data).then(
(rv: any) => {
if (rv) {
tableLoading.value = false
collectionList.value = rv
// total.value = rv.total
}
}
);
}
let searchList = () =>{
currentPage.value = 1
getLabelist()
}
let resetList = () =>{
currentPage.value = 1
filter.name = ''
filter.type = ''
filter.addTime = ref<Moment[]>([])
getLabelist()
}
let deleteLabel = (data:any,index:any) =>{
let confirmDelete = (data:any,index:any) =>{
let newData = {
id:data.id
}
Https.axiosPost(Https.httpUrls.labelDelete, newData).then(
(rv: any) => {
if (rv) {
message.success('Delete success')
collectionList.value.splice(index,1)
}
}
);
}
Modal.confirm({
title: "Are you sure about the label? The label associated with the product will become invalid after deletion!",
icon: createVNode(WarningOutlined),
class:'confirm_style',
okText: 'Ok',
cancelText: 'Cancel',
// centered:true,
onOk() {
confirmDelete(data,index)
}
});
}
onMounted(() => {
getLabelist()
})
return {
...toRefs(filter),
tableLoading,
columns,
collectionList,
currentPage,
pageSize,
total,
formRef,
formState,
changePage,
searchList,
resetList,
deleteLabel
}
},
});
</script>
<style lang="less" scoped>
.label_manage_page{
padding-left: 28px;
.operate_list{
display: flex;
justify-content: space-between;
.operate_item{
font-size: 14px;
font-family: Roboto;
font-weight: 400;
color: #343579;
cursor: pointer;
}
}
}
</style>

View File

@@ -0,0 +1,387 @@
<template>
<div class="task_manage_page list_page">
<div class="list_page_content">
<div class="list_top_content">
<!-- <div class="list_top_search_content">
<div class="search_content_left">
<filterComponent :title="'Task Name'"><a-input v-model:value="name" size="large" placeholder="Please input Task Name or Id" @keydown.enter="searchList"/></filterComponent>
<filterComponent :title="'Fashion Attributes'">
<a-select
v-model:value="type"
size="large"
style="width:280px"
:options="taskTypeList"
placeholder="Please select"
allowClear
></a-select>
</filterComponent>
<filterComponent :title="'Date'"><a-range-picker v-model:value="addTime" size="large" :placeholder="['Start Time', 'End Time']" format="YYYY-MM-DD" valueFormat="YYYY-MM-DD"/></filterComponent>
</div>
</div>
<div class="list_top_button_content">
<a-button class="primary_button btn-margin-r-20" type="primary" size="large" @click="searchList()">Seach</a-button>
<a-button class="default_button" size="large" @click="resetList()">Reset</a-button>
<a-button class="primary_button btn-margin-t-35" type="primary" size="large" @click="addTask()">+Add Task</a-button>
</div> -->
</div>
<div class="list_table_content">
<a-table :columns="columns" :data-source="collectionList" @change="changePage" :loading="tableLoading"
:pagination="{
showSizeChanger:true,
current: currentPage,
pageSize:pageSize,
total: total,
showQuickJumper:true,
bordered:false,
pageSizeOptions:['10','20','50'],
}">
<template v-slot:bodyCell="{column,record, index}" >
<template v-if="column.dataIndex === 'operation'">
<div class="operate_list">
<div class="operate_item" @click="editTask(record)">Detail</div>
<!-- <div class="operate_item" @click="deleteTask(record,index)">Delete</div> -->
</div>
</template>
</template>
</a-table>
</div>
</div>
<a-modal class="edit_modal_component"
:destroyOnClose="true"
v-model:visible="editTaskModal"
:footer="null"
:title="editTaskTitle"
width="560px"
:maskClosable="false"
:centered="true"
@cancel="closeTask"
>
<a-form ref="formRef" :model="formState" :rules="rules" :layout="'vertical'" >
<a-row :gutter="[16,16]">
<a-col :span="12">
<a-form-item label="Task Name" name="taskName">
<a-input v-model:value="formState.taskName" size="large" placeholder="Please input task name" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="Target Value" name="targetValue">
<a-input v-model:value="formState.targetValue" size="large" placeholder="Please enter the number of stars"/>
</a-form-item>
</a-col>
</a-row>
<a-form-item label="Description" name="description">
<a-textarea :disabled="true" style="max-height: 200px;" v-model:value="formState.description" />
</a-form-item>
<a-form-item label="Task List">
<div class="taskConditionList" v-for="item,index in formState.taskConditionList">
<!-- <a-checkbox v-model:checked="item.checked" style="margin-bottom: 20px;">
{{ item.viewName }}
</a-checkbox> -->
<div class="taskConditionList-title">{{ item.viewName }}</div>
<div class="taskConditionList-item">
<div class="">Condition Field:</div>
<!-- <a-input v-model:value="item.conditionValue" size="large" placeholder="Please input conditionValue"/> -->
<a-input :disabled="true" v-model:value="item.conditionField" size="large" placeholder="Please input condition value"/>
<!-- <a-select style="flex: 1;" v-model:value="item.conditionField" size="large" :options="taskTypeList" placeholder="Please select Fashion Attributes"></a-select> -->
</div>
<div class="taskConditionList-item">
<div>Condition Operator:</div>
<a-input :disabled="true" v-model:value="item.conditionOperator" size="large" placeholder="Please input condition operator"/>
</div>
<div class="taskConditionList-item">
<div>Condition Value:</div>
<a-input :disabled="true" v-model:value="item.conditionValue" size="large" placeholder="Please input total prices"/>
</div>
<!-- <div class="taskConditionList-item">
<div>TotalPrices:</div>
<a-input v-model:value="item.conditionValue" size="large" placeholder="Please input total prices"/>
</div> -->
</div>
</a-form-item>
<!-- <a-form-item label="Task Time" :title="'Mission Time'" name="time">
<a-range-picker
size="large"
style="width:100%"
v-model:value="formState.time"
:placeholder="['Start Time', 'End Time']"
format="YYYY-MM-DD"
valueFormat="YYYY-MM-DD"
/>
</a-form-item> -->
</a-form>
<div class="modal_button_list">
<a-button class="default_button btn-margin-r-20" size="large" @click="closeTask">Cancel</a-button>
<a-button class="primary_button" type="primary" size="large" @click="confirmSubmit">Submit</a-button>
</div>
</a-modal>
</div>
</template>
<script lang="ts">
import { defineComponent,ref,reactive,toRefs,UnwrapRef,onMounted,createVNode } from "vue";
import filterComponent from '@/component/filterComponent.vue'
import { Moment } from 'moment';
import { message,Modal } from "ant-design-vue";
import { WarningOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
import { formatTime, startTime, endTime } from "@/tool/util"
export default defineComponent({
name:'taskManage',
components:{filterComponent},
setup(){
let filter:any = reactive({
name:'',
time:'',
addTime:ref<Moment[]>([])
})
let tableLoading = ref(false)
let taskTypeList:any = ref([
{ value:'CUSTOM',task:'greater than'},
{ value:'NEW_PRODUCT',task:'less than'},
{ value:'SALE',task:'equal to'},
])
let columns = reactive([
{ title: 'Task Name', align:'center', ellipsis: true, dataIndex: 'taskName', key: 'taskName' },
{ title: 'Target Value', align:'center', ellipsis: true, dataIndex: 'targetValue', key: 'targetValue' },
// { title: 'Task Product Counts', align:'center', ellipsis: true, dataIndex: 'counts', key: 'counts' },
{ title: 'Add Time', align:'center', ellipsis: true, dataIndex: 'createTime', key: 'createTime',customRender:(record:any)=>{
// let time = formatTime(record.text / 1000, 'YYYY-MM-DD hh:mm:ss')
let time = record.text.split('T')[0]+' '+record.text.split('T')[1]
return time },
},
{
title: 'Actions',
key: 'operation',
align:'center',
fixed: 'right',
width: 150,
dataIndex:'operation',
},
])
let collectionList = ref([])
let currentPage = ref(1)
let pageSize = ref(10)
let total = ref(1)
let editTaskModal = ref(false)
let editTaskTitle = ref('Add Task')
let formRef = ref();
let formState:any = ref({
id: '',
taskName: '',
description:'',
taskConditionList:[],
targetValue:1,
});
let rules = reactive({
taskName: [
{ required: true, message: 'Please input task name', trigger: 'blur' },
],
targetValue: [
{ required: true, message: 'Please enter the number of stars', trigger: 'blur' },
],
time: [
{ required: true, message: 'Please enter the task time', trigger: 'blur' },
],
})
// let conditionList = ref([
// { viewName: '数量', conditionOperator: 'type' ,checked:false, conditionValue:'1', conditionField:'greater than'},
// { viewName: '价格', conditionOperator: 'createUserName' ,checked:false, conditionValue:'1', conditionField:'greater than'},
// { viewName: '指定衣服', conditionOperator: 'SpecifiedClothing' ,checked:false, conditionValue:'1', conditionField:'greater than'},
// ])
let changePage = (e:any) =>{
currentPage.value = e.current
pageSize.value = e.pageSize
getTaskist()
}
let closeTask = () =>{
formState.value = {
id: '',
description:'',
taskName: '',
taskConditionList:[],
targetValue:0,
}
editTaskModal.value = false
}
let addTask = () =>{
editTaskTitle.value = 'Add Task'
editTaskModal.value = true
}
let editTask = (data:any,) =>{
editTaskModal.value = true
editTaskTitle.value = 'Edit Task'
formState.value = {
id: data.id,
taskName: data.taskName,
description: data.description,
targetValue:data.targetValue,
taskConditionList:data.taskConditionList,
}
}
let getTaskist = () =>{
let data = {
page:currentPage.value,
size:pageSize.value
}
tableLoading.value = true
Https.axiosPost(Https.httpUrls.salesIncentivesQueryPage, data).then(
(rv: any) => {
if (rv) {
console.log(rv);
tableLoading.value = false
collectionList.value = rv.content
total.value = rv.total
}
}
);
}
let confirmSubmit = () =>{
let data = {
...formState.value,
timeZone:Intl.DateTimeFormat().resolvedOptions().timeZone,
}
formRef.value.validate().then(()=>{
submit()
})
let submit = () => {
Https.axiosPost(Https.httpUrls.salesIncentivesAddTask, data).then(
(rv: any) => {
if (rv) {
let tip = !formState.value.id ? 'Task added successfully' :'Edit task successfully'
message.success(tip)
resetList()
closeTask()
}
}
);
}
}
let searchList = () =>{
currentPage.value = 1
getTaskist()
}
let resetList = () =>{
currentPage.value = 1
filter.name = ''
filter.addTime = ref<Moment[]>([])
getTaskist()
}
let deleteTask = (data:any,index:any) =>{
let confirmDelete = (data:any,index:any) =>{
let newData = {
id:data.id
}
// Https.axiosPost(Https.httpUrls.taskDelete, newData).then(
// (rv: any) => {
// if (rv) {
// message.success('Delete success')
// collectionList.value.splice(index,1)
// }
// }
// );
}
Modal.confirm({
title: "Are you sure about the task? The task associated with the product will become invalid after deletion!",
icon: createVNode(WarningOutlined),
class:'confirm_style',
okText: 'Ok',
cancelText: 'Cancel',
// centered:true,
onOk() {
confirmDelete(data,index)
}
});
}
onMounted(() => {
getTaskist()
})
return {
...toRefs(filter),
tableLoading,
taskTypeList,
columns,
collectionList,
currentPage,
pageSize,
total,
editTaskModal,
editTaskTitle,
formRef,
formState,
rules,
changePage,
closeTask,
addTask,
editTask,
confirmSubmit,
searchList,
resetList,
deleteTask
}
},
});
</script>
<style lang="less" scoped>
.task_manage_page{
padding-left: 28px;
.operate_list{
display: flex;
justify-content: space-between;
justify-content: center;
.operate_item{
font-size: 14px;
font-family: Roboto;
font-weight: 400;
color: #343579;
cursor: pointer;
}
}
}
.taskConditionList{
margin-bottom: 24px;
background: #f7f8fc;
border: 1px solid #DFDFDF;
padding: 20px;
.taskConditionList-title{
width: 100%;
text-align: center;
margin-bottom: 20px;
}
.taskConditionList-item{
display: flex;
width: 100%;
align-items: center;
margin-bottom: 24px;
>div{
width: 140px;
flex-shrink: 0;
}
}
.taskConditionList-item:last-child{
margin: 0;
}
}
</style>

View File

@@ -19,6 +19,12 @@
<filterComponent :title="'Date'"><a-range-picker v-model:value="addTime" size="large" :placeholder="['Start Time', 'End Time']" format="YYYY-MM-DD" valueFormat="YYYY-MM-DD"/></filterComponent>
<filterComponent :title="'Store'">
<a-select v-model:value="storeIds" size="large" style="width:280px" :options="shopList" placeholder="Please select" allowClear optionFilterProp="label" show-search></a-select>
</filterComponent>
<filterComponent :title="'PluCode'">
<a-input v-model:value="pluCode" size="large" placeholder="Please input pluCode" />
</filterComponent>
<filterComponent :title="'Color'">
<a-input v-model:value="color" size="large" placeholder="Please input color" />
</filterComponent>
</div>
</div>
@@ -123,6 +129,8 @@ export default defineComponent({
labelTypeMap:[],
addTime:ref<Moment[]>([]),
storeIds:[],
pluCode:'',
color:'',
})
let filterLabelTypeMap :any = ref({})
let tableLoading = ref(false)
@@ -281,6 +289,8 @@ export default defineComponent({
onSaleState:filter.onSaleState && filter.onSaleState.length ? filter.onSaleState : '',
labelTypeMap:filterLabelTypeMap.value,
storeIds:filter.storeIds && filter.storeIds.length ? [filter.storeIds] : [],
pluCode:filter.pluCode && filter.pluCode.length ? filter.pluCode : '',
color:filter.color && filter.color.length ? filter.color : '',
createDateStart:filter.addTime && filter.addTime.length ? startTime(filter.addTime[0]) : '',
createDateEnd:filter.addTime && filter.addTime.length ? endTime(filter.addTime[1]) : '',
page:currentPage.value,
@@ -415,6 +425,8 @@ export default defineComponent({
onSaleState:filter.onSaleState && filter.onSaleState.length ? filter.onSaleState : '',
labelTypeMap:filterLabelTypeMap.value,
storeIds:filter.storeIds && filter.storeIds.length ? [filter.storeIds] : [],
pluCode:filter.pluCode && filter.pluCode.length ? filter.pluCode : '',
color:filter.color && filter.color.length ? filter.color : '',
createDateStart:filter.addTime && filter.addTime.length ? startTime(filter.addTime[0]) : '',
createDateEnd:filter.addTime && filter.addTime.length ? endTime(filter.addTime[1]) : '',
}
@@ -442,6 +454,8 @@ export default defineComponent({
filter.labelTypeMap = []
filter.addTime = ref<Moment[]>([])
filter.storeIds = []
filter.pluCode = '',
filter.color = '',
sortedInfo.value = null
columnSortListData = []
getProductlist()

View File

@@ -165,7 +165,13 @@ export default defineComponent({
id: data.id,
name: data.name,
}
rolePermission.value = changeSelectBoolean(data.rolePermission.level1ResourceList)
rolePermission.value = changeSelectBoolean(data.rolePermission.level1ResourceList)
//添加新权限时候用
// backupRolePermission.value.forEach((backItem:any) => {
// if(!rolePermission.value.some((obj:any) => obj.code === backItem.code)){
// rolePermission.value.push(backItem)
// }
// });
permissionCheckAll.value = data.rolePermission.allSelect
}
@@ -216,6 +222,26 @@ export default defineComponent({
}
}
}
// newData.push(
// {
// code:'Growing Through Life',
// level2ResourceList:[
// {
// code:'Growing Through Life',
// operationList:[],
// select:false,
// sort:11,
// },{
// code:'Growing Through Life',
// operationList:[],
// select:false,
// sort:11,
// },
// ],
// select:false,
// sort:11,
// }
// )
return newData
}