This commit is contained in:
weixiansheng 2023-05-06 15:18:29 +08:00
parent adfb2e2f02
commit bda2c9a3fa
106 changed files with 46222 additions and 0 deletions

12
captcha/aj-front/.babelrc Normal file
View File

@ -0,0 +1,12 @@
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"]
}

View File

@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

View File

@ -0,0 +1,4 @@
build/*.js
src/assets
public
dist

View File

@ -0,0 +1,206 @@
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true,
},
extends: [
'plugin:vue/recommended',
// 'eslint:recommended'
],
// add your custom rules here
globals: {
'AMap': 'readonly',
'THREE': 'readonly'
},
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/require-default-prop":0,
"vue/singleline-html-element-content-newline": "off",
"vue/multiline-html-element-content-newline": "off",
"vue/name-property-casing": ["error", "PascalCase"],
"vue/no-v-html": "off",
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
// 'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
// 'eqeqeq': ["error", "always", { "null": "ignore" }],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
// 'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
// 'new-cap': [2, {
// 'newIsCap': true,
// 'capIsNew': false
// }],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 0,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
// 'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
// 'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 0,
'no-unsafe-finally': 2,
'no-unused-vars': [0, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}

14
captcha/aj-front/.gitignore vendored Normal file
View File

@ -0,0 +1,14 @@
.DS_Store
node_modules/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

View File

@ -0,0 +1,10 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}

124
captcha/aj-front/README.md Normal file
View File

@ -0,0 +1,124 @@
## 前端接入
### 1. 兼容性
IE8+、Chrome、Firefox.(其他未测试)
### 2. 初始化组件
1)复制view/vue/src/components/verifition文件夹,到自己工程对应目录下,在登录页面插入如下代码。
2)安装请求和加密依赖
npm install axios crypto-js -S
#### 基础示例
```javascript
<template>
<Verify
@success="'success'" //验证成功的回调函数
:mode="'pop'" //调用的模式
:captchaType="'blockPuzzle'" //调用的类型 点选或者滑动
:imgSize="{ width: '330px', height: '155px' }" //图片的大小对象
ref="verify"
></Verify>
//mode="pop"模式
<button @click="useVerify">调用验证组件</button>
</template>
****注: mode为"pop"时,使用组件需要给组件添加ref值,并且手动调用show方法 例: this.$refs.verify.show()****
****注: mode为"fixed"时,无需添加ref值,无需调用show()方法****
<script>
//引入组件
import Verify from "./../../components/verifition/Verify";
export default {
name: 'app',
components: {
Verify
}
methods:{
success(params){
// params 返回的二次验证参数, 和登录参数一起回传给登录接口,方便后台进行二次验证
},
useVerify(){
this.$refs.verify.show()
}
}
}
</script>
```
### 3.回调事件
| 参数 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
| success(params) | funciton | 验证码匹配成功后的回调函数,params为返回需回传服务器的二次验证参数 |
| error | funciton | 验证码匹配失败后的回调函数 |
| ready | funciton | 验证码初始化成功的回调函数 |
### 4. 验证码参数
| 参数 | 类型 | 说明 |
| ------------ | ------------ | ------------ |
| captchaType | String | 1滑动拼图 blockPuzzle 2文字点选 clickWord |
| mode | String | 验证码的显示方式弹出式pop固定fixed默认mode : pop |
| vSpace | String | 验证码图片和移动条容器的间隔默认单位是px。如间隔为5px默认:vSpace:5 |
| explain | String | 滑动条内的提示,不设置默认是:'向右滑动完成验证' |
| imgSize | Object | 其中包含了width、height两个参数分别代表图片的宽度和高度支持百分比方式设置 如:{width:'400px',height:'200px'}
### 5.1默认接口api地址
| 请求URL | 请求方式 |
| ------------ | ------------ |
| /captcha/get | Post |
| /captcha/check | Post |
### 5.2 获取验证码接口详情
#### 接口地址http://*:*/captcha/get
组件内部默认请求服务器地址: process.env.BASE_API ; 是vue项目打包配置地址,方便分环境打包
##### 请求参数:
```json
{
"captchaType": "blockPuzzle" //验证码类型 clickWord
}
```
##### 响应参数:
```json
{
"repCode": "0000",
"repData": {
"originalImageBase64": "底图base64",
"point": { //默认不返回的,校验的就是该坐标信息,允许误差范围
"x": 205,
"y": 5
},
"jigsawImageBase64": "滑块图base64",
"token": "71dd26999e314f9abb0c635336976635", //一次校验唯一标识
"result": false,
"opAdmin": false
},
"success": true,
"error": false
}
```
### 5.3 核对验证码接口详情
#### 请求接口http://*:*/captcha/check
组件内部默认请求服务器地址: process.env.BASE_API ; 是vue项目打包配置地址,方便分环境打包
##### 请求参数:
```json
{
"captchaType": "blockPuzzle",
"pointJson": "QxIVdlJoWUi04iM+65hTow==", //aes加密坐标信息
"token": "71dd26999e314f9abb0c635336976635" //get请求返回的token
}
```
##### 响应参数:
```json
{
"repCode": "0000",
"repData": {
"captchaType": "blockPuzzle",
"token": "71dd26999e314f9abb0c635336976635",
"result": true,
"opAdmin": false
},
"success": true,
"error": false
}
```

View File

@ -0,0 +1,41 @@
'use strict'
require('./check-versions')()
//process.env.NODE_ENV = 'production'
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const spinner = ora('building for ' + process.env.NODE_ENV + '...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
// console.log(chalk.yellow(
// ' Tip: built files are meant to be served over an HTTP server.\n' +
// ' Opening index.html over file:// won\'t work.\n'
// ))
})
})

View File

@ -0,0 +1,54 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,102 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader',
publicPath:'../../'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}

View File

@ -0,0 +1,22 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}

View File

@ -0,0 +1,92 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
var webpack = require("webpack")
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
// publicPath:process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath
publicPath: config.build.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
}
},
module: {
rules: [{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
},
{
test: /\.less$/,
loader: "style-loader!css-loader!less-loader",
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
},
plugins: [
new webpack.optimize.CommonsChunkPlugin('common.js'),
new webpack.ProvidePlugin({
jQuery: "jquery",
$: "jquery"
})
]
}

View File

@ -0,0 +1,101 @@
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
// mode: 'development',
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: config.dev.assetsPublicPath
},
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.config
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})

View File

@ -0,0 +1,154 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
var env = require('../config/dev.env')
if (process.env.NODE_ENV === 'testing') {
env = require('../config/test.env')
}
if (process.env.NODE_ENV === 'production') {
env = require('../config/prod.env')
}
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('config/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('config/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap ? {
safe: true,
map: {
inline: false
}
} : {
safe: true
}
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor config into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks(module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig

View File

@ -0,0 +1,9 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
BASE_API: '"http://localhost:8080"' //如果在本地启动server/springboot 打开此注释
// BASE_API: '"https://captcha.anji-plus.com/captcha-api"'
})

View File

@ -0,0 +1,72 @@
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
// assetsPublicPath: './',//测试
assetsPublicPath: '/',//本地
productionSourceMap: true,
proxyTable: {},
// Various Dev Server settings
// host: '10.108.12.59', // can be overwritten by process.env.HOST
host: 'localhost', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}

View File

@ -0,0 +1,5 @@
'use strict'
module.exports = {
NODE_ENV: '"production"',
BASE_API: '"https://captcha.anji-plus.com/captcha-api"'
}

View File

@ -0,0 +1,8 @@
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"testing"',
BASE_API: '"http://localhost:8080"'
})

View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>AJ-Captcha在线体验</title>
</head>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?9773cfcd3aa9f4de66a8aaed99bb4627";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

32981
captcha/aj-front/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,82 @@
{
"name": "mirror-verify",
"version": "1.0.0",
"description": "A Vue.js project",
"author": "wemooly <525507670@qq.com>",
"private": true,
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"build": "cross-env NODE_ENV=production node build/build.js",
"build:dev": "cross-env NODE_ENV=development node build/build.js",
"build:test": "cross-env NODE_ENV=testing node build/build.js",
"build:prod": "cross-env NODE_ENV=production node build/build.js"
},
"dependencies": {
"axios": "^0.19.2",
"crypto-js": "^4.0.0",
"element-ui": "^2.13.0",
"less": "^3.11.1",
"less-loader": "^5.0.0",
"mavon-editor": "^2.9.0",
"vue": "^2.5.2",
"vue-router": "^3.0.1",
"vuex": "^3.1.2"
},
"devDependencies": {
"@vue/cli-plugin-eslint": "3.9.1",
"autoprefixer": "^7.1.2",
"babel-core": "^6.22.1",
"babel-eslint": "10.0.1",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.22.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.3.2",
"babel-preset-stage-2": "^6.22.0",
"chalk": "^2.0.1",
"copy-webpack-plugin": "^4.0.1",
"cross-env": "^5.2.0",
"css-loader": "^0.28.0",
"eslint": "5.15.3",
"eslint-plugin-vue": "5.2.2",
"extract-text-webpack-plugin": "^3.0.0",
"file-loader": "^1.1.4",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"node-notifier": "^5.1.2",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"portfinder": "^1.0.13",
"postcss-import": "^11.0.0",
"postcss-loader": "^2.0.8",
"postcss-url": "^7.2.1",
"rimraf": "^2.6.0",
"semver": "^5.3.0",
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.3.0",
"url-loader": "^0.5.8",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
"webpack": "^3.6.0",
"webpack-bundle-analyzer": "^2.9.0",
"webpack-dev-server": "^2.9.1",
"webpack-merge": "^4.1.0"
},
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
],
"main": ".postcssrc.js",
"directories": {
"doc": "docs"
},
"license": "ISC"
}

View File

@ -0,0 +1,19 @@
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
name: 'App'
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</style>

View File

@ -0,0 +1,32 @@
import axios from 'axios'
axios.defaults.baseURL = process.env.BASE_API
const service = axios.create({
withCredentials: true,
timeout: 40000,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json; charset=UTF-8'
},
})
service.interceptors.request.use(
config => {
return config
},
error => {
// Do something with request error
// console.log(error) // for debug
Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
const res = response.data
return res
},
)
export default service

View File

@ -0,0 +1,133 @@
import request from './axios'
// 登录
export function reqLogin(data) {
return request({
// url: 'user/noauth/login',
url: '/base/accessUser/login',
method: 'post',
data: data
})
}
// 登出
export function LogOut(data) {
return request({
url: '/base/accessUser/logout',
method: 'post',
data: data
})
}
// 项目分页接口
export function queryByPage(data) {
return request({
// url: 'user/noauth/login',
url: '/base/project/queryByPage',
method: 'post',
data: data
})
}
// 项目创建
export function addCreate(data) {
return request({
url: '/base/project/create',
method: 'post',
data: data
})
}
// 项目信息更新
export function UpdataPro(data) {
return request({
url: '/base/project/update',
method: 'post',
data: data
})
}
// 顶部项目列表
export function GetTopPro(data) {
return request({
url: '/base/project/selectTop4',
method: 'post',
data: data
})
}
// 拖拽排序
export function DndSort(data) {
return request({
url: '/base/sort/setListSort',
method: 'post',
data: data
})
}
// 项目置顶接口
export function SetTop(data) {
return request({
url: '/base/sort/setTop',
method: 'post',
data: data
})
}
// 获得导航
export function getMenu() {
return request({
url: 'auth/menu/getList',
method: 'post'
})
}
export function loadOption(data1) {
const data = {
pageNum: 1,
pageSize: 30,
parameter: data1.row.code
}
request({
url: 'dataDic/getValueList',
method: 'post',
data: data
}).then(res => {
return res.repData
}).catch(error => {
self.msgError(error.repMsg)
})
}
// 下拉框数据
export function loadDicValList(data) {
return request({
url: 'dataDic/getValueList',
method: 'post',
data: data
})
}
// delProject
export function delProject(data) {
return request({
url: '/business/project/delete/' + data,
method: 'post',
data: data
})
}
// 前端所属项目下拉接口
export function queryForProjectSelect() {
return request({
url: '/base/project/queryForProjectSelect',
method: 'post'
})
}
// 项目Id查询
export function projectQueryById(data) {
return request({
url: '/base/project/queryById',
method: 'post',
data: data
})
}
// 前端select组件接口
export function queryForCodeSelect() {
return request({
url: '/base/baseCode/queryForCodeSelect',
method: 'post'
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -0,0 +1,733 @@
/**
* Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
* http://cssreset.com
*/
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video,
input {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font-weight: normal;
vertical-align: baseline;
font-family: 'pingFangSC-Regular';
}
/* HTML5 display-role reset for older browsers */
article,
aside,
details,
figcaption,
figure,
footer,
header,
menu,
nav,
section {
display: block;
}
body {
line-height: 1;
font-size: 1em;
font-family: PingFangSC-Semibold;
background: #fff;
}
blockquote,
q {
quotes: none;
}
.crumbs {
padding: 0;
display: inline-block;
line-height: 20px;
}
.el-icon-info {
margin-right: 10px;
}
.el-menu-item-group .el-menu-item-group__title {
padding: 0px !important;
}
blockquote:before,
blockquote:after,
q:before,
q:after {
content: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
/* custom */
a {
color: #7e8c8d;
text-decoration: none;
-webkit-backface-visibility: hidden;
}
a:hover,a:visited,a:active{
color: #fff;
text-decoration: none;
-webkit-backface-visibility: hidden;
}
button:hover,button:visited,button:active{
color: #fff;
}
li {
list-style: none;
}
/* 滚动条 */
::-webkit-scrollbar {
/*垂直滚动条的宽*/
width: 10px;
/*垂直滚动条的高*/
height: 10px;
}
::-webkit-scrollbar-track-piece {
/*修改滚动条的背景和圆角*/
background: #F7F7F7;
-webkit-border-radius: 7px;
}
/*修改垂直滚动条的样式*/
::-webkit-scrollbar-thumb:vertical {
background-color: #dcdfe6;
-webkit-border-radius: 7px;
}
/*修改水平滚动条的样式*/
::-webkit-scrollbar-thumb:horizontal {
background-color: #dcdfe6;
-webkit-border-radius: 7px;
}
html,
body {
width: 100%;
}
body {
-webkit-text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/*html,*/
/*body,*/
/*#app {*/
/*height: 100%;*/
/*}*/
/* IE7 */
input:focus,
a:focus,
button:focus,
textarea:focus {
outline: none
}
::-ms-clear {
display: none;
}
::-ms-reveal {
display: none;
}
.on-focus:focus {
border: 1px solid #5BC0DE;
}
/*清除浮动*/
.clearfix:after {
content: ".";
display: block;
clear: both;
visibility: hidden;
line-height: 0;
height: 0;
font-size: 0;
}
/*button*/
.el-button{
/*color: #7ab1f9;*/
}
.el-button.padding0{
padding: 0 !important;
}
.el-button.is-round{
padding: 9px 23px;
}
/*表头td*/
.el-table th {
padding: 8px 0;
}
/*表格tr*/
.el-table td {
padding: 4px 0;
text-align: center
}
.el-table__row {
height: 36px;
}
.logTable .el-table .cell {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.logTable .el-table__row .el-table_1_column_2{
text-align: left
}
/*列表外边距*/
.spaceTable {
margin: 0 20px;
}
/*-----弹框-------*/
.el-dialog{
border-radius: 12px;
}
.el-dialog__header {
background-color: #fff;
padding:.8rem;
border-top-left-radius: 12px;
border-top-right-radius: 12px;
border-bottom: 12px solid #f2f4fb;
}
.el-dialog__title {
color: #333;
padding-left: 20px;
font-size: 16px;
}
.el-dialog__headerbtn {
top: 20px;
}
.el-dialog__headerbtn .el-dialog__close {
color: #333;
}
.el-dialog__headerbtn .el-dialog__close:hover {
color: #111;
}
.el-dialog--center .el-dialog__body {
padding: 12px 25px 13px;
}
.el-table th,
.el-table thead tr {
background-color: #EEF0F9;
}
/*输入框高度*/
.el-form-item{
margin-bottom: 20px;
}
.el-form-item__label,.el-form-item__content{
line-height: 32px;
}
.el-input__inner {
padding: 0 24px 0 10px;
font-size: 14px !important;
background: #fff;
border: 1px solid #DEDEDE;
border-radius: 100px;
height: 32px;
}
.el-textarea__inner {
padding: 10px;
height: 100%;
/*font-size: 14px !important;*/
resize: none;
}
.app-select{
width: 80px;
}
.app-select .el-input__inner{
padding: 0 24px 0 10px;
font-size: 14px !important;
background: none;
border: 0;
border-radius: 100px;
height: 32px;
color: #fff;
}
/* Tabel */
.el-pagination,
.el-pager,
.el-pager,
.number,
.el-pagination__jump,
.el-pagination button {
height: 40px !important;
line-height: 40px !important;
}
.el-checkbox__input.is-checked+.el-checkbox__label {
color: #919191 !important;
font-size: 14px;
}
.left-box .el-checkbox__input.is-checked+.el-checkbox__label {
color: #fff !important;
font-size: 14px;
}
.el-carousel__container{
height: 29vh;
}
.el-carousel__indicators--outside{
height: 0;
overflow: hidden;
}
.el-carousel__arrow i{
font-size: 0!important;
}
/*日志折叠面板定制*/
.log .el-collapse{
border-top:0;
border-bottom:0;
}
.log .el-collapse-item__header {
height: 40px;
line-height: 40px;
cursor: pointer;
border: 1px solid #fff;
background:rgba(145,163,177,.15);
font-size: 14px;
color: #666;
-webkit-transition: border-bottom-color .3s;
transition: border-bottom-color .3s;
outline: 0;
padding: 0 20px;
}
[class*=" el-icon-"], [class^=el-icon-] {
/* line-height: 40px; */
}
.log .el-collapse-item__wrap {
will-change: height;
overflow: hidden;
-webkit-box-sizing: border-box;
box-sizing: border-box;
border-bottom: 1px solid #fff;
background: #263C7C;
}
.log .el-collapse-item__content{
font-size: 14px;
color: #FFFFFF;
padding: 20px;
}
.log .el-collapse-item__arrow{
margin-top: 14px;
float: right;
margin-right: -77px;
}
/*计算配置面板配置*/
.analysisCollapse .xing{
color: red;
margin-right:5px;
font-weight: 700;
}
.analysisCollapse .el-collapse{
border-bottom: 1px solid #fff;
}
.analysisCollapse .el-collapse-item__header{
border-bottom: 1px solid #fff;
}
.analysisCollapse .el-collapse-item__wrap{
border-bottom: 1px solid #fff;
}
/*表格样式*/
.el-table th, .el-table thead tr {
background: #5E6988;
font-size: 14px;
color: #FFFFFF;
text-align: center;
}
.el-table th, .el-table thead tr {
border:0;
}
/*分页*/
.el-pagination{
padding: 10px 0;
}
.el-pagination button, .el-pagination span:not([class*=suffix]) {
vertical-align: inherit;
}
.el-pager, .el-pager li {
vertical-align: inherit;
}
.el-pagination .el-input__inner{
background: #fff!important;
}
.el-pagination .el-select .el-input .el-input__inner{
border-radius: 100px;
}
.el-select .el-input.is-disabled .el-input__inner{
height: 32px!important;
}
.code-selected .el-input__inner{
height: 32px!important;
}
/*添加监控分步图标*/
.el-step__main{
margin-top: 30px;
margin-left: -10px;
}
.el-step__icon-inner{
font-weight: 300;
font-size: 22px;
transform:rotate(0deg);
-ms-transform:rotate(0deg); /* IE 9 */
-moz-transform:rotate(0deg); /* Firefox */
-webkit-transform:rotate(0deg); /* Safari 和 Chrome */
-o-transform:rotate(0deg); /* Opera */
}
.el-step__title{
font-size: 14px;
}
.el-step:last-of-type.is-flex .el-step__main{
margin-top: 0;
}
.el-step__icon{
border-radius: 60px;
margin-top: -10px;
}
.el-step__icon.is-icon{
width: 40px;
height: 40px;
}
/*正在进行的状态*/
.is-finish .el-step__icon{
background:#7AB1F9;
color: #fff;
border-left: 3px solid #7AB1F9 ;
border-top: 3px solid #7AB1F9 ;
border-right: 3px solid #7AB1F9;
border-bottom: 3px solid #7AB1F9;
float: left;
}
.el-step__head.is-finish .el-step__icon .el-step__icon-inner{
}
.is-process .el-step__icon .el-step__icon-inner{
transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
-webkit-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
}
.el-step__head.is-finish i.el-step__line-inner {
border-width: 0!important;
border-top-width: 3px!important;
border-style: dashed;
border-color: #7AB1F9;
margin-top: -3px;
}
.el-step.is-horizontal .el-step__line{
height: 0!important;
top: 8px!important;
}
/*完成的状态*/
.el-step__title.is-process{
color: #7AB1F9;
font-weight: 300!important;
}
.is-process .el-step__icon{
background:#fff;
color: #7AB1F9;
border-left: 3px solid #e3eefc ;
border-top: 3px solid #7AB1F9 ;
border-right: 3px solid #7AB1F9;
border-bottom: 3px solid #7AB1F9;
transform:rotate(45deg);
-ms-transform:rotate(45deg); /* IE 9 */
-moz-transform:rotate(45deg); /* Firefox */
-webkit-transform:rotate(45deg); /* Safari 和 Chrome */
-o-transform:rotate(45deg); /* Opera */
float: left;
}
.app-chart-checkbox .el-checkbox__input.is-indeterminate .el-checkbox__inner{
background-color: #fff;
}
/*待完成状态*/
.el-step__title.is-wait{
color: #9199B1;
font-weight: 300!important;
}
.is-wait .el-step__icon{
background:#9199B1;
color: #fff;
border-left: 3px solid #9199B1 ;
border-top: 3px solid #9199B1 ;
border-right: 3px solid #9199B1;
border-bottom: 3px solid #9199B1;
}
/*步骤条的线*/
.el-step.is-horizontal .el-step__line{
background: none;
border-top: 3px dashed #9199B1;
}
/*header*/
.el-menu.el-menu--horizontal{
border-bottom: none;
}
/*tree*/
.el-tree {
margin-top:10px;
}
/* 错误提示*/
.el-message--error,.el-message--success,.el-message--warning{
top:90px;
}
.el-upload-list--picture-card .el-upload-list__item {
background: #99ccff;
}
/*日期选择控件*/
.el-date-editor .el-range__icon{
}
.el-carousel__arrow i{
font-size: 40px;
}
/*提示框*/
.el-message-box{
width: auto!important;
padding:10px;
min-width: 250px;
}
/**/
.gropu_by .el-select__tags .el-tag:first-child .el-icon-close{
display: none;
}
/*tab 切页*/
.el-tabs--card>.el-tabs__header{
border-bottom: 1px solid #fff;
}
.el-tabs__content{
overflow: initial;
}
.el-tabs__item{
padding: 0 6px;
height: 32px;
line-height: 32px;
}
.el-tabs--card>.el-tabs__header .el-tabs__nav{
border: none;
border-bottom: 2px solid #2c3e50;
border-radius: 0!important;
}
.el-tabs--bottom .el-tabs--left .el-tabs__item:last-child, .el-tabs--bottom .el-tabs--right .el-tabs__item:last-child, .el-tabs--bottom.el-tabs--border-card .el-tabs__item:last-child, .el-tabs--bottom.el-tabs--card .el-tabs__item:last-child, .el-tabs--top .el-tabs--left .el-tabs__item:last-child, .el-tabs--top .el-tabs--right .el-tabs__item:last-child, .el-tabs--top.el-tabs--border-card .el-tabs__item:last-child, .el-tabs--top.el-tabs--card .el-tabs__item:last-child{
padding-right: 6px;
}
.el-tabs__item.is-active{
color: #2c3e50;
}
.monitor-carousel .el-carousel__container{
height: 100vh!important;
}
.wrap-bg{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100vh!important;
background: #000;
z-index: 999998;
opacity: .0!important;
}
.wrap-content-list{
max-height: 300px;
overflow-y: auto;
}
.selectInputEntry .el-input__inner{
min-height: 62px;
height:auto!important;
}
.correlation{
text-align: center;
line-height: 24px;
float: left;
padding: 0 7px;
}
.correlation:hover{
color: #fff;
cursor: pointer;
background:rgba(244,233,333,.1);
}
.correlation-popo{
position:absolute;
z-index:1;
background:#79b1f9;
color:#fff;
box-shadow:0 0 9px #79b1f9;
border-radius:12px;
font-size:12px;
padding: 3px;
min-width: 100px;
}
.button_icon{
border: none;
background: none;
padding: 0;
}
/*收藏列表tabs*/
.chart-carousel .el-tabs__nav-wrap::after{
background-color:transparent;
}
.el-tabs__active-bar{
height: 0;
}
.el-tabs__item{
padding: 0 10px;
font-size: 12px;
}
.el-tabs__item:hover{
color: #7AB1F9;
}
.el-tabs__item.is-active {
color: #fff;
background: #7AB1F9;
font-size: 12px;
border-radius: 50px;
padding: 0 10px!important;
}
.chart-carousel .el-tabs__item{
height: 28px;
line-height: 28px;
}
/*表格超出弹出气泡框的样式*/
.el-tooltip__popper{max-width:20%!important;}
.el-tooltip__popper,.el-tooltip__popper.is-dark{background:#444 !important;
color: #eee !important;}
.more_selected .el-input__inner{
min-height: 62px;
height: auto;
border-radius: 3px;
}
.more_selected .el-select__tags{
padding-left: 20px!important;
}
.el-row--flex.is-justify-center{
outline: none;
}
.progress {
margin-top: 18px;
}
.progress:nth-child(3){
margin-top: 23px;
}
.progress .el-progress-bar__outer{
overflow: inherit;
background: rgba(0,0,0,.1999);
}
.progress .el-progress-bar__inner{
background-image: linear-gradient(83deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)!important;
}
.progress .el-progress-bar__innerText{
margin-top: -38px;
}

View File

@ -0,0 +1,321 @@
.content {
padding-bottom: 100px;
}
.bg-w {
background: #fff;
}
.c-mt20 {
margin-top: 20px;
}
.h2 {
font-size: 16px;
color: #333;
line-height: 42px;
}
.content-border {
border-top: 12px solid #f2f4fb;
}
.pd-content {
padding: 12px 120px;
}
.pd-main {
padding-left: 2.5rem;
padding-right: 2.5rem;
}
@media screen and (max-width: 1420px) {
.pd-content {
padding: 12px 10px;
}
}
@media only screen and (min-width: 1200px){
.el-col-lg-22 {
width: 99.66667%;
}
@media only screen and (min-width: 992px){
.el-col-md-22 {
width: 99.66667%;
}
@media only screen and (min-width: 768px){
.el-col-sm-22 {
width: 99.66667%;
}
}
}
}
.mt10{
margin-top: 10px;
}
.pt20 {
padding-top: 20px;
}
.pt10 {
padding-top: 10px;
}
.mb10{
margin-bottom: 10px;
}
.pb20 {
padding-bottom: 20px;
}
.pb50 {
padding-bottom: 50px;
}
.pc-height {
/*height: calc(100vh - 186px);*/
/*height: -moz-calc(100vh - 186px);*/
/*height: -webkit-calc(100vh - 186px);*/
/*height: calc(100vh - 186px);*/
/*overflow-y: auto;*/
/*overflow-x: hidden;*/
}
/*搜索框,输入框,按钮*/
input::-webkit-input-placeholder {
/* WebKit browsers */
color: #e3e3e3;
}
input:-moz-placeholder {
/* Mozilla Firefox 4 to 18 */
color: #e3e3e3;
}
input::-moz-placeholder {
/* Mozilla Firefox 19+ */
color: #e3e3e3;
}
input:-ms-input-placeholder {
/* Internet Explorer 10+ */
color: #e3e3e3;
}
.c-input {
background: #ffffff;
border: 1px solid rgba(151, 151, 151, 0.2);
border-radius: 100px;
height: 24px;
line-height: 31px;
padding: 3px 30px 3px 10px ;
/*min-width: 20vw;*/
color: #333;
font-size: 14px;
}
.c-search {
position: relative;
overflow: hidden;
}
.c-search-button.position {
position: absolute;
top: 0;
right: 0;
}
.c-search-button {
background: #7ab1f9;
border-radius: 0 30px 30px 0;
height: 31px;
text-align: center;
padding: 0 16px;
border: 0;
color: #fff;
}
.c-search-button:hover {
color: #fff;
background: #3395fb;
}
.c-button {
border-radius: 100px;
border: 0;
height: 32px;
color: #fff;
line-height: 0;
/*width: 90px;*/
text-align: center;
}
.c-button-normal {
border-radius: 100px;
border: 0;
height: 40px;
color: #fff;
width: 100px;
text-align: center;
}
.c-button-mini {
border-radius: 100px;
border: 0;
color: #fff;
padding: 5px 12px;
text-align: center;
}
.c-button.blue,
.c-button-normal.blue,
.c-button-mini.blue {
background: #7ab1f9;
}
.c-button.green,
.c-button-normal.green,
.c-button-mini.green {
background: #7ed321;
}
.c-button.red,
.c-button-normal.red,
.c-button-mini.red {
background: #ff7272;
}
.c-button.yellow,
.c-button-normal.yellow,
.c-button-mini.yellow {
background: #f6a93b;
}
.c-button.white,
.c-button-normal.white,
.c-button-mini.white {
background: #fff;
border: 1px solid #79b1f9;
color: #79b1f9;
}
.c-button.purple,
.c-button-normal.purple,
.c-button-mini.purple {
background: #e5bfa3;
}
.c-button.blue:hover,
.c-button-normal.blue:hover,
.c-button-mini.blue:hover {
color: white;
background: #3395fb;
}
.c-button.green:hover,
.c-button-normal.green:hover,
.c-button-mini.green:hover {
color: white;
background: #50d310;
}
.c-button.red:hover,
.c-button-normal.red:hover,
.c-button-mini.red:hover {
color: white;
background: #ff7260;
}
.c-button.yellow:hover,
.c-button-normal.yellow:hover,
.c-button-mini.yellow:hover {
color: white;
background: #f6b01d;
}
.c-button.white:hover,
.c-button-normal.white:hover,
.c-button-mini.white:hover {
color: #fff;
background: #79b1f9;
}
.c-button.purple:hover,
.c-button-normal.purple:hover,
.c-button-mini.purple:hover {
color: #fff;
background: #e5bfa3;
}
/*图标 按钮 隐藏按钮特性*/
.icon-btn_style {
background: none;
border: 0;
padding: 0;
}
.icon-btn_style:hover {
background: none;
border: 0;
padding: 0;
}
/*模态框 总体样式*/
.dialog {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: rgba(0, 0, 0, 0.6);
z-index: 9999;
}
.dialog .dialog-container {
width: 600px;
height: 500px;
background: #ffffff;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
border-radius: 8px;
position: relative;
}
.dialog .dialog-title {
width: 100%;
height: 60px;
font-size: 18px;
color: #696969;
font-weight: 600;
padding: 16px 50px 0 20px;
box-sizing: border-box;
}
.content {
color: #797979;
line-height: 26px;
padding: 0 20px;
box-sizing: border-box;
}
.inp {
margin: 10px 0 0 20px;
width: 200px;
height: 40px;
padding-left: 4px;
border-radius: 4px;
border: none;
background: #efefef;
outline: none;
}
.inp:focus {
border: 1px solid #509ee3;
}
.btns {
width: 100%;
height: 60px;
position: absolute;
bottom: 0;
left: 0;
text-align: right;
padding: 0 16px;
box-sizing: border-box;
}
.btns > div {
display: inline-block;
height: 40px;
line-height: 40px;
padding: 0 14px;
color: #ffffff;
background: #f1f1f1;
border-radius: 8px;
margin-right: 12px;
cursor: pointer;
}
.close-btn {
position: absolute;
top: 16px;
right: 16px;
width: 30px;
height: 30px;
line-height: 30px;
text-align: center;
font-size: 18px;
cursor: pointer;
}
.close-btn:hover {
font-weight: 600;
}
/*main*/
.search-pop {
margin-top: 64px;
}
.table-input .el-input--mini .el-input__inner {
height: 32px !important;
}
.see-data .el-input {
width: auto !important;
}
.fr{
float: right;
}

View File

@ -0,0 +1,12 @@
/deep/.v-note-wrapper {
.v-note-op{
display: none!important;
}
.v-note-edit{
display: none!important;
}
.v-note-show{
width: 100%!important;
flex: 0 0 100%!important;
}
}

View File

@ -0,0 +1,87 @@
.mt5 {
margin-top: 5px;
}
.mt10 {
margin-top: 10px;
}
.mt12 {
margin-top: 12px;
}
.mt20 {
margin-top: 20px;
}
.mb5 {
margin-top: 5px;
}
.mb10 {
margin-top: 10px;
}
.mb12 {
margin-top: 12px;
}
.mb20 {
margin-bottom: 20px;
}
.mt30 {
margin-top: 30px;
}
.mt40 {
margin-top: 40px;
}
.mt50 {
margin-top: 50px;
}
.mt60 {
margin-top: 60px;
}
.mt70 {
margin-top: 750px;
}
.mt80 {
margin-top: 80px;
}
.ml5 {
margin-left: 5px;
}
.ml10 {
margin-left: 10px;
}
.ml12 {
margin-left: 12px;
}
.ml20 {
margin-left: 20px;
}
.ml30 {
margin-left: 30px;
}
.ml40 {
margin-left: 40px;
}
.ml50 {
margin-left: 50px;
}
.ml60 {
margin-left: 60px;
}
.ml70 {
margin-left: 750px;
}
.ml80 {
margin-left: 80px;
}
.fl {
float: left;
}
.fr {
float: right;
}
.mt5vh {
margin-top: 5vh;
}
.mt10vh {
margin-top: 10vh;
}
.mt14vh {
margin-top: 11vh;
}

View File

@ -0,0 +1,131 @@
// image
//@image: "@/common/image";
// color
@blue: #0D76BD;
@lightblue: #3E76D4;
@azure: #3376E4;
@grren: #00CC99;
@red: #FF7272;
@pink: #FDA5A5;
@purple: #B68BFF;
@gray: #666;
@white: #fff;
@lightgray:#D8D8D8;
@grayf2:#F2F4FB;
@ft-btn-color:#7AB1F9;
@color333:#333;
@steelgray:#5E6988;
// font
@f12: 12px;
@f13: 13px;
@f14: 14px;
@f15: 15px;
@f16: 16px;
@f18: 18px;
@f24: 24px;
//jianju
@px3:3px;
@px5:5px;
@px10:10px;
@px12:12px;
@px16:16px;
@px24:24px;
@px30:30px;
//百分比
@c10:10%;
@c20:20%;
@c30:30%;
@c40:40%;
@c50:50%;
@c100:100%;
.mt5{
margin-top: 5px;
}
.mt10{
margin-top: 10px;
}
.mt12{
margin-top: 12px;
}
.mt20{
margin-top: 20px;
}
.mb5{
margin-top: 5px;
}
.mb10{
margin-top: 10px;
}
.mb12{
margin-top: 12px;
}
.mb20{
margin-bottom: 20px;
}
.mt30{
margin-top: 30px;
}
.mt40{
margin-top: 40px;
}
.mt50{
margin-top: 50px;
}
.mt60{
margin-top: 60px;
}
.mt70 {
margin-top: 750px;
}
.mt80{
margin-top: 80px;
}
.ml5{
margin-left: 5px;
}
.ml10{
margin-left: 10px;
}
.ml12{
margin-left: 12px;
}
.ml20{
margin-left: 20px;
}
.mr20{
margin-right: 20px;
}
.ml30{
margin-left: 30px;
}
.ml40{
margin-left: 40px;
}
.ml50{
margin-left: 50px;
}
.ml60{
margin-left: 60px;
}
.ml70 {
margin-left: 750px;
}
.ml80{
margin-left: 80px;
}
.fl{
float: left;
}
.fr{
float: right;
}
.mt5vh{
margin-top: 5vh;
}
.mt10vh{
margin-top: 10vh;
}
.mt14vh{
margin-top: 11vh;
}

View File

@ -0,0 +1,58 @@
<template>
<div class="markdown">
<mavon-editor v-model="value" />
</div>
</template>
<script>
import { readFile } from './../utils/readFile'
export default {
props: {
filePath: {
type: String,
require: true,
default: ' '
}
},
data() {
return {
value: '',
newFilePath: '',
}
},
watch: {
'filePath': {
handler() {
this.newFilePath = 'https://captcha.anji-plus.com/' + this.filePath
this.loadFile()
},
immediate: true
}
},
methods: {
loadFile() {
readFile(this.newFilePath).then(res => {
this.value = res.data ? res.data : res
})
}
},
}
</script>
<style lang="less" scoped>
/deep/.v-note-wrapper {
height:calc(100vh - 186px)!important;
.v-note-op{
display: none!important;
}
.v-note-edit{
display: none!important;
}
.v-note-show{
width: 100%!important;
flex: 0 0 100%!important;
}
}
</style>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,268 @@
<template>
<div
style="position: relative"
>
<div class="verify-img-out">
<div
class="verify-img-panel"
:style="{'width': setSize.imgWidth,
'height': setSize.imgHeight,
'background-size' : setSize.imgWidth + ' '+ setSize.imgHeight,
'margin-bottom': vSpace + 'px'}"
>
<div v-show="showRefresh" class="verify-refresh" style="z-index:3" @click="refresh">
<i class="iconfont icon-refresh" />
</div>
<img
ref="canvas"
:src="pointBackImgBase?('data:image/png;base64,'+pointBackImgBase):defaultImg"
alt=""
style="width:100%;height:100%;display:block"
@click="bindingClick?canvasClick($event):undefined"
>
<div
v-for="(tempPoint, index) in tempPoints"
:key="index"
class="point-area"
:style="{
'background-color':'#1abd6c',
color:'#fff',
'z-index':9999,
width:'20px',
height:'20px',
'text-align':'center',
'line-height':'20px',
'border-radius': '50%',
position:'absolute',
top:parseInt(tempPoint.y-10) + 'px',
left:parseInt(tempPoint.x-10) + 'px'
}"
>
{{ index + 1 }}
</div>
</div>
</div>
<!-- 'height': this.barSize.height, -->
<div
class="verify-bar-area"
:style="{'width': setSize.imgWidth,
'color': this.barAreaColor,
'border-color': this.barAreaBorderColor,
'line-height':this.barSize.height}"
>
<span class="verify-msg">{{ text }}</span>
</div>
</div>
</template>
<script type="text/babel">
/**
* VerifyPoints
* @description 点选
* */
import { resetSize, _code_chars, _code_color1, _code_color2 } from './../utils/util'
import { aesEncrypt } from './../utils/ase'
import { reqGet, reqCheck } from './../api/index'
export default {
name: 'VerifyPoints',
props: {
// popfixed
mode: {
type: String,
default: 'fixed'
},
captchaType: {
type: String,
},
//
vSpace: {
type: Number,
default: 5
},
imgSize: {
type: Object,
default() {
return {
width: '310px',
height: '155px'
}
}
},
barSize: {
type: Object,
default() {
return {
width: '310px',
height: '40px'
}
}
},
defaultImg: {
type: String,
default: ''
}
},
data() {
return {
secretKey: '', // ase
checkNum: 3, //
fontPos: [], //
checkPosArr: [], //
num: 1, //
pointBackImgBase: '', //
poinTextList: [], //
backToken: '', // token
setSize: {
imgHeight: 0,
imgWidth: 0,
barHeight: 0,
barWidth: 0
},
tempPoints: [],
text: '',
barAreaColor: undefined,
barAreaBorderColor: undefined,
showRefresh: true,
bindingClick: true
}
},
computed: {
resetSize() {
return resetSize
}
},
watch: {
// type
type: {
immediate: true,
handler() {
this.init()
}
}
},
mounted() {
//
this.$el.onselectstart = function() {
return false
}
},
methods: {
init() {
//
this.fontPos.splice(0, this.fontPos.length)
this.checkPosArr.splice(0, this.checkPosArr.length)
this.num = 1
this.getPictrue()
this.$nextTick(() => {
this.setSize = this.resetSize(this) //
this.$parent.$emit('ready', this)
})
},
canvasClick(e) {
this.checkPosArr.push(this.getMousePos(this.$refs.canvas, e))
if (this.num == this.checkNum) {
this.num = this.createPoint(this.getMousePos(this.$refs.canvas, e))
//
this.checkPosArr = this.pointTransfrom(this.checkPosArr, this.setSize)
//
setTimeout(() => {
// var flag = this.comparePos(this.fontPos, this.checkPosArr);
//
var captchaVerification = this.secretKey ? aesEncrypt(this.backToken + '---' + JSON.stringify(this.checkPosArr), this.secretKey) : this.backToken + '---' + JSON.stringify(this.checkPosArr)
const data = {
captchaType: this.captchaType,
'pointJson': this.secretKey ? aesEncrypt(JSON.stringify(this.checkPosArr), this.secretKey) : JSON.stringify(this.checkPosArr),
'token': this.backToken
}
reqCheck(data).then(res => {
if (res.repCode == '0000') {
this.barAreaColor = '#4cae4c'
this.barAreaBorderColor = '#5cb85c'
this.text = '验证成功'
this.bindingClick = false
if (this.mode == 'pop') {
setTimeout(() => {
this.$parent.clickShow = false
this.refresh()
}, 1500)
}
this.$parent.$emit('success', { captchaVerification })
} else {
this.$parent.$emit('error', this)
this.barAreaColor = '#d9534f'
this.barAreaBorderColor = '#d9534f'
this.text = '验证失败'
setTimeout(() => {
this.refresh()
}, 700)
}
})
}, 400)
}
if (this.num < this.checkNum) {
this.num = this.createPoint(this.getMousePos(this.$refs.canvas, e))
}
},
//
getMousePos: function(obj, e) {
var x = e.offsetX
var y = e.offsetY
return { x, y }
},
//
createPoint: function(pos) {
this.tempPoints.push(Object.assign({}, pos))
return ++this.num
},
refresh: function() {
this.tempPoints.splice(0, this.tempPoints.length)
this.barAreaColor = '#000'
this.barAreaBorderColor = '#ddd'
this.bindingClick = true
this.fontPos.splice(0, this.fontPos.length)
this.checkPosArr.splice(0, this.checkPosArr.length)
this.num = 1
this.getPictrue()
this.text = '验证失败'
this.showRefresh = true
},
//
getPictrue() {
const data = {
captchaType: this.captchaType,
clientUid: localStorage.getItem('point'),
ts: Date.now(), //
}
reqGet(data).then(res => {
if (res.repCode == '0000') {
this.pointBackImgBase = res.repData.originalImageBase64
this.backToken = res.repData.token
this.secretKey = res.repData.secretKey
this.poinTextList = res.repData.wordList
this.text = '请依次点击【' + this.poinTextList.join(',') + '】'
} else {
this.text = res.repMsg
}
//
if (res.repCode == '6201') {
this.pointBackImgBase = null
}
})
},
//
pointTransfrom(pointArr, imgSize) {
var newPointArr = pointArr.map(p => {
const x = Math.round(310 * p.x / parseInt(imgSize.imgWidth))
const y = Math.round(155 * p.y / parseInt(imgSize.imgHeight))
return { x, y }
})
// console.log(newPointArr,"newPointArr");
return newPointArr
}
},
}
</script>

View File

@ -0,0 +1,377 @@
<template>
<div style="position: relative;">
<div
v-if="type === '2'"
class="verify-img-out"
:style="{height: (parseInt(setSize.imgHeight) + vSpace) + 'px'}"
>
<div
class="verify-img-panel"
:style="{width: setSize.imgWidth,
height: setSize.imgHeight,}"
>
<img :src="backImgBase?('data:image/png;base64,'+backImgBase):defaultImg" alt="" style="width:100%;height:100%;display:block">
<div v-show="showRefresh" class="verify-refresh" @click="refresh"><i class="iconfont icon-refresh" />
</div>
<transition name="tips">
<span v-if="tipWords" class="verify-tips" :class="passFlag ?'suc-bg':'err-bg'">{{ tipWords }}</span>
</transition>
</div>
</div>
<!-- 公共部分 -->
<div
class="verify-bar-area"
:style="{width: setSize.imgWidth,
height: barSize.height,
'line-height':barSize.height}"
>
<span class="verify-msg" v-text="text" />
<div
class="verify-left-bar"
:style="{width: (leftBarWidth!==undefined)?leftBarWidth: barSize.height, height: barSize.height, 'border-color': leftBarBorderColor, transaction: transitionWidth}"
>
<span class="verify-msg" v-text="finishText" />
<div
class="verify-move-block"
:style="{width: barSize.height, height: barSize.height, 'background-color': moveBlockBackgroundColor, left: moveBlockLeft, transition: transitionLeft}"
@touchstart="start"
@mousedown="start"
>
<i
:class="['verify-icon iconfont', iconClass]"
:style="{color: iconColor}"
/>
<div
v-if="type === '2'"
class="verify-sub-block"
:style="{'width':Math.floor(parseInt(setSize.imgWidth)*47/310)+ 'px',
'height': setSize.imgHeight,
'top':'-' + (parseInt(setSize.imgHeight) + vSpace) + 'px',
'background-size': setSize.imgWidth + ' ' + setSize.imgHeight,
}"
>
<img :src="'data:image/png;base64,'+blockBackImgBase" alt="" style="width:100%;height:100%;display:block">
</div>
</div>
</div>
</div>
</div>
</template>
<script type="text/babel">
/**
* VerifySlide
* @description 滑块
* */
import { aesEncrypt } from './../utils/ase'
import { resetSize } from './../utils/util'
import { reqGet, reqCheck } from './../api/index'
// "captchaType":"blockPuzzle",
export default {
name: 'VerifySlide',
props: {
captchaType: {
type: String,
},
type: {
type: String,
default: '1'
},
// popfixed
mode: {
type: String,
default: 'fixed'
},
vSpace: {
type: Number,
default: 5
},
explain: {
type: String,
default: '向右滑动完成验证'
},
imgSize: {
type: Object,
default() {
return {
width: '310px',
height: '155px'
}
}
},
blockSize: {
type: Object,
default() {
return {
width: '50px',
height: '50px'
}
}
},
barSize: {
type: Object,
default() {
return {
width: '310px',
height: '40px'
}
}
},
defaultImg: {
type: String,
default: ''
}
},
data() {
return {
secretKey: '', //
passFlag: '', //
backImgBase: '', //
blockBackImgBase: '', //
backToken: '', // token
startMoveTime: '', //
endMovetime: '', //
tipsBackColor: '', //
tipWords: '',
text: '',
finishText: '',
setSize: {
imgHeight: 0,
imgWidth: 0,
barHeight: 0,
barWidth: 0
},
top: 0,
left: 0,
moveBlockLeft: undefined,
leftBarWidth: undefined,
//
moveBlockBackgroundColor: undefined,
leftBarBorderColor: '#ddd',
iconColor: undefined,
iconClass: 'icon-right',
status: false, //
isEnd: false, //
showRefresh: true,
transitionLeft: '',
transitionWidth: ''
}
},
computed: {
barArea() {
return this.$el.querySelector('.verify-bar-area')
},
resetSize() {
return resetSize
}
},
watch: {
// type
type: {
immediate: true,
handler() {
this.init()
}
}
},
mounted() {
//
this.$el.onselectstart = function() {
return false
}
console.log(this.defaultImg)
},
methods: {
init() {
this.text = this.explain
this.getPictrue()
this.$nextTick(() => {
const setSize = this.resetSize(this) //
for (const key in setSize) {
this.$set(this.setSize, key, setSize[key])
}
this.$parent.$emit('ready', this)
})
var _this = this
window.removeEventListener('touchmove', function(e) {
_this.move(e)
})
window.removeEventListener('mousemove', function(e) {
_this.move(e)
})
//
window.removeEventListener('touchend', function() {
_this.end()
})
window.removeEventListener('mouseup', function() {
_this.end()
})
window.addEventListener('touchmove', function(e) {
_this.move(e)
})
window.addEventListener('mousemove', function(e) {
_this.move(e)
})
//
window.addEventListener('touchend', function() {
_this.end()
})
window.addEventListener('mouseup', function() {
_this.end()
})
},
//
start: function(e) {
e = e || window.event
if (!e.touches) { // PC
var x = e.clientX
} else { //
var x = e.touches[0].pageX
}
this.startLeft = Math.floor(x - this.barArea.getBoundingClientRect().left)
this.startMoveTime = +new Date() //
if (this.isEnd == false) {
this.text = ''
this.moveBlockBackgroundColor = '#337ab7'
this.leftBarBorderColor = '#337AB7'
this.iconColor = '#fff'
e.stopPropagation()
this.status = true
}
},
//
move: function(e) {
e = e || window.event
if (this.status && this.isEnd == false) {
if (!e.touches) { // PC
var x = e.clientX
} else { //
var x = e.touches[0].pageX
}
var bar_area_left = this.barArea.getBoundingClientRect().left
var move_block_left = x - bar_area_left // left
if (move_block_left >= this.barArea.offsetWidth - parseInt(parseInt(this.blockSize.width) / 2) - 2) {
move_block_left = this.barArea.offsetWidth - parseInt(parseInt(this.blockSize.width) / 2) - 2
}
if (move_block_left <= 0) {
move_block_left = parseInt(parseInt(this.blockSize.width) / 2)
}
// left
this.moveBlockLeft = (move_block_left - this.startLeft) + 'px'
this.leftBarWidth = (move_block_left - this.startLeft) + 'px'
}
},
//
end: function() {
this.endMovetime = +new Date()
var _this = this
//
if (this.status && this.isEnd == false) {
var moveLeftDistance = parseInt((this.moveBlockLeft || '').replace('px', ''))
moveLeftDistance = moveLeftDistance * 310 / parseInt(this.setSize.imgWidth)
const data = {
captchaType: this.captchaType,
'pointJson': this.secretKey ? aesEncrypt(JSON.stringify({ x: moveLeftDistance, y: 5.0 }), this.secretKey) : JSON.stringify({ x: moveLeftDistance, y: 5.0 }),
'token': this.backToken
}
reqCheck(data).then(res => {
if (res.repCode == '0000') {
this.moveBlockBackgroundColor = '#5cb85c'
this.leftBarBorderColor = '#5cb85c'
this.iconColor = '#fff'
this.iconClass = 'icon-check'
this.showRefresh = false
this.isEnd = true
if (this.mode == 'pop') {
setTimeout(() => {
this.$parent.clickShow = false
this.refresh()
}, 1500)
}
this.passFlag = true
this.tipWords = `${((this.endMovetime - this.startMoveTime) / 1000).toFixed(2)}s验证成功`
var captchaVerification = this.secretKey ? aesEncrypt(this.backToken + '---' + JSON.stringify({ x: moveLeftDistance, y: 5.0 }), this.secretKey) : this.backToken + '---' + JSON.stringify({ x: moveLeftDistance, y: 5.0 })
setTimeout(() => {
this.tipWords = ''
this.$parent.closeBox()
this.$parent.$emit('success', { captchaVerification })
}, 1000)
} else {
this.moveBlockBackgroundColor = '#d9534f'
this.leftBarBorderColor = '#d9534f'
this.iconColor = '#fff'
this.iconClass = 'icon-close'
this.passFlag = false
setTimeout(function() {
_this.refresh()
}, 1000)
this.$parent.$emit('error', this)
this.tipWords = '验证失败'
setTimeout(() => {
this.tipWords = ''
}, 1000)
}
})
this.status = false
}
},
refresh: function() {
this.showRefresh = true
this.finishText = ''
this.transitionLeft = 'left .3s'
this.moveBlockLeft = 0
this.leftBarWidth = undefined
this.transitionWidth = 'width .3s'
this.leftBarBorderColor = '#ddd'
this.moveBlockBackgroundColor = '#fff'
this.iconColor = '#000'
this.iconClass = 'icon-right'
this.isEnd = false
this.getPictrue()
setTimeout(() => {
this.transitionWidth = ''
this.transitionLeft = ''
this.text = this.explain
}, 300)
},
//
getPictrue() {
const data = {
captchaType: this.captchaType,
clientUid: localStorage.getItem('slider'),
ts: Date.now(), //
}
reqGet(data).then(res => {
if (res.repCode == '0000') {
this.backImgBase = res.repData.originalImageBase64
this.blockBackImgBase = res.repData.jigsawImageBase64
this.backToken = res.repData.token
this.secretKey = res.repData.secretKey
} else {
this.tipWords = res.repMsg
}
//
if (res.repCode == '6201') {
this.backImgBase = null
this.blockBackImgBase = null
}
})
},
},
}
</script>

View File

@ -0,0 +1,25 @@
/**
* 此处可直接引用自己项目封装好的 axios 配合后端联调
*/
import request from './../utils/axios' // 组件内部封装的axios
// import request from "@/api/axios.js" //调用项目封装的axios
// 获取验证图片 以及token
export function reqGet(data) {
return request({
url: '/captcha/get',
method: 'post',
data
})
}
// 滑动或者点选验证
export function reqCheck(data) {
return request({
url: '/captcha/check',
method: 'post',
data
})
}

View File

@ -0,0 +1,11 @@
import CryptoJS from 'crypto-js'
/**
* @word 要加密的内容
* @keyWord String 服务器随机返回的关键字
* */
export function aesEncrypt(word, keyWord = 'XwKsGlMcdPMEhR1B') {
var key = CryptoJS.enc.Utf8.parse(keyWord)
var srcs = CryptoJS.enc.Utf8.parse(word)
var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
return encrypted.toString()
}

View File

@ -0,0 +1,30 @@
import axios from 'axios'
axios.defaults.baseURL = process.env.BASE_API
const service = axios.create({
timeout: 40000,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json; charset=UTF-8'
},
})
service.interceptors.request.use(
config => {
return config
},
error => {
Promise.reject(error)
}
)
// response interceptor
service.interceptors.response.use(
response => {
const res = response.data
return res
},
error => {
}
)
export default service

View File

@ -0,0 +1,36 @@
export function resetSize(vm) {
var img_width, img_height, bar_width, bar_height // 图片的宽度、高度,移动条的宽度、高度
var parentWidth = vm.$el.parentNode.offsetWidth || window.offsetWidth
var parentHeight = vm.$el.parentNode.offsetHeight || window.offsetHeight
if (vm.imgSize.width.indexOf('%') != -1) {
img_width = parseInt(this.imgSize.width) / 100 * parentWidth + 'px'
} else {
img_width = this.imgSize.width
}
if (vm.imgSize.height.indexOf('%') != -1) {
img_height = parseInt(this.imgSize.height) / 100 * parentHeight + 'px'
} else {
img_height = this.imgSize.height
}
if (vm.barSize.width.indexOf('%') != -1) {
bar_width = parseInt(this.barSize.width) / 100 * parentWidth + 'px'
} else {
bar_width = this.barSize.width
}
if (vm.barSize.height.indexOf('%') != -1) {
bar_height = parseInt(this.barSize.height) / 100 * parentHeight + 'px'
} else {
bar_height = this.barSize.height
}
return { imgWidth: img_width, imgHeight: img_height, barWidth: bar_width, barHeight: bar_height }
}
export const _code_chars = [1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
export const _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0']
export const _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66', '#FF33CC']

View File

@ -0,0 +1,26 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
import './assets/style/common.css'
import './assets/style/group.css'
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
Vue.use(mavonEditor)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})

View File

@ -0,0 +1,47 @@
import Vue from 'vue'
import Router from 'vue-router'
// import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'login-1',
component: () => import('./../views/Login.vue')
},
{
path: '/useOnline',
name: 'useOnline',
component: () => import('./../views/useOnline/UseOnline.vue'),
redirect: '/useOnline/sliderFixed',
children: [
{ path: 'sliderPop', name: 'sliderPop', component: () => import('./../views/useOnline/SliderPop.vue') },
{ path: 'sliderFixed', name: 'sliderFixed', component: () => import('./../views/useOnline/SliderFixed.vue') },
{ path: 'pointPop', name: 'pointPop', component: () => import('./../views/useOnline/PointPop.vue') },
{ path: 'pointFixed', name: 'pointFixed', component: () => import('./../views/useOnline/PointFixed.vue') },
]
},
{
path: '/doc',
name: 'doc',
component: () => import('./../views/doc/doc.vue')
},
{
path: '/apply',
name: 'apply',
component: () => import('./../views/apply/index.vue')
},
{
path: '/login',
name: 'login-2',
component: () => import('./../views/Login.vue')
},
{
path: '*',
name: 'login-3',
component: () => import('./../views/Login.vue')
}
]
})

View File

@ -0,0 +1,12 @@
import CryptoJS from 'crypto-js'
export function aesEncrypt(word) {
var key = CryptoJS.enc.Utf8.parse('XwKsGlMcdPMEhR1B')
var srcs = CryptoJS.enc.Utf8.parse(word)
var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
return encrypted.toString()
}
export function aesDecrypt(word) {
var key = CryptoJS.enc.Utf8.parse('XwKsGlMcdPMEhR1B')
var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 })
return CryptoJS.enc.Utf8.stringify(decrypt).toString()
}

View File

@ -0,0 +1,11 @@
import axios from '@/api/axios'
export const readFile = (filePath) => {
return new Promise((resolve, reject) => {
axios.get(filePath).then(res => {
resolve(res)
}).catch((err) => {
reject(err)
})
})
}

View File

@ -0,0 +1,21 @@
export function setItem(k, v) {
if (typeof (v) == 'undefined' || v == null) {
return
}
var val = v
if (typeof (v) == 'object') {
val = JSON.stringify(v)
}
sessionStorage.setItem(k, val)
}
export function getItem(k) {
var val = sessionStorage.getItem(k)
try {
// 如果是number boolean jsonstring是不会报错的
return JSON.parse(val)
} catch (e) {
return val
}
}

View File

@ -0,0 +1,407 @@
<template>
<div class="login-bg">
<div class="login-bg_pattern">
<div class="login-bg_left-top-circle" />
<div class="login-bg_left100-top-circle" />
<div class="login-bg_right-top-circle" />
<div class="login-bg_right-bottom-circle" />
<div class="login-bg_left-bottom-circle" />
</div>
<Verify
ref="verify"
:captcha-type="'blockPuzzle'"
:img-size="{width:'400px',height:'200px'}"
@success="login"
/>
<div class="login-login_wrap">
<div class="login-login_box">
<el-row type="flex" justify="center">
<el-col :xs="22" :sm="20" :md="20" :lg="20" :xl="14">
<div class="grid-content">
<!--登录-->
<div class="key">
<div class="bottom-img" />
<div class="form-info mt14vh pb50" style="margin-left:5vw">
<el-row :gutter="20">
<el-col :xs="22" :sm="14" :md="10" :lg="8" :xl="7">
<div class="logo"><img src="./../../static/logo.png" alt=""></div>
<form onsubmit="return false">
<ul class="user-info mt60">
<li class="user-input">
<input id="usernameIput" v-model.trim="loginName" class="effect" placeholder="请输入用户名" type="text" required autocomplete="username">
<label>用户名</label>
</li>
<li class="user-input">
<input id="passwordIput" v-model.trim="loginPassword" class="effect" placeholder="请输入密码" type="password" required autocomplete="current-password">
<label>密码</label>
</li>
<li class="keep-password">
<label>
测试账号: admin &nbsp; &nbsp; 密码: 123456
</label>
</li>
<li class="keep-password">
<label>
<a href="https://gitee.com/anji-plus/captcha/" target="_blank" style="color:#222"><img src="https://gitee.com/static/images/logo-en.svg" style="vertical-align:middle;margin-right:5px" width="24px"> gitee</a>
</label>
<label class="ml20">
<a href="https://gitee.com/anji-plus/captcha/stargazers" target="_blank"><img src="https://gitee.com/anji-plus/captcha/badge/star.svg?theme=gvp" style="vertical-align:middle;" alt="star"></a>
</label>
</li>
<li class="keep-password">
<label>
<a href="https://github.com/anji-plus/captcha" target="_blank" style="color:#222">
<img
src="https://github.githubassets.com/favicons/favicon.png"
style="vertical-align:middle;margin-right:5px"
width="24px"
> github</a>
</label>
<label class="ml20">
<a href="https://github.com/anji-plus/captcha/stargazers" target="_blank">
<img
src="https://img.shields.io/github/stars/anji-plus/captcha?style=social"
style="vertical-align:middle;"
alt="star"
></a>
</label>
</li>
<li class="mt50">
<el-button class="buttonSize button-solid goHome" type="primary" @click="checkPrama">
&nbsp;&nbsp;</el-button>
</li>
</ul>
</form>
</el-col>
</el-row>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</div>
</div>
</template>
<script>
import { reqLogin, getMenu, queryForCodeSelect } from '@/api/basic'
import { aesEncrypt, aesDecrypt } from '@/utils/aes'
import { setItem, getItem } from '@/utils/storage'
import Verify from './../components/verifition/Verify'
export default {
components: {
Verify
},
data() {
return {
loginName: 'admin',
loginPassword: '123456',
menu: [],
checked: true,
dialogFormVisible: false
}
},
beforeDestroy() {
document.removeEventListener('keyup', this.handerKeyup)
},
created() {
document.addEventListener('keyup', this.handerKeyup)
},
methods: {
handerKeyup(e) {
var keycode = document.all ? event.keyCode : e.which
if (keycode == 13) {
this.checkPrama()
}
},
goRegister() {
this.$router.push('/register')
},
checkPrama() {
if (!this.loginName || !this.loginPassword) {
this.$message({
message: '请输入完整的用户名密码',
type: 'error'
})
return false
}
this.$refs.verify.show()
},
login(params) {
if (this.loginName == 'admin' && this.loginPassword == '123456') {
this.$router.push('/useOnline/sliderFixed')
} else {
this.$message({
message: '输入测试账号密码',
type: 'warning'
})
}
},
},
}
</script>
<style scoped lang="less">
@import "./../assets/style/theme";
@wathet-blue: #f0f7ff;
@wathet-blue: #f0f7ff;
@color91: #919191;
@coloreE0: #e0e0e0;
@colore666: #666;
:focus {
outline: none;
}
.login-bg {
background: @wathet-blue;
width: 100vw;
height: 100vh;
position: relative;
overflow: hidden;
}
.login-bg_pattern {
position: absolute;
z-index: 1;
width: 100vw;
height: 100vh;
.login-bg_left-top-circle,
.login-bg_left100-top-circle,
.login-bg_right-top-circle,
.login-bg_right-bottom-circle,
.login-bg_left-bottom-circle {
opacity: 0.45;
background: #e1eeff;
border-radius: 74px;
display: block;
float: left;
position: relative;
}
.login-bg_left-top-circle {
width: 300px;
height: 300px;
transform: rotate(30deg);
margin-top: -150px;
margin-left: 70px;
}
.login-bg_left100-top-circle {
width: 200px;
height: 200px;
transform: rotate(30deg);
margin-top: -150px;
margin-left: 200px;
}
.login-bg_right-top-circle {
width: 300px;
height: 400px;
margin-right: -100px;
transform: rotate(42deg);
float: right;
}
.login-bg_right-bottom-circle {
width: 300px;
height: 300px;
transform: rotate(30deg);
bottom: -200px;
right: 350px;
position: absolute;
}
.login-bg_left-bottom-circle {
width: 300px;
height: 300px;
transform: rotate(-11deg);
bottom: -50px;
left: -100px;
position: absolute;
}
}
.login-login_box {
position: absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%);
z-index: 1000;
width: 100%;
/*overflow: auto;*/
.key {
box-sizing: border-box;
background: @white url("/static/login/bg-1.png") right top no-repeat;
box-shadow: 0 0 60px 5px rgba(36, 132, 255, 0.41);
border-radius: 8px;
overflow: hidden;
opacity: 0;
-webkit-animation: fromBack 0.3s linear 0.1s forwards;
-moz-animation: fromBack 0.3s linear 0.1s forwards;
-ms-animation: fromBack 0.3s linear 0.1s forwards;
animation: fromBack 0.3s linear 0.1s forwards;
/* -webkit- */
@-webkit-keyframes fromBack {
0% {
-webkit-transform: scale(0);
opacity: 0;
}
100% {
-webkit-transform: scale(1);
opacity: 1;
min-height: 69vh;
max-height: 90vh;
}
}
/* -moz- */
@-moz-keyframes fromBack {
0% {
-moz-transform: scale(0);
opacity: 0;
}
100% {
-moz-transform: scale(1);
opacity: 1;
height: 69vh;
min-height: 69vh;
max-height: 90vh;
}
}
/**/
@keyframes fromBack {
0% {
transform: scale(0);
opacity: 0;
}
100% {
transform: scale(1);
opacity: 1;
min-height: 69vh;
max-height: 90vh;
}
}
.bottom-img {
width: 170px;
height: 170px;
display: block;
position: absolute;
z-index: 2;
bottom: 0;
background: url("/static/login/bg-2.png") left bottom no-repeat;
}
.form-info {
.logo img{
width: 200px;
height: 89px;
display: block;
margin: 0 auto;
}
.user-info {
padding-left: @px30;
.user-input {
position: relative;
border-bottom: 1px solid @coloreE0;
padding: 0 20px 0 30px;
margin-top: 37px;
height: 30px;
background: #fff;
.effect ~ label {
position: relative;
top: -45px;
width: 100%;
color: @color91;
transition: 0.3s;
-webkit-transition: 0.1s;
font-size: @f12;
letter-spacing: 0.5px;
}
.effect:focus ~ label {
position: relative;
top: -45px;
color: @lightblue;
transition: 0.3s;
border-left: 3px solid @lightblue;
margin-left: -30px;
padding-left: 30px;
}
input {
position: relative;
width: 100%;
font-size: 13px;
}
}
.keep-password {
font-size: @f13;
letter-spacing: 0;
margin-top: @px24;
label {
.el-checkbox__input.is-checked + .el-checkbox__label {
color: @color91;
}
}
}
.goHome {
background: @lightblue;
box-shadow: 0 12px 51px -12px @azure;
border-radius: 100px;
width: 140px;
height: 40px;
display: block;
margin: @px24 auto;
font-size: @f18;
text-align: center;
line-height: 17px;
}
.register {
font-size: 13px;
color: #919191;
text-align: center;
.a {
color: @lightblue;
cursor: pointer;
}
.a:hover {
text-decoration: underline;
}
}
.forget {
font-size: @f13;
color: @lightblue;
letter-spacing: 0;
text-align: right;
border: none;
padding: 0;
text-decoration: underline;
background: none;
margin-top: 2px;
}
}
}
}
}
/*注册*/
.transition-box {
position: relative;
margin-top: 0;
z-index: 1000;
background-color: @white;
}
.qrcode {
line-height: 40px;
text-align: center;
border-bottom: 1px solid #eee;
}
#qrcode {
width: 120px;
padding: 20px;
margin: 40px auto;
display: block;
}
input:-webkit-autofill,
textarea:-webkit-autofill,
select:-webkit-autofill {
-webkit-box-shadow: 0 0 0 1000px white inset;
}
</style>

View File

@ -0,0 +1,280 @@
<template>
<div>
<el-container style="width: 100%;height: 100%;">
<el-header style="height: auto; padding: 0;">
<myHeader />
</el-header>
</el-container>
<el-main>
<div class="search-pop clearfix">
<el-row>
<el-col
:xs="24"
:sm="24"
:md="24"
:lg="24"
:xl="24"
>
<div class="grid-content">
<el-row
type="flex"
justify="center"
>
<el-col
:xs="24"
:sm="24"
:md="24"
:lg="24"
:xl="24"
>
<div class="grid-content pd-main pt20 pb20">
<el-row class="row-bg">
<el-col
:xs="24"
:sm="24"
:md="24"
:lg="24"
:xl="24"
>
<div class="grid-content">
<div class="right-box">
<div class="log-list">
<div class="title">
<h2>WHO IS<span> USING </span> US</h2>
<h4>谁在使用</h4>
</div>
<el-button
type="primary"
round
class="push-logo"
@click="addLogo"
>我要提交</el-button>
<div class="apply-logo">
<el-row>
<el-col
:span="22"
:offset="1"
>
<li><img
src="../../../static/9.png"
width="100%"
></li>
<li><img
src="../../../static/7.png"
width="100%"
></li>
<li><img
src="../../../static/3.png"
width="100%"
></li>
<li><img
src="../../../static/11.png"
width="100%"
></li>
<li><img
src="../../../static/12.png"
width="100%"
></li>
<li><img
src="../../../static/5.png"
width="100%"
></li>
<li><img
src="../../../static/1.png"
width="100%"
></li>
<li><img
src="../../../static/2.png"
width="100%"
></li>
<li><img
src="../../../static/4.png"
width="100%"
></li>
<li>安吉智行TMS</li>
<li><img
src="../../../static/10.png"
width="100%"
></li>
<li>上汽红岩VLS</li>
<li><img
src="../../../static/8.png"
width="100%"
></li>
<li><img
src="../../../static/6.png"
width="100%"
></li>
<li style="background:rgb(121 143 222)">智行库位专家</li>
<li><img
src="../../../static/13.png"
width="100%"
></li>
<li><img
src="../../../static/15.png"
width="100%"
></li>
<li><img
src="../../../static/14.png"
width="100%"
></li>
<li><img
src="../../../static/16.png"
width="100%"
></li>
</el-col>
</el-row>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</el-main>
</div>
</template>
<script>
import myHeader from './../layout/Header'
import MenuItem from './../layout/UseMenuItem'
export default {
name: 'UserOnline',
components: {
myHeader,
MenuItem
},
data() {
return {
}
},
methods: {
addLogo() {
const html = '<div>我们希望您能提供的信息</div>' +
'<div>您所在公司、学校或组织和首页公司logo</div>' +
'<div>您的联系方式: 微博、邮箱、微信 (至少一个)</div>' +
'<div>您将AJ-Captcha用于哪些业务场景</div>' +
'<div>有何改进优化建议</div>' +
'<div>将以上信息发送到MS@anji-plus.com</div>' +
'<a href="https://gitee.com/anji-plus/captcha/issues/I2ACRL" style="color:#03afff" target="_blank">了解更多</a>'
this.$alert(html, '我要提交', {
dangerouslyUseHTMLString: true,
confirmButtonText: '确定',
callback: action => {
window.open('mailto:MS@anji-plus.com&Subject=我要提交宣传栏&Body=' + html)
}
})
}
},
}
</script>
<style scoped lang="less">
@import "./../../assets/style/theme";
.nav-menu {
width: 100%;
background: #203160;
position: fixed;
z-index: 10000;
top: 0;
.logo {
margin-top: 14px;
width: 85px;
}
}
.userBox {
line-height: 64px;
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
cursor: pointer;
.goOut {
padding: 10px 18px;
&:hover {
color: #03afff;
}
}
}
.el-button {
font-size: 12px;
}
.right-box {
padding: 20px;
overflow-x: hidden;
}
.right-box {
background: #ffffff;
border: 1px solid rgba(151, 151, 151, 0.07);
box-shadow: 0 0 10px 0 rgba(122, 177, 249, 0.4);
border-radius: 6px;
}
.log-list {
min-height: calc(100vh - 225px);
min-height: -moz-calc(100vh - 225px);
min-height: -webkit-calc(100vh - 225px);
min-height: calc(100vh - 225px);
max-height: calc(100vh - 225px);
max-height: -moz-calc(100vh - 225px);
max-height: -webkit-calc(100vh - 225px);
max-height: calc(100vh - 225px);
overflow-y: auto;
overflow-x: hidden;
}
.title {
text-align: center;
h2 {
font-size: 32px;
line-height: 50px;
font-weight: bold;
span {
color: #03afff;
font-weight: bold;
}
}
h4 {
font-size: 24px;
line-height: 52px;
}
border-bottom: 60px solid #edf4f7;
}
.apply-logo {
width: 100%;
display: block;
margin-top: 20px;
li {
width: 15.4vw;
height: 100px;
float: left;
display: block;
border: 1px solid #efefef;
margin-bottom: 10px;
overflow: hidden;
font-size: 28px;
text-align: center;
line-height: 100px;
margin-right: 10px;
img {
height: 100%;
}
}
}
.push-logo {
float: right;
margin-top: -1px;
display: block;
margin-top: -45px;
margin-right: 10px;
}
</style>

View File

@ -0,0 +1,45 @@
<template>
<div>
<el-container style="width: 100%;height: 100%;">
<el-header style="height: auto; padding: 0;">
<myHeader />
</el-header>
</el-container>
<el-main>
<iframe
id="mainContent"
style="position:absolute;width:99%;height:80vh;top:64px"
src="https://captcha.anji-plus.com/captcha-doc/"
/>
</el-main>
</div>
</template>
<script>
import myHeader from './../layout/Header'
import MenuItem from './../layout/UseMenuItem'
export default {
name: 'Doc',
components: {
myHeader
},
data() {
return {
}
},
mounted() {
},
methods: {
},
}
</script>
<style scoped lang="less">
</style>

View File

@ -0,0 +1,204 @@
<template>
<div class="nav-menu">
<el-menu :default-active="onRoutes" :default-openeds="[$route.path]" class="el-menu-demo" mode="horizontal" background-color="#203160" text-color="rgba(255,255,255,0.4)" active-text-color="#7AB1F9" router @select="handleSelect">
<el-row type="flex" justify="center">
<el-col :xs="22" :sm="22" :md="22" :lg="22" :xl="23">
<div class="grid-content pd-main">
<div class="userBox fr" @click="dropOut">
<!-- {{getAccessUser.userName}} -->
<el-button class="goOut"><i class="icon iconfont icon-zhuxiao" />退出</el-button>
</div>
<a @click="goHome"><img class="logo" src="./../../assets/image/logo2.png" alt=""></a>
<div class="nav-md fr">
<el-menu-item v-for="(item,i) in navList" :key="i" :index="item.name" class="fr">{{ item.navItem }}</el-menu-item>
</div>
</div>
</el-col>
</el-row>
</el-menu>
</div>
</template>
<!--
-->
<script>
import { setItem, getItem } from '@/utils/storage'
export default {
data() {
return {
activeIndex: '1',
userManageCode: [],
navList: [
{ name: '/apply', navItem: '谁在使用', manage: 'applyManage' },
{ name: '/doc', navItem: '在线文档', manage: 'docManage' },
{ name: '/useOnline', navItem: '在线体验', manage: 'chartManage' },
]
}
},
computed: {
getAccessUser() {
return getItem('accessUser')
},
onRoutes() {
if (this.$route.path.includes('/helpCenter')) {
return '/helpCenter'
} else if (this.$route.path.includes('/useOnline')) {
return '/useOnline'
} else {
return this.$route.path
}
},
},
mounted() {
},
methods: {
dropOut() {
var self = this
this.$confirm('您确定要退出吗?', '退出平台', {
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.$router.push('/login')
// const info = {
// userName: this.getAccessUser.userName
// }
// LogOut(info).then(res => {
// if (res.repCode == "0000") {
// sessionStorage.clear()
// localStorage.clear();
// this.$router.push("/login");
// }
// }).catch(error => {
// })
}).catch(() => {
})
},
handleSelect(key, keyPath) {
},
// go home
goHome() {
this.$router.push('/index')
}
}
}
</script>
<style lang="less" scoped>
.el-dropdown-link{
color:rgba(255, 255, 255, 0.4);
font-size: 12px;
}
.nav-menu {
width: 100%;
background: #203160;
position: fixed;
z-index: 10000;
.logo {
margin-top: 14px;
width: 85px;
}
.nav-md {
display: block;
margin-right: 80px;
}
.nav-mini {
display: none;
}
}
.el-menu-item {
padding: 0;
margin: 0 15px;
font-size: 15px;
line-height: 70px;
}
.el-menu-item.is-active {
animation: 2s infinite;
border-top: 6px solid #7ab1f9;
font-size: 15px;
color: #7ab1f9;
font-weight: bold;
line-height: 59px;
}
.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,
.el-menu--horizontal .el-menu-item:not(.is-disabled):hover {
border-top: 6px solid #7ab1f9;
color: #7ab1f9;
background: none !important;
line-height: 59px;
}
.el-menu-item:last-child {
margin-right: 15px !important;
}
.el-menu-item:first-child {
margin-left: 15px !important;
}
.userBox {
line-height: 64px;
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
cursor: pointer;
.headerP {
width: 20px;
height: 20px;
display: block;
border-radius: 100%;
border: 1px solid #03afff;
margin-top: 20px;
margin-right: 10px;
float: left;
}
.goOut {
padding: 0;
background: none;
border: 0;
color: rgba(255, 255, 255, 1);
margin-left: 5px;
.iconfont {
font-size: 14px;
}
&:hover {
color: #03afff;
}
}
}
@media screen and(max-width: 900px) {
.nav-menu {
.nav-md {
display: none;
}
.nav-mini {
display: block;
span {
margin-right: -30px;
color: #fff;
line-height: 62px;
float: right;
position: relative;
font-size: 36px;
width: 100px;
text-align: center;
}
.menu {
display: none;
width: 100px;
position: absolute;
z-index: 1000;
background: #203160;
padding: 10px;
right: 190px;
top: 50px;
}
}
.nav-mini:hover {
.menu {
display: block;
}
}
}
}
</style>

View File

@ -0,0 +1,113 @@
<template>
<div class="left-manu">
<el-row class="tac">
<el-col :span="24">
<el-menu
:default-active="activeNav"
class="el-menu-vertical-demo"
router
@select="handleSelect2"
>
<!-- <el-menu-item index="/helpCenter/desc">
<span slot="title">功能概述</span>
</el-menu-item> -->
<el-submenu index="/helpCenter/question">
<template slot="title">
<span>开发文档</span>
</template>
<el-menu-item-group>
<el-menu-item v-for="item in sliderArr" :key="item.id" :index="`/helpCenter/admin/${item.id}`">{{ item.title }}</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-menu-item index="/helpCenter/question">
<span slot="title">常见问题</span>
</el-menu-item>
</el-menu>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: 'MenuItem',
data() {
return {
sliderArr: [
{ id: 1, title: '接入流程' },
{ id: 2, title: '后端接入' },
{ id: 3, title: 'html接入' },
{ id: 4, title: 'vue接入' },
{ id: 5, title: 'flutter接入' },
{ id: 6, title: 'uni-app接入' },
{ id: 7, title: 'weex接入' },
{ id: 8, title: 'ReactNative接入' },
{ id: 9, title: 'android接入' },
{ id: 10, title: 'ios接入' },
]
}
},
computed: {
activeNav() {
return this.$route.path
}
},
mounted() {
// this.activeNav=window.location.href.lastIndexOf("\\");
// console.log(this.activeNav)
},
methods: {
handleSelect2(key, keyPath) {
// this.activeNav=key
},
}
}
</script>
<style scoped lang="less">
.sidebar-container {
transition: width 0.28s;
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
}
.el-scrollbar {
height: 100%;
}
.scrollbar-wrapper {
overflow-x: hidden!important;
.el-scrollbar__view {
height: 100%;
}
}
.el-scrollbar__bar.is-vertical{
right: 0px;
}
.is-horizontal {
display: none;
}
a {
display: inline-block;
width: 100%;
overflow: hidden;
}
.el-menu {
border: none;
height: 100%;
width: 100% !important;
}
.is-active > .el-submenu__title{
color: #f4f4f5!important;
}
}
.el-menu {
border-right: none;
a {
text-decoration: none;
}
}
// div:hover,ul:hover,li:hover,span:hover,ul li:hover,ul li ul:hover{
// background: none!important;
// color: #333!important;
// }
</style>

View File

@ -0,0 +1,111 @@
<template>
<div class="left-manu">
<el-row class="tac">
<el-col :span="24">
<el-menu
:default-active="activeNav"
class="el-menu-vertical-demo"
router
@select="handleSelect2"
>
<el-submenu index="/useOnline">
<template slot="title">
<span>滑动验证</span>
</template>
<el-menu-item-group>
<el-menu-item index="/useOnline/sliderFixed">嵌入式</el-menu-item>
<el-menu-item index="/useOnline/sliderPop">弹出式</el-menu-item>
</el-menu-item-group>
</el-submenu>
<el-submenu index="/useOnline">
<template slot="title">
<span>点选验证</span>
</template>
<el-menu-item-group>
<el-menu-item index="/useOnline/pointFixed">嵌入式</el-menu-item>
<el-menu-item index="/useOnline/pointPop">弹出式</el-menu-item>
</el-menu-item-group>
</el-submenu>
</el-menu>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: 'MenuItem',
data() {
return {
// activeNav:'/projectDetails'
}
},
computed: {
activeNav() {
return this.$route.path
}
},
mounted() {
// this.activeNav=window.location.href.lastIndexOf("\\");
// console.log(this.activeNav)
},
methods: {
handleSelect2(key, keyPath) {
// this.activeNav=key
},
}
}
</script>
<style scoped lang="less">
.sidebar-container {
transition: width 0.28s;
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
}
.el-scrollbar {
height: 100%;
}
.scrollbar-wrapper {
overflow-x: hidden!important;
.el-scrollbar__view {
height: 100%;
}
}
.el-scrollbar__bar.is-vertical{
right: 0px;
}
.is-horizontal {
display: none;
}
a {
display: inline-block;
width: 100%;
overflow: hidden;
}
.el-menu {
border: none;
height: 100%;
width: 100% !important;
}
.is-active > .el-submenu__title{
color: #f4f4f5!important;
}
}
.el-submenu__title .el-icon-arrow-down{
line-height: 13px!important;
}
.el-menu {
border-right: none;
a {
text-decoration: none;
}
}
// div:hover,ul:hover,li:hover,span:hover,ul li:hover,ul li ul:hover{
// background: none!important;
// color: #333!important;
// }
</style>

View File

@ -0,0 +1,181 @@
<template>
<div class="pointFixed">
<h1 class="title">点选嵌入式point-embed</h1>
<p class="desc">
验证区域直接完整嵌入网页清晰直观便于用户使用和广告宣传
</p>
<el-row class="demo">
<el-col :xs="24" :sm="24" :md="13" :lg="13" :xl="13" class="demo-result">
<h2 class="result-title">示例</h2>
<form class="result_form">
<input
class="result_input"
type="text"
value="用户名"
disabled="disabled"
>
<input
class="result_input"
type="password"
value="123456"
disabled="disabled"
>
<!-- @success="login" -->
<Verify
:mode="'fixed'"
:captcha-type="'clickWord'"
:captcha-id="'936c8254-abf6-446e-ba34-0b02ed15f6e2'"
:container-id="'#pointFixed_btn'"
:img-size="{ width: '330px', height: '155px' }"
/>
<!-- 组件 -->
<button id="pointFixed_btn" class="result_btn">登录</button>
</form>
</el-col>
<el-col :xs="24" :sm="24" :md="11" :lg="11" :xl="11" class="demo-code">
<div class="code-header clearfix">
<h2 class="code-title">代码 :</h2>
<!-- <button class="code_copy">复制</button> -->
</div>
<div class="code-container">
<pre>
<i>&lt;</i>template<i>></i>
<i>&lt;</i>Verify
@success<i>=</i>"'success'" //
:mode<i>=</i>"'fixed'" //
:captchaType="'clickWord'" //
:imgSize<i>=</i>"{ width: '330px', height: '155px' }" //
<i>></i><i>&lt;</i>/Verify
<i>&lt;</i>/template<i>></i>
<i>&lt;</i>script<i>></i>
//
import Verify from "./../../components/verifition/Verify";
export default {
name: 'app',
components<i>:</i> {
Verify
}
methods:{
success(params){
// params
}
}
}
<i>&lt;</i>/script<i>></i>
</pre>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import Verify from './../../components/verifition/Verify'
export default {
name: 'SliderFixed',
components: {
Verify
}
}
</script>
<style scoped lang="less">
.pointFixed {
.title {
font-size: 28px;
color: #222;
line-height: 40px;
}
.desc {
font-size: 14px;
line-height: 24px;
color: #777;
padding-top: 8px;
}
.demo {
box-sizing: border-box;
border: 1px solid #e4e7ef;
width: 99%;
// height: 530px;
margin-top: 24px;
padding-bottom: 20px;
.demo-result,
.demo-code {
box-sizing: border-box;
padding: 24px;
float: left;
height: 100%;
}
.demo-result {
.result-title {
font-size: 18px;
line-height: 24px;
color: #222;
}
.result_form {
width: 60%;
margin: 72px auto 0;
}
.result_input {
width: 100%;
border: 1px solid #e4e7ef;
height: 40px;
line-height: 38px;
padding-left: 16px;
box-sizing: border-box;
margin-bottom: 16px;
font-size: 18px;
color: #abaeb2;
background-color: transparent;
}
.result_btn {
border: 0;
outline: 0;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 18px;
color: #fff;
background: #cdd2df;
cursor: not-allowed;
margin-top: 15px;
}
}
.demo-code {
background: #f7f9fa;
position: relative;
.code-title {
float: left;
font-size: 18px;
line-height: 24px;
color: #222;
}
.code_copy {
float: right;
width: 68px;
height: 24px;
line-height: 24px;
border-radius: 12px;
background: #6f7482;
color: #fff;
font-size: 12px;
outline: none;
border: none;
cursor: pointer;
}
.code-container{
padding-top: 20px;
display: block;
overflow: auto;
color: #4d4d4c;
padding: 0.5em;
line-height: 1.5;
}
}
}
}
</style>

View File

@ -0,0 +1,184 @@
<template>
<div class="sliderFixed">
<h1 class="title">点选弹出式point-popup</h1>
<p class="desc">
点击自有验证按钮弹出验证码与自有业务样式完美融合
</p>
<el-row class="demo">
<el-col :xs="24" :sm="24" :md="13" :lg="13" :xl="13" class="demo-result">
<h2 class="result-title">示例</h2>
<form class="result_form">
<input
class="result_input"
type="text"
value="用户名"
disabled="disabled"
>
<input
class="result_input"
type="password"
value="123456"
disabled="disabled"
>
<!-- @success="login" -->
<Verify
ref="verify"
:mode="'pop'"
:captcha-type="'clickWord'"
:img-size="{ width: '330px', height: '155px' }"
/>
<!-- 组件 -->
<button class="result_btn" @click.prevent="$refs.verify.show()">登录</button>
</form>
</el-col>
<el-col :xs="24" :sm="24" :md="11" :lg="11" :xl="11" class="demo-code">
<div class="code-header clearfix">
<h2 class="code-title">代码 :</h2>
<!-- <button class="code_copy">复制</button> -->
</div>
<div class="code-container">
<i>&lt;</i>template<i>></i>
<pre> <i>&lt;</i>Verify
@success<i>=</i>"success" //
:mode<i>=</i>"'pop'" //
:captchaType="'clickWord'" // //调用的类型 点选或者滑动
:imgSize<i>=</i>"{ width: '330px', height: '155px' }" //
ref<i>=</i>"verify"
<i>></i><i>&lt;</i>/Verify
<i>&lt;</i>/template<i>></i>
<i>&lt;</i>script<i>></i>
//
import Verify from "./../../components/verifition/Verify";
export default {
name: 'app',
methods: {
success(params){
// params
},
showVerify(){
//mode="pop",show
this.$refs.verify.show();
}
},
components<i>:</i> {
Verify
}
}
<i>&lt;</i>/script<i>></i>
</pre>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import Verify from './../../components/verifition/Verify'
export default {
name: 'SliderFixed',
components: {
Verify
}
}
</script>
<style scoped lang="less">
.sliderFixed {
.title {
font-size: 28px;
color: #222;
line-height: 40px;
}
.desc {
font-size: 14px;
line-height: 24px;
color: #777;
padding-top: 8px;
}
.demo {
box-sizing: border-box;
border: 1px solid #e4e7ef;
width: 99%;
// height: 530px;
margin-top: 24px;
padding-bottom: 20px;
.demo-result,
.demo-code {
box-sizing: border-box;
padding: 24px;
float: left;
height: 100%;
}
.demo-result {
.result-title {
font-size: 18px;
line-height: 24px;
color: #222;
}
.result_form {
width: 60%;
margin: 72px auto 0;
}
.result_input {
width: 100%;
border: 1px solid #e4e7ef;
height: 40px;
line-height: 38px;
padding-left: 16px;
box-sizing: border-box;
margin-bottom: 16px;
font-size: 18px;
color: #abaeb2;
background-color: transparent;
}
.result_btn {
border: 0;
outline: 0;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 18px;
color: #fff;
background: #0a4bee;
cursor: pointer;
margin-top: 15px;
}
}
.demo-code {
background: #f7f9fa;
position: relative;
.code-title {
float: left;
font-size: 18px;
line-height: 24px;
color: #222;
}
.code_copy {
float: right;
width: 68px;
height: 24px;
line-height: 24px;
border-radius: 12px;
background: #6f7482;
color: #fff;
font-size: 12px;
outline: none;
border: none;
cursor: pointer;
}
.code-container{
padding-top: 20px;
display: block;
overflow: auto;
color: #4d4d4c;
padding: 0.5em;
line-height: 1.5;
}
}
}
}
</style>

View File

@ -0,0 +1,181 @@
<template>
<div class="sliderFixed">
<h1 class="title">滑动嵌入式slider-embed</h1>
<p class="desc">
验证区域直接完整嵌入网页清晰直观便于用户使用和广告宣传
</p>
<el-row class="demo">
<el-col :xs="24" :sm="24" :md="13" :lg="13" :xl="13" class="demo-result">
<h2 class="result-title">示例</h2>
<form class="result_form">
<input
class="result_input"
type="text"
value="用户名"
disabled="disabled"
>
<input
class="result_input"
type="password"
value="123456"
disabled="disabled"
>
<!-- @success="login" -->
<Verify
:mode="'fixed'"
:captcha-type="'blockPuzzle'"
:captcha-id="'9ca07a9c-c260-50ae-2c13-89cde2f34cb9'"
:container-id="'#sliderFixed_btn'"
:img-size="{ width: '330px', height: '155px' }"
/>
<!-- 组件 -->
<button id="sliderFixed_btn" class="result_btn">登录</button>
</form>
</el-col>
<el-col :xs="24" :sm="24" :md="11" :lg="11" :xl="11" class="demo-code">
<div class="code-header clearfix">
<h2 class="code-title">代码 :</h2>
<!-- <button class="code_copy">复制</button> -->
</div>
<div class="code-container">
<pre>
<i>&lt;</i>template<i>></i>
<i>&lt;</i>Verify
@success<i>=</i>"'success'" //
:mode<i>=</i>"'fixed'" //
:captchaType="'blockPuzzle'" //
:imgSize<i>=</i>"{ width: '330px', height: '155px' }" //
<i>></i><i>&lt;</i>/Verify
<i>&lt;</i>/template<i>></i>
<i>&lt;</i>script<i>></i>
//
import Verify from "./../../components/verifition/Verify";
export default {
name: 'app',
components<i>:</i> {
Verify
}
methods:{
success(params){
// params
}
}
}
<i>&lt;</i>/script<i>></i>
</pre>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import Verify from './../../components/verifition/Verify'
export default {
name: 'SliderFixed',
components: {
Verify
}
}
</script>
<style scoped lang="less">
.sliderFixed {
.title {
font-size: 28px;
color: #222;
line-height: 40px;
}
.desc {
font-size: 14px;
line-height: 24px;
color: #777;
padding-top: 8px;
}
.demo {
box-sizing: border-box;
border: 1px solid #e4e7ef;
width: 99%;
// height: 530px;
margin-top: 24px;
padding-bottom: 20px;
.demo-result,
.demo-code {
box-sizing: border-box;
padding: 24px;
float: left;
height: 100%;
}
.demo-result {
.result-title {
font-size: 18px;
line-height: 24px;
color: #222;
}
.result_form {
width: 60%;
margin: 72px auto 0;
}
.result_input {
width: 100%;
border: 1px solid #e4e7ef;
height: 40px;
line-height: 38px;
padding-left: 16px;
box-sizing: border-box;
margin-bottom: 16px;
font-size: 18px;
color: #abaeb2;
background-color: transparent;
}
.result_btn {
border: 0;
outline: 0;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 18px;
color: #fff;
background: #cdd2df;
cursor: not-allowed;
margin-top: 15px;
}
}
.demo-code {
background: #f7f9fa;
position: relative;
.code-title {
float: left;
font-size: 18px;
line-height: 24px;
color: #222;
}
.code_copy {
float: right;
width: 68px;
height: 24px;
line-height: 24px;
border-radius: 12px;
background: #6f7482;
color: #fff;
font-size: 12px;
outline: none;
border: none;
cursor: pointer;
}
.code-container{
padding-top: 20px;
display: block;
overflow: auto;
color: #4d4d4c;
padding: 0.5em;
line-height: 1.5;
}
}
}
}
</style>

View File

@ -0,0 +1,189 @@
<template>
<div class="sliderFixed">
<h1 class="title">滑动弹出式slider-popup</h1>
<p class="desc">
点击自有验证按钮弹出验证码与自有业务样式完美融合
</p>
<el-row class="demo">
<el-col :xs="24" :sm="24" :md="13" :lg="13" :xl="13" class="demo-result">
<h2 class="result-title">示例</h2>
<form class="result_form">
<input
class="result_input"
type="text"
value="用户名"
disabled="disabled"
>
<input
class="result_input"
type="password"
value="123456"
disabled="disabled"
>
<!-- @success="login" -->
<Verify
ref="verify"
:mode="'pop'"
:captcha-type="'blockPuzzle'"
:img-size="{ width: '330px', height: '155px' }"
/>
<!-- 组件 -->
<button class="result_btn" @click.prevent="showBox">登录</button>
</form>
</el-col>
<el-col :xs="24" :sm="24" :md="11" :lg="11" :xl="11" class="demo-code">
<div class="code-header clearfix">
<h2 class="code-title">代码 :</h2>
<!-- <button class="code_copy">复制</button> -->
</div>
<div class="code-container">
<i>&lt;</i>template<i>></i>
<pre> <i>&lt;</i>Verify
@success<i>=</i>"success" //
:mode<i>=</i>"'pop'" //
:captchaType="'blockPuzzle'" //
:imgSize<i>=</i>"{ width: '330px', height: '155px' }" //
ref<i>=</i>"verify"
<i>></i><i>&lt;</i>/Verify
<i>&lt;</i>/template<i>></i>
<i>&lt;</i>script<i>></i>
//
import Verify from "./../../components/verifition/Verify";
export default {
name: 'app',
methods: {
success(params){
// params
},
showVerify(){
//mode="pop",show
this.$refs.verify.show();
}
},
components<i>:</i> {
Verify
}
}
<i>&lt;</i>/script<i>></i>
</pre>
</div>
</el-col>
</el-row>
</div>
</template>
<script>
import Verify from './../../components/verifition/Verify'
export default {
name: 'SliderFixed',
components: {
Verify
},
methods: {
showBox() {
this.$refs.verify.show()
}
},
}
</script>
<style scoped lang="less">
.sliderFixed {
.title {
font-size: 28px;
color: #222;
line-height: 40px;
}
.desc {
font-size: 14px;
line-height: 24px;
color: #777;
padding-top: 8px;
}
.demo {
box-sizing: border-box;
border: 1px solid #e4e7ef;
width: 99%;
// height: 530px;
margin-top: 24px;
padding-bottom: 20px;
.demo-result,
.demo-code {
box-sizing: border-box;
padding: 24px;
float: left;
height: 100%;
}
.demo-result {
.result-title {
font-size: 18px;
line-height: 24px;
color: #222;
}
.result_form {
width: 60%;
margin: 72px auto 0;
}
.result_input {
width: 100%;
border: 1px solid #e4e7ef;
height: 40px;
line-height: 38px;
padding-left: 16px;
box-sizing: border-box;
margin-bottom: 16px;
font-size: 18px;
color: #abaeb2;
background-color: transparent;
}
.result_btn {
border: 0;
outline: 0;
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 18px;
color: #fff;
background: #0a4bee;
cursor: pointer;
margin-top: 15px;
}
}
.demo-code {
background: #f7f9fa;
position: relative;
.code-title {
float: left;
font-size: 18px;
line-height: 24px;
color: #222;
}
.code_copy {
float: right;
width: 68px;
height: 24px;
line-height: 24px;
border-radius: 12px;
background: #6f7482;
color: #fff;
font-size: 12px;
outline: none;
border: none;
cursor: pointer;
}
.code-container{
padding-top: 20px;
display: block;
overflow: auto;
color: #4d4d4c;
padding: 0.5em;
line-height: 1.5;
}
}
}
}
</style>

View File

@ -0,0 +1,231 @@
<template>
<div>
<el-container style="width: 100%;height: 100%;">
<el-header style="height: auto; padding: 0;">
<myHeader />
</el-header>
</el-container>
<el-main>
<div class="search-pop clearfix">
<el-row>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<div class="grid-content">
<el-row type="flex" justify="center">
<el-col :xs="22" :sm="22" :md="22" :lg="22" :xl="24">
<div class="grid-content pd-main pt20 pb20">
<el-row class="row-bg">
<el-col type="flex" :xs="24" :sm="24" :md="6" :lg="4" :xl="4">
<div class="grid-content">
<div class="left-box">
<div class="project-list">
<MenuItem />
</div>
</div>
</div>
</el-col>
<el-col type="flex" :xs="24" :sm="24" :md="18" :lg="20" :xl="20">
<div class="grid-content">
<div class="right-box">
<div class="log-list">
<router-view />
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</el-col>
</el-row>
</div>
</el-main>
</div>
</template>
<script>
import myHeader from './../layout/Header'
import MenuItem from './../layout/UseMenuItem'
export default {
name: 'UserOnline',
components: {
myHeader,
MenuItem
},
data() {
return {
}
}
}
</script>
<style scoped lang="less">
@import "./../../assets/style/theme";
.nav-menu {
width: 100%;
background: #203160;
position: fixed;
z-index: 10000;
top:0;
.logo {
margin-top: 14px;
width: 85px;
}
}
.userBox {
line-height: 64px;
color: rgba(255, 255, 255, 0.4);
font-size: 12px;
cursor: pointer;
.goOut {
padding: 10px 18px;
&:hover {
color: #03afff;
}
}
}
.el-collapse{
position: relative;
}
.el-button {
font-size: 12px;
}
.left-box {
margin-right: 15px;
overflow: hidden;
}
.right-box {
padding: 20px;
overflow-x: hidden;
}
.left-box, .right-box {
background: #ffffff;
border: 1px solid rgba(151, 151, 151, 0.07);
box-shadow: 0 0 10px 0 rgba(122, 177, 249, 0.4);
border-radius: 6px;
}
.project-lid {
background: #9199b1;
height: 60px;
padding: 0 20px;
color: @white;
line-height: 60px;
font-size: @f16;
overflow: hidden;
label {
color: @white;
}
}
.project-list {
line-height: 42px;
font-size: 14px;
color: #333;
width: 100%;
height: calc(100vh - 110px);
height: -moz-calc(100vh - 110px);
height: -webkit-calc(100vh - 110px);
height: calc(100vh - 110px);
overflow-y: auto;
overflow-x: hidden;
}
.log-list {
min-height: calc(100vh - 150px);
min-height: -moz-calc(100vh - 150px);
min-height: -webkit-calc(100vh - 150px);
min-height: calc(100vh - 150px);
max-height: calc(100vh - 150px);
max-height: -moz-calc(100vh - 150px);
max-height: -webkit-calc(100vh - 150px);
max-height: calc(100vh - 150px);
overflow-y: auto;
overflow-x: hidden;
}
.log-repeat {
.log-info {
div {
line-height: 20px;
font-size: 13px;
word-wrap:break-word;
white-space:pre-wrap;
}
}
}
.el-collapse {
border-width: 0;
}
.advanced-search {
background: @white;
border-radius: 100px;
font-size: 13px;
color: @ft-btn-color;
height: 30px;
line-height: 30px;
padding: 0 20px;
}
.icon-zuidahua {
color: @white;
font-size: @f24;
&:hover {
font-size: 29px;
color: @white;
}
}
.zhiding {
margin-top: 14px;
font-size: @f14;
color: #999;
position: absolute;
z-index: 1;
right: 37px;
.icon {
color: @ft-btn-color;
}
.del-log{
position: absolute;
display: block;
top: 0;
right: -25px;
color: #d8d8d8;
}
.del-log:hover {
color: @pink;
}
}
.amount{
padding: 40px;
line-height: 40px;
strong{
font-size: 36px;
line-height: 40px;
i{
font-size: 32px;
}
&.yj{
color: #DD4A68;
}
&.dx{
color: #ea9015;
}
&.jg{
color: #4bc70b;
}
&.ym{
color: #3b89dd;
}
}
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 200px;
min-height: 400px;
}
</style>

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Hibear
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,5 @@
# verify
常规验证码、滑动验证码、拼图验证码、选字验证码,纯前端验证码。
<a href="http://veui.net">官网</a>

View File

