Commit ee7a9c05 authored by 孙 楠's avatar 孙 楠

add i18n messages

parent 20c7bde2
......@@ -13,7 +13,7 @@ artifacts.json
*tmp
_site
logs
app/**/*.js
#app/**/*.js
config/plugin.local.js
config/plugin.js
config/config.*.js
......
......@@ -26,7 +26,7 @@ export default class EditorController extends Controller {
await ctx.service.redis.del(`page:${uuid}`);
} catch (error) {
if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) {
error.message = '配置组件过多,请对组件进行删减';
error.message = $t('too.many.components.reduce.them');
}
ctx.body = ctx.helper.fail(error);
}
......@@ -51,7 +51,7 @@ export default class EditorController extends Controller {
ctx.body = ctx.helper.ok(result);
} catch (error) {
if (error.message.indexOf('Data too long') > -1 && error.message.indexOf('page_data') > -1) {
error.message = '配置组件过多,请对组件进行删减';
error.message = $t('too.many.components.reduce.them');
}
ctx.body = ctx.helper.fail(error);
}
......
......@@ -10,7 +10,7 @@ export default class NavigatorController extends Controller {
} catch (e) {
ctx.logger.info(`获取导航配置数据异常, ${JSON.stringify(e)}`);
ctx.body = ctx.helper.fail({
message: '获取数据异常'
message: $t('data.fetch.error')
});
}
}
......@@ -23,7 +23,7 @@ export default class NavigatorController extends Controller {
} catch (e) {
ctx.logger.info(`获取导航配置数据异常, ${JSON.stringify(e)}`);
ctx.body = ctx.helper.fail({
message: '获取数据异常'
message: $t('data.fetch.error')
});
}
}
......@@ -36,7 +36,7 @@ export default class NavigatorController extends Controller {
} catch (e) {
ctx.logger.info(`删除导航配置异常, ${JSON.stringify(e)}`);
ctx.body = ctx.helper.fail({
message: '删除导航配置失败'
message: $t('failed.to.delete.nav.config')
});
}
}
......@@ -65,7 +65,7 @@ export default class NavigatorController extends Controller {
} catch (e) {
ctx.logger.info(`保存导航配置异常, ${JSON.stringify(e)}`);
ctx.body = ctx.helper.fail({
message: '保存导航配置失败'
message: $t('failed.to.save.nav.config')
});
}
}
......@@ -78,7 +78,7 @@ export default class NavigatorController extends Controller {
} catch (e) {
ctx.logger.info(`查询导航配置异常, ${JSON.stringify(e)}`);
ctx.body = ctx.helper.fail({
message: '查询导航配置失败'
message: $t('failed.to.query.nav.config')
});
}
return
......
......@@ -14,7 +14,7 @@ export function ok(data) {
};
}
export function fail({ message = '服务异常', code = '0001', businessCode = '0001' }) {
export function fail({ message = $t('service.error'), code = '0001', businessCode = '0001' }) {
return {
code,
businessCode,
......
This diff is collapsed.
This diff is collapsed.
......@@ -46,25 +46,25 @@ export default {
openNames: ['0'],
isCollapsed: false,
page: [{
name: '作品列表',
name: $t('works.list'),
icon: 'ios-list',
path: 'list',
children: []
},
{
name: '我的草稿',
name: $t('my.drafts'),
icon: 'ios-book',
path: 'my',
children: []
},
{
name: '创意模板',
name: $t('creative.template'),
icon: 'ios-compose',
path: 'template',
children: []
},
{
name: '导航配置',
name: $t('navigation.config'),
icon: 'ios-compose',
path: 'navigator',
children: []
......
......@@ -27,7 +27,7 @@ if (process.env.SENTRY_ENV !== 'test' && process.env.NODE_ENV === 'production')
})
export default class Layout extends Vue {
activeName: string = 'list';
username: string = localStorage.get('user')?.name || '陌生人';
username: string = localStorage.get('user')?.name || $t('stranger');
@Action('fetchTenantAuthData') fetchTenantAuthData;
@State(state => state.tenant) tenant;
......
......@@ -10,18 +10,18 @@
accordion
@on-select="select"
>
<div class="layout-logo-left">低代码平台</div>
<Menu-item name="list">作品列表</Menu-item>
<Menu-item name="my">我的草稿</Menu-item>
<Menu-item name="template">创意模板</Menu-item>
<Menu-item name="navigator">导航配置</Menu-item>
<div class="layout-logo-left">{{ $t('lowcode.platform') }}</div>
<Menu-item name="list">{{ $t('works.list') }}</Menu-item>
<Menu-item name="my">{{ $t('my.drafts') }}</Menu-item>
<Menu-item name="template">{{ $t('creative.template') }}</Menu-item>
<Menu-item name="navigator">{{ $t('navigation.config') }}</Menu-item>
</Menu>
</i-col>
<i-col :span="21" class="layout-menu-right">
<div class="layout-header">
<div class="avator">
<span>{{ username }}</span>
<span @click="logOut" style="cursor: pointer;">退出</span>
<span @click="logOut" style="cursor: pointer;">{{ $t('logout') }}</span>
</div>
</div>
<div class="layout-content">
......
......@@ -9,12 +9,12 @@ export const columns = function(pointer) {
},
{
align: 'center',
title: '名称',
title: $t('name'),
key: 'name'
},
{
align: 'center',
title: '所选页面',
title: $t('selected.page'),
render: (h, params) => {
const navigatorData = params.row.navigatorData;
let str = '';
......@@ -31,17 +31,17 @@ export const columns = function(pointer) {
},
{
align: 'center',
title: '作者',
title: $t('author'),
key: 'author'
},
{
align: 'center',
title: '更新时间',
title: $t('update.time'),
key: 'updatedAt'
},
{
align: 'center',
title: '操作',
title: $t('action'),
key: 'updateTime',
render: (h, params) => {
const row = params.row;
......@@ -59,7 +59,7 @@ export const columns = function(pointer) {
pointer.showAddr(row);
}
}
}, '地址列表'),
}, $t('address.list')),
// h('Button', {
// props: {
// type: 'primary',
......@@ -87,7 +87,7 @@ export const columns = function(pointer) {
pointer.edit(row);
}
}
}, '修改'),
}, $t('edit')),
h('Button', {
props: {
type: 'error',
......@@ -98,7 +98,7 @@ export const columns = function(pointer) {
pointer.delete(row);
}
}
}, '删除'),
}, $t('delete')),
]);
},
width: 300
......@@ -111,25 +111,25 @@ export const urlTableColumns = function(pointer) {
return [
{
align: 'center',
title: '排序',
title: $t('sort'),
key: 'id',
width: 80
},
{
align: 'center',
title: '导航名称',
title: $t('nav.name'),
key: 'configName',
width: 120
},
{
align: 'center',
title: '所选页面',
title: $t('selected.page'),
key: 'pageName',
width: 120
},
{
align: 'center',
title: '跳转链接',
title: $t('redirect.link'),
key: 'pageUrl'
},
];
......
......@@ -11,7 +11,7 @@
</div>
<cr-button class="Gi_one-right" type="primary" @click="pickupCoupon(coupon)">{{btnText(coupon.pickupAble)}}</cr-button>
<div class="coupon-item-mask" v-if="!coupon.pickupAble && coupon.publishCountFinished">
<p>已抢空</p>
<p>{{ $t('sold.out') }}</p>
</div>
</div>
</div>
......@@ -24,7 +24,7 @@
{{btnText(coupon.pickupAble)}}
</cr-button>
<div class="coupon-item-mask" v-if="!coupon.pickupAble && coupon.publishCountFinished">
<p>已抢空</p>
<p>{{ $t('sold.out') }}</p>
</div>
</div>
</div>
......@@ -76,7 +76,7 @@
async pickupCoupon(coupon) {
if (!coupon.pickupAble) {
await operationApi.pickupCoupon({ couponId: coupon.id });
this.$toast.success('领取成功');
this.$toast.success($t('claimed.successfully'));
await this.getCoupons([coupon.id]);
} else {
window.location.href = coupon.navUrl;
......@@ -87,7 +87,7 @@
if(coupons && coupons.length) this.list = coupons;
},
btnText(pickupAble) {
return pickupAble ? '去使用' : '立即领取';
return pickupAble ? $t('use.now') : $t('claim.now');
}
}
}
......
......@@ -3,7 +3,7 @@
<img class="top-bar-left" :src="leftImg" />
<div class="top-bar-right">
<a :href="href">
<button class="top-bar-button">打开APP</button>
<button class="top-bar-button">{{ $t('open.app') }}</button>
</a>
<img class="top-bar-close" @click="close" src="./images/close@2x.png" />
</div>
......
......@@ -12,7 +12,7 @@
name="phoneNo"
type="tel"
label=""
placeholder="请填写您的手机号"
:placeholder="$t('enter.your.phone.number')"
:rules="validOptions[0]"
/>
<cr-field
......@@ -22,7 +22,7 @@
name="captcha"
type="digit"
label=""
placeholder="请填写图片验证码"
:placeholder="$t('enter.image.verification.code')"
:rules="validOptions[1]"
>
<template slot="button">
......@@ -35,7 +35,7 @@
name="verifyCode"
type="tel"
label=""
placeholder="请填写验证码"
:placeholder="$t('enter.verification.code')"
:rules="validOptions[1]"
>
<template slot="button">
......@@ -65,10 +65,10 @@ import config from '@/config/index';
const validOptions = [
[
{ required: true, message: "请填写您的手机号" },
{ validator: isPhone, message: "请填写正确的手机号码" }
{ required: true, message: $t('enter.your.phone.number') },
{ validator: isPhone, message: $t('enter.valid.phone.number') }
],
[{ required: true, message: "请填写验证码" }]
[{ required: true, message: $t('enter.verification.code') }]
];
let timer = null;
let sa = null;
......@@ -115,7 +115,7 @@ export default {
return !isPhone(this.formData.phoneNo);
},
captchaBtnText() {
return this.showCount ? `剩余${this.count}秒` : '获取验证码';
return this.showCount ? `剩余${this.count}秒` : $t('get.verification.code');
},
btnStyles() {
return this.btnImage ? {
......@@ -175,7 +175,7 @@ export default {
function(captchaObj) {
vm.$refs.sendVcode.addEventListener('click', function() {
if (!isPhone(vm.formData.phoneNo)) {
vm.$notify({ type: "warning", message: "请填写正确的手机号码" });
vm.$notify({ type: "warning", message: $t('enter.valid.phone.number') });
return;
}
if (vm.showCount) return;
......@@ -189,7 +189,7 @@ export default {
vm.getCode(captchaObj);
});
captchaObj.onError(function() {
vm.$toast("尝试过多,请点击重试");
vm.$toast($t('too.many.attempts.retry'));
});
}
);
......@@ -201,14 +201,14 @@ export default {
},
async getCode(captchaObj) {
if (!isPhone(this.formData.phoneNo)) {
this.$notify({ type: "warning", message: "请填写正确的手机号码" });
this.$notify({ type: "warning", message: $t('enter.valid.phone.number') });
return;
}
if (timer) return;
try {
await this.sendCode();
this.smsCount();
this.$notify({ type: "success", message: "短信验证码已发送,请注意查收" });
this.$notify({ type: "success", message: $t('sms.code.sent') });
} finally {
this.resetJyState(captchaObj);
}
......@@ -247,8 +247,8 @@ export default {
this.goNext();
} finally {
sa.track('LoginEvent', {
le_login_action: '注册/登录',
le_login_type: '验证码登录',
le_login_action: $t('registerlogin'),
le_login_type: $t('verify.code.login'),
le_is_login_success,
le_channel_code: this.registerFrom,
});
......
......@@ -215,7 +215,7 @@
};
const throwError = function(errorType, config) {
const errors = {
networkError: '网络错误'
networkError: $t('network.error')
};
if (typeof config.onError === 'function') {
config.onError(errors[errorType]);
......
......@@ -15,9 +15,7 @@
shape="circle"
type="primary"
@click="go('detail', goods.skuNo)"
>
立即抢购
</cr-button>
>{{ $t('buy.now') }}</cr-button>
</div>
</div>
</div>
......@@ -111,7 +109,7 @@
const { skuNo, skuSource } = goods;
const params = [{ skuId: skuNo, skuNum: 1, skuSource, type: 1 }];
await operationApi.addShopCart({ shopCartBaseList: params });
this.$toast.success('添加成功');
this.$toast.success($t('added.successfully'));
}
}
}
......
......@@ -5,12 +5,12 @@ export const basicComponents = [
{
eleName: 'freedom-container',
coverImage: 'https://img.91xr.cn/citrus-ui/cherry-component-cover-free-container.png',
title: '自由容器',
title: $t('free.container'),
config: [
{
key: 'link',
name: '跳转链接',
desc: '跳转链接',
name: $t('redirect.link'),
desc: $t('redirect.link'),
type: 'text',
},
// {
......@@ -21,14 +21,14 @@ export const basicComponents = [
// },
{
key: 'isFinance',
name: '是否导流',
desc: '是否导流',
name: $t('diversion'),
desc: $t('diversion'),
type: 'checkbox',
},
{
key: 'needLogin',
name: '是否登录',
desc: '是否登录',
name: $t('logged.in'),
desc: $t('logged.in'),
type: 'checkbox',
}
],
......
......@@ -21,7 +21,7 @@ export default class DynamicForm extends Vue {
formCustom: PageInfo = {};
ruleCustom: object = {
pageName: [
{ required: true, message: '请输入页面名称', trigger: 'blur' }
{ required: true, message: $t('enter.page.name'), trigger: 'blur' }
],
shareOpenMethod: [
{ validator: this.validateOpenMethod, trigger: 'blur' }
......@@ -29,7 +29,7 @@ export default class DynamicForm extends Vue {
};
get enableShare() {
return this.pageData.props?.btAttachVal.some(item => item.persets === '分享');
return this.pageData.props?.btAttachVal.some(item => item.persets === $t('share'));
}
@Watch('pageData', { immediate: true })
......@@ -79,17 +79,17 @@ export default class DynamicForm extends Vue {
}
preview() {
this.formCustom.pageName = this.formCustom.pageName || '未命名';
this.formCustom.pageName = this.formCustom.pageName || $t('unnamed');
this.handleSubmit('preview');
}
autoSave() {
this.formCustom.pageName = this.formCustom.pageName || '未命名';
this.formCustom.pageName = this.formCustom.pageName || $t('unnamed');
this.handleSubmit('autoSave');
}
validateOpenMethod(rule, value, callback) {
if (!value && this.enableShare) {
callback(new Error('请选择分享打开方式'));
callback(new Error($t('select.share.method')));
} else {
callback();
}
......
......@@ -2,45 +2,45 @@
<Modal v-model="showPopup" width="380" @on-visible-change="change" class-name='basic-form'>
<!-- {{formCustom}} -->
<Form @submit.native.prevent ref="formCustom" :model="formCustom" :rules="ruleCustom" :label-width="80" label-position="left">
<FormItem label="页面名称" prop="pageName">
<Input v-model="formCustom.pageName" placeholder="请输入页面名称"></Input>
<FormItem :label="$t('page.name')" prop="pageName">
<Input v-model="formCustom.pageName" :placeholder="$t('enter.page.name')"></Input>
</FormItem>
<FormItem label="页面描述" prop="pageDescribe">
<Input v-model="formCustom.pageDescribe" type="textarea" placeholder="请输入页面描述" :rows="3"></Input>
<FormItem :label="$t('page.description')" prop="pageDescribe">
<Input v-model="formCustom.pageDescribe" type="textarea" :placeholder="$t('enter.page.description')" :rows="3"></Input>
</FormItem>
<FormItem label="页面关键字" prop="pageKeywords">
<Input v-model="formCustom.pageKeywords" type="textarea" placeholder="请输入页面关键字" :rows="3"></Input>
<FormItem :label="$t('page.keywords')" prop="pageKeywords">
<Input v-model="formCustom.pageKeywords" type="textarea" :placeholder="$t('enter.page.keywords')" :rows="3"></Input>
</FormItem>
<FormItem label="页面缩略图" prop="shareCoverImage">
<FormItem :label="$t('page.thumbnail')" prop="shareCoverImage">
<Upload v-model="formCustom.shareCoverImage" :show-input="false" />
<p class="basic-form__tip">可选,默认使用页面缩略图,建议图片比例1:1,图片格式jpg、png</p>
<p class="basic-form__tip">{{ $t('optional.defaults.to.thumbnail.11.jpgpng') }}</p>
</FormItem>
<FormItem label="分享打开方式" prop="shareOpenMethod" v-if="cartAndShareBtn">
<FormItem :label="$t('share.method')" prop="shareOpenMethod" v-if="cartAndShareBtn">
<RadioGroup v-model="formCustom.shareOpenMethod">
<Radio :label="1" :disabled="!enableShare">小程序</Radio>
<Radio :label="1" :disabled="!enableShare">{{ $t('mini.program') }}</Radio>
<Radio :label="2" :disabled="!enableShare">APP</Radio>
</RadioGroup>
<p class="basic-form__tip">在H5中打开哪一个终端,当分享功能未启用时,此处不可选</p>
<p class="basic-form__tip">{{ $t('h5.terminal.selection.disabled.when.sharing.off') }}</p>
</FormItem>
<FormItem label="是否发布" prop="isPublish">
<FormItem :label="$t('publish')" prop="isPublish">
<i-switch v-model="formCustom.isPublish"></i-switch>
</FormItem>
<FormItem label="活动有效期" prop="redirectUrl">
<DatePicker v-model="validTime" @on-change="validTimeChange" format="yyyy/MM/dd HH:mm:ss" type="datetimerange" placeholder="选填,留空默认长期有效" style="width: 100%"></DatePicker>
<FormItem :label="$t('activity.period')" prop="redirectUrl">
<DatePicker v-model="validTime" @on-change="validTimeChange" format="yyyy/MM/dd HH:mm:ss" type="datetimerange" :placeholder="$t('optional.default.permanent')" style="width: 100%"></DatePicker>
</FormItem>
<FormItem label="活动结束url" prop="redirectUrl">
<Input v-model="formCustom.redirectUrl" placeholder="选填,留空默认首页" :rows="3"></Input>
<FormItem :label="$t('activity.end.url')" prop="redirectUrl">
<Input v-model="formCustom.redirectUrl" :placeholder="$t('optional.default.homepage')" :rows="3"></Input>
</FormItem>
<FormItem label="导流url" prop="diversion">
<Input v-model="formCustom.diversion" placeholder="选填,具体url请联系对应导流项目的产品或开发" :rows="3"></Input>
<FormItem :label="$t('diversion.url')" prop="diversion">
<Input v-model="formCustom.diversion" :placeholder="$t('optional.contact.pmdev.for.url')" :rows="3"></Input>
</FormItem>
<FormItem label="设为模板" prop="isTemplate" v-if="formCustom.isPublish">
<FormItem :label="$t('set.as.template')" prop="isTemplate" v-if="formCustom.isPublish">
<i-switch v-model="formCustom.isTemplate"></i-switch>
</FormItem>
</Form>
<div slot="footer">
<Button type="success" :loading="loadingSave" @click="handleSubmit('save')">保存</Button>
<Button type="info" :loading="loadingPreview" @click="handleSubmit('preview')">保存并预览</Button>
<Button type="success" :loading="loadingSave" @click="handleSubmit('save')">{{ $t('save') }}</Button>
<Button type="info" :loading="loadingPreview" @click="handleSubmit('preview')">{{ $t('save.preview') }}</Button>
</div>
</Modal>
</template>
......
......@@ -14,7 +14,7 @@
:src="config.coverImage || 'http://activitystatic.q-gp.com/low_code.jpg'"
/>
</div>
<span class="dynamic-row-popup">拖拽或双击</span>
<span class="dynamic-row-popup">{{ $t('drag.or.doubleclick') }}</span>
</Card>
</Col>
</Row>
......@@ -33,7 +33,7 @@
:src="config.coverImage || 'http://activitystatic.q-gp.com/low_code.jpg'"
/>
</div>
<span class="dynamic-row-popup">拖拽或双击</span>
<span class="dynamic-row-popup">{{ $t('drag.or.doubleclick') }}</span>
</Card>
</Col>
</Row>
......
......@@ -2,8 +2,8 @@
<div class="form-list">
<Card class="form-list-card" :key="index" v-for="(item, index) in list">
<div slot='title' class="Fl-card-title">
<h4>项目{{index + 1}}</h4>
<a @click="del(index)">删除</a>
<h4>{{ $t('item') }}{{index + 1}}</h4>
<a @click="del(index)">{{ $t('delete') }}</a>
</div>
<Form @submit.native.prevent :model="item" :label-width="50">
<FormItem :prop="`${keywords.key}`" :label="keywords.name" :key="idx" v-for="(keywords, idx) in formControl">
......@@ -12,7 +12,7 @@
</Form>
</Card>
<div class="form-list-button">
<Button type="dashed" icon="plus-round" @click="add">添加项目</Button>
<Button type="dashed" icon="plus-round" @click="add">{{ $t('add.item') }}</Button>
</div>
</div>
</template>
......@@ -22,9 +22,9 @@ import { SHOP_CART_CONFIG, SHARE_CONFIG, DEFAULT_CONFIG } from '@service/staticD
import { v4 as uuid } from 'uuid';
const CONFIG_MAP = {
['购物车']: SHOP_CART_CONFIG,
['分享']: SHARE_CONFIG,
['自定义']: DEFAULT_CONFIG
[$t('shopping.cart')]: SHOP_CART_CONFIG,
[$t('share')]: SHARE_CONFIG,
[$t('custom')]: DEFAULT_CONFIG
};
export default {
name: 'BackTopPicker',
......@@ -36,7 +36,7 @@ const CONFIG_MAP = {
},
methods: {
shareDisableUrl(item, keywords) {
return item.persets === '分享' && keywords.key === 'url';
return item.persets === $t('share') && keywords.key === 'url';
},
handleModelChange(e, key, index) {
if (key !== 'persets') return;
......@@ -50,8 +50,8 @@ const CONFIG_MAP = {
pre[cur.key] = this.formDefault[cur.key] || '';
return pre;
}, {});
if (object.persets === '自定义') {
object.name = '自定义-' + uuid().slice(19);
if (object.persets === $t('custom')) {
object.name = $t('custom') + uuid().slice(19);
}
this.list.push(object);
},
......
......@@ -4,29 +4,28 @@
v-model="data.ids"
type="textarea"
:autosize="{minRows: 3,maxRows: 10}"
placeholder="请输入skuNo,每个skuNo使用英文逗号隔开"
:placeholder="$t('enter.skuno.separated.by.commas')"
@on-blur="changeIds"
/>
<div class="goodsItem" v-for="(item, index) in data.data" :key="index">
<div class="title">
商品{{index + 1}}
<div class="title">{{ $t('product') }}{{index + 1}}
</div>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="sku_no" prop="skuNo">
<Input v-model="item.skuNo" disabled />
</FormItem>
<FormItem label="商品名称" prop="goodsName">
<FormItem :label="$t('product.name')" prop="goodsName">
<Input v-model="item.goodsName" />
</FormItem>
<FormItem label="商品主图" prop="img">
<FormItem :label="$t('product.image')" prop="img">
<Upload v-model="item.img"></Upload>
</FormItem>
<FormItem label="商品横幅文案" prop="subtitle">
<FormItem :label="$t('product.banner.text')" prop="subtitle">
<Input v-model="item.subtitle" />
</FormItem>
</Form>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">删除</Button>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">{{ $t('delete') }}</Button>
</div>
</div>
</template>
......@@ -113,7 +112,7 @@ export default {
const skus = ids ? ids.split(',') : [];
if (skus.length) {
if (skus.length > 15) {
this.$toast('最多填入15个商品');
this.$toast($t('max.15.products'));
return;
}
this.getGoods({
......
......@@ -3,37 +3,37 @@
<!-- <Button type="primary" @click="save">保存</Button> -->
<div class="item" v-for="(item, index) in categoryData" :key="index">
<Form ref="formInline" :model="item" inline>
<FormItem label="素材名称" prop="name">
<FormItem :label="$t('material.name')" prop="name">
<Input v-model="item.name" placeholder="" />
</FormItem>
<FormItem label="素材图片" prop="img">
<FormItem :label="$t('material.image')" prop="img">
<Upload v-model="item.img"></Upload>
</FormItem>
<FormItem label="利益点" prop="text">
<FormItem :label="$t('benefit.point')" prop="text">
<Input v-model="item.text" placeholder="" />
</FormItem>
<FormItem label="logo图" prop="logoUrl">
<FormItem :label="$t('logo.image')" prop="logoUrl">
<Upload v-model="item.logoUrl"></Upload>
</FormItem>
<FormItem label="跳转链接" prop="link">
<FormItem :label="$t('redirect.link')" prop="link">
<Input v-model="item.link" placeholder="" />
</FormItem>
</Form>
<Button long type="error" @click="del(index)">删除</Button>
<Button long type="error" @click="del(index)">{{ $t('delete') }}</Button>
</div>
<Button type="ghost" @click="add">添加项目</Button>
<Modal v-model="showModal" :mask-closable="false" title="选择品类/品牌" width="700">
<Button type="ghost" @click="add">{{ $t('add.item') }}</Button>
<Modal v-model="showModal" :mask-closable="false" :title="$t('select.categorybrand')" width="700">
<Tabs :value="type" @on-click="selectType">
<TabPane label="品类" name="1">
<TabPane :label="$t('category')" name="1">
<div class="search">
<Form class="searchFormStyle" inline>
<FormItem label="类目名称" prop="name">
<FormItem :label="$t('category.name')" prop="name">
<Input v-model="searchParams.name" placeholder="" />
</FormItem>
<FormItem label="类目编码" prop="name">
<FormItem :label="$t('category.code')" prop="name">
<Input v-model="searchParams.sceneId" placeholder="" />
</FormItem>
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="search">{{ $t('search') }}</Button>
</Form>
</div>
<Table
......@@ -44,16 +44,16 @@
/>
<Page class="page" :total="total" @on-change="changePageNo" show-total></Page>
</TabPane>
<TabPane label="品牌" name="2">
<TabPane :label="$t('brand')" name="2">
<div class="search">
<Form class="searchFormStyle" inline>
<FormItem label="品牌名称" prop="name">
<FormItem :label="$t('brand.name')" prop="name">
<Input v-model="searchParams.name" placeholder="" />
</FormItem>
<FormItem label="品牌编码" prop="name">
<FormItem :label="$t('brand.code')" prop="name">
<Input v-model="searchParams.sceneId" placeholder="" />
</FormItem>
<Button type="primary" @click="search">查询</Button>
<Button type="primary" @click="search">{{ $t('search') }}</Button>
</Form>
</div>
<Table
......@@ -84,24 +84,24 @@ const categoryCol = function() {
return [
{
align: 'center',
title: '类目名称',
title: $t('category.name'),
key: 'categoryName',
},
{
align: 'center',
title: '类目编码',
title: $t('category.code'),
key: 'sceneId',
width: 120
},
{
align: 'center',
title: '类目级别',
title: $t('category.level'),
key: 'categoryLevel',
width: 120
},
{
align: 'center',
title: '图片',
title: $t('image'),
render: (h, params) => {
const row = params.row;
return h('div', {
......@@ -123,7 +123,7 @@ const categoryCol = function() {
},
{
align: 'center',
title: '操作',
title: $t('action'),
width: 120,
render: (h, params) => {
const row = params.row;
......@@ -138,7 +138,7 @@ const categoryCol = function() {
this.select(row);
}
}
}, '选择')
}, $t('select'))
]
)
}
......@@ -150,12 +150,12 @@ const brandCol = function() {
return [
{
align: 'center',
title: '品牌名称',
title: $t('brand.name'),
key: 'brandName',
},
{
align: 'center',
title: '品牌编码',
title: $t('brand.code'),
key: 'sceneId',
width: 120
},
......@@ -183,7 +183,7 @@ const brandCol = function() {
},
{
align: 'center',
title: '操作',
title: $t('action'),
width: 120,
render: (h, params) => {
const row = params.row;
......@@ -198,7 +198,7 @@ const brandCol = function() {
this.select(row);
}
}
}, '选择')
}, $t('select'))
]
)
}
......
......@@ -30,9 +30,9 @@ export default {
data() {
return {
options: [
{id: '1', label: '基础款'},
{id: '2', label: '无logo'},
{id: '3', label: '无利益点'},
{id: '1', label: $t('basic.version')},
{id: '2', label: $t('no.logo')},
{id: '3', label: $t('no.benefit.point')},
],
selected: 0
}
......
......@@ -2,19 +2,19 @@
<div>
<div class="color-selector-gradient" v-if="gradient" :class="{ active: showToColor }">
<div class="color-selector">
<Input class="color-selector-input" v-model="color" placeholder="请输入" @input="change"></Input>
<Input class="color-selector-input" v-model="color" :placeholder="$t('enter.input')" @input="change"></Input>
<ColorPicker placement="bottom-end" v-model="color" :alpha="alpha" @on-active-change="change($event)" @on-change="change($event)" />
</div>
<div class="color-selector-switch" @click="showToColor = !showToColor">
<Icon type="ios-arrow-forward" />
</div>
<div class="color-selector" v-if="showToColor">
<Input class="color-selector-input" v-model="toColor" placeholder="请输入" @input="change($event, 'to')"></Input>
<Input class="color-selector-input" v-model="toColor" :placeholder="$t('enter.input')" @input="change($event, 'to')"></Input>
<ColorPicker placement="bottom-end" v-model="toColor" :alpha="alpha" @on-active-change="change($event, 'to')" @on-change="change($event, 'to')" />
</div>
</div>
<div class="color-selector" v-else>
<Input class="color-selector-input" v-model="color" placeholder="请输入" @input="change"></Input>
<Input class="color-selector-input" v-model="color" :placeholder="$t('enter.input')" @input="change"></Input>
<ColorPicker placement="bottom-end" v-model="color" :alpha="alpha" @on-active-change="change($event)" @on-change="change($event)" />
</div>
</div>
......
<template>
<div class="column-selector">
<Tooltip placement="top" content="通栏">
<Tooltip placement="top" :content="$t('full.width')">
<Button type="ghost" icon="minus-round" @click="select(1)"></Button>
</Tooltip>
<Tooltip placement="top" content="两列">
<Tooltip placement="top" :content="$t('two.columns')">
<Button type="ghost" icon="ios-pause" @click="select(2)"></Button>
</Tooltip>
<Tooltip placement="top" content="多列" v-show="!hide3Column">
<Tooltip placement="top" :content="$t('multicolumn')" v-show="!hide3Column">
<Button type="ghost" icon="navicon-round" @click="select(3)" ></Button>
</Tooltip>
</div>
......
const couponTypeList: object[] = [
{
id: 1,
name: '满减券',
name: $t('discount.coupon'),
},
{
id: 2,
name: '运费券',
name: $t('shipping.coupon'),
},
{
id: 3,
name: '现金券',
name: $t('cash.coupon'),
},
{
id: 21,
name: '享花券',
name: $t('huabei.coupon'),
},
];
const receiverTypeList: object[] = [
{
id: 1,
name: '主动领取',
name: $t('active.claim'),
},
{
id: 2,
name: '系统发放',
name: $t('system.issued'),
},
// {
// id: 3,
......@@ -34,33 +34,33 @@ const receiverTypeList: object[] = [
const listStatus: object[] = [
{
id: 'WAIT_ON_LINE',
name: '待发布',
name: $t('pending.publish'),
},
{
id: 'ON_LINE',
name: '已上架',
name: $t('online'),
},
{
id: 'OFF_LINE',
name: '已下架',
name: $t('offline'),
},
];
const statusList: object[] = [
{
id: 1,
name: '待发布',
name: $t('pending.publish'),
},
{
id: 2,
name: '已上架',
name: $t('online'),
},
{
id: 3,
name: '已下架',
name: $t('offline'),
},
{
id: 4,
name: '已过期',
name: $t('expired'),
},
];
const columns: object[] = [
......@@ -70,23 +70,23 @@ const columns: object[] = [
hideSearch: true
},
{
title: '批次id',
title: $t('batch.id'),
key: 'id',
hideSearch: true
},
{
title: '批次id',
title: $t('batch.id'),
hideTable: true,
key: 'couponId',
formType: 'input'
},
{
title: '优惠券名称',
title: $t('coupon.name'),
key: 'name',
hideSearch: true
},
{
title: '优惠券类型',
title: $t('coupon.type'),
key: 'couponType',
formType: 'select',
valueEnum: couponTypeList.reduce((pre, cur) => {
......@@ -99,12 +99,12 @@ const columns: object[] = [
},
},
{
title: '优惠券面值',
title: $t('coupon.value'),
key: 'couponAmt',
hideSearch: true,
},
{
title: '优惠券属性',
title: $t('coupon.attribute'),
key: '',
hideSearch: true,
render: (h, params) => {
......@@ -113,22 +113,22 @@ const columns: object[] = [
},
},
{
title: '发行数量',
title: $t('issue.quantity'),
key: 'pushCount',
hideSearch: true,
},
{
title: '发行有效期',
title: $t('issue.period'),
key: 'receiverTime',
hideSearch: true
},
{
title: '使用有效期',
title: $t('usage.period'),
key: 'useTime',
hideSearch: true
},
{
title: '领取方式',
title: $t('claim.method'),
formType: 'select',
key: 'receiverType',
valueEnum: receiverTypeList.reduce((pre, cur) => {
......@@ -138,12 +138,12 @@ const columns: object[] = [
render: (h, params) => {
const obj = receiverTypeList.find(item => item.id === params.row.receiverType) || {};
// 处理优惠券列表显示券码的问题
if (+params.row.receiverType === 4) { return h('div', '券码兑换'); }
if (+params.row.receiverType === 4) { return h('div', $t('coupon.redemption')); }
return h('div', obj.name);
},
},
{
title: '状态',
title: $t('status'),
key: 'status',
hideSearch: true,
render: (h, params) => {
......@@ -152,7 +152,7 @@ const columns: object[] = [
}
},
{
title: '状态',
title: $t('status'),
key: 'status',
formType: 'select',
hideTable: true,
......
......@@ -13,7 +13,7 @@ export default class CouponTableModal extends Vue {
templates: object[] = [];
table: object[] = [
{
title: '选择优惠券',
title: $t('select.coupon'),
type: 'coupon',
multiple: true,
columns: couponColumn,
......
<template>
<table-modal :table="table" :templates.sync="templates" :formControl="formControl" v-model="coupon" title="优惠券"></table-modal>
<table-modal :table="table" :templates.sync="templates" :formControl="formControl" v-model="coupon" :title="$t('coupon')"></table-modal>
</template>
<script lang="ts" src="./index.ts"></script>
<style></style>
\ No newline at end of file
<template>
<div class="discountGoodsContainer">
<div class="discountGoodsItem" v-for="(item, index) in goods" :key="index">
<p>商品{{index + 1}}<span v-if="item.status == 2">(已隐藏,商品已下架)</span></p>
<p>{{ $t('product') }}{{index + 1}}<span v-if="item.status == 2">{{ $t('hidden.product.removed') }}</span></p>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="sku_no" prop="skuNo">
<Input v-model="item.skuNo" placeholder="请输入商品sku编码" @on-focus="setPrevVal(item.skuNo)" @on-blur="getSkuInfo(item.skuNo, index)"></Input>
<Input v-model="item.skuNo" :placeholder="$t('enter.product.sku.code')" @on-focus="setPrevVal(item.skuNo)" @on-blur="getSkuInfo(item.skuNo, index)"></Input>
</FormItem>
<FormItem label="商品名称" prop="skuName">
<Input v-model="item.skuName" placeholder="请输入商品名称"></Input>
<FormItem :label="$t('product.name')" prop="skuName">
<Input v-model="item.skuName" :placeholder="$t('enter.product.name')"></Input>
</FormItem>
<FormItem label="商品横幅文案" prop="subtitle">
<Input v-model="item.subtitle" placeholder="请输入商品横幅文案"></Input>
<FormItem :label="$t('product.banner.text')" prop="subtitle">
<Input v-model="item.subtitle" :placeholder="$t('enter.product.banner.text')"></Input>
</FormItem>
<FormItem label="商品标签文案" prop="tag">
<Input v-model="item.tag" placeholder="请输入商品标签文案"></Input>
<FormItem :label="$t('product.tag.text')" prop="tag">
<Input v-model="item.tag" :placeholder="$t('enter.product.tag.text')"></Input>
</FormItem>
<FormItem label="商品标签文案颜色" prop="tagColor">
<FormItem :label="$t('product.tag.color')" prop="tagColor">
<ColorSelector v-model="item.goodsTagFontColor" @input="updateStyle($event, 'tagColor', item)"></ColorSelector>
</FormItem>
<FormItem label="商品标签背景" prop="tagBg" title="要求尺寸:134px * 46px">
<FormItem :label="$t('product.tag.background')" prop="tagBg" :title="$t('required.size.134px.46px')">
<Upload v-model="item.goodsTagBgImg" @change="updateStyle($event, 'tagBg', item)"></Upload>
</FormItem>
</Form>
<Button type="error" @click="del(index)" class="deleteGood">删除</Button>
<Button type="error" @click="del(index)" class="deleteGood">{{ $t('delete') }}</Button>
</div>
<Button type="dashed" icon="plus-round" @click="add">添加商品</Button>
<Button type="dashed" icon="plus-round" @click="add">{{ $t('add.product') }}</Button>
<!-- <Button type="primary" @click="save">保存</Button> -->
</div>
</template>
......
......@@ -4,38 +4,37 @@
v-model="data.ids"
type="textarea"
:autosize="{minRows: 3,maxRows: 10}"
placeholder="请输入skuNo,每个skuNo使用英文逗号隔开"
:placeholder="$t('enter.skuno.separated.by.commas')"
@on-blur="changeIds"
/>
<div class="goodsItem" v-for="(item, index) in data.data" :key="index">
<div class="title">
商品{{index + 1}}
<div class="title">{{ $t('product') }}{{index + 1}}
</div>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="sku_no" prop="skuNo">
<Input v-model="item.skuNo" disabled />
</FormItem>
<FormItem label="商品名称" prop="goodsName">
<FormItem :label="$t('product.name')" prop="goodsName">
<Input v-model="item.goodsName" />
</FormItem>
<FormItem label="商品主图" prop="img">
<FormItem :label="$t('product.image')" prop="img">
<Upload v-model="item.img"></Upload>
</FormItem>
<FormItem label="横幅文案" prop="subtitle">
<FormItem :label="$t('banner.text')" prop="subtitle">
<Input v-model="item.subtitle" />
</FormItem>
<FormItem label="标签文案" prop="tag">
<FormItem :label="$t('tag.text')" prop="tag">
<Input v-model="item.tag" />
</FormItem>
<FormItem label="标签文案颜色" prop="tagColor">
<FormItem :label="$t('tag.text.color')" prop="tagColor">
<ColorSelector v-model="item.tagColor" />
</FormItem>
<FormItem label="标签背景图" prop="tagBgImg">
<FormItem :label="$t('tag.background')" prop="tagBgImg">
<Upload v-model="item.tagBgImg"></Upload>
</FormItem>
</Form>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">删除</Button>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">{{ $t('delete') }}</Button>
</div>
</div>
</template>
......@@ -129,7 +128,7 @@ export default {
const skus = ids ? ids.split(',') : [];
if (skus.length) {
if (skus.length > 15) {
this.$toast('最多填入15个商品');
this.$toast($t('max.15.products'));
return;
}
this.getGoods({
......
......@@ -30,9 +30,9 @@ export default {
data() {
return {
options: [
{id: 'normal', label: '标准'},
{id: 'medium', label: '中粗'},
{id: 'bold', label: '加粗'}
{id: 'normal', label: $t('standard')},
{id: 'medium', label: $t('semibold')},
{id: 'bold', label: $t('bold')}
],
selected: ''
}
......
......@@ -2,8 +2,8 @@
<div class="form-list">
<Card class="form-list-card" :key="index" v-for="(item, index) in list">
<div slot='title' class="Fl-card-title">
<h4>项目{{index + 1}}</h4>
<a @click="del(index)">删除</a>
<h4>{{ $t('item') }}{{index + 1}}</h4>
<a @click="del(index)">{{ $t('delete') }}</a>
</div>
<Form @submit.native.prevent :model="item" :label-width="50">
<FormItem :prop="`${keywords.key}`" :label="keywords.name" :key="idx" v-for="(keywords, idx) in formControl">
......@@ -12,7 +12,7 @@
</Form>
</Card>
<div class="form-list-button">
<Button type="dashed" icon="plus-round" @click="add">添加项目</Button>
<Button type="dashed" icon="plus-round" @click="add">{{ $t('add.item') }}</Button>
</div>
</div>
</template>
......
......@@ -30,8 +30,8 @@ export default {
data() {
return {
options: [
{id: '1', label: '单行'},
{id: '2', label: '双行'},
{id: '1', label: $t('single.row')},
{id: '2', label: $t('double.row')},
],
selected: 0
}
......
......@@ -4,29 +4,28 @@
v-model="data.ids"
type="textarea"
:autosize="{minRows: 3,maxRows: 10}"
placeholder="请输入skuNo,每个skuNo使用英文逗号隔开"
:placeholder="$t('enter.skuno.separated.by.commas')"
@on-blur="changeIds"
/>
<div class="goodsItem" v-for="(item, index) in data.data" :key="index">
<div class="title">
商品{{index + 1}}
<div class="title">{{ $t('product') }}{{index + 1}}
</div>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="sku_no" prop="skuNo">
<Input v-model="item.skuNo" disabled />
</FormItem>
<FormItem label="商品名称" prop="skuName">
<FormItem :label="$t('product.name')" prop="skuName">
<Input v-model="item.skuName" />
</FormItem>
<FormItem label="商品图片" prop="skuUrl">
<FormItem :label="$t('product.photo')" prop="skuUrl">
<Upload v-model="item.skuUrl"></Upload>
</FormItem>
<FormItem label="商品横幅文案" prop="subTitle">
<FormItem :label="$t('product.banner.text')" prop="subTitle">
<Input v-model="item.subTitle" />
</FormItem>
</Form>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">删除</Button>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">{{ $t('delete') }}</Button>
</div>
</div>
</template>
......@@ -112,7 +111,7 @@ export default {
const skus = ids ? ids.split(',') : [];
if (skus.length) {
if (skus.length > 30) {
this.$toast('最多填入30个商品');
this.$toast($t('max.30.products'));
return;
}
this.getGoods({
......
......@@ -30,10 +30,10 @@ export default {
data() {
return {
options: [
{id: '1', label: '左一带五'},
{id: '2', label: '右一带五'},
{id: '3', label: '左二带四'},
{id: '4', label: '右二带四'},
{id: '1', label: $t('15.left')},
{id: '2', label: $t('15.right')},
{id: '3', label: $t('24.left')},
{id: '4', label: $t('24.right')},
],
selected: 0
}
......
......@@ -4,22 +4,22 @@
{{item.label}}
</span>
<div v-if="dataValue.type == 'category'">
<Button type="primary" @click="add">选择品类</Button>
<Button type="primary" @click="add">{{ $t('select.category') }}</Button>
</div>
<div v-if="dataValue.type == 'brand'">
<Button type="primary" @click="add">选择品牌</Button>
<Button type="primary" @click="add">{{ $t('select.brand') }}</Button>
</div>
<Modal v-model="showModal" :mask-closable="false" :title="modalTitle" width="600">
<div v-if="dataValue.type == 'category'">
<div class="search">
<Form class="searchFormStyle" inline>
<FormItem label="类目名称" prop="name">
<FormItem :label="$t('category.name')" prop="name">
<Input v-model="searchParams.name" placeholder="" />
</FormItem>
<FormItem label="类目编码" prop="name">
<FormItem :label="$t('category.code')" prop="name">
<Input v-model="searchParams.sceneId" placeholder="" />
</FormItem>
<Button type="primary" @click="searchList">查询</Button>
<Button type="primary" @click="searchList">{{ $t('search') }}</Button>
</Form>
</div>
<Table
......@@ -36,13 +36,13 @@
<div v-if="dataValue.type == 'brand'">
<div class="search">
<Form class="searchFormStyle" inline>
<FormItem label="品牌名称" prop="name">
<FormItem :label="$t('brand.name')" prop="name">
<Input v-model="searchParams.name" placeholder="" />
</FormItem>
<FormItem label="品牌编码" prop="name">
<FormItem :label="$t('brand.code')" prop="name">
<Input v-model="searchParams.sceneId" placeholder="" />
</FormItem>
<Button type="primary" @click="searchList">查询</Button>
<Button type="primary" @click="searchList">{{ $t('search') }}</Button>
</Form>
</div>
<Table
......@@ -57,8 +57,8 @@
<Page class="page" :total="total" @on-change="changePageNo" show-total></Page>
</div>
<div slot="footer">
<Button @click="showModal = false">取消</Button>
<Button type="primary" @click="submitSelect">确认</Button>
<Button @click="showModal = false">{{ $t('cancel') }}</Button>
<Button type="primary" @click="submitSelect">{{ $t('ok') }}</Button>
</div>
</Modal>
</div>
......@@ -74,12 +74,12 @@ const categoryCol = function() {
},
{
align: 'center',
title: '类目名称',
title: $t('category.name'),
key: 'categoryName',
},
{
align: 'center',
title: '类目编码',
title: $t('category.code'),
key: 'sceneId',
width: 180
},
......@@ -94,12 +94,12 @@ const brandCol = function() {
},
{
align: 'center',
title: '品牌名称',
title: $t('brand.name'),
key: 'brandName',
},
{
align: 'center',
title: '品牌编码',
title: $t('brand.code'),
key: 'sceneId',
width: 120
},
......@@ -138,7 +138,7 @@ export default {
},
computed: {
modalTitle() {
return this.dataValue.type === 'category' ? '选择品类' : '选择品牌'
return this.dataValue.type === 'category' ? $t('select.category') : $t('select.brand')
}
},
watch: {
......@@ -246,9 +246,9 @@ export default {
data() {
return {
options: [
{id: 'all', label: '全部商品'},
{id: 'category', label: '按照品类'},
{id: 'brand', label: '按照品牌'}
{id: 'all', label: $t('all.products')},
{id: 'category', label: $t('by.category')},
{id: 'brand', label: $t('by.brand')}
],
dataValue: {},
showModal: false,
......
......@@ -4,26 +4,25 @@
v-model="data.ids"
type="textarea"
:autosize="{minRows: 3,maxRows: 10}"
placeholder="请输入skuNo,每个skuNo使用英文逗号隔开"
:placeholder="$t('enter.skuno.separated.by.commas')"
@on-blur="changeIds"
/>
<div class="goodsItem" v-for="(item, index) in data.data" :key="index">
<div class="title">
商品{{index + 1}}
<div class="title">{{ $t('product') }}{{index + 1}}
</div>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="sku_no" prop="skuNo">
<Input v-model="item.skuNo" disabled />
</FormItem>
<FormItem label="商品名称" prop="goodsName">
<FormItem :label="$t('product.name')" prop="goodsName">
<Input v-model="item.goodsName" />
</FormItem>
<FormItem label="商品图片" prop="img">
<FormItem :label="$t('product.photo')" prop="img">
<Upload v-model="item.img"></Upload>
</FormItem>
</Form>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">删除</Button>
<Button type="error" long @click="del(index, item.skuNo)" class="deleteGood">{{ $t('delete') }}</Button>
</div>
</div>
</template>
......@@ -109,7 +108,7 @@ export default {
const skus = ids ? ids.split(',') : [];
if (skus.length) {
if (skus.length > 15) {
this.$toast('最多填入15个商品');
this.$toast($t('max.15.products'));
return;
}
this.getGoods({
......
const commodityChannel: object[] = [
{
id: 1,
name: '自营',
name: $t('selfoperated'),
},
{
id: 2,
name: '京东开普勒',
name: $t('jd.kepler'),
},
{
id: 3,
name: '京东联盟',
name: $t('jd.union'),
},
{
id: 4,
name: '众联 ',
name: $t('zhonglian'),
},
{
id: 5,
name: '企业购',
name: $t('enterprise.purchase'),
},
];
const goodsStatus: object[] = [
{
id: 1,
name: '未上架',
name: $t('not.online'),
},
{
id: 2,
name: '审核中',
name: $t('in.review'),
},
{
id: 3,
name: '已上架',
name: $t('online'),
},
{
id: 4,
name: '我方下架',
name: $t('internal.removal'),
},
{
id: 5,
name: '三方下架',
name: $t('thirdparty.removal'),
},
];
const columns = function() {
......@@ -50,7 +50,7 @@ const columns = function() {
hideSearch: true
},
{
title: '商品ID',
title: $t('product.id'),
key: 'id',
formType: 'input'
},
......@@ -60,7 +60,7 @@ const columns = function() {
formType: 'input'
},
{
title: '商品图片',
title: $t('product.photo'),
key: 'imageUrl',
width: 130,
hideSearch: true,
......@@ -75,13 +75,13 @@ const columns = function() {
}
},
{
title: '商品名称',
title: $t('product.name'),
key: 'skuName',
width: 155,
hideSearch: true
},
{
title: '商品渠道',
title: $t('product.channel'),
key: 'skuSource',
hideSearch: true,
render: (h, params) => {
......@@ -90,17 +90,17 @@ const columns = function() {
},
},
{
title: '销售价格',
title: $t('sale.price'),
key: 'salePrice',
hideSearch: true
},
{
title: '划线价格',
title: $t('strikethrough.price'),
key: 'marketPrice',
hideSearch: true
},
{
title: '发布状态',
title: $t('publish.status'),
key: 'status',
formType: 'select',
valueEnum: goodsStatus.reduce((pre, cur) => {
......@@ -113,7 +113,7 @@ const columns = function() {
},
},
{
title: '标签',
title: $t('tag'),
hideSearch: true,
render: (h, params) => {
const labelName = [];
......@@ -126,7 +126,7 @@ const columns = function() {
},
},
{
title: '商品类目',
title: $t('product.category'),
key: 'cid1',
formType: 'treeSelect',
hideTable: true,
......
......@@ -6,27 +6,27 @@ const groupColumns = function() {
hideSearch: true
},
{
title: '标签ID',
title: $t('tag.id'),
key: 'id',
formType: 'input'
},
{
title: '标签名称',
title: $t('tag.name'),
key: 'labelName',
formType: 'input'
},
{
title: '商品数量',
title: $t('product.quantity'),
key: 'skuNum',
hideSearch: true
},
{
title: '品类数量',
title: $t('category.count'),
key: 'cidNum',
hideSearch: true
},
{
title: '创建时间',
title: $t('create.time'),
key: 'createdAt',
hideSearch: true,
}
......
......@@ -6,17 +6,17 @@ const groupColumns = function() {
hideSearch: true
},
{
title: '专题ID',
title: $t('topic.id'),
key: 'id',
formType: 'input'
},
{
title: '专题名称',
title: $t('topic.name'),
key: 'name',
formType: 'input'
},
{
title: '有效期',
title: $t('validity.period'),
key: 'validityTime',
hideSearch: true,
render: (h, params) => {
......@@ -25,7 +25,7 @@ const groupColumns = function() {
},
},
{
title: '标签',
title: $t('tag'),
key: 'labelName',
hideSearch: true,
render: (h, params) => {
......@@ -37,7 +37,7 @@ const groupColumns = function() {
},
},
{
title: '创建时间',
title: $t('create.time'),
key: 'createdAt',
hideSearch: true,
}
......
......@@ -18,7 +18,7 @@ export default class GoodsTableModal extends Vue {
goods: object = cloneDeep(this.value);
table: object[] = [
{
title: '选择商品',
title: $t('select.product'),
type: 'goods',
key: 'skuNo',
multiple: true,
......@@ -26,7 +26,7 @@ export default class GoodsTableModal extends Vue {
query: this.query
},
{
title: '选择商品标签',
title: $t('select.product.tag'),
type: 'goodsLabel',
key: 'id',
multiple: false,
......@@ -34,7 +34,7 @@ export default class GoodsTableModal extends Vue {
query: this.queryLabel
},
{
title: '选择商品专题',
title: $t('select.product.topic'),
type: 'goodsGroup',
key: 'id',
multiple: false,
......
<template>
<table-modal :table="table" :templates.sync="templates" :formControl="formControl" v-model="goods" title="商品"></table-modal>
<table-modal :table="table" :templates.sync="templates" :formControl="formControl" v-model="goods" :title="$t('product')"></table-modal>
</template>
<script lang="ts" src="./index.ts"></script>
<style></style>
\ No newline at end of file
<template>
<div class="seckillActivityContainer">
<Button style="margin-bottom: 4px" @click="showRules" size="small">规则说明</Button>
<Button style="margin-bottom: 4px" @click="showRules" size="small">{{ $t('rule.description') }}</Button>
<div>
<Button style="margin-bottom: 4px" type="primary" @click="openDialog">填写活动ID</Button>
<Button style="margin-bottom: 4px" type="primary" @click="openDialog">{{ $t('fill.activity.id') }}</Button>
</div>
<Modal
v-model="showModal"
title="填写活动"
:title="$t('fill.activity')"
:closable="false"
:mask-closable="false"
>
<Input v-model="cacheId" type="textarea" placeholder="请输入活动ID, 英文逗号分隔" :rows="3" />
<Input v-model="cacheId" type="textarea" :placeholder="$t('enter.activity.ids.comma.separated')" :rows="3" />
<div slot="footer">
<Button @click="cancel">取消</Button>
<Button type="primary" @click="ok">确定</Button>
<Button @click="cancel">{{ $t('cancel') }}</Button>
<Button type="primary" @click="ok">{{ $t('confirm') }}</Button>
</div>
</Modal>
<!-- <Input v-model="activityInfoId" type="textarea" placeholder="请输入活动ID, 英文逗号分隔" :rows="3" /> -->
......@@ -79,7 +79,7 @@ export default {
invalidArr.map(item => {
ids += `${item.id},`
})
this.$Notice.error({ title: '提示', desc: `以下活动id不符合当前活动类型: ${ids}`});
this.$Notice.error({ title: $t('hint'), desc: `以下活动id不符合当前活动类型: ${ids}`});
return;
}
// 判断填入的活动ID是否存在重复的渠道ID的情况
......@@ -110,7 +110,7 @@ export default {
console.log(channel2Id, 'channel2Id')
for (let i in channel2Id) {
if (channel2Id[i].length > 1) {
this.$Notice.error({ title: '提示', desc: `${i == 'common' ? '通用渠道' : '渠道' + i}存在重复的活动ID: ${channel2Id[i].join(',')}`});
this.$Notice.error({ title: $t('hint'), desc: `${i == 'common' ? '通用渠道' : $t('channel') + i}存在重复的活动ID: ${channel2Id[i].join(',')}`});
return;
}
}
......@@ -126,7 +126,7 @@ export default {
},
showRules() {
this.$Modal.info({
title: '规则说明',
title: $t('rule.description'),
content: `
<p style="width: 100%;word-break: break-all;">1、秒杀活动ID手动填写,多个ID使用英文逗号分隔;</p>
<p style="width: 100%;word-break: break-all;">2、同一个H5渠道仅可以填入一个对应渠道的秒杀活动ID;</p>
......
......@@ -3,21 +3,21 @@
<!-- <Select v-model="activityInfoId" filterable>
<Option v-for="item in list" :value="item.id" :key="item.id">{{ `id ${item.id} - ${item.title}` }}</Option>
</Select> -->
<Button style="margin-bottom: 4px" @click="showRules" size="small">规则说明</Button>
<Button style="margin-bottom: 4px" @click="showRules" size="small">{{ $t('rule.description') }}</Button>
<div>
<Button style="margin-bottom: 4px" type="primary" @click="openDialog">填写活动ID</Button>
<Button style="margin-bottom: 4px" type="primary" @click="openDialog">{{ $t('fill.activity.id') }}</Button>
</div>
<Modal
v-model="showModal"
title="填写活动"
:title="$t('fill.activity')"
:closable="false"
:mask-closable="false"
>
<Input v-model="cacheId" type="textarea" placeholder="请输入活动ID, 英文逗号分隔" :rows="3" />
<Input v-model="cacheId" type="textarea" :placeholder="$t('enter.activity.ids.comma.separated')" :rows="3" />
<div slot="footer">
<Button @click="cancel">取消</Button>
<Button type="primary" @click="ok">确定</Button>
<Button @click="cancel">{{ $t('cancel') }}</Button>
<Button type="primary" @click="ok">{{ $t('confirm') }}</Button>
</div>
</Modal>
</div>
......@@ -80,7 +80,7 @@ export default {
invalidArr.map(item => {
ids += `${item.id},`
})
this.$Notice.error({ title: '提示', desc: `以下活动id不符合当前活动类型: ${ids}`});
this.$Notice.error({ title: $t('hint'), desc: `以下活动id不符合当前活动类型: ${ids}`});
return;
}
// 判断填入的活动ID是否存在重复的渠道ID的情况
......@@ -111,7 +111,7 @@ export default {
console.log(channel2Id, 'channel2Id')
for (let i in channel2Id) {
if (channel2Id[i].length > 1) {
this.$Notice.error({ title: '提示', desc: `${i == 'common' ? '通用渠道' : '渠道' + i}存在重复的活动ID: ${channel2Id[i].join(',')}`});
this.$Notice.error({ title: $t('hint'), desc: `${i == 'common' ? '通用渠道' : $t('channel') + i}存在重复的活动ID: ${channel2Id[i].join(',')}`});
return;
}
}
......@@ -127,7 +127,7 @@ export default {
},
showRules() {
this.$Modal.info({
title: '规则说明',
title: $t('rule.description'),
content: `
<p style="width: 100%;word-break: break-all;">1、抢购活动ID手动填写,多个ID使用英文逗号分隔;</p>
<p style="width: 100%;word-break: break-all;">2、同一个H5渠道仅可以填入一个对应渠道的抢购活动ID;</p>
......
<template>
<div class="swiperListSelector">
<div class="listItem" v-for="(item, index) in lists" :key="index">
<p>素材{{index + 1}}</p>
<p>{{ $t('material') }}{{index + 1}}</p>
<Form @submit.native.prevent ref="formCustom" :model="item" :label-width="90" label-position="left">
<FormItem label="素材名称" prop="name">
<Input v-model="item.name" placeholder="请输入素材名称" />
<FormItem :label="$t('material.name')" prop="name">
<Input v-model="item.name" :placeholder="$t('enter.material.name')" />
</FormItem>
<FormItem label="轮播图" prop="img">
<FormItem :label="$t('carousel')" prop="img">
<Upload v-model="item.img" />
</FormItem>
<FormItem label="跳转链接" prop="link">
<Input v-model="item.link" placeholder="请输入跳转链接" />
<FormItem :label="$t('redirect.link')" prop="link">
<Input v-model="item.link" :placeholder="$t('enter.redirect.link')" />
</FormItem>
</Form>
<Button type="error" @click="del(index)" class="delete">删除</Button>
<Button type="error" @click="del(index)" class="delete">{{ $t('delete') }}</Button>
</div>
<Button type="dashed" icon="plus-round" @click="add">添加素材</Button>
<Button type="dashed" icon="plus-round" @click="add">{{ $t('add.material') }}</Button>
<!-- <Button type="primary" @click="save">保存</Button> -->
</div>
</template>
......@@ -56,7 +56,7 @@ export default {
methods: {
add() {
if (this.lists && this.lists.length >= 8) {
this.$toast('最多允许添加8个素材');
this.$toast($t('max.8.materials'));
return
}
this.lists.push({
......
......@@ -30,8 +30,8 @@ export default {
data() {
return {
options: [
{id: '1', label: '平铺'},
{id: '2', label: '主次'}
{id: '1', label: $t('tile')},
{id: '2', label: $t('primarysecondary')}
],
selected: 0
}
......
<template>
<iSwitch v-model="switchVal" size="large" class="switch-btn">
<span slot="open">开启</span>
<span slot="close">关闭</span>
<span slot="open">{{ $t('enable') }}</span>
<span slot="close">{{ $t('close') }}</span>
</iSwitch>
</template>
<script>
......
......@@ -143,7 +143,7 @@ export default class DynamicForm extends Mixins(DynamicFormMixin) {
selectionChange(selection) {
if (!this.table[this.activeName]?.multiple && selection.length > 1) {
this.$Notice.warning({
title: '商品组只能单选'
title: $t('single.select.for.product.group')
});
return this.templates;
}
......
......@@ -92,13 +92,13 @@
console.log(files.length)
if (files.length > 1) {
up.removeFile(files[0]);
this.$toast('视频背景只允许上传单个文件');
this.$toast($t('video.background.allows.only.single.file'));
return false;
}
console.log(files[0].type, 999)
if (files[0].type.indexOf('video') === -1) {
up.removeFile(files[0]);
this.$toast('只允许上传视频格式文件');
this.$toast($t('video.files.only'));
return false;
}
// 自由容器视频背景,只允许上传video
......@@ -115,7 +115,7 @@
});
} else {
this.$Notice.success({
title: '上传成功',
title: $t('upload.success'),
desc: '',
});
this.img = config.qiniuHost + '/' + res.hash;
......@@ -135,7 +135,7 @@
this.fileType = 'image';
limit = 5 * 1024 * 1024;
if (size > limit) {
this.$toast('gif图大小不允许超过5Mb');
this.$toast($t('gif.size.exceeds.5mb.limit'));
up.removeFile(file);
return false;
}
......@@ -144,7 +144,7 @@
this.fileType = 'video';
limit = 4 * 1024 * 1024;
if (size > limit) {
this.$toast('文件大小不允许超过4Mb');
this.$toast($t('file.exceeds.4mb'));
up.removeFile(file);
return false;
}
......@@ -153,7 +153,7 @@
this.fileType = 'image';
limit = 800 * 1024;
if (size > limit) {
this.$toast('文件大小不允许超过800Kb');
this.$toast($t('file.exceeds.800kb'));
up.removeFile(file);
return false;
}
......
......@@ -26,11 +26,11 @@ export default {
list: [
{
id: '1',
title: '一行一组'
title: $t('one.group.per.row')
},
{
id: '2',
title: '两行一组'
title: $t('two.rows.per.group')
}
],
styleType: ''
......
......@@ -75,127 +75,127 @@ export default class DynamicForm extends Mixins(ContextMenuMixin, DynamicFormMix
styleSchame: object = {
curEle: [
{
label: '定位',
label: $t('position'),
list: [
{
content: '上对齐',
content: $t('top.align'),
icon: 'arrow-up-c',
args: 'top'
},
{
content: '右对齐',
content: $t('right.align'),
icon: 'arrow-right-c',
args: 'right'
},
{
content: '下对齐',
content: $t('bottom.align'),
icon: 'arrow-down-c',
args: 'bottom'
},
{
content: '左对齐',
content: $t('left.align'),
icon: 'arrow-left-c',
args: 'left'
},
{
content: '垂直居中',
content: $t('vertical.center'),
icon: 'android-film',
args: 'vertical'
},
{
content: '水平居中',
content: $t('horizontal.center'),
icon: 'android-film',
args: 'horizontal'
},
]
},
{
label: '位置'
label: $t('position')
},
{
label: '尺寸',
label: $t('size'),
list: [
{
content: '全屏',
content: $t('fullscreen'),
icon: 'arrow-resize',
args: 'full'
},
{
content: '宽100%',
content: $t('100.width'),
icon: 'arrow-swap',
args: 'width'
},
{
content: '高100%',
content: $t('height.100'),
icon: 'arrow-swap',
args: 'height'
},
]
},
{
label: '宽高'
label: $t('dimensions')
},
{
label: '背景图片'
label: $t('background.image')
},
{
label: '背景颜色'
label: $t('background.color')
}
],
curChild: [
{
label: '容器尺寸',
label: $t('container.dimensions'),
list: [
{
content: '全屏',
content: $t('fullscreen'),
icon: 'arrow-resize',
args: [667, 375],
},
{
content: '根据背景图片调整宽高',
content: $t('autosize.by.background'),
icon: 'image',
args: [667, 375, 'image'],
},
{
content: '根据元素默认尺寸调整宽高',
content: $t('autosize.by.element'),
icon: 'stop',
args: ['', '', 'element'],
},
{
content: '宽100%',
content: $t('100.width'),
icon: 'arrow-swap',
args: [null, 375]
},
{
content: '高100%',
content: $t('height.100'),
icon: 'arrow-swap',
args: [667, null]
}
]
},
{
label: '容器宽高'
label: $t('container.size')
},
{
label: '背景图片'
label: $t('background.image')
},
{
label: '背景颜色'
label: $t('background.color')
},
{
label: '上边距',
label: $t('top.margin'),
key: 'paddingTop'
},
{
label: '下边距',
label: $t('bottom.margin'),
key: 'paddingBottom'
},
{
label: '左边距',
label: $t('left.margin'),
key: 'paddingLeft'
},
{
label: '右边距',
label: $t('right.margin'),
key: 'paddingRight'
},
]
......
......@@ -5,7 +5,7 @@
<div>{{ `组件ID: ${curElement.id}` }}</div>
</div>
<Form class="dynamic-form-component" @submit.native.prevent :label-width="110" :model="form" v-if="currentSchame && currentSchame.length">
<h3 v-if="!hasGroup">组件属性</h3>
<h3 v-if="!hasGroup">{{ $t('component.attribute') }}</h3>
<template v-for="(item, index) in currentSchame">
<div v-if="item.title">
<h3>{{ item.title }}</h3>
......@@ -22,20 +22,20 @@
</template>
</Form>
<Form class="dynamic-form-basic" @submit.native.prevent :label-width="110">
<h3>基础样式</h3>
<h3>{{ $t('basic.style') }}</h3>
<template v-if="childSelected">
<template v-for="item in styleSchame.curEle">
<FormItem :label="item.label">
<template v-if="item.label === '宽高'">
<template v-if="item.label === $t('dimensions')">
<InputNumber class="Df-basic-inputnumber" :max="375" :min="0" v-model="commonStyle.width" @on-change="updateStyle($event, 'width')"></InputNumber>
<InputNumber :max="667" :min="0" v-model="commonStyle.height" @on-change="updateStyle($event, 'height')"></InputNumber>
</template>
<template v-else-if="item.label === '位置'">
<template v-else-if="item.label === $t('position')">
<InputNumber class="Df-basic-inputnumber" v-model="commonStyle.left" @on-change="updateStyle($event, 'left')"></InputNumber>
<InputNumber v-model="commonStyle.top" @on-change="updateStyle($event, 'top')"></InputNumber>
</template>
<upload v-else-if="item.label === '背景图片'" v-model="commonStyle.backgroundImage" @change="updateStyle($event, 'backgroundImage')"></upload>
<ColorSelector v-else-if="item.label === '背景颜色'" v-model="commonStyle.backgroundColor" @input="updateStyle($event, 'backgroundColor')"></ColorSelector>
<upload v-else-if="item.label === $t('background.image')" v-model="commonStyle.backgroundImage" @change="updateStyle($event, 'backgroundImage')"></upload>
<ColorSelector v-else-if="item.label === $t('background.color')" v-model="commonStyle.backgroundColor" @input="updateStyle($event, 'backgroundColor')"></ColorSelector>
<template v-else>
<Tooltip placement="top" :content="child.content" v-for="child in item.list" :key="child.content">
<Button type="ghost" :icon="child.icon" @click="changeAlignType(child.args)"></Button>
......@@ -47,15 +47,15 @@
<template v-if="parentSelected">
<template v-for="item in styleSchame.curChild">
<FormItem :label="item.label">
<template v-if="item.label === '容器宽高'">
<template v-if="item.label === $t('container.size')">
<InputNumber class="Df-basic-inputnumber" :max="375" :min="0" v-model="point.w" @on-change="updatePoint($event, 'w')"></InputNumber>
<InputNumber :max="667" :min="0" v-model="point.h" @on-change="updatePoint($event, 'h')"></InputNumber>
</template>
<template v-else-if="item.label.indexOf('边距') > -1">
<template v-else-if="$t('itemlabelindexofmargin.1')">
<Slider v-model="commonStyle[item.key]" @on-input="changeMargin" />
</template>
<upload v-else-if="item.label === '背景图片'" v-model="commonStyle.backgroundImage" @change="updateStyle($event, 'backgroundImage')"></upload>
<ColorSelector v-else-if="item.label === '背景颜色'" v-model="commonStyle.backgroundColor" @input="updateStyle($event, 'backgroundColor')"></ColorSelector>
<upload v-else-if="item.label === $t('background.image')" v-model="commonStyle.backgroundImage" @change="updateStyle($event, 'backgroundImage')"></upload>
<ColorSelector v-else-if="item.label === $t('background.color')" v-model="commonStyle.backgroundColor" @input="updateStyle($event, 'backgroundColor')"></ColorSelector>
<template v-else>
<Tooltip placement="top" :content="child.content" v-for="child in item.list" :key="child.content">
<Button type="ghost" :icon="child.icon" @click="resizedEvent(...child.args)"></Button>
......
<template>
<Tabs class="dynamic-form-tabs" :value="curRightTabName">
<TabPane name="组件设置" label="组件设置">
<TabPane :name="$t('component.settings')" :label="$t('component.settings')">
<dynamic-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-form>
</TabPane>
<!-- <TabPane label="事件">事件</TabPane> -->
<TabPane name="页面设置" label="页面设置">
<TabPane :name="$t('page.settings')" :label="$t('page.settings')">
<dynamic-page-form @modProps="modProps" @resizedChildEvent="resizedChildEvent"></dynamic-page-form>
</TabPane>
<TabPane name="组件管理" label="组件管理">
<TabPane :name="$t('component.management')" :label="$t('component.management')">
<dynamic-component-sort />
</TabPane>
</Tabs>
......
......@@ -18,32 +18,32 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
@Getter('pageData') pageData;
@State(state => state.tenant.cartAndShareBtn) cartAndShareBtn;
title: string = '页面';
title: string = $t('page');
commonStyleForm: object = {};
propsForm: object = {};
commonStyleSchame: object[] = [
{
key: 'backgroundImage',
name: '背景图片',
name: $t('background.image'),
type: 'Upload',
},
{
key: 'backgroundColor',
name: '背景颜色',
name: $t('background.color'),
type: 'ColorSelector'
}
];
baseConfigSchema: object[] = [
{
key: 'pageNeedLogin',
name: '是否登录',
name: $t('logged.in'),
type: 'SwitchBtn'
},
]; ,
titleSchema: object[] = [
{
key: 'titleBgColor',
name: '背景色',
name: $t('background.color'),
type: 'ColorSelector',
props: {
gradient: true,
......@@ -53,90 +53,90 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
// 支持运营内部福利赛需求,包括优惠券组件也做了处理,如果后期不用,可以考虑下线
{
key: 'titleUseUrl',
name: '从URL中获取标题',
name: $t('fetch.title.from.url'),
type: 'SwitchBtn'
},
];
bottomSchema: object[] = [
{
key: 'showPageBottomTip',
name: '状态',
name: $t('status'),
type: 'SwitchBtn'
},
{
key: 'pageBottomTxt',
name: '提示文案',
name: $t('hint.text'),
type: 'Input'
},
{
key: 'pageBottomColor',
name: '提示颜色',
name: $t('hint.color'),
type: 'ColorSelector'
},
];
floatSchema: object[] = [
{
key: 'showBackTop',
name: '返回顶部',
name: $t('back.to.top'),
type: 'SwitchBtn'
},
{
key: 'btAttachVal',
name: '添加按钮',
desc: '添加按钮',
name: $t('add.button'),
desc: $t('add.button'),
type: 'BackTopPicker',
formControl: [
{
key: 'persets',
name: '预设属性',
name: $t('preset.attributes'),
type: 'select',
options: ['购物车', '分享', '自定义']
options: [$t('shopping.cart'), $t('share'), $t('custom')]
},
{
key: 'name',
name: '名称',
name: $t('name'),
type: 'text',
props: {
require: true,
placeholder: '(必填) 区分埋点'
placeholder: $t('required.tracking.point')
}
},
{
key: 'txt',
name: '文字',
name: $t('text'),
type: 'text',
props: {
placeholder: '(选填) 图标下方文字',
placeholder: $t('optional.text.below.icon'),
}
},
{
key: 'url',
name: '链接',
name: $t('link'),
type: 'text'
},
{
key: 'icon',
name: '图片',
name: $t('image'),
type: 'Upload'
},
{
key: 'color',
name: '文字颜色',
name: $t('text.color'),
type: 'ColorSelector'
},
{
key: 'iconColor',
name: '图标颜色',
name: $t('icon.color'),
type: 'ColorSelector'
},
{
key: 'background',
name: '背景颜色',
name: $t('background.color'),
type: 'ColorSelector'
},
{
key: 'size',
name: '尺寸',
name: $t('size'),
type: 'Slider',
props: {
min: 14,
......@@ -145,7 +145,7 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
},
{
key: 'iconSize',
name: '图标尺寸',
name: $t('icon.size'),
type: 'Slider',
props: {
min: 14,
......@@ -154,12 +154,12 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
},
{
key: 'radius',
name: '圆角',
name: $t('border.radius'),
type: 'checkbox'
},
{
key: 'shadow',
name: '阴影',
name: $t('shadow'),
type: 'checkbox'
}
],
......@@ -169,7 +169,7 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
floatModal: object[] = [
{
key: 'couponModal',
name: '优惠券弹窗',
name: $t('coupon.popup'),
type: 'CouponModalSelector'
},
];
......@@ -191,7 +191,7 @@ export default class DynamicPageForm extends Mixins(ContextMenuMixin) {
@Watch('cartAndShareBtn', { immediate: true })
onAuthStateChange(val) {
const options = val ? ['购物车', '分享', '自定义'] : ['自定义'];
const options = val ? [$t('shopping.cart'), $t('share'), $t('custom')] : [$t('custom')];
this.$set(this.floatSchema[1].formControl[0], 'options', options);
this.$set(this.floatSchema[1], 'formDefault', val ? SHOP_CART_CONFIG : DEFAULT_CONFIG);
}
......
......@@ -2,32 +2,32 @@
<div class="dynamic-form">
<h2>{{title}}</h2>
<Form class="dynamic-form-component" :label-width="80" :model="propsForm" @submit.native.prevent>
<h3>基础属性</h3>
<h4>基础配置</h4>
<h3>{{ $t('basic.attributes') }}</h3>
<h4>{{ $t('basic.config') }}</h4>
<template v-for="(item, index) in baseConfigSchema">
<FormItem class="Df-component-formitem" :label="item.name" :key="'baseConfigSchema_' + index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="propsForm[item.key]" :formControl="item.formControl" />
</FormItem>
</template>
<h4>标题栏</h4>
<h4>{{ $t('title.bar') }}</h4>
<template v-for="(item, index) in titleSchema">
<FormItem class="Df-component-formitem" :label="item.name" :key="'titleSchema_' + index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="propsForm[item.key]" :formControl="item.formControl" />
</FormItem>
</template>
<h4>底部提示</h4>
<h4>{{ $t('bottom.tip') }}</h4>
<template v-for="(item, index) in bottomSchema">
<FormItem class="Df-component-formitem" :label="item.name" :key="'bottomSchema_' + index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="propsForm[item.key]" :formControl="item.formControl" />
</FormItem>
</template>
<h4>悬浮窗</h4>
<h4>{{ $t('floating.window') }}</h4>
<template v-for="(item, index) in floatSchema">
<FormItem class="Df-component-formitem" :label="item.name" :key="'floatSchema_' + index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="propsForm[item.key]" :formDefault="item.formDefault" :formControl="item.formControl" />
</FormItem>
</template>
<h4>弹窗</h4>
<h4>{{ $t('popup') }}</h4>
<template v-for="(item, index) in floatModal">
<FormItem class="Df-component-formitem" :label="item.name" :key="'floatModal_' + index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="propsForm[item.key]" :formDefault="item.formDefault" :formControl="item.formControl" />
......@@ -35,7 +35,7 @@
</template>
</Form>
<Form class="dynamic-form-component" :label-width="80" :model="commonStyleForm" @submit.native.prevent>
<h3>基础样式</h3>
<h3>{{ $t('basic.style') }}</h3>
<template v-for="(item, index) in commonStyleSchame">
<FormItem class="Df-component-formitem" :label="item.name" :key="index">
<component :is="item.type" :options="item.options" v-bind="item.props" v-model="commonStyleForm[item.key]" />
......
......@@ -3,15 +3,15 @@
<Menu class="Dc-left-menu" active-name="1" @on-select="selectMaterial">
<MenuItem name="1">
<Icon type="android-apps"></Icon>
<span>基础库</span>
<span>{{ $t('base.library') }}</span>
</MenuItem>
<MenuItem name="2">
<Icon type="android-apps"></Icon>
<span>业务库</span>
<span>{{ $t('business.db') }}</span>
</MenuItem>
<MenuItem name="3">
<Icon type="android-apps"></Icon>
<span>模版</span>
<span>{{ $t('template') }}</span>
</MenuItem>
</Menu>
<div class="Dc-left-content">
......
......@@ -16,7 +16,7 @@ export default {
computed: {
...mapGetters(['pageData', 'pageInfo']),
title() {
return this.pageInfo.pageName || '标题';
return this.pageInfo.pageName || $t('title');
},
titleStyle() {
const { titleBgColor } = this.pageData.props;
......
<template>
<Modal width="700" v-model="show" title="历史记录" @on-visible-change="change">
<Modal width="700" v-model="show" :title="$t('history')" @on-visible-change="change">
<Table
:columns="columns"
:data="records"
......@@ -34,7 +34,7 @@
show: false,
columns: [
{
title: '版本',
title: $t('version'),
align: 'center',
render: (h, params) => {
console.log(params);
......@@ -53,17 +53,17 @@
}
},
{
title: '更新时间',
title: $t('update.time'),
key: 'updatedAt',
align: 'center'
},
{
key: 'author',
title: '操作人',
title: $t('operator'),
align: 'center'
},
{
title: '操作',
title: $t('action'),
align: 'center',
render: (h, params) => {
const props = {
......@@ -79,7 +79,7 @@
props: {
confirm: true,
transfer: true,
title: '确认恢复到此版本?',
title: $t('confirm.restore.this.version'),
},
style: {
...style,
......@@ -100,7 +100,7 @@
{
...props
},
'恢复'
$t('restore')
),
]
)
......
......@@ -8,22 +8,22 @@
<Option :value="isNum(value, item.number)" :key="value" v-for="(label,value) in item.option" :label="label" />
</Select>
<DatePicker v-else-if="item.type === 'date'" class="timeWidth" type="datetimerange" placeholder="" v-model="searchForm[item.key]"></DatePicker>
<treeselect v-else-if="item.type === 'treeSelect'" v-model.number="searchForm[item.key]" :multiple="false" :options="item.option" placeholder="请选择" :normalizer="normalizer" style="width: 180px;" />
<treeselect v-else-if="item.type === 'treeSelect'" v-model.number="searchForm[item.key]" :multiple="false" :options="item.option" :placeholder="$t('select')" :normalizer="normalizer" style="width: 180px;" />
</FormItem>
<FormItem class="btnGroupStyle">
<div>
<Button class="btnStyle" @click="reset()">重置</Button>
<Button type="primary" class="btnStyle" @click="query()">查询</Button>
<Button class="btnStyle" @click="reset()">{{ $t('reset') }}</Button>
<Button type="primary" class="btnStyle" @click="query()">{{ $t('search') }}</Button>
</div>
</FormItem>
</Form>
</div>
<div class="tableGroupStyle">
<div v-if="!hideAdd" class="toolBarStyle">
<h3>查询数据</h3>
<h3>{{ $t('query.data') }}</h3>
<div>
<Button type="warning" class="btnStyle" @click="$emit('clearCache')">清除缓存</Button>
<Button type="primary" class="btnStyle" @click="newEvent()">新增</Button>
<Button type="warning" class="btnStyle" @click="$emit('clearCache')">{{ $t('clear.cache') }}</Button>
<Button type="primary" class="btnStyle" @click="newEvent()">{{ $t('add') }}</Button>
<slot></slot>
</div>
</div>
......
......@@ -5,13 +5,13 @@
:request="query"
:toolBar="gettoolBar"
>
<Button>新增</Button>
<Button>{{ $t('add') }}</Button>
</QGTable>
</div>
</template>
<script>
import QGTable from './index.vue';
const statusList = [{label: '有效', value: 1},{label: '无效',value: 2}];
const statusList = [{label: $t('valid'), value: 1},{label: $t('invalid'),value: 2}];
const showTitle = function(){}
const type = ''
export default {
......@@ -34,30 +34,30 @@ export default {
columns: [
{
type: 'index',
title: '序号',
title: $t('sequence'),
},
{
key: 'componentName',
title: '模版ID',
title: $t('template.id'),
formType: 'input',
value: '11',
},
{
key: 'templateType',
title: '模版名称',
title: $t('template.name'),
formType: 'input',
hideTable: true,
},
{
key: 'page',
title: '模版类型',
title: $t('template.type'),
formType: 'select',
value: 1,
number: true,
valueEnum: {
1: '好的',
2: '行动',
3: '可以的',
1: $t('ok'),
2: $t('action'),
3: $t('allowed'),
},
render: (h, params) => {
return h('div', showTitle('page', type, params));
......@@ -65,25 +65,25 @@ export default {
},
{
key: 'terminal',
title: '内容',
title: $t('content'),
},
{
key: 'status',
title: '状态',
title: $t('status'),
render: (h, params) => {
return h('div', showTitle('status', statusList, params));
},
},
{
key: 'time',
title: '发布时间',
title: $t('publish.time'),
render: (h, params) => {
return h('div', `${(params.row.startTime && params.row.startTime) || ''}-${(params.row.endTime && params.row.endTime) || ''}`);
},
},
{
key: 'action',
title: '操作',
title: $t('action'),
width: 200,
render: (h, params) => {
const props = {
......@@ -110,11 +110,11 @@ export default {
},
on: {
click: () => {
console.log('查看');
console.log($t('view'));
},
},
},
'查看'
$t('view')
),
h(
'Button',
......@@ -126,11 +126,11 @@ export default {
},
on: {
click: () => {
console.log('修改!')
console.log($t('edit'))
},
},
},
'修改'
$t('edit')
),
h(
'Poptip',
......@@ -138,14 +138,14 @@ export default {
props: {
confirm: true,
transfer: true,
title: '确认启用?',
title: $t('confirm.enable'),
},
style: {
display: isShow(2),
},
on: {
'on-ok': () => {
console.log('启用')
console.log($t('enable'))
},
},
......@@ -157,7 +157,7 @@ export default {
props,
style,
},
'启用'
$t('enable')
),
]
),
......@@ -167,7 +167,7 @@ export default {
props: {
confirm: true,
transfer: true,
title: '确认删除?',
title: $t('confirm.delete'),
},
style: {
...style,
......@@ -175,7 +175,7 @@ export default {
},
on: {
'on-ok': () => {
console.log('删除')
console.log($t('delete'))
},
},
},
......@@ -185,7 +185,7 @@ export default {
{
props,
},
'删除'
$t('delete')
),
]
),
......
......@@ -6,10 +6,10 @@
width="360">
<p slot="header" style="color:#2d8cf0;text-align:center">
<Icon type="information-circled"></Icon>
<span>恢复提醒</span>
<span>{{ $t('restore.reminder') }}</span>
</p>
<div style="text-align:center">
<p>已检测到您上次编辑但未保存, 是否恢复?</p>
<p>{{ $t('restore.unsaved.edits') }}</p>
</div>
</Modal>
</template>
......
......@@ -14,19 +14,19 @@ export default class ContextMenuMixin extends Vue {
this.$contextmenu({
items: [
{
label: '复制',
label: $t('copy'),
onClick: () => {
// PERF 可以抽象
const ComInfo = this.pageData.elements[containerIndex];
if (ComInfo.name === 'cs-search-bar') {
this.$Notice.warning({
title: '搜索框只能添加一个'
title: $t('only.1.search.box')
});
return;
}
if (ComInfo.name === 'cs-floor-nav') {
this.$Notice.warning({
title: '楼层导航只能添加一个'
title: $t('only.1.floor.nav')
});
return;
}
......@@ -35,7 +35,7 @@ export default class ContextMenuMixin extends Vue {
}
},
{
label: '删除',
label: $t('delete'),
onClick: () => {
// console.log('删除', event, containerIndex, childIndex);
this.updatePageData({type: 'delete', containerIndex, childIndex});
......
......@@ -32,10 +32,10 @@ export default class GoodsTabsMixin extends Vue {
const childIndexs = [];
const idList = element.props.list.map(v => v.componentId);
if (idList.some(v => !v)) {
throw new Error('商品导航组件不可为空');
throw new Error($t('product.nav.required'));
}
if (idList.length && idList.length !== Array.from(new Set(idList)).length) {
throw new Error('商品导航不可重复选择组件');
throw new Error($t('duplicate.product.nav.components'));
}
element.props.list.forEach((data, index) => {
const index = pageData.elements.findIndex(v => v.id === data.componentId);
......@@ -128,7 +128,7 @@ export default class GoodsTabsMixin extends Vue {
if (element.name === 'cs-floor-nav') {
const idList = element.props.list.map(v => v.componentId);
if (idList.some(v => !v)) {
throw new Error('楼层导航组件不可为空');
throw new Error($t('floor.nav.required'));
}
}
});
......
......@@ -107,7 +107,7 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (pageInfo.redirectUrl.indexOf('https://') != 0 && pageInfo.redirectUrl.indexOf('xyqb://') != 0) {
// 校验活动结束地址链接配置是否满足https和xyqb协议
this.$Notice.error({
title: '链接地址错误或域名不支持,请重新输入',
title: $t('invalid.link.or.domain.try.again'),
desc: '',
});
this.showSubmitPopup = false;
......@@ -124,12 +124,12 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (type === 'preview') {
window.open(`${config.h5Host}/activity/${this.uuid}?tenantId=${this.pageInfo.tenantId}&isPreview=1`);
} else {
this.$Notice.success({ title: '保存成功!' });
this.$Notice.success({ title: $t('saved.successfully') });
}
}
} catch (e) {
this.showSubmitPopup = false;
this.$Notice.error({ title: '提示', desc: e?.message || '出现未知错误!'});
this.$Notice.error({ title: $t('hint'), desc: e?.message || $t('unknown.error.occurred')});
} finally {
this.inTheSave = false;
}
......@@ -149,12 +149,12 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
this.toggle(false);
this.setCurEleIndex(curEleIndex);
this.setCurChildIndex(curChildIndex);
this.setRightTabName('组件设置');
this.setRightTabName($t('component.settings'));
}
handlePageSetClick() {
this.toggle(false);
this.setRightTabName('页面设置');
this.setRightTabName($t('page.settings'));
}
toggle(val) {
......@@ -247,7 +247,7 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
// 限制searchNav只添加一个
if (el.data.name === 'cs-search-bar' && this.hasSearchBarCom) {
this.$Notice.warning({
title: '搜索框只能添加一个'
title: $t('only.1.search.box')
});
return;
}
......@@ -255,12 +255,12 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (el.data.name === 'cs-floor-nav') {
if (this.hasFloorNavCom) {
this.$Notice.warning({
title: '楼层导航目前只支持添加一个'
title: $t('only.1.floor.nav')
});
return;
} else {
this.$Message.error({
content: '楼层导航添加后,商品导航中的锚点滚动将会无效',
content: $t('floor.nav.disables.product.nav.anchor'),
duration: 10
});
}
......@@ -268,7 +268,7 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (el.data.name === 'cs-snap-up') {
if (this.hasSnapUpCom) {
this.$Notice.warning({
title: '抢购组件目前只支持添加一个'
title: $t('only.1.flash.sale.component')
});
return;
}
......@@ -276,7 +276,7 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (el.data.name === 'cs-seckill') {
if (this.hasSeckillCom) {
this.$Notice.warning({
title: '秒杀组件目前只支持添加一个'
title: $t('only.1.seckill.component')
});
return;
}
......@@ -285,12 +285,12 @@ export default class DashBoard extends Mixins(ContextMenuMixin, GoodsTabsMixin,
if (el.data.name === 'cs-goods-tabs') {
if (this.hasGoodsNavCom) {
this.$Message.error({
content: '添加多个商品导航后,商品导航中的锚点滚动将会无效',
content: $t('multiproduct.nav.disables.anchor'),
duration: 10
});
} else if (this.hasFloorNavCom) {
this.$Message.error({
content: '已添加楼层导航后,商品导航中的锚点滚动将会无效',
content: $t('floor.nav.disables.product.nav.anchor'),
duration: 10
});
}
......
......@@ -2,11 +2,11 @@
<Row class="dashboard">
<Row class="dashboard-header" type="flex" align="middle">
<Col span="20" offset="2">
<Button @click="preview()">预览</Button>
<Button type="primary" @click="save()">保存</Button>
<Button @click="preview()">{{ $t('preview') }}</Button>
<Button type="primary" @click="save()">{{ $t('save') }}</Button>
</Col>
<Col span="2">
<Button @click="exit">取消</Button>
<Button @click="exit">{{ $t('cancel') }}</Button>
</Col>
</Row>
<Row class="dashboard-container">
......
......@@ -9,6 +9,6 @@ import Layout from 'component/layout/editor/index';
export default class Home extends Vue {
created() {
console.log('created进来了');
console.log($t('created.entry'));
}
}
\ No newline at end of file
......@@ -21,23 +21,23 @@ export default {
columns: [
{
key: 'id',
title: '编号',
title: $t('id'),
formType: 'input',
hideSearch: true
},
{
key: 'pageName',
title: '名称',
title: $t('name'),
formType: 'input',
},
{
key: 'pageDescribe',
title: '描述',
title: $t('description'),
formType: 'input',
},
{
key: 'coverImage',
title: '封面',
title: $t('cover'),
hideSearch: true,
render: (h, params) => {
return h(
......@@ -68,12 +68,12 @@ export default {
},
{
key: 'updatedAt',
title: '更新时间',
title: $t('update.time'),
hideSearch: true
},
{
key: 'action',
title: '操作',
title: $t('action'),
width: 200,
render: (h, params) => {
const props = {
......@@ -98,7 +98,7 @@ export default {
},
},
},
'修改'
$t('edit')
),
h(
'Poptip',
......@@ -106,7 +106,7 @@ export default {
props: {
confirm: true,
transfer: true,
title: '确认删除?',
title: $t('confirm.delete'),
},
style: {
...style,
......@@ -124,7 +124,7 @@ export default {
{
props,
},
'删除'
$t('delete')
),
]
),
......
......@@ -2,19 +2,19 @@
<div>
<div class="search-bar">
<Form @submit.native.prevent inline ref="searchForm" :model="searchForm" class="inline">
<Form-item label="名称" prop="name">
<Form-item :label="$t('name')" prop="name">
<Input v-model="searchForm.pageName" class="comWidth" />
</Form-item>
<Form-item label="描述" prop="pageDescribe">
<Form-item :label="$t('description')" prop="pageDescribe">
<Input v-model="searchForm.pageDescribe" class="comWidth" />
</Form-item>
<Form-item label="作者" prop="author">
<Form-item :label="$t('author')" prop="author">
<Input v-model="searchForm.author" class="comWidth" />
</Form-item>
<FormItem class="btnGroupStyle">
<div>
<Button class="btnStyle" @click="reset()">重置</Button>
<Button type="primary" class="btnStyle" @click="filter">查询</Button>
<Button class="btnStyle" @click="reset()">{{ $t('reset') }}</Button>
<Button type="primary" class="btnStyle" @click="filter">{{ $t('search') }}</Button>
</div>
</FormItem>
</Form>
......@@ -58,25 +58,25 @@ export default {
columns: [
{
align: 'center',
title: '页面名称',
title: $t('page.name'),
key: 'pageName',
width: 150,
},
{
align: 'center',
title: '描述',
title: $t('description'),
key: 'pageDescribe',
width: 150,
},
{
align: 'center',
title: '作者',
title: $t('author'),
key: 'author',
width: 100
},
{
align: 'center',
title: '封面',
title: $t('cover'),
width: 60,
render: (h, params) => {
return h('div', {
......@@ -100,14 +100,14 @@ export default {
},
{
align: 'center',
title: '链接',
title: $t('link'),
render: (h, params) => {
return h('span', `${config.h5Host}/activity/${params.row.uuid}?tenantId=${params.row.tenantId}&vccToken={token}`)
}
},
{
align: 'center',
title: '操作',
title: $t('action'),
width: 80,
render: (h, params) => {
const row = params.row;
......@@ -122,7 +122,7 @@ export default {
this.select(row);
}
}
}, '选择')
}, $t('select'))
]);
},
}
......
......@@ -3,7 +3,7 @@
<div class="expand-row" v-for="(item, idx) in row.navigatorData" :key="idx">
<div class="block"></div>
<div class="id">
<span class="expand-key">次序: </span>
<span class="expand-key">{{ $t('order') }}</span>
<span class="expand-value">{{ idx + 1 }}</span>
</div>
<div class="name">
......@@ -25,7 +25,7 @@
<span class="expand-value">{{ row.updatedAt }}</span>
</div>
<div class="operation">
<span class="expand-value"><Button :disabled="item.pageType == 1" @click="select(item)" type="primary" size="small">选择</Button></span>
<span class="expand-value"><Button :disabled="item.pageType == 1" @click="select(item)" type="primary" size="small">{{ $t('select') }}</Button></span>
</div>
</div>
</div>
......
......@@ -14,13 +14,13 @@ export default {
columns: [
{
align: 'center',
title: '页面名称',
title: $t('page.name'),
key: 'name',
},
{
align: 'center',
title: '操作',
title: $t('action'),
render: (h, params) => {
const row = params.row;
return h('div', [
......@@ -34,22 +34,22 @@ export default {
this.select(row);
}
}
}, '选择')
}, $t('select'))
]);
},
}
],
tableData: [
{
name: '首页tab',
name: $t('home.tab'),
url: 'home'
},
{
name: '购物车tab',
name: $t('cart.tab'),
url: 'shopcart'
},
{
name: '我的tab',
name: $t('my.tab'),
url: 'user'
}
]
......
......@@ -2,16 +2,16 @@
<div>
<div class="search-bar">
<Form @submit.native.prevent inline ref="searchForm" :model="searchForm" class="inline">
<Form-item label="名称" prop="name">
<Form-item :label="$t('name')" prop="name">
<Input v-model="searchForm.name" class="comWidth" />
</Form-item>
<Form-item label="作者" prop="author">
<Form-item :label="$t('author')" prop="author">
<Input v-model="searchForm.author" class="comWidth" />
</Form-item>
<FormItem class="btnGroupStyle">
<div>
<Button class="btnStyle" @click="reset()">重置</Button>
<Button type="primary" class="btnStyle" @click="filter">查询</Button>
<Button class="btnStyle" @click="reset()">{{ $t('reset') }}</Button>
<Button type="primary" class="btnStyle" @click="filter">{{ $t('search') }}</Button>
</div>
</FormItem>
</Form>
......@@ -90,30 +90,30 @@ export default {
},
{
align: 'center',
title: '名称',
title: $t('name'),
width: 160,
key: 'name'
},
{
align: 'center',
title: '页面地址',
title: $t('page.url'),
width: 250
},
{
align: 'center',
title: '作者',
title: $t('author'),
key: 'author',
width: 90
},
{
align: 'center',
title: '更新时间',
title: $t('update.time'),
key: 'updatedAt',
width: 170
},
{
align: 'center',
title: '操作',
title: $t('action'),
key: 'operation'
}
]
......
......@@ -2,25 +2,25 @@
<div class="tableComStyle">
<div class="searchFormStyle">
<Form @submit.native.prevent inline ref="searchForm" :model="searchForm" class="inline">
<Form-item label="名称" prop="name">
<Input v-model="searchForm.name" class="comWidth" placeholder="请输入名称" />
<Form-item :label="$t('name')" prop="name">
<Input v-model="searchForm.name" class="comWidth" :placeholder="$t('enter.name')" />
</Form-item>
<Form-item label="作者" prop="author">
<Input v-model="searchForm.author" class="comWidth" placeholder="请输入作者" />
<Form-item :label="$t('author')" prop="author">
<Input v-model="searchForm.author" class="comWidth" :placeholder="$t('enter.author')" />
</Form-item>
<FormItem class="btnGroupStyle">
<div>
<Button class="btnStyle" @click="reset()">重置</Button>
<Button type="primary" class="btnStyle" @click="query">查询</Button>
<Button class="btnStyle" @click="reset()">{{ $t('reset') }}</Button>
<Button type="primary" class="btnStyle" @click="query">{{ $t('search') }}</Button>
</div>
</FormItem>
</Form>
</div>
<div class="tableGroupStyle">
<div class="toolBarStyle">
<h3>查询数据</h3>
<h3>{{ $t('query.data') }}</h3>
<div>
<Button type="primary" class="btnStyle" @click="add">新增</Button>
<Button type="primary" class="btnStyle" @click="add">{{ $t('add') }}</Button>
<slot></slot>
</div>
</div>
......@@ -41,7 +41,7 @@
@on-page-size-change="changePageSize"
/>
</div>
<Modal v-model="showPagesUrl" title="页面地址列表" width="900">
<Modal v-model="showPagesUrl" :title="$t('page.url.list')" width="900">
<Table
:columns="urlTableColumns"
:data="urlTableData"
......@@ -145,13 +145,13 @@ export default {
delete(row) {
// 删除
this.$Modal.confirm({
title: '提示',
title: $t('hint'),
content: `是否删除导航 ${row.name}`,
onOk: async () => {
const deleteRes = await navigatorApi.deleteNavigator({
id: row.id
});
this.$toast('删除成功');
this.$toast($t('deleted.successfully'));
this.query();
}
})
......
......@@ -21,18 +21,18 @@ export default {
columns: [
{
key: "id",
title: "编号",
title: $t('id'),
formType: "input",
hideSearch: true,
},
{
key: "pageName",
title: "名称",
title: $t('name'),
formType: "input",
},
{
key: "pageDescribe",
title: "描述",
title: $t('description'),
formType: "input",
},
{
......@@ -43,12 +43,12 @@ export default {
},
{
key: "author",
title: "作者",
title: $t('author'),
formType: "input",
},
{
key: "coverImage",
title: "封面",
title: $t('cover'),
hideSearch: true,
render: (h, params) => {
return h(
......@@ -81,7 +81,7 @@ export default {
},
{
key: "id",
title: "链接",
title: $t('link'),
hideSearch: true,
render: (h, params) => {
return h(
......@@ -92,23 +92,23 @@ export default {
},
{
key: "isTemplate",
title: "是否模板",
title: $t('is.template'),
formType: "select",
number: true,
hideSearch: true,
valueEnum: {
0: "",
1: "",
0: $t('no'),
1: $t('yes'),
},
},
{
key: "updatedAt",
title: "更新时间",
title: $t('update.time'),
hideSearch: true,
},
{
key: "action",
title: "操作",
title: $t('action'),
width: 250,
render: (h, params) => {
const props = {
......@@ -134,7 +134,7 @@ export default {
},
},
},
"预览"
$t('preview')
),
h(
"Button",
......@@ -150,7 +150,7 @@ export default {
},
},
},
"修改"
$t('edit')
),
h(
"Button",
......@@ -169,7 +169,7 @@ export default {
},
},
},
"历史记录"
$t('history')
),
h(
"Poptip",
......@@ -177,7 +177,7 @@ export default {
props: {
confirm: true,
transfer: true,
title: "确认删除?",
title: $t('confirm.delete'),
},
style: {
...style,
......@@ -195,7 +195,7 @@ export default {
{
props,
},
"删除"
$t('delete')
),
]
),
......@@ -224,10 +224,10 @@ export default {
async refreshData() {
try {
await editorApi.refreshCache();
this.$Notice.success({ title: "刷新成功!" });
this.$Notice.success({ title: $t('refresh.success') });
} catch (error) {
console.log(error);
this.$Notice.warning({ title: "刷新失败!" });
this.$Notice.warning({ title: $t('refresh.failed') });
}
},
},
......
......@@ -20,28 +20,28 @@ export default {
columns: [
{
key: 'id',
title: '编号',
title: $t('id'),
formType: 'input',
hideSearch: true
},
{
key: 'pageName',
title: '名称',
title: $t('name'),
formType: 'input',
},
{
key: 'pageDescribe',
title: '描述',
title: $t('description'),
formType: 'input',
},
{
key: 'author',
title: '作者',
title: $t('author'),
formType: 'input',
},
{
key: 'coverImage',
title: '封面',
title: $t('cover'),
hideSearch: true,
render: (h, params) => {
return h(
......@@ -72,7 +72,7 @@ export default {
},
{
key: 'id',
title: '链接',
title: $t('link'),
hideSearch: true,
render: (h, params) => {
return h('span', `${config.h5Host}/activity/${params.row.uuid}`)
......@@ -80,12 +80,12 @@ export default {
},
{
key: 'updatedAt',
title: '更新时间',
title: $t('update.time'),
hideSearch: true
},
{
key: 'action',
title: '操作',
title: $t('action'),
width: 200,
render: (h, params) => {
const props = {
......@@ -108,7 +108,7 @@ export default {
},
},
},
'立即使用'
$t('use.now')
);
},
}
......
<template>
<layout>
<div class="wrapper">
<h1>低代码平台</h1>
<h1>{{ $t('lowcode.platform') }}</h1>
<div class="login">
<i-form ref="formMail" :model="formMail" :rules="ruleFormMail">
<FormItem prop="usernameMail">
......@@ -16,10 +16,10 @@
</i-input>
</FormItem>
<FormItem>
<i-button @click="login(formMail)" type="primary" long>登录</i-button>
<i-button @click="login(formMail)" type="primary" long>{{ $t('login') }}</i-button>
</FormItem>
</i-form>
<div style="color: #98a6ad; text-align: center; margin-bottom: 50px;">量化派 © {{ this.year }}</div>
<div style="color: #98a6ad; text-align: center; margin-bottom: 50px;">{{ $t('quantgroup') }}{{ this.year }}</div>
</div>
</div>
</layout>
......@@ -36,16 +36,16 @@ export default {
data() {
return {
showTips: true,
tips: '为提升各位同学使用体验,内部在用系统后续将统一迁移至量星球,请提前做好准备~',
tips: $t('migrating.to.liangxing.soon.prepare.now'),
formMail: {
usernameMail: undefined,
passwordMail: undefined,
captcha: undefined,
},
ruleFormMail: {
usernameMail: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
passwordMail: [{ required: true, message: '请输入密码', trigger: 'blur' }],
captcha: [{ required: true, message: '请输入验证码', trigger: 'blur' }],
usernameMail: [{ required: true, message: $t('enter.username'), trigger: 'blur' }],
passwordMail: [{ required: true, message: $t('enter.password'), trigger: 'blur' }],
captcha: [{ required: true, message: $t('enter.verification.code'), trigger: 'blur' }],
},
year: new Date().getFullYear(),
captcha: defaultCaptcha,
......
......@@ -120,14 +120,14 @@ export const defaultState = {
titleBgColor: '#fff',
titleUseUrl: false,
showPageBottomTip: true,
pageBottomTxt: '没有更多啦~',
pageBottomTxt: $t('no.more.data'),
pageBottomColor: '#333',
couponModal: [],
showBackTop: true,
btAttachVal: [
{
persets: '购物车',
name: '购物车',
persets: $t('shopping.cart'),
name: $t('shopping.cart'),
icon: 'shopping-cart',
url: 'xyqb://shoppingCart?needLogin=1',
color: '#333',
......
......@@ -5,18 +5,18 @@ import Notify from '@qg/cherry-ui/src/notify';
const ERR_MESSAGE_MAP = {
status: {
400: '错误请求',
401: '未授权,请重新登录',
403: '拒绝访问',
404: '请求错误,未找到该资源',
405: '请求方法未允许',
408: '请求超时',
500: '服务器端出错',
501: '网络未实现',
502: '网络错误',
503: '服务不可用',
504: '网络超时',
505: 'http版本不支持该请求'
400: $t('bad.request'),
401: $t('unauthorized.relogin'),
403: $t('access.denied'),
404: $t('request.error.resource.not.found'),
405: $t('method.not.allowed'),
408: $t('request.timeout'),
500: $t('server.error'),
501: $t('network.not.implemented'),
502: $t('network.error'),
503: $t('service.unavailable'),
504: $t('network.timeout'),
505: $t('http.version.not.supported')
}
};
......@@ -87,7 +87,7 @@ instance.interceptors.request.use(
// beforeRequest();
// 发起请求时,取消掉当前正在进行的相同请求
if (pending[config.url as string]) {
pending[config.url as string]('取消重复请求');
pending[config.url as string]($t('cancel.duplicate.request'));
}
config.cancelToken = new CancelToken(c => (pending[(config.url + JSON.stringify(config.data)) as string] = c));
// 添加token
......@@ -125,7 +125,7 @@ instance.interceptors.response.use(
Notify({
type: notifyType,
message: response.data.msg || '后端服务异常',
message: response.data.msg || $t('backend.service.error'),
duration: notifyType === 'warning' ? 6000 : 3000
});
if (response.data.code === '40100') {
......@@ -136,7 +136,7 @@ instance.interceptors.response.use(
async err => {
// afterRequest();
// 判断是否取消请求
if (err?.message === '取消重复请求') {
if (err?.message === $t('cancel.duplicate.request')) {
const res = {
status: 409,
data: {}
......@@ -172,7 +172,7 @@ instance.interceptors.response.use(
if (err.response) {
message = ERR_MESSAGE_MAP.status[err.response.status] || `连接错误${err.response.status}`;
} else {
message = '连接到服务器失败';
message = $t('failed.to.connect.to.server');
}
Notify({ type: 'danger', message });
return Promise.reject(err);
......
......@@ -1136,20 +1136,20 @@
if (file) {
switch (err.code) {
case plupload.FAILED:
errTip = '上传失败。请稍后再试。';
errTip = $t('upload.failed.try.again.later');
break;
case plupload.FILE_SIZE_ERROR:
let max_file_size = up.getOption && up.getOption('max_file_size');
max_file_size = max_file_size || (up.settings && up.settings.max_file_size);
errTip = '浏览器最大可上传' + max_file_size + '。更大文件请使用命令行工具。';
errTip = $t('browser.upload.limit') + max_file_size + $t('use.cli.for.larger.files');
break;
case plupload.FILE_EXTENSION_ERROR:
errTip = '文件验证失败。请稍后重试。';
errTip = $t('file.validation.failed.retry.later');
break;
case plupload.HTTP_ERROR:
if (err.response === '') {
// Fix parseJSON error ,when http error is like net::ERR_ADDRESS_UNREACHABLE
errTip = err.message || '未知网络错误。';
errTip = err.message || $t('unknown.network.error');
if (!unknow_error_retry(file)) {
return;
}
......@@ -1159,25 +1159,25 @@
let errorText = errorObj.error;
switch (err.status) {
case 400:
errTip = '请求报文格式错误。';
errTip = $t('request.format.error');
break;
case 401:
errTip = '客户端认证授权失败。请重试或提交反馈。';
errTip = $t('client.auth.failed.retry.or.report');
break;
case 405:
errTip = '客户端请求错误。请重试或提交反馈。';
errTip = $t('client.request.error.retry.or.report');
break;
case 579:
errTip = '资源上传成功,但回调失败。';
errTip = $t('resource.uploaded.but.callback.failed');
break;
case 599:
errTip = '网络连接异常。请重试或提交反馈。';
errTip = $t('network.error.retry.or.submit.feedback');
if (!unknow_error_retry(file)) {
return;
}
break;
case 614:
errTip = '文件已存在。';
errTip = $t('file.exists');
try {
errorObj = that.parseJSON(errorObj.error);
errorText = errorObj.error || 'file exists';
......@@ -1186,13 +1186,13 @@
}
break;
case 631:
errTip = '指定空间不存在。';
errTip = $t('space.not.found');
break;
case 701:
errTip = '上传数据块校验出错。请重试或提交反馈。';
errTip = $t('chunk.verification.error.retry.or.report');
break;
default:
errTip = '未知错误。';
errTip = $t('unknown.error');
if (!unknow_error_retry(file)) {
return;
}
......@@ -1201,16 +1201,16 @@
errTip = errTip + '(' + err.status + '' + errorText + ')';
break;
case plupload.SECURITY_ERROR:
errTip = '安全配置错误。请联系网站管理员。';
errTip = $t('security.config.error.contact.admin');
break;
case plupload.GENERIC_ERROR:
errTip = '上传失败。请稍后再试。';
errTip = $t('upload.failed.try.again.later');
break;
case plupload.IO_ERROR:
errTip = '上传失败。请稍后再试。';
errTip = $t('upload.failed.try.again.later');
break;
case plupload.INIT_ERROR:
errTip = '网站配置错误。请联系网站管理员。';
errTip = $t('website.configuration.error.contact.admin');
uploader.destroy();
break;
default:
......
'use strict';
export const SHOP_CART_CONFIG = {
persets: '购物车',
persets: $t('shopping.cart'),
txt: '',
name: '购物车',
name: $t('shopping.cart'),
icon: 'shopping-cart',
url: 'xyqb://shoppingCart?needLogin=1',
color: '#333',
......@@ -15,7 +15,7 @@ export const SHOP_CART_CONFIG = {
};
export const BACK_TOP_CONFIG = {
persets: '自定义',
persets: $t('custom'),
name: '',
icon: 'back-top',
background: '#fff',
......@@ -26,8 +26,8 @@ export const BACK_TOP_CONFIG = {
};
export const SHARE_CONFIG = {
persets: '分享',
name: '分享',
persets: $t('share'),
name: $t('share'),
txt: '',
icon: 'share',
url: '',
......@@ -41,7 +41,7 @@ export const SHARE_CONFIG = {
};
export const DEFAULT_CONFIG = {
persets: '自定义',
persets: $t('custom'),
name: '',
txt: '',
icon: '',
......
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