Full Code of TsangTszKin/form-design for AI

master f8d6d45e7ac7 cached
314 files
7.3 MB
1.9M tokens
945 symbols
1 requests
Download .txt
Showing preview only (7,818K chars total). Download the full file or copy to clipboard to get everything.
Repository: TsangTszKin/form-design
Branch: master
Commit: f8d6d45e7ac7
Files: 314
Total size: 7.3 MB

Directory structure:
gitextract_a36ql3zd/

├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── CHANGELOG.md
├── LICENSE
├── README.md
├── build/
│   ├── build.js
│   ├── check-versions.js
│   ├── utils.js
│   ├── vue-loader.conf.js
│   ├── webpack.base.conf.js
│   ├── webpack.dev.conf.js
│   ├── webpack.prod.conf.js
│   └── webpack.test.conf.js
├── config/
│   ├── dev.env.js
│   ├── index.js
│   ├── prod.env.js
│   └── test.env.js
├── debug.log
├── gulpfile.js
├── index.html
├── package.json
├── src/
│   ├── App.vue
│   ├── assets/
│   │   └── scss/
│   │       ├── _base.scss
│   │       ├── _normalize.scss
│   │       ├── _variables.scss
│   │       └── index.scss
│   ├── components/
│   │   ├── common/
│   │   │   ├── ApprovalPanel.vue
│   │   │   ├── DocumentPanel.vue
│   │   │   └── FormPreview.vue
│   │   ├── form-design/
│   │   │   ├── Cell.vue
│   │   │   ├── FDCheckbox.vue
│   │   │   ├── FDDateTime.vue
│   │   │   ├── FDGrid.vue
│   │   │   ├── FDGridPanel.vue
│   │   │   ├── FDIdea.vue
│   │   │   ├── FDImg.vue
│   │   │   ├── FDInput.vue
│   │   │   ├── FDMenu.vue
│   │   │   ├── FDNumber.vue
│   │   │   ├── FDRadio.vue
│   │   │   ├── FDSelect.vue
│   │   │   ├── FDSwitch.vue
│   │   │   ├── FDTextArea.vue
│   │   │   ├── FDTitle.vue
│   │   │   ├── GridCell.vue
│   │   │   ├── Panel.vue
│   │   │   ├── Test.vue
│   │   │   ├── nested.vue
│   │   │   ├── nestedExample.vue
│   │   │   ├── raw-displayer.vue
│   │   │   └── view/
│   │   │       ├── Document copy.vue
│   │   │       ├── Document.vue
│   │   │       ├── FormItem.vue
│   │   │       ├── FormList.vue
│   │   │       └── Material.vue
│   │   ├── icon-svg/
│   │   │   └── index.vue
│   │   └── table-tree-column/
│   │       └── index.vue
│   ├── element-ui/
│   │   └── index.js
│   ├── element-ui-theme/
│   │   ├── element-#0BB2D4/
│   │   │   └── index.css
│   │   ├── element-#11C26D/
│   │   │   └── index.css
│   │   ├── element-#17B3A3/
│   │   │   └── index.css
│   │   ├── element-#3E8EF7/
│   │   │   └── index.css
│   │   ├── element-#667AFA/
│   │   │   └── index.css
│   │   ├── element-#757575/
│   │   │   └── index.css
│   │   ├── element-#9463F7/
│   │   │   └── index.css
│   │   ├── element-#997B71/
│   │   │   └── index.css
│   │   ├── element-#EB6709/
│   │   │   └── index.css
│   │   ├── element-#F74584/
│   │   │   └── index.css
│   │   ├── element-#FCB900/
│   │   │   └── index.css
│   │   ├── element-#FF4C52/
│   │   │   └── index.css
│   │   └── index.js
│   ├── icons/
│   │   ├── iconfont.js
│   │   └── index.js
│   ├── main.js
│   ├── mock/
│   │   ├── index.js
│   │   └── modules/
│   │       ├── common.js
│   │       ├── job-schedule.js
│   │       ├── oss.js
│   │       ├── sys-config.js
│   │       ├── sys-log.js
│   │       ├── sys-menu.js
│   │       ├── sys-role.js
│   │       └── sys-user.js
│   ├── router/
│   │   ├── import-development.js
│   │   ├── import-production.js
│   │   └── index.js
│   ├── store/
│   │   ├── index.js
│   │   └── modules/
│   │       ├── common.js
│   │       ├── formDesign.js
│   │       └── user.js
│   ├── utils/
│   │   ├── bus.js
│   │   ├── common.js
│   │   ├── httpRequest.js
│   │   ├── index.js
│   │   └── validate.js
│   └── views/
│       ├── common/
│       │   ├── 404.vue
│       │   ├── home.vue
│       │   ├── login.vue
│       │   └── theme.vue
│       ├── demo/
│       │   ├── FlowEditor.vue
│       │   ├── echarts.vue
│       │   └── ueditor.vue
│       ├── main-content.vue
│       ├── main-navbar-update-password.vue
│       ├── main-navbar.vue
│       ├── main-sidebar-sub-menu.vue
│       ├── main-sidebar.vue
│       ├── main.vue
│       └── modules/
│           ├── job/
│           │   ├── schedule-add-or-update.vue
│           │   ├── schedule-log.vue
│           │   └── schedule.vue
│           ├── oss/
│           │   ├── oss-config.vue
│           │   ├── oss-upload.vue
│           │   └── oss.vue
│           └── sys/
│               ├── config-add-or-update.vue
│               ├── config.vue
│               ├── log.vue
│               ├── menu-add-or-update.vue
│               ├── menu.vue
│               ├── role-add-or-update.vue
│               ├── role.vue
│               ├── user-add-or-update.vue
│               └── user.vue
├── static/
│   ├── base.css
│   ├── config/
│   │   ├── index-prod.js
│   │   ├── index-qa.js
│   │   ├── index-uat.js
│   │   ├── index.js
│   │   └── init.js
│   ├── flow-editor/
│   │   └── demo/
│   │       ├── css/
│   │       │   ├── dmp/
│   │       │   │   ├── admin/
│   │       │   │   │   ├── admin.css
│   │       │   │   │   └── pub.css
│   │       │   │   ├── index/
│   │       │   │   │   ├── index.css
│   │       │   │   │   └── pub.css
│   │       │   │   └── login/
│   │       │   │       └── login.css
│   │       │   └── font-awesome/
│   │       │       └── css/
│   │       │           └── font-awesome.css
│   │       ├── html/
│   │       │   └── index/
│   │       │       └── flow/
│   │       │           ├── flow.html
│   │       │           ├── flowEdit.html
│   │       │           └── flowLog.html
│   │       └── js/
│   │           ├── dmp/
│   │           │   ├── index/
│   │           │   │   ├── flow/
│   │           │   │   │   └── flow.js
│   │           │   │   └── index.js
│   │           │   └── pub/
│   │           │       └── pub.js
│   │           ├── layui/
│   │           │   └── examples/
│   │           │       ├── admin.html
│   │           │       ├── all.html
│   │           │       ├── button.html
│   │           │       ├── carousel.html
│   │           │       ├── code.html
│   │           │       ├── element.html
│   │           │       ├── extend.html
│   │           │       ├── flow.html
│   │           │       ├── form.html
│   │           │       ├── js/
│   │           │       │   ├── child/
│   │           │       │   │   └── test.js
│   │           │       │   └── index.js
│   │           │       ├── json/
│   │           │       │   ├── table/
│   │           │       │   │   ├── demo1.json
│   │           │       │   │   └── demo2.json
│   │           │       │   └── upload/
│   │           │       │       └── demoLayEdit.json
│   │           │       ├── laydate.html
│   │           │       ├── layedit.html
│   │           │       ├── layer.html
│   │           │       ├── layout.html
│   │           │       ├── laypage.html
│   │           │       ├── responsive.html
│   │           │       ├── table.html
│   │           │       ├── tree.html
│   │           │       ├── upload.html
│   │           │       ├── util.html
│   │           │       └── xingzuo.html
│   │           └── plugin/
│   │               ├── flow/
│   │               │   ├── analytics.js
│   │               │   ├── collaboration.js
│   │               │   ├── designer.core.js
│   │               │   ├── designer.css
│   │               │   ├── designer.events.js
│   │               │   ├── designer.methods.js
│   │               │   ├── designer.ui.js
│   │               │   ├── export.js
│   │               │   ├── global.css
│   │               │   ├── jquery.js
│   │               │   ├── schema.js
│   │               │   ├── themes.js
│   │               │   ├── ui.css
│   │               │   └── util.js
│   │               └── jquery/
│   │                   ├── canvasparticle.js
│   │                   └── scrollbar.js
│   ├── font/
│   │   ├── demo.css
│   │   ├── demo_index.html
│   │   ├── iconfont.css
│   │   └── iconfont.js
│   ├── normalize.css
│   ├── plugins/
│   │   ├── mock-1.0.0-beta3/
│   │   │   └── mock-min.js
│   │   └── ueditor-1.4.3.3/
│   │       ├── dialogs/
│   │       │   ├── anchor/
│   │       │   │   └── anchor.html
│   │       │   ├── attachment/
│   │       │   │   ├── attachment.css
│   │       │   │   ├── attachment.html
│   │       │   │   └── attachment.js
│   │       │   ├── background/
│   │       │   │   ├── background.css
│   │       │   │   ├── background.html
│   │       │   │   └── background.js
│   │       │   ├── charts/
│   │       │   │   ├── chart.config.js
│   │       │   │   ├── charts.css
│   │       │   │   ├── charts.html
│   │       │   │   └── charts.js
│   │       │   ├── emotion/
│   │       │   │   ├── emotion.css
│   │       │   │   ├── emotion.html
│   │       │   │   └── emotion.js
│   │       │   ├── gmap/
│   │       │   │   └── gmap.html
│   │       │   ├── help/
│   │       │   │   ├── help.css
│   │       │   │   ├── help.html
│   │       │   │   └── help.js
│   │       │   ├── image/
│   │       │   │   ├── image.css
│   │       │   │   ├── image.html
│   │       │   │   └── image.js
│   │       │   ├── insertframe/
│   │       │   │   └── insertframe.html
│   │       │   ├── internal.js
│   │       │   ├── link/
│   │       │   │   └── link.html
│   │       │   ├── map/
│   │       │   │   ├── map.html
│   │       │   │   └── show.html
│   │       │   ├── music/
│   │       │   │   ├── music.css
│   │       │   │   ├── music.html
│   │       │   │   └── music.js
│   │       │   ├── preview/
│   │       │   │   └── preview.html
│   │       │   ├── scrawl/
│   │       │   │   ├── scrawl.css
│   │       │   │   ├── scrawl.html
│   │       │   │   └── scrawl.js
│   │       │   ├── searchreplace/
│   │       │   │   ├── searchreplace.html
│   │       │   │   └── searchreplace.js
│   │       │   ├── snapscreen/
│   │       │   │   └── snapscreen.html
│   │       │   ├── spechars/
│   │       │   │   ├── spechars.html
│   │       │   │   └── spechars.js
│   │       │   ├── table/
│   │       │   │   ├── edittable.css
│   │       │   │   ├── edittable.html
│   │       │   │   ├── edittable.js
│   │       │   │   ├── edittd.html
│   │       │   │   └── edittip.html
│   │       │   ├── template/
│   │       │   │   ├── config.js
│   │       │   │   ├── template.css
│   │       │   │   ├── template.html
│   │       │   │   └── template.js
│   │       │   ├── video/
│   │       │   │   ├── video.css
│   │       │   │   ├── video.html
│   │       │   │   └── video.js
│   │       │   ├── webapp/
│   │       │   │   └── webapp.html
│   │       │   └── wordimage/
│   │       │       ├── fClipboard_ueditor.swf
│   │       │       ├── imageUploader.swf
│   │       │       ├── tangram.js
│   │       │       ├── wordimage.html
│   │       │       └── wordimage.js
│   │       ├── lang/
│   │       │   ├── en/
│   │       │   │   └── en.js
│   │       │   └── zh-cn/
│   │       │       └── zh-cn.js
│   │       ├── themes/
│   │       │   ├── default/
│   │       │   │   ├── css/
│   │       │   │   │   └── ueditor.css
│   │       │   │   └── dialogbase.css
│   │       │   └── iframe.css
│   │       ├── third-party/
│   │       │   ├── SyntaxHighlighter/
│   │       │   │   ├── shCore.js
│   │       │   │   └── shCoreDefault.css
│   │       │   ├── codemirror/
│   │       │   │   ├── codemirror.css
│   │       │   │   └── codemirror.js
│   │       │   ├── highcharts/
│   │       │   │   ├── adapters/
│   │       │   │   │   ├── mootools-adapter.js
│   │       │   │   │   ├── mootools-adapter.src.js
│   │       │   │   │   ├── prototype-adapter.js
│   │       │   │   │   ├── prototype-adapter.src.js
│   │       │   │   │   ├── standalone-framework.js
│   │       │   │   │   └── standalone-framework.src.js
│   │       │   │   ├── highcharts-more.js
│   │       │   │   ├── highcharts-more.src.js
│   │       │   │   ├── highcharts.js
│   │       │   │   ├── highcharts.src.js
│   │       │   │   ├── modules/
│   │       │   │   │   ├── annotations.js
│   │       │   │   │   ├── annotations.src.js
│   │       │   │   │   ├── canvas-tools.js
│   │       │   │   │   ├── canvas-tools.src.js
│   │       │   │   │   ├── data.js
│   │       │   │   │   ├── data.src.js
│   │       │   │   │   ├── drilldown.js
│   │       │   │   │   ├── drilldown.src.js
│   │       │   │   │   ├── exporting.js
│   │       │   │   │   ├── exporting.src.js
│   │       │   │   │   ├── funnel.js
│   │       │   │   │   ├── funnel.src.js
│   │       │   │   │   ├── heatmap.js
│   │       │   │   │   ├── heatmap.src.js
│   │       │   │   │   ├── map.js
│   │       │   │   │   ├── map.src.js
│   │       │   │   │   ├── no-data-to-display.js
│   │       │   │   │   └── no-data-to-display.src.js
│   │       │   │   └── themes/
│   │       │   │       ├── dark-blue.js
│   │       │   │       ├── dark-green.js
│   │       │   │       ├── gray.js
│   │       │   │       ├── grid.js
│   │       │   │       └── skies.js
│   │       │   ├── jquery-1.10.2.js
│   │       │   ├── video-js/
│   │       │   │   ├── video-js.css
│   │       │   │   ├── video-js.swf
│   │       │   │   ├── video.dev.js
│   │       │   │   └── video.js
│   │       │   ├── webuploader/
│   │       │   │   ├── Uploader.swf
│   │       │   │   ├── webuploader.css
│   │       │   │   ├── webuploader.custom.js
│   │       │   │   ├── webuploader.flashonly.js
│   │       │   │   ├── webuploader.html5only.js
│   │       │   │   ├── webuploader.js
│   │       │   │   └── webuploader.withoutimage.js
│   │       │   └── zeroclipboard/
│   │       │       ├── ZeroClipboard.js
│   │       │       └── ZeroClipboard.swf
│   │       └── ueditor.config.js
│   └── reset.css
└── test/
    ├── e2e/
    │   ├── custom-assertions/
    │   │   └── elementCount.js
    │   ├── nightwatch.conf.js
    │   ├── runner.js
    │   └── specs/
    │       └── test.js
    └── unit/
        ├── .eslintrc
        ├── jest.conf.js
        ├── setup.js
        └── specs/
            └── HelloWorld.spec.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .babelrc
================================================
{
  "presets": [
    ["env", {
      "modules": false
    }],
    "stage-2"
  ],
  "plugins": ["transform-runtime", ["component", [
    {
      "libraryName": "element-ui"
    }
  ]]],
  "env": {
    "test": {
      "presets": ["env", "stage-2"],
      "plugins": ["transform-es2015-modules-commonjs", "dynamic-import-node"]
    }
  }
}


================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true


================================================
FILE: .eslintignore
================================================
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/src/icons/iconfont.js


================================================
FILE: .eslintrc.js
================================================
// https://eslint.org/docs/user-guide/configuring

module.exports = {
  root: true,
  parser: 'babel-eslint',
  parserOptions: {
    sourceType: 'module'
  },
  env: {
    browser: true,
  },
  // https://github.com/standard/standard/blob/master/docs/RULES-en.md
  extends: 'standard',
  // required to lint *.vue files
  plugins: [
    'html'
  ],
  // add your custom rules here
  rules: {
    // allow async-await
    'generator-star-spacing': 'off',
    // allow debugger during development
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  }
}


================================================
FILE: .gitignore
================================================
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log

# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln


================================================
FILE: .postcssrc.js
================================================
// https://github.com/michael-ciniawsky/postcss-load-config

module.exports = {
  "plugins": {
    // to edit target browsers: use "browserslist" field in package.json
    "postcss-import": {},
    "autoprefixer": {}
  }
}


================================================
FILE: CHANGELOG.md
================================================
## 更新日志

### 1.2.2

*2018-10-16*

- 修复判断当前路由类型 bug
- 默认开放element-ui所有组件
- 修复子菜单同级出现子菜单项会同时选中bug
- 捕获首次请求菜单列表和权限异常,自动跳转至登录页
- 修复菜单按钮权限错误bug [#41](https://github.com/renrenio/renren-fast-vue/issues/41)
- 提供重置登录信息状态方法。修复登出或替换账号还保留之前账号操作信息和痕迹bug
- 优化token失效、退出后,为了强制清空整站临时存储数据而刷新页面问题。注意: 此次vux数据并未做重置处理!

### 1.2.1

*2018-06-08*

- 修复tabs关闭最后一个tab后,再次打开会保留最后一个tab bug
- 优化完善mock模拟数据
- 修复linux系统,引入主题色文件名大小写编译错误bug [#22](https://github.com/daxiongYang/renren-fast-vue/issues/22)
- 新增echarts图表、ueditor富文本编辑器demo
- 移除登录成功token前端设置的失效时间
- 修复退出/token失效后,返回登录页面未清空整站临时存储数据bug
- 修复手机号码验证正则bug
- 同步后台 修改config模块key vulue子段为paramKey paramValue
- 修复角色管理 新增修改授权接口请求错误bug
- 修复1.2 新版本的导航栏Tab错位bug [#14](https://github.com/daxiongYang/renren-fast-vue/issues/14)
- 修复动态菜单路由 最前面带/bug
- 修复其它已知bug

### 1.2.0

*2018-05-03*

- 支持菜单管理操作动态(菜单)路由
- 移除api文件夹目录,简化api请求方式
- 新增element-ui组件主题12套,可同步修改配置设置成整站主题
- 调整store状态目录结构,改变设置/获取方式
- 调整views视图层结构,更友好的支持动态(菜单)路由
- 修复其它已知bug

### 1.1.0

*2018-04-15*

- 使用SVG Sprite矢量图标,替换fontawesome字体图标
- 新增内容tabs标签页,关闭当前/其它/全部、刷新当前功能
- 新增scss变量皮肤定制
- 优化路由机制,通过meta isTab属性,设定是否通过tab标签页展示内容
- 更新element-ui 2.3.2 用于修复左侧菜单收缩卡顿问题
- 新增mock本地开发模拟数据功能
- 修复本地开发找不到baseUrl问题
- 更新element-ui 2.2.1 用于修复tree半选中状态项不能传给后台接口问题
- 修复其它已知bug

### 1.0.0

*2018-02-11*


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 

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.


================================================
FILE: README.md
================================================
<!--
 * @Author: your name
 * @Date: 2019-12-10 10:46:21
 * @LastEditTime: 2019-12-10 11:55:18
 * @LastEditors: your name
 * @Description: In User Settings Edit
 * @FilePath: \form-design\README.md
 -->
## form-design (react版本,手机版本请查看我的<a target="_blank" href="https://github.com/TsangTszKin/react-form-design">react-form-design</a>)
- form-design本人基于vue、element-ui,vuedraggable构建开发,实现用拖拉拽和自主配置来实现动态表单设计功能功能,提供一套更优的前端解决方案
- 自主研发,模仿小幺鸡表单设计器(<a target="_blank" href="http://tools.xiaoyaoji.cn/form/#/">点击查看小幺鸡</a>)
- 支持拖拉拽控件,支持二次拖来拽
- 支持自定义配置和栅格布局
- 支持表单验证和表单预览
- 前后端分离,通过token进行数据交互,可独立部署

- (账号密码:admin/admin)


![效果图](demo-screenshot/1.gif)

![效果图](demo-screenshot/03.png)


----------

### 12.10更新
- 表单设置页面设置为全屏显示
- 新增tab页的表单模式,可自定义
- "计数器元素" 改为 "数字文本框"
- 新增元素 '意见框',提供快捷选择意见和落款
- 大大加强组件化封装
- icon改为iconfont集成

![12/10更新界面效果图](demo-screenshot/update_12_10.png)


================================================
FILE: build/build.js
================================================
'use strict'
require('./check-versions')()

process.env.NODE_ENV = 'production'

const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')

const spinner = ora('building for production...')
spinner.start()

rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
  if (err) throw err
  webpack(webpackConfig, (err, stats) => {
    spinner.stop()
    if (err) throw err
    process.stdout.write(stats.toString({
      colors: true,
      modules: false,
      children: false,
      chunks: false,
      chunkModules: false
    }) + '\n\n')

    if (stats.hasErrors()) {
      console.log(chalk.red('  Build failed with errors.\n'))
      process.exit(1)
    }

    console.log(chalk.cyan('  Build complete.\n'))
    console.log(chalk.yellow(
      '  Tip: built files are meant to be served over an HTTP server.\n' +
      '  Opening index.html over file:// won\'t work.\n'
    ))
  })
})


================================================
FILE: build/check-versions.js
================================================
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')

function exec (cmd) {
  return require('child_process').execSync(cmd).toString().trim()
}

const versionRequirements = [
  {
    name: 'node',
    currentVersion: semver.clean(process.version),
    versionRequirement: packageConfig.engines.node
  }
]

if (shell.which('npm')) {
  versionRequirements.push({
    name: 'npm',
    currentVersion: exec('npm --version'),
    versionRequirement: packageConfig.engines.npm
  })
}

module.exports = function () {
  const warnings = []

  for (let i = 0; i < versionRequirements.length; i++) {
    const mod = versionRequirements[i]

    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
      warnings.push(mod.name + ': ' +
        chalk.red(mod.currentVersion) + ' should be ' +
        chalk.green(mod.versionRequirement)
      )
    }
  }

  if (warnings.length) {
    console.log('')
    console.log(chalk.yellow('To use this template, you must update following to modules:'))
    console.log()

    for (let i = 0; i < warnings.length; i++) {
      const warning = warnings[i]
      console.log('  ' + warning)
    }

    console.log()
    process.exit(1)
  }
}


================================================
FILE: build/utils.js
================================================
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')

exports.assetsPath = function (_path) {
  const assetsSubDirectory = process.env.NODE_ENV === 'production'
    ? config.build.assetsSubDirectory
    : config.dev.assetsSubDirectory

  return path.posix.join(assetsSubDirectory, _path)
}

exports.cssLoaders = function (options) {
  options = options || {}

  const cssLoader = {
    loader: 'css-loader',
    options: {
      sourceMap: options.sourceMap
    }
  }

  const postcssLoader = {
    loader: 'postcss-loader',
    options: {
      sourceMap: options.sourceMap
    }
  }

  // generate loader string to be used with extract text plugin
  function generateLoaders (loader, loaderOptions) {
    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]

    if (loader) {
      loaders.push({
        loader: loader + '-loader',
        options: Object.assign({}, loaderOptions, {
          sourceMap: options.sourceMap
        })
      })
    }

    // Extract CSS when that option is specified
    // (which is the case during production build)
    if (options.extract) {
      return ExtractTextPlugin.extract({
        use: loaders,
        fallback: 'vue-style-loader'
      })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }
  }

  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
  return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
    sass: generateLoaders('sass', { indentedSyntax: true }),
    scss: generateLoaders('sass'),
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }
}

// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
  const output = []
  const loaders = exports.cssLoaders(options)

  for (const extension in loaders) {
    const loader = loaders[extension]
    output.push({
      test: new RegExp('\\.' + extension + '$'),
      use: loader
    })
  }

  return output
}

exports.createNotifierCallback = () => {
  const notifier = require('node-notifier')

  return (severity, errors) => {
    if (severity !== 'error') return

    const error = errors[0]
    const filename = error.file && error.file.split('!').pop()

    notifier.notify({
      title: packageConfig.name,
      message: severity + ': ' + error.name,
      subtitle: filename || '',
      icon: path.join(__dirname, 'logo.png')
    })
  }
}


================================================
FILE: build/vue-loader.conf.js
================================================
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
  ? config.build.productionSourceMap
  : config.dev.cssSourceMap

module.exports = {
  loaders: utils.cssLoaders({
    sourceMap: sourceMapEnabled,
    extract: isProduction
  }),
  cssSourceMap: sourceMapEnabled,
  cacheBusting: config.dev.cacheBusting,
  transformToRequire: {
    video: ['src', 'poster'],
    source: 'src',
    img: 'src',
    image: 'xlink:href'
  }
}


================================================
FILE: build/webpack.base.conf.js
================================================
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve (dir) {
  return path.join(__dirname, '..', dir)
}

const createLintingRule = () => ({
  test: /\.(js|vue)$/,
  loader: 'eslint-loader',
  enforce: 'pre',
  include: [resolve('src'), resolve('test')],
  options: {
    formatter: require('eslint-friendly-formatter'),
    emitWarning: !config.dev.showEslintErrorsInOverlay
  }
})

module.exports = {
  context: path.resolve(__dirname, '../'),
  entry: {
    app: ['babel-polyfill', './src/main.js']
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
  resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src'),
    }
  },
  module: {
    rules: [
      ...(config.dev.useEslint ? [createLintingRule()] : []),
      {
        test: /\.vue$/,
        loader: 'vue-loader',
        options: vueLoaderConfig
      },
      {
        test: /\.js$/,
        loader: 'babel-loader',
        include: [resolve('src'), resolve('test')]
      },
      {
        test: /\.svg$/,
        loader: 'svg-sprite-loader',
        include: [resolve('src/icons')]
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url-loader',
        exclude: [resolve('src/icons')],
        options: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('media/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url-loader',
        options: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
  node: {
    // prevent webpack from injecting useless setImmediate polyfill because Vue
    // source contains it (although only uses it if it's native).
    setImmediate: false,
    // prevent webpack from injecting mocks to Node native modules
    // that does not make sense for the client
    dgram: 'empty',
    fs: 'empty',
    net: 'empty',
    tls: 'empty',
    child_process: 'empty'
  },
  // 引入外部库, 无需webpack打包处理
  externals: {
    mockjs: 'Mock',
    echarts: 'echarts',
    ueditor: 'UE'
  }
}


================================================
FILE: build/webpack.dev.conf.js
================================================
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')

const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)

const devWebpackConfig = merge(baseWebpackConfig, {
  module: {
    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
  },
  // cheap-module-eval-source-map is faster for development
  devtool: config.dev.devtool,

  // these devServer options should be customized in /config/index.js
  devServer: {
    clientLogLevel: 'warning',
    historyApiFallback: true,
    hot: true,
    compress: true,
    host: HOST || config.dev.host,
    port: PORT || config.dev.port,
    open: config.dev.autoOpenBrowser,
    overlay: config.dev.errorOverlay
      ? { warnings: false, errors: true }
      : false,
    publicPath: config.dev.assetsPublicPath,
    proxy: config.dev.proxyTable,
    quiet: true, // necessary for FriendlyErrorsPlugin
    watchOptions: {
      poll: config.dev.poll,
    }
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': require('../config/dev.env')
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
    new webpack.NoEmitOnErrorsPlugin(),
    // https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
      inject: true
    }),
  ]
})

module.exports = new Promise((resolve, reject) => {
  portfinder.basePort = process.env.PORT || config.dev.port
  portfinder.getPort((err, port) => {
    if (err) {
      reject(err)
    } else {
      // publish the new Port, necessary for e2e tests
      process.env.PORT = port
      // add port to devServer config
      devWebpackConfig.devServer.port = port

      // Add FriendlyErrorsPlugin
      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
        compilationSuccessInfo: {
          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
        },
        onErrors: config.dev.notifyOnErrors
        ? utils.createNotifierCallback()
        : undefined
      }))

      resolve(devWebpackConfig)
    }
  })
})


================================================
FILE: build/webpack.prod.conf.js
================================================
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')

const env = process.env.NODE_ENV === 'testing'
  ? require('../config/test.env')
  : require('../config/prod.env')

const webpackConfig = merge(baseWebpackConfig, {
  module: {
    rules: utils.styleLoaders({
      sourceMap: config.build.productionSourceMap,
      extract: true,
      usePostCSS: true
    })
  },
  devtool: config.build.productionSourceMap ? config.build.devtool : false,
  output: {
    path: config.build.assetsRoot,
    filename: utils.assetsPath('js/[name].js'),
    chunkFilename: utils.assetsPath('js/[id].js')
  },
  plugins: [
    // http://vuejs.github.io/vue-loader/en/workflow/production.html
    new webpack.DefinePlugin({
      'process.env': env
    }),
    new UglifyJsPlugin({
      uglifyOptions: {
        compress: {
          warnings: false
        }
      },
      sourceMap: config.build.productionSourceMap,
      parallel: true
    }),
    // extract css into its own file
    new ExtractTextPlugin({
      filename: utils.assetsPath('css/[name].css'),
      // set the following option to `true` if you want to extract CSS from
      // codesplit chunks into this main css file as well.
      // This will result in *all* of your app's CSS being loaded upfront.
      allChunks: false,
    }),
    // Compress extracted CSS. We are using this plugin so that possible
    // duplicated CSS from different components can be deduped.
    new OptimizeCSSPlugin({
      cssProcessorOptions: config.build.productionSourceMap
        ? { safe: true, map: { inline: false } }
        : { safe: true }
    }),
    // generate dist index.html with correct asset hash for caching.
    // you can customize output by editing /index.html
    // see https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: process.env.NODE_ENV === 'testing'
        ? 'index.html'
        : config.build.index,
      template: 'index.html',
      inject: false,
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
      },
      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
      chunksSortMode: 'dependency'
    }),
    // keep module.id stable when vender modules does not change
    new webpack.HashedModuleIdsPlugin(),
    // enable scope hoisting
    new webpack.optimize.ModuleConcatenationPlugin(),
    // split vendor js into its own file
    new webpack.optimize.CommonsChunkPlugin({
      name: 'vendor',
      minChunks (module) {
        // any required modules inside node_modules are extracted to vendor
        return (
          module.resource &&
          /\.js$/.test(module.resource) &&
          module.resource.indexOf(
            path.join(__dirname, '../node_modules')
          ) === 0
        )
      }
    }),
    // extract webpack runtime and module manifest to its own file in order to
    // prevent vendor hash from being updated whenever app bundle is updated
    new webpack.optimize.CommonsChunkPlugin({
      name: 'manifest',
      minChunks: Infinity
    }),
    // This instance extracts shared chunks from code splitted chunks and bundles them
    // in a separate chunk, similar to the vendor chunk
    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
    new webpack.optimize.CommonsChunkPlugin({
      name: 'app',
      async: 'vendor-async',
      children: true,
      minChunks: 3
    }),

    // copy custom static assets
    new CopyWebpackPlugin([
      {
        from: path.resolve(__dirname, '../static'),
        to: config.build.assetsSubDirectory,
        ignore: ['.*']
      }
    ])
  ]
})

if (config.build.productionGzip) {
  const CompressionWebpackPlugin = require('compression-webpack-plugin')

  webpackConfig.plugins.push(
    new CompressionWebpackPlugin({
      asset: '[path].gz[query]',
      algorithm: 'gzip',
      test: new RegExp(
        '\\.(' +
        config.build.productionGzipExtensions.join('|') +
        ')$'
      ),
      threshold: 10240,
      minRatio: 0.8
    })
  )
}

if (config.build.bundleAnalyzerReport) {
  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
  webpackConfig.plugins.push(new BundleAnalyzerPlugin({ analyzerMode: 'static' }))
}

module.exports = webpackConfig


================================================
FILE: build/webpack.test.conf.js
================================================
'use strict'
// This is the webpack config used for unit tests.

const utils = require('./utils')
const webpack = require('webpack')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')

const webpackConfig = merge(baseWebpackConfig, {
  // use inline sourcemap for karma-sourcemap-loader
  module: {
    rules: utils.styleLoaders()
  },
  devtool: '#inline-source-map',
  resolveLoader: {
    alias: {
      // necessary to to make lang="scss" work in test when using vue-loader's ?inject option
      // see discussion at https://github.com/vuejs/vue-loader/issues/724
      'scss-loader': 'sass-loader'
    }
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': require('../config/test.env')
    })
  ]
})

// no need for app entry during tests
delete webpackConfig.entry

module.exports = webpackConfig


================================================
FILE: config/dev.env.js
================================================
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')

module.exports = merge(prodEnv, {
  NODE_ENV: '"development"',
  OPEN_PROXY: false // 是否开启代理, 重置后需重启vue-cli
})


================================================
FILE: config/index.js
================================================
'use strict'
// Template version: 1.2.5
// see http://vuejs-templates.github.io/webpack for documentation.

const path = require('path')
const devEnv = require('./dev.env')

module.exports = {
  dev: {

    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    // 代理列表, 是否开启代理通过[./dev.env.js]配置
    proxyTable: devEnv.OPEN_PROXY === false ? {} : {
      '/proxyApi': {
        target: 'http://demo.renren.io/renren-fast/',
        changeOrigin: true,
        pathRewrite: {
          '^/proxyApi': '/'
        }
      }
    },

    // Various Dev Server settings
    host: 'localhost', // can be overwritten by process.env.HOST
    port: 8001, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
    autoOpenBrowser: true,
    errorOverlay: true,
    notifyOnErrors: true,
    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-

    // Use Eslint Loader?
    // If true, your code will be linted during bundling and
    // linting errors and warnings will be shown in the console.
    useEslint: true,
    // If true, eslint errors and warnings will also be shown in the error overlay
    // in the browser.
    showEslintErrorsInOverlay: false,

    /**
     * Source Maps
     */

    // https://webpack.js.org/configuration/devtool/#development
    devtool: 'eval-source-map',

    // If you have problems debugging vue-files in devtools,
    // set this to false - it *may* help
    // https://vue-loader.vuejs.org/en/options.html#cachebusting
    cacheBusting: true,

    // CSS Sourcemaps off by default because relative paths are "buggy"
    // with this option, according to the CSS-Loader README
    // (https://github.com/webpack/css-loader#sourcemaps)
    // In our experience, they generally work as expected,
    // just be aware of this issue when enabling this option.
    cssSourceMap: false,
  },

  build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: './',

    /**
     * Source Maps
     */

    productionSourceMap: false,
    // https://webpack.js.org/configuration/devtool/#production
    devtool: '#source-map',

    // Gzip off by default as many popular static hosts such as
    // Surge or Netlify already gzip all static assets for you.
    // Before setting to `true`, make sure to:
    // npm install --save-dev compression-webpack-plugin
    productionGzip: false,
    productionGzipExtensions: ['js', 'css'],

    // Run the build command with an extra argument to
    // View the bundle analyzer report after build finishes:
    // `npm run build --report`
    // Set to `true` or `false` to always turn it on or off
    bundleAnalyzerReport: process.env.npm_config_report
  }
}


