'init'
7
.dockerignore
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.vscode/
|
||||||
|
.idea/
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
**/*.log
|
||||||
|
LICENSE
|
||||||
|
README.md
|
41
.drone.yml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: default
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build
|
||||||
|
image: docker:dind
|
||||||
|
volumes:
|
||||||
|
- name: dockersock
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
- name: dockerconfig
|
||||||
|
path: /root/.docker
|
||||||
|
commands:
|
||||||
|
- docker build -t harbor.picaiba.com/mes/mes-ui:hfxny-1.0.0 ./ && docker push harbor.picaiba.com/mes/mes-ui:hfxny-1.0.0
|
||||||
|
|
||||||
|
- name: deploy
|
||||||
|
image: harbor.picaiba.com/tools/kubectl:1.19.8
|
||||||
|
commands:
|
||||||
|
- echo "172.27.0.20 lb.kubesphere.local" >> /etc/hosts
|
||||||
|
#- echo "52.74.223.119 github.com" >> /etc/hosts
|
||||||
|
- sleep 1
|
||||||
|
- kubectl scale --replicas=0 deployment/mes-ui -n mes-hfxny
|
||||||
|
- sleep 3
|
||||||
|
- kubectl scale --replicas=1 deployment/mes-ui -n mes-hfxny
|
||||||
|
depends_on:
|
||||||
|
- build
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- name: dockersock
|
||||||
|
host:
|
||||||
|
path: /var/run/docker.sock
|
||||||
|
- name: dockerconfig
|
||||||
|
host:
|
||||||
|
path: /root/.docker
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- projects/hfxny
|
||||||
|
event:
|
||||||
|
- push
|
14
.editorconfig
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# https://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
insert_final_newline = false
|
||||||
|
trim_trailing_whitespace = false
|
23
.env.development
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# just a flag
|
||||||
|
ENV = 'development'
|
||||||
|
|
||||||
|
# base api
|
||||||
|
# 这里修改成api服务器地址
|
||||||
|
VUE_APP_BASE_API = '/api'
|
||||||
|
|
||||||
|
# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable,
|
||||||
|
# to control whether the babel-plugin-dynamic-import-node plugin is enabled.
|
||||||
|
# It only does one thing by converting all import() to require().
|
||||||
|
# This configuration can significantly increase the speed of hot updates,
|
||||||
|
# when you have a large number of pages.
|
||||||
|
# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js
|
||||||
|
|
||||||
|
VUE_CLI_BABEL_TRANSPILE_MODULES = true
|
||||||
|
VUE_APP_REPORT_DESIGN_URL = 'http://hfxny.mes.picaiba.com/ureport/designer'
|
||||||
|
VUE_APP_REPORT_VIEW_URL = 'http://hfxny.mes.picaiba.com/ureport/preview'
|
||||||
|
|
||||||
|
|
||||||
|
# sh record:
|
||||||
|
# @liubin
|
||||||
|
# 鉴于该文件不被git追踪,固用来保存一些local的东西,比如命令之类的
|
||||||
|
eval "$(ssh-agent -s)" && ssh-add ~/Desktop/ssh/id_rsa
|
7
.env.production
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# just a flag
|
||||||
|
ENV = 'production'
|
||||||
|
|
||||||
|
# base api
|
||||||
|
VUE_APP_BASE_API = '/api'
|
||||||
|
VUE_APP_REPORT_DESIGN_URL = '/ureport/designer'
|
||||||
|
VUE_APP_REPORT_VIEW_URL = '/ureport/preview'
|
8
.env.staging
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
NODE_ENV = production
|
||||||
|
|
||||||
|
# just a flag
|
||||||
|
ENV = 'staging'
|
||||||
|
|
||||||
|
# base api
|
||||||
|
VUE_APP_BASE_API = '/stage-api'
|
||||||
|
|
4
.eslintignore
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
build/*.js
|
||||||
|
src/assets
|
||||||
|
public
|
||||||
|
dist
|
201
.eslintrc.js
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
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
|
||||||
|
//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/no-use-v-if-with-v-for": ["error", {
|
||||||
|
"allowUsingIterationVar": true
|
||||||
|
}],
|
||||||
|
"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': 2,
|
||||||
|
'no-unsafe-finally': 2,
|
||||||
|
'no-unused-vars': [2, {
|
||||||
|
'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']
|
||||||
|
}
|
||||||
|
}
|
25
.gitignore
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
.DS_Store
|
||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
**/*.log
|
||||||
|
|
||||||
|
tests/**/coverage/
|
||||||
|
tests/e2e/reports
|
||||||
|
selenium-debug.log
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# package-lock.json
|
||||||
|
# yarn.lock
|
||||||
|
# /.env.development
|
||||||
|
# /vue.config.js
|
12
.prettierrc
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"semi": false,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "none",
|
||||||
|
"useTabs": false,
|
||||||
|
"tabWidth": 2,
|
||||||
|
"htmlWhitespaceSensitivity": "ignore",
|
||||||
|
"vueIndentScriptAndStyle": false,
|
||||||
|
"embeddedLanguageFormatting": "off",
|
||||||
|
"bracketSameLine":false,
|
||||||
|
"printWidth": 120
|
||||||
|
}
|
5
.travis.yml
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
language: node_js
|
||||||
|
node_js: 10
|
||||||
|
script: npm run test
|
||||||
|
notifications:
|
||||||
|
email: false
|
10
Dockerfile
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
FROM node:12 AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
ADD package.json /app/
|
||||||
|
RUN npm config set registry https://registry.npmmirror.com && npm install
|
||||||
|
ADD . /app
|
||||||
|
RUN npm run build:prod
|
||||||
|
|
||||||
|
FROM busybox
|
||||||
|
LABEL maintainer thomas.hairong@gmail.com
|
||||||
|
COPY --from=builder /app/dist /html
|
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017-present PanJiaChen
|
||||||
|
|
||||||
|
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.
|
49
README.md
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: gtz
|
||||||
|
* @Date: 2021-01-27 10:07:42
|
||||||
|
* @LastEditors: gtz
|
||||||
|
* @LastEditTime: 2021-04-22 09:58:18
|
||||||
|
* @Description: file content
|
||||||
|
-->
|
||||||
|
# Readme
|
||||||
|
|
||||||
|
|
||||||
|
页面原型地址: http://rp.picaiba.com/mes/2020-12-29
|
||||||
|
|
||||||
|
element 表单生成工具: https://mrhj.gitee.io/form-generator/#/
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
* 顶栏右上角设置的配置在 @/layout/components/Navbar.vue 中
|
||||||
|
* 富文本编辑器中 右上角上传图片的目标地址需要修改,在@/components/Tinymce/components/EditorImage.vue 中
|
||||||
|
|
||||||
|
|
||||||
|
##### echarts封装
|
||||||
|
* 考虑使用mixin加入部分功能
|
||||||
|
* option配置分离,再复用
|
||||||
|
* 定义统一输入的数据格式(通过props?)
|
||||||
|
|
||||||
|
##### 国际化注意事项
|
||||||
|
* 所有methodbtn的tableBtn配置中的btnName写成下种形式,具体配置项在@/lang/i18n.js 中,若无想要的自行添加
|
||||||
|
```
|
||||||
|
btnName: 'btn.edit'
|
||||||
|
```
|
||||||
|
* 所有hidden不为true的路由的mate中的title,写成下种形式,位置同上
|
||||||
|
```
|
||||||
|
meta: { title: routerTitle.dashboard.dashboard?.[language] || routerTitle.dashboard.dashboard.en, icon: 'dashboard', affix: true }
|
||||||
|
```
|
||||||
|
* 所有table页引入国际化组件,表格配置项中label写成下种形式,具体配置需自行到@/lang/en.js 和@/lang/zh.js 中添加
|
||||||
|
```
|
||||||
|
import i18n from '@/lang'
|
||||||
|
const tableProps = [{
|
||||||
|
...
|
||||||
|
label: i18n.t('userManage.userId'),
|
||||||
|
...
|
||||||
|
}]
|
||||||
|
```
|
||||||
|
|
||||||
|
##### 切换主题色
|
||||||
|
* 主题样式文件应使用本地文件,不应使用element云上的(目前尝试使用本地可能因为缓存策略导致切换主题色仅第一次生效,目前仍保留使用element云上的样式文件)
|
||||||
|
|
||||||
|
##### 备注
|
||||||
|
* 废品报废添加时间隐藏,质量检测计划检测速率、检测内容隐藏
|
26
babel.config.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* @Date: 2020-12-14 09:07:03
|
||||||
|
* @LastEditors: guo
|
||||||
|
* @LastEditTime: 2020-12-29 21:34:11
|
||||||
|
* @FilePath: \basic-admin\babel.config.js
|
||||||
|
* @Description: 修改babel配置
|
||||||
|
* preset-env用于适配浏览器(最新4个版本)
|
||||||
|
* transform-runtime 用于识别一些比较新的js语法
|
||||||
|
*/
|
||||||
|
module.exports = {
|
||||||
|
presets: [
|
||||||
|
['@babel/preset-env', {
|
||||||
|
'useBuiltIns': 'usage',
|
||||||
|
'debug': true,
|
||||||
|
'targets': [
|
||||||
|
'last 4 versions'
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
'@vue/app'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
['@babel/plugin-transform-runtime', {
|
||||||
|
'corejs': 3
|
||||||
|
}]
|
||||||
|
]
|
||||||
|
}
|
35
build/index.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
const { run } = require('runjs')
|
||||||
|
const chalk = require('chalk')
|
||||||
|
const config = require('../vue.config.js')
|
||||||
|
const rawArgv = process.argv.slice(2)
|
||||||
|
const args = rawArgv.join(' ')
|
||||||
|
|
||||||
|
if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
|
||||||
|
const report = rawArgv.includes('--report')
|
||||||
|
|
||||||
|
run(`vue-cli-service build ${args}`)
|
||||||
|
|
||||||
|
const port = 9526
|
||||||
|
const publicPath = config.publicPath
|
||||||
|
|
||||||
|
var connect = require('connect')
|
||||||
|
var serveStatic = require('serve-static')
|
||||||
|
const app = connect()
|
||||||
|
|
||||||
|
app.use(
|
||||||
|
publicPath,
|
||||||
|
serveStatic('./dist', {
|
||||||
|
index: ['index.html', '/']
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
app.listen(port, function () {
|
||||||
|
console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`))
|
||||||
|
if (report) {
|
||||||
|
console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`))
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
run(`vue-cli-service build ${args}`)
|
||||||
|
}
|
50
default.conf
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
server {
|
||||||
|
listen 80 default_server;
|
||||||
|
listen [::]:80 default_server;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html index.htm;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ @rewrites;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /spc/ {
|
||||||
|
proxy_pass http://58.210.206.230:8000/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /api {
|
||||||
|
access_log off;
|
||||||
|
add_header Access-Control-Allow-Origin * always;
|
||||||
|
add_header Access-Control-Allow-Methods GET,OPTIONS,POST,GET,PUT,DELETE always;
|
||||||
|
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
|
||||||
|
add_header Access-Control-Allow-Credentials true;
|
||||||
|
add_header Access-Control-Max-Age 1800;
|
||||||
|
|
||||||
|
if ($request_method = OPTIONS){
|
||||||
|
add_header Access-Control-Allow-Origin * always;
|
||||||
|
add_header Access-Control-Allow-Methods GET,OPTIONS,POST,GET,PUT,DELETE always;
|
||||||
|
add_header Access-Control-Allow-Headers $http_access_control_request_headers;
|
||||||
|
add_header Access-Control-Allow-Credentials true;
|
||||||
|
add_header Access-Control-Max-Age 1800;
|
||||||
|
return 204;
|
||||||
|
}
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_pass http://mes:9090/api;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
location @rewrites {
|
||||||
|
rewrite ^(.+)$ /index.html last;
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
|
||||||
|
expires max;
|
||||||
|
add_header Pragma public;
|
||||||
|
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
|
||||||
|
}
|
||||||
|
}
|
24
jest.config.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
module.exports = {
|
||||||
|
moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
|
||||||
|
transform: {
|
||||||
|
'^.+\\.vue$': 'vue-jest',
|
||||||
|
'.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$':
|
||||||
|
'jest-transform-stub',
|
||||||
|
'^.+\\.jsx?$': 'babel-jest'
|
||||||
|
},
|
||||||
|
moduleNameMapper: {
|
||||||
|
'^@/(.*)$': '<rootDir>/src/$1'
|
||||||
|
},
|
||||||
|
snapshotSerializers: ['jest-serializer-vue'],
|
||||||
|
testMatch: [
|
||||||
|
'**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'
|
||||||
|
],
|
||||||
|
collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
|
||||||
|
coverageDirectory: '<rootDir>/tests/unit/coverage',
|
||||||
|
// 'collectCoverage': true,
|
||||||
|
'coverageReporters': [
|
||||||
|
'lcov',
|
||||||
|
'text-summary'
|
||||||
|
],
|
||||||
|
testURL: 'http://localhost/'
|
||||||
|
}
|
9
jsconfig.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": "./",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["src/*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
116
mock/article.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import Mock from 'mockjs'
|
||||||
|
|
||||||
|
const List = []
|
||||||
|
const count = 100
|
||||||
|
|
||||||
|
const baseContent = '<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
|
||||||
|
const image_uri = 'https://wpimg.wallstcn.com/e4558086-631c-425c-9430-56ffb46e70b3'
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
List.push(Mock.mock({
|
||||||
|
id: '@increment',
|
||||||
|
timestamp: +Mock.Random.date('T'),
|
||||||
|
author: '@first',
|
||||||
|
reviewer: '@first',
|
||||||
|
title: '@title(5, 10)',
|
||||||
|
content_short: 'mock data',
|
||||||
|
content: baseContent,
|
||||||
|
forecast: '@float(0, 100, 2, 2)',
|
||||||
|
importance: '@integer(1, 3)',
|
||||||
|
'type|1': ['CN', 'US', 'JP', 'EU'],
|
||||||
|
'status|1': ['published', 'draft'],
|
||||||
|
display_time: '@datetime',
|
||||||
|
comment_disabled: true,
|
||||||
|
pageviews: '@integer(300, 5000)',
|
||||||
|
image_uri,
|
||||||
|
platforms: ['a-platform']
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/article/list',
|
||||||
|
type: 'get',
|
||||||
|
response: config => {
|
||||||
|
const { importance, type, title, page = 1, limit = 20, sort } = config.query
|
||||||
|
|
||||||
|
let mockList = List.filter(item => {
|
||||||
|
if (importance && item.importance !== +importance) return false
|
||||||
|
if (type && item.type !== type) return false
|
||||||
|
if (title && item.title.indexOf(title) < 0) return false
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
if (sort === '-id') {
|
||||||
|
mockList = mockList.reverse()
|
||||||
|
}
|
||||||
|
|
||||||
|
const pageList = mockList.filter((item, index) => index < limit * page && index >= limit * (page - 1))
|
||||||
|
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
total: mockList.length,
|
||||||
|
items: pageList
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/article/detail',
|
||||||
|
type: 'get',
|
||||||
|
response: config => {
|
||||||
|
const { id } = config.query
|
||||||
|
for (const article of List) {
|
||||||
|
if (article.id === +id) {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: article
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/article/pv',
|
||||||
|
type: 'get',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
pvData: [
|
||||||
|
{ key: 'PC', pv: 1024 },
|
||||||
|
{ key: 'mobile', pv: 1024 },
|
||||||
|
{ key: 'ios', pv: 1024 },
|
||||||
|
{ key: 'android', pv: 1024 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/article/create',
|
||||||
|
type: 'post',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: 'success'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/article/update',
|
||||||
|
type: 'post',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: 'success'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
57
mock/index.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import Mock from 'mockjs'
|
||||||
|
import { param2Obj } from '../src/utils'
|
||||||
|
|
||||||
|
import user from './user'
|
||||||
|
import role from './role'
|
||||||
|
import article from './article'
|
||||||
|
import search from './remote-search'
|
||||||
|
|
||||||
|
const mocks = [
|
||||||
|
...user,
|
||||||
|
...role,
|
||||||
|
...article,
|
||||||
|
...search
|
||||||
|
]
|
||||||
|
|
||||||
|
// for front mock
|
||||||
|
// please use it cautiously, it will redefine XMLHttpRequest,
|
||||||
|
// which will cause many of your third-party libraries to be invalidated(like progress event).
|
||||||
|
export function mockXHR() {
|
||||||
|
// mock patch
|
||||||
|
// https://github.com/nuysoft/Mock/issues/300
|
||||||
|
Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
|
||||||
|
Mock.XHR.prototype.send = function() {
|
||||||
|
if (this.custom.xhr) {
|
||||||
|
this.custom.xhr.withCredentials = this.withCredentials || false
|
||||||
|
|
||||||
|
if (this.responseType) {
|
||||||
|
this.custom.xhr.responseType = this.responseType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.proxy_send(...arguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
function XHR2ExpressReqWrap(respond) {
|
||||||
|
return function(options) {
|
||||||
|
let result = null
|
||||||
|
if (respond instanceof Function) {
|
||||||
|
const { body, type, url } = options
|
||||||
|
// https://expressjs.com/en/4x/api.html#req
|
||||||
|
result = respond({
|
||||||
|
method: type,
|
||||||
|
body: JSON.parse(body),
|
||||||
|
query: param2Obj(url)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
result = respond
|
||||||
|
}
|
||||||
|
return Mock.mock(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const i of mocks) {
|
||||||
|
Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default mocks
|
84
mock/mock-server.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
const chokidar = require('chokidar')
|
||||||
|
const bodyParser = require('body-parser')
|
||||||
|
const chalk = require('chalk')
|
||||||
|
const path = require('path')
|
||||||
|
const Mock = require('mockjs')
|
||||||
|
|
||||||
|
const mockDir = path.join(process.cwd(), 'mock')
|
||||||
|
|
||||||
|
function registerRoutes(app) {
|
||||||
|
let mockLastIndex
|
||||||
|
const { default: mocks } = require('./index.js')
|
||||||
|
const mocksForServer = mocks.map(route => {
|
||||||
|
return responseFake(route.url, route.type, route.response)
|
||||||
|
})
|
||||||
|
for (const mock of mocksForServer) {
|
||||||
|
app[mock.type](mock.url, mock.response)
|
||||||
|
mockLastIndex = app._router.stack.length
|
||||||
|
}
|
||||||
|
const mockRoutesLength = Object.keys(mocksForServer).length
|
||||||
|
return {
|
||||||
|
mockRoutesLength: mockRoutesLength,
|
||||||
|
mockStartIndex: mockLastIndex - mockRoutesLength
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function unregisterRoutes() {
|
||||||
|
Object.keys(require.cache).forEach(i => {
|
||||||
|
if (i.includes(mockDir)) {
|
||||||
|
delete require.cache[require.resolve(i)]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// for mock server
|
||||||
|
const responseFake = (url, type, respond) => {
|
||||||
|
return {
|
||||||
|
url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
|
||||||
|
type: type || 'get',
|
||||||
|
response(req, res) {
|
||||||
|
console.log('request invoke:' + req.path)
|
||||||
|
res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = app => {
|
||||||
|
// es6 polyfill
|
||||||
|
require('@babel/register')
|
||||||
|
|
||||||
|
// parse app.body
|
||||||
|
// https://expressjs.com/en/4x/api.html#req.body
|
||||||
|
app.use(bodyParser.json())
|
||||||
|
app.use(bodyParser.urlencoded({
|
||||||
|
extended: true
|
||||||
|
}))
|
||||||
|
|
||||||
|
const mockRoutes = registerRoutes(app)
|
||||||
|
var mockRoutesLength = mockRoutes.mockRoutesLength
|
||||||
|
var mockStartIndex = mockRoutes.mockStartIndex
|
||||||
|
|
||||||
|
// watch files, hot reload mock server
|
||||||
|
chokidar.watch(mockDir, {
|
||||||
|
ignored: /mock-server/,
|
||||||
|
ignoreInitial: true
|
||||||
|
}).on('all', (event, path) => {
|
||||||
|
if (event === 'change' || event === 'add') {
|
||||||
|
try {
|
||||||
|
// remove mock routes stack
|
||||||
|
app._router.stack.splice(mockStartIndex, mockRoutesLength)
|
||||||
|
|
||||||
|
// clear routes cache
|
||||||
|
unregisterRoutes()
|
||||||
|
|
||||||
|
const mockRoutes = registerRoutes(app)
|
||||||
|
mockRoutesLength = mockRoutes.mockRoutesLength
|
||||||
|
mockStartIndex = mockRoutes.mockStartIndex
|
||||||
|
|
||||||
|
console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`))
|
||||||
|
} catch (error) {
|
||||||
|
console.log(chalk.redBright(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
51
mock/remote-search.js
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import Mock from 'mockjs'
|
||||||
|
|
||||||
|
const NameList = []
|
||||||
|
const count = 100
|
||||||
|
|
||||||
|
for (let i = 0; i < count; i++) {
|
||||||
|
NameList.push(Mock.mock({
|
||||||
|
name: '@first'
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
NameList.push({ name: 'mock-Pan' })
|
||||||
|
|
||||||
|
export default [
|
||||||
|
// username search
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/search/user',
|
||||||
|
type: 'get',
|
||||||
|
response: config => {
|
||||||
|
const { name } = config.query
|
||||||
|
const mockNameList = NameList.filter(item => {
|
||||||
|
const lowerCaseName = item.name.toLowerCase()
|
||||||
|
return !(name && lowerCaseName.indexOf(name.toLowerCase()) < 0)
|
||||||
|
})
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: { items: mockNameList }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// transaction list
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/transaction/list',
|
||||||
|
type: 'get',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
total: 20,
|
||||||
|
'items|20': [{
|
||||||
|
order_no: '@guid()',
|
||||||
|
timestamp: +Mock.Random.date('T'),
|
||||||
|
username: '@name()',
|
||||||
|
price: '@float(1000, 15000, 0, 2)',
|
||||||
|
'status|1': ['success', 'pending']
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
98
mock/role/index.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import Mock from 'mockjs'
|
||||||
|
import { deepClone } from '../../src/utils/index.js'
|
||||||
|
import { asyncRoutes, constantRoutes } from './routes.js'
|
||||||
|
|
||||||
|
const routes = deepClone([...constantRoutes, ...asyncRoutes])
|
||||||
|
|
||||||
|
const roles = [
|
||||||
|
{
|
||||||
|
key: 'admin',
|
||||||
|
name: 'admin',
|
||||||
|
description: 'Super Administrator. Have access to view all pages.',
|
||||||
|
routes: routes
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'editor',
|
||||||
|
name: 'editor',
|
||||||
|
description: 'Normal Editor. Can see all pages except permission page',
|
||||||
|
routes: routes.filter(i => i.path !== '/permission')// just a mock
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'visitor',
|
||||||
|
name: 'visitor',
|
||||||
|
description: 'Just a visitor. Can only see the home page and the document page',
|
||||||
|
routes: [{
|
||||||
|
path: '',
|
||||||
|
redirect: 'dashboard',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'dashboard',
|
||||||
|
name: 'Dashboard',
|
||||||
|
meta: { title: 'dashboard', icon: 'dashboard' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default [
|
||||||
|
// mock get all routes form server
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/routes',
|
||||||
|
type: 'get',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: routes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// mock get all roles form server
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/roles',
|
||||||
|
type: 'get',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: roles
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// add role
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/role',
|
||||||
|
type: 'post',
|
||||||
|
response: {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
key: Mock.mock('@integer(300, 5000)')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// update role
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/role/[A-Za-z0-9]',
|
||||||
|
type: 'put',
|
||||||
|
response: {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
status: 'success'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// delete role
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/role/[A-Za-z0-9]',
|
||||||
|
type: 'delete',
|
||||||
|
response: {
|
||||||
|
code: 20000,
|
||||||
|
data: {
|
||||||
|
status: 'success'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
525
mock/role/routes.js
Normal file
@ -0,0 +1,525 @@
|
|||||||
|
// Just a mock data
|
||||||
|
|
||||||
|
export const constantRoutes = [
|
||||||
|
{
|
||||||
|
path: '/redirect',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
hidden: true,
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '/redirect/:path*',
|
||||||
|
component: 'views/redirect/index'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/login',
|
||||||
|
component: 'views/login/index',
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/auth-redirect',
|
||||||
|
component: 'views/login/auth-redirect',
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/404',
|
||||||
|
component: 'views/error-page/404',
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/401',
|
||||||
|
component: 'views/error-page/401',
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'dashboard',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'dashboard',
|
||||||
|
component: 'views/dashboard/index',
|
||||||
|
name: 'Dashboard',
|
||||||
|
meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/documentation',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/documentation/index',
|
||||||
|
name: 'Documentation',
|
||||||
|
meta: { title: 'Documentation', icon: 'documentation', affix: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/guide',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/guide/index',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/guide/index',
|
||||||
|
name: 'Guide',
|
||||||
|
meta: { title: 'Guide', icon: 'guide', noCache: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export const asyncRoutes = [
|
||||||
|
{
|
||||||
|
path: '/permission',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/permission/index',
|
||||||
|
alwaysShow: true,
|
||||||
|
meta: {
|
||||||
|
title: 'Permission',
|
||||||
|
icon: 'lock',
|
||||||
|
roles: ['admin', 'editor']
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'page',
|
||||||
|
component: 'views/permission/page',
|
||||||
|
name: 'PagePermission',
|
||||||
|
meta: {
|
||||||
|
title: 'Page Permission',
|
||||||
|
roles: ['admin']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'directive',
|
||||||
|
component: 'views/permission/directive',
|
||||||
|
name: 'DirectivePermission',
|
||||||
|
meta: {
|
||||||
|
title: 'Directive Permission'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'role',
|
||||||
|
component: 'views/permission/role',
|
||||||
|
name: 'RolePermission',
|
||||||
|
meta: {
|
||||||
|
title: 'Role Permission',
|
||||||
|
roles: ['admin']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/icon',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/icons/index',
|
||||||
|
name: 'Icons',
|
||||||
|
meta: { title: 'Icons', icon: 'icon', noCache: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/components',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
name: 'ComponentDemo',
|
||||||
|
meta: {
|
||||||
|
title: 'Components',
|
||||||
|
icon: 'component'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'tinymce',
|
||||||
|
component: 'views/components-demo/tinymce',
|
||||||
|
name: 'TinymceDemo',
|
||||||
|
meta: { title: 'Tinymce' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'markdown',
|
||||||
|
component: 'views/components-demo/markdown',
|
||||||
|
name: 'MarkdownDemo',
|
||||||
|
meta: { title: 'Markdown' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'json-editor',
|
||||||
|
component: 'views/components-demo/json-editor',
|
||||||
|
name: 'JsonEditorDemo',
|
||||||
|
meta: { title: 'Json Editor' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'split-pane',
|
||||||
|
component: 'views/components-demo/split-pane',
|
||||||
|
name: 'SplitpaneDemo',
|
||||||
|
meta: { title: 'SplitPane' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'avatar-upload',
|
||||||
|
component: 'views/components-demo/avatar-upload',
|
||||||
|
name: 'AvatarUploadDemo',
|
||||||
|
meta: { title: 'Avatar Upload' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'dropzone',
|
||||||
|
component: 'views/components-demo/dropzone',
|
||||||
|
name: 'DropzoneDemo',
|
||||||
|
meta: { title: 'Dropzone' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'sticky',
|
||||||
|
component: 'views/components-demo/sticky',
|
||||||
|
name: 'StickyDemo',
|
||||||
|
meta: { title: 'Sticky' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'count-to',
|
||||||
|
component: 'views/components-demo/count-to',
|
||||||
|
name: 'CountToDemo',
|
||||||
|
meta: { title: 'Count To' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'mixin',
|
||||||
|
component: 'views/components-demo/mixin',
|
||||||
|
name: 'ComponentMixinDemo',
|
||||||
|
meta: { title: 'componentMixin' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'back-to-top',
|
||||||
|
component: 'views/components-demo/back-to-top',
|
||||||
|
name: 'BackToTopDemo',
|
||||||
|
meta: { title: 'Back To Top' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'drag-dialog',
|
||||||
|
component: 'views/components-demo/drag-dialog',
|
||||||
|
name: 'DragDialogDemo',
|
||||||
|
meta: { title: 'Drag Dialog' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'drag-select',
|
||||||
|
component: 'views/components-demo/drag-select',
|
||||||
|
name: 'DragSelectDemo',
|
||||||
|
meta: { title: 'Drag Select' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'dnd-list',
|
||||||
|
component: 'views/components-demo/dnd-list',
|
||||||
|
name: 'DndListDemo',
|
||||||
|
meta: { title: 'Dnd List' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'drag-kanban',
|
||||||
|
component: 'views/components-demo/drag-kanban',
|
||||||
|
name: 'DragKanbanDemo',
|
||||||
|
meta: { title: 'Drag Kanban' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/charts',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
name: 'Charts',
|
||||||
|
meta: {
|
||||||
|
title: 'Charts',
|
||||||
|
icon: 'chart'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'keyboard',
|
||||||
|
component: 'views/charts/keyboard',
|
||||||
|
name: 'KeyboardChart',
|
||||||
|
meta: { title: 'Keyboard Chart', noCache: true }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'line',
|
||||||
|
component: 'views/charts/line',
|
||||||
|
name: 'LineChart',
|
||||||
|
meta: { title: 'Line Chart', noCache: true }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'mixchart',
|
||||||
|
component: 'views/charts/mixChart',
|
||||||
|
name: 'MixChart',
|
||||||
|
meta: { title: 'Mix Chart', noCache: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/nested',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/nested/menu1/menu1-1',
|
||||||
|
name: 'Nested',
|
||||||
|
meta: {
|
||||||
|
title: 'Nested',
|
||||||
|
icon: 'nested'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'menu1',
|
||||||
|
component: 'views/nested/menu1/index',
|
||||||
|
name: 'Menu1',
|
||||||
|
meta: { title: 'Menu1' },
|
||||||
|
redirect: '/nested/menu1/menu1-1',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'menu1-1',
|
||||||
|
component: 'views/nested/menu1/menu1-1',
|
||||||
|
name: 'Menu1-1',
|
||||||
|
meta: { title: 'Menu1-1' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'menu1-2',
|
||||||
|
component: 'views/nested/menu1/menu1-2',
|
||||||
|
name: 'Menu1-2',
|
||||||
|
redirect: '/nested/menu1/menu1-2/menu1-2-1',
|
||||||
|
meta: { title: 'Menu1-2' },
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'menu1-2-1',
|
||||||
|
component: 'views/nested/menu1/menu1-2/menu1-2-1',
|
||||||
|
name: 'Menu1-2-1',
|
||||||
|
meta: { title: 'Menu1-2-1' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'menu1-2-2',
|
||||||
|
component: 'views/nested/menu1/menu1-2/menu1-2-2',
|
||||||
|
name: 'Menu1-2-2',
|
||||||
|
meta: { title: 'Menu1-2-2' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'menu1-3',
|
||||||
|
component: 'views/nested/menu1/menu1-3',
|
||||||
|
name: 'Menu1-3',
|
||||||
|
meta: { title: 'Menu1-3' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'menu2',
|
||||||
|
name: 'Menu2',
|
||||||
|
component: 'views/nested/menu2/index',
|
||||||
|
meta: { title: 'Menu2' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/example',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/example/list',
|
||||||
|
name: 'Example',
|
||||||
|
meta: {
|
||||||
|
title: 'Example',
|
||||||
|
icon: 'example'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'create',
|
||||||
|
component: 'views/example/create',
|
||||||
|
name: 'CreateArticle',
|
||||||
|
meta: { title: 'Create Article', icon: 'edit' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'edit/:id(\\d+)',
|
||||||
|
component: 'views/example/edit',
|
||||||
|
name: 'EditArticle',
|
||||||
|
meta: { title: 'Edit Article', noCache: true },
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'list',
|
||||||
|
component: 'views/example/list',
|
||||||
|
name: 'ArticleList',
|
||||||
|
meta: { title: 'Article List', icon: 'list' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/tab',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/tab/index',
|
||||||
|
name: 'Tab',
|
||||||
|
meta: { title: 'Tab', icon: 'tab' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/error',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
name: 'ErrorPages',
|
||||||
|
meta: {
|
||||||
|
title: 'Error Pages',
|
||||||
|
icon: '404'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '401',
|
||||||
|
component: 'views/error-page/401',
|
||||||
|
name: 'Page401',
|
||||||
|
meta: { title: 'Page 401', noCache: true }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '404',
|
||||||
|
component: 'views/error-page/404',
|
||||||
|
name: 'Page404',
|
||||||
|
meta: { title: 'Page 404', noCache: true }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/error-log',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'log',
|
||||||
|
component: 'views/error-log/index',
|
||||||
|
name: 'ErrorLog',
|
||||||
|
meta: { title: 'Error Log', icon: 'bug' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/excel',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/excel/export-excel',
|
||||||
|
name: 'Excel',
|
||||||
|
meta: {
|
||||||
|
title: 'Excel',
|
||||||
|
icon: 'excel'
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'export-excel',
|
||||||
|
component: 'views/excel/export-excel',
|
||||||
|
name: 'ExportExcel',
|
||||||
|
meta: { title: 'Export Excel' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'export-selected-excel',
|
||||||
|
component: 'views/excel/select-excel',
|
||||||
|
name: 'SelectExcel',
|
||||||
|
meta: { title: 'Select Excel' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'export-merge-header',
|
||||||
|
component: 'views/excel/merge-header',
|
||||||
|
name: 'MergeHeader',
|
||||||
|
meta: { title: 'Merge Header' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'upload-excel',
|
||||||
|
component: 'views/excel/upload-excel',
|
||||||
|
name: 'UploadExcel',
|
||||||
|
meta: { title: 'Upload Excel' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/zip',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/zip/download',
|
||||||
|
alwaysShow: true,
|
||||||
|
meta: { title: 'Zip', icon: 'zip' },
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'download',
|
||||||
|
component: 'views/zip/index',
|
||||||
|
name: 'ExportZip',
|
||||||
|
meta: { title: 'Export Zip' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/pdf',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: '/pdf/index',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/pdf/index',
|
||||||
|
name: 'PDF',
|
||||||
|
meta: { title: 'PDF', icon: 'pdf' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/pdf/download',
|
||||||
|
component: 'views/pdf/download',
|
||||||
|
hidden: true
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/theme',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/theme/index',
|
||||||
|
name: 'Theme',
|
||||||
|
meta: { title: 'Theme', icon: 'theme' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/clipboard',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
redirect: 'noRedirect',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/clipboard/index',
|
||||||
|
name: 'ClipboardDemo',
|
||||||
|
meta: { title: 'Clipboard Demo', icon: 'clipboard' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: '/i18n',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'index',
|
||||||
|
component: 'views/i18n-demo/index',
|
||||||
|
name: 'I18n',
|
||||||
|
meta: { title: 'I18n', icon: 'international' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
path: 'external-link',
|
||||||
|
component: 'layout/Layout',
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: 'https://github.com/PanJiaChen/vue-element-admin',
|
||||||
|
meta: { title: 'External Link', icon: 'link' }
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
|
||||||
|
{ path: '*', redirect: '/404', hidden: true }
|
||||||
|
]
|
84
mock/user.js
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
|
||||||
|
const tokens = {
|
||||||
|
admin: {
|
||||||
|
token: 'admin-token'
|
||||||
|
},
|
||||||
|
editor: {
|
||||||
|
token: 'editor-token'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const users = {
|
||||||
|
'admin-token': {
|
||||||
|
roles: ['admin'],
|
||||||
|
introduction: 'I am a super administrator',
|
||||||
|
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
|
||||||
|
name: 'Super Admin'
|
||||||
|
},
|
||||||
|
'editor-token': {
|
||||||
|
roles: ['editor'],
|
||||||
|
introduction: 'I am an editor',
|
||||||
|
avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
|
||||||
|
name: 'Normal Editor'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default [
|
||||||
|
// user login
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/user/login',
|
||||||
|
type: 'post',
|
||||||
|
response: config => {
|
||||||
|
const { username } = config.body
|
||||||
|
const token = tokens[username]
|
||||||
|
|
||||||
|
// mock error
|
||||||
|
if (!token) {
|
||||||
|
return {
|
||||||
|
code: 60204,
|
||||||
|
message: 'Account and password are incorrect.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// get user info
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/user/info\.*',
|
||||||
|
type: 'get',
|
||||||
|
response: config => {
|
||||||
|
const { token } = config.query
|
||||||
|
const info = users[token]
|
||||||
|
|
||||||
|
// mock error
|
||||||
|
if (!info) {
|
||||||
|
return {
|
||||||
|
code: 50008,
|
||||||
|
message: 'Login failed, unable to get user details.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: info
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// user logout
|
||||||
|
{
|
||||||
|
url: '/vue-element-admin/user/logout',
|
||||||
|
type: 'post',
|
||||||
|
response: _ => {
|
||||||
|
return {
|
||||||
|
code: 20000,
|
||||||
|
data: 'success'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
19035
package-lock.json
generated
Normal file
129
package.json
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"name": "vue-element-admin",
|
||||||
|
"version": "4.2.1",
|
||||||
|
"description": "A magical vue admin. An out-of-box UI solution for enterprise applications. Newest development stack of vue. Lots of awesome features",
|
||||||
|
"author": "Pan <panfree23@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vue-cli-service serve",
|
||||||
|
"build:prod": "vue-cli-service build",
|
||||||
|
"build:stage": "vue-cli-service build --mode staging",
|
||||||
|
"preview": "node build/index.js --preview",
|
||||||
|
"lint": "eslint --ext .js,.vue src",
|
||||||
|
"test:unit": "jest --clearCache && vue-cli-service test:unit",
|
||||||
|
"test:ci": "npm run lint && npm run test:unit",
|
||||||
|
"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
|
||||||
|
"new": "plop"
|
||||||
|
},
|
||||||
|
"husky": {
|
||||||
|
"hooks": {
|
||||||
|
"pre-commit": "lint-staged"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"src/**/*.{js,vue}": [
|
||||||
|
"eslint --fix",
|
||||||
|
"git add"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"vue",
|
||||||
|
"admin",
|
||||||
|
"dashboard",
|
||||||
|
"element-ui",
|
||||||
|
"boilerplate",
|
||||||
|
"admin-template",
|
||||||
|
"management-system"
|
||||||
|
],
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/PanJiaChen/vue-element-admin/issues"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"axios": "0.18.1",
|
||||||
|
"clipboard": "2.0.4",
|
||||||
|
"codemirror": "5.45.0",
|
||||||
|
"desandro-matches-selector": "^2.0.2",
|
||||||
|
"driver.js": "0.9.5",
|
||||||
|
"dropzone": "5.5.1",
|
||||||
|
"echarts": "4.2.1",
|
||||||
|
"element-ui": "2.13.0",
|
||||||
|
"ev-emitter": "^2.1.0",
|
||||||
|
"file-saver": "2.0.1",
|
||||||
|
"fizzy-ui-utils": "^3.0.0",
|
||||||
|
"fuse.js": "3.4.4",
|
||||||
|
"get-size": "^2.0.3",
|
||||||
|
"js-cookie": "2.2.0",
|
||||||
|
"jsonlint": "1.6.3",
|
||||||
|
"jszip": "3.2.1",
|
||||||
|
"lodash": "^4.17.15",
|
||||||
|
"masonry-layout": "^4.2.2",
|
||||||
|
"moment": "^2.27.0",
|
||||||
|
"normalize.css": "7.0.0",
|
||||||
|
"nprogress": "0.2.0",
|
||||||
|
"outlayer": "^2.1.1",
|
||||||
|
"path-to-regexp": "2.4.0",
|
||||||
|
"raphael": "git+https://gitee.com/shihairong/raphael",
|
||||||
|
"screenfull": "4.2.0",
|
||||||
|
"script-loader": "0.7.2",
|
||||||
|
"showdown": "1.9.0",
|
||||||
|
"sortablejs": "1.8.4",
|
||||||
|
"viewerjs": "^1.6.1",
|
||||||
|
"vue": "2.6.10",
|
||||||
|
"vue-bus": "^1.2.1",
|
||||||
|
"vue-count-to": "1.0.13",
|
||||||
|
"vue-i18n": "^8.22.2",
|
||||||
|
"vue-perfect-scrollbar": "^0.2.1",
|
||||||
|
"vue-router": "3.0.2",
|
||||||
|
"vue-splitpane": "1.0.4",
|
||||||
|
"vuedraggable": "2.20.0",
|
||||||
|
"vuex": "3.1.0",
|
||||||
|
"write-excel-file": "^1.4.6",
|
||||||
|
"xlsx": "0.14.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@babel/core": "7.0.0",
|
||||||
|
"@babel/plugin-transform-runtime": "^7.12.10",
|
||||||
|
"@babel/preset-env": "^7.12.11",
|
||||||
|
"@babel/register": "7.0.0",
|
||||||
|
"@babel/runtime-corejs3": "^7.12.5",
|
||||||
|
"@vue/cli-plugin-babel": "3.5.3",
|
||||||
|
"@vue/cli-plugin-eslint": "^3.9.1",
|
||||||
|
"@vue/cli-plugin-unit-jest": "3.5.3",
|
||||||
|
"@vue/cli-service": "3.5.3",
|
||||||
|
"@vue/test-utils": "1.0.0-beta.29",
|
||||||
|
"autoprefixer": "^9.5.1",
|
||||||
|
"babel-core": "7.0.0-bridge.0",
|
||||||
|
"babel-eslint": "8.2.2",
|
||||||
|
"babel-jest": "23.6.0",
|
||||||
|
"chalk": "2.4.2",
|
||||||
|
"chokidar": "2.1.5",
|
||||||
|
"connect": "3.6.6",
|
||||||
|
"eslint": "5.15.3",
|
||||||
|
"eslint-plugin-vue": "5.2.2",
|
||||||
|
"html-webpack-plugin": "3.2.0",
|
||||||
|
"husky": "1.3.1",
|
||||||
|
"lint-staged": "8.1.5",
|
||||||
|
"mockjs": "1.0.1-beta3",
|
||||||
|
"plop": "2.3.0",
|
||||||
|
"runjs": "^4.3.2",
|
||||||
|
"sass": "^1.26.10",
|
||||||
|
"sass-loader": "^7.1.0",
|
||||||
|
"script-ext-html-webpack-plugin": "2.1.3",
|
||||||
|
"serve-static": "^1.13.2",
|
||||||
|
"svg-sprite-loader": "4.1.3",
|
||||||
|
"svgo": "1.2.0",
|
||||||
|
"vue-template-compiler": "2.6.10"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=8.9",
|
||||||
|
"npm": ">= 3.0.0"
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
"> 1%",
|
||||||
|
"last 2 versions"
|
||||||
|
]
|
||||||
|
}
|
26
plop-templates/component/index.hbs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{{#if template}}
|
||||||
|
<template>
|
||||||
|
<div />
|
||||||
|
</template>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if script}}
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: '{{ properCase name }}',
|
||||||
|
props: {},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
created() {},
|
||||||
|
mounted() {},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if style}}
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{{/if}}
|
55
plop-templates/component/prompt.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
const { notEmpty } = require('../utils.js')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: 'generate vue component',
|
||||||
|
prompts: [{
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: 'component name please',
|
||||||
|
validate: notEmpty('name')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'checkbox',
|
||||||
|
name: 'blocks',
|
||||||
|
message: 'Blocks:',
|
||||||
|
choices: [{
|
||||||
|
name: '<template>',
|
||||||
|
value: 'template',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '<script>',
|
||||||
|
value: 'script',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'style',
|
||||||
|
value: 'style',
|
||||||
|
checked: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
validate(value) {
|
||||||
|
if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
|
||||||
|
return 'Components require at least a <script> or <template> tag.'
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
actions: data => {
|
||||||
|
const name = '{{properCase name}}'
|
||||||
|
const actions = [{
|
||||||
|
type: 'add',
|
||||||
|
path: `src/components/${name}/index.vue`,
|
||||||
|
templateFile: 'plop-templates/component/index.hbs',
|
||||||
|
data: {
|
||||||
|
name: name,
|
||||||
|
template: data.blocks.includes('template'),
|
||||||
|
script: data.blocks.includes('script'),
|
||||||
|
style: data.blocks.includes('style')
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
|
||||||
|
return actions
|
||||||
|
}
|
||||||
|
}
|
16
plop-templates/store/index.hbs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{{#if state}}
|
||||||
|
const state = {}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if mutations}}
|
||||||
|
const mutations = {}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if actions}}
|
||||||
|
const actions = {}
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
namespaced: true,
|
||||||
|
{{options}}
|
||||||
|
}
|
62
plop-templates/store/prompt.js
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
const { notEmpty } = require('../utils.js')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: 'generate store',
|
||||||
|
prompts: [{
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: 'store name please',
|
||||||
|
validate: notEmpty('name')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'checkbox',
|
||||||
|
name: 'blocks',
|
||||||
|
message: 'Blocks:',
|
||||||
|
choices: [{
|
||||||
|
name: 'state',
|
||||||
|
value: 'state',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'mutations',
|
||||||
|
value: 'mutations',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'actions',
|
||||||
|
value: 'actions',
|
||||||
|
checked: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
validate(value) {
|
||||||
|
if (!value.includes('state') || !value.includes('mutations')) {
|
||||||
|
return 'store require at least state and mutations'
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
actions(data) {
|
||||||
|
const name = '{{name}}'
|
||||||
|
const { blocks } = data
|
||||||
|
const options = ['state', 'mutations']
|
||||||
|
const joinFlag = `,
|
||||||
|
`
|
||||||
|
if (blocks.length === 3) {
|
||||||
|
options.push('actions')
|
||||||
|
}
|
||||||
|
|
||||||
|
const actions = [{
|
||||||
|
type: 'add',
|
||||||
|
path: `src/store/modules/${name}.js`,
|
||||||
|
templateFile: 'plop-templates/store/index.hbs',
|
||||||
|
data: {
|
||||||
|
options: options.join(joinFlag),
|
||||||
|
state: blocks.includes('state'),
|
||||||
|
mutations: blocks.includes('mutations'),
|
||||||
|
actions: blocks.includes('actions')
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
return actions
|
||||||
|
}
|
||||||
|
}
|
89
plop-templates/table/index.hbs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
{{#if template}}
|
||||||
|
<template>
|
||||||
|
<div class="{{ name }}-container">
|
||||||
|
<base-table :table-config="tableProps" :table-data="list" :is-loading="listLoading">
|
||||||
|
<method-btn slot="handleBtn" :method-list="tableBtn" @clickBtn="handleClick" />
|
||||||
|
</base-table>
|
||||||
|
<pagination v-show="total > listQuery.size" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if script}}
|
||||||
|
<script>
|
||||||
|
// edit here
|
||||||
|
const tableBtn = [{
|
||||||
|
type: 'edit',
|
||||||
|
btnName: 'btn.edit'
|
||||||
|
}, {
|
||||||
|
type: 'delete',
|
||||||
|
btnName: 'btn.delete'
|
||||||
|
}]
|
||||||
|
const tableProps = [{
|
||||||
|
prop: '',
|
||||||
|
label: '',
|
||||||
|
width: '',
|
||||||
|
filter: null,
|
||||||
|
subcomponent: null,
|
||||||
|
align: ''
|
||||||
|
}]
|
||||||
|
import BaseTable from '@/components/BaseTable'
|
||||||
|
// edit here
|
||||||
|
import { fetchList } from '@/api/article'
|
||||||
|
|
||||||
|
import Pagination from '@/components/Pagination'
|
||||||
|
import MethodBtn from '@/components/BaseTable/subcomponents/MethodBtn'
|
||||||
|
export default {
|
||||||
|
name: '{{ properCase name }}',
|
||||||
|
props: {},
|
||||||
|
components: { Pagination, BaseTable, MethodBtn },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
tableBtn,
|
||||||
|
tableProps,
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
listLoading: true,
|
||||||
|
listQuery: {
|
||||||
|
current: 1,
|
||||||
|
size: 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
mounted() {},
|
||||||
|
methods: {
|
||||||
|
handleClick(raw) {
|
||||||
|
|
||||||
|
},
|
||||||
|
getList() {
|
||||||
|
this.listLoading = true
|
||||||
|
// edit here
|
||||||
|
fetchList(this.listQuery).then(response => {
|
||||||
|
this.list = response.data.records
|
||||||
|
this.total = response.data.total
|
||||||
|
this.listLoading = false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if style}}
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.{{ name }}-container {
|
||||||
|
|
||||||
|
}
|
||||||
|
.edit-input {
|
||||||
|
padding-right: 100px;
|
||||||
|
}
|
||||||
|
.cancel-btn {
|
||||||
|
position: absolute;
|
||||||
|
right: 15px;
|
||||||
|
top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{{/if}}
|
55
plop-templates/table/prompt.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
const { notEmpty } = require('../utils.js')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: 'generate a table-view',
|
||||||
|
prompts: [{
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: 'input table name please',
|
||||||
|
validate: notEmpty('name')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'checkbox',
|
||||||
|
name: 'blocks',
|
||||||
|
message: 'Blocks:',
|
||||||
|
choices: [{
|
||||||
|
name: '<template>',
|
||||||
|
value: 'template',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '<script>',
|
||||||
|
value: 'script',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'style',
|
||||||
|
value: 'style',
|
||||||
|
checked: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
validate(value) {
|
||||||
|
if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
|
||||||
|
return 'View require at least a <script> or <template> tag.'
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
actions: data => {
|
||||||
|
const name = '{{name}}'
|
||||||
|
const actions = [{
|
||||||
|
type: 'add',
|
||||||
|
path: `src/views/${name}/index.vue`,
|
||||||
|
templateFile: 'plop-templates/table/index.hbs',
|
||||||
|
data: {
|
||||||
|
name: name,
|
||||||
|
template: data.blocks.includes('template'),
|
||||||
|
script: data.blocks.includes('script'),
|
||||||
|
style: data.blocks.includes('style')
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
|
||||||
|
return actions
|
||||||
|
}
|
||||||
|
}
|
9
plop-templates/utils.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
exports.notEmpty = name => {
|
||||||
|
return v => {
|
||||||
|
if (!v || v.trim === '') {
|
||||||
|
return `${name} is required`
|
||||||
|
} else {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
plop-templates/view/index.hbs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{{#if template}}
|
||||||
|
<template>
|
||||||
|
<div />
|
||||||
|
</template>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if script}}
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: '{{ properCase name }}',
|
||||||
|
props: {},
|
||||||
|
data() {
|
||||||
|
return {}
|
||||||
|
},
|
||||||
|
created() {},
|
||||||
|
mounted() {},
|
||||||
|
methods: {}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
|
{{#if style}}
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
{{/if}}
|
55
plop-templates/view/prompt.js
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
const { notEmpty } = require('../utils.js')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
description: 'generate a view',
|
||||||
|
prompts: [{
|
||||||
|
type: 'input',
|
||||||
|
name: 'name',
|
||||||
|
message: 'view name please',
|
||||||
|
validate: notEmpty('name')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'checkbox',
|
||||||
|
name: 'blocks',
|
||||||
|
message: 'Blocks:',
|
||||||
|
choices: [{
|
||||||
|
name: '<template>',
|
||||||
|
value: 'template',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '<script>',
|
||||||
|
value: 'script',
|
||||||
|
checked: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'style',
|
||||||
|
value: 'style',
|
||||||
|
checked: true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
validate(value) {
|
||||||
|
if (value.indexOf('script') === -1 && value.indexOf('template') === -1) {
|
||||||
|
return 'View require at least a <script> or <template> tag.'
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
actions: data => {
|
||||||
|
const name = '{{name}}'
|
||||||
|
const actions = [{
|
||||||
|
type: 'add',
|
||||||
|
path: `src/views/${name}/index.vue`,
|
||||||
|
templateFile: 'plop-templates/view/index.hbs',
|
||||||
|
data: {
|
||||||
|
name: name,
|
||||||
|
template: data.blocks.includes('template'),
|
||||||
|
script: data.blocks.includes('script'),
|
||||||
|
style: data.blocks.includes('style')
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
|
||||||
|
return actions
|
||||||
|
}
|
||||||
|
}
|
11
plopfile.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
const viewGenerator = require('./plop-templates/view/prompt')
|
||||||
|
const componentGenerator = require('./plop-templates/component/prompt')
|
||||||
|
const storeGenerator = require('./plop-templates/store/prompt.js')
|
||||||
|
const tableGenerator = require('./plop-templates/table/prompt.js')
|
||||||
|
|
||||||
|
module.exports = function(plop) {
|
||||||
|
plop.setGenerator('view', viewGenerator)
|
||||||
|
plop.setGenerator('component', componentGenerator)
|
||||||
|
plop.setGenerator('store', storeGenerator)
|
||||||
|
plop.setGenerator('tablepage', tableGenerator)
|
||||||
|
}
|
5
postcss.config.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
autoprefixer: {}
|
||||||
|
}
|
||||||
|
}
|
BIN
public/Lodap.zip
Normal file
BIN
public/favicon.ico
Normal file
After Width: | Height: | Size: 4.4 KiB |
BIN
public/google.exe
Normal file
22
public/index.bak.html
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: gtz
|
||||||
|
* @Date: 2021-01-27 10:07:42
|
||||||
|
* @LastEditors: gtz
|
||||||
|
* @LastEditTime: 2021-02-24 10:15:28
|
||||||
|
* @Description: file content
|
||||||
|
-->
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||||
|
<meta name="renderer" content="webkit">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||||
|
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||||
|
<title><%= webpackConfig.name %></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<!-- built files will be auto injected -->
|
||||||
|
</body>
|
||||||
|
</html>
|
20
public/index.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
|
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||||
|
<!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
|
||||||
|
<title><%= webpackConfig.name %></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
|
||||||
|
</noscript>
|
||||||
|
<script src="<%= BASE_URL %>v3d.js"></script>
|
||||||
|
<script src="<%= BASE_URL %>opentype.js"></script>
|
||||||
|
<div id="app"></div>
|
||||||
|
<!-- built files will be auto injected -->
|
||||||
|
</body>
|
||||||
|
</html>
|
118
public/opentype.js
Normal file
389
public/tinymce/langs/zh_CN.js
Normal file
@ -0,0 +1,389 @@
|
|||||||
|
tinymce.addI18n('zh_CN',{
|
||||||
|
"Redo": "\u91cd\u590d",
|
||||||
|
"Undo": "\u64a4\u6d88",
|
||||||
|
"Cut": "\u526a\u5207",
|
||||||
|
"Copy": "\u590d\u5236",
|
||||||
|
"Paste": "\u7c98\u8d34",
|
||||||
|
"Select all": "\u5168\u9009",
|
||||||
|
"New document": "\u65b0\u6587\u6863",
|
||||||
|
"Ok": "\u786e\u5b9a",
|
||||||
|
"Cancel": "\u53d6\u6d88",
|
||||||
|
"Visual aids": "\u7f51\u683c\u7ebf",
|
||||||
|
"Bold": "\u7c97\u4f53",
|
||||||
|
"Italic": "\u659c\u4f53",
|
||||||
|
"Underline": "\u4e0b\u5212\u7ebf",
|
||||||
|
"Strikethrough": "\u5220\u9664\u7ebf",
|
||||||
|
"Superscript": "\u4e0a\u6807",
|
||||||
|
"Subscript": "\u4e0b\u6807",
|
||||||
|
"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
|
||||||
|
"Align left": "\u5de6\u5bf9\u9f50",
|
||||||
|
"Align center": "\u5c45\u4e2d",
|
||||||
|
"Align right": "\u53f3\u5bf9\u9f50",
|
||||||
|
"Justify": "\u4e24\u7aef\u5bf9\u9f50",
|
||||||
|
"Bullet list": "\u9879\u76ee\u7b26\u53f7",
|
||||||
|
"Numbered list": "\u7f16\u53f7\u5217\u8868",
|
||||||
|
"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
|
||||||
|
"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
|
||||||
|
"Close": "\u5173\u95ed",
|
||||||
|
"Formats": "\u683c\u5f0f",
|
||||||
|
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002",
|
||||||
|
"Headers": "\u6807\u9898",
|
||||||
|
"Header 1": "\u6807\u98981",
|
||||||
|
"Header 2": "\u6807\u98982",
|
||||||
|
"Header 3": "\u6807\u98983",
|
||||||
|
"Header 4": "\u6807\u98984",
|
||||||
|
"Header 5": "\u6807\u98985",
|
||||||
|
"Header 6": "\u6807\u98986",
|
||||||
|
"Headings": "\u6807\u9898",
|
||||||
|
"Heading 1": "\u6807\u98981",
|
||||||
|
"Heading 2": "\u6807\u98982",
|
||||||
|
"Heading 3": "\u6807\u98983",
|
||||||
|
"Heading 4": "\u6807\u98984",
|
||||||
|
"Heading 5": "\u6807\u98985",
|
||||||
|
"Heading 6": "\u6807\u98986",
|
||||||
|
"Preformatted": "\u9884\u683c\u5f0f\u5316",
|
||||||
|
"Div": "Div\u533a\u5757",
|
||||||
|
"Pre": "\u9884\u683c\u5f0f\u6587\u672c",
|
||||||
|
"Code": "\u4ee3\u7801",
|
||||||
|
"Paragraph": "\u6bb5\u843d",
|
||||||
|
"Blockquote": "\u5f15\u7528",
|
||||||
|
"Inline": "\u6587\u672c",
|
||||||
|
"Blocks": "\u533a\u5757",
|
||||||
|
"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
|
||||||
|
"Fonts": "\u5b57\u4f53",
|
||||||
|
"Font Sizes": "\u5b57\u53f7",
|
||||||
|
"Class": "Class",
|
||||||
|
"Browse for an image": "\u6d4f\u89c8\u56fe\u50cf",
|
||||||
|
"OR": "\u6216",
|
||||||
|
"Drop an image here": "\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64",
|
||||||
|
"Upload": "\u4e0a\u4f20",
|
||||||
|
"Block": "\u5757",
|
||||||
|
"Align": "\u5bf9\u9f50",
|
||||||
|
"Default": "\u9ed8\u8ba4",
|
||||||
|
"Circle": "\u7a7a\u5fc3\u5706",
|
||||||
|
"Disc": "\u5b9e\u5fc3\u5706",
|
||||||
|
"Square": "\u65b9\u5757",
|
||||||
|
"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
|
||||||
|
"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
|
||||||
|
"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
|
||||||
|
"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
|
||||||
|
"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
|
||||||
|
"Anchor...": "\u951a\u70b9...",
|
||||||
|
"Name": "\u540d\u79f0",
|
||||||
|
"Id": "\u6807\u8bc6\u7b26",
|
||||||
|
"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.": "\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002",
|
||||||
|
"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
|
||||||
|
"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
|
||||||
|
"Special characters...": "\u7279\u6b8a\u5b57\u7b26...",
|
||||||
|
"Source code": "\u6e90\u4ee3\u7801",
|
||||||
|
"Insert\/Edit code sample": "\u63d2\u5165\/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b",
|
||||||
|
"Language": "\u8bed\u8a00",
|
||||||
|
"Code sample...": "\u793a\u4f8b\u4ee3\u7801...",
|
||||||
|
"Color Picker": "\u9009\u53d6\u989c\u8272",
|
||||||
|
"R": "R",
|
||||||
|
"G": "G",
|
||||||
|
"B": "B",
|
||||||
|
"Left to right": "\u4ece\u5de6\u5230\u53f3",
|
||||||
|
"Right to left": "\u4ece\u53f3\u5230\u5de6",
|
||||||
|
"Emoticons...": "\u8868\u60c5\u7b26\u53f7...",
|
||||||
|
"Metadata and Document Properties": "\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027",
|
||||||
|
"Title": "\u6807\u9898",
|
||||||
|
"Keywords": "\u5173\u952e\u8bcd",
|
||||||
|
"Description": "\u63cf\u8ff0",
|
||||||
|
"Robots": "\u673a\u5668\u4eba",
|
||||||
|
"Author": "\u4f5c\u8005",
|
||||||
|
"Encoding": "\u7f16\u7801",
|
||||||
|
"Fullscreen": "\u5168\u5c4f",
|
||||||
|
"Action": "\u64cd\u4f5c",
|
||||||
|
"Shortcut": "\u5feb\u6377\u952e",
|
||||||
|
"Help": "\u5e2e\u52a9",
|
||||||
|
"Address": "\u5730\u5740",
|
||||||
|
"Focus to menubar": "\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f",
|
||||||
|
"Focus to toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f",
|
||||||
|
"Focus to element path": "\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84",
|
||||||
|
"Focus to contextual toolbar": "\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355",
|
||||||
|
"Insert link (if link plugin activated)": "\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
|
||||||
|
"Save (if save plugin activated)": "\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
|
||||||
|
"Find (if searchreplace plugin activated)": "\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)",
|
||||||
|
"Plugins installed ({0}):": "\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):",
|
||||||
|
"Premium plugins:": "\u4f18\u79c0\u63d2\u4ef6\uff1a",
|
||||||
|
"Learn more...": "\u4e86\u89e3\u66f4\u591a...",
|
||||||
|
"You are using {0}": "\u4f60\u6b63\u5728\u4f7f\u7528 {0}",
|
||||||
|
"Plugins": "\u63d2\u4ef6",
|
||||||
|
"Handy Shortcuts": "\u5feb\u6377\u952e",
|
||||||
|
"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
|
||||||
|
"Insert\/edit image": "\u63d2\u5165\/\u7f16\u8f91\u56fe\u7247",
|
||||||
|
"Image description": "\u56fe\u7247\u63cf\u8ff0",
|
||||||
|
"Source": "\u5730\u5740",
|
||||||
|
"Dimensions": "\u5927\u5c0f",
|
||||||
|
"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
|
||||||
|
"General": "\u666e\u901a",
|
||||||
|
"Advanced": "\u9ad8\u7ea7",
|
||||||
|
"Style": "\u6837\u5f0f",
|
||||||
|
"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
|
||||||
|
"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
|
||||||
|
"Border": "\u8fb9\u6846",
|
||||||
|
"Insert image": "\u63d2\u5165\u56fe\u7247",
|
||||||
|
"Image...": "\u56fe\u7247...",
|
||||||
|
"Image list": "\u56fe\u7247\u5217\u8868",
|
||||||
|
"Rotate counterclockwise": "\u9006\u65f6\u9488\u65cb\u8f6c",
|
||||||
|
"Rotate clockwise": "\u987a\u65f6\u9488\u65cb\u8f6c",
|
||||||
|
"Flip vertically": "\u5782\u76f4\u7ffb\u8f6c",
|
||||||
|
"Flip horizontally": "\u6c34\u5e73\u7ffb\u8f6c",
|
||||||
|
"Edit image": "\u7f16\u8f91\u56fe\u7247",
|
||||||
|
"Image options": "\u56fe\u7247\u9009\u9879",
|
||||||
|
"Zoom in": "\u653e\u5927",
|
||||||
|
"Zoom out": "\u7f29\u5c0f",
|
||||||
|
"Crop": "\u88c1\u526a",
|
||||||
|
"Resize": "\u8c03\u6574\u5927\u5c0f",
|
||||||
|
"Orientation": "\u65b9\u5411",
|
||||||
|
"Brightness": "\u4eae\u5ea6",
|
||||||
|
"Sharpen": "\u9510\u5316",
|
||||||
|
"Contrast": "\u5bf9\u6bd4\u5ea6",
|
||||||
|
"Color levels": "\u989c\u8272\u5c42\u6b21",
|
||||||
|
"Gamma": "\u4f3d\u9a6c\u503c",
|
||||||
|
"Invert": "\u53cd\u8f6c",
|
||||||
|
"Apply": "\u5e94\u7528",
|
||||||
|
"Back": "\u540e\u9000",
|
||||||
|
"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
|
||||||
|
"Date\/time": "\u65e5\u671f\/\u65f6\u95f4",
|
||||||
|
"Insert\/Edit Link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
|
||||||
|
"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
|
||||||
|
"Text to display": "\u663e\u793a\u6587\u5b57",
|
||||||
|
"Url": "\u5730\u5740",
|
||||||
|
"Open link in...": "\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...",
|
||||||
|
"Current window": "\u5f53\u524d\u7a97\u53e3",
|
||||||
|
"None": "\u65e0",
|
||||||
|
"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
|
||||||
|
"Remove link": "\u5220\u9664\u94fe\u63a5",
|
||||||
|
"Anchors": "\u951a\u70b9",
|
||||||
|
"Link...": "\u94fe\u63a5...",
|
||||||
|
"Paste or type a link": "\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5",
|
||||||
|
"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f",
|
||||||
|
"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp:\/\/:\u524d\u7f00\u5417\uff1f",
|
||||||
|
"Link list": "\u94fe\u63a5\u5217\u8868",
|
||||||
|
"Insert video": "\u63d2\u5165\u89c6\u9891",
|
||||||
|
"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
|
||||||
|
"Insert\/edit media": "\u63d2\u5165\/\u7f16\u8f91\u5a92\u4f53",
|
||||||
|
"Alternative source": "\u955c\u50cf",
|
||||||
|
"Alternative source URL": "\u66ff\u4ee3\u6765\u6e90\u7f51\u5740",
|
||||||
|
"Media poster (Image URL)": "\u5c01\u9762(\u56fe\u7247\u5730\u5740)",
|
||||||
|
"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
|
||||||
|
"Embed": "\u5185\u5d4c",
|
||||||
|
"Media...": "\u591a\u5a92\u4f53...",
|
||||||
|
"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
|
||||||
|
"Page break": "\u5206\u9875\u7b26",
|
||||||
|
"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
|
||||||
|
"Preview": "\u9884\u89c8",
|
||||||
|
"Print...": "\u6253\u5370...",
|
||||||
|
"Save": "\u4fdd\u5b58",
|
||||||
|
"Find": "\u67e5\u627e",
|
||||||
|
"Replace with": "\u66ff\u6362\u4e3a",
|
||||||
|
"Replace": "\u66ff\u6362",
|
||||||
|
"Replace all": "\u5168\u90e8\u66ff\u6362",
|
||||||
|
"Previous": "\u4e0a\u4e00\u4e2a",
|
||||||
|
"Next": "\u4e0b\u4e00\u4e2a",
|
||||||
|
"Find and replace...": "\u67e5\u627e\u5e76\u66ff\u6362...",
|
||||||
|
"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
|
||||||
|
"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
|
||||||
|
"Find whole words only": "\u5168\u5b57\u5339\u914d",
|
||||||
|
"Spell check": "\u62fc\u5199\u68c0\u67e5",
|
||||||
|
"Ignore": "\u5ffd\u7565",
|
||||||
|
"Ignore all": "\u5168\u90e8\u5ffd\u7565",
|
||||||
|
"Finish": "\u5b8c\u6210",
|
||||||
|
"Add to Dictionary": "\u6dfb\u52a0\u5230\u5b57\u5178",
|
||||||
|
"Insert table": "\u63d2\u5165\u8868\u683c",
|
||||||
|
"Table properties": "\u8868\u683c\u5c5e\u6027",
|
||||||
|
"Delete table": "\u5220\u9664\u8868\u683c",
|
||||||
|
"Cell": "\u5355\u5143\u683c",
|
||||||
|
"Row": "\u884c",
|
||||||
|
"Column": "\u5217",
|
||||||
|
"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
|
||||||
|
"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
|
||||||
|
"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
|
||||||
|
"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
|
||||||
|
"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
|
||||||
|
"Delete row": "\u5220\u9664\u884c",
|
||||||
|
"Row properties": "\u884c\u5c5e\u6027",
|
||||||
|
"Cut row": "\u526a\u5207\u884c",
|
||||||
|
"Copy row": "\u590d\u5236\u884c",
|
||||||
|
"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
|
||||||
|
"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
|
||||||
|
"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
|
||||||
|
"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
|
||||||
|
"Delete column": "\u5220\u9664\u5217",
|
||||||
|
"Cols": "\u5217",
|
||||||
|
"Rows": "\u884c",
|
||||||
|
"Width": "\u5bbd",
|
||||||
|
"Height": "\u9ad8",
|
||||||
|
"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
|
||||||
|
"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
|
||||||
|
"Show caption": "\u663e\u793a\u6807\u9898",
|
||||||
|
"Left": "\u5de6\u5bf9\u9f50",
|
||||||
|
"Center": "\u5c45\u4e2d",
|
||||||
|
"Right": "\u53f3\u5bf9\u9f50",
|
||||||
|
"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
|
||||||
|
"Scope": "\u8303\u56f4",
|
||||||
|
"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
|
||||||
|
"H Align": "\u6c34\u5e73\u5bf9\u9f50",
|
||||||
|
"V Align": "\u5782\u76f4\u5bf9\u9f50",
|
||||||
|
"Top": "\u9876\u90e8\u5bf9\u9f50",
|
||||||
|
"Middle": "\u5782\u76f4\u5c45\u4e2d",
|
||||||
|
"Bottom": "\u5e95\u90e8\u5bf9\u9f50",
|
||||||
|
"Header cell": "\u8868\u5934\u5355\u5143\u683c",
|
||||||
|
"Row group": "\u884c\u7ec4",
|
||||||
|
"Column group": "\u5217\u7ec4",
|
||||||
|
"Row type": "\u884c\u7c7b\u578b",
|
||||||
|
"Header": "\u8868\u5934",
|
||||||
|
"Body": "\u8868\u4f53",
|
||||||
|
"Footer": "\u8868\u5c3e",
|
||||||
|
"Border color": "\u8fb9\u6846\u989c\u8272",
|
||||||
|
"Insert template...": "\u63d2\u5165\u6a21\u677f...",
|
||||||
|
"Templates": "\u6a21\u677f",
|
||||||
|
"Template": "\u6a21\u677f",
|
||||||
|
"Text color": "\u6587\u5b57\u989c\u8272",
|
||||||
|
"Background color": "\u80cc\u666f\u8272",
|
||||||
|
"Custom...": "\u81ea\u5b9a\u4e49...",
|
||||||
|
"Custom color": "\u81ea\u5b9a\u4e49\u989c\u8272",
|
||||||
|
"No color": "\u65e0",
|
||||||
|
"Remove color": "\u5220\u9664\u989c\u8272",
|
||||||
|
"Table of Contents": "\u5185\u5bb9\u5217\u8868",
|
||||||
|
"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
|
||||||
|
"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
|
||||||
|
"Word count": "\u5b57\u6570",
|
||||||
|
"Words: {0}": "\u5b57\u6570\uff1a{0}",
|
||||||
|
"{0} words": "{0} \u5b57",
|
||||||
|
"File": "\u6587\u4ef6",
|
||||||
|
"Edit": "\u7f16\u8f91",
|
||||||
|
"Insert": "\u63d2\u5165",
|
||||||
|
"View": "\u89c6\u56fe",
|
||||||
|
"Format": "\u683c\u5f0f",
|
||||||
|
"Table": "\u8868\u683c",
|
||||||
|
"Tools": "\u5de5\u5177",
|
||||||
|
"Powered by {0}": "\u7531{0}\u9a71\u52a8",
|
||||||
|
"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
|
||||||
|
"Image title": "\u56fe\u7247\u6807\u9898",
|
||||||
|
"Border width": "\u8fb9\u6846\u5bbd\u5ea6",
|
||||||
|
"Border style": "\u8fb9\u6846\u6837\u5f0f",
|
||||||
|
"Error": "\u9519\u8bef",
|
||||||
|
"Warn": "\u6ce8\u610f",
|
||||||
|
"Valid": "\u6709\u6548",
|
||||||
|
"To open the popup, press Shift+Enter": "\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846",
|
||||||
|
"Rich Text Area. Press ALT-0 for help.": "\u7f16\u8f91\u533a. \u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9",
|
||||||
|
"System Font": "\u7cfb\u7edf\u5b57\u4f53",
|
||||||
|
"Failed to upload image: {0}": "\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}",
|
||||||
|
"Failed to load plugin: {0} from url {1}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} - {1}",
|
||||||
|
"Failed to load plugin url: {0}": "\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0}",
|
||||||
|
"Failed to initialize plugin: {0}": "\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}",
|
||||||
|
"example": "\u793a\u4f8b",
|
||||||
|
"Search": "\u67e5\u627e",
|
||||||
|
"All": "\u5168\u90e8",
|
||||||
|
"Currency": "\u8d27\u5e01",
|
||||||
|
"Text": "\u6587\u672c",
|
||||||
|
"Quotations": "\u5f15\u7528",
|
||||||
|
"Mathematical": "\u6570\u5b66\u8fd0\u7b97\u7b26",
|
||||||
|
"Extended Latin": "\u62c9\u4e01\u8bed\u6269\u5145",
|
||||||
|
"Symbols": "\u7b26\u53f7",
|
||||||
|
"Arrows": "\u7bad\u5934",
|
||||||
|
"User Defined": "\u81ea\u5b9a\u4e49",
|
||||||
|
"dollar sign": "\u7f8e\u5143",
|
||||||
|
"currency sign": "\u8d27\u5e01",
|
||||||
|
"euro-currency sign": "\u6b27\u5143",
|
||||||
|
"colon sign": "\u5192\u53f7",
|
||||||
|
"cruzeiro sign": "\u514b\u9c81\u8d5b\u7f57\u5e01",
|
||||||
|
"french franc sign": "\u6cd5\u90ce",
|
||||||
|
"lira sign": "\u91cc\u62c9",
|
||||||
|
"mill sign": "\u5bc6\u5c14",
|
||||||
|
"naira sign": "\u5948\u62c9",
|
||||||
|
"peseta sign": "\u6bd4\u585e\u5854",
|
||||||
|
"rupee sign": "\u5362\u6bd4",
|
||||||
|
"won sign": "\u97e9\u5143",
|
||||||
|
"new sheqel sign": "\u65b0\u8c22\u514b\u5c14",
|
||||||
|
"dong sign": "\u8d8a\u5357\u76fe",
|
||||||
|
"kip sign": "\u8001\u631d\u57fa\u666e",
|
||||||
|
"tugrik sign": "\u56fe\u683c\u91cc\u514b",
|
||||||
|
"drachma sign": "\u5fb7\u62c9\u514b\u9a6c",
|
||||||
|
"german penny symbol": "\u5fb7\u56fd\u4fbf\u58eb",
|
||||||
|
"peso sign": "\u6bd4\u7d22",
|
||||||
|
"guarani sign": "\u74dc\u62c9\u5c3c",
|
||||||
|
"austral sign": "\u6fb3\u5143",
|
||||||
|
"hryvnia sign": "\u683c\u91cc\u592b\u5c3c\u4e9a",
|
||||||
|
"cedi sign": "\u585e\u5730",
|
||||||
|
"livre tournois sign": "\u91cc\u5f17\u5f17\u5c14",
|
||||||
|
"spesmilo sign": "\u4e00\u5343spesoj\u7684\u8d27\u5e01\u7b26\u53f7\uff0c\u8be5\u8d27\u5e01\u672a\u4f7f\u7528",
|
||||||
|
"tenge sign": "\u575a\u6208",
|
||||||
|
"indian rupee sign": "\u5370\u5ea6\u5362\u6bd4",
|
||||||
|
"turkish lira sign": "\u571f\u8033\u5176\u91cc\u62c9",
|
||||||
|
"nordic mark sign": "\u5317\u6b27\u9a6c\u514b",
|
||||||
|
"manat sign": "\u9a6c\u7eb3\u7279",
|
||||||
|
"ruble sign": "\u5362\u5e03",
|
||||||
|
"yen character": "\u65e5\u5143",
|
||||||
|
"yuan character": "\u4eba\u6c11\u5e01\u5143",
|
||||||
|
"yuan character, in hong kong and taiwan": "\u5143\uff08\u7e41\u4f53\uff09",
|
||||||
|
"yen\/yuan character variant one": "\u5143\uff08\u5927\u5199\uff09",
|
||||||
|
"Loading emoticons...": "\u52a0\u8f7d\u989c\u6587\u5b57...",
|
||||||
|
"Could not load emoticons": "\u4e0d\u80fd\u52a0\u8f7d\u989c\u6587\u5b57",
|
||||||
|
"People": "\u4eba\u7c7b",
|
||||||
|
"Animals and Nature": "\u52a8\u7269\u548c\u81ea\u7136",
|
||||||
|
"Food and Drink": "\u98df\u7269\u548c\u996e\u54c1",
|
||||||
|
"Activity": "\u6d3b\u52a8",
|
||||||
|
"Travel and Places": "\u65c5\u6e38\u548c\u5730\u70b9",
|
||||||
|
"Objects": "\u7269\u4ef6",
|
||||||
|
"Flags": "\u65d7\u5e1c",
|
||||||
|
"Characters": "\u5b57\u6570",
|
||||||
|
"Characters (no spaces)": "\u5b57\u6570\uff08\u4e0d\u542b\u7a7a\u683c\uff09",
|
||||||
|
"Error: Form submit field collision.": "\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81.",
|
||||||
|
"Error: No form element found.": "\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6.",
|
||||||
|
"Update": "\u66f4\u65b0",
|
||||||
|
"Color swatch": "\u989c\u8272\u6837\u672c",
|
||||||
|
"Turquoise": "\u9752\u7eff\u8272",
|
||||||
|
"Green": "\u7eff\u8272",
|
||||||
|
"Blue": "\u84dd\u8272",
|
||||||
|
"Purple": "\u7d2b\u8272",
|
||||||
|
"Navy Blue": "\u6d77\u519b\u84dd",
|
||||||
|
"Dark Turquoise": "\u6df1\u84dd\u7eff\u8272",
|
||||||
|
"Dark Green": "\u6697\u7eff\u8272",
|
||||||
|
"Medium Blue": "\u4e2d\u84dd\u8272",
|
||||||
|
"Medium Purple": "\u4e2d\u7d2b\u8272",
|
||||||
|
"Midnight Blue": "\u6df1\u84dd\u8272",
|
||||||
|
"Yellow": "\u9ec4\u8272",
|
||||||
|
"Orange": "\u6a59\u8272",
|
||||||
|
"Red": "\u7ea2\u8272",
|
||||||
|
"Light Gray": "\u6d45\u7070\u8272",
|
||||||
|
"Gray": "\u7070\u8272",
|
||||||
|
"Dark Yellow": "\u6697\u9ec4\u8272",
|
||||||
|
"Dark Orange": "\u6697\u6a59\u8272",
|
||||||
|
"Dark Red": "\u6697\u7ea2\u8272",
|
||||||
|
"Medium Gray": "\u4e2d\u7070\u8272",
|
||||||
|
"Dark Gray": "\u6df1\u7070\u8272",
|
||||||
|
"Black": "\u9ed1\u8272",
|
||||||
|
"White": "\u767d\u8272",
|
||||||
|
"Switch to or from fullscreen mode": "\u5207\u6362\u5168\u5c4f\u6a21\u5f0f",
|
||||||
|
"Open help dialog": "\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846",
|
||||||
|
"history": "\u5386\u53f2",
|
||||||
|
"styles": "\u6837\u5f0f",
|
||||||
|
"formatting": "\u683c\u5f0f\u5316",
|
||||||
|
"alignment": "\u5bf9\u9f50",
|
||||||
|
"indentation": "\u7f29\u8fdb",
|
||||||
|
"permanent pen": "\u8bb0\u53f7\u7b14",
|
||||||
|
"comments": "\u5907\u6ce8",
|
||||||
|
"Anchor": "\u951a\u70b9",
|
||||||
|
"Special character": "\u7279\u6b8a\u7b26\u53f7",
|
||||||
|
"Code sample": "\u4ee3\u7801\u793a\u4f8b",
|
||||||
|
"Color": "\u989c\u8272",
|
||||||
|
"Emoticons": "\u8868\u60c5",
|
||||||
|
"Document properties": "\u6587\u6863\u5c5e\u6027",
|
||||||
|
"Image": "\u56fe\u7247",
|
||||||
|
"Insert link": "\u63d2\u5165\u94fe\u63a5",
|
||||||
|
"Target": "\u6253\u5f00\u65b9\u5f0f",
|
||||||
|
"Link": "\u94fe\u63a5",
|
||||||
|
"Poster": "\u5c01\u9762",
|
||||||
|
"Media": "\u5a92\u4f53",
|
||||||
|
"Print": "\u6253\u5370",
|
||||||
|
"Prev": "\u4e0a\u4e00\u4e2a",
|
||||||
|
"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
|
||||||
|
"Whole words": "\u5168\u5b57\u5339\u914d",
|
||||||
|
"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
|
||||||
|
"Caption": "\u6807\u9898",
|
||||||
|
"Insert template": "\u63d2\u5165\u6a21\u677f"
|
||||||
|
});
|
138
public/tinymce/plugins/codesample/css/prism.css
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
|
||||||
|
/**
|
||||||
|
* prism.js default theme for JavaScript, CSS and HTML
|
||||||
|
* Based on dabblet (http://dabblet.com)
|
||||||
|
* @author Lea Verou
|
||||||
|
*/
|
||||||
|
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
color: black;
|
||||||
|
text-shadow: 0 1px white;
|
||||||
|
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
white-space: pre;
|
||||||
|
word-spacing: normal;
|
||||||
|
word-break: normal;
|
||||||
|
word-wrap: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
|
||||||
|
-moz-tab-size: 4;
|
||||||
|
-o-tab-size: 4;
|
||||||
|
tab-size: 4;
|
||||||
|
|
||||||
|
-webkit-hyphens: none;
|
||||||
|
-moz-hyphens: none;
|
||||||
|
-ms-hyphens: none;
|
||||||
|
hyphens: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
|
||||||
|
code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
|
||||||
|
code[class*="language-"]::selection, code[class*="language-"] ::selection {
|
||||||
|
text-shadow: none;
|
||||||
|
background: #b3d4fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Code blocks */
|
||||||
|
pre[class*="language-"] {
|
||||||
|
padding: 1em;
|
||||||
|
margin: .5em 0;
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
:not(pre) > code[class*="language-"],
|
||||||
|
pre[class*="language-"] {
|
||||||
|
background: #f5f2f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inline code */
|
||||||
|
:not(pre) > code[class*="language-"] {
|
||||||
|
padding: .1em;
|
||||||
|
border-radius: .3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.comment,
|
||||||
|
.token.prolog,
|
||||||
|
.token.doctype,
|
||||||
|
.token.cdata {
|
||||||
|
color: slategray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.punctuation {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.namespace {
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.property,
|
||||||
|
.token.tag,
|
||||||
|
.token.boolean,
|
||||||
|
.token.number,
|
||||||
|
.token.constant,
|
||||||
|
.token.symbol,
|
||||||
|
.token.deleted {
|
||||||
|
color: #905;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.selector,
|
||||||
|
.token.attr-name,
|
||||||
|
.token.string,
|
||||||
|
.token.char,
|
||||||
|
.token.builtin,
|
||||||
|
.token.inserted {
|
||||||
|
color: #690;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.operator,
|
||||||
|
.token.entity,
|
||||||
|
.token.url,
|
||||||
|
.language-css .token.string,
|
||||||
|
.style .token.string {
|
||||||
|
color: #a67f59;
|
||||||
|
background: hsla(0, 0%, 100%, .5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.atrule,
|
||||||
|
.token.attr-value,
|
||||||
|
.token.keyword {
|
||||||
|
color: #07a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.function {
|
||||||
|
color: #DD4A68;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.regex,
|
||||||
|
.token.important,
|
||||||
|
.token.variable {
|
||||||
|
color: #e90;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.important,
|
||||||
|
.token.bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.token.italic {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.token.entity {
|
||||||
|
cursor: help;
|
||||||
|
}
|
||||||
|
|
1
public/tinymce/skins/lightgray/content.min.css
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;line-height:1.3;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.word-wrap{word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid rgba(208,2,27,0.5);cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#2276d2 !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #2276d2}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2276d2}.mce-content-body.mce-content-readonly *[contentEditable=true]:focus,.mce-content-body.mce-content-readonly *[contentEditable=true]:hover{outline:none}.mce-content-body *[data-mce-selected="inline-boundary"]{background:#bfe6ff}.mce-content-body .mce-item-anchor[data-mce-selected]{background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-content-body hr{cursor:default}.mce-content-body table{-webkit-nbsp-mode:normal}.ephox-snooker-resizer-bar{background-color:#2276d2;opacity:0}.ephox-snooker-resizer-cols{cursor:col-resize}.ephox-snooker-resizer-rows{cursor:row-resize}.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging{opacity:.2}
|
BIN
public/tinymce/skins/lightgray/fonts/tinymce.ttf
Normal file
BIN
public/tinymce/skins/lightgray/fonts/tinymce.woff
Normal file
1
public/tinymce/skins/lightgray/skin.min.css
vendored
Normal file
2
public/tinymce/tinymce.min.js
vendored
Normal file
BIN
public/tinymce/tinymce.ttf
Normal file
BIN
public/tinymce/tinymce.woff
Normal file
1
public/v3d.js
Normal file
BIN
public/v3dApp/ao_curv_height.png
Normal file
After Width: | Height: | Size: 43 KiB |
BIN
public/v3dApp/ao_curv_height_001.png
Normal file
After Width: | Height: | Size: 86 KiB |
BIN
public/v3dApp/ao_curv_height_002.png
Normal file
After Width: | Height: | Size: 349 KiB |
BIN
public/v3dApp/ao_curv_height_003.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
public/v3dApp/ao_curv_height_004.png
Normal file
After Width: | Height: | Size: 78 KiB |
BIN
public/v3dApp/ao_curv_height_005.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
public/v3dApp/ao_curv_height_006.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
public/v3dApp/ao_curv_height_007.png
Normal file
After Width: | Height: | Size: 193 KiB |
BIN
public/v3dApp/app.bin
Normal file
BIN
public/v3dApp/app.bin.xz
Normal file
BIN
public/v3dApp/app.blend
Normal file
BIN
public/v3dApp/app.blend1
Normal file
32
public/v3dApp/app.css
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* __V3D_TEMPLATE__ - template-based file; delete this line to prevent this file from being updated */
|
||||||
|
|
||||||
|
#v3d-container {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen-button {
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 5px;
|
||||||
|
width: 50px;
|
||||||
|
height: 50px;
|
||||||
|
cursor: pointer;
|
||||||
|
background-size: 100% 100%;
|
||||||
|
display: none;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen-open {
|
||||||
|
background-image: url('media/fullscreen_open.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
.fullscreen-close {
|
||||||
|
background-image: url('media/fullscreen_close.svg');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* removes tap blinking on ios devices */
|
||||||
|
* { -webkit-tap-highlight-color:rgba(0,0,0,0); }
|
1
public/v3dApp/app.gltf
Normal file
BIN
public/v3dApp/app.gltf.xz
Normal file
234
public/v3dApp/app.js
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
/* __V3D_TEMPLATE__ - template-based file; delete this line to prevent this file from being updated */
|
||||||
|
|
||||||
|
/* eslint-disable */
|
||||||
|
|
||||||
|
var CONTAINER_ID = 'v3d-container';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Path to prepend to request URLs for the scene .gltf file and the visual logic
|
||||||
|
* .js file.
|
||||||
|
*/
|
||||||
|
var REL_URL_PREFIX = 'v3dApp/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the visual logic .js and/or .xml file or not. The Puzzles Editor is
|
||||||
|
* currently not fully supported.
|
||||||
|
* See: https://www.soft8soft.com/docs/manual/en/programmers_guide/Integration-with-Reactjs-Vuejs.html#using_the_puzzles_editor
|
||||||
|
*/
|
||||||
|
var LOAD_LOGIC_FILES = true;
|
||||||
|
|
||||||
|
function createApp() {
|
||||||
|
|
||||||
|
var params = v3d.AppUtils.getPageParams();
|
||||||
|
|
||||||
|
var PUZZLES_DIR = '/puzzles/';
|
||||||
|
var logicURL = params.logic ? params.logic : '__LOGIC__visual_logic.js'.replace('__LOGIC__', REL_URL_PREFIX);
|
||||||
|
var sceneURL = params.load ? params.load : '__URL__app.gltf'.replace('__URL__', REL_URL_PREFIX);
|
||||||
|
if (!sceneURL) {
|
||||||
|
console.log('No scene URL specified');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// some puzzles can benefit from cache
|
||||||
|
v3d.Cache.enabled = true;
|
||||||
|
|
||||||
|
return new Promise(function(resolve) {
|
||||||
|
|
||||||
|
if (LOAD_LOGIC_FILES) {
|
||||||
|
if (v3d.AppUtils.isXML(logicURL)) {
|
||||||
|
var logicURLJS = logicURL.match(/(.*)\.xml$/)[1] + '.js';
|
||||||
|
new v3d.PuzzlesLoader().loadEditorWithLogic(PUZZLES_DIR, logicURLJS,
|
||||||
|
function() {
|
||||||
|
var initOptions = v3d.PL ? v3d.PL.execInitPuzzles({
|
||||||
|
container: CONTAINER_ID }).initOptions
|
||||||
|
: { useFullscreen: true };
|
||||||
|
var appInstance = loadScene(sceneURL, initOptions);
|
||||||
|
v3d.PE.viewportUseAppInstance(appInstance);
|
||||||
|
resolve(appInstance);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
} else if (v3d.AppUtils.isJS(logicURL)) {
|
||||||
|
new v3d.PuzzlesLoader().loadLogic(logicURL, function() {
|
||||||
|
var initOptions = v3d.PL ? v3d.PL.execInitPuzzles({
|
||||||
|
container: CONTAINER_ID }).initOptions
|
||||||
|
: { useFullscreen: true };
|
||||||
|
resolve(loadScene(sceneURL, initOptions));
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
resolve(loadScene(sceneURL, { useFullscreen: true }));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resolve(loadScene(sceneURL, { useFullscreen: true }));
|
||||||
|
}
|
||||||
|
|
||||||
|
}).catch(function(err) {
|
||||||
|
console.error(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadScene(sceneURL, initOptions) {
|
||||||
|
|
||||||
|
initOptions = initOptions || {};
|
||||||
|
|
||||||
|
var ctxSettings = {};
|
||||||
|
if (initOptions.useBkgTransp) ctxSettings.alpha = true;
|
||||||
|
if (initOptions.preserveDrawBuf) ctxSettings.preserveDrawingBuffer = true;
|
||||||
|
|
||||||
|
var preloader = initOptions.useCustomPreloader
|
||||||
|
? createCustomPreloader(initOptions.preloaderProgressCb,
|
||||||
|
initOptions.preloaderEndCb)
|
||||||
|
: new v3d.SimplePreloader({ container: CONTAINER_ID });
|
||||||
|
|
||||||
|
if (v3d.PE) {
|
||||||
|
puzzlesEditorPreparePreloader(preloader);
|
||||||
|
}
|
||||||
|
|
||||||
|
var app = new v3d.App(CONTAINER_ID, ctxSettings, preloader);
|
||||||
|
if (initOptions.useBkgTransp) {
|
||||||
|
app.clearBkgOnLoad = true;
|
||||||
|
app.renderer.setClearColor(0x000000, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// namespace for communicating with code generated by Puzzles
|
||||||
|
app.ExternalInterface = {};
|
||||||
|
prepareExternalInterface(app);
|
||||||
|
|
||||||
|
if (initOptions.preloaderStartCb) initOptions.preloaderStartCb();
|
||||||
|
if (initOptions.useFullscreen) {
|
||||||
|
initFullScreen();
|
||||||
|
} else {
|
||||||
|
var fsButton = document.getElementById('fullscreen_button');
|
||||||
|
if (fsButton) fsButton.style.display = 'none';
|
||||||
|
}
|
||||||
|
|
||||||
|
sceneURL = initOptions.useCompAssets ? sceneURL + '.xz' : sceneURL;
|
||||||
|
app.loadScene(sceneURL, function() {
|
||||||
|
app.enableControls();
|
||||||
|
app.run();
|
||||||
|
|
||||||
|
if (v3d.PE) v3d.PE.updateAppInstance(app);
|
||||||
|
if (v3d.PL) v3d.PL.init(app, initOptions);
|
||||||
|
|
||||||
|
runCode(app);
|
||||||
|
}, null, function() {
|
||||||
|
console.log('Can\'t load the scene ' + sceneURL);
|
||||||
|
});
|
||||||
|
|
||||||
|
return app;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCustomPreloader(updateCb, finishCb) {
|
||||||
|
function CustomPreloader() {
|
||||||
|
v3d.Preloader.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
CustomPreloader.prototype = Object.assign(Object.create(v3d.Preloader.prototype), {
|
||||||
|
onUpdate: function(percentage) {
|
||||||
|
v3d.Preloader.prototype.onUpdate.call(this, percentage);
|
||||||
|
if (updateCb) updateCb(percentage);
|
||||||
|
},
|
||||||
|
onFinish: function() {
|
||||||
|
v3d.Preloader.prototype.onFinish.call(this);
|
||||||
|
if (finishCb) finishCb();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return new CustomPreloader();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modify the app's preloader to track the loading process in the Puzzles Editor.
|
||||||
|
*/
|
||||||
|
function puzzlesEditorPreparePreloader(preloader) {
|
||||||
|
var _onUpdate = preloader.onUpdate.bind(preloader);
|
||||||
|
preloader.onUpdate = function(percentage) {
|
||||||
|
_onUpdate(percentage);
|
||||||
|
v3d.PE.loadingUpdateCb(percentage);
|
||||||
|
}
|
||||||
|
|
||||||
|
var _onFinish = preloader.onFinish.bind(preloader);
|
||||||
|
preloader.onFinish = function() {
|
||||||
|
_onFinish();
|
||||||
|
v3d.PE.loadingFinishCb();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initFullScreen() {
|
||||||
|
|
||||||
|
var fsButton = document.getElementById('fullscreen_button');
|
||||||
|
if (!fsButton) return;
|
||||||
|
|
||||||
|
var container = document.getElementById(CONTAINER_ID);
|
||||||
|
|
||||||
|
if (document.fullscreenEnabled ||
|
||||||
|
document.webkitFullscreenEnabled ||
|
||||||
|
document.mozFullScreenEnabled ||
|
||||||
|
document.msFullscreenEnabled)
|
||||||
|
fsButton.style.display = 'inline';
|
||||||
|
|
||||||
|
fsButton.addEventListener('click', function(event) {
|
||||||
|
event.stopPropagation();
|
||||||
|
if (document.fullscreenElement ||
|
||||||
|
document.webkitFullscreenElement ||
|
||||||
|
document.mozFullScreenElement ||
|
||||||
|
document.msFullscreenElement) {
|
||||||
|
exitFullscreen();
|
||||||
|
} else
|
||||||
|
requestFullscreen(container);
|
||||||
|
});
|
||||||
|
|
||||||
|
function changeFullscreen() {
|
||||||
|
if (document.fullscreenElement ||
|
||||||
|
document.webkitFullscreenElement ||
|
||||||
|
document.mozFullScreenElement ||
|
||||||
|
document.msFullscreenElement) {
|
||||||
|
fsButton.classList.remove('fullscreen-open');
|
||||||
|
fsButton.classList.add('fullscreen-close');
|
||||||
|
} else {
|
||||||
|
fsButton.classList.remove('fullscreen-close');
|
||||||
|
fsButton.classList.add('fullscreen-open');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('webkitfullscreenchange', changeFullscreen);
|
||||||
|
document.addEventListener('mozfullscreenchange', changeFullscreen);
|
||||||
|
document.addEventListener('msfullscreenchange', changeFullscreen);
|
||||||
|
document.addEventListener('fullscreenchange', changeFullscreen);
|
||||||
|
|
||||||
|
function requestFullscreen(elem) {
|
||||||
|
if (elem.requestFullscreen)
|
||||||
|
elem.requestFullscreen();
|
||||||
|
else if (elem.mozRequestFullScreen)
|
||||||
|
elem.mozRequestFullScreen();
|
||||||
|
else if (elem.webkitRequestFullscreen)
|
||||||
|
elem.webkitRequestFullscreen();
|
||||||
|
else if (elem.msRequestFullscreen)
|
||||||
|
elem.msRequestFullscreen();
|
||||||
|
}
|
||||||
|
|
||||||
|
function exitFullscreen() {
|
||||||
|
if (document.exitFullscreen)
|
||||||
|
document.exitFullscreen();
|
||||||
|
else if (document.mozCancelFullScreen)
|
||||||
|
document.mozCancelFullScreen();
|
||||||
|
else if (document.webkitExitFullscreen)
|
||||||
|
document.webkitExitFullscreen();
|
||||||
|
else if (document.msExitFullscreen)
|
||||||
|
document.msExitFullscreen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function prepareExternalInterface(app) {
|
||||||
|
// register functions in the app.ExternalInterface to call them from Puzzles, e.g:
|
||||||
|
// app.ExternalInterface.myJSFunction = function() {
|
||||||
|
// console.log('Hello, World!');
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function runCode(app) {
|
||||||
|
// add your code here, e.g. console.log('Hello, World!');
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
export { createApp, CONTAINER_ID };
|
BIN
public/v3dApp/bfont.woff
Normal file
BIN
public/v3dApp/color.png
Normal file
After Width: | Height: | Size: 154 B |
BIN
public/v3dApp/emission.png
Normal file
After Width: | Height: | Size: 69 B |
BIN
public/v3dApp/emission_001.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/v3dApp/emission_002.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
public/v3dApp/emission_003.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
public/v3dApp/emission_004.png
Normal file
After Width: | Height: | Size: 820 B |
BIN
public/v3dApp/emission_005.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
public/v3dApp/emission_006.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
public/v3dApp/emission_007.png
Normal file
After Width: | Height: | Size: 69 B |
BIN
public/v3dApp/emission_008.png
Normal file
After Width: | Height: | Size: 69 B |
BIN
public/v3dApp/environment.hdr
Normal file
BIN
public/v3dApp/environment.hdr.xz
Normal file
BIN
public/v3dApp/masks.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
public/v3dApp/masks_001.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
public/v3dApp/masks_002.png
Normal file
After Width: | Height: | Size: 5.8 KiB |
BIN
public/v3dApp/masks_003.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
public/v3dApp/masks_004.png
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
public/v3dApp/masks_005.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
public/v3dApp/masks_006.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
public/v3dApp/masks_007.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
public/v3dApp/masks_008.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
105
public/v3dApp/media/fullscreen_close.svg
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
width="62"
|
||||||
|
height="62"
|
||||||
|
viewBox="0 0 16.404167 16.404167"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2719">
|
||||||
|
<defs
|
||||||
|
id="defs2713">
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="rotate(-180,255.67833,614.731)"
|
||||||
|
xlink:href="#linearGradient2768"
|
||||||
|
id="linearGradient2673"
|
||||||
|
x1="501.88306"
|
||||||
|
y1="942.95502"
|
||||||
|
x2="508.08038"
|
||||||
|
y2="935.61182"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2768">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#414141;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop2764" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#767676;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop2766" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="translate(-493.24109,-653.06985)"
|
||||||
|
xlink:href="#linearGradient2648"
|
||||||
|
id="linearGradient2665"
|
||||||
|
x1="495.62714"
|
||||||
|
y1="948.00964"
|
||||||
|
x2="508.85629"
|
||||||
|
y2="934.78046"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2648">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop2644" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop2646" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB"
|
||||||
|
id="filter2688"
|
||||||
|
x="-0.12"
|
||||||
|
width="1.24"
|
||||||
|
y="-0.12"
|
||||||
|
height="1.24">
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="0.66145835"
|
||||||
|
id="feGaussianBlur2690" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<metadata
|
||||||
|
id="metadata2716">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-280.59582)">
|
||||||
|
<g
|
||||||
|
id="g2754"
|
||||||
|
transform="translate(-0.79853618,0.47271794)">
|
||||||
|
<rect
|
||||||
|
rx="0"
|
||||||
|
ry="1.376092"
|
||||||
|
y="281.7106"
|
||||||
|
x="2.3860359"
|
||||||
|
height="13.229167"
|
||||||
|
width="13.229167"
|
||||||
|
id="rect2614"
|
||||||
|
style="display:inline;opacity:1;fill:#000000;fill-opacity:0.53005461;fill-rule:nonzero;stroke:none;stroke-width:0.71784258;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;filter:url(#filter2688)" />
|
||||||
|
<path
|
||||||
|
id="rect2603"
|
||||||
|
d="M 3.7621171,281.7106 H 14.2391 c 0.762355,0 1.376092,0.61374 1.376092,1.37609 v 10.47699 c 0,0.76235 -0.613737,1.37609 -1.376092,1.37609 H 3.7621171 c -0.7623549,0 -1.3760919,-0.61374 -1.3760919,-1.37609 v -10.47699 c 0,-0.76235 0.613737,-1.37609 1.3760919,-1.37609 z"
|
||||||
|
style="display:inline;opacity:1;fill:url(#linearGradient2665);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.71784258;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill" />
|
||||||
|
<path
|
||||||
|
id="rect2605"
|
||||||
|
d="M 9.0089403,293.54618 H 4.4659401 c -0.39995,0 -0.72192,-0.32198 -0.72192,-0.72192 v -4.49623 c 0,-0.39994 0.50644,-0.7845 0.9865,-0.32421 0.48006,0.46029 4.2498102,4.07528 4.7127902,4.53146 0.46297,0.45619 0.15571,1.0109 -0.43437,1.0109 z"
|
||||||
|
style="display:inline;opacity:1;fill:url(#linearGradient2673);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
105
public/v3dApp/media/fullscreen_open.svg
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
width="62"
|
||||||
|
height="62"
|
||||||
|
viewBox="0 0 16.404167 16.404167"
|
||||||
|
version="1.1"
|
||||||
|
id="svg2719">
|
||||||
|
<defs
|
||||||
|
id="defs2713">
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="translate(-493.24109,-653.06985)"
|
||||||
|
xlink:href="#linearGradient2768"
|
||||||
|
id="linearGradient2673"
|
||||||
|
x1="501.88306"
|
||||||
|
y1="942.95502"
|
||||||
|
x2="508.08038"
|
||||||
|
y2="935.61182"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2768">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#414141;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop2764" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#767676;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop2766" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
gradientTransform="translate(-493.24109,-653.06985)"
|
||||||
|
xlink:href="#linearGradient2648"
|
||||||
|
id="linearGradient2665"
|
||||||
|
x1="495.62714"
|
||||||
|
y1="948.00964"
|
||||||
|
x2="508.85629"
|
||||||
|
y2="934.78046"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient2648">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ebebeb;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop2644" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop2646" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB"
|
||||||
|
id="filter2688"
|
||||||
|
x="-0.12"
|
||||||
|
width="1.24"
|
||||||
|
y="-0.12"
|
||||||
|
height="1.24">
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="0.66145835"
|
||||||
|
id="feGaussianBlur2690" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<metadata
|
||||||
|
id="metadata2716">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-280.59582)">
|
||||||
|
<g
|
||||||
|
id="g2754"
|
||||||
|
transform="translate(-0.79853618,0.47271794)">
|
||||||
|
<rect
|
||||||
|
rx="0"
|
||||||
|
ry="1.376092"
|
||||||
|
y="281.7106"
|
||||||
|
x="2.3860359"
|
||||||
|
height="13.229167"
|
||||||
|
width="13.229167"
|
||||||
|
id="rect2614"
|
||||||
|
style="display:inline;opacity:1;fill:#000000;fill-opacity:0.53005461;fill-rule:nonzero;stroke:none;stroke-width:0.71784258;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill;filter:url(#filter2688)" />
|
||||||
|
<path
|
||||||
|
id="rect2603"
|
||||||
|
d="M 3.7621171,281.7106 H 14.2391 c 0.762355,0 1.376092,0.61374 1.376092,1.37609 v 10.47699 c 0,0.76235 -0.613737,1.37609 -1.376092,1.37609 H 3.7621171 c -0.7623549,0 -1.3760919,-0.61374 -1.3760919,-1.37609 v -10.47699 c 0,-0.76235 0.613737,-1.37609 1.3760919,-1.37609 z"
|
||||||
|
style="display:inline;opacity:1;fill:url(#linearGradient2665);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.71784258;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill" />
|
||||||
|
<path
|
||||||
|
id="rect2605"
|
||||||
|
d="m 9.1066291,282.84597 h 4.5429999 c 0.39995,0 0.72192,0.32198 0.72192,0.72192 v 4.49623 c 0,0.39994 -0.50644,0.7845 -0.9865,0.32421 -0.48006,-0.46029 -4.24981,-4.07528 -4.7127901,-4.53146 -0.46297,-0.45619 -0.1557099,-1.0109 0.4343702,-1.0109 z"
|
||||||
|
style="display:inline;opacity:1;fill:url(#linearGradient2673);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.80000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/v3dApp/msyhl.ttc
Normal file
BIN
public/v3dApp/normal.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
public/v3dApp/normal_001.png
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
public/v3dApp/normal_002.png
Normal file
After Width: | Height: | Size: 323 KiB |