@ -0,0 +1,247 @@
/* 需要引入的css文件 */
.verify-code {
font-size: 20px;
text-align: center;
cursor: pointer;
margin-bottom: 5px;
border: 1px solid #ddd;
}
.cerify-code-panel {
height:100%;
overflow:hidden;
}
.verify-code-area {
float:left;
}
.verify-input-area {
float: left;
width: 60%;
padding-right: 10px;
}
.verify-change-area {
line-height: 30px;
float: left;
}
.varify-input-code {
display:inline-block;
width: 100%;
height: 25px;
}
.verify-change-code {
color: #337AB7;
cursor: pointer;
}
.verify-btn {
width: 200px;
height: 30px;
background-color: #337AB7;
color:#FFFFFF;
border:none;
margin-top: 10px;
}
.verifybox{
position: relative;
box-sizing: border-box;
border-radius: 2px;
border: 1px solid #e4e7eb;
background-color: #fff;
box-shadow: 0 0 10px rgba(0,0,0,.3);
left: 50%;
top:50%;
transform: translate(-50%,-50%);
}
.verifybox-top{
padding: 0 15px;
height: 50px;
line-height: 50px;
text-align: left;
font-size: 16px;
color: #45494c;
border-bottom: 1px solid #e4e7eb;
box-sizing: border-box;
}
.verifybox-bottom{
padding: 15px;
box-sizing: border-box;
}
.verifybox-close{
position: absolute;
top: 13px;
right: 9px;
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
cursor: pointer;
}
.mask{
position: fixed;
top: 0;
left:0;
z-index: 1001;
width: 100%;
height: 100vh;
background: rgba(0,0,0,.3);
/* display: none; */
transition: all .5s;
display: none;
}
.verify-tips{
position: absolute;
display: none;
left: 0px;
bottom:-35px;
width: 100%;
height: 30px;
/* transition: all .5s; */
line-height:30px;
color: #fff;
/* animation:move 1.5s linear; */
}
@keyframes move {
0%{
bottom:-35px;
}
50%,80%{
bottom:0px;
}
100%{
bottom:-35px;
}
}
.suc-bg{
background-color:rgba(92, 184, 92,.5);
filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7f5CB85C, endcolorstr=#7f5CB85C);
}
.err-bg{
background-color:rgba(217, 83, 79,.5);
filter: progid:DXImageTransform.Microsoft.gradient(startcolorstr=#7fD9534F, endcolorstr=#7fD9534F);
}
/*滑动验证码*/
.verify-bar-area {
position: relative;
background: #FFFFFF;
text-align: center;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
border: 1px solid #ddd;
-webkit-border-radius: 4px;
}
.verify-bar-area .verify-move-block {
position: absolute;
top: 0px;
left: 0;
background: #fff;
cursor: pointer;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
box-shadow: 0 0 2px #888888;
-webkit-border-radius: 1px;
}
.verify-bar-area .verify-move-block:hover {
background-color: #337ab7;
color: #FFFFFF;
}
.verify-bar-area .verify-left-bar {
position: absolute;
top: -1px;
left: -1px;
background: #f0fff0;
cursor: pointer;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
border: 1px solid #ddd;
}
.verify-img-panel {
margin:0;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
border: 1px solid #ddd;
border-radius: 3px;
position: relative;
}
.verify-img-panel .verify-refresh {
width: 25px;
height: 25px;
text-align:center;
padding: 5px;
cursor: pointer;
position: absolute;
top: 0;
right: 0;
z-index: 2;
}
.verify-img-panel .icon-refresh {
font-size: 20px;
color: #fff;
}
.verify-img-panel .verify-gap {
background-color: #fff;
position: relative;
z-index: 2;
border:1px solid #fff;
}
.verify-bar-area .verify-move-block .verify-sub-block {
position: absolute;
text-align: center;
z-index: 3;
/* border: 1px solid #fff; */
}
.verify-bar-area .verify-move-block .verify-icon {
font-size: 18px;
}
.verify-bar-area .verify-msg {
z-index : 3;
}
/*字体图标的css*/
@font-face {font-family: "iconfont";
src: url('../fonts/iconfont.eot?t=1508229193188'); /* IE9*/
src: url('../fonts/iconfont.eot?t=1508229193188#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAaAAAsAAAAACUwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7kiSY21hcAAAAYAAAAB3AAABuM+qBlRnbHlmAAAB+AAAAnQAAALYnrUwT2hlYWQAAARsAAAALwAAADYPNwajaGhlYQAABJwAAAAcAAAAJAfeA4dobXR4AAAEuAAAABMAAAAYF+kAAGxvY2EAAATMAAAADgAAAA4CvAGsbWF4cAAABNwAAAAfAAAAIAEVAF1uYW1lAAAE/AAAAUUAAAJtPlT+fXBvc3QAAAZEAAAAPAAAAE3oPPXPeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sM4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDxbwtzwv4EhhrmBoQEozAiSAwAw1A0UeJzFkcENgCAMRX8RjCGO4gTe9eQcnhzAfXC2rqG/hYsT8MmD9gdS0gJIAAaykAjIBYHppCvuD8juR6zMJ67A89Zdn/f1aNPikUn8RvYo8G20CjKim6Rf6b9m34+WWd/vBr+oW8V6q3vF5qKlYrPRp4L0Ad5nGL8AeJxFUc9rE0EYnTezu8lMsrvtbrqb3TRt0rS7bdOmdI0JbWmCtiItIv5oi14qevCk9SQVLFiQgqAF8Q9QLKIHLx48FkHo3ZNnFUXwD5C2B6dO6sFhmI83w7z3fe8RnZCjb2yX5YlLhskkmScXCIFRxYBFiyjH9Rqtoqes9/g5i8WVuJyqDNTYLPwBI+cljXrkGynDhoU+nCgnjbhGY5yst+gMEq8IBIXwsjPU67CnEPm4b0su0h309Fd67da4XBhr55KSm17POk7gOE/Shq6nKdVsC7d9j+tcGPKVboc9u/0jtB/ZIA7PXTVLBef6o/paccjnwOYm3ELJetPuDrvV3gg91wlSXWY6H5qVwRzWf2TybrYYfSdqoXOwh/Qa8RWIjBTiSI3h614/vKSNRhONOrsnQi6Xf4nQFQDTmJE1NKbhI6crHEJO/+S5QPxhYJRRyvBFBP+5T9EPpEAIVzzRQIrjmJ6jY1WTo+NXTMchuBsKuS8PRZATSMl9oTA4uNLkeIA0V1UeqOoGQh7IAxGo+7T83fn3T+voqCNPPAUazUYUI7LgKSV1Jk2oUeghYGhZ+cKOe2FjVu5ZKEY2VkE13AK1+jI4r1KLbPlZfrKiPhOXKPRj7q9sj9XJ7LFHNmrKJS3VCdhXGSdKrtmoQaWeMjQVt0KD6sGPOx0oH2fgtzoNROxtNq8F3tzYM/n+TjKSX5qf2jx941276TIr9FjXxKr8eX/6bK4yuopwo9py1sw8F9kdw4AmurRpLUM3tYx5ZnKpfHPi8dzz19vJ6MjyxYUrpqeb1uLs3eGV6vr21pSqpeWkqonAN9oUyIiXpv8XvlN5e3icY2BkYGAA4n0vN4fG89t8ZeBmYQCBa9wPPRH0/wcsDMwmQC4HAxNIFABAfAqaAHicY2BkYGBu+N/AEMPCAAJAkpEBFbABAEcMAm94nGNhYGBgfsnAwMKAigESnwEBAAAAAAAAdgCkANoBCAFsAAB4nGNgZGBgYGMIZGBlAAEmIOYCQgaG/2A+AwARSAFzAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nGNgYoAALgbsgI2RiZGZkYWRlZGNkZ2BsYI1OSM1OZs1OSe/OJW1KDM9o4S9KDWtKLU4g4EBAJ79CeQ=') format('woff'),
url('../fonts/iconfont.ttf?t=1508229193188') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('../fonts/iconfont.svg?t=1508229193188#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
font-family:"iconfont" !important;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-check:before { content: "\e645"; }
.icon-close:before { content: "\e646"; }
.icon-right:before { content: "\e6a3"; }
.icon-refresh:before { content: "\e6a4"; }

Binary file not shown.

View File

@ -0,0 +1,45 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="x" unicode="x" horiz-adv-x="1001"
d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5
t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5
t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" />
<glyph glyph-name="check" unicode="&#58949;" d="M887.904 597.792c-12.864 12.064-33.152 11.488-45.216-1.408L415.936 142.016l-233.12 229.696C170.208 384.128 149.952 384 137.536 371.392c-12.416-12.576-12.256-32.864 0.352-45.248l256.48-252.672c0.096-0.096 0.224-0.128 0.32-0.224 0.096-0.096 0.128-0.224 0.224-0.32 2.016-1.92 4.448-3.008 6.784-4.288 1.152-0.672 2.144-1.664 3.36-2.144 3.776-1.472 7.776-2.24 11.744-2.24 4.192 0 8.384 0.832 12.288 2.496 1.312 0.544 2.336 1.664 3.552 2.368 2.4 1.408 4.896 2.592 6.944 4.672 0.096 0.096 0.128 0.256 0.224 0.352 0.064 0.096 0.192 0.128 0.288 0.224l449.184 478.208C901.44 565.408 900.768 585.664 887.904 597.792z" horiz-adv-x="1024" />
<glyph glyph-name="close" unicode="&#58950;" d="M557.312 382.752l265.28 263.904c12.544 12.48 12.608 32.704 0.128 45.248-12.512 12.576-32.704 12.608-45.248 0.128l-265.344-263.936-263.04 263.84C236.64 704.416 216.384 704.48 203.84 692 191.328 679.52 191.296 659.264 203.776 646.72l262.976-263.776L201.6 119.2c-12.544-12.48-12.608-32.704-0.128-45.248 6.24-6.272 14.464-9.44 22.688-9.44 8.16 0 16.32 3.104 22.56 9.312l265.216 263.808 265.44-266.24c6.24-6.272 14.432-9.408 22.656-9.408 8.192 0 16.352 3.136 22.592 9.344 12.512 12.48 12.544 32.704 0.064 45.248L557.312 382.752z" horiz-adv-x="1024" />
<glyph glyph-name="right" unicode="&#59043;" d="M761.056 363.872c0.512 0.992 1.344 1.824 1.792 2.848 8.8 18.304 5.92 40.704-9.664 55.424L399.936 756.256c-19.264 18.208-49.632 17.344-67.872-1.888-18.208-19.264-17.376-49.632 1.888-67.872l316.96-299.84-315.712-304.288c-19.072-18.4-19.648-48.768-1.248-67.872 9.408-9.792 21.984-14.688 34.56-14.688 12 0 24 4.48 33.312 13.44l350.048 337.376c0.672 0.672 0.928 1.6 1.6 2.304 0.512 0.48 1.056 0.832 1.568 1.344C757.76 357.12 759.2 360.608 761.056 363.872z" horiz-adv-x="1024" />
<glyph glyph-name="refresh" unicode="&#59044;" d="M939.456 639.776c-16.672 5.984-34.976-2.72-40.896-19.36l-24.768-69.344c-28.992 65.312-74.784 122.72-133.088 165.92C555.328 854.272 291.296 816.768 152.32 633.344c-67.264-88.768-95.616-198.176-79.84-308.032 15.84-110.304 74.208-207.776 164.352-274.496 75.424-55.808 163.808-82.752 251.456-82.752 128.032 0 254.56 57.44 336.992 166.272 36.48 48.128 61.472 102.08 74.208 160.416 3.776 17.248-7.136 34.304-24.416 38.08-17.216 3.712-34.304-7.104-38.08-24.416-10.784-49.184-31.872-94.752-62.72-135.456-117.888-155.52-341.92-187.232-499.392-70.72-76.288 56.48-125.664 138.912-139.072 232.16-13.344 92.8 10.656 185.248 67.488 260.288 117.856 155.584 341.792 187.424 499.328 70.848 57.024-42.24 99.84-100.608 122.976-166.624l-109.984 42.944c-16.416 6.368-35.008-1.696-41.44-18.176-6.432-16.48 1.728-35.008 18.176-41.44l161.856-63.2c3.808-1.472 7.744-2.208 11.616-2.208 0.544 0 1.024 0.192 1.568 0.224 1.216-0.128 2.432-0.64 3.648-0.64 13.12 0 25.472 8.16 30.112 21.248l57.632 161.184C964.768 615.52 956.096 633.856 939.456 639.776z" horiz-adv-x="1024" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,125 @@
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
<title>verify插件demo</title>
<link rel="stylesheet" type="text/css" href="css/verify.css">
<style>
.btn{
border: none;
outline: none;
width: 300px;
height: 40px;
line-height: 40px;
text-align: center;
cursor: pointer;
background-color: #409EFF;
color: #fff;
font-size: 16px;
letter-spacing: 1em;
}
</style>
</head>
<body>
<div class="box">
<h1>verify---anji</h1>
<p>前后端联合交互的验证码插件</p>
<br><br>
<h3>滑动嵌入式slider-embed</h3>
<div id="mpanel1" >
</div>
<h3>滑动弹出式slider-popup</h3>
<button class="btn" id='btn'>点击我</button>
<div id="mpanel2" style="margin-top:50px;">
</div>
<h3>点选嵌入式point-embed</h3>
<div id="mpanel3" style="margin-top:50px;">
</div>
<h3>点选弹出式point-popup</h3>
<button class="btn" id='btn2'>点击我</button>
<div id="mpanel4" style="margin-top:50px;">
</div>
</div>
<script type="text/javascript" src="js/jquery.min.js" ></script>
<!-- 可选 为示例加密方式 start-->
<script src="./js/md5.js"></script>
<script src="./js/signUtil.js"></script>
<!-- 以上 为示例加密方式 end-->
<script src="./js/crypto-js.js"></script>
<script src="./js/ase.js"></script>
<script type="text/javascript" src="js/verify.js" ></script>
<script>
// 初始化验证码 嵌入式
$('#mpanel1').slideVerify({
mode:'fixed',
imgSize : { //图片的大小对象
width: '400px',
height: '200px',
},
barSize:{
width: '400px',
height: '40px',
},
ready : function() { //加载完毕的回调
},
success : function(params) { //成功的回调
// 返回的二次验证参数 合并到验证通过之后的逻辑 参数中回传服务器
},
error : function() { //失败的回调
}
});
// 初始化验证码 弹出式
$('#mpanel2').slideVerify({
mode:'pop',
containerId:'btn',//pop模式 必填 被点击之后出现行为验证码的元素id
ready : function() { //加载完毕的回调
},
success : function(params) { //成功的回调
// 返回的二次验证参数 合并到验证通过之后的逻辑 参数中回传服务器
},
error : function() { //失败的回调
}
});
// 初始化验证码 嵌入式
$('#mpanel3').pointsVerify({
mode:'fixed',
imgSize : {
width: '500px',
height: '255px',
},
ready : function() {
},
success : function(params) {
//返回的二次验证参数 合并到验证通过之后的逻辑 参数中回传服务器
},
error : function() {
}
});
// 初始化验证码 弹出式
$('#mpanel4').pointsVerify({
containerId:'btn2', // pop模式 必填 被点击之后出现行为验证码的元素id
mode:'pop',
imgSize : { //图片的大小对象
width: '400px',
height: '200px',
},
ready : function() {
},
success : function(params) {
//返回的二次验证参数 合并到验证通过之后的逻辑 参数中回传服务器
},
error : function() {
}
});
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More