================================================
FILE: config/prod.env.js
================================================
'use strict'
module.exports = {
  NODE_ENV: '"production"'
}


================================================
FILE: config/test.env.js
================================================
'use strict'
const merge = require('webpack-merge')
const devEnv = require('./dev.env')

module.exports = merge(devEnv, {
  NODE_ENV: '"testing"'
})


================================================
FILE: debug.log
================================================
[0503/155252.466:ERROR:process_info.cc(359)] UncheckedAllocate
[0503/155313.696:ERROR:http_transport_win.cc(276)] WinHttpSendRequest: ɹɡ (0x0)


================================================
FILE: gulpfile.js
================================================
var gulp = require('gulp');
var $    = require('gulp-load-plugins')();
var path = require('path');
var del  = require('del');

var distPath    = path.resolve('./dist');
var version     = ''; // 版本号
var versionPath = ''; // 版本号路径
var env         = ''; // 运行环境

// 创建版本号(年月日时分)
(function () {
  var d = new Date();
  var yy = d.getFullYear().toString().slice(2);
  var MM = d.getMonth() + 1 >= 10 ? (d.getMonth() + 1) : '0' + (d.getMonth() + 1);
  var DD = d.getDate() >= 10 ? d.getDate() : '0' + d.getDate();
  var h  = d.getHours() >= 10 ? d.getHours() : '0' + d.getHours();
  var mm = d.getMinutes() >= 10 ? d.getMinutes() : '0' + d.getMinutes();
  version = yy + MM + DD + h + mm;
  versionPath = distPath + '/' + version;
})();

// 编译
gulp.task('build', $.shell.task([ 'node build/build.js' ]));

// 创建版本号目录
gulp.task('create:versionCatalog', ['build'], function () {
  return gulp.src(`${distPath}/static/**/*`)
    .pipe(gulp.dest(`${versionPath}/static/`))
});

// 替换${versionPath}/static/js/manifest.js window.SITE_CONFIG.cdnUrl占位变量
gulp.task('replace:cdnUrl', ['create:versionCatalog'], function () {
  return gulp.src(`${versionPath}/static/js/manifest.js`)
    .pipe($.replace(new RegExp(`"${require('./config').build.assetsPublicPath}"`, 'g'), 'window.SITE_CONFIG.cdnUrl + "/"'))
    .pipe(gulp.dest(`${versionPath}/static/js/`))
});

// 替换${versionPath}/static/config/index-${env}.js window.SITE_CONFIG['version']配置变量
gulp.task('replace:version', ['create:versionCatalog'], function () {
  return gulp.src(`${versionPath}/static/config/index-${env}.js`)
    .pipe($.replace(/window.SITE_CONFIG\['version'\] = '.*'/g, `window.SITE_CONFIG['version'] = '${version}'`))
    .pipe(gulp.dest(`${versionPath}/static/config/`))
});

// 合并${versionPath}/static/config/[index-${env}, init].js 至 ${distPath}/config/index.js
gulp.task('concat:config', ['replace:version'], function () {
  return gulp.src([`${versionPath}/static/config/index-${env}.js`, `${versionPath}/static/config/init.js`])
    .pipe($.concat('index.js'))
    .pipe(gulp.dest(`${distPath}/config/`))
});

// 清空
gulp.task('clean', function () {
  return del([versionPath])
});

gulp.task('default', ['clean'], function () {
  // 获取环境配置
  env = process.env.npm_config_qa ? 'qa' : process.env.npm_config_uat ? 'uat' : 'prod'
  // 开始打包编译
  gulp.start(['build', 'create:versionCatalog', 'replace:cdnUrl', 'replace:version', 'concat:config'], function () {
    // 清除, 编译 / 处理项目中产生的文件
    del([`${distPath}/static`, `${versionPath}/static/config`])
  })
});


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>人人快速开发平台</title>
  <link rel="shortcut icon" type="image/x-icon" href="./static/img/favicon.ico">
  <link rel="stylesheet" href="./static/base.css">
  <link rel="stylesheet" href="./static/reset.css">
  <link rel="stylesheet" href="./static/normalize.css">
  <link rel="stylesheet" href="./static/font/iconfont.css">
  <style type="text/css">
  .form-design-main .el-form-item{
  margin-bottom: 15px !important;
  }
  .form-design-main .el-dialog__header {
    display: none !important;
  }
  .form-design-main .el-dialog__body {
    padding: 10px;
  }
  </style>
  <% if (process.env.NODE_ENV === 'production') { %>
  <!-- 生产环境 -->
  <script>
    document.write('<script src="./config/index.js?t=' + new Date().getTime() + '"><\/script>');

  </script>
  <% }else { %>
  <!-- 开发环境 -->
  <script src="./static/config/index.js"></script>
  <script src="./static/plugins/mock-1.0.0-beta3/mock-min.js"></script>
  <script src="./static/plugins/echarts-3.8.5/echarts.common.min.js"></script>
  <script src="./static/plugins/ueditor-1.4.3.3/ueditor.config.js"></script>
  <script src="./static/plugins/ueditor-1.4.3.3/ueditor.all.min.js"></script>
  <script src="./static/plugins/ueditor-1.4.3.3/lang/zh-cn/zh-cn.js"></script>
  <% } %>
</head>

<body>
  <div id="app"></div>
</body>


</html>


================================================
FILE: package.json
================================================
{
  "name": "renren-fast-vue",
  "version": "1.2.2",
  "description": "renren-fast-vue基于vue、element-ui构建开发,实现renren-fast后台管理前端功能,提供一套更优的前端解决方案。",
  "author": "daxiong.yang <daxiong.yang@qq.com>",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "unit": "jest --config test/unit/jest.conf.js --coverage",
    "e2e": "node test/e2e/runner.js",
    "test": "npm run unit && npm run e2e",
    "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs",
    "build": "gulp"
  },
  "dependencies": {
    "axios": "0.17.1",
    "babel-plugin-component": "0.10.1",
    "babel-polyfill": "6.26.0",
    "element-ui": "^2.8.2",
    "gulp": "3.9.1",
    "gulp-concat": "2.6.1",
    "gulp-load-plugins": "1.5.0",
    "gulp-replace": "0.6.1",
    "gulp-shell": "0.6.5",
    "lodash": "4.17.5",
    "node-sass": "^4.9.0",
    "sass-loader": "6.0.6",
    "svg-sprite-loader": "3.7.3",
    "vue": "2.5.2",
    "vue-cookie": "1.1.4",
    "vue-router": "3.0.1",
    "vuedraggable": "^2.20.0",
    "vuex": "3.0.1"
  },
  "devDependencies": {
    "autoprefixer": "7.1.2",
    "babel-core": "6.22.1",
    "babel-eslint": "7.1.1",
    "babel-jest": "21.0.2",
    "babel-loader": "7.1.1",
    "babel-plugin-dynamic-import-node": "1.2.0",
    "babel-plugin-transform-es2015-modules-commonjs": "6.26.0",
    "babel-plugin-transform-runtime": "6.22.0",
    "babel-preset-env": "1.3.2",
    "babel-preset-stage-2": "6.22.0",
    "babel-register": "6.22.0",
    "chalk": "2.3.0",
    "chromedriver": "2.27.2",
    "copy-webpack-plugin": "4.0.1",
    "cross-spawn": "5.0.1",
    "css-loader": "0.28.0",
    "eslint": "3.19.0",
    "eslint-config-standard": "10.2.1",
    "eslint-friendly-formatter": "3.0.0",
    "eslint-loader": "1.7.1",
    "eslint-plugin-html": "3.0.0",
    "eslint-plugin-import": "2.7.0",
    "eslint-plugin-node": "5.2.0",
    "eslint-plugin-promise": "3.5.0",
    "eslint-plugin-standard": "3.0.1",
    "eventsource-polyfill": "0.9.6",
    "extract-text-webpack-plugin": "3.0.0",
    "file-loader": "1.1.4",
    "friendly-errors-webpack-plugin": "1.6.1",
    "html-webpack-plugin": "2.30.1",
    "jest": "21.2.0",
    "jest-serializer-vue": "0.3.0",
    "nightwatch": "0.9.12",
    "node-notifier": "5.1.2",
    "optimize-css-assets-webpack-plugin": "3.2.0",
    "ora": "1.2.0",
    "portfinder": "1.0.13",
    "postcss-import": "11.0.0",
    "postcss-loader": "2.0.8",
    "rimraf": "2.6.0",
    "selenium-server": "3.0.1",
    "semver": "5.3.0",
    "shelljs": "0.7.6",
    "uglifyjs-webpack-plugin": "1.1.1",
    "url-loader": "0.5.8",
    "vue-jest": "1.0.2",
    "vue-loader": "13.3.0",
    "vue-style-loader": "3.0.1",
    "vue-template-compiler": "2.5.2",
    "webpack": "3.6.0",
    "webpack-bundle-analyzer": "2.9.0",
    "webpack-dev-server": "2.9.1",
    "webpack-merge": "4.1.0"
  },
  "engines": {
    "node": ">= 8.11.1",
    "npm": ">= 5.6.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}


================================================
FILE: src/App.vue
================================================
<template>
  <transition name="fade">
    <router-view></router-view>
  </transition>
</template>

<script>
  export default {
  }
</script>


================================================
FILE: src/assets/scss/_base.scss
================================================
*,
*:before,
*:after {
  box-sizing: border-box;
}
body {
  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
  font-size: 14px;
  line-height: 1.15;
  color: #303133;
  background-color: #fff;
}
a {
  color: mix(#fff, $--color-primary, 20%);
  text-decoration: none;
  &:focus,
  &:hover {
    color: $--color-primary;
    text-decoration: underline;
  }
}
img {
  vertical-align: middle;
}


/* Utils
------------------------------ */
.clearfix:before,
.clearfix:after {
  content: " ";
  display: table;
}
.clearfix:after {
  clear: both;
}


/* Animation
------------------------------ */
.fade-enter-active,
.fade-leave-active {
  transition: opacity .5s;
}
.fade-enter,
.fade-leave-to {
  opacity: 0;
}


/* Reset element-ui
------------------------------ */
.site-wrapper {
  .el-pagination {
    margin-top: 15px;
    text-align: right;
  }
}


/* Layout
------------------------------ */
.site-wrapper {
  position: relative;
  min-width: 1180px;
}


/* Sidebar fold
------------------------------ */
.site-sidebar--fold {
  .site-navbar__header,
  .site-navbar__brand,
  .site-sidebar,
  .site-sidebar__inner,
  .el-menu.site-sidebar__menu {
    width: 64px;
  }
  .site-navbar__body,
  .site-content__wrapper {
    margin-left: 64px;
  }
  .site-navbar__brand {
    &-lg {
      display: none;
    }
    &-mini {
      display: inline-block;
    }
  }
  .site-sidebar,
  .site-sidebar__inner {
    overflow: initial;
  }
  .site-sidebar__menu-icon {
    margin-right: 0;
    font-size: 20px;
  }
  .site-content--tabs > .el-tabs > .el-tabs__header {
    left: 64px;
  }
}
// animation
.site-navbar__header,
.site-navbar__brand,
.site-navbar__body,
.site-sidebar,
.site-sidebar__inner,
.site-sidebar__menu.el-menu,
.site-sidebar__menu-icon,
.site-content__wrapper,
.site-content--tabs > .el-tabs .el-tabs__header {
  transition: inline-block .3s, left .3s, width .3s, margin-left .3s, font-size .3s;
}


/* Navbar
------------------------------ */
.site-navbar {
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  z-index: 1030;
  height: 50px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, .08);
  background-color: $navbar--background-color;

  &--inverse {
    .site-navbar__body {
      background-color: transparent;
    }
    .el-menu {
      > .el-menu-item,
      > .el-submenu > .el-submenu__title {
        color: #fff;
        &:focus,
        &:hover {
          color: #fff;
          background-color: mix(#000, $navbar--background-color, 15%);
        }
      }
      > .el-menu-item.is-active,
      > .el-submenu.is-active > .el-submenu__title {
        border-bottom-color: mix(#fff, $navbar--background-color, 85%);
      }
      .el-menu-item i,
      .el-submenu__title i,
      .el-dropdown {
        color: #fff;
      }
    }
    .el-menu--popup-bottom-start {
      background-color: $navbar--background-color;
    }
  }

  &__header {
    position: relative;
    float: left;
    width: 230px;
    height: 50px;
    overflow: hidden;
  }
  &__brand {
    display: table-cell;
    vertical-align: middle;
    width: 230px;
    height: 50px;
    margin: 0;
    line-height: 50px;
    font-size: 20px;
    text-align: center;
    text-transform: uppercase;
    white-space: nowrap;
    color: #fff;
    
    &-lg,
    &-mini {
      margin: 0 5px;
      color: #fff;
      &:focus,
      &:hover {
        color: #fff;
        text-decoration: none;
      }
    }
    &-mini {
      display: none;
    }
  }
  &__switch {
    font-size: 18px;
    border-bottom: none !important;
  }
  &__avatar {
    border-bottom: none !important;
    * {
      vertical-align: inherit;
    }
    .el-dropdown-link {
      > img {
        width: 36px;
        height: auto;
        margin-right: 5px;
        border-radius: 100%;
        vertical-align: middle;
      }
    }
  }
  &__body {
    position: relative;
    margin-left: 230px;
    padding-right: 15px;
    background-color: #fff;
  }
  &__menu {
    float: left;
    background-color: transparent;
    border-bottom: 0;

    &--right {
      float: right;
    }
    a:focus,
    a:hover {
      text-decoration: none;
    }
    .el-menu-item,
    .el-submenu > .el-submenu__title {
      height: 50px;
      line-height: 50px;
    }
    .el-submenu > .el-menu {
      top: 55px;
    }
    .el-badge {
      display: inline;
      z-index: 2;
      &__content {
        line-height: 16px;
      }
    }
  }
}


/* Sidebar
------------------------------ */
.site-sidebar {
  position: fixed;
  top: 50px;
  left: 0;
  bottom: 0;
  z-index: 1020;
  width: 230px;
  overflow: hidden;

  &--dark,
  &--dark-popper {
    background-color: $sidebar--background-color-dark;
    .site-sidebar__menu.el-menu,
    > .el-menu--popup {
      background-color: $sidebar--background-color-dark;
      .el-menu-item,
      .el-submenu > .el-submenu__title {
        color: $sidebar--color-text-dark;
        &:focus,
        &:hover {
          color: mix(#fff, $sidebar--color-text-dark, 50%);
          background-color: mix(#fff, $sidebar--background-color-dark, 2.5%);
        }
      }
      .el-menu,
      .el-submenu.is-opened {
        background-color: mix(#000, $sidebar--background-color-dark, 15%);
      }
      .el-menu-item.is-active,
      .el-submenu.is-active > .el-submenu__title {
        color: mix(#fff, $sidebar--color-text-dark, 80%);
      }
    }
  }
  &__inner {
    position: relative;
    z-index: 1;
    width: 250px;
    height: 100%;
    padding-bottom: 15px;
    overflow-y: scroll;
  }
  &__menu.el-menu {
    width: 230px;
    border-right: 0;
  }
  &__menu-icon {
    width: 24px;
    margin-right: 5px;
    text-align: center;
    font-size: 16px;
    color: inherit !important;
  }
}


/* Content
------------------------------ */
.site-content {
  position: relative;
  padding: 15px;

  &__wrapper {
    position: relative;
    padding-top: 50px;
    margin-left: 230px;
    min-height: 100%;
    background: $content--background-color;
  }
  &--tabs {
    padding: 55px 0 0;
  }
  > .el-tabs {
    > .el-tabs__header {
      position: fixed;
      top: 50px;
      left: 230px;
      right: 0;
      z-index: 930;
      padding: 0 55px 0 15px;
      box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .12), 0 0 6px 0 rgba(0, 0, 0, .04);
      background-color: #fff;
      > .el-tabs__nav-wrap {
        margin-bottom: 0;
        &:after {
          display: none;
        }
      }
    }
    > .el-tabs__content {
      padding: 0 15px 15px;
      > .site-tabs__tools {
        position: fixed;
        top: 50px;
        right: 0;
        z-index: 931;
        height: 40px;
        padding: 0 12px;
        font-size: 16px;
        line-height: 40px;
        background-color: $content--background-color;
        cursor: pointer;
        .el-icon--right {
          margin-left: 0;
        }
      }
    }
  }
}


================================================
FILE: src/assets/scss/_normalize.scss
================================================
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */

/* Document
   ========================================================================== */

/**
 * 1. Correct the line height in all browsers.
 * 2. Prevent adjustments of font size after orientation changes in
 *    IE on Windows Phone and in iOS.
 */

 html {
  line-height: 1.15; /* 1 */
  -ms-text-size-adjust: 100%; /* 2 */
  -webkit-text-size-adjust: 100%; /* 2 */
}

/* Sections
   ========================================================================== */

/**
 * Remove the margin in all browsers (opinionated).
 */

body {
  margin: 0;
}

/**
 * Add the correct display in IE 9-.
 */

article,
aside,
footer,
header,
nav,
section {
  display: block;
}

/**
 * Correct the font size and margin on `h1` elements within `section` and
 * `article` contexts in Chrome, Firefox, and Safari.
 */

h1 {
  font-size: 2em;
  margin: 0.67em 0;
}

/* Grouping content
   ========================================================================== */

/**
 * Add the correct display in IE 9-.
 * 1. Add the correct display in IE.
 */

figcaption,
figure,
main { /* 1 */
  display: block;
}

/**
 * Add the correct margin in IE 8.
 */

figure {
  margin: 1em 40px;
}

/**
 * 1. Add the correct box sizing in Firefox.
 * 2. Show the overflow in Edge and IE.
 */

hr {
  box-sizing: content-box; /* 1 */
  height: 0; /* 1 */
  overflow: visible; /* 2 */
}

/**
 * 1. Correct the inheritance and scaling of font size in all browsers.
 * 2. Correct the odd `em` font sizing in all browsers.
 */

pre {
  font-family: monospace, monospace; /* 1 */
  font-size: 1em; /* 2 */
}

/* Text-level semantics
   ========================================================================== */

/**
 * 1. Remove the gray background on active links in IE 10.
 * 2. Remove gaps in links underline in iOS 8+ and Safari 8+.
 */

a {
  background-color: transparent; /* 1 */
  -webkit-text-decoration-skip: objects; /* 2 */
}

/**
 * 1. Remove the bottom border in Chrome 57- and Firefox 39-.
 * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
 */

abbr[title] {
  border-bottom: none; /* 1 */
  text-decoration: underline; /* 2 */
  text-decoration: underline dotted; /* 2 */
}

/**
 * Prevent the duplicate application of `bolder` by the next rule in Safari 6.
 */

b,
strong {
  font-weight: inherit;
}

/**
 * Add the correct font weight in Chrome, Edge, and Safari.
 */

b,
strong {
  font-weight: bolder;
}

/**
 * 1. Correct the inheritance and scaling of font size in all browsers.
 * 2. Correct the odd `em` font sizing in all browsers.
 */

code,
kbd,
samp {
  font-family: monospace, monospace; /* 1 */
  font-size: 1em; /* 2 */
}

/**
 * Add the correct font style in Android 4.3-.
 */

dfn {
  font-style: italic;
}

/**
 * Add the correct background and color in IE 9-.
 */

mark {
  background-color: #ff0;
  color: #000;
}

/**
 * Add the correct font size in all browsers.
 */

small {
  font-size: 80%;
}

/**
 * Prevent `sub` and `sup` elements from affecting the line height in
 * all browsers.
 */

sub,
sup {
  font-size: 75%;
  line-height: 0;
  position: relative;
  vertical-align: baseline;
}

sub {
  bottom: -0.25em;
}

sup {
  top: -0.5em;
}

/* Embedded content
   ========================================================================== */

/**
 * Add the correct display in IE 9-.
 */

audio,
video {
  display: inline-block;
}

/**
 * Add the correct display in iOS 4-7.
 */

audio:not([controls]) {
  display: none;
  height: 0;
}

/**
 * Remove the border on images inside links in IE 10-.
 */

img {
  border-style: none;
}

/**
 * Hide the overflow in IE.
 */

svg:not(:root) {
  overflow: hidden;
}

/* Forms
   ========================================================================== */

/**
 * 1. Change the font styles in all browsers (opinionated).
 * 2. Remove the margin in Firefox and Safari.
 */

button,
input,
optgroup,
select,
textarea {
  font-family: sans-serif; /* 1 */
  font-size: 100%; /* 1 */
  line-height: 1.15; /* 1 */
  margin: 0; /* 2 */
}

/**
 * Show the overflow in IE.
 * 1. Show the overflow in Edge.
 */

button,
input { /* 1 */
  overflow: visible;
}

/**
 * Remove the inheritance of text transform in Edge, Firefox, and IE.
 * 1. Remove the inheritance of text transform in Firefox.
 */

button,
select { /* 1 */
  text-transform: none;
}

/**
 * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
 *    controls in Android 4.
 * 2. Correct the inability to style clickable types in iOS and Safari.
 */

button,
html [type="button"], /* 1 */
[type="reset"],
[type="submit"] {
  -webkit-appearance: button; /* 2 */
}

/**
 * Remove the inner border and padding in Firefox.
 */

button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
  border-style: none;
  padding: 0;
}

/**
 * Restore the focus styles unset by the previous rule.
 */

button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
  outline: 1px dotted ButtonText;
}

/**
 * Correct the padding in Firefox.
 */

fieldset {
  padding: 0.35em 0.75em 0.625em;
}

/**
 * 1. Correct the text wrapping in Edge and IE.
 * 2. Correct the color inheritance from `fieldset` elements in IE.
 * 3. Remove the padding so developers are not caught out when they zero out
 *    `fieldset` elements in all browsers.
 */

legend {
  box-sizing: border-box; /* 1 */
  color: inherit; /* 2 */
  display: table; /* 1 */
  max-width: 100%; /* 1 */
  padding: 0; /* 3 */
  white-space: normal; /* 1 */
}

/**
 * 1. Add the correct display in IE 9-.
 * 2. Add the correct vertical alignment in Chrome, Firefox, and Opera.
 */

progress {
  display: inline-block; /* 1 */
  vertical-align: baseline; /* 2 */
}

/**
 * Remove the default vertical scrollbar in IE.
 */

textarea {
  overflow: auto;
}

/**
 * 1. Add the correct box sizing in IE 10-.
 * 2. Remove the padding in IE 10-.
 */

[type="checkbox"],
[type="radio"] {
  box-sizing: border-box; /* 1 */
  padding: 0; /* 2 */
}

/**
 * Correct the cursor style of increment and decrement buttons in Chrome.
 */

[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
  height: auto;
}

/**
 * 1. Correct the odd appearance in Chrome and Safari.
 * 2. Correct the outline style in Safari.
 */

[type="search"] {
  -webkit-appearance: textfield; /* 1 */
  outline-offset: -2px; /* 2 */
}

/**
 * Remove the inner padding and cancel buttons in Chrome and Safari on macOS.
 */

[type="search"]::-webkit-search-cancel-button,
[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
}

/**
 * 1. Correct the inability to style clickable types in iOS and Safari.
 * 2. Change font properties to `inherit` in Safari.
 */

::-webkit-file-upload-button {
  -webkit-appearance: button; /* 1 */
  font: inherit; /* 2 */
}

/* Interactive
   ========================================================================== */

/*
 * Add the correct display in IE 9-.
 * 1. Add the correct display in Edge, IE, and Firefox.
 */

details, /* 1 */
menu {
  display: block;
}

/*
 * Add the correct display in all browsers.
 */

summary {
  display: list-item;
}

/* Scripting
   ========================================================================== */

/**
 * Add the correct display in IE 9-.
 */

canvas {
  display: inline-block;
}

/**
 * Add the correct display in IE.
 */

template {
  display: none;
}

/* Hidden
   ========================================================================== */

/**
 * Add the correct display in IE 10-.
 */

[hidden] {
  display: none;
}

================================================
FILE: src/assets/scss/_variables.scss
================================================
// 站点主色
// tips: 要达到整站主题修改效果, 请确保[$--color-primary]站点主色与[/src/element-ui-theme/index.js]文件中[import './element-[#17B3A3]/index.css']当前主题色一致
$--color-primary: #17B3A3;

// Navbar
$navbar--background-color: $--color-primary;

// Sidebar
$sidebar--background-color-dark: #263238;
$sidebar--color-text-dark: #8a979e;

// Content
$content--background-color: #f1f4f5;


================================================
FILE: src/assets/scss/index.scss
================================================
@import "normalize";       // api: https://github.com/necolas/normalize.css/
@import "variables";       // 站点变量
@import "base";


================================================
FILE: src/components/common/ApprovalPanel.vue
================================================
<!--
 * @Description: 审批主面板
 * @Author: zzj
 * @Date: 2019-08-09 08:37:25
 * @LastEditTime: 2019-12-10 11:39:55
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-row :gutter="20" style="border: 1px solid gray;border-bottom: none;">
    <Material
      :readOnly="readOnly"
      :materialListProp="materialDatas"
      :otherMaterialListProp="otherMaterialList"
      @materialListCallBack="materialListCallBack"
      @otherMaterialListCallBack="otherMaterialListCallBack"
    />
    <el-col :span="12" v-loading="loadingForm" style="border-left: 1px solid gray;padding: 0 20px;">
      <el-divider content-position="left">表单</el-divider>
      <el-form
        :label-position="formAttr.align"
        :label-width="formAttr.labelWidth"
        :size="formAttr.size"
        :rules="rules"
        v-if="!formAttr.isTabs"
        :model="formValue"
        ref="formValue"
      >
        <FormList :formListProp="formList" @callBack="formListCallBack" />
      </el-form>

      <el-tabs :type="formAttr.tabType" v-else v-model="tabIndex">
        <el-tab-pane
          :label="item.name"
          :name="String(i)"
          v-for="(item, i) in formAttr.tabs"
          :key="i"
        >
          <el-form
            :label-position="formAttr.align"
            :label-width="formAttr.labelWidth"
            :size="formAttr.size"
            :model="formValue"
            :rules="rules"
            :ref="'formValue'+i"
          >
            <FormList :formListProp="formList" @callBack="formListCallBack" />
          </el-form>
        </el-tab-pane>
      </el-tabs>
    </el-col>
  </el-row>
</template>

<script>
import common from '@/utils/common'
import FormList from '@/components/form-design/view/FormList'
import Material from '@/components/form-design/view/Material'

export default {
  props: {
    // 表单数据
    formData: {
      type: Object,
      default: function () {
        return {}
      }
    },
    // 表单
    dycForm: {
      type: Object,
      default: function () {
        return {}
      }
    },
    // 受理材料
    materialList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 其他材料
    otherMaterialList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 申请表单域
    applyFormList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 预审表单域
    precheckFormList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 系统默认值大全
    formDefaultValue: {
      type: Object,
      default: function () {
        return {}
      }
    },
    readOnly: {
      type: Boolean,
      default: true
    }
  },
  data () {
    return {
      visible: true,
      dialogVisible: false,
      formAttr: {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      },
      tabIndex: '0',
      rules: {},
      formValue: {},
      formList: [],
      loading: null,
      loadingForm: true,
      materialDatas: []
    }
  },
  mounted () { },
  components: { FormList, Material },
  activated () {
    // this.getDataList();
  },
  methods: {
    // 子组件回调模块 start
    formListCallBack (value) {
      this.formList = value
    },
    materialListCallBack (value) {
      this.materialDatas = value
      this.$emit('materialListCallBack', value)
    },
    otherMaterialListCallBack (value) {
      this.$emit('otherMaterialListCallBack', value)
    },
    // 子组件回调模块 end
    reset () {
      this.formAttr = {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      }
      this.tabIndex = '0'
      this.rules = {}
      this.formValue = {}
      this.formList = []
    },
    verifyFile () {
      for (let i = 0; i < this.materialDatas.length; i++) {
        const element = this.materialDatas[i]
        if (
          element.required === 1 &&
          (element.state === 0 ||
            !element.fileVoList ||
            !element.fileVoList.length)
        ) {
          this.$message({
            message: `请上传受理材料【${element.materialsName}】`,
            type: 'warning',
            duration: 1500
          })
          return false
        }
      }
      return true
    },
    verifyTabForm (index, maxIndex, resolve, reject) {
      let validateFun = () => {
        this.$refs['formValue' + index][0].validate((valid, obj) => {
          if (valid) {
            if (index < maxIndex - 1) {
              this.verifyTabForm(index + 1, maxIndex, resolve, resolve)
            } else {
              resolve()
            }
          } else {
            reject(obj)
            this.$emit('formDataNotFinishCallBack')
            return false
          }
        })
      }
      if (index.toString() !== this.tabIndex) {
        this.tabIndex = index.toString()
        this.$nextTick(_ => validateFun())
      } else {
        validateFun()
      }
    },
    verifyForm (resolve, reject) {
      this.$refs['formValue'].validate((valid, obj) => {
        if (valid) {
          resolve()
        } else {
          reject(obj)
          this.$emit('formDataNotFinishCallBack')
          return false
        }
      })
    },
    // 最多五层tabs校验
    save (isSubmit = false) {
      if (!isSubmit) {
        // rules为空则代表是保存,不是提交,此时文件不提交状态
        // this.tabIndex = '0'
        this.saveForApi(isSubmit)
      } else {
        if (!this.verifyFile()) {
          this.$emit('formDataNotFinishCallBack')
          return
        }
        // 验证

        let verifyFailed = valid => {
          this.$message.error('必填项不能为空,请补充表单信息!')
        }

        let verifySuccess = () => {
          // this.tabIndex = '0'
          // 解决不切换tab直接提交数据,此时主动获取第一个tab的数据 start
          // this.updateCurrentTabFormList(-1, 0)
          // end
          this.saveForApi(isSubmit)
        }

        if (this.formAttr.isTabs) {
          this.verifyTabForm(
            0,
            this.formAttr.tabs.length,
            verifySuccess,
            verifyFailed
          )
        } else {
          this.verifyForm(verifySuccess, verifyFailed)
        }
      }
    },
    saveForApi (isSubmit) {
      // 组装formData
      let formData = {}

      let setFormData = formList => {
        formList.forEach(element => {
          if (element.type === 'grid') {
            element.cols.forEach(element2 => {
              element2.list.forEach(element3 => {
                if (element3.type !== 'grid' && !common.isEmpty(element3.options.defaultValue)) {
                  formData[element3.code] = element3.options.defaultValue
                }
              })
            })
          } else {
            if (!common.isEmpty(element.options.defaultValue)) {
              let value = element.options.defaultValue
              if (element.type === 'idea') {
                const realname = '管理员'
                const nowDate = common.formatDateCN(new Date().getTime())
                if (value.indexOf(realname) === -1 && value.indexOf('年') === -1 && value.indexOf('月') === -1 && value.indexOf('日') === -1) {
                  value = `${value}\n\n                                                  ${realname}\n                                                  ${nowDate}`
                }
              }
              formData[element.code] = value
            }
          }
        })
      }

      if (this.formAttr.isTabs) {
        this.updateCurrentTabFormList(-1, this.tabIndex)
        this.formAttr.tabs.forEach(tab => {
          setFormData(tab.formList)
        })
      } else {
        setFormData(this.formList)
      }
      this.tabIndex = '0'
      this.$emit('formDataCallBack', formData, isSubmit)
    },
    fillValueToFormList (formList, formData) {
      const oldFormValue = formData

      // let keys = [...this.applyFormList, ...this.precheckFormList]

      // 设置默认值
      // console.warn('formList', common.deepClone(formList))
      formList.forEach((element, i) => {
        if (element.type === 'grid') {
          element.cols.forEach((element2, j) => {
            element2.list.forEach((element3, k) => {
              // console.warn('element3', element3, i, j, k)
              if (element3.type !== 'grid' && this.formDefaultValue.hasOwnProperty(element3.options.defaultValue)) {
                if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element3.code)) {
                  element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                }
                if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element3.code)) {
                  element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                }
              }
            })
          })
        } else {
          if (this.formDefaultValue.hasOwnProperty(element.options.defaultValue)) {
            if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element.code)) {
              element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
            }
            if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element.code)) {
              element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
            }
          }
        }
      })

      // start
      formList.forEach(element => {
        for (const key in oldFormValue) {
          if (oldFormValue.hasOwnProperty(key)) {
            if (element.type === 'grid') {
              element.cols.forEach(element2 => {
                element2.list.forEach(element3 => {
                  if (element3.type !== 'grid' && key === element3.code) {
                    element3.options.defaultValue = oldFormValue[key]
                    if (this.formDefaultValue.hasOwnProperty(element3.options.defaultValue)) {
                      if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element3.code)) {
                        element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                      }
                      if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element3.code)) {
                        element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                      }
                    }
                  }
                })
              })
            } else {
              if (key === element.code) {
                element.options.defaultValue = oldFormValue[key]
                if (this.formDefaultValue.hasOwnProperty(element.options.defaultValue)) {
                  if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element.code)) {
                    element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
                  }
                  if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element.code)) {
                    element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
                  }
                }
              }
            }
          }
        }
      })

      return formList
    },
    init () {
      this.visible = true
      this.$nextTick(() => {
        this.loadingForm = true
        this.reset()
        let content = JSON.parse(this.dycForm.content)
        this.formAttr = content.formAttr
        let formList = content.formList
        if (this.formAttr.isTabs) {
          // tab多页
          this.tabIndex = '0'

          // 把原来的formData的值设置进去
          this.formAttr.tabs.forEach(element => {
            element.formList = this.fillValueToFormList(
              element.formList,
              this.formData
            )
          })
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(this.formAttr.tabs[0].formList)
          )
          this.formList = common.deepClone(this.formAttr.tabs[0].formList)

          this.initFormRule(
            this.formList,
            this.applyFormList,
            this.precheckFormList
          )
          this.initDisabledField(this.applyFormList, this.precheckFormList)
        } else {
          // 单页

          // 把原来的formData的值设置进去
          let formListFilled = this.fillValueToFormList(
            formList,
            this.formData
          )
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(formListFilled)
          )
          this.formList = common.deepClone(formListFilled)

          this.initFormRule(
            this.formList,
            this.applyFormList,
            this.precheckFormList
          )
          this.initDisabledField(this.applyFormList, this.precheckFormList)
        }
        this.loadingForm = false
      })
    },
    initFormRule (formList, applyFormList = [], precheckFormList = []) {
      let keys = (() => {
        if (!common.isEmpty(applyFormList) && !common.isEmpty(precheckFormList)) { return [...applyFormList, ...precheckFormList] }
        if (!common.isEmpty(applyFormList)) return applyFormList
        if (!common.isEmpty(precheckFormList)) return precheckFormList
        return []
      })()
      let rules = {}
      formList.forEach(element => {
        if (element.type === 'grid') {
          element.cols.forEach(element2 => {
            element2.list.forEach(element3 => {
              if (element3.type !== 'grid' && element3.options.required && keys.includes(element3.code)) {
                rules[element3.code] = [
                  {
                    required: element3.options.required,
                    message: '必填项不能为空',
                    trigger: 'blur'
                  }
                ]
              } else {
                rules[element3.code] = [
                  {
                    required: false
                  }
                ]
              }
            })
          })
        } else {
          if (element.options.required && keys.includes(element.code)) {
            rules[element.code] = [
              {
                required: element.options.required,
                message: '必填项不能为空',
                trigger: 'blur'
              }
            ]
          }
        }
      })
      this.rules = rules

      let formValue = {}
      for (const key in this.rules) {
        if (this.rules.hasOwnProperty(key)) {
          formValue[key] = ''
        }
      }
      this.formValue = formValue
    },
    initDisabledField (applyFormList = [], precheckFormList = []) {
      let keys = (() => {
        if (!common.isEmpty(applyFormList)) return applyFormList
        if (!common.isEmpty(precheckFormList)) return precheckFormList
        return []
      })()
      // this.dycForm.columnList.forEach(element => {
      //   if ([...applyFormList, ...precheckFormList].includes(element.tableColumnCode)) {
      //     keys.push(element.code)
      //   }
      // })

      this.formList.forEach(element => {
        if (element.type === 'grid') {
          element.cols.forEach(element2 => {
            element2.list.forEach(element3 => {
              if (element3.type !== 'grid' && !keys.includes(element3.code)) {
                element3.options.disabled = true
              }
            })
          })
        } else {
          if (!keys.includes(element.code)) {
            element.options.disabled = true
          }
        }
      })
    },
    updateCurrentTabFormList (newTabIndex, oldTabIndex) {
        // this.loadingForm = true
        // 切换tab之前,赋值给formAttr
      this.formAttr.tabs[oldTabIndex].formList = common.deepClone(this.formList)

      if (newTabIndex === -1 || newTabIndex === '-1') return

        // 赋值新tab
      this.$store.dispatch(
          'formDesign/setFormList',
          common.deepClone(this.formAttr.tabs[Number(newTabIndex)].formList)
        )
      this.formList = common.deepClone(
          this.formAttr.tabs[Number(newTabIndex)].formList
        )
      let formList = this.formAttr.tabs[Number(newTabIndex)].formList
      this.initFormRule(formList, this.applyFormList, this.precheckFormList)
      this.initDisabledField(this.applyFormList, this.precheckFormList)
    }
  },
  watch: {
    tabIndex: {
      handler: function (newTabIndex, oldTabIndex) {
        console.log('newTabIndex, oldTabIndex', newTabIndex, oldTabIndex)
        this.updateCurrentTabFormList(newTabIndex, oldTabIndex)
      },
      deep: true
    },
    formValue: {
      handler: function (value, oldValue) {
      },
      deep: true
    },
    materialList: {
      handler (value) {
        this.materialDatas = value
      },
      immediate: true,
      deep: true
    },
    formList: {
      handler: function (value, oldValue) {
        if (common.isEmpty(value)) return

        let keys = [...this.applyFormList, ...this.precheckFormList]

        common.deepClone(value).forEach(element => {
          for (const key in this.formValue) {
            if (this.formValue.hasOwnProperty(key)) {
              if (element.type === 'grid') {
                element.cols.forEach(element2 => {
                  element2.list.forEach(element3 => {
                    if (element3.type !== 'grid' && key === element3.code && keys.includes(key)) {
                      this.formValue[key] = element3.options.defaultValue
                    }
                  })
                })
              } else {
                if (key === element.code && keys.includes(key)) {
                  this.formValue[key] = element.options.defaultValue
                }
              }
            }
          }
        })
      },
      deep: true
    },
    formData: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    dycForm: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    applyFormList: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    precheckFormList: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    formDefaultValue: {
      handler: function () {
        this.init()
      },
      deep: true
    }
  }
}
</script>


================================================
FILE: src/components/common/DocumentPanel.vue
================================================
<!--
 * @Description: 审批主面板
 * @Author: zzj
 * @Date: 2019-08-09 08:37:25
 * @LastEditTime: 2019-11-11 14:10:19
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-row :gutter="20" style="border: 1px solid gray;border-bottom: none;">
    <Document
      :readOnly="readOnly"
      :dfileListProp="dfileList"
      @dfileListCallBack="dfileListCallBack"
    />
    <el-col :span="12" v-loading="loadingForm" style="border-left: 1px solid gray;margin-left: -1px;padding: 0 20px;">
      <el-divider content-position="left">表单</el-divider>
      <el-form
        :label-position="formAttr.align"
        :label-width="formAttr.labelWidth"
        :size="formAttr.size"
        :rules="rules"
        v-if="!formAttr.isTabs"
        :model="formValue"
        ref="formValue"
      >
        <FormList :formListProp="formList" @callBack="formListCallBack" />
      </el-form>

      <el-tabs :type="formAttr.tabType" v-else v-model="tabIndex">
        <el-tab-pane
          :label="item.name"
          :name="String(i)"
          v-for="(item, i) in formAttr.tabs"
          :key="i"
        >
          <el-form
            :label-position="formAttr.align"
            :label-width="formAttr.labelWidth"
            :size="formAttr.size"
            :model="formValue"
            :rules="rules"
            :ref="'formValue'+i"
          >
            <FormList :formListProp="formList" @callBack="formListCallBack" />
          </el-form>
        </el-tab-pane>
      </el-tabs>
    </el-col>
  </el-row>
</template>

<script>
import common from '@/utils/common'
import FormList from '@/components/form-design/view/FormList'
import Document from '@/components/form-design/view/Document'

export default {
  props: {
    // 表单数据
    formData: {
      type: Object,
      default: function () {
        return {}
      }
    },
    // 表单
    dycForm: {
      type: Object,
      default: function () {
        return {}
      }
    },
    // 受理材料
    materialList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 其他材料
    dfileList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 申请表单域
    applyFormList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 预审表单域
    precheckFormList: {
      type: Array,
      default: function () {
        return []
      }
    },
    // 系统默认值大全
    formDefaultValue: {
      type: Object,
      default: function () {
        return {}
      }
    },
    readOnly: {
      type: Boolean,
      default: true
    }
  },
  data () {
    return {
      visible: true,
      dialogVisible: false,
      formAttr: {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      },
      tabIndex: '0',
      rules: {},
      formValue: {},
      formList: [],
      loading: null,
      loadingForm: true
    }
  },
  mounted () { },
  components: { FormList, Document },
  activated () {
    // this.getDataList();
  },
  methods: {
    // 子组件回调模块 start
    formListCallBack (value) {
      console.log(
        'ApprovalPanl formListCallBack value',
        common.deepClone(value)
      )
      this.formList = value
    },
    dfileListCallBack (value) {
      this.$emit('dfileListCallBack', value)
    },
    // 子组件回调模块 end
    reset () {
      this.formAttr = {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      }
      this.tabIndex = '0'
      this.rules = {}
      this.formValue = {}
      this.formList = []
    },
    verifyFile () {
      // for (let i = 0; i < this.materialDatas.length; i++) {
      //   const element = this.materialDatas[i]
      //   if (
      //     element.required === 1 &&
      //     (element.state === 0 ||
      //       !element.fileVoList ||
      //       !element.fileVoList.length)
      //   ) {
      //     this.$message({
      //       message: `请上传受理材料【${element.materialsName}】`,
      //       type: 'warning',
      //       duration: 1500
      //     })
      //     return false
      //   }
      // }
      return true
    },
    verifyTabForm (index, maxIndex, resolve, reject) {
      let validateFun = () => {
        this.$refs['formValue' + index][0].validate((valid, obj) => {
          if (valid) {
            if (index < maxIndex - 1) {
              this.verifyTabForm(index + 1, maxIndex, resolve, resolve)
            } else {
              resolve()
            }
          } else {
            reject(obj)
            this.$emit('formDataNotFinishCallBack')
            return false
          }
        })
      }
      if (index.toString() !== this.tabIndex) {
        this.tabIndex = index.toString()
        this.$nextTick(_ => validateFun())
      } else {
        validateFun()
      }
    },
    verifyForm (resolve, reject) {
      this.$refs['formValue'].validate((valid, obj) => {
        if (valid) {
          resolve()
        } else {
          reject(obj)
          this.$emit('formDataNotFinishCallBack')
          return false
        }
      })
    },
    // 最多五层tabs校验
    save (isSubmit = false) {
      if (!isSubmit) {
        // rules为空则代表是保存,不是提交,此时文件不提交状态
        this.tabIndex = '0'
        this.saveForApi(isSubmit)
      } else {
        if (!this.verifyFile()) {
          this.$emit('formDataNotFinishCallBack')
          return
        }
        // 验证

        let verifyFailed = valid => {
          this.$message.error('必填项不能为空,请补充表单信息!')
        }

        let verifySuccess = () => {
          this.tabIndex = '0'
          this.saveForApi(isSubmit)
        }

        if (this.formAttr.isTabs) {
          this.verifyTabForm(
            0,
            this.formAttr.tabs.length,
            verifySuccess,
            verifyFailed
          )
        } else {
          this.verifyForm(verifySuccess, verifyFailed)
        }
      }
    },
    saveForApi (isSubmit) {
      // 组装formData
      let formData = {}

      let setFormData = formList => {
        formList.forEach(element => {
          if (element.type === 'grid') {
            element.cols.forEach(element2 => {
              element2.list.forEach(element3 => {
                if (!common.isEmpty(element3.options.defaultValue)) {
                  formData[element3.code] = element3.options.defaultValue
                }
              })
            })
          } else {
            if (!common.isEmpty(element.options.defaultValue)) {
              let value = element.options.defaultValue
              if (element.type === 'idea') {
                const realname = '管理员'
                const nowDate = common.formatDateCN(new Date().getTime())
                if (value.indexOf(realname) === -1 && value.indexOf('年') === -1 && value.indexOf('月') === -1 && value.indexOf('日') === -1) {
                  value = `${value}\n\n                                                  ${realname}\n                                                  ${nowDate}`
                }
              }
              formData[element.code] = value
            }
          }
        })
      }

      if (this.formAttr.isTabs) {
        this.formAttr.tabs.forEach(tab => {
          setFormData(tab.formList)
        })
      } else {
        setFormData(this.formList)
      }

      console.log('save formData', formData)
      this.$emit('formDataCallBack', formData, isSubmit)
    },
    fillValueToFormList (formList, formData) {
      const oldFormValue = formData

      // let keys = [...this.applyFormList, ...this.precheckFormList]

      // 设置默认值
      formList.forEach(element => {
        if (element.type === 'grid') {
          element.cols.forEach(element2 => {
            element2.list.forEach(element3 => {
              if (this.formDefaultValue.hasOwnProperty(element3.options.defaultValue)) {
                if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element3.code)) {
                  element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                }
                if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element3.code)) {
                  element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                }
              }
            })
          })
        } else {
          if (this.formDefaultValue.hasOwnProperty(element.options.defaultValue)) {
            if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element.code)) {
              element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
            }
            if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element.code)) {
              element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
            }
          }
        }
      })

      // start
      formList.forEach(element => {
        for (const key in oldFormValue) {
          if (oldFormValue.hasOwnProperty(key)) {
            if (element.type === 'grid') {
              element.cols.forEach(element2 => {
                element2.list.forEach(element3 => {
                  if (key === element3.code) {
                    element3.options.defaultValue = oldFormValue[key]
                    if (this.formDefaultValue.hasOwnProperty(element3.options.defaultValue)) {
                      if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element3.code)) {
                        element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                      }
                      if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element3.code)) {
                        element3.options.defaultValue = this.formDefaultValue[element3.options.defaultValue]
                      }
                    }
                  }
                })
              })
            } else {
              if (key === element.code) {
                element.options.defaultValue = oldFormValue[key]
                if (this.formDefaultValue.hasOwnProperty(element.options.defaultValue)) {
                  if (!common.isEmpty(this.applyFormList) && this.applyFormList.includes(element.code)) {
                    element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
                  }
                  if (!common.isEmpty(this.precheckFormList) && this.precheckFormList.includes(element.code)) {
                    element.options.defaultValue = this.formDefaultValue[element.options.defaultValue]
                  }
                }
              }
            }
          }
        }
      })

      return formList
    },
    init () {
      this.visible = true
      this.$nextTick(() => {
        this.loadingForm = true
        this.reset()
        let content = JSON.parse(this.dycForm.content)
        this.formAttr = content.formAttr
        let formList = content.formList
        if (this.formAttr.isTabs) {
          // tab多页
          this.tabIndex = '0'

          // 把原来的formData的值设置进去
          this.formAttr.tabs.forEach(element => {
            element.formList = this.fillValueToFormList(
              element.formList,
              this.formData
            )
          })
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(this.formAttr.tabs[0].formList)
          )
          this.formList = common.deepClone(this.formAttr.tabs[0].formList)

          this.initFormRule(
            this.formList,
            this.applyFormList,
            this.precheckFormList
          )
          this.initDisabledField(this.applyFormList, this.precheckFormList)
        } else {
          // 单页

          // 把原来的formData的值设置进去
          let formListFilled = this.fillValueToFormList(
            formList,
            this.formData
          )
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(formListFilled)
          )
          this.formList = common.deepClone(formListFilled)

          this.initFormRule(
            this.formList,
            this.applyFormList,
            this.precheckFormList
          )
          this.initDisabledField(this.applyFormList, this.precheckFormList)
        }
        this.loadingForm = false
      })
    },
    initFormRule (formList, applyFormList = [], precheckFormList = []) {
      let keys = (() => {
        if (!common.isEmpty(applyFormList) && !common.isEmpty(precheckFormList)) { return [...applyFormList, ...precheckFormList] }
        if (!common.isEmpty(applyFormList)) return applyFormList
        if (!common.isEmpty(precheckFormList)) return precheckFormList
        return []
      })()
      let rules = {}
      formList.forEach(element => {
        if (element.type === 'grid') {
          element.cols.forEach(element2 => {
            element2.list.forEach(element3 => {
              if (element3.options.required && keys.includes(element3.code)) {
                rules[element3.code] = [
                  {
                    required: element3.options.required,
                    message: '必填项不能为空',
                    trigger: 'blur'
                  }
                ]
              } else {
                rules[element3.code] = [
                  {
                    required: false
                  }
                ]
              }
            })
          })
        } else {
          if (element.options.required && keys.includes(element.code)) {
            rules[element.code] = [
              {
                required: element.options.required,
                message: '必填项不能为空',
                trigger: 'blur'
              }
            ]
          }
        }
      })
      this.rules = rules

      console.log('form rules', rules)

      let formValue = {}
      for (const key in this.rules) {
        if (this.rules.hasOwnProperty(key)) {
          formValue[key] = ''
        }
      }
      this.formValue = formValue
    },
    initDisabledField (applyFormList = [], precheckFormList = []) {
      let keys = (() => {
        if (!common.isEmpty(applyFormList)) return applyFormList
        if (!common.isEmpty(precheckFormList)) return precheckFormList
        return []
      })()
      // this.dycForm.columnList.forEach(element => {
      //   if ([...applyFormList, ...precheckFormList].includes(element.tableColumnCode)) {
      //     keys.push(element.code)
      //   }
      // })

      this.formList.forEach(element => {
        if (element.type === 'grid') {
          element.cols.forEach(element2 => {
            element2.list.forEach(element3 => {
              if (!keys.includes(element3.code)) {
                element3.options.disabled = true
              }
            })
          })
        } else {
          if (!keys.includes(element.code)) {
            element.options.disabled = true
          }
        }
      })
    }
  },
  watch: {
    tabIndex: {
      handler: function (newValue, oldValue) {
        // this.loadingForm = true
        // 切换tab之前,赋值给formAttr
        this.formAttr.tabs[oldValue].formList = common.deepClone(this.formList)

        if (newValue === -1 || newValue === '-1') return

        // 赋值新tab
        this.$store.dispatch(
          'formDesign/setFormList',
          common.deepClone(this.formAttr.tabs[Number(newValue)].formList)
        )
        this.formList = common.deepClone(
          this.formAttr.tabs[Number(newValue)].formList
        )
        let formList = this.formAttr.tabs[Number(newValue)].formList
        this.initFormRule(formList, this.applyFormList, this.precheckFormList)
        this.initDisabledField(this.applyFormList, this.precheckFormList)

        // setTimeout(() => {
        //   this.loadingForm = false
        // }, 500)
      },
      deep: true
    },
    formValue: {
      handler: function (value, oldValue) {
        // console.log('watch formValue', value)
      },
      deep: true
    },
    // materialList: {
    //   handler (value) {
    //     this.materialDatas = value
    //   },
    //   immediate: true,
    //   deep: true
    // },
    formList: {
      handler: function (value, oldValue) {
        console.log('watch formList', value)

        if (common.isEmpty(value)) return

        let keys = [...this.applyFormList, ...this.precheckFormList]

        common.deepClone(value).forEach(element => {
          for (const key in this.formValue) {
            if (this.formValue.hasOwnProperty(key)) {
              if (element.type === 'grid') {
                element.cols.forEach(element2 => {
                  element2.list.forEach(element3 => {
                    if (key === element3.code && keys.includes(key)) {
                      this.formValue[key] = element3.options.defaultValue
                    }
                  })
                })
              } else {
                if (key === element.code && keys.includes(key)) {
                  this.formValue[key] = element.options.defaultValue
                }
              }
            }
          }
        })

        console.log('this.formValue', this.formValue)
      },
      deep: true
    },
    formData: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    dycForm: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    applyFormList: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    precheckFormList: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    formDefaultValue: {
      handler: function () {
        this.init()
      },
      deep: true
    }
  }
}
</script>


================================================
FILE: src/components/common/FormPreview.vue
================================================
<!--
 * @Description: 审批主面板
 * @Author: zzj
 * @Date: 2019-08-09 08:37:25
 * @LastEditTime: 2019-10-18 11:22:58
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-dialog
    :close-on-click-modal="false"
    :visible.sync="visible"
    append-to-body
    :show-close="true"
    custom-class="form-preview"
    title="表单预览"
  >
    <span slot="title" class="dialog-btn-title">
      <span class="el-dialog__title" style="margin-right: 10px;">表单预览</span>
      <el-button type="primary" icon="el-icon-printer" v-print="'#form-preview-print'">打印</el-button>
    </span>

    <el-row :gutter="20" id="form-preview-print" style="margin-top: 15px;">
      <el-col :span="24" v-loading="loadingForm">
        <el-form
          :label-position="formAttr.align"
          :label-width="formAttr.labelWidth"
          :size="formAttr.size"
          :rules="rules"
          v-if="!formAttr.isTabs"
          :model="formValue"
          ref="formValue"
        >
          <FormList :formListProp="formList" @callBack="formListCallBack" />
        </el-form>

        <template v-else v-for="(item, i) in formAttr.tabs">
          <el-divider :key="i" content-position="left" style="background-color:#DCDFE6 !important;">{{item.name}}</el-divider>
          <el-form
            :key="i"
            :label-position="formAttr.align"
            :label-width="formAttr.labelWidth"
            :size="formAttr.size"
            :rules="rules"
            :model="formValue"
            ref="formValue"
          >
            <FormList :formListProp="item.formList" @callBack="formListCallBack" />
          </el-form>
          <p style="margin-bottom: 120px;" :key="i"></p>
          <div style="page-break-after:always" :key="i"></div>
        </template>
      </el-col>
    </el-row>
  </el-dialog>
</template>

<script>
import common from '@/utils/common'
import FormList from '@/components/form-design/view/FormList'

export default {
  props: {
    // 表单数据
    formData: {
      type: Object,
      default: function () {
        return {}
      }
    },
    // 表单
    dycForm: {
      type: Object,
      default: function () {
        return []
      }
    }
  },
  data () {
    return {
      visible: false,
      dialogVisible: false,
      formAttr: {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      },
      tabIndex: '0',
      saveData: {
        approvalPutinVo: {
          materialList: [],
          otherMaterialList: [],
          formData: {}
        },
        dycForm: { columnList: [] }
      },
      rules: {},
      formValue: {},
      formList: [],
      loading: null,
      loadingForm: true,
      fullscreenLoading: false
    }
  },
  mounted () { },
  components: { FormList },
  activated () {
    // this.getDataList();
  },
  methods: {
    formListCallBack (value) {
      console.log('ApprovalPanl formListCallBack value', common.deepClone(value))
      this.formList = value
    },
    // 子组件回调模块 end
    show () {
      this.visible = true
    },
    reset () {
      this.visible = false
      this.formAttr = {
        align: 'left',
        size: 'medium',
        labelWidth: '80px',
        isTabs: false,
        tabType: 'card',
        tabs: [
          {
            name: 'tab1',
            formList: []
          }
        ]
      }
      this.tabIndex = '0'
      this.rules = {}
      this.formValue = {}
      this.formList = []
    },
    tabHandleClick_preview (tab, event) {
    },
    fillValueToFormList (formList, formData) {
      const oldFormValue = formData

      // start
      formList.forEach(element => {
        for (const key in oldFormValue) {
          if (oldFormValue.hasOwnProperty(key)) {
            if (element.type === 'grid') {
              element.cols.forEach(element2 => {
                element2.list.forEach(element3 => {
                  if (key === element3.code) {
                    element3.options.defaultValue = oldFormValue[key]
                  }
                  element3.options.disabled = true
                })
              })
            } else {
              if (key === element.code) {
                element.options.defaultValue = oldFormValue[key]
              }
              element.options.disabled = true
            }
          }
        }
      })

      return formList
    },
    init () {
      this.visible = true
      this.$nextTick(() => {
        this.loadingForm = true
        this.reset()
        let content = JSON.parse(this.dycForm.content)
        this.formAttr = content.formAttr
        let formList = content.formList
        if (this.formAttr.isTabs) {
          // tab多页
          this.tabIndex = '0'

          // 把原来的formData的值设置进去
          this.formAttr.tabs.forEach(element => {
            element.formList = this.fillValueToFormList(
              element.formList,
              this.formData
            )
          })
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(this.formAttr.tabs[0].formList)
          )
          this.formList = common.deepClone(this.formAttr.tabs[0].formList)
        } else {
          // 单页

          // 把原来的formData的值设置进去
          let formListFilled = this.fillValueToFormList(
            formList,
            this.formData
          )
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(formListFilled)
          )
          this.formList = common.deepClone(formListFilled)
        }
        this.loadingForm = false
      })
    }
  },
  watch: {
    tabIndex: {
      handler: function (newValue, oldValue) {
        // this.loadingForm = true
        // 切换tab之前,赋值给formAttr
        this.formAttr.tabs[oldValue].formList = common.deepClone(this.formList)

        if (newValue === -1 || newValue === '-1') return

        // 赋值新tab
        this.$store.dispatch(
          'formDesign/setFormList',
          common.deepClone(this.formAttr.tabs[Number(newValue)].formList)
        )
        this.formList = common.deepClone(
          this.formAttr.tabs[Number(newValue)].formList
        )
      },
      deep: true
    },
    formValue: {
      handler: function (value, oldValue) {
      },
      deep: true
    },
    formList: {
      handler: function (value, oldValue) {
        console.log('watch formList', value)

        if (common.isEmpty(value)) return

        let keys = []

        common.deepClone(value).forEach(element => {
          for (const key in this.formValue) {
            if (this.formValue.hasOwnProperty(key)) {
              if (element.type === 'grid') {
                element.cols.forEach(element2 => {
                  element2.list.forEach(element3 => {
                    if (key === element3.code && keys.includes(key)) {
                      this.formValue[key] = element3.options.defaultValue
                    }
                  })
                })
              } else {
                if (key === element.code && keys.includes(key)) {
                  this.formValue[key] = element.options.defaultValue
                }
              }
            }
          }
        })

        console.log('this.formValue', this.formValue)
      },
      deep: true
    },
    formData: {
      handler: function () {
        this.init()
      },
      deep: true
    },
    dycForm: {
      handler: function () {
        this.init()
      },
      deep: true
    }
  }
}
</script>


================================================
FILE: src/components/form-design/Cell.vue
================================================
<template>
  <div class="cell" :class="{'cell-active': data.key === $store.state.formDesign.activeKey}">
    <div>
      <el-form-item
        v-if="data.type !== 'grid' && data.type !== 'title'"
        :label="data.title"
        :prop="data.key"
        @click.native="activeCell"
      >
        <el-input
          v-if="data.type === 'input'"
          value=""
          :placeholder="data.options.placeholder"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        ></el-input>
        <el-input
          v-if="data.type === 'textarea'"
          :placeholder="data.options.placeholder"
          :disabled="data.options.disabled"
          :readonly="true"
          type="textarea"
          :rows="5"
          :style="{width: data.options.width}"
        ></el-input>
        <template v-if="data.type === 'idea'">
          <el-input
            :placeholder="data.options.placeholder"
            :disabled="data.options.disabled"
            :readonly="true"
            type="textarea"
            :rows="5"
            :style="{width: data.options.width}"
            :id="data.key"
          ></el-input>
          <el-button type="text" @click="ideaDialogVisible = true; markIdeaKey(data.key);">选择快捷意见</el-button>
        </template>
        <el-input-number
          v-if="data.type === 'number'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        ></el-input-number>
        <el-radio-group
          v-if="data.type === 'radio'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        >
          <el-radio
            v-for="(item, i) in data.options.option"
            :label="item.value"
            :key="i"
          >{{item.label}}</el-radio>
        </el-radio-group>
        <el-checkbox-group
          v-if="data.type === 'checkbox'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        >
          <el-checkbox
            v-for="(item, i) in data.options.option"
            :label="item.value"
            :key="i"
          >{{item.label}}</el-checkbox>
        </el-checkbox-group>
        <el-select
          v-if="data.type === 'select'"
          :placeholder="data.options.placeholder"
          :style="{width: data.options.width}"
          :readonly="true"
          :disabled="data.options.disabled"
        >
          <el-option
            v-for="(item, i) in data.options.option"
            :key="i"
            :label="item.label"
            :value="item.value"
          ></el-option>
        </el-select>
        <el-switch
          v-if="data.type === 'switch'"
          active-color="#13ce66"
          inactive-color="#EEEEEE"
          :style="{width: data.options.width}"
          :readonly="true"
          :disabled="data.options.disabled"
        ></el-switch>
        <el-date-picker
          type="datetime"
          v-if="data.type === 'datetime'"
          :placeholder="data.options.placeholder"
          :style="{width: data.options.width}"
          :disabled="data.options.disabled"
        ></el-date-picker>
        <el-upload
          v-if="data.type === 'img'"
          class="upload-demo"
          action="https://jsonplaceholder.typicode.com/posts/"
          :limit="1"
          :file-list="[]"
          :disabled="data.options.disabled"
          :readonly="true"
        >
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
        </el-upload>
      </el-form-item>
      <p
        v-if="data.type === 'title'"
        :style="{'text-align': data.options.align, 'font-size': data.options.fontSize}"
        @click="activeCell"
      >{{data.value}}</p>
      <FDGridPanel
        v-else
        :propData="data"
        :formAttr="formAttr"
        :FDkey="data.key"
        @syncList="syncList"
      />
    </div>
    <i
      class="action-copy"
      title="复制"
      v-show="data.key === $store.state.formDesign.activeKey && data.type != 'grid'"
      @click="copyForm"
    ></i>
    <i
      class="action-delete"
      title="删除"
      v-show="data.key === $store.state.formDesign.activeKey"
      @click="deleteForm"
    ></i>

    <el-dialog
      title="选择意见"
      :visible.sync="ideaDialogVisible"
      append-to-body
      modal-append-to-body
      width="30%"
    >
      <el-tabs v-model="ideaTabIndex">
        <el-tab-pane label="个人意见" name="1">
          <el-table :data="idea.personal" style="width: 100%">
            <el-table-column type="index" label="序号" width="180"></el-table-column>
            <el-table-column prop="ideaNotes" label="意见内容" width="180">
              <template slot-scope="scope">
                <a
                  href="javascript:void(0);"
                  @click="appendNote(scope.row.ideaNotes)"
                >{{scope.row.ideaNotes}}</a>
              </template>
            </el-table-column>
          </el-table>
        </el-tab-pane>
        <el-tab-pane label="公共意见" name="2">
          <el-table :data="idea.public" style="width: 100%">
            <el-table-column type="index" label="序号" width="180"></el-table-column>
            <el-table-column prop="ideaNotes" label="意见内容" width="180">
              <template slot-scope="scope">
                <a
                  href="javascript:void(0);"
                  @click="appendNote(scope.row.ideaNotes)"
                >{{scope.row.ideaNotes}}</a>
              </template>
            </el-table-column>
          </el-table>
        </el-tab-pane>
      </el-tabs>
      <span slot="footer" class="dialog-footer">
        <el-button type="primary" @click="ideaDialogVisible = false">确 定</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
import common from '@/utils/common'
import FDGridPanel from '@/components/form-design/FDGridPanel'
import bus from '@/utils/bus'

export default {
  components: {
    FDGridPanel
  },
  props: {
    formAttr: {
      type: Object,
      default: function () {
        return {
          align: 'top',
          size: 'medium',
          labelWidth: 80
        }
      }
    },
    data: {
      type: Object,
      default: function () {
        return {
          type: '',
          name: '',
          code: '',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            dataType: 'string',
            placeholder: ''
          },
          key: '1556775967000_4898'
        }
      }
    },
    isGrid: {
      type: Boolean,
      default: false
    },
    FDindex: {
      type: Number
    },
    idea: {
      type: Object,
      default: function () {
        return {
          personal: [
            {
              'ideaId': '402880ee6c3df518016c3e5251980008',
              'mainType': 1,
              'userId': null,
              'ideaNotes': '这是一条模拟个人意见文本',
              'sortOrder': null,
              'state': 1
            }
          ],
          public: [
            {
              'ideaId': '402880ee6c3df518016c3e5251980008',
              'mainType': 1,
              'userId': null,
              'ideaNotes': '这是一条模拟公共意见文本',
              'sortOrder': null,
              'state': 1
            }
          ]
        }
      }
    }
  },
  methods: {
    copyForm () {
      let formList = common.deepClone(this.$store.state.formDesign.formList)

      let newIndex
      for (let i = 0; i < formList.length; i++) {
        const element = formList[i]
        if (element.key === this.data.key) {
          newIndex = i
          break
        }
      }
      let copyForm = common.deepClone(formList[newIndex])
      copyForm.key = common.getGuid()
      copyForm.code = `code_${common.getGuid2()}`
      formList.splice(newIndex + 1, 0, copyForm)
      this.$store.commit(
        'formDesign/updateActiveForm',
        common.deepClone(copyForm)
      )
      this.$store.commit('formDesign/updateActiveKey', copyForm.key)
      this.$emit('syncList', formList)
      this.$store.dispatch('formDesign/setFormList', formList)
    },
    deleteForm () {
      let formList = common.deepClone(this.$store.state.formDesign.formList)
      let newIndex
      for (let i = 0; i < formList.length; i++) {
        const element = formList[i]
        if (element.key === this.data.key) {
          newIndex = i
          break
        }
      }
      formList.splice(newIndex, 1)

      this.$emit('syncList', formList)
      this.$store.dispatch(
        'formDesign/setFormList',
        common.deepClone(formList)
      )

      if (newIndex !== 0) {
        this.$store.commit(
          'formDesign/updateActiveKey',
          formList[newIndex - 1].key
        )
        this.$store.commit(
          'formDesign/updateActiveForm',
          common.deepClone(formList[newIndex - 1])
        )
      } else {
        if (formList.length > 0) {
          this.$store.commit('formDesign/updateActiveKey', formList[0].key)
          this.$store.commit(
            'formDesign/updateActiveForm',
            common.deepClone(formList[0])
          )
        }
      }
    },
    activeCell () {
      bus.$emit('update.activeName', '1')
      this.$store.commit('formDesign/updateActiveKey', this.data.key)
      this.$store.commit('formDesign/updateShowType', this.data.type)
      this.$store.commit(
        'formDesign/updateActiveForm',
        common.deepClone(this.data)
      )
    },
    syncList (value) {
      this.$emit('syncList', value)
    },
    markIdeaKey (ideaKey) {
      sessionStorage.ideaKey = ideaKey
    },
    appendNote (note) {
      const realname = '管理员'
      const nowDate = common.formatDateCN(new Date().getTime())
      const result = `${note}\n\n                                                  ${realname}\n                                                  ${nowDate}`
      // let newFormList = common.deepClone(this.$store.state.formDesign.formList)
      // newFormList.forEach((el) => {
      //   if (el.type === 'idea' && el.key === sessionStorage.ideaKey) {
      //     el.options.defaultValue = result
      //     this.$emit('syncList', newFormList)
      //     this.$store.dispatch(
      //       'formDesign/setFormList',
      //       common.deepClone(newFormList)
      //     )
      //   }
      // })

      this.ideaDialogVisible = false
      window.document.getElementById(sessionStorage.ideaKey).value = result
    }
  },
  data () {
    return {
      ideaDialogVisible: false,
      ideaTabIndex: '1'
    }
  }
}
</script>

<style lang="css" scoped>
.cell {
  background-color: #eee;
  padding: 10px 10px 20px 10px;
  position: relative;
  cursor: move;
}
.cell-active {
  background-color: #b3d8ff;
  border-left: 5px solid #409eff;
}
.el-form-item {
  margin-bottom: 0;
}
.action-copy {
  position: absolute;
  bottom: -15px;
  right: 60px;
  height: 30px;
  width: 30px;
  background: url("../../assets/img/copy.png") no-repeat center;
  background-size: 18px 18px;
  background-color: #ecf5ff;
  border-color: #409eff;
  border-radius: 50%;
  cursor: pointer;
  border: 1px solid #409eff;
  z-index: 1;
}
.action-copy:hover {
  background: url("../../assets/img/copy-active.png") no-repeat center;
  background-color: #409eff;
}
.action-delete {
  position: absolute;
  bottom: -15px;
  right: 15px;
  height: 30px;
  width: 30px;
  background: url("../../assets/img/delete.png") no-repeat center;
  background-size: 15px 15px;
  background-color: #fef0f0;
  border-radius: 50%;
  cursor: pointer;
  border: 1px solid #f56c6c;
  z-index: 1;
}
.action-delete:hover {
  background: url("../../assets/img/delete-active.png") no-repeat center;
  background-color: #f56c6c;
}
</style>


================================================
FILE: src/components/form-design/FDCheckbox.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-18 12:35:15
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px" size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.width" size="small" :disabled="true"></el-input>
    </el-form-item>

    <el-form-item label="选项">
      <el-checkbox-group class="clearfix">
        <div v-for="(item, i) in data.options.option" :key="i" style="clearfix">
          <el-checkbox :label="item.value" style="float: left;">
            <el-input size="small" style="width:80px!important;" v-model="item.label" title="删除选项"></el-input>
            <el-input size="small" style="width:80px!important;" v-model="item.value" title="删除选项"></el-input>
            <i class="el-icon-circle-close" style="color: red;" @click="subOption(i)"></i>
          </el-checkbox>
        </div>
      </el-checkbox-group>

      <div style="width: 100%;">
        <i class="el-icon-circle-plus" style="color: #17B3A3;" title="增加选项" @click="addOption"></i>
      </div>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '多选框组',
          type: 'checkbox',
          code: '',
          icon: '/static/img/form-design/checkbox.png',
          options: {
            width: '100%',
            required: false,
            disabled: false,
            defaultValue: [],
            option: [{
              value: '值1',
              label: '选项1'
            }, {
              value: '值2',
              label: '选项2'
            }, {
              value: '值3',
              label: '选项3'
            }]
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '多选框组',
        type: 'checkbox',
        code: '',
        icon: '/static/img/form-design/checkbox.png',
        options: {
          defaultValue: [],
          width: '100%',
          required: false,
          disabled: false,
          option: [{
            value: '值1',
            label: '选项1'
          }, {
            value: '值2',
            label: '选项2'
          }, {
            value: '值3',
            label: '选项3'
          }]
        },
        key: common.getGuid()
      }
    }
  },
  methods: {
    addOption () {
      this.data.options.option.push({
        value: `值${this.data.options.option.length + 1}`,
        label: `选项${this.data.options.option.length + 1}`
      })
    },
    subOption (index) {
      this.data.options.option.splice(index, 1)
    }
  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit('formDesign/updateActiveKey', element3.key)
                  this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
                  bus.$emit('formDesign.syncList', common.deepClone(newFormList))
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDDateTime.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-14 10:52:57
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px" size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="占位内容">
      <el-input v-model="data.options.placeholder" size="small"></el-input>
    </el-form-item>
    <el-form-item label="显示类型/格式">
      <el-cascader :options="dateTimeTypeOptions" v-model="data.options.type"></el-cascader>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否只读">
      <el-switch v-model="data.options.readonly" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '时间选择器',
          type: 'datetime',
          code: '',
          icon: '/static/img/form-design/datetime.png',
          options: {
            width: '100%',
            type: ['ymd', 'yyyy-MM-dd'],
            defaultValue: '',
            required: false,
            disabled: false,
            placeholder: ''
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '时间选择器',
        type: 'datetime',
        code: '',
        icon: '/static/img/form-design/datetime.png',
        options: {
          width: '100%',
          type: ['ymd', 'yyyy-MM-dd'],
          defaultValue: '',
          required: false,
          disabled: false,
          placeholder: ''
        },
        key: common.getGuid()
      },

      dateTimeTypeOptions: [
        {
          value: 'y',
          label: '年',
          children: [
            {
              value: 'yyyy',
              label: 'yyyy'
            },
            {
              value: 'yyyy年',
              label: 'yyyy年'
            }
          ]
        },
        {
          value: 'ym',
          label: '年月',
          children: [
            {
              value: 'yyyy-MM',
              label: 'yyyy-MM'
            },
            {
              value: 'yyyy/MM',
              label: 'yyyy/MM'
            },
            {
              value: 'yyyy年MM月',
              label: 'yyyy年MM月'
            }
          ]
        },
        {
          value: 'ymd',
          label: '年月日',
          children: [
            {
              value: 'yyyy-MM-dd',
              label: 'yyyy-MM-dd'
            },
            {
              value: 'yyyy/MM/dd',
              label: 'yyyy/MM/dd'
            },
            {
              value: 'yyyy年MM月dd日',
              label: 'yyyy年MM月dd日'
            }
          ]
        },
        {
          value: 'hm',
          label: '时分',
          children: [
            {
              value: 'HH:mm',
              label: 'HH:mm'
            },
            {
              value: 'HH时mm分',
              label: 'HH时mm分'
            }
          ]
        },
        {
          value: 'hms',
          label: '时分秒',
          children: [
            {
              value: 'HH:mm:ss',
              label: 'HH:mm:ss'
            },
            {
              value: 'HH时mm分ss秒',
              label: 'HH时mm分ss秒'
            }
          ]
        },
        {
          value: 'ymdhm',
          label: '年月日时分',
          children: [
            {
              value: 'yyyy-MM-dd HH:mm',
              label: 'yyyy-MM-dd HH:mm'
            },
            {
              value: 'yyyy/MM/dd HH:mm',
              label: 'yyyy/MM/dd HH:mm'
            },
            {
              value: 'yyyy年MM月dd日 HH时mm分',
              label: 'yyyy年MM月dd日 HH时mm分'
            }
          ]
        },
        {
          value: 'ymdhms',
          label: '年月日时分秒',
          children: [
            {
              value: 'yyyy-MM-dd HH:mm:ss',
              label: 'yyyy-MM-dd HH:mm:ss'
            },
            {
              value: 'yyyy/MM/dd HH:mm:ss',
              label: 'yyyy/MM/dd HH:mm:ss'
            },
            {
              value: 'yyyy年MM月dd日 HH时mm分ss秒',
              label: 'yyyy年MM月dd日 HH时mm分ss秒'
            }
          ]
        }
      ]
    }
  },
  methods: {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDGrid.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-05-15 21:32:27
 * @LastEditTime: 2019-05-15 21:32:27
 * @LastEditors: your name
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="列配置项(每行占比总和最多为24)">
      <div v-for="(item, i) in data.cols" :key="i">
        <el-input-number v-model="item.span" :min="1" :max="24" label="列占比" size="small"></el-input-number>
        <i class="el-icon-circle-close" style="color: red;" @click="subOption(i)"></i>
      </div>

      <div style="width: 100%;">
        <i class="el-icon-circle-plus" style="color: #17B3A3;" title="增加选项" @click="addOption"></i>
      </div>
    </el-form-item>

    <!-- <el-form-item label="数据绑定key">
      <el-input v-model="data.width" size="small" :disabled="true"></el-input>
    </el-form-item> -->
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '栅格布局',
          type: 'grid',
          icon: '/static/img/form-design/grid.png',
          cols: [{
            span: 12,
            list: [
            ]
          }, {
            span: 12,
            list: []
          }]
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '栅格布局',
        type: 'grid',
        icon: '/static/img/form-design/grid.png',
        cols: [{
          span: 12,
          list: [
          ]
        }, {
          span: 12,
          list: []
        }],
        key: common.getGuid()
      }
    }
  },
  methods: {
    addOption () {
      this.data.cols.push({
        span: 12,
        list: [
        ]
      })
    },
    subOption (index) {
      this.data.cols.splice(index, 1)
    }
  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(this.$store.state.formDesign.formList)
        let activeIndex
        for (let i = 0; i < newFormList.length; i++) {
          const element = newFormList[i]
          if (element.key === this.$store.state.formDesign.activeKey) {
            activeIndex = i
          }
        }
        if (!common.isEmpty(activeIndex)) {
          newFormList[activeIndex] = value
          this.$store.commit('formDesign/updateActiveKey', value.key)
          this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
          bus.$emit('formDesign.syncList', common.deepClone(newFormList))
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDGridPanel.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-12 17:02:43
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-row>
    <el-col :span="col.span" v-for="(col, i) in data.cols" :key="i" class="col">
      <draggable class="dragArea" @change="log" :list="col.list" :group="{ name: 'form-design'}">
        <GridCell
          :data="item"
          v-for="(item, j) in col.list"
          :key="j"
          @syncList="syncList"
          :formAttr="formAttr"
          :isGrid="true"
          :FDkey="FDkey"
          :FDindex="i"
        />
        <!-- 
        <el-form-item label="(必填)">
          <el-input :readonly="true"></el-input>
        </el-form-item>-->
      </draggable>
      <div class="bottom-area" @click="activeCell"></div>
    </el-col>
  </el-row>
</template>

<script>
import GridCell from '@/components/form-design/GridCell'
import draggable from 'vuedraggable'
import common from '@/utils/common'
// eslint-disable-next-line no-unused-vars
import bus from '@/utils/bus'

export default {
  components: {
    draggable,
    GridCell
  },
  props: {
    formAttr: {
      type: Object,
      default: function () {
        return {
          align: 'top',
          size: 'medium',
          labelWidth: 80
        }
      }
    },
    FDkey: {
      type: String,
      default: ''
    },
    propData: {
      type: Object,
      default: function () {
        return {
          title: '栅格布局',
          type: 'grid',
          icon: '/static/img/form-design/grid.png',
          cols: [
            {
              span: 12,
              list: [
                // {
                //   title: "多行文本",
                //   type: "textarea",
                //   icon: "/static/img/form-design/textarea.png",
                //   options: {
                //     width: "100%",
                //     defaultValue: "",
                //     required: false,
                //     disabled: false,
                //     placeholder: "",
                //     regEx: ""
                //   },
                //   key: ""
                // }
              ]
            },
            {
              span: 12,
              list: []
            }
          ],
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '栅格布局',
        type: 'grid',
        icon: '/static/img/form-design/grid.png',
        cols: [
          {
            span: 12,
            list: []
          },
          {
            span: 12,
            list: []
          }
        ],
        key: common.getGuid()
      }
    }
  },
  methods: {
    log: function (evt) {
      console.log('FDGridPanel')
      window.console.log(evt)
      // let newFormList = common.deepClone(this.$store.state.formDesign.grid[this.FDkey]);
      // console.log("newFormList", newFormList)
      // let form;
      // if (evt.added) {
      //   form = evt.added.element;
      //   let newIndex = evt.added.newIndex;
      //   form.key = common.getGuid();
      //   newFormList.splice(newIndex, 0, form);
      //   this.$store.commit('formDesign/updateShowType', form.type);
      //   this.$store.commit('formDesign/updateActiveKey', form.key);
      //   this.$store.commit('formDesign/updateActiveForm', common.deepClone(form));
      //   this.$store.commit('formDesign/updateGrid', this.FDkey, common.deepClone(newFormList));
      // }
      // if (evt.moved) {
      //   form = evt.moved.element;
      //   let newIndex = evt.moved.newIndex;
      //   let oldIndex = evt.moved.oldIndex;
      //   //先直接在新位置插入表单,然后旧位置索引+1的位置表单直接减掉
      //   // newFormList.splice(newIndex, 0, form);
      //   // newFormList.splice(oldIndex, oldIndex + 1);
      //   this.$store.commit('formDesign/updateShowType', form.type);
      //   this.$store.commit('formDesign/updateActiveKey', form.key);
      //   this.$store.commit('formDesign/updateActiveForm', common.deepClone(form));
      //   this.$store.commit('formDesign/updateGrid', this.FDkey, common.deepClone(newFormList));
      // }

      // 处理从外部拖进栅格的表单元素
      if (evt.added) {
        sessionStorage.outToIn = 1
      }
    },
    syncList (value, index) {
      // this.data.cols[index].list = common.deepClone(value);
      let formList = common.deepClone(this.$store.state.formDesign.formList)
      for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
        const element = this.$store.state.formDesign.formList[i]
        if (element.key === this.FDkey) {
          formList[i] = this.data
        }
      }
      console.log('formList', formList)
      this.$emit('syncList', formList)
    },
    activeCell () {
      this.$store.commit('formDesign/updateActiveKey', this.FDkey)
      this.$store.commit('formDesign/updateShowType', 'grid')
      this.$store.commit(
        'formDesign/updateActiveForm',
        common.deepClone(this.data)
      )
    }
  },
  mounted () {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        console.log('value', value)
        let newData = common.deepClone(value)
        let haveEmptyKey = false
        for (let i = 0; i < newData.cols.length; i++) {
          const element = newData.cols[i]
          for (let j = 0; j < element.list.length; j++) {
            const element2 = element.list[j]
            if (common.isEmpty(element2.key)) {
              element2.key = common.getGuid()
              element2.code = `code_${common.getGuid2()}`
              this.$store.commit('formDesign/updateActiveKey', element2.key)
              haveEmptyKey = true
            }
          }
        }
        if (haveEmptyKey) {
          this.data = newData

          let formListAll = common.deepClone(
            this.$store.state.formDesign.formList
          )
          for (
            let i = 0;
            i < this.$store.state.formDesign.formList.length;
            i++
          ) {
            const element = this.$store.state.formDesign.formList[i]
            if (element.key === this.FDkey) {
              formListAll[i] = common.deepClone(newData)
            }
          }
          this.$store.dispatch(
            'formDesign/setFormList',
            common.deepClone(formListAll)
          )

          this.$store.state.formDesign.formList.forEach(el => {
            if (el.type === 'grid') {
              el.cols.forEach(el2 => {
                el2.list.forEach(el3 => {
                  if (el3.key === this.$store.state.formDesign.activeKey) {
                    this.$store.commit('formDesign/updateShowType', el3.type)
                    this.$store.commit('formDesign/updateActiveForm', common.deepClone(el3))
                    // this.$store.commit('formDesign/updateGrid', {
                    //   key: el.key,
                    //   value: common.deepClone(el2.list)
                    // })
                  }
                })
              })
            } else {
              if (el.key === this.$store.state.formDesign.activeKey) {
                this.$store.commit('formDesign/updateShowType', el.type)
                this.$store.commit('formDesign/updateActiveForm', common.deepClone(el))
              }
            }
          })
        }
        console.log('newData.key', this.FDkey)
        console.log(
          'this.$store.state.formDesign.activeKey',
          this.$store.state.formDesign.activeKey
        )
        console.log(
          'this.$store.state.formDesign.grid',
          this.$store.state.formDesign.grid
        )
        this.$store.commit('formDesign/updateGrid', {
          key: this.FDkey,
          value: common.deepClone(newData)
        })
        this.$emit('syncList', this.$store.state.formDesign.formList)
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true,
      immediate: true
    }
  }
}
</script>

<style scoped>
.col {
  min-height: 50px;
  outline: 1px dashed;
  /* margin: 10px; */
}
.bottom-area {
  width: 100%;
  height: 25px;
}
.dragArea {
  min-height: 50px;
}
</style>

================================================
FILE: src/components/form-design/FDIdea.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-09-30 12:28:12
 * @LastEditTime: 2019-10-14 10:51:10
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px" size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="最大长度">
      <el-input-number
        v-model="data.options.maxlength"
        :min="1"
        :max="300"
        label="最大长度"
        size="small"
      ></el-input-number>
    </el-form-item>
    <el-form-item label="占位内容">
      <el-input v-model="data.options.placeholder" size="small"></el-input>
    </el-form-item>
    <el-form-item label="默认值">
      <el-select
        v-model="data.options.defaultValue"
        allow-create
        title="自定义值按回车确定"
        placeholder="请输入选择默认值"
        size="small"
      >
        <el-option
          v-for="(item, i) in defaultValueList"
          :key="i"
          :label="item.label"
          :value="item.val"
        ></el-option>
      </el-select>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '意见框落款',
          type: 'idea',
          code: '',
          icon: '/static/img/form-design/textarea.png',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            disabled: false,
            placeholder: '',
            regEx: '',
            maxlength: 300
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '意见框落款',
        type: 'idea',
        code: '',
        icon: '/static/img/form-design/textarea.png',
        options: {
          width: '100%',
          defaultValue: '',
          required: false,
          disabled: false,
          placeholder: '',
          regEx: '',
          maxlength: 300
        },
        key: common.getGuid()
      }
    }
  },
  methods: {},
  mounted () {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDImg.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-05-15 21:32:27
 * @LastEditTime: 2019-05-15 21:32:27
 * @LastEditors: your name
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="默认值图片地址">
      <el-input v-model="data.options.defaultValue" size="small"></el-input>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '图片上传',
          type: 'img',
          code: '',
          icon: '/static/img/form-design/img.png',
          options: {
            defaultValue: '',
            required: false,
            disabled: false
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '图片上传',
        type: 'img',
        code: '',
        icon: '/static/img/form-design/img.png',
        options: {
          defaultValue: '',
          required: false,
          disabled: false
        },
        key: common.getGuid()
      }
    }
  },
  methods: {},
  mounted () {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        console.log('FDImg watch')
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDInput.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-14 10:36:17
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px" size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="最大长度">
      <el-input-number
        v-model="data.options.maxlength"
        :min="1"
        :max="50"
        label="最大长度"
        size="small"
      ></el-input-number>
    </el-form-item>
    <el-form-item label="占位内容">
      <el-input v-model="data.options.placeholder" size="small"></el-input>
    </el-form-item>
    <el-form-item label="默认值">
      <el-popover placement="bottom" title="系统默认值" width="200" trigger="click">
        <el-table :data="defaultValueList">
          <el-table-column width="50" label="序号" header-align="center" type="index"></el-table-column>
          <el-table-column header-align="center" prop="label" label="值类型">
            <template slot-scope="scope">
              <a
                href="javascript:void(0);"
                @click="data.options.defaultValue = scope.row.val"
              >{{scope.row.label}}</a>
            </template>
          </el-table-column>
        </el-table>
        <el-input v-model="data.options.defaultValue" size="small" slot="reference"></el-input>
      </el-popover>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="数据类型">
      <el-select v-model="data.options.dataType" placeholder="请选择">
        <el-option
          v-for="item in data.options.option"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></el-option>
      </el-select>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="正则表达式">
      <el-input v-model="data.options.regEx" size="small"></el-input>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '单行文本',
          type: 'input',
          code: '',
          icon: '/static/img/form-design/input.png',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            disabled: false,
            dataType: 'string',
            placeholder: '',
            maxlength: 30,
            regEx: '',
            option: [
              {
                value: 'string',
                label: '字符串'
              },
              {
                value: 'bool',
                label: '布尔值'
              },
              {
                value: 'int',
                label: '整数'
              },
              {
                value: 'float',
                label: '浮点数'
              },
              {
                value: 'url',
                label: 'URL地址'
              },
              {
                value: 'email',
                label: '邮箱地址'
              }
            ]
          },
          key: common.getGuid()
        }
      }
    },
    defaultValueList: {
      type: Array,
      default: function () {
        return []
      }
    }
  },
  data () {
    return {
      data: {
        title: '单行文本',
        type: 'input',
        code: '',
        icon: '/static/img/form-design/input.png',
        options: {
          width: '100%',
          defaultValue: '',
          required: false,
          disabled: false,
          dataType: 'string',
          placeholder: '',
          regEx: '',
          maxlength: 30,
          option: [
            {
              value: 'string',
              label: '字符串'
            },
            {
              value: 'bool',
              label: '布尔值'
            },
            {
              value: 'int',
              label: '整数'
            },
            {
              value: 'float',
              label: '浮点数'
            },
            {
              value: 'url',
              label: 'URL地址'
            },
            {
              value: 'email',
              label: '邮箱地址'
            }
          ]
        },
        key: common.getGuid()
      }
    }
  },
  methods: {},
  mounted () {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDMenu.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-12-10 11:29:33
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-collapse :value="['1','2', '3']" style="width: 100%;">
    <el-collapse-item title="基础字段" name="1">
      <draggable
        :list="base.child"
        :group="{ name: 'form-design', pull: 'clone', put: false }"
        @change="log"
      >
        <div class="cell" v-for="(item, i) in base.child" :key="i">
          <p class="left">
            <span :class="`iconfont icon-${item.icon}`"></span>
          </p>
          <p class="right">{{item.title}}</p>
        </div>
      </draggable>
    </el-collapse-item>
    <el-collapse-item title="高级字段" name="2">
      <draggable
        :list="senior.child"
        :group="{ name: 'form-design', pull: 'clone', put: false }"
        @change="log"
      >
        <div class="cell" v-for="(item, i) in senior.child" :key="i">
          <p class="left">
           <span :class="`iconfont icon-${item.icon}`"></span>
          </p>
          <p class="right">{{item.title}}</p>
        </div>
      </draggable>
    </el-collapse-item>
    <el-collapse-item title="布局字段" name="3">
      <draggable
        :list="layout.child"
        :group="{ name: 'form-design', pull: 'clone', put: false }"
        @change="log"
      >
        <div class="cell" v-for="(item, i) in layout.child" :key="i">
          <p class="left">
           <span :class="`iconfont icon-${item.icon}`"></span>
          </p>
          <p class="right">{{item.title}}</p>
        </div>
      </draggable>
    </el-collapse-item>
    <el-collapse-item title="其它字段" name="3">
      <draggable
        :list="elseItem.child"
        :group="{ name: 'form-design', pull: 'clone', put: false }"
        @change="log"
      >
        <div class="cell" v-for="(item, i) in elseItem.child" :key="i">
          <p class="left">
           <span :class="`iconfont icon-${item.icon}`"></span>
          </p>
          <p class="right">{{item.title}}</p>
        </div>
      </draggable>
    </el-collapse-item>
  </el-collapse>
</template>

<script>
import draggable from 'vuedraggable'
import common from '@/utils/common'
import bus from '@/utils/bus'
const base = {
  title: '基础字段',
  child: [
    {
      title: '单行文本',
      type: 'input',
      icon: 'danhangwenben',
      value: '',
      options: {
        width: '100%',
        defaultValue: '',
        required: false,
        disabled: false,
        dataType: 'string',
        placeholder: '',
        regEx: '',
        option: [
          {
            value: 'string',
            label: '字符串'
          },
          {
            value: 'bool',
            label: '布尔值'
          },
          {
            value: 'int',
            label: '整数'
          },
          {
            value: 'float',
            label: '浮点数'
          },
          {
            value: 'url',
            label: 'URL地址'
          },
          {
            value: 'email',
            label: '邮箱地址'
          }
        ]
      },
      key: ''
    },
    {
      title: '多行文本',
      type: 'textarea',
      code: '',
      icon: 'duohangwenben',
      value: '',
      options: {
        width: '100%',
        defaultValue: '',
        required: false,
        disabled: false,
        placeholder: '',
        regEx: ''
      },
      key: ''
    },
    {
      title: '数字文本框',
      type: 'number',
      code: '',
      icon: 'jishubiaoqian',
      value: '',
      options: {
        width: '120px',
        min: 0,
        max: 100,
        required: false,
        disabled: false
      },
      key: ''
    },
    {
      title: '单选框组',
      type: 'radio',
      code: '',
      icon: 'danxuankuang',
      value: '',
      options: {
        width: '100%',
        required: false,
        disabled: false,
        defaultValue: '',
        option: [
          {
            value: '值1',
            label: '选项1'
          },
          {
            value: '值2',
            label: '选项2'
          },
          {
            value: '值3',
            label: '选项3'
          }
        ]
      },
      key: ''
    },
    {
      title: '多选框组',
      type: 'checkbox',
      code: '',
      icon: 'duoxuankuang1',
      value: '',
      options: {
        defaultValue: [],
        width: '100%',
        required: false,
        disabled: false,
        option: [
          {
            value: '值1',
            label: '选项1'
          },
          {
            value: '值2',
            label: '选项2'
          },
          {
            value: '值3',
            label: '选项3'
          }
        ]
      },
      key: ''
    },
    {
      title: '时间选择器',
      type: 'datetime',
      code: '',
      icon: 'shijianxuanzeqi',
      value: '',
      options: {
        width: '100%',
        type: ['ymd', 'yyyy-MM-dd'],
        defaultValue: '',
        required: false,
        disabled: false,
        placeholder: ''
      },
      key: ''
    },
    {
      title: '下拉选择框',
      type: 'select',
      code: '',
      icon: 'xialaxuanze',
      value: '',
      options: {
        width: '100%',
        defaultValue: '',
        required: false,
        disabled: false,
        placeholder: '',
        option: [
          {
            value: '值1',
            label: '选项1'
          },
          {
            value: '值2',
            label: '选项2'
          },
          {
            value: '值3',
            label: '选项3'
          }
        ]
      },
      key: ''
    },
    {
      title: '开关',
      type: 'switch',
      code: '',
      icon: 'kaiguan',
      value: false,
      options: {
        defaultValue: false,
        required: false,
        disabled: false
      },
      key: ''
    }
  ]
}
const senior = {
  title: '高级字段',
  child: [
    // {
    //   title: '图片上传',
    //   type: 'img',
    //   code: '',
    //   icon: 'tupianshangchuan',
    //   options: {
    //     defaultValue: '',
    //     required: false,
    //     disabled: false
    //   }
    // }
    {
      title: '意见框',
      type: 'idea',
      code: '',
      icon: 'duohangwenben',
      value: '',
      options: {
        width: '100%',
        defaultValue: '',
        required: false,
        disabled: false,
        placeholder: '',
        regEx: ''
      },
      key: ''
    }
  ],
  key: ''
}
const layout = {
  title: '布局字段',
  child: [
    {
      title: '栅格布局',
      type: 'grid',
      icon: 'ai211',
      cols: [
        {
          span: 12,
          list: []
        },
        {
          span: 12,
          list: []
        }
      ],
      key: ''
    }
  ],
  key: ''
}
const elseItem = {
  title: '其它字段',
  child: [{
    title: '表单标题',
    type: 'title',
    icon: 'biaoti',
    value: '标题',
    options: {
      align: 'center',
      fontSize: '18px'
    },
    key: ''
  }],
  key: ''
}
export default {
  components: {
    draggable
  },
  data () {
    return {
      base: {
        title: '基础字段',
        child: [
          {
            title: '单行文本',
            type: 'input',
            icon: 'danhangwenben',
            value: '',
            code: '',
            options: {
              width: '100%',
              defaultValue: '',
              required: false,
              disabled: false,
              dataType: 'string',
              placeholder: '',
              regEx: '',
              maxlength: 30,
              option: [
                {
                  value: 'string',
                  label: '字符串'
                },
                {
                  value: 'bool',
                  label: '布尔值'
                },
                {
                  value: 'int',
                  label: '整数'
                },
                {
                  value: 'float',
                  label: '浮点数'
                },
                {
                  value: 'url',
                  label: 'URL地址'
                },
                {
                  value: 'email',
                  label: '邮箱地址'
                }
              ]
            },
            key: ''
          },
          {
            title: '多行文本',
            type: 'textarea',
            icon: 'duohangwenben',
            value: '',
            code: '',
            options: {
              width: '100%',
              defaultValue: '',
              required: false,
              disabled: false,
              placeholder: '',
              regEx: '',
              maxlength: 100
            },
            key: ''
          },
          {
            title: '数字文本框',
            type: 'number',
            icon: 'jishubiaoqian',
            value: '',
            code: '',
            options: {
              width: '120px',
              min: 0,
              max: 100,
              required: false,
              disabled: false
            },
            key: ''
          },
          {
            title: '单选框组',
            type: 'radio',
            icon: 'danxuankuang',
            value: '',
            code: '',
            options: {
              width: '100%',
              required: false,
              disabled: false,
              defaultValue: '',
              option: [
                {
                  value: '值1',
                  label: '选项1'
                },
                {
                  value: '值2',
                  label: '选项2'
                },
                {
                  value: '值3',
                  label: '选项3'
                }
              ]
            },
            key: ''
          },
          {
            title: '多选框组',
            type: 'checkbox',
            icon: 'xialaxuanze',
            value: '',
            code: '',
            options: {
              width: '100%',
              required: false,
              disabled: false,
              defaultValue: [],
              option: [
                {
                  value: '值1',
                  label: '选项1'
                },
                {
                  value: '值2',
                  label: '选项2'
                },
                {
                  value: '值3',
                  label: '选项3'
                }
              ]
            },
            key: ''
          },
          {
            title: '时间选择器',
            type: 'datetime',
            icon: 'shijianxuanzeqi',
            value: '',
            code: '',
            options: {
              width: '100%',
              type: ['ymd', 'yyyy-MM-dd'],
              defaultValue: '',
              required: false,
              disabled: false,
              placeholder: ''
            },
            key: ''
          },
          {
            title: '下拉选择框',
            type: 'select',
            icon: 'xialaxuanze',
            value: '',
            code: '',
            options: {
              width: '100%',
              defaultValue: '',
              required: false,
              disabled: false,
              placeholder: '',
              option: [
                {
                  value: '值1',
                  label: '选项1'
                },
                {
                  value: '值2',
                  label: '选项2'
                },
                {
                  value: '值3',
                  label: '选项3'
                }
              ]
            },
            key: ''
          },
          {
            title: '开关',
            type: 'switch',
            icon: 'kaiguan',
            value: false,
            code: '',
            options: {
              defaultValue: false,
              required: false,
              disabled: false
            },
            key: ''
          }
        ]
      },
      senior: {
        title: '高级字段',
        child: [
          {
            title: '意见框',
            type: 'idea',
            code: '',
            icon: 'duohangwenben',
            options: {
              width: '100%',
              defaultValue: '',
              required: false,
              disabled: false,
              placeholder: '',
              regEx: '',
              maxlength: 300
            }
          }
        ],
        key: ''
      },
      layout: {
        title: '布局字段',
        child: [
          {
            title: '栅格布局',
            type: 'grid',
            icon: 'ai211',
            cols: [
              {
                span: 12,
                list: []
              },
              {
                span: 12,
                list: []
              }
            ],
            key: ''
          }
        ],
        key: ''
      },
      elseItem: {
        title: '其它字段',
        child: [{
          title: '表单标题',
          type: 'title',
          icon: 'biaoti',
          value: '标题',
          options: {
            align: 'center',
            fontSize: '18px'
          },
          key: ''
        }],
        key: ''
      }
    }
  },
  mounted () {
    bus.$on('formMenu.init', () => {
      this.initMenu()
    })
  },
  methods: {
    log: function (evt) {
      console.log('menu')
      window.console.log(evt)
    },
    initMenu () {
      this.base = common.deepClone(base)
      this.senior = common.deepClone(senior)
      this.layout = common.deepClone(layout)
      this.elseItem = common.deepClone(elseItem)
    }
  }
}
</script>

<style scoped>
.cell {
  cursor: move;
  float: left;
  height: 30px;
  line-height: 30px;
  width: 100px;
  background-color: #ecf5ff;
  margin: 0 10px 10px 0;
}
.cell .left {
  float: left;
  width: 27px;
  height: 100%;
  margin: 0;
}
.cell .left img {
  position: relative;
  top: -1px;
  left: 5px;
}
.cell .right {
  float: left;
  width: 73px;
  height: 100%;
  margin: 0;
}
.iconfont  {
  margin-left: 5px;
}
</style>



================================================
FILE: src/components/form-design/FDNumber.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-12-10 11:29:24
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="最小值">
      <el-input-number v-model="data.options.min" :min="0" :max="100" label="描述文字" size="small"></el-input-number>
    </el-form-item>
    <el-form-item label="最大值">
      <el-input-number v-model="data.options.max" :min="0" :max="100" label="描述文字" size="small"></el-input-number>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '数字文本框',
          type: 'number',
          code: '',
          icon: '/static/img/form-design/number.png',
          options: {
            width: '120px',
            min: 0,
            max: 100,
            required: false,
            disabled: false
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '数字文本框',
        type: 'number',
        code: '',
        icon: '/static/img/form-design/number.png',
        options: {
          width: '120px',
          min: 0,
          max: 100,
          required: false,
          disabled: false
        },
        key: common.getGuid()
      }
    }
  },
  methods: {

  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit('formDesign/updateActiveKey', element3.key)
                  this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
                  bus.$emit('formDesign.syncList', common.deepClone(newFormList))
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDRadio.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-07-03 08:37:07
 * @LastEditors: your name
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>

    <el-form-item label="选项">
      <el-radio-group>
        <div v-for="(item, i) in data.options.option" :key="i" style="clearfix">
          <el-radio :label="item.value" style="float: left;">
            <el-input size="small" style="width:80px!important;" v-model="item.label" title="删除选项"></el-input>
            <el-input size="small" style="width:80px!important;" v-model="item.value" title="删除选项"></el-input>
            <i class="el-icon-circle-close" style="color: red;" @click="subOption(i)"></i>
          </el-radio>
        </div>
      </el-radio-group>

      <div>
        <i class="el-icon-circle-plus" style="color: #17B3A3;" title="增加选项" @click="addOption"></i>
      </div>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '单选框组',
          type: 'radio',
          code: '',
          icon: '/static/img/form-design/radio.png',
          options: {
            width: '100%',
            required: false,
            disabled: false,
            option: [
              {
                value: '值1',
                label: '选项1'
              },
              {
                value: '值2',
                label: '选项2'
              },
              {
                value: '值3',
                label: '选项3'
              }
            ]
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '单选框组',
        type: 'radio',
        code: '',
        icon: '/static/img/form-design/radio.png',
        options: {
          width: '100%',
          required: false,
          disabled: false,
          option: [
            {
              value: '值1',
              label: '选项1'
            },
            {
              value: '值2',
              label: '选项2'
            },
            {
              value: '值3',
              label: '选项3'
            }
          ]
        },
        key: common.getGuid()
      }
    }
  },
  methods: {
    addOption () {
      this.data.options.option.push({
        value: `值${this.data.options.option.length + 1}`,
        label: `选项${this.data.options.option.length + 1}`
      })
    },
    subOption (index) {
      this.data.options.option.splice(index, 1)
    }
  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              // activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  // activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDSelect.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-18 12:35:02
 * @LastEditors: Please set LastEditors
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>

    <el-form-item label="选项">
      <el-radio-group>
        <div v-for="(item, i) in data.options.option" :key="i" style="clearfix">
          <el-radio :label="item.value" style="float: left;">
            <el-input size="small" style="width:80px !important;" v-model="item.label" title="删除选项"></el-input>
            <el-input size="small" style="width:80px !important;" v-model="item.value" title="删除选项"></el-input>
            <i class="el-icon-circle-close" style="color: red;" @click="subOption(i)"></i>
          </el-radio>
        </div>
      </el-radio-group>

      <div>
        <i class="el-icon-circle-plus" style="color: #17B3A3;" title="增加选项" @click="addOption"></i>
      </div>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '下拉选择框',
          type: 'select',
          code: '',
          icon: '/static/img/form-design/select.png',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            disabled: false,
            placeholder: '',
            option: [
              {
                value: '值1',
                label: '选项1'
              },
              {
                value: '值2',
                label: '选项2'
              },
              {
                value: '值3',
                label: '选项3'
              }
            ]
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '下拉选择框',
        type: 'select',
        code: '',
        icon: '/static/img/form-design/select.png',
        options: {
          width: '100%',
          defaultValue: '',
          required: false,
          disabled: false,
          placeholder: '',
          option: [
            {
              value: '值1',
              label: '选项1'
            },
            {
              value: '值2',
              label: '选项2'
            },
            {
              value: '值3',
              label: '选项3'
            }
          ]
        },
        key: common.getGuid()
      }
    }
  },
  methods: {
    addOption () {
      this.data.options.option.push({
        value: `值${this.data.options.option.length + 1}`,
        label: `选项${this.data.options.option.length + 1}`
      })
    },
    subOption (index) {
      this.data.options.option.splice(index, 1)
    }
  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              // activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  // activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDSwitch.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-07-03 08:37:07
 * @LastEditors: your name
 -->
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="默认值">
      <el-switch
        v-model="data.options.defaultValue"
        active-color="#13ce66"
        inactive-color="#EEEEEE"
      ></el-switch>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '开关',
          type: 'switch',
          code: '',
          icon: '/static/img/form-design/switch.png',
          options: {
            defaultValue: false,
            required: false,
            disabled: false
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '开关',
        type: 'switch',
        code: '',
        icon: '/static/img/form-design/switch.png',
        options: {
          defaultValue: false,
          required: false,
          disabled: false
        },
        key: common.getGuid()
      }
    }
  },
  methods: {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDTextArea.vue
================================================
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题">
      <el-input v-model="data.title" size="small"></el-input>
    </el-form-item>
    <el-form-item label="表字段code">
      <el-input v-model="data.code" size="small"></el-input>
    </el-form-item>
    <el-form-item label="宽度">
      <el-input v-model="data.options.width" size="small"></el-input>
    </el-form-item>
    <el-form-item label="最大长度">
      <el-input-number
        v-model="data.options.maxlength"
        :min="1"
        :max="300"
        label="最大长度"
        size="small"
      ></el-input-number>
    </el-form-item>
    <el-form-item label="占位内容">
      <el-input v-model="data.options.placeholder" size="small"></el-input>
    </el-form-item>
    <el-form-item label="默认值">
      <el-input v-model="data.options.defaultValue" size="small"></el-input>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
    <el-form-item label="是否必填">
      <el-switch v-model="data.options.required" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="是否禁用">
      <el-switch v-model="data.options.disabled" active-color="#13ce66" inactive-color="#EEEEEE"></el-switch>
    </el-form-item>
    <el-form-item label="正则表达式">
      <el-input v-model="data.options.regEx" size="small"></el-input>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '多行文本',
          type: 'textarea',
          code: '',
          icon: '/static/img/form-design/textarea.png',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            disabled: false,
            placeholder: '',
            regEx: '',
            maxlength: 100
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '多行文本',
        type: 'textarea',
        code: '',
        icon: '/static/img/form-design/textarea.png',
        options: {
          width: '100%',
          defaultValue: '',
          required: false,
          disabled: false,
          placeholder: '',
          regEx: '',
          maxlength: 100
        },
        key: common.getGuid()
      }
    }
  },
  methods: {},
  mounted () {},
  watch: {
    data: {
      handler: function (value, oldValue) {
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch(
                'formDesign/setFormList',
                common.deepClone(newFormList)
              )
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit(
                    'formDesign/updateActiveKey',
                    element3.key
                  )
                  this.$store.dispatch(
                    'formDesign/setFormList',
                    common.deepClone(newFormList)
                  )
                  bus.$emit(
                    'formDesign.syncList',
                    common.deepClone(newFormList)
                  )
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        this.data = common.deepClone(value)
      },
      deep: true
      // immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/FDTitle.vue
================================================
<template>
  <el-form label-position="top" label-width="80px"  size="mini">
    <el-form-item label="标题内容">
      <el-input v-model="data.value" size="small"></el-input>
    </el-form-item>
    <el-form-item label="字体大小">
      <el-input v-model="data.options.fontSize" size="small"></el-input>
    </el-form-item>
    <el-form-item label="标题对齐方式">
      <el-radio-group v-model="data.options.align" size="small">
        <el-radio-button label="left">左对齐</el-radio-button>
        <el-radio-button label="center">居中对齐</el-radio-button>
        <el-radio-button label="right">右对齐</el-radio-button>
      </el-radio-group>
    </el-form-item>
    <el-form-item label="数据绑定key">
      <el-input :title="data.key" v-model="data.key" size="small" :disabled="true"></el-input>
    </el-form-item>
  </el-form>
</template>

<script>
import common from '@/utils/common'
import bus from '@/utils/bus'

export default {
  props: {
    propData: {
      type: Object,
      default: function () {
        return {
          title: '表单标题',
          type: 'title',
          icon: 'biaoti',
          value: '标题',
          options: {
            align: 'center',
            fontSize: '18px'
          },
          key: common.getGuid()
        }
      }
    }
  },
  data () {
    return {
      data: {
        title: '表单标题',
        type: 'title',
        icon: 'biaoti',
        value: '标题',
        options: {
          align: 'center',
          fontSize: '18px'
        },
        key: common.getGuid()
      }
    }
  },
  methods: {
  },
  mounted () {
  },
  watch: {
    data: {
      handler: function (value, oldValue) {
        console.log('FDTitle watch', value)
        let newFormList = common.deepClone(
          this.$store.state.formDesign.formList
        )
        // eslint-disable-next-line no-unused-vars
        let activeIndex
        for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
          const element = newFormList[i]
          if (element.type !== 'grid') {
            if (element.key === this.$store.state.formDesign.activeKey) {
              activeIndex = i

              newFormList[i] = value
              this.$store.commit('formDesign/updateActiveKey', element.key)
              this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
              bus.$emit('formDesign.syncList', common.deepClone(newFormList))
              break
            }
          } else {
            for (let j = 0; j < element.cols.length; j++) {
              const element2 = element.cols[j]
              for (let k = 0; k < element2.list.length; k++) {
                const element3 = element2.list[k]
                if (element3.key === this.$store.state.formDesign.activeKey) {
                  activeIndex = i

                  newFormList[i].cols[j].list[k] = value
                  this.$store.commit('formDesign/updateActiveKey', element3.key)
                  this.$store.dispatch('formDesign/setFormList', common.deepClone(newFormList))
                  bus.$emit('formDesign.syncList', common.deepClone(newFormList))
                  break
                }
              }
            }
          }
        }
      },
      deep: true
    },
    propData: {
      handler: function (value) {
        console.log('propData', value)
        this.data = common.deepClone(value)
      },
      deep: true,
      immediate: true
    }
  }
}
</script>

<style>
</style>


================================================
FILE: src/components/form-design/GridCell.vue
================================================
<template>
  <div class="cell" :class="{'cell-active': data.key === $store.state.formDesign.activeKey}">
    <div @click="activeCell">
      <el-form-item
        v-show="data.type !== 'title'"
        :label="data.title+`${data.options.required?'(必填)':''}`"
        :prop="data.key"
      >
        <el-input
          v-show="data.type === 'input'"
          value=""
          :placeholder="data.options.placeholder"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        ></el-input>
        <el-input
          v-show="data.type === 'textarea'"
          value=""
          :placeholder="data.options.placeholder"
          :disabled="data.options.disabled"
          :readonly="true"
          type="textarea"
          :rows="5"
          :style="{width: data.options.width}"
        ></el-input>
        <el-input-number
          v-show="data.type === 'number'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        ></el-input-number>
        <el-radio-group
          v-show="data.type === 'radio'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        >
          <el-radio
            v-for="(item, i) in data.options.option"
            :label="item.value"
            :key="i"
          >{{item.label}}</el-radio>
        </el-radio-group>
        <el-checkbox-group
          v-show="data.type === 'checkbox'"
          :disabled="data.options.disabled"
          :readonly="true"
          :style="{width: data.options.width}"
        >
          <el-checkbox
            v-for="(item, i) in data.options.option"
            :label="item.value"
            :key="i"
          >{{item.label}}</el-checkbox>
        </el-checkbox-group>
        <el-select
          v-show="data.type === 'select'"
          :placeholder="data.options.placeholder"
          :style="{width: data.options.width}"
          :readonly="true"
          :disabled="data.options.disabled"
        >
          <el-option
            v-for="(item, i) in data.options.option"
            :key="i"
            :label="item.label"
            :value="item.value"
          ></el-option>
        </el-select>
        <el-switch
          v-show="data.type === 'switch'"
          active-color="#13ce66"
          inactive-color="#EEEEEE"
          :style="{width: data.options.width}"
          :readonly="true"
          :disabled="data.options.disabled"
        ></el-switch>
        <el-date-picker
          type="datetime"
          v-show="data.type === 'datetime'"
          :placeholder="data.options.placeholder"
          :style="{width: data.options.width}"
          :disabled="data.options.disabled"
        ></el-date-picker>
        <el-upload
          v-show="data.type === 'img'"
          class="upload-demo"
          action="https://jsonplaceholder.typicode.com/posts/"
          :limit="1"
          :file-list="[]"
          :disabled="data.options.disabled"
          :readonly="true"
        >
          <el-button size="small" type="primary">点击上传</el-button>
          <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
        </el-upload>
      </el-form-item>
       <p
        v-show="data.type === 'title'"
        :style="{'text-align': data.options.align, 'font-size': data.options.fontSize}"
        @click="activeCell"
      >{{data.value}}</p>
    </div>
    <i
      class="action-copy"
      title="复制"
      v-show="data.key === $store.state.formDesign.activeKey && data.type != 'grid'"
      @click="copyForm"
    ></i>
    <i
      class="action-delete"
      title="删除"
      v-show="data.key === $store.state.formDesign.activeKey"
      @click="deleteForm"
    ></i>
  </div>
</template>

<script>
import common from '@/utils/common'

export default {
  components: {},
  props: {
    formAttr: {
      type: Object,
      default: function () {
        return {
          align: 'top',
          size: 'medium',
          labelWidth: 80
        }
      }
    },
    data: {
      type: Object,
      default: function () {
        return {
          type: '',
          name: '',
          options: {
            width: '100%',
            defaultValue: '',
            required: false,
            dataType: 'string',
            placeholder: ''
          },
          key: '1556775967000_4898'
        }
      }
    },
    isGrid: {
      type: Boolean,
      default: false
    },
    FDkey: {
      type: String,
      default: ''
    },
    FDindex: {
      type: Number
    }
  },
  methods: {
    copyForm () {
      let formList
      let grid
      let formListAll = common.deepClone(this.$store.state.formDesign.formList)
      formList = common.deepClone(this.$store.state.formDesign.grid[this.FDkey])
        .cols[this.FDindex].list
      grid = common.deepClone(this.$store.state.formDesign.grid[this.FDkey])
      let newIndex
      for (let i = 0; i < formList.length; i++) {
        const element = formList[i]
        if (element.key === this.data.key) {
          newIndex = i
          break
        }
      }
      let copyForm = common.deepClone(formList[newIndex])
      copyForm.key = common.getGuid()
      copyForm.code = `code_${common.getGuid2()}`
      formList.splice(newIndex + 1, 0, copyForm)
      this.$store.commit(
        'formDesign/updateActiveForm',
        common.deepClone(copyForm)
      )
      this.$store.commit('formDesign/updateActiveKey', copyForm.key)
      grid.cols[this.FDindex].list = formList

      this.$store.commit('formDesign/updateGrid', {
        key: this.FDkey,
        value: common.deepClone(grid)
      })
      for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
        const element = this.$store.state.formDesign.formList[i]
        if (element.key === this.FDkey) {
          formListAll[i] = common.deepClone(grid)
        }
      }
      this.$store.dispatch(
        'formDesign/setFormList',
        common.deepClone(formListAll)
      )
      this.$emit('syncList', formList, this.FDindex)
    },
    deleteForm () {
      console.warn('this.FDkey', this.FDkey)
      console.warn('this.$store.state.formDesign.grid', this.$store.state.formDesign.grid)
      let formList
      let grid
      let formListAll = common.deepClone(this.$store.state.formDesign.formList)
      formList = common.deepClone(this.$store.state.formDesign.grid[this.FDkey])
        .cols[this.FDindex].list
      grid = common.deepClone(this.$store.state.formDesign.grid[this.FDkey])
      let newIndex
      for (let i = 0; i < formList.length; i++) {
        const element = formList[i]
        if (element.key === this.data.key) {
          newIndex = i
          break
        }
      }
      formList.splice(newIndex, 1)
      grid.cols[this.FDindex].list = formList
      console.log('formList', formList)
      console.log('grid', grid)
      console.log('formListAll', formListAll)
      console.log('this.FDindex', this.FDindex)

      for (let i = 0; i < this.$store.state.formDesign.formList.length; i++) {
        const element = this.$store.state.formDesign.formList[i]
        if (element.key === this.FDkey) {
          formListAll[i] = grid
        }
      }

      this.$store.dispatch(
        'formDesign/setFormList',
        common.deepClone(formListAll)
      )

      // this.$emit("syncList", formList, this.FDindex);

      this.$store.commit('formDesign/updateGrid', {
        key: this.FDkey,
        value: common.deepClone(grid)
      })

      if (newIndex !== 0) {
        this.$store.commit(
          'formDesign/updateActiveKey',
          formList[newIndex - 1].key
        )
        this.$store.commit(
          'formDesign/updateActiveForm',
          common.deepClone(formList[newIndex - 1])
        )
      } else {
        if (formList.length > 0) {
          this.$store.commit('formDesign/updateActiveKey', formList[0].key)
          this.$store.commit(
            'formDesign/updateActiveForm',
            common.deepClone(formList[0])
          )
        }
      }
    },
    activeCell () {
      this.$store.commit('formDesign/updateActiveKey', this.data.key)
      this.$store.commit('formDesign/updateShowType', this.data.type)
      this.$store.commit(
        'formDesign/updateActiveForm',
        common.deepClone(this.data)
      )
    }
  }
}
</script>

<style lang="css" scoped>
.cell {
  background-color: #eee;
  padding: 10px 10px 20px 10px;
  position: relative;
  cursor: move;
}
.cell-active {
  background-color: #b3d8ff;
  border-left: 5px solid #409eff;
}
.el-form-item {
  margin-bottom: 0;
}
.action-copy {
  position: absolute;
  bottom: -15px;
  right: 60px;
  height: 30px;
  width: 30px;
  background: url("../../assets/img/copy.png") no-repeat center;
  background-size: 18px 18px;
  background-color: #ecf5ff;
  border-color: #409eff;
  border-radius: 50%;
  cursor: pointer;
  border: 1px solid #409eff;
  z-index: 1;
}
.action-copy:hover {
  background: url("../../assets/img/copy-active.png") no-repeat center;
  background-color: #409eff;
}
.action-delete {
  position: absolute;
  bottom: -15px;
  right: 15px;
  height: 30px;
  width: 30px;
  background: url("../../assets/img/delete.png") no-repeat center;
  background-size: 15px 15px;
  background-color: #fef0f0;
  border-radius: 50%;
  cursor: pointer;
  border: 1px solid #f56c6c;
  z-index: 1;
}
.action-delete:hover {
  background: url("../../assets/img/delete-active.png") no-repeat center;
  background-color: #f56c6c;
}
</style>


================================================
FILE: src/components/form-design/Panel.vue
================================================
<!--
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2019-07-03 08:37:07
 * @LastEditTime: 2019-10-12 17:30:04
 * @LastEditors: Please set LastEditors
 -->
<template>
  <div class="main">
    <el-form
      ref="form"
      :label-position="formAttr.align"
      :label-width="formAttr.labelWidth"
      :size="formAttr.size"
      :class="{'dragArea-empty':$store.state.formDesign.formList.length > 0}"
      :rules="$store.state.formDesign.rules"
    >
      <draggable
        class="dragArea
Download .txt
gitextract_a36ql3zd/

├── .babelrc
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .gitignore
├── .postcssrc.js
├── CHANGELOG.md
├── LICENSE
├── README.md
├── build/
│   ├── build.js
│   ├── check-versions.js
│   ├── utils.js
│   ├── vue-loader.conf.js
│   ├── webpack.base.conf.js
│   ├── webpack.dev.conf.js
│   ├── webpack.prod.conf.js
│   └── webpack.test.conf.js
├── config/
│   ├── dev.env.js
│   ├── index.js
│   ├── prod.env.js
│   └── test.env.js
├── debug.log
├── gulpfile.js
├── index.html
├── package.json
├── src/
│   ├── App.vue
│   ├── assets/
│   │   └── scss/
│   │       ├── _base.scss
│   │       ├── _normalize.scss
│   │       ├── _variables.scss
│   │       └── index.scss
│   ├── components/
│   │   ├── common/
│   │   │   ├── ApprovalPanel.vue
│   │   │   ├── DocumentPanel.vue
│   │   │   └── FormPreview.vue
│   │   ├── form-design/
│   │   │   ├── Cell.vue
│   │   │   ├── FDCheckbox.vue
│   │   │   ├── FDDateTime.vue
│   │   │   ├── FDGrid.vue
│   │   │   ├── FDGridPanel.vue
│   │   │   ├── FDIdea.vue
│   │   │   ├── FDImg.vue
│   │   │   ├── FDInput.vue
│   │   │   ├── FDMenu.vue
│   │   │   ├── FDNumber.vue
│   │   │   ├── FDRadio.vue
│   │   │   ├── FDSelect.vue
│   │   │   ├── FDSwitch.vue
│   │   │   ├── FDTextArea.vue
│   │   │   ├── FDTitle.vue
│   │   │   ├── GridCell.vue
│   │   │   ├── Panel.vue
│   │   │   ├── Test.vue
│   │   │   ├── nested.vue
│   │   │   ├── nestedExample.vue
│   │   │   ├── raw-displayer.vue
│   │   │   └── view/
│   │   │       ├── Document copy.vue
│   │   │       ├── Document.vue
│   │   │       ├── FormItem.vue
│   │   │       ├── FormList.vue
│   │   │       └── Material.vue
│   │   ├── icon-svg/
│   │   │   └── index.vue
│   │   └── table-tree-column/
│   │       └── index.vue
│   ├── element-ui/
│   │   └── index.js
│   ├── element-ui-theme/
│   │   ├── element-#0BB2D4/
│   │   │   └── index.css
│   │   ├── element-#11C26D/
│   │   │   └── index.css
│   │   ├── element-#17B3A3/
│   │   │   └── index.css
│   │   ├── element-#3E8EF7/
│   │   │   └── index.css
│   │   ├── element-#667AFA/
│   │   │   └── index.css
│   │   ├── element-#757575/
│   │   │   └── index.css
│   │   ├── element-#9463F7/
│   │   │   └── index.css
│   │   ├── element-#997B71/
│   │   │   └── index.css
│   │   ├── element-#EB6709/
│   │   │   └── index.css
│   │   ├── element-#F74584/
│   │   │   └── index.css
│   │   ├── element-#FCB900/
│   │   │   └── index.css
│   │   ├── element-#FF4C52/
│   │   │   └── index.css
│   │   └── index.js
│   ├── icons/
│   │   ├── iconfont.js
│   │   └── index.js
│   ├── main.js
│   ├── mock/
│   │   ├── index.js
│   │   └── modules/
│   │       ├── common.js
│   │       ├── job-schedule.js
│   │       ├── oss.js
│   │       ├── sys-config.js
│   │       ├── sys-log.js
│   │       ├── sys-menu.js
│   │       ├── sys-role.js
│   │       └── sys-user.js
│   ├── router/
│   │   ├── import-development.js
│   │   ├── import-production.js
│   │   └── index.js
│   ├── store/
│   │   ├── index.js
│   │   └── modules/
│   │       ├── common.js
│   │       ├── formDesign.js
│   │       └── user.js
│   ├── utils/
│   │   ├── bus.js
│   │   ├── common.js
│   │   ├── httpRequest.js
│   │   ├── index.js
│   │   └── validate.js
│   └── views/
│       ├── common/
│       │   ├── 404.vue
│       │   ├── home.vue
│       │   ├── login.vue
│       │   └── theme.vue
│       ├── demo/
│       │   ├── FlowEditor.vue
│       │   ├── echarts.vue
│       │   └── ueditor.vue
│       ├── main-content.vue
│       ├── main-navbar-update-password.vue
│       ├── main-navbar.vue
│       ├── main-sidebar-sub-menu.vue
│       ├── main-sidebar.vue
│       ├── main.vue
│       └── modules/
│           ├── job/
│           │   ├── schedule-add-or-update.vue
│           │   ├── schedule-log.vue
│           │   └── schedule.vue
│           ├── oss/
│           │   ├── oss-config.vue
│           │   ├── oss-upload.vue
│           │   └── oss.vue
│           └── sys/
│               ├── config-add-or-update.vue
│               ├── config.vue
│               ├── log.vue
│               ├── menu-add-or-update.vue
│               ├── menu.vue
│               ├── role-add-or-update.vue
│               ├── role.vue
│               ├── user-add-or-update.vue
│               └── user.vue
├── static/
│   ├── base.css
│   ├── config/
│   │   ├── index-prod.js
│   │   ├── index-qa.js
│   │   ├── index-uat.js
│   │   ├── index.js
│   │   └── init.js
│   ├── flow-editor/
│   │   └── demo/
│   │       ├── css/
│   │       │   ├── dmp/
│   │       │   │   ├── admin/
│   │       │   │   │   ├── admin.css
│   │       │   │   │   └── pub.css
│   │       │   │   ├── index/
│   │       │   │   │   ├── index.css
│   │       │   │   │   └── pub.css
│   │       │   │   └── login/
│   │       │   │       └── login.css
│   │       │   └── font-awesome/
│   │       │       └── css/
│   │       │           └── font-awesome.css
│   │       ├── html/
│   │       │   └── index/
│   │       │       └── flow/
│   │       │           ├── flow.html
│   │       │           ├── flowEdit.html
│   │       │           └── flowLog.html
│   │       └── js/
│   │           ├── dmp/
│   │           │   ├── index/
│   │           │   │   ├── flow/
│   │           │   │   │   └── flow.js
│   │           │   │   └── index.js
│   │           │   └── pub/
│   │           │       └── pub.js
│   │           ├── layui/
│   │           │   └── examples/
│   │           │       ├── admin.html
│   │           │       ├── all.html
│   │           │       ├── button.html
│   │           │       ├── carousel.html
│   │           │       ├── code.html
│   │           │       ├── element.html
│   │           │       ├── extend.html
│   │           │       ├── flow.html
│   │           │       ├── form.html
│   │           │       ├── js/
│   │           │       │   ├── child/
│   │           │       │   │   └── test.js
│   │           │       │   └── index.js
│   │           │       ├── json/
│   │           │       │   ├── table/
│   │           │       │   │   ├── demo1.json
│   │           │       │   │   └── demo2.json
│   │           │       │   └── upload/
│   │           │       │       └── demoLayEdit.json
│   │           │       ├── laydate.html
│   │           │       ├── layedit.html
│   │           │       ├── layer.html
│   │           │       ├── layout.html
│   │           │       ├── laypage.html
│   │           │       ├── responsive.html
│   │           │       ├── table.html
│   │           │       ├── tree.html
│   │           │       ├── upload.html
│   │           │       ├── util.html
│   │           │       └── xingzuo.html
│   │           └── plugin/
│   │               ├── flow/
│   │               │   ├── analytics.js
│   │               │   ├── collaboration.js
│   │               │   ├── designer.core.js
│   │               │   ├── designer.css
│   │               │   ├── designer.events.js
│   │               │   ├── designer.methods.js
│   │               │   ├── designer.ui.js
│   │               │   ├── export.js
│   │               │   ├── global.css
│   │               │   ├── jquery.js
│   │               │   ├── schema.js
│   │               │   ├── themes.js
│   │               │   ├── ui.css
│   │               │   └── util.js
│   │               └── jquery/
│   │                   ├── canvasparticle.js
│   │                   └── scrollbar.js
│   ├── font/
│   │   ├── demo.css
│   │   ├── demo_index.html
│   │   ├── iconfont.css
│   │   └── iconfont.js
│   ├── normalize.css
│   ├── plugins/
│   │   ├── mock-1.0.0-beta3/
│   │   │   └── mock-min.js
│   │   └── ueditor-1.4.3.3/
│   │       ├── dialogs/
│   │       │   ├── anchor/
│   │       │   │   └── anchor.html
│   │       │   ├── attachment/
│   │       │   │   ├── attachment.css
│   │       │   │   ├── attachment.html
│   │       │   │   └── attachment.js
│   │       │   ├── background/
│   │       │   │   ├── background.css
│   │       │   │   ├── background.html
│   │       │   │   └── background.js
│   │       │   ├── charts/
│   │       │   │   ├── chart.config.js
│   │       │   │   ├── charts.css
│   │       │   │   ├── charts.html
│   │       │   │   └── charts.js
│   │       │   ├── emotion/
│   │       │   │   ├── emotion.css
│   │       │   │   ├── emotion.html
│   │       │   │   └── emotion.js
│   │       │   ├── gmap/
│   │       │   │   └── gmap.html
│   │       │   ├── help/
│   │       │   │   ├── help.css
│   │       │   │   ├── help.html
│   │       │   │   └── help.js
│   │       │   ├── image/
│   │       │   │   ├── image.css
│   │       │   │   ├── image.html
│   │       │   │   └── image.js
│   │       │   ├── insertframe/
│   │       │   │   └── insertframe.html
│   │       │   ├── internal.js
│   │       │   ├── link/
│   │       │   │   └── link.html
│   │       │   ├── map/
│   │       │   │   ├── map.html
│   │       │   │   └── show.html
│   │       │   ├── music/
│   │       │   │   ├── music.css
│   │       │   │   ├── music.html
│   │       │   │   └── music.js
│   │       │   ├── preview/
│   │       │   │   └── preview.html
│   │       │   ├── scrawl/
│   │       │   │   ├── scrawl.css
│   │       │   │   ├── scrawl.html
│   │       │   │   └── scrawl.js
│   │       │   ├── searchreplace/
│   │       │   │   ├── searchreplace.html
│   │       │   │   └── searchreplace.js
│   │       │   ├── snapscreen/
│   │       │   │   └── snapscreen.html
│   │       │   ├── spechars/
│   │       │   │   ├── spechars.html
│   │       │   │   └── spechars.js
│   │       │   ├── table/
│   │       │   │   ├── edittable.css
│   │       │   │   ├── edittable.html
│   │       │   │   ├── edittable.js
│   │       │   │   ├── edittd.html
│   │       │   │   └── edittip.html
│   │       │   ├── template/
│   │       │   │   ├── config.js
│   │       │   │   ├── template.css
│   │       │   │   ├── template.html
│   │       │   │   └── template.js
│   │       │   ├── video/
│   │       │   │   ├── video.css
│   │       │   │   ├── video.html
│   │       │   │   └── video.js
│   │       │   ├── webapp/
│   │       │   │   └── webapp.html
│   │       │   └── wordimage/
│   │       │       ├── fClipboard_ueditor.swf
│   │       │       ├── imageUploader.swf
│   │       │       ├── tangram.js
│   │       │       ├── wordimage.html
│   │       │       └── wordimage.js
│   │       ├── lang/
│   │       │   ├── en/
│   │       │   │   └── en.js
│   │       │   └── zh-cn/
│   │       │       └── zh-cn.js
│   │       ├── themes/
│   │       │   ├── default/
│   │       │   │   ├── css/
│   │       │   │   │   └── ueditor.css
│   │       │   │   └── dialogbase.css
│   │       │   └── iframe.css
│   │       ├── third-party/
│   │       │   ├── SyntaxHighlighter/
│   │       │   │   ├── shCore.js
│   │       │   │   └── shCoreDefault.css
│   │       │   ├── codemirror/
│   │       │   │   ├── codemirror.css
│   │       │   │   └── codemirror.js
│   │       │   ├── highcharts/
│   │       │   │   ├── adapters/
│   │       │   │   │   ├── mootools-adapter.js
│   │       │   │   │   ├── mootools-adapter.src.js
│   │       │   │   │   ├── prototype-adapter.js
│   │       │   │   │   ├── prototype-adapter.src.js
│   │       │   │   │   ├── standalone-framework.js
│   │       │   │   │   └── standalone-framework.src.js
│   │       │   │   ├── highcharts-more.js
│   │       │   │   ├── highcharts-more.src.js
│   │       │   │   ├── highcharts.js
│   │       │   │   ├── highcharts.src.js
│   │       │   │   ├── modules/
│   │       │   │   │   ├── annotations.js
│   │       │   │   │   ├── annotations.src.js
│   │       │   │   │   ├── canvas-tools.js
│   │       │   │   │   ├── canvas-tools.src.js
│   │       │   │   │   ├── data.js
│   │       │   │   │   ├── data.src.js
│   │       │   │   │   ├── drilldown.js
│   │       │   │   │   ├── drilldown.src.js
│   │       │   │   │   ├── exporting.js
│   │       │   │   │   ├── exporting.src.js
│   │       │   │   │   ├── funnel.js
│   │       │   │   │   ├── funnel.src.js
│   │       │   │   │   ├── heatmap.js
│   │       │   │   │   ├── heatmap.src.js
│   │       │   │   │   ├── map.js
│   │       │   │   │   ├── map.src.js
│   │       │   │   │   ├── no-data-to-display.js
│   │       │   │   │   └── no-data-to-display.src.js
│   │       │   │   └── themes/
│   │       │   │       ├── dark-blue.js
│   │       │   │       ├── dark-green.js
│   │       │   │       ├── gray.js
│   │       │   │       ├── grid.js
│   │       │   │       └── skies.js
│   │       │   ├── jquery-1.10.2.js
│   │       │   ├── video-js/
│   │       │   │   ├── video-js.css
│   │       │   │   ├── video-js.swf
│   │       │   │   ├── video.dev.js
│   │       │   │   └── video.js
│   │       │   ├── webuploader/
│   │       │   │   ├── Uploader.swf
│   │       │   │   ├── webuploader.css
│   │       │   │   ├── webuploader.custom.js
│   │       │   │   ├── webuploader.flashonly.js
│   │       │   │   ├── webuploader.html5only.js
│   │       │   │   ├── webuploader.js
│   │       │   │   └── webuploader.withoutimage.js
│   │       │   └── zeroclipboard/
│   │       │       ├── ZeroClipboard.js
│   │       │       └── ZeroClipboard.swf
│   │       └── ueditor.config.js
│   └── reset.css
└── test/
    ├── e2e/
    │   ├── custom-assertions/
    │   │   └── elementCount.js
    │   ├── nightwatch.conf.js
    │   ├── runner.js
    │   └── specs/
    │       └── test.js
    └── unit/
        ├── .eslintrc
        ├── jest.conf.js
        ├── setup.js
        └── specs/
            └── HelloWorld.spec.js
Download .txt
SYMBOL INDEX (945 symbols across 78 files)

