Commit 6ffe57a6 by golton_gao

update: code init

parents
Showing with 4782 additions and 0 deletions
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": [
"transform-runtime",
["component", [
{
"libraryName": "element-ui",
"styleLibraryName": "theme-default"
}
]]
],
"comments": false,
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": [ "istanbul" ]
}
}
}
\ No newline at end of file
node_modules
.svn
.git
dist
.DS_Store
.zip
\ No newline at end of file
{
"name": "城投项目动态",
"identifier": "com.cnd.jffc.testbaobiao",
"build": 90,
"version": "1.0.90",
"releaseNote": "湖滨取消强拆"
}
\ No newline at end of file
{
"name": "城投大运营",
"identifier": "com.cnd.jffc.cityinvestment",
"build": 16,
"version": "1.0.15",
"releaseNote": "1、调整项目动态数据展示。"
}
\ No newline at end of file
# 建发-城投报表
## 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
```
## 测试帐号
wu_b@cndrealty.com
xiaobin
hqhuang@cndrealty.com
zcm
huangsha@cndrealty.com
密码都为jffc@123
## 打包
将/src/shared/plugin.js切换为对应环境
require('./check-versions')()
process.env.NODE_ENV = 'production'
var ora = require('ora')
var rm = require('rimraf')
var path = require('path')
var chalk = require('chalk')
var webpack = require('webpack')
var config = require('./config')
var webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, function (err, stats) {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
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'
))
})
})
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
var shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var 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 () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var 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 (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '',
productionSourceMap: false,
appConfFile: 'CubeModule.json',
eslint: false,
autoRoutes: false,
autoImportStyle: true,
i18n: true,
friendlyErrorsPlugin: false,
packToZip: true,
vux: true,
// 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
},
dev: {
env: require('./dev.env'),
port: 8089,
autoOpenBrowser: false,
assetsSubDirectory: 'static',
assetsPublicPath: '',
proxyTable: {},
appConfFile: 'CubeModule.json',
eslint: false,
autoRoutes: false,
autoImportStyle: true,
i18n: true,
friendlyErrorsPlugin: true,
vux: true,
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
module.exports = {
NODE_ENV: '"production"'
}
var merge = require('webpack-merge')
var devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
require('./check-versions')()
var config = require('./config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
var os = require('os')
var platform = os.platform()
var childProcess = require('child_process')
console.log(platform)
if (platform !== 'win32') {
// 杀掉占用端口的进程
childProcess.exec('kill -9 `lsof -t -i:' + port + ' >/dev/null 2>&1`',function (error, stdout, stderr) {
console.log('killing the occupied port: ' + port)
if (error !== null) {
// console.error('exec error: ' + error)
}
})
}
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port
console.log(uri)
var _resolve
var readyPromise = new Promise(resolve => {
_resolve = resolve
})
console.log('> Starting dev server...')
devMiddleware.waitUntilValid(() => {
console.log('> Listening at ' + uri + '\n')
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
_resolve()
})
var server = app.listen(port)
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}
var path = require('path')
var config = require('./config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var env = process.env.NODE_ENV
var isAutoImportStyle = env === 'development' ? config.dev.autoImportStyle : config.build.autoImportStyle
var LessInjectorLoader = path.resolve(__dirname, '../src/libraries/packages/loaders/less-injector-loader/index.js')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
var cssLoader = {
loader: 'css-loader',
options: {
minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
var loaders = [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'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
function generateAutoImportStyleLessLoaders () {
return 'vue-style-loader!css-loader!less-loader!' + LessInjectorLoader + '?baseDir=shared&libDir=libraries&srcDir=src'
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
postcss: generateLoaders(),
less: isAutoImportStyle ? generateAutoImportStyleLessLoaders() : 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) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
var utils = require('./utils')
var config = require('./config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
})
}
var path = require('path')
var utils = require('./utils')
var config = require('./config')
var merge = require('webpack-merge')
var vuxLoader = require('vux-loader')
var vueLoaderConfig = require('./vue-loader.conf')
var env = process.env.NODE_ENV
var isAutoRoutes = env === 'development' ? config.dev.autoRoutes : config.build.autoRoutes
var isEslint = env === 'development' ? config.dev.eslint : config.build.eslint
var isI18n = env === 'development' ? config.dev.i18n : config.build.i18n
var isFriendlyErrorsPlugin = env === 'development' ? config.dev.friendlyErrorsPlugin : config.build.friendlyErrorsPlugin
var isVux = env === 'development' ? config.dev.vux : config.build.vux
var VuexI18nLoader = path.resolve(__dirname, '../src/libraries/packages/loaders/vuex-i18n-loader/index.js')
var RouterInjectorLoader = path.resolve(__dirname, '../src/libraries/packages/loaders/router-injector-loader/index.js')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
function generateCSSLoader () {
if (process.env.NODE_ENV === 'production') {
return ExtractTextPlugin.extract({
use: 'css-loader',
fallback: 'style-loader'
})
} else {
return ['style-loader', 'css-loader']
}
}
var rules = utils.styleLoaders({
sourceMap: config.dev.cssSourceMap
})
rules = rules.concat([
{
test: /\.(png|jpe?g|gif)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 1000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 1000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 1000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
])
var baseWebpackConfig = {
entry: {
app: ['babel-polyfill','./src/shared/main.js']
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src/shared'),
'~lib':resolve('src/libraries'),
'~com': resolve('src/shared/components'),
'~config' : resolve('src/shared/config'),
'~proj' : resolve('src/projectDynamic'),
'configuration': resolve(process.env.PACK_ENV === 'prod'
? './src/shared/config/prod'
: './src/shared/config/test')
}
},
module: {
rules: rules.concat([
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src/shared'), resolve('src/libraries'), resolve('src/projectDynamic'), resolve('test')],
exclude: /(node_modules|router\.js)/
},
{
test: /\.css$/,
use: generateCSSLoader()
},
{ test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader']
}, // 处理 scss 文件的 loader
])
}
}
// 集成国际化插件
if (isI18n) {
baseWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: [{
test: /\.vue$/,
enforce: 'pre',
use: {
loader: VuexI18nLoader,
options: {
extractToFiles: 'src/shared/locales/components.yml',
localeList: ['en', 'zh-CN']
}
},
include: [ resolve('src/shared'), resolve('src/libraries') ],
exclude: /node_modules/
}]
}
})
}
// 集成友好错误提示插件
if (isFriendlyErrorsPlugin) {
baseWebpackConfig = merge(baseWebpackConfig, {
plugins: [
new FriendlyErrorsPlugin()
]
})
}
// 集成vux
if (isVux) {
baseWebpackConfig = vuxLoader.merge(baseWebpackConfig, {
plugins: ['vux-ui', {
name: 'less-theme',
path: 'src/shared/assets/styles/variables.less'
}]
})
}
module.exports = baseWebpackConfig
var webpack = require('webpack')
var config = require('./config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var CopyWebpackPlugin = require('copy-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new CopyWebpackPlugin([
{
from: './src/libraries/components/Picture/images',
to: 'images/'
}
])
]
})
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('./config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var CopyWebpackPlugin = require('copy-webpack-plugin')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var ZipPlugin = require('zip-webpack-plugin')
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
var env = config.build.env
var rules = utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: rules
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
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 webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
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: 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'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// 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',
chunks: ['vendor']
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
},
{
from: path.resolve(path.join(__dirname, '../', config.build.appConfFile)),
to: path.resolve(path.join(config.build.assetsRoot, config.build.appConfFile)),
toType: 'file',
force: true,
flatten: true
}
])
]
})
if (config.build.productionGzip) {
var 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.packToZip){
webpackConfig.plugins.push(
new ZipPlugin({
path: config.build.assetsRoot,
filename: 'package.zip'
})
)
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>jf-citySheet</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<meta name="format-detection" content="telephone=no"/>
</head>
<body>
<div id="app"></div>
</body>
</html>
This diff could not be displayed because it is too large.
{
"name": "jf-operation2",
"version": "1.0.0",
"description": "建发V+移动开发框架",
"author": "zhj701",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"start": "npm run dev",
"build": "npm run build:test",
"build:test": "cross-env PACK_ENV=test node build/build.js",
"build:prod": "cross-env PACK_ENV=prod node build/build.js",
"build:report": "npm run build --report"
},
"dependencies": {
"animate.css": "^3.6.1",
"axios": "^0.16.1",
"babel-polyfill": "^6.26.0",
"better-scroll": "^1.12.6",
"clipboard": "^1.7.1",
"cordova-android": "^8.1.0",
"cordova-ios": "^5.1.1",
"cordova-plugin-whitelist": "1",
"crypto-js": "^3.1.9-1",
"echarts": "^3.6.1",
"element-ui": "^1.3.4",
"fastclick": "^1.0.6",
"iscroll": "^5.2.0",
"vant": "^2.5.7",
"viscroll": "^1.1.1",
"vue": "~2.3.0",
"vue-router": "~2.3.0",
"vue-scroller": "^2.2.1",
"vuex": "~2.3.0",
"vuex-i18n": "^1.3.4",
"vux": "^2.4.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-loader": "^7.1.1",
"babel-plugin-component": "^0.9.1",
"babel-plugin-istanbul": "^4.1.1",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"babel-register": "^6.22.0",
"chalk": "^1.1.3",
"compression-webpack-plugin": "^0.4.0",
"connect-history-api-fallback": "^1.3.0",
"copy-webpack-plugin": "^4.0.1",
"cross-env": "^4.0.0",
"css-loader": "^0.28.0",
"eventsource-polyfill": "^0.9.6",
"express": "^4.14.1",
"extract-text-webpack-plugin": "^2.0.0",
"file-loader": "^0.11.1",
"friendly-errors-webpack-plugin": "^1.1.3",
"html-webpack-plugin": "^2.28.0",
"http-proxy-middleware": "^0.17.3",
"json-loader": "^0.5.4",
"less": "^2.7.2",
"less-loader": "^4.0.4",
"loader-utils": "^1.1.0",
"opn": "^4.0.2",
"optimize-css-assets-webpack-plugin": "^1.3.0",
"ora": "^1.2.0",
"rimraf": "^2.6.0",
"sass": "^1.56.0",
"sass-loader": "^7.3.1",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"style-loader": "^0.17.0",
"touch": "^1.0.0",
"url-loader": "^0.5.8",
"vue-loader": "^11.3.4",
"vue-style-loader": "^2.0.5",
"vue-template-compiler": "~2.3.0",
"vux-loader": "^1.0.69",
"webpack": "^2.3.3",
"webpack-bundle-analyzer": "^2.2.1",
"webpack-dev-middleware": "^1.10.0",
"webpack-hot-middleware": "^2.18.0",
"webpack-merge": "^4.1.0",
"yaml-loader": "^0.4.0",
"zip-webpack-plugin": "^1.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
}
/* basic stylesheets */
.view-content {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: #f2f2f2;
&.has-header,
&[has-header] {
top: 48px;
}
}
/**
* vue-router transition
*/
.router-view {
width: 100%;
animation-duration: 0.5s;
animation-fill-mode: both;
backface-visibility: hidden;
}
.vux-pop-out-enter-active,
.vux-pop-out-leave-active,
.vux-pop-in-enter-active,
.vux-pop-in-leave-active {
will-change: transform;
height: 100%;
position: absolute;
left: 0;
}
.vux-pop-out-enter-active {
animation-name: popInLeft;
}
.vux-pop-out-leave-active {
animation-name: popOutRight;
}
.vux-pop-in-enter-active {
perspective: 1000;
animation-name: popInRight;
}
.vux-pop-in-leave-active {
animation-name: popOutLeft;
}
@keyframes popInLeft {
from {
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
@keyframes popOutLeft {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translate3d(-100%, 0, 0);
}
}
@keyframes popInRight {
from {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
to {
opacity: 1;
transform: translate3d(0, 0, 0);
}
}
@keyframes popOutRight {
from {
opacity: 1;
}
to {
opacity: 0;
transform: translate3d(100%, 0, 0);
}
}
/* only for variables */
@color-red: #ff0000;
<template>
<button class="btn" :data-clipboard-target="target" :data-clipboard-action="action" >Copy</button>
</template>
<script>
import Clipboard from 'Clipboard'
export default{
name: 'Clipboard',
props: ['target', 'action', 'text'],
methods: {
success: function () {
this.$emit('success')
},
error: function () {
this.$emit('error')
}
},
mounted () {
var self = this
var clipboard
console.log(this.text)
if (!this.text) {
clipboard = new Clipboard('.btn')
} else {
console.log(self.text)
clipboard = new Clipboard('.btn', {
text: function () {
return self.text
}
})
}
clipboard.on('success', function () {
self.success()
})
clipboard.on('error', function () {
self.error()
})
}
}
</script>
.weui-loading {
width:20px;
height:20px;
display: inline-block;
vertical-align: middle;
animation: weuiLoading 1s steps(12, end) infinite;
background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
background-size: 100%;
&.weui-loading_transparent{
background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 100 100'%3E%3Cpath fill='none' d='M0 0h100v100H0z'/%3E%3Crect xmlns='http://www.w3.org/2000/svg' width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.56)' rx='5' ry='5' transform='translate(0 -30)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.5)' rx='5' ry='5' transform='rotate(30 105.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.43)' rx='5' ry='5' transform='rotate(60 75.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.38)' rx='5' ry='5' transform='rotate(90 65 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.32)' rx='5' ry='5' transform='rotate(120 58.66 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.28)' rx='5' ry='5' transform='rotate(150 54.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.25)' rx='5' ry='5' transform='rotate(180 50 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.2)' rx='5' ry='5' transform='rotate(-150 45.98 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.17)' rx='5' ry='5' transform='rotate(-120 41.34 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.14)' rx='5' ry='5' transform='rotate(-90 35 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.1)' rx='5' ry='5' transform='rotate(-60 24.02 65)'/%3E%3Crect width='7' height='20' x='46.5' y='40' fill='rgba(255,255,255,.03)' rx='5' ry='5' transform='rotate(-30 -5.98 65)'/%3E%3C/svg%3E");
}
}
@-webkit-keyframes weuiLoading {
0% {
transform: rotate3d(0, 0, 1, 0deg);
}
100% {
transform: rotate3d(0, 0, 1, 360deg);
}
}
@keyframes weuiLoading {
0% {
transform: rotate3d(0, 0, 1, 0deg);
}
100% {
transform: rotate3d(0, 0, 1, 360deg);
}
}
.weui-icon_toast.weui-loading {
margin: 30px 0 0;
width: 38px;
height: 38px;
vertical-align: baseline;
display: inline-block;
}
\ No newline at end of file
.weui-mask_transparent{
position: fixed;
z-index: 1000;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
.weui-toast {
position: fixed;
z-index: 5000;
width: 7.6em;
min-height: 7.6em;
top: 180px;
left: 50%;
margin-left: -3.8em;
background: rgba(17,17,17,0.7);
text-align: center;
border-radius: 5px;
color: #FFFFFF;
}
.weui-icon_toast {
margin: 22px 0 0;
display: block;
&.weui-icon-success-no-circle{
&:before {
color: #FFFFFF;
font-size: 55px;
}
}
&.weui-loading{
margin:30px 0 0;
width:38px;
height:38px;
vertical-align: baseline;
}
}
.weui-toast__content {
margin: 0 0 15px;
}
<template>
<div class="weui-loading_toast" v-show="show">
<div class="weui-mask_transparent"></div>
<div class="weui-toast" :style="{ position: position }">
<i class="weui-loading weui-icon_toast"></i>
<p class="weui-toast__content">{{ $t(text) || $t('loading') }}<slot></slot></p>
</div>
</div>
</template>
<i18n>
loading:
en: loading
zh-CN: 加载中
</i18n>
<script>
export default {
props: {
value: {
type: Boolean,
default: false
},
text: String,
position: String,
hideDelay: {
type: Number,
default: 0
},
isShow: {
type: Boolean,
default: true
}
},
created () {
this.show = this.value
},
data () {
return {
show: false
}
},
watch: {
value (val) {
this.show = val
},
show (val) {
this.$emit('input', val)
}
}
}
</script>
<style lang="less">
@import './assets/styles/mask';
@import './assets/styles/toast';
@import './assets/styles/loading';
</style>
icon: '&#xe610;'
tags:
en:
- loading
- dialog
zh-CN:
- 加载
- 弹窗
- 提示
props:
value:
type: Boolean
default: false
en: visibility of the component
zh-CN: 显示状态,使用`v-model`绑定
text:
type: String
default: ''
en: loading text
zh-CN: 提示文字
position:
type: String
default: 'fixed'
en: position, default is `fixed`, you can use `absolute`
zh-CN: 定位方式,默认为`fixed`,在100%的布局下用`absolute`可以避免抖动
slots:
default:
en: content area
zh-CN: 提示文字区域
changes:
v2.0.1:
zh-CN:
- '[fix] i18n 无配置'
\ No newline at end of file
<template>
<actionsheet v-model="show" :menus="menus1" @on-click-menu="click" show-cancel></actionsheet>
</template>
<script>
import { Actionsheet } from 'vux'
import picture from './picture'
export default {
components: {
Actionsheet
},
props: {
value: Boolean,
feedback: Function
},
data () {
return {
menus1: {
1: '拍照',
2: '本地上传'
},
show: false
}
},
watch: {
show (val) {
this.$emit('input', val)
},
value: {
handler: function (val) {
this.show = val
},
immediate: true
}
},
methods: {
click (key) {
let feedback = (imgObj) => {
this.$emit('on-feedback', imgObj)
}
picture.selectPicture(key, feedback)
}
}
}
</script>
<style lang="less">
</style>
import factory from '../../plugins/factory'
import $conf from 'configuration'
const imgPackageHeader = 'data:image/jpeg;base64,'
const imgDefaultBase64Code = '/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABQAAD/4QMpaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjAtYzA2MCA2MS4xMzQ3NzcsIDIwMTAvMDIvMTItMTc6MzI6MDAgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgV2luZG93cyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozMzM5RDY2ODMyNzQxMUU1QTJENkEwOTg5MjdGQTczNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozMzM5RDY2OTMyNzQxMUU1QTJENkEwOTg5MjdGQTczNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMzMzlENjY2MzI3NDExRTVBMkQ2QTA5ODkyN0ZBNzM2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjMzMzlENjY3MzI3NDExRTVBMkQ2QTA5ODkyN0ZBNzM2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAAgICAgICAgICAgMCAgIDBAMCAgMEBQQEBAQEBQYFBQUFBQUGBgcHCAcHBgkJCgoJCQwMDAwMDAwMDAwMDAwMDAEDAwMFBAUJBgYJDQsJCw0PDg4ODg8PDAwMDAwPDwwMDAwMDA8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAEAAQAwERAAIRAQMRAf/EAG8AAAMBAAAAAAAAAAAAAAAAAAQFBggBAAIDAAAAAAAAAAAAAAAAAAMEBQcIEAABBAEDBAMAAAAAAAAAAAABAgMEBQYAERIhMUEHYSIUEQACAgAGAgMBAAAAAAAAAAABAhEDACFREgQFMUFhoRQi/9oADAMBAAIRAxEAPwDWfripp7WwyFy7q13MWmoZtmzXIecYLr0ct8U82vsN+RGq06+pHZt67gqkxMZiNMaH73k3U11ip9hexV3QDAafRywd7BxuorKfDchrKaXjLmTtTVS8cmPl9TP5HUIQ8hTiUOcHgokch46EjronP46IldiqV3T/ACTMQfOsH5wHpOfdddfRY62CsrDqIncCSDBIlYzjXPCbBMsGHy76ehyUxNn0kuvq5UTYLZlPFBbcKipJSElPUjc/Gg8LlfnZmzkqQI9E4a7jrf3pWhAKrYrMD4KiZHg64mLW4tr2WqfdWcq1mrASqVLdW85xHZIUskgDwOw0tbc9rbnJJ+c8SHG4tXGTZUgVdAAB9Y//2Q=='
const destinationTypes = {
THUMB_URL_AND_FILE_URI: -1, // 非cordova自带类型, 返回略缩图和原图的url的json对象
DATA_URL: 0, // Return image as base64-encoded string
FILE_URI: 1, // Return image file URI
NATIVE_URI: 2 // Return image native URI (e.g. assets-library:// on iOS or content:// on Android)
}
const Camera = window.Camera = {}
if (!factory.product) {
Camera.DestinationType = {
THUMB_URL_AND_FILE_URI: -1, // 非cordova自带类型, 返回略缩图和原图的url的json对象
DATA_URL: 0, // Return image as base64-encoded string
FILE_URI: 1, // Return image file URI
NATIVE_URI: 2 // Return image native URI (e.g. assets-library:// on iOS or content:// on Android)
}
Camera.PictureSourceType = {
PHOTOLIBRARY: 0,
CAMERA: 1,
SAVEDPHOTOALBUM: 2
}
Camera.EncodingType = {
JPEG: 0, // Return JPEG encoded image
PNG: 1 // Return PNG encoded image
}
Camera.MediaType = {
PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType
VIDEO: 1, // allow selection of video only, WILL ALWAYS RETURN FILE_URI
ALLMEDIA: 2 // allow selection from all media types
}
Camera.Direction = {
BACK: 0, // Use the back-facing camera
FRONT: 1 // Use the front-facing camera
}
}
var getPicture = function (type, params, feedback) {
params = params || {}
var quality = params.hasOwnProperty('quality') ? params.quality : 75
var allowEdit = params.hasOwnProperty('allowEdit') ? params.allowEdit : false
var saveToPhotoAlbum = params.hasOwnProperty('saveToPhotoAlbum') ? params.saveToPhotoAlbum : false
if (!$conf.product) {
feedback({
fileUrl: `images/${Math.round(Math.random() * 3)}.jpeg`,
base64Code: imgDefaultBase64Code,
base64Url: imgPackageHeader + imgDefaultBase64Code
})
} else {
factory.getPicture({
quality: quality,
destinationType: destinationTypes.DATA_URL,
allowEdit: allowEdit,
encodingType: Camera.EncodingType.JPEG,
targetWidth: 375,
targetHeight: 667,
saveToPhotoAlbum: saveToPhotoAlbum,
sourceType: type,
mediaType: Camera.MediaType.PICTURE,
correctOrientation: true,
cameraDirection: Camera.Direction.BACK
}).then(function (data) {
feedback({
base64Code: data,
base64Url: imgPackageHeader + data
})
}, function (data) {
console.log(data)
})
}
}
let selectPicture = function (key, feedback) {
let maxNum = 1
let isSingle = true
let quality = 75
let allowEdit = false
let saveToPhotoAlbum = false
let noneSelect = false
let widthRate = 1
let heightRate = 1
let maxWidth = 720
let maxHeight = 1280
let params = {
isSingle: isSingle,
maxNum: maxNum,
quality: quality,
allowEdit: allowEdit,
saveToPhotoAlbum: saveToPhotoAlbum,
noneSelect: noneSelect,
widthRate: widthRate,
heightRate: heightRate,
maxWidth: maxWidth,
maxHeight: maxHeight
}
if (key === '1') {
getPicture(Camera.PictureSourceType.CAMERA, params, feedback)
} else if (key === '2') {
getPicture(Camera.PictureSourceType.SAVEDPHOTOALBUM, params, feedback)
}
}
var urlEncodeForBase64Code = function (base64Code) {
return base64Code ? base64Code.replace(/\+/g, '%2B') : ''
}
export default {
selectPicture: selectPicture,
urlEncodeForBase64Code: urlEncodeForBase64Code
}
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="17px" viewBox="0 0 20 17" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 45.1 (43504) - http://www.bohemiancoding.com/sketch -->
<title>back</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="1-0群投票气泡" transform="translate(-15.000000, -31.000000)">
<g id="Navigation-Bar01">
<g id="Group-12" transform="translate(15.000000, 30.000000)">
<g id="back">
<path d="M0.25964958,10.2045312 C0.100509421,10.0675075 -1.42108547e-14,9.8656409 -1.42108547e-14,9.63888889 C-1.42108547e-14,9.4234076 0.0894287904,9.22915078 0.235659367,9.0923507 C0.272356111,9.0061165 0.326015176,8.92518393 0.396710468,8.85448864 L7.82040714,1.43079197 C8.11355566,1.13764345 8.58659436,1.13539449 8.88152958,1.4303297 C9.17442279,1.72322292 9.17605854,2.19646091 8.88106731,2.49145214 L2.48363056,8.88888889 L19.2403984,8.88888889 C19.6599148,8.88888889 20,9.22178751 20,9.63888889 C20,10.0531025 19.6695492,10.3888889 19.2403984,10.3888889 L2.51546794,10.3888889 L8.88106731,16.7544883 C9.17605854,17.0494795 9.17442279,17.5227175 8.88152958,17.8156107 C8.58659436,18.1105459 8.11355566,18.108297 7.82040714,17.8151484 L0.396710468,10.3914518 C0.340119598,10.3348609 0.294445271,10.2717101 0.25964958,10.2045312 Z" id="Rectangle-69" fill="#FFFFFF"></path>
<rect id="Rectangle-2" x="0" y="0" width="21" height="19"></rect>
</g>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<template>
<header class="c-header">
<section class="header-left">
<a class="back-btn" href="javascript:;" @click="goBack"><i class="icon__header-back"></i></a>
<slot name="left"></slot>
</section>
<h2 class="header-title" @click="clickTitle"><slot></slot></h2>
<section class="header-right"><slot name="right"></slot></section>
</header>
</template>
<script>
export default {
name: 'CHeader',
methods: {
goBack () {
this.$router.go(-1)
this.$emit('on-click-back')
},
clickTitle () {
this.$emit('on-click-title')
}
}
}
</script>
<style lang="less" scoped>
.c-header {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 40px;
padding-top: 3px;
padding-bottom: 3px;
line-height: 40px;
color: #ffffff;
background-color: #484759;
overflow: hidden;
z-index: 100;
&:after {
content: '\20';
display: block;
height: 0;
clear: both;
}
}
.header-title {
position: absolute;
top: 50%;
left: 50%;
font-size: 18px;
transform: translate(-50%, -50%);
z-index: 10;
}
.header-right,
.header-left {
width: 50%;
height: 100%;
font-size: 16px;
box-sizing: border-box;
overflow: hidden;
& > a {
display: block;
color: #fff;
}
}
.header-right {
float: right;
padding-right: 15px;
& > a {
float: right;
margin-left: 10px;
}
}
.header-left {
float: left;
padding-left: 15px;
& > a {
float: left;
margin-right: 10px;
}
}
.back-btn {
margin-top: 11px;
}
.icon__header-back {
display: block;
width: .20rem;
height: .168rem;
background-image: url('assets/icon__header-back.svg');
background-size: 100% 100%;
}
</style>
// 回到离开前的位置
export const scrollBackTo = {
activated () {
// nodelisttable记住并滚动到原来的位置
let scrollerY = this.$store.state.shareStore.nodeListTablePositon.y || 0
if (scrollerY) {
setTimeout(() => {
this.$refs.nodeListScroller.scrollTo(0, scrollerY, false)
}, 20)
}
},
beforeRouteLeave(to,from,next){ // 记录离开时的位置
let positionY = this.$refs.nodeListScroller.getPositionY() || 0
this.$store.commit('setPosition', {y: positionY})
if (to.name !== 'nodeInfo') {
this.planCompleteTimeFrom = ''
this.planCompleteTimeTo = ''
}
next()
}
}
export const redefinePosition = {
methods: {
// 重新封装scroller方法:获取滚动位置
getPositionY(){
// console.log(this.$refs.scroller.getPosition())
return this.$refs.scroller.getPosition().top
},
// 重新封装scroller方法:获取滚动位置
scrollTo(x, y, animate){
this.$refs.scroller.scrollTo(x, y, animate)
}
}
}
// 使用时: import { scrollBackTo } from '~lib/mixins/overallPlanMixin'
\ No newline at end of file
var loaderUtils = require('loader-utils')
var path = require('path')
module.exports = function (source) {
var self = this
self.cacheable && self.cacheable()
var options = loaderUtils.getOptions(self) || {}
var projectRoot = self.options.context || path.resolve(__dirname, '../../../')
var baseDir = options.baseDir || 'shared'
var libDir = options.libDir || 'libraries'
var srcDir = options.srcDir || 'src'
var basePath = path.normalize(self.resourcePath).replace(/\\/g, '/')
var baseReg = new RegExp('' + baseDir + '\\/components', 'gim')
var libReg = new RegExp('' + libDir + '\\/components', 'gim')
var appReg = new RegExp('' + baseDir + '\\/app\\.vue$', 'gim')
var ref, libVarRef, libMixinRef, libBasicsRef, sharedVarRef, sharedMixinRef, sharedBasicsRef, str
if (baseReg.test(basePath)) {
ref = path.normalize(path.relative(basePath, path.join(projectRoot, srcDir, baseDir)))
libVarRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'variables.less')).replace(/\\/g, '/')
libMixinRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'mixins.less')).replace(/\\/g, '/')
sharedVarRef = path.normalize(path.join(ref, baseDir, 'assets', 'styles', 'variables.less')).replace(/\\/g, '/')
sharedMixinRef = path.normalize(path.join(ref, baseDir, 'assets', 'styles', 'mixins.less')).replace(/\\/g, '/')
str = ''
str += '@import \'' + libVarRef + '\';' + '\n'
str += '@import \'' + libMixinRef + '\';' + '\n'
str += '@import \'' + sharedVarRef + '\';' + '\n'
str += '@import \'' + sharedMixinRef + '\';' + '\n'
return str + source
} else if (libReg.test(basePath)) {
ref = path.normalize(path.relative(basePath, path.join(projectRoot, srcDir, libDir)))
libVarRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'variables.less')).replace(/\\/g, '/')
libMixinRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'mixins.less')).replace(/\\/g, '/')
str = ''
str += '@import \'' + libVarRef + '\';' + '\n'
str += '@import \'' + libMixinRef + '\';' + '\n'
return str + source
} else if (appReg.test(basePath)) {
ref = path.normalize(path.relative(basePath, path.join(projectRoot, srcDir, baseDir)))
libVarRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'variables.less')).replace(/\\/g, '/')
libMixinRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'mixins.less')).replace(/\\/g, '/')
libBasicsRef = path.normalize(path.join(ref, libDir, 'assets', 'styles', 'basics.less')).replace(/\\/g, '/')
sharedVarRef = path.normalize(path.join(ref, baseDir, 'assets', 'styles', 'variables.less')).replace(/\\/g, '/')
sharedMixinRef = path.normalize(path.join(ref, baseDir, 'assets', 'styles', 'mixins.less')).replace(/\\/g, '/')
sharedBasicsRef = path.normalize(path.join(ref, baseDir, 'assets', 'styles', 'basics.less')).replace(/\\/g, '/')
str = ''
str += '@import \'' + libVarRef + '\';' + '\n'
str += '@import \'' + libMixinRef + '\';' + '\n'
str += '@import \'' + libBasicsRef + '\';' + '\n'
str += '@import \'' + sharedVarRef + '\';' + '\n'
str += '@import \'' + sharedMixinRef + '\';' + '\n'
str += '@import \'' + sharedBasicsRef + '\';' + '\n'
return str + source
} else {
return source
}
}
var loaderUtils = require('loader-utils')
var path = require('path')
var fs = require('fs')
module.exports = function (source) {
var self = this
self.cacheable && self.cacheable()
var options = loaderUtils.getOptions(self) || {}
var projectRoot = self.options.context || path.resolve(__dirname, '../../../')
var baseDir = options.baseDir || 'shared'
var srcDir = options.srcDir || 'src'
var componentPath = path.join(projectRoot, srcDir, baseDir, 'components')
var componentsLog = path.join(componentPath, '.map')
var routes = {}
var rootRouteList = []
var asyncList = []
if (fs.existsSync(componentsLog)) {
self.addDependency(componentsLog)
}
var replaceAll = function (str) {
return str.replace(/\./g, '/')
}
var parseDir = function (parentPath, parentComp) {
parentComp = parentComp || ''
fs.readdirSync(parentPath).forEach(function (comp) {
var componentPath = path.join(parentPath, comp)
// console.log(comp)
if (
comp !== '.map' &&
comp !== '.sub-auto-route' &&
comp !== '.static-auto-route' &&
comp !== '.none-auto-route' &&
!fs.existsSync(path.join(componentPath, '.none-auto-route'))
) {
if (fs.existsSync(path.join(componentPath, 'index.vue'))) {
var route = {
name: parentComp ? parentComp + '.' + comp : comp,
parentComp: parentComp,
comp: comp,
componentPath: componentPath,
isStatic: fs.existsSync(path.join(componentPath, '.static-auto-route')),
isChildren: fs.existsSync(path.join(componentPath, '.sub-auto-route')),
children: []
}
routes[route.name] = route
if (route.parentComp) {
routes[parentComp].children.push(route.name)
} else {
rootRouteList.push(route.name)
}
if (!route.isStatic) {
asyncList.push('\'/' + replaceAll(route.name.toLowerCase()) + '\'')
}
if (route.isChildren) {
parseDir(componentPath, route.name)
}
}
}
})
}
var parseRoutes = function (routeList) {
var list = []
routeList = routeList || []
routeList.forEach(function (name) {
var str = ''
var route = routes[name]
str += '{\n'
str += ' name: \'' + route.name.toLowerCase() + '\','
str += ' path: \'/' + replaceAll(route.name.toLowerCase()) + '\','
if (route.isStatic) {
str += ' component: require(\'./components/' + replaceAll(route.name) + '/index.vue\')'
} else {
str += ' component: function (resolve) { require([\'./components/' + replaceAll(route.name) + '/index.vue\'], resolve) }'
}
if (route.isChildren) {
str += ',\n' + ' children: ' + parseRoutes(route.children, false)
}
str += '\n}'
list.push(str)
})
return '[\n' + list.join(',\n') + '\n]'
}
parseDir(componentPath)
// console.log(JSON.stringify(routes))
// console.log('=============================')
// console.log(rootRouteList)
var routeStr = parseRoutes(rootRouteList)
// console.log(routeStr)
// console.log(asyncList)
var asyncStr = '[\n' + asyncList.join(',\n') + '\n]'
// console.log(asyncStr)
source = source.replace('var routes = []', 'var routes = ' + routeStr)
source = source.replace('var asyncList = []', 'var asyncList = ' + asyncStr)
// console.log(source)
return source
}
var loaderUtils = require('loader-utils')
var _ = require('underscore')
var touch = require('touch')
var yamlReader = require('js-yaml')
var fs = require('fs')
var path = require('path')
module.exports = function (source) {
var self = this
self.cacheable && self.cacheable()
var options = loaderUtils.getOptions(self) || {}
var langs = options.localeList || ['en', 'zh-CN']
var extractToFiles = options.extractToFiles || 'src/shared/locales/components.yml'
var projectRoot = self.options.context || path.resolve(__dirname, '../../../')
var savePath = path.resolve(projectRoot, extractToFiles)
var results = source.match(/<i18n[^>]*>([\s\S]*?)<\/i18n>/)
if (results) {
try {
var local = yamlReader.safeLoad(results[1])
var rs = parseI18n(local, langs)
var finalConfig
touch.sync(savePath)
var currentConfig = fs.readFileSync(savePath, 'utf-8')
if (!currentConfig) {
finalConfig = rs.translations
} else {
finalConfig = mergeLang(yamlReader.safeLoad(currentConfig), rs.translations)
}
if (!currentConfig || (currentConfig && JSON.stringify(yamlReader.safeLoad(currentConfig)) !== JSON.stringify(finalConfig))) {
fs.writeFileSync(savePath, yamlReader.safeDump(finalConfig))
}
} catch (e) {
console.log(e)
console.log('yml 格式有误,请重新检查')
}
}
return source
}
function parseI18n (json, langs) {
langs = langs || []
if (!langs || !langs.length) {
for (var k in json) {
langs = langs.concat(Object.keys(json[k]))
}
langs = _.uniq(langs)
}
var rs = {}
for (var i = 0; i < langs.length; i++) {
var lang = langs[i]
if (!rs[lang]) {
rs[lang] = {}
}
for (var j in json) {
rs[lang][j] = json[j][lang] || j
}
}
return {
langs: langs,
translations: rs
}
}
function mergeLang (a, b) {
for (var i in b) {
for (var j in b[i]) {
if (!a[i]) {
a[i] = b[i]
}
a[i][j] = b[i][j]
}
}
return a
}
const fs = require('fs')
const path = require('path')
module.exports = function (callerPath, useSubdirs, regexpression) {
const rootpath = module.parent.paths[0].replace(/\/node_modules/, '/')
const reg = new RegExp(regexpression)
callerPath = path.join(rootpath, callerPath)
let list = []
const parseDir = function (parentPath) {
fs.readdirSync(parentPath).forEach(function (comp) {
const componentPath = path.join(parentPath, comp)
if (!fs.statSync(componentPath).isDirectory()) {
if (reg.test(componentPath)) {
list.push(componentPath)
}
} else if (useSubdirs) {
parseDir(componentPath)
}
})
}
parseDir(callerPath)
for (const item of list) {
require(item)
}
return list
}
import axios from 'axios'
import jsonp from './jsonp/index'
export default {
install(Vue) {
let $loading = Vue.$loading
if (!$loading) {
console.error('Cannot load loading Plugin')
return
}
var requestCount = 0;
// axios.defaults.headers = {
// withCredentials: true
// }
axios.interceptors.request.use(function (config) {
requestCount++;
$loading.show(config && config.loading || {})
return Promise.resolve(config)
}, function (error) {
$loading.hide({}, error, $loading.ajaxFeedbackType.REQ_FAIL)
return Promise.reject(error)
})
axios.interceptors.response.use(function (response) {
requestCount--
if (requestCount == 0) {
$loading.hide({}, response, $loading.ajaxFeedbackType.RES_SUCC)
}
return Promise.resolve(response)
}, function (error) {
requestCount--
console.log(error, '报错了')
$loading.hide({}, error, $loading.ajaxFeedbackType.RES_SUCC)
return Promise.reject(error)
})
axios.jsonp = function (url, config) {
return jsonp(axios, url, config)
}
Vue.prototype.$http = axios
},
$http: axios
}
export const $http = axios
\ No newline at end of file
import Request from './request'
import InterceptorHandler from './interceptorHandler'
export default function (axios, url, config) {
return new Promise((resolve, reject) => {
var request = new Request(axios, url, config)
var iHandler = new InterceptorHandler(axios)
var callback = request.jsonpCallback
var src = request.getUrl()
var body = null
var script
var handler = ({
type
}) => {
var status = 0
if (type === 'load' && body !== null) {
status = 200
} else if (type === 'error') {
status = 500
} else if (type === 'abort') {
status = 408
}
var ok = status >= 200 && status < 300
if (status && window[callback]) {
delete window[callback]
document.body.removeChild(script)
}
if (ok) {
// 响应成功
resolve(request.respondWith(body, {
status,
ok
}))
} else {
// 响应失败
reject(request.respondWith(body, {
status,
ok
}))
}
}
request.abort = () => {
handler({
type: 'abort'
})
}
if (request.timeout) {
setTimeout(request.abort, request.timeout)
}
window[callback] = result => {
body = JSON.stringify(result)
}
script = document.createElement('script')
script.src = src
script.type = 'text/javascript'
script.async = true
script.onload = handler
script.onerror = handler
try {
document.body.appendChild(script)
// 请求成功
iHandler.requestSuccess(request)
} catch (e) {
// 请求失败
iHandler.requestFail(request)
console.log('request fail:')
console.error(e)
}
})
}
\ No newline at end of file
export default class InterceptorHandler {
constructor (axios) {
var self = this
this.axios = axios
this.reqSuccHandlers = []
this.reqFailHandlers = []
this.resSuccHandlers = []
this.resFailHandlers = []
this.axios.interceptors.request.handlers.forEach(function (interceptor) {
self.reqSuccHandlers.push(interceptor.fulfilled)
self.reqFailHandlers.push(interceptor.rejected)
})
this.axios.interceptors.response.handlers.forEach(function (interceptor) {
self.resSuccHandlers.push(interceptor.fulfilled)
self.resFailHandlers.push(interceptor.rejected)
})
}
requestSuccess (request) {
this.reqSuccHandlers.forEach(function (handler) {
handler(request)
})
}
requestFail (request) {
this.reqFailHandlers.forEach(function (handler) {
handler(request)
})
}
responseSuccess (response) {
this.resSuccHandlers.forEach(function (handler) {
handler(response)
})
}
responseFail (response) {
this.resFailHandlers.forEach(function (handler) {
handler(response)
})
}
}
import Url from './url'
import { assign, toUpper } from './util'
import Response from './response'
export default class Request {
constructor (axios, url, config) {
assign(this, config, {
axios: axios,
url: url,
jsonp: config.jsonp || 'callback',
jsonpCallback: config.jsonpCallback || '_jsonp' + Math.random().toString(36).substr(2),
loading: config.loading || {},
method: toUpper(config.method || 'GET'),
timeout: 30000,
params: config.params || {}
})
this.params[this.jsonp] = this.jsonpCallback
}
getUrl () {
return Url(this)
}
respondWith (body, options) {
return new Response(this.axios, body, assign(options || {}, {url: this.getUrl()}))
}
}
/**
* HTTP Response.
*/
import { when, isBlob, isString, isPlainObject } from './util'
import InterceptorHandler from './interceptorHandler'
export default class Response {
constructor (axios, body, {url, status, ok}) {
this.axios = axios
this.url = url
this.ok = ok || false
this.status = status || 0
this.body = body
if (isString(body)) {
this.bodyText = body
this.body = JSON.parse(body)
} else if (isBlob(body)) {
this.bodyBlob = body
if (isBlobText(body)) {
this.bodyText = blobText(body)
}
} else if (isPlainObject(body)) {
this.bodyText = JSON.stringify(body)
}
var iHandler = new InterceptorHandler(axios)
if (this.ok) {
// 响应成功
iHandler.responseSuccess(this)
} else {
// 响应失败
iHandler.responseFail(this)
}
}
blob () {
return when(this.bodyBlob)
}
text () {
return when(this.bodyText)
}
json () {
return when(this.text(), text => JSON.parse(text))
}
}
function blobText (body) {
return new Promise((resolve) => {
/* eslint-disable no-undef */
var reader = new FileReader()
reader.readAsText(body)
reader.onload = () => {
resolve(reader.result)
}
})
}
function isBlobText (body) {
return body.type.indexOf('text') === 0 || body.type.indexOf('json') !== -1
}
/**
* Service for URL templating.
*/
import root from './root'
import query from './query'
import template from './template'
import { each, merge, isArray, isFunction, isObject, isPlainObject, isString } from '../util'
export default function Url (url, params) {
var self = this || {}
var options = url
var transform
if (isString(url)) {
options = {url, params}
}
options = merge({}, Url.options, self.$options, options)
Url.transforms.forEach(handler => {
transform = factory(handler, transform, self.$vm)
})
return transform(options)
}
/**
* Url options.
*/
Url.options = {
url: '',
root: null,
params: {}
}
/**
* Url transforms.
*/
Url.transforms = [template, query, root]
/**
* Encodes a Url parameter string.
*
* @param {Object} obj
*/
Url.params = function (obj) {
var params = []
var escape = encodeURIComponent
params.add = function (key, value) {
if (isFunction(value)) {
value = value()
}
if (value === null) {
value = ''
}
this.push(escape(key) + '=' + escape(value))
}
serialize(params, obj)
return params.join('&').replace(/%20/g, '+')
}
/**
* Parse a URL and return its components.
*
* @param {String} url
*/
Url.parse = function (url) {
var el = document.createElement('a')
if (document.documentMode) {
el.href = url
url = el.href
}
el.href = url
return {
href: el.href,
protocol: el.protocol ? el.protocol.replace(/:$/, '') : '',
port: el.port,
host: el.host,
hostname: el.hostname,
pathname: el.pathname.charAt(0) === '/' ? el.pathname : '/' + el.pathname,
search: el.search ? el.search.replace(/^\?/, '') : '',
hash: el.hash ? el.hash.replace(/^#/, '') : ''
}
}
function factory (handler, next, vm) {
return (options) => {
return handler.call(vm, options, next)
}
}
function serialize (params, obj, scope) {
var array = isArray(obj)
var plain = isPlainObject(obj)
var hash
each(obj, (value, key) => {
hash = isObject(value) || isArray(value)
if (scope) {
key = scope + '[' + (plain || hash ? key : '') + ']'
}
if (!scope && array) {
params.add(value.name, value.value)
} else if (hash) {
serialize(params, value, key)
} else {
params.add(key, value)
}
})
}
/**
* Query Parameter Transform.
*/
import Url from './index'
import { each } from '../util'
export default function (options, next) {
var urlParams = Object.keys(Url.options.params)
var query = {}
var url = next(options)
each(options.params, (value, key) => {
if (urlParams.indexOf(key) === -1) {
query[key] = value
}
})
query = Url.params(query)
if (query) {
url += (url.indexOf('?') === -1 ? '?' : '&') + query
}
return url
}
/**
* Root Prefix Transform.
*/
import { isString } from '../util'
export default function (options, next) {
var url = next(options)
if (isString(options.root) && !url.match(/^(https?:)?\//)) {
url = options.root + '/' + url
}
return url
}
/**
* URL Template (RFC 6570) Transform.
*/
import { expand } from './url-template'
export default function (options) {
var variables = []
var url = expand(options.url, options.params, variables)
variables.forEach((key) => {
delete options.params[key]
})
return url
}
/**
* URL Template v2.0.6 (https://github.com/bramstein/url-template)
*/
export function expand (url, params, variables) {
var tmpl = parse(url)
var expanded = tmpl.expand(params)
if (variables) {
variables.push.apply(variables, tmpl.vars)
}
return expanded
}
export function parse (template) {
var operators = ['+', '#', '.', '/', ';', '?', '&']
var variables = []
return {
vars: variables,
expand (context) {
/* eslint-disable no-useless-escape */
return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, (_, expression, literal) => {
if (expression) {
var operator = null
var values = []
if (operators.indexOf(expression.charAt(0)) !== -1) {
operator = expression.charAt(0)
expression = expression.substr(1)
}
expression.split(/,/g).forEach((variable) => {
/* eslint-disable no-useless-escape */
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable)
values.push.apply(values, getValues(context, operator, tmp[1], tmp[2] || tmp[3]))
variables.push(tmp[1])
})
if (operator && operator !== '+') {
var separator = ','
if (operator === '?') {
separator = '&'
} else if (operator !== '#') {
separator = operator
}
return (values.length !== 0 ? operator : '') + values.join(separator)
} else {
return values.join(',')
}
} else {
return encodeReserved(literal)
}
})
}
}
}
function getValues (context, operator, key, modifier) {
var value = context[key]
var result = []
if (isDefined(value) && value !== '') {
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
value = value.toString()
if (modifier && modifier !== '*') {
value = value.substring(0, parseInt(modifier, 10))
}
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null))
} else {
if (modifier === '*') {
if (Array.isArray(value)) {
value.filter(isDefined).forEach((value) => {
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : null))
})
} else {
Object.keys(value).forEach((k) => {
if (isDefined(value[k])) {
result.push(encodeValue(operator, value[k], k))
}
})
}
} else {
var tmp = []
if (Array.isArray(value)) {
value.filter(isDefined).forEach((value) => {
tmp.push(encodeValue(operator, value))
})
} else {
Object.keys(value).forEach((k) => {
if (isDefined(value[k])) {
tmp.push(encodeURIComponent(k))
tmp.push(encodeValue(operator, value[k].toString()))
}
})
}
if (isKeyOperator(operator)) {
result.push(encodeURIComponent(key) + '=' + tmp.join(','))
} else if (tmp.length !== 0) {
result.push(tmp.join(','))
}
}
}
} else {
if (operator === ';') {
result.push(encodeURIComponent(key))
} else if (value === '' && (operator === '&' || operator === '?')) {
result.push(encodeURIComponent(key) + '=')
} else if (value === '') {
result.push('')
}
}
return result
}
function isDefined (value) {
return value !== undefined && value !== null
}
function isKeyOperator (operator) {
return operator === ';' || operator === '&' || operator === '?'
}
function encodeValue (operator, value, key) {
value = (operator === '+' || operator === '#') ? encodeReserved(value) : encodeURIComponent(value)
if (key) {
return encodeURIComponent(key) + '=' + value
} else {
return value
}
}
function encodeReserved (str) {
return str.split(/(%[0-9A-Fa-f]{2})/g).map((part) => {
if (!/%[0-9A-Fa-f]/.test(part)) {
part = encodeURI(part)
}
return part
}).join('')
}
/**
* Utility functions.
*/
var debug = false
var util = {}
var {hasOwnProperty} = {}
var {slice} = []
export const inBrowser = typeof window !== 'undefined'
export default function (Vue) {
util = Vue.util
debug = Vue.config.debug || !Vue.config.silent
}
export function warn (msg) {
if (typeof console !== 'undefined' && debug) {
console.warn('[VueResource warn]: ' + msg)
}
}
export function error (msg) {
if (typeof console !== 'undefined') {
console.error(msg)
}
}
export function nextTick (cb, ctx) {
return util.nextTick(cb, ctx)
}
export function trim (str) {
return str ? str.replace(/^\s*|\s*$/g, '') : ''
}
export function toLower (str) {
return str ? str.toLowerCase() : ''
}
export function toUpper (str) {
return str ? str.toUpperCase() : ''
}
export const isArray = Array.isArray
export function isString (val) {
return typeof val === 'string'
}
export function isBoolean (val) {
return val === true || val === false
}
export function isFunction (val) {
return typeof val === 'function'
}
export function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
export function isPlainObject (obj) {
return isObject(obj) && Object.getPrototypeOf(obj) === Object.prototype
}
export function isBlob (obj) {
/* eslint-disable no-undef */
return typeof Blob !== 'undefined' && obj instanceof Blob
}
export function isFormData (obj) {
return typeof FormData !== 'undefined' && obj instanceof FormData
}
export function when (value, fulfilled, rejected) {
var promise = Promise.resolve(value)
if (arguments.length < 2) {
return promise
}
return promise.then(fulfilled, rejected)
}
export function options (fn, obj, opts) {
opts = opts || {}
if (isFunction(opts)) {
opts = opts.call(obj)
}
return merge(fn.bind({$vm: obj, $options: opts}), fn, {$options: opts})
}
export function each (obj, iterator) {
var i
var key
if (isArray(obj)) {
for (i = 0; i < obj.length; i++) {
iterator.call(obj[i], obj[i], i)
}
} else if (isObject(obj)) {
for (key in obj) {
if (hasOwnProperty.call(obj, key)) {
iterator.call(obj[key], obj[key], key)
}
}
}
return obj
}
export const assign = Object.assign || _assign
export function merge (target) {
var args = slice.call(arguments, 1)
args.forEach((source) => {
_merge(target, source, true)
})
return target
}
export function defaults (target) {
var args = slice.call(arguments, 1)
args.forEach((source) => {
for (var key in source) {
if (target[key] === undefined) {
target[key] = source[key]
}
}
})
return target
}
function _assign (target) {
var args = slice.call(arguments, 1)
args.forEach((source) => {
_merge(target, source)
})
return target
}
function _merge (target, source, deep) {
for (var key in source) {
if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
if (isPlainObject(source[key]) && !isPlainObject(target[key])) {
target[key] = {}
}
if (isArray(source[key]) && !isArray(target[key])) {
target[key] = []
}
_merge(target[key], source[key], deep)
} else if (source[key] !== undefined) {
target[key] = source[key]
}
}
}
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
function plugin (Vue) {
if (plugin.installed) {
return
}
if (!Vue.http) {
console.error('Cannot load Vue Plugin: vue-resource')
return
}
let $loading = Vue.$loading
if (!$loading) {
console.error('Cannot load loading Plugin')
return
}
Vue.http.interceptors.push(function (request, next) {
// console.log('show loading...')
$loading.show(request && request.loading || {})
next(function (response) {
// console.log(response)
// console.log('hide loading...')
$loading.hide()
})
})
}
if (typeof window !== 'undefined' && window.Vue) {
window.Vue.use(plugin)
}
export default plugin
import fastclick from 'fastclick'
export default {
install (Vue) {
fastclick.attach(document.body)
}
}
export default {
install (Vue) {
var win = window
var doc = win.document
var docEl = doc.documentElement
var metaEl = doc.querySelector('meta[name="viewport"]')
var flexibleEl = doc.querySelector('meta[name="flexible"]')
var dpr = 0
var scale = 0
var tid
var sym = Symbol()
var flexible = win[sym] || (win[sym] = {})
if (metaEl) {
console.warn('将根据已有的meta标签来设置缩放比例')
var match = metaEl.getAttribute('content').match(/initial-scale=([\d.]+)/)
if (match) {
scale = parseFloat(match[1])
dpr = parseInt(1 / scale)
}
} else if (flexibleEl) {
var content = flexibleEl.getAttribute('content')
if (content) {
var initialDpr = content.match(/initial-dpr=([\d.]+)/)
var maximumDpr = content.match(/maximum-dpr=([\d.]+)/)
if (initialDpr) {
dpr = parseFloat(initialDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
if (maximumDpr) {
dpr = parseFloat(maximumDpr[1])
scale = parseFloat((1 / dpr).toFixed(2))
}
}
}
if (!dpr && !scale) {
// var isAndroid = win.navigator.appVersion.match(/android/gi)
var isIPhone = win.navigator.appVersion.match(/iphone/gi)
var devicePixelRatio = win.devicePixelRatio
if (isIPhone) {
// iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
dpr = 3
} else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
dpr = 2
} else {
dpr = 1
}
} else {
// 其他设备下,仍旧使用1倍的方案
// dpr = devicePixelRatio >= 2 && 2 || 1
dpr = 1
}
scale = 1 / dpr
}
docEl.setAttribute('data-dpr', dpr)
if (!metaEl) {
metaEl = doc.createElement('meta')
metaEl.setAttribute('name', 'viewport')
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no')
if (docEl.firstElementChild) {
docEl.firstElementChild.appendChild(metaEl)
} else {
var wrap = doc.createElement('div')
wrap.appendChild(metaEl)
doc.write(wrap.innerHTML)
}
}
function refreshRem () {
var width = docEl.getBoundingClientRect().width
if (width / dpr > 540) {
width = 540 * dpr
}
// var rem = width / 10 // 原始的rem算法
var rem = width / 375 * 100 // 这里我们以375为标准宽度,再*100,写样式的时候会方便好多
docEl.style.fontSize = rem + 'px'
flexible.rem = win.rem = rem
}
win.addEventListener('resize', function () {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
console.log('resize')
}, false)
win.addEventListener('pageshow', function (e) {
if (e.persisted) {
clearTimeout(tid)
tid = setTimeout(refreshRem, 300)
console.log('pageshow')
}
}, false)
if (doc.readyState === 'complete') {
doc.body.style.fontSize = 16 * dpr + 'px'
console.log('complete')
} else {
doc.addEventListener('DOMContentLoaded', function (e) {
doc.body.style.fontSize = 16 * dpr + 'px'
console.log('DOMContentLoaded')
}, false)
}
refreshRem()
flexible.dpr = win.dpr = dpr
flexible.refreshRem = refreshRem
flexible.rem2px = function (d) {
var val = parseFloat(d) * this.rem
if (typeof d === 'string' && d.match(/rem$/)) {
val += 'px'
}
return val
}
flexible.px2rem = function (d) {
var val = parseFloat(d) / this.rem
if (typeof d === 'string' && d.match(/px$/)) {
val += 'rem'
}
return val
}
}
}
import vuexI18n from 'vuex-i18n'
import Vuex from 'vuex'
export default {
install (Vue) {
const i18nStore = new Vuex.Store({
modules: {
i18n: vuexI18n.store
}
})
Vue.use(vuexI18n.plugin, i18nStore)
const componentLocales = require('json-loader!yaml-loader!../../../shared/locales/components.yml') || {en: {}, 'zh-CN': {}}
const finalLocales = {
'en': Object.assign(componentLocales['en']),
'zh-CN': Object.assign(componentLocales['zh-CN'])
}
for (let i in finalLocales) {
Vue.i18n.add(i, finalLocales[i])
}
Vue.i18n.set('zh-CN')
}
}
import LoadingComponent from '../../components/loading'
let $vm
let watcher
let lastloading
const plugin = {
install (Vue, config) {
const Loading = Vue.extend(LoadingComponent)
if (!$vm) {
$vm = new Loading({
el: document.createElement('div')
})
document.body.appendChild($vm.$el)
}
const loading = {
ajaxFeedbackType: {
REQ_SUCC: 'REQ_SUCC',
REQ_FAIL: 'REQ_FAIL',
RES_SUCC: 'RES_SUCC',
RES_FAIL: 'RES_FAIL',
NONE: 'NONE'
},
getShow (options) {
config = config || {}
options = options || {}
return typeof options.isShow === 'boolean' ? options.isShow : (typeof config.isShow === 'boolean' ? config.isShow : true)
},
hideDelay (options, hideDelay) {
config = config || {}
options = options || {}
return typeof hideDelay === 'number' ? hideDelay : (typeof options.hideDelay === 'number' ? options.hideDelay : (typeof config.hideDelay === 'number' ? config.hideDelay : 0))
},
show (options) {
// destroy watcher
var self = this
$vm.lastAjax = {
feedbackType: self.ajaxFeedbackType.NONE,
data: {}
}
var isShow = self.getShow(options)
if (!isShow) {
return
}
watcher && watcher()
if (typeof options === 'string') {
$vm.text = options
} else if (typeof options === 'object') {
for (let i in options) {
$vm[i] = options[i]
}
}
if (typeof options === 'object' && options && (options.onShow || options.onHide)) {
watcher = $vm.$watch('show', (val) => {
val && options.onShow && options.onShow($vm)
val === false && options.onHide && options.onHide($vm)
})
}
lastloading = {
lastShowTime: new Date().getTime(),
hideDelay: self.hideDelay(options)
}
$vm.show = true
},
hide (options, data, ajaxFeedbackType) {
var self = this
lastloading = lastloading || {}
var lastShowTime = lastloading.lastShowTime || 0
if (lastShowTime > 0) {
var hideDelay = self.hideDelay(options, lastloading.hideDelay)
if (hideDelay > 0) {
var curTime = new Date().getTime()
var passTime = curTime - lastShowTime
if (passTime > hideDelay) {
self.hideNow(true, data, ajaxFeedbackType)
} else {
setTimeout(function () {
self.hideNow(true, data, ajaxFeedbackType)
}, hideDelay - passTime)
}
} else {
self.hideNow(true, data, ajaxFeedbackType)
}
}
},
hideNow (isAjaxFeedback, data, ajaxFeedbackType) {
lastloading = {}
$vm.show = false
if (isAjaxFeedback) {
$vm.lastAjax = {
feedbackType: ajaxFeedbackType,
data: data
}
}
}
}
Vue.prototype.$loading = loading
Vue.$loading = loading
}
}
export default plugin
export const install = plugin.install
import axios from 'axios'
export default {
install(Vue, config) {
if (!axios) {
console.error('Cannot load axios Plugin')
return
}
Vue.prototype.$mas = MAS.getInstance().config(config)
}
}
/**
* MAS通用调用类
* @class MAS
*/
class MAS {
static getInstance() {
if (!MAS.__instance) {
MAS.__instance = new MAS()
}
return MAS.__instance
}
/**
* 接口类型
* @readonly
* @static
* @memberof MAS
*/
static get TYPE() {
return {
PROXY: 'mas-api/proxy?alias=',
RESTFUL: 'mas-api/restful/'
}
}
/**
* 默认token的key
* @readonly
* @static
* @memberof MAS
*/
static get TOKEN_KEY() {
return 'access_token'
}
/**
* 回答器,包含结果认证,只限mas请求接口
* @param {{}} result 请求结果
* @returns {{}} 返回处理的结果
* @memberof MAS
*/
responser(result) {
if (result.status === 200) {
let data = result
if (data instanceof Object) {
if (MAS.ERROR_CODE[data.code]) {
return Promise.reject(Object.assign(data, errorCode[data.code]))
}
}
data.request = result
return data
} else {
throw new Error(result.statusText)
}
}
/**
* 通用请求接口
* @param {String} url 接口地址
* @param {{}} params 参数
* @param {{}} options 配置 {baseUrl: 指定根地址, method: 指定调用方法}
* @returns {Promise} Axios
* @memberof MAS
*/
getData(url, params, options) {
let method = options && options.method || this.method || 'get'
let baseUrl = options && options.baseUrl || this.baseUrl
let tokenParams = {
[this.tokenKey]: this.token
}
let tempParams = null;
if (method === 'get') {
tempParams = params
} else {
tempParams = tokenParams
}
return axios({
url: `${baseUrl}/${url}`,
method,
params: tempParams,
data: method === 'post' && params,
...options
}).then(result => this.responser(result)).catch(error => {
})
}
/**
* Proxy方式调用,MAS配置接口
* @param {String} alias MAS配置接口代码
* @param {{}} params 参数
* @param {{}} options 配置 {baseUrl: 指定根地址, method: 指定调用方法}
* @returns {Promise} Axios
* @memberof MAS
*/
proxy(alias, params, options) {
params = Object.assign({
[this.tokenKey]: this.token
}, params, options && options.params)
return this.getData(`${MAS.TYPE.PROXY}${alias}`, params, options)
}
/**
* Restful方式调用,MAS配置接口,如果是Restful方式,必须在初始化时指定restful code,否则必须每次在option只指定
* @param {String} url 请求地址,restful配置的后段
* @param {{}} params 参数
* @param {{}} options 配置 {code: restful code,baseUrl: 指定根地址, method: 指定调用方法}
* @returns {Promise} Axios
* @memberof MAS
*/
restful(url, params, options) {
let code = options && options.code || this.code
params = Object.assign({
[this.tokenKey]: this.token
}, params, options && options.params)
return this.getData(`${MAS.TYPE.RESTFUL}${code}/${url}`, params, options)
}
/**
* 附件转换服务
* @param {any} alias
* @param {any} {exParam, docType, fdType, quality, tokenKey}
* @param {any} options
* @returns {Promise}
* @memberof MAS
*/
attach(alias, {
exParam,
docType,
fdType,
quality,
tokenKey
}, options) {
let params = Object.assign({
exParam,
fdType,
docType,
quality,
[tokenKey || this.tokenKey]: this.token
}, options && options.params)
return this.getData(`${MAS.TYPE.PROXY}${alias}`, params, options)
}
/**
* 配置
* @param {Object} { baseUrl, method, code, token, tokenKey } baseUrl-接口根地址,method:默认调用方法,默认get,code:默认restful代码,token:访问令牌,tokenKey:访问令牌的key
* @returns {MAS}
* @memberof MAS
*/
config({
baseUrl,
method,
code,
token,
tokenKey
}) {
this.baseUrl = baseUrl
this.method = method
this.code = code
this.token = token
this.tokenKey = tokenKey
return this
}
/**
* 根地址
* @memberof MAS
*/
get baseUrl() {
return this._baseUrl
}
/**
* 根地址
* @memberof MAS
*/
set baseUrl(baseUrl) {
this._baseUrl = baseUrl
}
/**
* 调用方法
* @memberof MAS
*/
get method() {
return this._method
}
/**
* 调用方法
* @memberof MAS
*/
set method(method) {
this._method = method
}
/**
* restful代码
* @memberof MAS
*/
get code() {
return this._code
}
/**
* restful代码
* @memberof MAS
*/
set code(code) {
this._code = code
}
/**
* 访问令牌
* @memberof MAS
*/
get token() {
return this._token
}
/**
* 访问令牌
* @memberof MAS
*/
set token(token) {
this._token = token
}
/**
* 访问令牌key
* @memberof MAS
*/
get tokenKey() {
return this._tokenKey || MAS.TOKEN_KEY
}
/**
* 访问令牌key
* @memberof MAS
*/
set tokenKey(tokenKey) {
this._tokenKey = tokenKey
}
get TYPE_PROXY() {
return MAS.TYPE.PROXY
}
get TYPE_RESTFUL() {
return MAS.TYPE.RESTFUL
}
}
const errorCode = {
'40001': {
'errCode': '40001',
'errMsg': '找不到Map校验accessToken!',
'isReportErr': 'false'
},
'40002': {
'errCode': '40002',
'errMsg': 'MAP校验不通过!',
'isReportErr': 'false'
},
'40003': {
'errCode': '40003',
'errMsg': 'MAP校验出错!',
'isReportErr': 'false'
},
'40011': {
'errCode': '40011',
'errMsg': 'MAS中对应的alias参数没有提供',
'isReportErr': 'false'
},
'40021': {
'errCode': '40021',
'errMsg': 'MAS转接超时!',
'isReportErr': 'true'
},
'40031': {
'errCode': '40031',
'errMsg': '后台服务器连接异常!',
'isReportErr': 'true'
},
'40041': {
'errCode': '40041',
'errMsg': '请求参数错误!',
'isReportErr': 'false'
},
'40101': {
'errCode': '40101',
'errMsg': 'MAS端没找到token值',
'isReportErr': 'false'
},
'40102': {
'errCode': '40102',
'errMsg': 'MAS Token校验不通过!',
'isReportErr': 'false'
},
'40110': {
'errCode': '40110',
'errMsg': 'MAS系统处理异常,请联系MAS管理员。',
'isReportErr': 'true'
},
'40112': {
'errCode': '40112',
'errMsg': 'MAS服务器没有对应配置,请联系MAS管理员',
'isReportErr': 'false'
},
'40113': {
'errCode': '40113',
'errMsg': 'MAS SOAP配置错误',
'isReportErr': 'true'
},
'40120': {
'errCode': '40120',
'errMsg': 'MAS图片转换配置错误(图片替换表达式没填)',
'isReportErr': 'true'
},
'40600': {
'errCode': '40600',
'errMsg': 'MAS调用返回错误',
'isReportErr': 'false'
},
'40601': {
'errCode': '40601',
'errMsg': 'MAS调用URL错误',
'isReportErr': 'false'
},
'40610': {
'errCode': '40610',
'errMsg': 'MAS调用数据库脚本失败',
'isReportErr': 'true'
},
'40620': {
'errCode': '40620',
'errMsg': 'MAS调用流下载失败',
'isReportErr': 'true'
},
'40631': {
'errCode': '40631',
'errMsg': 'MAS调用Webservice失败',
'isReportErr': 'true'
},
'40640': {
'errCode': '40640',
'errMsg': 'MAS调用通用表单失败',
'isReportErr': 'true'
},
'40650': {
'errCode': '40650',
'errMsg': 'MAS调用HTTP GET失败',
'isReportErr': 'true'
},
'40670': {
'errCode': '40670',
'errMsg': 'MAS调用HTTP POST失败',
'isReportErr': 'true'
},
'40690': {
'errCode': '40690',
'errMsg': 'MAS调用HTTP AUTO失败',
'isReportErr': 'true'
},
'40691': {
'errCode': '40691',
'errMsg': 'MAS调用HTTP DELETE失败',
'isReportErr': 'true'
},
'40692': {
'errCode': '40692',
'errMsg': 'MAS调用HTTP PUT失败',
'isReportErr': 'true'
},
'40699': {
'errCode': '40699',
'errMsg': 'MAS转发失败',
'isReportErr': 'true'
},
'40700': {
'errCode': '40700',
'errMsg': 'MAS不支持该配置服务',
'isReportErr': 'true'
},
'40701': {
'errCode': '40701',
'errMsg': 'MAS接口配置错误',
'isReportErr': 'true'
},
'40800': {
'errCode': '40800',
'errMsg': 'MAS全局配置参数没设置',
'isReportErr': 'true'
},
'40801': {
'errCode': '40801',
'errMsg': 'MAS全局配置参数类型错误',
'isReportErr': 'true'
},
'40810': {
'errCode': '40810',
'errMsg': 'MAS没找到相应的RESTFul配置',
'isReportErr': 'false'
},
'40900': {
'errCode': '40900',
'errMsg': '账号映射出错',
'isReportErr': 'true'
},
'41000': {
'errCode': '41000',
'errMsg': '清除缓存失败',
'isReportErr': 'true'
},
'42000': {
'errCode': '42000',
'errMsg': '通用表单模板配置不存在',
'isReportErr': 'false'
},
'42001': {
'errCode': '42001',
'errMsg': '通用表单服务不存在',
'isReportErr': 'false'
},
'42002': {
'errCode': '42002',
'errMsg': '通用表单系统模块配置不存在',
'isReportErr': 'false'
},
'42010': {
'errCode': '42010',
'errMsg': '通用表单调用返回错误',
'isReportErr': 'true'
}
}
/**
* 错误代码
* @type {{}}
*/
MAS.ERROR_CODE = errorCode
\ No newline at end of file
import nativeApi from './cordova/index'
export default {
install (Vue, config) {
var nativeApiObj = nativeApi(config)
Vue.$nativeApi = nativeApiObj
Vue.prototype.$nativeApi = nativeApiObj
}
}
'use strict'
import NativeApi from '../native/nativeApi'
import { sleep } from '../native/utils'
/**
* 底座模块名称
* @type {{MIDEA_COMMON: string, MIDEA_USER: string, MIDEA_BARCODE: string, MIDEA_MAP: string, MIDEA_ANNTO: string, MIDEA_SALE: string}}
*/
const MODULE_NAMES = {
MIDEA_COMMON: 'MideaCommon',
MIDEA_USER: 'MideaUser',
MIDEA_BARCODE: 'MideaBarcode',
MIDEA_MAP: 'MideaMap',
MIDEA_ANNTO: 'MideaAnnto',
MIDEA_SALE: 'MideaSale'
}
/**
* Cordova Api父类,包含基本配置和基本入口方法
* @extends NativeApi
*/
export default class CordovaApi extends NativeApi {
constructor (conf) {
conf = conf || {}
conf.platform = 'cordova'
super(conf)
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
var self = this
if (!window.document.getElementById('cordovaJS')) {
var script = window.document.createElement('script')
script.id = 'cordovaJS'
script.src = 'cordova.js'
script.type = 'text/javascript'
script.async = false
script.onload = function () {
console.log('Loading Cordova Plugin...')
window.document.addEventListener('deviceready', function () {
self.doReady(self)
}, false)
}
script.onerror = function () {
console.error('Cannot Load Cordova Plugin!')
}
window.document.body.appendChild(script)
}
}
}
set methods (methods) {
this._methods = methods
}
get methods () {
return this._methods
}
get moduleNames () {
return MODULE_NAMES
}
/**
* 调用cordova对象的exec方法
* @param module 所属模块
* @param method 方法名称
* @param params 附带参数
* @return {Promise}
*/
callApi (module, method, params) {
let self = this
self.log(module, method, params)
return new Promise((resolve, reject) => {
(async function () {
for (var i = 0; i < self.maxRetryTimes; i++) {
if (!self.ready || !window.cordova) {
if (i === self.maxRetryTimes - 1) {
reject('Cordova is not ready, no retry')
} else {
await sleep(self.retrySleepTime * (i + 1))
// console.error('Cordova is not ready, retry later')
}
}
}
try {
window.cordova.exec(function (msg) {
resolve(msg)
}, function (msg) {
reject(msg)
}, module, method, params || [])
} catch (e) {
reject(e)
}
})()
})
}
}
import CordovaApi from './cordovaApi'
import System from './modules/system'
import GeoLocation from './modules/geoLocation'
import UserInteraction from './modules/userInteraction'
import Account from './modules/account'
import Navigator from './modules/navigator'
import DataInteraction from './modules/DataInteraction'
export default function (config) {
return new CordovaApi(config)
.setModules(
System,
GeoLocation,
UserInteraction,
Account,
Navigator,
DataInteraction
)
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
/**
* 用户账户
* @extends BaseModel
*/
export default class Account extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_ACCOUNT
}
/**
* 获取当前应用登录的用户的信息
* @param {Array=} params 无参数
* @return {Promise}
* @result cn: 中文名, cookie: 用户的cookie, departmentName: 完整的部门名称, employeenumber: 员工号, gender: 性别(0 女, 1男), mail: 邮箱, mobile: 手机号码, ou: 组织架构的部门模块名, positionName: 岗位, sessionkey: 用户的sessionKey, ssoToken: 用户的ssoToken, telephonenumber: 固定电话, uid: 用户uid, uniqueIdentifier: 用户的唯一标识, userIcon: 用户头像
*/
getUser (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'getUser', params)
}
/**
* 获取用户是否登录
* @param {Array=} params 无参数
* @return {Promise}
* @result {isLogin: 是否登录}
*/
isLogin (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'isLogin', params)
}
/**
* 注销当前用户
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
logout (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'logout', params)
}
/**
* 验证密码当前用户的密码。优先验证二阶段密码,如手势、语音、人脸识别等。验证失败两次将退出当前打开的应用
* @param {Array=} params 无参数
* @return {Promise}
* @result 1:成功 0:失败
*/
authPassword (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'authPassword', params)
}
/**
* 获取当前用户的密码
* @param {Array=} params 无参数
* @return {Promise}
* @result password 密码
*/
getUserPassword (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'getUserPassword', params)
}
/**
* 跳转到页面
* @param {Array=} params 跳转到登录页面
* @return {Promise}
* @result #
*/
toLogin (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'toLogin', params)
}
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
/**
* 原生与h5数据交互相关
* @extends BaseModel
*/
export default class DataInteraction extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_DATA_INTERACTION
}
/**
* 获取H5信息
* @param {Array=} params ['key'] key为想要获得的参数
* @return {Promise}
* @result 参数key的值
*/
getH5Info (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'getH5Info', params)
}
/**
* 保存H5信息
* @param {Array=} params ['key', 'value'] 保存参数的key,参数的值
* @return {Promise}
* @result #
*/
saveH5Info (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'saveH5Info', params)
}
/**
* 获取模块或用户的未读消息(美信、美的通identifier)
* @param {Array=} params 第一次参数:应用模块名称(例如:com.midea.demo)或者用户id(xxx或者xxx@midea.com.cn),如果第一个参数传的是用户Id,则一定要传第二个参数;第二个参数固定为“IM”,如果传了第二个参数,则第一个参数必定是用户id,
* @return {Promise}
* @result 返回代表未读消息数目的int类型数据
*/
getMessageUnread (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'getMessageUnread', params)
}
/**
* 获取扩展字段
* @param {Array=} params 模块名 com.midea.demo
* @return {Promise}
* @result 返回拓展字段,{extra: {action: 'xxx'}} 需要和底座商量决定action的值
*/
getExtra (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'getExtra', params)
}
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
/**
* 地图定位导航相关接口
* @extends BaseModel
*/
export default class GeoLocation extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_GEO_LOCATION
}
/**
* 持续定位,每隔指定时间返回定位信息
* @param {Array=} params [间隔时间(ms)]
* @return {Promise}
* @result #
*/
startUpdatingLocation (params) {
return this.nativeApi.callApi('MideaMap', 'startUpdatingLocation', params)
}
/**
* 停止持续定位
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
stopUpdatingLocation (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_MAP, 'stopUpdatingLocation', params)
}
/**
* 周边搜索
* @param {Array=} params 无参数
* @return {Promise}
* @result [{"citycode": 区号,"title": 标题,"poiId": "B02F50X8AR","address": 详细地址,"province": 省份,"longitude": 经度,"latitude": 维度,"city": 城市}]
*/
getPois (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_MAP, 'getPois', params)
}
/**
* 获取经纬度
* @param {Array=} params 无参数
* @return {Promise}
* @result {address: 详细地址city: 城市citycode: 区号district: 区latitude: 维度longitude: 经度province: 省份street: 街道}
*/
location (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_MAP, 'location', params)
}
/**
* 从目的地开始路线导航
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
selectWidget (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_MAP, 'selectWidget', params)
}
/**
* 从目的地开始路线导航
* @param {Array=} params params ["113.2045723720553", "23.033276740700192", "112.84994614670291", "23.193689802924411", "广州2"]==>["终点的经度", "终点的纬度", "起始点的经度", "起始点的纬度", "要去的位置"]
* @return {Promise}
* @result #
*/
navToWithFrom (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_MAP, 'navToWithFrom', params)
}
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
/**
* 应用导航器
* @extends BaseModel
*/
export default class Navigator extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_NAVIGATOR
}
/**
* 从当前页面跳转到设置页面
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showSetView (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showSetView', params)
}
/**
* 从当前页面跳转到我的页面
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showMyView (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showMyView', params)
}
/**
* 跳转到页面
* @param {Array=} params ['messageView'] 从当前页面跳转到消息页面(不支持美信),["messageListView", "com.midea.demo"] 跳转到消息List二级页面(美信、美的通)
* @return {Promise}
* @result #
*/
showAppView (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showAppView', params)
}
/**
* 启动指定App的指定应用
* @param {Array=} params ['包名', 'AppKey'] (demo) ['com.midea.maptest', '1779d8c8fd110fd5f7caf31652d82e8c']
* @return {Promise}
* @result #
*/
startApp (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'startApp', params)
}
/**
* 跳转到个人信息页面(支持美信,新版美的通)
* @param {Array=} params ['用户ID'] 精确
* @return {Promise}
* @result #
*/
vcard (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'vcard', params)
}
/**
* 跳转到指定应用
* @param {Array=} params ['widgetKey', params]
* @return {Promise}
* @result #
*/
showWidget (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showWidget', params)
}
/**
* 选择应用
* @param {Array=} params 无
* @return {Promise}
* @result #
*/
selectWidget (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'selectWidget', params)
}
/**
* 打开第三方app - (智慧工地APP)
* @param {Array=} params ['weixin://']
* @return {Promise}
* @result #
*/
launchExternalAPPByThird (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'launchExternalAPPByThird', params)
}
/**
* 退出应用
* @param {Array=} params 无
* @return {Promise}
* @result #
*/
exit (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'exit', params)
}
/**
* 用系统浏览器打开网址
* @param {Array=} params ['网址']
* @return {Promise}
* @result #
*/
openSysBrowser (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'openSysBrowser', params)
}
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
import configJson from '../../../../../../CubeModule.json'
/**
* 系统通用接口
* @extends BaseModel
*/
export default class System extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_SYSTEM
}
/**
* 跳转到手机通讯录系统页面,选择后返回json对象
* @param {Array=} params 无参数
* @return {Promise}
* @result {Object} {"name":"aaa","phone":"95079"}
*/
getContact (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_USER, 'getContact', params)
}
/**
* 获取手机当前系统语言
* @param {Array=} params 无参数
* @return {Promise}
* @result {String} language=cn
*/
language (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'language', params)
}
/**
* 显示导航控件
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showNav (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showNav', params)
}
/**
* 隐藏导航控件
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
hideNav (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'hideNav', params)
}
/**
* 显示底部控件
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showMenu (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showMenu', params)
}
/**
* 弹出输入键盘
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showInput (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showInput', params)
}
/**
* 输入键盘消失
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
hideInput (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'hideInput', params)
}
/**
* 切换键盘到中午输入法
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
toggleInput (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'toggleInput', params)
}
/**
* 显示浮动按钮
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
showFloat (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'showFloat', params)
}
/**
* 隐藏浮动按钮
* @param {Array=} params 无参数
* @return {Promise}
* @result #
*/
hideFloat (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'hideFloat', params)
}
/**
* 改变状态栏背景色
* @param {Array=} params [230, 130, 80, 1] [Red,Green,Blue,Alpha]
* @return {Promise}
* @result #
*/
statusBarColor (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'statusBarColor', params)
}
/**
* 改变橡皮筋状态
* @param {Array=} params [0] [isSetBounces]
* @return {Promise}
* @result #
*/
setBounces (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'setBounces', params)
}
/**
* 改变状态栏样式
* @param {Array=} params [0]
* @return {Promise}
* @result #
*/
setStatusBarStyle(params){
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'statusContentStyle', params)
}
/**
* 复制
* @param {Array=} params ["xxx"] 复制内容xxx到剪切板
* @return {Promise}
* @result #
*/
copy (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'copy', params)
}
/**
* 粘贴结果
* @param {Array=} params 无参数
* @return {Promise}
* @result 返回字符串为剪切板(复制)的内容
*/
paste (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'paste', params)
}
/**
* 检查是否安装指定apk请求参数
* @param {Array=} params 安装版名称 com.midea.mlearning.in.test
* @return {Promise}
* @result 若安装了则返回true,否则返回false
*/
apk (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'apk', params)
}
/**
* 安卓和ios拨打电话
* @param {Array=} params [tel, '电话号码']
* @return {Promise}
* @result #
*/
callPhone (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'callPhone', params)
}
/**
* 获取webview的宽度和高度
* @param {Array=} params 无
* @return {Promise}
* @result {webviewWidth: 宽, webviewHeigh: 高}
*/
webview (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'webview', params)
}
/**
* 获取指定url图片的Base64编码数据
* @param {Array=} params ['url']
* @return {Promise}
* @result {base64: 图片数据}
*/
getBase64s (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'getBase64s', params)
}
/**
* 弹出扫码框
* @param {Array=} params 无参数
* @return {Promise}
* @result 弹出扫码框,扫码并返回结果
*/
scan (params) {
return this.nativeApi.callApi('MideaBarcode', 'scan', params)
}
/**
* 统计的事件
* @param {Array=} params [{ 'key': 'event', 'value': '测试样例' }] key是统计事件的名称,value是事件的值
* @return {Promise}
* @result #
*/
onEvent (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'onEvent', params)
}
/**
* 上传用户数据
* @param {Array=} params [ {
action_name: 'upload1',
action_type: 'login',
button_link_name: 'xx',
page_name: 'xx',
identifier: 'com.meicloud.vue.template',
widget_name: '',
widget_version: ''
}]
* @return {Promise}
* @result #
*/
uploadUserData (valParams) {
let tmpParams = Object.assign({
identifier:configJson.identifier,
widget_name:configJson.name,
widget_version:configJson.version,
action_type: 'login',
},valParams)
let params = [tmpParams]
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'uploadUserActionData', params)
}
}
/** @module extend/common **/
import * as types from '../types'
import BaseModel from '../../native/BaseModel'
/**
* 用户交互相关
* @extends BaseModel
*/
export default class UserInteraction extends BaseModel {
static get moduleName () {
return types.MODULE_NAME_USER_INTERACTION
}
/**
* 切换屏幕方向
* @param {Array=} params [0|1|2|3] 0-竖屏 1-横屏 2-开启自动旋转 3-关闭自动旋转
* @return {Promise}
* @result #
*/
orientation (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'orientation', params)
}
/**
* 开启响应摇动手机,如果不调用停止响应摇动接口,会一直监听,直到调用停止接口或者kill手机进程
* @param {Array=} params 无
* @return {Promise}
* @result #
*/
shake (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'shake', params)
}
/**
* 停止响应摇动手机
* @param {Array=} params 无
* @return {Promise}
* @result #
*/
shakeStop (params) {
return this.nativeApi.callApi(this.nativeApi.moduleNames.MIDEA_COMMON, 'shakeStop', params)
}
}
export const MODULE_NAME_NAVIGATOR = 'navigator'
export const MODULE_NAME_SYSTEM = 'system'
export const MODULE_NAME_USER_INTERACTION = 'userInteraction'
export const MODULE_NAME_DATA_INTERACTION = 'dataInteraction'
export const MODULE_NAME_ACCOUNT = 'account'
export const MODULE_NAME_GEO_LOCATION = 'geoLocation'
'use strict'
export default class BaseModel {
constructor (nativeApi) {
this.nativeApi = nativeApi
}
static get moduleName () {
return ''
}
get nativeApi () {
return this._nativeApi
}
set nativeApi (nativeApi) {
this._nativeApi = nativeApi
}
get config () {
return this.nativeApi.config
}
get debug () {
return this.nativeApi.debug
}
get platform () {
return this.nativeApi.platform
}
get ready () {
return this.nativeApi.ready
}
log () {
this.nativeApi.log()
}
debugLog () {
this.nativeApi.debugLog()
}
error () {
this.nativeApi.error()
}
info () {
this.nativeApi.info()
}
warn () {
this.nativeApi.warn()
}
}
'use strict'
import { printLog, singleInstance } from './utils'
import { throwError } from '../../../utils/log'
let __instance = singleInstance()
export default class NativeApi {
constructor (conf) {
if (__instance()) return __instance()
this.config = conf
__instance(this)
}
get config () {
return this._config || {}
}
set config (conf) {
this._config = conf
}
get debug () {
return this.config.debug || false
}
get platform () {
return this.config.platform || 'native'
}
get maxRetryTimes () {
return typeof this.config.maxRetryTimes === 'number' ? this.config.maxRetryTimes : 5
}
get retrySleepTime () {
return typeof this.config.retrySleepTime === 'number' ? this.config.retrySleepTime : 100
}
get ready () {
return this.config.ready || false
}
set ready (isReady) {
this.config.ready = isReady
}
doReady (self) {
self.ready = true
}
setModule (Module, name = Module.moduleName || Module.name) {
// console.log('native api: ' + Module.toString())
// console.log(Module.moduleName)
// console.log(Module.name)
// console.log(name)
if (!name) {
const str = Module.toString()
const arr1 = str.match(/class\s+(.*?)\s+[\S\s]*\{/i)
const arr2 = str.match(/function\s+(.*?)\s*\(.*?\)[\S\s]*\{/i)
// console.log(str)
// console.log(arr1)
// console.log(arr2[1])
name = arr1 && arr1.length > 1
? arr1[1]
: (
arr2 && arr2.length > 1
? arr2[1]
: ''
)
}
name = name
? name.slice(0, 1).toLowerCase() + name.slice(1)
: ''
console.log(name)
if (!name || name.length <= 3) {
throwError('Cannot found Module Name: ' + name + '\n' + Module.toString(), 'MissedModule')
}
this.addModuleName(name)
this[name] = new Module(this)
return this
}
setModules () {
const len = arguments.length
const args = len > 0
? arguments
: []
for (let i = 0; i < len; i++) {
this.setModule(args[i])
}
return this
}
set moduleList (moduleList) {
this.config.moduleList = moduleList
}
get moduleList () {
return this.config.moduleList || []
}
addModuleName (name) {
let moduleList = this.moduleList
moduleList.push(name)
this.moduleList = moduleList
}
log () {
printLog(arguments, this.debug, 'log')
}
debugLog () {
printLog(arguments, this.debug, 'debug')
}
error () {
printLog(arguments, this.debug, 'error')
}
info () {
printLog(arguments, this.debug, 'info')
}
warn () {
printLog(arguments, this.debug, 'warn')
}
}
'use strict'
export async function sleep (timeout) {
return new Promise((resolve, reject) => {
setTimeout(function () {
resolve()
}, timeout)
})
}
export function singleInstance () {
let instance
return (newInstance) => {
if (newInstance) {
instance = newInstance
}
return instance
}
}
export function printLog (_arguments, debug = true, level = 'log') {
if (debug) {
let console = window.console || {}
let logFn = console[level] || console.log
let args = []
let length = _arguments.length
if (length > 0 && typeof _arguments[0] === 'number') {
args = _arguments
} else {
for (let i = 0; i < length; i++) {
args.push(_arguments[i])
if (i === 0 && length > 1) {
args.push('=>')
} else if (i < length - 1) {
args.push(',')
}
}
}
logFn.apply(console, args)
}
}
export default {
install (Vue, router, asyncList, options) {
var config = options || {}
config.isBindLoading = typeof config.isBindLoading !== 'undefined' ? config.isBindLoading : true
config.loading = config.loading || {}
if (config.isBindLoading) {
router.beforeEach(function (to, from, next) {
var $loading = Vue.$loading
if ($loading && asyncList.indexOf(to && to.path || '') > -1) {
$loading.show(config.loading)
}
next()
})
router.afterEach(function (to) {
var $loading = Vue.$loading
if ($loading && asyncList.indexOf(to && to.path || '') > -1) {
$loading.hide()
}
})
}
}
}
const ROUTE_CHANGED = 'router/ROUTE_CHANGED'
const UPDATE_DIRECTION = 'router/UPDATE_DIRECTION'
const DIRECTION_FORWARD = 'forward'
const DIRECTION_REVERSE = 'reverse'
export default {
install (Vue, store, router, options) {
var moduleName = (options || {}).moduleName || 'route'
var directionModuleName = (options || {}).directionModuleName || 'directionRoute'
var cloneRoute = function (to, from) {
var clone = {
name: to.name,
path: to.path,
hash: to.hash,
query: to.query,
params: to.params,
fullPath: to.fullPath,
meta: to.meta
}
if (from) {
clone.from = cloneRoute(from)
}
return Object.freeze(clone)
}
store.registerModule(moduleName, {
state: cloneRoute(router.currentRoute),
mutations: {
[ROUTE_CHANGED]: function (state, transition) {
store.state[moduleName] = cloneRoute(transition.to, transition.from)
}
}
})
store.registerModule(directionModuleName, {
state: {
direction: DIRECTION_FORWARD
},
mutations: {
[UPDATE_DIRECTION]: function (state, payload) {
state.direction = payload.direction
}
}
})
var isTimeTraveling = false
var currentPath
// sync router on store change
store.watch(
function (state) { return state[moduleName] },
function (route) {
if (route.fullPath === currentPath) {
return
}
isTimeTraveling = true
currentPath = route.fullPath
router.push(route)
},
{ sync: true }
)
// simple history management
const history = window.sessionStorage
history.clear()
let historyCount = history.getItem('count') * 1 || 0
history.setItem('/', 0)
router.beforeEach(function (to, from, next) {
const toIndex = history.getItem(to.path)
const fromIndex = history.getItem(from.path)
if (toIndex) {
if (toIndex > fromIndex || !fromIndex || (toIndex === '0' && fromIndex === '0')) {
store.commit(UPDATE_DIRECTION, {direction: DIRECTION_FORWARD})
} else {
store.commit(UPDATE_DIRECTION, {direction: DIRECTION_REVERSE})
}
} else {
++historyCount
history.setItem('count', historyCount)
to.path !== '/' && history.setItem(to.path, historyCount)
store.commit(UPDATE_DIRECTION, {direction: DIRECTION_FORWARD})
}
if (/\/http/.test(to.path)) {
let url = to.path.split('http')[1]
window.location.href = `http${url}`
} else {
next()
}
})
// sync store on router navigation
router.afterEach(function (to, from) {
if (isTimeTraveling) {
isTimeTraveling = false
return
}
currentPath = to.fullPath
store.commit(ROUTE_CHANGED, { to: to, from: from })
})
}
}
echo "sync lib running"
GITLAB_VUE_TPL_HOME="git@mobilegit.midea.com:h5-res-vue-template/h5-res-vue-template.git"
GITLAB_RUNNER_HOME="/tmp/gitlab-runner-vue"
VUE_TPL_HOME="$GITLAB_RUNNER_HOME/vue-template"
LIB_PATH="src/libraries"
LIB_HOME="$VUE_TPL_HOME/template/$LIB_PATH"
APP_NAME=`basename $CI_PROJECT_DIR`
APP_MODULE_HOME="$GITLAB_RUNNER_HOME/modules/$APP_NAME"
APP_LIB_HOME="$APP_MODULE_HOME/$LIB_PATH"
GIT_URL=`echo $CI_BUILD_REPO | sed "s#http://gitlab-ci-token:\w*#git#"`
GIT_URL=`echo $GIT_URL | sed "s#/#:#"`
mkdir -p $GITLAB_RUNNER_HOME/modules
if [[ ! -d "$VUE_TPL_HOME" ]]; then
git clone "$GITLAB_VUE_TPL_HOME" "$VUE_TPL_HOME"
else
cd "$VUE_TPL_HOME"
git pull
fi
rm -rf "$APP_MODULE_HOME"
git clone -b "$CI_BUILD_REF_NAME" "$GIT_URL" "$APP_MODULE_HOME"
cd "$APP_MODULE_HOME"
rm -rf "$APP_LIB_HOME"
cp -rf "$LIB_HOME" "$APP_LIB_HOME"
git add -A
git commit -m "Sync-lib"
git push
import * as types from './types'
export default {
[types.VUE]: state => {
return { ...state[types.VUE] }
},
[types.NATIVE_API]: state => {
return { ...state[types.VUE][types.NATIVE_API] }
}
}
import state from './state'
import mutations from './mutations'
import actions from './actions'
import getters from './getters'
const baseStore = {
state: state,
mutations: mutations,
actions: actions,
getters: getters
}
export default baseStore
import * as types from './types'
export default {
[types.INIT_VUE] (state, Vue) {
state[types.VUE] = Vue
}
}
import * as types from './types'
export default {
[types.VUE]: {}
}
export const VUE = 'Base/VUE'
export const INIT_VUE = 'Base/INIT_VUE'
export const NATIVE_API = '$nativeApi'
const CryptoJS = require("crypto-js")
// 定义加/解密的 key
const initKey = 'Q06HU5bm4owAeDcH'; // C00E59A1
// 设置数据块长度
const keySize = 128;
/**
* 生成密钥字节数组, 原始密钥字符串不足128位, 补填0.
* @param {string} key - 原始 key 值
* @return Buffer
*/
const fillKey = (key) => {
const filledKey = Buffer.alloc(keySize / 8);
const keys = Buffer.from(key);
let index = 0;
if (keys.length < filledKey.length) {
filledKey.map((b, i) => filledKey[i] = keys[i]);
// filledKey[index] = keys[index];
// index += 1;
}
console.log('fiddedKey', filledKey)
return filledKey;
}
function getAesECBString(data, key){//加密-ECB模式
var key = CryptoJS.enc.Utf8.parse(key);
// var key = CryptoJS.enc.Utf8.parse(fillKey(key));
var encrypted = CryptoJS.AES.encrypt(data,key,
{
mode:CryptoJS.mode.ECB,
padding:CryptoJS.pad.Pkcs7
});
// var hexStr = encrypted.ciphertext.toString().toUpperCase(); // 返回的是hex格式的密文
// console.log('hexStr->' + hexStr);
return encrypted.toString(); //返回的是base64格式的密文
}
function getDAesECBString(encrypted,key){//解密-ECB模式
var key = CryptoJS.enc.Utf8.parse(key);
// var key = CryptoJS.enc.Utf8.parse(fillKey(key));
var decrypted = CryptoJS.AES.decrypt(encrypted,key,
{
mode:CryptoJS.mode.ECB, // ECB/CBC-需要填充/OFB/CTR-不用填充
padding:CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
export function getAesECB(data){ //加密-ECB模式
var key = initKey; //密钥
var encrypted =getAesECBString(data,key); //密文
var encrypted1 =CryptoJS.enc.Utf8.parse(encrypted);
return encrypted;
}
export function getDAesECB(data){//解密-ECB模式
var key = initKey; //密钥
var decryptedStr =getDAesECBString(data,key);
return decryptedStr;
}
/**
* Created by hezl2 on 2017-5-9.
*/
/**
* 生成从minNum到maxNum的随机数
* @param minNum 开始数
* @param maxNum 结束数
* @returns {*}
*/
export function randomNumber(minNum, maxNum) {
let num = 0
switch (arguments.length) {
case 1:
num = parseInt(Math.random() * minNum + 1, 10)
break
case 2:
num = parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10)
break
default:
num = 0
break
}
return num
}
//获取cookie、
export function getCookie(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if (arr = document.cookie.match(reg))
return (arr[2]);
else
return null;
}
//设置cookie,增加到vue实例方便全局调用
export function setCookie(c_name, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
};
//删除cookie
export function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null)
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
};
\ No newline at end of file
/**
* Created by hezl on 2017-03-30.
* 全局的常用filter函数文件
*/
/**
* 传入毫秒,格式化时间
* @param timestampOrDate 毫秒数或格式日期
* @param fmt 格式,常见:'yyyy-MM-dd hh:mm:ss.S'、'yyyy-M-d h:m:s.S'
* @returns {*}
*/
export function formateDate(timestampOrDate, fmt = 'yyyy-MM-dd HH:mm:ss') {
if (!timestampOrDate) {
return ''
}
// Step 1: 如果是非时间戳,转化为时间戳
if (!/^\d+$/.test(timestampOrDate)) {
// 如果是时间戳
// 把-转化成 / 避免IOS时间问题
timestampOrDate = timestampOrDate.replace(/-/gi, '/')
}
// Step 2: 转化为时间对象
var date = new Date(timestampOrDate) // 后台时间转javascript时间戳
var o = {
'M+': date.getMonth() + 1, // 月份
'd+': date.getDate(), // 日
'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 小时
'H+': date.getHours(), // 小时
'm+': date.getMinutes(), // 分
's+': date.getSeconds(), // 秒
'q+': Math.floor((date.getMonth() + 3) / 3), // 季度
S: date.getMilliseconds() // 毫秒
}
if (/(y+)/.test(fmt)) {
fmt = fmt.replace(RegExp.$1, (date.getFullYear().toString()).substr(4 - RegExp.$1.length))
}
for (var k in o) {
if (new RegExp('(' + k + ')').test(fmt)) {
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr((o[k].toString()).length)))
}
}
return fmt
}
import {
dateFormat
} from 'vux'
import Api from '@/api'
export function getYesterday() {
var day1 = new Date()
day1.setTime(day1.getTime() - 24 * 60 * 60 * 1000)
let string = dateFormat(day1, 'YYYY.MM.DD')
return string
}
export function getDeadline() { // 本地时间获取
var day1 = new Date()
day1.setTime(day1.getTime())
let string = dateFormat(day1, 'YYYY.MM.DD')
string += (' 4:00')
return string
}
export function fetchDeadline(val) { // 获取服务器“数据截止时间”
return val.$mas.proxy(Api.server_Coinfig_URL)
.then(result => {
// console.log('获取时间数据', result.data.dataTime)
return result.data.dataTime
}).catch(error => {
console.log(error)
})
}
export function getThisYear() {
var day1 = new Date()
day1.setTime(day1.getTime())
let string = dateFormat(day1, 'YY')
return string
}
export function getLaterYear(year) {
let str = getThisYear();
let yearNum = Number(str) + year
return yearNum.toFixed(0)
}
/**
* 获取当前月份
*/
export function getCurrentMonth() {
return (new Date().getMonth() + 1) + '月'
}
/**
* 获取累计月份
*/
export function getAccumulatedMonth() {
let current = new Date().getMonth() + 1;
if (current > 1) {
current = '1-' + current
}
return current + '月'
}
/**
* Created by hezl2 on 2017-4-13.
*/
/**
* 把输入的字符串如果有emoji的,替换 (为了减少遍历,建议不要传入array)
* @param message 输入的字符串或消息的body
* @returns {*} 返回的字符
*/
export function replaceEmoji (message) {
let msg = null
if (!message) {
return
}
// let pattern = / [\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/g
let pattern = /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g // emoji 的unicode配备规则
let mainFn = (emoji) => {
let emojiStr = emoji.codePointAt(0).toString(16)
let image = new Image()
image.src = './assets/emoji/emoji_' + emojiStr + '.png'
image.id = emojiStr
image.width = 20
image.height = 20
image.classList.add('js_emoji')
return image.outerHTML
}
if (typeof message === 'string') {
// 纯字符串
msg = message
if (msg.length > 0) {
msg = msg.replace(pattern, (emoji) => {
return mainFn(emoji)
})
}
} else if (typeof message === 'object') {
// 数组或者是对象
let isArray = message && message.hasOwnProperty('length')
msg = isArray ? [] : {}
if (isArray) {
// 数组
for (let m of message) {
if (m.type === 'text') {
// 仅对数组内容遍历
m.text = mainFn(m.text)
}
msg.push(m)
}
} else {
// 对象
let objString = JSON.stringify(message)
objString = mainFn(objString)
msg = JSON.parse(objString)
}
}
return msg
}
// 统一使用
const iScollProbe = require('iscroll/build/iscroll-probe');
let scroller = null;
let Selector = "";
export function createIScroller(selector) {
Selector = selector;
scroller = new iScollProbe(Selector, {
preventDefault: false, // 阻止浏览器滑动默认行为
probeType: 3, //需要使用 iscroll-probe.js 才能生效 probeType : 1 滚动不繁忙的时候触发 probeType : 2 滚动时每隔一定时间触发 probeType : 3 每滚动一像素触发一次
mouseWheel: true, //是否监听鼠标滚轮事件。
scrollX: true, // 启动x轴滑动
scrollY: true, // 启动y轴滑动
// momentum: false,
lockDirection: false,
snap: false, //自动分割容器,用于制作走马灯效果等。Options.snap:true// 根据容器尺寸自动分割
//snapSpeed: 400,
scrollbars: false, //是否显示默认滚动条
freeScroll: true, //主要在上下左右滚动都生效时使用,可以向任意方向滚动。
deceleration: 0.0001, //滚动动量减速越大越快,建议不大于 0.01,默认:0.0006
disableMouse: true, //是否关闭鼠标事件探测。如知道运行在哪个平台,可以开启它来加速。
disablePointer: true, //是否关闭指针事件探测。如知道运行在哪个平台,可以开启它来加速。
disableTouch: false, //是否关闭触摸事件探测。如知道运行在哪个平台,可以开启它来加速。
eventPassthrough: false, //使用 IScroll 的横轴滚动时,如想使用系统立轴滚动并在横轴上生效,请开启。
bounce: false //是否启用弹力动画效果,关掉可以加速
});
scroller.on('scroll', updatePosition);
scroller.on('scrollEnd', updatePosition);
scroller.on('beforeScrollStart', function () {
scroller.refresh();
});
function updatePosition() {
let frozenCols = document.querySelectorAll(selector + ' table tr td.cols');
let frozenRows = document.querySelectorAll(selector + ' table tr th.rows');
let frozenCrosses = document.querySelectorAll(selector + ' table tr th.cross');
for (let i = 0; i < frozenCols.length; i++) {
frozenCols[i].style.transform = 'translate(' + -1 * this.x + 'px, 0px) translateZ(0px)';
}
for (let i = 0; i < frozenRows.length; i++) {
frozenRows[i].style.transform = 'translate(0px, ' + -1 * this.y + 'px) translateZ(0px)';
}
for (let i = 0; i < frozenCrosses.length; i++) {
frozenCrosses[i].style.transform = 'translate(' + -1 * this.x + 'px,' + -1 * this.y + 'px) translateZ(0px)';
}
}
return scroller;
}
export function refreshScroller() {
if (scroller === null) {
console.error("先初始化scroller");
return;
}
setTimeout(() => {
scroller.refresh();
scroller.scrollTo(0, 0);
let frozenCols = document.querySelectorAll(Selector + ' table tr td.cols');
let frozenRows = document.querySelectorAll(Selector + ' table tr th.rows');
let frozenCrosses = document.querySelectorAll(Selector + ' table tr th.cross');
for (let i = 0; i < frozenCols.length; i++) {
frozenCols[i].style.transform = 'translate(0px, 0px) translateZ(0px)';
}
for (let i = 0; i < frozenRows.length; i++) {
frozenRows[i].style.transform = 'translate(0px, 0px) translateZ(0px)';
}
for (let i = 0; i < frozenCrosses.length; i++) {
frozenCrosses[i].style.transform = 'translate(0px, 0px) translateZ(0px)';
}
}, 0);
}
export function reSetScroller(valSelector,valScroller){
scroller = valScroller;
Selector = valSelector
}
export function fixCrosses(valSelector,valScroller) {
if (scroller === null) {
console.error("先初始化scroller");
return;
}
// 重新赋值
scroller = valScroller;
Selector = valSelector
// console.log(Selector)
// console.log(scroll)
setTimeout(() => {
let frozenCols = document.querySelectorAll(Selector + ' table tr td.cols');
for (let i = 0; i < frozenCols.length; i++) {
frozenCols[i].style.transform = 'translate(' + -1 * scroller.x + 'px, 0px) translateZ(0px)';
}
}, 0);
}
\ No newline at end of file
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
This diff could not be displayed because it is too large.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment