Commit 8bb65e9e authored by 王苓芝's avatar 王苓芝

Merge branch 'feature/storeManage' into 'master'

Feature/store manage

See merge request !1
parents 23874f93 780bb1a0
{
"name": "new-op-optimized-ui",
"version": "1.0.1",
"name": "store-manage-ui",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
......
const qiniuHost = 'https://appsync.lkbang.net/';
const opapiHost = 'https://opapi-test4.liangkebang.net';
const opapiHost = 'https://opapi-test2.liangkebang.net';
// const opapiHost = 'http://192.168.29.89:8097';
const limitApi = `http://backstms-test4.liangkebang.net`;
const baseURI = 'http://zeus-test4.liangkebang.net';
const limitApi = `http://backstms-test2.liangkebang.net`;
const baseURI = 'http://zeus-test2.liangkebang.net';
const smsApiBaseUrls = `${opapiHost}/msgTmp`;
const opUrl = '//op-test4.liangkebang.net';
const opUrl = '//op-test2.liangkebang.net';
const moConfigApi = '/sapi';
const appApi = `${opapiHost}/kdspOp`;
// const appApi = `${opapiHost}/`;
// const appApi = `${opapiHost}`;
// const appApi = 'http://192.168.29.89:8097';
// const appApi = `${opapiHost}`;
const hostUrl = 'vcc-spider-test4.liangkebang.net/';
// const homeApi = 'https://kdsp-operation-test42.liangkebang.net';
const hostUrl = 'vcc-spider-test.liangkebang.net/';
// const homeApi = 'https://kdsp-operation-test22.liangkebang.net';
export default {
qiniuHost,
opapiHost,
......
......@@ -7,8 +7,13 @@ const home = r => require.ensure([], () => r(require('../view/common/Home.vue'))
const micro = r => require.ensure([], () => r(require('../view/common/Micro.vue')), 'microLayout');
const adList = r => require.ensure([], () => r(require('../view/operation/AdList.vue')), 'adList');
const newAdList = r => require.ensure([], () => r(require('../view/operation/newAdList.vue')), 'newAdList');
const userManage = r => require.ensure([], () => r(require('../view/userManage/index.vue')), 'userManage');
const dayConsumeAnalysis = r => require.ensure([], () => r(require('../view/statementManage/dayConsumeAnalysis.vue')), 'dayConsumeAnalysis');
const expenditure = r => require.ensure([], () => r(require('../view/statementManage/expenditure.vue')), 'expenditure');
const wxPayRecord = r => require.ensure([], () => r(require('../view/statementManage/wxPayRecord.vue')), 'wxPayRecord');
const invoiceRecord = r => require.ensure([], () => r(require('../view/statementManage/invoiceRecord.vue')), 'invoiceRecord');
const loanHomePage = r => require.ensure([], () => r(require('../view/operation/LoanHomePage.vue')), 'loanHomePage');
// const loanHomePage = r => require.ensure([], () => r(require('../view/operation/LoanHomePage.vue')), 'loanHomePage');
const templateManage = r => require.ensure([], () => r(require('../view/sendManagement/templateManage.vue')), 'templateManage');
const strategyManage = r => require.ensure([], () => r(require('../view/sendManagement/StrategyManage.vue')), 'strategyManage');
const createMessage = r => require.ensure([], () => r(require('../view/sendManagement/CreateMessage.vue')), 'CreateMessage');
......@@ -18,9 +23,11 @@ const sendPush = r => require.ensure([], () => r(require('../view/sendManagement
const sendMail = r => require.ensure([], () => r(require('../view/sendManagement/sendMail.vue')), 'sendMail');
const linkTransform = r => require.ensure([], () => r(require('../view/sendManagement/linkTransform.vue')), 'linkTransform');
// 积分系列
// 会员中心
const pointList = r => require.ensure([], () => r(require('../view/myPoint/pointList.vue')), 'pointList');
const pointRecord = r => require.ensure([], () => r(require('../view/myPoint/pointRecord.vue')), 'pointRecord');
const memberLevel = r => require.ensure([], () => r(require('../view/member/memberLevel.vue')), 'memberLevel');
const memberRights = r => require.ensure([], () => r(require('../view/member/memberRights.vue')), 'memberRights');
// 用户管理
const friendRecord = r => require.ensure([], () => r(require('../view/userManagement/friendRecord.vue')), 'friendRecord');
// 奖券管理
......@@ -49,10 +56,6 @@ const activeTemplateManage = r => require.ensure([], () => r(require('../view/ac
// 公众号通知消息模块
const wechatMessage = r => require.ensure([], () => r(require('../view/wechatMessage/wechatMessage.vue')), 'wechatMessage');
// 会员权益
const memberLevel = r => require.ensure([], () => r(require('../view/member/memberLevel.vue')), 'memberLevel');
const memberRights = r => require.ensure([], () => r(require('../view/member/memberRights.vue')), 'memberRights');
// 流量工厂模块
const kaManage = r => require.ensure([], () => r(require('../view/trafficFactory/kaManage.vue')), 'kaManage');
const userGroup = r => require.ensure([], () => r(require('../view/userGroup')), 'userGroup');
......@@ -61,6 +64,9 @@ const marketingAllocation = r => require.ensure([], () => r(require('../view/tra
const homePageLayout = r => require.ensure([], () => r(require('../view/homePageLayout/index.vue')), 'homePageLayout');
// 微信公众号登录页图片上传
const officialLanding = r => require.ensure([], () => r(require('../view/privateManage/officialLanding.vue')), 'officialLanding');
const routes = [
{
path: '/',
......@@ -73,6 +79,30 @@ const routes = [
requireAuth: true,
},
children: [
{
path: 'invoiceRecord',
component: invoiceRecord,
},
{
path: 'wxPayRecord',
component: wxPayRecord,
},
{
path: 'expenditure',
component: expenditure,
},
{
path: 'dayConsumeAnalysis',
component: dayConsumeAnalysis,
},
{
path: 'userManage',
component: userManage,
},
{
path: 'adList',
component: adList,
},
{
path: 'specialList',
component: specialList,
......@@ -133,10 +163,10 @@ const routes = [
path: 'createMessage',
component: createMessage,
},
{
path: 'adList',
component: adList,
},
// {
// path: 'adList',
// component: adList,
// },
{
path: 'newAdList',
component: newAdList,
......@@ -150,10 +180,10 @@ const routes = [
component: memberLevel,
},
{
path: 'loanHomePage',
component: loanHomePage,
},
// {
// path: 'loanHomePage',
// component: loanHomePage,
// },
{
path: 'templateManage',
component: templateManage,
......@@ -226,6 +256,10 @@ const routes = [
path: 'tabDeploy',
component: tabDeploy,
},
{
path: 'officialLanding',
component: officialLanding,
},
],
},
];
......
......@@ -167,6 +167,27 @@ export default {
}
});
},
// 导出限额支付的商品数据
exportCashList() {
return http
.get(`${appApi}/api/kdsp/new-user/exclusive/sku-limit/export`, {
responseType: 'arraybuffer',
})
.then(data => {
if (data.byteLength > 0) {
const blob = new Blob([data], { type: 'application/vnd.ms-excel;' });
fileSaver.saveAs(blob, `支付限额的商品数据列表.xlsx`);
}
});
},
// 添加限额支付限制商品
getCashLimitList(params) {
return http.post(`${appApi}/api/kdsp/new-user/exclusive/sku-limit/submit`, params);
},
// 限额支付页停用启用按钮
updateStatus(params) {
return http.get(`${appApi}/api/kdsp/new-user/exclusive/sku-limit/start-stop?enable=${params.enable}`);
},
changeProductLableStatus(params) {
return http.post(`${appApi}/api/kdsp/activity/activity-goods/label-info/sku-label/update`, params);
},
......@@ -206,4 +227,12 @@ export default {
params.append('previewId', previewId);
return http.post(`${appApi}/api/kdsp/activity/activity-goods/special/upload-template`, params);
},
// 获取现金支付的已有数据
getCashList() {
return http.get(`${appApi}/api/kdsp/new-user/exclusive/sku-limit/get`);
},
// 查看详情
lookDetails(params) {
return http.get(`${appApi}/api/kdsp/new-user/exclusive/sku-limit/page?${qs.stringify(params)}`);
},
};
......@@ -63,6 +63,9 @@ export default {
categoryQuery() {
return http.get(`${appApi}/api/kdsp/op/rear-category/query/all`);
},
threeCategoryQuery() {
return http.get(`${appApi}/api/kdsp/op/rear-category/sku-limit/query/all`);
},
// 用户领取的优惠券冻结解冻(是否可用)
receiverUpdate(params) {
return http.post(`${appApi}/api/kdsp/op/coupon/receiver/update`, params);
......
import config from '../../config';
const { appApi } = config;
export default {
submit(params) {
return http.post(`${appApi}/api/kdsp/pre-login/img-url/save`, params);
},
getImg() {
return http.get(`${appApi}/api/kdsp/pre-login/img-url/get`);
},
update(params) {
return http.put(`${appApi}/api/kdsp/pre-login/img-url/update`, params);
},
};
......@@ -53,6 +53,19 @@ const menus = [
},
childNodes: [],
},
{
node: {
id: 'dbeaef7d-acf7-4d27-9432-9421bb5743f1',
name: '新广告位列表',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'newAdList',
},
childNodes: [],
},
],
},
{
......@@ -184,6 +197,19 @@ const menus = [
},
childNodes: [],
},
{
node: {
id: 'dde9bb49-97cb-417e-b890-5cdee4bd12e1',
name: '发送微信公众号通知',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'wechatMessage',
},
childNodes: [],
},
],
},
{
......@@ -211,6 +237,19 @@ const menus = [
},
childNodes: [],
},
{
node: {
id: '3a1cedbf-f4d6-4fe7-bcfc-8d2f327ca6cd', // 自己设置的id
name: '首页布局',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'homePageLayout',
},
childNodes: [],
},
{
node: {
id: '3a1cedbf-f4d6-4fe7-bcfc-8d2f327ca6cc',
......@@ -322,7 +361,7 @@ const menus = [
{
node: {
id: '119d1160-c446-4370-8d50-8fd749ebb39c',
name: '积分',
name: '会员中心',
picture: 'ios-list',
type: {
name: '资源组',
......@@ -334,7 +373,7 @@ const menus = [
{
node: {
id: '43a9714d-84da-459e-9182-55e06e5e717d',
name: '积分列表',
name: '会员任务',
picture: null,
type: {
name: '菜单',
......@@ -347,7 +386,7 @@ const menus = [
{
node: {
id: 'c13c3287-5580-4b2e-b979-bd58e5f11554',
name: '积分明细记录',
name: '成长值明细',
picture: null,
type: {
name: '菜单',
......@@ -357,6 +396,32 @@ const menus = [
},
childNodes: [],
},
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '会员等级',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'memberLevel',
},
childNodes: [],
},
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '会员权益',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'memberRights',
},
childNodes: [],
},
],
},
{
......@@ -371,6 +436,19 @@ const menus = [
uri: null,
},
childNodes: [
{
node: {
id: '7fec0d98-8693-9f90-7d8e-770f958fda4b', // 此处自己设置的
name: '用户管理',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'userManage',
},
childNodes: [],
},
{
node: {
id: '7fec0d98-8693-9f90-7d8e-770f958fda4a',
......@@ -403,7 +481,7 @@ const menus = [
node: {
id: '580b8099-2c3b-43a6-8c5d-0edfc757ee38',
name: '活动管理',
picture: null,
picture: 'checkmark-circled',
type: {
name: '资源组',
value: 1,
......@@ -443,7 +521,7 @@ const menus = [
node: {
id: '89deb3bc-f794-4dfa-b63f-5d0ce49a06eb',
name: '活动商品管理',
picture: null,
picture: 'checkmark-circled',
type: {
name: '资源组',
value: 1,
......@@ -490,30 +568,16 @@ const menus = [
},
childNodes: [],
},
],
},
{
node: {
id: '72f586b1-a65b-45fb-847a-cf11c3b56bc3',
name: '活动模版管理',
picture: 'ios-settings',
type: {
name: '资源组',
value: 1,
},
uri: null,
},
childNodes: [
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '活动模版管理',
id: 'e8be713e-aaf1-470a-81d3-67ad15d59c62', // 自己给的id
name: '支付限额商品列表',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'activeTemplateManage',
uri: 'cashPayList',
},
childNodes: [],
},
......@@ -522,7 +586,7 @@ const menus = [
{
node: {
id: '72f586b1-a65b-45fb-847a-cf11c3b56bc3',
name: '流量工厂',
name: '活动模版管理',
picture: 'ios-settings',
type: {
name: '资源组',
......@@ -534,26 +598,13 @@ const menus = [
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: 'KA管理',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'kaManage',
},
childNodes: [],
},
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '营销配置',
name: '活动模版管理',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'marketingAllocation',
uri: 'activeTemplateManage',
},
childNodes: [],
},
......@@ -562,7 +613,7 @@ const menus = [
{
node: {
id: '72f586b1-a65b-45fb-847a-cf11c3b56bc3',
name: '会员权益',
name: '私域管理',
picture: 'ios-settings',
type: {
name: '资源组',
......@@ -573,27 +624,14 @@ const menus = [
childNodes: [
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '会员等级',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'memberLevel',
},
childNodes: [],
},
{
node: {
id: 'f802681d-cf34-4eff-8838-1839ebe54bc3',
name: '等级权益',
id: 'f802681d-cf34-4eff-8838-1839ebe54bc4', // 自己设置的id
name: '公众号登录页',
picture: null,
type: {
name: '菜单',
value: 2,
},
uri: 'memberRights',
uri: 'officialLanding',
},
childNodes: [],
},
......@@ -611,6 +649,7 @@ export function getMenuData() {
export function normalization(menuData = menus) {
const value = [];
const data = [...menuData];
console.log('data-menu', data);
data.forEach(item => {
let obj = {};
obj = { ...item.node };
......
......@@ -282,6 +282,7 @@
v-model="form.kaChannelNo"
ref="select"
filterable
:label="kaLabel"
class="select-width-280"
transfer
:disabled="readOnly"
......@@ -547,7 +548,6 @@ export default {
remoteMethod(query) {
if (query) {
api.getSimpleList({ kaChannelNameOrNo: query }).then(res => {
console.log(res, 'reskalist');
res.records.forEach(item => {
item.label = item.channelNo + '_' + item.channelName;
});
......@@ -588,7 +588,6 @@ export default {
}
const listDetail = [];
this.form.formModule.forEach(e => {
console.log('e', e, this.form.type);
const { startTime, endTime, bgcolor, img, cid1, activityGoodsSpecialId, timeRange, limitQuantity } = e;
const itemData = { startTime, bgcolor, endTime, img, cid1, activityGoodsSpecialId, timeRange, limitQuantity };
itemData.startTime = this.form.type !== 1 ? '' : this.form.timeSelectionFormat === 0 ? getTime(itemData.startTime) : getTime(timeRange[0]);
......@@ -601,7 +600,6 @@ export default {
itemData.img = this.form.type === 1 ? itemData && itemData.img[0] : '';
listDetail.push(itemData);
});
console.log(listDetail);
const param = deepCopy(this.form);
param.zeroBuyRule &&
param.zeroBuyRule.forEach(item => {
......@@ -610,7 +608,6 @@ export default {
delete item.specialCaseRatio;
}
});
console.log(param, 'param');
param.bannerUrl = param.bannerUrl && param.bannerUrl.join('');
// param.showBanner = +this.form.showBanner;
if (this.form.type === 1) {
......@@ -684,7 +681,7 @@ export default {
this.title = '新建';
},
async getInfo(params, type) {
this.firstEdit = true;
this.form = {};
this.kaChannelList = [];
this.readOnly = type;
this.title = type ? '查看' : '修改';
......@@ -695,10 +692,11 @@ export default {
if (item.channelNo === res.kaChannelNo) {
this.kaLabel = `${item.channelNo}_${item.channelName}`;
}
item.label = item.channelNo + '_' + item.channelName;
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = Object.assign([], ...result.records);
this.kaChannelList = result.records;
}
this.changeChannel(res.kaChannelNo);
this.editContent = res;
// delete res.kaChannelNo;
const listDetail = [];
......@@ -714,7 +712,6 @@ export default {
this.form.img = (this.form.img && this.form.img.split(',')) || [];
this.form.bannerUrl = this.form.bannerUrl && this.form.bannerUrl.split(',');
this.form.couponMutex = res.couponMutex && res.couponMutex ? 1 : 0;
this.firstEdit = false;
this.modal = true;
},
newDel(index, isFormModule, crowd) {
......
This diff is collapsed.
......@@ -142,3 +142,13 @@ export const dynamicRules = {
pattern: /^[0-9]*[1-9][0-9]*$/,
},
};
export const limitgoodsList = [
{
id: 2,
name: '指定品类',
},
{
id: 1,
name: '指定标签',
},
];
......@@ -65,6 +65,7 @@
class="select-width-280"
:disabled="disabled()"
transfer
:label="kaLabel"
clearable
filterable
remote
......@@ -73,7 +74,7 @@
:not-found-text="kaChannelList.length !== 0 ? '' : '无匹配数据'"
placeholder="请输入"
>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo">{{ item.channelNo + '_' + item.channelName }}</Option>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo" :label="item.label"></Option>
</Select>
<p style="color: #ff6600">提示:此参数配置选中后,表示以上配置内容仅在此渠道生效;</p>
</FormItem>
......@@ -117,6 +118,7 @@ export default {
},
data() {
return {
kaLabel: '',
kaReminderModal: false,
channelTitle: '',
search: {
......@@ -133,7 +135,7 @@ export default {
activityTime: [],
kaChannelList: [],
form: {
kaChannelNo: [],
kaChannelNo: '',
listSpecialLabel: [
{
labelInfoId: null,
......@@ -311,14 +313,15 @@ export default {
remoteMethod(query) {
if (query) {
api.getSimpleList({ kaChannelNameOrNo: query }).then(res => {
// console.log(res, 'reskalist');
res.records.forEach(item => {
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = res.records || [];
});
}
},
changeChannel(item) {
if (item) {
console.log(this.form.kaChannelNo, '0000000');
this.channelTitle = this.kaChannelList.find(i => i.channelNo === item).channelName;
}
},
......@@ -326,7 +329,6 @@ export default {
this.kaReminderModal = false;
this.form.startTime = getTime(this.activityTime && this.activityTime[0]);
this.form.endTime = getTime(this.activityTime && this.activityTime[1]);
console.log(this.form, 'this.form');
if (this.title === '新增') {
this.$refs['ruleForm'].validate(valid => {
if (valid) {
......@@ -403,32 +405,6 @@ export default {
onSure() {
this.kaReminderModal = true;
// this.form.startTime = getTime(this.activityTime && this.activityTime[0]);
// this.form.endTime = getTime(this.activityTime && this.activityTime[1]);
// if (this.title === '新增') {
// this.$refs['ruleForm'].validate(valid => {
// if (valid) {
// if (!this.form.startTime) {
// return this.$Message.error('请检查专题有效期!');
// }
// this.$refs.nextModalRef.openNextTemplateModal(this.form, 0);
// } else {
// this.$Message.error('请检查表单是否填写完整!');
// }
// });
// }
// if (this.title === '编辑') {
// const delItem = [];
// this.delNameList.forEach(item => {
// if (!this.labelNameList.includes(item)) {
// delItem.push(item.id);
// }
// });
// if (delItem.length) {
// activityApi.specialDeleteLabel({ ids: delItem.join(',') });
// }
// this.$refs.nextModalRef.openNextTemplateModal(this.form, 1);
// }
},
disabled() {
if (this.title === '编辑') return true;
......@@ -439,9 +415,18 @@ export default {
return true;
},
showEdit(e) {
this.form = {
listSpecialLabel: [
{
labelInfoId: null,
goodsCount: null,
},
],
};
this.kaChannelList = [];
this.kaLabel = '';
this.title = '编辑';
activityApi.specialGet({ id: e.id }).then(res => {
console.log(res, 'resres');
this.form.name = res.name;
this.form.id = res.id;
this.form.discount = res.discount * 10;
......@@ -449,14 +434,18 @@ export default {
this.activityTime = [res.startTime, res.endTime];
this.labelNameList = [...res.listSpecialLabel];
this.delNameList = [...res.listSpecialLabel];
console.log(this.form.kaChannelNo);
if (res.kaChannelNo) {
api.getSimpleList({ kaChannelNameOrNo: res.kaChannelNo }).then(result => {
console.log(result, 'reskalist');
result.records.forEach(item => {
if (item.channelNo === res.kaChannelNo) {
this.kaLabel = `${item.channelNo}_${item.channelName}`;
}
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = result.records || [];
this.$nextTick(() => {
// this.$nextTick(() => {
this.form.kaChannelNo = res.kaChannelNo;
});
// });
});
}
});
......
......@@ -47,6 +47,7 @@
v-model="form.kaChannelNo"
class="select-width-280"
:disabled="isEdit"
:label="kaLabel"
filterable
remote
:remote-method="remoteMethod"
......@@ -56,7 +57,7 @@
:not-found-text="kaChannelList.length !== 0 ? '' : '无匹配数据'"
placeholder="请输入"
>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo">{{ item.channelNo + '_' + item.channelName }}</Option>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo" :label="item.label"></Option>
</Select>
<p style="color: #ff6600">提示:此参数配置选中后,表示以上配置内容仅在此渠道生效;</p>
</FormItem>
......@@ -143,6 +144,7 @@ export default {
},
data() {
return {
kaLabel: '',
channelTitle: '',
kaReminderModal: false,
search: {
......@@ -300,20 +302,17 @@ export default {
},
methods: {
remoteMethod(query) {
console.log('99999999999');
if (query) {
api.getSimpleList({ kaChannelNameOrNo: query }).then(res => {
res.records.forEach(item => {
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = res.records || [];
});
}
},
changeChannel(item) {
if (item) {
setTimeout(() => {
console.log(this.kaChannelList, 'item888');
this.channelTitle = this.kaChannelList.find(i => i.channelNo === item).channelName;
}, 300);
console.log(item, 'item111');
activityApi.reductionList({ kaChannelNo: item }).then(res => {
this.templateList = res || [];
});
......@@ -368,9 +367,15 @@ export default {
this.search = {};
},
onSure() {
if (this.form.kaChannelNo) {
this.channelTitle = this.kaChannelList.find(i => i.channelNo === this.form.kaChannelNo).channelName;
}
this.kaReminderModal = true;
},
showDetail(data, isEdit) {
this.form = {};
this.kaChannelList = [];
// this.kaLabel = '';
this.editId = data.id;
this.title = isEdit ? '查看活动' : '编辑活动';
this.isEdit = isEdit;
......@@ -379,7 +384,12 @@ export default {
const { startTime, endTime, url, title, activityTemplateId, forward, shareTitle, shareSubTitle, iconUrl, kaChannelNo } = res;
if (res.kaChannelNo) {
api.getSimpleList({ kaChannelNameOrNo: res.kaChannelNo }).then(result => {
// console.log(res, 'reskalist');
result.records.forEach(item => {
if (item.channelNo === res.kaChannelNo) {
this.kaLabel = `${item.channelNo}_${item.channelName}`;
}
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = result.records || [];
this.$nextTick(() => {
this.form.kaChannelNo = kaChannelNo;
......@@ -390,7 +400,6 @@ export default {
this.templateList = r || [];
this.form = { startTime, endTime, url, title, activityTemplateId, forward, shareTitle, shareSubTitle, iconUrl };
this.form = res;
console.log(this.form, 'this.form');
this.form.activityPlaybillUrl = (this.form.activityPlaybillUrl && this.form.activityPlaybillUrl.split(',')) || [];
this.form.iconUrl = (this.form.iconUrl && this.form.iconUrl.split(',')) || [];
this.form.terminal = res.terminal.split(',');
......
......@@ -43,6 +43,7 @@
class="select-width-280"
:disabled="!!form.id"
filterable
:label="kaLabel"
remote
:remote-method="remoteMethod"
transfer
......@@ -51,7 +52,7 @@
placeholder="请输入"
:not-found-text="kaChannelList.length !== 0 ? '' : '无匹配数据'"
>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo">{{ item.channelNo + '_' + item.channelName }}</Option>
<Option v-for="item in kaChannelList" :key="item.channelNo" :value="item.channelNo" :label="item.label"></Option>
</Select>
<p style="color: #ff6600">提示:此参数配置选中后,表示以上配置内容仅在此渠道生效;</p>
</FormItem>
......@@ -215,6 +216,7 @@ export default {
},
data() {
return {
kaLabel: '',
kaReminderModal: false,
channelTitle: '',
title: '',
......@@ -430,17 +432,24 @@ export default {
if (params.row.elementType === 101) {
this.form = {};
}
this.form = {};
this.kaLabel = '';
this.kaChannelList = [];
api.find({ id: params.row.id }).then(res => {
if (res.kaChannelNo) {
this.kaChannelNo = res.kaChannelNo;
delete res.kaChannelNo;
// delete res.kaChannelNo;
apis.getSimpleList({ kaChannelNameOrNo: this.kaChannelNo }).then(result => {
// console.log(res, 'reskalist');
result.records.forEach(item => {
if (item.channelNo === res.kaChannelNo) {
this.kaLabel = `${item.channelNo}_${item.channelName}`;
}
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = result.records || [];
console.log(this.kaChannelList, 'this.kaChannelList');
this.$nextTick(() => {
// this.$nextTick(() => {
this.form.kaChannelNo = this.kaChannelNo;
});
// });
});
}
if (res.elementType === 101) {
......@@ -641,7 +650,9 @@ export default {
remoteMethod(query) {
if (query) {
apis.getSimpleList({ kaChannelNameOrNo: query }).then(res => {
// console.log(res, 'reskalist');
res.records.forEach(item => {
item.label = `${item.channelNo}_${item.channelName}`;
});
this.kaChannelList = res.records || [];
});
}
......@@ -1007,7 +1018,6 @@ export default {
img: (this.form.img && this.form.img.join(',')) || '',
badgeUrl: (this.form.badgeUrl && this.form.badgeUrl.join(',')) || '',
};
console.log(params, '888888888');
if (this.form.id) {
delete params.elementTypeEdit;
delete params.terminalEdit;
......
<template>
<div style="margin-left: 30px;margin-top: 30px;">
<p>上传介绍图一:<upload :uploadurl="upImgUri" :max="1" qiniu-host="" /></p>
<p style="margin-top:10px">上传介绍图二:<upload :uploadurl="downImgUri" :max="1" qiniu-host="" /></p>
<div style="margin-top: 10px">
<Button type="primary" @click="onSure" :disabled="isUpload">确认</Button>
<span v-if="uploadSuccess" style="display: inline-block" @click="showPreview"><Button>点击预览</Button></span>
</div>
<div v-if="isPreview" style="display:flex;flex-direction:column;margin-top:10px">
<h2>预览</h2>
<img src="./landingHead.png" alt="" style="height:auto;width:200px" />
<img :src="preview.upimg" style="height:auto;width:200px" />
<img :src="preview.downimg" style="height:auto;width:200px" />
</div>
</div>
</template>
<script>
import config from '../../../config/index.js';
import upload from '../../components/qn-upload.vue';
import api from '../../services/apis/offcialLanding';
const qiniuHost = config.qiniuHost;
export default {
components: {
upload,
},
computed: {
isUpload: function() {
return !(this.upImgUri.length && this.downImgUri.length);
},
},
data() {
return {
qiniuHost,
upImgUri: [],
downImgUri: [],
uploadSuccess: false,
preview: {},
isPreview: false,
id: 0,
};
},
methods: {
async onSure() {
const params = { upImgUri: this.upImgUri[0], downImgUri: this.downImgUri[0] };
try {
if (this.id) {
await api.update({ ...params, id: this.id });
} else {
await api.submit(params);
}
this.uploadSuccess = true;
this.upImgUri = [];
this.downImgUri = [];
} catch (err) {
console.log(err);
this.uploadSuccess = false;
}
},
async showPreview() {
this.isPreview = false;
const res = await api.getImg();
this.preview.upimg = res.upImgUri;
this.preview.downimg = res.downImgUri;
this.isPreview = true;
},
},
mounted() {
api.getImg().then(res => {
this.id = res.id || null;
this.preview.upimg = res.upImgUri;
this.preview.downimg = res.downImgUri;
this.isPreview = true;
});
},
};
</script>
export const dayColumns = [
{
key: 'date',
title: '日期',
align: 'center',
},
{
key: 'count',
title: '主订单数量',
align: 'center',
},
{
key: 'GMV',
title: 'GMV金额',
align: 'center',
},
{
key: 'price',
title: '当日有效成交额',
align: 'center',
},
{
key: 'balance',
title: '余额支付总金额',
align: 'center',
},
{
key: 'totalPrice',
title: '微信支付总金额',
align: 'center',
},
{
key: 'meanPrice',
title: '当日订单平均金额',
align: 'center',
},
{
key: 'dayPerson',
title: '当日支付订单人数',
align: 'center',
},
{
key: 'status',
title: '订单付款取消率',
align: 'center',
},
];
export const expenditureColumns = [
{
key: 'date',
title: '下单时间',
align: 'center',
},
{
key: 'mainBillNo',
title: '主订单号',
align: 'center',
},
{
key: 'secondBillNo',
title: '子订单号',
align: 'center',
},
{
key: 'skuNo',
title: '商品sku编号',
align: 'center',
},
{
key: 'userId',
title: '下单用户id',
align: 'center',
},
{
key: 'userName',
title: '收货人姓名',
align: 'center',
},
{
key: 'phone',
title: '收货人手机号',
align: 'center',
},
{
key: 'address',
title: '收货地址',
align: 'center',
},
{
key: 'billStatus',
title: '订单状态',
align: 'center',
},
{
key: 'count',
title: '购买数量',
align: 'center',
},
{
key: 'mainAccount',
title: '主订单金额',
align: 'center',
},
{
key: 'refundTime',
title: '退款时间',
align: 'center',
},
{
key: 'refundPrice',
title: '退款金额',
align: 'center',
},
{
key: 'firstCategory',
title: '商品一级类目',
align: 'center',
},
{
key: 'secondCategory',
title: '商品二级类目',
align: 'center',
},
{
key: 'threeCategory',
title: '商品三级类目',
align: 'center',
},
{
key: 'brand',
title: '品牌',
align: 'center',
},
{
key: 'goodsName',
title: '商品名称',
align: 'center',
// width: 120,
// minWidth: '100px',
},
];
export const weixinPayRecord = [
{
key: 'date',
title: '下单时间',
align: 'center',
},
{
key: 'mainBillNo',
title: '主订单号',
align: 'center',
},
{
key: 'secondBillNo',
title: '子订单号',
align: 'center',
},
{
key: 'skuNo',
title: '商品sku编号',
align: 'center',
},
{
key: 'payAccount',
title: '微信支付金额',
align: 'center',
},
{
key: 'payStatus',
title: '微信支付结果',
align: 'center',
render: (h, params) => (params.row.payStatus === 1 ? '已支付' : '未支付'),
},
];
export const invoiceRecord = [
{
key: 'date',
title: '下单时间',
align: 'center',
},
{
key: 'mainBillNo',
title: '主订单号',
align: 'center',
},
{
key: 'secondBillNo',
title: '子订单号',
align: 'center',
},
{
key: 'skuNo',
title: '商品sku编号',
align: 'center',
},
{
key: 'liushui',
title: '开票流水单号',
align: 'center',
},
{
key: 'payStatus',
title: '微信支付结果',
align: 'center',
render: (h, params) => (params.row.payStatus === 1 ? '已支付' : '未支付'),
},
];
<template>
<div>
<Form ref="form" :label-width="90" inline :model="form" style="margin-top:20px;">
<FormItem label="日期选择">
<DatePicker v-model="form.date" placeholder="请选择" style="width: 200px" />
</FormItem>
<FormItem>
<Button type="primary" @click="getList()">查询</Button>
<Button type="" @click="reset()">重置</Button>
</FormItem>
</Form>
<Table ref="currentRowTable" border :columns="dayColumns" :data="dataList" />
<Page style="margin:20px" :total="count" :current="form.pageNo" :page-size="form.pageSize" size="small" show-total show-elevator @on-change="changePage" />
</div>
</template>
<script>
// import sendMessageApi from '../../services/apis/appUrl.service';
import { dayColumns } from './constData.js';
export default {
data() {
return {
form: {
pageNo: 1,
pageSize: 10,
date: '',
},
count: 0,
dayColumns,
dataList: [],
};
},
mounted() {
this.getList();
},
methods: {
reset() {
this.$refs['form'].resetFields();
this.getList(); // 接口好了以后调用
},
getList(page = 1) {
// const reg = /^[0-9]+.?[0-9]*$/;
// if (this.form.inviterId !== '' && !reg.test(this.form.inviterId)) {
// this.$Notice.error({
// title: '请输入数字类型的userId',
// });
// return;
// }
this.form.pageNo = page;
this.dataList = [
{
date: 123,
GMV: 'GMV',
meanPrice: 987,
price: 1,
count: 1000,
balance: 100,
totalPrice: 10000,
status: 1,
dayPerson: 345,
},
{
date: 321,
GMV: 'GMV',
meanPrice: 987,
price: 1,
count: 1000,
balance: 100,
totalPrice: 10000,
status: 1,
dayPerson: 345,
},
];
// sendMessageApi.inviteList(this.form).then(res => {
// this.dataList = res.dataList || [];
// this.count = res.totalCount;
// });
},
changePage(page) {
this.getList(page);
},
},
};
</script>
<template>
<div>
<Form ref="form" :label-width="90" inline :model="form" style="margin-top:20px;">
<FormItem label="日期选择" prop="date">
<DatePicker type="datetime" :value="form.date" placeholder="请选择" style="width: 200px" @on-change="changeDate" />
</FormItem>
<FormItem label="主订单号:" prop="mainBillNo">
<Input v-model="form.mainBillNo" placeholder="请输入主订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="子订单号:" prop="secondBillNo">
<Input v-model="form.secondBillNo" placeholder="请输入子订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="商品sku编号:" prop="skuNo">
<Input v-model="form.skuNo" placeholder="请输入商品sku" clearable style="width: 180px" />
</FormItem>
<FormItem label="下单用户id:" prop="userId">
<Input v-model="form.userId" placeholder="请输入商品sku" clearable style="width: 180px" />
</FormItem>
<FormItem label="收货人姓名:" prop="userName">
<Input v-model="form.userName" placeholder="请输入用户姓名" clearable style="width: 180px" />
</FormItem>
<FormItem>
<Button type="primary" @click="getList()">查询</Button>
<Button type="" @click="reset()">重置</Button>
</FormItem>
</Form>
<Table border :columns="expenditureColumns" :data="dataList" class="dataTable" />
<Page style="margin:20px" :total="count" :current="form.pageNo" :page-size="form.pageSize" size="small" show-total show-elevator @on-change="changePage" />
</div>
</template>
<script>
// import sendMessageApi from '../../services/apis/appUrl.service';
import { expenditureColumns } from './constData.js';
export default {
data() {
return {
form: {
pageNo: 1,
pageSize: 10,
},
count: 0,
expenditureColumns,
dataList: [],
};
},
mounted() {
this.getList();
},
methods: {
changeDate(date) {
this.form.date = date || '';
},
reset() {
this.$refs['form'].resetFields();
this.form.date = '';
this.getList(); // 接口好了以后调用
},
getList(page = 1) {
// const reg = /^[0-9]+.?[0-9]*$/;
// if (this.form.inviterId !== '' && !reg.test(this.form.inviterId)) {
// this.$Notice.error({
// title: '请输入数字类型的userId',
// });
// returnhis;
// }
this.form.pageNo = page;
console.log('this.form', this.form);
this.dataList = [
{
date: 123,
mainBillNo: 'GMV',
secondBillNo: 987,
skuNo: 1,
userId: 1000,
userName: 100,
phone: 10000,
address: 1,
billStatus: 345,
count: 345,
mainAccount: 1000,
refundTime: '2012-09-22',
refundPrice: 200,
firstCategory: '一级类目',
secondCategory: '二级类目',
threeCategory: '三级类目',
brand: '品牌',
goodsName: '商品名称',
},
];
// sendMessageApi.inviteList(this.form).then(res => {
// this.dataList = res.dataList || [];
// this.count = res.totalCount;
// });
},
changePage(page) {
this.getList(page);
},
},
};
</script>
<style>
.dataTable {
clear: both;
}
</style>
<template>
<div>
<Form ref="form" :label-width="90" inline :model="form" style="margin-top:20px;">
<FormItem label="日期选择" prop="date">
<DatePicker type="datetime" :value="form.date" placeholder="请选择" style="width: 200px" @on-change="changeDate" />
</FormItem>
<FormItem label="主订单号:" prop="mainBillNo">
<Input v-model="form.mainBillNo" placeholder="请输入主订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="子订单号:" prop="secondBillNo">
<Input v-model="form.secondBillNo" placeholder="请输入子订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="商品sku编号:" prop="skuNo">
<Input v-model="form.skuNo" placeholder="请输入商品sku" clearable style="width: 180px" />
</FormItem>
<FormItem label="开票流水单号:" prop="liushui">
<Input v-model="form.liushui" placeholder="请输入商品sku" clearable style="width: 180px" />
</FormItem>
<FormItem>
<Button type="primary" @click="getList()">查询</Button>
<Button type="" @click="reset()">重置</Button>
</FormItem>
</Form>
<Table border :columns="weixinPayRecord" :data="dataList" class="dataTable" />
<Page style="margin:20px" :total="count" :current="form.pageNo" :page-size="form.pageSize" size="small" show-total show-elevator @on-change="changePage" />
</div>
</template>
<script>
// import sendMessageApi from '../../services/apis/appUrl.service';
import { weixinPayRecord } from './constData.js';
export default {
data() {
return {
form: {
pageNo: 1,
pageSize: 10,
},
count: 0,
weixinPayRecord,
dataList: [],
};
},
mounted() {
this.getList();
},
methods: {
changeDate(date) {
this.form.date = date || '';
},
reset() {
this.$refs['form'].resetFields();
this.form.date = '';
this.getList(); // 接口好了以后调用
},
getList(page = 1) {
// const reg = /^[0-9]+.?[0-9]*$/;
// if (this.form.inviterId !== '' && !reg.test(this.form.inviterId)) {
// this.$Notice.error({
// title: '请输入数字类型的userId',
// });
// returnhis;
// }
this.form.pageNo = page;
console.log('this.form', this.form);
this.dataList = [
{
date: 123,
mainBillNo: 'GMV',
secondBillNo: 987,
skuNo: 1,
liushui: '流水单号',
payStatus: 0,
},
];
// sendMessageApi.inviteList(this.form).then(res => {
// this.dataList = res.dataList || [];
// this.count = res.totalCount;
// });
},
changePage(page) {
this.getList(page);
},
},
};
</script>
<style scoped>
.dataTable {
clear: both;
}
</style>
<template>
<div>
<Form ref="form" :label-width="90" inline :model="form" style="margin-top:20px;">
<FormItem label="日期选择" prop="date">
<DatePicker type="datetime" :value="form.date" placeholder="请选择" style="width: 200px" @on-change="changeDate" />
</FormItem>
<FormItem label="主订单号:" prop="mainBillNo">
<Input v-model="form.mainBillNo" placeholder="请输入主订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="子订单号:" prop="secondBillNo">
<Input v-model="form.secondBillNo" placeholder="请输入子订单号" clearable style="width: 180px" />
</FormItem>
<FormItem label="商品sku编号:" prop="skuNo">
<Input v-model="form.skuNo" placeholder="请输入商品sku" clearable style="width: 180px" />
</FormItem>
<FormItem label="微信支付结果:" prop="userName">
<Select v-model="form.payStatus" style="width:180px" filterable>
<Option :value="0">已到期</Option>
<Option :value="1">未到期</Option>
</Select>
</FormItem>
<FormItem>
<Button type="primary" @click="getList()">查询</Button>
<Button type="" @click="reset()">重置</Button>
</FormItem>
</Form>
<Table border :columns="weixinPayRecord" :data="dataList" class="dataTable" />
<Page style="margin:20px" :total="count" :current="form.pageNo" :page-size="form.pageSize" size="small" show-total show-elevator @on-change="changePage" />
</div>
</template>
<script>
// import sendMessageApi from '../../services/apis/appUrl.service';
import { weixinPayRecord } from './constData.js';
export default {
data() {
return {
form: {
pageNo: 1,
pageSize: 10,
},
count: 0,
weixinPayRecord,
dataList: [],
};
},
mounted() {
this.getList();
},
methods: {
changeDate(date) {
this.form.date = date || '';
},
reset() {
this.$refs['form'].resetFields();
this.form.date = '';
this.getList(); // 接口好了以后调用
},
getList(page = 1) {
// const reg = /^[0-9]+.?[0-9]*$/;
// if (this.form.inviterId !== '' && !reg.test(this.form.inviterId)) {
// this.$Notice.error({
// title: '请输入数字类型的userId',
// });
// returnhis;
// }
this.form.pageNo = page;
console.log('this.form', this.form);
this.dataList = [
{
date: 123,
mainBillNo: 'GMV',
secondBillNo: 987,
skuNo: 1,
payStatus: 0,
payAccount: 100,
},
];
// sendMessageApi.inviteList(this.form).then(res => {
// this.dataList = res.dataList || [];
// this.count = res.totalCount;
// });
},
changePage(page) {
this.getList(page);
},
},
};
</script>
<style scoped>
.dataTable {
clear: both;
}
</style>
<template>
<div>
<Modal width="750" v-model="visible" title="查看订单" @on-cancel="cancel">
<Table ref="currentRowTable" border :columns="columns" :data="data" />
<div slot="footer" class="foot">
<Button size="large" @click="cancel">取消</Button>
</div>
</Modal>
</div>
</template>
<script>
export default {
props: {
visible: {
type: Boolean,
default: false,
},
data: {
type: Array,
default: () => [],
},
},
data() {
return {
columns: [
{
key: 'billNo',
title: '订单编号',
align: 'center',
},
{
key: 'payStatus',
title: '支付状态',
align: 'center',
render: (h, params) => (+params.row.payStatus ? '未支付' : '已支付'),
},
{
key: 'balance',
title: '余额支付金额',
align: 'center',
},
{
key: 'weixinCount',
title: '微信支付金额',
align: 'center',
},
{
key: 'time',
title: '下单时间',
align: 'center',
},
{
key: 'goodsName',
title: '商品名称',
align: 'center',
},
],
};
},
methods: {
cancel() {
this.$emit('cancle');
},
},
};
</script>
// 余额状态
const bstaus = {
0: '未到期',
1: '已到期',
};
//用户状态
const userStatus = {
0: '未启用',
1: '启用',
};
export const columns = [
{
key: 'userId',
title: '用户Id',
align: 'center',
},
{
key: 'phone',
title: '用户手机号',
align: 'center',
},
{
key: 'bstatus',
title: '余额状态',
align: 'center',
render: (h, params) => bstaus[params.row.bstatus],
},
{
key: 'count',
title: '初始金额',
align: 'center',
},
{
key: 'balance',
title: '当前余额',
align: 'center',
},
{
key: 'joinDate',
title: '注册时间',
align: 'center',
},
{
key: 'date',
title: '余额到期日期',
align: 'center',
},
{
key: 'totalPrice',
title: '微信支付累计金额',
align: 'center',
},
{
key: 'status',
title: '用户状态',
align: 'center',
render: (h, params) => userStatus[params.row.status],
},
];
<template>
<div>
<Form ref="form" :label-width="90" inline :model="form" style="margin-top:20px;">
<FormItem label="用户id:" prop="userId">
<Input v-model="form.userId" placeholder="请输入用户userId" clearable style="width: 180px" />
</FormItem>
<FormItem label="用户手机号:" prop="phoneNo">
<Input v-model="form.phoneNo" placeholder="请输入用户userId" clearable style="width: 180px" />
</FormItem>
<FormItem label="余额状态:" prop="status">
<Select v-model="form.status" style="width:180px" filterable>
<Option :value="0">已到期</Option>
<Option :value="1">未到期</Option>
</Select>
</FormItem>
<FormItem>
<Button type="primary" @click="getList()">查询</Button>
<Button type="" @click="reset()">重置</Button>
</FormItem>
</Form>
<Table ref="currentRowTable" border :columns="columns" :data="dataList" />
<Page style="margin:20px" :total="count" :current="form.pageNo" :page-size="form.pageSize" size="small" show-total show-elevator @on-change="changePage" />
<bill-modal :visible="showBillModal" :data="billInfoList" @cancle="showBillModal = false" />
</div>
</template>
<script>
// import sendMessageApi from '../../services/apis/appUrl.service';
import { columns } from './constData.js';
import BillModal from './components/billModal.vue';
export default {
data() {
return {
form: {
pageNo: 1,
pageSize: 10,
userId: '',
phoneNo: '',
status: '',
},
count: 0,
columns: [
...columns,
{
key: 'option',
title: '操作',
align: 'center',
width: '200px',
render: (h, params) => {
return h('div', [
h(
'Button',
{
props: {
type: 'primary',
size: 'small',
},
style: {
margin: '5px',
},
on: {
click: () => {
console.log('点击停用&启用');
},
},
},
params.row.status ? '停用' : '启用'
),
h(
'Button',
{
props: {
type: 'primary',
size: 'small',
},
style: {
margin: '0 5px',
},
on: {
click: () => {
console.log('查看订单');
this.showBillModal = true;
},
},
},
'查看订单'
),
]);
},
},
],
dataList: [],
showBillModal: false,
billInfoList: [
{
billNo: 123456,
payStatus: 0,
balance: 1000,
weixinCount: 893,
time: '2012-09-23',
goodsName: '商品名称',
},
],
};
},
components: {
BillModal,
},
mounted() {
this.getList();
},
methods: {
reset() {
this.$refs['form'].resetFields();
this.getList(); // 接口好了以后调用
},
getList(page = 1) {
// const reg = /^[0-9]+.?[0-9]*$/;
// if (this.form.inviterId !== '' && !reg.test(this.form.inviterId)) {
// this.$Notice.error({
// title: '请输入数字类型的userId',
// });
// return;
// }
this.form.pageNo = page;
this.dataList = [
{
userId: 123,
phone: 18809090987,
bstatus: 1,
count: 1000,
balance: 100,
joinDate: '2021-09-08',
date: '2021-09-43',
totalPrice: 10000,
status: 1,
},
{
userId: 321,
phone: 18809090987,
bstatus: 0,
count: 1000,
balance: 100,
joinDate: '2021-09-08',
date: '2021-09-43',
totalPrice: 10000,
status: 0,
},
];
// sendMessageApi.inviteList(this.form).then(res => {
// this.dataList = res.dataList || [];
// this.count = res.totalCount;
// });
},
changePage(page) {
this.getList(page);
},
},
};
</script>
<style lang="less" scoped>
.col-option {
margin: 5px 10px 5px 0;
display: flex;
align-content: center;
justify-content: center;
.label-option {
line-height: 30px;
margin-right: 10px;
}
}
</style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment