Commit 737367eb authored by 张冬's avatar 张冬

第一次

parents
NODE_ENV="beta"
VUE_APP_DOMAIN="/"
VUE_APP_IMG="http://images.alpha.pinpianyi.cn/"
NODE_ENV="development"
VUE_APP_DOMAIN="/"
VUE_APP_IMG="http://images.alpha.pinpianyi.cn/"
\ No newline at end of file
NODE_ENV="production"
VUE_APP_DOMAIN="/API"
VUE_APP_STATICCDOMAIN="https://adminstatic.pinpianyi.com/web_admin"
VUE_APP_IMG="http://images.pinpianyi.com/"
\ No newline at end of file
NODE_ENV="test"
VUE_APP_DOMAIN = '/dev'
VUE_APP_STATICCDOMAIN = '/webadmin'
VUE_APP_IMG="http://images.alpha.pinpianyi.cn/"
\ No newline at end of file
This diff is collapsed.
node_modules
.DS_Store
npm-debug.log
yarn-debug.log
yarn-error.log
lerna-debug.log
npm-debug.log.*
yarn-debug.log.*
yarn-error.log.*
lerna-debug.log.*
.idea
.vscode
.npmrc
waiter.config.js
build/bin/algolia-key.js
.envrc
dist/*
jsdoc_toolkit/*
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "none"
}
# app-entry
## Project setup
```
yarn install
```
### Compiles and hot-reloads for development
```
yarn run serve
```
### Compiles and minifies for production
```
yarn run build
```
### Run your tests
```
yarn run test
```
### Lints and fixes files
```
yarn run lint
```
### Customize configuration
See [Configuration Reference](https://cli.vuejs.org/config/).
module.exports = {
'/web_user/': {
target: 'http://localhost:10250/',
pathRewrite: {
'/web_admin': ''
}
},
'/web_all/': {
target: 'http://localhost:10251/',
pathRewrite: {
'/web_admin': ''
}
},
'/test_t': {
target: 'https://webapi.test.pinpianyi.cn',
// changeOrigin: true,
pathRewrite: {
'/test_t': ''
}
}
}
module.exports = {
presets: ['@vue/app']
}
This diff is collapsed.
{
"name": "web_base",
"devPort": 20014,
"version": "0.1.0",
"scripts": {
"serve": "vue-cli-service serve",
"serve:beta": "vue-cli-service serve --mode beta",
"build": "vue-cli-service build --mode production",
"build:beta": "vue-cli-service build --mode beta",
"build:test": "vue-cli-service build --mode test",
"tep:list": "node template"
},
"dependencies": {
"axios": "^0.19.2",
"dayjs": "^1.8.31",
"file-saver": "^2.0.2",
"jszip": "^3.4.0",
"nprogress": "^0.2.0",
"qs": "^6.9.3",
"screenfull": "^4.2.0",
"vue": "^2.5.22",
"vue-router": "^3.1.3",
"vuex": "^3.1.2",
"xe-utils": "^2.4.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.4.0",
"babel-eslint": "^8.2.1",
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"cross-env": "^5.2.0",
"eslint": "^5.0.1",
"eslint-config-prettier": "^3.1.0",
"eslint-config-standard": "^12.0.0",
"eslint-loader": "^2.0.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^8.0.0",
"eslint-plugin-prettier": "2.6.2",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^4.0.0",
"@vue/cli-service": "^3.4.0",
"node-sass": "^4.9.0",
"prettier": "^2.0.4",
"sass-loader": "^7.1.0",
"vue-template-compiler": "^2.5.21",
"webpack-aliyun-oss": "^0.2.5"
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
],
"license": "MIT"
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>捷安采</title>
<link rel="stylesheet" href="https://unpkg.zhimg.com/element-ui/lib/theme-chalk/index.css">
<link href="https://static.pinpianyi.com/web_common/index_s.css" rel="stylesheet">
</head>
<body>
<!--<noscript>-->
<!--<strong>We're sorry but app-entry doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>-->
<!--</noscript>-->
<div id="app"></div>
<script type="text/javascript" src="<%= process.env.NODE_ENV === 'development' ? 'https://cdn.bootcdn.net/ajax/libs/vue/2.6.7/vue.common.dev.js' : 'https://static.pinpianyi.com/web_common/vue.min.js' %>"></script>
<!--<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.22/vue<%= process.env.NODE_ENV === 'development' ? '' : '.min' %>.js"></script>-->
<script src="https://unpkg.zhimg.com/element-ui/lib/index.js"></script>
<script type="text/javascript" src="https://static.pinpianyi.com/web_common/sweet-ui.min.js"></script>
<!--<script src="https://webapi.amap.com/maps?v=1.4.8&key=58b825aa7109e2e778c0ec67d1fecb5d"></script>-->
<!--<script src="//webapi.amap.com/ui/1.1/main-async.js"></script>-->
<script src="https://cdn.bootcdn.net/ajax/libs/zepto/1.2.0/zepto.min.js"></script>
</body>
</html>
const STATICDOMAIN = process.env.VUE_APP_STATICCDOMAIN || ''
class InsertScriptWebpackPlugin {
constructor(options = {}) {
const { files = [] } = options
this.files = files
}
apply(compiler) {
const self = this
if (STATICDOMAIN) {
this.files = this.files.map(item => {
return STATICDOMAIN + item.replace(/\.\/web_admin/, '') + '?' + new Date().getTime()
})
}
compiler.hooks.compilation.tap(
'InsertScriptWebpackPlugin',
(compilation) => {
if (compilation.hooks.htmlWebpackPluginBeforeHtmlProcessing) {
compilation.hooks.htmlWebpackPluginBeforeHtmlProcessing.tap(
'InsertScriptWebpackPlugin',
(htmlPluginData) => {
const {
assets: { js }
} = htmlPluginData
js.unshift(...self.files)
},
)
} else {
console.log('\n')
console.log(
'\x1b[41m%s\x1b[0m',
'Error:',
'`insert-script-webpack-plugin` dependent on `html-webpack-plugin`',
)
}
},
)
}
}
module.exports = InsertScriptWebpackPlugin
<style lang="scss" src="./styles/common.scss"></style>
<style>
#app {
height: 100%;
overflow: hidden;
}
</style>
<template>
<div id="app">
<router-view />
<!--<path-setting v-if="ENV !== 'production'"></path-setting>-->
</div>
</template>
<script>
// import PathSetting from '@components/pathSetting'
const ENV = process.env.NODE_ENV
export default {
name: 'app',
components: { },
data() {
return {
ENV
}
},
methods: {
}
}
</script>
<template>
<div>
<iframe id="testIframe" :src="test" style="display: none"></iframe>
</div>
</template>
<script>
export default {
name: 'index',
data() {
return {
test: ''
}
},
created() {
this.synCookie()
},
methods: {
synCookie() {
const sessionId = this.$cookies.get('sessionId')
const shopType = this.$cookies.get('shopType')
const cityCode = this.$cookies.get('cityCode')
const cityName = this.$cookies.get('cityName')
const compliance = this.$cookies.get('compliance')
const arrCity = this.$cookies.get('arrCity')
const authorArr = this.$cookies.get('authorArr')
const obj = this.$cookies.get('domainPath')
const name = JSON.parse(obj).name
const permissionList = window.localStorage.getItem('permissionList')
const menuList = window.localStorage.getItem('menuList')
const src = `https://web.${name}.pinpianyi.cn/tast.html?sessionId=${sessionId}&shopType=${shopType}&cityCode=${cityCode}&cityName=${cityName}
&compliance=${compliance}&arrCity=${arrCity}&authorArr=${authorArr}&permissionList=${permissionList}&menuList=${menuList}`
// const src = 'http://192.168.0.101:8000/tast.html'
// const params = `sessionId=${sessionId}&shopType=${shopType}&cityCode=${cityCode}&cityName=${cityName}
// &compliance=${compliance}&arrCity=${arrCity}&authorArr=${authorArr}&permissionList=${permissionList}&menuList=${menuList}`
// const paramsStr = encodeURI(params)
// window.location.href
// const iframe = document.createElement('iframe')
// iframe.src = src
this.test = src
setTimeout(() => {
const iframe = document.getElementById('testIframe')
const data = {
sessionId,
shopType,
cityName,
cityCode,
compliance,
arrCity,
authorArr,
permissionList,
menuList
}
iframe.contentWindow.postMessage(data, '*')
}, 1000)
}
}
}
</script>
<style scoped>
</style>
<template>
<el-button :disabled="!isPermission" v-bind="setting">
<slot></slot>
</el-button>
</template>
<script>
const ENV = process.env.NODE_ENV
export default {
name: 'index',
props: {
setting: {
type: Object,
default: () => {
}
},
permission: {
type: Array,
default: () => {
return ['', '']
}
}
},
computed: {
isPermission() {
if ((['development', 'test'].includes(ENV) && false) || this.permission.length < 2) {
return true
}
const [id, pageId] = this.permission
const userPermission = this.$store.state.permission.buttonsVOS
const menuList = this.$store.state.permission.menuList
if (
(userPermission[pageId] &&
userPermission[pageId].indexOf(id.toString()) >= 0) ||
(!menuList[pageId] ||
(menuList[pageId] && menuList[pageId].indexOf(id.toString()) === -1))
) {
return true
} else {
return false
}
}
}
}
</script>
<style scoped>
</style>
<template>
<el-dialog
ref="dialog"
:modal="false"
:visible.sync="visible"
:title="title"
:before-close="beforeClose"
:show-close="showClose"
class="custom-dialog"
width="100%">
<slot></slot>
<slot name="footer"></slot>
</el-dialog>
</template>
<script>
export default {
name: 'customDialog',
props: {
visible: {
type: Boolean,
default: false
},
showClose: {
type: Boolean,
default: true
},
title: {
type: String,
default: ''
},
beforeClose: {
type: Function,
default: () => {
}
}
},
watch: {
visible(newValue) {
console.log('----33')
}
},
created() {
}
}
</script>
<style scoped lang="scss">
.custom-dialog{
position: absolute;
background: #fff;
overflow: hidden;
z-index: 100 !important;
/deep/.el-dialog{
margin: 0px !important;
width: 100%;
height: 100%;
.el-dialog__header{
height: 55px;
}
.el-dialog__body{
height:calc(100% - 55px) ;
overflow: auto;
}
}
}
</style>
<template>
<el-dropdown-item :disabled="!isPermission" v-bind="setting">
<slot></slot>
</el-dropdown-item>
</template>
<script>
const ENV = process.env.NODE_ENV
export default {
name: 'index',
props: {
setting: {
type: Object,
default: () => {
}
},
permission: {
type: Array,
default: () => {
return ['', '']
}
}
},
computed: {
isPermission() {
if ((['development', 'test'].includes(ENV) && false) || this.permission.length < 2) {
return true
}
const [pageId, id] = this.permission
const userPermission = this.$store.state.permission.buttonsVOS
const menuList = this.$store.state.permission.menuList
if (
(userPermission[pageId] &&
userPermission[pageId].indexOf(id.toString()) >= 0) ||
(!menuList[pageId] ||
(menuList[pageId] && menuList[pageId].indexOf(id.toString()) === -1))
) {
return true
} else {
return false
}
}
}
}
</script>
<style scoped>
</style>
.elx-editable .editable-required-icon:before {
content: "*";
color: #f56c6c;
}
.elx-editable.el-table--mini .elx-editable-column {
height: 36px;
}
.elx-editable.el-table--small .elx-editable-column {
height: 40px;
}
.elx-editable.el-table--medium .elx-editable-column {
height: 44px;
}
.elx-editable .elx-editable-column,
.elx-editable.el-table--large .elx-editable-column {
height: 48px;
padding: 0;
}
.elx-editable .elx-editable-column.elx_dirty {
position: relative;
}
.elx-editable .elx-editable-column.elx_dirty:before {
content: '';
top: -5px;
left: -5px;
position: absolute;
border: 5px solid;
border-color: transparent #f56c6c transparent transparent;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.elx-editable .elx-editable-column .cell > .edit-input,
.elx-editable .elx-editable-column .cell > .el-cascader,
.elx-editable .elx-editable-column .cell > .el-autocomplete,
.elx-editable .elx-editable-column .cell > .el-input-number,
.elx-editable .elx-editable-column .cell > .el-date-editor,
.elx-editable .elx-editable-column .cell > .el-select {
width: 100%;
}
.elx-editable .elx-editable-row.elx_disabled,
.elx-editable .elx-editable-column.elx_edit.elx_disabled {
cursor: not-allowed;
}
.elx-editable .elx-editable-column.elx_edit.elx_active .cell {
line-height: inherit;
overflow: inherit;
position: relative;
}
.elx-editable.editable_click .elx-editable-column.elx_edit,
.elx-editable.editable_dblclick .elx-editable-column.elx_edit {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.elx-editable .elx-editable-column.valid-error .el-input__inner,
.elx-editable .elx-editable-column.valid-error .el-input__inner:focus,
.elx-editable .elx-editable-column.valid-error .el-textarea__inner,
.elx-editable .elx-editable-column.valid-error .el-textarea__inner:focus {
border-color: #f56c6c;
}
/* default tip */
.elx-editable .elx-editable-column .editable-valid_error {
display: none;
text-align: left;
}
.elx-editable .elx-editable-column.valid-error .el-input__inner,
.elx-editable .elx-editable-column.valid-error .el-input__inner:focus,
.elx-editable .elx-editable-column.valid-error .el-textarea__inner,
.elx-editable .elx-editable-column.valid-error .el-textarea__inner:focus {
border-color: #f56c6c;
}
.elx-editable .editable-row:last-child .elx-editable-column.valid-error .editable-valid_error {
top: auto;
bottom: -moz-calc(100% + 10px);
bottom: -webkit-calc(100% + 10px);
bottom: calc(100% + 10px);
}
.elx-editable .editable-row:last-child .elx-editable-column.valid-error .editable-valid_error:before {
top: auto;
bottom: -12px;
border-color: #f56c6c transparent transparent transparent;
}
.elx-editable .elx-editable-column.valid-error .editable-valid_error,
.elx-editable .editable-row:first-child .elx-editable-column.valid-error .editable-valid_error {
display: block;
position: absolute;
top: -moz-calc(100% + 10px);
top: -webkit-calc(100% + 10px);
top: calc(100% + 10px);
left: 10px;
bottom: auto;
z-index: 2;
min-width: 300px;
}
.elx-editable .elx-editable-column.valid-error .editable-valid_error>.valid-message,
.elx-editable .editable-row:first-child .elx-editable-column.valid-error .editable-valid_error>.valid-message {
display: inline-block;
padding: 8px 10px;
line-height: 1.5;
color: #fff;
background-color: #f56c6c;
border-radius: 4px;
font-size: 12px;
word-wrap: break-word;
}
.elx-editable .elx-editable-column .editable-valid_error:before,
.elx-editable .editable-row:first-child .elx-editable-column.valid-error .editable-valid_error:before {
content: "";
position: absolute;
top: -12px;
left: 20px;
bottom: auto;
border: 6px solid;
border-color: transparent transparent #f56c6c transparent;
}
.elx-editable .elx-editable-column .editable-valid_wrapper {
display: block;
width: 100%;
height: 100%;
top: 0;
left: 0;
position: absolute;
z-index: -1;
}
/* el tooltip */
.el-tooltip__popper.elx-valid_tooltip {
background: #f56c6c;
}
.el-tooltip__popper.elx-valid_tooltip[x-placement^=top] .popper__arrow,
.el-tooltip__popper.elx-valid_tooltip[x-placement^=top] .popper__arrow::after {
border-top-color: #f56c6c;
}
.el-tooltip__popper.elx-valid_tooltip[x-placement^=bottom] .popper__arrow,
.el-tooltip__popper.elx-valid_tooltip[x-placement^=bottom] .popper__arrow::after {
border-bottom-color: #f56c6c;
}
.el-tooltip__popper.elx-valid_tooltip[x-placement^=left] .popper__arrow,
.el-tooltip__popper.elx-valid_tooltip[x-placement^=left] .popper__arrow::after {
border-left-color: #f56c6c;
}
.el-tooltip__popper.elx-valid_tooltip[x-placement^=right] .popper__arrow,
.el-tooltip__popper.elx-valid_tooltip[x-placement^=right] .popper__arrow::after {
border-right-color: #f56c6c;
}
.elx-contextmenu,
.elx-contextmenu .ctx-menu_child-wrapper {
position: absolute;
top: 0;
left: 0;
z-index: 88;
font-size: 12px;
color: #000;
background: #FFF;
border: 1px solid #C6C6C6;
box-shadow: 2px 2px 4px -2px #666;
padding: 0 1px;
font-family: "Source Sans Pro", "Helvetica Neue", Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.elx-contextmenu > .ctx-menu_wrapper,
.elx-contextmenu > .ctx-menu_wrapper .ctx-menu_child-wrapper {
margin: 0;
padding: 0;
list-style-type: none;
border-bottom: 1px solid #E8EAED;
}
.elx-contextmenu > .ctx-menu_wrapper li {
position: relative;
margin: 1px 0;
border: 1px solid transparent;
}
.elx-contextmenu > .ctx-menu_wrapper li:last-child {
border: 0;
}
.elx-contextmenu > .ctx-menu_wrapper li.active {
color: #2B2B2B;
background-color: #C5C5C5;
border-color:#C5C5C5;
}
.elx-contextmenu > .ctx-menu_wrapper li.disabled {
color: #B1B1B1;
}
.elx-contextmenu > .ctx-menu_wrapper li.disabled.active {
border-color:#C0C1C2;
background-color: #EEEEEE;
}
.elx-contextmenu > .ctx-menu_wrapper li.disabled.active:hover {
background-color: inherit;
}
.elx-contextmenu > .ctx-menu_wrapper .ctx-menu_link {
display: block;
padding: 0 30px;
width: 100px;
line-height: 26px;
}
.elx-contextmenu > .ctx-menu_wrapper .ctx-prefix-icon,
.elx-contextmenu > .ctx-menu_wrapper .ctx-suffix-icon {
position: absolute;
top: 5px;
margin-right: 5px;
font-size: 16px;
}
.elx-contextmenu > .ctx-menu_wrapper .ctx-prefix-icon {
left: 5px;
}
.elx-contextmenu > .ctx-menu_wrapper .ctx-suffix-icon {
right: 5px;
}
.elx-contextmenu > .ctx-menu_wrapper .content {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.elx-contextmenu .ctx-menu_child-wrapper {
display: none;
z-index: 99;
top: 0;
left: 100%;
}
.elx-contextmenu .ctx-menu_child-wrapper.show {
display: block;
}
import ElxEditable from './src/editable'
ElxEditable.install = function(Vue) {
Vue.component(ElxEditable.name, ElxEditable)
}
export const Editable = ElxEditable
export default ElxEditable
This diff is collapsed.
This diff is collapsed.
import XEUtils from 'xe-utils'
// 监听全局事件
const wheelName = /Firefox/i.test(navigator.userAgent) ? 'DOMMouseScroll' : 'mousewheel'
const eventStore = []
const GlobalEvent = {
on(comp, type, cb) {
eventStore.push({ comp, type, cb })
},
off(comp, type) {
XEUtils.remove(eventStore, item => item.comp === comp && item.type === type)
},
trigger(evnt) {
eventStore.forEach(({ comp, type, cb }) => {
if (type === evnt.type || (type === 'mousewheel' && evnt.type === wheelName)) {
cb.call(comp, evnt)
}
})
}
}
document.addEventListener('keydown', GlobalEvent.trigger, false)
document.addEventListener('contextmenu', GlobalEvent.trigger, false)
window.addEventListener('click', GlobalEvent.trigger, false)
window.addEventListener(wheelName, GlobalEvent.trigger, false)
export default GlobalEvent
const PropsStatic = {
table: {
data: Array,
height: [String, Number],
maxHeight: [String, Number],
stripe: Boolean,
border: Boolean,
size: String,
fit: { type: Boolean, default: true },
showHeader: { type: Boolean, default: true },
highlightCurrentRow: Boolean,
currentRowKey: [String, Number],
lazy: Boolean,
indent: Number,
rowClassName: [Function, String],
rowStyle: [Function, Object],
cellClassName: [Function, String],
cellStyle: [Function, Object],
headerRowClassName: [Function, String],
headerRowStyle: [Function, Object],
headerCellClassName: [Function, String],
headerCellStyle: [Function, Object],
rowKey: [Function, String],
emptyText: String,
defaultExpandAll: Boolean,
expandRowKeys: Array,
defaultSort: Object,
tooltipEffect: { type: String, default: 'dark' },
showSummary: Boolean,
sumText: String,
summaryMethod: Function,
selectOnIndeterminate: { type: Boolean, default: true },
spanMethod: Function,
load: Function
},
tableColumn: {
index: [Number, Function],
type: String,
label: String,
columnKey: String,
prop: String,
width: String,
minWidth: String,
fixed: [Boolean, String],
sortable: [Boolean, String],
sortMethod: Function,
sortBy: [String, Array, Function],
sortOrders: Array,
resizable: { type: Boolean, default: true },
formatter: Function,
showOverflowTooltip: Boolean,
align: { type: String, default: 'left' },
headerAlign: String,
className: { type: String, default: '' },
labelClassName: String,
selectable: Function,
reserveSelection: Boolean,
filters: Array,
filterPlacement: String,
filterMultiple: { type: Boolean, default: true },
filterMethod: Function,
filteredValue: Array
}
}
export default PropsStatic
/**
* 滚动渲染,以优化的方式渲染表格
* 计算规则:
* top --> Space
* --> visibleStart
* --> renderSize
* --> offsetSize
* table --> visibleIndex
* --> offsetSize
* bottom --> Space
*/
const ScrollHandle = {
reload() {
return function(isReload) {
return this.$nextTick().then(() => {
// 如果重新加载表格,索引重新初始化
if (!isReload) {
this.visibleIndex = 0
this.visibleStart = 0
this._computeScroll(isReload)
}
this.datas = this._fullData.slice(this.visibleStart, this.visibleStart + this.renderSize)
return this.$nextTick().then(() => {
this._computeScroll(isReload)
// 如果重新加载表格,滚动位置重新初始化
if (!isReload) {
updateScroll(this.elemStore)
}
})
})
}
},
bind() {
return function() {
// 绑定事件,生成对应元素
return this.$nextTick().then(() => {
const elTableElem = this.$refs.refElTable.$el
const bodyWrapper = elTableElem.querySelector('.el-table__body-wrapper')
const fixedLeftWrapper = elTableElem.querySelector('.el-table__fixed .el-table__fixed-body-wrapper')
const fixedRightWrapper = elTableElem.querySelector('.el-table__fixed-right .el-table__fixed-body-wrapper')
const elemStore = createScrollElem(elTableElem, bodyWrapper, '.el-table__header-wrapper', '.el-table__body')
if (fixedLeftWrapper) {
elemStore.fixedLeft = createScrollElem(elTableElem, fixedLeftWrapper, 0, 'table')
}
if (fixedRightWrapper) {
elemStore.fixedRight = createScrollElem(elTableElem, fixedRightWrapper, 0, 'table')
}
bodyWrapper.addEventListener('scroll', this._scrollEvent, false)
this.elemStore = elemStore
})
}
},
unbind() {
return function() {
// 事件解绑
unbindSpace(this.elemStore)
this.elemStore.bodyWrapper.removeEventListener('scroll', this._scrollEvent)
}
},
scroll() {
return function(evnt) {
let isRender
const { bodyWrapper } = this.elemStore
const fullData = this._fullData
const len = fullData.length
const renderSize = this.renderSize
const scrollTop = bodyWrapper.scrollTop
const isTop = scrollTop < this.scrollTop
const visibleStart = this.visibleStart
const visibleSize = this.visibleSize
const offsetSize = this.offsetSize
const rowHeight = this.rowHeight
const toVisibleIndex = Math.ceil(scrollTop / rowHeight)
if (isTop) {
// 如果向上滚动
if (visibleStart > 0 && (toVisibleIndex - offsetSize <= visibleStart)) {
isRender = true
}
} else {
// 如果向下滚动
if (visibleStart < len - renderSize && (toVisibleIndex + visibleSize + offsetSize >= visibleStart + renderSize)) {
isRender = true
}
}
if (isRender) {
// 超过阈值重新渲染
let toVisibleStart = toVisibleIndex - Math.floor(isTop ? renderSize / 2 : visibleSize)
if (toVisibleStart < 0) {
toVisibleStart = 0
} else if (toVisibleStart + renderSize >= len) {
toVisibleStart = len - renderSize
}
if (toVisibleStart !== visibleStart) {
this.visibleStart = toVisibleStart
// 渲染指定位置的数据
this.datas = fullData.slice(toVisibleStart, toVisibleStart + renderSize)
// 重新计算顶部空间和底部空间,支撑滚动条
this._setScrollSpace(toVisibleStart * rowHeight, (len - renderSize - toVisibleStart) * rowHeight)
// 渲染完成复原最后位置,保持滚动位置不变
this.$nextTick(() => {
bodyWrapper.scrollTop = scrollTop
})
}
}
this.scrollTop = scrollTop
this.visibleIndex = toVisibleIndex
}
},
space() {
return function(topHeight, bottomHeight) {
const { topSpace, bottomSpace, fixedLeft, fixedRight } = this.elemStore
topSpace.style.height = `${topHeight}px`
bottomSpace.style.height = `${bottomHeight}px`
if (fixedLeft) {
fixedLeft.topSpace.style.height = `${topHeight}px`
fixedLeft.bottomSpace.style.height = `${bottomHeight}px`
}
if (fixedRight) {
fixedRight.topSpace.style.height = `${topHeight}px`
fixedRight.bottomSpace.style.height = `${bottomHeight}px`
}
}
},
compute(size) {
return function(isReload) {
if (this.scrollLoad) {
const { headerWrapper, bodyWrapper, table } = this.elemStore
const fullData = this._fullData
let firstTrElem = table.querySelector('tbody>tr')
if (!firstTrElem) {
firstTrElem = headerWrapper.querySelector('thead>tr')
}
if (firstTrElem) {
this.rowHeight = firstTrElem.clientHeight
}
const visibleSize = Math.ceil(bodyWrapper.clientHeight / this.rowHeight)
const renderSize = getRenderSize(this.configs, this.elemStore, visibleSize, size)
this.offsetSize = getOffsetSize(this.configs, renderSize, visibleSize)
this.visibleSize = visibleSize
this.renderSize = renderSize
if (!isReload) {
this._setScrollSpace(0, fullData.length > renderSize ? (fullData.length - renderSize) * this.rowHeight : 0)
}
}
}
}
}
function updateScroll({ bodyWrapper, fixedLeft, fixedRight }, scrollTop, scrollLeft) {
bodyWrapper.scrollTop = scrollTop
bodyWrapper.scrollLeft = scrollLeft
if (fixedLeft) {
updateScroll(fixedLeft, scrollTop, scrollLeft)
}
if (fixedRight) {
updateScroll(fixedRight, scrollTop, scrollLeft)
}
}
function unbindSpace({ bodyWrapper, topSpace, bottomSpace, fixedLeft, fixedRight }) {
bodyWrapper.removeChild(topSpace)
bodyWrapper.removeChild(bottomSpace)
if (fixedLeft) {
unbindSpace(fixedLeft)
}
if (fixedRight) {
unbindSpace(fixedRight)
}
}
function createScrollElem(elTableElem, bodyWrapper, queryHeaderWrapper, queryTable) {
const table = bodyWrapper.querySelector(queryTable)
const topSpace = document.createElement('div')
const bottomSpace = document.createElement('div')
topSpace.className = 'elx-scroll_top-space'
bottomSpace.className = 'elx-scroll_bottom-space'
bodyWrapper.insertBefore(topSpace, table)
bodyWrapper.insertBefore(bottomSpace, table.nextSibling)
return {
headerWrapper: queryHeaderWrapper && elTableElem.querySelector(queryHeaderWrapper),
bodyWrapper,
table,
topSpace,
bottomSpace
}
}
/**
* renderSize 不应该低于 visibleSize 的3倍
*/
function getRenderSize(configs, elemStore, visibleSize, defSize) {
if (configs.renderSize) {
return configs.renderSize
}
if (elemStore.fixedLeft || elemStore.fixedRight) {
return visibleSize * Math.max(Math.floor(defSize / 2), 3)
}
return visibleSize * defSize
}
/**
* offsetSize 不应该低于 visibleSize 的一半
*/
function getOffsetSize(configs, renderSize, visibleSize) {
let offsetSize = 0
if (configs.offsetSize) {
return configs.offsetSize
}
if (renderSize > visibleSize * 4) {
offsetSize = visibleSize * 2
} else if (renderSize > visibleSize * 3) {
offsetSize = visibleSize
}
return Math.max(offsetSize, Math.ceil(visibleSize / 2))
}
export default ScrollHandle
import XEUtils from 'xe-utils'
const browse = XEUtils.browse()
const UtilHandle = {
browse,
addClass(cell, clss) {
const classList = cell.className.split(' ')
clss.forEach(name => {
if (classList.indexOf(name) === -1) {
classList.push(name)
}
})
cell.className = classList.join(' ')
},
hasClass(cell, cls) {
return cell && cell.className && cell.className.split && cell.className.split(' ').indexOf(cls) > -1
},
removeClass(cell, clss) {
const classList = []
cell.className.split(' ').forEach(name => {
if (clss.indexOf(name) === -1) {
classList.push(name)
}
})
cell.className = classList.join(' ')
},
getCsvUrl(opts, content) {
if (window.Blob && window.URL && window.URL.createObjectURL && !browse.safari) {
return URL.createObjectURL(new Blob([content], { type: 'text/csv' }))
}
return `data:attachment/csv;charset=utf-8,${encodeURIComponent(content)}`
},
getCsvLabelData(columns, oData, tableElem) {
const trElemList = tableElem.querySelectorAll('.el-table__body-wrapper .el-table__row')
return Array.from(trElemList).map((trElem, rowIndex) => {
const item = {}
const row = oData[rowIndex]
columns.forEach(column => {
const cell = trElem.querySelector(`.${column.id}`)
item[column.id] = cell ? cell.innerText.trim() : (row ? XEUtils.get(row, column.property) : '')
})
return item
})
},
getCsvData(opts, oData, oColumns, tableElem) {
const isOriginal = opts.original
let columns = opts.columns ? opts.columns : oColumns
if (opts.columnFilterMethod) {
columns = columns.filter(opts.columnFilterMethod)
}
let datas = opts.data ? opts.data : (isOriginal ? oData : UtilHandle.getCsvLabelData(columns, oData, tableElem))
if (opts.dataFilterMethod) {
datas = datas.filter(opts.dataFilterMethod)
}
return { columns, datas }
},
getCsvContent(opts, oData, oColumns, tableElem) {
const isOriginal = opts.original
const { columns, datas } = UtilHandle.getCsvData(opts, oData, oColumns, tableElem)
let content = '\ufeff'
if (opts.isHeader) {
content += columns.map(column => column.label).join(',') + '\n'
}
datas.forEach((record, rowIndex) => {
if (isOriginal) {
content += columns.map(column => {
if (column.type === 'index') {
return `"${column.index ? column.index(rowIndex) : rowIndex + 1}"`
}
return `"${XEUtils.get(record, column.property) || ''}"`
}).join(',') + '\n'
} else {
content += columns.map(column => `"${record[column.id]}"`).join(',') + '\n'
}
})
return content
},
downloadCsc(opts, content) {
if (!opts.download) {
return Promise.resolve(content)
}
if (navigator.msSaveBlob && window.Blob) {
navigator.msSaveBlob(new Blob([content], { type: 'text/csv' }), opts.filename)
} else if (browse['-ms']) {
var win = window.top.open('about:blank', '_blank')
win.document.charset = 'utf-8'
win.document.write(content)
win.document.close()
win.document.execCommand('SaveAs', opts.filename)
win.close()
} else {
const linkElem = document.createElement('a')
linkElem.target = '_blank'
linkElem.download = opts.filename
linkElem.href = UtilHandle.getCsvUrl(opts, content)
document.body.appendChild(linkElem)
linkElem.click()
document.body.removeChild(linkElem)
}
}
}
export default UtilHandle
import ElxEditableColumn from '../edit-table/src/editable-column'
ElxEditableColumn.install = function(Vue) {
Vue.component(ElxEditableColumn.name, ElxEditableColumn)
}
export const EditableColumn = ElxEditableColumn
export default ElxEditableColumn
<template>
<div v-toggle:[toggle] :class="{'sweet-filter__collapse': !showMore}" class="sweet-filter__multiline">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'filterContainer',
props: {
showMore: {
type: Boolean,
default: false
},
toggle: {
type: Object,
default() {
return {}
}
}
}
}
</script>
<style lang="scss">
.sweet-filter__multiline {
background: #fff;
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
padding: 16px;
.el-form-item {
.el-form-item__label {
align-items: center;
display: flex;
justify-content: flex-end;
line-height: 1;
}
}
.el-select,
.el-date-editor {
width: 100%;
}
.button_group {
display: flex;
float: right;
justify-content: flex-end;
& > div {
float: right;
}
}
}
.sweet-filter__collapse {
padding: 8px 8px 8px 8px;
margin-bottom: 4px;
/*margin: 16px;*/
/*margin-bottom: 0px;*/
.el-form-item--medium{
&.el-form-item{
margin-bottom: 10px;
}
}
}
</style>
<template>
<div :class="{'form-item-disabled': disabled}" class="form-item-select-label">
<div v-if="disabled">
<span class="el-dropdown-link">
{{ getLabel }}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
</div>
<el-dropdown v-if="!disabled" @command="select">
<span class="el-dropdown-link">
{{ getLabel }}
<i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item v-for="item in options" :disabled="item.disabled" :key="item.value" :command="item.value">{{ item.label }}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<!--<el-menu mode="horizontal" >-->
<!--<el-submenu @select="select">-->
<!--<template slot="title">{{ getLabel }}</template>-->
<!--<el-menu-item v-for="item in options" :key="item.value">{{ item.label }}</el-menu-item>-->
<!--&lt;!&ndash;<el-menu-item :key="2">2</el-menu-item>&ndash;&gt;-->
<!--</el-submenu>-->
<!--</el-menu>-->
</div>
</template>
<script>
export default {
name: 'formItemSelectLabel',
props: {
value: {
type: Number | String,
default: ''
},
options: {
type: Object | Array,
default: () => {
return []
}
},
disabled: {
type: Boolean,
default: false
}
},
data() {
return {
key: ''
}
},
computed: {
getLabel() {
const { options, value } = this
if (Array.isArray(options)) {
const labelIndex = options.findIndex(item => item.value === value)
if (labelIndex !== -1) {
return options[labelIndex].label
} else {
return value
}
} else if (options['getLabelByValue']) {
return this.options.getLabelByValue(value)
} else {
return value
}
}
},
watch: {
value(value) {
this.key = value
},
key(value) {
this.$emit('input', value)
}
},
methods: {
select(value) {
this.key = value
}
}
}
</script>
<style lang="scss">
.form-item-select-label{
display: flex;
cursor: pointer;
height: 100%;
align-items: center;
&.form-item-disabled{
cursor: inherit;
}
.el-dropdown{
font-size: 14px;
}
/deep/.el-dropdown-selfdefine{
display: flex;
}
/*.el-menu{*/
/*&.el-menu--horizontal{*/
/*border-bottom:none;*/
/*.el-submenu__title{*/
/*height: auto;*/
/*line-height: 100%;*/
/*padding: 0px;*/
/*}*/
/*.el-submenu{*/
/*&:hover{*/
/*.el-submenu__title{*/
/*background: none;*/
/*}*/
/*}*/
/*}*/
/*}*/
/*}*/
}
</style>
.sweet-header {
background-color: #fff;
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.04);
font-size: 14px;
height: 60px;
line-height: 60px;
min-width: 600px;
z-index: 10;
/* top fixed */
&__fixed {
position: fixed;
right: 0;
top: 0;
width: calc(100% - 190px);
}
.el-menu.el-menu--horizontal {
border-bottom: none;
}
.sweet-icon {
color: rgba(0, 0, 0, 0.45);
cursor: pointer;
font-size: 16px;
}
&__left {
float: left;
}
&__right {
float: right;
}
&--project {
float: left;
}
&--menu {
float: left;
margin-left: 48px;
}
/* override element-ui */
.el-dropdown {
font-size: 14px;
}
.el-menu-item {
font-size: 14px;
}
}
.homeabsolut{
position: absolute;
right: 30px;
}
<styles lang="scss" src="./index.scss">
</styles>
<template>
<div :class="{'sweet_right_collapse': true}" class="sweet-header">
<sweet-navbar>
<sweet-breadcrumb></sweet-breadcrumb>
<div></div>
<sweet-navbar-block>
<sweet-nav>
</sweet-nav>
<el-dropdown menu-trigger="click" @command="logout">
<span class="el-dropdown-link">
<sweet-avatar size="2.25rem">
<!--<img alt=""/>-->
</sweet-avatar>
{{ userInfo.name }}
<i class="el-icon-arrow-down"></i>
</span>
<el-dropdown-menu slot="dropdown" class="header_dropdown">
<el-dropdown-item>退出</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</sweet-navbar-block>
</sweet-navbar>
</div>
</template>
<script>
import sweetBreadcrumb from '../sweet-breadcrumb'
import screenfull from '../screenfull'
import { API } from '@lib/api'
export default {
components: {
screenfull,
sweetBreadcrumb
},
data() {
return {}
},
computed: {
cityName() {
return this.$cookies.get('cityName')
},
cityList() {
return JSON.parse(this.$cookies.get('authorArr'))
},
userInfo() {
return this.$store.state.permission.user
}
},
created() {},
methods: {
async openCity(item) {
const { statusCode } = await this.$request({
url: API.exchangeCity,
method: 'post',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: { cityCode: item.cityCode }
})
if (statusCode === 2000) {
this.$cookies.delete('cityCode', '/')
this.$cookies.delete('cityName', '/')
this.$cookies.set('cityCode', item.cityCode, 0, '/')
this.$cookies.set('cityName', item.cityName, 0, '/')
window.location.reload()
}
},
logout() {
this.$cookies.delete('sessionId', '/')
this.$cookies.delete('key', '/')
this.$cookies.delete('authorArr', '/')
this.$cookies.delete('cityCode', '/')
this.$cookies.delete('cityName', '/')
this.$cookies.delete('token', '/')
window.localStorage.clear()
this.$router.push('/login')
},
logout() {
this.$api.logout().then(res => {
if (res.code === 'success') {
storage.remove('token')
storage.remove('pathname')
window.location.href = res.data
}
})
},
getUserInfo() {
this.$api.getUserInfo().then(res => {
this.userInfo = res.data
})
},
getCategorys() {
this.$api.getCategoryApps().then(res => {
this.appList = res.data
})
},
goApp(url) {
if (url) window.location.href = url
},
goDashboard() {
getDomain.then(res => {
window.location.href = res['dashboard']
})
},
changeLang() {
this.$message.warning(this.$t('pub.langTip'))
}
}
}
</script>
<template>
<el-dropdown>
<el-button type="primary">
导入商品<i class="el-icon-arrow-down el-icon--right"/>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item>
<el-upload
:headers="{
'sessionId':sessionId
}"
:data="{
param: params
}"
:show-file-list="false"
:before-upload="beforeUpload"
:on-success="successUpload"
:action="uploadUrl">
导入商品
</el-upload>
</el-dropdown-item>
<el-link
:underline="false"
target="_blank"
href="https://static.pinpianyi.com//Excel/%E8%AE%A2%E5%8D%95%E6%A0%87%E7%AD%BE%E6%9D%BF%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BA.xls">
<el-dropdown-item>导出模版</el-dropdown-item>
</el-link>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
export default {
name: 'Index',
props: {
actionUrl: {
type: String,
default: ''
},
params: {
type: Object,
default: () => {
}
},
downUp: {
type: String,
default: ''
}
},
computed: {
sessionId() {
return this.$cookies.get('sessionId')
},
uploadUrl() {
return `${this.$domain}${this.actionUrl}`
}
},
methods: {
beforeUpload(file) {
this.file = file
},
successUpload(res, file) {
if (res.statusCode === 2000) {
this.$message({
type: 'success',
message: '上传成功'
})
this.$emit('success', res.body)
} else {
this.$message({
type: 'error',
message: res.msg
})
}
}
}
}
</script>
<style scoped>
</style>
import _ from 'lodash'
function isDef(val) {
return val !== undefined && val !== null
}
function getFirstComponentChild(children) {
if (Array.isArray(children)) {
for (let i = 0; i < children.length; i++) {
const c = children[i]
if (isDef(c) && isDef(c.componentOptions)) {
return c
}
}
}
}
function remove(arr, item) {
if (arr.length) {
const index = arr.indexOf(item)
if (index > -1) {
return arr.splice(index, 1)
}
}
}
function getComponentName(opts) {
return opts && (opts.Ctor.options.name || opts.tag)
}
function matches(pattern, name) {
if (Array.isArray(pattern)) {
return pattern.indexOf(name) > -1
} else if (typeof pattern === 'string') {
return pattern.split(',').indexOf(name) > -1
} else if (_.isRegExp(pattern)) {
return pattern.test(name)
}
/* istanbul ignore next */
return false
}
function pruneCache(cache, current, filter) {
for (const key in cache) {
const cachedNode = cache[key]
if (cachedNode) {
const name = getComponentName(cachedNode.componentOptions)
if (name && !filter(name)) {
if (cachedNode !== current) {
pruneCacheEntry(cachedNode, [], key)
}
cache[key] = null
}
}
}
}
function pruneCacheEntry(vnode, keys, key) {
if (vnode) {
vnode.componentInstance.$destroy()
}
remove(keys, key)
}
export default {
name: 'sweet-keep-alive',
props: {
include: [],
exclude: [],
updateComponentsKey: Function,
max: [String, Number]
},
created() {
// vue的keep-alive存储对象
this.cache = Object.create(null)
this.keys = []
},
// 调用keep-alive组件销毁钩子,组件销毁的时候同时清除缓存
destroyed() {
for (const key in this.cache) {
pruneCacheEntry(this.cache[key], this.keys, key)
}
},
watch: {
include(val) {
pruneCache(this.cache, this._vnode, name => matches(val, name))
},
exclude(val) {
pruneCache(this.cache, this._vnode, name => !matches(val, name))
}
},
render() {
const vnode = getFirstComponentChild(this.$slots.default)
const componentOptions = vnode && vnode.componentOptions
if (componentOptions) {
// check pattern
const name = getComponentName(componentOptions)
if (name && (
(this.include && !matches(this.include, name)) ||
(this.exclude && matches(this.exclude, name))
)) {
return vnode
}
const key = vnode.key == null
// same constructor may get registered as different local components
// so cid alone is not enough (#3269)
? componentOptions.Ctor.cid + (componentOptions.tag ? `::${componentOptions.tag}` : '')
: vnode.key
// 添加获取key的外部hook
this.updateComponentsKey && this.updateComponentsKey(key)
if (this.cache[key]) {
vnode.componentInstance = this.cache[key].componentInstance
// remove(this.keys, key)
// this.keys.push(key)
} else {
this.cache[key] = vnode
this.keys.push(key)
if (this.max && this.keys.length > parseInt(this.max)) {
pruneCacheEntry(this.cache[this.keys[0]], this.keys, key)
}
}
vnode.data.keepAlive = true
}
return vnode
},
methods: {
// 通过cache的key删除对应的缓存
removeCacheByKey(key) {
pruneCacheEntry(this.cache[key], this.keys, key)
this.cache[key] = null
}
}
}
.sweet {
display: flex;
flex-direction: row;
font-size: 12px;
height: 100%;
line-height: 1.5;
overflow: hidden;
.sweet-left-sidebar{
overflow-y: auto;
}
.content-main-c{
background: #F0F2F5;
// padding: 8px;
box-sizing: border-box;
padding:20px;
>.sweet-mainBox{
//margin: 16px;
margin-top: 4px;
padding: 8px;
padding-bottom: 0;
background: #fff;
}
}
.content-view{
position: relative;
min-height: 100%;
.handler {
background: #fff;
padding: 4px;
.el-dropdown{
margin-left: 8px;
}
}
}
.sweet-table--noLeftBorder {
.el-table {
border-left: 0;
}
}
.sweet-brand {
min-height: 3.75rem;
img{
height: auto;
}
}
/* overwrite */
.el-tabs__header {
margin: 0;
}
.el-tabs--card > .el-tabs__header .el-tabs__item.is-active.is-closable {
padding: 0 16px;
}
.el-tabs--card > .el-tabs__header .el-tabs__nav {
border-radius: 2px 2px 0 0;
}
.el-tabs__item {
color: rgba(0, 0, 0, 0.75);
padding: 0 16px;
}
.el-tabs__item.is-active {
color: #28e;
}
.el-breadcrumb__inner {
color: rgba(0, 0, 0, 0.45);
}
.el-pagination button:disabled {
background-color: inherit;
}
.el-pagination .btn-next,
.el-pagination .btn-prev {
background-color: inherit;
}
.el-pagination__jump {
margin-left: 0;
}
.el-form-item--mini.el-form-item {
margin-bottom: 12px;
}
.el-form-item--small.el-form-item {
margin-bottom: 16px;
}
.el-form-item--medium.el-form-item {
margin-bottom: 20px;
}
}
.sweet-sidebar {
overflow: hidden;
}
.sweet-left {
//width: 190px;
z-index: 500;
&-sidebar {
height: 100%;
}
}
.sweet__menuFixed {
.sweet-left {
height: 100%;
left: 0;
position: fixed;
top: 0;
}
.sweet-right {
margin-left: 190px;
}
&.sweet__collapse {
.sweet-right {
margin-left: 64px;
}
}
}
.sweet-right {
display: flex;
flex: 1;
flex-direction: column;
height: 100vh;
overflow: hidden;
transition: margin-left 0.3s;
&--content {
background: #fff;
display: flex;
flex-direction: column;
height: 100%;
overflow: auto;
}
&__widthFixed {
margin: 0 auto;
width: 1200px;
}
&__topFixed {
margin-top: 60px;
}
&--content--wrapper {
background-color: #fff;
}
}
/* top menu */
.sweet.sweet__topMenu {
.sweet-right {
margin-left: 0;
}
.sweet-menu--logo {
box-shadow: none;
float: left;
}
.sweet-header {
background-color: #343d50;
color: #fff;
padding-left: 0;
&--project {
margin: 0 48px 0 40px;
}
.sweet-icon {
color: #ffffffbf;
}
}
.el-dropdown {
color: rgba(255, 255, 255, 0.75);
}
.el-menu-item.is-active {
background-color: #ebf4fd !important;
color: #28e !important;
}
.el-submenu.is-active .el-submenu__title {
color: #ffffffbf;
}
}
/* light theme */
.sweet.sweet__light {
.el-submenu.is-active {
background-color: inherit;
}
.sweet-header {
background: #fff;
color: rgba(0, 0, 0, 0.75);
.el-dropdown {
color: rgba(0, 0, 0, 0.75);
}
.sweet-icon {
color: rgba(0, 0, 0, 0.75);
}
.el-submenu.is-active .el-submenu__title {
background-color: #fff !important;
color: rgba(0, 0, 0, 0.75);
}
}
.el-submenu__icon-arrow {
color: rgba(0, 0, 0, 0.75);
right: 8px;
}
.el-submenu__title {
color: rgba(0, 0, 0, 0.75) !important;
}
}
/* width fixed */
.sweet.sweet__widthFixed {
.sweet-header__wrapper {
margin: 0 auto;
width: 1200px;
}
.sweet-right {
background: #f5f5f5;
}
}
/* light theme with collapse */
.sweet.sweet__collapse.sweet__light {
.is-active > .el-submenu__title {
color: #28e !important;
}
}
/* top fixed width top menu */
.sweet.sweet__topFixed.sweet__topMenu {
.sweet-header {
width: 100%;
}
}
/* sweet-pagination */
.sweet-pagination {
background-color: #fafafa;
height: 30px;
padding: 0 5px;
.el-pagination__editor.el-input .el-input__inner {
height: 24px;
}
}
/* form input margin */
/* animation */
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
/* size change */
.sweet-size--mini {
.el-table--mini td,
.el-table--mini th {
padding: 0 0;
}
}
.sweet-size--small {
.sweet-right--content {
border: 0px solid rgba(0, 0, 0, 0.04);
//border-bottom: 0px solid rgba(0, 0, 0, 0.04);
border-top: 0;
}
&.sweet__showTab {
.sweet-right--content {
border: 0;
border-top: 0;
.sweet-mainBox {
padding: 0 8px;
}
.sweet-breadcrumb {
padding-left: 16px;
}
}
}
.el-table--small td,
.el-table--small th {
padding: 4px 0;
}
}
.sweet-size--medium {
.sweet-right--content {
border: 0px solid rgba(0, 0, 0, 0.04);
border-top: 0;
}
.el-table--medium td,
.el-table--medium th {
font-size: 14px;
padding: 8px 0;
}
}
.el-form-item {
.el-form-item__label {
align-items: center;
display: flex;
justify-content: flex-end;
line-height: 1;
}
}
.el-form-item--mini {
.el-form-item__label {
height: 24px;
}
}
.el-form-item--small {
.el-form-item__label {
height: 30px;
}
}
.el-form-item--medium {
.el-form-item__label {
height: 36px;
}
}
/* size change */
.el-button--medium {
&.sweet-table-operation--set {
padding: 11px;
}
}
.el-button--small {
&.sweet-table-operation--set {
padding-left: 8px;
padding-right: 8px;
}
}
.el-button--mini {
&.sweet-table-operation--set {
padding-left: 5px;
padding-right: 5px;
}
}
/* css rewrite */
.el-table--border td:first-child div.cell,
.el-table--border th:first-child div.cell {
padding-left: 16px;
}
.el-table--border td:last-child .cell,
.el-table--border th:last-child .cell {
padding-right: 16px;
}
.sweet .el-table .cell {
line-height: 30px;
}
<style lang="scss" src="./index.scss"></style>
<template>
<div style="height: 100%">
<div
v-scrollHideMenu="handleScrollHideMenu"
v-if="$route.meta.model !== 2"
:class="[sizeClass]"
class="sweet"
>
<div class="sweet-left">
<sweet-sidebar
v-model="collapse"
class="sweet-left-sidebar"
dark
@change="handleToggleSidebar"
>
<sweet-brand
href="#"
shadow
dark
>
<span style="text-align: center;">捷安采</span>
</sweet-brand>
<!-- <sweet-sidebar-toggle>快捷入口</sweet-sidebar-toggle> -->
<sweet-sidebar-block>
<sweet-menu-container
:size="this.$ELEMENT.size"
indented
>
<sweet-menu />
</sweet-menu-container>
</sweet-sidebar-block>
</sweet-sidebar>
</div>
<div class="sweet-right">
<transition name="fade">
<sweet-header />
<!-- <sweet-breadcrumb /> -->
</transition>
<div class="sweet-right--content">
<!-- <sweet-breadcrumb></sweet-breadcrumb> -->
<!--<tab-page v-show="true" />-->
<!--<div >-->
<sweet-keep-alive
ref="keepAlive"
:max="15"
>
<router-view
v-if="$route.meta.keepAlive"
:key="$route.name"
:class="{'sweet_right_collapse': false}"
class="content-view content-main-c"></router-view>
</sweet-keep-alive>
<router-view
v-if="!$route.meta.keepAlive"
:key="$route.path"
:class="{'sweet_right_collapse': false}"
class="content-view content-main-c"></router-view>
</div>
</div>
</div>
<div v-if="$route.meta.model === 2" style="height: 100%">
<router-view
v-if="!iframeUrl2"
:class="{'sweet_right_collapse': false}"
class="content-view"></router-view>
</div>
</div>
</template>
<script>
import sweetMenu from '@components/menu'
import sweetHeader from '@components/header'
import sweetBreadcrumb from '../sweet-breadcrumb'
import tabPage from '@components/tab'
export default {
components: {
sweetMenu,
sweetHeader,
tabPage,
sweetBreadcrumb
},
directives: {
scrollHideMenu: {
bind(el, binding) {
const handleScroll = function handleScrollFunc(e) {
binding.value(e)
}
document.addEventListener('scroll', handleScroll)
el.scrollFunc = handleScroll
},
unbind(el) {
document.removeEventListener('scroll', el.scrollFunc)
delete el.scrollFunc
}
}
},
data() {
return {
collapse: false
}
},
computed: {
sizeClass() {
return `sweet-size--${this.$ELEMENT.size}`
},
//
// iframeTabs() {
// return this.$store.state.oldIframe.tabIframes
// },
// // 兼容老系统iframe
// iframeUrl() {
// return this.$store.state.oldIframe.iframeObj.path
// },
//
// iframeUrl2() {
// return this.$store.state.oldIframe.iframeObj.path
// },
clearCache() {
return this.$store.state.keepAlive.clearCacheKey
}
},
watch: {
'iframeUrl'(url) {
},
'clearCache'(key) {
if (key) {
this.$refs.keepAlive.removeCacheByKey(key)
this.$store.dispatch('clearSuccess')
}
}
},
methods: {
handleScrollHideMenu() {
},
handleToggleSidebar() {
this.$store.dispatch('toggleSidebar')
}
}
}
</script>
This diff is collapsed.
import Vue from 'vue'
const ENV = process.env.NODE_ENV
const menu = [
]
if (['development', 'test'].includes(ENV)) {
const childMenu = Vue.__share_pool__ ? Vue.__share_pool__.menus : {}
const childMenusArray = Object.values(childMenu)
if (childMenusArray.length > 0) {
const childAllMenus = childMenusArray.reduce((acc, prev) => acc.concat(prev))
menu.push(...childAllMenus)
}
}
export default menu
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<sweet-icon
:type="isFullscreen ? 'fullscreen-exit' : 'fullscreen'"
@click="toggleFullscreen"
></sweet-icon>
</template>
<script>
import screenfull from 'screenfull';
export default {
name: 'screenfull',
data() {
return {
isFullscreen: false,
};
},
mounted() {
this.init();
},
methods: {
toggleFullscreen() {
if (!screenfull.enabled) {
this.$message({
message: 'you browser can not work',
type: 'warning',
});
return;
}
screenfull.toggle();
},
init() {
if (screenfull.enabled) {
screenfull.on('change', () => {
this.isFullscreen = screenfull.isFullscreen;
});
}
},
},
};
</script>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import toggle from './toggle'
export { toggle }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
export const API = {
loginCheckUser: '/ppy-auth/api/login/loginCheckUser/{id}'
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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