├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── LICENSE
├── README.md
├── babel.config.js
├── package.json
├── public
├── babel-polyfill.v6_20_0.min.js
├── babel.min.js
├── bbg.jpg
├── fastclick.js
├── html2canvas.min.js
├── m15.png
├── onigasm.wasm
├── plupload.full.min.js
├── tinymce4.7.13
│ ├── langs
│ │ └── zh_CN.js
│ ├── plugins
│ │ ├── codesample
│ │ │ └── css
│ │ │ │ └── prism.css
│ │ ├── emoticons
│ │ │ └── img
│ │ │ │ ├── smiley-cool.gif
│ │ │ │ ├── smiley-cry.gif
│ │ │ │ ├── smiley-embarassed.gif
│ │ │ │ ├── smiley-foot-in-mouth.gif
│ │ │ │ ├── smiley-frown.gif
│ │ │ │ ├── smiley-innocent.gif
│ │ │ │ ├── smiley-kiss.gif
│ │ │ │ ├── smiley-laughing.gif
│ │ │ │ ├── smiley-money-mouth.gif
│ │ │ │ ├── smiley-sealed.gif
│ │ │ │ ├── smiley-smile.gif
│ │ │ │ ├── smiley-surprised.gif
│ │ │ │ ├── smiley-tongue-out.gif
│ │ │ │ ├── smiley-undecided.gif
│ │ │ │ ├── smiley-wink.gif
│ │ │ │ └── smiley-yell.gif
│ │ ├── help
│ │ │ └── img
│ │ │ │ └── logo.png
│ │ └── visualblocks
│ │ │ └── css
│ │ │ └── visualblocks.css
│ ├── skins
│ │ └── lightgray
│ │ │ ├── content.inline.min.css
│ │ │ ├── content.min.css
│ │ │ ├── content.mobile.min.css
│ │ │ ├── fonts
│ │ │ ├── tinymce-mobile.woff
│ │ │ ├── tinymce-small.eot
│ │ │ ├── tinymce-small.svg
│ │ │ ├── tinymce-small.ttf
│ │ │ ├── tinymce-small.woff
│ │ │ ├── tinymce.eot
│ │ │ ├── tinymce.svg
│ │ │ ├── tinymce.ttf
│ │ │ └── tinymce.woff
│ │ │ ├── img
│ │ │ ├── anchor.gif
│ │ │ ├── loader.gif
│ │ │ ├── object.gif
│ │ │ └── trans.gif
│ │ │ ├── skin.min.css
│ │ │ ├── skin.min.css.map
│ │ │ ├── skin.mobile.min.css
│ │ │ └── skin.mobile.min.css.map
│ └── tinymce.min.js
├── vue-router.v2_0_1.min.js
├── vue.runtime.v2_6_11.min.js
└── vuex.v2_0_0.min.js
├── src
├── .DS_Store
├── Client.vue
├── Editor.vue
├── assets
│ ├── data
│ │ ├── empty.json
│ │ └── script.json
│ ├── image
│ │ ├── bgblank.svg
│ │ ├── cursor.svg
│ │ ├── iphone-8.png
│ │ ├── iphone-x.png
│ │ └── ruler.png
│ ├── images
│ │ ├── dingding.jpg
│ │ └── logo.png
│ ├── js
│ │ ├── common.js
│ │ ├── date.js
│ │ ├── dom.js
│ │ ├── singleton-ema.js
│ │ └── vuelint.js
│ ├── layout
│ │ ├── default.json
│ │ ├── desktop.json
│ │ ├── develop.json
│ │ └── flutter.json
│ └── style
│ │ ├── animate.min.css
│ │ ├── base.styl
│ │ ├── cropper.css
│ │ ├── custome-animate.css
│ │ ├── element-variables.scss
│ │ ├── m-1px.styl
│ │ └── markdown.css
├── client.js
├── client.tpl
├── components
│ ├── AssetsTags.vue
│ ├── AssistLines.vue
│ ├── ContextMenu.vue
│ ├── Dialogs.vue
│ ├── Header.vue
│ ├── Node.vue
│ ├── PerviewNode.vue
│ ├── Selecter.vue
│ ├── SliderTool.vue
│ ├── Tips.vue
│ ├── UploadImage.vue
│ ├── attr
│ │ ├── Data.vue
│ │ ├── Event.vue
│ │ ├── Function.vue
│ │ ├── Resource.vue
│ │ ├── RichText.vue
│ │ └── index.js
│ ├── bughd.vue
│ ├── client
│ │ ├── FitImg.vue
│ │ ├── ImgViewer.vue
│ │ ├── Loading.vue
│ │ ├── Page.vue
│ │ └── Toast.vue
│ ├── code
│ │ ├── index.vue
│ │ ├── textmate
│ │ │ ├── index.js
│ │ │ ├── javascripttm.json
│ │ │ ├── loadwasm.js
│ │ │ └── monaco-theme-registry.js
│ │ └── theme
│ │ │ ├── OneMonokai-color-theme.json
│ │ │ ├── dark_defaults.json
│ │ │ ├── dark_plus.json
│ │ │ ├── dark_vs.json
│ │ │ ├── light_defaults.json
│ │ │ ├── light_plus.json
│ │ │ ├── light_vs.json
│ │ │ └── sublime.json
│ ├── dock
│ │ ├── BasePanel.js
│ │ ├── Dialog.vue
│ │ ├── Main.vue
│ │ ├── Panel.vue
│ │ ├── Resizer.vue
│ │ └── index.vue
│ ├── style
│ │ ├── Advanced.vue
│ │ ├── Align.vue
│ │ ├── Background.vue
│ │ ├── Base.vue
│ │ ├── Border.vue
│ │ ├── ColorPicker.vue
│ │ ├── Flutter.vue
│ │ ├── Layout.vue
│ │ ├── Num.vue
│ │ ├── Position.vue
│ │ ├── Radius.vue
│ │ ├── Size.vue
│ │ ├── Text.vue
│ │ └── index.vue
│ └── widget
│ │ ├── Attribute.vue
│ │ ├── CodePanel.vue
│ │ ├── CombinedComponents.vue
│ │ ├── ComponentInfo.vue
│ │ ├── ComponentTree.vue
│ │ ├── Components.vue
│ │ ├── PageInfo.vue
│ │ ├── PageTemplate.vue
│ │ ├── Scene.vue
│ │ ├── ScriptEditor.vue
│ │ ├── Shop.vue
│ │ ├── animate
│ │ ├── AnimatePicker.vue
│ │ ├── Cell.vue
│ │ ├── LayerNode.vue
│ │ ├── TimeLineNode.vue
│ │ └── index.vue
│ │ └── index.js
├── config
│ ├── default.js
│ ├── index.js
│ ├── local.js
│ └── production.js
├── dialog
│ ├── d-Preview.vue
│ ├── d-crop.vue
│ ├── d-editScript.vue
│ ├── d-nodejson.vue
│ ├── d-psd.vue
│ ├── d-resourceSelect.vue
│ └── d-saveCombinedComponent.vue
├── editor.js
├── editor.tpl
├── extend
│ ├── BaseComponent.js
│ ├── BaseDialog.js
│ ├── BaseNode.js
│ ├── BasePage.js
│ ├── ESlog.js
│ ├── HistoryCache.js
│ ├── RouterMap.js
│ ├── Server.js
│ ├── UploadImg.js
│ ├── Util.js
│ ├── client
│ │ ├── filters.js
│ │ ├── index.js
│ │ └── mixin.js
│ ├── componentLoader.js
│ ├── emitter.js
│ ├── fetch.js
│ └── filter.js
├── store
│ ├── actions.js
│ ├── getters.js
│ ├── index.js
│ ├── metadata.js
│ └── mutations.js
└── transitions
│ └── collapse-transition.js
├── tsconfig.json
├── vue.config.js
└── yarn.lock
/.eslintignore:
--------------------------------------------------------------------------------
1 | src/assets/**/*.js
2 | public/
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | parserOptions: {
4 | parser: "babel-eslint",
5 | sourceType: 'module',
6 | allowImportExportEverywhere: true
7 | },
8 | env: {
9 | browser: true,
10 | node: true
11 | },
12 | extends: [
13 | 'plugin:vue/essential',
14 | 'standard'
15 | ],
16 | plugins: [
17 | 'vue'
18 | ],
19 | 'rules': {
20 | "eol-last": 0,
21 | "vue/no-async-in-computed-properties": 0,
22 | "vue/no-side-effects-in-computed-properties": 0,
23 | "vue/no-side-effects-in-computed-properties": 0,
24 | "vue/valid-v-for": 0,
25 | "no-multiple-empty-lines": 0,
26 | "space-before-function-paren": 0,
27 | "no-return-await": 0,
28 | "vue/no-unused-vars": 0,
29 | "object-curly-spacing": 0,
30 | "no-proto": 0,
31 | "no-new": 0,
32 | "no-extra-boolean-cast": 0,
33 | "no-mixed-operators": 0,
34 | "no-eval": 0,
35 | // allow paren-less arrow functions
36 | 'arrow-parens': 0,
37 | 'no-useless-escape': 0,
38 | 'no-sparse-arrays': 0,
39 | // no-fallthrough
40 | 'no-fallthrough': 0,
41 | // allow debugger during development
42 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
43 | "eqeqeq": 0, //必须使用全等
44 | "no-extend-native": 0,
45 | "no-multi-spaces": 0,
46 | "indent": 0,
47 | "comma-dangle": [2, "only-multiline"] //定义数组或对象最后多余的逗号
48 | }
49 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.log
2 | .cache
3 | .DS_Store
4 | .vscode/
5 | .idea/
6 | node_modules/
7 | dist/
8 | npm-debug.log
9 | npm-debug.log.*
10 | selenium-debug.log
11 | test/unit/coverage
12 | test/e2e/reports
13 | converage/
14 | ymm_build/
15 | yarn-error.log
16 | distzip/
17 | src/config/docker.js
18 | verify.md
19 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Full Truck Alliance
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | comments: true,
3 | presets: [
4 | ['@vue/app', {useBuiltIns: false}]
5 | ],
6 | plugins: [
7 | [
8 | 'import', {
9 | libraryName: "mint-ui",
10 | style: (name) => `${name}/style.css`,
11 | }
12 | ]
13 | ],
14 | }
15 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "gods-pen",
3 | "version": "1.0.0",
4 | "description": "gods-pen",
5 | "Copyright": "",
6 | "private": false,
7 | "keywords": [],
8 | "scripts": {
9 | "start": "npm run editor:dev & npm run client:dev",
10 | "editor:dev": "cross-env CODE_ENV=local PAGE=EDITOR vue-cli-service serve",
11 | "client:dev": "cross-env CODE_ENV=local PAGE=CLIENT vue-cli-service serve",
12 | "editor:build": "cross-env CODE_ENV=production PAGE=EDITOR vue-cli-service build",
13 | "client:build": "cross-env CODE_ENV=production PAGE=CLIENT vue-cli-service build",
14 | "editor:build-docker": "cross-env CODE_ENV=docker PAGE=EDITOR vue-cli-service build",
15 | "client:build-docker": "cross-env CODE_ENV=docker PAGE=CLIENT vue-cli-service build"
16 | },
17 | "license": "ISC",
18 | "dependencies": {
19 | "@types/node": "^10.12.3",
20 | "axios": "^0.18.0",
21 | "babel-polyfill": "*",
22 | "caniuse-lite": "^1.0.0",
23 | "clipboard": "^2.0.0",
24 | "cropperjs": "^1.5.6",
25 | "element-ui": "2.4.11",
26 | "inversify": "^5.0.1",
27 | "js-cookie": "^2.2.0",
28 | "loader-utils": "^1.1.0",
29 | "lodash": "^4.17.4",
30 | "marked": "^0.4.0",
31 | "mint-ui": "2.2.0",
32 | "monaco-editor": "0.15.2",
33 | "monaco-editor-webpack-plugin": "1.5.3",
34 | "onigasm": "^2.2.1",
35 | "oniguruma": "7.0.1",
36 | "qrcode": "^1.4.4",
37 | "rider": "^2.0.0",
38 | "vscode-textmate": "^4.0.1",
39 | "vue": "2.6.11",
40 | "vue-router": "2.4.0",
41 | "vuex": "^2.0.0"
42 | },
43 | "devDependencies": {
44 | "@vue/cli-plugin-babel": "^3.1.1",
45 | "@vue/cli-plugin-eslint": "^3.1.1",
46 | "@vue/cli-service": "^3.1.1",
47 | "babel-eslint": "^10.0.1",
48 | "babel-plugin-import": "1.11.0",
49 | "cross-env": "^5.2.0",
50 | "dotenv-webpack": "^1.5.7",
51 | "eslint": "5.8.0",
52 | "eslint-config-standard": "^12.0.0",
53 | "eslint-plugin-import": "^2.14.0",
54 | "eslint-plugin-node": "^8.0.0",
55 | "eslint-plugin-promise": "^4.0.1",
56 | "eslint-plugin-standard": "^4.0.0",
57 | "eslint-plugin-vue": "^5.0.0-0",
58 | "node-sass": "^4.10.0",
59 | "sass-loader": "^7.1.0",
60 | "stylus": "^0.54.5",
61 | "stylus-loader": "^3.0.2",
62 | "ts-loader": "^5.3.0",
63 | "typescript": "^3.1.6",
64 | "vue-template-compiler": "2.6.11"
65 | },
66 | "postcss": {
67 | "plugins": {
68 | "autoprefixer": {}
69 | }
70 | },
71 | "browserslist": [
72 | "> 1%",
73 | "last 2 versions",
74 | "not ie <= 8"
75 | ]
76 | }
77 |
--------------------------------------------------------------------------------
/public/bbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/bbg.jpg
--------------------------------------------------------------------------------
/public/m15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/m15.png
--------------------------------------------------------------------------------
/public/onigasm.wasm:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/onigasm.wasm
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/codesample/css/prism.css:
--------------------------------------------------------------------------------
1 | /* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
2 | /**
3 | * prism.js default theme for JavaScript, CSS and HTML
4 | * Based on dabblet (http://dabblet.com)
5 | * @author Lea Verou
6 | */
7 |
8 | code[class*="language-"],
9 | pre[class*="language-"] {
10 | color: black;
11 | text-shadow: 0 1px white;
12 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
13 | direction: ltr;
14 | text-align: left;
15 | white-space: pre;
16 | word-spacing: normal;
17 | word-break: normal;
18 | word-wrap: normal;
19 | line-height: 1.5;
20 |
21 | -moz-tab-size: 4;
22 | -o-tab-size: 4;
23 | tab-size: 4;
24 |
25 | -webkit-hyphens: none;
26 | -moz-hyphens: none;
27 | -ms-hyphens: none;
28 | hyphens: none;
29 | }
30 |
31 | pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
32 | code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
33 | text-shadow: none;
34 | background: #b3d4fc;
35 | }
36 |
37 | pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
38 | code[class*="language-"]::selection, code[class*="language-"] ::selection {
39 | text-shadow: none;
40 | background: #b3d4fc;
41 | }
42 |
43 | @media print {
44 | code[class*="language-"],
45 | pre[class*="language-"] {
46 | text-shadow: none;
47 | }
48 | }
49 |
50 | /* Code blocks */
51 | pre[class*="language-"] {
52 | padding: 1em;
53 | margin: .5em 0;
54 | overflow: auto;
55 | }
56 |
57 | :not(pre) > code[class*="language-"],
58 | pre[class*="language-"] {
59 | background: #f5f2f0;
60 | }
61 |
62 | /* Inline code */
63 | :not(pre) > code[class*="language-"] {
64 | padding: .1em;
65 | border-radius: .3em;
66 | }
67 |
68 | .token.comment,
69 | .token.prolog,
70 | .token.doctype,
71 | .token.cdata {
72 | color: slategray;
73 | }
74 |
75 | .token.punctuation {
76 | color: #999;
77 | }
78 |
79 | .namespace {
80 | opacity: .7;
81 | }
82 |
83 | .token.property,
84 | .token.tag,
85 | .token.boolean,
86 | .token.number,
87 | .token.constant,
88 | .token.symbol,
89 | .token.deleted {
90 | color: #905;
91 | }
92 |
93 | .token.selector,
94 | .token.attr-name,
95 | .token.string,
96 | .token.char,
97 | .token.builtin,
98 | .token.inserted {
99 | color: #690;
100 | }
101 |
102 | .token.operator,
103 | .token.entity,
104 | .token.url,
105 | .language-css .token.string,
106 | .style .token.string {
107 | color: #a67f59;
108 | background: hsla(0, 0%, 100%, .5);
109 | }
110 |
111 | .token.atrule,
112 | .token.attr-value,
113 | .token.keyword {
114 | color: #07a;
115 | }
116 |
117 | .token.function {
118 | color: #DD4A68;
119 | }
120 |
121 | .token.regex,
122 | .token.important,
123 | .token.variable {
124 | color: #e90;
125 | }
126 |
127 | .token.important,
128 | .token.bold {
129 | font-weight: bold;
130 | }
131 | .token.italic {
132 | font-style: italic;
133 | }
134 |
135 | .token.entity {
136 | cursor: help;
137 | }
138 |
139 |
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-cool.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-cool.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-cry.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-cry.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-embarassed.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-embarassed.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-foot-in-mouth.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-foot-in-mouth.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-frown.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-frown.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-innocent.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-innocent.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-kiss.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-kiss.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-laughing.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-laughing.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-money-mouth.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-money-mouth.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-sealed.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-sealed.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-smile.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-smile.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-surprised.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-surprised.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-tongue-out.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-tongue-out.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-undecided.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-undecided.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-wink.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-wink.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/emoticons/img/smiley-yell.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/emoticons/img/smiley-yell.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/plugins/help/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/plugins/help/img/logo.png
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/content.inline.min.css:
--------------------------------------------------------------------------------
1 | .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}.mce-content-body{line-height:1.3}
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/content.min.css:
--------------------------------------------------------------------------------
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}
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/content.mobile.min.css:
--------------------------------------------------------------------------------
1 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{position:absolute;display:inline-block;background-color:green;opacity:.5}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-mobile.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-mobile.woff
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.eot
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.ttf
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce-small.woff
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.eot
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.ttf
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/fonts/tinymce.woff
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/img/anchor.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/img/anchor.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/img/loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/img/loader.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/img/object.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/img/object.gif
--------------------------------------------------------------------------------
/public/tinymce4.7.13/skins/lightgray/img/trans.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/public/tinymce4.7.13/skins/lightgray/img/trans.gif
--------------------------------------------------------------------------------
/src/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/.DS_Store
--------------------------------------------------------------------------------
/src/Client.vue:
--------------------------------------------------------------------------------
1 |
2 |
Hi, there
" 32 | }, 33 | "script": [], 34 | "version": "1.1.5", 35 | "events": [], 36 | "url": "https://ymm-maliang.oss-cn-hangzhou.aliyuncs.com/truck/richtext/1.1.5/index.js" 37 | }], 38 | "script": [], 39 | "animate": [], 40 | "version": "1.0.2", 41 | "path": "https://ymm-maliang.oss-cn-hangzhou.aliyuncs.com/truck/emptyContainer/1.0.2/index.js", 42 | "events": [], 43 | "label": "root" 44 | } -------------------------------------------------------------------------------- /src/assets/data/script.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "name": "内部页面跳转", 3 | "content": "var node = {\n editorMethods: {\n projectJump: {\n label: '内部跳转',\n params: [{\n label: '跳转地址',\n desc: '项目相对地址',\n type: 'string',\n default: ''\n },{\n label: '参数',\n desc: 'query形式参数',\n type: 'object',\n default: {}\n }]\n }\n },\n methods:{\n projectJump:function(path,query){\n console.log(path,query)\n this.$router.push({\n path:path,\n query:query\n })\n }\n }\n}\nreturn node" 4 | }] -------------------------------------------------------------------------------- /src/assets/image/bgblank.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/image/cursor.svg: -------------------------------------------------------------------------------- 1 | yo -------------------------------------------------------------------------------- /src/assets/image/iphone-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/assets/image/iphone-8.png -------------------------------------------------------------------------------- /src/assets/image/iphone-x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/assets/image/iphone-x.png -------------------------------------------------------------------------------- /src/assets/image/ruler.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/assets/image/ruler.png -------------------------------------------------------------------------------- /src/assets/images/dingding.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/assets/images/dingding.jpg -------------------------------------------------------------------------------- /src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ymm-tech/gods-pen/c1c18ada8ff046b54f33030ebdabd92812eb2d11/src/assets/images/logo.png -------------------------------------------------------------------------------- /src/assets/js/date.js: -------------------------------------------------------------------------------- 1 | Date.prototype.Format = function (fmt) { // author: meizz 2 | var o = { 3 | 'M+': this.getMonth() + 1, // 月份 4 | 'd+': this.getDate(), // 日 5 | 'h+': this.getHours(), // 小时 6 | 'm+': this.getMinutes(), // 分 7 | 's+': this.getSeconds(), // 秒 8 | 'q+': Math.floor((this.getMonth() + 3) / 3), // 季度 9 | 'S': this.getMilliseconds() // 毫秒 10 | } 11 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)) 12 | for (var k in o) { 13 | if (new RegExp('(' + k + ')').test(fmt)) { 14 | fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) 15 | } 16 | } 17 | return fmt 18 | } 19 | 20 | -------------------------------------------------------------------------------- /src/assets/js/singleton-ema.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 事件管理器。负责页面和页面,组件和组件之间事件通知管理 3 | * */ 4 | var EventManager = function(){ 5 | 6 | var manager = { 7 | bind: function(type, fn) { 8 | if(type && typeof type === "string" && fn && fn.constructor && typeof fn === "function"){ 9 | 10 | var handlers = this.events[type]; 11 | if (!handlers) { 12 | handlers = this.events[type] = []; 13 | } 14 | 15 | var i = handlers.length; 16 | while(i--) { 17 | if(handlers[i] == fn) { 18 | return false; 19 | } 20 | } 21 | handlers.push(fn); 22 | return true; 23 | } 24 | return false; 25 | }, 26 | unbind: function(type, fn) { 27 | 28 | if(type && type.constructor && type.constructor == String) { 29 | 30 | if(!fn) { 31 | delete this.events[type]; 32 | return true; 33 | }else if(fn && typeof fn === "function"){ 34 | var handlers = this.events[type]; 35 | if(handlers && handlers.length) { 36 | var i = handlers.length; 37 | while(i--) { 38 | if(handlers[i] == fn) { 39 | handlers.splice(i,1); 40 | break; 41 | } 42 | } 43 | return true; 44 | } 45 | return false; 46 | } 47 | } 48 | return false; 49 | }, 50 | clear:function(){ 51 | var me = this; 52 | this.events = []; 53 | }, 54 | fire: function(type) { 55 | var handlers; 56 | if(type && typeof type === "string" && (handlers = this.events[type]) && handlers.length){ 57 | var fn; 58 | var argsArray = Array.prototype.slice.call(arguments,1); 59 | var i=0; 60 | while ((fn = handlers[i++])) { 61 | fn.apply(window, argsArray); 62 | } 63 | return true; 64 | } 65 | return false; 66 | }, 67 | count: function(type) { 68 | var handlers = this.events[type]; 69 | return handlers ? handlers.length : 0; 70 | }, 71 | getProxy: function() { 72 | return new DisposeableEventManagerProxy(this); 73 | } 74 | } 75 | manager.events = []; 76 | return manager 77 | }; 78 | function DisposeableEventManagerProxy(msgslot) { 79 | this.msgslot = msgslot; 80 | this.msgs = []; 81 | var fire = msgslot.fire; 82 | var async = msgslot.async; 83 | this.fire = function(){fire.apply(msgslot, arguments)}; 84 | this.async = function(){async.apply(msgslot, arguments)}; 85 | } 86 | DisposeableEventManagerProxy.prototype = { 87 | bind: function(type, fn) { 88 | var result = this.msgslot.bind(type, fn); 89 | if(result) { 90 | this.msgs.push([type,fn]); 91 | } 92 | return result; 93 | }, 94 | unbind: function(type, fn) { 95 | var msgslot = this.msgslot; 96 | var msgs = this.msgs; 97 | 98 | if(fn && typeof fn === "function") { 99 | var result = msgslot.unbind(type, fn); 100 | var i = msgs.length; 101 | while(--i >= 0){ 102 | if(msgs[i][0] == type && msgs[i][1] == fn) { 103 | msgs.splice(i,1); 104 | } 105 | } 106 | return result; 107 | } 108 | else{ 109 | var i = this.msgs.length; 110 | while(i--){ 111 | if(msgs[i][0] == type) { 112 | msgslot.unbind(type, msgs[i][1]) 113 | msgs.splice(i,1); 114 | } 115 | } 116 | return true; 117 | } 118 | }, 119 | dispose: function() { 120 | if(this.msgs == null) return; 121 | var msgs = this.msgs; 122 | var msgslot = this.msgslot; 123 | var i = msgs.length; 124 | while(i--){ 125 | msgslot.unbind(msgs[i][0], msgs[i][1]); 126 | } 127 | this.msgslot = null; 128 | this.msgs = null; 129 | } 130 | }; 131 | module.exports = EventManager(); -------------------------------------------------------------------------------- /src/assets/js/vuelint.js: -------------------------------------------------------------------------------- 1 | const lint = [{ 2 | label: 'silent' 3 | }, 4 | { 5 | label: 'optionMergeStrategies' 6 | }, 7 | { 8 | label: 'devtools' 9 | }, 10 | { 11 | label: 'errorHandler' 12 | }, 13 | { 14 | label: 'warnHandler' 15 | }, 16 | { 17 | label: 'ignoredElements' 18 | }, 19 | { 20 | label: 'keyCodes' 21 | }, 22 | { 23 | label: 'performance' 24 | }, 25 | { 26 | label: 'productionTip' 27 | }, 28 | { 29 | label: 'extend' 30 | }, 31 | { 32 | label: 'nextTick' 33 | }, 34 | { 35 | label: 'set' 36 | }, 37 | { 38 | label: 'delete' 39 | }, 40 | { 41 | label: 'directive' 42 | }, 43 | { 44 | label: 'filter' 45 | }, 46 | { 47 | label: 'component' 48 | }, 49 | { 50 | label: 'use' 51 | }, 52 | { 53 | label: 'mixin' 54 | }, 55 | { 56 | label: 'compile' 57 | }, 58 | { 59 | label: 'version' 60 | }, 61 | { 62 | label: 'data' 63 | }, 64 | { 65 | label: 'props' 66 | }, 67 | { 68 | label: 'propsData' 69 | }, 70 | { 71 | label: 'computed' 72 | }, 73 | { 74 | label: 'methods' 75 | }, 76 | { 77 | label: 'watch' 78 | }, 79 | { 80 | label: 'el' 81 | }, 82 | { 83 | label: 'template' 84 | }, 85 | { 86 | label: 'render' 87 | }, 88 | { 89 | label: 'renderError' 90 | }, 91 | { 92 | label: 'beforeCreate' 93 | }, 94 | { 95 | label: 'created' 96 | }, 97 | { 98 | label: 'beforeMount' 99 | }, 100 | { 101 | label: 'mounted' 102 | }, 103 | { 104 | label: 'beforeUpdate' 105 | }, 106 | { 107 | label: 'updated' 108 | }, 109 | { 110 | label: 'activated' 111 | }, 112 | { 113 | label: 'deactivated' 114 | }, 115 | { 116 | label: 'beforeDestroy' 117 | }, 118 | { 119 | label: 'destroyed' 120 | }, 121 | { 122 | label: 'directives' 123 | }, 124 | { 125 | label: 'filters' 126 | }, 127 | { 128 | label: 'components' 129 | }, 130 | { 131 | label: 'parent' 132 | }, 133 | { 134 | label: 'mixins' 135 | }, 136 | { 137 | label: 'extends' 138 | }, 139 | { 140 | label: 'provide' 141 | }, 142 | { 143 | label: 'inject' 144 | }, 145 | { 146 | label: 'name' 147 | }, 148 | { 149 | label: 'delimiters' 150 | }, 151 | { 152 | label: 'functional' 153 | }, 154 | { 155 | label: 'model' 156 | }, 157 | { 158 | label: 'inheritAttrs' 159 | }, 160 | { 161 | label: 'comments' 162 | }, 163 | { 164 | label: '$data' 165 | }, 166 | { 167 | label: '$props' 168 | }, 169 | { 170 | label: '$el' 171 | }, 172 | { 173 | label: '$options' 174 | }, 175 | { 176 | label: '$parent' 177 | }, 178 | { 179 | label: '$root' 180 | }, 181 | { 182 | label: '$children' 183 | }, 184 | { 185 | label: '$slots' 186 | }, 187 | { 188 | label: '$scopedSlots' 189 | }, 190 | { 191 | label: '$refs' 192 | }, 193 | { 194 | label: '$isServer' 195 | }, 196 | { 197 | label: '$attrs' 198 | }, 199 | { 200 | label: '$listeners' 201 | }, 202 | { 203 | label: '$watch' 204 | }, 205 | { 206 | label: '$set' 207 | }, 208 | { 209 | label: '$delete' 210 | }, 211 | { 212 | label: '$on' 213 | }, 214 | { 215 | label: '$once' 216 | }, 217 | { 218 | label: '$off' 219 | }, 220 | { 221 | label: '$emit' 222 | }, 223 | { 224 | label: '$mount' 225 | }, 226 | { 227 | label: '$forceUpdate' 228 | }, 229 | { 230 | label: '$nextTick' 231 | }, 232 | { 233 | label: '$destroy' 234 | }, 235 | { 236 | label: 'v-text' 237 | }, 238 | { 239 | label: 'v-html' 240 | }, 241 | { 242 | label: 'v-show' 243 | }, 244 | { 245 | label: 'v-if' 246 | }, 247 | { 248 | label: 'v-else' 249 | }, 250 | { 251 | label: 'v-else-if' 252 | }, 253 | { 254 | label: 'v-for' 255 | }, 256 | { 257 | label: 'v-on' 258 | }, 259 | { 260 | label: 'v-bind' 261 | }, 262 | { 263 | label: 'v-model' 264 | }, 265 | { 266 | label: 'v-pre' 267 | }, 268 | { 269 | label: 'v-cloak' 270 | }, 271 | { 272 | label: 'v-once' 273 | }, 274 | { 275 | label: 'key' 276 | }, 277 | { 278 | label: 'ref' 279 | }, 280 | { 281 | label: 'slot' 282 | }, 283 | { 284 | label: 'is' 285 | }, 286 | { 287 | label: 'component' 288 | }, 289 | { 290 | label: 'transition' 291 | }, 292 | { 293 | label: 'transition-group' 294 | }, 295 | { 296 | label: 'keep-alive' 297 | }, 298 | { 299 | label: 'slot' 300 | }, 301 | { 302 | label: 'immediate' 303 | }, 304 | { 305 | label: 'handler' 306 | }, 307 | { 308 | label: 'editorMethods' 309 | }, 310 | { 311 | label: 'params' 312 | }, 313 | { 314 | label: 'desc' 315 | }, 316 | ] 317 | 318 | export default lint 319 | -------------------------------------------------------------------------------- /src/assets/layout/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "layout": { 3 | "children": [ 4 | { 5 | "children": [ 6 | { 7 | "children": [ 8 | { 9 | "name": "组件列表", 10 | "component": "widgetComponent", 11 | "close": true, 12 | "pop": true 13 | }, 14 | { 15 | "name": "组合组件", 16 | "component": "widgetCombinedComponents", 17 | "close": true, 18 | "pop": true 19 | } 20 | ], 21 | "type": "panel", 22 | "flex": 0.5 23 | }, 24 | { 25 | "children": [ 26 | { 27 | "name": "组件树", 28 | "component": "widgetComponentTree", 29 | "close": true, 30 | "pop": true 31 | }, 32 | { 33 | "name": "页面模板", 34 | "component": "widgetPageTemplate" 35 | } 36 | ], 37 | "type": "panel", 38 | "flex": 0.5 39 | } 40 | ], 41 | "type": "column", 42 | "flex": 0.20626959247648904 43 | }, 44 | { 45 | "children": [ 46 | { 47 | "children": [ 48 | { 49 | "name": "场景", 50 | "component": "widgetScene", 51 | "close": false, 52 | "pop": false 53 | }, 54 | { 55 | "name": "组件详情", 56 | "component": "widgetComponentInfo", 57 | "close": true, 58 | "pop": true 59 | }, 60 | { 61 | "name": "页面设置", 62 | "component": "widgetPageInfo", 63 | "close": true, 64 | "pop": true 65 | }, 66 | { 67 | "name": "商城", 68 | "component": "widgetShop", 69 | "close": true, 70 | "pop": true 71 | } 72 | ], 73 | "type": "panel", 74 | "flex": 0.9 75 | }, 76 | { 77 | "children": [ 78 | { 79 | "name": "动画", 80 | "component": "widgetAnimate", 81 | "close": true, 82 | "pop": true 83 | } 84 | ], 85 | "type": "panel", 86 | "flex": 0.1 87 | } 88 | ], 89 | "type": "column", 90 | "flex": 0.5512481056767048 91 | }, 92 | { 93 | "children": [ 94 | { 95 | "children": [ 96 | { 97 | "name": "属性", 98 | "component": "widgetAttribute", 99 | "close": false, 100 | "pop": true 101 | }, 102 | { 103 | "name": "样式", 104 | "component": "widgetStyleEditor", 105 | "close": false, 106 | "pop": true 107 | } 108 | ], 109 | "type": "panel", 110 | "flex": 0.7888643880926131 111 | }, 112 | { 113 | "children": [ 114 | { 115 | "name": "脚本", 116 | "component": "widgetScriptEditor", 117 | "close": true, 118 | "style": { 119 | "width": "300px", 120 | "height": "400px", 121 | "left": "300px", 122 | "top": "300px" 123 | }, 124 | "pop": true 125 | } 126 | ], 127 | "type": "panel", 128 | "flex": 0.211135611907387 129 | } 130 | ], 131 | "type": "column", 132 | "flex": 0.2424823018468062 133 | } 134 | ], 135 | "type": "row" 136 | }, 137 | "dialogs": [], 138 | "version": 1.3, 139 | "name": "default" 140 | } -------------------------------------------------------------------------------- /src/assets/layout/desktop.json: -------------------------------------------------------------------------------- 1 | { 2 | "layout": { 3 | "children": [{ 4 | "children": [{ 5 | "children": [{ 6 | "name": "组场景", 7 | "component": "widgetScene", 8 | "close": false, 9 | "pop": false 10 | }, { 11 | "name": "脚本编辑", 12 | "component": "widgetCodePanel", 13 | "style": { 14 | "width": "300px", 15 | "height": "400px", 16 | "left": "441px", 17 | "top": "121px" 18 | }, 19 | "close": true, 20 | "pop": true 21 | }, { 22 | "name": "组件详情", 23 | "component": "widgetComponentInfo", 24 | "close": true, 25 | "pop": true, 26 | "style": { 27 | "width": "1820px", 28 | "height": "878px", 29 | "left": "3px", 30 | "top": "344px" 31 | } 32 | }], 33 | "type": "panel", 34 | "flex": 0.85 35 | }, { 36 | "children": [{ 37 | "name": "动画", 38 | "component": "widgetAnimate", 39 | "close": true, 40 | "pop": true, 41 | "style": { 42 | "width": "360px", 43 | "height": "400px", 44 | "left": "1920px", 45 | "top": "480px" 46 | } 47 | }], 48 | "type": "panel", 49 | "flex": 0.15 50 | }], 51 | "type": "column", 52 | "flex": 1 53 | }], 54 | "type": "row" 55 | }, 56 | "dialogs": [{ 57 | "children": [{ 58 | "children": [{ 59 | "name": "组件列表", 60 | "component": "widgetComponent", 61 | "close": true, 62 | "pop": true, 63 | "style": { 64 | "width": "360px", 65 | "height": "434.5px", 66 | "left": "100px", 67 | "top": "97px" 68 | } 69 | }, { 70 | "name": "合成组件", 71 | "component": "widgetCombinedComponents", 72 | "close": true, 73 | "pop": true, 74 | "style": { 75 | "width": "360px", 76 | "height": "434.5px", 77 | "left": "215px", 78 | "top": "135px" 79 | } 80 | }, { 81 | "name": "页面模板", 82 | "component": "widgetPageTemplate" 83 | }], 84 | "type": "panel", 85 | "flex": 1 86 | }], 87 | "type": "column", 88 | "flex": "1", 89 | "style": { 90 | "width": "360px", 91 | "height": "878px", 92 | "left": "-360px", 93 | "top": "75px" 94 | } 95 | }, { 96 | "name": "属性", 97 | "component": "widgetAttribute", 98 | "close": false, 99 | "pop": true, 100 | "style": { 101 | "width": "360px", 102 | "height": "685.515625px", 103 | "left": "1920px", 104 | "top": "75px" 105 | } 106 | }, { 107 | "name": "样式", 108 | "component": "widgetStyleEditor", 109 | "close": false, 110 | "pop": true, 111 | "style": { 112 | "width": "360px", 113 | "height": "685.515625px", 114 | "left": "1920px", 115 | "top": "210px" 116 | } 117 | }, { 118 | "name": "脚本", 119 | "component": "widgetScriptEditor", 120 | "style": { 121 | "width": "364px", 122 | "height": "406px", 123 | "left": "1920px", 124 | "top": "345px" 125 | }, 126 | "close": true, 127 | "pop": true 128 | }, { 129 | "name": "组件树", 130 | "component": "widgetComponentTree", 131 | "close": true, 132 | "pop": true, 133 | "style": { 134 | "width": "355px", 135 | "height": "741px", 136 | "left": "-353px", 137 | "top": "210px" 138 | } 139 | }, { 140 | "name": "页面设置", 141 | "component": "widgetPageInfo", 142 | "close": true, 143 | "pop": true, 144 | "style": { 145 | "width": "361px", 146 | "height": "600px", 147 | "left": "-361px", 148 | "top": "345px" 149 | } 150 | }], 151 | "version": 1, 152 | "name": "desktop" 153 | } -------------------------------------------------------------------------------- /src/assets/layout/develop.json: -------------------------------------------------------------------------------- 1 | { 2 | "layout": { 3 | "children": [ 4 | { 5 | "children": [ 6 | { 7 | "children": [ 8 | { 9 | "name": "组件树", 10 | "component": "widgetComponentTree", 11 | "close": true, 12 | "pop": true 13 | } 14 | ], 15 | "type": "panel", 16 | "flex": 0.5371845949535192 17 | }, 18 | { 19 | "children": [ 20 | { 21 | "children": [ 22 | { 23 | "name": "脚本", 24 | "component": "widgetScriptEditor", 25 | "style": { 26 | "width": "300px", 27 | "height": "400px", 28 | "left": "300px", 29 | "top": "300px" 30 | }, 31 | "close": false, 32 | "pop": true 33 | }, 34 | { 35 | "name": "组件列表", 36 | "component": "widgetComponent", 37 | "close": true, 38 | "pop": true 39 | }, 40 | { 41 | "name": "组合组件", 42 | "component": "widgetCombinedComponents", 43 | "close": true, 44 | "pop": true, 45 | "style": { 46 | "width": "472.75px", 47 | "height": "378.5px", 48 | "left": "377px", 49 | "top": "472px" 50 | } 51 | } 52 | ], 53 | "type": "panel", 54 | "flex": 1 55 | } 56 | ], 57 | "type": "column", 58 | "flex": 0.4628154050464807 59 | } 60 | ], 61 | "type": "column", 62 | "flex": 0.2351640648382981 63 | }, 64 | { 65 | "children": [ 66 | { 67 | "children": [ 68 | { 69 | "name": "脚本编辑", 70 | "component": "widgetCodePanel", 71 | "close": false, 72 | "pop": false 73 | }, 74 | { 75 | "name": "场景", 76 | "component": "widgetScene", 77 | "close": false, 78 | "pop": false 79 | }, 80 | { 81 | "name": "商城", 82 | "component": "widgetShop", 83 | "close": true, 84 | "pop": true 85 | } 86 | ], 87 | "type": "panel", 88 | "flex": 1 89 | } 90 | ], 91 | "type": "column", 92 | "flex": 0.5016249900988153 93 | }, 94 | { 95 | "children": [ 96 | { 97 | "children": [ 98 | { 99 | "name": "属性", 100 | "component": "widgetAttribute", 101 | "close": false, 102 | "pop": true 103 | }, 104 | { 105 | "name": "样式", 106 | "component": "widgetStyleEditor", 107 | "close": false, 108 | "pop": true 109 | }, 110 | { 111 | "name": "动画", 112 | "component": "widgetAnimate", 113 | "close": true, 114 | "pop": true 115 | }, 116 | { 117 | "name": "页面设置", 118 | "component": "widgetPageInfo", 119 | "close": true, 120 | "pop": true 121 | } 122 | ], 123 | "type": "panel", 124 | "flex": 1 125 | } 126 | ], 127 | "type": "column", 128 | "flex": 0.2632109450628866 129 | } 130 | ], 131 | "type": "row" 132 | }, 133 | "dialogs": [], 134 | "version": 1.3, 135 | "name": "develop" 136 | } -------------------------------------------------------------------------------- /src/assets/layout/flutter.json: -------------------------------------------------------------------------------- 1 | { 2 | "layout": { 3 | "children": [{ 4 | "children": [{ 5 | "children": [{ 6 | "name": "组件列表", 7 | "component": "widgetComponent", 8 | "close": true, 9 | "pop": true 10 | }, { 11 | "name": "合成组件", 12 | "component": "widgetCombinedComponents", 13 | "close": true, 14 | "pop": true 15 | }], 16 | "type": "panel", 17 | "flex": 0.5 18 | }, { 19 | "children": [{ 20 | "name": "组件树", 21 | "component": "widgetComponentTree", 22 | "close": true, 23 | "pop": true 24 | }], 25 | "type": "panel", 26 | "flex": 0.5 27 | }], 28 | "type": "column", 29 | "flex": 0.20626959247648904 30 | }, { 31 | "children": [{ 32 | "children": [{ 33 | "name": "组场景", 34 | "component": "widgetScene", 35 | "close": false, 36 | "pop": false 37 | }, { 38 | "name": "组件详情", 39 | "component": "widgetComponentInfo", 40 | "close": true, 41 | "pop": true 42 | }, { 43 | "name": "页面设置", 44 | "component": "widgetPageInfo", 45 | "close": true, 46 | "pop": true 47 | }], 48 | "type": "panel", 49 | "flex": 1 50 | }], 51 | "type": "column", 52 | "flex": 0.5512481056767048 53 | }, { 54 | "children": [{ 55 | "children": [{ 56 | "name": "属性", 57 | "component": "widgetAttribute", 58 | "close": false, 59 | "pop": true 60 | }, { 61 | "name": "样式", 62 | "component": "widgetStyleEditor", 63 | "close": false, 64 | "pop": true 65 | }, { 66 | "name": "脚本", 67 | "component": "widgetScriptEditor", 68 | "style": { 69 | "width": "300px", 70 | "height": "400px", 71 | "left": "300px", 72 | "top": "300px" 73 | }, 74 | "close": true, 75 | "pop": true 76 | }], 77 | "type": "panel", 78 | "flex": 1 79 | }], 80 | "type": "column", 81 | "flex": 0.2424823018468062 82 | }], 83 | "type": "row" 84 | }, 85 | "dialogs": [], 86 | "version": 1, 87 | "name": "default" 88 | } -------------------------------------------------------------------------------- /src/assets/style/base.styl: -------------------------------------------------------------------------------- 1 | @require('~rider/lib/rider/index.styl') 2 | 3 | // 基础配置信息 4 | $-base-font-size = 12 5 | $-bg-color = #262626 6 | $-bg-scend-color = #262626 7 | 8 | 9 | $-font-color = #fafafa 10 | $-grey-color-1 = #333 11 | $-grey-color-2 = #666 12 | $-grey-color-3 = #999 13 | 14 | 15 | 16 | // 设置背景图片 17 | mbg($src, $size = 100% 100%, $position = 0 0, $repeat = no-repeat) 18 | 19 | if not file-exists($src) 20 | error('$src 必须为本地已存在的图片路径:' + $src) 21 | 22 | background-image: url($src) 23 | background-size: $size 24 | background-position: $position 25 | background-repeat: $repeat 26 | -------------------------------------------------------------------------------- /src/assets/style/m-1px.styl: -------------------------------------------------------------------------------- 1 | .m-border-1px { 2 | position:relative; 3 | border:none!important 4 | } 5 | .m-border-1px:after { 6 | content:''; 7 | position:absolute; 8 | top:0; 9 | left:0; 10 | box-sizing:border-box; 11 | border-width:0; 12 | border-style:solid; 13 | border-color:#ccc; 14 | -webkit-transform-origin:50% 50%; 15 | transform-origin:50% 50%; 16 | width:100%; 17 | height:100% 18 | pointer-events: none; 19 | } 20 | .m-border-all:after { 21 | border-width:1px 22 | } 23 | .m-border-top:after { 24 | border-top-width:1px 25 | } 26 | .m-border-left:after { 27 | border-left-width:1px 28 | } 29 | .m-border-right:after { 30 | border-right-width:1px 31 | } 32 | .m-border-bottom:after { 33 | border-bottom-width:1px 34 | } 35 | @media (-webkit-min-device-pixel-ratio:2) { 36 | .m-border-1px:after { 37 | width:200%; 38 | height:200%; 39 | -webkit-transform:scale(.5) translate3D(-50%,-50%,0); //先缩放后平移 40 | transform:scale(.5) translate3D(-50%,-50%,0); 41 | } 42 | } 43 | @media (-webkit-min-device-pixel-ratio:3) { 44 | .m-border-1px:after { 45 | width:300%; 46 | height:300%; 47 | -webkit-transform:scale(.3333) translate3D(-100%,-100%,0); 48 | transform:scale(.3333) translate3D(-100%,-100%,0); 49 | } 50 | } 51 | @media (min-device-pixel-ratio:2) { 52 | .m-border-1px:after { 53 | width:200%; 54 | height:200%; 55 | -webkit-transform:scale(.5) translate3D(-50%,-50%,0); 56 | transform:scale(.5) translate3D(-50%,-50%,0); 57 | } 58 | } 59 | @media (min-device-pixel-ratio:3) { 60 | .m-border-1px:after { 61 | width: 300%; 62 | height: 300%; 63 | -webkit-transform: scale(.3333) translate3D(-100%,-100%,0); 64 | transform: scale(.3333) translate3D(-100%,-100%,0); 65 | } 66 | } 67 | 68 | /* 69 | ** 1px based on gradient 70 | */ 71 | 72 | .m-border-gradient-1px { 73 | background-repeat: no-repeat; 74 | } 75 | 76 | .m-border-gradient-1px.m-border-gradient-left { 77 | background-image: -webkit-gradient(linear, right bottom, left bottom, color-stop(0.3, transparent), color-stop(1, #ccc)); 78 | background-image: linear-gradient(to left, transparent 30%, #ccc); 79 | background-size: 1px 100%; 80 | background-position: left; 81 | } 82 | .m-border-gradient-1px.m-border-gradient-top { 83 | background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.3, transparent), color-stop(1, #ccc)); 84 | background-image: linear-gradient(to top, transparent 30%, #ccc); 85 | background-size: 100% 1px; 86 | background-position: top; 87 | } 88 | .m-border-gradient-1px.m-border-gradient-bottom { 89 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0.3, transparent), color-stop(1, #ccc)); 90 | background-image: linear-gradient(to bottom, transparent 30%, #ccc); 91 | background-size: 100% 1px; 92 | background-position: bottom; 93 | } 94 | .m-border-gradient-1px.m-border-gradient-right { 95 | background-image: -webkit-gradient(linear, left top, right top, color-stop(0.3, transparent), color-stop(1, #ccc)); 96 | background-image: linear-gradient(to right, transparent 30%, #ccc); 97 | background-size: 1px 100%; 98 | background-position: right; 99 | } 100 | .m-border-gradient-1px.m-border-gradient-tb, .m-border-gradient-1px.m-border-gradient-bt { 101 | background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0.3, transparent), color-stop(1, #ccc)), -webkit-gradient(linear, left bottom, left top, color-stop(0.3, transparent), color-stop(1, #ccc)); 102 | background-image: linear-gradient(to top, transparent 30%, #ccc), linear-gradient(to bottom, transparent 30%, #ccc); 103 | background-size: 100% 1px, 100% 1px; 104 | background-position: top, bottom; 105 | } 106 | 107 | .m-border-gradient-1px.m-border-gradient-lr, .m-border-gradient-1px.m-border-gradient-rl { 108 | background-image: -webkit-gradient(linear, left bottom, right bottom, color-stop(0.3, transparent), color-stop(1, #e0e0e0)), -webkit-gradient(linear, right top, left top, color-stop(0.3, transparent), color-stop(1, #e0e0e0)); 109 | background-image: linear-gradient(to right, transparent 30%, #ccc), linear-gradient(to left, transparent 30%, #ccc); 110 | background-size: 1px 100%, 1px 100%; 111 | background-position: right, left; 112 | } -------------------------------------------------------------------------------- /src/client.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './Client.vue' 3 | import VueRouter from 'vue-router' 4 | import FastClick from 'FastClick' 5 | import './assets/js/date' 6 | import routes from './extend/RouterMap' 7 | import ESlog from './extend/ESlog' 8 | import clientlib from './extend/client/' 9 | import {fetch} from './extend/fetch' 10 | import Util from './extend/Util' 11 | let config = require('./config/index') 12 | 13 | window.Truck = window.$GP = { 14 | Util, 15 | ESlog, 16 | Env: {}, 17 | Native: {}, 18 | Server: {fetch}, 19 | } 20 | window.Truck.Maliang = clientlib 21 | window.$GP.VueExtend = clientlib 22 | window.Vue = Vue 23 | /** 24 | * 定义编辑配置属性的混合策略 25 | */ 26 | var strategies = Vue.config.optionMergeStrategies 27 | strategies.editorMethods = strategies.methods 28 | strategies.editerMethods = strategies.methods 29 | Vue.use(VueRouter) 30 | FastClick.attach(document.body, {}) 31 | 32 | const router = new VueRouter(routes) 33 | 34 | const app = window.app = new Vue({ // eslint-disable-line 35 | router, 36 | render: h => h(App) 37 | }) 38 | 39 | function startApp () { 40 | if (startApp.started) return 41 | startApp.started = true 42 | mount() 43 | 44 | function mount () { 45 | Object.defineProperty(window, 'EventHub', { 46 | get () { return window.app } 47 | }) 48 | app.$mount('#app') 49 | window.addEventListener('pagehide', trackPVTime) 50 | sendPVTime() 51 | window.trackPVTime = trackPVTime 52 | } 53 | } 54 | startApp() 55 | 56 | function trackPVTime (from) { 57 | if (trackPVTime.called) return 58 | console.log(from) 59 | var end = Date.now() 60 | var start = window.loadingStartTime 61 | var route = window.location.pathname.match(new RegExp(`(?:/${config.VIEW_NAME || 'view'})?/(\\w+)`)) 62 | if (route && route[1]) { 63 | window.localStorage.setItem('ML_VIEW_TIME', route[1] + '|' + ((end - start) / 1000 | 0)) 64 | } 65 | trackPVTime.called = 1 66 | } 67 | 68 | function sendPVTime () { 69 | if (process.env.NODE_ENV !== 'production') return 70 | var ML_VIEW_TIME = (window.localStorage.getItem('ML_VIEW_TIME') || '').split('|') 71 | if (ML_VIEW_TIME && ML_VIEW_TIME.length == 2) { 72 | ESlog.track({ 73 | app_id: 'tview', 74 | page_id: ML_VIEW_TIME[0], 75 | action: 'PV_TIME', 76 | duration: +ML_VIEW_TIME[1] || 0, 77 | }, 'no-fp') 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/client.tpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |