初始化
@ -0,0 +1,18 @@
|
||||
{
|
||||
"presets": [
|
||||
["env", {
|
||||
"modules": false,
|
||||
"targets": {
|
||||
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
|
||||
}
|
||||
}],
|
||||
"stage-2"
|
||||
],
|
||||
"plugins": ["transform-vue-jsx", "transform-runtime"],
|
||||
"env": {
|
||||
"test": {
|
||||
"presets": ["env", "stage-2"],
|
||||
"plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
@ -0,0 +1,5 @@
|
||||
/build/
|
||||
/config/
|
||||
/dist/
|
||||
/*.js
|
||||
/test/unit/coverage/
|
||||
@ -0,0 +1,29 @@
|
||||
// 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.
|
||||
'plugin:vue/essential',
|
||||
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
|
||||
'standard'
|
||||
],
|
||||
// required to lint *.vue files
|
||||
plugins: [
|
||||
'vue'
|
||||
],
|
||||
// add your custom rules here
|
||||
rules: {
|
||||
// allow async-await
|
||||
'generator-star-spacing': 'off',
|
||||
// allow debugger during development
|
||||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,17 @@
|
||||
.DS_Store
|
||||
node_modules/
|
||||
/dist/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
/test/unit/coverage/
|
||||
/test/e2e/reports/
|
||||
selenium-debug.log
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
.vscode
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
@ -0,0 +1,10 @@
|
||||
// https://github.com/michael-ciniawsky/postcss-load-config
|
||||
|
||||
module.exports = {
|
||||
"plugins": {
|
||||
"postcss-import": {},
|
||||
"postcss-url": {},
|
||||
// to edit target browsers: use "browserslist" field in package.json
|
||||
"autoprefixer": {}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
# vue
|
||||
|
||||
> A Vue.js project
|
||||
|
||||
## Build Setup
|
||||
|
||||
``` bash
|
||||
# install dependencies
|
||||
npm install
|
||||
|
||||
# serve with hot reload at localhost:8080
|
||||
npm run dev
|
||||
|
||||
# build for production with minification
|
||||
npm run build
|
||||
|
||||
# build for production and view the bundle analyzer report
|
||||
npm run build --report
|
||||
|
||||
# run unit tests
|
||||
npm run unit
|
||||
|
||||
# run e2e tests
|
||||
npm run e2e
|
||||
|
||||
# run all tests
|
||||
npm test
|
||||
```
|
||||
|
||||
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
|
||||
@ -0,0 +1,41 @@
|
||||
'use strict'
|
||||
require('./check-versions')()
|
||||
|
||||
process.env.NODE_ENV = 'production'
|
||||
|
||||
const ora = require('ora')
|
||||
const rm = require('rimraf')
|
||||
const path = require('path')
|
||||
const chalk = require('chalk')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const webpackConfig = require('./webpack.prod.conf')
|
||||
|
||||
const spinner = ora('building for production...')
|
||||
spinner.start()
|
||||
|
||||
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
|
||||
if (err) throw err
|
||||
webpack(webpackConfig, (err, stats) => {
|
||||
spinner.stop()
|
||||
if (err) throw err
|
||||
process.stdout.write(stats.toString({
|
||||
colors: true,
|
||||
modules: false,
|
||||
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
|
||||
chunks: false,
|
||||
chunkModules: false
|
||||
}) + '\n\n')
|
||||
|
||||
if (stats.hasErrors()) {
|
||||
console.log(chalk.red(' Build failed with errors.\n'))
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
console.log(chalk.cyan(' Build complete.\n'))
|
||||
console.log(chalk.yellow(
|
||||
' Tip: built files are meant to be served over an HTTP server.\n' +
|
||||
' Opening index.html over file:// won\'t work.\n'
|
||||
))
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,54 @@
|
||||
'use strict'
|
||||
const chalk = require('chalk')
|
||||
const semver = require('semver')
|
||||
const packageConfig = require('../package.json')
|
||||
const shell = require('shelljs')
|
||||
|
||||
function exec (cmd) {
|
||||
return require('child_process').execSync(cmd).toString().trim()
|
||||
}
|
||||
|
||||
const versionRequirements = [
|
||||
{
|
||||
name: 'node',
|
||||
currentVersion: semver.clean(process.version),
|
||||
versionRequirement: packageConfig.engines.node
|
||||
}
|
||||
]
|
||||
|
||||
if (shell.which('npm')) {
|
||||
versionRequirements.push({
|
||||
name: 'npm',
|
||||
currentVersion: exec('npm --version'),
|
||||
versionRequirement: packageConfig.engines.npm
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = function () {
|
||||
const warnings = []
|
||||
|
||||
for (let i = 0; i < versionRequirements.length; i++) {
|
||||
const mod = versionRequirements[i]
|
||||
|
||||
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
|
||||
warnings.push(mod.name + ': ' +
|
||||
chalk.red(mod.currentVersion) + ' should be ' +
|
||||
chalk.green(mod.versionRequirement)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
if (warnings.length) {
|
||||
console.log('')
|
||||
console.log(chalk.yellow('To use this template, you must update following to modules:'))
|
||||
console.log()
|
||||
|
||||
for (let i = 0; i < warnings.length; i++) {
|
||||
const warning = warnings[i]
|
||||
console.log(' ' + warning)
|
||||
}
|
||||
|
||||
console.log()
|
||||
process.exit(1)
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
// Modules to control application life and create native browser window
|
||||
const {app, BrowserWindow} = require('electron')
|
||||
const path = require('path')
|
||||
|
||||
function createWindow () {
|
||||
// Create the browser window.
|
||||
const mainWindow = new BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
preload: path.join(__dirname, 'preload.js')
|
||||
}
|
||||
})
|
||||
|
||||
// and load the index.html of the app.
|
||||
mainWindow.loadFile('index.html')
|
||||
|
||||
// Open the DevTools.
|
||||
// mainWindow.webContents.openDevTools()
|
||||
}
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
// initialization and is ready to create browser windows.
|
||||
// Some APIs can only be used after this event occurs.
|
||||
app.whenReady().then(() => {
|
||||
createWindow()
|
||||
|
||||
app.on('activate', function () {
|
||||
// On macOS it's common to re-create a window in the app when the
|
||||
// dock icon is clicked and there are no other windows open.
|
||||
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
||||
})
|
||||
})
|
||||
|
||||
// Quit when all windows are closed, except on macOS. There, it's common
|
||||
// for applications and their menu bar to stay active until the user quits
|
||||
// explicitly with Cmd + Q.
|
||||
app.on('window-all-closed', function () {
|
||||
if (process.platform !== 'darwin') app.quit()
|
||||
})
|
||||
|
||||
// In this file you can include the rest of your app's specific main process
|
||||
// code. You can also put them in separate files and require them here.
|
||||
|
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,102 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const config = require('../config')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const packageConfig = require('../package.json')
|
||||
|
||||
exports.assetsPath = function (_path) {
|
||||
const assetsSubDirectory = process.env.NODE_ENV === 'production'
|
||||
? config.build.assetsSubDirectory
|
||||
: config.dev.assetsSubDirectory
|
||||
|
||||
return path.posix.join(assetsSubDirectory, _path)
|
||||
}
|
||||
|
||||
exports.cssLoaders = function (options) {
|
||||
options = options || {}
|
||||
|
||||
const cssLoader = {
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
const postcssLoader = {
|
||||
loader: 'postcss-loader',
|
||||
options: {
|
||||
sourceMap: options.sourceMap
|
||||
}
|
||||
}
|
||||
|
||||
// generate loader string to be used with extract text plugin
|
||||
function generateLoaders (loader, loaderOptions) {
|
||||
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
|
||||
|
||||
if (loader) {
|
||||
loaders.push({
|
||||
loader: loader + '-loader',
|
||||
options: Object.assign({}, loaderOptions, {
|
||||
sourceMap: options.sourceMap
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// Extract CSS when that option is specified
|
||||
// (which is the case during production build)
|
||||
if (options.extract) {
|
||||
return ExtractTextPlugin.extract({
|
||||
use: loaders,
|
||||
fallback: 'vue-style-loader',
|
||||
publicPath: '../../'
|
||||
})
|
||||
} else {
|
||||
return ['vue-style-loader'].concat(loaders)
|
||||
}
|
||||
}
|
||||
|
||||
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
|
||||
return {
|
||||
css: generateLoaders(),
|
||||
postcss: generateLoaders(),
|
||||
less: generateLoaders('less'),
|
||||
sass: generateLoaders('sass', { indentedSyntax: true }),
|
||||
scss: generateLoaders('sass'),
|
||||
stylus: generateLoaders('stylus'),
|
||||
styl: generateLoaders('stylus')
|
||||
}
|
||||
}
|
||||
|
||||
// Generate loaders for standalone style files (outside of .vue)
|
||||
exports.styleLoaders = function (options) {
|
||||
const output = []
|
||||
const loaders = exports.cssLoaders(options)
|
||||
|
||||
for (const extension in loaders) {
|
||||
const loader = loaders[extension]
|
||||
output.push({
|
||||
test: new RegExp('\\.' + extension + '$'),
|
||||
use: loader,
|
||||
})
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
exports.createNotifierCallback = () => {
|
||||
const notifier = require('node-notifier')
|
||||
|
||||
return (severity, errors) => {
|
||||
if (severity !== 'error') return
|
||||
|
||||
const error = errors[0]
|
||||
const filename = error.file && error.file.split('!').pop()
|
||||
|
||||
notifier.notify({
|
||||
title: packageConfig.name,
|
||||
message: severity + ': ' + error.name,
|
||||
subtitle: filename || '',
|
||||
icon: path.join(__dirname, 'logo.png')
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const config = require('../config')
|
||||
const isProduction = process.env.NODE_ENV === 'production'
|
||||
const sourceMapEnabled = isProduction
|
||||
? config.build.productionSourceMap
|
||||
: config.dev.cssSourceMap
|
||||
|
||||
module.exports = {
|
||||
loaders: utils.cssLoaders({
|
||||
sourceMap: sourceMapEnabled,
|
||||
extract: isProduction
|
||||
}),
|
||||
cssSourceMap: sourceMapEnabled,
|
||||
cacheBusting: config.dev.cacheBusting,
|
||||
transformToRequire: {
|
||||
video: ['src', 'poster'],
|
||||
source: 'src',
|
||||
img: 'src',
|
||||
image: 'xlink:href'
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,320 @@
|
||||
'use strict'
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const path = require('path')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
|
||||
const portfinder = require('portfinder')
|
||||
|
||||
const HOST = process.env.HOST
|
||||
const PORT = process.env.PORT && Number(process.env.PORT)
|
||||
|
||||
const devWebpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({
|
||||
sourceMap: config.dev.cssSourceMap,
|
||||
usePostCSS: true
|
||||
})
|
||||
},
|
||||
// cheap-module-eval-source-map is faster for development
|
||||
devtool: config.dev.devtool,
|
||||
|
||||
// these devServer options should be customized in /config/index.js
|
||||
devServer: {
|
||||
clientLogLevel: 'warning',
|
||||
historyApiFallback: {
|
||||
rewrites: [{
|
||||
from: /.*/,
|
||||
to: path.posix.join(config.dev.assetsPublicPath, 'index.html')
|
||||
}, ],
|
||||
},
|
||||
// https:true,
|
||||
hot: true,
|
||||
contentBase: false, // since we use CopyWebpackPlugin.
|
||||
compress: true,
|
||||
host: HOST || config.dev.host,
|
||||
port: PORT || config.dev.port,
|
||||
open: config.dev.autoOpenBrowser,
|
||||
overlay: config.dev.errorOverlay ?
|
||||
{
|
||||
warnings: false,
|
||||
errors: true
|
||||
} :
|
||||
false,
|
||||
publicPath: config.dev.assetsPublicPath,
|
||||
proxy: config.dev.proxyTable,
|
||||
quiet: true, // necessary for FriendlyErrorsPlugin
|
||||
watchOptions: {
|
||||
poll: config.dev.poll,
|
||||
},
|
||||
|
||||
},
|
||||
plugins: [
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': require('../config/dev.env')
|
||||
}),
|
||||
new webpack.HotModuleReplacementPlugin(),
|
||||
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
|
||||
new webpack.NoEmitOnErrorsPlugin(),
|
||||
// https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: 'index.html',
|
||||
template: 'index.html',
|
||||
inject: true
|
||||
}),
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.dev.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}])
|
||||
]
|
||||
})
|
||||
|
||||
module.exports = new Promise((resolve, reject) => {
|
||||
portfinder.basePort = process.env.PORT || config.dev.port
|
||||
portfinder.getPort((err, port) => {
|
||||
if (err) {
|
||||
reject(err)
|
||||
} else {
|
||||
// publish the new Port, necessary for e2e tests
|
||||
process.env.PORT = port
|
||||
// add port to devServer config
|
||||
devWebpackConfig.devServer.port = port
|
||||
|
||||
// Add FriendlyErrorsPlugin
|
||||
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
|
||||
compilationSuccessInfo: {
|
||||
// messages: [
|
||||
// `
|
||||
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
|
||||
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
|
||||
// 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎 鼎鼎鼎 鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎 鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// 鼎鼎鼎鼎 鼎鼎鼎 鼎鼎鼎
|
||||
// `,
|
||||
// `Local: https://192.168.31.193:${port}`,
|
||||
// `Network: http://${require('ip').address()}:${port}`,
|
||||
// ],
|
||||
|
||||
/**
|
||||
*
|
||||
* ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
|
||||
* │Esc│ │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│ ┌┐ ┌┐ ┌┐
|
||||
* └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └┘ └┘ └┘
|
||||
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
|
||||
* │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │N L│ / │ * │ - │
|
||||
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
|
||||
* │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │ │
|
||||
* ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
|
||||
* │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter │ │ 4 │ 5 │ 6 │ │
|
||||
* ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
|
||||
* │ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
|
||||
* ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││
|
||||
* │ Ctrl│ │Alt │ Space │ Alt│ │ │Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │←─┘│
|
||||
* └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
|
||||
*/
|
||||
messages: [
|
||||
`
|
||||
~~~~~~~~~~~~~~~~#######~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~~#########~~~~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~############~~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~~#############~~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~~##~~###########~~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~###~~######~#####~~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~~###~#######~~~####~~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~~###~~##########~####~~~~~~~~~~~~~~~~
|
||||
~~~~~~~~~~####~~###########~####~~~~~~~~~~~~~~~
|
||||
~~~~~~~~#####~~~###########~~#####~~~~~~~~~~~~~
|
||||
~~~~~~~######~~~###~########~~~#####~~~~~~~~~~~
|
||||
~~~~~~~#####~~~###~~~########~~~######~~~~~~~~~
|
||||
~~~~~~######~~~###~~###########~~~######~~~~~~~
|
||||
~~~~~######~~~####~##############~~######~~~~~~
|
||||
~~~~#######~~#####################~#######~~~~~
|
||||
~~~~#######~~##############################~~~~
|
||||
~~~#######~~######~#################~#######~~~
|
||||
~~~#######~~######~######~#########~~~######~~~
|
||||
~~~#######~~~~##~~######~~~######~~~~~######~~~
|
||||
~~~#######~~~~~~~~######~~~~#####~~~~~#####~~~~
|
||||
~~~~######~~~~~~~~#####~~~~~#####~~~~~####~~~~~
|
||||
~~~~~#####~~~~~~~~####~~~~~~####~~~~~###~~~~~~
|
||||
~~~~~~#####~~~~~~;###~~~~~~~####~~~~~#~~~~~~~~
|
||||
~~~~~~~~##~~~~~~~####~~~~~~~####~~~~~~~~~~~~~
|
||||
~~~~~~~~~#~~~~~~~####~~~~~~~####~~~~~~~~~~~~~
|
||||
|
||||
`,
|
||||
|
||||
`Local: http://192.168.31.35:${port}`,
|
||||
`Network: http://${require('ip').address()}:${port}`,
|
||||
],
|
||||
// messages: [
|
||||
// `
|
||||
// MMMMM
|
||||
// MMMMMM
|
||||
// MMMMMMM
|
||||
// MMMMMMMM .
|
||||
// MMMMMMMMM
|
||||
// HMMMMMMMMMM
|
||||
// MMMMMMMMMMMM M
|
||||
// MMMMMMMMMMMMM M
|
||||
// MMMMMMMMMMMMM M
|
||||
// MMMMMMMMMMMMM:
|
||||
// oMMMMMMMMMMMMMM
|
||||
// .MMMMMMMMMMMMMMo MMMMMMMMMMMMMMM M
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMM. oMMMMMMMMMMMMMMM.M
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// oMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM: H
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM . MMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMM
|
||||
// .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMM
|
||||
// MM. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM M MMMMMMMMMMMM
|
||||
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .MMMMMMMMMMMMMM
|
||||
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MM MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// .MMMMMMMMM MMMMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// HMMMMMMMMMMMMMMMMMMMMM.MMMMMMMMM.MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMM MMM.oMMMMMMM..MMMMMMMMM:MMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMM MM..MMMMMMM...MMMMMMM. MMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMM ..MMMMMM...MMMMMM ..MMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMM:M.MMM.M.. MMMMM M..MMMMM...MMMMMMMMMMMMMMMMMM MMM
|
||||
// MMMM. .M..MM.M...MMMMMM..MMMMM.. MMMMMMMMMMMMMMMMMMMMMMMMMMMMMM .
|
||||
// MMMM..M....M.....:MMM .MMMMMM..MMMMMMM...MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMM.M.. ...M......MM.MMMMM.......MHM.M .MMMMMMMMMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMM..MM. . MMM.....MMMMMM.M.....M ..MM..M MMMMMMMMMMMMMMMMMMM
|
||||
// .MMMMMHMM. ..MMMM. MMM............o..... . .MMMMMMMMMMMMMMM
|
||||
// MMM. M... .........................M..:.MMMMMMMMMMMM
|
||||
// oMMM............ .................M.M.MMMMMMMMM
|
||||
// .....MM........................ . MMMMMM
|
||||
// M.....M.....................o.MM.MMMMMMMM.
|
||||
// M........................M.. ...MMMMMMMMMMMMMo
|
||||
// :....MMM..............MMM..oMMMMMMM
|
||||
// M...MMM.............MMMMMMM
|
||||
// .............:MMMMMMMM
|
||||
// M..... MMM.....M
|
||||
// M M.............
|
||||
// ................M
|
||||
// ooM.................MM MoMMMMMoooM
|
||||
// MMoooM......................MoooooooH..oMM
|
||||
// MHooooMoM.....................MMooooooM........M
|
||||
// oooooooMoooM......... o........MoooooooM............
|
||||
// Mooooooooooo.......M.........Moooooooo:..............M
|
||||
// MooMoooooooooM...M........:Mooooooooooo:..............M
|
||||
// M..oooooooooooo .........Mooooooooooooooo..............M
|
||||
// M...Mooo:oooooooo.M....ooooooooooooooooooo..M...........M
|
||||
// ...oooooMoooooooM..Mooooooooooooo:oooooooM.M...........M.
|
||||
// M...ooooooMoo:ooooMoooooooooooooHoooooooooH:M. ...........:
|
||||
// M..MoooooooMoooooooooooooooooo:ooooooMooooMoM..............M
|
||||
// M..ooooooooooMooooooooooooooHoooooooMooHooooM...............M
|
||||
// ...ooooooooooooooooooo:MooooooooooooooMoMoooM................
|
||||
// M...oooooooooooooooooooooooooooooooooooooMooMM................M
|
||||
// ...MooooooooooooooooooooooooooooooooooooooooMo ................
|
||||
// ...MooooooooooooooooooooooooooooooooooooooooM M................M
|
||||
// M...ooooooooooooooooooooooooooooooooooooooooM ................M
|
||||
// ...MoooooooooooooooooooooooooooooooooooooooMM .:...............
|
||||
// .....MooooooooooooooooooooooooooooooooooooMoo .............M
|
||||
// M...... ooooooooooooooooooooooooooooooooooooM M..............M
|
||||
// M........MooooMMM MM MM MMMMMMMMMooooooooM M...............M
|
||||
// .........HM M: MM :MMMMMM M M...............
|
||||
// M..........M M MoM M M................M
|
||||
// M.........:M MoH M M M MooooHoooMM. M M...............M
|
||||
// M..........Moooo MMooM oooooMooooooooM M..............H
|
||||
// M.........MooooM Mooo : ooooooMooooMoooM M........ . .o.M
|
||||
// H.. .....ooooo oooo M MooooooooooooooM M... MMMMMMMMMMM
|
||||
// MMMMMMMMMMooooM M oooo . ooooooMooooooooM .MMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMooooH : ooooH oooooooooooooooo MMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMoooo ooooM Moooooooooooooooo .MMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMoooo ooooM MooooooooooooooooM MMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMoooM ooooM ooooooooooooooooo MMMMMMMMMMM:M
|
||||
// MMMMMMMMMMoooM MooooM oooooooooooMoooooo MH...........
|
||||
// . ......Mooo. MooooM oooooooooooooooooo M............M
|
||||
// M.M......oooo MooooM Moooooooooooooooooo: .........M.....
|
||||
// M.M.....Moooo MooooM ooooooooooooooooooM .M............
|
||||
// .......MooooH MooooM oooooooooMoooooooooo M..o...M..o....M
|
||||
// .o....HMooooM MooooH MooooooooMooooooooooM .:M...M.......M
|
||||
// M..M.....MoooM :oooo: .MooooooooHooMoooooooooM M M... ..oM.M
|
||||
// M...M.:.Mooo. MMMMooooo oooooooooooMoooooooooooooM ....M. M
|
||||
// M:M..o.Moooooooooooooo MooooooooooooooMooooooooooooM .Mo
|
||||
// MooooooooooooooMooooooooooooMoMoooooooooooooo
|
||||
// Mooooooooooooooo:ooooooooooooooooooooooooooooo
|
||||
// ooooooooooooooooMooooooooooMoooooooooooooooooo
|
||||
// ooooooooooooooooMoooooooooooMooooooooooooooooHo
|
||||
// ooMooooooooooooooMoooooooooooooooooooooooooooMoM
|
||||
// MooMoooooooooooooo.ooooooooooooooooooooooooooo:oM
|
||||
// MoooooooooooooooooooooooooooooooooooooooooooooooM
|
||||
// MoooMooooooooooooooMooooooooooooooooooooooooooooo.
|
||||
// MoooMooooooooooooooMoooooooooooooooooooooooooMooooM
|
||||
// MooooooooooooooooooMoooooooooooooooooooooooooMoooooM
|
||||
// MooooMoooooooooooooMoooooooooooooooooooooooooMoHooooM
|
||||
// ooooooMooooooooooooooooooooooooooooooooooooooooMoMoooM
|
||||
// MooooooooooooooooooooMooooooooooooooooooooooooooMoooooH:
|
||||
// MoooooooMooooooooooooMoooooooooooooooooooooooooooooHoooM
|
||||
// MooooooooMoooooooooooMoooooooooooooooooooooooooMoooMooooM
|
||||
// Moooooooooooooooooooooooooooooooooooooooooooooo.oooMooooo
|
||||
// MoooooooooooooooooooooooooooooooooooooooooooooMoooooooooM
|
||||
// MooooooooooooooooooooMoooooooooooooooooooooooooooooooooM
|
||||
// MooooooooooooooooooooMHooooooooooooooooooooMoooo:ooooo
|
||||
// MMooooooooooooooooooMoMHoooooooooooooooooooooooMooooo
|
||||
// MMoooooooooooooooMMooo MMooooooooooooooooooooooooooM
|
||||
// MMMoooooooooooooMooooo oooooooooooooooooooooMooooo
|
||||
// MooMMoooooooooMoooMMoM ooooHooooooooooooooooMooooM
|
||||
// MooooMooooooMooooMoooM MoooooMoooooooooooooMooooo
|
||||
// ooooooMMooooooooMooooM MoooooooooMooooooooooooooM
|
||||
// HooooooMoooooooMooooM HoooooooHooMooooooooooooo
|
||||
// oooMoooooooooHoooM MoooooooooMoooooooooM
|
||||
// HooooooooooooHM MooooooooMMoooooooM
|
||||
// MMMMMMMMMMMMMM Moooooo:MooooHMM
|
||||
// MMMMMMM: ... MMMMMMMMMMMMMM
|
||||
// M............M MMMMMMMMM ....
|
||||
// M.MM.......... M.............M
|
||||
// M ..............MM M..............
|
||||
// MMMMM............MMMM ..MMMMMMMM ....M
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMM...M
|
||||
// .MMMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMM
|
||||
// :MMMMMMMMMMMMMMMMMMH MMMMMMMMMMMMMMMMMMM
|
||||
// By EBEN Jérôme MMMMMMMMMMMMMMMMMM
|
||||
// MMMMMMMMMMMMMMM
|
||||
// HMMMMMMMMee
|
||||
|
||||
// `,
|
||||
|
||||
// `Local: https://192.168.31.193:${port}`,
|
||||
// `Network: http://${require('ip').address()}:${port}`,
|
||||
// ],
|
||||
|
||||
},
|
||||
onErrors: config.dev.notifyOnErrors ?
|
||||
utils.createNotifierCallback() :
|
||||
undefined
|
||||
}))
|
||||
|
||||
resolve(devWebpackConfig)
|
||||
}
|
||||
})
|
||||
})
|
||||
@ -0,0 +1,150 @@
|
||||
'use strict'
|
||||
const path = require('path')
|
||||
const utils = require('./utils')
|
||||
const webpack = require('webpack')
|
||||
const config = require('../config')
|
||||
const merge = require('webpack-merge')
|
||||
const baseWebpackConfig = require('./webpack.base.conf')
|
||||
const CopyWebpackPlugin = require('copy-webpack-plugin')
|
||||
const HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||
const ExtractTextPlugin = require('extract-text-webpack-plugin')
|
||||
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
|
||||
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
|
||||
|
||||
const env = process.env.NODE_ENV === 'testing'
|
||||
? require('../config/test.env')
|
||||
: require('../config/prod.env')
|
||||
|
||||
const webpackConfig = merge(baseWebpackConfig, {
|
||||
module: {
|
||||
rules: utils.styleLoaders({
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
extract: true,
|
||||
usePostCSS: true
|
||||
})
|
||||
},
|
||||
devtool: config.build.productionSourceMap ? config.build.devtool : false,
|
||||
output: {
|
||||
path: config.build.assetsRoot,
|
||||
publicPath:'./',
|
||||
filename: utils.assetsPath('js/[name].[chunkhash].js'),
|
||||
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
|
||||
},
|
||||
plugins: [
|
||||
// http://vuejs.github.io/vue-loader/en/workflow/production.html
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': env
|
||||
}),
|
||||
new UglifyJsPlugin({
|
||||
uglifyOptions: {
|
||||
compress: {
|
||||
warnings: false
|
||||
}
|
||||
},
|
||||
sourceMap: config.build.productionSourceMap,
|
||||
parallel: true
|
||||
}),
|
||||
// extract css into its own file
|
||||
new ExtractTextPlugin({
|
||||
filename: utils.assetsPath('css/[name].[contenthash].css'),
|
||||
// Setting the following option to `false` will not extract CSS from codesplit chunks.
|
||||
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
|
||||
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
|
||||
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
|
||||
allChunks: true,
|
||||
}),
|
||||
// Compress extracted CSS. We are using this plugin so that possible
|
||||
// duplicated CSS from different components can be deduped.
|
||||
new OptimizeCSSPlugin({
|
||||
cssProcessorOptions: config.build.productionSourceMap
|
||||
? { safe: true, map: { inline: false } }
|
||||
: { safe: true }
|
||||
}),
|
||||
// generate dist index.html with correct asset hash for caching.
|
||||
// you can customize output by editing /index.html
|
||||
// see https://github.com/ampedandwired/html-webpack-plugin
|
||||
new HtmlWebpackPlugin({
|
||||
filename: process.env.NODE_ENV === 'testing'
|
||||
? 'index.html'
|
||||
: config.build.index,
|
||||
template: 'index.html',
|
||||
inject: true,
|
||||
minify: {
|
||||
removeComments: true,
|
||||
collapseWhitespace: true,
|
||||
removeAttributeQuotes: true
|
||||
// more options:
|
||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||
},
|
||||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||
chunksSortMode: 'dependency'
|
||||
}),
|
||||
// keep module.id stable when vendor modules does not change
|
||||
new webpack.HashedModuleIdsPlugin(),
|
||||
// enable scope hoisting
|
||||
new webpack.optimize.ModuleConcatenationPlugin(),
|
||||
// split vendor js into its own file
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'vendor',
|
||||
minChunks (module) {
|
||||
// any required modules inside node_modules are extracted to vendor
|
||||
return (
|
||||
module.resource &&
|
||||
/\.js$/.test(module.resource) &&
|
||||
module.resource.indexOf(
|
||||
path.join(__dirname, '../node_modules')
|
||||
) === 0
|
||||
)
|
||||
}
|
||||
}),
|
||||
// extract webpack runtime and module manifest to its own file in order to
|
||||
// prevent vendor hash from being updated whenever app bundle is updated
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'manifest',
|
||||
minChunks: Infinity
|
||||
}),
|
||||
// This instance extracts shared chunks from code splitted chunks and bundles them
|
||||
// in a separate chunk, similar to the vendor chunk
|
||||
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
|
||||
new webpack.optimize.CommonsChunkPlugin({
|
||||
name: 'app',
|
||||
async: 'vendor-async',
|
||||
children: true,
|
||||
minChunks: 3
|
||||
}),
|
||||
|
||||
// copy custom static assets
|
||||
new CopyWebpackPlugin([
|
||||
{
|
||||
from: path.resolve(__dirname, '../static'),
|
||||
to: config.build.assetsSubDirectory,
|
||||
ignore: ['.*']
|
||||
}
|
||||
])
|
||||
]
|
||||
})
|
||||
|
||||
if (config.build.productionGzip) {
|
||||
const CompressionWebpackPlugin = require('compression-webpack-plugin')
|
||||
|
||||
webpackConfig.plugins.push(
|
||||
new CompressionWebpackPlugin({
|
||||
asset: '[path].gz[query]',
|
||||
algorithm: 'gzip',
|
||||
test: new RegExp(
|
||||
'\\.(' +
|
||||
config.build.productionGzipExtensions.join('|') +
|
||||
')$'
|
||||
),
|
||||
threshold: 10240,
|
||||
minRatio: 0.8
|
||||
})
|
||||
)
|
||||
}
|
||||
|
||||
if (config.build.bundleAnalyzerReport) {
|
||||
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
|
||||
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
|
||||
}
|
||||
|
||||
module.exports = webpackConfig
|
||||
@ -0,0 +1,11 @@
|
||||
-----BEGIN CERTIFICATE REQUEST-----
|
||||
MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh
|
||||
MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB
|
||||
AQUAA4GNADCBiQKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCY
|
||||
XQcn7YdjPGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA3
|
||||
8jWj0n0We8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwID
|
||||
AQABoAAwDQYJKoZIhvcNAQELBQADgYEAY+lAevCAVaZ+wjMUGU6FghgJHZMN9NqX
|
||||
54wun3Nss3paWAwjrQTVUXid3CTafZXf3opfKqXGAii1EgrNMyzbmnfu1WY7tr5X
|
||||
LuVSFPkxlkmXXZAbT5pUqhdkNlmx15nonR1kt5f1l3E4vzcxNsjGwO5UwN4kG6ff
|
||||
Qy13z0O/9uQ=
|
||||
-----END CERTIFICATE REQUEST-----
|
||||
@ -0,0 +1,13 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICDDCCAXUCFGl7NLxqW1Y1HqqUNyV4rNK8Y5VVMA0GCSqGSIb3DQEBCwUAMEUx
|
||||
CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
|
||||
cm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjAxMjE5MDg0OTE0WhcNMzAxMjE3MDg0
|
||||
OTE0WjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE
|
||||
CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
||||
ADCBiQKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCYXQcn7Ydj
|
||||
PGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA38jWj0n0W
|
||||
e8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwIDAQABMA0G
|
||||
CSqGSIb3DQEBCwUAA4GBAHNpkSJPPEeWsXMLLL54+K6uxNGPPyTuRZK0ihhfkT+x
|
||||
BGh5Hz7rB9JuBe/5uewKxf5nkjLUw+Mvh+Bsuom4RaPgfCj8Ao+wkt1+9XoUFXzZ
|
||||
MdlBpUhlKKYt/qdS8TTuRCTOgicia9UR3xEswE2ixwSXrGrJWfYNNrnOZjtLP0/h
|
||||
-----END CERTIFICATE-----
|
||||
@ -0,0 +1,15 @@
|
||||
-----BEGIN RSA PRIVATE KEY-----
|
||||
MIICWwIBAAKBgQC+T31J/S+vISoAy9B3Rxqjb2at9GXiiESYJ7De8tuD0YCYXQcn
|
||||
7YdjPGfH9xvw+e6UpuDwJgHbAfrL6Ba6BCQU8LsMZC5upr6f8g9VPpRDxUA38jWj
|
||||
0n0We8MIAz/yatrCgfCT4aQi9FUnVGv4BzpOkDSWuFzG/FeRiy4Jl7RZYwIDAQAB
|
||||
AoGAAfaH8E9wQnoxGLkBeXl+SNlJUdoHgwKs0nT2WhZfNUjf7rJm9H56uwdQeruN
|
||||
yjqJv3bJMzDxK/UlRR0rvtd0F86mKd0+uCznHZdiOQSD/WxIPJUQovM5n4D0mEz/
|
||||
4sNzsPcOSEmmajIFa7JVudGNHD2Ed1h7w7NT7idA9g0t/kECQQDdYgp9sIov4MZj
|
||||
LVmg64nBP73tnxoN7IbOtwsyhbzQ+MhEXfAhQvUT5SqlOpwp1ZwYxCcJ/IBXdnNL
|
||||
Ab91GsDrAkEA3BGeJeRcRqlnAJAINkWH7KbGx4jmOPyXycpgMBazlGii22VxyfWv
|
||||
+9lfPQtuUOxZnQqeR7UI4ZxkPXqQhQtraQJAJj0hAsTTmaGBou/aY2lLyg1wiPLK
|
||||
VU1dm6cSUA+5pX7TWLvBFn2yR1V2IEQXZUJ4S+7Vr2vl3zWehH4wy9FrMQJACeAs
|
||||
hazKy0z811SfWbgjEmalkvy8wB/tu9t+F4pdQrKzZD8YLST+YcHueTHTIISKvPZm
|
||||
BffEz0MSaIPgimfpyQJADHVDfBVSR+4D2pEDx5K8zbss7BccqmtayJTYJiviulHn
|
||||
P9Uh9ogb/rHLMiGjaPBP20u/JnXqYIBW9d/HccWXTQ==
|
||||
-----END RSA PRIVATE KEY-----
|
||||
@ -0,0 +1,4 @@
|
||||
const isPro = Object.is(process.env.NODE_ENV, 'production')
|
||||
module.exports= {
|
||||
baseUrl: isPro ? 'http://192.168.31.192:8084/':'api/'
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
'use strict'
|
||||
const merge = require('webpack-merge')
|
||||
const prodEnv = require('./prod.env')
|
||||
|
||||
module.exports = merge(prodEnv, {
|
||||
NODE_ENV: '"development"',
|
||||
baseURL:'"/api"'
|
||||
})
|
||||
@ -0,0 +1,95 @@
|
||||
"use strict";
|
||||
// Template version: 1.3.1
|
||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||
const path = require("path");
|
||||
const FileManagerPlugin = require("filemanager-webpack-plugin");
|
||||
module.exports = {
|
||||
dev: {
|
||||
env: require("./dev.env"),
|
||||
assetsSubDirectory: "static",
|
||||
assetsPublicPath: "/",
|
||||
proxyTable: {
|
||||
"/api": {
|
||||
target: "http://192.168.31.209:8084/", //设置你调用的接口域名和端口号 别忘了加http 本地
|
||||
// target: "http://139.9.185.131:8098/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式
|
||||
// target: "http://139.9.58.205:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式华为云
|
||||
// target: "http://139.9.185.131:9094/", //设置你调用的接口域名和端口号 别忘了加http 盛联
|
||||
|
||||
// target: "http://139.9.185.131:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达正式
|
||||
// target: "http://192.168.31.201:8084/", //设置你调用的接口域名和端口号 别忘了加http 天懿达线上
|
||||
// target: 'http://124.71.99.140:8084/', //设置你调用的接口域名和端口号 别忘了加http 线上
|
||||
// target: 'http://124.71.99.140:8081/', //设置你调用的接口域名和端口号 别忘了加http 测试
|
||||
// target: 'https://www.decaisoft.com:8088/', //设置你调用的接口域名和端口号 别忘了加http 测试
|
||||
// target: 'https://www.decaisoft.com:8091/', //设置你调用的接口域名和端口号 别忘了加http 线上
|
||||
changeOrigin: true, //允许跨域
|
||||
pathRewrite: {
|
||||
"^/api": "" //这个是定义要访问的路径,名字随便写
|
||||
}
|
||||
}
|
||||
},
|
||||
// Various Dev Server settingsss
|
||||
host: "192.168.31.35", // can be overwritten by process.env.HOST
|
||||
port: 3000, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
|
||||
autoOpenBrowser: false,
|
||||
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,
|
||||
// If true, eslint errors and warnings will also be shown in the error overlay
|
||||
// in the browser.
|
||||
showEslintErrorsInOverlay: false,
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
// https://webpack.js.org/configuration/devtool/#development
|
||||
devtool: "cheap-module-eval-source-map",
|
||||
// If you have problems debugging vue-files in devtools,
|
||||
// set this to false - it *may* help
|
||||
// https://vue-loader.vuejs.org/en/options.html#cachebusting
|
||||
cacheBusting: true,
|
||||
cssSourceMap: true,
|
||||
disableHostCheck: true
|
||||
},
|
||||
plugins: [
|
||||
new FileManagerPlugin({
|
||||
events: {
|
||||
onEnd: {
|
||||
delete: ["./dist.rar"],
|
||||
archive: [{
|
||||
source: path.join(__dirname, "./dist"),
|
||||
destination: path.join(__dirname, "./dist.rar")
|
||||
}]
|
||||
}
|
||||
}
|
||||
})
|
||||
],
|
||||
build: {
|
||||
// Template for index.html
|
||||
index: path.resolve(__dirname, "../dist/index.html"),
|
||||
// Paths
|
||||
assetsRoot: path.resolve(__dirname, "../dist"),
|
||||
assetsSubDirectory: "static",
|
||||
assetsPublicPath: "../../",
|
||||
|
||||
/**
|
||||
* Source Maps
|
||||
*/
|
||||
productionSourceMap: true,
|
||||
// https://webpack.js.org/configuration/devtool/#production
|
||||
devtool: "#source-map",
|
||||
// Gzip off by default as many popular static hosts such as
|
||||
// Surge or Netlify already gzip all static assets for you.
|
||||
// Before setting to `true`, make sure to:
|
||||
// npm install --save-dev compression-webpack-plugin
|
||||
productionGzip: false,
|
||||
productionGzipExtensions: ["js", "css"],
|
||||
// Run the build command with an extra argument to
|
||||
// View the bundle analyzer report after build finishes:
|
||||
// `npm run build --report`
|
||||
// Set to `true` or `false` to always turn it on or off
|
||||
bundleAnalyzerReport: process.env.npm_config_report
|
||||
}
|
||||
};
|
||||
@ -0,0 +1,6 @@
|
||||
'use strict'
|
||||
module.exports = {
|
||||
NODE_ENV: '"production"',
|
||||
// baseURL:'https://zhuangcy.top:8000/api'
|
||||
baseURL:'https://www.decaisoft.com:8088/api'
|
||||
}
|
||||
@ -0,0 +1,7 @@
|
||||
'use strict'
|
||||
const merge = require('webpack-merge')
|
||||
const devEnv = require('./dev.env')
|
||||
|
||||
module.exports = merge(devEnv, {
|
||||
NODE_ENV: '"testing"'
|
||||
})
|
||||
|
After Width: | Height: | Size: 3.7 MiB |
|
After Width: | Height: | Size: 659 KiB |
|
After Width: | Height: | Size: 1.6 MiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 940 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 440 KiB |
|
After Width: | Height: | Size: 599 KiB |
|
After Width: | Height: | Size: 246 KiB |
@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<!-- 主入口 -->
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
||||
<meta base="/门店业务" />
|
||||
<!-- <link rel="icon" type="image/x-icon" href="http://demo.sc.chinaz.com/Files/pic/iconsico/5627/24.ico" /> -->
|
||||
<link rel="icon" type="image/x-icon" href="static/title.png" />
|
||||
<!-- <title>门店业务端</title> -->
|
||||
</head>
|
||||
<script
|
||||
type="text/javascript"
|
||||
src="//api.map.baidu.com/api?v=3.0&ak= OPfwfWopYoyhvGv50ST0DULf3tzvNXY1"
|
||||
></script>
|
||||
<!-- onselectstart="return false" -->
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
||||
@ -0,0 +1,10 @@
|
||||
import { service } from "./src/utils/service";
|
||||
import {localPath} from "./src/api/api.js"
|
||||
// 门店员工修改密码接口
|
||||
export function changePassword(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/changePassword",
|
||||
method: "post",
|
||||
data:params,
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,111 @@
|
||||
{
|
||||
"name": "vue",
|
||||
"version": "1.0.0",
|
||||
"description": "A Vue.js project",
|
||||
"author": "tangjunye <tangjunye@126.com>",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
|
||||
"start": "npm run dev",
|
||||
"unit": "jest --config test/unit/jest.conf.js --coverage",
|
||||
"e2e": "node test/e2e/runner.js",
|
||||
"test": "npm run unit && npm run e2e",
|
||||
"lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
|
||||
"build": "node build/build.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@riophae/vue-treeselect": "^0.4.0",
|
||||
"animate.css": "^3.5.1",
|
||||
"axios": "^0.27.2",
|
||||
"classlist-polyfill": "^1.2.0",
|
||||
"echarts": "^4.9.0",
|
||||
"element-resize-detector": "^1.2.1",
|
||||
"element-ui": "^2.13.2",
|
||||
"iview": "^3.5.4",
|
||||
"jquery": "^3.6.0",
|
||||
"qqmap": "^1.0.1",
|
||||
"qs": "^6.9.4",
|
||||
"serve": "^11.3.2",
|
||||
"sortablejs": "^1.10.2",
|
||||
"vue": "^2.5.2",
|
||||
"vue-axios": "^2.1.5",
|
||||
"vue-baidu-map": "^0.21.22",
|
||||
"vue-esign": "^1.0.5",
|
||||
"vue-print-nb": "^1.6.0",
|
||||
"vue-router": "^3.0.1",
|
||||
"vuex": "^3.5.1",
|
||||
"webpack-dev-server": "^2.9.7"
|
||||
},
|
||||
"devDependencies": {
|
||||
"autoprefixer": "^7.1.2",
|
||||
"babel-core": "^6.22.1",
|
||||
"babel-eslint": "^8.2.1",
|
||||
"babel-helper-vue-jsx-merge-props": "^2.0.3",
|
||||
"babel-jest": "^21.0.2",
|
||||
"babel-loader": "^7.1.1",
|
||||
"babel-plugin-dynamic-import-node": "^1.2.0",
|
||||
"babel-plugin-syntax-jsx": "^6.18.0",
|
||||
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
|
||||
"babel-plugin-transform-runtime": "^6.22.0",
|
||||
"babel-plugin-transform-vue-jsx": "^3.5.0",
|
||||
"babel-polyfill": "^6.26.0",
|
||||
"babel-preset-env": "^1.3.2",
|
||||
"babel-preset-stage-2": "^6.22.0",
|
||||
"babel-register": "^6.22.0",
|
||||
"chalk": "^2.0.1",
|
||||
"chromedriver": "^2.27.2",
|
||||
"cli": "^1.0.1",
|
||||
"copy-webpack-plugin": "^4.0.1",
|
||||
"cross-spawn": "^5.0.1",
|
||||
"css-loader": "^0.28.0",
|
||||
"es6-promise": "^4.2.8",
|
||||
"eslint": "^4.15.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-promise": "^3.4.0",
|
||||
"eslint-plugin-standard": "^3.0.1",
|
||||
"eslint-plugin-vue": "^4.0.0",
|
||||
"extract-text-webpack-plugin": "^3.0.0",
|
||||
"file-loader": "^1.1.4",
|
||||
"filemanager-webpack-plugin": "^7.0.0-beta.0",
|
||||
"friendly-errors-webpack-plugin": "^1.6.1",
|
||||
"html-webpack-plugin": "^2.30.1",
|
||||
"jest": "^22.0.4",
|
||||
"jest-serializer-vue": "^0.3.0",
|
||||
"nightwatch": "^0.9.12",
|
||||
"node-notifier": "^5.1.2",
|
||||
"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",
|
||||
"rimraf": "^2.6.0",
|
||||
"selenium-server": "^3.0.1",
|
||||
"semver": "^5.3.0",
|
||||
"shelljs": "^0.8.5",
|
||||
"uglifyjs-webpack-plugin": "^1.1.1",
|
||||
"url-loader": "^0.5.8",
|
||||
"vue-jest": "^1.0.2",
|
||||
"vue-loader": "^13.3.0",
|
||||
"vue-particles": "^1.0.9",
|
||||
"vue-style-loader": "^3.0.1",
|
||||
"vue-template-compiler": "^2.5.2",
|
||||
"webpack": "^3.12.0",
|
||||
"webpack-bundle-analyzer": "^2.9.0",
|
||||
"webpack-cli": "^4.2.0",
|
||||
"webpack-merge": "^4.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6.0.0",
|
||||
"npm": ">= 3.0.0"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not ie <= 8"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,2 @@
|
||||
import * as partten from "./partten.js";
|
||||
export { partten };
|
||||
@ -0,0 +1,73 @@
|
||||
export const phoneNum = /^((1)|(\\+861)|(861))[0-9]{10}$/;
|
||||
|
||||
export const email = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
|
||||
|
||||
// export const http = "https://www.decaisoft.com:443/";
|
||||
// export const https = "https://www.decaisoft.com:443/img";
|
||||
|
||||
export const http = "http://139.9.58.205:21/img/";
|
||||
export const https = "http://139.9.58.205:8077/tydFile/";
|
||||
|
||||
var month = "";
|
||||
if (new Date().getMonth() + 1 < 10) {
|
||||
month = "0" + (new Date().getMonth() + 1);
|
||||
} else {
|
||||
month = new Date().getMonth() + 1;
|
||||
dabao;
|
||||
}
|
||||
|
||||
var day = "";
|
||||
if (new Date().getDate() < 10) {
|
||||
day = "0" + new Date().getDate();
|
||||
} else {
|
||||
day = new Date().getDate();
|
||||
}
|
||||
|
||||
var hours = "";
|
||||
if (new Date().getHours() < 10) {
|
||||
hours = "0" + new Date().getHours();
|
||||
} else {
|
||||
hours = new Date().getHours();
|
||||
}
|
||||
|
||||
var Min = null;
|
||||
if (new Date().getMinutes() < 10) {
|
||||
Min = "0" + new Date().getMinutes();
|
||||
} else {
|
||||
Min = new Date().getMinutes();
|
||||
}
|
||||
var seconds = null;
|
||||
if (new Date().getSeconds() < 10) {
|
||||
seconds = "0" + new Date().getSeconds();
|
||||
} else {
|
||||
seconds = new Date().getSeconds();
|
||||
}
|
||||
|
||||
export const date =
|
||||
new Date().getFullYear() +
|
||||
"" +
|
||||
month +
|
||||
"" +
|
||||
day +
|
||||
"" +
|
||||
hours +
|
||||
"" +
|
||||
Min +
|
||||
"" +
|
||||
seconds;
|
||||
export const dates =
|
||||
new Date().getFullYear() +
|
||||
"/" +
|
||||
month +
|
||||
"/" +
|
||||
day +
|
||||
" " +
|
||||
hours +
|
||||
":" +
|
||||
Min +
|
||||
":" +
|
||||
seconds;
|
||||
|
||||
export const dayStatisticDate =
|
||||
new Date().getFullYear() + "-" + month + "-" + new Date().getDate();
|
||||
export const months = new Date().getFullYear() + "-" + month + "";
|
||||
@ -0,0 +1,635 @@
|
||||
|
||||
{
|
||||
"header": {
|
||||
"reportVersion": 1,
|
||||
"event": "Allocation failed - JavaScript heap out of memory",
|
||||
"trigger": "FatalError",
|
||||
"filename": "report.20201021.163657.16548.0.001.json",
|
||||
"dumpEventTime": "2020-10-21T16:36:57Z",
|
||||
"dumpEventTimeStamp": "1603269417097",
|
||||
"processId": 16548,
|
||||
"cwd": "G:\\Code\\门店业务",
|
||||
"commandLine": [
|
||||
"node",
|
||||
"G:\\Code\\门店业务\\node_modules\\.bin\\\\..\\_webpack-dev-server@2.9.7@webpack-dev-server\\bin\\webpack-dev-server.js",
|
||||
"--inline",
|
||||
"--progress",
|
||||
"--config",
|
||||
"build/webpack.dev.conf.js",
|
||||
"--open"
|
||||
],
|
||||
"nodejsVersion": "v12.13.0",
|
||||
"wordSize": 64,
|
||||
"arch": "x64",
|
||||
"platform": "win32",
|
||||
"componentVersions": {
|
||||
"node": "12.13.0",
|
||||
"v8": "7.7.299.13-node.12",
|
||||
"uv": "1.32.0",
|
||||
"zlib": "1.2.11",
|
||||
"brotli": "1.0.7",
|
||||
"ares": "1.15.0",
|
||||
"modules": "72",
|
||||
"nghttp2": "1.39.2",
|
||||
"napi": "5",
|
||||
"llhttp": "1.1.4",
|
||||
"http_parser": "2.8.0",
|
||||
"openssl": "1.1.1d",
|
||||
"cldr": "35.1",
|
||||
"icu": "64.2",
|
||||
"tz": "2019a",
|
||||
"unicode": "12.1"
|
||||
},
|
||||
"release": {
|
||||
"name": "node",
|
||||
"lts": "Erbium",
|
||||
"headersUrl": "https://nodejs.org/download/release/v12.13.0/node-v12.13.0-headers.tar.gz",
|
||||
"sourceUrl": "https://nodejs.org/download/release/v12.13.0/node-v12.13.0.tar.gz",
|
||||
"libUrl": "https://nodejs.org/download/release/v12.13.0/win-x64/node.lib"
|
||||
},
|
||||
"osName": "Windows_NT",
|
||||
"osRelease": "10.0.18363",
|
||||
"osVersion": "Windows 10 Pro",
|
||||
"osMachine": "x86_64",
|
||||
"cpus": [
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 13069515,
|
||||
"nice": 0,
|
||||
"sys": 10645296,
|
||||
"idle": 337333765,
|
||||
"irq": 2128921
|
||||
},
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 26383687,
|
||||
"nice": 0,
|
||||
"sys": 11775968,
|
||||
"idle": 322888671,
|
||||
"irq": 124078
|
||||
},
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 19936359,
|
||||
"nice": 0,
|
||||
"sys": 9256343,
|
||||
"idle": 331855609,
|
||||
"irq": 116578
|
||||
},
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 20426781,
|
||||
"nice": 0,
|
||||
"sys": 8916140,
|
||||
"idle": 331705406,
|
||||
"irq": 99109
|
||||
},
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 17327500,
|
||||
"nice": 0,
|
||||
"sys": 7311734,
|
||||
"idle": 336409093,
|
||||
"irq": 89406
|
||||
},
|
||||
{
|
||||
"model": "Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz",
|
||||
"speed": 2808,
|
||||
"user": 17512812,
|
||||
"nice": 0,
|
||||
"sys": 8407140,
|
||||
"idle": 335128359,
|
||||
"irq": 88703
|
||||
}
|
||||
],
|
||||
"networkInterfaces": [
|
||||
{
|
||||
"name": "以太网",
|
||||
"internal": false,
|
||||
"mac": "04:d4:c4:04:2e:50",
|
||||
"address": "fe80::9033:450c:efcd:4d4d",
|
||||
"netmask": "ffff:ffff:ffff:ffff::",
|
||||
"family": "IPv6",
|
||||
"scopeid": 13
|
||||
},
|
||||
{
|
||||
"name": "以太网",
|
||||
"internal": false,
|
||||
"mac": "04:d4:c4:04:2e:50",
|
||||
"address": "192.168.31.193",
|
||||
"netmask": "255.255.255.0",
|
||||
"family": "IPv4"
|
||||
},
|
||||
{
|
||||
"name": "Loopback Pseudo-Interface 1",
|
||||
"internal": true,
|
||||
"mac": "00:00:00:00:00:00",
|
||||
"address": "::1",
|
||||
"netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
|
||||
"family": "IPv6",
|
||||
"scopeid": 0
|
||||
},
|
||||
{
|
||||
"name": "Loopback Pseudo-Interface 1",
|
||||
"internal": true,
|
||||
"mac": "00:00:00:00:00:00",
|
||||
"address": "127.0.0.1",
|
||||
"netmask": "255.0.0.0",
|
||||
"family": "IPv4"
|
||||
}
|
||||
],
|
||||
"host": "CCN-20190524YLC"
|
||||
},
|
||||
"javascriptStack": {
|
||||
"message": "No stack.",
|
||||
"stack": [
|
||||
"Unavailable."
|
||||
]
|
||||
},
|
||||
"nativeStack": [
|
||||
{
|
||||
"pc": "0x00007ff6db451389",
|
||||
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+10873"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6db4557cc",
|
||||
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+28348"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6db454778",
|
||||
"symbol": "std::basic_ostream<char,std::char_traits<char> >::operator<<+24168"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6db54332b",
|
||||
"symbol": "v8::base::CPU::has_sse+37723"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbd46f4e",
|
||||
"symbol": "v8::Isolate::ReportExternalAllocationLimitReached+94"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbd2ef91",
|
||||
"symbol": "v8::SharedArrayBuffer::Externalize+833"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbbfc85c",
|
||||
"symbol": "v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1436"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbc07c00",
|
||||
"symbol": "v8::internal::Heap::ProtectUnprotectedMemoryChunks+1312"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbc04734",
|
||||
"symbol": "v8::internal::Heap::PageFlagsAreConsistent+3204"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbbf9fc3",
|
||||
"symbol": "v8::internal::Heap::CollectGarbage+1283"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbbf8794",
|
||||
"symbol": "v8::internal::Heap::AddRetainedMap+2356"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dbc19a65",
|
||||
"symbol": "v8::internal::Factory::NewFillerObject+53"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6db986239",
|
||||
"symbol": "v8::internal::interpreter::JumpTableTargetOffsets::iterator::operator=+4057"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dc172c6d",
|
||||
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+567949"
|
||||
},
|
||||
{
|
||||
"pc": "0x00007ff6dc173ba1",
|
||||
"symbol": "v8::internal::SetupIsolateDelegate::SetupHeap+571841"
|
||||
},
|
||||
{
|
||||
"pc": "0x000002bb0fa13c14",
|
||||
"symbol": ""
|
||||
}
|
||||
],
|
||||
"javascriptHeap": {
|
||||
"totalMemory": 2165219328,
|
||||
"totalCommittedMemory": 2165219328,
|
||||
"usedMemory": 1963335664,
|
||||
"availableMemory": 118413840,
|
||||
"memoryLimit": 2197815296,
|
||||
"heapSpaces": {
|
||||
"read_only_space": {
|
||||
"memorySize": 262144,
|
||||
"committedMemory": 262144,
|
||||
"capacity": 261872,
|
||||
"used": 32296,
|
||||
"available": 229576
|
||||
},
|
||||
"new_space": {
|
||||
"memorySize": 33554432,
|
||||
"committedMemory": 33554432,
|
||||
"capacity": 16759808,
|
||||
"used": 2745368,
|
||||
"available": 14014440
|
||||
},
|
||||
"old_space": {
|
||||
"memorySize": 1869983744,
|
||||
"committedMemory": 1869983744,
|
||||
"capacity": 1758637896,
|
||||
"used": 1703823848,
|
||||
"available": 54814048
|
||||
},
|
||||
"code_space": {
|
||||
"memorySize": 3309568,
|
||||
"committedMemory": 3309568,
|
||||
"capacity": 2705792,
|
||||
"used": 2705792,
|
||||
"available": 0
|
||||
},
|
||||
"map_space": {
|
||||
"memorySize": 5246976,
|
||||
"committedMemory": 5246976,
|
||||
"capacity": 2134240,
|
||||
"used": 2134240,
|
||||
"available": 0
|
||||
},
|
||||
"large_object_space": {
|
||||
"memorySize": 251944960,
|
||||
"committedMemory": 251944960,
|
||||
"capacity": 251064936,
|
||||
"used": 251064936,
|
||||
"available": 0
|
||||
},
|
||||
"code_large_object_space": {
|
||||
"memorySize": 917504,
|
||||
"committedMemory": 917504,
|
||||
"capacity": 829184,
|
||||
"used": 829184,
|
||||
"available": 0
|
||||
},
|
||||
"new_large_object_space": {
|
||||
"memorySize": 0,
|
||||
"committedMemory": 0,
|
||||
"capacity": 16759808,
|
||||
"used": 0,
|
||||
"available": 16759808
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceUsage": {
|
||||
"userCpuSeconds": 1554.44,
|
||||
"kernelCpuSeconds": 441.937,
|
||||
"cpuConsumptionPercent": 7.94103,
|
||||
"maxRss": 3370020864,
|
||||
"pageFaults": {
|
||||
"IORequired": 22357184,
|
||||
"IONotRequired": 0
|
||||
},
|
||||
"fsActivity": {
|
||||
"reads": 6755,
|
||||
"writes": 6
|
||||
}
|
||||
},
|
||||
"libuv": [
|
||||
],
|
||||
"environmentVariables": {
|
||||
"": "C:=C:\\",
|
||||
"": "G:=G:\\Code\\门店业务",
|
||||
"ALLUSERSPROFILE": "C:\\ProgramData",
|
||||
"APPDATA": "C:\\Users\\Administrator\\AppData\\Roaming",
|
||||
"CHROME_CRASHPAD_PIPE_NAME": "\\\\.\\pipe\\crashpad_1684_XWMAMZFAIGVPTHWP",
|
||||
"CLASSPATH": ".;C:\\Program Files\\Java\\jdk1.8.0_91\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.8.0_91\\lib\\tools.jar;",
|
||||
"COLORTERM": "truecolor",
|
||||
"CommonProgramFiles": "C:\\Program Files\\Common Files",
|
||||
"CommonProgramFiles(x86)": "C:\\Program Files (x86)\\Common Files",
|
||||
"CommonProgramW6432": "C:\\Program Files\\Common Files",
|
||||
"COMPUTERNAME": "CCN-20190524YLC",
|
||||
"ComSpec": "C:\\WINDOWS\\system32\\cmd.exe",
|
||||
"DOCKER_HOST": "tcp://192.168.198.130:2375",
|
||||
"dp0": "G:\\Code\\门店业务\\node_modules\\.bin\\",
|
||||
"DriverData": "C:\\Windows\\System32\\Drivers\\DriverData",
|
||||
"FPS_BROWSER_APP_PROFILE_STRING": "Internet Explorer",
|
||||
"FPS_BROWSER_USER_PROFILE_STRING": "Default",
|
||||
"GROOVY_HOME": "D:\\javatools\\groovy-2.5.8",
|
||||
"HOME": "C:\\Users\\Administrator",
|
||||
"HOMEDRIVE": "C:",
|
||||
"HOMEPATH": "\\Users\\Administrator",
|
||||
"INIT_CWD": "G:\\Code\\门店业务",
|
||||
"JAVA_HOME": "C:\\Program Files\\Java\\jdk1.8.0_91",
|
||||
"LANG": "zh_CN.UTF-8",
|
||||
"LOCALAPPDATA": "C:\\Users\\Administrator\\AppData\\Local",
|
||||
"LOGONSERVER": "\\\\CCN-20190524YLC",
|
||||
"MAVEN_HOME": "E:\\apache-maven-3.5.2-bin\\apache-maven-3.5.2",
|
||||
"MAVEN_OPTS": "-Xms128m -Xmx512m",
|
||||
"NODE": "E:\\soft\\nodejs\\node.exe",
|
||||
"NODE_ENV": "development",
|
||||
"NODE_PATH": "E:\\soft\\nodejs\\node_modules",
|
||||
"npm_config_access": "",
|
||||
"npm_config_allow_same_version": "",
|
||||
"npm_config_also": "",
|
||||
"npm_config_always_auth": "",
|
||||
"npm_config_argv": "{\"remain\":[],\"cooked\":[\"--userconfig\",\"C:\\\\Users\\\\Administrator\\\\.cnpmrc\",\"--disturl\",\"https://npm.taobao.org/mirrors/node\",\"--registry\",\"https://r.npm.taobao.org\",\"run\",\"dev\"],\"original\":[\"--userconfig=C:\\\\Users\\\\Administrator\\\\.cnpmrc\",\"--disturl=https://npm.taobao.org/mirrors/node\",\"--registry=https://r.npm.taobao.org\",\"run\",\"dev\"]}",
|
||||
"npm_config_audit": "true",
|
||||
"npm_config_audit_level": "low",
|
||||
"npm_config_auth_type": "legacy",
|
||||
"npm_config_before": "",
|
||||
"npm_config_bin_links": "true",
|
||||
"npm_config_browser": "",
|
||||
"npm_config_ca": "",
|
||||
"npm_config_cache": "C:\\Users\\Administrator\\AppData\\Roaming\\npm-cache",
|
||||
"npm_config_cache_lock_retries": "10",
|
||||
"npm_config_cache_lock_stale": "60000",
|
||||
"npm_config_cache_lock_wait": "10000",
|
||||
"npm_config_cache_max": "Infinity",
|
||||
"npm_config_cache_min": "10",
|
||||
"npm_config_cafile": "",
|
||||
"npm_config_cert": "",
|
||||
"npm_config_cidr": "",
|
||||
"npm_config_color": "true",
|
||||
"npm_config_commit_hooks": "true",
|
||||
"npm_config_depth": "Infinity",
|
||||
"npm_config_description": "true",
|
||||
"npm_config_dev": "",
|
||||
"npm_config_disturl": "https://npm.taobao.org/mirrors/node",
|
||||
"npm_config_dry_run": "",
|
||||
"npm_config_editor": "notepad.exe",
|
||||
"npm_config_engine_strict": "",
|
||||
"npm_config_fetch_retries": "2",
|
||||
"npm_config_fetch_retry_factor": "10",
|
||||
"npm_config_fetch_retry_maxtimeout": "60000",
|
||||
"npm_config_fetch_retry_mintimeout": "10000",
|
||||
"npm_config_force": "",
|
||||
"npm_config_format_package_lock": "true",
|
||||
"npm_config_fund": "true",
|
||||
"npm_config_git": "git",
|
||||
"npm_config_git_tag_version": "true",
|
||||
"npm_config_global": "",
|
||||
"npm_config_globalconfig": "E:\\soft\\nodejs\\etc\\npmrc",
|
||||
"npm_config_globalignorefile": "E:\\soft\\nodejs\\etc\\npmignore",
|
||||
"npm_config_global_style": "",
|
||||
"npm_config_group": "",
|
||||
"npm_config_ham_it_up": "",
|
||||
"npm_config_heading": "npm",
|
||||
"npm_config_https_proxy": "",
|
||||
"npm_config_if_present": "",
|
||||
"npm_config_ignore_prepublish": "",
|
||||
"npm_config_ignore_scripts": "",
|
||||
"npm_config_init_author_email": "",
|
||||
"npm_config_init_author_name": "",
|
||||
"npm_config_init_author_url": "",
|
||||
"npm_config_init_license": "ISC",
|
||||
"npm_config_init_module": "C:\\Users\\Administrator\\.npm-init.js",
|
||||
"npm_config_init_version": "1.0.0",
|
||||
"npm_config_json": "",
|
||||
"npm_config_key": "",
|
||||
"npm_config_legacy_bundling": "",
|
||||
"npm_config_link": "",
|
||||
"npm_config_local_address": "",
|
||||
"npm_config_loglevel": "notice",
|
||||
"npm_config_logs_max": "10",
|
||||
"npm_config_long": "",
|
||||
"npm_config_maxsockets": "50",
|
||||
"npm_config_message": "%s",
|
||||
"npm_config_metrics_registry": "https://r.npm.taobao.org/",
|
||||
"npm_config_node_gyp": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js",
|
||||
"npm_config_node_options": "",
|
||||
"npm_config_node_version": "12.13.0",
|
||||
"npm_config_noproxy": "",
|
||||
"npm_config_offline": "",
|
||||
"npm_config_onload_script": "",
|
||||
"npm_config_only": "",
|
||||
"npm_config_optional": "true",
|
||||
"npm_config_otp": "",
|
||||
"npm_config_package_lock": "true",
|
||||
"npm_config_package_lock_only": "",
|
||||
"npm_config_parseable": "",
|
||||
"npm_config_prefer_offline": "",
|
||||
"npm_config_prefer_online": "",
|
||||
"npm_config_prefix": "E:\\soft\\nodejs",
|
||||
"npm_config_preid": "",
|
||||
"npm_config_production": "",
|
||||
"npm_config_progress": "true",
|
||||
"npm_config_proxy": "",
|
||||
"npm_config_read_only": "",
|
||||
"npm_config_rebuild_bundle": "true",
|
||||
"npm_config_registry": "https://r.npm.taobao.org/",
|
||||
"npm_config_rollback": "true",
|
||||
"npm_config_save": "true",
|
||||
"npm_config_save_bundle": "",
|
||||
"npm_config_save_dev": "",
|
||||
"npm_config_save_exact": "",
|
||||
"npm_config_save_optional": "",
|
||||
"npm_config_save_prefix": "^",
|
||||
"npm_config_save_prod": "",
|
||||
"npm_config_scope": "",
|
||||
"npm_config_scripts_prepend_node_path": "warn-only",
|
||||
"npm_config_script_shell": "",
|
||||
"npm_config_searchexclude": "",
|
||||
"npm_config_searchlimit": "20",
|
||||
"npm_config_searchopts": "",
|
||||
"npm_config_searchstaleness": "900",
|
||||
"npm_config_send_metrics": "",
|
||||
"npm_config_shell": "C:\\WINDOWS\\system32\\cmd.exe",
|
||||
"npm_config_shrinkwrap": "true",
|
||||
"npm_config_sign_git_commit": "",
|
||||
"npm_config_sign_git_tag": "",
|
||||
"npm_config_sso_poll_frequency": "500",
|
||||
"npm_config_sso_type": "oauth",
|
||||
"npm_config_strict_ssl": "true",
|
||||
"npm_config_tag": "latest",
|
||||
"npm_config_tag_version_prefix": "v",
|
||||
"npm_config_timing": "",
|
||||
"npm_config_tmp": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
|
||||
"npm_config_umask": "0000",
|
||||
"npm_config_unicode": "",
|
||||
"npm_config_unsafe_perm": "true",
|
||||
"npm_config_update_notifier": "true",
|
||||
"npm_config_usage": "",
|
||||
"npm_config_user": "",
|
||||
"npm_config_userconfig": "C:\\Users\\Administrator\\.cnpmrc",
|
||||
"npm_config_user_agent": "npm/6.14.5 node/v12.13.0 win32 x64",
|
||||
"npm_config_version": "",
|
||||
"npm_config_versions": "",
|
||||
"npm_config_viewer": "browser",
|
||||
"npm_execpath": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\bin\\npm-cli.js",
|
||||
"npm_lifecycle_event": "dev",
|
||||
"npm_lifecycle_script": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --open",
|
||||
"npm_node_execpath": "E:\\soft\\nodejs\\node.exe",
|
||||
"npm_package_author_email": "tangjunye@126.com",
|
||||
"npm_package_author_name": "tangjunye",
|
||||
"npm_package_browserslist_0": "> 1%",
|
||||
"npm_package_browserslist_1": "last 2 versions",
|
||||
"npm_package_browserslist_2": "not ie <= 8",
|
||||
"npm_package_dependencies_axios": "^0.19.2",
|
||||
"npm_package_dependencies_classlist_polyfill": "^1.2.0",
|
||||
"npm_package_dependencies_echarts": "^4.8.0",
|
||||
"npm_package_dependencies_element_resize_detector": "^1.2.1",
|
||||
"npm_package_dependencies_element_ui": "^2.13.2",
|
||||
"npm_package_dependencies_jquery": "^3.5.1",
|
||||
"npm_package_dependencies_qs": "^6.9.4",
|
||||
"npm_package_dependencies_sortablejs": "^1.10.2",
|
||||
"npm_package_dependencies_vue": "^2.5.2",
|
||||
"npm_package_dependencies_vuex": "^3.5.1",
|
||||
"npm_package_dependencies_vue_axios": "^2.1.5",
|
||||
"npm_package_dependencies_vue_baidu_map": "^0.21.22",
|
||||
"npm_package_dependencies_vue_print_nb": "^1.5.0",
|
||||
"npm_package_dependencies_vue_router": "^3.0.1",
|
||||
"npm_package_description": "A Vue.js project",
|
||||
"npm_package_devDependencies_autoprefixer": "^7.1.2",
|
||||
"npm_package_devDependencies_babel_core": "^6.22.1",
|
||||
"npm_package_devDependencies_babel_eslint": "^8.2.1",
|
||||
"npm_package_devDependencies_babel_helper_vue_jsx_merge_props": "^2.0.3",
|
||||
"npm_package_devDependencies_babel_jest": "^21.0.2",
|
||||
"npm_package_devDependencies_babel_loader": "^7.1.1",
|
||||
"npm_package_devDependencies_babel_plugin_dynamic_import_node": "^1.2.0",
|
||||
"npm_package_devDependencies_babel_plugin_syntax_jsx": "^6.18.0",
|
||||
"npm_package_devDependencies_babel_plugin_transform_es2015_modules_commonjs": "^6.26.0",
|
||||
"npm_package_devDependencies_babel_plugin_transform_runtime": "^6.22.0",
|
||||
"npm_package_devDependencies_babel_plugin_transform_vue_jsx": "^3.5.0",
|
||||
"npm_package_devDependencies_babel_polyfill": "^6.26.0",
|
||||
"npm_package_devDependencies_babel_preset_env": "^1.3.2",
|
||||
"npm_package_devDependencies_babel_preset_stage_2": "^6.22.0",
|
||||
"npm_package_devDependencies_babel_register": "^6.22.0",
|
||||
"npm_package_devDependencies_chalk": "^2.0.1",
|
||||
"npm_package_devDependencies_chromedriver": "^2.27.2",
|
||||
"npm_package_devDependencies_cli": "^1.0.1",
|
||||
"npm_package_devDependencies_copy_webpack_plugin": "^4.0.1",
|
||||
"npm_package_devDependencies_cross_spawn": "^5.0.1",
|
||||
"npm_package_devDependencies_css_loader": "^0.28.0",
|
||||
"npm_package_devDependencies_es6_promise": "^4.2.8",
|
||||
"npm_package_devDependencies_eslint": "^4.15.0",
|
||||
"npm_package_devDependencies_eslint_config_standard": "^10.2.1",
|
||||
"npm_package_devDependencies_eslint_friendly_formatter": "^3.0.0",
|
||||
"npm_package_devDependencies_eslint_loader": "^1.7.1",
|
||||
"npm_package_devDependencies_eslint_plugin_import": "^2.7.0",
|
||||
"npm_package_devDependencies_eslint_plugin_node": "^5.2.0",
|
||||
"npm_package_devDependencies_eslint_plugin_promise": "^3.4.0",
|
||||
"npm_package_devDependencies_eslint_plugin_standard": "^3.0.1",
|
||||
"npm_package_devDependencies_eslint_plugin_vue": "^4.0.0",
|
||||
"npm_package_devDependencies_extract_text_webpack_plugin": "^3.0.0",
|
||||
"npm_package_devDependencies_file_loader": "^1.1.4",
|
||||
"npm_package_devDependencies_friendly_errors_webpack_plugin": "^1.6.1",
|
||||
"npm_package_devDependencies_html_webpack_plugin": "^2.30.1",
|
||||
"npm_package_devDependencies_jest": "^22.0.4",
|
||||
"npm_package_devDependencies_jest_serializer_vue": "^0.3.0",
|
||||
"npm_package_devDependencies_nightwatch": "^0.9.12",
|
||||
"npm_package_devDependencies_node_notifier": "^5.1.2",
|
||||
"npm_package_devDependencies_optimize_css_assets_webpack_plugin": "^3.2.0",
|
||||
"npm_package_devDependencies_ora": "^1.2.0",
|
||||
"npm_package_devDependencies_portfinder": "^1.0.13",
|
||||
"npm_package_devDependencies_postcss_import": "^11.0.0",
|
||||
"npm_package_devDependencies_postcss_loader": "^2.0.8",
|
||||
"npm_package_devDependencies_postcss_url": "^7.2.1",
|
||||
"npm_package_devDependencies_rimraf": "^2.6.0",
|
||||
"npm_package_devDependencies_selenium_server": "^3.0.1",
|
||||
"npm_package_devDependencies_semver": "^5.3.0",
|
||||
"npm_package_devDependencies_shelljs": "^0.7.6",
|
||||
"npm_package_devDependencies_uglifyjs_webpack_plugin": "^1.1.1",
|
||||
"npm_package_devDependencies_url_loader": "^0.5.8",
|
||||
"npm_package_devDependencies_vue_jest": "^1.0.2",
|
||||
"npm_package_devDependencies_vue_loader": "^13.3.0",
|
||||
"npm_package_devDependencies_vue_particles": "^1.0.9",
|
||||
"npm_package_devDependencies_vue_style_loader": "^3.0.1",
|
||||
"npm_package_devDependencies_vue_template_compiler": "^2.5.2",
|
||||
"npm_package_devDependencies_webpack": "^3.12.0",
|
||||
"npm_package_devDependencies_webpack_bundle_analyzer": "^2.9.0",
|
||||
"npm_package_devDependencies_webpack_merge": "^4.1.0",
|
||||
"npm_package_engines_node": ">= 6.0.0",
|
||||
"npm_package_engines_npm": ">= 3.0.0",
|
||||
"npm_package_gitHead": "b8daba77e6f80ba98e7cbf48233ab0eb89cab926",
|
||||
"npm_package_name": "vue",
|
||||
"npm_package_private": "true",
|
||||
"npm_package_readmeFilename": "README.md",
|
||||
"npm_package_scripts_build": "node build/build.js",
|
||||
"npm_package_scripts_dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --open",
|
||||
"npm_package_scripts_e2e": "node test/e2e/runner.js",
|
||||
"npm_package_scripts_lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
|
||||
"npm_package_scripts_start": "npm run dev",
|
||||
"npm_package_scripts_test": "npm run unit && npm run e2e",
|
||||
"npm_package_scripts_unit": "jest --config test/unit/jest.conf.js --coverage",
|
||||
"npm_package_version": "1.0.0",
|
||||
"NUMBER_OF_PROCESSORS": "6",
|
||||
"OneDrive": "C:\\Users\\Administrator\\OneDrive",
|
||||
"ORIGINAL_XDG_CURRENT_DESKTOP": "undefined",
|
||||
"OS": "Windows_NT",
|
||||
"Path": "E:\\soft\\nodejs\\node_global\\node_modules\\cnpm\\node_modules\\npm\\node_modules\\npm-lifecycle\\node-gyp-bin;G:\\Code\\门店业务\\node_modules\\.bin;C:\\ProgramData\\Oracle\\Java\\javapath;E:\\app\\Administrator\\product\\11.2.0\\dbhome_1\\bin;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files (x86)\\Cesoft\\Excel Server2010;C:\\Program Files\\Java\\jdk1.8.0_91\\bin;D:\\javatools\\groovy-2.5.8\\bin;D:\\TortoiseSVN\\bin;E:\\soft\\nodejs\\;C:\\Program Files (x86)\\Cesoft\\Excel Server2010;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Program Files\\Java\\jdk1.8.0_91\\bin;C:\\Program Files\\Java\\jdk1.8.0_91\\jre\\bin;E:\\apache-maven-3.5.2-bin\\apache-maven-3.5.2\\bin;E:\\Program Files\\MySQL\\MySQL Server 5.7\\bin;E:\\soft\\nodejs\\node_global;;D:\\ssh;D:\\Microsoft VS Code\\bin;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps",
|
||||
"PATHEXT": ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JSE;.WSF;.WSH;.MSC;.CPL",
|
||||
"PORT": "3000",
|
||||
"PROCESSOR_ARCHITECTURE": "AMD64",
|
||||
"PROCESSOR_IDENTIFIER": "Intel64 Family 6 Model 158 Stepping 10, GenuineIntel",
|
||||
"PROCESSOR_LEVEL": "6",
|
||||
"PROCESSOR_REVISION": "9e0a",
|
||||
"ProgramData": "C:\\ProgramData",
|
||||
"ProgramFiles": "C:\\Program Files",
|
||||
"ProgramFiles(x86)": "C:\\Program Files (x86)",
|
||||
"ProgramW6432": "C:\\Program Files",
|
||||
"PROMPT": "$P$G",
|
||||
"PSModulePath": "E:\\360MoveData\\Users\\Administrator\\Documents\\WindowsPowerShell\\Modules;C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules",
|
||||
"PUBLIC": "C:\\Users\\Public",
|
||||
"SESSIONNAME": "Console",
|
||||
"SystemDrive": "C:",
|
||||
"SystemRoot": "C:\\WINDOWS",
|
||||
"TEMP": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
|
||||
"TERM_PROGRAM": "vscode",
|
||||
"TERM_PROGRAM_VERSION": "1.50.1",
|
||||
"TMP": "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp",
|
||||
"USERDOMAIN": "CCN-20190524YLC",
|
||||
"USERDOMAIN_ROAMINGPROFILE": "CCN-20190524YLC",
|
||||
"USERNAME": "Administrator",
|
||||
"USERPROFILE": "C:\\Users\\Administrator",
|
||||
"windir": "C:\\WINDOWS",
|
||||
"_prog": "node"
|
||||
},
|
||||
"sharedObjects": [
|
||||
"E:\\soft\\nodejs\\node.exe",
|
||||
"C:\\WINDOWS\\SYSTEM32\\ntdll.dll",
|
||||
"C:\\WINDOWS\\System32\\KERNEL32.DLL",
|
||||
"C:\\WINDOWS\\System32\\KERNELBASE.dll",
|
||||
"C:\\WINDOWS\\System32\\WS2_32.dll",
|
||||
"C:\\WINDOWS\\System32\\RPCRT4.dll",
|
||||
"C:\\WINDOWS\\System32\\ADVAPI32.dll",
|
||||
"C:\\WINDOWS\\System32\\msvcrt.dll",
|
||||
"C:\\WINDOWS\\System32\\sechost.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\dbghelp.dll",
|
||||
"C:\\WINDOWS\\System32\\USER32.dll",
|
||||
"C:\\WINDOWS\\System32\\ucrtbase.dll",
|
||||
"C:\\WINDOWS\\System32\\win32u.dll",
|
||||
"C:\\WINDOWS\\System32\\GDI32.dll",
|
||||
"C:\\WINDOWS\\System32\\gdi32full.dll",
|
||||
"C:\\WINDOWS\\System32\\msvcp_win.dll",
|
||||
"C:\\WINDOWS\\System32\\PSAPI.DLL",
|
||||
"C:\\WINDOWS\\System32\\CRYPT32.dll",
|
||||
"C:\\WINDOWS\\System32\\MSASN1.dll",
|
||||
"C:\\WINDOWS\\System32\\bcrypt.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\IPHLPAPI.DLL",
|
||||
"C:\\WINDOWS\\SYSTEM32\\USERENV.dll",
|
||||
"C:\\WINDOWS\\System32\\profapi.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\WINMM.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\WINMMBASE.dll",
|
||||
"C:\\WINDOWS\\System32\\cfgmgr32.dll",
|
||||
"C:\\WINDOWS\\System32\\bcryptPrimitives.dll",
|
||||
"C:\\WINDOWS\\System32\\IMM32.DLL",
|
||||
"C:\\WINDOWS\\System32\\powrprof.dll",
|
||||
"C:\\WINDOWS\\System32\\UMPDC.dll",
|
||||
"C:\\WINDOWS\\system32\\uxtheme.dll",
|
||||
"C:\\WINDOWS\\System32\\combase.dll",
|
||||
"C:\\WINDOWS\\system32\\mswsock.dll",
|
||||
"C:\\WINDOWS\\System32\\kernel.appcore.dll",
|
||||
"C:\\WINDOWS\\System32\\NSI.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\dhcpcsvc6.DLL",
|
||||
"C:\\WINDOWS\\SYSTEM32\\dhcpcsvc.DLL",
|
||||
"C:\\WINDOWS\\SYSTEM32\\DNSAPI.dll",
|
||||
"C:\\WINDOWS\\SYSTEM32\\CRYPTBASE.DLL",
|
||||
"C:\\WINDOWS\\system32\\napinsp.dll",
|
||||
"C:\\WINDOWS\\system32\\pnrpnsp.dll",
|
||||
"C:\\WINDOWS\\System32\\winrnr.dll",
|
||||
"C:\\WINDOWS\\system32\\NLAapi.dll",
|
||||
"C:\\WINDOWS\\system32\\wshbth.dll"
|
||||
]
|
||||
}
|
||||
@ -0,0 +1,165 @@
|
||||
import { service } from "../utils/service";
|
||||
|
||||
// 添加员工排班上钟
|
||||
export function addServiceOrder(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 员工排班下钟
|
||||
export function downServiceOrder(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/down",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 查询全部员工排班
|
||||
export function serviceOrderList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/list",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 查询全部员工排班其他状态
|
||||
export function serviceOrderLists(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/lists",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 修改员工排班上钟顺序
|
||||
export function editServiceOrder(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 添加服务单据(结算)
|
||||
export function addStoreSettlement(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 修改服务中单据
|
||||
export function ediStoreSettlement(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 添加服务单据(结算)
|
||||
|
||||
export function addServiceOrders(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrders/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
//删除服务项目
|
||||
export function delStoreSettlement(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/detele",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 结算服务
|
||||
export function cancelServiceOrders(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrders/cancel",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 修改
|
||||
export function editServiceOrders(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrders/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 查询历史单据(按月)
|
||||
|
||||
export function pageServiceOrders(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrders/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//上钟
|
||||
export function updateTime(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/updateTime",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//下钟
|
||||
export function updateTimeX(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/updateTimeX",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//退房
|
||||
export function checkOut(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/checkOut",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//换房
|
||||
export function roomChange(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeSettlement/roomChange",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//房间状态
|
||||
export function roomSatet(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeRoom/roomSatet",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
// 修改员工排班上钟顺序
|
||||
}
|
||||
export function stateServiceOrder(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 修改员工状态
|
||||
export function editsServiceOrder(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/serviceOrder/updates",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,26 @@
|
||||
import {
|
||||
service
|
||||
} from "../utils/service";
|
||||
import {
|
||||
localPath
|
||||
} from "./api.js"
|
||||
|
||||
|
||||
|
||||
|
||||
// 新店注册
|
||||
export function addStore(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/store/addStore",
|
||||
method: "post",
|
||||
data:params,
|
||||
});
|
||||
}
|
||||
//获取手机号验证码
|
||||
export function getphonecode(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/login/getSmsCode",
|
||||
method: "post",
|
||||
data: params,
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,44 @@
|
||||
import { service } from "../utils/service";
|
||||
import { localPath } from "./api.js"
|
||||
|
||||
|
||||
// 促销活动单添加 (门店端-促销活动单-促销活动单添加)
|
||||
export function addDocPromotion(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/docPromotion/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 疗程单作废 (门店端-疗程单-疗程单作废)
|
||||
export function cancelDocPromotion(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/docPromotion/cancel",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 分页查询 门店端-促销活动单-分页查询促销活动单
|
||||
export function docPromotionPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/docPromotion/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 门店员工业绩提成统计列表 门店端-首页-门店员工业绩提成统计列表
|
||||
export function statisticStaffDayList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/storeStatistic/staffDayList",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动单业务员修改 (门店端-促销活动单-促销活动单业务员修改)
|
||||
export function docPromotionEditStaff(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/docPromotion/updateStaff",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,79 @@
|
||||
import { service } from "../utils/service";
|
||||
import { localPath } from "./api.js";
|
||||
|
||||
// 门店员工获取手机短信验证码接口
|
||||
export function getSmsCode(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/getSmsCode",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 门店员工手机验证码登陆获取token接口
|
||||
export function phoneLogin(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/phoneLogin",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
//门店员工手机密码登陆获取token接口
|
||||
export function phonePassLogin(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/phonePassLogin",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 通过手机号查询员工所属门店
|
||||
export function staffLoginList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/list",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 通过手机号查询员工所属门店
|
||||
export function staffls(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/lists",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 查询所有门店 平台端-门店管理-查询所有门店
|
||||
export function storeLists(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/store/list",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 登录忘记密码 获取密码
|
||||
export function getSmsCodesPassword(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/getSmsCodesPassword",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
//,先查询门店,如果没有总店则返回不是总店用户,是总店用户则返回总店下的所有门店
|
||||
export function selectHeadOffice(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/selectHeadOffice",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
//校验登录
|
||||
export function phonePassLoginzd(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/phonePassLoginzd",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,21 @@
|
||||
import { service } from "../utils/service";
|
||||
import {localPath} from "./api.js"
|
||||
|
||||
// 门店员工修改密码接口
|
||||
export function changePassword(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/changePassword",
|
||||
method: "post",
|
||||
data:params,
|
||||
});
|
||||
}
|
||||
//退出登录
|
||||
export function logout(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/staffLogin/logout",
|
||||
method: "post",
|
||||
data:params,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,248 @@
|
||||
import { service } from "../utils/service";
|
||||
import { localPath } from "./api.js";
|
||||
|
||||
// 促销活动添加 (门店端-促销活动-促销活动添加)
|
||||
export function addPromotion(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动审核 (门店端-促销活动-促销活动审核)
|
||||
export function promotionAudit(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/audit",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 分页查询 门店端-促销活动-分页查询充值类别
|
||||
export function promotionPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 分页查询 门店端-促销活动-首页
|
||||
export function promotionList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/selectList",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动推送 (门店端-促销活动-促销活动推送)
|
||||
export function promotionPush(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/push",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动回收 (门店端-促销活动-促销活动回收)
|
||||
export function promotionRevokeAudit(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/revokeAudit",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动关闭 (门店端-促销活动-促销活动关闭)
|
||||
export function promotionShutDown(params) {
|
||||
return service({
|
||||
url: "demay/ssm/promotion/shutDown",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动送审 (门店端-促销活动-促销活动送审)
|
||||
export function promotionSendAudit(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/sendAudit",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 退款单反审核 (门店端-退款单-退款单反审核)
|
||||
export function promotionUnAudit(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/unAudit",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 促销活动修改 (门店端-促销活动-促销活动修改)
|
||||
export function editPromotion(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotion/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 分页查询 门店端-促销活动-分页查询促销活动指定会员数据
|
||||
export function promotionMemPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotionMem/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 查询促销活动项目 门店端-促销活动-查询促销活动项目
|
||||
export function promotionProList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/promotionPro/list",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 查询促销活动项目 门店端-促销活动-查询促销活动项目
|
||||
export function docPromotionProList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/docPromotionPro/list",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 添加充值促销
|
||||
export function recPromotionAdd(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/topUpPromotion/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 充值促销分页列表
|
||||
export function recPromotionPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/topUpPromotion/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 添加赠卡申请单
|
||||
export function addBaseZengka(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseZengka/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 修改赠卡申请单
|
||||
export function editBaseZengka(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseZengka/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 赠卡page
|
||||
export function baseZengkaPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseZengka/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 修改赠卡申请单状态
|
||||
export function stateBaseZengka(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseZengka/updateState",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 添加团购卡申请单
|
||||
export function addBaseGrouponCard(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponCard/add",
|
||||
method: "post",
|
||||
data: params,
|
||||
headers: {
|
||||
"Content-type": "application/x-www-form-urlencoded"
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 修改团购卡申请单
|
||||
export function editBaseGrouponCard(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponCard/update",
|
||||
method: "post",
|
||||
data: params,
|
||||
headers: {
|
||||
"Content-type": "application/x-www-form-urlencoded"
|
||||
}
|
||||
});
|
||||
}
|
||||
// 团购卡page
|
||||
export function baseGrouponCardPage(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponCard/page",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 修改团购卡申请单状态
|
||||
export function stateBaseGrouponCard(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponCard/updateState",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
// 添加团购人名单
|
||||
export function addBaseGrouponList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponList/add",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 团购名单模板下载
|
||||
export function downloadBaseGrouponList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponList/download",
|
||||
method: "post",
|
||||
data: params,
|
||||
responseType: "blob"
|
||||
});
|
||||
}
|
||||
|
||||
// 门店充值类别批量导入 门店端-充值类别列表-门店充值类别批量导入
|
||||
export function importBaseGrouponList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponList/import",
|
||||
method: "post",
|
||||
data: params,
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 查询团购人名单(传团购单据Id)
|
||||
export function selectBaseGrouponList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponList/select",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
|
||||
// 修改团购人名单
|
||||
export function updateBaseGrouponList(params) {
|
||||
return service({
|
||||
url: "/demay/ssm/baseGrouponList/update",
|
||||
method: "post",
|
||||
data: params
|
||||
});
|
||||
}
|
||||
@ -0,0 +1,95 @@
|
||||
// 用户长时间未操作 退出登录
|
||||
import router from "./router/index.js";
|
||||
import { delCookie } from "./utils/utils.js";
|
||||
|
||||
var timer = null;
|
||||
|
||||
clearInterval(timer);
|
||||
|
||||
export function isOperateFun() {
|
||||
var lastTime = new Date().getTime(); // 最后一次点击时间
|
||||
var currentTime = new Date().getTime(); // 当前时间
|
||||
var timeOut = 60 * 60 * 1000; // 允许最长未操作时间
|
||||
var i = 1; // 辅助作用
|
||||
function handleReset() {
|
||||
// 重新赋值最后一次点击时间,清除定时器,重新开始定时器
|
||||
//console.log('又点击了!!!!!!')
|
||||
i = 1;
|
||||
lastTime = new Date().getTime();
|
||||
if (timer) {
|
||||
clearInterval(timer);
|
||||
timer = null;
|
||||
}
|
||||
if (!timer) {
|
||||
//console.log('真好!重新开始')
|
||||
handleInterval();
|
||||
}
|
||||
}
|
||||
|
||||
document.onclick = () => {
|
||||
// 单击事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.ondblclick = () => {
|
||||
// 双击事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmousedown = () => {
|
||||
// 按下鼠标键时触发
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmouseup = () => {
|
||||
// 释放按下的鼠标键时触发
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmousemove = () => {
|
||||
// 鼠标移动事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmouseover = () => {
|
||||
// 移入事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmouseout = () => {
|
||||
// 移出事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmouseenter = () => {
|
||||
// 移入事件
|
||||
handleReset();
|
||||
};
|
||||
|
||||
document.onmouseleave = () => {
|
||||
// 移出事件
|
||||
handleReset();
|
||||
};
|
||||
function handleInterval() {
|
||||
// 定时器
|
||||
timer = setInterval(() => {
|
||||
currentTime = new Date().getTime(); // 当前时间
|
||||
// //console.log(`${i++}-currentTime`, currentTime)
|
||||
// //console.log('最后一次点击时间', lastTime)
|
||||
if (currentTime - lastTime > timeOut) {
|
||||
//console.log('长时间未操作')
|
||||
alert("长时间未操作!退出登录!");
|
||||
clearInterval(timer); // 清除定时器
|
||||
const path = window.location.href.split("#")[1];
|
||||
if (path !== "/login") {
|
||||
// 判断当前路由不是首页 则跳转至首页
|
||||
router.push("/login");
|
||||
delCookie("token");
|
||||
}
|
||||
window.AndroidWebView.loginOut(); // 执行安卓退出方法
|
||||
}
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
handleInterval(); // 一开始程序 默认执行定制器
|
||||
}
|
||||
@ -0,0 +1,93 @@
|
||||
'use strict'
|
||||
|
||||
import { app, protocol, BrowserWindow } from 'electron'
|
||||
import {
|
||||
createProtocol,
|
||||
installVueDevtools
|
||||
} from 'vue-cli-plugin-electron-builder/lib'
|
||||
const isDevelopment = process.env.NODE_ENV !== 'production'
|
||||
|
||||
// Keep a global reference of the window object, if you don't, the window will
|
||||
// be closed automatically when the JavaScript object is garbage collected.
|
||||
let win
|
||||
|
||||
// Scheme must be registered before the app is ready
|
||||
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }])
|
||||
|
||||
function createWindow() {
|
||||
// Create the browser window.
|
||||
win = new BrowserWindow({
|
||||
width: 800,
|
||||
height: 600,
|
||||
webPreferences: {
|
||||
nodeIntegration: true
|
||||
}
|
||||
})
|
||||
|
||||
if (process.env.WEBPACK_DEV_SERVER_URL) {
|
||||
// Load the url of the dev server if in development mode
|
||||
win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
|
||||
if (!process.env.IS_TEST) win.webContents.openDevTools()
|
||||
} else {
|
||||
createProtocol('app')
|
||||
// Load the index.html when not in development
|
||||
win.loadURL('app://./index.html')
|
||||
}
|
||||
|
||||
win.on('closed', () => {
|
||||
win = null
|
||||
})
|
||||
}
|
||||
|
||||
// Quit when all windows are closed.
|
||||
app.on('window-all-closed', () => {
|
||||
// On macOS it is common for applications and their menu bar
|
||||
// to stay active until the user quits explicitly with Cmd + Q
|
||||
if (process.platform !== 'darwin') {
|
||||
app.quit()
|
||||
}
|
||||
})
|
||||
|
||||
app.on('activate', () => {
|
||||
// On macOS it's common to re-create a window in the app when the
|
||||
// dock icon is clicked and there are no other windows open.
|
||||
if (win === null) {
|
||||
createWindow()
|
||||
}
|
||||
})
|
||||
|
||||
// This method will be called when Electron has finished
|
||||
// initialization and is ready to create browser windows.
|
||||
// Some APIs can only be used after this event occurs.
|
||||
app.on('ready', async() => {
|
||||
if (isDevelopment && !process.env.IS_TEST) {
|
||||
// Install Vue Devtools
|
||||
// Devtools extensions are broken in Electron 6.0.0 and greater
|
||||
// See https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378 for more info
|
||||
// Electron will not launch with Devtools extensions installed on Windows 10 with dark mode
|
||||
// If you are not using Windows 10 dark mode, you may uncomment these lines
|
||||
// In addition, if the linked issue is closed, you can upgrade electron and uncomment these lines
|
||||
// try {
|
||||
// await installVueDevtools()
|
||||
// } catch (e) {
|
||||
// console.error('Vue Devtools failed to install:', e.toString())
|
||||
// }
|
||||
|
||||
}
|
||||
createWindow()
|
||||
})
|
||||
|
||||
// Exit cleanly on request from parent process in development mode.
|
||||
if (isDevelopment) {
|
||||
if (process.platform === 'win32') {
|
||||
process.on('message', data => {
|
||||
if (data === 'graceful-exit') {
|
||||
app.quit()
|
||||
}
|
||||
})
|
||||
} else {
|
||||
process.on('SIGTERM', () => {
|
||||
app.quit()
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { selectListType } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "选择员工",
|
||||
selectNumber: 0,
|
||||
staffName: "",
|
||||
staffList: [],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.list = [];
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
console.log(row);
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = { id: "", type: 0 };
|
||||
if (this.staffName) {
|
||||
form.staffName = this.staffName;
|
||||
}
|
||||
selectListType(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = Array.from(new Set(res.rows));
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
confirms() {
|
||||
this.radioForm.ratioShow = false;
|
||||
this.$emit("adminData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,67 @@
|
||||
<template>
|
||||
<div class="excel">
|
||||
<el-upload class="upload-demo" action="/" ref='upload' accept=".xlsx" :http-request="httprequest" :on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" multiple :limit="1" :on-exceed="handleExceed" :file-list="fileList">
|
||||
<el-button size="mini" type="primary">添加文档</el-button>
|
||||
<div slot="tip" class="el-upload__tip">只能上传excel格式的文档</div>
|
||||
</el-upload>
|
||||
<br>
|
||||
<br>
|
||||
<div class="header_flex">
|
||||
<span></span>
|
||||
<div>
|
||||
<el-button size='mini' type="primary" plain @click="cencal( infoDialog = false)">取 消</el-button>
|
||||
<el-button size='mini' type="primary" @click="confirm( infoDialog = false)">确 定</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
fileList: [],
|
||||
fileData: new FormData(),
|
||||
infoDialog: false,
|
||||
file: null,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
cencal() {
|
||||
this.$emit("infoDialogV", this.infoDialog);
|
||||
},
|
||||
confirm() {
|
||||
this.$refs.upload.submit();
|
||||
this.$emit("infoDialogV", this.infoDialog);
|
||||
this.$emit("fileData", this.file);
|
||||
},
|
||||
httprequest(file) {
|
||||
this.file = file.file;
|
||||
// this.fileData.append('file', file.file)
|
||||
},
|
||||
handleRemove(file, fileList) {
|
||||
//console.log(file, fileList);
|
||||
},
|
||||
handlePreview(file) {
|
||||
//console.log(file);
|
||||
},
|
||||
handleExceed(files, fileList) {
|
||||
this.$message.warning(
|
||||
`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
|
||||
files.length + fileList.length
|
||||
} 个文件`
|
||||
);
|
||||
},
|
||||
beforeRemove(file, fileList) {
|
||||
return file.name;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.excel .upload-demo > li {
|
||||
height: 50px;
|
||||
font-size: 18px !important;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,86 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { QuerCompetent } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "选择员工",
|
||||
selectNumber: 0,
|
||||
staffName: "",
|
||||
staffList: [],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.list = [];
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
console.log(row);
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = { id: "", type: 0 };
|
||||
if (this.staffName) {
|
||||
form.staffName = this.staffName;
|
||||
}
|
||||
QuerCompetent(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = Array.from(new Set(res.rows));
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
confirms() {
|
||||
this.radioForm.ratioShow = false;
|
||||
this.$emit("adminData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,200 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag width="600px" powerId="form" :title="title" :visible.sync="dialogFormVisible" :before-close="handleClose">
|
||||
<div style="padding-left:80px">
|
||||
<el-form :model="form" :rules="rules" ref="form" label-width="120px">
|
||||
<div class="form">
|
||||
<el-form-item label="姓名" prop="memberName">
|
||||
<el-input oninput="value=value.replace(/[\d]/g,'')" ref="memberName" v-model="form.memberName" value autocomplete="on" maxlength="8"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别" prop="sex">
|
||||
<el-radio v-model="form.sex" :label="1">男</el-radio>
|
||||
<el-radio v-model="form.sex" :label="0">女</el-radio>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机" prop="mobilePhone" v-if="title=='添加'">
|
||||
<el-input oninput="this.value=this.value.replace(/\D/g,'')" pattern="[0-9]*" v-model="form.mobilePhone" value autocomplete="on" maxlength="11"></el-input>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="登录密码:" prop="password" >
|
||||
<el-input type="password" v-model="form.password" autocomplete="off"></el-input>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="标签">
|
||||
<el-input v-model="form.label" value autocomplete="on"></el-input>
|
||||
<el-input v-model="form.label" style="position:fixed;bottom:-9999px;" autocomplete="on"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="支付密码:" prop="cashPassword" v-if="title=='添加'">
|
||||
<el-input type="text" style="position:fixed;bottom:-9999px;" autocomplete="off"></el-input>
|
||||
<el-input type="password" v-model="form.cashPassword" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="确认密码:" prop="checkPass" v-if="title=='添加'">
|
||||
<el-input type="text" style="position:fixed;bottom:-9999px;" autocomplete="off"></el-input>
|
||||
<el-input type="password" v-model="form.checkPass" autocomplete="off"></el-input>
|
||||
</el-form-item>
|
||||
</div>
|
||||
|
||||
</el-form>
|
||||
</div>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="(dialogFormVisible = false)">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirm()">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { partten } from "../../../../partten/index";
|
||||
import { addstoreMember, storeMemberedit } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
var validatePass = (rule, value, callback) => {
|
||||
if (value === "") {
|
||||
callback(new Error("请输入密码"));
|
||||
} else {
|
||||
if (this.form.checkPass !== "") {
|
||||
this.$refs.form.validateField("checkPass");
|
||||
}
|
||||
callback();
|
||||
}
|
||||
};
|
||||
var validatePass2 = (rule, value, callback) => {
|
||||
if (value === "") {
|
||||
callback(new Error("请再次输入密码"));
|
||||
} else if (value !== this.form.cashPassword) {
|
||||
callback(new Error("两次输入密码不一致!"));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
};
|
||||
return {
|
||||
dialogFormVisible: false, //弹窗开关
|
||||
form: {}, //主对象
|
||||
title: "添加",
|
||||
rules: {
|
||||
cashPassword: [
|
||||
{
|
||||
required: true,
|
||||
message: "请填支付密码",
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
{ validator: validatePass, trigger: "blur" },
|
||||
],
|
||||
checkPass: [{ validator: validatePass2, trigger: ["blur", "change"] }],
|
||||
mobilePhone: [
|
||||
{
|
||||
required: true,
|
||||
message: "请填写手机号!",
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
],
|
||||
password: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入登录密码!",
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
],
|
||||
memberName: [
|
||||
{
|
||||
required: true,
|
||||
message: "请填写名字!",
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
],
|
||||
sex: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择性别!",
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//关闭弹窗前的回调方法
|
||||
handleClose() {
|
||||
this.form = {};
|
||||
this.dialogFormVisible = false;
|
||||
this.$refs.form.clearValidate();
|
||||
},
|
||||
//组件传值
|
||||
show(row) {
|
||||
if (row == "添加") {
|
||||
this.form = {};
|
||||
this.title = row;
|
||||
} else {
|
||||
this.form = { ...row };
|
||||
this.form.checkPass = this.form.cashPassword;
|
||||
this.title = "修改";
|
||||
}
|
||||
setTimeout(() => {
|
||||
this.$refs.memberName.focus();
|
||||
this.$refs.memberName.select();
|
||||
this.$refs.form.clearValidate();
|
||||
}, 300);
|
||||
this.dialogFormVisible = true;
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {
|
||||
this.$refs.form.validate(async (valid) => {
|
||||
if (valid) {
|
||||
if (partten.phoneNum.test(this.form.mobilePhone)) {
|
||||
if (this.title == "添加") {
|
||||
if (this.form.checkPass == this.form.cashPassword) {
|
||||
this.form.storeId = sessionStorage.getItem("parentId");
|
||||
this.form.storeName = sessionStorage.getItem("parentName");
|
||||
addstoreMember(this.form).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.$message.success({ message: "添加成功!" });
|
||||
this.$emit("editData", this.form);
|
||||
this.dialogFormVisible = false;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.$message.error({ message: "两次输入密码不一致" });
|
||||
}
|
||||
} else {
|
||||
storeMemberedit(this.form).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.$message.success({ message: "修改成功!" });
|
||||
this.$emit("editData");
|
||||
this.dialogFormVisible = false;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
this.$alert("请输入正确的11位手机号", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-input {
|
||||
width: 260px;
|
||||
}
|
||||
</style>
|
||||
@ -0,0 +1,131 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="800px" append-to-body>
|
||||
<el-input class="form-width-ms" v-model="queryForm.memberName" placeholder="请输入会员名字"></el-input>
|
||||
<el-button size="mini" type="primary" @click="getData">搜索</el-button>
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" class="margin-top-xs" :element-loading-text="elementLoadingText" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="memberNum" label="会员编码" min-width="120"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="memberName" label="会员姓名" min-width="100"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="sex" label="性别" min-width="60">
|
||||
<template slot-scope="scope">{{scope.row.sex==1?'男':'女'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="mobilePhone" label="手机号码" min-width="120">
|
||||
<template slot-scope="scope">{{scope.row.mobilePhone | phone}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="label" label="标签" min-width="100" :show-overflow-tooltip="true"></el-table-column>
|
||||
<el-table-column align="center" prop="memberStoreName" label="所属门店" min-width="140" :show-overflow-tooltip="true"></el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<el-pagination align="left" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryForm.pageNum" :page-sizes="[10,20,30,40,50]" :page-size="queryForm.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { storeMemberpage } from "@/api/storeManage.js";
|
||||
import { storeMemberOne } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
title: "选择会员",
|
||||
listLoading: false, //list加载提示开启动画
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
total: 0, //分页总条数
|
||||
queryForm: {
|
||||
//查询对象
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.staffList = [];
|
||||
if (form) {
|
||||
this.radio = form.id;
|
||||
this.radioForm = { ...form };
|
||||
} else {
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
}
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//分页方法
|
||||
handleSizeChange(val) {
|
||||
// //console.log(`每页 ${val} 条`);
|
||||
this.queryForm.pageSize = val;
|
||||
this.getData();
|
||||
},
|
||||
handleCurrentChange(val) {
|
||||
// //console.log(`当前页: ${val}`);
|
||||
this.queryForm.pageNum = val;
|
||||
this.getData();
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.queryForm.storeId = sessionStorage.getItem("parentId");
|
||||
this.queryForm.state = 1;
|
||||
this.listLoading = true;
|
||||
storeMemberpage(this.queryForm).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = res.pageInfo.list;
|
||||
this.total = res.pageInfo.total;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
confirms() {
|
||||
this.radioForm.ratioShow = false;
|
||||
storeMemberOne({
|
||||
mobilePhone: this.radioForm.mobilePhone,
|
||||
storeId: sessionStorage.getItem("parentId"),
|
||||
}).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.dialogVisible = false;
|
||||
this.$emit("memberData", res.data);
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,352 @@
|
||||
<template>
|
||||
<div>
|
||||
<rec ref="rec"></rec>
|
||||
<pro ref="pro"></pro>
|
||||
<cash ref="cash"></cash>
|
||||
<repay ref="repay"></repay>
|
||||
<refRec ref="refRec"></refRec>
|
||||
<refPro ref="refPro"></refPro>
|
||||
<refCash ref="refCash"></refCash>
|
||||
<protopro ref="protopro"></protopro>
|
||||
<protorec ref="protorec"></protorec>
|
||||
<promotion ref="promotion"></promotion>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import rec from "@/pages/eashier/collectionList/components/detail.vue";
|
||||
import pro from "@/pages/eashier/reatment/components/detail.vue";
|
||||
import cash from "@/pages/eashier/proceeds/detail/editform.vue";
|
||||
import refRec from "@/pages/eashier/refundRecharge/components/detail.vue";
|
||||
import refPro from "@/pages/eashier/refundCourse/components/detail.vue";
|
||||
import refCash from "@/pages/eashier/refund/components/detail.vue";
|
||||
import protopro from "@/pages/eashier/raiseReatment/components/detail.vue";
|
||||
import protorec from "@/pages/eashier/coursetorec/components/detail.vue";
|
||||
import repay from "@/pages/eashier/repayment/components/index.vue";
|
||||
import promotion from "@/pages/promotion/sellpacking/components/detail.vue";
|
||||
|
||||
import {
|
||||
recDetail,
|
||||
proDetail,
|
||||
cashDetail,
|
||||
cardChangeDetail,
|
||||
protoDetail,
|
||||
repayDetail,
|
||||
refOrderDetail,
|
||||
promotionDetail,
|
||||
} from "@/api/eashier.js";
|
||||
export default {
|
||||
components: {
|
||||
rec,
|
||||
pro,
|
||||
cash,
|
||||
refRec,
|
||||
refPro,
|
||||
refCash,
|
||||
protopro,
|
||||
protorec,
|
||||
promotion,
|
||||
repay,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
form: {}, //主对象
|
||||
itemList: [
|
||||
//单据全部类型
|
||||
{
|
||||
docType: "upgrade_out",
|
||||
docTypeName: "升级转出",
|
||||
},
|
||||
{
|
||||
docType: "upgrade_in",
|
||||
docTypeName: "升级充值",
|
||||
},
|
||||
{
|
||||
docType: "demotion_out",
|
||||
docTypeName: "降级转出",
|
||||
},
|
||||
{
|
||||
docType: "demotion_in",
|
||||
docTypeName: "降级充值",
|
||||
},
|
||||
{
|
||||
docType: "init",
|
||||
docTypeName: "初始化",
|
||||
},
|
||||
{
|
||||
docType: "card_recharge",
|
||||
docTypeName: "充值开卡",
|
||||
},
|
||||
|
||||
{
|
||||
docType: "recharge_roll_course",
|
||||
docTypeName: "疗程转充值卡",
|
||||
},
|
||||
{
|
||||
docType: "card_change",
|
||||
docTypeName: "加价转疗程",
|
||||
},
|
||||
{
|
||||
docType: "card_use",
|
||||
docTypeName: "疗程开卡",
|
||||
},
|
||||
{
|
||||
docType: "store_cash",
|
||||
docTypeName: "收银",
|
||||
},
|
||||
{
|
||||
docType: "card_repay",
|
||||
docTypeName: "还款",
|
||||
},
|
||||
{
|
||||
docType: "refund_recharge",
|
||||
docTypeName: "充值退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_course",
|
||||
docTypeName: "疗程退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_cash",
|
||||
docTypeName: "消费退款",
|
||||
},
|
||||
{
|
||||
docType: "promotion",
|
||||
docTypeName: "促销活动",
|
||||
},
|
||||
{
|
||||
docType: "promotion_card_repay",
|
||||
docTypeName: "促销还款",
|
||||
},
|
||||
],
|
||||
queryForm: {
|
||||
//查询对象
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.querForm = { pageNum: 1, pageSize: 10 };
|
||||
this.queryForm.id = form.docId;
|
||||
this.queryForm.storeId = form.storeId;
|
||||
var item = {};
|
||||
if (
|
||||
form.docType == "card_recharge" ||
|
||||
form.docType == "upgrade_out" ||
|
||||
form.docType == "upgrade_in" ||
|
||||
form.docType == "demotion_out" ||
|
||||
form.docType == "demotion_in"
|
||||
) {
|
||||
//充值
|
||||
if (form.inputDate) {
|
||||
this.queryForm.selectDate = form.inputDate;
|
||||
} else {
|
||||
this.queryForm.selectDate = form.docDate;
|
||||
}
|
||||
console.log(this.queryForm);
|
||||
console.log(form);
|
||||
|
||||
recDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.rec.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "card_use") {
|
||||
//疗程
|
||||
if (form.inputDate) {
|
||||
this.queryForm.selectDate = form.inputDate;
|
||||
} else {
|
||||
this.queryForm.selectDate = form.docDate;
|
||||
}
|
||||
proDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.pro.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "store_cash") {
|
||||
//服务明细
|
||||
if (form.inputDate) {
|
||||
this.queryForm.selectDate = form.inputDate;
|
||||
} else {
|
||||
this.queryForm.selectDate = form.docDate;
|
||||
}
|
||||
cashDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.cash.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "card_change") {
|
||||
//加价转疗程
|
||||
console.log(form.docType);
|
||||
cardChangeDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.protopro.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "recharge_roll_course") {
|
||||
//疗程转充值
|
||||
protoDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.protorec.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (
|
||||
form.docType == "card_repay" ||
|
||||
form.docType == "promotion_card_repay"
|
||||
) {
|
||||
//还款
|
||||
repayDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.repay.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "refund_recharge") {
|
||||
//退款
|
||||
this.queryForm.type = 0;
|
||||
refOrderDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.refRec.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "refund_course") {
|
||||
//疗程退款
|
||||
this.queryForm.type = 1;
|
||||
refOrderDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.refPro.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "refund_cash") {
|
||||
//消费退款
|
||||
this.queryForm.type = 2;
|
||||
refOrderDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.refCash.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (form.docType == "promotion") {
|
||||
//促销活动
|
||||
promotionDetail(this.queryForm).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
if (res.pageInfo.total == 0) {
|
||||
this.backCalls();
|
||||
} else {
|
||||
item = res.pageInfo.list[0];
|
||||
this.$refs.promotion.show(item, "明细");
|
||||
}
|
||||
} else {
|
||||
this.backCall(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (form.docType == "init") {
|
||||
this.$alert("初始化没有单据明细", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
},
|
||||
backCall(res) {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
},
|
||||
backCalls() {
|
||||
this.$alert("没有找到相关明细", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,135 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" append-to-body width="75%">
|
||||
<el-alert title="双击查看明细" type="info"></el-alert>
|
||||
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column align="center" width="100" prop="docTypeName" label="单据类别"></el-table-column>
|
||||
<el-table-column align="center" width="120" show-overflow-tooltip prop="docNum" label="单号"></el-table-column>
|
||||
<el-table-column align="center" width="120" show-overflow-tooltip prop="tradeName" label="项目名称"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleRatio" label="占比(%)"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardComm?scope.row.cardComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashComm?scope.row.cashComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleAchievementAmount" label="总业绩"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleCommissionAmount" label="总提成"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" @click="dialogVisible = false">关闭</el-button>
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { achiCommDetailList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "员工业绩提成",
|
||||
itemList: [
|
||||
//单据全部类型
|
||||
{
|
||||
docType: "card_recharge",
|
||||
docTypeName: "充值开卡",
|
||||
},
|
||||
{
|
||||
docType: "recharge_roll_course",
|
||||
docTypeName: "疗程转充值卡",
|
||||
},
|
||||
{
|
||||
docType: "card_use",
|
||||
docTypeName: "疗程开卡",
|
||||
},
|
||||
{
|
||||
docType: "store_cash",
|
||||
docTypeName: "收银",
|
||||
},
|
||||
{
|
||||
docType: "card_repay",
|
||||
docTypeName: "还款",
|
||||
},
|
||||
{
|
||||
docType: "refund_recharge",
|
||||
docTypeName: "充值退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_course",
|
||||
docTypeName: "疗程退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_cash",
|
||||
docTypeName: "消费退款",
|
||||
},
|
||||
{
|
||||
docType: "promotion",
|
||||
docTypeName: "促销活动",
|
||||
},
|
||||
],
|
||||
form: {}, //主对象
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.form = { ...form };
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
classify: this.form.classify,
|
||||
date: this.form.date,
|
||||
staffId: this.form.staffId,
|
||||
};
|
||||
achiCommDetailList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
this.itemList.forEach((items) => {
|
||||
if (item.docType == items.docType) {
|
||||
item.docTypeName = items.docTypeName;
|
||||
}
|
||||
});
|
||||
});
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,115 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" append-to-body v-dialogDrag :title="title" :visible.sync="dialogVisible" width="500px">
|
||||
<el-alert title="双击查看明细" type="info"></el-alert>
|
||||
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column align="center" min-width="120" prop="typeName" label="单据类别"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="achievementAmount" label="业绩"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="commissionAmount" label="提成"></el-table-column>
|
||||
</el-table>
|
||||
<detail ref="detail"></detail>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" @click="dialogVisible=false">关闭 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { achiCommClassifyList } from "@/api/eashier.js";
|
||||
import detail from "./detail/index";
|
||||
export default {
|
||||
components: { detail },
|
||||
data() {
|
||||
return {
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "员工业绩提成",
|
||||
form: {}, //主对象
|
||||
typeList: [
|
||||
{
|
||||
typeName: "充值",
|
||||
typeIndex: 0,
|
||||
},
|
||||
{
|
||||
typeName: "疗程",
|
||||
typeIndex: 1,
|
||||
},
|
||||
{
|
||||
typeName: "服务",
|
||||
typeIndex: 2,
|
||||
},
|
||||
{
|
||||
typeName: "还款",
|
||||
typeIndex: 3,
|
||||
},
|
||||
{
|
||||
typeName: "充值退",
|
||||
typeIndex: 4,
|
||||
},
|
||||
{
|
||||
typeName: "疗程退",
|
||||
typeIndex: 5,
|
||||
},
|
||||
{
|
||||
typeName: "消费退",
|
||||
typeIndex: 6,
|
||||
},
|
||||
{
|
||||
typeName: "促销",
|
||||
typeIndex: 7,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
show(form, date) {
|
||||
this.form = { ...form };
|
||||
this.title = form.brandNumber + "--" + form.staffName;
|
||||
this.dialogVisible = true;
|
||||
this.getData(date);
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
console.log(row);
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
getData(date) {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
type: 2,
|
||||
date: date,
|
||||
staffId: this.form.staffId,
|
||||
};
|
||||
achiCommClassifyList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
this.typeList.forEach((items) => {
|
||||
if (item.classify * 1 == items.typeIndex) {
|
||||
item.typeName = items.typeName;
|
||||
}
|
||||
});
|
||||
});
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
confirm(row) {
|
||||
this.$refs.detail.show(row);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,95 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" append-to-body :visible.sync="dialogVisible" width="60%">
|
||||
<el-alert title="双击查看明细" type="info"></el-alert>
|
||||
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
|
||||
<el-table-column align="center" min-width="120" prop="date" label="日期"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardComm?scope.row.cardComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashComm?scope.row.cashComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="achievementAmount" label="业绩"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="commissionAmount" label="提成"></el-table-column>
|
||||
</el-table>
|
||||
<detail ref="detail"></detail>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" @click="dialogVisible=false">关闭 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { achiCommList } from "@/api/eashier.js";
|
||||
import detail from "../index";
|
||||
export default {
|
||||
components: { detail },
|
||||
data() {
|
||||
return {
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "员工业绩提成",
|
||||
form: {}, //主对象
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
show(form, date) {
|
||||
this.form = { ...form };
|
||||
this.title = form.brandNumber + "--" + form.staffName;
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
console.log(row);
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
type: this.form.type,
|
||||
staffId: this.form.staffId,
|
||||
};
|
||||
achiCommList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
confirm(row) {
|
||||
this.$refs.detail.show(row, row.date);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,135 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" append-to-body width="75%">
|
||||
<el-alert title="双击查看明细" type="info"></el-alert>
|
||||
<el-table @row-dblclick="confirm" :data="list" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column align="center" width="100" prop="docTypeName" label="单据类别"></el-table-column>
|
||||
<el-table-column align="center" width="120" show-overflow-tooltip prop="docNum" label="单号"></el-table-column>
|
||||
<el-table-column align="center" width="120" show-overflow-tooltip prop="tradeName" label="项目名称"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleRatio" label="占比(%)"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardAchi" label="卡付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardAchi?scope.row.cardAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cardComm" label="卡付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cardComm?scope.row.cardComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashAchi" label="现付业绩">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashAchi?scope.row.cashAchi:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="cashComm" label="现付提成">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.cashComm?scope.row.cashComm:'--'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleAchievementAmount" label="总业绩"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="saleCommissionAmount" label="总提成"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" @click="dialogVisible = false">关闭</el-button>
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { achiCommDetailList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "员工业绩提成",
|
||||
itemList: [
|
||||
//单据全部类型
|
||||
{
|
||||
docType: "card_recharge",
|
||||
docTypeName: "充值开卡",
|
||||
},
|
||||
{
|
||||
docType: "recharge_roll_course",
|
||||
docTypeName: "疗程转充值卡",
|
||||
},
|
||||
{
|
||||
docType: "card_use",
|
||||
docTypeName: "疗程开卡",
|
||||
},
|
||||
{
|
||||
docType: "store_cash",
|
||||
docTypeName: "收银",
|
||||
},
|
||||
{
|
||||
docType: "card_repay",
|
||||
docTypeName: "还款",
|
||||
},
|
||||
{
|
||||
docType: "refund_recharge",
|
||||
docTypeName: "充值退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_course",
|
||||
docTypeName: "疗程退款",
|
||||
},
|
||||
{
|
||||
docType: "refund_cash",
|
||||
docTypeName: "消费退款",
|
||||
},
|
||||
{
|
||||
docType: "promotion",
|
||||
docTypeName: "促销活动",
|
||||
},
|
||||
],
|
||||
form: {}, //主对象
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.form = { ...form };
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
classify: this.form.classify,
|
||||
date: this.form.date,
|
||||
staffId: this.form.staffId,
|
||||
};
|
||||
achiCommDetailList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
this.itemList.forEach((items) => {
|
||||
if (item.docType == items.docType) {
|
||||
item.docTypeName = items.docTypeName;
|
||||
}
|
||||
});
|
||||
});
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,188 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="70%" append-to-body>
|
||||
<div class="flex justify-end padding-bottom-xs" v-if="!form.memberName">
|
||||
<el-input class="form-width-m " size="small" v-model="queryForm.id" clearable placeholder="项目编码搜索"></el-input>
|
||||
<el-input class="form-width-m margin-left-xs" size="small" v-model="queryForm.projectName" clearable placeholder="项目名称搜索"></el-input>
|
||||
<el-button class="margin-left-xs" size="mini" type="primary" @click="getData">搜索</el-button>
|
||||
</div>
|
||||
<div v-if="!form.memberName">
|
||||
<el-table @row-dblclick="confirms" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectNum" label="项目编码" min-width="100"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectName" label="项目名称" min-width="120"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="minumumTimes" label="最低销售次数" min-width="60"></el-table-column>
|
||||
<el-table-column align="center" label="散客">
|
||||
<el-table-column align="center" min-width="75" prop="price" label="标价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="topPrice" label="最高价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="minumumPrice" label="最低价"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="会员">
|
||||
<el-table-column align="center" min-width="75" prop="priceMember" label="标价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="topPriceMember" label="最高价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="minumumPriceMember" label="最低价"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="isCardPay" label="允许卡付" min-width="80">
|
||||
<template slot-scope="scope">{{
|
||||
scope.row.isCardPay == 0 ? "是" : scope.row.isCardPay == 1?'否':"未设"
|
||||
}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="noDiscount" label="卡付打折" min-width="80">
|
||||
<template slot-scope="scope">{{
|
||||
scope.row.noDiscount == 0 ? "是" : scope.row.noDiscount == 1?'否':"未设"
|
||||
}}</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<el-table @row-dblclick="confirms" v-else :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}" :data="coureList" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="100" align="left" prop="courseProjectNum" label="项目编码"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="courseProjectName" label="项目名称"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="price" label="项目单价"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseRestCount" label="剩余次数"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseRestPrice" label="剩余金额"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="70" align="center" prop="courseConsumeCount" label="可用次数"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="105" align="center" prop="endTime" label="到期日期"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="120" align="center" prop="storeName" label="所属门店"></el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<el-pagination v-if="!form.memberName" align="left" @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryForm.pageNum" :page-sizes="[10,20,30,40,50]" :page-size="queryForm.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script>
|
||||
import { propageNew } from "@/api/storeManage.js";
|
||||
import { couAccountList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
coureList: [],
|
||||
dialogVisible: false, //弹窗开关
|
||||
listLoading: false, //list加载提示开启动画
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
title: "选择门店项目", //弹窗标题
|
||||
total: 0, //分页总条数
|
||||
form: {}, //主对象
|
||||
queryForm: {
|
||||
//查询对象
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
state: 1,
|
||||
projectName: "",
|
||||
},
|
||||
courseProjectId: "", //选中的会员疗程卡包
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form, id) {
|
||||
this.courseProjectId = id;
|
||||
this.coureList = [];
|
||||
this.list = [];
|
||||
this.form = {};
|
||||
if (form == 1 || form == 0 || form == 3) {
|
||||
if (form != 3) {
|
||||
this.queryForm.directConsumption = form;
|
||||
}
|
||||
} else {
|
||||
this.form = { ...form };
|
||||
}
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.list = [];
|
||||
this.getData();
|
||||
this.dialogVisible = true;
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//分页方法
|
||||
handleSizeChange(val) {
|
||||
// //console.log(`每页 ${val} 条`);
|
||||
this.queryForm.pageSize = val;
|
||||
this.getData();
|
||||
},
|
||||
handleCurrentChange(val) {
|
||||
// //console.log(`当前页: ${val}`);
|
||||
this.queryForm.pageNum = val;
|
||||
this.getData();
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
if (this.form.memberName) {
|
||||
this.title = "选择会员卡包疗程";
|
||||
var memberIds = {
|
||||
memberId: this.form.id,
|
||||
};
|
||||
if (this.courseProjectId) {
|
||||
memberIds.courseProjectId = this.courseProjectId;
|
||||
}
|
||||
//查询当前会员下的所有项目疗程 如果有相对应的项目 就给courseAccountId赋值 没有的话 就是卡付现付
|
||||
couAccountList(memberIds).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
item.courseAccountId = item.id;
|
||||
});
|
||||
this.coureList = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "查询会员疗程", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this.title = "选择门店项目";
|
||||
propageNew(this.queryForm).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.total = res.pageInfo.total;
|
||||
this.list = res.pageInfo.list;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
confirms() {
|
||||
this.$emit("projectData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,133 @@
|
||||
<template>
|
||||
<el-dialog title="项目列表" :visible.sync="dialogFormVisible" append-to-body width="60%" @close="close">
|
||||
<el-table border :data="list" max-height="600" ref="list" v-loading="listLoading" :element-loading-text="elementLoadingText" @row-click="getCurrentRow" :row-class-name="rowName" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectNum" label="项目编码" min-width="100"></el-table-column>
|
||||
<el-table-column :show-overflow-tooltip="true" align="center" prop="projectName" label="项目名称" min-width="120"></el-table-column>
|
||||
<el-table-column align="center" label="散客">
|
||||
<el-table-column align="center" min-width="80" prop="price" label="标价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="topPrice" label="最高价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="minumumPrice" label="最低价"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" label="会员">
|
||||
<el-table-column align="center" min-width="80" prop="priceMember" label="标价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="topPriceMember" label="最高价"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="minumumPriceMember" label="最低价"></el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-pagination background :current-page="queryForm.pageNum" :page-size="queryForm.pageSize" :layout="layout" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange"></el-pagination>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" @click="close">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="save">确 定</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { propage, setAchiCommList } from "@/api/storeManage.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
title: "",
|
||||
listLoading: true,
|
||||
dialogFormVisible: false,
|
||||
dialogFormVisiblebz: false,
|
||||
layout: "total, sizes, prev, pager, next, jumper",
|
||||
total: 0, //分页总条数
|
||||
form: {}, //主对象
|
||||
elementLoadingText: "正在加载...",
|
||||
list: [], //主数组
|
||||
queryForm: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
roleName: undefined,
|
||||
userId: undefined,
|
||||
},
|
||||
currentRow: null,
|
||||
radio: null, //单选值
|
||||
selection: [],
|
||||
textarea2: "",
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
fetchData() {
|
||||
propage(this.queryForm).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = res.pageInfo.list;
|
||||
this.total = res.pageInfo.total;
|
||||
this.queryForm.pageNum = res.pageInfo.pageNum;
|
||||
this.queryForm.pageSize = res.pageInfo.pageSize;
|
||||
} else {
|
||||
this.$alert(res.message, "查询门店疗程", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//多选方法
|
||||
getCurrentRow(row) {
|
||||
this.$refs["list"].toggleRowSelection(row);
|
||||
},
|
||||
//多选变动方法
|
||||
handleSelectionChange(selection) {
|
||||
this.selection = selection;
|
||||
console.log(this.selection);
|
||||
},
|
||||
//列表返回方法
|
||||
rowName({ row, rowIndex }) {
|
||||
row.index = rowIndex;
|
||||
},
|
||||
handleSizeChange(val) {
|
||||
this.queryForm.pageSize = val;
|
||||
this.fetchData();
|
||||
},
|
||||
handleCurrentChange(val) {
|
||||
this.queryForm.pageNum = val;
|
||||
this.fetchData();
|
||||
},
|
||||
close() {
|
||||
this.queryForm = this.$options.data().queryForm;
|
||||
this.dialogFormVisible = false;
|
||||
},
|
||||
//保存确定方法
|
||||
save() {
|
||||
let form = { ...this.form };
|
||||
let list = [];
|
||||
this.selection.forEach((item) => {
|
||||
list.push(item.id);
|
||||
});
|
||||
form.projectRequests = list;
|
||||
setAchiCommList(form).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.$message.success({ message: "操作成功" });
|
||||
this.$emit("selectProData", this.selection);
|
||||
this.dialogFormVisible = false;
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.form = { ...form };
|
||||
this.selection = [];
|
||||
this.dialogFormVisible = true;
|
||||
this.fetchData();
|
||||
},
|
||||
},
|
||||
created: function () {},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -0,0 +1,89 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="rechargeTypeNum" label="充值编码"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="120" align="left" prop="rechargeTypeName" label="充值卡"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="80" align="left" prop="type" label="类别">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardRestMoney" label="剩余金额"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardConsumeMoney" label="可用金额"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="100" align="center" prop="discount" label="享受优惠(%)"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="80" align="center" prop="cardGiftMoney" label="赠送金额"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="100" align="center" prop="discountFreeAmount" label="赠送折扣(%)"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="105" align="center" prop="endTime" label="到期日期"></el-table-column>
|
||||
</el-table>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { recAccountList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
title: "选择会员充值帐户",
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.form = { ...form };
|
||||
this.list = [];
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
recAccountList({ memberId: this.form.memberId }).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code === "000000") {
|
||||
this.listLoading = false;
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert("查询会员充值帐户 : " + res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确认返回方法
|
||||
confirms() {
|
||||
this.$emit("recTypeData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,124 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" show-overflow-tooltip min-width="100" prop="rechargeTypeNum" label="编码"></el-table-column>
|
||||
<el-table-column align="center" show-overflow-tooltip min-width="120" prop="rechargeTypeName" label="名称"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="75" align="left" prop="type" label="类别">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="75" prop="firstAmount" label="首充金额">
|
||||
<template slot-scope="scope">{{scope.row.firstAmount?scope.row.firstAmount:'无首充'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="75" prop="rechargeMoney" label="续充金额"></el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="discount" label="享受折扣(%)"></el-table-column>
|
||||
<el-table-column align="center" min-width="75" prop="giftMoney" label="赠送金额">
|
||||
<template slot-scope="scope">{{scope.row.giftMoney?scope.row.giftMoney:'无赠送'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="discountFreeAmount" label="赠送折扣(%)">
|
||||
<template slot-scope="scope">{{scope.row.discountFreeAmount?scope.row.discountFreeAmount:'无折扣'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="80" prop="validTime" label="有效期限(月)"></el-table-column>
|
||||
<el-table-column align="center" show-overflow-tooltip min-width="115" prop="stopDates" label="到期日期"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { recTypeList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
title: "选择充值类别", //弹窗标题
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
selectNumber: null, //充值类别类型0 赠送卡 1 折扣卡 2活动卡
|
||||
selcetList: [], //已经选择的充值类别列表
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(number, list) {
|
||||
console.log(number);
|
||||
console.log(list);
|
||||
if (list) {
|
||||
this.selcetList = list;
|
||||
}
|
||||
if (number) {
|
||||
this.selectNumber = number;
|
||||
}
|
||||
this.list = [];
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
id: "",
|
||||
storeId: sessionStorage.getItem("parentId"),
|
||||
};
|
||||
if (this.selectNumber) {
|
||||
form.type = this.selectNumber;
|
||||
}
|
||||
recTypeList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code === "000000") {
|
||||
if (this.selcetList.length == 0) {
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
var list = [];
|
||||
this.selcetList.forEach((item) => {
|
||||
res.rows.forEach((items) => {
|
||||
if (item.newRechargeTypeId == items.id) {
|
||||
list.push(items);
|
||||
}
|
||||
});
|
||||
});
|
||||
this.list = list;
|
||||
}
|
||||
} else {
|
||||
this.$alert("查询充值列表 : " + res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确定返回方法
|
||||
confirms() {
|
||||
this.$emit("recTypeData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,136 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="1000px" append-to-body>
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :empty-text="'无'+title" :element-loading-text="elementLoadingText" class="margin-top-xs" :header-cell-style="{background: 'linear-gradient(#6cb3ff, #1873d4)' ,color:'#eeeeee'}">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" show-overflow-tooltip min-width="120" prop="rechargeTypeName" label="名称"></el-table-column>
|
||||
<el-table-column show-overflow-tooltip min-width="80" align="left" prop="type" label="类别">
|
||||
<template slot-scope="scope">
|
||||
{{scope.row.type==0?'赠送卡':scope.row.type==1?'折扣卡':'活动卡'}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="firstAmount" label="首充金额">
|
||||
<template slot-scope="scope">{{scope.row.firstAmount?scope.row.firstAmount:'无首充'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="liftType" label="升降级" min-width="100" :show-overflow-tooltip="true" sortable>
|
||||
<template slot-scope="scope">{{
|
||||
scope.row.liftType == 0 ? "升级" :scope.row.liftType == 1 ?"降级":'无'
|
||||
}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="rechargeMoney" label="续充金额"></el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="discount" label="享受优惠"></el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="giftMoney" label="赠送金额">
|
||||
<template slot-scope="scope">{{scope.row.giftMoney?scope.row.giftMoney:'无赠送'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="discountFreeAmount" label="赠送折扣">
|
||||
<template slot-scope="scope">{{scope.row.discountFreeAmount?scope.row.discountFreeAmount:'无折扣'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="validTime" label="有效期限(月)"></el-table-column>
|
||||
<el-table-column align="center" show-overflow-tooltip min-width="115" prop="stopDates" label="到期日期"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { recTypeSjianjiList, recTypeSjianjiLists } from "@/api/storeManage.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关
|
||||
title: "充值类别",
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
selectNumber: 0, //充值类别类型0 赠送卡 1 折扣卡 2活动卡
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form, number) {
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
if (form == 0 || form == 1 || form == 2) {
|
||||
this.selectNumber = form;
|
||||
this.getData();
|
||||
} else {
|
||||
this.selectNumber = -1;
|
||||
this.form = { ...form };
|
||||
if (number) {
|
||||
this.selectNumber = number;
|
||||
this.title = "选择升级卡";
|
||||
}
|
||||
this.getDatas();
|
||||
}
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = {
|
||||
id: "",
|
||||
type: this.selectNumber,
|
||||
storeId: sessionStorage.getItem("parentId"),
|
||||
};
|
||||
recTypeSjianjiList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code === "000000") {
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert("查询充值列表 : " + res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//获取数据
|
||||
async getDatas() {
|
||||
let form = { liftCardId: this.form.id };
|
||||
if (this.selectNumber >= 0) {
|
||||
form.liftType = this.selectNumber - 1;
|
||||
}
|
||||
recTypeSjianjiLists(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code === "000000") {
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
this.$alert("查询充值列表 : " + res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确认返回方法
|
||||
confirms() {
|
||||
this.dialogVisible = false;
|
||||
this.$emit("recTypeData", this.radioForm);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,180 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag title="取消欠款" :visible.sync="cancelDialogVisible" width="650px" append-to-body :before-close="handleCloseCancel">
|
||||
<el-form label-width="120px" inline>
|
||||
<div v-if="form.docType=='promotion_card_use'">
|
||||
<el-form-item label="会员名称">
|
||||
{{form.memberName}}
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号码">
|
||||
{{form.memberName}}
|
||||
</el-form-item>
|
||||
<el-form-item label="促销名称">
|
||||
{{form.tradeName}}
|
||||
</el-form-item>
|
||||
<el-form-item label="成交金额">
|
||||
<span class="text-red text-price">
|
||||
{{form.tradeMoney}}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="欠款金额">
|
||||
<span class="text-cyan text-price">
|
||||
{{form.debtMoney}}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="取消欠款">
|
||||
<span class="text-cyan text-price">
|
||||
{{form.cancelMoney}}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-table :data="form.cancelDebtMxes" :row-class-name="tableRowClassName" ref="multipleTable" highlight-current-row tooltip-effect="dark">
|
||||
<el-table-column prop="courseProjectNum" show-overflow-tooltip label="项目编码" align="center" min-width="80"></el-table-column>
|
||||
<el-table-column prop="courseProjectName" show-overflow-tooltip label="项目名称" align="center" min-width="120"></el-table-column>
|
||||
<el-table-column prop="price" show-overflow-tooltip label="欠款" align="center" min-width="80">
|
||||
<el-table-column prop="debtMoney" show-overflow-tooltip label="金额" align="center" min-width="80"></el-table-column>
|
||||
<el-table-column prop="debtCount" show-overflow-tooltip label="次数" align="center" min-width="80"></el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="price" show-overflow-tooltip label="取消欠款" align="center" min-width="80">
|
||||
<el-table-column prop="cancelMoney" show-overflow-tooltip label="金额" align="center" min-width="80">
|
||||
<template slot-scope="scope">
|
||||
<div @click.stop>
|
||||
<div class="text-cyan" v-if="editCancelMIndex!=scope.$index" @click="openEditCancelM(scope.row,scope.$index,editCancelMIndex=scope.$index)">
|
||||
{{scope.row.cancelMoney}}
|
||||
<i class="el-icon-edit text-cyan"></i>
|
||||
</div>
|
||||
<el-input v-focus oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-input-width-xs" v-else @blur="endEditCancelM(scope.row,editCancelMIndex=-1)" v-model="scope.row.cancelMoney"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="cancelNum" show-overflow-tooltip label="次数" align="center" min-width="80">
|
||||
<template slot-scope="scope">
|
||||
<div @click.stop>
|
||||
<div class="text-cyan" v-if="editCancelCIndex!=scope.$index" @click="openEditCancelC(scope.row,scope.$index,editCancelCIndex=scope.$index)">
|
||||
{{scope.row.cancelNum}}
|
||||
<i class="el-icon-edit text-cyan"></i>
|
||||
</div>
|
||||
<el-input v-focus oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-input-width-xs" v-else @blur="endEditCancelC(scope.row,editCancelCIndex=-1)" v-model="scope.row.cancelNum"></el-input>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<div v-else>
|
||||
<el-form-item label="欠款帐户">
|
||||
{{form.tradeName}}
|
||||
</el-form-item>
|
||||
<el-form-item label="成交金额">
|
||||
<span class="text-red text-price">
|
||||
{{form.tradeMoney}}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="欠款金额">
|
||||
<span class="text-cyan text-price">
|
||||
{{form.debtMoney}}
|
||||
</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="取消欠款金额">
|
||||
<el-input oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" type="number" class="form-width-ms" v-model="form.cancelMoney"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="取消欠款次数" v-if="form.docType == 'card_use'">
|
||||
<el-input pattern="[0-9]*\" type="number" class="form-width-ms" v-model="form.cancelNum"></el-input>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="handleCloseCancel">取 消</el-button>
|
||||
<el-button size="mini" type="primary" :loading="loading" @click="confirmCancel(loading=true)">确 定 </el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { addCancelDebtList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loading: false, //提交等待动画
|
||||
form: {}, //主对象
|
||||
cancelDialogVisible: false, //取消欠款弹窗开关
|
||||
editCancelCIndex: -1, //取消欠款列表>次数:下标
|
||||
editCancelMIndex: -1, //取消欠款列表>金额:下标
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//返回当前行的下标
|
||||
tableRowClassName({ row, rowIndex }) {
|
||||
row.index = rowIndex;
|
||||
},
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.form = { ...form };
|
||||
this.cancelDialogVisible = true;
|
||||
},
|
||||
//关闭取消欠款弹窗前的回调
|
||||
handleCloseCancel() {
|
||||
this.form = {};
|
||||
this.cancelDialogVisible = false;
|
||||
this.$emit("cancelData");
|
||||
},
|
||||
//打开修改取消金额
|
||||
openEditCancelM(row, index) {},
|
||||
//关闭修改取消金额
|
||||
endEditCancelM(row) {
|
||||
if (row.cancelMoney * 1 > row.debtMoney) {
|
||||
this.$message.waring({ message: "最高可以取消" + row.debtMoney });
|
||||
row.cancelMoney = row.debtMoney;
|
||||
} else {
|
||||
this.sumMoney();
|
||||
}
|
||||
},
|
||||
//打开修改取消次数
|
||||
openEditCancelC(row, index) {
|
||||
let form = { ...row };
|
||||
},
|
||||
//关闭修改取消次数
|
||||
endEditCancelC(row) {
|
||||
if (row.cancelNum * 1 > row.debtCount) {
|
||||
this.$message.waring({ message: "最高可以取消" + row.debtCount });
|
||||
row.cancelNum = row.debtCount;
|
||||
} else {
|
||||
this.sumMoney();
|
||||
}
|
||||
},
|
||||
//计算总取消欠款
|
||||
sumMoney() {
|
||||
let money = 0;
|
||||
let form = { ...this.form };
|
||||
this.form.cancelDebtMxes.forEach((item) => {
|
||||
money += item.cancelMoney * 1;
|
||||
});
|
||||
form.cancelMoney = money.toFixed(2) * 1;
|
||||
this.form = JSON.parse(JSON.stringify(form));
|
||||
},
|
||||
//提交返回方法
|
||||
confirmCancel() {
|
||||
setTimeout(() => {
|
||||
this.loading = false;
|
||||
}, 3000);
|
||||
addCancelDebtList(this.form).then((res) => {
|
||||
this.loading = false;
|
||||
if (res.code == "000000") {
|
||||
this.cancelDialogVisible = false;
|
||||
this.$message.success({ message: "提交成功!" });
|
||||
this.$emit("cancelData");
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="600px">
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" width="100" prop="brandNumber" label="水牌号"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="staffName" label="名字"></el-table-column>
|
||||
<el-table-column align="center" min-width="100" prop="jobName" label="工种">
|
||||
<template slot-scope="scope">
|
||||
{{
|
||||
scope.row.job == 1
|
||||
? "美发师"
|
||||
: scope.row.job == 2
|
||||
? "技师"
|
||||
: scope.row.job == 3
|
||||
? "助理"
|
||||
: scope.row.job == 4
|
||||
? "收银员"
|
||||
: scope.row.job == 5
|
||||
? "美容师"
|
||||
: "暂无"
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { selectList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关 //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字 //列表加载提示文字
|
||||
listLoading: false, //list加载提示开启动画 //列表加载提示动画
|
||||
title: "选择员工", //弹窗标题
|
||||
selectNumber: 0, //员工类型 0正常员工 1业务人员 2管理者
|
||||
staffList: [], //员工数据数组
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(number, title, list) {
|
||||
//number 0正常 1 业务 2管理者
|
||||
//list 有值需要说明需要列表去除
|
||||
this.staffList = [];
|
||||
if (title) {
|
||||
this.title = title;
|
||||
}
|
||||
if (list) {
|
||||
this.staffList = list;
|
||||
}
|
||||
this.selectNumber = number;
|
||||
this.list = [];
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
console.log(this.staffList);
|
||||
this.getData();
|
||||
},
|
||||
//单击选中员工
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取员工数据
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let form = { id: "" };
|
||||
if (this.staffName) {
|
||||
form.staffName = this.staffName;
|
||||
}
|
||||
selectList(form).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
if (this.staffList.length == 0) {
|
||||
this.list = res.rows;
|
||||
} else {
|
||||
var list = [];
|
||||
res.rows.forEach((item) => {
|
||||
this.staffList.forEach((items) => {
|
||||
if (item.id == items.id) {
|
||||
} else {
|
||||
list.push(item);
|
||||
}
|
||||
});
|
||||
});
|
||||
this.list = Array.from(new Set(list));
|
||||
}
|
||||
} else {
|
||||
this.$alert(res.message, "提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确定返回方法
|
||||
confirms() {
|
||||
if (this.selectNumber == 1) {
|
||||
this.radioForm.saleStaffName = this.radioForm.staffName;
|
||||
this.radioForm.saleStaffId = this.radioForm.id;
|
||||
this.radioForm.saleIdentityCard = this.radioForm.identityCard;
|
||||
this.radioForm.saleRatio = 0;
|
||||
}
|
||||
if (this.selectNumber == 2) {
|
||||
this.radioForm.manageStaffName = this.radioForm.staffName;
|
||||
this.radioForm.manageStaffId = this.radioForm.id;
|
||||
this.radioForm.manageIdentityCard = this.radioForm.identityCard;
|
||||
this.radioForm.manageBrandNumber = this.radioForm.brandNumber;
|
||||
}
|
||||
this.radioForm.ratioShow = false;
|
||||
this.$emit("staffData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,178 @@
|
||||
<template>
|
||||
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border margin-right-xs bg-white">
|
||||
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
|
||||
<el-table-column align="left" prop="brandNumber" label="水牌号--管理员名字" min-width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="重新选择管理员" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
|
||||
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
|
||||
<template slot-scope="scope">
|
||||
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
|
||||
{{ scope.row.ratio }}
|
||||
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
|
||||
</div>
|
||||
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
|
||||
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman">撤销</el-button>
|
||||
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))">增加</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { selectListType } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
staffList: [], //选择员工数组
|
||||
staffLists: [{ ratio: 100 }], //员工占比初始化 //主员工数组
|
||||
editIndex: -1, //员工占比修改下标
|
||||
staffListCopy: [], //复制选择员工数组
|
||||
storeId: null, //当前门店id
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//删除当前选择
|
||||
clear() {
|
||||
this.staffLists = [{ ratio: 100 }];
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//下拉选择方法
|
||||
ratioChange(v, index) {
|
||||
this.staffList.forEach((item) => {
|
||||
if (item.id == v) {
|
||||
item.ratio = this.staffLists[index].ratio;
|
||||
item.staffNames = item.brandNumber + "--" + item.staffName;
|
||||
this.staffLists.splice(index, 1, item);
|
||||
}
|
||||
});
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//打开员工修改输入框
|
||||
openStaffRatio(index, row) {
|
||||
if (index != 0 || row.ratio * 1 != 100) {
|
||||
let form = { ...row };
|
||||
this.editIndex = index;
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
},
|
||||
//关闭员工修改输入框
|
||||
endStaffRatio(row, index) {
|
||||
let num = 0;
|
||||
if (index != 0) {
|
||||
this.staffLists.forEach((item, i) => {
|
||||
if (i != 0) {
|
||||
num += item.ratio * 1;
|
||||
}
|
||||
});
|
||||
this.staffLists[0].ratio = 100 - num;
|
||||
if (this.staffLists[0].ratio < 1) {
|
||||
this.$message.error({
|
||||
message: "第一位员工占比过低",
|
||||
});
|
||||
} else {
|
||||
if (!row.ratio) {
|
||||
row.ratio = 0;
|
||||
} else {
|
||||
row.ratio = row.ratio * 1;
|
||||
}
|
||||
let form = this.staffLists[index];
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
this.editIndex = -1;
|
||||
}
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//撤销增加员工
|
||||
delsalesman() {
|
||||
let index = this.staffLists.length - 1;
|
||||
if (index == 0) {
|
||||
this.$message.warning({ message: "第一行员工只能修改" });
|
||||
} else {
|
||||
let ratio = this.staffLists[index].ratio;
|
||||
this.staffLists[0].ratio += ratio;
|
||||
this.staffLists.splice(index, 1);
|
||||
}
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//组件传值
|
||||
show(list, storeId) {
|
||||
this.staffLists = [...list];
|
||||
if (storeId) {
|
||||
this.storeId = storeId;
|
||||
}
|
||||
this.getData();
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {
|
||||
let list = [];
|
||||
this.staffLists.forEach((item) => {
|
||||
let items = {
|
||||
id: item.id,
|
||||
ratio: item.ratio,
|
||||
brandNumber: item.brandNumber,
|
||||
staffName: item.staffName,
|
||||
identityCard: item.identityCard,
|
||||
storeId: item.storeId,
|
||||
storeName: item.storeName,
|
||||
staffType: 1,
|
||||
staffNames: item.brandNumber + "--" + item.staffName,
|
||||
};
|
||||
list.push(items);
|
||||
});
|
||||
this.$emit("adminData", list);
|
||||
},
|
||||
//改变员工 去除未选择员工列表中的员工
|
||||
changeStaff() {
|
||||
var that = this;
|
||||
var list = that.staffLists
|
||||
.concat(that.staffListCopy)
|
||||
.filter(function (v) {
|
||||
return (
|
||||
that.staffLists.indexOf(v) === -1 ||
|
||||
that.staffListCopy.indexOf(v) === -1
|
||||
);
|
||||
});
|
||||
this.staffList = list;
|
||||
},
|
||||
//获取员工数据
|
||||
//获取数据
|
||||
async getData() {
|
||||
let form = { type: 0 };
|
||||
if (this.storeId) {
|
||||
form.storeId = this.storeId;
|
||||
}
|
||||
selectListType(form).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
item.editStaffRatioShow = false;
|
||||
});
|
||||
this.staffList = res.rows;
|
||||
this.staffListCopy = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "加载员工提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,167 @@
|
||||
<template>
|
||||
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border bg-white">
|
||||
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
|
||||
<el-table-column align="left" prop="brandNumber" label="水牌号--高管名字" min-width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="重新选择高管" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
|
||||
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
|
||||
<template slot-scope="scope">
|
||||
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
|
||||
{{ scope.row.ratio }}
|
||||
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
|
||||
</div>
|
||||
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
|
||||
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman">撤销</el-button>
|
||||
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))">增加</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { QuerCompetent } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
staffList: [], //选择员工数组
|
||||
staffLists: [{ ratio: 100 }], //员工占比初始化 //主员工数组
|
||||
editIndex: -1, //员工占比修改下标
|
||||
staffListCopy: [], //复制选择员工数组
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//删除当前选择
|
||||
clear() {
|
||||
this.staffLists = [{ ratio: 100 }];
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//下拉选择方法
|
||||
ratioChange(v, index) {
|
||||
this.staffList.forEach((item) => {
|
||||
if (item.id == v) {
|
||||
item.ratio = this.staffLists[index].ratio;
|
||||
item.staffNames = item.brandNumber + "--" + item.staffName;
|
||||
this.staffLists.splice(index, 1, item);
|
||||
}
|
||||
});
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//打开员工修改输入框
|
||||
openStaffRatio(index, row) {
|
||||
if (index != 0 || row.ratio * 1 != 100) {
|
||||
let form = { ...row };
|
||||
this.editIndex = index;
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
},
|
||||
//关闭员工修改输入框
|
||||
endStaffRatio(row, index) {
|
||||
let num = 0;
|
||||
if (index != 0) {
|
||||
this.staffLists.forEach((item, i) => {
|
||||
if (i != 0) {
|
||||
num += item.ratio * 1;
|
||||
}
|
||||
});
|
||||
this.staffLists[0].ratio = 100 - num;
|
||||
if (this.staffLists[0].ratio < 1) {
|
||||
this.$message.error({
|
||||
message: "第一位占比过低",
|
||||
});
|
||||
} else {
|
||||
if (!row.ratio) {
|
||||
row.ratio = 0;
|
||||
} else {
|
||||
row.ratio = row.ratio * 1;
|
||||
}
|
||||
let form = this.staffLists[index];
|
||||
this.editIndex = -1;
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
}
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//撤销增加员工
|
||||
delsalesman() {
|
||||
let index = this.staffLists.length - 1;
|
||||
if (index == 0) {
|
||||
this.$message.warning({ message: "第一行员工只能修改" });
|
||||
} else {
|
||||
let ratio = this.staffLists[index].ratio;
|
||||
this.staffLists[0].ratio += ratio;
|
||||
this.staffLists.splice(index, 1);
|
||||
}
|
||||
this.confirm();
|
||||
this.changeStaff();
|
||||
},
|
||||
//组件传值
|
||||
show(list) {
|
||||
this.staffLists = [...list];
|
||||
this.getData();
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {
|
||||
let list = [];
|
||||
this.staffLists.forEach((item) => {
|
||||
let items = {
|
||||
id: item.id,
|
||||
ratio: item.ratio,
|
||||
brandNumber: item.brandNumber,
|
||||
staffName: item.staffName,
|
||||
identityCard: item.identityCard,
|
||||
storeId: item.storeId,
|
||||
storeName: item.storeName,
|
||||
staffNames: item.brandNumber + "--" + item.staffName,
|
||||
staffType: 0,
|
||||
};
|
||||
list.push(items);
|
||||
});
|
||||
this.$emit("managerData", list);
|
||||
},
|
||||
//改变员工 去除未选择员工列表中的员工
|
||||
changeStaff() {
|
||||
var that = this;
|
||||
var list = that.staffLists
|
||||
.concat(that.staffListCopy)
|
||||
.filter(function (v) {
|
||||
return (
|
||||
that.staffLists.indexOf(v) === -1 ||
|
||||
that.staffListCopy.indexOf(v) === -1
|
||||
);
|
||||
});
|
||||
this.staffList = list;
|
||||
},
|
||||
//获取高管数据
|
||||
//获取数据
|
||||
async getData() {
|
||||
QuerCompetent({ type: 0, pageSize: 999 }).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.staffList = res.pageInfo.list;
|
||||
this.staffListCopy = res.pageInfo.list;
|
||||
} else {
|
||||
this.$alert(res.message, "加载高管提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,180 @@
|
||||
<template>
|
||||
<div style="width: 300px;overflow: hidden;" class="border-radius-10 border margin-right-xs bg-white ">
|
||||
<el-table :data="staffLists" max-height="300" class="margin-xs" style="width:280px">
|
||||
<el-table-column align="left" prop="brandNumber" label="水牌号--员工名字" min-width="180">
|
||||
<template slot-scope="scope">
|
||||
<el-select style="width:180px" v-model="scope.row.staffNames" clearable @clear="clear" no-match-text="重新选择员工" placeholder="请选择" @change="ratioChange($event,scope.$index)" filterable default-first-option>
|
||||
<el-option v-for="(item,index) in staffList" :key="index" :label="item.brandNumber+'--'+ item.staffName" :value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" prop="ratio" label="占比(%)" width="80">
|
||||
<template slot-scope="scope">
|
||||
<div class="form-input-width" v-if="editIndex!=scope.$index" @click="openStaffRatio(scope.$index, scope.row)">
|
||||
{{ scope.row.ratio }}
|
||||
<i class="el-icon-edit text-cyan" v-if="scope.$index!=0"></i>
|
||||
</div>
|
||||
<el-input v-focus class="form-input-width-xs" size="samll" type="number" oninput="this.value=this.value.replace(/\D*(\d*)(\.?)(\d{0,2})\d*/,'$1$2$3')" pattern="[0-9]*\.?[0-9]{0,2}" v-else v-model="scope.row.ratio" @blur="endStaffRatio(scope.row, scope.$index)"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="width: 150px;margin:10px auto;" class="flex justify-between align-center">
|
||||
<el-button size="mini" type="info" :disabled="staffLists.length == 0" @click="delsalesman">撤销</el-button>
|
||||
<el-button size="mini" type="primary" plain @click="(staffLists.push({brandNumber:'',staffName:'',ratio:0}))">增加</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { selectList } from "@/api/eashier.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
staffList: [], //选择员工数组
|
||||
staffLists: [{ ratio: 100 }], //员工占比初始化 //主员工数组
|
||||
editIndex: -1, //员工占比修改下标
|
||||
staffListCopy: [], //复制选择员工数组
|
||||
storeId: null, //当前门店id
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//下拉选择方法
|
||||
ratioChange(v, index) {
|
||||
this.staffList.forEach((item) => {
|
||||
if (item.id == v) {
|
||||
item.ratio = this.staffLists[index].ratio;
|
||||
item.staffNames = item.brandNumber + "--" + item.staffName;
|
||||
this.staffLists.splice(index, 1, item);
|
||||
}
|
||||
});
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//删除当前选择
|
||||
clear() {
|
||||
this.staffLists = [{ ratio: 100 }];
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//打开员工修改输入框
|
||||
openStaffRatio(index, row) {
|
||||
if (index != 0 || row.ratio * 1 != 100) {
|
||||
let form = { ...row };
|
||||
this.editIndex = index;
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
},
|
||||
//关闭员工修改输入框
|
||||
endStaffRatio(row, index) {
|
||||
let num = 0;
|
||||
if (index != 0) {
|
||||
this.staffLists.forEach((item, i) => {
|
||||
if (i != 0) {
|
||||
num += item.ratio * 1;
|
||||
}
|
||||
});
|
||||
this.staffLists[0].ratio = 100 - num;
|
||||
if (this.staffLists[0].ratio < 1) {
|
||||
this.$message.error({
|
||||
message: "第一位员工占比过低",
|
||||
});
|
||||
} else {
|
||||
if (!row.ratio) {
|
||||
row.ratio = 0;
|
||||
} else {
|
||||
row.ratio = row.ratio * 1;
|
||||
}
|
||||
let form = this.staffLists[index];
|
||||
this.editIndex = -1;
|
||||
this.staffLists.splice(index, 1, form);
|
||||
}
|
||||
}
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//撤销增加员工
|
||||
delsalesman() {
|
||||
let index = this.staffLists.length - 1;
|
||||
if (index == 0) {
|
||||
this.$message.warning({ message: "第一行员工只能修改" });
|
||||
} else {
|
||||
let ratio = this.staffLists[index].ratio;
|
||||
this.staffLists[0].ratio += ratio;
|
||||
this.staffLists.splice(index, 1);
|
||||
}
|
||||
this.changeStaff();
|
||||
this.confirm();
|
||||
},
|
||||
//组件传值
|
||||
show(list, storeId) {
|
||||
console.log(list);
|
||||
this.staffLists = [...list];
|
||||
if (storeId) {
|
||||
this.storeId = storeId;
|
||||
}
|
||||
this.getData();
|
||||
},
|
||||
//确定返回方法
|
||||
confirm() {
|
||||
let list = [];
|
||||
this.staffLists.forEach((item) => {
|
||||
let items = {
|
||||
id: item.id,
|
||||
ratio: item.ratio,
|
||||
brandNumber: item.brandNumber,
|
||||
staffName: item.staffName,
|
||||
identityCard: item.identityCard,
|
||||
storeId: item.storeId,
|
||||
storeName: item.storeName,
|
||||
staffNames: item.brandNumber + "--" + item.staffName,
|
||||
staffType: 2,
|
||||
};
|
||||
list.push(items);
|
||||
});
|
||||
this.$emit("staffslesData", list);
|
||||
},
|
||||
//改变员工 去除未选择员工列表中的员工
|
||||
changeStaff() {
|
||||
var that = this;
|
||||
var list = that.staffLists
|
||||
.concat(that.staffListCopy)
|
||||
.filter(function (v) {
|
||||
return (
|
||||
that.staffLists.indexOf(v) === -1 ||
|
||||
that.staffListCopy.indexOf(v) === -1
|
||||
);
|
||||
});
|
||||
this.staffList = list;
|
||||
},
|
||||
//获取员工数据
|
||||
//获取数据
|
||||
async getData() {
|
||||
let form = { id: "" };
|
||||
if (this.storeId) {
|
||||
form.storeId = this.storeId;
|
||||
}
|
||||
selectList(form).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
res.rows.forEach((item) => {
|
||||
item.editStaffRatioShow = false;
|
||||
});
|
||||
this.staffList = res.rows;
|
||||
this.staffListCopy = res.rows;
|
||||
} else {
|
||||
this.$alert(res.message, "加载员工提示", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -0,0 +1,80 @@
|
||||
<template>
|
||||
<el-dialog :close-on-click-modal="false" v-dialogDrag :title="title" :visible.sync="dialogVisible" width="500px">
|
||||
<el-table @row-dblclick="confirms" :data="list" @row-click="rowClick" max-height="600" v-loading="listLoading" :element-loading-text="elementLoadingText">
|
||||
<el-table-column label="选择" width="60">
|
||||
<template slot-scope="scope">
|
||||
<el-radio v-model="radio" :label="scope.row.id" @change.native="scope.row;">
|
||||
{{ "" }}
|
||||
</el-radio>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" width="100" prop="storeNum" label="门店编码"></el-table-column>
|
||||
<el-table-column align="center" min-width="120" prop="storeName" label="门店名称"></el-table-column>
|
||||
</el-table>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button size="mini" type="primary" plain @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button size="mini" type="primary" @click="confirms()">确 定
|
||||
</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { organization } from "@/api/storeManage.js";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
radio: null, //单选值
|
||||
radioForm: {}, //单选对象
|
||||
list: [], //主数组
|
||||
dialogVisible: false, //弹窗开关 //弹窗开关
|
||||
elementLoadingText: "数据加载中...", //list加载提示文字
|
||||
listLoading: false, //list加载提示开启动画
|
||||
title: "选择门店", //弹窗标题
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
//组件传值
|
||||
show(form) {
|
||||
this.list = [];
|
||||
this.radio = null;
|
||||
this.radioForm = {};
|
||||
this.dialogVisible = true;
|
||||
this.getData();
|
||||
},
|
||||
//点击选中
|
||||
rowClick(row) {
|
||||
this.radio = row.id;
|
||||
this.radioForm = row;
|
||||
},
|
||||
//获取数据
|
||||
async getData() {
|
||||
this.listLoading = true;
|
||||
let parentId = JSON.parse(sessionStorage.getItem("storeInfo")).id;
|
||||
organization({ parentId: parentId }).then((res) => {
|
||||
this.listLoading = false;
|
||||
if (res.code == "000000") {
|
||||
this.list = [...res.rows];
|
||||
} else {
|
||||
this.$alert(res.message, "获取门店信息", {
|
||||
confirmButtonText: "确定",
|
||||
confirmButtonClass: "confirmbtnFalses",
|
||||
type: "warning",
|
||||
center: true,
|
||||
callback: (action) => {},
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
//确定返回方法
|
||||
confirms() {
|
||||
this.radioForm.ratioShow = false;
|
||||
this.$emit("storeData", this.radioForm);
|
||||
this.dialogVisible = false;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
|
After Width: | Height: | Size: 29 KiB |
@ -0,0 +1,171 @@
|
||||
<template>
|
||||
<!-- 门店日报 -->
|
||||
<div>
|
||||
<div class="bottom-right flex justify-center flex-wrap padding-bottom">
|
||||
<el-tooltip effect="dark" :content="'今日客单总数为 ' + form.cashPeopleNum " placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-user i"></i>
|
||||
<br>
|
||||
<span>客单数</span>
|
||||
<div class="bottom-right-item-number">{{form.cashPeopleNum}}</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'今日总充值金额 ' + form.rechargeMoney +' , 总共充值人数为 ' +form.rechargeOrderNum" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-management i"></i>
|
||||
<br>
|
||||
<span>充值金额</span>
|
||||
<div>
|
||||
<div class="text-red text-price">{{form.rechargeMoney | money}}</div>
|
||||
<div>
|
||||
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class=" bottom-right-item-icon-number">{{form.rechargeOrderNum}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'今日总服务金额 ' + form.cashMoney +' , 男客 ' +form.man+'女客'+form.woman" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-finance i"></i>
|
||||
<br>
|
||||
<span>服务金额</span>
|
||||
<div>
|
||||
<div class="text-red text-price">{{form.cashMoney | money}}</div>
|
||||
<div>
|
||||
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class="text-blue bottom-right-item-icon-number">{{form.man}}</div>
|
||||
<i class="text-red el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class="text-red bottom-right-item-icon-number">{{form.woman}}</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'今日总还款金额 ' + form.repayMoney" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-ticket i"></i>
|
||||
<br>
|
||||
<span>还款金额</span>
|
||||
<div class="text-red text-price">{{form.repayMoney | money}}</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'今日总退款金额 ' + form.refundMoney" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-release i"></i>
|
||||
<br>
|
||||
<span>退款金额</span>
|
||||
<div class="text-red text-price">{{form.refundMoney | money}}</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'今日新增会员 ' + form.newMemberNum" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-marketing i"></i>
|
||||
<br>
|
||||
<span>新增会员</span>
|
||||
<div>
|
||||
<i class="text-blue el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class=" bottom-right-item-icon-number">{{form.newMemberNum}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'总使用中的会员数为 ' + form.startMemberNum" placement="top">
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-loading i"></i>
|
||||
<br>
|
||||
<span>启用会员</span>
|
||||
<div>
|
||||
<i class=" text-blue el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class=" bottom-right-item-icon-number">{{form.startMemberNum}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
<el-tooltip effect="dark" :content="'门店会员总数为 ' + form.memberNum" placement="top">
|
||||
|
||||
<div class="bottom-right-item">
|
||||
<i class="el-icon-s-data i"></i>
|
||||
<br>
|
||||
<span>会员总数</span>
|
||||
<div>
|
||||
<i class="text-blue el-icon-user-solid bottom-right-item-icon"></i>
|
||||
<div class=" bottom-right-item-icon-number">{{form.memberNum}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { storeDaily } from "../../api/statistics";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
form: {
|
||||
headCount: 68,
|
||||
rechargeMoney: 264568,
|
||||
rechargeOrderNum: 26,
|
||||
cashPeopleNum: 54,
|
||||
cashMoney: 344501,
|
||||
repayMoney: 5500,
|
||||
newMemberNum: 8,
|
||||
memberNum: 48,
|
||||
startMemberNum: 47,
|
||||
refundMoney: 3500,
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
storeDaily() {
|
||||
let form = JSON.parse(sessionStorage.getItem("userInfo"));
|
||||
storeDaily({ storeId: form.storeId }).then((res) => {
|
||||
if (res.code == "000000") {
|
||||
this.form = res.data;
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.storeDaily();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
.bottom-right {
|
||||
/* display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap; */
|
||||
max-height: 40vh;
|
||||
|
||||
overflow: auto;
|
||||
}
|
||||
.bottom-right-item {
|
||||
height: 80px;
|
||||
width: 130px;
|
||||
/* border: 1px solid #333; */
|
||||
text-align: center;
|
||||
padding: 25px 50px;
|
||||
}
|
||||
.bottom-right-item .i {
|
||||
font-size: 42px;
|
||||
color: #51a5ff;
|
||||
}
|
||||
.bottom-right-item span {
|
||||
font-size: 16px;
|
||||
color: #999;
|
||||
}
|
||||
.bottom-right-item-number {
|
||||
font-size: 36px;
|
||||
font-weight: 700;
|
||||
color: #f78;
|
||||
}
|
||||
.bottom-right-item-icon {
|
||||
font-size: 24px;
|
||||
}
|
||||
.bottom-right-item-icon-number {
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
color: #999;
|
||||
font-weight: 700;
|
||||
}
|
||||
</style>
|
||||