浏览代码

发布前的格式检查

wkeyuan 3 年之前
当前提交
f64745c175
共有 100 个文件被更改,包括 18682 次插入0 次删除
  1. 18 0
      .babelrc
  2. 9 0
      .editorconfig
  3. 5 0
      .eslintignore
  4. 208 0
      .eslintrc.js
  5. 23 0
      .gitignore
  6. 10 0
      .postcssrc.js
  7. 30 0
      README.md
  8. 41 0
      build/build.js
  9. 54 0
      build/check-versions.js
  10. 二进制
      build/logo.png
  11. 101 0
      build/utils.js
  12. 22 0
      build/vue-loader.conf.js
  13. 92 0
      build/webpack.base.conf.js
  14. 95 0
      build/webpack.dev.conf.js
  15. 149 0
      build/webpack.prod.conf.js
  16. 9 0
      config/dev.env.js
  17. 84 0
      config/index.js
  18. 6 0
      config/prod.env.js
  19. 9 0
      config/test.env.js
  20. 13 0
      index.html
  21. 96 0
      package.json
  22. 79 0
      src/App.vue
  23. 48 0
      src/api/admin/admin-user.js
  24. 24 0
      src/api/dw-login.js
  25. 151 0
      src/api/dw-survey.js
  26. 24 0
      src/api/dw-user.js
  27. 22 0
      src/api/index.js
  28. 二进制
      src/assets/logo.png
  29. 113 0
      src/components/HelloWorld.vue
  30. 178 0
      src/components/common/DwSurveyDcsWrapper.vue
  31. 62 0
      src/components/layouts/DwFooter.vue
  32. 92 0
      src/components/layouts/DwHeader.vue
  33. 63 0
      src/components/layouts/DwHeaderLogin.vue
  34. 70 0
      src/components/layouts/DwNavMenu.vue
  35. 62 0
      src/components/layouts/Layout.vue
  36. 77 0
      src/components/layouts/LoginLayout.vue
  37. 51 0
      src/components/layouts/NoTopLayout.vue
  38. 27 0
      src/main.js
  39. 122 0
      src/router/index.js
  40. 34 0
      src/utils/dw-authorized.js
  41. 38 0
      src/utils/dw-common.js
  42. 39 0
      src/utils/dw-msg.js
  43. 80 0
      src/utils/request.js
  44. 113 0
      src/views/Login.vue
  45. 278 0
      src/views/dw-admin/AdminUserList.vue
  46. 279 0
      src/views/dw-survey/DwSurveyList.vue
  47. 22 0
      src/views/dw-survey/dw-collect/DwAnswer.vue
  48. 23 0
      src/views/dw-survey/dw-collect/DwAnswerUrl.vue
  49. 86 0
      src/views/dw-survey/dw-collect/DwAnswerUrlMain.vue
  50. 157 0
      src/views/dw-survey/dw-collect/DwAnswerWeixin.vue
  51. 199 0
      src/views/dw-survey/dw-collect/DwSiteComp.vue
  52. 69 0
      src/views/dw-survey/dw-collect/DwSiteShare.vue
  53. 156 0
      src/views/dw-survey/dw-collect/DwSurveyAttr.vue
  54. 123 0
      src/views/dw-survey/dw-data/DwSurveyAnswer.vue
  55. 219 0
      src/views/dw-survey/dw-data/DwSurveyAnswerInfo.vue
  56. 132 0
      src/views/dw-survey/dw-data/DwSurveyAnswerQuCommon.vue
  57. 119 0
      src/views/dw-survey/dw-data/DwSurveyCharts.vue
  58. 232 0
      src/views/dw-survey/dw-data/DwsurveyChartsCommon.vue
  59. 71 0
      src/views/dw-user/DwUser.vue
  60. 44 0
      src/views/dw-user/DwUserMenu.vue
  61. 117 0
      src/views/dw-user/DwUserPwd.vue
  62. 0 0
      static/.gitkeep
  63. 427 0
      static/diaowen/answer-m.html
  64. 495 0
      static/diaowen/answer-p.html
  65. 575 0
      static/diaowen/css/Copy of design-survey.css
  66. 830 0
      static/diaowen/css/answer-m.css
  67. 50 0
      static/diaowen/css/answer-p.css
  68. 1737 0
      static/diaowen/css/default.css
  69. 1743 0
      static/diaowen/css/design-survey.css
  70. 2047 0
      static/diaowen/css/dw-user.css
  71. 137 0
      static/diaowen/css/dw.css
  72. 1783 0
      static/diaowen/css/preview-dev.css
  73. 312 0
      static/diaowen/css/response.css
  74. 1602 0
      static/diaowen/css/sur-mobile.css
  75. 6 0
      static/diaowen/css/survey-common.css
  76. 304 0
      static/diaowen/css/templatemo_style.css
  77. 1665 0
      static/diaowen/design.html
  78. 二进制
      static/diaowen/images/1279780388A5rVCG.jpg
  79. 二进制
      static/diaowen/images/1410-3.png
  80. 二进制
      static/diaowen/images/404.jpg
  81. 二进制
      static/diaowen/images/500.jpg
  82. 二进制
      static/diaowen/images/5629512728352684315.png
  83. 二进制
      static/diaowen/images/5629514927375932817.jpg
  84. 二进制
      static/diaowen/images/answer-icon-1.png
  85. 二进制
      static/diaowen/images/btn24.png
  86. 二进制
      static/diaowen/images/btn_1.png
  87. 二进制
      static/diaowen/images/dianwen_weixin.jpg
  88. 二进制
      static/diaowen/images/dw-icons1-24.png
  89. 二进制
      static/diaowen/images/dw-icons1-8.png
  90. 二进制
      static/diaowen/images/dw_bg1.png
  91. 二进制
      static/diaowen/images/dw_bgico.png
  92. 二进制
      static/diaowen/images/dw_logo.png
  93. 二进制
      static/diaowen/images/dw_pic01.png
  94. 二进制
      static/diaowen/images/dw_pic02.png
  95. 二进制
      static/diaowen/images/dw_pic03.jpg
  96. 二进制
      static/diaowen/images/dw_pic04.jpg
  97. 二进制
      static/diaowen/images/dw_pic04.png
  98. 二进制
      static/diaowen/images/dw_pic05.jpg
  99. 二进制
      static/diaowen/images/dw_pic05.png
  100. 0 0
      static/diaowen/images/dw_pic06.jpg

+ 18 - 0
.babelrc

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

+ 9 - 0
.editorconfig

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

+ 5 - 0
.eslintignore

@@ -0,0 +1,5 @@
+/build/
+/config/
+/dist/
+/*.js
+/test/unit/coverage/

+ 208 - 0
.eslintrc.js

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

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+tests/**/coverage/
+tests/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.local
+
+package-lock.json
+yarn.lock

+ 10 - 0
.postcssrc.js

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

+ 30 - 0
README.md

@@ -0,0 +1,30 @@
+# dwsurvey-oss-front-vue
+
+> DWSurvey 开源问卷系统,社区版VUE前端代码
+
+## Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+
+# run unit tests
+npm run unit
+
+# run e2e tests
+npm run e2e
+
+# run all tests
+npm test
+```
+
+For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

+ 41 - 0
build/build.js

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

+ 54 - 0
build/check-versions.js

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

二进制
build/logo.png


+ 101 - 0
build/utils.js

@@ -0,0 +1,101 @@
+'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')
+    })
+  }
+}

+ 22 - 0
build/vue-loader.conf.js

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

+ 92 - 0
build/webpack.base.conf.js

@@ -0,0 +1,92 @@
+'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: './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'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  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'
+  }
+}

+ 95 - 0
build/webpack.dev.conf.js

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

+ 149 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,149 @@
+'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].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: process.env.NODE_ENV === 'testing'
+        ? 'index.html'
+        : config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor 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())
+}
+
+module.exports = webpackConfig

+ 9 - 0
config/dev.env.js

@@ -0,0 +1,9 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"',
+  DW_API_URL: '"http://localhost:8081"',
+  DW_WEB_URL: '"http://localhost:8081"',
+})

+ 84 - 0
config/index.js

@@ -0,0 +1,84 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+
+module.exports = {
+  dev: {
+
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {
+      '/api': {
+        target: 'http://localhost:8080/',
+        changeOrigin: true,//如果需要跨域
+        pathRewrite: {
+                    '^/api': '/api'
+                  }
+        }
+    },
+    // Various Dev Server settings
+    // host: 'localhost', // can be overwritten by process.env.HOST
+    host: '0.0.0.0', // can be overwritten by process.env.HOST
+    port: 8081, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    // 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: 'cheap-module-eval-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    cssSourceMap: true
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: true,
+    // 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
+  }
+}

+ 6 - 0
config/prod.env.js

@@ -0,0 +1,6 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"',
+  DW_API_URL: '"http://localhost:8081"',
+  DW_WEB_URL: '"http://localhost:8081"',
+}

+ 9 - 0
config/test.env.js

@@ -0,0 +1,9 @@
+'use strict'
+const merge = require('webpack-merge')
+const devEnv = require('./dev.env')
+
+module.exports = merge(devEnv, {
+  NODE_ENV: '"testing"',
+  DW_API_URL: '"http://localhost:8081"',
+  DW_WEB_URL: '"http://localhost:8081"',
+})

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="shortcut icon" href="./favicon.ico" type="image/x-icon" />
+    <title>dwsurvey-oss-front-vue</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 96 - 0
package.json

@@ -0,0 +1,96 @@
+{
+  "name": "dwsurvey-oss-front-vue",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "wkeyuan <keyuan258@gmail.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 test/e2e/specs",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "axios": "^0.24.0",
+    "clipboard": "^2.0.8",
+    "echarts": "^5.2.2",
+    "element-ui": "^2.15.6",
+    "normalize.css": "^8.0.1",
+    "vue": "^2.5.2",
+    "vue-awesome": "^4.3.1",
+    "vue-axios": "^3.3.7",
+    "vue-router": "^3.0.1"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-eslint": "^8.2.6",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-jest": "^21.0.2",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-dynamic-import-node": "^1.2.0",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^2.0.1",
+    "chromedriver": "^2.27.2",
+    "copy-webpack-plugin": "^4.0.1",
+    "cross-spawn": "^5.0.1",
+    "css-loader": "^0.28.0",
+    "eslint": "^4.15.0",
+    "eslint-config-standard": "^10.2.1",
+    "eslint-friendly-formatter": "^3.0.0",
+    "eslint-loader": "^1.7.1",
+    "eslint-plugin-html": "^6.2.0",
+    "eslint-plugin-import": "^2.7.0",
+    "eslint-plugin-node": "^5.2.0",
+    "eslint-plugin-promise": "^3.4.0",
+    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-vue": "^4.0.0",
+    "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": "^22.0.4",
+    "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",
+    "postcss-url": "^7.2.1",
+    "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-resource": "^1.5.3",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 79 - 0
src/App.vue

@@ -0,0 +1,79 @@
+<template>
+  <!--    <img src="./assets/logo.png">-->
+  <!--    <router-view/>-->
+  <div id="app" >
+    <router-view/>
+  </div>
+<!--  <div id="app" >
+    <el-container style="padding: 0px;">
+      <el-header height="80" style="padding: 0px;" >
+        <component :is="currentHeader"></component>
+      </el-header>
+      <el-container style="z-index: 1;">
+        <el-container>
+          <el-main style="padding: 20px 0px;" >
+            <router-view></router-view>
+          </el-main>
+          <el-footer><dw-footer></dw-footer></el-footer>
+        </el-container>
+      </el-container>
+    </el-container>
+  </div>-->
+</template>
+
+<script>
+
+import DwHeader from '@/components/layouts/DwHeader.vue'
+import DwHeaderLogin from '@/components/layouts/DwHeaderLogin.vue'
+import DwNavMenu from '@/components/layouts/DwNavMenu.vue'
+import DwFooter from '@/components/layouts/DwFooter.vue'
+
+export default {
+  name: 'App',
+  components: {
+    'dw-nav-menu': DwNavMenu,
+    'dw-header': DwHeader,
+    'dw-header-login': DwHeaderLogin,
+    'dw-footer': DwFooter
+  },
+  data () {
+    return {
+      currentHeader: 'dw-header'
+    }
+  },
+  mounted () {
+    this.loginStatus()
+  },
+  methods: {
+    loginStatus: function () {
+      const fullPath = this.$route.fullPath
+      if(fullPath.indexOf("login")>=0){
+        this.currentHeader = 'dw-header-login'
+      }else{
+        this.currentHeader = 'dw-header'
+      }
+    }
+  }
+}
+</script>
+<style>
+body{
+  background-color: #F1F1F1;
+  /*#ffb25c*/
+}
+#app {
+  font-family: 'Avenir', Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.el-header{
+  background-color: #25292E;
+}
+.el-footer {
+  /*background-color: #B3C0D1;*/
+  line-height: 60px;
+  color: #7c7c7c;
+}
+.el-aside {
+}
+</style>

+ 48 - 0
src/api/admin/admin-user.js

@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+import API from '@/api/index.js'
+
+// 登录方法
+export function dwAdminUserList(pageSize, current, status, loginName) {
+  const params = {
+    pageSize,
+    current,
+    status,
+    loginName
+  }
+  return request({
+    url: API.adminUserList,
+    method: 'get',
+    params
+  })
+}
+
+
+/**
+ * 创建用户
+ * @param data
+ * @returns {*}
+ */
+export function dwUserCreate(data) {
+  return request({
+    url: API.adminUserCreate,
+    method: 'post',
+    data
+  })
+}
+
+export function dwUserUpdate(data) {
+  return request({
+    url: API.adminUserUpdate,
+    method: 'put',
+    data
+  })
+}
+
+
+export function dwUserDelete(data) {
+  return request({
+    url: API.adminUserDelete,
+    method: 'delete',
+    data
+  })
+}

+ 24 - 0
src/api/dw-login.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+import API from '@/api/index.js'
+
+// 登录方法
+export function dwLogin(username, password) {
+  const params = {
+    username,
+    password
+  }
+  return request({
+    url: API.loginIn,
+    method: 'post',
+    params
+  })
+}
+
+// 退出方法
+export function logout() {
+  return request({
+    url: API.logOut,
+    method: 'post'
+  })
+}
+

+ 151 - 0
src/api/dw-survey.js

@@ -0,0 +1,151 @@
+import request from '@/utils/request'
+import API from '@/api/index.js'
+
+/**
+ * 问卷列表
+ * @param pageSize
+ * @param current
+ * @returns {*}
+ */
+export function dwSurveyList(pageSize, current, surveyName, surveyState) {
+  const params = {
+    pageSize,
+    current,
+    surveyName,
+    surveyState
+  }
+  return request({
+    url: API.surveyList,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 创建问卷
+ * @param data
+ * @returns {*}
+ */
+export function dwSurveyCreate(data) {
+  return request({
+    url: API.surveyCreate,
+    method: 'post',
+    data
+  })
+}
+
+
+/**
+ * 复制问卷
+ * @param data
+ * @returns {*}
+ */
+export function dwSurveyCopy(fromSurveyId,surveyName) {
+  const params = {
+    fromSurveyId,
+    surveyName,
+    tag:'2'
+  }
+  return request({
+    url: API.surveyCopy,
+    method: 'post',
+    params
+  })
+}
+
+/**
+ * 获取问卷信息
+ * @param surveyId
+ * @returns {*}
+ */
+export function dwSurveyInfo(surveyId) {
+  const params = {
+    id: surveyId
+  }
+  return request({
+    url: API.surveyInfo,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 更新问卷信息
+ * @param data
+ * @returns {*}
+ */
+export function dwSurveyUpdate(data) {
+  return request({
+    url: API.surveyUpdate,
+    method: 'put',
+    data
+  })
+}
+
+
+/**
+ * 更新问卷信息
+ * @param data
+ * @returns {*}
+ */
+export function dwSurveyDelete(data) {
+  return request({
+    url: API.surveyDelete,
+    method: 'delete',
+    data
+  })
+}
+
+
+/**
+ * 获取问卷的统计信息
+ * @param surveyId
+ * @returns {*}
+ */
+export function dwSurveyReport(surveyId) {
+  const params = {
+    surveyId
+  }
+  return request({
+    url: API.surveyReport,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取问卷的答卷列表
+ * @param pageSize
+ * @param current
+ * @param surveyId
+ * @returns {*}
+ */
+export function dwSurveyAnswerList(pageSize,current,surveyId) {
+  const params = {
+    pageSize,
+    current,
+    surveyId
+  }
+  return request({
+    url: API.surveyAnswerList,
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 获取问卷答卷详情
+ * @param answerId
+ * @returns {*}
+ */
+export function dwSurveyAnswerInfo(answerId) {
+  const params = {
+    answerId
+  }
+  return request({
+    url: API.surveyAnswerInfo,
+    method: 'get',
+    params
+  })
+}
+

+ 24 - 0
src/api/dw-user.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+import API from '@/api/index.js'
+
+// 登录方法
+export function dwUserInfo() {
+  return request({
+    url: API.curUserInfo,
+    method: 'get'
+  })
+}
+
+// 退出方法
+export function dwUserPwd(curpwd,pwd) {
+  const params = {
+    curpwd,
+    pwd
+  }
+  return request({
+    url: API.curUserPwdUpdate,
+    method: 'post',
+    params
+  })
+}
+

+ 22 - 0
src/api/index.js

@@ -0,0 +1,22 @@
+export default {
+  /**  账号密码登录登出  **/
+  loginIn: `/api/dwsurvey/anon/security/login-pwd.do`,
+  logOut: `/api/dwsurvey/anon/security/logout.do`,
+  /** 问卷数据  **/
+  surveyList: `/api/dwsurvey/app/survey/list.do`,
+  surveyInfo: `/api/dwsurvey/app/survey/info.do`,
+  surveyUpdate: `/api/dwsurvey/app/survey/survey-base-attr.do`,
+  surveyCreate: `/api/dwsurvey/app/survey/add.do`,
+  surveyCopy: `/api/dwsurvey/app/survey/copy.do`,
+  surveyDelete: `/api/dwsurvey/app/survey/delete.do`,
+  surveyReport: `/api/dwsurvey/app/stats/report.do`,
+  surveyAnswerList: `/api/dwsurvey/app/answer/list.do`,
+  surveyAnswerInfo: `/api/dwsurvey/app/answer/info.do`,
+  surveyFooterInfo: `/api/dwsurvey/anon/web/footer-info.do`,
+  adminUserList: `/api/dwsurvey/admin/user/list.do`,
+  adminUserCreate: `/api/dwsurvey/admin/user/add.do`,
+  adminUserUpdate: `/api/dwsurvey/admin/user/edit.do`,
+  adminUserDelete: `/api/dwsurvey/admin/user/delete.do`,
+  curUserInfo: `/api/dwsurvey/app/user/currentUser.do`,
+  curUserPwdUpdate: `/api/dwsurvey/app/user/up-pwd.do`,
+}

二进制
src/assets/logo.png


+ 113 - 0
src/components/HelloWorld.vue

@@ -0,0 +1,113 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <h2>Essential Links</h2>
+    <ul>
+      <li>
+        <a
+          href="https://vuejs.org"
+          target="_blank"
+        >
+          Core Docs
+        </a>
+      </li>
+      <li>
+        <a
+          href="https://forum.vuejs.org"
+          target="_blank"
+        >
+          Forum
+        </a>
+      </li>
+      <li>
+        <a
+          href="https://chat.vuejs.org"
+          target="_blank"
+        >
+          Community Chat
+        </a>
+      </li>
+      <li>
+        <a
+          href="https://twitter.com/vuejs"
+          target="_blank"
+        >
+          Twitter
+        </a>
+      </li>
+      <br>
+      <li>
+        <a
+          href="http://vuejs-templates.github.io/webpack/"
+          target="_blank"
+        >
+          Docs for This Template
+        </a>
+      </li>
+    </ul>
+    <h2>Ecosystem</h2>
+    <ul>
+      <li>
+        <a
+          href="http://router.vuejs.org/"
+          target="_blank"
+        >
+          vue-router
+        </a>
+      </li>
+      <li>
+        <a
+          href="http://vuex.vuejs.org/"
+          target="_blank"
+        >
+          vuex
+        </a>
+      </li>
+      <li>
+        <a
+          href="http://vue-loader.vuejs.org/"
+          target="_blank"
+        >
+          vue-loader
+        </a>
+      </li>
+      <li>
+        <a
+          href="https://github.com/vuejs/awesome-vue"
+          target="_blank"
+        >
+          awesome-vue
+        </a>
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  data () {
+    return {
+      msg: 'Welcome to Your Vue.js App'
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h1, h2 {
+  font-weight: normal;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

文件差异内容过多而无法显示
+ 178 - 0
src/components/common/DwSurveyDcsWrapper.vue


+ 62 - 0
src/components/layouts/DwFooter.vue

@@ -0,0 +1,62 @@
+<template>
+  <div class="dw-footer-main" >
+    <div>
+      <span><a :href="footerInfo.siteUrl" style="color: #333;"><strong>{{ footerInfo.siteName }}</strong></a>&nbsp;</span>
+      <span><a href="/" style="text-decoration: none;color: #333;">{{ footerInfo.siteIcp }}</a>&nbsp;{{ footerInfo.siteMail }}&nbsp;{{ footerInfo.sitePhone }}</span>
+    </div>
+    <div>
+      <span>Powered by <a href="www.diaowen.net"><strong>DWSurvey</strong></a> {{ footerInfo.versionNumber }} Vue </span>
+      <span> © {{ footerInfo.years }} <a href="www.diaowen.net"><strong>调问网</strong></a></span>
+    </div>
+  </div>
+</template>
+<script>
+
+import API from '@/api/index.js'
+
+export default {
+  name: 'DwFooter',
+  data () {
+    return {
+      footerInfo: {
+        siteName: '调问网',
+        siteUrl: 'http://www.diaowen.net',
+        siteIcp: '京ICP备13050030号-3',
+        siteMail: 'service@diaowen.net',
+        sitePhone: '18888888888',
+        versionInfo: 'DWSurvey OSS V5.0 Vue',
+        versionNumber: 'OSS V5.0',
+        versionBuilt: '20211128',
+        years: '2012-2021'
+      },
+    }
+  },
+  mounted () {
+    this.queryDWSurveyFooter()
+  },
+  methods: {
+    queryDWSurveyFooter () {
+      this.axios.get(API.surveyFooterInfo, {}).then((response) => {
+        const resultData = response.data.data
+        console.debug(resultData)
+        this.footerInfo = resultData
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-footer-main{
+  text-align: center;
+  font-size: 12px;
+  color: grey;
+  line-height: 30px;
+  padding-top: 0px;
+  padding-bottom: 20px;
+}
+.dw-footer-main a{
+  text-decoration: none;
+  color: grey;
+}
+</style>

+ 92 - 0
src/components/layouts/DwHeader.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <div>
+      <el-row style="background-color: #34495e;opacity:0.85;" >
+        <el-col :span="20" :offset="2">
+          <div class="dw-header-main" >
+            <el-row type="flex" justify="space-between" align="middle">
+              <el-col :span="4" >
+                <a href="/#/">
+                  <el-image src="https://www.diaowen.net/images/20181214_logo.png" ></el-image>
+                  <span style="color: #ffa71d;font-size: 14px;position: absolute;margin-left: 10px;">OSS</span>
+                </a>
+              </el-col>
+              <el-col :span="16">
+                <div style="padding-left: 60px;"><dw-nav-menu></dw-nav-menu></div>
+              </el-col>
+              <el-col :span="4" style="text-align: right;" >
+                <div>
+                  <el-dropdown @command="handleCommand">
+                <span class="el-dropdown-link" >
+                  {{ userName }} <i class="el-icon-arrow-down el-icon--right"></i>
+                </span>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item command="myAccount">我的账号</el-dropdown-item>
+                      <el-dropdown-item command="updatePwd">修改密码</el-dropdown-item>
+                      <el-dropdown-item command="logout">退出登录</el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                </div>
+              </el-col>
+            </el-row>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+<script>
+import DwNavMenu from '@/components/layouts/DwNavMenu.vue'
+import API from '@/api/index.js'
+import DwAuthorized from '@/utils/dw-authorized'
+import {logout} from '@/api/dw-login'
+
+export default {
+  name: 'DwHeader.vue',
+  data () {
+    return {
+      userName: 'dwsurvey'
+    }
+  },
+  components: {
+    'dw-nav-menu': DwNavMenu
+  },
+  mounted () {
+    this.userName = DwAuthorized.getUserName()
+  },
+  methods: {
+    handleCommand: function(command){
+      console.debug(command);
+      if (command === 'logout') {
+        logout().then((response) => {
+          const resultData = response.data
+          this.$router.push('/login')
+        })
+      } else if (command === 'myAccount'){
+        this.$router.push('/dw/user')
+      } else if (command === 'updatePwd'){
+        this.$router.push('/dw/user/pwd')
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-header-main{
+  padding: 0px;
+}
+.el-dropdown-link{
+  color: white;
+}
+.m-logbg {
+  position: absolute;
+  z-index: 0;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+</style>

文件差异内容过多而无法显示
+ 63 - 0
src/components/layouts/DwHeaderLogin.vue


+ 70 - 0
src/components/layouts/DwNavMenu.vue

@@ -0,0 +1,70 @@
+<template>
+  <el-menu
+    mode="horizontal"
+    :default-active="defActive"
+    @select="handleSelect"
+    background-color="#34495e"
+    text-color="#fff"
+    active-text-color="#409eff"
+    class="dw-menu-height dw-menu"
+    router
+  >
+    <el-menu-item index="/dw/survey" >我的问卷</el-menu-item>
+    <el-menu-item index="/dw/user" >个人中心</el-menu-item>
+    <el-menu-item index="/dw/admin/user" v-has-dw-role="'DWSURVEY_SUPER_ADMIN'" >用户管理</el-menu-item>
+<!--    <el-menu-item index="/#" >帮助文档</el-menu-item>-->
+  </el-menu>
+</template>
+
+<script>
+
+export default {
+  name: 'DwNavMenu.vue',
+  data () {
+    return {
+      defActive: '/dw/survey'
+    }
+  },
+  mounted () {
+    this.setDefActive()
+  },
+  methods: {
+    handleSelect (key, keyPath) {
+      console.log(key, keyPath)
+    },
+    handleClose (key, keyPath) {
+      console.log(key, keyPath)
+    },
+    setDefActive: function(){
+
+      const fullPath = this.$route.fullPath
+      console.debug("fullPath:"+fullPath);
+      if (fullPath.indexOf('/dw/survey')>=0) {
+        this.defActive = '/dw/survey'
+      } else if(fullPath.indexOf('/dw/admin/user')>=0) {
+        this.defActive = '/dw/admin/user'
+      } else if(fullPath.indexOf('/dw/user')>=0){
+        this.defActive = '/dw/user'
+      }
+
+    }
+  },
+  watch: {
+    $route: function (to, from) {
+      this.setDefActive()
+    },
+  }
+}
+</script>
+
+<style scoped>
+.dw-menu-height,.dw-menu-height>.el-menu-item,.dw-menu-height>.el-submenu /deep/ .el-submenu__title{
+  height: 80px;
+  line-height: 80px;
+  font-weight: 400;
+  font-size: 16px;
+}
+.dw-menu{
+  border-bottom: none;
+}
+</style>

+ 62 - 0
src/components/layouts/Layout.vue

@@ -0,0 +1,62 @@
+<template>
+  <!--    <img src="./assets/logo.png">-->
+  <!--    <router-view/>-->
+  <div id="dw-layout" >
+    <el-container style="padding: 0px;">
+      <el-header height="80" style="padding: 0px;" >
+        <dw-header></dw-header>
+      </el-header>
+      <el-container style="z-index: 1;">
+        <el-container>
+          <el-main style="padding: 20px 0px;" >
+            <router-view></router-view>
+          </el-main>
+          <el-footer><dw-footer></dw-footer></el-footer>
+        </el-container>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+
+import DwHeader from '@/components/layouts/DwHeader.vue'
+import DwHeaderLogin from '@/components/layouts/DwHeaderLogin.vue'
+import DwNavMenu from '@/components/layouts/DwNavMenu.vue'
+import DwFooter from '@/components/layouts/DwFooter.vue'
+
+export default {
+  name: 'Layout',
+  components: {
+    'dw-nav-menu': DwNavMenu,
+    'dw-header': DwHeader,
+    'dw-header-login': DwHeaderLogin,
+    'dw-footer': DwFooter
+  },
+  data () {
+    return {
+      currentHeader: 'dw-header'
+    }
+  },
+  mounted () {
+    this.loginStatus()
+  },
+  methods: {
+    loginStatus: function () {
+      const fullPath = this.$route.fullPath
+      if(fullPath.indexOf("login")>=0){
+        this.currentHeader = 'dw-header-login'
+      }else{
+        this.currentHeader = 'dw-header'
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+body{
+  background-color: #F1F1F1;
+  /*#ffb25c*/
+  background-image: none;
+}
+</style>

+ 77 - 0
src/components/layouts/LoginLayout.vue

@@ -0,0 +1,77 @@
+<template>
+  <!--    <img src="./assets/logo.png">-->
+  <!--    <router-view/>-->
+  <div id="dw-layout" class="dw-layout-body" :style="{height: pageH}" >
+    <el-container style="padding: 0px;">
+      <el-header height="80" style="padding: 0px;" >
+        <dw-header-login></dw-header-login>
+      </el-header>
+      <el-container style="z-index: 1;">
+        <el-container>
+          <el-main style="padding: 20px 0px;" >
+            <router-view></router-view>
+          </el-main>
+          <el-footer height="80" class="dw-footer-container"><dw-footer></dw-footer></el-footer>
+        </el-container>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+
+import DwHeader from '@/components/layouts/DwHeader.vue'
+import DwHeaderLogin from '@/components/layouts/DwHeaderLogin.vue'
+import DwNavMenu from '@/components/layouts/DwNavMenu.vue'
+import DwFooter from '@/components/layouts/DwFooter.vue'
+
+export default {
+  name: 'Layout',
+  components: {
+    'dw-nav-menu': DwNavMenu,
+    'dw-header': DwHeader,
+    'dw-header-login': DwHeaderLogin,
+    'dw-footer': DwFooter
+  },
+  data () {
+    return {
+      currentHeader: 'dw-header',
+      pageH: '600px'
+    }
+  },
+  mounted () {
+    this.loginStatus()
+    this.pageH = `${window.innerHeight}px`
+  },
+  methods: {
+    loginStatus () {
+      const fullPath = this.$route.fullPath
+      if (fullPath.indexOf('login') >= 0) {
+        this.currentHeader = 'dw-header-login'
+      } else {
+        this.currentHeader = 'dw-header'
+      }
+    }
+  }
+}
+</script>
+<style scoped>
+body{
+  background-color: #F1F1F1;
+  /*#ffb25c*/
+}
+.dw-footer-container{
+  position: fixed;
+  bottom: 0px;
+  width: 100%;
+  text-align: center;
+  background: #F1F1F1;
+  padding-top: 20px;
+}
+.dw-layout-body{
+  background-image: url("/static/diaowen/images/style-model/login_bg/1.jpg");
+  -moz-background-size: auto 100%;
+  background-size: auto 100%;
+  background-repeat: no-repeat;
+}
+</style>

+ 51 - 0
src/components/layouts/NoTopLayout.vue

@@ -0,0 +1,51 @@
+<template>
+  <!--    <img src="./assets/logo.png">-->
+  <!--    <router-view/>-->
+  <div id="dw-layout" >
+    <el-container style="padding: 0px;">
+      <el-container style="z-index: 1;">
+        <el-container>
+          <el-main style="padding:0px;" >
+            <router-view></router-view>
+          </el-main>
+          <el-footer><dw-footer></dw-footer></el-footer>
+        </el-container>
+      </el-container>
+    </el-container>
+  </div>
+</template>
+
+<script>
+
+import DwHeader from '@/components/layouts/DwHeader.vue'
+import DwHeaderLogin from '@/components/layouts/DwHeaderLogin.vue'
+import DwNavMenu from '@/components/layouts/DwNavMenu.vue'
+import DwFooter from '@/components/layouts/DwFooter.vue'
+
+export default {
+  name: 'NoTopLayout',
+  components: {
+    'dw-nav-menu': DwNavMenu,
+    'dw-header': DwHeader,
+    'dw-header-login': DwHeaderLogin,
+    'dw-footer': DwFooter
+  },
+  data () {
+    return {
+      currentHeader: 'dw-header'
+    }
+  },
+  mounted () {
+
+  },
+  methods: {
+
+  }
+}
+</script>
+<style>
+body{
+  background-color: #F1F1F1;
+  /*#ffb25c*/
+}
+</style>

+ 27 - 0
src/main.js

@@ -0,0 +1,27 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import Vue from 'vue'
+import App from './App'
+import router from './router'
+import ElementUI from 'element-ui'
+import axios from 'axios'
+import VueAxios from 'vue-axios'
+import 'element-ui/lib/theme-chalk/index.css'
+import 'normalize.css'
+import 'vue-awesome/icons'
+import Icon from 'vue-awesome/components/Icon'
+import './utils/dw-common'
+
+Vue.config.productionTip = false
+
+Vue.use(ElementUI)
+Vue.use(VueAxios, axios)
+Vue.component('icon', Icon)
+
+/* eslint-disable no-new */
+new Vue({
+  el: '#app',
+  router,
+  components: { App },
+  template: '<App/>'
+})

+ 122 - 0
src/router/index.js

@@ -0,0 +1,122 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import HelloWorld from '@/components/HelloWorld'
+import Layout from '@/components/layouts/Layout.vue'
+import LoginLayout from '@/components/layouts/LoginLayout.vue'
+import NoTopLayout from '@/components/layouts/NoTopLayout.vue'
+import DwAnswer from '@/views/dw-survey/dw-collect/DwAnswer'
+import DwSurveyList from '@/views/dw-survey/DwSurveyList'
+import DwSurveyAttr from '@/views/dw-survey/dw-collect/DwSurveyAttr'
+import DwAnswerUrl from '@/views/dw-survey/dw-collect/DwAnswerUrl'
+import DwSiteComp from '@/views/dw-survey/dw-collect/DwSiteComp'
+import DwSiteShare from '@/views/dw-survey/dw-collect/DwSiteShare'
+import DwAnswerWeixin from '@/views/dw-survey/dw-collect/DwAnswerWeixin'
+import DwSurveyCharts from '@/views/dw-survey/dw-data/DwSurveyCharts'
+import DwSurveyAnswer from '@/views/dw-survey/dw-data/DwSurveyAnswer'
+import DwSurveyAnswerInfo from '@/views/dw-survey/dw-data/DwSurveyAnswerInfo'
+import DwUser from '@/views/dw-user/DwUser'
+import DwUserPwd from '@/views/dw-user/DwUserPwd'
+import AdminUserList from '@/views/dw-admin/AdminUserList'
+import Login from '@/views/Login'
+
+Vue.use(Router)
+
+export default new Router({
+  routes: [
+    {
+      path: '/',
+      meta: '首页',
+      component: Layout,
+      children: [
+        {
+          path: '/',
+          redirect: '/dw/survey'
+        },
+        {
+          path: '/dw/survey',
+          name: 'DwSurveyList',
+          component: DwSurveyList
+        },
+        {
+          path: '/dw/survey/c/attr/:id',
+          name: 'DwSurveyAttr',
+          component: DwSurveyAttr
+        },
+        {
+          path: '/dw/survey/c/url/:id',
+          name: 'DwAnswerUrl',
+          component: DwAnswerUrl
+        },
+        {
+          path: '/dw/survey/c/comp/:id',
+          name: 'DwSiteComp',
+          component: DwSiteComp
+        },
+        {
+          path: '/dw/survey/c/share/:id',
+          name: 'DwSiteShare',
+          component: DwSiteShare
+        },
+        {
+          path: '/dw/survey/c/weixin/:id',
+          name: 'DwAnswerWeixin',
+          component: DwAnswerWeixin
+        },
+        {
+          path: '/dw/survey/d/chart/:id',
+          name: 'DwSurveyCharts',
+          component: DwSurveyCharts
+        },
+        {
+          path: '/dw/survey/d/data/:id',
+          name: 'DwSurveyAnswer',
+          component: DwSurveyAnswer
+        },
+        {
+          path: '/dw/user/pwd',
+          name: 'DwUserPwd',
+          component: DwUserPwd
+        },
+        {
+          path: '/dw/user',
+          name: 'DwUser',
+          component: DwUser
+        },
+        {
+          path: '/dw/admin/user',
+          name: 'AdminUserList',
+          component: AdminUserList
+        }
+      ]
+    },
+    {
+      path: '/diaowen/:sid',
+      name: 'DwAnswer',
+      component: DwAnswer
+    },
+    {
+      path: '/no-top',
+      name: 'NoTopLayout',
+      component: NoTopLayout,
+      children: [
+        {
+          path: '/no-top/dw-survey/d/data/:id/:answerId',
+          name: 'DwSurveyAnswerInfo',
+          component: DwSurveyAnswerInfo
+        },
+      ]
+    },
+    {
+      path: '/login',
+      name: 'LoginLayout',
+      component: LoginLayout,
+      children: [
+        {
+          path: '/',
+          name: 'Login',
+          component: Login
+        }
+      ]
+    },
+  ]
+})

+ 34 - 0
src/utils/dw-authorized.js

@@ -0,0 +1,34 @@
+
+export default {
+  setUserName(userName) {
+    localStorage.setItem('dw_oss_user_name', userName)
+  },
+  getUserName() {
+    if(localStorage.hasOwnProperty('dw_oss_user_name')){
+      return localStorage.getItem('dw_oss_user_name')
+    }
+    return 'none'
+  },
+  setAuthority(authority) {
+    const dwAuthority = typeof authority === 'string' ? [authority] : authority
+    localStorage.setItem('dw_oss_authority', JSON.stringify(dwAuthority))
+  },
+  getAuthority() {
+    let authority = []
+    if(localStorage.hasOwnProperty('dw_oss_authority')){
+      const authorityString = localStorage.getItem('dw_oss_authority')
+      try {
+        if (authorityString) {
+          authority = JSON.parse(authorityString)
+        }
+      } catch (e) {
+        authority = authorityString
+      }
+      if (typeof authority === 'string') {
+        return [authority]
+      }
+    }
+    return authority
+  }
+}
+

+ 38 - 0
src/utils/dw-common.js

@@ -0,0 +1,38 @@
+// dw-role
+import Vue from 'vue'
+import DwAuthorized from './dw-authorized'
+
+function changeHasRole(el, binding){
+  console.debug('binding.value:');
+  console.debug(binding)
+  console.debug(binding.value)
+  /*if (roleCheck(binding.value)) {
+    el.style.display=""
+  }else{
+    el.style.display="none"
+  }*/
+  if(!roleCheck(binding.value)){
+    el.parentNode.removeChild(el)
+  }
+  function roleCheck(value) {
+    const authority = DwAuthorized.getAuthority()
+    for(let i=0;i<authority.length;i++) {
+      if(value===authority[i]) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+Vue.directive('hasDwRole', {
+  /*bind: function(el, binding,vnode) {
+    changeHasRole(el, binding)
+  },
+  update(el, binding,vnode){
+    changeHasRole(el, binding)
+  }*/
+  inserted: function(el, binding) {
+    changeHasRole(el, binding)
+  }
+})

+ 39 - 0
src/utils/dw-msg.js

@@ -0,0 +1,39 @@
+import {Message,MessageBox} from 'element-ui'
+
+export function msgError(message) {
+  Message({
+    message: message,
+    type: 'error',
+    duration: 5 * 1000
+  })
+}
+export function msgInfo(message) {
+  Message({
+    message: message,
+    type: 'info',
+    duration: 5 * 1000
+  })
+}
+
+export function msgBoxNoLogin(){
+  MessageBox.confirm('未登录状态,是否重新登录', '系统提示', {
+      confirmButtonText: '重新登录',
+      cancelButtonText: '取消',
+      type: 'warning'
+    }
+  ).then(() => {
+    window.location.href = '/#/login'
+  }).catch(() => {});
+}
+
+export function msgBoxNoRole(){
+  MessageBox.confirm('账号没有相关操作权限', '系统提示', {
+      confirmButtonText: '确认',
+      showCancelButton: false,
+      showClose: false,
+      type: 'warning'
+    }
+  ).then(() => {
+    window.location.href = '/#/'
+  }).catch(() => {});
+}

+ 80 - 0
src/utils/request.js

@@ -0,0 +1,80 @@
+import axios from 'axios'
+import { Notification, MessageBox, Message, Loading } from 'element-ui'
+import {msgBoxNoLogin, msgBoxNoRole, msgError, msgInfo} from './dw-msg'
+
+
+// 全局的 axios 默认值
+axios.defaults.baseURL = process.env.DW_API_URL
+// 请求超时时间
+axios.defaults.timeout = 10000;
+// post请求头
+axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
+
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: process.env.DW_API_URL,
+  // 超时
+  timeout: 10000
+})
+
+// 请求拦截器
+service.interceptors.request.use(
+  config => {
+    return config;
+  },
+  error => {
+    console.log('request-error:'+error)
+    return Promise.error(error)
+  })
+
+// 响应拦截器
+service.interceptors.response.use(
+  response => {
+    console.debug('response')
+    console.debug(response)
+    if (response.status === 200) {
+      const {data} = response
+      if(data.hasOwnProperty('resultCode')) {
+        if(data.resultCode === 401 ) {
+          msgBoxNoLogin()
+        }else if(data.resultCode === 403 ) {
+          msgBoxNoRole()
+        } else if(data.resultCode !== 200 ) {
+          let message = `异常码:${data.resultCode}`
+          if(data.hasOwnProperty('resultMsg'))
+            message = `${data.resultMsg},异常码:${data.resultCode}`
+          msgError(message)
+        }
+      }
+      return Promise.resolve(response)
+    } else {
+      return Promise.reject(response)
+    }
+  },
+  error => {
+    // 服务器状态码不是200的情况
+    console.log('err' + error)
+    let { message } = error;
+    if (message.includes("Network Error")) {
+      message = "后端接口连接异常";
+    } else if (message.includes("timeout")) {
+      message = "系统接口请求超时";
+    } else if (message.includes("Request failed with status code")) {
+      const code = message.substr(message.length - 3);
+      if(code==="401" || code==="403"){
+        message=null
+        if(code==="401"){
+          msgBoxNoLogin()
+        }else if(code==="403"){
+          msgBoxNoRole()
+        }
+      }else{
+        message = "系统接口" + message.substr(message.length - 3) + "异常";
+      }
+    }
+    if(message!=null) msgError(message)
+    return Promise.reject(error)
+  }
+)
+
+export default service

+ 113 - 0
src/views/Login.vue

@@ -0,0 +1,113 @@
+<template>
+  <div id="loginPage" >
+    <el-row :gutter="0">
+      <el-col :span="10" :offset="7">
+        <div class="loginFormContent" >
+          <div style="text-align: center;">
+            <h3>欢迎登录</h3>
+            <div>
+              <el-tag type="success">调问</el-tag>
+              <el-tag type="warning">专业</el-tag>
+              <el-tag>开源</el-tag>
+              <el-tag type="success">实用的</el-tag>
+              <el-tag type="warning">调查问卷系统</el-tag>
+            </div>
+          </div>
+          <div>
+            <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-position="top" label-width="100px" class="demo-ruleForm" @submit.native.prevent >
+              <el-form-item label="用户名" prop="email">
+                <el-input v-model="ruleForm.email" autocomplete="on" ></el-input>
+              </el-form-item>
+              <el-form-item label="密码" prop="pass">
+                <el-input type="password" v-model="ruleForm.pass" autocomplete="off" show-password ></el-input>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" native-type="submit" @click="submitForm('ruleForm')" style="width: 100%;">登录</el-button>
+<!--                <el-button @click="resetForm('ruleForm')">重置</el-button>-->
+              </el-form-item>
+            </el-form>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+
+import API from '@/api/index.js'
+import DwAuthorized from '../utils/dw-authorized'
+import {msgError} from '../utils/dw-msg'
+import { dwLogin } from "@/api/dw-login";
+
+
+export default {
+  name: 'Login.vue',
+  data() {
+    return {
+      ruleForm: {
+        email: '',
+        pass: ''
+      },
+      rules: {
+        email: [
+          { required: true, message: '请输入邮箱地址', trigger: 'blur' },
+          { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
+        ],
+        pass: [
+          { required: true, message: '请输入活动名称', trigger: 'blur' },
+          { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }
+        ]
+      }
+    };
+  },
+  mounted () {
+    this.pageH = window.height
+  },
+  methods: {
+    submitForm(formName) {
+      // 进行登录验证
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          dwLogin(this.ruleForm.email,this.ruleForm.pass).then((response) => {
+            const resultData = response.data
+            console.log('login-begin')
+            console.log(resultData)
+            if(resultData.status==="ok"){
+              DwAuthorized.setAuthority(resultData.currentAuthority)
+              DwAuthorized.setUserName(this.ruleForm.email)
+              this.$router.push('/dw/survey/')
+            }else{
+              if(resultData.hasOwnProperty('httpResult') && resultData.httpResult!=null && resultData.httpResult.hasOwnProperty('resultMsg')){
+                msgError(resultData.httpResult.resultMsg)
+              }else{
+                msgError('登录失败,请确认!')
+              }
+            }
+          })
+
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    }
+  }
+}
+</script>
+
+<style scoped>
+#loginPage{
+  /*background-image: url("http://localhost:8181/diaowen/images/style-model/login_bg/1.jpg");*/
+}
+.loginFormContent{
+  padding: 20px;
+  margin-top: 50px;
+  background-color: white;
+  border: 1px solid gainsboro;
+  border-radius: 3px;
+}
+</style>

+ 278 - 0
src/views/dw-admin/AdminUserList.vue

@@ -0,0 +1,278 @@
+<template>
+  <div>
+    <el-row>
+      <el-col :span="20" :offset="2">
+        <div class="dw-table-form" style="padding-left: 60px;">
+          <el-form :inline="true" :model="formInline" class="dw-form-inline" size="medium" >
+            <el-form-item label="登录账号">
+              <el-input v-model="formInline.loginName" placeholder="请输入查询的账号关键字" clearable ></el-input>
+            </el-form-item>
+            <el-form-item label="账号状态" style="margin-left: 40px;">
+              <el-select v-model="formInline.status" placeholder="请选择账号状态" clearable >
+                <el-option label="不可用" value="0"></el-option>
+                <el-option label="未激活" value="1"></el-option>
+                <el-option label="激活" value="2"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item style="margin-left: 40px;">
+              <el-button @click="onSubmit">重置</el-button>
+              <el-button type="primary" @click="onSubmit">查询</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="dw-table">
+          <div class="dw-table-title">
+            <el-row :span="24" type="flex" justify="space-between" align="middle">
+              <el-col :span="4"><h3>用户管理</h3></el-col>
+              <el-col :span="20" style="text-align: right;">
+                <el-button type="primary" size="medium" @click="dialogTitle = '创建用户';userFormRules.pwd = { required: false };userForm.id=null;dialogFormVisible = true" v-has-dw-role="'dwAdmin'" >添加用户</el-button>
+              </el-col>
+            </el-row>
+          </div>
+          <el-table :data="tableData" stripe style="width: 100%">
+            <el-table-column type="selection" width="55"></el-table-column>
+            <el-table-column label="登录名" >
+              <template slot-scope="scope">
+                <el-popover trigger="hover" placement="top">
+                  <p v-html="scope.row.loginName" ></p>
+                  <div slot="reference" class="name-wrapper">
+                    <div v-html="scope.row.loginName"></div>
+                  </div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="创建时间" width="180" >
+              <template slot-scope="scope">
+                <span style="margin-left: 10px">{{ scope.row.createTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="状态" width="80" >
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.status === 0" type="danger" >不可用</el-tag>
+                <el-tag v-else-if="scope.row.status === 1" type="info" >未激活</el-tag>
+                <el-tag v-else-if="scope.row.status === 2" type="success" >激活</el-tag>
+                <el-tag v-else disable-transitions style="margin-left: 10px" >未知</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="登录时间" width="180" >
+              <template slot-scope="scope">
+                <i class="el-icon-time"></i>
+                <span style="margin-left: 10px">{{ scope.row.lastLoginTime }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="160" align="center">
+              <template slot-scope="scope">
+                <el-button-group>
+                  <el-tooltip effect="dark" content="编辑问卷" placement="top">
+                    <el-button size="mini" content="编辑" @click="handleEdit(scope.$index, scope.row)" icon="el-icon-edit"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="dark" content="删除问卷" placement="top">
+                    <el-button size="mini" @click="handleDelete(scope.$index, scope.row)" icon="el-icon-delete"></el-button>
+                  </el-tooltip>
+                </el-button-group>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="dw-pagination">
+            <el-pagination
+              background
+              layout="prev, pager, next"
+              :page-size="pageSize"
+              :current-page="currentPage"
+              :total="total"
+              @current-change="handleCurrentChange"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+    <div>
+      <el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible" append-to-body width="40%" >
+        <el-form :model="userForm" :rules="userFormRules" ref="userForm" status-icon  label-position="top">
+          <el-form-item label="设置账号" prop="loginName" :label-width="formLabelWidth" style="margin-top: 0px;">
+            <el-input v-model="userForm.loginName" autocomplete="off" placeholder="请设置登录账号" show-word-limit ></el-input>
+          </el-form-item>
+          <el-form-item label="账号状态" prop="status" :label-width="formLabelWidth" class="dw-dialog-form-item">
+            <el-radio-group v-model="userForm.status">
+              <el-radio :label="0">不可用</el-radio>
+              <el-radio :label="1">未激活</el-radio>
+              <el-radio :label="2">激活</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="设置密码" prop="pwd" :label-width="formLabelWidth" class="dw-dialog-form-item" >
+            <el-input v-model="userForm.pwd"  autocomplete="off" placeholder="新建时必须设置密码,修改时不设置代表不修改。" show-password ></el-input>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="dialogFormVisible = false">取 消</el-button>
+          <el-button type="primary" @click="handleSaveUser()">确 定</el-button>
+        </div>
+      </el-dialog>
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+import { dwAdminUserList, dwUserCreate, dwUserDelete, dwUserUpdate } from '../../api/admin/admin-user'
+
+export default {
+  name: 'AdminUserList',
+  data () {
+    return {
+      tableData: [],
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+      formInline: {
+        loginName: null,
+        status: null
+      },
+      dialogTitle: '创建用户',
+      dialogFormVisible: false,
+      userForm: {
+        id: null,
+        loginName: '',
+        pwd: '',
+        status: 2
+      },
+      userFormRules: {
+        loginName: [
+          { required: true, message: '请输入登录账号', trigger: 'blur' },
+          { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' },
+          { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change']}
+        ],
+        pwd: [
+          { required: true, message: '请输入登录密码', trigger: 'blur' },
+          { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }
+        ],
+        status: [
+          { required: true, message: '请选择账号状态', trigger: 'change' }
+        ]
+      },
+      formLabelWidth: '120px'
+    }
+  },
+  mounted () {
+    this.queryList(1);
+  },
+  methods: {
+    buttonClickA (href) {
+      window.location.href = href
+    },
+    handlePush: function (to) {
+      this.$router.push(to)
+    },
+    onSubmit () {
+      console.log('submit!')
+      this.queryList(1)
+    },
+    handleCurrentChange (val) {
+      this.queryList(val)
+    },
+    queryList (pageNo) {
+      const {status,loginName} = this.formInline;
+      dwAdminUserList(this.pageSize,pageNo,status,loginName).then((response) => {
+        const resultData = response.data.data
+        this.tableData = resultData
+        this.total = response.data.total
+        this.currentPage = response.data.current
+        this.pageSize = response.data.pageSize
+      })
+    },
+    handleEdit (index, row) {
+      this.dialogTitle = `编辑用户`
+      this.dialogFormVisible = true
+      this.userFormRules.pwd = { required: false }
+      this.userForm.loginName = row.loginName
+      this.userForm.status = row.status
+      this.userForm.id = row.id
+      console.log(index, row)
+    },
+    handleDelete (index, row) {
+      console.log(index, row)
+      this.$msgbox.confirm("确认删除此用户吗?", "删除警告", {type:"warning",confirmButtonText:"确认删除"}).then(() => {
+        const data = {id: [row.id]}
+        dwUserDelete(data).then((response) => {
+          const httpResult = response.data
+          if (httpResult.resultCode === 200 ){
+            this.$message.success('删除成功,即将刷新数据。')
+            this.queryList(1)
+          } else {
+            this.$message.error('添加用户失败')
+          }
+        })
+      }).catch(() => {})
+
+    },
+    handleSaveUser () {
+      this.$refs['userForm'].validate((valid) => {
+        if (valid) {
+          const {id, loginName, pwd, status} = this.userForm
+          if(id==null){
+            const data = {loginName, pwd, status}
+            dwUserCreate(data).then((response) => {
+              const httpResult = response.data
+              if (httpResult.resultCode === 200 ) {
+                this.$message.success('添加成功,即将刷新数据。')
+                this.queryList(1)
+                this.dialogFormVisible = false
+              } else {
+                this.$message.error('添加用户失败')
+              }
+            })
+          } else {
+            const data = {id, loginName, pwd, status}
+            dwUserUpdate(data).then((response) => {
+              const httpResult = response.data
+              if (httpResult.resultCode === 200 ) {
+                this.$message.success('修改成功,即将刷新数据。')
+                this.queryList(1)
+                this.dialogFormVisible = false
+              } else {
+                this.$message.error('添加用户失败')
+              }
+            })
+          }
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      });
+
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-table-form{
+  background-color: white;
+  padding: 20px;
+  margin-bottom: 20px;
+}
+.dw-table{
+  background: white;
+  padding: 20px;
+}
+.dw-table .dw-table-title{
+  padding-bottom: 20px;
+  border-bottom: 1px solid #f3f3f3;
+}
+.dw-table .dw-table-title h3{
+  padding: 0px;
+  margin: 0px;
+}
+.el-form-item{
+  margin-bottom: 0px;
+}
+.dw-dialog-form-item{
+  margin-top: 20px;
+}
+.dw-pagination{
+  padding-top: 20px;
+  text-align: right;
+}
+</style>

+ 279 - 0
src/views/dw-survey/DwSurveyList.vue

@@ -0,0 +1,279 @@
+<template>
+  <div>
+    <el-row>
+      <el-col :span="20" :offset="2">
+       <div class="dw-table-form" style="padding-left: 60px;">
+         <el-form :inline="true" :model="formInline" class="dw-form-inline" size="medium" >
+           <el-form-item label="问卷标题">
+             <el-input v-model="formInline.surveyName" placeholder="请输入查询的问卷标题" clearable></el-input>
+           </el-form-item>
+           <el-form-item label="问卷状态" style="margin-left: 40px;">
+             <el-select v-model="formInline.surveyState" placeholder="请选择问卷状态" clearable>
+               <el-option label="设计中" value="0"></el-option>
+               <el-option label="收集中" value="1"></el-option>
+               <el-option label="收集结束" value="2"></el-option>
+             </el-select>
+           </el-form-item>
+           <el-form-item style="margin-left: 40px;">
+             <el-button @click="onSubmit">重置</el-button>
+             <el-button type="primary" @click="onSubmit">查询</el-button>
+           </el-form-item>
+         </el-form>
+       </div>
+        <div class="dw-table">
+          <div class="dw-table-title">
+            <el-row :span="24" type="flex" justify="space-between" align="middle">
+              <el-col :span="4"><h3>我的问卷</h3></el-col>
+              <el-col :span="20" style="text-align: right;">
+                <el-button type="primary" size="medium" @click="form.id=null;form.name=null;dialogTitle = '创建问卷';dialogFormVisible = true" >新建问卷</el-button>
+              </el-col>
+            </el-row>
+          </div>
+          <el-table
+            :data="tableData"
+            stripe
+            style="width: 100%">
+            <el-table-column type="selection" width="55"></el-table-column>
+            <el-table-column label="问卷" >
+              <template slot-scope="scope">
+                <el-popover trigger="hover" placement="top">
+                  <p v-html="scope.row.surveyName" ></p>
+                  <div slot="reference" class="name-wrapper">
+                    <div v-html="scope.row.surveyName"></div>
+                  </div>
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column label="答卷数" width="80" >
+              <template slot-scope="scope">
+                <span style="margin-left: 10px">{{ scope.row.answerNum!=null ? scope.row.answerNum:0 }}&nbsp;份</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="状态" width="80" >
+              <template slot-scope="scope">
+                <el-tag v-if="scope.row.surveyState === 0" >设计中</el-tag>
+                <el-tag v-else-if="scope.row.surveyState === 1" type="success" >收集中</el-tag>
+                <el-tag v-else-if="scope.row.surveyState === 2" type="info" >收集结束</el-tag>
+                <el-tag v-else disable-transitions style="margin-left: 10px" >未知</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column label="创建时间" width="180" >
+              <template slot-scope="scope">
+                <i class="el-icon-time"></i>
+                <span style="margin-left: 10px">{{ scope.row.createDate }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" width="280">
+              <template slot-scope="scope">
+                <el-button-group>
+                  <el-tooltip effect="dark" content="编辑问卷" placement="top">
+                    <el-button
+                      size="mini"
+                      content="编辑问卷"
+                      @click="buttonClickA(`/static/diaowen/design.html?surveyId=${scope.row.id}`)"
+                      icon="el-icon-edit"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="dark" content="答卷地址" placement="top">
+                    <el-button
+                      size="mini"
+                      @click="handlePush(`/dw/survey/c/url/${scope.row.id}`)"
+                      icon="el-icon-share"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="dark" content="答卷数据" placement="top">
+                    <el-button
+                      size="mini"
+                      @click="handlePush(`/dw/survey/d/chart/${scope.row.id}`)"
+                      icon="el-icon-s-data"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="dark" content="复制问卷" placement="top">
+                    <el-button
+                      size="mini"
+                      @click="handleCopy(scope.$index, scope.row)"
+                      icon="el-icon-copy-document"></el-button>
+                  </el-tooltip>
+                  <el-tooltip effect="dark" content="删除问卷" placement="top">
+                    <el-button
+                      size="mini"
+                      @click="handleDelete(scope.$index, scope.row)"
+                      icon="el-icon-delete"></el-button>
+                  </el-tooltip>
+                </el-button-group>
+              </template>
+            </el-table-column>
+          </el-table>
+          <div class="dw-pagination">
+            <el-pagination
+              background
+              layout="prev, pager, next"
+              @current-change="handleCurrentChange"
+              :page-size="pageSize"
+              :current-page="currentPage"
+              :total="total"
+            >
+            </el-pagination>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+
+    <div>
+      <el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible" append-to-body width="40%" >
+        <el-form :model="form" label-position="top">
+          <el-form-item label="问卷标题" :label-width="formLabelWidth">
+            <el-input v-model="form.name" autocomplete="off" placeholder="请输入问卷标题" ></el-input>
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button @click="dialogFormVisible = false">取 消</el-button>
+          <el-button type="primary" @click="handleDialogConfirm">确 定</el-button>
+        </div>
+      </el-dialog>
+    </div>
+
+  </div>
+</template>
+
+<script>
+
+import { dwSurveyCreate, dwSurveyList } from '@/api/dw-survey'
+import { dwSurveyCopy, dwSurveyDelete } from '../../api/dw-survey'
+
+export default {
+  name: 'SurveyList',
+  data () {
+    return {
+      tableData: [],
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+      dialogTitle: '创建问卷',
+      formInline: {
+        surveyName: null,
+        surveyState: null
+      },
+      dialogFormVisible: false,
+      form: {
+        name: '',
+        id: null
+      },
+      formLabelWidth: '120px'
+    }
+  },
+  mounted () {
+    this.queryList(1)
+  },
+  methods: {
+    buttonClickA (href) {
+      window.location.href = href
+    },
+    handlePush: function (to) {
+      this.$router.push(to)
+    },
+    handleCopy (index, row) {
+      console.log(index, row)
+      this.form.id = row.id
+      this.form.name = `${row.surveyName}`
+      this.dialogFormVisible = true
+      this.dialogTitle = '复制问卷'
+    },
+    handleDelete (index, row) {
+      this.$msgbox.confirm("确认删除此问卷吗?", "删除警告", {type:"warning",confirmButtonText:"确认删除"}).then(() => {
+        const data = {id:[row.id]}
+        dwSurveyDelete(data).then((response) => {
+          console.log(response)
+          const httpResult = response.data
+          if (httpResult.resultCode === 200 ){
+            this.$message.success('删除成功,即将刷新数据。')
+            this.queryList(1)
+          } else {
+            this.$message.error('删除问卷失败')
+          }
+        })
+      }).catch(() => {})
+    },
+    onSubmit () {
+      console.log('submit!')
+      this.queryList(1)
+    },
+    handleCurrentChange (val) {
+      this.queryList(val)
+    },
+    queryList (pageNo) {
+      const {surveyName,surveyState} = this.formInline
+      dwSurveyList(this.pageSize, pageNo, surveyName, surveyState).then((response) => {
+        const resultData = response.data.data
+        this.tableData = resultData
+        this.total = response.data.total
+        this.currentPage = response.data.current
+        this.pageSize = response.data.pageSize
+      })
+    },
+    handleDialogConfirm () {
+      if (this.form.id === null) {
+        this.createSurvey()
+      } else {
+        this.copySurvey(this.form.id)
+      }
+    },
+    createSurvey () {
+      const data = {surveyName: this.form.name}
+      dwSurveyCreate(data).then((response) => {
+        const httpResult = response.data
+        const resultData = httpResult.data
+        if (httpResult.resultCode === 200) {
+          this.dialogFormVisible = false
+          this.$confirm('问卷创建成功,点击“继续编辑问卷”进入问卷编辑。', '系统提示', {confirmButtonText:'继续编辑问卷'}).then(({ value }) => {
+            window.location.href=`/static/diaowen/design.html?surveyId=${resultData.id}`
+          }).catch(() => {
+            this.queryList(1)
+          })
+        } else {
+          this.$message.error('创建问卷失败');
+        }
+      })
+    },
+    copySurvey (surveyId) {
+      dwSurveyCopy(surveyId,this.form.name).then((response) =>{
+        const httpResult = response.data
+        const resultData = httpResult.data
+        if (httpResult.resultCode === 200 ) {
+          this.dialogFormVisible = false
+          this.$confirm('问卷复制成功,点击“继续编辑问卷”进入问卷编辑。', '系统提示', {confirmButtonText:'继续编辑问卷'}).then(({ value }) => {
+            window.location.href=`/static/diaowen/design.html?surveyId=${resultData.id}`
+          }).catch(() => {
+            this.queryList(1)
+          })
+        } else {
+          this.$message.error('问卷复制失败');
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+.dw-table-form{
+  background-color: white;
+  padding: 20px;
+  margin-bottom: 20px;
+}
+.dw-table{
+  background: white;
+  padding: 20px;
+}
+.dw-table .dw-table-title{
+  padding-bottom: 20px;
+  border-bottom: 1px solid #f3f3f3;
+}
+.dw-table .dw-table-title h3{
+  padding: 0px;
+  margin: 0px;
+}
+.el-form-item{
+  margin-bottom: 0px;
+}
+.dw-pagination{
+  padding-top: 20px;
+  text-align: right;
+}
+</style>

+ 22 - 0
src/views/dw-survey/dw-collect/DwAnswer.vue

@@ -0,0 +1,22 @@
+<template>
+  <div>问卷加载中</div>
+</template>
+
+<script>
+export default {
+  name: 'DwAnswer',
+  mounted () {
+    this.loadAnswer()
+  },
+  methods: {
+    loadAnswer: function(){
+      const sid = this.$route.params.sid
+      window.location.href=process.env.DW_WEB_URL+"/static/diaowen/answer-p.html?sid="+sid;
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 23 - 0
src/views/dw-survey/dw-collect/DwAnswerUrl.vue

@@ -0,0 +1,23 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper :id="id" is-answer-url="true" >
+      <template v-slot:dw-dcs-main-slot="{survey}" >
+        <dw-answer-url-main v-if="survey" :survey="survey"></dw-answer-url-main>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import DwAnswerUrlMain from './DwAnswerUrlMain'
+
+export default {
+  name: 'DwAnswerUrl',
+  components: {
+    DwSurveyDcsWrapper,
+    DwAnswerUrlMain
+  }
+}
+
+</script>

+ 86 - 0
src/views/dw-survey/dw-collect/DwAnswerUrlMain.vue

@@ -0,0 +1,86 @@
+<template>
+  <div>
+    <div>
+      <div class="dw-dcs-main-title">
+        <h4>答卷地址</h4>
+        <div class="dw-dcs-main-p">复制下面的问卷链接到QQ,Email等工具中直接发给被用户</div>
+      </div>
+      <div class="dw-dcs-main-content">
+        <el-input id="copyCodeInput" v-model="survey.answerUrl" readonly style="width: 400px;" ></el-input>
+        <el-button-group>
+          <el-button type="primary" icon="el-icon-copy-document" @click="copyActiveCode($event,survey.answerUrl )" >复制地址</el-button>
+          <el-link :href="survey.answerUrl" :underline="false" target="_blank" ><el-button icon="el-icon-link" style="border-bottom-left-radius: 0px;border-top-left-radius: 0px;" >打开问卷</el-button></el-link>
+        </el-button-group>
+      </div>
+    </div>
+    <div>
+      <div class="dw-dcs-main-title">
+        <h4>二维码地址</h4>
+        <div class="dw-dcs-main-p">通过手机扫一扫,或下载二维码,即可进行问卷数据收集。</div>
+      </div>
+      <div class="dw-dcs-main-content">
+        <el-row type="flex" justify="start" align="middle">
+          <el-col :span="4">
+            <el-image :src="survey.answerUrlQR" class="dw-dcs-main-img">
+              <div slot="placeholder" class="image-slot">
+                加载中<span class="dot">...</span>
+              </div>
+            </el-image>
+          </el-col>
+          <el-col :span="20">
+            <el-button type="primary" icon="el-icon-download" style="margin-left: 10px;" @click="copyActiveCode($event,code )" >下载二维码</el-button>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import Clipboard from 'clipboard'
+
+export default {
+  name: 'DwAnswerUrlMain',
+  components: {
+    Clipboard
+  },
+  props: ['survey'],
+  methods: {
+    copyActiveCode (e, text) {
+      // console.debug(this.$children[0].survey)
+      console.debug(this.survey)
+      const clipboard = new Clipboard(e.target, { text: () => text })
+      clipboard.on('success', e => {
+        this.$message({ type: 'success', message: '复制成功' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.on('error', e => {
+        // 不支持复制
+        this.$message({ type: 'warning', message: '该浏览器不支持自动复制' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.onClick(e)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-dcs-main-p{
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.dw-dcs-main-content{
+  padding: 20px 0px;
+}
+.dw-dcs-main-img{
+  border: 1px solid rgb(241, 242, 245);
+}
+</style>

+ 157 - 0
src/views/dw-survey/dw-collect/DwAnswerWeixin.vue

@@ -0,0 +1,157 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper is-answer-wx="true">
+      <template v-slot:dw-dcs-main-slot="{survey}">
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>通过微信二维码发送或分享给好友</h4>
+            <div class="dw-dcs-main-p">通过手机扫一扫,或下载二维码,发送或分享给好友,即可进行问卷数据收集。</div>
+          </div>
+          <div class="dw-dcs-main-content">
+            <el-row type="flex" justify="start" align="middle">
+              <el-col :span="4">
+                <el-image :src="survey.answerUrlQR" class="dw-dcs-main-img">
+                  <div slot="placeholder" class="image-slot">
+                    加载中<span class="dot">...</span>
+                  </div>
+                </el-image>
+              </el-col>
+              <el-col :span="20">
+                <el-button type="primary" icon="el-icon-download" style="margin-left: 10px;" >下载二维码</el-button>
+                <div class="dw-dcs-main-p" style="padding: 10px;">通过手机扫一扫,或下载二维码,即可进行问卷数据收集。</div>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>微信公众号分享</h4>
+            <div class="dw-dcs-main-p">通过微信公众号,发送或分享给被访者。</div>
+          </div>
+          <div class="dw-dcs-main-content">
+            <div style="background-color: #F1F1F1;padding: 10px;">
+              <el-row type="flex" gutter="20" justify="start" align="middle">
+                <el-col :span="8" >
+                  <div class="dw-dcs-main-wx-step">1、使用微信扫一扫功能。</div>
+                  <el-image src="http://localhost:8181/diaowen/images/img1/weixin_collect1.jpg" class="dw-dcs-main-img">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </el-col>
+                <el-col :span="8">
+                  <div class="dw-dcs-main-wx-step">2、打开问卷后,点击右上角的“分享”按钮。</div>
+                  <el-image src="http://localhost:8181/diaowen/images/img1/weixin_collect2.jpg" class="dw-dcs-main-img">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </el-col>
+                <el-col :span="8">
+                  <div class="dw-dcs-main-wx-step">3、选择“发送给朋友”或“分享到朋友圈”</div>
+                  <el-image src="http://localhost:8181/diaowen/images/img1/weixin_collect3.jpg" class="dw-dcs-main-img">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </div>
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>通过微信公众号</h4>
+            <div class="dw-dcs-main-p">复制下面的问卷链接到QQ,Email等工具中直接发给被用户</div>
+          </div>
+          <div class="dw-dcs-main-content">
+            <div>
+              <el-input id="copyCodeInput" v-model="survey.answerUrl" readonly style="width: 400px;" ></el-input>
+              <el-button-group >
+                <el-button type="primary" icon="el-icon-copy-document" @click="copyActiveCode($event,survey.answerUrl )" >复制地址</el-button>
+              </el-button-group>
+            </div>
+            <div style="padding: 10px;background-color: #F1F1F1;margin-top: 20px;">
+              <el-row type="flex" gutter="20" justify="start" align="top">
+                <el-col :span="8" >
+                  <div class="dw-dcs-main-wx-step">1、打开公众账号。</div>
+                  <el-image src="http://localhost:8181/diaowen/images/img1/weixin_b_s3.png" class="dw-dcs-main-img">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </el-col>
+                <el-col :span="8">
+                  <div class="dw-dcs-main-wx-step">2、将链接放入公众号中确认后推送文章。</div>
+                  <el-image src="http://localhost:8181/diaowen/images/img1/weixin_b_s4.jpeg" class="dw-dcs-main-img">
+                    <div slot="placeholder" class="image-slot">
+                      加载中<span class="dot">...</span>
+                    </div>
+                  </el-image>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </div>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import Clipboard from 'clipboard'
+
+export default {
+  name: 'DwAnswerWeixin',
+  components: {
+    DwSurveyDcsWrapper,
+    Clipboard
+  },
+  data () {
+    return {
+      code: 'http://ent.surveyform.cn/#/diaowen/wdhl2uv6e9x',
+      src: 'https://ent.surveyform.cn/api/dwsurvey/anon/response/answerTD.do?surveyId=465d3020-0880-4c37-ab09-cc40869758de'
+    }
+  },
+  methods: {
+    copyActiveCode (e, text) {
+      const clipboard = new Clipboard(e.target, { text: () => text })
+      clipboard.on('success', e => {
+        this.$message({ type: 'success', message: '复制成功' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.on('error', e => {
+        // 不支持复制
+        this.$message({ type: 'waning', message: '该浏览器不支持自动复制' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.onClick(e)
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-dcs-main-p{
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.dw-dcs-main-content{
+  padding: 20px 0px;
+}
+.dw-dcs-main-img{
+  border: 1px solid rgb(241, 242, 245);
+}
+.dw-dcs-main-wx-step{
+  font-size: 14px;
+  padding: 10px 0px;
+}
+</style>

+ 199 - 0
src/views/dw-survey/dw-collect/DwSiteComp.vue

@@ -0,0 +1,199 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper is-site-comp="true">
+      <template v-slot:dw-dcs-main-slot="{survey}" >
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>通过网站挂件快速收集问卷</h4>
+            <div class="dw-dcs-main-p">复制右边生成的挂件代码,放入网站Footer页中即可实现全站带有答卷挂件。</div>
+          </div>
+          <div class="dw-dcs-main-content"></div>
+        </div>
+        <div>
+          <el-row>
+            <el-col :span="8">
+              <div class="site-comp-left">
+                <div class="site-comp-left-title">风格设置</div>
+                <div>
+                  <el-row>
+                    <el-col :span="16">
+                      <div class="dw-c-from-item">挂件位置:
+                        <el-radio-group v-model="radio" size="small" @change="handleLRButton($event)">
+                          <el-radio-button label="左边"></el-radio-button>
+                          <el-radio-button label="右边" ></el-radio-button>
+                        </el-radio-group>
+                      </div>
+                      <div class="dw-c-from-item dw-c-from-item-color">
+                        <span>背景颜色:</span>
+                        <el-color-picker v-model="color1" @active-change="handleBgColor($event)"></el-color-picker>
+                      </div>
+                      <div class="dw-c-from-item dw-c-from-item-color">
+                        <span>文字颜色:</span>
+                        <el-color-picker v-model="color2" @active-change="handleTextColor($event)"></el-color-picker>
+                      </div>
+                    </el-col>
+                    <el-col :span="8">
+                      <div class="dw-c-from-item">
+                        <div>挂件高度:</div>
+                        <div style="margin-top: 15px;">
+                          <el-slider
+                            v-model="value"
+                            vertical
+                            height="200px"
+                            @input="handleSlider">
+                          </el-slider>
+                        </div>
+                        <div style="padding-top: 15px;">
+                          <el-input-number v-model="value" :min="1" :max="100" controls-position="right" size="small"></el-input-number>
+                        </div>
+                      </div>
+                    </el-col>
+                  </el-row>
+                </div>
+              </div>
+            </el-col>
+            <el-col :span="2" style="text-align: center;color: rgb(211, 211, 211);">
+              <i class="el-icon-right"></i>
+            </el-col>
+            <el-col :span="14">
+              <div class="site-comp-right">
+                <div><el-input
+                  v-model="siteCompCode"
+                  :autosize="{ minRows: 2, maxRows: 8}"
+                  type="textarea"
+                  placeholder="请输入内容"
+                  disabled
+                  >
+                </el-input></div>
+                <div style="padding-top: 10px;">
+                  <el-button type="primary" icon="el-icon-copy-document" style="width: 100%;" @click="copyActiveCode($event,siteCompCode)">复制挂件代码</el-button>
+                </div>
+              </div>
+            </el-col>
+          </el-row>
+          <div v-html="survey.siteCompCodeRoot" > </div>
+        </div>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import Clipboard from 'clipboard'
+
+export default {
+  name: 'DwSiteComp',
+  data () {
+    return {
+      color1: '#409EFF',
+      color2: '#FFFFFF',
+      value: 60,
+      radio: '右边',
+      siteCompCode: '<div id="dwsurveyWebSiteFixed" style="position: fixed; right: 0px; left: auto; top: 520px; z-index: 99999;"><a target=\'_blank\' id="dwsurveyWebSiteFixedA" href="" style="background-color: rgb(24, 144, 255); width: 15px; display: block; padding: 10px 6px 10px 10px; color: white; cursor: pointer; float: right; vertical-align: middle; text-decoration: none; font-size: 12px; box-sizing: content-box; line-height: 20px;">问卷调查</a></div>'
+    }
+  },
+  components: {
+    DwSurveyDcsWrapper,
+    Clipboard
+  },
+  methods: {
+    copyActiveCode (e, text) {
+      const webSiteElementCode = document.getElementById('dwsurveyWebAnswerCompCode')
+      this.siteCompCode = webSiteElementCode.innerHTML
+      const clipboard = new Clipboard(e.target, { text: () => this.siteCompCode })
+      clipboard.on('success', e => {
+        this.$message({ type: 'success', message: '复制成功' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.on('error', e => {
+        // 不支持复制
+        this.$message({ type: 'waning', message: '该浏览器不支持自动复制' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.onClick(e)
+    },
+    handleSlider (val) {
+      let posHeight = window.innerHeight - val * 10
+      if (posHeight < 0) {
+        posHeight = 0
+      }
+      const webSiteElementCode = document.getElementById('dwsurveyWebAnswerCompCode')
+      const webSiteElement = document.getElementById('dwsurveyWebSiteFixed')
+      webSiteElement.style.top = posHeight + 'px'
+      console.debug(webSiteElementCode.innerHTML)
+      this.siteCompCode = webSiteElementCode.innerHTML
+    },
+    handleLRButton (val) {
+      console.debug(val)
+      const webSiteElementCode = document.getElementById('dwsurveyWebAnswerCompCode')
+      const webSiteElement = document.getElementById('dwsurveyWebSiteFixed')
+      if (val === '左边') {
+        webSiteElement.style.left = '0px'
+        webSiteElement.style.right = 'auto'
+      } else {
+        webSiteElement.style.left = 'auto'
+        webSiteElement.style.right = '0px'
+      }
+      console.debug(webSiteElementCode.innerHTML)
+      this.siteCompCode = webSiteElementCode.innerHTML
+    },
+    handleBgColor (color) {
+      const webSiteElementCode = document.getElementById('dwsurveyWebAnswerCompCode')
+      const webSiteElement = document.getElementById('dwsurveyWebSiteFixedA')
+      webSiteElement.style.backgroundColor = color
+      console.debug(webSiteElementCode.innerHTML)
+      this.siteCompCode = webSiteElementCode.innerHTML
+    },
+    handleTextColor (color) {
+      const webSiteElementCode = document.getElementById('dwsurveyWebAnswerCompCode')
+      const webSiteElement = document.getElementById('dwsurveyWebSiteFixedA')
+      webSiteElement.style.color = color
+      console.debug(webSiteElementCode.innerHTML)
+      this.siteCompCode = webSiteElementCode.innerHTML
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-dcs-main-p{
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.dw-dcs-main-content{
+  padding: 20px 0px;
+}
+.dw-dcs-main-img{
+  border: 1px solid rgb(241, 242, 245);
+}
+.site-comp-left{
+  border: 1px solid rgb(217, 217, 217);
+  padding: 10px;
+}
+.site-comp-left-title{
+  padding: 10px 0px;
+  font-size: 16px;
+  font-weight: bold;
+}
+.dw-c-from-item{
+  margin: 15px 0px;
+  font-size: 14px;
+  color: rgba(0,0,0,.85);
+}
+.dw-c-from-item-color{
+  vertical-align: middle;
+  display: flex;
+  align-items: center;
+}
+.el-input-number--small{
+ width: 100%;
+}
+</style>

+ 69 - 0
src/views/dw-survey/dw-collect/DwSiteShare.vue

@@ -0,0 +1,69 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper is-site-share="true">
+      <div slot="dw-dcs-main-slot">
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>分享到社交网络</h4>
+            <div class="dw-dcs-main-p">赶快分享您的问卷到各大社交网站,让更多关注您的朋友来回答问卷。</div>
+          </div>
+          <div class="dw-dcs-main-content"></div>
+        </div>
+      </div>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import Clipboard from 'clipboard'
+
+export default {
+  name: 'DwSiteShare',
+  components: {
+    DwSurveyDcsWrapper,
+    Clipboard
+  },
+  data () {
+    return {
+      code: 'http://ent.surveyform.cn/#/diaowen/wdhl2uv6e9x',
+      src: 'https://ent.surveyform.cn/api/dwsurvey/anon/response/answerTD.do?surveyId=465d3020-0880-4c37-ab09-cc40869758de'
+    }
+  },
+  methods: {
+    copyActiveCode (e, text) {
+      const clipboard = new Clipboard(e.target, { text: () => text })
+      clipboard.on('success', e => {
+        this.$message({ type: 'success', message: '复制成功' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.on('error', e => {
+        // 不支持复制
+        this.$message({ type: 'waning', message: '该浏览器不支持自动复制' })
+        // 释放内存
+        clipboard.off('error')
+        clipboard.off('success')
+        clipboard.destroy()
+      })
+      clipboard.onClick(e)
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-dcs-main-p{
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.dw-dcs-main-content{
+  padding: 20px 0px;
+}
+.dw-dcs-main-img{
+  border: 1px solid rgb(241, 242, 245);
+}
+</style>

+ 156 - 0
src/views/dw-survey/dw-collect/DwSurveyAttr.vue

@@ -0,0 +1,156 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper is-survey-set="true" >
+      <template v-slot:dw-dcs-main-slot >
+        <div>
+          <div class="dw-dcs-main-title">
+            <h4>问卷属性设置</h4>
+            <div class="dw-dcs-main-p">配置问卷答卷时的收集规则</div>
+          </div>
+          <div class="dw-dcs-main-content">
+
+            <div style="padding: 0px 30px;">
+              <el-form ref="form" :label-position="labelPosition" :model="form" >
+                <el-row>
+                  <el-col :span="12">
+                    <h5>回答限制</h5>
+                    <div style="padding-left: 10px;">
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.effective" >每台电脑或手机只能答一次</el-checkbox>
+                      </el-form-item>
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.effectiveIp" >每个IP只能答一次</el-checkbox>
+                      </el-form-item>
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.refresh">有重复回答启用验证码</el-checkbox>
+                      </el-form-item>
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.rule">启用访问密码,设置密码</el-checkbox>
+                        <el-input v-model="survey.surveyDetail.ruleCode" placeholder="请输入内容" style="width: 160px;"></el-input>
+                      </el-form-item>
+                    </div>
+                  </el-col>
+                  <el-col :span="12">
+                    <h5>何时结束</h5>
+                    <div style="padding-left: 10px;">
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.ynEndNum">收集到
+                          <el-input-number :min="1" :max="100000" v-model="survey.surveyDetail.endNum" label="份数" controls-position="right"></el-input-number>
+                          份时结束</el-checkbox>
+                      </el-form-item>
+                      <el-form-item>
+                        <el-checkbox v-model="survey.surveyDetail.ynEndTime">时间到
+                          <el-date-picker
+                            v-model="survey.surveyDetail.endTime"
+                            value-format="yyyy-MM-dd HH:mm:ss"
+                            type="datetime"
+                            placeholder="选择日期时间" >
+                          </el-date-picker>
+                          时结束
+                        </el-checkbox>
+                      </el-form-item>
+                    </div>
+                  </el-col>
+                </el-row>
+                <el-form-item>
+                  <el-button type="primary" @click="onSubmit"> 保存修改 </el-button>
+                  <el-button>取消</el-button>
+                </el-form-item>
+              </el-form>
+            </div>
+
+          </div>
+        </div>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import API from '@/api/index.js'
+import {dwSurveyInfo, dwSurveyUpdate} from '@/api/dw-survey'
+
+export default {
+  name: 'DwSurveyAttr',
+  components: {
+    DwSurveyDcsWrapper
+  },
+  data () {
+    return {
+      labelPosition: 'right',
+      value1: '',
+      survey: {
+        surveyDetail: {
+          effective: false,
+          effectiveIp: false
+        }
+      },
+      form: {
+        name: '',
+        region: '',
+        date1: '',
+        date2: '',
+        delivery: false,
+        type: [],
+        resource: '',
+        desc: ''
+      }
+    }
+  },
+  mounted () {
+    this.getSurveyInfo()
+  },
+  methods: {
+    getSurveyInfo () {
+      dwSurveyInfo(this.$route.params.id).then((response) => {
+        const resultData = response.data.data
+        this.survey = resultData
+        this.survey.surveyDetail.effective = resultData.surveyDetail.effective === 1
+        this.survey.surveyDetail.effectiveIp = resultData.surveyDetail.effectiveIp === 1
+        this.survey.surveyDetail.refresh = resultData.surveyDetail.refresh === 1
+        this.survey.surveyDetail.rule = resultData.surveyDetail.rule === 1
+        this.survey.surveyDetail.ynEndNum = resultData.surveyDetail.ynEndNum === 1
+        this.survey.surveyDetail.ynEndTime = resultData.surveyDetail.ynEndTime === 1
+      })
+    },
+    onSubmit () {
+      console.log('submit!')
+      const surveyDetail = this.survey.surveyDetail
+      const data = {
+        dirId: surveyDetail.dirId,
+        effective: surveyDetail.effective ? 1 : 0,
+        effectiveIp: surveyDetail.effectiveIp ? 1 : 0,
+        refresh: surveyDetail.refresh ? 1 : 0,
+        rule: surveyDetail.rule ? 1 : 0,
+        ynEndNum: surveyDetail.ynEndNum ? 1 : 0,
+        ynEndTime: surveyDetail.ynEndTime ? 1 : 0,
+        endNum: surveyDetail.endNum,
+        endTime: surveyDetail.endTime
+      }
+      console.log(data)
+      dwSurveyUpdate(data).then((response) => {
+        console.log(response)
+        const data = response.data;
+        if (data.resultCode === 200) {
+          this.$message({ type: 'success', message: '保存成功' })
+        } else {
+          this.$message({ type: 'error', message: data.resultMsg })
+        }
+      })
+    }
+  }
+}
+
+</script>
+
+<style scoped>
+.dw-dcs-main-p{
+  font-size: 12px;
+  color: rgba(0, 0, 0, 0.45);
+}
+.dw-dcs-main-content{
+  padding: 20px 0px;
+}
+</style>

+ 123 - 0
src/views/dw-survey/dw-data/DwSurveyAnswer.vue

@@ -0,0 +1,123 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper :id="id" is-answer-data="true" >
+      <template v-slot:dw-dcs-main-slot="{survey}" >
+        <div class="dw-dcs-main-title">
+          <el-row type="flex">
+            <el-col :span="18"><div style="font-size: 14px;padding: 10px;"><strong>原始数据列表</strong></div></el-col>
+            <el-col :span="6" style="text-align: right;padding-right: 16px;" ><el-button type="primary" size="small" >导出数据</el-button></el-col>
+          </el-row>
+        </div>
+        <el-table
+          :data="tableData"
+          stripe
+          style="width: 100%">
+          <el-table-column type="selection" width="55"></el-table-column>
+          <el-table-column label="回答IP" >
+            <template slot-scope="scope">
+              <el-popover trigger="hover" placement="top">
+                <p v-html="scope.row.ipAddr" ></p>
+                <div slot="reference" class="name-wrapper">
+                  <div v-html="scope.row.ipAddr"></div>
+                </div>
+              </el-popover>
+            </template>
+          </el-table-column>
+          <el-table-column label="回答的题数" >
+            <template slot-scope="scope">
+              <span style="margin-left: 10px">{{ scope.row.completeItemNum!=null ? scope.row.completeItemNum:0 }}&nbsp;题</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="回答时间" >
+            <template slot-scope="scope">
+              <i class="el-icon-time"></i>
+              <span style="margin-left: 10px">{{ scope.row.endAnDate }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="160" >
+            <template slot-scope="scope">
+              <el-button-group>
+                <el-tooltip effect="dark" content="查看数据" placement="top">
+                  <el-button
+                    size="mini"
+                    @click="handleGo(`/no-top/dw-survey/d/data/${scope.row.surveyId}/${scope.row.id}`)"
+                    icon="el-icon-view"></el-button>
+                </el-tooltip>
+                <el-tooltip effect="dark" content="删除数据" placement="top">
+                  <el-button
+                    size="mini"
+                    @click="handleDelete(scope.$index, scope.row)"
+                    icon="el-icon-delete"></el-button>
+                </el-tooltip>
+              </el-button-group>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div class="dw-pagination">
+          <el-pagination
+            background
+            layout="prev, pager, next"
+            :page-size="pageSize"
+            :current-page="currentPage"
+            :total="total"
+            @current-change="handleCurrentChange"
+          >
+          </el-pagination>
+        </div>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import { dwSurveyAnswerList } from '@/api/dw-survey'
+
+export default {
+  name: 'DwSurveyAnswer',
+  components: {
+    DwSurveyDcsWrapper
+  },
+  data () {
+    return {
+      tableData: [],
+      pageSize: 10,
+      currentPage: 1,
+      total: 0
+    }
+  },
+  mounted () {
+    this.queryList(1)
+  },
+  methods: {
+    handleGo (to) {
+      this.$router.push(to)
+    },
+    handlePush: function (to) {
+      this.$router.push(to)
+    },
+    handleDelete (index, row) {
+      console.log(index, row)
+    },
+    handleCurrentChange (val) {
+      this.queryList(val)
+    },
+    queryList (pageNo) {
+      dwSurveyAnswerList(this.pageSize, pageNo, this.$route.params.id).then((response) => {
+        const resultData = response.data.data
+        this.tableData = resultData
+        this.total = response.data.total
+        this.currentPage = response.data.current
+        this.pageSize = response.data.pageSize
+      })
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-pagination{
+  padding-top: 20px;
+  text-align: right;
+}
+</style>

+ 219 - 0
src/views/dw-survey/dw-data/DwSurveyAnswerInfo.vue

@@ -0,0 +1,219 @@
+<template>
+  <div>
+    <el-page-header @back="goBack" content="答卷详情" class="dw-page-header" ></el-page-header>
+    <div class="dw-answer-content">
+      <el-row type="flex" class="row-bg">
+        <el-col :span="16" :push="4">
+          <div style="background: white;">
+            <el-descriptions :column="3" border>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-location-information"></i> 答卷IP
+                </template>
+                {{survey.surveyAnswer.ipAddr}}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-timer"></i>
+                  答卷时间
+                </template>
+                {{survey.surveyAnswer.endAnDate}}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-monitor"></i>
+                  答题数
+                </template>
+                {{survey.surveyAnswer.completeItemNum}}
+              </el-descriptions-item>
+              <el-descriptions-item>
+                <template slot="label">
+                  <i class="el-icon-price-tag"></i> 答卷ID
+                </template>
+                {{survey.surveyAnswer.id}}
+              </el-descriptions-item>
+            </el-descriptions>
+            <div class="dw-answer-title" style="padding-top: 30px;padding-bottom: 0px;">答卷结果信息</div>
+            <div style="padding: 0px 20px 30px 20px;">
+              <dw-survey-answer-qu-common v-bind:key="item.id" v-bind:id="item.id" v-bind:index="index" v-for="(item,index) in survey.questions" v-bind:question="item" ></dw-survey-answer-qu-common>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+<script>
+
+import API from '@/api/index.js'
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import DwSurveyAnswerQuCommon from './DwSurveyAnswerQuCommon'
+import {dwSurveyAnswerInfo} from '@/api/dw-survey'
+
+export default {
+  name: 'DwSurveyAnswerInfo',
+  components: {
+    DwSurveyDcsWrapper,
+    DwSurveyAnswerQuCommon
+  },
+  data () {
+    return {
+      survey: {
+        questions:[],
+      },
+      tableData: [],
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+      radio: 3,
+      formSize: 'medium',
+      rateValue: 3.7,
+      form: {
+        name: '',
+        region: '',
+        date1: '',
+        date2: '',
+        delivery: false,
+        type: [],
+        resource: '',
+        desc: ''
+      },
+      options: [{
+        value: '选项1',
+        label: '黄金糕'
+      }, {
+        value: '选项2',
+        label: '双皮奶'
+      }, {
+        value: '选项3',
+        label: '蚵仔煎'
+      }, {
+        value: '选项4',
+        label: '龙须面'
+      }, {
+        value: '选项5',
+        label: '北京烤鸭'
+      }],
+      value: ''
+    }
+  },
+  mounted () {
+    this.querySurveyAnswer(1)
+  },
+  methods: {
+    goBack () {
+      this.$router.back()
+    },
+    handleInfo (index, row) {
+      console.log(index, row)
+    },
+    handleDelete (index, row) {
+      console.log(index, row)
+    },
+    querySurveyAnswer () {
+      // pageSize?: number;
+      // currentPage?: number;
+      dwSurveyAnswerInfo(this.$route.params.answerId).then((response) => {
+        const resultData = response.data.data
+        this.survey = resultData
+        for (let i=0; i < this.survey.questions.length; i++) {
+          const questionData = this.survey.questions[i]
+          const quType = questionData.quType
+          var quOptionsObj
+          if (quType==="CHECKBOX") {
+            questionData.quTypeName = '多选题'
+            quOptionsObj = questionData.quCheckboxs
+          } else if (quType==="RADIO") {
+            questionData.quTypeName = '单选题'
+            quOptionsObj = questionData.quRadios
+          } else if (quType==="FILLBLANK") {
+            questionData.quTypeName = '填空题'
+          } else if (quType==="SCORE") {
+            questionData.quTypeName = '评分题'
+            quOptionsObj = questionData.quScores
+          } else if (quType==="ORDERQU") {
+            questionData.quTypeName = '排序题'
+            quOptionsObj = questionData.quOrderbys
+          } else if (quType==="MULTIFILLBLANK") {
+            questionData.quTypeName = '多项填空题'
+            quOptionsObj = questionData.quMultiFillblanks
+          } else {
+            questionData.quTypeName = quType
+          }
+          if (quType==="CHECKBOX" || quType==="SCORE" || quType==="ORDERQU" || quType==="MULTIFILLBLANK") {
+            for(let j=0; j < quOptionsObj.length; j++){
+              const item = quOptionsObj[j]
+              if (quType==="CHECKBOX") {
+                const anCheckboxs = questionData.anCheckboxs;
+                for (let k=0; k<anCheckboxs.length; k++){
+                  if(anCheckboxs[k].quItemId===item.id){
+                    item.answer = true
+                    break
+                  }
+                }
+              }else if (quType==="SCORE") {
+                const anScores = questionData.anScores;
+                for (let k=0; k<anScores.length; k++){
+                  if(anScores[k].quRowId===item.id){
+                    if(anScores[k].answserScore!=null){
+                      item.answer = parseInt(anScores[k].answserScore)
+                      break
+                    }
+                  }
+                }
+              }else if (quType==="ORDERQU") {
+                const anOrders = questionData.anOrders;
+                for (let k=0; k<anOrders.length; k++){
+                  if(anOrders[k].quRowId===item.id){
+                    item.answer = anOrders[k].orderyNum
+                    break
+                  }
+                }
+              }else if (quType==="MULTIFILLBLANK") {
+                const anDFillblanks = questionData.anDFillblanks
+                for (let k=0; k<anDFillblanks.length; k++){
+                  if(anDFillblanks[k].quItemId===item.id){
+                    item.answer = anDFillblanks[k].answer
+                    break
+                  }
+                }
+              }
+            }
+          }
+        }
+
+      })
+    },
+    handleCurrentChange: function (val) {
+
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-page-header{
+  padding: 20px;
+  background-color: white;
+}
+.dw-answer-title{
+  font-size: 16px;
+  padding: 10px;
+}
+.dw-answer-content{
+  padding: 20px;
+}
+.margin-top{
+  margin-top: 20px;
+}
+.dw-qu-item{
+  margin-top: 10px;
+}
+.dw-qu-item-title{
+  padding: 20px 0px;
+  color: grey;
+}
+.dw-qu-item-body{
+  margin-left: 10px;
+}
+</style>

+ 132 - 0
src/views/dw-survey/dw-data/DwSurveyAnswerQuCommon.vue

@@ -0,0 +1,132 @@
+<template>
+  <div>
+    <el-form ref="form" :model="form" label-width="80px" label-position="left" >
+      <div class="dw-qu-item">
+        <div class="dw-qu-item-title">
+          <span>{{ index + 1 }}、</span>
+          <span v-html="question.quTitle" ></span>
+          <span>【{{ question.quTypeName }}】</span>
+        </div>
+        <div class="dw-qu-item-body">
+          <div v-if="question.quType === 'RADIO'">
+            <div>
+              <el-radio-group v-model="question.anRadio.quItemId" >
+                <el-radio v-for="(item) in question.quRadios" :key="item.id" :label="item.id" >{{ item.optionName }}</el-radio>
+              </el-radio-group>
+            </div>
+            <div><span>{{ question.anRadio.otherText }}</span></div>
+          </div>
+          <div v-if="question.quType === 'CHECKBOX'">
+            <el-checkbox v-for="(item) in question.quCheckboxs" :key="item.id" :label="item.id" :checked="item.answer" >{{ item.optionName }}</el-checkbox>
+          </div>
+          <div v-if="question.quType === 'FILLBLANK'">
+            <el-row><el-col :span="12"><el-input v-model="question.anFillblank.answer" readonly ></el-input></el-col></el-row>
+          </div>
+          <div v-if="question.quType === 'MULTIFILLBLANK'">
+            <el-form-item v-for="(item,index) in question.quMultiFillblanks" :label="(index+1)+'、'+item.optionName" :key="item.id" >
+              <el-input v-model="item.answer" style="width: 360px;" ></el-input>
+            </el-form-item>
+          </div>
+          <div v-if="question.quType === 'SCORE'">
+            <el-form-item v-for="(item,index) in question.quScores" :label="(index+1)+'、'+item.optionName" :key="item.id" >
+              <el-rate v-model="item.answer" disabled show-score text-color="#ff9900" score-template="{value}"></el-rate>
+            </el-form-item>
+          </div>
+          <div v-if="question.quType === 'ORDERQU'">
+            <el-form-item v-for="(item,index) in question.quOrderbys" :label="(index+1)+'、'+item.optionName" :key="item.id" >
+              <el-input v-model="item.answer" style="width: 360px;" ></el-input>
+            </el-form-item>
+          </div>
+        </div>
+      </div>
+    </el-form>
+  </div>
+</template>
+<script>
+
+export default {
+  name: 'DwSurveyAnswerInfo',
+  props: ['question', 'index'],
+  data () {
+    return {
+      tableData: [],
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+      radio: 3,
+      formSize: 'medium',
+      rateValue: 3.7,
+      form: {
+        name: '',
+        region: '',
+        date1: '',
+        date2: '',
+        delivery: false,
+        type: [],
+        resource: '',
+        desc: ''
+      },
+      options: [{
+        value: '选项1',
+        label: '黄金糕'
+      }, {
+        value: '选项2',
+        label: '双皮奶'
+      }, {
+        value: '选项3',
+        label: '蚵仔煎'
+      }, {
+        value: '选项4',
+        label: '龙须面'
+      }, {
+        value: '选项5',
+        label: '北京烤鸭'
+      }],
+      value: ''
+    }
+  },
+  mounted () {
+  },
+  methods: {
+    goBack () {
+      this.$router.back()
+    },
+    handleInfo (index, row) {
+      console.log(index, row)
+    },
+    handleDelete (index, row) {
+      console.log(index, row)
+    },
+    handleCurrentChange: function (val) {
+      this.queryList(val)
+    }
+  }
+}
+
+</script>
+<style scoped>
+.dw-page-header{
+  padding: 20px;
+  background-color: white;
+}
+.dw-answer-title{
+  font-size: 16px;
+  padding: 10px;
+}
+.dw-answer-content{
+  padding: 20px;
+}
+.margin-top{
+  margin-top: 20px;
+}
+.dw-qu-item{
+  margin-top: 10px;
+}
+.dw-qu-item-title{
+  padding: 20px 0px;
+  color: grey;
+}
+.dw-qu-item-body{
+  margin-left: 10px;
+}
+</style>

+ 119 - 0
src/views/dw-survey/dw-data/DwSurveyCharts.vue

@@ -0,0 +1,119 @@
+<template>
+  <div>
+    <dw-survey-dcs-wrapper :id="id" is-survey-chart="true" >
+      <template v-slot:dw-dcs-main-slot="{survey}" >
+        <div v-loading="loading" >
+          <dw-survey-charts-common :key="item.id" v-for="(item,index) in questions" :id="item.id" :index="index" :question="item" ></dw-survey-charts-common>
+        </div>
+      </template>
+    </dw-survey-dcs-wrapper>
+  </div>
+</template>
+<script>
+
+import DwSurveyDcsWrapper from '@/components/common/DwSurveyDcsWrapper'
+import DwSurveyChartsCommon from './DwsurveyChartsCommon'
+import { msgInfo } from '@/utils/dw-msg'
+import { dwSurveyReport } from '@/api/dw-survey'
+
+export default {
+  name: 'DwSurveyCharts',
+  components: {
+    DwSurveyDcsWrapper,
+    DwSurveyChartsCommon
+  },
+  data () {
+    return {
+      questions: [],
+      loading: true,
+    }
+  },
+  mounted () {
+    this.surveyChartData()
+  },
+  methods: {
+    surveyChartData: function () {
+      dwSurveyReport(this.$route.params.id).then((response) => {
+        const resultData = response.data.data
+        this.questions = resultData.questions
+        if (this.questions.length <= 0) {
+          msgInfo("问卷还没有任何题目")
+          this.loading = false
+        }
+        for (let i=0; i < this.questions.length; i++) {
+          const questionData = this.questions[i]
+          let count = questionData.anCount
+          let quOptionsObj
+          if (questionData.quType === 'CHECKBOX') {
+            questionData.quTypeName = '多选题'
+            quOptionsObj = questionData.quCheckboxs
+          } else if (questionData.quType === 'RADIO') {
+            questionData.quTypeName = '单选题'
+            quOptionsObj = questionData.quRadios
+          } else if (questionData.quType === 'FILLBLANK') {
+            questionData.quTypeName = '填空题'
+          } else if (questionData.quType === 'SCORE') {
+            questionData.quTypeName = '评分题'
+            quOptionsObj = questionData.quScores
+          } else if (questionData.quType === 'ORDERQU') {
+            questionData.quTypeName = '排序题'
+            quOptionsObj = questionData.quOrderbys
+          } else if (questionData.quType === 'MULTIFILLBLANK') {
+            questionData.quTypeName = '多项填空题'
+            quOptionsObj = questionData.quMultiFillblanks
+          } else {
+            questionData.quTypeName = questionData.quType
+          }
+          let quStatOptions = []
+          if (questionData.quType === 'RADIO' || questionData.quType === 'CHECKBOX' || questionData.quType === 'SCORE' || questionData.quType === 'ORDERQU' || questionData.quType === 'MULTIFILLBLANK') {
+            for (let j=0; j < quOptionsObj.length; j++) {
+              let item = quOptionsObj[j]
+              let quStatOption
+              if (questionData.quType === 'RADIO' || questionData.quType === 'CHECKBOX' ) {
+                const anCount = item.anCount
+                if (count === 0) {
+                  count = 1
+                }
+                if (anCount === null) {
+                  quOptionsObj[j].anCount = 0
+                }
+                const bfbFloat = anCount / count * 100
+                const percent = bfbFloat.toFixed(2)
+                quOptionsObj[j].percent = percent
+                quStatOption = { 'optionName': item.optionName, 'anCount': item.anCount, 'percent': percent}
+              } else if (questionData.quType === "SCORE") {
+                const avgScore = item.avgScore
+                const bfbFloat = avgScore/questionData.paramInt02*100
+                const percent = bfbFloat.toFixed(2)
+                // 平均分 setAvgScore
+                const anAvgScore = avgScore.toFixed(2)
+                quStatOption = { 'optionName': item.optionName, 'anCount': anAvgScore, 'percent': percent }
+              } else if (questionData.quType === "ORDERQU") {
+                const bfbFloat = (quOptionsObj.length-j) / ((1+quOptionsObj.length)*quOptionsObj.length/2) * 100
+                const percent = bfbFloat.toFixed(2)
+                quStatOption = { 'optionName': item.optionName, 'anCount': quOptionsObj.length-j, 'orderNum': j+1, 'percent': percent }
+              } else if (questionData.quType === "MULTIFILLBLANK") {
+                const anCount = item.anCount
+                if (count === 0) {
+                  count = 1
+                }
+                if (anCount === null) {
+                  quOptionsObj[j].anCount = 0
+                }
+                const bfbFloat = anCount / count * 100
+                const percent = bfbFloat.toFixed(2)
+                quOptionsObj[j].percent = percent
+                quStatOption = { 'optionName': item.optionName, 'anCount': item.anCount, 'percent': percent }
+              }
+              quStatOptions.push(quStatOption)
+            }
+          }
+          this.questions[i].quStatOptions = quStatOptions
+        }
+        this.loading = false
+      })
+    }
+  }
+}
+
+</script>

+ 232 - 0
src/views/dw-survey/dw-data/DwsurveyChartsCommon.vue

@@ -0,0 +1,232 @@
+<template>
+  <div style="width: 100%;" >
+    <div style="font-size: 16px;font-weight: bold;">
+      <span>{{ index+1 }}、</span>
+      <span v-html="question.quTitle" ></span>
+      <span>【{{ question.quTypeName }}】</span>
+    </div>
+    <div v-if="question.quType === 'FILLBLANK'" style="padding: 30px;">
+      填写回答:{{ question.anCount }} 份
+    </div>
+    <div v-if="question.quType !== 'FILLBLANK'">
+      <el-table
+        :data="question.quStatOptions"
+        style="width: 100%">
+        <el-table-column
+          prop="optionName"
+          label="题目选项">
+        </el-table-column>
+        <el-table-column
+          :label="question.quType === 'SCORE' ? '占总分比例' : question.quType === 'ORDERQU' ? '排名比例' : question.quType === 'MULTIFILLBLANK' ? '填写比例' : '频次比例'"
+          width="330" >
+          <template slot-scope="scope">
+            <el-progress :text-inside="true" :stroke-width="26" :percentage="scope.row.percent"></el-progress>
+          </template>
+        </el-table-column>
+        <el-table-column
+          v-if="question.quType === 'RADIO' || question.quType === 'CHECKBOX' "
+          label="频次"
+          width="130"
+          align="center">
+          <template slot-scope="scope">{{ scope.row.anCount }} 次</template>
+        </el-table-column>
+        <el-table-column
+          v-if="question.quType === 'SCORE'"
+          label="平均分"
+          width="130"
+          align="center">
+          <template slot-scope="scope">平均 {{ scope.row.anCount }} 分</template>
+        </el-table-column>
+        <el-table-column
+          v-if="question.quType === 'ORDERQU'"
+          label="排名"
+          width="130"
+          align="center">
+          <template slot-scope="scope">第 {{ scope.row.orderNum }} 名</template>
+        </el-table-column>
+        <el-table-column
+          v-if="question.quType === 'MULTIFILLBLANK'"
+          label="填写次数"
+          width="130"
+          align="center">
+          <template slot-scope="scope">{{ scope.row.anCount }} 次</template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div v-if="question.quType !=='FILLBLANK'">
+      <el-tabs v-model="activeName" style="width: 100%;" @tab-click="handleClick" >
+        <el-tab-pane label="柱状图" name="bar">
+          <div class="dwsurveyMain" style="width: 100%;height:400px;" ></div>
+        </el-tab-pane>
+        <el-tab-pane label="拆线图" name="line">
+          <div class="dwsurveyMain" style="width: 100%;height:400px;" ></div>
+        </el-tab-pane>
+        <el-tab-pane label="拼状图" name="pie">
+          <div class="dwsurveyMain" style="width: 100%;height:400px;" ></div>
+        </el-tab-pane>
+        <el-tab-pane label="条形图" name="barY">
+          <div class="dwsurveyMain" style="width: 100%;height:400px;" ></div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+
+<script>
+
+import * as echarts from 'echarts/core'
+import { GridComponent, TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components'
+import { LineChart, BarChart, PieChart } from 'echarts/charts'
+import { UniversalTransition, LabelLayout } from 'echarts/features'
+import { CanvasRenderer } from 'echarts/renderers'
+
+echarts.use([GridComponent, LineChart, BarChart, CanvasRenderer, UniversalTransition, TitleComponent,
+  TooltipComponent,
+  LegendComponent,
+  PieChart,
+  LabelLayout])
+
+export default {
+  name: 'DwsurveyChartsCommon',
+  props: ['question', 'index'],
+  data () {
+    return {
+      activeName: 'bar'
+    }
+  },
+  mounted () {
+    console.debug('this.question')
+    console.debug(this.question)
+    // document.getElementsByClassName('dwsurveyMainBar')
+    // this.loadChart('dwsurveyMainBar', 'bar')
+    const questionObj = document.getElementById(this.question.id)
+    const dwsurveyMains = questionObj.getElementsByClassName('dwsurveyMain')
+    this.loadChart(dwsurveyMains[0], 'bar')
+  },
+  methods: {
+    handleClick: function (tab, event) {
+      console.log(tab, event)
+      console.debug(this.activeName)
+      tab.$el.style.display = 'block'
+      const dwsurveyMain = tab.$el.getElementsByClassName('dwsurveyMain')
+      const curChartType = this.activeName
+      // 构建option data, xAxisData
+      this.loadChart(dwsurveyMain[0], curChartType)
+    },
+    loadChart: function (chartDom, type) {
+      const myChart = echarts.init(chartDom)
+      const option = this.buildOption(this.question, type)
+      option && myChart.setOption(option)
+    },
+    buildOption: function (questionData, type) {
+      const items = []
+      const itemValues = []
+      const itemNameValues = []
+      const quStatOptions = questionData.quStatOptions
+      for (let i=0; i< quStatOptions.length; i++) {
+        items.push(quStatOptions[i].optionName)
+        itemValues.push(quStatOptions[i].anCount)
+        itemNameValues.push({ 'value': quStatOptions[i].anCount, 'name': quStatOptions[i].optionName })
+      }
+      console.debug(items)
+      let yAxisShow = true
+      if (questionData.quType === 'ORDERQU') {
+        yAxisShow = false
+      }
+      let option
+      if (type === 'line' || type === 'bar') {
+        option = {
+          xAxis: {
+            nameTextStyle: {
+
+            },
+            nameGap: 20,
+            axisLabel: {
+              rotate: -10,
+              interval: 0
+            },
+            type: 'category',
+            // data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
+            data: items
+          },
+          yAxis: {
+            type: 'value',
+            show: yAxisShow
+          },
+          series: [
+            {
+              // data: [150, 230, 224, 218, 135, 147, 260],
+              data: itemValues,
+              type: type
+            }
+          ]
+        }
+      } else if (type === 'barY') {
+        option = {
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'shadow'
+            }
+          },
+          legend: {},
+          grid: {
+            left: '3%',
+            right: '4%',
+            bottom: '3%',
+            containLabel: true
+          },
+          xAxis: {
+            type: 'value',
+            boundaryGap: [0, 0.01],
+            show: yAxisShow
+          },
+          yAxis: {
+            type: 'category',
+            // data: ['Brazil', 'Indonesia', 'USA', 'India', 'China', 'World']
+            data: items
+          },
+          series: [
+            {
+              type: 'bar',
+              // data: [18203, 23489, 29034, 104970, 131744, 630230]
+              data: itemValues
+            }
+          ]
+        }
+      } else if (type === 'pie') {
+        option = {
+          tooltip: {
+            trigger: 'item'
+          },
+          legend: {
+            orient: 'vertical',
+            left: 'left'
+          },
+          series: [
+            {
+              name: 'Access From',
+              type: 'pie',
+              radius: '50%',
+              data: itemNameValues,
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+              }
+            }
+          ]
+        }
+      }
+      return option
+    }
+  }
+}
+
+</script>
+
+<style scoped>
+
+</style>

+ 71 - 0
src/views/dw-user/DwUser.vue

@@ -0,0 +1,71 @@
+<template>
+  <div>
+    <el-row>
+      <el-col :span="20" :offset="2">
+        <div class="dw-user-body">
+          <el-row>
+            <el-col :span="4" style="height: 600px;">
+              <dw-user-menu></dw-user-menu>
+            </el-col>
+            <el-col :span="20">
+              <div style="padding: 30px;">
+                <el-descriptions title="账号信息" column="1" border >
+                  <el-descriptions-item label="账号">{{ userInfo.loginName }}</el-descriptions-item>
+                  <el-descriptions-item label="状态">
+                    <el-tag
+                      v-if="userInfo.status === 0"
+                      type="danger" >不可用</el-tag>
+                    <el-tag
+                      v-else-if="userInfo.status === 1"
+                      type="info" >未激活</el-tag>
+                    <el-tag
+                      v-else-if="userInfo.status === 2"
+                      type="success" >激活</el-tag>
+                    <el-tag v-else disable-transitions style="margin-left: 10px" >未知</el-tag>
+                  </el-descriptions-item>
+                  <el-descriptions-item label="创建时间">{{ userInfo.createTime }}</el-descriptions-item>
+                  <el-descriptions-item label="登录时间">{{ userInfo.lastLoginTime }}</el-descriptions-item>
+                </el-descriptions>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+
+import DwUserMenu from './DwUserMenu'
+import { dwUserInfo } from '../../api/dw-user'
+export default {
+  name: 'DwUser',
+  components: {
+    DwUserMenu
+  },
+  data () {
+    return {
+      userInfo: {}
+    }
+  },
+  mounted () {
+    this.getUserInfo()
+  },
+  methods: {
+    getUserInfo () {
+      dwUserInfo().then((response) => {
+        const resultData = response.data.data
+        this.userInfo = resultData
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-user-body{
+  background-color: white;
+  min-height: 600px;
+}
+</style>

+ 44 - 0
src/views/dw-user/DwUserMenu.vue

@@ -0,0 +1,44 @@
+<template>
+  <el-menu
+    :default-active="defActive"
+    class="el-menu-vertical-demo"
+    style="height: 600px;"
+    router
+  >
+    <el-menu-item index="/dw/user" >
+      <i class="el-icon-user"></i>
+      <span slot="title">我的账号</span>
+    </el-menu-item>
+    <el-menu-item index="/dw/user/pwd">
+      <i class="el-icon-key"></i>
+      <span slot="title">修改密码</span>
+    </el-menu-item>
+  </el-menu>
+</template>
+
+<script>
+export default {
+  name: 'DwUserMenu',
+  data () {
+    return {
+      defActive: '/dw/user'
+    }
+  },
+  mounted () {
+    this.setDefActive()
+  },
+  methods: {
+    setDefActive: function(){
+      const fullPath = this.$route.fullPath
+      if(fullPath.indexOf('/dw/user/pwd')>=0){
+        this.defActive = '/dw/user/pwd'
+      }
+
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 117 - 0
src/views/dw-user/DwUserPwd.vue

@@ -0,0 +1,117 @@
+<template>
+  <div>
+    <el-row>
+      <el-col :span="20" :offset="2">
+        <div class="dw-user-body">
+          <el-row>
+            <el-col :span="4" style="height: 600px;">
+              <dw-user-menu></dw-user-menu>
+            </el-col>
+            <el-col :span="20">
+              <div style="padding: 30px;width: 400px;">
+                <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" label-position="top">
+                  <el-form-item label="原密码" prop="age">
+                    <el-input v-model="ruleForm.oldPass" autocomplete="off" show-password></el-input>
+                  </el-form-item>
+                  <el-form-item label="密码" prop="pass">
+                    <el-input v-model="ruleForm.pass" autocomplete="off" show-password></el-input>
+                  </el-form-item>
+                  <el-form-item label="确认密码" prop="checkPass">
+                    <el-input v-model="ruleForm.checkPass" autocomplete="off" show-password></el-input>
+                  </el-form-item>
+                  <el-form-item style="padding-top: 20px;">
+                    <el-button type="primary" @click="submitForm('ruleForm')">提交修改</el-button>
+                    <el-button @click="resetForm('ruleForm')">重置</el-button>
+                  </el-form-item>
+                </el-form>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+
+import DwUserMenu from './DwUserMenu'
+import {dwUserPwd} from '../../api/dw-user'
+export default {
+  name: 'DwUserPwd',
+  components: {
+    DwUserMenu
+  },
+  data() {
+    var validatePass = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('请输入密码'));
+      } else {
+        if (this.ruleForm.checkPass !== '') {
+          this.$refs.ruleForm.validateField('checkPass');
+        }
+        callback();
+      }
+    };
+    var validatePass2 = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('请再次输入密码'));
+      } else if (value !== this.ruleForm.pass) {
+        callback(new Error('两次输入密码不一致!'));
+      } else {
+        callback();
+      }
+    };
+    return {
+      ruleForm: {
+        pass: '',
+        checkPass: '',
+        oldPass: ''
+      },
+      rules: {
+        pass: [
+          { validator: validatePass, trigger: 'blur' }
+        ],
+        checkPass: [
+          { validator: validatePass2, trigger: 'blur' }
+        ],
+        oldPass: [
+          { required: true, message: '请输入原登录密码', trigger: 'blur' },
+        ]
+      }
+    };
+  },
+  mounted () {
+
+  },
+  methods: {
+    submitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          dwUserPwd(this.ruleForm.oldPass,this.ruleForm.pass).then((response) => {
+            const httpResult = response.data
+            if(httpResult.resultCode === 200 ){
+              this.$message.success('密码修改成功')
+            }else{
+              this.$message.error('密码修改失败')
+            }
+          })
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dw-user-body{
+  background-color: white;
+  min-height: 600px;
+}
+</style>

+ 0 - 0
static/.gitkeep


+ 427 - 0
static/diaowen/answer-m.html

@@ -0,0 +1,427 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
+<title>答卷</title>
+  <link rel="stylesheet" type="text/css" href="js/plugs/jquery.mobile-1.4.5/jquery.mobile-1.4.5.min.css">
+  <link rel="stylesheet" type="text/css" href="js/plugs/jquery-ui-1.10.3.custom/css/mycss/jquery-ui-1.10.3.custom.css" />
+  <link rel="stylesheet" type="text/css" href="js/plugs/font-awesome-4.2.0/css/font-awesome.css" >
+  <link rel="stylesheet" type="text/css" href="js/plugs/validate/jquery.validate.css" />
+  <link rel="stylesheet" type="text/css" href="css/survey-common.css" />
+  <link rel="stylesheet" type="text/css" href="css/answer-m.css" />
+  <script type="text/javascript" src="js/plugs/jquery-ui-1.10.3.custom/js/jquery-1.10.1.js"></script>
+  <script type="text/javascript" src="js/plugs/jquery-ui-1.10.3.custom/js/jquery-ui-1.10.3.custom.js"></script>
+  <script type="text/javascript" src="js/plugs/laydate/laydate.js"></script>
+  <script type="text/javascript" src="js/common/ans-common.js"></script>
+  <script type="text/javascript" src="js/common/common.js"></script>
+  <script type="text/javascript" src="js/dw/an/ans-m-data.js"></script>
+  <script type="text/javascript" src="js/dw/an/ans-m.js"></script>
+<script type="text/javascript">
+  $(document).click(function(){
+    $(".tabbarDialog",parent.document).hide();
+    $(".js-tabselected",parent.document).removeClass("js-tabselected");
+  });
+</script>
+</head>
+<body>
+<div>
+  <div id="resultProgressRoot">
+    <div class="progress-label">完成度:0%</div>
+    <div id="resultProgress" class="progressbarDiv"></div>
+  </div>
+</div>
+<div id="diaowen-m-body">
+  <div id="preview_head_top" style='text-align: center;background: #aaa;padding: 10px;color: #f3f3f3;'>当前为预览模式</div>
+  <input type="hidden" id="id" name="id" value="">
+  <input type="hidden" id="sid" name="sid" value="">
+  <input type="hidden" id="ctxApp" name="ctx" value="/api/dwsurvey/app">
+  <input type="hidden" id="ctx" name="ctx" value="/api/dwsurvey/anon">
+  <input type="hidden" id="prevHost" value="http://ent.surveyform.cn/">
+  <input type="hidden" id="tag" name="tag" value="${tag }">
+  <input type="hidden" id="anClient" name="anClient" value="m">
+  <input type="hidden" id="laydatetag" name="laydatetag" value="laydatetag">
+  <input type="hidden" id="answerLoadTag" name="answerLoadTag" value="0">
+  <input type="hidden" id="breakpoint1" name="breakpoint1" value="0">
+  <form id="surveyForm" action="/api/dwsurvey/anon/response/saveMobile.do" method="post" data-ajax="false">
+    <input type="hidden" id="surveyId" name="surveyId" value="${survey.id }">
+    <input type="hidden" id="ruleCode" name="ruleCode" value="">
+    <input type="hidden" id="surveyLogId" name="surveyLogId" value="${survey.surveyLogId }">
+    <input type="hidden" name="form-from" value="mobile" >
+    <input type="hidden" id="wxCode" name="wxCode" value="">
+    <div id="dw_body_content">
+    <div id="diaowen-m-content" class="diaowen-m-content" >
+      <div id="dwSurveyHeader" >
+
+        <div id="answer-m-head" style="text-align: center;margin: 0px 16px;">
+          <div id="dwSurveyTitle" class="noLogoImg" style="padding-top: 5px;">
+            <div id="dwSurveyName" class="dwSvyName" >加载中</div>
+          </div>
+          <div id="dwSurveyNote" style="text-align: left;">
+            <div id="dwSurveyNoteEdit"  style="font-weight: normal;line-height: 20px;">加载中</div>
+          </div>
+        </div>
+      </div>
+      <div id="m-errorMsg"></div>
+      <div  id="dwSurveyQuContent" >
+        <div>
+          <div id="dwSurveyQuContentBg">
+            <ul id="dwSurveyQuContentAppUl">
+
+            </ul>
+          </div>
+        </div>
+      </div>
+    </div>
+    </div>
+  </form>
+  <div class="dw-footer" >
+    <div><a href="http://diaowen.net/index-m.jsp" style="text-decoration: none;" rel="external" title="开源的调查问卷系统" >调问网&nbsp;DWSurvey&nbsp;</a>提供技术支持</div>
+  </div>
+</div>
+<div id="fixedMsg" style="position: fixed;top: 0px;width: 100%;padding: 10px;text-align: center;font-size: 18px;letter-spacing: 4px;line-height: 56px;background-color: #111;background-color: rgba(17,17,17,0.5);color: #fff;color: rgba(255,255,255,0.5);z-index: 200;display: none;"></div>
+<div style="display: none;">
+  <div>
+    <ul id="radioQuModel" >
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="RADIO" >
+            <input type="hidden" class="quId" value="${en.id }"  >
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="hv" value="">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase"></div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div>
+                <legend class="quCoTitle" >
+                  <span class="quTitleNum">${i.count }、</span>
+                  <span class="quTitleText">${en.quTitle}</span>
+                </legend>
+                <div class="quCoItem" ></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="checkboxQuModel" >
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="CHECKBOX">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <input type="hidden" class="paramInt01" value="${en.paramInt01 }">
+            <input type="hidden" class="paramInt02" value="${en.paramInt02 }">
+            <div class="quLogicInputCase"></div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="tag_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div>
+                <legend class="quCoTitle" >
+                  <span class="quTitleNum">${i.count }、</span>
+                  <span class="quTitleText">${en.quTitle}</span>
+                </legend>
+                <div class="quCoItem" ></div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="fillblankQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="FILLBLANK">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="checkType" value="${en.checkType }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <input type="hidden" class="paramInt01" value="${en.paramInt01}" >
+            <div class="quLogicInputCase"></div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent" >
+              <legend class="quCoTitle" >
+                <span class="quTitleNum">${i.count }、</span>
+                <span class="quTitleText">${en.quTitle}</span>
+              </legend>
+              <div class="quCoItem" style="margin-top: 5px;"></div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="scoreQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="SCORE">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase"></div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="item_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <legend class="quCoTitle" >
+                <span class="quTitleNum">${i.count }、</span>
+                <span class="quTitleText">${en.quTitle}</span>
+              </legend>
+              <div class="quCoItem"></div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>>
+    <ul id="orderQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="ORDERQU">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+            </div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="item_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div>
+                <legend class="quCoTitle" >
+                  <span class="quTitleNum">${i.count }、</span>
+                  <span class="quTitleText">${en.quTitle}</span>
+                </legend>
+                <div class="quCoItem">
+                  <div class="ui-controlgroup-controls "></div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>>
+    <ul id="pageQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="PAGETAG">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase"></div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="pageBorderTop nohover" style="display: none;" ></div>
+            <div class="surveyQuItemContent" style="padding: 0px;min-height: 30px;text-align: center;">
+              <!-- <div class="pageQuContent">下一页(1/2)</div> -->
+              <a href="#" class="sbtn24 sbtn24_0 nextPage_a" >下一页</a>&nbsp;&nbsp;
+              <input type="hidden" name="prevPageNo" value="${pageNo-1 }">
+              <input type="hidden" name="nextPageNo" value="${pageNo }">
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="paragraphQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="PARAGRAPH">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase"></div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent"  style="min-height: 20px;">
+              <div class="quCoTitle">
+                <div class="quCoTitleEdit quTitleText" >${en.quTitle}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="mfillblankQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="MULTIFILLBLANK">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+<!--            <input type="hidden" class="answerTag" value="0" >-->
+            <div class="quLogicInputCase"></div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="text_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <legend class="quCoTitle" >
+                <span class="quTitleNum">${i.count }、</span>
+                <span class="quTitleText">${en.quTitle}</span>
+              </legend>
+              <div class="quCoItem"></div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+    <ul id="dwSubmitModel">
+      <li class="li_surveyQuItemBody surveySubmitBody" style="padding-top:20px;"  >
+        <div class="surveyQuItemBody">
+          <div class="surveyQuItem">
+            <div id="jcaptchaImgBody" class="r-qu-body" style="display: none;">
+              <div class="frmItem" >
+                <label class="frm_label">验证码</label>
+                <div class="frm_controls" style="padding-bottom: 10px;">
+											<span class="auth-code" id="verifycodeImgArea">
+											<input name="jcaptchaInput" type="text" class="jcaptchaInput" autocomplete="off" >
+											<img id="register-jcaptchaImg" onclick="refreshAutoCode('register-jcaptchaImg')" src="/api/dwsurvey/anon/jcap/jcaptcha.do" alt="验证码" ></span>
+                  <a href="javascript:refreshAutoCode('register-jcaptchaImg');" style="margin-left: 5px;" hidefocus="true">换一张</a>
+                  <span class="frm_desc">验证码,区分大小写</span>
+                  <p class="valid-msg fail" style="display: none;"><i>●</i><span class="msg_content">验证码错误,请重新输入</span></p>
+                </div>
+              </div>
+              <div class="errorItem" style="display: none;"><label class="error">验证码错误,请重新输入!</label></div>
+            </div>
+            <input type="hidden" class="quType" value="submitSurveyBtn">
+            <div class="surveyQuItemContent" style="margin-bottom: 0px;min-height:20px;">
+              <input type="button" class="submitSurvey" id="submitSurvey" value="提交" data-theme="b" />
+              <input type="hidden" name="prevPageNo" value="${pageNo-1 }">
+              <input type="hidden" name="nextPageNo" value="${pageNo }">
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+  </div>
+  <div id="quLogicItemModel">
+    <div class="quLogicItem">
+      <input type="hidden" class="cgQuItemId" value="${quLogicEn.cgQuItemId }"/>
+      <input type="hidden" class="skQuId" value="${quLogicEn.skQuId }"/>
+      <input type="hidden" class="logicId" value="${quLogicEn.id }"/>
+      <input type="hidden" class="geLe" value="${quLogicEn.geLe }"/>
+      <input type="hidden" class="scoreNum" value="${quLogicEn.scoreNum }"/>
+      <input type="hidden" class="logicType" value="${quLogicEn.logicType }"/>
+    </div>
+  </div>
+  <ul id="quRadioItem_default">
+    <li class="quCoItemUlLi">
+    <div class="dwQuOptionItemContent">
+      <label class="dwRedioStyle dwQuInputLabel" ></label>
+      <input id="qu_${en.quType }_${en.id }_${item.id}" type="radio" name="qu_${en.quType }_${en.id }" value="${item.id }">
+      <label class="editAble" >${item.optionName }</label>
+      <input type='text' class='inputSytle_1 dwQuOptionItemNote'  style="display: none;"   name="text_qu_${en.quType }_${en.id }_${item.id }"  />
+      <div class="quItemInputCase">
+        <input type="hidden" class="isNote" value="${item.isNote }">
+        <input type="hidden" class="checkType" value="${item.checkType }">
+        <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+      </div>
+    </div>
+    </li>
+  </ul>
+  <div id="radioSelect_content" >
+    <div class="quCoItem radioSelect_coitem">
+      <ul>
+        <li class="quCoItemUlLi">
+          <div class="radioSelectSet">
+            <select class="radioSelect"  name="qu_${en.quType }_${en.id }" >
+              <option value="0">--请选择--</option>
+            </select>
+          </div>
+        </li>
+      </ul>
+    </div>
+  </div>
+  <div id="radioSelectOption">
+    <div class="quItemInputCase" itemid="${item.id }">
+      <input type="hidden" class="isNote" value="${item.isNote }">
+      <input type="hidden" class="checkType" value="${item.checkType }">
+      <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+    </div>
+    <div><input type='text' class='inputSytle_1 dwQuOptionItemNote'  style="display: none;"   name="text_qu_${en.quType }_${en.id }_${item.id }"  /></div>
+  </div>
+  <ul id="quCheckboxItem_default">
+    <li class="quCoItemUlLi">
+      <div class="dwQuOptionItemContent">
+        <label class="dwCheckboxStyle dwQuInputLabel" ></label>
+        <input id="tag_qu_${en.quType }_${en.id }_${item.id }" type="checkbox" name="tag_qu_${en.quType }_${en.id }_${item.id }"  value="${item.id }" >
+        <label class="editAble" >${item.optionName }</label>
+        <input type='text' class='inputSytle_1 dwQuOptionItemNote' name="text_tag_qu_${en.quType }_${en.id }_${item.id }" style="display: none;" />
+        <div class="quItemInputCase">
+          <input type="hidden" class="isNote" value="${item.isNote }">
+          <input type="hidden" class="checkType" value="${item.checkType }">
+          <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+        </div>
+      </div>
+    </li>
+  </ul>
+  <div id="quScoreItemModel">
+      <div class="scoreRow quScoreOptionTr quOptionItemRow">
+        <input class="dwScoreOptionId" value="${item.id }" disabled="disabled" type="hidden"/>
+        <input type="hidden" class="answerTag" value="0" >
+        <div class="dwsurvey-controlgroup starRating" >
+          <div class="starOptionTitle" ><label class="editAble">${item.optionName }</label></div>
+          <div class="starOptionContent" >  </div>
+        </div>
+        <input name="item_qu_${en.quType }_${en.id }_${item.id }" value=""  type="hidden" class="scoreNumInput" >
+      </div>
+  </div>
+  <div id="quOrderItemLeftModel">
+    <div class="ui-checkbox m_clickQuOrderItem">
+      <label class="ui-btn ui-corner-all ui-btn-inherit itemOptionname editAble"  style="text-align: left;" >${item.optionName }</label>
+      <div class="m_orderby_num">0</div>
+      <div style="display: none;">
+        <input  name="item_qu_${en.quType }_${en.id }_${item.id }"  value="0" type="hidden" class="quOrderItemHidInput" >
+      </div>
+    </div>
+  </div>
+  <div id="mFillblankTableModel" >
+      <div class="mFillblankTableTr">
+        <label  class="editAble" >${item.optionName }</label>
+        <input id="text_qu_${en.quType }_${en.id }_${item.id }" name="text_qu_${en.quType }_${en.id }_${item.id }"  type="text" class="dwMFillblankInput inputSytle_1 " >
+        <input class="dwMFillblankOptionId" value="${item.id }" disabled="disabled" type="hidden"/>
+        <input type="hidden" class="answerTag" value="0" >
+      </div>
+  </div>
+</div>
+<script type="text/javascript">
+	var bfbFloat=0;
+	$("#resultProgress").progressbar({value: bfbFloat,orientation: "vertical"});
+var errorcode="${param['errorcode']}";
+if(errorcode=="3"){
+	var errorHtml="<div class=\"errorItem\" style=\"padding-left:30px;padding-top:10px;\" ><label for=\"\" class=\"error\">验证码不正确,请重新回答!</label></div>";
+	$("#m-errorMsg").append(errorHtml);
+}
+</script>
+</body>
+</html>

+ 495 - 0
static/diaowen/answer-p.html

@@ -0,0 +1,495 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
+<html>
+<head>
+  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  <title></title>
+  <link href="js/plugs/jquery-ui-1.10.3.custom/css/mycss/jquery-ui-1.10.3.custom.css" rel="stylesheet" type="text/css" />
+  <link rel="stylesheet" type="text/css" href="css/preview-dev.css" />
+  <link rel="stylesheet" type="text/css" href="js/plugs/colpick-jQuery/css/colpick.css" />
+  <link rel="stylesheet" type="text/css" href="js/plugs/validate/jquery.validate.css"/>
+  <link rel="stylesheet" type="text/css" href="css/survey-common.css" />
+  <link rel="stylesheet" type="text/css" href="css/answer-p.css" />
+  <script type="text/javascript" src="js/plugs/jquery-ui-1.10.3.custom/js/jquery-1.10.1.js"></script>
+  <script type="text/javascript" src="js/plugs/jquery-ui-1.10.3.custom/js/jquery-ui-1.10.3.custom.js"></script>
+  <script type="text/javascript" src="js/plugs/colpick-jQuery/js/colpick.js"></script>
+  <script type="text/javascript" src="js/plugs/laydate/laydate.js"></script>
+  <script type="text/javascript" src="js/common/ans-common.js"></script>
+  <script type="text/javascript" src="js/common/common.js"></script>
+  <script type="text/javascript" src="js/dw/an/ans-p-data.js"></script>
+  <script type="text/javascript" src="js/dw/an/ans-p.js"></script>
+  <script type="text/javascript">
+    $(document).click(function(){
+      $(".tabbarDialog",parent.document).hide();
+      $(".js-tabselected",parent.document).removeClass("js-tabselected");
+    });
+  </script>
+</head>
+<body>
+<div id="wrap">
+  <div id="preview_head_top" style='text-align: center;background: #aaa;padding: 10px;color: #f3f3f3;display: none;'>当前为预览模式</div>
+  <input type="hidden" id="id" name="id" value="">
+  <input type="hidden" id="sid" name="sid" value="${survey.sid }">
+  <input type="hidden" id="ctxApp" name="ctx" value="/api/dwsurvey/app">
+  <input type="hidden" id="ctx" name="ctx" value="/api/dwsurvey/anon">
+  <input type="hidden" id="prevHost" value="http://ent.surveyform.cn/">
+  <input type="hidden" id="tag" name="tag" value="${tag }">
+  <input type="hidden" id="laydatetag" name="laydatetag" value="laydatetag">
+  <input type="hidden" id="anClient" name="anClient" value="p">
+  <input type="hidden" id="answerLoadTag" name="answerLoadTag" value="0">
+  <input type="hidden" id="breakpoint1" name="breakpoint1" value="0">
+  <form id="surveyForm" action="/api/dwsurvey/anon/response/save.do" method="post" >
+    <input type="hidden" id="surveyId" name="surveyId" value="${survey.id }">
+    <input type="hidden" id="ruleCode" name="ruleCode" value="">
+    <input type="hidden" id="surveyLogId" name="surveyLogId" value="${survey.surveyLogId }">
+    <div id="dw_body" style="padding-top:10px;">
+      <div id="dw_body_content">
+        <div id="dwSurveyHeader">
+
+          <div id="dwSurveyTitle" class="noLogoImg">
+            <div id="dwSurveyName" class="editAble dwSvyName">加载中</div>
+          </div>
+          <div id="dwSurveyNote">
+            <div id="dwSurveyNoteTools">参考样例</div>
+            <div id="dwSurveyNoteEdit"  class="editAble">加载中</div>
+          </div>
+        </div>
+
+        <div id="dwSurveyQuContent" style="min-height: 300px;">
+          <div id="dwSurveyQuContentBg">
+            <!-- <div style="border-top: 3px solid #81AB00;margin:0px auto;padding-bottom: 15px;"></div> -->
+            <ul id="dwSurveyQuContentAppUl">
+              <!-- 题目内容 -->
+
+
+
+
+            </ul>
+          </div>
+        </div>
+        <div id="resultProgressRoot">
+          <div class="progress-label">完成度:0%</div>
+          <div id="resultProgress" class="progressbarDiv"></div>
+        </div>
+
+      </div>
+    </div>
+  </form>
+
+</div>
+
+<div style="display: none;">
+
+  <div>
+    <ul id="radioQuModel" >
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="RADIO" >
+            <input type="hidden" class="quId" value="${en.id }"  >
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="hv" value="">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+
+            </div>
+          </div>
+          <div class="surveyQuItem">
+
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem">
+
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="checkboxQuModel" >
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="CHECKBOX">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <input type="hidden" class="paramInt01" value="${en.paramInt01 }">
+            <input type="hidden" class="paramInt02" value="${en.paramInt02 }">
+            <div class="quLogicInputCase">
+
+            </div>
+            <input type="hidden" class="checkbox_input_tag" name="qu_${en.quType }_${en.id }" value="tag_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem">
+
+              </div>
+
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="fillblankQuModel">
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="FILLBLANK">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="checkType" value="${en.checkType }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <input type="hidden" class="paramInt01" value="${en.paramInt01}" >
+            <div class="quLogicInputCase">
+
+            </div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem"><ul>
+                <li class="quCoItemUlLi">
+                  <div class="quFillblankItem">
+
+                  </div>
+                </li>
+              </ul>
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="scoreQuModel">
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="SCORE">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+
+            </div>
+            <input type="hidden" class="hidden_input_tag"  name="qu_${en.quType }_${en.id }" value="item_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem">
+                <table class="quCoItemTable" cellpadding="0" cellspacing="0">
+
+                </table>
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>>
+
+    <ul id="orderQuModel">
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="ORDERQU">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="answerTag" value="0" >
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+
+            </div>
+            <div class="quItemInputCase">
+
+            </div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="item_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem quOrderByCoItem">
+                <div class="quOrderByRight">
+                  <table class="quOrderByTable" style="padding:5px;">
+
+                  </table>
+                </div>
+                <div  class="quOrderByLeft">
+                  <ul class="quOrderByLeftUl">
+
+                  </ul>
+                </div>
+                <div style="clear: both;"></div>
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>>
+
+    <ul id="pageQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="PAGETAG">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+
+            </div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="pageBorderTop nohover"  ></div>
+            <div class="surveyQuItemContent" style="padding-top:12px; height:30px;min-height: 30px;">
+              <a href="#" class="sbtn24 sbtn24_0 nextPage_a" >下一页</a>&nbsp;&nbsp;
+              <input type="hidden" name="nextPageNo" value="${pageNo }">
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="paragraphQuModel">
+      <li class="li_surveyQuItemBody"  >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="PARAGRAPH">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="quLogicInputCase">
+
+            </div>
+          </div>
+          <div class="surveyQuItem">
+            <div class="surveyQuItemContent" style="min-height: 35px;">
+              <div class="quCoTitle" style="background: rgb(243, 247, 247);">
+                <div class="editAble quCoTitleEdit" style="padding-left: 15px;">${en.quTitle}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="mfillblankQuModel">
+      <li class="li_surveyQuItemBody" >
+        <div class="surveyQuItemBody">
+          <div class="initLine"></div>
+          <div class="quInputCase" style="display: none;">
+            <input type="hidden" class="quType" value="MULTIFILLBLANK">
+            <input type="hidden" class="quId" value="${en.id }">
+            <input type="hidden" class="orderById" value="${en.orderById }"/>
+            <input type="hidden" class="isRequired" value="${en.isRequired }">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <!--            <input type="hidden" class="answerTag" value="0" >-->
+            <div class="quLogicInputCase">
+
+            </div>
+            <input type="hidden" class="hidden_input_tag" name="qu_${en.quType }_${en.id }" value="text_qu_${en.quType }_${en.id }_" />
+          </div>
+          <div class="surveyQuItem">
+
+            <div class="surveyQuItemContent">
+              <div class="quCoTitle">
+                <div class="quCoNum">${i.count }、</div>
+                <div class="editAble quCoTitleEdit" >${en.quTitle}</div>
+              </div>
+              <div class="quCoItem">
+                <table class="mFillblankTable" cellpadding="0" cellspacing="0">
+
+                </table>
+
+              </div>
+            </div>
+
+          </div>
+        </div>
+      </li>
+    </ul>
+
+    <ul id="dwSubmitModel">
+      <li class="li_surveyQuItemBody surveySubmitBody" >
+        <div class="surveyQuItemBody">
+          <div class="surveyQuItem">
+            <div id="jcaptchaImgBody" class="r-qu-body" style="display: none;">
+              <div class="frmItem" >
+                <label class="frm_label">验证码</label>
+                <div class="frm_controls">
+											<span class="auth-code" id="verifycodeImgArea">
+											<input name="jcaptchaInput" type="text" class="" style="width:100px;" autocomplete="off">
+											<img id="register-jcaptchaImg" onclick="refreshAutoCode('register-jcaptchaImg')" src="/api/dwsurvey/anon/jcap/jcaptcha.do" alt="验证码" height="40"></span>
+                  <a href="javascript:refreshAutoCode('register-jcaptchaImg');" style="margin-left: 5px;" hidefocus="true">换一张</a>
+                  <span class="frm_desc">输入下面图片的字符,区分大小写</span>
+                  <p class="valid-msg fail" style="display: none;"><i>●</i><span class="msg_content">验证码错误,请重新输入</span></p>
+                </div>
+              </div>
+              <div class="errorItem" style="display: none;"><label class="error">验证码错误,请重新输入!</label></div>
+            </div>
+            <input type="hidden" class="quType" value="submitSurveyBtn">
+            <input type="hidden" class="pageNo" value="${pageNo}" >
+            <div class="surveyQuItemContent" style="padding: 12px 0px;height: 30px;min-height: 30px;">
+              <a href="#" id="submitSurvey" class="sbtn24 sbtn24_0 submitSurvey" >提&nbsp;交</a>&nbsp;&nbsp;
+              <input type="hidden" name="prevPageNo" value="${pageNo-1 }">
+              <input type="hidden" name="nextPageNo" value="${pageNo }">
+            </div>
+          </div>
+        </div>
+      </li>
+    </ul>
+
+  </div>
+
+  <div id="quLogicItemModel">
+    <div class="quLogicItem">
+      <input type="hidden" class="cgQuItemId" value="${quLogicEn.cgQuItemId }"/>
+      <input type="hidden" class="skQuId" value="${quLogicEn.skQuId }"/>
+      <input type="hidden" class="logicId" value="${quLogicEn.id }"/>
+      <input type="hidden" class="geLe" value="${quLogicEn.geLe }"/>
+      <input type="hidden" class="scoreNum" value="${quLogicEn.scoreNum }"/>
+      <input type="hidden" class="logicType" value="${quLogicEn.logicType }"/>
+    </div>
+  </div>
+
+  <ul id="quRadioItem_default">
+    <li class="quCoItemUlLi">
+      <div class="dwQuOptionItemContent">
+        <label class="dwRedioStyle dwQuInputLabel" ></label>
+        <input type="radio" name="qu_${en.quType }_${en.id }" value="${item.id }" ><label class="editAble quCoOptionEdit quCoOptionPadding">${item.optionName }</label>
+        <input type='text' class='inputSytle_1 dwQuOptionItemNote'  style="width:200px;padding:5px;display: none;"   name="text_qu_${en.quType }_${en.id }_${item.id }"  />
+        <div class="quItemInputCase">
+          <input type="hidden" class="isNote" value="${item.isNote }">
+          <input type="hidden" class="checkType" value="${item.checkType }">
+          <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+        </div>
+      </div>
+    </li>
+  </ul>
+
+  <div id="radioSelectOption">
+    <div class="quItemInputCase" itemid="${item.id }">
+      <input type="hidden" class="isNote" value="${item.isNote }">
+      <input type="hidden" class="checkType" value="${item.checkType }">
+      <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+    </div>
+    <input type='text' class='inputSytle_1 dwQuOptionItemNote'  style="width:200px;padding:5px;display: none;"   name="text_qu_${en.quType }_${en.id }_${item.id }"  />
+  </div>
+
+  <ul id="quCheckboxItem_default">
+    <li class="quCoItemUlLi">
+      <div class="dwQuOptionItemContent">
+        <label class="dwCheckboxStyle dwQuInputLabel" ></label>
+        <input type="checkbox" name="tag_qu_${en.quType }_${en.id }_${item.id }"  value="${item.id }" ><label class="editAble quCoOptionEdit quCoOptionPadding">${item.optionName }</label>
+        <input type='text' class='inputSytle_1 dwQuOptionItemNote'  style="width:200px;padding:5px;display:none;"  name="text_tag_qu_${en.quType }_${en.id }_${item.id }" />
+        <div class="quItemInputCase">
+          <input type="hidden" class="isNote" value="${item.isNote }">
+          <input type="hidden" class="checkType" value="${item.checkType }">
+          <input type="hidden" class="isRequiredFill" value="${item.isRequiredFill }">
+        </div>
+      </div>
+    </li>
+  </ul>
+
+  <table id="quScoreItemModel">
+    <tr class="quScoreOptionTr">
+      <td class="quCoItemTableTd quOptionEditTd">
+        <label class="editAble quCoOptionEdit">${item.optionName }</label>
+        <input class="dwScoreOptionId" value="${item.id }" disabled="disabled" type="hidden"/>
+        <input type="hidden" class="answerTag" value="0" >
+      </td>
+      <td class="quCoItemTableTd">
+        <table class="scoreNumTable" border="0" cellspacing="0" cellpadding="1" ><tr>  </tr></table>
+        <input name="item_qu_${en.quType }_${en.id }_${item.id }" value=""  type="hidden" class="scoreNumInput" >
+      </td>
+      <td class="quCoItemTableTd scoreNumText">分</td>
+    </tr>
+  </table>
+
+  <table id="quOrderItemRightModel">
+    <tr class="quOrderByTableTr"><td class="quOrderyTableTd">${itemVarStatus.count }</td><td class="quOrderTabConnect"></td></tr>
+  </table>
+
+  <ul id="quOrderItemLeftModel">
+    <li class="quCoItemUlLi">
+      <label class="editAble quCoOptionEdit">
+        <span>${item.optionName }</span>
+        <input  name="item_qu_${en.quType }_${en.id }_${item.id }"  value="" type="hidden" class="quOrderItemHidInput" >
+        <input  value="" type="hidden" class="quItemId" >
+      </label>
+    </li>
+  </ul>
+
+  <table id="mFillblankTableModel" >
+    <tr class="mFillblankTableTr">
+      <td align="right" class="mFillblankTableEditTd"><label class="editAble quCoOptionEdit">${item.optionName }</label>
+        <input class="dwMFillblankOptionId" value="${item.id }" disabled="disabled" type="hidden"/>
+        <input type="hidden" class="answerTag" value="0" >
+      </td>
+      <td><input name="text_qu_${en.quType }_${en.id }_${item.id }"  type="text" style="width:200px;padding:5px;" class="inputSytle_1 dwMFillblankInput"></td>
+    </tr>
+  </table>
+
+</div>
+
+<div class="footer-copyright" style="color: gray;padding-bottom: 5px;">
+  Powered by <a href="http://www.diaowen.net" style="text-decoration: none;color: gray;">DWSurvey</a>
+</div>
+
+<div id="fixedMsg" style="position: fixed;top: 0px;width: 100%;padding: 10px;text-align: center;font-size: 18px;letter-spacing: 4px;line-height: 56px;background-color: #111;background-color: rgba(17,17,17,0.5);color: #fff;color: rgba(255,255,255,0.5);z-index: 200;display: none;"></div>
+<script type="text/javascript">
+  var bfbFloat=0;
+  $("#resultProgress").progressbar({value: bfbFloat,orientation: "vertical"});
+</script>
+
+<!-- Diaowen.net Button BEGIN -->
+<div id="webSiteFixedRight" class="websiteFixed" style="position: fixed;right: 0px;top: 50px;z-index: 9999;">
+  <a id="mobileTdId" href="#" style="background: #1C658B;width: 15px;background: #8CBCD1;display: block;padding: 5px;padding-top: 10px;padding-bottom:10px;font-weight: bold;color: white;cursor: pointer;float: right;vertical-align: middle;text-decoration: none;font-size: 12px;">手机地址</a>
+  <img class="mobileAnswerQR" alt="" src="" height="130" style="padding: 10px;background: white;display: none;" />
+</div>
+<!-- Diaowen.net Button END -->
+
+</body>
+</html>

+ 575 - 0
static/diaowen/css/Copy of design-survey.css

@@ -0,0 +1,575 @@
+@CHARSET "UTF-8";
+body{
+	padding: 0px;
+	margin: 0px;
+	background: #E8E9EB;
+}
+input[type='checkbox'],input[type='radio']{
+	_vertical-align:-1px;
+	vertical-align:-2px;
+	margin-right: 5px;
+}
+#wrap{
+	/*如果浏览器小于1200,则设置wrap为1200*/
+	/* width: 1200px; */
+	margin: 0px auto;
+}
+#header{
+	background: #122E57;
+	padding-top: 3px;
+	padding-bottom: 3px;
+	overflow: auto;
+	zoom: 1; 
+	width: 100%;
+}
+#header_left{
+	float: left;
+	width: 500px;
+}
+#header_left img{
+	float: left;
+	margin-left: 15px;
+}
+#header_title{
+	color: #F7F7F7;
+	font-size: 14px;
+	margin-top:12px;
+	margin-left:10px;
+	float: left;
+	text-transform: capitalize;
+}
+#header_right{
+	float: right;
+	padding-right: 55px;
+	padding-top: 10px;
+}
+#header_right a{
+	color: #F7F7F7;
+	text-decoration: none;
+}
+#header_right a:hover{
+	text-decoration: underline;
+}
+
+#tools_wrap{
+	background: #D6DCE4;
+	/* margin-bottom: 15px; */
+	/* border-top: 2px solid #ED6C00; */
+	padding-top:1px;
+	position: fixed;
+	z-index:200;
+	width: 100%;
+	overflow:auto;
+	box-shadow:  4px 1px 3px rgba(112, 138, 54, 0.44);
+}
+#tools{
+	width: 100%;
+}
+#tools .tools_tabs{
+	overflow: auto;
+	zoom: 1;
+	/* height: 25px; */
+}
+#tools .tools_tabs ul{
+	padding: 0px;
+	margin: 0px;
+	list-style: none;
+}
+#tools .tools_tabs_left{
+	float: left;
+	padding-left: 65px;
+	margin: 0px;
+}
+#tools .tools_tabs .tools_tabs_left ul li{
+	float: left;
+	padding: 3px 40px;
+	font-family: "新宋体";
+	font-size: 14px;
+	font-weight: 600;
+	font-style: normal;
+	text-decoration: none;
+	border-top: 3px solid transparent;
+	color: #333333;
+	letter-spacing:2px;
+	margin-left:1px;
+	margin-top:1px;
+	cursor: default;
+}
+#tools .tools_tabs .tools_tabs_left ul li:hover{
+	border-top: 3px solid #9AC600;
+	background: #E8EBEE;
+} 
+#tools .tools_tabs .tools_tabs_left ul li.current{
+	border-top: 3px solid #9AC600;
+	background: #F7F7F7;
+}
+#tools .tools_tabs_right{
+	float: right;
+	padding-right: 20px;
+}
+#tools .tools_tabs .tools_tabs_right ul li{
+	float: left;
+	padding: 5px 8px;
+	font-family: Arial;
+	font-size: 13px;
+	font-weight: normal;
+	font-style: normal;
+	text-decoration: none;
+	color: #333333;
+}
+#tools .tools_tabs .tools_tabs_left ul li:hover{
+	
+}
+/** 定义工具栏样式  **/
+#tools_tab1{
+	/* width: 950px; */
+}
+#tools  .tools_contents{
+	background: #F7F7F7;
+	border-bottom: 1px solid #BCBCBC;
+	overflow: auto;
+	zoom: 1;
+}
+.tools_item{
+	float: left;
+	border-right: 1px dashed #C7C7C7;
+}
+.tools_contents .toolbars{
+	background: #F7F7F7;
+	overflow: auto;
+	zoom: 1;
+	padding-right: 5px;
+}
+.tools_contents .tooltext{
+	height: 20px;
+	background: #F1F2F4;
+	font-size: 12px;
+	font-family: "新宋体";
+	color: #707781;
+	line-height: 20px;
+	text-align: center;
+	border-top: 1px dashed #C7C7C7;
+}
+.toolbars ul{
+	list-style: none;
+	padding: 0px;
+	margin: 0px;
+	margin-left: 5px;
+}
+.toolbars ul li{
+	float:left;
+	margin: 5px 5px;
+	padding: 0px;
+	/* border: 1px solid #cc3333; */
+}
+.toolbars ul li .dwToolbar_icon{
+	background: transparent url("../images/toolbar.png") 0px 0px no-repeat;
+	width: 50px;
+	height: 60px;
+	margin: 0px auto;
+}
+
+/* 工具栏单选题 */
+#radioQuModel .dwToolbar_icon{
+	background-position: -0px -6px;
+}
+#radioQuModel:hover .dwToolbar_icon,#radioQuModel.hover .dwToolbar_icon{
+	background-position: -0px -74px;
+}
+
+#checkboxQuModel .dwToolbar_icon{
+	background-position: -57px -6px;
+}
+#checkboxQuModel:hover .dwToolbar_icon,#checkboxQuModel.hover .dwToolbar_icon{
+	background-position: -57px -74px;
+}
+
+#fillblankQuModel .dwToolbar_icon{
+	background-position: -113px -6px;
+}
+#fillblankQuModel:hover .dwToolbar_icon,#fillblankQuModel.hover .dwToolbar_icon{
+	background-position: -113px -74px;
+}
+
+#scoreQuModel .dwToolbar_icon{
+	background-position: -170px -6px;
+}
+#scoreQuModel:hover .dwToolbar_icon,#scoreQuModel.hover .dwToolbar_icon{
+	background-position: -170px -74px;
+}
+
+#orderQuModel .dwToolbar_icon{
+	background-position: -227px -6px;
+}
+#orderQuModel:hover .dwToolbar_icon,#orderQuModel.hover .dwToolbar_icon{
+	background-position: -227px -74px;
+}
+
+#pageQuModel .dwToolbar_icon{
+	background-position: -283px -6px;
+}
+#pageQuModel:hover .dwToolbar_icon,#pageQuModel.hover .dwToolbar_icon{
+	background-position: -283px -74px;
+}
+
+#paragraphQuModel .dwToolbar_icon{
+	background-position: -340px -6px;
+}
+#paragraphQuModel:hover .dwToolbar_icon,#paragraphQuModel.hover .dwToolbar_icon{
+	background-position: -340px -74px;
+}
+
+#mfillblankQuModel .dwToolbar_icon{
+	background-position: -397px -6px;
+}
+#mfillblankQuModel:hover .dwToolbar_icon,#mfillblankQuModel.hover .dwToolbar_icon{
+	background-position: -397px -74px;
+}
+/** 矩阵题 **/
+#chenRadioQuModel .dwToolbar_icon{
+	background-position: -454px -6px;
+}
+#chenRadioQuModel:hover .dwToolbar_icon,#chenRadioQuModel.hover .dwToolbar_icon{
+	background-position: -454px -74px;
+}
+
+#chenCheckboxQuModel .dwToolbar_icon{
+	background-position: -510px -6px;
+}
+#chenCheckboxQuModel:hover .dwToolbar_icon,#chenCheckboxQuModel.hover .dwToolbar_icon{
+	background-position: -510px -74px;
+}
+
+#chenScoreQuModel .dwToolbar_icon{
+	background-position: -567px -6px;
+}
+#chenScoreQuModel:hover .dwToolbar_icon,#chenScoreQuModel.hover .dwToolbar_icon{
+	background-position: -567px -74px;
+}
+
+#chenFillblankQuModel .dwToolbar_icon{
+	background-position: -624px -6px;
+}
+#chenFillblankQuModel:hover .dwToolbar_icon,#chenFillblankQuModel.hover .dwToolbar_icon{
+	background-position: -624px -74px;
+}
+
+#exportToolbar .dwToolbar_icon{
+	background-position: -680px -6px;
+}
+#exportToolbar:hover .dwToolbar_icon,#exportToolbar.hover .dwToolbar_icon{
+	background-position: -680px -74px;
+}
+
+#logicToolbar .dwToolbar_icon{
+	background-position: -737px -6px;
+}
+#logicToolbar:hover .dwToolbar_icon,#logicToolbar.hover .dwToolbar_icon{
+	background-position: -737px -74px;
+}
+
+#qubankToolbar .dwToolbar_icon{
+	background-position: -794px -6px;
+}
+#qubankToolbar:hover .dwToolbar_icon,#qubankToolbar.hover .dwToolbar_icon{
+	background-position: -794px -74px;
+}
+
+
+#publishBtn .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -0px -145px;
+}
+#publishBtn:hover .dwToolbar_icon,#publishBtn.hover .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -0px -199px;
+}
+
+#saveBtn .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -90px -145px;
+}
+#saveBtn:hover .dwToolbar_icon,#saveBtn.hover .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -90px -199px;
+}
+
+#previewBtn .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -180px -145px;
+}
+#previewBtn:hover .dwToolbar_icon,#previewBtn.hover .dwToolbar_icon{
+	width:70px;
+	height:39px;
+	background-position: -180px -199px;
+}
+
+#toolsPubBtn{
+	position: absolute;
+	z-index: 300;
+	right: 0px;
+	background: none;
+}
+#toolsPubBtn .toolbars{
+	background: none;
+}
+#dw_body_left{
+	width: 190px;
+	height: 600px;
+	border: 1px solid #c8c9cc;
+	border-left:none;
+	background: #FAFAFA;
+	position: fixed;
+	left: 0px;
+	top:195px;
+	z-index: 1;
+}
+#dw_body_right{
+	width: 190px;
+	height: 600px;
+	border: 1px solid #c8c9cc;
+	background: #FAFAFA;
+	border-right: none;
+	position: fixed;
+	right: 0px;
+	top:195px;
+	z-index: 1;
+}
+#dw_body{
+	margin-top: 135px;
+}
+#dw_body .dw_body_title{
+	background: #F0F1F4;
+	border-bottom:1px solid #DDE1E7;
+	padding: 8px 10px;
+	color: #333;
+	font-family:"新宋体";
+	font-weight: normal;
+	text-decoration: none;
+	font-size: 14px;
+	letter-spacing:2px;
+}
+#dw_body_content{
+	background:white;
+	width: 780px;
+	margin: 0px auto;
+	border: 1px solid #c8c9cc;
+	/* height: 600px; */
+	position: relative;
+	z-index: 10;
+}
+/* 编辑内容区 */
+#dwSurveyTitle{
+	text-align: center;
+	margin-top: 10px;
+	outline-style: none;
+	font-weight: none;
+	font-family:"微软雅黑";
+	font-size: 21px;
+	letter-spacing:1px;
+	color:#222222;
+	padding: 5px;
+}
+#dwSurveyNote{
+	/* border: 1px solid transparent; */
+	margin: 5px 20px;
+}
+#dwSurveyNote:hover{
+	background: #FDF9CD;
+}
+#dwSurveyNote.click{
+	border: 1px solid #98C5C3;
+	background: #FDF9CD;
+}
+#dwSurveyNote.click #dwSurveyNoteTools{
+	display: inline;
+}
+#dwSurveyNoteTools{
+	position: absolute;
+	width: 80px;
+	height: 25px;
+	/* background: #DDE1E7;
+	background: #D4E0E0; */
+	border: 1px solid #98C5C3;
+	right: 0px;
+	margin-top: -27px;
+	display: none;
+	font-size: 12px;
+	line-height: 25px;
+	text-align: center;
+	cursor: pointer;
+	color: #5D5D5D;
+}
+#dwSurveyNoteTools:hover{
+	background: #98C5C3;
+	color: #333333;
+}
+#dwSurveyNoteEdit{
+	font-size: 16px;
+	outline-style: none;
+	text-indent: 2em;
+	line-height: 1.4em;
+	color: #333333;
+	padding-left:10px;
+	padding-top:5px;
+	padding-bottom:5px;
+	cursor: text;
+	font-family: "微软雅黑";
+}
+.initLine{
+	display: none;
+}
+
+/**题目的**/
+.surveyQuItemBody{
+	margin-top: 0px;
+	overflow: auto;
+	border: 1px solid transparent;
+	/* border: 1px solid #C9C9C9; */
+	border-left: none;
+	border-right: none;
+}
+.surveyQuItemBody:hover{
+	background: #FAFAFA;
+	border: 1px solid #C9C9C9;
+	border-left: none;
+	border-right: none;
+}
+
+/*第一种方案*/
+.surveyQuItem1 .surveyQuItemTools{
+	position: absolute;
+	height: 25px;
+	border: 1px solid #C9C9C9;
+	border-right:none;
+	right: 0px;
+	margin-top: -27px;
+	display: none;
+	font-size: 12px;
+	line-height: 25px;
+	text-align: center;
+	cursor: pointer;
+	color: #5D5D5D;
+}
+.surveyQuItem1 .surveyQuItemContent{
+	/* height: 120px; */
+}
+.surveyQuItem1:hover .surveyQuItemTools{
+	display: inline;
+}
+.surveyQuItemToolsUl{
+	list-style: none;
+	padding: 0px;
+	margin: 0px;
+}
+.surveyQuItemToolsUl li{
+	float: left;
+	font-size: 12px;
+	margin:0px 5px;
+}
+.surveyQuItemContent{
+	padding: 8px 25px;
+	padding-bottom: 20px;
+}
+.surveyQuItemContent .quCoTitle{
+	font-size: 16px;
+	color: rgb(51, 51, 51);
+	font-family: "微软雅黑";
+	line-height: 1.4em;
+}
+.surveyQuItemContent .quCoItem{
+	margin-top: 8px;
+	margin-left: 10px;
+}
+.surveyQuItemContent .quCoItem ul{
+	padding: 0px;
+	margin: 0px;
+	list-style: none;
+}
+.surveyQuItemContent .quCoItem ul li{
+	margin: 8px 5px;
+	font-size: 14px;
+	font-family: "微软雅黑";
+	color: #333333;
+	line-height: 1.4em;
+}
+
+/*第二种方案*/
+.surveyQuItem{
+	overflow: auto;
+}
+.surveyQuItemLeftTools{
+	float: left;
+	width: 40px;
+	text-align: center;
+	margin-top: 10px;
+}
+.surveyQuItemLeftToolsUl{
+	padding: 0px;
+	margin: 0px auto;
+	list-style: none;
+	display: none;
+}
+.surveyQuItem:hover .surveyQuItemLeftToolsUl{
+	display: inline;
+}
+.surveyQuItem:hover .surveyQuItemRightTools{
+	display: inline;
+}
+.surveyQuItemLeftToolsUl li{
+	margin: 5px auto;
+	font-size: 12px;
+	color: #5D5D5D;
+	padding: 0px;
+}
+.surveyQuItemLeftToolsUl li .dwQuIcon{
+	background: transparent url("../images/toolbar.png") 0px 0px no-repeat;
+	width: 23px;
+	height: 23px;
+	margin: 0px auto;
+}
+#dwQuSet .dwQuIcon{
+	background-position: -280px -153px;
+}
+#dwQuLogic .dwQuIcon{
+	background-position: -279px -178px;
+}
+#dwQuDelete .dwQuIcon{
+	background-position: -277px -205px;
+}
+.surveyQuItemRightTools{
+	position: absolute;
+	background: #D4E0E0;
+	border: 1px solid #98C5C3;
+	border-right:none;
+	right: 0px;
+	margin-top: 30px;
+	font-size: 12px;
+	line-height: 25px;
+	text-align: center;
+	cursor: pointer;
+	color: #5D5D5D;
+	display: none;
+}
+.surveyQuItemRightToolsUl{
+	list-style: none;
+	padding: 0px;
+	margin: 0px;
+}
+.surveyQuItemRightToolsUl li{
+	font-size: 12px;
+	margin:0px 5px;
+}
+.surveyQuItem .surveyQuItemContent{
+	float: left;
+	padding-left: 10px;
+	border-left: 1px solid transparent;
+}
+ .surveyQuItem:hover .surveyQuItemContent{
+ 	border-left: 1px solid #DDE1E7;
+ }

+ 830 - 0
static/diaowen/css/answer-m.css

@@ -0,0 +1,830 @@
+/*** old ***/
+.starRating{
+  font-size: 26px;
+}
+.starRating .fa{
+  cursor: pointer;
+}
+.starRating .fa-star{
+  color: #3388CC;
+}
+.subbtn{
+  opacity:1! important;
+  color: white;
+}
+.m_quOrderByUi{
+  margin: 5px 0 5px 0;
+  padding: 0;
+  border: 1px solid #d5d5d5;
+  border-radius: 3px;
+}
+.m_quOrderByUi li{
+  border-color: #fff;
+  font-size: 16px;
+  min-height: 41px;
+  position: relative;
+  padding-right: 45px!important;
+  border-bottom: 1px solid #EBEBEB!important;
+}
+.m_orderby_num{
+  position: absolute;
+  right: 10px;
+  top: 55%;
+  margin-top: -15px;
+  min-width: 26px;
+  height: 26px;
+  background: #85C8FF;
+  color: #fff;
+  text-align: center;
+  line-height: 26px;
+  border-radius: 15px;
+  z-index: 100;
+  display: none;
+}
+.m_orderby_sel{
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 100%;
+  height: 100%;
+  opacity: 0;
+  font-size: 30px;
+  z-index: 9999;
+
+  background-color: rgb(248, 248, 248);
+  border: 1px solid rgb(166, 166, 166);
+  border-image-source: initial;
+  border-image-slice: initial;
+  border-image-width: initial;
+  border-image-outset: initial;
+  border-image-repeat: initial;
+
+  display: inline-block;
+}
+
+body{
+  padding: 0px;
+  margin: 0px;
+}
+/*** new ***/
+#answer-m-head .dwSvyName{
+  color: #365f8f;
+  font-weight: bold;
+  letter-spacing: 2px;
+  text-align: center;
+  font-size: 22px;
+  padding: 10px 0px;
+}
+#dwSurveyNoteEdit{
+  padding: 10px 0px;
+  color: grey;
+  font-size: 13px;
+  line-height: 22px;
+}
+#answer-m-content{
+  padding-top: 10px;
+}
+#dwSurveyQuContentAppUl{
+  list-style: none;
+  padding: 0px;
+  margin: 0px;
+}
+#dwSurveyQuContentAppUl > li{
+  padding-bottom: 20px;
+}
+#dwSurveyQuContentAppUl > li .surveyQuItemContent legend{
+  font-weight: bold;
+  color: black;
+  font-size: 16px;
+  font-weight: bold;
+  line-height: 26px;
+}
+
+.surveyQuItem .surveyQuItemContent {
+  padding: 0px;
+  border: none;
+  width: 100%;
+}
+.surveyQuItemContent .dwQuOptionItemContent{
+  margin: .5em 0;
+  position: relative;
+  background-color: #f6f6f6;
+  border: 1px solid #ddd;
+  color: #333;
+  /*text-shadow: 0 1px 0 #f3f3f3;*/
+  padding: 6px 10px;
+  border-radius: .3125em;
+  font-size: 14px;
+  background-color: white;
+}
+.surveyQuItemContent .columnItemContnetTd .dwQuOptionItemContent{
+  margin: 0px;
+  background-color: white;
+  border: none;
+  color: #333;
+  text-shadow: none;
+  padding: 0px;
+  border-radius: 0em;
+  font-size: 14px;
+}
+.surveyQuItemContent .dwQuOptionItemContent:active{
+  border-color: rgb(129, 152, 186);
+  border-color: #5aa9ef;
+  border-color: #1e94fc;
+  background: #dae8f5;
+  background: white;
+  border-color: #ddd;
+}
+.surveyQuItemContent .dwQuOptionItemContent.active{
+  border-color: #1e94fc;
+  background: #dae8f5;
+  background: white;
+  background-color: #e4edf7;
+}
+.surveyQuItemContent .dwQuOptionItemContent input{
+
+}
+.surveyQuItemContent .dwQuOptionItemContent label{
+  margin: 0;
+  text-align: left;
+  white-space: normal;
+  z-index: 2;
+}
+.surveyQuItemContent .inputSytle_1,.surveyQuItemContent .inputSytle_2{
+  display: block;
+  width: 100%;
+  outline: 0;
+  margin: 0;
+  text-align: left;
+  padding: 6px 0px;
+  margin-top: 10px;
+  border: 1px solid #ddd;
+  text-indent: 6px;
+}
+.dwQuOptionItemContent input[type='radio'],.dwQuOptionItemContent input[type='checkbox']{
+  display: none;
+}
+/**  单选样式***/
+.dwQuOptionItemContent .dwRedioStyle {
+  background: transparent url(../images/answer-icon-1.png) no-repeat center top;
+  vertical-align: middle;
+  height: 22px;
+  width: 22px;
+  background-position: -2px -6px;
+  display:inline-block;;
+}
+.dwQuOptionItemContent .dwRedioStyle.checked{
+  background-position: -2px -31px;
+}
+/**多选样式**/
+.dwQuOptionItemContent .dwCheckboxStyle {
+  background: transparent url(../images/answer-icon-1.png) no-repeat center top;
+  vertical-align: middle;
+  height: 22px;
+  width: 22px;
+  background-position: -2px -60px;
+  display:inline-block;
+}
+.dwQuOptionItemContent .dwCheckboxStyle.checked{
+  background-position: -2px -87px;
+}
+.ui-controlgroup-controls{
+  border-bottom:1px solid #ddd;
+  margin-top: 8px;
+}
+.ui-controlgroup-controls .m_clickQuOrderItem{
+  background-color: #f6f6f6;
+  border: 1px solid #ddd;
+  color: #333;
+  text-shadow: 0 1px 0 #f3f3f3;
+  font-size: 14px;
+  border-radius: 0px;
+  border-bottom: none;
+}
+.ui-controlgroup-controls .m_clickQuOrderItem:first-child{
+
+}
+.ui-controlgroup-controls .m_clickQuOrderItem label{
+  border: none;
+  font-weight: normal;
+}
+
+.surveyQuItemContent .mFillblankTableTr label{
+  display: block;
+  margin: 0 0 .4em;
+}
+
+.surveyQuItemContent .mFillblankTableTr{
+  margin: 10px 0px;
+}
+.surveyQuItemContent .mFillblankTableTr .surveyQuItemContent .dwQuOptionItemContent.dwQuOptionItemContent label{
+  display: inline-block;
+  margin: 0px;
+}
+.surveyQuItemContent .quSliderItemTr .mFillblankTableEditTd label{
+  margin: 0px;
+}
+
+.surveyQuItemContent .mFillblankTableTr .dwMFillblankInput,input[type='text'].fillblankInput{
+  width: 100%;
+  outline: 0;
+  margin: 0;
+}
+.surveyQuItemContent .mFillblankTableTr .dwMFillblankInput,input[type='text'].fillblankInput,.option_other_text{
+  display: block;
+  border: 1px solid #ddd;
+  text-align: left;
+  box-sizing: border-box;
+}
+.nextPage_a, .submitSurvey{
+  width: 100%;
+  line-height: 25px;
+  border-radius: 2px;
+  padding: 8px 0px;
+  margin-left: 0px;
+  font-size: 16px;
+  text-decoration: none;
+  color: white;
+  background: #1e94fc;
+  border: none;
+  background: #4F8BFF;
+}
+.nextPage_a:hover, .submitSurvey:hover{
+  background: #1759e8;
+  background:-moz-linear-gradient(top, #1759e8,#1759e8);
+  background:-webkit-gradient(linear, 0 0, 0 bottom, from(#1759e8), to(#1759e8));
+}
+.dw-footer{
+  display: block;
+  padding: 20px 0px;
+  width: 100%;
+  height: 30px;
+  text-align: center;
+  font-size: 13px;
+  font-weight: normal;
+  padding-top: 30px;
+  color: #333;
+  background-color: #eeeeee;
+}
+.dw-footer a{
+  color: #333;
+}
+
+.dwsurvey-controlgroup{
+  margin: 6px;
+  margin-bottom: 8px;
+  margin-left: 0px;
+}
+.dwsurvey-controlgroup .starOptionTitle{
+  font-size: 14px;
+}
+.dwsurvey-controlgroup .starOptionContent{
+  font-size: 14px;
+}
+.starRating{
+  font-size: 14px;
+}
+.starRating .fa{
+  cursor: pointer;
+  padding: 3px;
+}
+.starRating .fa-star{
+  color: #365f8f;
+}
+.quCoItem ul li{
+  list-style: none;
+}
+.radioSelectSet select{
+  width: 100%;
+  border: 1px #cecad2 solid;
+  margin: .5em 0;
+  outline-style: none;
+}
+
+.quCoItem > ul {
+  margin: 0px;
+  padding: 0px;
+}
+body{
+  background: white;
+}
+.ui-page {
+  background:white;
+}
+.ui-header{
+  background-color: #5693C0! important;
+  text-shadow:0 1px 0 #3D586C! important;
+  padding-bottom: 5px;
+  background-color: #5aa9ef! important;
+}
+.ui-content{
+  padding: 0px 1em;
+}
+.ui-footer{
+  color: #3D586C! important;
+  background: none! important;
+}
+.ui-header, .ui-footer{
+  border: none! important;
+}
+.starRating .fa{
+  cursor: pointer;
+}
+.starRating .fa-star{
+  color: #3388CC;
+}
+.subbtn{
+  opacity:1! important;
+  color: white;
+}
+.quTitleNum{
+  /* position: absolute; */
+}
+.quTitleText{
+  /* text-indent: 2em; */
+}
+#dwSurveyNote{
+  padding-top: 0px;
+}
+.m_quOrderByUi{
+  margin: 5px 0 5px 0;
+  padding: 0;
+  border: 1px solid #d5d5d5;
+  border-radius: 3px;
+}
+.m_quOrderByUi li{
+  border-color: #fff;
+  font-size: 16px;
+  min-height: 41px;
+  position: relative;
+  padding-right: 45px!important;
+  border-bottom: 1px solid #EBEBEB!important;
+}
+.m_orderby_num{
+  position: absolute;
+  right: 10px;
+  top: 55%;
+  margin-top: -15px;
+  min-width: 26px;
+  height: 26px;
+  background: #85C8FF;
+  color: #fff;
+  text-align: center;
+  line-height: 26px;
+  border-radius: 15px;
+  z-index: 100;
+  display: none;
+}
+.m_orderby_sel{
+  position: absolute;
+  top: 0px;
+  left: 0px;
+  width: 100%;
+  height: 100%;
+  opacity: 0;
+  font-size: 30px;
+  z-index: 9999;
+
+  background-color: rgb(248, 248, 248);
+  border: 1px solid rgb(166, 166, 166);
+  border-image-source: initial;
+  border-image-slice: initial;
+  border-image-width: initial;
+  border-image-outset: initial;
+  border-image-repeat: initial;
+
+  display: inline-block;
+}
+
+#resultProgressRoot{
+  top: 0px;
+  z-index: 200;
+  position: fixed;
+  width: 100%;
+  background-color: #cecad2;
+  background-color: #e0e0e0;
+}
+.progress-label {
+  font-size:14px;
+  font-family: "微软雅黑";
+  margin: 0px auto;
+  text-align: center;
+  line-height: 1.4em;
+  color: #0887d2;
+  display: none;
+}
+.progressbarDiv {
+  height: 3px! important;
+  box-shadow: none! important;
+  /*border: 1px solid #0887d2;*/
+  border-radius: 0px! important;
+}
+
+.progressbarDiv .ui-progressbar-value{
+  background: #0887d2;
+  border: none;
+}
+.progressbarDiv .ui-widget-header{
+  background: #0887d2;
+}
+.ui-progressbar .ui-progressbar-value{
+  margin: 0px;
+}
+.ui-progressbar {
+  position: relative;
+  background: none! important;
+}
+p{
+  /*display: inline;*/
+}
+.nextPage_a,.submitSurvey {
+  width: 100%;
+  line-height: 25px;
+  border-radius: 3px;
+  padding: 8px 0px;
+  margin-left: 0px;
+}
+html head+body .ui-btn.ui-btn-b,html head+body .ui-btn.ui-btn-b:hover{
+  background-color: #00a0df;
+  border-color: #00a0df;
+  text-shadow: 0 1px 0 #00a0df;
+}
+.sbtn24{
+  background-image: none;
+  background-color: #00a0df;
+  background: #4F8BFF;
+  color: white!important;
+  font-size: 12px;
+  height: 25px;
+}
+.sbtn24:active{
+  background-color: #008dc9;
+}
+.sbtn24_0:hover{
+  background: #1759e8;
+}
+#dwSurveyHeaderTopImg {
+  height: auto; width: auto\9; width:100%;
+}
+
+#dwSurveyQuContentBg{
+  /*margin: 16px;
+  margin-bottom: 0px;
+  */
+  padding: 16px;
+  padding-bottom: 0px;
+}
+.dwQuCoChenRowTr {
+  margin-top: 10px;
+}
+.dwScoreRowItem {
+  border-bottom: 1px solid #ddd;
+  padding-bottom: 10px;
+}
+.dwScoreRowItem .dwQuCoScoreCol{
+  margin-top: 10px;
+}
+#jcaptchaImgBody{
+  font-size: 14px;
+}
+.jcaptchaInput{
+  display: block;
+  width: 100%;
+  outline: 0;
+  margin: 0;
+  text-align: left;
+  padding: 6px 0px;
+  margin-top: 10px;
+  border: 1px solid #ddd;
+  text-indent: 6px;
+}
+#register-jcaptchaImg{
+  width: 110px!important;
+}
+#diaowen-m-content{
+  background-color: white;
+}
+
+
+
+#dwSurveyHeaderTop{
+  /*background: #cecad2;*/
+  /*display: none;*/
+  /*background-repeat:no-repeat; background-size:100% 100%;-moz-background-size:100% 100%;*/
+}
+
+#dwSurveyHeaderTopImg,#dwSurveyLogo{
+  display: none;
+}
+#dwSurveyHeaderTopImg img,#dwSurveyLogo img{
+  border: none;
+}
+
+#dwSurveyHeaderTopImg{
+  width:100%;
+  height:auto;
+}
+#dwSurveyHeaderTop.bgImg #dwSurveyHeaderTopImg{
+  display: block;
+}
+#dwSurveyHeaderTop.bgImg #dwSurveyLogo{
+  position: absolute;
+  top: 10px;
+}
+
+table.quScaleTable tr td{
+  padding: 3px;
+  padding: 0px;
+}
+
+.dwQuOptionItemContent.inputchecked {
+  background-color: dodgerblue;
+  color: white;
+}
+table.quScaleTable tr td.quCoChenTdRC:hover{
+  border: 1px solid transparent;
+}
+.cascadeSelectSet select,.radioSelectSet select{
+  width: 100%;
+  display: block;
+}
+.diaowen-m-content img{
+  width: 100%;
+}
+.surveyQuItemContent .quCoItem.imgSelectQu{
+  /*margin-top: 10px;*/
+}
+.surveyQuItemContent .quCoItem ul.transverse{
+  display: -webkit-flex; /* Safari */
+  display: flex;
+  flex-wrap: wrap;
+  /*align-content: space-between;*/
+}
+@media(max-width:300px){
+  .imgQuCoItemUlLi{
+    width: 100%;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse {
+    justify-content: space-between;
+  }
+}
+@media(min-width:300px){
+  .imgQuCoItemUlLi{
+    width: 49%;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse {
+    justify-content: space-between;
+  }
+}
+@media(min-width:600px){
+  .imgQuCoItemUlLi{
+    width: 32%;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse {
+    justify-content: flex-start;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse .quCoItemUlLi{
+    margin-right: 1%;
+  }
+}
+@media(min-width:900px){
+  .imgQuCoItemUlLi{
+    width: 22%;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse {
+    justify-content: flex-start;
+  }
+  .surveyQuItemContent .imgSelectQu ul.transverse .quCoItemUlLi{
+    margin-right: 1%;
+  }
+}
+
+.surveyQuItemContent .imgSelectQu ul.transverse .quCoItemUlLi{
+  /*margin-right: 10px;*/
+  /*margin-bottom: 10px;*/
+  /*margin-top: 10px;*/
+  margin-top: 10px;
+}
+.surveyQuItemContent .dwQuOptionItemContent.imgItemContent{
+  border: none;
+  background: none;
+  text-align: left;
+  padding-left: 0px;
+  margin: 0px;
+  padding: 0px;
+}
+.choicequ_img_item{
+  text-align: center;
+  border: 1px solid lightgrey;
+  padding: 6px;
+  padding-bottom: 8px;
+  /*width: 180px;*/
+}
+.choicequ_img_item_add{
+  border: 1px dashed lightgrey;
+  padding: 6px;
+  padding-bottom: 8px;
+  cursor: pointer;
+}
+.choicequ_img_item_img{
+  margin-bottom: 6px;
+  position: relative;
+  /*height: 160px;*/
+  overflow: hidden;
+}
+.choicequ_img_item_action {
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  /*height: 160px;*/
+  width: 100%;
+  line-height: 30px;
+  z-index: 100;
+  opacity: 0.6;
+}
+.choicequ_img_item_action .editQuImg{
+  width: 60px;
+  height: 45px;
+  font-size: 14px;
+  text-decoration: none;
+  color: white;
+  display: block;
+  border:1px solid white;
+  border-radius:60px;
+  background: black;
+  color: white;
+  margin-top: 50px;
+  margin-left: 50px;
+  padding-top: 15px;
+  display: none;
+}
+.choicequ_img_item_img:hover .choicequ_img_item_action .editQuImg{
+  display: block;
+}
+.choicequ_img_item_action .editQuImg:hover{
+  background: #b06886;
+}
+.choicequ_img{
+  width: 100%;
+}
+.imgSelectQu img{
+  width: 100%;
+}
+.leftValue,.rightValue{
+  font-size: 12px;
+  color: #757575;
+}
+table.chenTable{
+  border-right: 1px solid #c9c9c9;
+  border-bottom: 1px solid #c9c9c9;
+  border-spacing: 0px;
+}
+
+table.chenTable tr.quCoChenTableHead td{
+  background: #dddddd;
+  padding: 3px;
+}
+table.chenTable tr td{
+  border-spacing: 0px;
+  word-break: keep-all;
+  white-space: nowrap;
+}
+.chenTable td {
+  border-left: 1px solid #c9c9c9;
+  border-top: 1px solid #c9c9c9;
+}
+
+.chenTableRowColumn, .chenTableRowColumn td{
+  padding: 0px;
+  margin: 0px;
+}
+.chenScaleRadioRow .columnItemContnetTd .dwQuOptionItemContent{
+  padding: 6px;
+  cursor: pointer;
+}
+
+table.chenScaleTable{
+  background: none;
+  border: none;
+}
+.chenScaleTable  tr.quCoChenTableHead td{
+  background: none;
+}
+.chenScaleTable td {
+  border: none;
+  border: 1px solid transparent;
+}
+table.chenScaleTable tr.quCoChenTableHead td {
+  background: none;
+}
+table.chenScaleTable .chenScaleRadioRow .columnItemContnetTd{
+  padding: 3px;
+  padding-bottom: 10px;
+}
+table.chenScaleTable .chenScaleRadioRow .columnItemContnetTd .dwQuOptionItemContent {
+  border: 1px solid rgb(221, 221, 221);
+  border-radius: 0.3125em;
+}
+table.chenScaleTable .chenTableRowTitle td{
+  padding: 6px;
+  font-size: 16px;
+  color: #6b6767;
+  padding-bottom: 0px;
+}
+table.scaleLeftRightTable tr td{
+  color: #757575;
+  font-size: 12px;
+}
+.nextPage_a{
+  display: block;
+}
+.dwQuChenFbkOptionItemContent{
+  margin-top: 10px;
+}
+.dwChenMFillblankInput{
+  width: 100%;
+}
+table.quCoChenTable{
+  width: 100%;
+}
+select{
+  width: 100%;
+}
+table.dwQuCoChenRowTrTable{
+  min-width: 100%;
+  max-width: none;
+}
+table.dwQuCoChenRowTrTable tr td{
+  /*border: none;*/
+}
+table.dwQuCoChenRowTrTable tr td{
+
+}
+table.dwQuCoChenRowTrTable .quChenColumnTd{
+  padding: 6px;
+}
+table.quCoChenTable tr td.quChenRowTitleTrTd label{
+  max-width: none;
+}
+.quChenRowTitleTrTd,.quChenRowTitleTrTd label{
+  text-align: left;
+}
+table.dwQuCoChenRowTrTable tr td{
+  padding: 0px;
+}
+table.dwQuCoChenRowTrTable tr td:first-child{
+
+}
+table.dwQuCoChenRowTrTable .quChenRowTitleTr td.quChenRowTitleTrTd{
+  padding: 5px;
+}
+table.dwQuCoChenRowTrTable .dwQuOptionItemContent{
+  margin: 0px;
+  border: none;
+  border-radius: 0;
+}
+table.dwQuCoChenRowTrTable tr td .dwQuChenFbkOptionItemContent{
+  margin-top: 0px;
+}
+table.dwQuCoChenRowTrTable tr td .inputSytle_1,table.dwQuCoChenRowTrTable tr td select{
+  margin: 0px;
+  border: none;
+  min-width: 100px;
+}
+table.quCoChenTable tr td{
+  word-break: keep-all;
+  white-space: nowrap;
+}
+tr.quChenRowTitleTr .quChenRowTitleTrTd{
+  background: #f3f3f3;
+}
+.nextPage_a, .submitSurvey{
+  background: dodgerblue;
+  border-radius: 0px;
+  background:-moz-linear-gradient(top, dodgerblue,dodgerblue);
+  background:-webkit-gradient(linear, 0 0, 0 bottom, from(dodgerblue), to(dodgerblue));
+
+}
+input[type=button],input[type=text],input[type=password],textarea,button{
+  -webkit-appearance:none;outline:none;
+  -webkit-border-radius: 0px;
+}
+select{
+  -webkit-border-radius: 0px;
+  background-color: white;
+}
+.columnItemContnetTd .quCoItemUlLi{
+  margin-right: 20px;
+}
+.surveyQuItemContent .quCoChenTdRC .dwQuOptionItemContent{
+  margin: .5em auto;
+  width: 20px;
+  padding: 6px 4px;
+  /*量表11个选项不出滚动*/
+  /*
+  width: 18px;
+  padding: 6px 3px;*/
+}
+.dwQuOptionItemContent p{
+  display: inherit;
+}

+ 50 - 0
static/diaowen/css/answer-p.css

@@ -0,0 +1,50 @@
+.edui-editor-iframeholder{
+  display: none;
+}
+.edui-default .edui-editor-toolbarboxouter{
+  border: none! important;
+}
+#resultProgressRoot{
+  right: -80px;
+  bottom: 100px;
+  width: 200px;
+  z-index: 200;
+  position: fixed;
+  /*transform: rotate(90deg);
+	-moz-transform:rotate(90deg);
+	-webkit-transform:rotate(90deg);
+	transform:rotate(90deg);
+	filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);*/
+  right: 10px;
+  bottom: 50px;
+}
+.progress-label {
+  font-size:14px;
+  font-family: "微软雅黑";
+  margin: 0px auto;
+  text-align: center;
+  line-height: 1.4em;
+  color: #83AE00;
+}
+.progressbarDiv {
+  height: 10px! important;
+  box-shadow: none! important;
+  border: 1px solid #83AE00;
+}
+.progressbarDiv .ui-progressbar-value{
+  background: #83AE00! important;
+  border: none;
+}
+.ui-progressbar .ui-progressbar-value{
+  margin: 0px;
+}
+.ui-progressbar {
+  position: relative;
+  background: none! important;
+}
+.quOptionEditTd .editAble,.scoreNumTable tr td,.quCoItemTable{
+  font-size: 16px;
+}
+label.error{
+  font-size: 14px;
+}

文件差异内容过多而无法显示
+ 1737 - 0
static/diaowen/css/default.css


文件差异内容过多而无法显示
+ 1743 - 0
static/diaowen/css/design-survey.css


文件差异内容过多而无法显示
+ 2047 - 0
static/diaowen/css/dw-user.css


+ 137 - 0
static/diaowen/css/dw.css

@@ -0,0 +1,137 @@
+/* CSS Document */
+body{margin:0;padding:0;background: white;}
+ul{margin:0;padding:0;list-style:none;}
+a{text-decoration:none;}
+img{border:0;}
+form{margin:0;padding:0;}
+.dw_syk1{ height:402px; padding-top:86px; background:url(../images/dw_bg1.png) center;}
+.dw_syk1n{ width:1000px; margin:0 auto; position:relative;}
+.dw_syk1n img{ position:absolute; top:-40px; right:0;}
+.dw_syk1wz{ font-family:Microsoft YaHei; color:#fff;}
+.dw_syk1wz h1{ margin:30px 0; font-weight:normal; font-size:32px; font-weight:500;}
+.dw_syk1wz p{ font-size:20px; line-height:30px;margin-bottom:20px;}
+.dw_syk1yxzc{}
+.dw_emailsr{ width:278px; height:44px; border:solid 1px #cbcbcb; padding-left:10px; font-size:15px; color:#636363;}
+.syzcbtn{ width:165px; height:50px; background:url(../images/dw_bgico.png) no-repeat 0 0; border:0; color:#fff; font-size:20px; font-family:Microsoft YaHei; position:relative; top:3px; left:-15px; cursor:pointer;}
+.dw_syk2{ height:147px; background-color:#f8f8f8;}
+.dw_syk2n{ width:958px; margin:0 auto; padding-top:30px; background:url(../images/dw_pic07.png) no-repeat 0 60px; overflow:hidden;}
+.dw_syk2n ul{ width:710px; margin:0 auto; overflow:hidden;}
+.dw_syk2n ul li{ width:90px; text-align:center; float:left; margin:0 70px;}
+.dw_syk2n ul li font{ font-size:16px; color:#595959; font-family:Microsoft YaHei;}
+.sjwj_ico{ width:58px;height:58px; background:url(../images/dw_bgico.png) no-repeat -166px 0; display:block; margin:0 auto;}
+.fbwj_ico{ width:58px;height:58px; background:url(../images/dw_bgico.png) no-repeat -229px 0; display:block; margin:0 auto;}
+.sjsj_ico{ width:58px;height:58px; background:url(../images/dw_bgico.png) no-repeat -291px 0; display:block; margin:0 auto;}
+.dw_syk3{ background:url(../images/dw_pic03.jpg) repeat-x 0 453px;}
+.dw_syk3n{ text-align:center;}
+.dw_syk3bt{ font-size:32px; font-family:SimHei; text-align:center; padding:15px 0;}
+.dw_syk3nr{ width:1000px; margin:0 auto; font-size:16px; color:#686868; font-family:Microsoft YaHei; line-height:25px; letter-spacing:2px; text-align:center;}
+.dw_syk4{ height:476px; background:url(../images/dw_pic06.png) center;}
+.dw_syk4bt{ text-align:center; height:137px; line-height:137px; font-size:24px; color:#fff; font-family:Microsoft YaHei; letter-spacing:4px;}
+.dw_sytxnr{ width:900px; margin:0 auto; overflow:hidden; font-size:16px; color:#fff; font-family:Microsoft YaHei;}
+.dw_sytxnr ul li{ float:left; width:50px; margin:0 50px 80px 50px; text-align:center;}
+.dw_sytxnr ul li s{ display:block; width:29px; height:29px; margin:0 auto;}
+.dw_sywjbdk{ width:915px; margin:0 auto; padding-top:25px; padding-bottom:55px; overflow:hidden;}
+.dw_sywj{ width:420px; border-right:dashed 1px #ebebeb; padding-right:39px; float:left;}
+.dw_sybd{ width:410px; padding-left:40px; float:left;}
+.dw_sywjbdbt{ overflow:hidden;}
+.dw_sywjbdbtl{ width:380px; height:45px; line-height:45px; font-size:21px; font-family:Microsoft YaHei; color:#676767; float:left;}
+.dw_sywjbdbtr{ width:30px; height:45px; line-height:45px; float:left;}
+.dw_sywjbdbtr a{ color:#676767; font-size:15px;}
+.dw_sywjbdbtr a:hover{ color:#f90;}
+.dw_sywjbdlb{ padding-top:10px;}
+.dw_sywjbdlb ul li{ padding-bottom:15px; font-size:15px; overflow:hidden;}
+.dw_sywjbdlbl{ width:296px; float:left;}
+.dw_sywjbdlbl a{ color:#676767;}
+.dw_sywjbdlbr{ float:left; color:#B7B7B7; font-family:arial;}
+.dw_sywjbdlbl a:hover{ color:#f90;}
+.dw_mfzc{ height:118px; background-color:#ebebeb;}
+.dw_mfzcn{ width:950px; margin:0 auto;}
+.dw_mfzcl{ width:500px; height:118px; float:left; line-height:118px; font-size:21px; color:#676767; font-family:Microsoft YaHei;}
+.dw_mfzcr{ width:450px; height:88px; padding-top:30px; float:left;}
+.dw_foot{ padding-top:35px; text-align:center;padding-bottom: 10px;}
+.dw_footnav{ color:#464646; margin-bottom:8px;}
+.dw_footnav a{ color:#464646; font-family:Microsoft YaHei; margin:0px 10px;}
+.dw_footnav a:hover{ color:#f90;}
+.dw_footcopy{ color:#676767; text-align:center; font-family:Microsoft YaHei; line-height:22px;}
+.dw_footcopy p{line-height: 30px;}
+
+
+
+.dw_content{ width:1000px; margin:0 auto; padding-bottom:50px; overflow:hidden;}
+.dw_topmfzc{ padding:35px 25px 35px 25px; overflow:hidden;}
+.dw_mfzcwz{ width:365px; height:36px; line-height:36px; font-size:19px; color:#929191; font-family:Microsoft YaHei; float:left;}
+.dw_mfzcnr{ width:585px; height:36px; float:left; padding:0;}
+.dw_mfzcsr{ width:400px; height:34px; line-height:34px; padding:0 10px; border:solid 1px #cfcfcf; font-size:14px; font-family:Microsoft YaHei; vertical-align:top;}
+.dw_mfzcbtn{ width:131px; height:36px; letter-spacing:2px; background:url(../images/dw_bgico.png) no-repeat 0 -61px; border:0; cursor:pointer; color:#fff; font-size:19px; font-family:Microsoft YaHei; position:relative; left:-5px; margin:0;}
+.dw_left{ width:224px; float:left; margin-right:12px;}
+.dw_leftmk{ border:solid 1px #b4cfe4; margin-bottom:10px;}
+.dw_leftmkbt{ height:40px; background-color:#f7f7f7; line-height:40px; text-align:center; color:#333232; font-size:16px; font-family:Microsoft YaHei;}
+.dw_leftmkbt s{ display:inline-block; width:16px; height:13px; background:url(../images/dw_bgico.png) no-repeat 0 -106px; margin-right:5px; position:relative; top:1px;}
+.dw_leftmknr{ padding:7px 0 10px 0;}
+.dw_leftmknr ul li{ height:37px; margin-bottom:9px; text-align:center; line-height:37px; font-family:Microsoft YaHei; font-size:15px;}
+.dw_leftmknr ul li.cur{ background:url(../images/dw_pic08.png) repeat-y 0 0; border-top:solid 1px #F7F7F7; border-bottom:solid 1px #F7F7F7;}
+.dw_leftmknr ul li a{ color:#81898D;}
+.dw_leftmknr ul li a:hover{ color:#f90;}
+.dw_right{ width:762px; float:left;}
+.dw_mbgs{ border:solid 1px #b4cfe4;}
+.dw_mbgsbt{ height:38px; line-height:38px; padding:0 20px; background-color:#f9f9f9; color:#343333; font-family:Microsoft YaHei; font-size:16px;}
+.dw_mbgsbtl{ float:left;}
+.dw_gsbtback{ float:right;}
+.dw_gsbtback a{ color:#343333;}
+.dw_gsbtback a:hover{ color:#f90;}
+.dw_mbgsnr{ padding:20px;}
+.dw_mbgsnrk1{ width:100%; border-bottom:solid 1px #edeeef; padding-bottom:20px; position:relative; display:table;}
+.dw_zzsj{ width:455px; float:left; font-family:Microsoft YaHei; color:#81898d; font-size:13px;}
+.dw_yyxzhd{ float:left;}
+.dw_yyxzhd ul li.btn{ float:left; width:81px; height:32px; margin-left:5px; border:solid 1px #e2e6eb; font-size:14px; font-family:Microsoft YaHei; color:#81898d; text-align:center; line-height:32px; cursor:pointer; position:relative;}
+.dw_yyxzhd ul li s{ width:9px; height:5px; display:inline-block; background:url(../images/dw_bgico.png) no-repeat -20px -106px; margin-left:3px; margin-bottom:2px;}
+.xzlist{ position:absolute; left:-1px; top:32px; width:81px; border:solid 1px #e2e6eb; background-color:#fff; display:none;}
+.xzlist ul li{ height:32px; line-height:32px; font-size:14px; color:#2f383e; font-family:Microsoft YaHei;}
+.xzlist ul li:hover{ background-color:#5b9fd0; color:#fff;}
+.yymb{ background-color:#5b9fd0; color:#fff !important;}
+.dw_mbwjbt{ padding:22px 0; text-align:center; font-size:19px; font-family:Microsoft YaHei; color:#484646;}
+.dw_mbwjgs{ padding:10px 0 15px 0;}
+.dw_mbwjgs p{ font-size:15px; font-family:Microsoft YaHei; color:#6b6b6b; line-height:25px; text-indent:2em;}
+.dw_mbwjlb{ padding-left:23px; padding-bottom:30px;}
+.dw_mbwjlb ul li{ font-size:15px; font-family:Microsoft YaHei; color:#6b6b6b; line-height:25px;}
+.dw_yyxzhd2{ width:264px; height:34px; margin:0 auto;}
+.dw_yyxzhd2 ul li.btn{ float:left; width:81px; height:32px; margin-left:5px; border:solid 1px #e2e6eb; font-size:14px; font-family:Microsoft YaHei; color:#81898d; text-align:center; line-height:32px; cursor:pointer; position:relative;}
+.dw_yyxzhd2 ul li s{ width:9px; height:5px; display:inline-block; background:url(../images/dw_bgico.png) no-repeat -20px -106px; margin-left:3px; margin-bottom:2px;}
+
+
+.dw_gnydt{ width:100%; height:400px; 
+background:url(../images/dw_pic04.jpg) no-repeat center top;
+/* background:url("../images/style-model/6608914805422388314.jpg") no-repeat center top; */
+}
+.dw_gnynr{ overflow:hidden; margin:0 auto;}
+.dw_gnyzdy{ background-color:#fff; padding-bottom:77px;}
+.dw_gnyzdywg{ width:1000px; margin:0 auto; padding-top:85px; overflow:hidden;}
+.dw_gnyzdyl{ float:left; margin-right:53px;}
+.dw_gnyzdyr{ float:left; width:340px; padding-top:85px;}
+.dw_gnygnbt{ font-size:32px; font-family:'方正黑体简体'; margin-bottom:23px;}
+.dw_gnymksm{ font-family:"微软雅黑"; color:#717171; font-size:16px; line-height:24px; margin-bottom:20px;}
+.dw_gnyzdylb ul li{ background:url(../images/dw_pic09.png) no-repeat 0 6px; padding-left:15px; font-size:13px; color:#919191; font-family:"微软雅黑"; line-height:22px;}
+.dw_gnysjbjw{ background-color:#F8F8F8; padding-top:112px; padding-bottom:178px;}
+.dw_gnysjbj{ width:1000px; margin:0 auto; overflow:hidden;}
+.dw_gnysjbjl{ width:350px; float:left; padding-top:125px; margin-right:50px;}
+.dw_gnysjbjr{ width:600px; float:left;}
+.dw_gnydtxw{ padding-top:84px; padding-bottom:84px;}
+.dw_gnydtx{ overflow:hidden;width:1000px; margin:0 auto;}
+.dw_gnydtxl{ width:465px; float:left; margin-right:145px;}
+.dw_gnydtxr{ width:345px; float:left; padding-top:150px;}
+.dw_gnydtljw{ padding-top:74px; padding-bottom:74px; background-color:#F8F8F8;}
+.dw_gnydtlj{ overflow:hidden; width:1000px; margin:0 auto;}
+.dw_gnydtljl{ width:345px; float:left; margin-right:105px; padding-top:140px;}
+.dw_gnydtljr{ width:495px; float:left;}
+.dw_gnysjtjw{ padding-top:108px; padding-bottom:105px;}
+.dw_gnysjtj{ overflow:hidden; width:1000px; margin:0 auto;}
+.dw_gnysjtjl{ width:555px; float:left; margin-right:65px;}
+.dw_gnysjtjr{ width:340px; float:left; padding-top:130px;}
+.dw_gnydqdw{ padding-top:128px; padding-bottom:142px; background-color:#F8F8F8;}
+.dw_gnydqd{ overflow:hidden; width:1000px; margin:0 auto;}
+.dw_gnydqdl{ width:338px; float:left; padding-top:100px; margin-right:75px;}
+.dw_gnydqdr{ width:542px; float:left;}
+
+.friend_links a{
+	color: gray! important;
+}

文件差异内容过多而无法显示
+ 1783 - 0
static/diaowen/css/preview-dev.css


+ 312 - 0
static/diaowen/css/response.css

@@ -0,0 +1,312 @@
+@CHARSET "UTF-8";
+body{
+	padding: 0px;
+	margin: 0px;
+}
+.root-body,.root-body1{
+	width: 100%;
+}
+.root-body{
+	/*background:white;*/
+}
+a{
+	text-decoration: none;
+}
+
+.top-body{
+	 
+	/* -webkit-box-shadow: 0 0 25px #1F91E6;
+	box-shadow: 0 0 25px #1F91E6;
+	background-color: #DADADA; */
+	width: 100%;
+	position: fixed;
+	border-bottom: 3px solid #08A2BE;/* #1F91E6*/
+	opacity: .8;
+	filter: alpha(opacity=80);
+	-ms-filter: "alpha(opacity=80)";
+	background-color: white;
+	height: 40px;
+}
+.top-body-content{
+	width: 80%;
+	margin: 0px auto;
+}
+.top-body-content-logo{
+	width: 220px;
+	height: 40px;
+	/* float: right; */
+}
+.top-body-content-h1 {
+	float: left;
+	height: 25px;
+	display: table;
+	padding-top: 10px;
+}
+.top-body-content-h1 h1{
+	font-size: 20px;
+	color: #333;
+	letter-spacing: 2px;
+	padding: 0px;
+	margin: 0px;
+}
+
+.middle-body,.middle-body1{
+	/* width: 80%; */
+	width:800px;
+	margin: 0px auto;
+	
+	
+	padding: 50px 20px 10px 20px;
+	*padding-top:40px;
+	_padding-top:10px;
+	background-position: center top;
+	background-repeat: no-repeat;
+	/*
+	-webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa; 
+	
+	- webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px; */
+	border: 1px solid rgb(219, 218, 218);
+}
+.middle-body{
+		height: 200px;
+		background: #EFEFEF; 
+		background: white;
+}
+.middle-body1{
+	margin-top:10px;
+	padding: 15px;
+	-webkit-box-shadow: 0 0 15px #aaa;
+	box-shadow: 0 0 15px #aaa;
+}
+
+.middle-body-title {
+	border-bottom: 3px solid #676767;
+}
+.middle-body-title h3{
+	text-align: center;
+	padding-top: 5px;
+	padding-bottom: 5px;
+}
+.middle-body-title h4{
+	margin: 0px;
+	padding-top: 5px;
+	color: #676767;
+	padding-bottom: 8px;
+}
+.middle-body-title p{
+	margin: 5px 0px;
+	font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+	font-size: 12px;
+	line-height: 20px;
+	text-indent: 2em;
+	padding: 0px 25px;
+	color: #333;
+	padding-bottom: 5px;
+}
+.middle-body-content{
+	padding: 10px 35px;
+	font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
+	font-size: 14px;
+	color: #373A3D;
+}
+.r-qu-body{
+	padding: 10px;
+	clear: both;
+	display: table;
+	width: 100%;
+}
+.r-qu-body:HOVER{
+	background-color: #FBFBFB;
+}
+.r-qu-body-title{
+	font-weight: bold;
+	padding: 5px;
+	/* background-color: #C2D7E8; */
+	/* border: 1px solid #97CAE8; */
+}
+.r-qu-body-title p{
+	margin: 0px;
+	padding: 0px;
+	display: inline;
+}
+.r-qu-body-ul1{
+	list-style: none;
+	margin: 0px;
+	padding: 5px 10px;
+	width: 100%;
+}
+.r-qu-body-ul1 li{
+	padding: 5px;
+	padding-right: 25px;
+	display: table;
+	width: 95%;
+	vertical-align: middle;
+}
+.r-qu-body-ul1 li:HOVER {
+	/* background-color: #EAEAEA; */
+	cursor: default;
+	/* -webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa; */
+	background: #E8F2FE;
+}
+.r-qu-body-ul3 li:HOVER{
+	cursor: default;
+}
+.r-qu-body-ul2 li{
+	float: left;
+	width: auto;
+}
+
+.quItem-ul{
+	list-style: none;
+	padding: 0px;
+	margin: 0px;
+	table-layout: fixed;
+}
+.quItem-ul .quItemOptionName{
+	margin-top: 1px;
+	font-size: 14px;
+}
+.quItem-ul .optionMulfbk{
+	margin-top: 6px;
+}
+.quItem-ul p{
+	margin: 0px;
+	padding: 0px;
+}
+.quItem-ul li{
+	float: left;
+	display: table;
+	margin: 0px;
+	padding: 0px;
+	word-wrap: break-word;
+	word-break: break-all;
+	width: auto;
+	max-width: 930px;
+	line-height: 19px;
+	font-size: 14px;
+	color: #373A3D;
+	display: table-cell;
+	vertical-align: inherit;
+	/* _line-height: 20px;
+	 max-width: 95%; */
+}
+.quItem-ul input[type='checkbox'],.quItem-ul input[type='radio']{
+	/* margin-top: 0px; */
+/* 	margin-top: 4px; */
+	/* _margin-top:0px; */
+}
+.quItem-ul01li input[type='checkbox'],.quItem-ul01li input[type='radio']{
+	/* margin-top: 3px; */
+}
+.quItem-ul01li div{
+	float: left;
+	vertical-align: middle;
+}
+.quItem-ul01li .inputCk{
+	padding-top: 4px;
+}
+.quItem-ul01li .quItemName{
+	padding-top: 5px;
+}
+.quItem-ul li:HOVER {
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+
+.button-body-btn{
+	border-top:1px solid gray;
+	padding:15px  10px 10px 60px;
+}
+
+.footer-copyright{
+	margin-top:20px;
+	width: 100%;
+	height: 30px;
+	text-align: center;
+}
+.msg1{
+	color: #676767;
+}
+.msg2{
+	color: #D04E0F;
+}
+a.msg21:HOVER {
+	/* color: #2EADC7; */
+	font-weight: bold;
+}
+
+.qusTable{
+	margin-top: 5px;
+	margin-left: 20px;
+	border-collapse:collapse; 
+	table-layout:fixed; 
+	word-break: break-all;
+	/* border: 1px solid #CE74B1; */
+	
+	/* -webkit-box-shadow: 0 0 5px #aaa;
+	box-shadow: 0 0 5px #aaa; */
+
+	margin-bottom: 8px;
+}
+.qusTable tr th{
+	background: #D3D3D3;
+	/* background:#CE74B1; */
+	padding: 3px 6px;
+	color: white;
+	font-size: 14px;
+	font-weight: normal;
+}
+.qusTable tr td{
+	/* border-bottom: 1px solid gray; */
+	padding: 5px;
+}
+.qusTable tr:hover{
+	background: #E8F2FE;
+}
+.qusTable p{
+	margin: 0px;
+	padding: 0px;
+}
+.quItemNote{
+	float:left;
+	padding-left: 30px;
+	font-size: 12px;
+	color: #939393;
+}
+
+.priviewPositionBtn{
+	position: fixed;
+	right: 20px;
+	top: 12px;
+	z-index: 10;
+}
+
+.suQuTable{
+	border: none;
+	width: 100%;
+}
+
+.suQuTable tr{
+	
+}
+.suQuTable tr td{
+	border: none! important;
+	height: 32px! important;
+	/* padding-right: 0px! important; */
+}
+.suQuTable tr td p{
+	margin: auto;
+}
+.suQuTable tr:HOVER{
+	background: #E8F2FE! important;
+}
+.bfbTd{
+	color: #F68181;
+}
+.tdAnCount{
+	color: #5C5C5C;
+}

文件差异内容过多而无法显示
+ 1602 - 0
static/diaowen/css/sur-mobile.css


+ 6 - 0
static/diaowen/css/survey-common.css

@@ -0,0 +1,6 @@
+select {
+  border: 1px #ddd solid;
+  outline: none;
+  height: 40px;
+  color: #666;
+}

+ 304 - 0
static/diaowen/css/templatemo_style.css

@@ -0,0 +1,304 @@
+body {
+	margin: 0px;
+	padding: 0px;
+	color: #333;
+	font-family: Tahoma, Geneva, sans-serif;
+	font-size: 13px;
+/* 	line-height: 1.7em; */
+	background-color: #e9e6e6;
+	background-repeat: repeat-x;
+	background-position: top;
+}
+
+a,a:link,a:visited {
+	color: #3d8e7d;
+	color: #4C4C4C;
+	font-weight: normal;
+	text-decoration: none;
+	font-size: 12px;
+}
+
+a:hover {
+	text-decoration: underline;
+	color: #67ACC2;
+}
+
+p {
+	margin: 0px;
+	padding: 0px;
+}
+
+img {
+	border: none;
+}
+
+blockquote {
+	font-style: italic;
+	margin: 0 0 0 10px;
+}
+
+cite {
+	font-weight: bold;
+	color: #3d8e7d;
+}
+
+cite span {
+	color: #3d8e7d;
+}
+
+em {
+	color: #3d8e7d;
+}
+
+h1,h2,h3,h4,h5,h6 {
+	color: #000;
+	font-weight: normal;
+}
+
+h1 {
+	font-size: 34px;
+	margin: 0 0 20px;
+	padding: 5px 0px;
+}
+
+h2 {
+	font-size: 28px;
+	margin: 0 0 15px;
+	padding: 5px 0px;
+}
+
+h3 {
+	font-size: 24px;
+	margin: 0 0 15px;
+	padding: 0px;
+}
+
+h4 {
+	font-size: 18px;
+	margin: 0 0 15px;
+	padding: 0px;
+}
+
+h5 {
+	font-size: 16px;
+	margin: 0 0 10px;
+	padding: 0px;
+}
+
+h6 {
+	font-size: 14px;
+	margin: 0 0 5px;
+	padding: 0px;
+}
+
+.cleaner {
+	clear: both;
+}
+
+.h10 {
+	height: 10px;
+}
+
+.h20 {
+	height: 20px;
+}
+
+.h30 {
+	height: 30px;
+}
+
+.h40 {
+	height: 40px;
+}
+
+.h50 {
+	height: 50px;
+}
+
+.h60 {
+	height: 60px;
+}
+
+#body_wrapper {
+	width: 100%;
+	/* background: url(../images/body.png) top center no-repeat; */
+}
+
+.wrapper {
+	/* width: 940px; */
+	width:1000px;
+	padding: 0 10px;
+	margin: 0 auto;
+	/* background: url(../images/body.png) top center no-repeat; */
+}
+#header {
+	/* width: 940px; */
+	width:1000px;
+	height: 50px;
+	padding-top: 5px;
+}
+#header a:hover{
+	/* text-decoration: none; */
+}
+
+#site_title {
+	float: left;
+}
+
+#site_title h1 {
+	margin: 0;
+	padding: 0;
+}
+
+#site_title h1 a {
+	display: block;
+	width: 120px;
+	height: 45px;
+	color: #fff;
+	text-indent: -10000px;
+	background: url(../images/logo/logo.png) no-repeat top left;
+}
+
+#search_box {
+	float: right;
+	margin-top: 20px;
+	/* width: 240px; */
+	height: 24px;
+}
+
+#search_box form {
+	clear: both;
+	width: 240px;
+	height: 24px;
+	padding: 0;
+	margin: 0;
+}
+
+#searchfield {
+	display: block;
+	height: 24px;
+	width: 228px;
+	padding: 0 5px;
+	font-size: 12px;
+	color: #333;
+	background: none;
+	border: 1px solid #ccc;
+}
+
+/* menu */
+#menu {
+	clear: both;
+	/* width: 940px; */
+	width:1000px;
+	height: 50px;
+	background: url(../images/menu.png);
+	margin-top: 10px;
+}
+#menu ul{
+	margin: 0;
+	padding: 0;
+	list-style: none;
+}
+#menu ul li {
+	padding: 0;
+	margin: 0;
+	display: inline;
+}
+
+#menu ul li a {
+	float: left;
+	display: block;
+	width: 130px;
+	height: 30px;
+	padding: 10px 0 0 0;
+	font-size: 14px;
+	color: #67acc2;
+	text-shadow: 1px 1px 1px #fff;
+	text-align: center;
+	text-decoration: none;
+	font-weight: 700;
+	outline: none;
+	border: none;
+	letter-spacing: 1px;
+	background: url(../images/menu_divider.png) right repeat-y;
+}
+#menu ul li a:hover,#menu ul li a.currentNav {
+	color: #666;
+	text-shadow: 1px 1px 1px #fff;
+}
+
+#menu ul .last {
+	background: none;
+}
+.siteTitleNode{
+	font-size: 14px;
+	font-weight: bold;
+	line-height: 65px;
+	margin-left: 20px;
+}
+
+/* end of menu */
+#footer_wrapper {
+	clear: both;
+	width: 100%;
+	/* background: #EDEBEB; */
+	padding-top:15px;
+	background: none;
+}
+
+#footer {
+	clear: both;
+	padding: 10px 0;
+	color: #000;
+	text-align: center;
+	margin: 0 auto;
+}
+
+.footer_menu a{
+	color: #333;
+	text-decoration: none;
+}
+.footer_menu a:HOVER{
+	text-decoration: underline;
+}
+
+/** ºǫ́²Ëµ¥  **/
+#menuAdmin{
+	clear: both;
+	width: 100%;
+	height: 36px;
+	background: #459935;
+	/* background: #F59797; */
+	background-color: #65C9E6;
+}
+#menuAdmin ul {
+	/* width: 940px; */
+	width:1000px;
+	padding: 0px 10px;
+	margin: 0px auto;
+	list-style: none;
+}
+#menuAdmin ul li{
+	padding: 0px;
+	margin: 0px;
+	display: inline;
+}
+#menuAdmin ul li a {
+	float: left;
+	display: block;
+	width:120px;
+	margin-left:2px;
+	padding: 8px 0px;
+	font-size: 14px;
+	line-height: 20px;
+	color: #fff;
+	text-align: center;
+	text-decoration: none;
+	outline: none;
+	border: none;
+	letter-spacing: 1px;
+}
+#menuAdmin ul li a:hover,#menuAdmin ul li a.currentAdmin{
+	background: #37712b;
+	background: #61BCD7;
+}

文件差异内容过多而无法显示
+ 1665 - 0
static/diaowen/design.html


二进制
static/diaowen/images/1279780388A5rVCG.jpg


二进制
static/diaowen/images/1410-3.png


二进制
static/diaowen/images/404.jpg


二进制
static/diaowen/images/500.jpg


二进制
static/diaowen/images/5629512728352684315.png


二进制
static/diaowen/images/5629514927375932817.jpg


二进制
static/diaowen/images/answer-icon-1.png


二进制
static/diaowen/images/btn24.png


二进制
static/diaowen/images/btn_1.png


二进制
static/diaowen/images/dianwen_weixin.jpg


二进制
static/diaowen/images/dw-icons1-24.png


二进制
static/diaowen/images/dw-icons1-8.png


二进制
static/diaowen/images/dw_bg1.png


二进制
static/diaowen/images/dw_bgico.png


二进制
static/diaowen/images/dw_logo.png


二进制
static/diaowen/images/dw_pic01.png


二进制
static/diaowen/images/dw_pic02.png


二进制
static/diaowen/images/dw_pic03.jpg


二进制
static/diaowen/images/dw_pic04.jpg


二进制
static/diaowen/images/dw_pic04.png


二进制
static/diaowen/images/dw_pic05.jpg


二进制
static/diaowen/images/dw_pic05.png


+ 0 - 0
static/diaowen/images/dw_pic06.jpg


部分文件因为文件数量过多而无法显示