FILE: build/check-versions.js
  function exec (line 7) | function exec (cmd) {

FILE: build/utils.js
  function generateLoaders (line 33) | function generateLoaders (loader, loaderOptions) {

FILE: build/webpack.base.conf.js
  function resolve (line 7) | function resolve (dir) {

FILE: build/webpack.dev.conf.js
  constant HOST (line 11) | const HOST = process.env.HOST
  constant PORT (line 12) | const PORT = process.env.PORT && Number(process.env.PORT)

FILE: build/webpack.prod.conf.js
  method minChunks (line 87) | minChunks (module) {

FILE: src/icons/index.js
  method getNameList (line 24) | getNameList () {

FILE: src/mock/index.js
  function fnCreate (line 28) | function fnCreate (mod, isOpen = true) {

FILE: src/mock/modules/common.js
  function login (line 4) | function login () {
  function logout (line 19) | function logout () {

FILE: src/mock/modules/job-schedule.js
  function list (line 20) | function list () {
  function info (line 40) | function info () {
  function add (line 54) | function add () {
  function update (line 67) | function update () {
  function del (line 80) | function del () {
  function run (line 93) | function run () {
  function pause (line 106) | function pause () {
  function resume (line 119) | function resume () {

FILE: src/mock/modules/oss.js
  function list (line 14) | function list () {
  function config (line 34) | function config () {
  function addConfig (line 68) | function addConfig () {
  function del (line 81) | function del () {

FILE: src/mock/modules/sys-config.js
  function list (line 15) | function list () {
  function info (line 35) | function info () {
  function add (line 49) | function add () {
  function update (line 62) | function update () {
  function del (line 75) | function del () {

FILE: src/mock/modules/sys-log.js
  function list (line 34) | function list () {
  function scheduleList (line 54) | function scheduleList () {
  function scheduleInfo (line 74) | function scheduleInfo () {

FILE: src/mock/modules/sys-menu.js
  function nav (line 503) | function nav () {
  function list (line 552) | function list () {
  function select (line 562) | function select () {
  function info (line 578) | function info () {
  function add (line 592) | function add () {
  function update (line 605) | function update () {
  function del (line 618) | function del () {

FILE: src/mock/modules/sys-role.js
  function list (line 17) | function list () {
  function select (line 37) | function select () {
  function info (line 51) | function info () {
  function add (line 65) | function add () {
  function update (line 78) | function update () {
  function del (line 91) | function del () {

FILE: src/mock/modules/sys-user.js
  function list (line 19) | function list () {
  function info (line 39) | function info () {
  function updatePassword (line 53) | function updatePassword () {
  function add (line 66) | function add () {
  function update (line 79) | function update () {
  function del (line 92) | function del () {

FILE: src/router/index.js
  method beforeEnter (line 44) | beforeEnter (to, from, next) {
  function fnCurrentRouteType (line 96) | function fnCurrentRouteType (route, globalRoutes = []) {
  function fnAddDynamicMenuRoutes (line 113) | function fnAddDynamicMenuRoutes (menuList = [], routes = []) {

FILE: src/store/index.js
  method resetStore (line 19) | resetStore (state) {

FILE: src/store/modules/common.js
  method updateDocumentClientHeight (line 22) | updateDocumentClientHeight (state, height) {
  method updateNavbarLayoutType (line 25) | updateNavbarLayoutType (state, type) {
  method updateSidebarLayoutSkin (line 28) | updateSidebarLayoutSkin (state, skin) {
  method updateSidebarFold (line 31) | updateSidebarFold (state, fold) {
  method updateMenuList (line 34) | updateMenuList (state, list) {
  method updateMenuActiveName (line 37) | updateMenuActiveName (state, name) {
  method updateContentIsNeedRefresh (line 40) | updateContentIsNeedRefresh (state, status) {
  method updateMainTabs (line 43) | updateMainTabs (state, tabs) {
  method updateMainTabsActiveName (line 46) | updateMainTabsActiveName (state, name) {

FILE: src/store/modules/formDesign.js
  method updateShowType (line 23) | updateShowType (state, value) {
  method updateActiveKey (line 26) | updateActiveKey (state, value) {
  method updateFormList (line 29) | updateFormList (state, value) {
  method updateActiveForm (line 45) | updateActiveForm (state, value) {
  method updateRules (line 48) | updateRules (state, value) {
  method updateGrid (line 51) | updateGrid (state, value) {
  method setFormList (line 56) | setFormList ({ commit }, value) {
  method addFormList (line 60) | addFormList ({ commit, state }, form) {
  method removeFormList (line 69) | removeFormList ({ commit }, key) {
  method getFormRules (line 89) | getFormRules (state) {

FILE: src/store/modules/user.js
  method updateId (line 8) | updateId (state, id) {
  method updateName (line 11) | updateName (state, name) {

FILE: src/utils/common.js
  constant STORAGE_USER_KEY (line 9) | const STORAGE_USER_KEY = 'STORAGE_USER_KEY'
  method getLocal (line 13) | getLocal (key = STORAGE_USER_KEY) {
  method setLocal (line 18) | setLocal (res, key = STORAGE_USER_KEY, isSaveOldData = false) {
  method deepClone (line 28) | deepClone (obj) {
  method getGuid (line 51) | getGuid () {
  method getGuid2 (line 57) | getGuid2 () {
  method isEmpty (line 63) | isEmpty (value) {
  method formatTime (line 76) | formatTime (time) {
  method formatTime2 (line 87) | formatTime2 (time) {
  method formatDate (line 97) | formatDate (time) {
  method formatDateCN (line 105) | formatDateCN (time) {
  method stringToArray (line 118) | stringToArray (value) {
  method arrayToString (line 130) | arrayToString (value) {
  method isPhone (line 142) | isPhone (value) {
  method isIDCardNo (line 150) | isIDCardNo (value) {
  method isOk (line 163) | isOk (res) {
  method show (line 184) | show () {
  method hide (line 191) | hide () {

FILE: src/utils/index.js
  function getUUID (line 8) | function getUUID () {
  function isAuth (line 18) | function isAuth (key) {
  function treeDataTranslate (line 28) | function treeDataTranslate (data, id = 'id', pid = 'parentId') {
  function clearLoginInfo (line 54) | function clearLoginInfo () {

FILE: src/utils/validate.js
  function isEmail (line 5) | function isEmail (s) {
  function isMobile (line 13) | function isMobile (s) {
  function isPhone (line 21) | function isPhone (s) {
  function isURL (line 29) | function isURL (s) {

FILE: static/flow-editor/demo/js/dmp/index/flow/flow.js
  function nodeConf (line 603) | function nodeConf (node) {
  function showMenu (line 624) | function showMenu (m) {

FILE: static/flow-editor/demo/js/dmp/index/index.js
  function toHome (line 42) | function toHome(){

FILE: static/flow-editor/demo/js/plugin/flow/analytics.js
  function J (line 1) | function J(a){vd.set(a)}
  function Ja (line 11) | function Ja(a){if(100!=a.get(Ka)&&La(P(a,Q))%1E4>=100*R(a,Ka))throw"abor...
  function Ma (line 11) | function Ma(a){if(G(P(a,Na)))throw"abort";}
  function Oa (line 11) | function Oa(){var a=M.location.protocol;if("http:"!=a&&"https:"!=a)throw...
  function Pa (line 12) | function Pa(a){try{O.navigator.sendBeacon?J(42):O.XMLHttpRequest&&"withC...
  function Sa (line 13) | function Sa(a){var b=P(a,gd)||oc()+"/collect",c=P(a,fa);!c&&a.get(Vd)&&(...
  function Hc (line 14) | function Hc(a){(O.gaData=O.gaData||{}).expId&&a.set(Nc,(O.gaData=O.gaDat...
  function cd (line 14) | function cd(){if(O.navigator&&"preview"==O.navigator.loadPurpose)throw"a...
  function yd (line 15) | function yd(a){var b=O.gaDevIds;ka(b)&&0!=b.length&&a.set("&did",b.join(...
  function vb (line 15) | function vb(a){if(!a.get(Na))throw"abort";}
  function Ta (line 15) | function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction...
  function X (line 24) | function X(a,b,c,d){b[a]=function(){try{return d&&J(d),c.apply(this,argu...
  function fc (line 24) | function fc(){var a,b;if((b=(b=O.navigator)?b.plugins:null)&&b.length)fo...
  function Xc (line 31) | function Xc(a,b,c){"none"==b&&(b="");var d=[],e=Ca(a);a="__utma"==a?6:2;...
  function Zc (line 31) | function Zc(a,b){if(null==a)var c=a=1;else c=La(a),a=La(D(a,".")?a.subst...
  function Bc (line 31) | function Bc(a){var b=a.get(Q),c=a.get(I)||"";b="_ga=2."+K(pa(c+b,0)+"."+...
  function Ic (line 32) | function Ic(a,b){var c=new Date,d=O.navigator,e=d.plugins||[];a=[a,d.use...
  function pa (line 32) | function pa(a,b){var c=new Date,d=O.navigator,e=c.getHours()+Math.floor(...
  function d (line 36) | function d(c){try{c=c||O.event;a:{var d=c.target||c.srcElement;for(c=100...
  function sd (line 37) | function sd(a,b){if(b==M.location.hostname)return!1;for(var c=0;c<a.leng...
  function ke (line 37) | function ke(a,b){return b!=Ic(a,0)&&b!=Ic(a,-1)&&b!=Ic(a,-2)&&b!=pa(a,0)...
  function b (line 37) | function b(a,b){b&&(c+="&"+a+"="+K(b))}
  function b (line 39) | function b(a,b){d.b.data.set(a,b)}
  function c (line 39) | function c(a,c){b(a,c);d.filters.add(a)}
  function ud (line 47) | function ud(a){return 0<=a.indexOf(".")||0<=a.indexOf(":")}
  function b (line 51) | function b(a){var b=(a.hostname||"").split(":")[0].toLowerCase(),c=(a.pr...
  function La (line 57) | function La(a){var b=1,c;if(a)for(b=0,c=a.length-1;0<=c;c--){var d=a.cha...

FILE: static/flow-editor/demo/js/plugin/flow/designer.core.js
  function e (line 194) | function e(l, o) {
  function c (line 272) | function c() {
  function a (line 471) | function a(m) {
  function h (line 488) | function h(l, m) {
  function d (line 497) | function d(o, q, p) {
  function i (line 538) | function i() {
  function v (line 1400) | function v(i, C) {
  function w (line 1686) | function w(i, E) {
  function c (line 2504) | function c() {
  function e (line 2683) | function e(j, i) {
  function c (line 2910) | function c() {
  function a (line 3190) | function a(i) {
  function c (line 3885) | function c(l, o) {
  function g (line 3977) | function g(n) {
  function c (line 4117) | function c(i) {
  function f (line 4948) | function f(j) {
  function b (line 5252) | function b(z, r, D) {
  function l (line 5537) | function l(M, H, i, J) {
  function e (line 5571) | function e(W, M, Q, Y, R, E) {
  function d (line 7318) | function d(i, h) {
  function c (line 7441) | function c() {
  function e (line 7456) | function e(l) {
  function s (line 8776) | function s(E, F) {
  function a (line 9179) | function a(h) {

FILE: static/flow-editor/demo/js/plugin/flow/designer.methods.js
  function b (line 238) | function b(i, k) {
  function n (line 631) | function n(s) {
  function e (line 647) | function e(s) {

FILE: static/flow-editor/demo/js/plugin/flow/designer.ui.js
  function b (line 1) | function b(i){var l=i.attr("menu");if(i.hasClass("readonly")){return}$("...
  function g (line 1) | function g(t){var k=t.attr("ac");if(k=="rename"){$(".diagram_title").tri...
  function b (line 1) | function b(){var e=$("#input_img_url").val().trim();if(e!=c){c=e;if(e!="...
  function a (line 1) | function a(c){var d=c.val();var b=d.split(",");var e=c.is(":checked");if...
  function h (line 1) | function h(q,w){var p=$("#shape_opt_box");if(p.length==0){p=$("<div id='...
  function a (line 1) | function a(){$(".dock_history_remove_div").find("span:first").off().on("...
  function b (line 1) | function b(l){var g=$("#publish_description"),f=$(".clone-radio:checked"...
  function d (line 1) | function d(f){var g=$(".pubpo-tab");if(f=="public"){g.hide();$("#publish...
  function a (line 1) | function a(g){if(typeof g=="undefined"){g=$("#tag_input").val();$("#tag_...
  function c (line 1) | function c(){a();var f=$("#tag_items").find(".tagitem").map(function(){r...
  function a (line 1) | function a(){$(".dlg-content .create").text("创建链接").off().on("click",fun...
  function d (line 1) | function d(){Util.ajax({url:"/view/addlink",data:{chartId:j},success:fun...
  function g (line 1) | function g(k){$(".dlg-content .create").text("删除链接").off().on("click",fu...
  function b (line 1) | function b(k){var m=$(".switchbutton");var l=m.attr("val");if(l=="false"...
  function f (line 1) | function f(){Util.ajax({url:"/view/dellink",data:{chartId:j},success:fun...
  function c (line 1) | function c(m){var l=$(m).attr("val");if(l=="true"){var k=Util.creatCode(...
  function i (line 1) | function i(k){Util.ajax({url:"/view/addpassword",data:{viewPassword:k,ch...
  function d (line 1) | function d(g,k){var i='<iframe id="embed_dom" name="embed_dom" framebord...
  function a (line 1) | function a(j,h,g){if(j.attr("max")){var d=parseInt(j.attr("max"));if(h>d...

FILE: static/flow-editor/demo/js/plugin/flow/export.js
  function d (line 1) | function d(e){return("0"+parseInt(e).toString(16)).slice(-2)}
  function b (line 1) | function b(e){return parseInt("0x"+e)}
  function y (line 1) | function y(a){return a-10000}
  function k (line 1) | function k(l,i){if(l.x==i.x){return{len:Math.abs(i.y-l.y),hor:false,righ...

FILE: static/flow-editor/demo/js/plugin/flow/jquery.js
  function cy (line 1) | function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.pa...
  function cu (line 1) | function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.cs...
  function ct (line 1) | function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),funct...
  function cs (line 1) | function cs(){cq=b}
  function cr (line 1) | function cr(){setTimeout(cs,0);return cq=f.now()}
  function ci (line 1) | function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(...
  function ch (line 1) | function ch(){try{return new a.XMLHttpRequest}catch(b){}}
  function cb (line 1) | function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.da...
  function ca (line 1) | function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i...
  function b_ (line 1) | function b_(a,b,c,d){if(f.isArray(b)){f.each(b,function(b,e){c||bD.test(...
  function b$ (line 1) | function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c){c[...
  function bZ (line 1) | function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],...
  function bY (line 1) | function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f...
  function bB (line 1) | function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b===...
  function bo (line 1) | function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTM...
  function bn (line 1) | function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!...
  function bm (line 1) | function bm(a){if(a.type==="checkbox"||a.type==="radio"){a.defaultChecke...
  function bl (line 1) | function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getEl...
  function bk (line 1) | function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttrib...
  function bj (line 1) | function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(...
  function bi (line 1) | function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tb...
  function U (line 1) | function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.creat...
  function T (line 1) | function T(a,b,c){b=b||0;if(f.isFunction(b)){return f.grep(a,function(a,...
  function S (line 1) | function S(a){return !a||!a.parentNode||a.parentNode.nodeType===11}
  function K (line 1) | function K(){return !0}
  function J (line 1) | function J(){return !1}
  function n (line 1) | function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);...
  function m (line 1) | function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b])){cont...
  function l (line 1) | function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-...
  function h (line 1) | function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;...
  function J (line 1) | function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch...
  function a (line 1) | function a(b,c){return new a.fn.init(b,c)}
  function m (line 1) | function m(a){return function(b){e[a]=arguments.length>1?i.call(argument...
  function l (line 1) | function l(a){return function(c){b[a]=arguments.length>1?i.call(argument...
  function m (line 1) | function m(){--h||d.resolveWith(e,[e])}
  function x (line 1) | function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j)...
  function w (line 1) | function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j)...
  function w (line 1) | function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.ready...
  function g (line 1) | function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nod...
  function h (line 1) | function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}
  function h (line 1) | function h(a){return e.step(a)}

FILE: static/flow-editor/demo/js/plugin/flow/schema.js
  function f (line 898) | function f(n) {
  function quote (line 921) | function quote(string) {
  function str (line 929) | function str(key, holder) {
  function walk (line 1014) | function walk(holder, key) {

FILE: static/flow-editor/demo/js/plugin/flow/util.js
  function d (line 1) | function d(a,b){var c=e.find(".multi-input-vals"),d="&#xe63e;",f=/^([\w]...
  function submitCallback (line 1) | function submitCallback(){frame.unbind();var body=$("#"+frameId).content...
  function b (line 1) | function b(a){try{var c=a.html().replace(/^\s+/g," ").replace(/(\S)\s+(\...
  function c (line 1) | function c(a){var b=a.find(".ico-face");b.each(function(a,b){$(b).replac...
  function d (line 1) | function d(a){var b=a.children(".paste-cont");b.length<1||b.each(functio...
  function e (line 1) | function e(a){$(a).focus();try{var b=document.createRange();b.selectNode...
  function f (line 1) | function f(a){var b=a.cloneNode(!0),c=b.childNodes.length,d=0,e=0;if(c>3...
  function g (line 1) | function g(a,b,c,d){var e,f,g=a.html(),h=document.createElement("div"),i...

FILE: static/flow-editor/demo/js/plugin/jquery/canvasparticle.js
  function t (line 1) | function t(){a.width=b.width();a.height=b.height();}
  function x (line 1) | function x(){e.clearRect(0,0,a.width,a.height);var n=[o].concat(r);r.for...

FILE: static/flow-editor/demo/js/plugin/jquery/scrollbar.js
  function initialize (line 22) | function initialize () {
  function findOffsetTop (line 46) | function findOffsetTop (o) {
  function addEvent (line 57) | function addEvent (o, t, f) {
  function removeEvent (line 62) | function removeEvent (o, t, f) {
  function findComponent (line 67) | function findComponent (c, o) {
  function scroll (line 76) | function scroll (y) {
  function scrollbarClickPrimer (line 88) | function scrollbarClickPrimer (e) {
  function scrollbarClick (line 97) | function scrollbarClick (c, e) {
  function scrollbarDrag (line 126) | function scrollbarDrag (e) {
  function scrollbarWheel (line 143) | function scrollbarWheel (e) {
  function startScroll (line 155) | function startScroll (y) {
  function stopScroll (line 162) | function stopScroll (e) {
  function setPosition (line 269) | function setPosition (x, y) {
  function tweenTo (line 365) | function tweenTo (y) {
  function tweenBy (line 392) | function tweenBy (y) {
  function setSteps (line 396) | function setSteps (s) {

FILE: static/font/iconfont.js
  function c (line 1) | function c(){o||(o=!0,n())}

FILE: static/plugins/mock-1.0.0-beta3/mock-min.js
  function e (line 1) | function e(r){if(n[r])return n[r].exports;var a=n[r]={exports:{},id:r,lo...
  function r (line 6) | function r(t,e,n,r){return void 0===n?a.natural(t,e):void 0===r?n:a.natu...
  function n (line 6) | function n(t){for(var e,n={},r=0;r<t.length;r++)e=t[r],e&&e.id&&(n[e.id]...
  function n (line 8) | function n(t){this.type=t,this.offset=n.offset(),this.text=n.text()}
  function r (line 8) | function r(t,e){n.call(this,"alternate"),this.left=t,this.right=e}
  function a (line 8) | function a(t){n.call(this,"match"),this.body=t.filter(Boolean)}
  function o (line 8) | function o(t,e){n.call(this,t),this.body=e}
  function u (line 8) | function u(t){o.call(this,"capture-group"),this.index=y[this.offset]||(y...
  function i (line 8) | function i(t,e){n.call(this,"quantified"),this.body=t,this.quantifier=e}
  function l (line 8) | function l(t,e){n.call(this,"quantifier"),this.min=t,this.max=e,this.gre...
  function s (line 8) | function s(t,e){n.call(this,"charset"),this.invert=t,this.body=e}
  function c (line 8) | function c(t,e){n.call(this,"range"),this.start=t,this.end=e}
  function h (line 8) | function h(t){n.call(this,"literal"),this.body=t,this.escaped=this.body!...
  function p (line 8) | function p(t){n.call(this,"unicode"),this.code=t.toUpperCase()}
  function f (line 8) | function f(t){n.call(this,"hex"),this.code=t.toUpperCase()}
  function d (line 8) | function d(t){n.call(this,"octal"),this.code=t.toUpperCase()}
  function m (line 8) | function m(t){n.call(this,"back-reference"),this.code=t.toUpperCase()}
  function g (line 8) | function g(t){n.call(this,"control-character"),this.code=t.toUpperCase()}
  function t (line 8) | function t(t,e){function n(){this.constructor=t}n.prototype=e.prototype,...
  function e (line 8) | function e(t,e,n,r,a){function o(t,e){function n(t){function e(t){return...
  function v (line 8) | function v(t){function v(){return t.substring(Qn,Zn)}function x(){return...
  function r (line 9) | function r(t,e){for(var n="",r=t;e>=r;r++)n+=String.fromCharCode(r);retu...
  function r (line 9) | function r(t,e,n){n=n||[];var i={name:"string"==typeof e?e.replace(a.RE_...
  function r (line 9) | function r(t,e){for(var n=u(t),r=i.diff(n,e),a=0;a<r.length;a++);return r}
  function r (line 9) | function r(){this.custom={events:{},requestHeaders:{},responseHeaders:{}}}
  function a (line 9) | function a(){function t(){try{return new window._XMLHttpRequest}catch(t)...
  function o (line 9) | function o(t){function e(t,e){return"string"===i.type(t)?t===e:"regexp"=...
  function u (line 9) | function u(t,e){return i.isFunction(t.template)?t.template(e):r.Mock.moc...
  function s (line 9) | function s(t){for(var e=0;e<p.length;e++)try{f[p[e]]=m[p[e]]}catch(n){}f...
  function e (line 9) | function e(){n.readyState=r.HEADERS_RECEIVED,n.dispatchEvent(new Event("...

FILE: static/plugins/ueditor-1.4.3.3/dialogs/attachment/attachment.js
  function initTabs (line 19) | function initTabs() {
  function setTabFocus (line 32) | function setTabFocus(id) {
  function initButtons (line 56) | function initButtons() {
  function UploadFile (line 87) | function UploadFile(target) {
  function addFile (line 181) | function addFile(file) {
  function removeFile (line 316) | function removeFile(file) {
  function updateTotalProgress (line 323) | function updateTotalProgress() {
  function setState (line 341) | function setState(val, files) {
  function updateStatus (line 417) | function updateStatus() {
  function OnlineFile (line 568) | function OnlineFile(target) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/background/background.js
  function initTabs (line 12) | function initTabs(){
  function initColorSelector (line 35) | function initColorSelector () {
  function initColorPicker (line 77) | function initColorPicker() {
  function initImagePanel (line 116) | function initImagePanel() {
  function updateFormState (line 121) | function updateFormState (radio, color, url, align, x, y) {
  function updateBackground (line 158) | function updateBackground () {
  function OnlineImage (line 184) | function OnlineImage(target) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/charts/charts.js
  function initChartsTypeView (line 49) | function initChartsTypeView () {
  function renderTable (line 64) | function renderTable ( table ) {
  function initUserConfig (line 104) | function initUserConfig ( config ) {
  function initEvent (line 125) | function initEvent () {
  function renderCharts (line 201) | function renderCharts () {
  function updateViewType (line 253) | function updateViewType ( index ) {
  function collectData (line 259) | function collectData () {
  function getUserConfig (line 283) | function getUserConfig () {
  function setUserConfig (line 302) | function setUserConfig ( config ) {
  function getSeriesAndCategories (line 317) | function getSeriesAndCategories () {
  function getTableDataFormat (line 367) | function getTableDataFormat () {
  function disableNotPieConfig (line 379) | function disableNotPieConfig() {
  function enableNotPieConfig (line 388) | function enableNotPieConfig() {
  function updateConfigItem (line 394) | function updateConfigItem ( value ) {
  function getSeriesForPieChart (line 420) | function getSeriesForPieChart () {
  function getTableData (line 445) | function getTableData () {
  function getTableInputValue (line 461) | function getTableInputValue () {
  function getCellValue (line 475) | function getCellValue ( cell ) {
  function syncTableData (line 505) | function syncTableData () {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/emotion/emotion.js
  function initImgName (line 14) | function initImgName() {
  function initEvtHandler (line 30) | function initEvtHandler( conId ) {
  function InsertSmiley (line 47) | function InsertSmiley( url, evt ) {
  function switchTab (line 58) | function switchTab( index ) {
  function autoHeight (line 79) | function autoHeight( index ) {
  function createTab (line 117) | function createTab( tabName ) {
  function over (line 157) | function over( td, srcPath, posFlag ) {
  function out (line 164) | function out( td ) {
  function createTabList (line 171) | function createTabList( tabNum ) {
  function createArr (line 179) | function createArr( tabNum ) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/help/help.js
  function clickHandler (line 14) | function clickHandler( tabHeads,tabBodys,obj ) {
  function switchTab (line 41) | function switchTab( tabParentId ) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/image/image.js
  function initTabs (line 22) | function initTabs() {
  function setTabFocus (line 40) | function setTabFocus(id) {
  function initButtons (line 74) | function initButtons() {
  function initAlign (line 115) | function initAlign(){
  function setAlign (line 126) | function setAlign(align){
  function getAlign (line 139) | function getAlign(){
  function RemoteImage (line 146) | function RemoteImage(target) {
  function updatePreview (line 202) | function updatePreview(){
  function UploadImage (line 293) | function UploadImage(target) {
  function addFile (line 404) | function addFile(file) {
  function removeFile (line 534) | function removeFile(file) {
  function updateTotalProgress (line 541) | function updateTotalProgress() {
  function setState (line 559) | function setState(val, files) {
  function updateStatus (line 635) | function updateStatus() {
  function OnlineImage (line 792) | function OnlineImage(target) {
  function SearchImage (line 971) | function SearchImage() {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/music/music.js
  function Music (line 1) | function Music() {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/scrawl/scrawl.js
  function _appendStyle (line 419) | function _appendStyle() {
  function _getDom (line 441) | function _getDom() {
  function ue_callback (line 570) | function ue_callback(url, state) {
  function removeMaskLayer (line 615) | function removeMaskLayer() {
  function addMaskLayer (line 622) | function addMaskLayer(html) {
  function exec (line 629) | function exec(scrawlObj) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/searchreplace/searchreplace.js
  function clickHandler (line 19) | function clickHandler( tabHeads,tabBodys,obj ) {
  function switchTab (line 43) | function switchTab( tabParentId ) {
  function getMatchCase (line 61) | function getMatchCase(id) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/spechars/spechars.js
  function toArray (line 55) | function toArray(str) {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/video/video.js
  function initTabs (line 24) | function initTabs(){
  function initVideo (line 43) | function initVideo(){
  function addOkListener (line 73) | function addOkListener(){
  function updateAlignButton (line 98) | function updateAlignButton( align ) {
  function insertSingle (line 116) | function insertSingle(){
  function insertSearch (line 135) | function insertSearch(id){
  function findFocus (line 156) | function findFocus( id, returnProperty ) {
  function convert_url (line 167) | function convert_url(url){
  function checkNum (line 190) | function checkNum( nodes ) {
  function isNumber (line 207) | function isNumber( value ) {
  function createAlignButton (line 215) | function createAlignButton( ids ) {
  function switchSelect (line 235) | function switchSelect( selectParentId ) {
  function addUrlChangeListener (line 252) | function addUrlChangeListener(url){
  function createPreviewVideo (line 268) | function createPreviewVideo(url){
  function insertUpload (line 286) | function insertUpload(){
  function initUpload (line 312) | function initUpload(){
  function UploadFile (line 318) | function UploadFile(target) {
  function addFile (line 412) | function addFile(file) {
  function removeFile (line 547) | function removeFile(file) {
  function updateTotalProgress (line 554) | function updateTotalProgress() {
  function setState (line 572) | function setState(val, files) {
  function updateStatus (line 648) | function updateStatus() {

FILE: static/plugins/ueditor-1.4.3.3/dialogs/wordimage/tangram.js
  function _createString (line 577) | function _createString(){
  function _checkReady (line 587) | function _checkReady(target){
  function _callFn (line 602) | function _callFn(callQueue, target){
  function _createFunName (line 618) | function _createFunName(fun){
  function _render (line 639) | function _render(options){
  function _check (line 728) | function _check(){
  function _call (line 743) | function _call(){
  function getCallBack (line 1197) | function getCallBack(onTimeOut){
  function encodeString (line 1354) | function encodeString(source) {
  function encodeArray (line 1376) | function encodeArray(source) {
  function pad (line 1405) | function pad(source) {
  function encodeDate (line 1413) | function encodeDate(source){

FILE: static/plugins/ueditor-1.4.3.3/dialogs/wordimage/wordimage.js
  function hideFlash (line 24) | function hideFlash(){
  function addOkListener (line 28) | function addOkListener() {
  function addUploadListener (line 59) | function addUploadListener() {
  function showLocalPath (line 66) | function showLocalPath(id) {
  function createFlashUploader (line 83) | function createFlashUploader(opt, callbacks) {
  function extendProperty (line 112) | function extendProperty(fromObj, toObj) {
  function getPasteData (line 123) | function getPasteData(id) {
  function createCopyButton (line 131) | function createCopyButton(id, dataFrom) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/SyntaxHighlighter/shCore.js
  function clone (line 499) | function clone (regex, additionalFlags) {
  function getNativeFlags (line 513) | function getNativeFlags (regex) {
  function runTokens (line 521) | function runTokens (pattern, index, scope, context) {
  function indexOf (line 550) | function indexOf (array, item, from) {
  function defaultGetHtml (line 801) | function defaultGetHtml(highlighter, name)
  function getValue (line 839) | function getValue(name)
  function hasClass (line 1036) | function hasClass(target, className)
  function addClass (line 1046) | function addClass(target, className)
  function removeClass (line 1057) | function removeClass(target, className)
  function toArray (line 1068) | function toArray(source)
  function splitLines (line 1083) | function splitLines(block)
  function getHighlighterId (line 1093) | function getHighlighterId(id)
  function getHighlighterById (line 1104) | function getHighlighterById(id)
  function getHighlighterDivById (line 1114) | function getHighlighterDivById(id)
  function storeHighlighter (line 1124) | function storeHighlighter(highlighter)
  function findElement (line 1137) | function findElement(target, search, reverse /* optional */)
  function findParentElement (line 1170) | function findParentElement(target, className)
  function indexOf (line 1182) | function indexOf(array, searchElement, fromIndex)
  function guid (line 1196) | function guid(prefix)
  function merge (line 1208) | function merge(obj1, obj2)
  function toBoolean (line 1226) | function toBoolean(value)
  function popup (line 1241) | function popup(url, name, width, height, options)
  function attachEvent (line 1265) | function attachEvent(obj, type, func, scope)
  function alert (line 1297) | function alert(str)
  function findBrush (line 1309) | function findBrush(alias, showAlert)
  function eachLine (line 1352) | function eachLine(str, callback)
  function trimFirstAndLastLines (line 1370) | function trimFirstAndLastLines(str)
  function parseParams (line 1390) | function parseParams(str)
  function wrapLinesWithCode (line 1434) | function wrapLinesWithCode(str, css)
  function padNumber (line 1484) | function padNumber(number, length)
  function processTabs (line 1501) | function processTabs(code, tabSize)
  function processSmartTabs (line 1518) | function processSmartTabs(code, tabSize)
  function fixInputString (line 1566) | function fixInputString(str)
  function trim (line 1585) | function trim(str)
  function unindent (line 1595) | function unindent(str)
  function matchesSortCallback (line 1637) | function matchesSortCallback(m1, m2)
  function getMatches (line 1664) | function getMatches(code, regexInfo)
  function processUrls (line 1695) | function processUrls(code)
  function getSyntaxHighlighterScriptTags (line 1723) | function getSyntaxHighlighterScriptTags()
  function stripCData (line 1742) | function stripCData(original)
  function quickCodeHandler (line 1774) | function quickCodeHandler(e)
  function offsetMatches (line 1880) | function offsetMatches(matches, offset)
  function process (line 1886) | function process(match, info)
  function getBrushNameCss (line 2169) | function getBrushNameCss(match)
  function Brush (line 2388) | function Brush()
  function Brush (line 2432) | function Brush()
  function Brush (line 2491) | function Brush()
  function Brush (line 2534) | function Brush()
  function Brush (line 2618) | function Brush()
  function Brush (line 2699) | function Brush()
  function Brush (line 2748) | function Brush()
  function Brush (line 2823) | function Brush()
  function Brush (line 2862) | function Brush()
  function Brush (line 2887) | function Brush()
  function Brush (line 2923) | function Brush()
  function Brush (line 2974) | function Brush()
  function Brush (line 3015) | function Brush()
  function Brush (line 3057) | function Brush()
  function Brush (line 3093) | function Brush()
  function Brush (line 3170) | function Brush()
  function Brush (line 3242) | function Brush()
  function Brush (line 3259) | function Brush()
  function Brush (line 3318) | function Brush()
  function Brush (line 3366) | function Brush()
  function Brush (line 3405) | function Brush()
  function Brush (line 3483) | function Brush()
  function Brush (line 3518) | function Brush()
  function Brush (line 3568) | function Brush()
  function Brush (line 3608) | function Brush()

FILE: static/plugins/ueditor-1.4.3.3/third-party/codemirror/codemirror.js
  function CodeMirror (line 11) | function CodeMirror(place, givenOptions) {
  function lookupKey (line 1870) | function lookupKey(name, extraMap, map) {
  function isModifierKey (line 1885) | function isModifierKey(event) {
  function save (line 1896) | function save() {textarea.value = instance.getValue();}
  function wrappedSubmit (line 1902) | function wrappedSubmit() {
  function copyState (line 1933) | function copyState(mode, state) {
  function startState (line 1945) | function startState(mode, a1, a2) {
  function StringStream (line 1951) | function StringStream(string, tabSize) {
  function cased (line 1990) | function cased(str) {return caseInsensitive ? str.toLowerCase() : str;}
  function MarkedText (line 2006) | function MarkedText(from, to, className, set) {
  function Bookmark (line 2036) | function Bookmark(pos) {
  function Line (line 2072) | function Line(text, styles) {
  function span (line 2234) | function span(text, style) {
  function nextMark (line 2259) | function nextMark() {
  function copyStyles (line 2306) | function copyStyles(from, to, source, dest) {
  function LeafChunk (line 2322) | function LeafChunk(lines) {
  function BranchChunk (line 2356) | function BranchChunk(children) {
  function getLineAt (line 2454) | function getLineAt(chunk, n) {
  function lineNo (line 2464) | function lineNo(line) {
  function lineAtHeight (line 2475) | function lineAtHeight(chunk, h) {
  function heightAtLine (line 2493) | function heightAtLine(chunk, n) {
  function History (line 2510) | function History() {
  function stopMethod (line 2541) | function stopMethod() {e_stop(this);}
  function addStop (line 2543) | function addStop(event) {
  function e_preventDefault (line 2548) | function e_preventDefault(e) {
  function e_stopPropagation (line 2552) | function e_stopPropagation(e) {
  function e_stop (line 2556) | function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);}
  function e_target (line 2561) | function e_target(e) {return e.target || e.srcElement;}
  function e_button (line 2562) | function e_button(e) {
  function connect (line 2571) | function connect(node, type, handler, disconnect) {
  function Delayed (line 2584) | function Delayed() {this.id = null;}
  function countColumn (line 2610) | function countColumn(string, end, tabSize) {
  function computedStyle (line 2622) | function computedStyle(elt) {
  function eltOffset (line 2629) | function eltOffset(node, screen) {
  function eltText (line 2665) | function eltText(node) {
  function posEq (line 2670) | function posEq(a, b) {return a.line == b.line && a.ch == b.ch;}
  function posLess (line 2671) | function posLess(a, b) {return a.line < b.line || (a.line == b.line && a...
  function copyPos (line 2672) | function copyPos(x) {return {line: x.line, ch: x.ch};}
  function htmlEscape (line 2675) | function htmlEscape(str) {
  function editEnd (line 2697) | function editEnd(from, to) {
  function indexOf (line 2705) | function indexOf(collection, elt) {
  function isWordChar (line 2711) | function isWordChar(ch) {
  function inText (line 2775) | function inText(stream, state) {
  function inTag (line 2821) | function inTag(stream, state) {
  function inAttribute (line 2842) | function inAttribute(quote) {
  function inBlock (line 2854) | function inBlock(style, terminator) {
  function doctype (line 2866) | function doctype(depth) {
  function pass (line 2888) | function pass() {
  function cont (line 2891) | function cont() {
  function pushContext (line 2896) | function pushContext(tagName, startOfLine) {
  function popContext (line 2906) | function popContext() {
  function element (line 2910) | function element(type) {
  function endtag (line 2926) | function endtag(startOfLine) {
  function endclosetag (line 2935) | function endclosetag(err) {
  function attributes (line 2944) | function attributes(type) {
  function attvalue (line 2950) | function attvalue(type) {
  function attvaluemaybe (line 2955) | function attvaluemaybe(type) {
  function kw (line 3021) | function kw(type) {return {type: type, style: "keyword"};}
  function chain (line 3037) | function chain(stream, state, f) {
  function nextUntilUnescaped (line 3042) | function nextUntilUnescaped(stream, end) {
  function ret (line 3055) | function ret(tp, style, cont) {
  function jsTokenBase (line 3060) | function jsTokenBase(stream, state) {
  function jsTokenString (line 3108) | function jsTokenString(quote) {
  function jsTokenComment (line 3116) | function jsTokenComment(stream, state) {
  function JSLexical (line 3132) | function JSLexical(indented, column, type, align, prev, info) {
  function inScope (line 3141) | function inScope(state, varname) {
  function parseJS (line 3146) | function parseJS(state, style, type, content, stream) {
  function pass (line 3170) | function pass() {
  function cont (line 3173) | function cont() {
  function register (line 3177) | function register(varname) {
  function pushcontext (line 3190) | function pushcontext() {
  function popcontext (line 3194) | function popcontext() {
  function pushlex (line 3198) | function pushlex(type, info) {
  function poplex (line 3206) | function poplex() {
  function expect (line 3216) | function expect(wanted) {
  function statement (line 3224) | function statement(type) {
  function expression (line 3242) | function expression(type) {
  function maybeexpression (line 3252) | function maybeexpression(type) {
  function maybeoperator (line 3257) | function maybeoperator(type, value) {
  function maybelabel (line 3265) | function maybelabel(type) {
  function property (line 3269) | function property(type) {
  function objprop (line 3272) | function objprop(type) {
  function commasep (line 3276) | function commasep(what, end) {
  function block (line 3287) | function block(type) {
  function vardef1 (line 3291) | function vardef1(type, value) {
  function vardef2 (line 3295) | function vardef2(type, value) {
  function forspec1 (line 3299) | function forspec1(type) {
  function formaybein (line 3305) | function formaybein(type, value) {
  function forspec2 (line 3309) | function forspec2(type, value) {
  function forspec3 (line 3314) | function forspec3(type) {
  function functiondef (line 3317) | function functiondef(type, value) {
  function funarg (line 3321) | function funarg(type, value) {
  function ret (line 3377) | function ret(style, tp) {type = tp; return style;}
  function tokenBase (line 3379) | function tokenBase(stream, state) {
  function tokenCComment (line 3420) | function tokenCComment(stream, state) {
  function tokenSGMLComment (line 3432) | function tokenSGMLComment(stream, state) {
  function tokenString (line 3444) | function tokenString(quote) {
  function html (line 3504) | function html(stream, state) {
  function maybeBackup (line 3520) | function maybeBackup(stream, pat, style) {
  function javascript (line 3526) | function javascript(stream, state) {
  function css (line 3536) | function css(stream, state) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/adapters/standalone-framework.js
  function o (line 8) | function o(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/adapters/standalone-framework.src.js
  function augment (line 29) | function augment(obj) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/highcharts-more.js
  function J (line 8) | function J(a,b,c){this.init.call(this,a,b,c)}
  function K (line 8) | function K(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment...
  function L (line 8) | function L(a,b){var c=this.chart,d=this.options.animation,g=this.group,f...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/highcharts-more.src.js
  function Pane (line 42) | function Pane(options, chart, firstAxis) {
  function initArea (line 2028) | function initArea(proceed, chart, options) {
  function polarAnimate (line 2199) | function polarAnimate(proceed, init) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/highcharts.js
  function r (line 8) | function r(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}
  function x (line 8) | function x(){var a,b=arguments.length,c={},d=function(a,b){var c,h;typeo...
  function C (line 8) | function C(a,b){return parseInt(a,b||10)}
  function ea (line 8) | function ea(a){return typeof a==="string"}
  function T (line 8) | function T(a){return typeof a===
  function Ia (line 9) | function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}
  function sa (line 9) | function sa(a){return typeof a==="number"}
  function na (line 9) | function na(a){return R.log(a)/R.LN10}
  function fa (line 9) | function fa(a){return R.pow(10,a)}
  function ga (line 9) | function ga(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}
  function u (line 9) | function u(a){return a!==w&&a!==null}
  function v (line 9) | function v(a,b,c){var d,e;if(ea(b))u(c)?a.setAttribute(b,c):a&&a.getAttr...
  function ja (line 9) | function ja(a){return Ia(a)?
  function o (line 10) | function o(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],ty...
  function K (line 10) | function K(a,b){if(ta&&b&&b.opacity!==w)b.filter="alpha(opacity="+b.opac...
  function U (line 10) | function U(a,b,c,d,e){a=y.createElement(a);b&&r(a,b);e&&K(a,{padding:0,b...
  function ha (line 10) | function ha(a,b){var c=function(){};c.prototype=new a;r(c.prototype,b);r...
  function Aa (line 10) | function Aa(a,b,c,d){var e=M.lang,a=+a||0,f=b===-1?(a.toString().split("...
  function Ba (line 11) | function Ba(a,b){return Array((b||2)+1-String(a).length).join(0)+a}
  function mb (line 11) | function mb(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slic...
  function Ca (line 11) | function Ca(a,b){for(var c="{",d=!1,
  function nb (line 12) | function nb(a){return R.pow(10,P(R.log(a)/R.LN10))}
  function ob (line 12) | function ob(a,b,c,d){var e,c=o(c,1);e=a/c;b||(b=[1,2,2.5,5,10],d&&d.allo...
  function Cb (line 13) | function Cb(a,b){var c=b||[[Db,[1,2,5,10,20,25,50,100,200,500]],[pb,[1,2...
  function Eb (line 14) | function Eb(a,b,c,d){var e=[],f={},g=M.global.useUTC,h,i=new Date(b),j=a...
  function Jb (line 15) | function Jb(){this.symbol=this.color=0}
  function Kb (line 15) | function Kb(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].ss_i=e;a.sort(f...
  function Ja (line 16) | function Ja(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}
  function va (line 16) | function va(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}
  function Ka (line 16) | function Ka(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destr...
  function Ta (line 16) | function Ta(a){cb||(cb=U(Ea));a&&cb.appendChild(a);cb.innerHTML=""}
  function ka (line 16) | function ka(a,b){var c="Highcharts error #"+a+": www.highcharts.com/erro...
  function ia (line 16) | function ia(a){return parseFloat(a.toPrecision(14))}
  function La (line 17) | function La(a,b){Fa=o(a,b.animation)}
  function Lb (line 17) | function Lb(){var a=M.global.useUTC,b=a?"getUTC":"get",c=a?"setUTC":"set...
  function wa (line 17) | function wa(){}
  function Ma (line 17) | function Ma(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!...
  function vb (line 17) | function vb(a,b){this.axis=a;if(b)this.options=
  function Mb (line 18) | function Mb(a,b,c,d,e,f){var g=a.chart.inverted;this.axis=a;this.isNegat...
  function db (line 18) | function db(){this.init.apply(this,arguments)}
  function wb (line 18) | function wb(){this.init.apply(this,arguments)}
  function xb (line 19) | function xb(a,b){this.init(a,b)}
  function eb (line 19) | function eb(a,b){this.init(a,b)}
  function yb (line 19) | function yb(){this.init.apply(this,arguments)}
  function j (line 72) | function j(){var a,b;a=o.element.style;L=(Oa===void 0||la===void 0||q.st...
  function k (line 73) | function k(){var a=q.styles,a=a&&a.textAlign,b=kb+da*(1-s),c;c=h?0:v;if(...
  function l (line 73) | function l(a,b){A?A.attr(a,b):lb[a]=b}
  function m (line 73) | function m(){o.add(q);q.attr({text:a,x:b,y:c});A&&u(e)&&q.attr({anchorX:...
  function a (line 93) | function a(){var a=b.length,d;for(d=0;d<a;d++)b[d]();b=[]}
  function a (line 193) | function a(a){var g=c.width||jb(d,"width"),h=c.height||jb(d,"height"),a=...
  function a (line 248) | function a(){var a={width:b.yAxis.len,height:b.xAxis.len};n(["group","ma...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/highcharts.src.js
  function extend (line 128) | function extend(a, b) {
  function merge (line 145) | function merge() {
  function hash (line 188) | function hash() {
  function pInt (line 204) | function pInt(s, mag) {
  function isString (line 212) | function isString(s) {
  function isObject (line 220) | function isObject(obj) {
  function isArray (line 228) | function isArray(obj) {
  function isNumber (line 236) | function isNumber(n) {
  function log2lin (line 240) | function log2lin(num) {
  function lin2log (line 243) | function lin2log(num) {
  function erase (line 252) | function erase(arr, item) {
  function defined (line 267) | function defined(obj) {
  function attr (line 279) | function attr(elem, prop, value) {
  function splat (line 308) | function splat(obj) {
  function pick (line 316) | function pick() {
  function css (line 334) | function css(el, styles) {
  function createElement (line 351) | function createElement(tag, attribs, styles, parent, nopad) {
  function extendClass (line 373) | function extendClass(parent, members) {
  function numberFormat (line 387) | function numberFormat(number, decimals, decPoint, thousandsSep) {
  function pad (line 409) | function pad(number, length) {
  function wrap (line 422) | function wrap(obj, method, func) {
  function formatSingle (line 501) | function formatSingle(format, val) {
  function format (line 525) | function format(str, ctx) {
  function getMagnitude (line 575) | function getMagnitude(num) {
  function normalizeTickInterval (line 586) | function normalizeTickInterval(interval, multiples, magnitude, options) {
  function normalizeTimeTickInterval (line 629) | function normalizeTimeTickInterval(tickInterval, unitsOption) {
  function getTimeTicks (line 710) | function getTimeTicks(normalizedInterval, min, max, startOfWeek) {
  function ChartCounters (line 822) | function ChartCounters() {
  function stableSort (line 852) | function stableSort(arr, sortFunction) {
  function arrayMin (line 878) | function arrayMin(data) {
  function arrayMax (line 895) | function arrayMax(data) {
  function destroyObjectProperties (line 914) | function destroyObjectProperties(obj, except) {
  function discardElement (line 933) | function discardElement(element) {
  function error (line 949) | function error(code, stop) {
  function correctFloat (line 962) | function correctFloat(num) {
  function setAnimation (line 974) | function setAnimation(animation, chart) {
  function setTimeMethods (line 1821) | function setTimeMethods() {
  function setOptions (line 1854) | function setOptions(options) {
  function getOptions (line 1874) | function getOptions() {
  function init (line 1891) | function init(input) {
  function get (line 1925) | function get(format) {
  function brighten (line 1954) | function brighten(alpha) {
  function setOpacity (line 1979) | function setOpacity(alpha) {
  function SVGElement (line 2000) | function SVGElement() {}
  function updateBoxSize (line 4272) | function updateBoxSize() {
  function updateTextPadding (line 4312) | function updateTextPadding() {
  function boxAttr (line 4344) | function boxAttr(key, value) {
  function getSizeAfterAdd (line 4352) | function getSizeAfterAdd() {
  function drawDeferred (line 5727) | function drawDeferred() {
  function Tick (line 5763) | function Tick(axis, pos, type, noLabel) {
  function PlotLineOrBand (line 6170) | function PlotLineOrBand(axis, options) {
  function StackItem (line 6345) | function StackItem(axis, options, isNegative, x, stackOption, stacking) {
  function Axis (line 6456) | function Axis() {
  function Tooltip (line 8560) | function Tooltip() {
  function Pointer (line 9010) | function Pointer(chart, options) {
  function Legend (line 9848) | function Legend(chart, options) {
  function Chart (line 10518) | function Chart() {
  function reflow (line 11514) | function reflow(e) {
  function setInvert (line 14818) | function setInvert() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/annotations.js
  function m (line 1) | function m(a){return typeof a==="number"}
  function n (line 1) | function n(a){return a!==D&&a!==null}

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/annotations.src.js
  function defaultOptions (line 26) | function defaultOptions(shapeType) {
  function isArray (line 64) | function isArray(obj) {
  function isNumber (line 68) | function isNumber(n) {
  function defined (line 72) | function defined(obj) {
  function translatePath (line 76) | function translatePath(d, xAxis, yAxis, xOffset, yOffset) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/canvas-tools.js
  function RGBColor (line 21) | function RGBColor(m){this.ok=!1;m.charAt(0)=="#"&&(m=m.substr(1,6));var ...
  function m (line 31) | function m(){var a={FRAMERATE:30,MAX_VIRTUAL_PIXELS:3E4};a.init=function...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/canvas-tools.src.js
  function RGBColor (line 8) | function RGBColor(color_string)
  function build (line 382) | function build() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/drilldown.js
  function q (line 1) | function q(b,a,c){return"rgba("+[Math.round(b[0]+(a[0]-b[0])*c),Math.rou...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/drilldown.src.js
  function tweenColors (line 28) | function tweenColors(startColor, endColor, pos) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/map.js
  function x (line 8) | function x(a,b,c){for(var d=4,e=[];d--;)e[d]=Math.round(b.rgba[d]+(a.rgb...

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/map.src.js
  function tweenColors (line 40) | function tweenColors(from, to, pos) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/no-data-to-display.js
  function f (line 10) | function f(){return!!this.points.length}
  function g (line 10) | function g(){this.hasData()?this.hideNoData():this.showNoData()}

FILE: static/plugins/ueditor-1.4.3.3/third-party/highcharts/modules/no-data-to-display.src.js
  function hasDataPie (line 43) | function hasDataPie() {
  function handleNoData (line 111) | function handleNoData() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/jquery-1.10.2.js
  function isArraylike (line 983) | function isArraylike( obj ) {
  function Sizzle (line 1183) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 1298) | function createCache() {
  function markFunction (line 1316) | function markFunction( fn ) {
  function assert (line 1325) | function assert( fn ) {
  function addHandle (line 1347) | function addHandle( attrs, handler ) {
  function siblingCheck (line 1362) | function siblingCheck( a, b ) {
  function createInputPseudo (line 1389) | function createInputPseudo( type ) {
  function createButtonPseudo (line 1400) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 1411) | function createPositionalPseudo( fn ) {
  function setFilters (line 2394) | function setFilters() {}
  function tokenize (line 2398) | function tokenize( selector, parseOnly ) {
  function toSelector (line 2465) | function toSelector( tokens ) {
  function addCombinator (line 2475) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2525) | function elementMatcher( matchers ) {
  function condense (line 2539) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2560) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2653) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2708) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function multipleContexts (line 2836) | function multipleContexts( selector, contexts, results ) {
  function select (line 2845) | function select( selector, context, results, seed ) {
  function createOptions (line 2985) | function createOptions( options ) {
  function internalData (line 3568) | function internalData( elem, name, data, pvt /* Internal Use Only */ ){
  function internalRemoveData (line 3657) | function internalRemoveData( elem, name, pvt ) {
  function dataAttr (line 3854) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 3886) | function isEmptyDataObject( obj ) {
  function returnTrue (line 4712) | function returnTrue() {
  function returnFalse (line 4716) | function returnFalse() {
  function safeActiveElement (line 4720) | function safeActiveElement() {
  function sibling (line 5838) | function sibling( cur, dir ) {
  function winnow (line 5956) | function winnow( elements, qualifier, not ) {
  function createSafeFragment (line 5984) | function createSafeFragment( document ) {
  function manipulationTarget (line 6298) | function manipulationTarget( elem, content ) {
  function disableScript (line 6308) | function disableScript( elem ) {
  function restoreScript (line 6312) | function restoreScript( elem ) {
  function setGlobalEval (line 6323) | function setGlobalEval( elems, refElements ) {
  function cloneCopyEvent (line 6331) | function cloneCopyEvent( src, dest ) {
  function fixCloneNodeIssues (line 6359) | function fixCloneNodeIssues( src, dest ) {
  function getAll (line 6452) | function getAll( context, tag ) {
  function fixDefaultChecked (line 6475) | function fixDefaultChecked( elem ) {
  function vendorPropName (line 6817) | function vendorPropName( style, name ) {
  function isHidden (line 6839) | function isHidden( elem, el ) {
  function showHide (line 6846) | function showHide( elements, show ) {
  function setPositiveNumber (line 7175) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 7183) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 7222) | function getWidthOrHeight( elem, name, extra ) {
  function css_defaultDisplay (line 7266) | function css_defaultDisplay( nodeName ) {
  function actualDisplay (line 7298) | function actualDisplay( name, doc ) {
  function buildParams (line 7527) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 7642) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 7674) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 7701) | function ajaxExtend( target, src ) {
  function done (line 8149) | function done( status, nativeStatusText, responses, headers ) {
  function ajaxHandleResponses (line 8296) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8351) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function createStandardXHR (line 8619) | function createStandardXHR() {
  function createActiveXHR (line 8625) | function createActiveXHR() {
  function createFxNow (line 8871) | function createFxNow() {
  function createTween (line 8878) | function createTween( value, prop, animation ) {
  function Animation (line 8892) | function Animation( elem, properties, options ) {
  function propFilter (line 8996) | function propFilter( props, specialEasing ) {
  function defaultPrefilter (line 9063) | function defaultPrefilter( elem, props, opts ) {
  function Tween (line 9188) | function Tween( elem, options, prop, end, easing ) {
  function genFx (line 9412) | function genFx( type, includeWidth ) {
  function getWindow (line 9708) | function getWindow( elem ) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/video-js/video.dev.js
  function returnTrue (line 410) | function returnTrue() { return true; }
  function returnFalse (line 411) | function returnFalse() { return false; }
  function F (line 656) | function F() {}
  function createMethod (line 5055) | function createMethod(methodName){
  function walk (line 6995) | function walk(holder, key) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/video-js/video.js
  function m (line 1) | function m(){return function(){}}
  function p (line 1) | function p(a){return function(){return this[a]}}
  function s (line 1) | function s(a){return function(){return a}}
  function u (line 1) | function u(a,c,d){if("string"===typeof a){0===a.indexOf("#")&&(a=a.slice...
  function c (line 6) | function c(){return f}
  function d (line 6) | function d(){return l}
  function e (line 8) | function e(){u.o(a,c,e);d.apply(this,arguments)}
  function c (line 9) | function c(){}
  function e (line 10) | function e(){return c.apply(a,arguments)}
  function D (line 25) | function D(a){a.u("vjs-lock-showing")}
  function E (line 26) | function E(a,c,d,e){if(d!==b)return a.a.style[c]=-1!==(""+d).indexOf("%"...
  function F (line 32) | function F(a,c){var d,e,g,j;d=a.a;e=u.ad(d);j=g=d.offsetWidth;d=a.handle...
  function ca (line 34) | function ca(a,c){a.Z(c);c.d("click",u.bind(a,function(){D(this)}))}
  function H (line 37) | function H(a){a.pa=f;a.wa.n("vjs-lock-showing");a.a.setAttribute("aria-p...
  function G (line 38) | function G(a){a.pa=l;D(a.wa);a.a.setAttribute("aria-pressed",l)}
  function da (line 42) | function da(a){var c={sources:[],tracks:[]};u.k.B(c,u.xb(a));if(a.hasChi...
  function I (line 45) | function I(a,c,d){a.h?(a.aa=l,a.h.D(),a.Eb&&(a.Eb=l,clearInterval(a.Ra))...
  function J (line 46) | function J(a){a.Fb=l;a.za();a.o("play",a.Cc);a.o("pause",a.za)}
  function L (line 48) | function L(a,c,d){if(a.h&&!a.h.aa)a.h.L(function(){this[c](d)});else try...
  function K (line 48) | function K(a,c){if(a.h&&a.h.aa)try{return a.h[c]()}catch(d){throw a.h[c]...
  function M (line 53) | function M(a){a.cd=l;u.o(document,"keydown",a.lc);document.documentEleme...
  function ea (line 86) | function ea(){var a=u.media.Va[i];return function(){throw Error('The "'+...
  function fa (line 99) | function fa(){var a=R[T],c=a.charAt(0).toUpperCase()+a.slice(1);Q["set"+...
  function U (line 99) | function U(a){Q[a]=function(){return this.a.vjs_getProperty(a)}}
  function V (line 105) | function V(a){a.Aa=a.Aa||[];return a.Aa}
  function W (line 105) | function W(a,c,d){for(var e=a.Aa,g=0,j=e.length,k,q;g<j;g++)k=e[g],k.id(...
  function X (line 108) | function X(a){0===a.ha&&a.load();0===a.ga&&(a.b.d("timeupdate",u.bind(a,...
  function Y (line 110) | function Y(a){var c=a.split(":");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1...
  function d (line 121) | function d(a,e){var k,q,n=a[e];if(n&&"object"===typeof n)for(k in n)Obje...
  function $ (line 123) | function $(a,c){var d=a.split("."),e=ga;!(d[0]in e)&&e.execScript&&e.exe...

FILE: static/plugins/ueditor-1.4.3.3/third-party/webuploader/webuploader.custom.js
  function uncurryThis (line 194) | function uncurryThis( fn ) {
  function bindFn (line 200) | function bindFn( fn, context ) {
  function createObject (line 206) | function createObject( proto ) {
  function findHandlers (line 495) | function findHandlers( arr, name, callback, context ) {
  function eachEvent (line 505) | function eachEvent( events, callback, iterator ) {
  function triggerHanders (line 512) | function triggerHanders( events, args ) {
  function Uploader (line 721) | function Uploader( opts ) {
  function Runtime (line 903) | function Runtime( options ) {
  function RuntimeClient (line 1036) | function RuntimeClient( component, standalone ) {
  function Blob (line 1139) | function Blob( ruid, source ) {
  function File (line 1183) | function File( ruid, file ) {
  function FilePicker (line 1223) | function FilePicker( opts ) {
  function isArrayLike (line 1358) | function isArrayLike( obj ) {
  function Widget (line 1375) | function Widget( uploader ) {
  function Image (line 1653) | function Image( opts ) {
  function gid (line 2022) | function gid() {
  function WUFile (line 2033) | function WUFile( source ) {
  function Queue (line 2210) | function Queue() {
  function Transport (line 2758) | function Transport( opts ) {
  function CuteFile (line 2971) | function CuteFile( file, chunkSize ) {
  function CompBase (line 3541) | function CompBase( owner, runtime ) {
  function Html5Runtime (line 3573) | function Html5Runtime() {
  function detectVerticalSquash (line 4559) | function detectVerticalSquash( img, iw, ih ) {
  function detectSubsampling (line 4611) | function detectSubsampling( img ) {
  function JPEGEncoder (line 4727) | function JPEGEncoder(quality) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/webuploader/webuploader.flashonly.js
  function uncurryThis (line 194) | function uncurryThis( fn ) {
  function bindFn (line 200) | function bindFn( fn, context ) {
  function createObject (line 206) | function createObject( proto ) {
  function findHandlers (line 495) | function findHandlers( arr, name, callback, context ) {
  function eachEvent (line 505) | function eachEvent( events, callback, iterator ) {
  function triggerHanders (line 512) | function triggerHanders( events, args ) {
  function Uploader (line 721) | function Uploader( opts ) {
  function Runtime (line 903) | function Runtime( options ) {
  function RuntimeClient (line 1036) | function RuntimeClient( component, standalone ) {
  function Blob (line 1139) | function Blob( ruid, source ) {
  function File (line 1183) | function File( ruid, file ) {
  function FilePicker (line 1223) | function FilePicker( opts ) {
  function isArrayLike (line 1358) | function isArrayLike( obj ) {
  function Widget (line 1375) | function Widget( uploader ) {
  function Image (line 1653) | function Image( opts ) {
  function gid (line 2022) | function gid() {
  function WUFile (line 2033) | function WUFile( source ) {
  function Queue (line 2210) | function Queue() {
  function Transport (line 2758) | function Transport( opts ) {
  function CuteFile (line 2971) | function CuteFile( file, chunkSize ) {
  function hashString (line 3715) | function hashString( str ) {
  function CompBase (line 3761) | function CompBase( owner, runtime ) {
  function getFlashVersion (line 3795) | function getFlashVersion() {
  function FlashRuntime (line 3813) | function FlashRuntime() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/webuploader/webuploader.html5only.js
  function uncurryThis (line 194) | function uncurryThis( fn ) {
  function bindFn (line 200) | function bindFn( fn, context ) {
  function createObject (line 206) | function createObject( proto ) {
  function findHandlers (line 495) | function findHandlers( arr, name, callback, context ) {
  function eachEvent (line 505) | function eachEvent( events, callback, iterator ) {
  function triggerHanders (line 512) | function triggerHanders( events, args ) {
  function Uploader (line 721) | function Uploader( opts ) {
  function Runtime (line 903) | function Runtime( options ) {
  function RuntimeClient (line 1036) | function RuntimeClient( component, standalone ) {
  function DragAndDrop (line 1142) | function DragAndDrop( opts ) {
  function isArrayLike (line 1193) | function isArrayLike( obj ) {
  function Widget (line 1210) | function Widget( uploader ) {
  function FilePaste (line 1419) | function FilePaste( opts ) {
  function Blob (line 1500) | function Blob( ruid, source ) {
  function File (line 1544) | function File( ruid, file ) {
  function FilePicker (line 1584) | function FilePicker( opts ) {
  function Image (line 1847) | function Image( opts ) {
  function gid (line 2216) | function gid() {
  function WUFile (line 2227) | function WUFile( source ) {
  function Queue (line 2404) | function Queue() {
  function Transport (line 2952) | function Transport( opts ) {
  function CuteFile (line 3165) | function CuteFile( file, chunkSize ) {
  function hashString (line 3909) | function hashString( str ) {
  function CompBase (line 3955) | function CompBase( owner, runtime ) {
  function Html5Runtime (line 3987) | function Html5Runtime() {
  function detectVerticalSquash (line 5233) | function detectVerticalSquash( img, iw, ih ) {
  function detectSubsampling (line 5285) | function detectSubsampling( img ) {

FILE: static/plugins/ueditor-1.4.3.3/third-party/webuploader/webuploader.js
  function uncurryThis (line 194) | function uncurryThis( fn ) {
  function bindFn (line 200) | function bindFn( fn, context ) {
  function createObject (line 206) | function createObject( proto ) {
  function findHandlers (line 495) | function findHandlers( arr, name, callback, context ) {
  function eachEvent (line 505) | function eachEvent( events, callback, iterator ) {
  function triggerHanders (line 512) | function triggerHanders( events, args ) {
  function Uploader (line 721) | function Uploader( opts ) {
  function Runtime (line 903) | function Runtime( options ) {
  function RuntimeClient (line 1036) | function RuntimeClient( component, standalone ) {
  function DragAndDrop (line 1142) | function DragAndDrop( opts ) {
  function isArrayLike (line 1193) | function isArrayLike( obj ) {
  function Widget (line 1210) | function Widget( uploader ) {
  function FilePaste (line 1419) | function FilePaste( opts ) {
  function Blob (line 1500) | function Blob( ruid, source ) {
  function File (line 1544) | function File( ruid, file ) {
  function FilePicker (line 1584) | function FilePicker( opts ) {
  function Image (line 1847) | function Image( opts ) {
  function gid (line 2216) | function gid() {
  function WUFile (line 2227) | function WUFile( source ) {
  function Queue (line 2404) | function Queue() {
  function Transport (line 2952) | function Transport( opts ) {
  function CuteFile (line 3165) | function CuteFile( file, chunkSize ) {
  function hashString (line 3909) | function hashString( str ) {
  function CompBase (line 3955) | function CompBase( owner, runtime ) {
  function Html5Runtime (line 3987) | function Html5Runtime() {
  function JPEGEncoder (line 5008) | function JPEGEncoder(quality) {
  function detectVerticalSquash (line 6035) | function detectVerticalSquash( img, iw, ih ) {
  function detectSubsampling (line 6087) | function detectSubsampling( img ) {
  function getFlashVersion (line 6341) | function getFlashVersion() {
  function FlashRuntime (line 6359) | function FlashRuntime() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/webuploader/webuploader.withoutimage.js
  function uncurryThis (line 194) | function uncurryThis( fn ) {
  function bindFn (line 200) | function bindFn( fn, context ) {
  function createObject (line 206) | function createObject( proto ) {
  function findHandlers (line 495) | function findHandlers( arr, name, callback, context ) {
  function eachEvent (line 505) | function eachEvent( events, callback, iterator ) {
  function triggerHanders (line 512) | function triggerHanders( events, args ) {
  function Uploader (line 721) | function Uploader( opts ) {
  function Runtime (line 903) | function Runtime( options ) {
  function RuntimeClient (line 1036) | function RuntimeClient( component, standalone ) {
  function DragAndDrop (line 1142) | function DragAndDrop( opts ) {
  function isArrayLike (line 1193) | function isArrayLike( obj ) {
  function Widget (line 1210) | function Widget( uploader ) {
  function FilePaste (line 1419) | function FilePaste( opts ) {
  function Blob (line 1500) | function Blob( ruid, source ) {
  function File (line 1544) | function File( ruid, file ) {
  function FilePicker (line 1584) | function FilePicker( opts ) {
  function gid (line 1850) | function gid() {
  function WUFile (line 1861) | function WUFile( source ) {
  function Queue (line 2038) | function Queue() {
  function Transport (line 2586) | function Transport( opts ) {
  function CuteFile (line 2799) | function CuteFile( file, chunkSize ) {
  function hashString (line 3543) | function hashString( str ) {
  function CompBase (line 3589) | function CompBase( owner, runtime ) {
  function Html5Runtime (line 3621) | function Html5Runtime() {
  function getFlashVersion (line 4233) | function getFlashVersion() {
  function FlashRuntime (line 4251) | function FlashRuntime() {

FILE: static/plugins/ueditor-1.4.3.3/third-party/zeroclipboard/ZeroClipboard.js
  function parseFlashVersion (line 521) | function parseFlashVersion(desc) {
  function isPepperFlash (line 526) | function isPepperFlash(flashPlayerFileName) {
  function inspectPlugin (line 529) | function inspectPlugin(plugin) {

FILE: static/plugins/ueditor-1.4.3.3/ueditor.config.js
  function getUEBasePath (line 432) | function getUEBasePath(docUrl, confUrl) {
  function getConfigFilePath (line 438) | function getConfigFilePath() {
  function getBasePath (line 446) | function getBasePath(docUrl, confUrl) {
  function optimizationPath (line 467) | function optimizationPath(path) {
Condensed preview — 314 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,088K chars).
[
  {
    "path": ".babelrc",
    "chars": 337,
    "preview": "{\n  \"presets\": [\n    [\"env\", {\n      \"modules\": false\n    }],\n    \"stage-2\"\n  ],\n  \"plugins\": [\"transform-runtime\", [\"co"
  },
  {
    "path": ".editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nindent_style = space\nindent_size = 2\nend_of_line = lf\ninsert_final_newline = true\ntrim_"
  },
  {
    "path": ".eslintignore",
    "chars": 74,
    "preview": "/build/\n/config/\n/dist/\n/*.js\n/test/unit/coverage/\n/src/icons/iconfont.js\n"
  },
  {
    "path": ".eslintrc.js",
    "chars": 576,
    "preview": "// https://eslint.org/docs/user-guide/configuring\n\nmodule.exports = {\n  root: true,\n  parser: 'babel-eslint',\n  parserOp"
  },
  {
    "path": ".gitignore",
    "chars": 212,
    "preview": ".DS_Store\nnode_modules/\ndist/\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n/test/unit/coverage/\n/test/e2e/reports/\nsel"
  },
  {
    "path": ".postcssrc.js",
    "chars": 223,
    "preview": "// https://github.com/michael-ciniawsky/postcss-load-config\n\nmodule.exports = {\n  \"plugins\": {\n    // to edit target bro"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 1259,
    "preview": "## 更新日志\n\n### 1.2.2\n\n*2018-10-16*\n\n- 修复判断当前路由类型 bug\n- 默认开放element-ui所有组件\n- 修复子菜单同级出现子菜单项会同时选中bug\n- 捕获首次请求菜单列表和权限异常,自动跳转至登"
  },
  {
    "path": "LICENSE",
    "chars": 1057,
    "preview": "MIT License\n\nCopyright (c) 2018 \n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this s"
  },
  {
    "path": "README.md",
    "chars": 863,
    "preview": "<!--\n * @Author: your name\n * @Date: 2019-12-10 10:46:21\n * @LastEditTime: 2019-12-10 11:55:18\n * @LastEditors: your nam"
  },
  {
    "path": "build/build.js",
    "chars": 1096,
    "preview": "'use strict'\nrequire('./check-versions')()\n\nprocess.env.NODE_ENV = 'production'\n\nconst ora = require('ora')\nconst rm = r"
  },
  {
    "path": "build/check-versions.js",
    "chars": 1290,
    "preview": "'use strict'\nconst chalk = require('chalk')\nconst semver = require('semver')\nconst packageConfig = require('../package.j"
  },
  {
    "path": "build/utils.js",
    "chars": 2587,
    "preview": "'use strict'\nconst path = require('path')\nconst config = require('../config')\nconst ExtractTextPlugin = require('extract"
  },
  {
    "path": "build/vue-loader.conf.js",
    "chars": 553,
    "preview": "'use strict'\nconst utils = require('./utils')\nconst config = require('../config')\nconst isProduction = process.env.NODE_"
  },
  {
    "path": "build/webpack.base.conf.js",
    "chars": 2621,
    "preview": "'use strict'\nconst path = require('path')\nconst utils = require('./utils')\nconst config = require('../config')\nconst vue"
  },
  {
    "path": "build/webpack.dev.conf.js",
    "chars": 2539,
    "preview": "'use strict'\nconst utils = require('./utils')\nconst webpack = require('webpack')\nconst config = require('../config')\ncon"
  },
  {
    "path": "build/webpack.prod.conf.js",
    "chars": 4949,
    "preview": "'use strict'\nconst path = require('path')\nconst utils = require('./utils')\nconst webpack = require('webpack')\nconst conf"
  },
  {
    "path": "build/webpack.test.conf.js",
    "chars": 867,
    "preview": "'use strict'\n// This is the webpack config used for unit tests.\n\nconst utils = require('./utils')\nconst webpack = requir"
  },
  {
    "path": "config/dev.env.js",
    "chars": 202,
    "preview": "'use strict'\nconst merge = require('webpack-merge')\nconst prodEnv = require('./prod.env')\n\nmodule.exports = merge(prodEn"
  },
  {
    "path": "config/index.js",
    "chars": 2878,
    "preview": "'use strict'\n// Template version: 1.2.5\n// see http://vuejs-templates.github.io/webpack for documentation.\n\nconst path ="
  },
  {
    "path": "config/prod.env.js",
    "chars": 61,
    "preview": "'use strict'\nmodule.exports = {\n  NODE_ENV: '\"production\"'\n}\n"
  },
  {
    "path": "config/test.env.js",
    "chars": 149,
    "preview": "'use strict'\nconst merge = require('webpack-merge')\nconst devEnv = require('./dev.env')\n\nmodule.exports = merge(devEnv, "
  },
  {
    "path": "debug.log",
    "chars": 143,
    "preview": "[0503/155252.466:ERROR:process_info.cc(359)] UncheckedAllocate\n[0503/155313.696:ERROR:http_transport_win.cc(276)] WinHtt"
  },
  {
    "path": "gulpfile.js",
    "chars": 2522,
    "preview": "var gulp = require('gulp');\nvar $    = require('gulp-load-plugins')();\nvar path = require('path');\nvar del  = require('d"
  },
  {
    "path": "index.html",
    "chars": 1493,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, i"
  },
  {
    "path": "package.json",
    "chars": 3049,
    "preview": "{\n  \"name\": \"renren-fast-vue\",\n  \"version\": \"1.2.2\",\n  \"description\": \"renren-fast-vue基于vue、element-ui构建开发,实现renren-fast"
  },
  {
    "path": "src/App.vue",
    "chars": 141,
    "preview": "<template>\n  <transition name=\"fade\">\n    <router-view></router-view>\n  </transition>\n</template>\n\n<script>\n  export def"
  },
  {
    "path": "src/assets/scss/_base.scss",
    "chars": 6877,
    "preview": "*,\n*:before,\n*:after {\n  box-sizing: border-box;\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, \"PingFang SC\", \"Hi"
  },
  {
    "path": "src/assets/scss/_normalize.scss",
    "chars": 7719,
    "preview": "/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ==========================="
  },
  {
    "path": "src/assets/scss/_variables.scss",
    "chars": 361,
    "preview": "// 站点主色\n// tips: 要达到整站主题修改效果, 请确保[$--color-primary]站点主色与[/src/element-ui-theme/index.js]文件中[import './element-[#17B3A3]/"
  },
  {
    "path": "src/assets/scss/index.scss",
    "chars": 128,
    "preview": "@import \"normalize\";       // api: https://github.com/necolas/normalize.css/\n@import \"variables\";       // 站点变量\n@import "
  },
  {
    "path": "src/components/common/ApprovalPanel.vue",
    "chars": 18547,
    "preview": "<!--\n * @Description: 审批主面板\n * @Author: zzj\n * @Date: 2019-08-09 08:37:25\n * @LastEditTime: 2019-12-10 11:39:55\n * @Last"
  },
  {
    "path": "src/components/common/DocumentPanel.vue",
    "chars": 18044,
    "preview": "<!--\n * @Description: 审批主面板\n * @Author: zzj\n * @Date: 2019-08-09 08:37:25\n * @LastEditTime: 2019-11-11 14:10:19\n * @Last"
  },
  {
    "path": "src/components/common/FormPreview.vue",
    "chars": 7599,
    "preview": "<!--\n * @Description: 审批主面板\n * @Author: zzj\n * @Date: 2019-08-09 08:37:25\n * @LastEditTime: 2019-10-18 11:22:58\n * @Last"
  },
  {
    "path": "src/components/form-design/Cell.vue",
    "chars": 11902,
    "preview": "<template>\n  <div class=\"cell\" :class=\"{'cell-active': data.key === $store.state.formDesign.activeKey}\">\n    <div>\n     "
  },
  {
    "path": "src/components/form-design/FDCheckbox.vue",
    "chars": 5267,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDDateTime.vue",
    "chars": 7138,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDGrid.vue",
    "chars": 2791,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-05-15 21:32:27\n * @LastEditTime: 2019-0"
  },
  {
    "path": "src/components/form-design/FDGridPanel.vue",
    "chars": 8181,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDIdea.vue",
    "chars": 4923,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-09-30 12:28:12\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDImg.vue",
    "chars": 3870,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-05-15 21:32:27\n * @LastEditTime: 2019-0"
  },
  {
    "path": "src/components/form-design/FDInput.vue",
    "chars": 7008,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDMenu.vue",
    "chars": 13763,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDNumber.vue",
    "chars": 4133,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDRadio.vue",
    "chars": 5459,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-0"
  },
  {
    "path": "src/components/form-design/FDSelect.vue",
    "chars": 5594,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/FDSwitch.vue",
    "chars": 4012,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-0"
  },
  {
    "path": "src/components/form-design/FDTextArea.vue",
    "chars": 4598,
    "preview": "<template>\n  <el-form label-position=\"top\" label-width=\"80px\"  size=\"mini\">\n    <el-form-item label=\"标题\">\n      <el-inpu"
  },
  {
    "path": "src/components/form-design/FDTitle.vue",
    "chars": 3448,
    "preview": "<template>\n  <el-form label-position=\"top\" label-width=\"80px\"  size=\"mini\">\n    <el-form-item label=\"标题内容\">\n      <el-in"
  },
  {
    "path": "src/components/form-design/GridCell.vue",
    "chars": 9606,
    "preview": "<template>\n  <div class=\"cell\" :class=\"{'cell-active': data.key === $store.state.formDesign.activeKey}\">\n    <div @click"
  },
  {
    "path": "src/components/form-design/Panel.vue",
    "chars": 5948,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-03 08:37:07\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/Test.vue",
    "chars": 1717,
    "preview": "<template>\n  <div class=\"main\">\n    <el-row>\n      <el-col :span=\"6\">\n        <h3>Draggable 1</h3>\n        <draggable\n  "
  },
  {
    "path": "src/components/form-design/nested.vue",
    "chars": 749,
    "preview": "<template>\n  <draggable class=\"dragArea\" tag=\"ul\" :list=\"tasks\" :group=\"{ name: 'form-design' }\" @change=\"log\">\n    <el-"
  },
  {
    "path": "src/components/form-design/nestedExample.vue",
    "chars": 1038,
    "preview": "<template>\n  <div class=\"row\">\n    <div class=\"col-8\">\n      <h3>Nested draggable</h3>\n      <nested-draggable :tasks=\"r"
  },
  {
    "path": "src/components/form-design/raw-displayer.vue",
    "chars": 422,
    "preview": "<template>\n  <div>\n    <h3>{{ title }}</h3>\n    <pre>{{ valueString }}</pre>\n  </div>\n</template>\n<script>\nconst props ="
  },
  {
    "path": "src/components/form-design/view/Document copy.vue",
    "chars": 4428,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-10-09 13:53:44\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/view/Document.vue",
    "chars": 4520,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-10-09 13:53:44\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/view/FormItem.vue",
    "chars": 8907,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-09-30 12:28:12\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/form-design/view/FormList.vue",
    "chars": 2799,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-08-22 08:31:36\n * @LastEditTime: 2019-0"
  },
  {
    "path": "src/components/form-design/view/Material.vue",
    "chars": 11753,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-10-09 13:53:44\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/components/icon-svg/index.vue",
    "chars": 858,
    "preview": "<template>\n  <svg\n    :class=\"getClassName\"\n    :width=\"width\"\n    :height=\"height\"\n    aria-hidden=\"true\">\n    <use :xl"
  },
  {
    "path": "src/components/table-tree-column/index.vue",
    "chars": 2480,
    "preview": "<template>\n  <el-table-column :prop=\"prop\" v-bind=\"$attrs\">\n    <template slot-scope=\"scope\">\n      <span @click.prevent"
  },
  {
    "path": "src/element-ui/index.js",
    "chars": 2445,
    "preview": "/**\n * UI组件, 统一使用饿了么桌面端组件库(https://github.com/ElemeFE/element)\n *\n * 使用:\n *  1. 项目中需要的组件进行释放(解开注释)\n *\n * 注意:\n *  1. 打包只会"
  },
  {
    "path": "src/element-ui-theme/element-#0BB2D4/index.css",
    "chars": 196449,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#11C26D/index.css",
    "chars": 196440,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#17B3A3/index.css",
    "chars": 196449,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#3E8EF7/index.css",
    "chars": 196454,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#667AFA/index.css",
    "chars": 196454,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#757575/index.css",
    "chars": 196463,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#9463F7/index.css",
    "chars": 196454,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#997B71/index.css",
    "chars": 196463,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#EB6709/index.css",
    "chars": 196431,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#F74584/index.css",
    "chars": 196454,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#FCB900/index.css",
    "chars": 196440,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/element-#FF4C52/index.css",
    "chars": 196445,
    "preview": "@charset \"UTF-8\";.el-pagination--small .arrow.disabled,.el-table .hidden-columns,.el-table td.is-hidden>*,.el-table th.i"
  },
  {
    "path": "src/element-ui-theme/index.js",
    "chars": 529,
    "preview": "/**\n * element-ui组件主题\n *\n * tips:\n *  1. 此处只包含element-ui组件主题\n *  2. 要达到整站主题修改效果, 请确保[import './element-[#17B3A3]/index.c"
  },
  {
    "path": "src/icons/iconfont.js",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/icons/index.js",
    "chars": 770,
    "preview": "/**\n * 字体图标, 统一使用SVG Sprite矢量图标(http://www.iconfont.cn/)\n *\n * 使用:\n *  1. 在阿里矢量图标站创建一个项目, 并添加图标(这一步非必须, 创建方便项目图标管理)\n *  "
  },
  {
    "path": "src/main.js",
    "chars": 1194,
    "preview": "import Vue from 'vue'\nimport App from '@/App'\nimport router from '@/router'                 // api: https://github.com/v"
  },
  {
    "path": "src/mock/index.js",
    "chars": 1317,
    "preview": "import Mock from 'mockjs'\nimport * as common from './modules/common'\nimport * as jobSchedule from './modules/job-schedul"
  },
  {
    "path": "src/mock/modules/common.js",
    "chars": 515,
    "preview": "import Mock from 'mockjs'\n\n// 登录\nexport function login () {\n  return {\n    // isOpen: false,\n    url: '/sys/login',\n    "
  },
  {
    "path": "src/mock/modules/job-schedule.js",
    "chars": 2054,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/mock/modules/oss.js",
    "chars": 1898,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/mock/modules/sys-config.js",
    "chars": 1348,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/mock/modules/sys-log.js",
    "chars": 2300,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/mock/modules/sys-menu.js",
    "chars": 11748,
    "preview": "// 生成数据列表\nvar dataList = [\n  {\n    'menuId': 1,\n    'parentId': 0,\n    'parentName': null,\n    'name': '系统管理',\n    'url'"
  },
  {
    "path": "src/mock/modules/sys-role.js",
    "chars": 1618,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/mock/modules/sys-user.js",
    "chars": 1622,
    "preview": "import Mock from 'mockjs'\n\n// 生成数据列表\nvar dataList = []\nfor (let i = 0; i < Math.floor(Math.random() * 10 + 1); i++) {\n  "
  },
  {
    "path": "src/router/import-development.js",
    "chars": 69,
    "preview": "module.exports = file => require('@/views/' + file + '.vue').default\n"
  },
  {
    "path": "src/router/import-production.js",
    "chars": 66,
    "preview": "module.exports = file => () => import('@/views/' + file + '.vue')\n"
  },
  {
    "path": "src/router/index.js",
    "chars": 5313,
    "preview": "/* eslint-disable no-unused-vars */\n// @ts-nocheck\n/**\n * 全站路由配置\n *\n * 建议:\n * 1. 代码中路由统一使用name属性跳转(不使用path属性)\n */\nimport"
  },
  {
    "path": "src/store/index.js",
    "chars": 568,
    "preview": "// @ts-nocheck\nimport Vue from 'vue'\nimport Vuex from 'vuex'\nimport cloneDeep from 'lodash/cloneDeep'\nimport common from"
  },
  {
    "path": "src/store/modules/common.js",
    "chars": 1240,
    "preview": "export default {\n  namespaced: true,\n  state: {\n    // 页面文档可视高度(随窗口改变大小)\n    documentClientHeight: 0,\n    // 导航条, 布局风格, "
  },
  {
    "path": "src/store/modules/formDesign.js",
    "chars": 2852,
    "preview": "/*\n * @Author: your name\n * @Date: 2019-10-31 14:43:17\n * @LastEditTime: 2019-12-10 11:17:59\n * @LastEditors: Please set"
  },
  {
    "path": "src/store/modules/user.js",
    "chars": 213,
    "preview": "export default {\n  namespaced: true,\n  state: {\n    id: 0,\n    name: ''\n  },\n  mutations: {\n    updateId (state, id) {\n "
  },
  {
    "path": "src/utils/bus.js",
    "chars": 86,
    "preview": "/* eslint-disable */\nimport Vue from 'vue'\n\nconst bus = new Vue();\nexport default bus;"
  },
  {
    "path": "src/utils/common.js",
    "chars": 5572,
    "preview": "/* eslint-disable no-undef */\n/*\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-09-30 12:28"
  },
  {
    "path": "src/utils/httpRequest.js",
    "chars": 1816,
    "preview": "import Vue from 'vue'\nimport axios from 'axios'\nimport router from '@/router'\nimport qs from 'qs'\nimport merge from 'lod"
  },
  {
    "path": "src/utils/index.js",
    "chars": 1334,
    "preview": "import Vue from 'vue'\nimport router from '@/router'\nimport store from '@/store'\n\n/**\n * 获取uuid\n */\nexport function getUU"
  },
  {
    "path": "src/utils/validate.js",
    "chars": 454,
    "preview": "/**\n * 邮箱\n * @param {*} s\n */\nexport function isEmail (s) {\n  return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]"
  },
  {
    "path": "src/views/common/404.vue",
    "chars": 1375,
    "preview": "<template>\n  <div class=\"site-wrapper site-page--not-found\">\n    <div class=\"site-content__wrapper\">\n      <div class=\"s"
  },
  {
    "path": "src/views/common/home.vue",
    "chars": 1353,
    "preview": "<template>\n  <div class=\"mod-home\">\n    <h3>项目介绍</h3>\n    <ul>\n      <li>renren-fast-vue基于vue、element-ui构建开发,实现<a href=\""
  },
  {
    "path": "src/views/common/login.vue",
    "chars": 5062,
    "preview": "<template>\n  <div class=\"site-wrapper site-page--login\">\n    <div class=\"site-content__wrapper\">\n      <div class=\"site-"
  },
  {
    "path": "src/views/common/theme.vue",
    "chars": 985,
    "preview": "<template>\n  <el-form>\n    <h2>布局设置</h2>\n    <el-form-item label=\"导航条类型\">\n      <el-radio-group v-model=\"navbarLayoutTyp"
  },
  {
    "path": "src/views/demo/FlowEditor.vue",
    "chars": 63472,
    "preview": "<!--\n * @Description: In User Settings Edit\n * @Author: your name\n * @Date: 2019-07-23 12:08:49\n * @LastEditTime: 2019-1"
  },
  {
    "path": "src/views/demo/echarts.vue",
    "chars": 13896,
    "preview": "<template>\n  <div class=\"mod-demo-echarts\">\n    <el-alert\n      title=\"提示:\"\n      type=\"warning\"\n      :closable=\"false\""
  },
  {
    "path": "src/views/demo/ueditor.vue",
    "chars": 1636,
    "preview": "<template>\n  <div class=\"mod-demo-ueditor\">\n    <el-alert\n      title=\"提示:\"\n      type=\"warning\"\n      :closable=\"false\""
  },
  {
    "path": "src/views/main-content.vue",
    "chars": 4320,
    "preview": "<template>\n  <main class=\"site-content\" :class=\"{ 'site-content--tabs': $route.meta.isTab }\">\n    <!-- 主入口标签页 s -->\n    "
  },
  {
    "path": "src/views/main-navbar-update-password.vue",
    "chars": 3408,
    "preview": "<template>\n  <el-dialog\n    title=\"修改密码\"\n    :visible.sync=\"visible\"\n    :append-to-body=\"true\">\n    <el-form :model=\"da"
  },
  {
    "path": "src/views/main-navbar.vue",
    "chars": 4027,
    "preview": "<template>\n  <nav class=\"site-navbar\" :class=\"'site-navbar--' + navbarLayoutType\">\n    <div class=\"site-navbar__header\">"
  },
  {
    "path": "src/views/main-sidebar-sub-menu.vue",
    "chars": 1462,
    "preview": "<template>\n  <el-submenu \n    v-if=\"menu.list && menu.list.length >= 1\"\n    :index=\"menu.menuId + ''\"\n    :popper-class="
  },
  {
    "path": "src/views/main-sidebar.vue",
    "chars": 3987,
    "preview": "<template>\n  <aside class=\"site-sidebar\" :class=\"'site-sidebar--' + sidebarLayoutSkin\">\n    <div class=\"site-sidebar__in"
  },
  {
    "path": "src/views/main.vue",
    "chars": 2758,
    "preview": "<!--\n * @Author: your name\n * @Date: 2019-12-10 10:46:23\n * @LastEditTime: 2019-12-10 11:08:38\n * @LastEditors: Please s"
  },
  {
    "path": "src/views/modules/job/schedule-add-or-update.vue",
    "chars": 3680,
    "preview": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"vis"
  },
  {
    "path": "src/views/modules/job/schedule-log.vue",
    "chars": 3954,
    "preview": "<template>\n  <el-dialog\n    title=\"日志列表\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"visible\"\n    width=\"75%\">\n"
  },
  {
    "path": "src/views/modules/job/schedule.vue",
    "chars": 9746,
    "preview": "<template>\n  <div class=\"mod-schedule\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()"
  },
  {
    "path": "src/views/modules/oss/oss-config.vue",
    "chars": 5114,
    "preview": "<template>\n  <el-dialog\n    title=\"云存储配置\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"visible\">\n    <el-form :m"
  },
  {
    "path": "src/views/modules/oss/oss-upload.vue",
    "chars": 1850,
    "preview": "<template>\n  <el-dialog\n    title=\"上传文件\"\n    :close-on-click-modal=\"false\"\n    @close=\"closeHandle\"\n    :visible.sync=\"v"
  },
  {
    "path": "src/views/modules/oss/oss.vue",
    "chars": 4761,
    "preview": "<template>\n  <div class=\"mod-oss\">\n    <el-form :inline=\"true\" :model=\"dataForm\">\n      <el-form-item>\n        <el-butto"
  },
  {
    "path": "src/views/modules/sys/config-add-or-update.vue",
    "chars": 3156,
    "preview": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"vis"
  },
  {
    "path": "src/views/modules/sys/config.vue",
    "chars": 4982,
    "preview": "<template>\n  <div class=\"mod-config\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()\">"
  },
  {
    "path": "src/views/modules/sys/log.vue",
    "chars": 3403,
    "preview": "<template>\n  <div class=\"mod-log\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()\">\n  "
  },
  {
    "path": "src/views/modules/sys/menu-add-or-update.vue",
    "chars": 8694,
    "preview": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"vis"
  },
  {
    "path": "src/views/modules/sys/menu.vue",
    "chars": 4575,
    "preview": "<template>\n  <div class=\"mod-menu\">\n    <el-form :inline=\"true\" :model=\"dataForm\">\n      <el-form-item>\n        <el-butt"
  },
  {
    "path": "src/views/modules/sys/role-add-or-update.vue",
    "chars": 4052,
    "preview": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"vis"
  },
  {
    "path": "src/views/modules/sys/role.vue",
    "chars": 5143,
    "preview": "<template>\n  <div class=\"mod-role\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()\">\n "
  },
  {
    "path": "src/views/modules/sys/user-add-or-update.vue",
    "chars": 6271,
    "preview": "<template>\n  <el-dialog\n    :title=\"!dataForm.id ? '新增' : '修改'\"\n    :close-on-click-modal=\"false\"\n    :visible.sync=\"vis"
  },
  {
    "path": "src/views/modules/sys/user.vue",
    "chars": 5634,
    "preview": "<template>\n  <div class=\"mod-user\">\n    <el-form :inline=\"true\" :model=\"dataForm\" @keyup.enter.native=\"getDataList()\">\n "
  },
  {
    "path": "static/base.css",
    "chars": 1670,
    "preview": "/*项目所有页面要用到的css初始化文件*/\n\n/*清除内外边距  */\nbody,\nhtml,\nul,\nli,\np,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nol,\ndl,\ndt,\ndd {\n    margin: 0;\n    "
  },
  {
    "path": "static/config/index-prod.js",
    "chars": 365,
    "preview": "/**\n * 生产环境\n */\n;(function () {\n  window.SITE_CONFIG = {};\n\n  // api接口请求地址\n  window.SITE_CONFIG['baseUrl'] = 'http://dem"
  },
  {
    "path": "static/config/index-qa.js",
    "chars": 365,
    "preview": "/**\n * 测试环境\n */\n;(function () {\n  window.SITE_CONFIG = {};\n\n  // api接口请求地址\n  window.SITE_CONFIG['baseUrl'] = 'http://dem"
  },
  {
    "path": "static/config/index-uat.js",
    "chars": 365,
    "preview": "/**\n * 验收环境\n */\n;(function () {\n  window.SITE_CONFIG = {};\n\n  // api接口请求地址\n  window.SITE_CONFIG['baseUrl'] = 'http://dem"
  },
  {
    "path": "static/config/index.js",
    "chars": 365,
    "preview": "/**\n * 开发环境\n */\n;(function () {\n  window.SITE_CONFIG = {};\n\n  // api接口请求地址\n  window.SITE_CONFIG['baseUrl'] = 'http://dem"
  },
  {
    "path": "static/config/init.js",
    "chars": 2286,
    "preview": "/**\n * 动态加载初始资源\n */\n;(function() {\n  var resList = {\n    icon: window.SITE_CONFIG.cdnUrl + '/static/img/favicon.ico',\n  "
  },
  {
    "path": "static/flow-editor/demo/css/dmp/admin/admin.css",
    "chars": 3783,
    "preview": "/* 修改原始样式  */\n.layui-layout-admin .layui-header{background-color: #FFFFFF;border-bottom:2px solid #BF0017;}\n.layui-layou"
  },
  {
    "path": "static/flow-editor/demo/css/dmp/admin/pub.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "static/flow-editor/demo/css/dmp/index/index.css",
    "chars": 3058,
    "preview": "/* 修改原始样式 */\n.layui-layout-admin .layui-header{background-color: #FFFFFF/*#BF0017*/;border-bottom:2px solid #BF0017;}\n.l"
  },
  {
    "path": "static/flow-editor/demo/css/dmp/index/pub.css",
    "chars": 1403,
    "preview": "\n.layui-layer-content .layui-form{padding: 20px 40px 0 0;}\n.layui-btn-danger{background-color: #f71e3e;}\n.layui-table-to"
  },
  {
    "path": "static/flow-editor/demo/css/dmp/login/login.css",
    "chars": 928,
    "preview": "html,body {\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  background-size: cover;\n  background: #fff;\n}\n\n\n#login,"
  },
  {
    "path": "static/flow-editor/demo/css/font-awesome/css/font-awesome.css",
    "chars": 37414,
    "preview": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "static/flow-editor/demo/html/index/flow/flow.html",
    "chars": 7752,
    "preview": "<!doctype html>\n<html lang=\"en\">\n\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n\t<title>任务"
  },
  {
    "path": "static/flow-editor/demo/html/index/flow/flowEdit.html",
    "chars": 6719,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n\t<title>任务流程图</title>"
  },
  {
    "path": "static/flow-editor/demo/html/index/flow/flowLog.html",
    "chars": 7516,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n\t<title>任务流程图</title>"
  },
  {
    "path": "static/flow-editor/demo/js/dmp/index/flow/flow.js",
    "chars": 16612,
    "preview": "var chartId = 1\nvar definition = '';\nvar nodes = []\nvar role = 'owner';\nvar cateType = 'flow';\nvar userId = 'xxxx';\nvar "
  },
  {
    "path": "static/flow-editor/demo/js/dmp/index/index.js",
    "chars": 1213,
    "preview": "layui.use(['layer','element'], function() {\n\tvar $ = layui.jquery, el = layui.element, layer = layui.layer;\n\tvar custom "
  },
  {
    "path": "static/flow-editor/demo/js/dmp/pub/pub.js",
    "chars": 213,
    "preview": "\nString.prototype.replaceAll = function(o, n, i) {\n    if(!RegExp.prototype.isPrototypeOf(o)) {\n       return this.repla"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/admin.html",
    "chars": 2679,
    "preview": " \n \n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scal"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/all.html",
    "chars": 1838,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/button.html",
    "chars": 3810,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>按钮 - layui</title>\n  <meta name=\"renderer\" content=\"webk"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/carousel.html",
    "chars": 2875,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/code.html",
    "chars": 2704,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/element.html",
    "chars": 11683,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/extend.html",
    "chars": 451,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/flow.html",
    "chars": 2298,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/form.html",
    "chars": 7901,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>表单模块 - layui</title>\n  <meta name=\"renderer\" content=\"we"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/js/child/test.js",
    "chars": 86,
    "preview": "\n\nlayui.define(function(exports){\n  \n  exports('test', {\n    title: '子目录模块加载'\n  })\n});"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/js/index.js",
    "chars": 85,
    "preview": "\n\nlayui.define(function(exports){\n  \n  exports('index', {\n    title: '模块入口'\n  });\n});"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/json/table/demo1.json",
    "chars": 2770,
    "preview": "{\n  \"code\": 0\n  ,\"msg\": \"\"\n  ,\"count\": 8\n  ,\"data\": [{\n    \"id\": \"10001\"\n    ,\"username\": \"杜甫\"\n    ,\"email\": \"xianxin@la"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/json/table/demo2.json",
    "chars": 1093,
    "preview": "{\n  \"code\": 0\n  ,\"msg\": \"\"\n  ,\"count\": 66\n  ,\"data\": [{\n    \"username\": \"张小三\"\n    ,\"amount\": 18\n    ,\"province\": \"浙江\"\n  "
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/json/upload/demoLayEdit.json",
    "chars": 160,
    "preview": "{\n  \"code\": 0\n  ,\"msg\": \"\"\n  ,\"data\": {\n    \"src\": \"http://tva1.sinaimg.cn/crop.0.0.118.118.180/5db11ff4gw1e77d3nqrv8j20"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/laydate.html",
    "chars": 6591,
    "preview": " \n \n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"renderer\" content=\"webkit\">\n<meta http-equiv=\"X-UA-"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/layedit.html",
    "chars": 1561,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/layer.html",
    "chars": 2790,
    "preview": " \n \n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scal"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/layout.html",
    "chars": 8926,
    "preview": " \n \n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scal"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/laypage.html",
    "chars": 3152,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/responsive.html",
    "chars": 633,
    "preview": " \n \n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scal"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/table.html",
    "chars": 11229,
    "preview": " \n \n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, us"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/tree.html",
    "chars": 3040,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/upload.html",
    "chars": 6473,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/util.html",
    "chars": 1684,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1,"
  },
  {
    "path": "static/flow-editor/demo/js/layui/examples/xingzuo.html",
    "chars": 2769,
    "preview": "\n<!doctype html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>星座配对</title>\n<meta name=\"description\" content=\"\">\n<meta htt"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/analytics.js",
    "chars": 33834,
    "preview": "(function(){var $c=function(a){this.w=a||[]};$c.prototype.set=function(a){this.w[a]=!0};$c.prototype.encode=function(){f"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/collaboration.js",
    "chars": 13239,
    "preview": "$(function () {\n    if (chartId == \"\" || userId == \"\") {\n        return\n    }\n    CLB.init()\n});\nvar defaultUIData = { \""
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/designer.core.js",
    "chars": 421700,
    "preview": "Schema.init(true);\nSchema.initMarkers();\n$(function () {\n    Designer.init();\n    if (typeof isView != \"undefined\") {\n  "
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/designer.css",
    "chars": 14453,
    "preview": "@CHARSET \"UTF-8\";\n\n.clear {\n  clear: both;\n}\n\n#designer {\n  width: 100%;\n  position: relative;\n}\n\n#shape_panel {\n  width"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/designer.events.js",
    "chars": 31959,
    "preview": "Designer.events.addEventListener(\"initialized\", function () {\n    if (localRuntime) {\n        Designer.open(definition)\n"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/designer.methods.js",
    "chars": 28511,
    "preview": "Designer.addFunction(\"open\", function (definition) {\n    if (definition == \"\") {\n        return\n    }\n    if (typeof def"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/designer.ui.js",
    "chars": 125276,
    "preview": "var UI={init:function(){$(\".diagram_title\").bind(\"click\",function(){if($(this).hasClass(\"readonly\")){return}var h=$.trim"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/export.js",
    "chars": 136975,
    "preview": "var Export={getRect:function(c){var b=c[0]||c.node||c;if($(b).length<=0){return}var a=b.getBoundingClientRect();return{w"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/global.css",
    "chars": 25169,
    "preview": "::-webkit-scrollbar{width:12px;height:12px}::-webkit-scrollbar-thumb{border-width:2px;border-style:solid;border-color:#f"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/jquery.js",
    "chars": 95328,
    "preview": "(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/schema.js",
    "chars": 28915,
    "preview": "var Schema = {\n    config: {\n        markerSize: 13\n    },\n    pageDefaults: {\n        backgroundColor: \"transparent\",\n "
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/themes.js",
    "chars": 6322,
    "preview": "Schema.addTheme({\n    name: \"normal\",\n    shape: {\n        fontStyle: {\n            fontFamily: \"Arial\",\n            siz"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/ui.css",
    "chars": 58478,
    "preview": "@CHARSET \"UTF-8\";\n/**    ################ UI Styles #################### **/\nhtml,body{\n\tpadding:0px; margin:0px;\n\toverf"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/flow/util.js",
    "chars": 28612,
    "preview": "var Util={};!function(){document.ondragstart=function(){return!1},$.ajaxSetup({cache:!1}),$(\"[title],[original-title]\")."
  },
  {
    "path": "static/flow-editor/demo/js/plugin/jquery/canvasparticle.js",
    "chars": 1160,
    "preview": "var CP=function(){var n=layui.jquery;var b=n('body');b.append('<canvas id=\"canvas\"></canvas>');var a=document.getElement"
  },
  {
    "path": "static/flow-editor/demo/js/plugin/jquery/scrollbar.js",
    "chars": 9390,
    "preview": "//** Create scrolling variable if it doesn't exist *//\nif (!Scrolling) var Scrolling = {};\n//Scrollbar constructor\nScrol"
  },
  {
    "path": "static/font/demo.css",
    "chars": 8305,
    "preview": "/* Logo 字体 */\n@font-face {\n  font-family: \"iconfont logo\";\n  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.e"
  },
  {
    "path": "static/font/demo_index.html",
    "chars": 14434,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\"/>\n  <title>IconFont Demo</title>\n  <link rel=\"shortcut icon\" href="
  },
  {
    "path": "static/font/iconfont.css",
    "chars": 3890,
    "preview": "@font-face {font-family: \"iconfont\";\n  src: url('iconfont.eot?t=1561901602427'); /* IE9 */\n  src: url('iconfont.eot?t=15"
  },
  {
    "path": "static/font/iconfont.js",
    "chars": 10980,
    "preview": "!function(a){var t,c='<svg><symbol id=\"icon-danxuankuang\" viewBox=\"0 0 1024 1024\"><path d=\"M507.699 16.766c-271.033 0-49"
  },
  {
    "path": "static/normalize.css",
    "chars": 7718,
    "preview": "/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n   ==========================="
  },
  {
    "path": "static/plugins/mock-1.0.0-beta3/mock-min.js",
    "chars": 112144,
    "preview": "!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.am"
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/anchor/anchor.html",
    "chars": 1588,
    "preview": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n    \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n    <h"
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/attachment/attachment.css",
    "chars": 14327,
    "preview": "@charset \"utf-8\";\n/* dialog样式 */\n.wrapper {\n    zoom: 1;\n    width: 630px;\n    *width: 626px;\n    height: 380px;\n    mar"
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/attachment/attachment.html",
    "chars": 2285,
    "preview": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>ueditor图片对话框</title>\n    <script type=\"text/javascri"
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/attachment/attachment.js",
    "chars": 29423,
    "preview": "/**\n * User: Jinqn\n * Date: 14-04-08\n * Time: 下午16:34\n * 上传图片对话框逻辑代码,包括tab: 远程图片/上传图片/在线图片/搜索图片\n */\n\n(function () {\n\n   "
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/background/background.css",
    "chars": 2386,
    "preview": ".wrapper{ width: 424px;margin: 10px auto; zoom:1;position: relative}\n.tabbody{height:225px;}\n.tabbody .panel { position:"
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/background/background.html",
    "chars": 2898,
    "preview": "<!DOCTYPE HTML>\n<html>\n<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n    <script type=\""
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/background/background.js",
    "chars": 14074,
    "preview": "(function () {\n\n    var onlineImage,\n        backupStyle = editor.queryCommandValue('background');\n\n    window.onload = "
  },
  {
    "path": "static/plugins/ueditor-1.4.3.3/dialogs/charts/chart.config.js",
    "chars": 1388,
    "preview": "/*\n * 图表配置文件\n * */\n\n\n//不同类型的配置\nvar typeConfig = [\n    {\n        chart: {\n            type: 'line'\n        },\n        plo"
  }
]

// ... and 114 more files (download for full content)

About this extraction

This page contains the full source code of the TsangTszKin/form-design GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 314 files (7.3 MB), approximately 1.9M tokens, and a symbol index with 945 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!