Commit ab62dc8d by damodmg

引用eslint

parent daec9508
.DS_Store
node_modules/
/build/
/config/
/dist/
/*.js
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint'
},
env: {
browser: true
},
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
// "standard",
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'plugin:prettier/recommended'
],
// required to lint *.vue files
plugins: ['vue', 'prettier'],
// add your custom rules here
rules: {
'prettier/prettier': [
'error',
{
endOfLine: 'auto'
}
],
// allow async-await
'generator-star-spacing': 'off',
'no-console': process.env.NODE_ENV === 'production' ? 2 : 0,
'no-alert': process.env.NODE_ENV === 'production' ? 2 : 0, //禁止使用alert confirm prompt
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
// --------------------静态检测-----------------------------
/**
* 静态检测:
* 以下基本位能够帮助发现代码错误的规则
* */
// 禁止与负零进行比较
'no-compare-neg-zero': 2,
// 禁止将常量作为 if 或三元表达式的测试条件,比如 if (true), let foo = 0 ? 'foo' : 'bar'
'no-constant-condition': [
2,
{
checkLoops: false
}
],
// 禁止在函数参数中出现重复名称的参数 【辅助检测】
'no-dupe-args': 2,
// 禁止在对象字面量中出现重复名称的键名 【辅助检测】
'no-dupe-keys': 2,
// 禁止出现空代码块 【可读性差】
'no-empty': [
2,
{
"allowEmptyCatch": true
}
],
// 禁止将 catch 的第一个参数 error 重新赋值 【重新赋值,error将没有意义】
'no-ex-assign': 2,
// @fixable 禁止函数表达式中出现多余的括号,比如 let foo = (function () { return 1 }) 【一般不会这么写,可读性差】
'no-extra-parens': [2, 'functions'],
// 禁止将一个函数申明重新赋值,如:
// function foo() {}
// foo = bar [静态检测:无意义]
'no-func-assign': 2,
// 禁止在 if 内出现函数申明或使用 var 定义变量
'no-inner-declarations': [2, 'both'],
// 禁止使用特殊空白符(比如全角空格),除非是出现在字符串、正则表达式或模版字符串中
'no-irregular-whitespace': [
2,
{
skipStrings: true,
skipComments: false,
skipRegExps: true,
skipTemplates: true
}
],
// typeof 表达式比较的对象必须是 'undefined', 'object', 'boolean', 'number', 'string', 'function' 或 'symbol'
'valid-typeof': 2,
// -----------------------------------最佳实践----------------------------------------------
/**
* 最佳实践
* 这些规则通过一些最佳实践帮助你避免问题
*/
// 禁止函数的循环复杂度超过 20,【https://en.wikipedia.org/wiki/Cyclomatic_complexity】
complexity: [
2,
{
"max": 20
}
],
// 不允许有空函数,除非是将一个空函数设置为某个项的默认值 【否则空函数并没有实际意义】
'no-empty-function': [
2,
{
allow: ['functions', 'arrowFunctions']
}
],
// 禁止修改原生对象 【例如 Array.protype.xxx=funcion(){},很容易出问题,比如for in 循环数组 会出问题】
'no-extend-native': 2,
// @fixable 表示小数时,禁止省略 0,比如 .5 【可读性】
'no-floating-decimal': 2,
// 禁止直接 new 一个类而不赋值 【 那么除了占用内存还有什么意义呢? @off vue语法糖大量存在此类语义 先手动关闭】
'no-new': 0,
// 禁止使用 new Function,比如 let x = new Function("a", "b", "return a + b"); 【可读性差】
'no-new-func': 2,
// 禁止将自己赋值给自己 [规则帮助检测]
'no-self-assign': 2,
// 禁止将自己与自己比较 [规则帮助检测]
'no-self-compare': 2,
// @fixable 立即执行的函数必须符合如下格式 (function () { alert('Hello') })() 【立即函数写法很多,这个是最易读最标准的】
'wrap-iife': [
2,
'inside',
{
functionPrototypeMethods: true
}
],
// 禁止使用保留字作为变量名 [规则帮助检测保留字,通常ide难以发现,生产会出现问题]
'no-shadow-restricted-names': 2,
// 禁止使用未定义的变量
'no-undef': [
2,
{
typeof: false
}
],
// 定义过的变量必须使用 【正规应该是这样的,具体可以大家讨论】
'no-unused-vars': [
2,
{
vars: 'all',
args: 'none',
caughtErrors: 'none',
ignoreRestSiblings: true
}
],
// 变量必须先定义后使用 【ps:涉及到es6存在不允许变量提升的问题,以免引起意想不到的错误,具体可以大家讨论】
'no-use-before-define': [
2,
{
functions: false,
classes: false,
variables: false
}
],
// ----------------------------------------------------代码规范----------------------------------------------------------
/**
* 代码规范
* 有关【空格】、【链式换行】、【缩进】、【=、{}、()、首位空格】规范没有添加,怕大家一时间接受不了,目前所挑选的规则都是:保障我们的代码可读性、可维护性的
* */
// 变量名必须是 camelcase 驼峰风格的
// @off 【涉及到 很多 api 或文件名可能都不是 camelcase 先关闭】
camelcase: 0,
// @fixable 禁止在行首写逗号
'comma-style': [2, 'last'],
// @fixable 一个缩进必须用两个空格替代
// @off 【不限制大家,为了关闭eslint默认值,所以手动关闭,off不可去掉】 讨论
indent: [2, 2, { SwitchCase: 1 }],
//@off 手动关闭//前面需要回车的规则 注释
'spaced-comment': 0,
//@off 手动关闭: 禁用行尾空白
'no-trailing-spaces': 2,
//@off 手动关闭: 不允许多行回车
'no-multiple-empty-lines': 1,
//@off 手动关闭: 逗号前必须加空格
'comma-spacing': 0,
//@off 手动关闭: 冒号后必须加空格
'key-spacing': 1,
// @fixable 结尾禁止使用分号
//@off [vue官方推荐无分号,不知道大家是否可以接受?先手动off掉] 讨论
// "semi": [2,"never"],
semi: 0,
// 代码块嵌套的深度禁止超过 5 层
'max-depth': [1, 10],
// 回调函数嵌套禁止超过 5 层,多了请用 async await 替代
'max-nested-callbacks': [2, 5],
// 函数的参数禁止超过 7 个
'max-params': [2, 7],
// new 后面的类名必须首字母大写 【面向对象编程原则】
'new-cap': [
2,
{
newIsCap: true,
capIsNew: false,
properties: true
}
],
// @fixable new 后面的类必须有小括号 【没有小括号、指针指过去没有意义】
'new-parens': 2,
// @fixable 禁止属性前有空格,比如 foo. bar() 【可读性太差,一般也没人这么写】
'no-whitespace-before-property': 2,
// @fixable 禁止 if 后面不加大括号而写两行代码 eg: if(a>b) a=0 b=0
'nonblock-statement-body-position': [2, 'beside', { overrides: { while: 'below' } }],
// 禁止变量申明时用逗号一次申明多个 eg: let a,b,c,d,e,f,g = [] 【debug并不好审查、并且没办法单独写注释】
'one-var': [2, 'never'],
// @fixable 【变量申明必须每行一个,同上】
'one-var-declaration-per-line': [2, 'always'],
//是否使用全等
eqeqeq: 0,
//this别名
'consistent-this': [2, 'that'],
// -----------------------------ECMAScript 6-------------------------------------
/**
* ECMAScript 6
* 这些规则与 ES6 有关 【请大家 尝试使用正确使用const和let代替var,以后大家熟悉之后可能会提升规则】
* */
// 禁止对定义过的 class 重新赋值
'no-class-assign': 2,
// @fixable 禁止出现难以理解的箭头函数,比如 let x = a => 1 ? 2 : 3
'no-confusing-arrow': [2, { allowParens: true }],
// 禁止对使用 const 定义的常量重新赋值
'no-const-assign': 2,
// 禁止重复定义类
'no-dupe-class-members': 2,
// 禁止重复 import 模块
'no-duplicate-imports': 2,
//@off 以后可能会开启 禁止 var
'no-var': 0,
// ---------------------------------被关闭的规则-----------------------
// parseInt必须指定第二个参数 parseInt("071",10);
radix: 0,
//强制使用一致的反勾号、双引号或单引号 (quotes) 关闭
quotes: 0,
//要求或禁止函数圆括号之前有一个空格
'space-before-function-paren': [0, 'always'],
//禁止或强制圆括号内的空格
'space-in-parens': [0, 'never'],
//关键字后面是否要空一格
'space-after-keywords': [0, 'always'],
// 要求或禁止在函数标识符和其调用之间有空格
'func-call-spacing': [0, 'never']
}
};
{
"printWidth": 400,
"tabWidth": 2,
"useTabs": false,
"singleQuote": true,
"semi": true,
"trailingComma": "none",
"bracketSpacing": true,
"jsxBracketSameLine": true,
"proseWrap": "preserve"
}
......@@ -47,6 +47,7 @@ exports.cssLoaders = function (options) {
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
publicPath:"../../",
fallback: 'vue-style-loader'
})
} else {
......
......@@ -27,20 +27,21 @@ module.exports = {
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: false,
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
// showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
......@@ -59,7 +60,7 @@ module.exports = {
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/integral-mall/',
assetsPublicPath: './',
/**
* Source Maps
......
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=/integral-mall/static/css/app.dc7515ded3a783d66118c49b81d6e3a7.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.03.js></script><script src=//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/upload-image.2.0.00.js></script><script type=text/javascript src=/integral-mall/static/js/manifest.003beacb9c9ae622c7f2.js></script><script type=text/javascript src=/integral-mall/static/js/vendor.001c8c8c5c313dc75bd0.js></script><script type=text/javascript src=/integral-mall/static/js/app.f1feb583bfa10eac0636.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel="shortcut icon" href=./static/img/favicon.ico><title>GIC后台</title><link rel=stylesheet type=text/css href=static/css/iconfont.css><link rel=stylesheet type=text/css href=static/css/common.css><link href=./static/css/app.6b0d26a45c323d2bf6448589ccd55867.css rel=stylesheet></head><body><div id=app></div><script src=//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js></script><script src=//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js></script><script src=//web-1251519181.file.myqcloud.com/components/header.2.0.03.js></script><script src=//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/export-excel.2.0.01.js></script><script src=//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js></script><script src=//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/upload-image.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/input.2.0.00.js></script><script src=//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js></script><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.264a1f7323512c77f7a5.js></script><script type=text/javascript src=./static/js/app.1ee2eaac00ac61d77731.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -301,7 +301,7 @@ a:hover{
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none !important;
margin: 0;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,l,a=0,p=[];a<e.length;a++)i=e[a],t[i]&&p.push(t[i][0]),t[i]=0;for(f in u)Object.prototype.hasOwnProperty.call(u,f)&&(r[f]=u[f]);for(n&&n(e,u,c);p.length;)p.shift()();if(c)for(a=0;a<c.length;a++)l=o(o.s=c[a]);return l};var e={},t={2:0};function o(n){if(e[n])return e[n].exports;var t=e[n]={i:n,l:!1,exports:{}};return r[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.m=r,o.c=e,o.d=function(r,n,e){o.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:e})},o.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return o.d(n,"a",n),n},o.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},o.p="/integral-mall/",o.oe=function(r){throw console.error(r),r}}([]);
\ No newline at end of file
!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a<e.length;a++)i=e[a],o[i]&&l.push(o[i][0]),o[i]=0;for(f in u)Object.prototype.hasOwnProperty.call(u,f)&&(r[f]=u[f]);for(n&&n(e,u,c);l.length;)l.shift()();if(c)for(a=0;a<c.length;a++)p=t(t.s=c[a]);return p};var e={},o={2:0};function t(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return r[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=r,t.c=e,t.d=function(r,n,e){t.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:e})},t.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return t.d(n,"a",n),n},t.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},t.p="./",t.oe=function(r){throw console.error(r),r}}([]);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -16,17 +16,21 @@
<div id="app"></div>
<!-- built files will be auto injected -->
<!-- 库引用cdn -->
<script src="//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js"></script>
<script src="//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js"></script>
<script src="//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js"></script>
<script src="//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js"></script>
<script src='//web-1251519181.file.myqcloud.com/lib/vue/2.6.6/vue.min.js'></script>
<script src='//web-1251519181.file.myqcloud.com/lib/vue-router/3.0.2/vue-router.min.js'></script>
<script src='//web-1251519181.file.myqcloud.com/lib/vuex/3.1.0/vuex.min.js'></script>
<script src='//web-1251519181.file.myqcloud.com/lib/elementUI/index.2.5.4.js'></script>
<!-- 组件引用cdn -->
<script src="//web-1251519181.file.myqcloud.com/components/header.2.0.03.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/export-excel.2.0.01.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js"></script>
<script src="//web-1251519181.file.myqcloud.com/components/upload-image.2.0.00.js"></script>
<script src='//web-1251519181.file.myqcloud.com/components/header.2.0.03.js'></script>
<script src='//web-1251519181.file.myqcloud.com/components/aside-menu.2.0.02.js'></script>
<script src='//web-1251519181.file.myqcloud.com/components/export-excel.2.0.01.js'></script>
<script src='//web-1251519181.file.myqcloud.com/components/footer.2.0.02.js'></script>
<script src='//web-1251519181.file.myqcloud.com/components/img-preview.2.0.00.js'></script>
<script src='//web-1251519181.file.myqcloud.com/components/upload-image.2.0.00.js'></script>
<!-- 二次封装的input -->
<script src='//web-1251519181.file.myqcloud.com/components/input.2.0.00.js'></script>
<!-- 删除确认弹窗 -->
<script src='//web-1251519181.file.myqcloud.com/components/delete.2.0.00.js'></script>
</body>
</html>
\ No newline at end of file
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -8,7 +8,9 @@
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "node build/build.js",
"publish": "publish.bat"
"publish": "publish.bat",
"format": "onchange 'test/**/*.js' 'src/**/*.js' 'src/**/*.vue' -- prettier --write {{changed}}",
"formater": "onchange \"test/**/*.js\" \"src/**/*.js\" \"src/**/*.vue\" -- prettier --write {{changed}}"
},
"dependencies": {
"@gic-test/vue-gic-store-linkage": "^1.0.7",
......@@ -17,7 +19,6 @@
"@tinymce/tinymce-vue": "^1.1.0",
"axios": "^0.18.0",
"element-ui": "^2.4.1",
"packele": "^1.0.8",
"scriptjs": "^2.5.8",
"tinymce": "^4.8.5",
"vue": "^2.5.2",
......@@ -30,19 +31,29 @@
"devDependencies": {
"ansi-html": "^0.0.7",
"autoprefixer": "^7.1.2",
"babel-cli": "^6.26.0",
"babel-core": "^6.22.1",
"babel-eslint": "^8.2.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-flow": "^6.23.0",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"css-loader": "^0.28.0",
"eslint": "^4.15.0",
"eslint-config-prettier": "^3.6.0",
"eslint-config-standard": "^10.2.1",
"eslint-friendly-formatter": "^3.0.0",
"eslint-loader": "^1.7.1",
"eslint-plugin-import": "^2.7.0",
"eslint-plugin-node": "^5.2.0",
"eslint-plugin-prettier": "^3.0.1",
"eslint-plugin-promise": "^3.4.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.0.0",
"element-theme-chalk": "^2.4.1",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
......@@ -51,12 +62,14 @@
"localforage": "^1.7.2",
"node-notifier": "^5.1.2",
"node-sass": "^4.9.0",
"onchange": "^5.2.0",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"prettier": "^1.16.4",
"rimraf": "^2.6.0",
"sass-loader": "^7.0.3",
"semver": "^5.3.0",
......
<template>
<div id="app">
<keep-alive :include="include">
......@@ -10,19 +9,19 @@
<script>
export default {
name: 'App',
data(){
data() {
return {
include:[]
}
include: []
};
}
}
};
</script>
<style lang="scss">
@import './assets/theme/index.css';
@import './assets/style/base/index.scss';
@import './assets/iconfont/iconfont.css';
#app{
#app {
height: 100%;
background-color: #f0f2f5;
}
......
/*eslint-disable*/
import axios from 'axios'
import store from '../store/index'
// import router from '../router'
......@@ -35,13 +36,12 @@ request.interceptors.request.use(
request.interceptors.response.use(
response => {
if(response.status == 200 && response.data.errorCode === 401) {
window.location.href = window.location.origin + ('/integral-mall')
window.location.href = window.location.origin + ('/integral-mall')
// window.location.href = 'http://gicdev.com/gic-web'
}
return response;
},
error => {
console.log(error)
if (error.response) {
switch (error.response.status) {
case 401:
......
import vueGicAsideMenu from './component.vue' // 导入组件
import vueGicAsideMenu from './component.vue'; // 导入组件
const vueGicAside = {
install(Vue, options) {
Vue.component(vueGicAsideMenu.name, vueGicAsideMenu) // vueGicAsideMenu.name 组件的name属性
// 类似通过 this.$xxx 方式调用插件的 其实只是挂载到原型上而已
// Vue.prototype.$xxx // 最终可以在任何地方通过 this.$xxx 调用
// 虽然没有明确规定用$开头 但是大家都默认遵守这个规定
}
}
install(Vue, options) {
Vue.component(vueGicAsideMenu.name, vueGicAsideMenu); // vueGicAsideMenu.name 组件的name属性
// 类似通过 this.$xxx 方式调用插件的 其实只是挂载到原型上而已
// Vue.prototype.$xxx // 最终可以在任何地方通过 this.$xxx 调用
// 虽然没有明确规定用$开头 但是大家都默认遵守这个规定
}
};
if (typeof window !== 'undefined' && window.Vue) {
window.Vue.use(vueGicAside);
}
export default vueGicAside
export default vueGicAside;
// export {
// vueGicAsideMenu
// }
......@@ -2,4 +2,4 @@ import upload from './upload';
export default {
upload
}
};
......@@ -3,16 +3,18 @@
<vue-gic-header class="user-header-pop" style="z-index: 1999;min-width:1400px" :projectName="projectName" :collapseFlag="collapseFlag" @collapseTag="collapseTagHandler" @toRouterView="toRouterView"></vue-gic-header>
<div class="layout">
<vue-gic-aside-menu class="layout-left" v-if="asideShow" :projectName="projectName" :leftModulesName="leftModulesName" :collapseFlag.sync="collapseFlag"></vue-gic-aside-menu>
<div class="layout-right" :class="[{'asideShow': asideShow},{'collapseFlag':asideShow && collapseFlag}]">
<div class="layout-right" :class="[{ asideShow: asideShow }, { collapseFlag: asideShow && collapseFlag }]">
<div class="layout-title">
<el-breadcrumb class="dm-breadcrumb" separator="/">
<el-breadcrumb-item :to="{ path: '' }"><a href="/report/#/memberSummary">首页</a></el-breadcrumb-item>
<el-breadcrumb-item :class="{'no-link':!v.path}" v-for="(v,i) in breadcrumb" :key="i" :to="{ path: v.path }">{{v.name}}</el-breadcrumb-item>
<el-breadcrumb-item :class="{ 'no-link': !v.path }" v-for="(v, i) in breadcrumb" :key="i" :to="{ path: v.path }">{{ v.name }}</el-breadcrumb-item>
</el-breadcrumb>
<h3><span>{{contentTitle}}</span></h3>
<h3>
<span>{{ contentTitle }}</span>
</h3>
</div>
<div class="layout-content__wrap">
<div class="layout-content" :class="[{'asideShow': asideShow},{'collapseFlag':asideShow && collapseFlag}]">
<div class="layout-content" :class="[{ asideShow: asideShow }, { collapseFlag: asideShow && collapseFlag }]">
<router-view></router-view>
</div>
</div>
......@@ -23,165 +25,165 @@
</div>
</template>
<script>
export default {
data () {
return {
collapseFlag: false,
projectName: "integral-mall",
leftModulesName: '公众号配置',
}
},
created(){
$bus.$on('aside-menu',val => {
this.leftMenuRouter = val
})
export default {
data() {
return {
collapseFlag: false,
projectName: 'integral-mall',
leftModulesName: '公众号配置'
};
},
created() {
/* eslint-disable */
$bus.$on('aside-menu', val => {
this.leftMenuRouter = val;
});
},
/* eslint-disable */
destroyed() {
$bus.$off('aside-menu');
},
computed: {
asideShow() {
return this.$store.state.marketing.asideShow;
},
destroyed() {
$bus.$off('aside-menu');
},
computed: {
asideShow() {
console.log(this.$store.state)
return this.$store.state.marketing.asideShow;
},
contentTitle() {
return this.$route.name
},
breadcrumb() {
return this.$store.state.marketing.breadcrumb;
}
contentTitle() {
return this.$route.name;
},
// watch:{
// asideShow(val) {
// this.collapseFlag = this.asideShow;
// }
breadcrumb() {
return this.$store.state.marketing.breadcrumb;
}
},
// watch:{
// asideShow(val) {
// this.collapseFlag = this.asideShow;
// }
// },
methods: {
// // 处理路由跳转
// toRouterView(val) {
// var that = this;
// // 模拟检查数据
// // //有两个参数
// //{
// // name:,
// // path:
// //}
// that.$router.push({
// path: val
// });
// },
methods: {
// 处理路由跳转
toRouterView(val) {
var that = this;
// 模拟检查数据
// //有两个参数
//{
// name:,
// path:
//}
that.$router.push({
path: val
})
},
// 处理路由跳转
toRouterView(val) {
//有两个参数
//{
// name:,
// path:
//}
this.$router.push({
path: val.path
})
},
// 折叠事件
collapseTagHandler(val){
this.collapseFlag = val
}
// 处理路由跳转
toRouterView(val) {
//有两个参数
//{
// name:,
// path:
//}
this.$router.push({
path: val.path
});
},
// 折叠事件
collapseTagHandler(val) {
this.collapseFlag = val;
}
}
};
</script>
<style lang="scss">
.layout-container{
height:100%;
display:flex;
.layout-container {
height: 100%;
display: flex;
}
.layout {
display: flex;
flex-direction: row;
background-color: #f0f2f5;
height: calc(100% - 64px);
overflow-x: auto;
overflow-y: hidden;
margin-top: 64px;
width: 100%;
&-left {
width: 200px;
display: inline-block;
position: fixed;
left: 0;
z-index: 9;
}
.layout {
display: flex;
flex-direction: row;
background-color: #f0f2f5;
height: calc(100% - 64px);
&-right {
position: relative;
flex: 1;
overflow-x: auto;
overflow-y: hidden;
margin-top: 64px;
width: 100%;
&-left {
width: 200px;
display: inline-block;
position: fixed;
left: 0;
z-index: 9;
transition: width 0.5s;
-moz-transition: width 0.5s;
-webkit-transition: width 0.5s;
-o-transition: width 0.5s;
height: 100%;
// overflow-y: auto;
margin-left: 0px;
&.asideShow {
margin-left: 200px;
}
&-right{
position: relative;
flex: 1;
overflow-x:auto;
transition: width 0.5s;
-moz-transition: width 0.5s;
-webkit-transition: width 0.5s;
-o-transition: width 0.5s;
height: 100%;
// overflow-y: auto;
margin-left:0px;
&.asideShow{
margin-left: 200px;
}
&.collapseFlag{
margin-left: 64px;
}
&.collapseFlag {
margin-left: 64px;
}
&-title{
// position: absolute;
// width: 100%;
// top:0;
// left:0;
height:85px;
background:#fff;
// box-shadow: 0 3px 5px rgba(147,165,184,.13);
padding:15px 0 0 30px;
border-bottom: 1px solid #e4e7ed;
h3 {
color:#303133;
font-size:20px;
padding:24px 0;
font-weight:500;
span{
color:#303133;
font-size:20px;
font-weight:500;
}
i{
font-size:20px;
color:#c0c4ce;
cursor: pointer;
&:hover{
color:#909399;
}
}
}
&-title {
// position: absolute;
// width: 100%;
// top:0;
// left:0;
height: 85px;
background: #fff;
// box-shadow: 0 3px 5px rgba(147,165,184,.13);
padding: 15px 0 0 30px;
border-bottom: 1px solid #e4e7ed;
h3 {
color: #303133;
font-size: 20px;
padding: 24px 0;
font-weight: 500;
span {
color: #303133;
font-size: 20px;
font-weight: 500;
}
}
&-content__wrap {
overflow-y: auto;
position: relative;
top:-1px;
&::-webkit-scrollbar {
display: none;
i {
font-size: 20px;
color: #c0c4ce;
cursor: pointer;
&:hover {
color: #909399;
}
}
}
&-content {
// margin-top: 100px;
min-height: calc(100% - 200px);
min-width: 1400px;
&.asideShow{
min-width: 1200px;
}
&.collapseFlag{
min-width: 1336px;
}
}
&-content__wrap {
overflow-y: auto;
position: relative;
top: -1px;
&::-webkit-scrollbar {
display: none;
}
}
.dm-breadcrumb{
display: inline-block;
vertical-align: middle;
&-content {
// margin-top: 100px;
min-height: calc(100% - 200px);
min-width: 1400px;
&.asideShow {
min-width: 1200px;
}
&.collapseFlag {
min-width: 1336px;
}
}
}
.dm-breadcrumb {
display: inline-block;
vertical-align: middle;
}
.user-header-pop {
min-width: 95px;
......@@ -189,5 +191,4 @@
.el-popover.user-header-pop {
min-width: 95px;
}
</style>
/*eslint-disable*/
const config = {
development: {
api: '/dmApi/'
},
production: {
// api: 'https://hope.demogic.com/',
api: (window.location.protocol + '//' + window.location.host +'/') || ''
api: window.location.protocol + '//' + window.location.host + '/' || ''
}
}
};
export default {
api: config[process.env['NODE_ENV']]['api']
}
};
export default axios
\ No newline at end of file
export default axios;
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
import { axios } from './service/api/index'
import ElementUI from 'element-ui'
import Vue from 'vue';
import App from './App';
import router from './router';
import store from './store';
import { axios } from './service/api/index';
import ElementUI from 'element-ui';
// import vueGicHeader from '@gic-test/vue-gic-header'
// import vueGicFooter from '@gic-test/vue-gic-footer'
// 单个图片预览插件
// import vueGicImgPreview from '@gic-test/vue-gic-img-preview'
import vueGicStoreLinkage from '@gic-test/vue-gic-store-linkage/src/lib'
import vueGicStoreLinkage from '@gic-test/vue-gic-store-linkage/src/lib';
// import vueGicAsideMenu from '@/components/aside-menu'
// 图片墙上传插件
// import vueGicUploadImage from '@gic-test/vue-gic-upload-image/src/lib'
import VueClipboard from 'vue-clipboard2'
import VueClipboard from 'vue-clipboard2';
// import vueGicExportExcel from '@gic-test/vue-gic-export-excel'
import packele from 'packele'
Vue.config.productionTip = false
Vue.use(packele)
Vue.use(ElementUI)
Vue.config.productionTip = false;
Vue.use(ElementUI);
// Vue.use(vueGicHeader)
// Vue.use(vueGicFooter)
// Vue.use(vueGicAsideMenu)
Vue.use(vueGicStoreLinkage)
Vue.use(vueGicStoreLinkage);
// Vue.use(vueGicImgPreview)
// Vue.use(vueGicUploadImage)
Vue.use(VueClipboard)
Vue.use(VueClipboard);
// Vue.use(vueGicExportExcel)
Vue.prototype.axios = axios;
Vue.prototype.axios.withCredentials = true
Vue.prototype.axios.withCredentials = true;
/* eslint-disable */
window.$bus = new Vue();
let flag = false
let flag = false;
Vue.prototype.$tips = function({ message = '提示', type = 'success' }) {
if (flag) { return } else { this.$message({ message, type }) }
flag = true;
setTimeout(_ => { flag = false }, 1000)
}
/* eslint-disable no-new */
if (flag) {
return;
} else {
this.$message({ message, type });
}
flag = true;
setTimeout(_ => {
flag = false;
}, 1000);
};
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})
\ No newline at end of file
el: '#app',
router,
store,
components: { App },
template: '<App/>'
});
import Vue from 'vue'
import Router from 'vue-router'
import routes from './routes'
Vue.use(Router)
import Vue from 'vue';
import Router from 'vue-router';
import routes from './routes';
Vue.use(Router);
let router = new Router({
routes,
......@@ -13,17 +13,14 @@ let router = new Router({
}
const layoutRight = document.querySelector('.layout-right');
if (layoutRight) {
layoutRight.scrollTo(0,0);
layoutRight.scrollTo(0, 0);
}
}
});
})
router.beforeEach((to,from,next) => {
router.beforeEach((to, from, next) => {
document.title = to.name;
next()
})
export default router
next();
});
export default router;
import Layout from '@/components/layout'
import page401 from '@/views/error/401'
import page403 from '@/views/error/403'
import page404 from '@/views/error/404'
import page500 from '@/views/error/500'
import Layout from '@/components/layout';
import page401 from '@/views/error/401';
import page403 from '@/views/error/403';
import page404 from '@/views/error/404';
import page500 from '@/views/error/500';
//积分商城
import mall from '../views/mall/index';
import couponList from '../views/mall/coupon/list';
......@@ -13,144 +13,146 @@ import giftExchange from '../views/mall/gift/exchange';
import giftInfo from '../views/mall/gift/info.vue';
import goodsList from '../views/mall/goods/list';
export default [
{
path: '/',
name: 'layout',
component: Layout,
redirect: '/mall',
children: [
{
path: 'mall',
name: '积分商城',
component: mall,
redirect: '/coupon',
meta: {},
children: [
{
path: '/coupon',
name: '优惠券',
component: couponList,
meta: {
menu: 'coupon'
}
},
{
path: '/coupon/exchange/:id',
name: '优惠券兑换记录',
component: couponExchange,
meta: {
menu: 'coupon'
}
},
{
path: '/coupon/info',
name: '新增优惠券',
component: couponInfo,
meta: {
type: 'add',
menu: 'coupon'
}
},
{
path: '/coupon/info/:id',
name: '编辑优惠券',
component: couponInfo,
meta: {
type: 'edit',
menu: 'coupon'
}
},
{
path: '/coupon/queryinfo/:id',
name: '优惠券详情',
component: couponInfo,
meta: {
type: 'info',
menu: 'coupon'
}
},
{
path: '/gift',
name: '礼品',
component: giftList,
meta: {
menu: 'gift'
}
},
{
path: '/gift/exchange/:id',
name: '礼品兑换记录',
component: giftExchange,
meta: {
menu: 'gift'
}
},
{
path: '/gift/wxexchange/:id',
name: '微信兑换券兑换记录',
component: giftExchange,
meta: {
menu: 'gift',
type: 'wx'
}
},
{
path: '/gift/info',
name: '新增礼品',
component: giftInfo,
meta: {
type: 'add',
menu: 'gift'
}
},
{
path: '/gift/info/:id',
name: '编辑礼品',
component: giftInfo,
meta: {
type: 'edit',
menu: 'gift'
}
},
{
path: '/gift/queryinfo/:id',
name: '礼品详情',
component: giftInfo,
meta: {
type: 'info',
menu: 'gift'
}
},
export default [{
path: '/',
name: 'layout',
component: Layout,
redirect: '/mall',
children: [{
path: 'mall',
name: '积分商城',
component: mall,
redirect: '/coupon',
meta: {},
children: [{
path: '/coupon',
name: '优惠券',
component: couponList,
meta: {
menu: 'coupon'
}
},
{
path: '/coupon/exchange/:id',
name: '优惠券兑换记录',
component: couponExchange,
meta: {
menu: 'coupon'
}
},
{
path: '/coupon/info',
name: '新增优惠券',
component: couponInfo,
meta: {
type: 'add',
menu: 'coupon'
}
},
{
path: '/coupon/info/:id',
name: '编辑优惠券',
component: couponInfo,
meta: {
type: 'edit',
menu: 'coupon'
}
},
{
path: '/coupon/queryinfo/:id',
name: '优惠券详情',
component: couponInfo,
meta: {
type: 'info',
menu: 'coupon'
}
},
{
path: '/gift',
name: '礼品',
component: giftList,
meta: {
menu: 'gift'
}
},
{
path: '/gift/exchange/:id',
name: '礼品兑换记录',
component: giftExchange,
meta: {
menu: 'gift'
}
},
{
path: '/gift/wxexchange/:id',
name: '微信兑换券兑换记录',
component: giftExchange,
meta: {
menu: 'gift',
type: 'wx'
}
},
{
path: '/gift/info',
name: '新增礼品',
component: giftInfo,
meta: {
type: 'add',
menu: 'gift'
}
},
{
path: '/gift/info/:id',
name: '编辑礼品',
component: giftInfo,
meta: {
type: 'edit',
menu: 'gift'
}
},
{
path: '/gift/queryinfo/:id',
name: '礼品详情',
component: giftInfo,
meta: {
type: 'info',
menu: 'gift'
}
},
{
path: '/goods',
name: '待发货',
component: goodsList,
meta: {
menu: 'goods'
}
},
]
}]
},
{
path: '/401',
name: '未授权',
component: page401
},
{
path: '/403',
name: '禁止访问',
component: page403
},
{
path: '/500',
name: '系统错误',
component: page500
},
{
path: '*',
name: '未知领域',
component: page404
},
]
\ No newline at end of file
{
path: '/goods',
name: '待发货',
component: goodsList,
meta: {
menu: 'goods'
}
}
]
}
]
},
{
path: '/401',
name: '未授权',
component: page401
},
{
path: '/403',
name: '禁止访问',
component: page403
},
{
path: '/500',
name: '系统错误',
component: page500
},
{
path: '*',
name: '未知领域',
component: page404
}
];
import {requests} from './index';
import { requests } from './index';
import router from '@/router';
const MARKET_PREFIX = 'api-marketing/';
const PLUG_PREFIX = 'api-plug/';
const GOODS_PREFIX = 'api-admin/';
import Vue from 'vue';
const _vm = new Vue();
//获取营销场景
export const sceneSettingList = (params) => requests(MARKET_PREFIX + 'scene-setting-list', params);
export const sceneSettingList = params => requests(MARKET_PREFIX + 'scene-setting-list', params);
//获取营销场景
export const getCardList = (params) => requests(PLUG_PREFIX + 'get-coupon-list', params);
export const getCardList = params => requests(PLUG_PREFIX + 'get-coupon-list', params);
//所有门店分组
export const storeGroupList = (params) => requests(GOODS_PREFIX + 'store-group-list', params);
export const storeGroupList = params => requests(GOODS_PREFIX + 'store-group-list', params);
//上传图片
export const uploadImgText = (params) => requests(PLUG_PREFIX + 'upload-img', params);
export const uploadImgText = params => requests(PLUG_PREFIX + 'upload-img', params);
import Vue from 'vue'
import axios from 'axios'
import config from '@/config'
import { log } from '@/utils'
import qs from 'qs'
import Router from 'vue-router'
/*eslint-disable*/
import Vue from 'vue';
import axios from 'axios';
import config from '@/config';
import { log } from '@/utils';
import qs from 'qs';
import Router from 'vue-router';
const router = new Router();
// 加载最小时间
const MINI_TIME = 300
const MINI_TIME = 300;
// 超时时间
let TIME_OUT_MAX = 20000
let TIME_OUT_MAX = 20000;
// 环境value
let _isDev = process.env.NODE_ENV === 'development'
let _isDev = process.env.NODE_ENV === 'development';
// 请求接口host
let _apiHost = config.api
let _apiHost = config.api;
// 请求组(判断当前请求数)
let _requests = []
let _requests = [];
//创建一个请求实例
const instance = axios.create({
baseURL: _apiHost,
timeout: TIME_OUT_MAX,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
})
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
});
/**
* 添加请求,显示loading
* @param {请求配置} config
*/
function pushRequest(config) {
log(`${config.url}--begin`)
_requests.push(config)
log(`${config.url}--begin`);
_requests.push(config);
}
/**
......@@ -38,12 +39,12 @@ function pushRequest(config) {
* @param {请求配置} config
*/
function popRequest(config) {
log(`${config.url}--end`)
log(`${config.url}--end`);
let _index = _requests.findIndex(r => {
return r === config
})
return r === config;
});
if (_index > -1) {
_requests.splice(_index, 1)
_requests.splice(_index, 1);
}
}
/**
......@@ -51,91 +52,86 @@ function popRequest(config) {
* @param {*} code
* @param {string} [message='请求错误']
*/
function handlerErr(code,message = '请求错误') {
function handlerErr(code, message = '请求错误') {
switch (code) {
case 404:
message = '404,错误请求'
router.push('/404')
break
message = '404,错误请求';
router.push('/404');
break;
case 401:
if (!_isDev) {
window.location.href = config.api+'/gic-web/#/'
window.location.href = config.api + '/gic-web/#/';
}
message = '登录失效'
break
message = '登录失效';
break;
case 403:
message = '禁止访问'
router.push('/403')
break
message = '禁止访问';
router.push('/403');
break;
case 408:
message = '请求超时'
break
message = '请求超时';
break;
case 500:
message = '服务器内部错误'
message = '服务器内部错误';
// router.push('/500')
break
break;
case 501:
message = '功能未实现'
break
message = '功能未实现';
break;
case 503:
message = '服务不可用'
break
message = '服务不可用';
break;
case 504:
message = '网关错误'
break
message = '网关错误';
break;
}
Vue.prototype.$tips({type:'warning',message:message})
Vue.prototype.$tips({ type: 'warning', message: message });
}
/**
* 请求地址,请求数据,是否静默,请求方法
*/
const requests = (url, data = {},contentTypeIsJSON = false, isSilence = false, method = 'POST') => {
let _opts = { method, url }
const _query = {}
let _timer = null
const requests = (url, data = {}, contentTypeIsJSON = false, isSilence = false, method = 'POST') => {
let _opts = { method, url };
const _query = {};
let _timer = null;
if (method.toLocaleUpperCase() === 'POST') {
if (contentTypeIsJSON) {
_opts.data = data;
_opts.headers = {'Content-Type': 'application/json'};
_opts.headers = { 'Content-Type': 'application/json' };
_opts.url += '?requestProject=marketing';
} else {
_opts.data = qs.stringify(Object.assign({requestProject:'gic-web'},data))
_opts.data = qs.stringify(Object.assign({ requestProject: 'integral-mall' }, data));
}
} else {
_opts.params = _query
_opts.params = _query;
}
return new Promise((resolve, reject) => {
let _random = { stamp: Date.now(), url: `${_apiHost + url}` }
let _random = { stamp: Date.now(), url: `${_apiHost + url}` };
if (!isSilence) {
_timer = setTimeout(() => {
pushRequest(_random)
}, MINI_TIME)
pushRequest(_random);
}, MINI_TIME);
}
instance(_opts)
.then(res => {
clearTimeout(_timer)
popRequest(_random)
clearTimeout(_timer);
popRequest(_random);
if (res.data.errorCode !== 0) {
reject(res);
handlerErr(res.data.errorCode,res.data.message);
handlerErr(res.data.errorCode, res.data.message);
} else {
resolve(res.data)
resolve(res.data);
}
})
.catch(res => {
clearTimeout(_timer)
popRequest(_random)
clearTimeout(_timer);
popRequest(_random);
if (res) {
handlerErr(res.response.status,'接口异常')
handlerErr(res.response.status, '接口异常');
}
reject(res)
})
})
}
export {
instance as axios,
requests
}
reject(res);
});
});
};
export { instance as axios, requests };
import { requests } from './index';
import config from '@/config';
const PREFIX = 'api-integral-mall/';
// 卡券列表
export const getCardList = (params) => requests(PREFIX + 'list-card', params);
export const getCardList = params => requests(PREFIX + 'list-card', params);
// 首页优惠券
export const getPageCardsList = (params) => requests(PREFIX + 'page-cards', params);
export const getPageCardsList = params => requests(PREFIX + 'page-cards', params);
//更新库存
export const updateStockService = (params) => requests(PREFIX + 'update-stock', params);
export const updateStockService = params => requests(PREFIX + 'update-stock', params);
//更新兑换所需积分
export const updateIntegralCostService = (params) => requests(PREFIX + 'update-integral-cost', params);
export const updateIntegralCostService = params => requests(PREFIX + 'update-integral-cost', params);
//更新兑换所需现金
export const updateCashCostService = (params) => requests(PREFIX + 'update-cash-cost', params);
export const updateCashCostService = params => requests(PREFIX + 'update-cash-cost', params);
//删除商品
export const deleteProService = (params) => requests(PREFIX + 'delete-pro', params);
export const deleteProService = params => requests(PREFIX + 'delete-pro', params);
//查看兑换记录
export const getPageExchangeLogsList = (params) => requests(PREFIX + 'page-exchange-logs', params);
export const getPageExchangeLogsList = params => requests(PREFIX + 'page-exchange-logs', params);
//查询单个商品
export const getIntegralMallProInfo = (params) => requests(PREFIX + 'get-integral-mall-pro', params);
export const getIntegralMallProInfo = params => requests(PREFIX + 'get-integral-mall-pro', params);
//基础数据-会员等级
export const getGradeList = (params) => requests(PREFIX + 'load-grade', params);
export const getGradeList = params => requests(PREFIX + 'load-grade', params);
//创建修改积分商品
export const createIntegralProService = (params) => requests(PREFIX + 'create-integral-pro', params, true);
export const createIntegralProService = params => requests(PREFIX + 'create-integral-pro', params, true);
// 首页礼品列表
export const getPageGiftList = (params) => requests(PREFIX + 'page-gift', params);
export const getPageGiftList = params => requests(PREFIX + 'page-gift', params);
// 基础数据-分类列表
export const getCategoryList = (params) => requests(PREFIX + 'load-category', params);
export const getCategoryList = params => requests(PREFIX + 'load-category', params);
// 导出优惠券兑换记录
export const exportExchangeListExcel = config.api + PREFIX + 'download-exchange-list-execl';
// 导出代发货商品
export const exportOnlineListExcel = config.api + PREFIX + 'download-integral-online-excel';
// 查看物流
export const getLogisticsInfo = (params) => requests(PREFIX + 'list-logistics-traces', params);
export const getLogisticsInfo = params => requests(PREFIX + 'list-logistics-traces', params);
// 基础数据-物流列表
export const getLogisticsList = (params) => requests(PREFIX + 'load-logisties', params);
export const getLogisticsList = params => requests(PREFIX + 'load-logisties', params);
// 订单发货,取消,修改物流
export const orderOptService = (params) => requests(PREFIX + 'order-opt', params);
export const orderOptService = params => requests(PREFIX + 'order-opt', params);
// 首页待发货
export const getPageUndeliverList = (params) => requests(PREFIX + 'page-undeliver', params);
export const getPageUndeliverList = params => requests(PREFIX + 'page-undeliver', params);
// 首页代发货数量
export const getNotSendCount = (params) => requests(PREFIX + 'get-not-send-count', params);
export const getNotSendCount = params => requests(PREFIX + 'get-not-send-count', params);
// 礼品设置热门商品
export const setHotStatusService = (params) => requests(PREFIX + 'update-hot-status', params);
export const setHotStatusService = params => requests(PREFIX + 'update-hot-status', params);
// 新建礼品分类
export const createCategoryService = (params) => requests(PREFIX + 'create-gift-category', params);
export const createCategoryService = params => requests(PREFIX + 'create-gift-category', params);
// 删除礼品分类
export const delCategoryService = (params) => requests(PREFIX + 'del-gift-category', params);
export const delCategoryService = params => requests(PREFIX + 'del-gift-category', params);
// 获取卡券成本
export const getCashCostService = (params) => requests(PREFIX + 'get-integral-mall-CashCost', params);
export const getCashCostService = params => requests(PREFIX + 'get-integral-mall-CashCost', params);
// 获取卡券成本
export const getMemberInfo = (params) => requests(PREFIX + 'get-member', params);
\ No newline at end of file
export const getMemberInfo = params => requests(PREFIX + 'get-member', params);
import Vue from 'vue'
import Vuex from 'vuex'
import Vue from 'vue';
import Vuex from 'vuex';
import marketing from './modules/marketing'
import marketing from './modules/marketing';
Vue.use(Vuex)
Vue.use(Vuex);
export default new Vuex.Store({
modules: {
marketing,
},
})
marketing
}
});
// initial state
const state = {
all: 0,
cartData: [],
total: 0,
leftMenu:[],
storeObj:{},
asideShow:false,
breadcrumb:[]
}
leftMenu: [],
storeObj: {},
asideShow: false,
breadcrumb: []
};
// getters
const getters = {
allProducts: (state, getters, rootState) => {
return state.all
return state.all;
},
allCartData: state => state.cartData,
total: state => {
state.total = 0;
for( let item of state.cartData ) {
state.total += item.price
for (let item of state.cartData) {
state.total += item.price;
}
return state.total
return state.total;
}
}
};
// actions
const actions = {
setAll({commit},data) {
commit('mutations_setAll',data);
setAll({ commit }, data) {
commit('mutations_setAll', data);
},
setCartData({commit},item) {
commit('mutations_CartData',item)
setCartData({ commit }, item) {
commit('mutations_CartData', item);
},
removecartData( {commit}, item ) {
commit( 'mutations_removeCartData',item )
removecartData({ commit }, item) {
commit('mutations_removeCartData', item);
}
}
};
// mutations
const mutations = {
mutations_setAll( state,num ) {
state.all = num
mutations_setAll(state, num) {
state.all = num;
},
mutations_CartData(state, item ) {
state.cartData.push( item )
mutations_CartData(state, item) {
state.cartData.push(item);
},
mutations_removeCartData( state,item ) {
for( let i in state.cartData ) {
if( state.cartData[i].id === item.id ) {
state.cartData.splice(i,1)
mutations_removeCartData(state, item) {
for (let i in state.cartData) {
if (state.cartData[i].id === item.id) {
state.cartData.splice(i, 1);
}
}
},
mutations_setStoreObj(state,val) {
state.storeObj = val
mutations_setStoreObj(state, val) {
state.storeObj = val;
},
aside_handler(state,val) {
state.asideShow = val
aside_handler(state, val) {
state.asideShow = val;
},
mutations_breadcrumb(state,val) {
state.breadcrumb = val
mutations_breadcrumb(state, val) {
state.breadcrumb = val;
}
}
};
export default {
state,
getters,
actions,
mutations
}
};
......@@ -5,98 +5,89 @@
export default {
/*
* 一个汉字算两个字符,一个英文字母或数字算一个字符
*/
getByteLen: function(val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/ig) != null) {
len += 2;
}
else {
len += 1;
}
* 一个汉字算两个字符,一个英文字母或数字算一个字符
*/
getByteLen: function(val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/gi) != null) {
len += 2;
} else {
len += 1;
}
return len;
}
return len;
},
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function (val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/ig) != null) {
len += 1;
}
else {
len += 0.5;
}
/*
* 一个汉字算一个字,一个英文字母或数字算半个字
*/
getZhLen: function(val) {
var len = 0;
for (var i = 0; i < val.length; i++) {
var a = val.charAt(i);
if (a.match(/[^\x00-\xff]/gi) != null) {
len += 1;
} else {
len += 0.5;
}
return Math.ceil(len);
}
return Math.ceil(len);
},
/*暂无用*/
cutStr: function(str, len,type){
cutStr: function(str, len, type) {
var char_length = 0;
for (var i = 0; i < str.length; i++){
var son_str = str.charAt(i);
if(type==1) {
encodeURI(son_str).length > 2 ? char_length += 1 : char_length += 0.5;
}
if(type==2) {
char_length += 1 ;
}
if (char_length >= len){
var sub_len = char_length == len ? i+1 : i;
return str.substr(0, sub_len);
}
for (var i = 0; i < str.length; i++) {
var son_str = str.charAt(i);
if (type == 1) {
encodeURI(son_str).length > 2 ? (char_length += 1) : (char_length += 0.5);
}
if (type == 2) {
char_length += 1;
}
if (char_length >= len) {
var sub_len = char_length == len ? i + 1 : i;
return str.substr(0, sub_len);
}
}
},
/*
* 限制字数用, 一个汉字算一个字,两个英文/字母算一个字
*/
* 限制字数用, 一个汉字算一个字,两个英文/字母算一个字
*/
getByteVal: function(val, max) {
var returnValue = '';
var byteValLen = 0;
for (var i = 0; i < val.length; i++) {
if (val[i].match(/[^\x00-\xff]/ig) != null)
byteValLen += 1;
else
byteValLen += 0.5;
if (byteValLen > max)
break;
returnValue += val[i];
if (val[i].match(/[^\x00-\xff]/gi) != null) byteValLen += 1;
else byteValLen += 0.5;
if (byteValLen > max) break;
returnValue += val[i];
}
return returnValue;
},
/*
* 限制字符数用, 一个汉字算两个字符,一个英文/字母算一个字符
*/
getCharVal: function (val, max) {
* 限制字符数用, 一个汉字算两个字符,一个英文/字母算一个字符
*/
getCharVal: function(val, max) {
var returnValue = '';
var byteValLen = 0;
for (var i = 0; i < val.length; i++) {
if (val[i].match(/[^\x00-\xff]/ig) != null)
byteValLen += 2;
else
byteValLen += 1;
if (byteValLen > max)
break;
returnValue += val[i];
if (val[i].match(/[^\x00-\xff]/gi) != null) byteValLen += 2;
else byteValLen += 1;
if (byteValLen > max) break;
returnValue += val[i];
}
return returnValue;
},
/*
* 正则校验,校验非负数字
*/
* 正则校验,校验非负数字
*/
regPos: function(v) {
var regTest = /^\d+(\.\d+)?$/;
return regTest.test(v);
}
}
};
/*策略规则*/
const strategies = {
isNonEmpty(value, errorMsg) {
return value === '' ?
errorMsg : void 0
return value === '' ? errorMsg : void 0;
},
minLength(value, length, errorMsg) {
return value.length < length ?
errorMsg : void 0
return value.length < length ? errorMsg : void 0;
},
isMoblie(value, errorMsg) {
return !/^1(3|5|7|8|9)[0-9]{9}$/.test(value) ?
errorMsg : void 0
return !/^1(3|5|7|8|9)[0-9]{9}$/.test(value) ? errorMsg : void 0;
},
isEmail(value, errorMsg) {
return !/^\w+([+-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(value) ?
errorMsg : void 0
return !/^\w+([+-.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(value) ? errorMsg : void 0;
}
}
};
/*Validator类*/
export default class Validator {
constructor() {
this.cache = [] //保存校验规则
this.cache = []; //保存校验规则
}
add(dom, rules) {
for (let rule of rules) {
let strategyAry = rule.strategy.split(':') //例如['minLength',6]
let errorMsg = rule.errorMsg //'用户名不能为空'
this.cache.push(() => {
let strategy = strategyAry.shift() //用户挑选的strategy
strategyAry.unshift(dom.value) //把input的value添加进参数列表
strategyAry.push(errorMsg) //把errorMsg添加进参数列表,[dom.value,6,errorMsg]
return strategies[strategy].apply(dom, strategyAry)
})
}
for (let rule of rules) {
let strategyAry = rule.strategy.split(':'); //例如['minLength',6]
let errorMsg = rule.errorMsg; //'用户名不能为空'
this.cache.push(() => {
let strategy = strategyAry.shift(); //用户挑选的strategy
strategyAry.unshift(dom.value); //把input的value添加进参数列表
strategyAry.push(errorMsg); //把errorMsg添加进参数列表,[dom.value,6,errorMsg]
return strategies[strategy].apply(dom, strategyAry);
});
}
}
start() {
for (let validatorFunc of this.cache) {
let errorMsg = validatorFunc()//开始校验,并取得校验后的返回信息
if (errorMsg) {//r如果有确切返回值,说明校验没有通过
return errorMsg
}
for (let validatorFunc of this.cache) {
let errorMsg = validatorFunc(); //开始校验,并取得校验后的返回信息
if (errorMsg) {
//r如果有确切返回值,说明校验没有通过
return errorMsg;
}
}
}
}
<template>
<div class="errPage-container">
<el-button @click="back" icon='arrow-left' class="pan-back-btn">返回</el-button>
<el-button @click="back" icon="arrow-left" class="pan-back-btn">返回</el-button>
<el-row>
<el-col :span="12">
<h1 class="text-jumbo text-ginormous">Oops!</h1>
页面
页面
<h2>你没有权限去该页面</h2>
<h6>如有不满请联系你领导</h6>
<ul class="list-unstyled">
......@@ -13,21 +13,21 @@
<router-link to="/report/#/memberSummary">回首页</router-link>
</li>
<li class="link-type"><router-link to="/report/#/memberSummary">回首页</router-link></li>
<li><a @click.prevent="dialogVisible=true" href="#">点我看图</a></li>
<li><a @click.prevent="dialogVisible = true" href="#">点我看图</a></li>
</ul>
</el-col>
<el-col :span="12">
<img :src="errGif" width="313" height="428" alt="Girl has dropped her ice cream.">
<img :src="errGif" width="313" height="428" alt="Girl has dropped her ice cream." />
</el-col>
</el-row>
<el-dialog title="随便看" :visible.sync="dialogVisible">
<img class="pan-img" :src="ewizardClap">
<img class="pan-img" :src="ewizardClap" />
</el-dialog>
</div>
</template>
<script>
import errGif from '@/assets/img/401.gif'
import errGif from '@/assets/img/401.gif';
export default {
name: 'page401',
......@@ -36,54 +36,54 @@ export default {
errGif: errGif + '?' + +new Date(),
ewizardClap: 'https://wpimg.wallstcn.com/007ef517-bafd-4066-aae4-6883632d9646',
dialogVisible: false
}
};
},
methods: {
back() {
if (this.$route.query.noGoBack) {
this.$router.push({ path: '/' })
this.$router.push({ path: '/' });
} else {
this.$router.go(-1)
this.$router.go(-1);
}
}
}
}
};
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
.errPage-container {
width: 800px;
margin: 100px auto;
.pan-back-btn {
background: #008489;
color: #fff;
}
.pan-gif {
margin: 0 auto;
display: block;
}
.pan-img {
display: block;
margin: 0 auto;
width: 100%;
}
.text-jumbo {
font-size: 60px;
font-weight: 700;
color: #484848;
.errPage-container {
width: 800px;
margin: 100px auto;
.pan-back-btn {
background: #008489;
color: #fff;
}
.pan-gif {
margin: 0 auto;
display: block;
}
.pan-img {
display: block;
margin: 0 auto;
width: 100%;
}
.text-jumbo {
font-size: 60px;
font-weight: 700;
color: #484848;
}
.list-unstyled {
font-size: 14px;
li {
padding-bottom: 5px;
}
.list-unstyled {
font-size: 14px;
li {
padding-bottom: 5px;
}
a {
color: #008489;
text-decoration: none;
&:hover {
text-decoration: underline;
}
a {
color: #008489;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
}
</style>
......@@ -2,7 +2,7 @@
<div style="background:#f0f2f5;margin-top: -20px;height:100%;">
<div class="wscn-http404">
<div class="pic-404">
<img class="pic-404__parent" :src="img_403" alt="403">
<img class="pic-404__parent" :src="img_403" alt="403" />
</div>
<div class="bullshit">
<!-- <div class="bullshit__oops">403</div> -->
......@@ -14,21 +14,21 @@
</template>
<script>
import img_403 from '@/assets/img/error_403.svg'
import img_403 from '@/assets/img/error_403.svg';
export default {
name: 'page403',
data() {
return {
img_403
}
};
},
computed: {
message() {
return '抱歉,你无权访问该页面'
return '抱歉,你无权访问该页面';
}
}
}
};
</script>
<style lang="scss" scoped>
......@@ -174,7 +174,7 @@ export default {
animation-fill-mode: forwards;*/
}
&__headline {
color: rgba(0,0,0,.45);
color: rgba(0, 0, 0, 0.45);
font-size: 20px;
line-height: 28px;
margin-bottom: 16px;
......@@ -200,9 +200,9 @@ export default {
border: 1px solid #1890ff;
color: #fff;
background-color: #1890ff;
text-shadow: 0 -1px 0 rgba(0,0,0,.12);
-webkit-box-shadow: 0 2px 0 rgba(0,0,0,.035);
box-shadow: 0 2px 0 rgba(0,0,0,.035);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
cursor: pointer;
/*animation-name: slideUp;
animation-duration: 0.5s;
......
......@@ -2,7 +2,7 @@
<div style="background:#f0f2f5;margin-top: -20px;height:100%;">
<div class="wscn-http404">
<div class="pic-404">
<img class="pic-404__parent" :src="img_404" alt="404">
<img class="pic-404__parent" :src="img_404" alt="404" />
</div>
<div class="bullshit">
<!-- <div class="bullshit__oops">404</div> -->
......@@ -14,24 +14,21 @@
</template>
<script>
import img_404 from '@/assets/img/error_404.svg'
import img_404 from '@/assets/img/error_404.svg';
export default {
name: 'page404',
data() {
return {
img_404
}
};
},
computed: {
message() {
return '抱歉,你访问的页面不存在'
return '抱歉,你访问的页面不存在';
}
},
mounted(){
console.log(this.$route.path)
}
}
};
</script>
<style lang="scss" scoped>
......@@ -177,7 +174,7 @@ export default {
animation-fill-mode: forwards;*/
}
&__headline {
color: rgba(0,0,0,.45);
color: rgba(0, 0, 0, 0.45);
font-size: 20px;
line-height: 28px;
margin-bottom: 16px;
......@@ -203,9 +200,9 @@ export default {
border: 1px solid #1890ff;
color: #fff;
background-color: #1890ff;
text-shadow: 0 -1px 0 rgba(0,0,0,.12);
-webkit-box-shadow: 0 2px 0 rgba(0,0,0,.035);
box-shadow: 0 2px 0 rgba(0,0,0,.035);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
cursor: pointer;
/*animation-name: slideUp;
animation-duration: 0.5s;
......
......@@ -2,7 +2,7 @@
<div style="background:#f0f2f5;margin-top: -20px;height:100%;">
<div class="wscn-http404">
<div class="pic-404">
<img class="pic-404__parent" :src="img_500" alt="500">
<img class="pic-404__parent" :src="img_500" alt="500" />
</div>
<div class="bullshit">
<!-- <div class="bullshit__oops">500</div> -->
......@@ -14,21 +14,21 @@
</template>
<script>
import img_500 from '@/assets/img/error_500.svg'
import img_500 from '@/assets/img/error_500.svg';
export default {
name: 'page500',
data() {
return {
img_500
}
};
},
computed: {
message() {
return '抱歉,服务器出错了'
return '抱歉,服务器出错了';
}
}
}
};
</script>
<style lang="scss" scoped>
......@@ -174,7 +174,7 @@ export default {
animation-fill-mode: forwards;*/
}
&__headline {
color: rgba(0,0,0,.45);
color: rgba(0, 0, 0, 0.45);
font-size: 20px;
line-height: 28px;
margin-bottom: 16px;
......@@ -200,9 +200,9 @@ export default {
border: 1px solid #1890ff;
color: #fff;
background-color: #1890ff;
text-shadow: 0 -1px 0 rgba(0,0,0,.12);
-webkit-box-shadow: 0 2px 0 rgba(0,0,0,.035);
box-shadow: 0 2px 0 rgba(0,0,0,.035);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
cursor: pointer;
/*animation-name: slideUp;
animation-duration: 0.5s;
......
......@@ -2,7 +2,7 @@
<div style="background:#f0f2f5;margin-top: -20px;height:100%;">
<div class="wscn-http404">
<div class="pic-404">
<img class="pic-404__parent" :src="imgSrc" alt="404">
<img class="pic-404__parent" :src="imgSrc" alt="404" />
</div>
<div class="bullshit">
<!-- <div class="bullshit__oops">404</div> -->
......@@ -16,7 +16,7 @@
<script>
import img_403 from '@/assets/403_images/error_403.svg';
import img_404 from '@/assets/404_images/error_404.svg';
import img_500 from '@/assets/500_images/error_500.svg'
import img_500 from '@/assets/500_images/error_500.svg';
export default {
name: 'errpage',
......@@ -34,15 +34,15 @@ export default {
404: '抱歉,你访问的页面不存在',
500: '抱歉,服务器出错了'
}
}
};
},
mounted(){
mounted() {
var that = this;
var path = that.$route.path.split('/')[1];
that.imgSrc = that.srcList[path];
that.message = that.msgList[path];
}
}
};
</script>
<style lang="scss" scoped>
......@@ -188,7 +188,7 @@ export default {
animation-fill-mode: forwards;*/
}
&__headline {
color: rgba(0,0,0,.45);
color: rgba(0, 0, 0, 0.45);
font-size: 20px;
line-height: 28px;
margin-bottom: 16px;
......@@ -214,9 +214,9 @@ export default {
border: 1px solid #1890ff;
color: #fff;
background-color: #1890ff;
text-shadow: 0 -1px 0 rgba(0,0,0,.12);
-webkit-box-shadow: 0 2px 0 rgba(0,0,0,.035);
box-shadow: 0 2px 0 rgba(0,0,0,.035);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
-webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035);
cursor: pointer;
/*animation-name: slideUp;
animation-duration: 0.5s;
......
<template>
<section class="sms-lib curson-pointer">
<div class="pb22">
<span class="pr10">{{total}}</span>
<el-input :disabled="disabled" v-model="listParams.searchParam" class="w200" clearable placeholder="请输入卡券名称" @change="getCardList"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<span class="fz12 gray pl20">领取限制 < 100的卡券不支持选择,系统已自动过滤</span>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width: 100%" v-loading="loading" @row-click="chooseCard">
<el-table-column :show-overflow-tooltip="false" width="60" align="center" prop="coupCardId">
<section class="sms-lib curson-pointer">
<div class="pb22">
<span class="pr10">{{ total }}</span>
<el-input :disabled="disabled" v-model="listParams.searchParam" class="w200" clearable placeholder="请输入卡券名称" @change="getCardList"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input>
<span class="fz12 gray pl20">领取限制 &lt;100的卡券不支持选择,系统已自动过滤</span>
</div>
<el-table tooltipEffect="light" :data="tableList" style="width: 100%" v-loading="loading" @row-click="chooseCard">
<el-table-column :show-overflow-tooltip="false" width="60" align="center" prop="coupCardId">
<template slot-scope="scope">
<div class="sms-record_left label-hidden">
<el-radio :disabled="disabled" v-if="cardIdName === 'wechatCardId'" v-model="selectedId" :label="scope.row.wechatCardId" class="pr10"></el-radio>
<el-radio :disabled="disabled" v-else v-model="selectedId" :label="scope.row.coupCardId" class="pr10"></el-radio>
<el-radio :disabled="disabled" v-if="cardIdName === 'wechatCardId'" v-model="selectedId" :label="scope.row.wechatCardId" class="pr10"></el-radio>
<el-radio :disabled="disabled" v-else v-model="selectedId" :label="scope.row.coupCardId" class="pr10"></el-radio>
</div>
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="cardName" label="卡券名称"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="left" prop="subName" label="备注名"></el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="cardLimit" label="兑换限制"></el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="couponStock" label="库存"></el-table-column>
</el-table>
<el-pagination v-show='tableList.length>0' background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, prev, pager, next" :total="total"></el-pagination>
</section>
</el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="cardName" label="卡券名称"></el-table-column>
<el-table-column :show-overflow-tooltip="true" align="left" prop="subName" label="备注名"></el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="cardLimit" label="兑换限制"></el-table-column>
<el-table-column :show-overflow-tooltip="false" align="left" prop="couponStock" label="库存"></el-table-column>
</el-table>
<el-pagination v-show="tableList.length > 0" background class="dm-pagination" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listParams.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="listParams.pageSize" layout="total, prev, pager, next" :total="total"></el-pagination>
</section>
</template>
<script>
import {getCardList} from '@/service/api/mallApi.js';
import { getCardList } from '@/service/api/mallApi.js';
export default {
props:{
activeId:{
type:String,
default:''
props: {
activeId: {
type: String,
default: ''
},
cardIdName:{
type:String,
default:'coupCardId'
cardIdName: {
type: String,
default: 'coupCardId'
},
tableHeight:{
type:String,
default:'auto'
tableHeight: {
type: String,
default: 'auto'
},
showPagination:{
type:Boolean,
default:true
showPagination: {
type: Boolean,
default: true
},
disabled:{
type:Boolean,
default:false
disabled: {
type: Boolean,
default: false
},
cardType:{
type:String,
default:'2'
cardType: {
type: String,
default: '2'
}
},
data(){
return{
listParams:{
searchParam:'',
currentPage:1,
pageSize:10,
requestProject:'gic-web',
coupCardId:'',
cardType:this.cardType
data() {
return {
listParams: {
searchParam: '',
currentPage: 1,
pageSize: 10,
requestProject: 'gic-web',
coupCardId: '',
cardType: this.cardType
},
total:0,
tableList:[],
selectedId:this.activeId
}
total: 0,
tableList: [],
selectedId: this.activeId
};
},
watch: {
selectedId(val) {
......@@ -73,57 +73,57 @@ export default {
if (this.cardIdName === 'wechatCardId') {
this.tableList.map(v => {
if (v.coupCardId === val) {
val = v.wechatCardId
val = v.wechatCardId;
obj = v;
}
})
});
} else {
this.tableList.map(v => {
if (v.coupCardId === val) {
obj = v;
}
})
});
}
this.$emit('update:activeId',val);
this.$emit('emitActiveObj',obj);
this.$emit('update:activeId', val);
this.$emit('emitActiveObj', obj);
},
activeId(val) {
this.selectedId = val;
}
},
created(){
created() {
this.selectedId = this.activeId;
this.getCardList();
},
methods:{
handleSizeChange(val) {
this.listParams.pageSize = val;
this.getCardList();
},
handleCurrentChange(val) {
this.listParams.currentPage = val;
this.getCardList();
},
async getCardList() {
this.loading = true;
if (this.$route.meta.type === 'edit' || this.$route.meta.type === 'info') {
this.listParams.coupCardId = this.activeId;
}
let res = await getCardList(this.listParams);
this.tableList = res.result.rows || [];
this.total = res.result.total;
this.loading = false;
},
reset() {
this.listParams.searchParams = '';
this.getCardList();
},
chooseCard(row) {
this.selectedId = row.coupCardId;
$bus.$emit('card-temp-choose',row);
methods: {
handleSizeChange(val) {
this.listParams.pageSize = val;
this.getCardList();
},
handleCurrentChange(val) {
this.listParams.currentPage = val;
this.getCardList();
},
async getCardList() {
this.loading = true;
if (this.$route.meta.type === 'edit' || this.$route.meta.type === 'info') {
this.listParams.coupCardId = this.activeId;
}
let res = await getCardList(this.listParams);
this.tableList = res.result.rows || [];
this.total = res.result.total;
this.loading = false;
},
reset() {
this.listParams.searchParams = '';
this.getCardList();
},
/* eslint-disable */
chooseCard(row) {
this.selectedId = row.coupCardId;
$bus.$emit('card-temp-choose', row);
}
}
}
};
</script>
......@@ -4,73 +4,49 @@
<div class="wechat-url" style="margin-bottom:30px;">
<p style="font-weight: 600;margin-bottom:15px">页面链接</p>
<div style="display:flex;align-items: center">
<el-input
type="textarea"
:rows="2"
v-model="modalData.pageUrl"
disabled>
</el-input>
<a
href="javaScript:void(0)"
style="width:40px;margin-left:20px"
v-clipboard:copy="modalData.pageUrl"
v-clipboard:success="onCopy"
v-clipboard:error="onError"
>
<el-input type="textarea" :rows="2" v-model="modalData.pageUrl" disabled> </el-input>
<a href="javaScript:void(0)" style="width:40px;margin-left:20px" v-clipboard:copy="modalData.pageUrl" v-clipboard:success="onCopy" v-clipboard:error="onError">
复制
</a>
</div>
</div>
<div class="wechat-img-box" v-loading="modalData.loading">
<p style="font-weight: 600;margin-bottom:15px">小程序二维码</p>
<img
:src="modalData.imgUrl"
class="wechat-img"
style="width:140px;height:140px;margin-left:130px">
</div>
<img :src="modalData.imgUrl" class="wechat-img" style="width:140px;height:140px;margin-left:130px" />
</div>
</div>
</el-dialog>
</template>
<script>
import request from '../../../api/request.js'
import common from '../../../../static/js/common.js';
export default {
props:{
modalData:{
type:Object,
}
},
data() {
return {
// loading:true,
}
},
mounted(){
export default {
props: {
modalData: {
type: Object
}
},
data() {
return {
// loading:true,
};
},
methods: {
onCopy(e) {
this.$message.success('复制成功');
},
methods: {
onCopy(e){
this.$message.success("复制成功")
},
onError(e){
this.$message.error("复制失败")
}
onError(e) {
this.$message.error('复制失败');
}
}
};
</script>
<style scoped>
.wechat-img-box{
margin:0 auto;
.wechat-img-box {
margin: 0 auto;
text-align: center;
}
.wechat-img{
width:200px;
height:200px;
.wechat-img {
width: 200px;
height: 200px;
}
<style>
\ No newline at end of file
</style>
......@@ -47,31 +47,30 @@ export const postForm = (url, params) => {
-->
<template>
<div class="tinymce-contain">
<editor id='tinymce' v-model='tinymceHtml' :init='init'></editor>
<editor id="tinymce" v-model="tinymceHtml" :init="init"></editor>
</div>
</template>
<script>
// import request from '../../api/request.js'
import request from '../../../api/request.js'
import tinymce from 'tinymce/tinymce'
import 'tinymce/themes/modern/theme'
import Editor from '@tinymce/tinymce-vue'
import 'tinymce/plugins/image'
import 'tinymce/plugins/link'
import 'tinymce/plugins/code'
import 'tinymce/plugins/table'
import 'tinymce/plugins/lists'
import 'tinymce/plugins/contextmenu'
import 'tinymce/plugins/wordcount'
import 'tinymce/plugins/colorpicker'
import 'tinymce/plugins/textcolor'
import request from '../../../api/request.js';
import tinymce from 'tinymce/tinymce';
import 'tinymce/themes/modern/theme';
import Editor from '@tinymce/tinymce-vue';
import 'tinymce/plugins/image';
import 'tinymce/plugins/link';
import 'tinymce/plugins/code';
import 'tinymce/plugins/table';
import 'tinymce/plugins/lists';
import 'tinymce/plugins/contextmenu';
import 'tinymce/plugins/wordcount';
import 'tinymce/plugins/colorpicker';
import 'tinymce/plugins/textcolor';
export default {
name: "tinymce-edit",
props: ["bodyHtml",'projectName'],
name: 'tinymce-edit',
props: ['bodyHtml', 'projectName'],
data() {
return {
tinymceHtml: '请输入内容',
init: {
language_url: 'static/tinymce/zh_CN.js',
......@@ -84,74 +83,67 @@ export default {
// images_upload_base_path: '/some/basepath',
images_upload_credentials: true, //是否应传递cookie等跨域的凭据
// images_upload_handler提供三个参数:blobInfo, success, failure
images_upload_handler: (blobInfo, success, failure)=>{
console.log(blobInfo)
this.handleImgUpload(blobInfo, success, failure)
images_upload_handler: (blobInfo, success, failure) => {
this.handleImgUpload(blobInfo, success, failure);
},
// 添加插件
// plugins: 'link lists image code table colorpicker textcolor wordcount contextmenu',
// toolbar:
// 'bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image code | removeformat',
plugins: 'image textcolor',
toolbar:
'fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | link unlink image code',
fontsize_formats: "8px 10px 12px 14px 18px 24px 36px",
toolbar: 'fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | link unlink image code',
fontsize_formats: '8px 10px 12px 14px 18px 24px 36px',
branding: false,
menubar: false,
setup: function(editor) {
// 点击编辑框回调
editor.on('click', function(e) {
console.log('Editor was clicked');
});
// 点击编辑框回调
editor.on('click', function(e) {});
}
}
}
};
},
methods: {
// 上传图片
handleImgUpload (blobInfo, success, failure) {
var that = this
let formdata = new FormData()
formdata.set('upload_file', blobInfo.blob())
formdata.set("requestProject",that.repProjectName);
console.log(formdata)
request.post('/api-plug/upload-img', formdata).then(res => {
success(res.data.result[0].qcloudImageUrl)
}).catch(res => {
console.log(res)
failure('error')
})
},
handleImgUpload(blobInfo, success, failure) {
var that = this;
let formdata = new FormData();
formdata.set('upload_file', blobInfo.blob());
formdata.set('requestProject', that.repProjectName);
request
.post('/api-plug/upload-img', formdata)
.then(res => {
success(res.data.result[0].qcloudImageUrl);
})
.catch(res => {
failure('error');
});
}
},
watch: {
projectName: function(newData,oldData){
projectName: function(newData, oldData) {
var that = this;
// console.log("新数据:",newData,oldData)
that.repProjectName = newData || 'gic-web';
},
bodyHtml: function(newData,oldData){
bodyHtml: function(newData, oldData) {
var that = this;
// console.log("新数据:",newData,oldData)
that.tinymceHtml = newData;
},
}
},
components: {
Editor
Editor
},
mounted() {
var that = this
var that = this;
tinymce.init({
fontsize_formats: "8px 10px 12px 14px 18px 24px 36px",
fontsize_formats: '8px 10px 12px 14px 18px 24px 36px'
});
that.tinymceHtml = that.bodyHtml;
}
}
};
</script>
<style scoped>
.tinymce-contain {
width: 900px
}
.tinymce-contain {
width: 900px;
}
</style>
<template slot-scope="scope">
<el-popover placement="top" width="160" v-model="model[theType+'Flag']">
<el-input-number v-if="model[theType+'Flag']" class="w150" size="small" controls-position="right" :precision="precision" v-model="model.inputValue" :min="0" ></el-input-number>
<el-popover placement="top" width="160" v-model="model[theType + 'Flag']">
<el-input-number v-if="model[theType + 'Flag']" class="w150" size="small" controls-position="right" :precision="precision" v-model="model.inputValue" :min="0"></el-input-number>
<div style="text-align: right; margin:10px 0 0 0;">
<el-button size="mini" type="text" @click="model[theType+'Flag'] = false">取消</el-button>
<el-button size="mini" type="text" @click="model[theType + 'Flag'] = false">取消</el-button>
<el-button type="primary" size="mini" @click="submit">确定</el-button>
</div>
<div slot="reference" @click="edit">
<span>{{model[theType]}}{{typeName}}</span> <i class="el-icon-edit cursor-hover"></i>
<div slot="reference" @click="edit">
<span>{{ model[theType] }}{{ typeName }}</span> <i class="el-icon-edit cursor-hover"></i>
</div>
</el-popover>
</template>
......@@ -16,58 +16,60 @@ import { updateStockService, updateIntegralCostService, updateCashCostService }
export default {
props: {
model: {
type: Object,
default() {
return {}
}
},
theType: String,
typeName: String,
precision:{
type:Number,
default:0
model: {
type: Object,
default() {
return {};
}
},
theType: String,
typeName: String,
precision: {
type: Number,
default: 0
}
},
methods:{
methods: {
// 提交更新并刷新列表
async submit() {
// try {
console.log(this.value,this.theType,this.model.inputValue,this.precision)
if (this.theType === 'cashCost' && this.model.inputValue > this.model.costValue) {
this.$tips({type:'warning',message:'现金费用不能大于礼品成本'});
return;
}
let res = null;
if (this.theType === 'virtualStock') { // 库存
res = await updateStockService({proId:this.model.integralMallProId,stock:this.model.inputValue});
} else if (this.theType === 'cashCost') { // 现金费用
res = await updateCashCostService({proId:this.model.integralMallProId,cost:this.model.inputValue});
} else if (this.theType === 'integralCost') { // 积分费用
res = await updateIntegralCostService({proId:this.model.integralMallProId,cost:this.model.inputValue});
}
if (res.errorCode === 0) {
if (this.theType === 'virtualStock') {
this.$tips({type:'success',message: '积分商城修改库存时,请同步修改对应卡券的库存'});
} else {
this.$tips({type:'success',message: '更新成功'});
}
this.$emit('refresh');
if (this.theType === 'cashCost' && this.model.inputValue > this.model.costValue) {
this.$tips({ type: 'warning', message: '现金费用不能大于礼品成本' });
return;
}
let res = null;
if (this.theType === 'virtualStock') {
// 库存
res = await updateStockService({ proId: this.model.integralMallProId, stock: this.model.inputValue });
} else if (this.theType === 'cashCost') {
// 现金费用
res = await updateCashCostService({ proId: this.model.integralMallProId, cost: this.model.inputValue });
} else if (this.theType === 'integralCost') {
// 积分费用
res = await updateIntegralCostService({ proId: this.model.integralMallProId, cost: this.model.inputValue });
}
if (res.errorCode === 0) {
if (this.theType === 'virtualStock') {
this.$tips({ type: 'success', message: '积分商城修改库存时,请同步修改对应卡券的库存' });
} else {
this.$tips({type:'error',message: '更新失败'});
this.$tips({ type: 'success', message: '更新成功' });
}
this.$emit('refresh');
} else {
this.$tips({ type: 'error', message: '更新失败' });
}
// } catch (err) {
// this.$tips({type:'error',message: '更新失败'});
// }
},
// 编辑操作
// 编辑操作
edit() {
// 这里precision不能更新 所以加上nextTick
this.$nextTick(_ => {
this.model[this.theType + 'Flag'] = true;
this.$set(this.model,'inputValue',this.model[this.theType]);
})
this.$set(this.model, 'inputValue', this.model[this.theType]);
});
}
}
}
};
</script>
<template>
<el-form :model="form" ref="form" :rules="rules" label-width="120px">
<el-form :model="form" ref="form" :rules="rules" label-width="120px">
<div class="dm-form__wrap">
<h3 class="dm-title__label">选择卡券</h3>
<div style="margin-bottom:20px;">
<card-temp ref="cardTemp" cardType="0,1" :disabled="isEdit || isInfo" pbSize="pb15" :activeId.sync="form.proReferId" @emitActiveObj="getCardActiveObjFun" :showPagination="false" :cardLimitType="3"></card-temp>
<card-temp ref="cardTemp" cardType="0,1" :disabled="isEdit || isInfo" pbSize="pb15" :activeId.sync="form.proReferId" @emitActiveObj="getCardActiveObjFun" :showPagination="false" :cardLimitType="3"></card-temp>
</div>
</div>
<div class="dm-form__wrap">
<h3 class="dm-title__label">优惠券信息</h3>
<el-form-item prop="integralCost" label="积分费用">
<el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.integralCost" class="w300" :precision="0" :min="0"></el-input-number>
<el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.integralCost" class="w300" :precision="0" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="cashCost" label="现金费用">
<el-input-number controls-position="right" :disabled="isEdit || isInfo" v-model="form.cashCost" class="w300" :precision="2" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="limitTimes" label="次数限制">
<el-checkbox :disabled="isInfo" v-model="isLimitTimes"> 每个会员限制兑换
</el-checkbox>
<el-checkbox :disabled="isInfo" v-model="isLimitTimes"> 每个会员限制兑换 </el-checkbox>
<el-input-number controls-position="right" :disabled="isInfo" v-model="form.limitTimes" class="w100" :precision="0" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="memberGradeArr" label="适用会员">
......@@ -34,12 +33,12 @@
<el-radio-group v-model="form.exchangeDateType" style="line-height:inherit;">
<el-radio :label="1">全部日期</el-radio>
<el-radio :label="2">固定日期</el-radio>
<el-radio :label="3">每月</el-radio>
<el-radio :label="4">每周</el-radio>
<el-radio :label="3">每月</el-radio>
<el-radio :label="4">每周</el-radio>
</el-radio-group>
<div class="">
<el-date-picker class="w300" v-model="form.exchangeFixDate" v-if="form.exchangeDateType === 2" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-select class="w300" size="small" v-model="form.exchangeDateDayArr" v-if="form.exchangeDateType === 3" multiple placeholder="请选择">
<el-date-picker class="w300" v-model="form.exchangeFixDate" v-if="form.exchangeDateType === 2" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-select class="w300" size="small" v-model="form.exchangeDateDayArr" v-if="form.exchangeDateType === 3" multiple placeholder="请选择">
<el-option v-for="item in monthOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
<el-select class="w300" size="small" v-model="form.exchangeDateWeekArr" v-if="form.exchangeDateType === 4" multiple placeholder="请选择">
......@@ -54,14 +53,13 @@
<el-radio :label="2" class="vertical-middle">部分时段</el-radio>
</el-radio-group>
<div v-show="form.exchangeTimeType === 2" class="">
<p v-for="(v,i) in timeRangeList" :key="i" class="pt8">
<p v-for="(v, i) in timeRangeList" :key="i" class="pt8">
<el-time-picker :disabled="form.exchangeTimeType === 1" class="vertical-middle w300" is-range v-model="v.timeRange" value-format="HH:mm" format="HH:mm" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" placeholder="选择时间范围"></el-time-picker>
<el-button v-if="i" class="vertical-middle" type="text" @click="delTimeRange(i)">删除</el-button>
</p>
<span class="gray fz12 vertical-top">请使用24小时制输入时间,格式如11:00至14:30</span>
<span class="gray fz12 vertical-top">请使用24小时制输入时间,格式如11:00至14:30</span>
<p><el-button type="text" @click="addTimeRange">添加时间段</el-button></p>
</div>
</el-form-item>
<el-form-item prop="proShowStatus" label="显示状态">
<el-radio-group v-model="form.proShowStatus">
......@@ -74,13 +72,13 @@
<el-radio :label="1">立即发布</el-radio>
<el-radio :label="2">定时发布</el-radio>
</el-radio-group>
<div class="pt8" v-if="form.releaseType ===2">
<div class="pt8" v-if="form.releaseType === 2">
<el-date-picker v-model="form.limitTimeBegin" type="datetime" placeholder="选择日期时间"></el-date-picker>
</div>
</el-form-item>
</div>
<div class="btn-wrap_fixed" :class="{'on':asideShow}">
<el-button type="primary" @click="submit('form')" v-if="!isInfo">{{isAdd?'确认新增':'确认编辑'}}</el-button>
<div class="btn-wrap_fixed" :class="{ on: asideShow }">
<el-button type="primary" @click="submit('form')" v-if="!isInfo">{{ isAdd ? '确认新增' : '确认编辑' }}</el-button>
<el-button @click="$router.go(-1)">返 回</el-button>
</div>
</el-form>
......
<template>
<el-form :model="form" ref="form" :rules="rules" label-width="120px">
<el-form :model="form" ref="form" :rules="rules" label-width="120px">
<div class="dm-form__wrap">
<h3 class="dm-title__label">礼品信息</h3>
<el-form-item prop="proName" label="礼品标题">
......@@ -8,33 +8,20 @@
<el-form-item label="礼品主图" class="is-required">
<div class="member-upload-image">
<p class="gray fz13">规格750*750,大小≤1M</p>
<vue-gic-upload-image
:projectName="projectName"
:wxFlag="wxFlag"
:actionUrl="actionUrl"
:imageList="imageList"
:limitW="limitW"
:limitH="limitH"
:imgSize="imgSize"
with-credentials
:maxImageLength="maxlength"
@uploadOnSuccess="uploadOnSuccess"
@sortImg="sortImg"
@deleteImage="deleteImage">
</vue-gic-upload-image>
<vue-gic-upload-image :projectName="projectName" :wxFlag="wxFlag" :actionUrl="actionUrl" :imageList="imageList" :limitW="limitW" :limitH="limitH" :imgSize="imgSize" with-credentials :maxImageLength="maxlength" @uploadOnSuccess="uploadOnSuccess" @sortImg="sortImg" @deleteImage="deleteImage"> </vue-gic-upload-image>
</div>
</el-form-item>
<el-form-item prop="proCategoryId" label="礼品分类">
<el-select v-model="form.proCategoryId" placeholder="请选择" class="w300 delete-select">
<el-option v-for="(v,i) in categoryOptions" :key="i" :label="v.categoryName" :value="v.integralMallCategoryId">
<span class="fl">{{v.categoryName}}</span>
<el-button class="fr delete-icon" type="text" @click.stop="deleteCategory(v.integralMallCategoryId)" style="line-height:34px" ><i class="el-icon-error el-icon--right"></i></el-button>
<el-select v-model="form.proCategoryId" placeholder="请选择" class="w300 delete-select">
<el-option v-for="(v, i) in categoryOptions" :key="i" :label="v.categoryName" :value="v.integralMallCategoryId">
<span class="fl">{{ v.categoryName }}</span>
<el-button class="fr delete-icon" type="text" @click.stop="deleteCategory(v.integralMallCategoryId)" style="line-height:34px"><i class="el-icon-error el-icon--right"></i></el-button>
</el-option>
</el-select>
<el-button type="text" @click="createCategory">新建分类</el-button>
</el-form-item>
<el-form-item prop="integralCost" label="积分费用">
<el-input-number class="w300" controls-position="right" :disabled="isInfo || isEdit" v-model="form.integralCost" :precision="0" :step="1" :min="0" ></el-input-number>
<el-input-number class="w300" controls-position="right" :disabled="isInfo || isEdit" v-model="form.integralCost" :precision="0" :step="1" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="cashCost" label="现金费用">
<el-input-number controls-position="right" :disabled="isInfo || isEdit" v-model="form.cashCost" class="w300" :precision="2" :step="0.1" :min="0"></el-input-number>
......@@ -43,8 +30,7 @@
<el-input-number controls-position="right" :disabled="isInfo || isEdit || form.changeType === 1" v-model="form.costValue" class="w300" :precision="2" :step="0.1" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="limitTimes" label="次数限制">
<el-checkbox :disabled="isInfo" v-model="isLimitTimes"> 每个会员限制兑换
</el-checkbox>
<el-checkbox :disabled="isInfo" v-model="isLimitTimes"> 每个会员限制兑换 </el-checkbox>
<el-input-number controls-position="right" :disabled="isInfo" v-model="form.limitTimes" class="w100" :precision="0" :min="0"></el-input-number>
</el-form-item>
<el-form-item prop="memberGradeArr" label="适用会员">
......@@ -67,18 +53,18 @@
<el-radio-group v-model="form.exchangeDateType" style="line-height:inherit;">
<el-radio :label="1">全部日期</el-radio>
<el-radio :label="2">固定日期</el-radio>
<el-radio :label="3">每月</el-radio>
<el-radio :label="4">每周</el-radio>
<el-radio :label="3">每月</el-radio>
<el-radio :label="4">每周</el-radio>
</el-radio-group>
<div class="pt8" v-if="form.exchangeDateType === 2">
<el-date-picker class="w300" v-model="form.exchangeFixDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
<el-date-picker class="w300" v-model="form.exchangeFixDate" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
</div>
<div class="pt8" v-if="form.exchangeDateType === 3">
<el-select class="w300" size="small" v-model="form.exchangeDateDayArr" multiple placeholder="请选择">
<el-option v-for="item in monthOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
</div>
<div class="pt8" v-if="form.exchangeDateType ===4">
<div class="pt8" v-if="form.exchangeDateType === 4">
<el-select class="w300" size="small" v-model="form.exchangeDateWeekArr" multiple placeholder="请选择">
<el-option v-for="item in exchangeDateWeekOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
......@@ -91,14 +77,13 @@
<el-radio :label="2" class="vertical-middle">部分时段</el-radio>
</el-radio-group>
<div v-show="form.exchangeTimeType === 2" class="">
<p v-for="(v,i) in timeRangeList" :key="i" class="pt8">
<p v-for="(v, i) in timeRangeList" :key="i" class="pt8">
<el-time-picker :disabled="form.exchangeTimeType === 1" class="vertical-middle w300" is-range v-model="v.timeRange" value-format="HH:mm" format="HH:mm" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" placeholder="选择时间范围"></el-time-picker>
<el-button v-if="i" class="vertical-middle" type="text" @click="delTimeRange(i)">删除</el-button>
</p>
<span class="gray fz12 vertical-top">请使用24小时制输入时间,格式如11:00至14:30</span>
<span class="gray fz12 vertical-top">请使用24小时制输入时间,格式如11:00至14:30</span>
<p><el-button type="text" @click="addTimeRange">添加时间段</el-button></p>
</div>
</el-form-item>
<el-form-item prop="proShowStatus" label="显示状态" class="is-required">
......@@ -112,7 +97,7 @@
<el-radio :label="1">立即发布</el-radio>
<el-radio :label="2">定时发布</el-radio>
</el-radio-group>
<div class="pt8" v-if="form.releaseType ===2">
<div class="pt8" v-if="form.releaseType === 2">
<el-date-picker v-model="form.limitTimeBegin" type="datetime" placeholder="选择日期时间"></el-date-picker>
</div>
</el-form-item>
......@@ -124,18 +109,18 @@
</el-radio-group>
<div class="pt8">
<span v-show="form.changeType !== 1">库存 <el-input-number controls-position="right" v-model="form.virtualStock" class="w250 vertical-middle" :precison="0" :min="0"></el-input-number></span>
<span v-show="form.changeType === 1" class="gray fz13">礼品成本金额以选择兑换券的成本金额为准</span>
<span v-show="form.changeType === 1" class="gray fz13">礼品成本金额以选择兑换券的成本金额为准</span>
</div>
</el-form-item>
</div>
<div class="dm-form__wrap" v-show="!(form.changeType !== 1 || isInfo || isEdit)">
<h3 class="dm-title__label">选择卡券</h3>
<div style="margin-bottom:20px;">
<card-temp ref="cardTemp" pbSize="pb15" :activeId.sync="form.proReferId" @emitActiveObj="getCardActiveObjFun" :showPagination="false" :cardLimitType="3"></card-temp>
<div style="margin-bottom:20px;">
<card-temp ref="cardTemp" pbSize="pb15" :activeId.sync="form.proReferId" @emitActiveObj="getCardActiveObjFun" :showPagination="false" :cardLimitType="3"></card-temp>
</div>
</div>
<div class="btn-wrap_fixed" :class="{'on':asideShow}">
<el-button type="primary" @click="submit('form')" v-if="!isInfo">{{isAdd?'确认新增':'确认编辑'}}</el-button>
<div class="btn-wrap_fixed" :class="{ on: asideShow }">
<el-button type="primary" @click="submit('form')" v-if="!isInfo">{{ isAdd ? '确认新增' : '确认编辑' }}</el-button>
<el-button @click="$router.go(-1)">返 回</el-button>
</div>
</el-form>
......
......@@ -2,19 +2,25 @@
<el-dialog class="express dialog__body__nopadding" title="查看详情" :visible.sync="show" width="40%" :before-close="close">
<div class="express--info">
<div v-if="infoStatus === 3">
<p>收件人:<span style="color:#606266">{{info.consignee || '--'}}</span></p>
<p>联系方式:<span style="color:#606266">{{info.consigneePhone || '--'}}</span></p>
<p>收货地址:<span style="color:#606266">{{info.receivingAddress || '--'}}</span></p>
<p>
收件人:<span style="color:#606266">{{ info.consignee || '--' }}</span>
</p>
<p>
联系方式:<span style="color:#606266">{{ info.consigneePhone || '--' }}</span>
</p>
<p>
收货地址:<span style="color:#606266">{{ info.receivingAddress || '--' }}</span>
</p>
</div>
<div v-if="infoStatus === 1">
<p>发货时间:{{formateDateTimeByType(info.deliveryTime,'yyyy-MM-dd-HH-mm') || '--'}}</p>
<p>操作人员:{{info.clerkName || '--'}}</p>
<p>发货内容:{{info.deliveryContent || '--'}}</p>
<p>发货时间:{{ formateDateTimeByType(info.deliveryTime, 'yyyy-MM-dd-HH-mm') || '--' }}</p>
<p>操作人员:{{ info.clerkName || '--' }}</p>
<p>发货内容:{{ info.deliveryContent || '--' }}</p>
</div>
<div v-if="infoStatus !== 1">
<p>取消时间:{{formateDateTimeByType(info.cancelTime,'yyyy-MM-dd-HH-mm') || '--'}}</p>
<p>操作人员:{{info.clerkName || '--'}}</p>
<p>取消原因:{{info.cancelReason || '--'}}</p>
<div v-if="infoStatus !== 1">
<p>取消时间:{{ formateDateTimeByType(info.cancelTime, 'yyyy-MM-dd-HH-mm') || '--' }}</p>
<p>操作人员:{{ info.clerkName || '--' }}</p>
<p>取消原因:{{ info.cancelReason || '--' }}</p>
</div>
</div>
<span slot="footer" class="dialog-footer">
......@@ -23,57 +29,56 @@
</el-dialog>
</template>
<script>
import { getLogisticsInfo } from '@/service/api/mallApi.js';
import { formateDateTimeByType } from '@/utils/index.js';
import {getLogisticsInfo,getLogisticsList,orderOptService} from '@/service/api/mallApi.js';
import {formateDateTimeByType} from '@/utils/index.js';
export default {
props:{
show:{
type:Boolean,
default:false
},
id:{
type:String,
default:''
},
infoStatus:{
type:Number,
default:false
}
export default {
props: {
show: {
type: Boolean,
default: false
},
watch:{
show(val) {
if (val) {
this.getLogisticsInfo();
}
}
id: {
type: String,
default: ''
},
data() {
return {
formateDateTimeByType,
loading:false,
info:{}
infoStatus: {
type: Number,
default: 0
}
},
watch: {
show(val) {
if (val) {
this.getLogisticsInfo();
}
}
},
data() {
return {
formateDateTimeByType,
loading: false,
info: {}
};
},
methods: {
close() {
this.$emit('update:show', false);
},
methods: {
close() {
this.$emit('update:show',false);
},
async getLogisticsInfo() {
this.loading = true;
let res = await getLogisticsInfo({integralMallProExchangeId:this.id});
if (res.errorCode === 0) {
this.info = res.result.changeLog || {};
}
this.loading = false;
async getLogisticsInfo() {
this.loading = true;
let res = await getLogisticsInfo({ integralMallProExchangeId: this.id });
if (res.errorCode === 0) {
this.info = res.result.changeLog || {};
}
this.loading = false;
}
}
};
</script>
<style lang="scss" scoped>
.express{
.express {
&--info {
p {
line-height: 30px;
......
<template>
<div>
<router-view></router-view>
</div>
<div>
<router-view></router-view>
</div>
</template>
<script>
import { getNotSendCount } from '@/service/api/mallApi.js';
export default {
name: "mall",
name: 'mall',
data() {
const vm = this;
return {
total:0,
total: 0
};
},
created() {
this.$store.commit("mutations_breadcrumb", [{ name: "积分商城" }]);
this.$store.commit("aside_handler", true);
this.$store.commit('mutations_breadcrumb', [{ name: '积分商城' }]);
this.$store.commit('aside_handler', true);
this.getNotSendCount();
$bus.$on('refresh-not-send-count',() => {
/* eslint-disable */
$bus.$on('refresh-not-send-count', () => {
this.getNotSendCount();
});
},
methods:{
async getNotSendCount(){
methods: {
async getNotSendCount() {
let res = await getNotSendCount();
if (res.errorCode === 0) {
this.total = res.result;
......
......@@ -301,7 +301,7 @@ a:hover{
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none !important;
margin: 0;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
......
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