Browse Source

第一次提交

liangluogis 4 years ago
commit
0b5b794918
100 changed files with 24139 additions and 0 deletions
  1. 13 0
      .editorconfig
  2. 36 0
      .gitignore
  3. 72 0
      LICENSE
  4. 77 0
      README.md
  5. BIN
      appx.gif
  6. 29 0
      bower.json
  7. 22 0
      debug.log
  8. BIN
      favicon.ico
  9. 317 0
      gulpfile.js
  10. 6555 0
      package-lock.json
  11. 38 0
      package.json
  12. 4 0
      readme.txt
  13. 60 0
      src/404.html
  14. BIN
      src/apple-touch-icon.png
  15. 12 0
      src/browserconfig.xml
  16. 2291 0
      src/common/AjaxSend.class.ts
  17. 80 0
      src/common/MapSet.class.ts
  18. 205 0
      src/common/VerificationHelper.class.ts
  19. 2179 0
      src/configure.ts
  20. 70 0
      src/core/Base.class.ts
  21. 240 0
      src/core/BaseWidget.class.ts
  22. 267 0
      src/core/Functions.module.ts
  23. 154 0
      src/core/LoadManager.class.ts
  24. 29 0
      src/core/README.md
  25. 3 0
      src/css/README.md
  26. 11 0
      src/css/animate.min.css
  27. BIN
      src/css/fonts/YouSheBiaoTiHei.ttf
  28. BIN
      src/css/fonts/glyphicons-halflings-regular.eot
  29. 288 0
      src/css/fonts/glyphicons-halflings-regular.svg
  30. BIN
      src/css/fonts/glyphicons-halflings-regular.ttf
  31. BIN
      src/css/fonts/glyphicons-halflings-regular.woff
  32. BIN
      src/css/fonts/glyphicons-halflings-regular.woff2
  33. 1617 0
      src/css/style.scss
  34. 204 0
      src/docs/version/css/air.css
  35. 76 0
      src/docs/version/index.html
  36. BIN
      src/fonts/glyphicons-halflings-regular.eot
  37. 288 0
      src/fonts/glyphicons-halflings-regular.svg
  38. BIN
      src/fonts/glyphicons-halflings-regular.ttf
  39. BIN
      src/fonts/glyphicons-halflings-regular.woff
  40. BIN
      src/fonts/glyphicons-halflings-regular.woff2
  41. 15 0
      src/humans.txt
  42. 3 0
      src/images/README.md
  43. BIN
      src/images/chaxun.png
  44. BIN
      src/images/close.png
  45. BIN
      src/images/delete-3.png
  46. BIN
      src/images/dron.glb
  47. 0 0
      src/images/empty.jpg
  48. BIN
      src/images/logo.png
  49. BIN
      src/images/pop_list_ico_opt_n.png
  50. BIN
      src/images/pop_list_ico_opt_s.png
  51. BIN
      src/images/xinzeng-3.png
  52. BIN
      src/images/xiugai.png
  53. 95 0
      src/index.html
  54. BIN
      src/login/css/YouSheBiaoTiHei.ttf
  55. 6757 0
      src/login/css/bootstrap.css
  56. BIN
      src/login/css/img/bg.png
  57. BIN
      src/login/css/img/kuang.png
  58. BIN
      src/login/css/img/login.png
  59. BIN
      src/login/css/img/mima.png
  60. BIN
      src/login/css/img/tubiao.png
  61. BIN
      src/login/css/img/yonghu.png
  62. 205 0
      src/login/css/login copy.css
  63. 232 0
      src/login/css/login.css
  64. 61 0
      src/login/index.html
  65. 280 0
      src/login/js/login copy.js
  66. 230 0
      src/login/js/login.js
  67. 210 0
      src/main.ts
  68. 5 0
      src/robots.txt
  69. BIN
      src/themes/dyrq/images/header-background.png
  70. BIN
      src/themes/dyrq/images/header-background2.png
  71. BIN
      src/themes/dyrq/images/header-background_旧.png
  72. BIN
      src/themes/dyrq/images/header-status.jpg
  73. BIN
      src/themes/dyrq/images/menu-background.png
  74. BIN
      src/themes/dyrq/images/menu-background_旧.png
  75. BIN
      src/themes/dyrq/images/menu-title.jpg
  76. 68 0
      src/themes/dyrq/style.scss
  77. BIN
      src/tile.png
  78. 9 0
      src/vendor/README.md
  79. 7 0
      src/vendor/bootstrap-4.0.0/css/bootstrap.min.css
  80. BIN
      src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.eot
  81. 288 0
      src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.svg
  82. BIN
      src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.ttf
  83. BIN
      src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.woff
  84. BIN
      src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.woff2
  85. 7 0
      src/vendor/bootstrap-4.0.0/js/bootstrap.min.js
  86. 370 0
      src/vendor/bootstrap-4.0.0/js/zh_ch.js
  87. 10 0
      src/vendor/bootstrap-colorpicker-3.1.2/css/bootstrap-colorpicker.min.css
  88. 1 0
      src/vendor/bootstrap-colorpicker-3.1.2/css/bootstrap-colorpicker.min.css.map
  89. BIN
      src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/alpha-horizontal.png
  90. BIN
      src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/alpha.png
  91. BIN
      src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/hue-horizontal.png
  92. BIN
      src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/hue.png
  93. BIN
      src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/saturation.png
  94. 10 0
      src/vendor/bootstrap-colorpicker-3.1.2/js/bootstrap-colorpicker.min.js
  95. 1 0
      src/vendor/bootstrap-colorpicker-3.1.2/js/bootstrap-colorpicker.min.js.map
  96. 9 0
      src/vendor/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
  97. 1 0
      src/vendor/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
  98. 16 0
      src/vendor/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js
  99. 12 0
      src/vendor/bootstrap-fileinput-4.0.0/fileinput.min.css
  100. 0 0
      src/vendor/bootstrap-fileinput-4.0.0/fileinput.min.js

+ 13 - 0
.editorconfig

@@ -0,0 +1,13 @@
+# editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false

+ 36 - 0
.gitignore

@@ -0,0 +1,36 @@
+# Bower 安装的三方库文件
+#       bower 程序以及配置文件 bower.json 安装的一些三方库文件,如 jquery\lodash等.
+#       >bower install
+bower_components
+
+# 编译后发布的程序文件
+#       此文件夹中存放着编译后运行的网页程序,通过自动编译软件进行生成
+#       >npm run build
+dist
+
+# Node.js 安装的模块文件
+#       可通过 Node.js 自带包管理器 npm 以及配置文件 package.json 进行安装
+#       >npm install
+node_modules
+
+# 临时暂存文件
+#       用做存放临时测试或对比的文件
+temp
+
+# Typescript 类型定义文件夹
+#       可通过 Typings 工具以及 typings.json 配置位文件进行生成
+#       >typings install
+#   !!现文件夹中包含自定义文件,由于此文件还处在变动期,暂未直接加入 github,所以不排除以下文件夹
+#typings
+
+# VS Code 配置文件夹
+.vscode
+
+# WEbStorm 配置文件夹
+.idea
+
+# 允许建立名为 Test 的 Widget,并不会被同步
+src/widgets/Test
+
+# 不排除Vender中的文件
+!vender/**/dist

File diff suppressed because it is too large
+ 72 - 0
LICENSE


+ 77 - 0
README.md

@@ -0,0 +1,77 @@
+# AppX
+
+基于 Require、JQuery、Lodash、Typescript、Gulp等构建的模块化 Web App 框架。
+具有:自动化、模块化、懒加载、高兼容性 以及 基于 Typescript 的智能提示等特性。
+
+# 技术栈
+
+- [Node.js](https://nodejs.org/en/) --- 基础开发环境
+- [NPM](https://www.npmjs.cn/) --- Node包管理器
+- [Bootstrap](http://www.bootcss.com/) --- 前端样式框架
+- [EChart](http://echarts.baidu.com/) --- 图表展示框架
+- [Git](https://git-scm.com/) --- 版本控制以及协作开发
+- [Sass](https://www.sass.hk/) --- CSS 扩展
+- [Javascript](https://en.wikipedia.org/wiki/JavaScript) --- 主要开发语言
+- [Typescript](https://www.tslang.cn/) --- Javascript 扩展
+- [Gulp](http://gulpjs.com/) --- 自动化工作
+- [JQuery](http://jquery.com/) --- 杰出的 Javascript 库
+- [Require](https://requirejs.org/) --- 模块化js工具
+- [Lodash](https://lodash.com/) --- Javascript 函数库
+- [Bower](https://bower.io/) --- Javascript 包管理器
+- [Vue](https://cn.vuejs.org/) --- 渐进式JavaScript 框架
+
+# 环境要求
+
+| 应用名        | 版本号    | 查看版本      |
+| ------------- |:-------- | :----------- |
+| Node.js       | v6.6.0   | > node -v     |
+| npm           | v3.10.3  | > npm -v      |
+| Gulp          | v3.9.1   | > gulp -v     |
+| Typescript    | v2.0.3   | > tsc -v      |
+| Typings       | v1.4.0   | > typings -v  |
+
+**建议使用IDE** ***[Visual Studio Code](https://code.visualstudio.com)***。
+
+# 使用方法
+
+```bash
+git clone -b dev http://192.168.2.241:3000/wanghai/SuperMapWeb3D.git
+cd AppX
+npm install
+npm start
+```
+*注:* 1.国内因为 GFW 的原因 `npm install` 可能会失败(安装 Sass 失败)。
+如果失败,请用一下命令替换上方的 `npm install`, 其他命令不变。[CNPM](http://npm.taobao.org/)
+```bash
+npm install cnpm
+cnpm install
+```
+*注:* 2.请在dev分支下建立自己的分支进行开发,并定期合并到dev分支。
+1、本地从当前所在分支(dev分支)上创建一个新分支: 
+git checkout -b 新分支名 
+2、拉取远程某个分支到本地: 
+git checkout -b 本地分支名 origin/远程分支名
+
+3、功能开发完成后合并到父分支
+(1)暂存自己修改的
+(2)git checkout 父分支名 --切换到父分支
+(3)git pull --拉取别人最新代码
+(4)git merge --no-ff 合并分支名 --将自己分支合并到父分支
+(5)git push --上传父分支
+(6)如果有新代码,则需要删除本地分支,重新建本地分支
+ git branch -d <BranchName>
+
+# IIS部署注意MIME必须有如下配置项
+
+| 文件扩展名     | MIME类型                   |
+| ------------- |:--------                   |
+| .json         | application/x-javascript   |
+| .wsv          | application/octet-stream   |
+| .wasm         | application/wasm           |
+| .woff         | application/font-woff      |
+| .woff2        | application/font-woff2     |
+ 
+# 开发人员
+
+...
+

BIN
appx.gif


+ 29 - 0
bower.json

@@ -0,0 +1,29 @@
+{
+  "name": "webappframe",
+  "description": "基于 Dojo、JQuery、Lodash、Typescript、Gulp等构建的模块化 Web App 框架。",
+  "main": "index.html",
+  "authors": [
+    "Aiello Chan",
+    "Wangjiao",
+    "Zengxianwei",
+    "Songling"
+  ],
+  "license": "Apache License 2.0",
+  "homepage": "",
+  "private": true,
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "bootstrap-datetimepicker": "^0.0.11",
+    "jquery": "3.3.1",   
+    "bootstrap": "4.0.0",
+    "lodash-amd": "3.10.2",
+    "echarts": "^3.3.1",
+    "bootstrap-switch": "^3.3.2"
+  }
+}

+ 22 - 0
debug.log

@@ -0,0 +1,22 @@
+[0613/093757:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0613/093757:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0618/211502:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0618/211502:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0621/095714:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0621/095714:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0621/162720:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0621/162720:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0626/115539:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0626/115539:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0723/143523:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0723/143523:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0724/092615:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0724/092615:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0808/165738:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0808/165738:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0808/171258:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0808/171258:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[0924/155416:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[0924/155416:ERROR:node_debugger.cc(86)] Cannot start debugger server
+[1017/114414:ERROR:tcp_listen_socket.cc(76)] Could not bind socket to 127.0.0.1:6004
+[1017/114414:ERROR:node_debugger.cc(86)] Cannot start debugger server

BIN
favicon.ico


+ 317 - 0
gulpfile.js

@@ -0,0 +1,317 @@
+"use strict";
+// npm插件
+const gulp = require("gulp"),
+    ts = require("gulp-typescript"),
+    tsProject = ts.createProject("tsconfig.json"),
+    htmlMin = require("gulp-htmlmin"),
+    sass = require("gulp-sass"),
+    clean = require("gulp-clean"),
+    browserSync = require("browser-sync").create(),
+    autoPrefixer = require("gulp-autoprefixer"),
+    cleanCSS = require("gulp-clean-css"),
+    imagemin = require("gulp-imagemin"),
+    ifElse = require("gulp-if"),
+    runSequence = require("run-sequence"),
+    concat = require("gulp-concat");
+
+// 定义统一常量
+var config = {
+    product: false,
+    src: "src",
+    dist: "dist",
+    serverRoot: "./dist"
+};
+
+// 处理 TypeScript 文件
+gulp.task("typescript", function() {
+    return tsProject
+        .src()
+        .pipe(tsProject())
+        .js.pipe(gulp.dest(config.dist));
+});
+
+// 处理 HTML 文件
+gulp.task("html", function() {
+    return gulp
+        .src(config.src + "/**/*.html")
+        .pipe(
+            ifElse(
+                config.product,
+                htmlMin({
+                    collapseWhitespace: true, //删除空格
+                    conservativeCollapse: true,
+                    removeComments: true //删除注释
+                })
+            )
+        )
+        .pipe(gulp.dest(config.dist));
+});
+
+// 处理 Sass 文件
+gulp.task("sass", function() {
+    return gulp
+        .src(config.src + "/**/*.scss")
+        .pipe(sass().on("error", sass.logError))
+        .pipe(
+            autoPrefixer({
+                browsers: [
+                    "Firefox >= 38",
+                    "Safari >= 7",
+                    "Chrome >= 26",
+                    "IE >= 10",
+                    "Opera >= 12"
+                ]
+            })
+        )
+        .pipe(ifElse(config.product, cleanCSS({ compatibility: "ie8" })))
+        .pipe(gulp.dest(config.dist));
+});
+
+// 复制不需要处理的文件
+gulp.task("copy", function() {
+    return gulp
+        .src([
+            config.src + "/**/*.txt",
+            config.src + "/**/*.xml",
+            config.src + "/**/*.pdf",
+            config.src + "/**/*.obj",
+            config.src + "/**/*.glb",
+            config.src + "/**/*.wasm",
+            config.src + "/**/*.config",
+            config.src + "/**/*.gltf",
+            config.src + "/**/*.bin",
+            config.src + "/**/*.JPG",
+            config.src + "/**/*.mp3",
+            config.src + "/**/*.xlsx"
+        ])
+        .pipe(gulp.dest(config.dist));
+});
+
+// 处理字体文件
+gulp.task("font", function() {
+    return gulp
+        .src([config.src + "/**/*.{eot,svg,ttf,woff,woff2}"])
+        .pipe(gulp.dest(config.dist));
+});
+
+// 处理 css 文件
+gulp.task("css", function() {
+    return gulp
+        .src([config.src + "/**/*.css"])
+        .pipe(
+            autoPrefixer({
+                browsers: [
+                    "Firefox >= 38",
+                    "Safari >= 7",
+                    "Chrome >= 26",
+                    "IE >= 10",
+                    "Opera >= 12"
+                ]
+            })
+        )
+        .pipe(ifElse(config.product, cleanCSS({ compatibility: "ie8" })))
+        .pipe(gulp.dest(config.dist));
+});
+
+// 处理 js 文件--未做任何处理
+gulp.task("js", function() {
+    return gulp.src([config.src + "/**/*.js"])
+                .pipe(gulp.dest(config.dist));
+});
+
+
+
+// 处理图片文件
+gulp.task("image", function() {
+    gulp.src(config.src + "/**/*.{png,jpeg,jpg,gif,ico,cur}")
+        .pipe(
+            ifElse(
+                config.product,
+                imagemin([
+                    imagemin.gifsicle({ interlaced: true }),
+                    imagemin.jpegtran({ progressive: true }),
+                    imagemin.optipng({ optimizationLevel: 5 }),
+                    imagemin.svgo({
+                        plugins: [
+                            { removeViewBox: true },
+                            { cleanupIDs: false }
+                        ]
+                    })
+                ])
+            )
+        )
+        .pipe(gulp.dest(config.dist));
+});
+
+// 处理 json 文件
+gulp.task("json", function() {
+    return (
+        gulp
+            .src(config.src + "/**/*.json")
+            .pipe(gulp.dest(config.dist))
+    );
+});
+
+// 合并部分jquery 插件库文件,减少请求数量
+gulp.task("mergeJqueryFiles", function() {
+    let targetFiles = [
+        "/vendor/jquery-datatables-1.10.18/js/jquery.dataTables.min.js",
+        "/vendor/jquery-fixedheader-3.1.4/js/dataTables.fixedHeader.min.js",
+        "/vendor/jquery-fixedcolumns-3.2.5/js/dataTables.fixedColumns.min.js",
+        "/vendor/jquery-select-1.3.0/js/dataTables.select.min.js"
+    ].map(function(value) {
+        return config.src + value;
+    });
+    return gulp
+        .src(targetFiles)
+        .pipe(concat("jqueryui-merge.min.js"))
+        .pipe(gulp.dest("./dist/vendor/merge_file/js/"));
+});
+
+// 合并部分Bootstrap 插件库文件,减少请求数量
+gulp.task("mergeBootstrapFiles", function() {
+    let targetFiles = [
+        "/vendor/bootstrap-4.0.0/js/bootstrap.min.js",
+        "/vendor/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js",
+        "/vendor/bootstrap-fileinput-4.0.0/fileinput.min.js",
+        "/vendor/bootstrap-fileinput-4.0.0/zh.js",
+        "/vendor/bootstrap-validator-0.5.3/js/bootstrapValidator.min.js",
+        "/vendor/bootstrap-validator-0.5.3/js/language/zh_CN.js",
+        "/vendor/bootstrap-switch-3.3.2/js/bootstrap-switch.min.js",
+        "/vendor/bootstrap-colorpicker/js/bootstrap-colorpicker.min.js",
+        "/vendor/bootstrap-select-1.13.7/js/bootstrap-select.min.js",
+        "/vendor/bootstrap-select-1.13.7/js/locales/defaults-zh_CN.min.js"
+    ].map(function(value) {
+        return config.src + value;
+    });
+    return gulp
+        .src(targetFiles)
+        .pipe(concat("bootstrap-merge.min.js"))
+        .pipe(gulp.dest("./dist/vendor/merge_file/js/"));
+});
+
+// 合并jquery css文件,减少请求数量
+gulp.task("mergeJqueryCssFiles", function() {
+    let targetFiles = [
+        "/vendor/jquery-datatables-1.10.18/css/jquery.dataTables.min.css",
+        "/vendor/jquery-fixedheader-3.1.4/css/fixedHeader.bootstrap.min.css",
+        "/vendor/jquery-fixedcolumns-3.2.5/css/fixedColumns.bootstrap.min.css",
+        "/vendor/jquery-select-1.3.0/css/select.dataTables.min.css"
+    ].map(function(value) {
+        return config.src + value;
+    });
+    return gulp
+        .src(targetFiles)
+        .pipe(concat("jquery-mergecss.min.css"))
+        .pipe(gulp.dest("./dist/vendor/merge_file/css/")); //原有的库文件保持不动,压缩的文件放到对应的文件夹中
+});
+
+// 合并bootstrap css文件,减少请求数量
+gulp.task("mergeBootstrapCssFiles", function() {
+    let targetFiles = [
+        "/vendor/bootstrap-4.0.0/css/bootstrap.min.css",
+        "/vendor/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css",
+        "/vendor/bootstrap-fileinput-4.0.0/fileinput.min.css",
+        "/vendor/bootstrap-validator-0.5.3/css/bootstrapValidator.min.css",
+        "/vendor/bootstrap-switch-3.3.2/css/bootstrap-switch.min.css",
+        "/vendor/bootstrap-colorpicker/css/bootstrap-colorpicker.min.css",
+        "/vendor/bootstrap-select-1.13.7/css/bootstrap-select.min.css"
+    ].map(function(value) {
+        return config.src + value;
+    });
+    return gulp
+        .src(targetFiles)
+        .pipe(concat("bootstrap-mergecss.min.css"))
+        .pipe(gulp.dest("./dist/vendor/merge_file/css/")); //原有的库文件保持不动,压缩的文件放到对应的文件夹中
+});
+
+// 清除目录
+gulp.task("clean", function() {
+    return gulp
+        .src(config.dist, {
+            read: false
+        })
+        .pipe(clean());
+});
+
+// 创建一个本地 Server
+gulp.task("serve", function() {
+    browserSync.init({
+        server: {
+            baseDir: config.serverRoot
+        }
+    });
+});
+
+// 刷新浏览器中的页面
+gulp.task("reload", function() {
+    browserSync.reload();
+});
+
+// 开启一个本地服务器,并文件变化时刷新页面
+gulp.task("serve:watch", ["serve"], function() {
+    gulp.watch(config.src + "/**/*.ts", function() {
+        runSequence(["typescript", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.json", function() {
+        runSequence(["json", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.html", function() {
+        runSequence(["html", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.scss", function() {
+        runSequence(["sass", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.js", function() {
+        runSequence(["js", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.css", function() {
+        runSequence(["css", "reload"]);
+    });
+    gulp.watch(config.src + "/**/*.{png,jpeg,jpg,gif,ico}", function() {
+        runSequence(["image", "reload"]);
+    });
+    gulp.watch(
+        [config.src + "/**/*.txt", config.src + "/**/*.xml"],
+        function() {
+            runSequence(["copy", "reload"]);
+        }
+    );
+});
+
+
+// 默认任务
+gulp.task("default", ["clean"], function() {
+    gulp.start([
+        "typescript",
+        "json",
+        "sass",
+        "image",
+        "copy",
+        "font",
+        "css",
+        "js",
+        "html"
+    ]);
+});
+
+// 产品发布任务
+//  主要用于压缩所有的文件
+gulp.task("product", ["clean"], function() {
+    config.product = true;
+    gulp.start([
+        "typescript",
+        "json",
+        "sass",
+        "image",
+        "copy",
+        "font",
+        "css",
+        "js",
+        "html",
+        "mergeJqueryFiles",
+        "mergeBootstrapFiles",
+        "mergeJqueryCssFiles",
+        "mergeBootstrapCssFiles"
+    ]);
+});

File diff suppressed because it is too large
+ 6555 - 0
package-lock.json


+ 38 - 0
package.json

@@ -0,0 +1,38 @@
+{
+    "name": "AppX",
+    "version": "1.0.0",
+    "description": "基于JQuery、Lodash、Typescript、Require、Gulp 等构建的模块化 Web App 框架。",
+    "main": "index.html",
+    "scripts": {
+        "start": "gulp serve:watch",
+        "postinstall": "gulp",
+        "build": "gulp product"
+    },
+    "author": "Aiello Chan",
+    "license": "Apache License 2.0",
+    "devDependencies": {
+        "browser-sync": "^2.16.1",
+        "gulp": "^3.9.1",
+        "gulp-autoprefixer": "^3.1.1",
+        "gulp-clean": "^0.3.2",
+        "gulp-clean-css": "^2.0.13",
+        "gulp-concat": "^2.6.1",
+        "gulp-htmlmin": "^3.0.0",
+        "gulp-if": "^2.0.2",
+        "gulp-imagemin": "^3.1.1",
+        "gulp-sass": "^2.3.2",
+        "gulp-typescript": "^3.0.1",
+        "run-sequence": "^1.2.2",
+        "typescript": "^2.1.4",
+        "typings": "^1.4.0"
+    },
+    "dependencies": {
+        "graceful-fs": "^4.1.9",
+        "gulp-uglify": "^3.0.1",
+        "gulp-util": "^3.0.8",
+        "lodash": "^4.16.2",
+        "lodash-amd": "^4.16.2",
+        "minimatch": "^3.0.3",
+        "vue": "^2.6.11"
+    }
+}

+ 4 - 0
readme.txt

@@ -0,0 +1,4 @@
+公司内部
+1.权限管理系统:http://192.168.2.104:8020/
+2.巡检系统后台api:http://192.168.2.104:8011/api
+3.登录验证:http://192.168.2.104:8032/webapi

+ 60 - 0
src/404.html

@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>Page Not Found</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <style>
+
+        * {
+            line-height: 1.2;
+            margin: 0;
+        }
+
+        html {
+            color: #888;
+            display: table;
+            font-family: sans-serif;
+            height: 100%;
+            text-align: center;
+            width: 100%;
+        }
+
+        body {
+            display: table-cell;
+            vertical-align: middle;
+            margin: 2em auto;
+        }
+
+        h1 {
+            color: #555;
+            font-size: 2em;
+            font-weight: 400;
+        }
+
+        p {
+            margin: 0 auto;
+            width: 280px;
+        }
+
+        @media only screen and (max-width: 280px) {
+
+            body, p {
+                width: 95%;
+            }
+
+            h1 {
+                font-size: 1.5em;
+                margin: 0 0 0.3em;
+            }
+
+        }
+
+    </style>
+</head>
+<body>
+    <h1>Page Not Found</h1>
+    <p>Sorry, but the page you were trying to view does not exist.</p>
+</body>
+</html>
+<!-- IE needs 512+ bytes: https://blogs.msdn.microsoft.com/ieinternals/2010/08/18/friendly-http-error-pages/ -->

BIN
src/apple-touch-icon.png


+ 12 - 0
src/browserconfig.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Please read: https://msdn.microsoft.com/en-us/library/ie/dn455106.aspx -->
+<browserconfig>
+    <msapplication>
+        <tile>
+            <square70x70logo src="tile.png"/>
+            <square150x150logo src="tile.png"/>
+            <wide310x150logo src="tile-wide.png"/>
+            <square310x310logo src="tile.png"/>
+        </tile>
+    </msapplication>
+</browserconfig>

File diff suppressed because it is too large
+ 2291 - 0
src/common/AjaxSend.class.ts


+ 80 - 0
src/common/MapSet.class.ts

@@ -0,0 +1,80 @@
+import SimpleMarkerSymbol = require('esri/symbols/SimpleMarkerSymbol');
+import Color = require("esri/Color");
+import SimpleLineSymbol = require('esri/symbols/SimpleLineSymbol');
+// import Point = require("esri/geometry/Point");
+// import Polyline = require('esri/geometry/Polyline');
+// import Polygon = require('esri/geometry/Polygon');
+import SimpleFillSymbol = require('esri/symbols/SimpleFillSymbol');
+import PictureMarkerSymbol = require("esri/symbols/PictureMarkerSymbol")
+
+export = MapSet;
+
+/**
+ * 地图相关的设置类(例如点样式、线样式的)
+ * */
+class MapSet {
+    color = [255, 165, 0];
+
+    /**
+     * 设置点、线或多边形的样式
+     * @param type(point,polyline,polygon)点线面类型
+     * @param color或者图地址 选填,如果不填则使用默认颜色([0, 0, 255, 0.6]);为空则无法使用图片类型
+     * */
+    setGraphSymbol(type, color?, width?, height?) {
+        var symbol = {
+            "SimpleMarkerSymbol": null,
+            "SimpleLineSymbol": null,
+            "SimpleFillSymbol": null,
+            "PictureMarkerSymbol": null,
+        };
+        let setColor = color ? color : this.color;
+        switch (type) {
+            case "point":
+                symbol.SimpleMarkerSymbol = new SimpleMarkerSymbol(
+                    {
+                        color: new Color(setColor),
+                        style: SimpleMarkerSymbol.STYLE_DIAMOND,
+                        outline: {
+                            color: new Color(setColor),
+                            width: 0.2
+                        }
+                    }
+                );
+                break;
+            case "polyline":
+                symbol.SimpleLineSymbol = new SimpleLineSymbol({
+                    color: new Color(setColor),
+                    style: SimpleLineSymbol.STYLE_SOLID,   //线的样式 dash|dash-dot|solid等	
+                    width: 4
+                });
+                break;
+            case "polygon":
+                symbol.SimpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
+                    new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
+                        setColor, 2), new Color([0, 0, 0, 0.3])
+                )
+                break;
+            case "picture":
+                if (color && color == "") {
+                    return;
+                }
+                symbol.PictureMarkerSymbol = new PictureMarkerSymbol({
+                    "url": color,
+                    "height": height ? height : 30,
+                    "width": width ? width : 30,
+                    "type": "esriPMS",
+                    "angle": 0
+                })
+
+        }
+        if (symbol.SimpleMarkerSymbol != null) {
+            return symbol.SimpleMarkerSymbol;
+        } else if (symbol.SimpleLineSymbol != null) {
+            return symbol.SimpleLineSymbol;
+        } else if (symbol.SimpleFillSymbol) {
+            return symbol.SimpleFillSymbol;
+        } else if (symbol.PictureMarkerSymbol) {
+            return symbol.PictureMarkerSymbol;
+        }
+    }
+}

+ 205 - 0
src/common/VerificationHelper.class.ts

@@ -0,0 +1,205 @@
+/***
+ * 部分常用工具(可自行将常用的一些判断放置在此处)
+ * 部分验证是从网上搜索,若不适用可自行替换正则表达式
+ * 
+*/
+class VerificationHelper {
+    /**
+     * 检查数据是否为空
+     * @param input 判断的输入
+     * @param toast 提示函数
+     * @param message 提示(提示如果不填写则使用默认的提示)
+     */
+    isNull(input, toast, message?) {
+        let str_message = "输入不能为空";
+        if (typeof (input) == 'number' || typeof (input) == 'boolean') {
+            return true;
+        } else {
+            if (input != undefined && input != null && input != "") {
+                return true
+            } else {
+                if (message != undefined) {
+                    str_message = message;
+                }
+                toast.show(str_message);
+                return false;
+            }
+        }
+    }
+
+    /**
+     * 判断是否是正数,若是则返回输入
+     * @param input 判断的输入
+     * @param toast 提示函数
+     * @param message 提示(提示如果不填写则使用默认的提示)
+     * */
+    isNumber(input, toast, message?) {
+        let reg = /^[0-9]+.?[0-9]*$/;
+        let str_message = "请输入正数"
+        if (!reg.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 判断是否是正整数,若是则返回输入
+     * @param input 判断的输入
+     * @param toast 提示函数
+     * @param message 提示(提示如果不填写则使用默认的提示)
+     * */
+    isPositiveInteger(input, toast, message?) {
+        let reg = /^[1-9]+[0-9]*]*$/;
+        let str_message = "请输入正整数"
+        if (!reg.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+     * 本方法用于对列表输出的空值的统一设置为/(传入值为nullundefined""的统一设置),目前统一设置为--
+     * @param input 判断的输入
+     * */
+    setNullAndUndefined(input) {
+        if(typeof (input) == "number"){
+            return input
+        }else if (input == "Null"||input == "null"||input == null || input == undefined || input == "") {
+            return "/"
+        } else {
+            return input
+        }
+    }
+
+    
+    /**
+     * 本方法用于对列表输出的空值的统一设置为空(传入值为nullundefined""的统一设置),目前统一设置为--
+     * @param input 判断的输入
+     * */
+    setNullAndUndefinedEnpty(input) {
+        if (input == "Null"||input == "null"||input == "NULL"||input == null || input == undefined || input == "") {
+            return ""
+        } else {
+            return input
+        }
+    }
+
+    /**
+     * 判断输入邮箱是否正确
+     * @param input 判断的输入
+     * @param toast 提示函数
+     * @param message 提示(提示如果不填写则使用默认的提示)
+     * */
+    isEmail(input, toast, message?) {
+        let reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
+        let str_message = "邮箱输入错误"
+        if (!reg.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+    * 判断输入手机号码是否正确
+    * @param input 判断的输入
+    * @param toast 提示函数
+    * @param message 提示(提示如果不填写则使用默认的提示)
+    * */
+    isTelephone(input, toast, message?) {
+        let reg = /^[1][3,4,5,7,8][0-9]{9}$/;;
+        let str_message = "手机号码输入有误"
+        if (!reg.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+    * 判断输入号码是否正确
+    * @param input 判断的输入
+    * @param toast 提示函数
+    * @param message 提示(提示如果不填写则使用默认的提示)
+    * */
+    isPhone(input, toast, message?) {
+        let reg = /^[1][3,4,5,7,8][0-9]{9}$/;;
+        let reg2 = /^(0[0-9]{2,3}\-)([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/;
+        let str_message = "号码输入有误";
+        if (!reg.test(input) && !reg2.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+    * 判断输入座机号码是否正确
+    * @param input 判断的输入
+    * @param toast 提示函数
+    * @param message 提示(提示如果不填写则使用默认的提示)
+    * */
+    isMobilePhone(input, toast, message?) {
+        let reg = /^(0[0-9]{2,3}\-)([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/;     ;
+        let str_message = "座机号码输入有误"
+        if (!reg.test(input)) {
+            if (message != undefined) {
+                str_message = message;
+            }
+            toast.show(str_message);
+            return false;
+        } else {
+            return true;
+        }
+    }
+
+    /**
+    * 地图内鼠标样式变为默认(CursorDefault的样式在src/css/style.css的.cesium-viewer.CursorDefault中)
+    * @param set 是否将地图内的鼠标样式变为默认(true变为箭头、false小手样式)
+    * */
+    setCursorDefault(set) {
+        if (set) {
+            $(".cesium-viewer").addClass("CursorDefault")
+        } else {
+            $(".cesium-viewer").removeClass("CursorDefault")
+        }
+    }
+
+    /**
+    * 判断传回的字段是SmX还是SMX
+    * @param set 是否将地图内的鼠标样式变为默认(true变为箭头、false小手样式)
+    * */
+    checkSm(data) {
+        let x, y, h;
+        x = data.attributes["SMX"];
+        if (x) {
+            return true
+        } else {
+            return false;
+        }
+    }
+
+}
+export = VerificationHelper;

File diff suppressed because it is too large
+ 2179 - 0
src/configure.ts


+ 70 - 0
src/core/Base.class.ts

@@ -0,0 +1,70 @@
+/**
+ * 根基类
+ * 该类中定义了最基础的类属性以及类结构
+ */
+class Base {
+    debug = true;
+    AppX = window["AppX"] || <any>{};
+    root = window["AppX"].root || undefined;
+
+    // 构造函数
+    constructor() {
+        
+    }
+
+    /**
+     * 启动函数
+     */
+    startup() {
+
+    }
+
+    /**
+     * 销毁函数
+     */
+    destroy() { 
+
+    }
+
+    /**
+     * 输出普通信息函数
+     * 可以在此做信息重定向显示
+     * 以及各种数据采集
+     * 保证对程序输出的可控
+     */
+    log(message?: any, ...optionalParams: any[]) {
+        if (this.debug === true) {
+            console.log.apply(this, arguments);
+        } else {
+            // this.bug.apply(this, arguments);
+        }
+    }
+ 
+    /**
+     * 错误信息输出函数
+     * 可以在此做信息重定向显示
+     * 以及错误信息回传上报
+     * 保证对程序错误的及时监控和修复
+     * @param {any} message 错误消息
+     */
+    bug(message?: any, ...optionalParams: any[]) {
+        if (this.debug === true) {
+            console.error.apply(this, arguments);
+        } else {
+            if (this.AppX.runtimeConfig.toast) {
+                this.AppX.runtimeConfig.toast.Show(message);
+            }
+        }
+    }
+
+    /**
+     * 通用的弹框
+     * @param message 消息内容
+     */
+    alert(message?:string){
+        if(message){
+            alert(message);
+        }
+    }
+}
+export = Base;

+ 240 - 0
src/core/BaseWidget.class.ts

@@ -0,0 +1,240 @@
+import Base = require('core/Base.class');
+import Functions = require('core/Functions.module');
+
+/**
+ * 此为所有 Widget 类型控件的基类
+ * 
+ * 其中包含了每个 Widget 所需的基础元素
+ * 
+ * 如:变量、生命周期函数、初始化函数
+ */
+class BaseWidget extends Base {
+    // type: String
+    // 控件类型,值应为 widget
+    type = "widget";
+    header: {};
+    /**** 以下属性都能在根目录 config 文件中进行配置 ****/
+    // id: String
+    // 控件的唯一 id,如果没有设置,系统将自动为其设置
+    id: string;
+    AppX: AppX;
+    root: string;
+    domObj = $();
+    label: string;
+    icon: string;
+    uri: string;
+
+    /**
+     * 后台接口地址
+     */
+    apiRoot: string;
+
+    /**
+     * 用户识别码
+     */
+    userToken: string;
+
+    /**
+     * 提示信息框
+     */
+    toast: WidgetToast;
+    popup: WidgetPopup;
+    dataPopup: WidgetDataPopup;
+    dataPanel: WidgetDataPanel;
+    loadWait: WidgetLoadWait;
+    loadMask: WidgetLoadMask;
+    config: any;
+    appConfig: any;
+    folderUrl: string;
+    started = false;
+    name: string;
+    baseClass: string;
+    template: string;
+    widgetPath: string;
+    configPath?: string;
+    templatePath?: string;
+    readyCallback?: Function;
+    panelSelector?: string;
+    afterDestroyCallback?: Function;
+
+    /*** 生命周期方法 ***/
+    constructor(settings: {
+        widgetPath: string,
+        configPath?: string,
+        templatePath?: string,
+        panelSelector?: string,
+        readyCallback?: Function,
+        afterDestroyCallback?: Function
+    }) {
+        super();
+        // 使用 settings
+        // 设置当前控件的位置 url
+        this.widgetPath ? null : this.widgetPath = settings.widgetPath;
+        this.configPath = settings.configPath || undefined;
+        this.templatePath = settings.templatePath || undefined;
+        this.panelSelector = settings.panelSelector || undefined;
+        this.readyCallback = settings.readyCallback || undefined;
+        this.afterDestroyCallback = settings.afterDestroyCallback || undefined;
+
+        // 设置全局配置项
+        this.appConfig = this.AppX.appConfig || {};
+
+        // 设置全局变量
+        this.apiRoot = this.AppX.appConfig.apiRoot.replace(/\/+$/, "");
+        this.userToken = this.AppX.appConfig.userToken;
+        this.toast = this.AppX.runtimeConfig.toast;
+        this.popup = this.AppX.runtimeConfig.popup;
+        this.dataPopup = this.AppX.runtimeConfig.dataPopup;
+        this.dataPanel = this.AppX.runtimeConfig.dataPanel;
+        this.loadWait = this.AppX.runtimeConfig.loadWait;
+        this.loadMask = this.AppX.runtimeConfig.loadMask;
+        this.header = {
+            'Authorization': 'bearer ' + this.userToken
+        };
+        // 将当前模块样式表加载进页面
+        this.setStyle();
+
+        // 设置配置文件,之后在模块内任意位置用 this.config 进行访问
+        // 成功获得配置文件后,将会调用 startup启动应用
+        this.initConfig({
+            configPath: this.configPath
+        }, function () {
+            this.initTemplate({
+                templatePath: this.templatePath
+            }, function () {
+                this._init();
+            });
+        });
+    }
+
+    /**
+     * 用于模块初始化,不允许子类调用
+     */
+    protected _init() {
+        this.startup();
+        this.ready();
+    }
+
+    /**
+     * 初始化完成自动调用该函数
+     */
+    startup() {
+
+    }
+
+    /**
+     * 在当前模块准备完成时,通知调用模块
+     */
+    ready() {
+        var callback = this.readyCallback;
+        this.readyCallback = null;
+        if (callback) {
+            callback();
+        }
+    }
+
+    /**
+     * 销毁自身创建的相关资源包含 Dom 对象等,但 不包含 样式文件及script文件(因为可能有其他模块在使用)
+     */
+    public destroy() {
+        super.destroy();
+    }
+
+    /**
+     * 在销毁自身后时,回调模块
+     */
+    afterDestroy() {
+        if (this.afterDestroyCallback) {
+            this.afterDestroyCallback();
+        }
+    }
+
+    /**
+     * 初始化配置文件
+     * 即为通过 Ajax 异步加载配置文件
+     * @param {Object} args 配置文件路径
+     * @param {Function} callback 回调函数
+     */
+    initConfig(args: { configPath?: string }, callback: Function) {
+        (function (that) {
+            var url = Functions.concatUrl(that.widgetPath, args.configPath || "/config.json");
+            $.ajax(url, {
+                dataType: "json",
+                success: function (data) {
+                    that.config = data;
+                    callback.call(that);
+                },
+                error: function (XMLHttpRequest, textStatus, errorThrown) {
+                    that.bug("获取" + url + "失败:" + textStatus);
+                }
+            });
+        })(this);
+    }
+
+    /**
+     * 初始化模板
+     * 即为通过 Ajax 加载模板数据
+     * @param {Object} args 配置文件路径
+     * @param {Function} callback 回调函数
+     */
+    initTemplate(args: { templatePath?: string }, callback: Function) {
+        (function (that) {
+            var url = Functions.concatUrl(that.widgetPath, args.templatePath || "/Widget.html");
+            $.ajax(url, {
+                dataType: "text",
+                success: function (data) {
+                    that.template = data;
+                    callback.call(that);
+                },
+                error: function (XMLHttpRequest, textStatus, errorThrown) {
+                    that.bug("获取" + url + "失败:" + textStatus);
+                }
+            });
+        })(this);
+    }
+
+    /**
+     * 将 Style 以标签的方式添加进 Dom 文档。
+     * @param url style地址【选填】,默认路径是当前模块css下的style.css
+     */
+    setStyle(url?: string) {
+        var styleID = this.widgetPath.replace(/\//, "-") + "-css";
+        if ($("#" + styleID).length > 0) { // 已经加载过           
+            return;
+        }
+        // 添加引用
+        var linkTag = $('<link id="' + styleID + '" rel="stylesheet" href="' + (url || this.widgetPath + "/css/style.css") + '"/>');
+        $($('head')[0]).append(linkTag);
+    }
+
+    /**
+     * 公共的设置 HTML 函数
+     * 将指定的 HTML 字符串添加到对应的 Dom 节点中
+     * @param html html字符串
+     * @param selector Dom节点【选填】, 默认节点为 body
+     */
+    public setHtml(html: string, selector?: string) {
+        var currentSelector = selector || this.panelSelector || this.config.panelSelector || this.AppX.appConfig.mainContainer
+        if (currentSelector) {
+            $(currentSelector).append(html);
+        } else {
+            $($('body')[0]).append(html);
+        }
+
+        this.setDomObj();
+    }
+
+    /**
+     * 将添加好的节点缓存到本地变量
+     */
+    setDomObj() {
+        if (this.baseClass === undefined) {
+            // this.bug('控件"' + this.widgetPath + '" 中未设置变量 "baseClass"!');
+        } else {
+            if (this.baseClass !== "") {
+                this.domObj = $('.' + this.baseClass);
+            }
+        }
+    }
+}
+export = BaseWidget;

+ 267 - 0
src/core/Functions.module.ts

@@ -0,0 +1,267 @@
+declare function  Vue(params):void;
+/*** 以下皆为通用的功能性函数 ***/
+
+/*** url 操作函数 ***/
+/**
+* 用于向字符串首部添加一个/符号,若存在,则不添加
+* @method addFirstSlash
+* @for (所属类名)
+* @param {string} string 传入待处理的字符串
+* @return {string} 处理完成的字符串,头部一定有且仅有一个/
+*/
+export function addFirstSlash(string: string) {
+    return string[0] === "/" ? string : "/" + string;
+}
+
+/**
+* 移除末尾的 /
+* @method removeLastSlash
+* @for (所属类名)
+* @param {string} string 待处理字符串
+* @return {string} 已移除末尾的 / 符号的字符串
+*/
+export function removeLastSlash(string: string) {
+    return string.replace(/\/+$/, "");
+}
+
+/**
+* 将两个url进行合并
+* @method concatUrl
+* @for (所属类名)
+* @param {string} frontUrl 前半段url
+* @param {string} behindUrl 后部分url
+* @return {string} 将两个url进行合并并正确添加/符号的新url
+*/
+export function concatUrl(frontUrl: string, behindUrl: string) {
+    return this.removeLastSlash(frontUrl) + this.addFirstSlash(behindUrl);
+}
+
+/*** 操作控制函数 ***/
+/**
+* Description:计数用的,当加或减操作使得计数器为0时,触发绑定的回调函数
+* @class CountToRun
+*/
+export class CountToRun {
+    private count: number = 0;
+    private callback: Function = null;
+    private scope: Object = null;
+
+    constructor(callback?: Function, scope?: Object) {
+        callback ? this.callback = callback : null;
+        scope ? this.scope = scope : null;
+    }
+
+    setCallback(callback) {
+        this.callback = callback;
+    }
+
+    setScope(scope) {
+        scope ? this.scope = scope : null;
+    }
+
+    setCount(count:number){
+        this.count = count;
+    }
+
+    getCount() {
+        return this.count;
+    }
+
+    plus() {
+        if (++(this.count) === 0) {
+            this.emit();
+        }
+    }
+
+    minus() {
+        if (--(this.count) === 0) {
+            this.emit();
+        }
+    }
+
+    emit() {
+        if (this.scope) {
+            this.callback.bind(this.scope)();
+        } else {
+            this.callback();
+        }
+    }
+
+}
+    
+/*** 将Date转化为指定格式的String
+*月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符, 
+*年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字) 
+*DateFormat(date,"yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423 
+*DateFormat(date,"yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
+* @method DateFormat
+* @param {Date} date 日期
+* @param {string} fmt 格式字符串
+* @return {string} 将两个url进行合并并正确添加/符号的新url
+*/
+export function DateFormat(date:Date,fmt:string) { 
+    var o = {
+        "M+": date.getMonth() + 1, //月份 
+        "d+": date.getDate(), //日 
+        "h+": date.getHours(), //小时 
+        "m+": date.getMinutes(), //分 
+        "s+": date.getSeconds(), //秒 
+        "q+": Math.floor((date.getMonth() + 3) / 3), //季度 
+        "S": date.getMilliseconds() //毫秒 
+    };
+    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
+    for (var k in o)
+    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+    return fmt;
+}
+
+/**
+ * @method 获取图层字典所有字段字典表信息
+ * @param {string} url 图层地址
+ * @param {function} callback 回调函数 返回回调函数array=[{url:url,fieldname:fieldname,fdic:{key:value,key:value,...}},...]
+ */
+export function GetDicItemsFromLayers(url:string,callback) {
+    $.ajax({
+        type: 'get',
+        url: url+"?f=json",
+        dataType:"json",
+        success: (result) => {
+            if (result == null || result.fields==null) return;
+            var dic=[];
+            result.fields.forEach(function(item,index){
+                if(item.domain!=null){//有字典域
+                    var obj=new Object();
+                    for(var i=0;i<item.domain.codedValues.length;i++){
+                        var citem=item.domain.codedValues[i];                         
+                        obj[citem.code]=citem.name;
+                    }
+                    var oitem={
+                        "url":url,
+                        "fieldname":item.name,
+                        "fdic":obj
+                    }
+                    dic.push(oitem);
+                }
+            });
+            callback(dic);
+        }
+    });
+}
+
+/**
+ * 获取当前时间(string
+ */
+export function getNowFormatDate() {
+        var mydate = new Date();
+        mydate = new Date();
+        var currentdate = mydate.getFullYear() + "-" + (mydate.getMonth() + 1) + "-" + mydate.getDate() + " " + mydate.getHours() + ":" + mydate.getMinutes() + ":" + mydate.getSeconds();
+        return currentdate;
+}
+
+/**
+ * 转换成小时、分钟、秒
+ * @param {number} times 秒
+ */
+export function  getTimes(times){
+     var hour=0, minute=0,
+     second=0;//时间默认值
+     if(times > 0){
+        hour=Math.floor(times / 3600);
+        minute =Math.floor((Math.floor(times)-hour*3600)/ 60);
+        second = Math.floor(times)-(hour*3600)-(minute * 60);
+     }  
+     return {hour:hour,minute:minute,second:second};
+} 
+
+/**
+ * pdf预览   
+ * @param pdfurl 要预览的pdf链接
+ * @callback 回调函数
+ */
+export function pdfPreviewer(pdfurl,callback){
+    $.ajax({
+        url:"./vendor/pdfpreview/web/viewer.html",
+        type:"get",
+        async:false,
+        success:function(data){
+            let res = data.split("xcpdf").join(`"${pdfurl}"`);
+            callback(res);
+        }.bind(this),
+        error:function(err){
+            console.log("请求预览插件出现问题:",err);
+        }.bind(this)
+    })
+}
+
+/**
+ * 获取ajax的header
+ * @param {string} Token 用户识别码
+ */
+export function getHeader(Token:string){
+    return {
+        'Token':Token
+    }
+}
+
+/**
+ * 获取vue生成实例对象
+ * @param vueConfig
+ */
+export function getVueConfig(vueConfig){
+    var vueObj=null;
+    if(!vueConfig || typeof vueConfig != 'object'){
+        console.error("Widgets文件中vueConfig出现错误");
+    }else{
+        vueObj = new Vue(vueConfig);
+    }    
+    return vueObj;
+}
+
+/**
+ * 16进制颜色转为RGB格式
+ * @param sHex 如:#000000
+ * @returns Array
+ */
+export function colorRgb(sHex){
+        var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+        var sColor = sHex.toLowerCase();
+        if(sColor && reg.test(sColor)){
+            if(sColor.length === 4){
+                var sColorNew = "#";
+                for(var i=1; i<4; i+=1){
+                    sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));	
+                }
+                sColor = sColorNew;
+            }
+            var sColorChange = [];
+            for(var i=1; i<7; i+=2){
+                sColorChange.push((parseInt("0x"+sColor.slice(i,i+2))/255.0).toFixed(3));	
+            }
+        
+            return sColorChange;
+        }else{
+            return sColor;	
+        }
+}
+
+//四舍五入,并保留小数位数
+export function NumberFormat(value: number, num: number) {
+    var result = value.toFixed(num);
+    if (num > 0) {
+        var values = result.toString().split('.');
+        var preValue = values[0];
+        if (values.length == 1) {
+            result = preValue;
+            result += '.';
+            for (var i = 0; i < num; i++)
+                result += '0';
+        }
+        else if (values.length > 1) {
+            var zeroValue = values[1].substr(0, num);
+            for (var i = 0; i < num - zeroValue.length; i++)
+                zeroValue += '0';
+            result = preValue + "." + zeroValue;
+        }
+    }
+    return result;
+}

+ 154 - 0
src/core/LoadManager.class.ts

@@ -0,0 +1,154 @@
+import Base = require("core/Base.class");
+import Functions = require('core/Functions.module');
+
+/**
+ * 模块加载管理器
+ * 根据配置文件来分析构建依赖树
+ * 然后将所有依赖树分层,逐个加载每层中的元素
+ */
+class LoadManager extends Base {
+    // CountToRun 的一个实例
+    // 用于保证每一层所有模块加载完成后,执行一个特定的函数(继续加载下一层)
+    taskManager: Functions.CountToRun;
+    countForDependTree: number = 0;
+    dependTree: Array<any>;
+
+    /**
+     * 启动初始化
+     */
+    startup() {
+
+    }
+
+    /**
+     * 加载配置文件
+     * @param {any} config 配置文件
+     */
+    load(config) {
+        if (!config) {
+            this.bug("未传入Config!");
+        }
+        // 根据配置来构建依赖树
+        this.dependTree = this.analysisDependTree(config);
+
+        // 加载这些模块,传入参数可以设置
+        this.loadModules(this.dependTree[this.countForDependTree]);
+    }
+
+    /**
+     * 构建依赖树
+     * @param {any} config 配置信息
+     */
+    analysisDependTree(config) {
+        if (!config) {
+            return;
+        }
+        var result = new Array();
+        var rest = config;
+        result.push([{ name: undefined }, { name: "" }]);
+        for (var level = 1; ; level++) {
+            var a = new Array();
+            var b = new Array();
+            var founded = false;
+            for (var i = 0, j = rest.length; i < j; i++) {
+                founded = false;
+                for (var n = 0, m = result[level - 1].length; n < m; n++) {
+                    if (result[level - 1][n].name === rest[i].depend) {
+                        a.push(rest[i]);
+                        founded = true;
+                        break;
+                    }
+                }
+                if (founded === false) {
+                    b.push(rest[i]);
+                }
+            }
+            if (a.length === 0) {
+                result.push(b);
+                return result.slice(1);
+            }
+            if (a.length === rest.length) {
+                result.push(a);
+                return result.slice(1);
+            }
+            result.push(a);
+            rest = b;
+        }
+    }
+
+
+    /**
+     * 根据传入的包含模块地址的数组,进行调用
+     * 只管require以及安排计数
+     * @param {Array<any>} currentWidgetsConfig 当前配置模块配置
+     */
+    loadModules(currentWidgetsConfig: Array<any>) {
+        if (!currentWidgetsConfig) {
+            return;
+        }
+        var that = this;
+
+        /* 依次加载每层模块 */
+        // 初始化 CountToRun 实例
+        that.taskManager = new Functions.CountToRun(function () {
+            /* 当计数器为 0 时,需要执行的回调函数 */
+            // 设置层数+1
+            that.countForDependTree++;
+            // 根据层数来加载对应层的所有模块
+            that.loadModules(that.dependTree[that.countForDependTree]);
+        }, that);
+        that.taskManager.setCount(currentWidgetsConfig.length);
+
+        // 获取当前层需要加载的所有模块的地址
+        var widgetUrls = that.getWidgetsUrl(currentWidgetsConfig);
+
+        // 根据地址加载这些模块
+        require({}, widgetUrls, function () {
+            /* 初始化每个模块 */
+            for (var i = 0, j = arguments.length; i < j; i++) {
+                // 当前模块的配置文件地址
+                var currentWidgetCongfigPath = Functions.concatUrl(
+                    currentWidgetsConfig[i].url,
+                    currentWidgetsConfig[i].configPath
+                );
+                // 当前文件的模板文件地址
+                var currentWidgetTemplatePath = Functions.concatUrl(
+                    currentWidgetsConfig[i].url,
+                    currentWidgetsConfig[i].templatePath
+                )
+                // 初始化当前模块
+                new (arguments[i])({
+                    // 传入模块的地址
+                    widgetPath: currentWidgetsConfig[i].url,
+                    // 传入模块的配置文件地址
+                    configPath: currentWidgetsConfig[i].configPath ?
+                        currentWidgetCongfigPath : undefined,
+                    // 传入模块的模板文件地址
+                    templatePath: currentWidgetsConfig[i].templatePath ?
+                        currentWidgetTemplatePath : undefined,
+                    // 模块加载完成后的回调函数
+                    // 此处绑定的函数为:
+                    //      让CountToRun的计数器减一
+                    readyCallback: that.taskManager.minus.bind(that.taskManager)
+                });
+            }
+        });
+    }
+
+    /**
+     * 函数将所有的模块做解析并返回由所有模块地址组成的一个数组
+     * 每个数组元素为一个完整的模块地址如["widgets/BaseMap/Widget"]
+     * @param {Array<{}>} config 当前层的所有模块
+     */
+    getWidgetsUrl(config: Array<{}>) {
+        var widgetsUrl: Array<string>;
+
+        if (_.isArray(config) === true) {
+            widgetsUrl = _.map(config, (widget: any) => {
+                return Functions.concatUrl(widget.url, widget.main);
+            })
+        }
+        return widgetsUrl;
+    }
+}
+export = LoadManager;

+ 29 - 0
src/core/README.md

@@ -0,0 +1,29 @@
+# Core
+
+此为框架中核心代码存放处。
+
+现在共有以下文件:
+
+1. [Base.class.ts](#Base.class.ts)
+2. [BaseWidget.class.ts](#BaseWidget.class.ts)
+3. [Functions.module.ts](#Functions.module.ts)
+4. [LoadManager.class.ts](#LoadManager.class.ts)
+
+*注:*点击即可跳转到对应文件的说明
+
+# Base.class.ts
+
+定义框架内所有类的基类,包含最基础的变量以及方法。
+
+# BaseWidget.class.ts
+
+定义框架内所有 Widget 类的基类,其继承自 `Base.class` 并增加了相对应的大量属性和**生命周期**。
+
+# Functions.module.ts
+
+此模块中存放了一些公共的通用的函数,其作为一个狂降价私有公共函数库来使用(类似`Lodash`和`Underscore`但是只提供他们没有的一些方法)。
+此模块大家可自行增加公共方法,并一起重构和维护。
+
+# LoadManager.class.ts
+
+此文件为模块加载管理器,它通过 `main.ts` 中传入的配置信息,来构建所有模块的依赖树,然后按层次加载这些模块。

+ 3 - 0
src/css/README.md

@@ -0,0 +1,3 @@
+# CSS
+
+此文件夹中存放全局使用的 `css` 文件。

File diff suppressed because it is too large
+ 11 - 0
src/css/animate.min.css


BIN
src/css/fonts/YouSheBiaoTiHei.ttf


BIN
src/css/fonts/glyphicons-halflings-regular.eot


File diff suppressed because it is too large
+ 288 - 0
src/css/fonts/glyphicons-halflings-regular.svg


BIN
src/css/fonts/glyphicons-halflings-regular.ttf


BIN
src/css/fonts/glyphicons-halflings-regular.woff


BIN
src/css/fonts/glyphicons-halflings-regular.woff2


File diff suppressed because it is too large
+ 1617 - 0
src/css/style.scss


+ 204 - 0
src/docs/version/css/air.css

@@ -0,0 +1,204 @@
+@media print {
+    *,
+    *:before,
+    *:after {
+        background: transparent !important;
+        color: #000 !important;
+        box-shadow: none !important;
+        text-shadow: none !important;
+    }
+    a,
+    a:visited {
+        text-decoration: underline;
+    }
+    a[href]:after {
+        content: " (" attr(href) ")";
+    }
+    abbr[title]:after {
+        content: " (" attr(title) ")";
+    }
+    a[href^="#"]:after,
+    a[href^="javascript:"]:after {
+        content: "";
+    }
+    pre,
+    blockquote {
+        border: 1px solid #999;
+        page-break-inside: avoid;
+    }
+    thead {
+        display: table-header-group;
+    }
+    tr,
+    img {
+        page-break-inside: avoid;
+    }
+    img {
+        max-width: 100% !important;
+    }
+    p,
+    h2,
+    h3 {
+        orphans: 3;
+        widows: 3;
+    }
+    h2,
+    h3 {
+        page-break-after: avoid;
+    }
+}
+
+html {
+    font-size: 12px;
+}
+
+@media screen and (min-width: 32rem) and (max-width: 48rem) {
+    html {
+        font-size: 15px;
+    }
+}
+
+@media screen and (min-width: 48rem) {
+    html {
+        font-size: 16px;
+    }
+}
+
+body {
+    line-height: 1.85;
+}
+
+p,
+.air-p {
+    font-size: 1rem;
+    margin-bottom: 1.3rem;
+}
+
+h1,
+.air-h1,
+h2,
+.air-h2,
+h3,
+.air-h3,
+h4,
+.air-h4 {
+    margin: 1.414rem 0 .5rem;
+    font-weight: inherit;
+    line-height: 1.42;
+}
+
+h1,
+.air-h1 {
+    margin-top: 0;
+    font-size: 3.998rem;
+}
+
+h2,
+.air-h2 {
+    font-size: 2.827rem;
+}
+
+h3,
+.air-h3 {
+    font-size: 1.999rem;
+}
+
+h4,
+.air-h4 {
+    font-size: 1.414rem;
+}
+
+h5,
+.air-h5 {
+    font-size: 1.121rem;
+}
+
+h6,
+.air-h6 {
+    font-size: .88rem;
+}
+
+small,
+.air-small {
+    font-size: .707em;
+}
+
+
+/* https://github.com/mrmrs/fluidity */
+
+img,
+canvas,
+iframe,
+video,
+svg,
+select,
+textarea {
+    max-width: 100%;
+}
+
+@import url(http://fonts.googleapis.com/css?family=Open+Sans:300italic,300);
+body {
+    color: #444;
+    font-family: 'Open Sans', Helvetica, sans-serif;
+    font-weight: 300;
+    margin: 6rem auto 1rem;
+    max-width: 48rem;
+    text-align: center;
+}
+
+img {
+    border-radius: 50%;
+    height: 200px;
+    margin: 0 auto;
+    width: 200px;
+}
+
+a,
+a:visited {
+    color: #3498db;
+}
+
+a:hover,
+a:focus,
+a:active {
+    color: #2980b9;
+}
+
+pre {
+    background-color: #fafafa;
+    padding: 1rem;
+    text-align: left;
+    white-space: pre-wrap;
+    /*css-3*/
+    white-space: -moz-pre-wrap;
+    /*Mozilla,since1999*/
+    white-space: -pre-wrap;
+    /*Opera4-6*/
+    white-space: -o-pre-wrap;
+    /*Opera7*/
+    word-wrap: break-word;
+    /*InternetExplorer5.5+*/
+}
+
+blockquote {
+    margin: 0;
+    border-left: 5px solid #7a7a7a;
+    font-style: italic;
+    padding: 1.33em;
+    text-align: left;
+}
+
+ul,
+ol,
+li {
+    text-align: left;
+}
+
+p {
+    color: #777;
+}
+
+ul li {
+    list-style: disc outside;
+    margin-left: 1.2em;
+}

+ 76 - 0
src/docs/version/index.html

@@ -0,0 +1,76 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <title>版本介绍</title>
+    <link rel="stylesheet" href="css/air.css">
+</head>
+
+<body>
+    <!--#insert file="-markdown.html" -->
+    <link rel="stylesheet" href="github-markdown.css">
+    <h1 id="-3-0-0">西南科技大学地下管线管理信息系统3.0.0</h1>
+    <hr>
+    <h3 id="-2019-03-22">更新日期:2019.3.22</h3>
+    <p><strong>点选查询</strong></p>
+    <pre><code>修改查询容差为3个像素。
+</code></pre>
+    <p><strong>停用气分析</strong></p>
+    <pre><code>实现查询调压箱用户,支持超过1000个调压箱,添加故障点符号。
+</code></pre>
+    <p><strong>数据面板</strong></p>
+    <pre><code>调整导出表格过程在后台进行,使用后台分页。
+</code></pre>
+    <p><strong>连通性分析</strong></p>
+    <pre><code>使用排序字段、考虑字段可见性、取消1000条数据限制。
+</code></pre>
+    <p><strong>爆管分析</strong></p>
+    <pre><code>添加爆管点符号,排序字段、考虑字段可见性、取消1000条数据限制。
+</code></pre>
+    <p><strong>缓冲区分析</strong></p>
+    <pre><code>使用排序字段、考虑字段可见性、取消1000条数据限制。
+</code></pre>
+    <p><strong>属性标注</strong></p>
+    <pre><code>修改字段列表样式,添加”全选“,”全不选“按钮。
+</code></pre>
+    <p><strong>疑问标识</strong></p>
+    <pre><code>不清空历史输入项。
+</code></pre>
+    <p><strong>调整页脚样式</strong></p>
+    <pre><code>调整比例尺、坐标整体样式。
+</code></pre>
+    <p><strong>分屏显示</strong></p>
+    <pre><code>修改地图背景色为白色。
+</code></pre>
+    <p><strong>查询模块</strong></p>
+    <pre><code>使用排序字段、考虑字段可见性、取消1000条数据限制。
+</code></pre>
+    <p><strong>按编号查询</strong></p>
+    <pre><code>新增模块,按设备编号查询数据。
+</code></pre>
+    <p><strong>图层选择列表</strong></p>
+    <pre><code>默认只显示本单位图层,隐藏其他单位图层,点击"更多"才显示其他单位图层。
+</code></pre>
+    <p><strong>统计模块</strong></p>
+    <pre><code>提高画范围面的透明度。
+</code></pre>
+    <p><strong>添加版本说明页面</strong></p>
+    <pre><code>点击页脚版本号,会打开版本说明页面,显示该版本的更新内容。
+</code></pre>
+    <p><strong>复制数据</strong></p>
+    <pre><code>修改表格数据可复制。
+</code></pre>
+    <p><strong>放大镜</strong></p>
+    <pre><code>修改为在放大镜中只显示用户有权查看的管线。
+</code></pre>
+    <p><strong>SQL查询</strong></p>
+    <pre>
+<code>优化构建查询过程:
+添加提示、
+使用模糊查询时自动添加任意字符串占位符(%)、
+可选择查询条件任意部分进行替换。
+</code></pre>
+</body>
+
+</html>

BIN
src/fonts/glyphicons-halflings-regular.eot


File diff suppressed because it is too large
+ 288 - 0
src/fonts/glyphicons-halflings-regular.svg


BIN
src/fonts/glyphicons-halflings-regular.ttf


BIN
src/fonts/glyphicons-halflings-regular.woff


BIN
src/fonts/glyphicons-halflings-regular.woff2


+ 15 - 0
src/humans.txt

@@ -0,0 +1,15 @@
+# humanstxt.org/
+# The humans responsible & technology colophon
+
+# TEAM
+
+    <name> -- <role> -- <twitter>
+
+# THANKS
+
+    <name>
+
+# TECHNOLOGY COLOPHON
+
+    CSS3, HTML5
+    Apache Server Configs, jQuery, Modernizr, Normalize.css

+ 3 - 0
src/images/README.md

@@ -0,0 +1,3 @@
+# Images
+
+此文件夹中存放全局共享的图片文件,如 `Logo` 、 `友链背景`等。

BIN
src/images/chaxun.png


BIN
src/images/close.png


BIN
src/images/delete-3.png


BIN
src/images/dron.glb


+ 0 - 0
src/images/empty.jpg


BIN
src/images/logo.png


BIN
src/images/pop_list_ico_opt_n.png


BIN
src/images/pop_list_ico_opt_s.png


BIN
src/images/xinzeng-3.png


BIN
src/images/xiugai.png


+ 95 - 0
src/index.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8" />
+    <meta http-equiv="x-ua-compatible" content="ie=edge" />
+    <title></title>
+    <meta name="description" content="" />
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
+    <link rel="apple-touch-icon" href="apple-touch-icon.png" />
+    <link rel="stylesheet" href="//192.168.2.245/api/arcgis/js/3.18/esri/css/esri.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-4.0.0/css/bootstrap.min.css" />
+    <link rel="stylesheet" href="./vendor/jquery-ztree-3.5.37/css/zTreeStyle/metro.css" />
+    <link rel="stylesheet" href="./vendor/jquery-datatables-1.10.18/css/dataTables.bootstrap.min.css" />
+    <link rel="stylesheet" href="./vendor/jquery-jedate/jedate/skin/jedate.css">
+    <link rel="stylesheet" href="./vendor/jquery-viewer/css/viewer.min.css">
+    <link rel="stylesheet" href="./vendor/bootstrapValidator/css/bootstrapValidator.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-fileinput-4.0.0/fileinput.min.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-colorpicker-3.1.2/css/bootstrap-colorpicker.min.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-slider-10.6.1/css/bootstrap-slider.min.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-select-1.13.7/css/bootstrap-select.min.css">
+    <link rel="stylesheet" href="./vendor/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css">
+    <link rel="stylesheet" href="css/style.css" />
+    <link rel="stylesheet" href="./vendor/iCheck/build.css" />
+    <!-- <link rel="stylesheet" href="./vendor/vueform/index.css">
+    <link rel="stylesheet" href="./vendor/vueform/FormMaking.css"> -->
+    <link rel="stylesheet" href="./vendor/multiselect/css/bootstrap-multiselect.css" type="text/css" />
+    <link rel="stylesheet" href="./vendor/toflyUI/toflyUI.css">
+    <!--为了使用表单设计器生成的表单,修改了vue加载顺序,暂时不能使用懒加载,使用vue的模块请使用:declare var Vue;-->
+    <script src="./vendor/vue-2.6.8/vue.min.js" type="text/javascript"></script>
+    <script src="./vendor/vueform/index.js" type="text/javascript"></script>
+    <script src="./vendor/vueform/FormMaking.umd.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="themes/dyrq/style.css">
+</head>
+
+<body>
+    <div class="body">
+        <div id="mainContainer">
+            <div id='mainContainerChief'>
+            </div>
+              <div id='mainContainerMinor'>
+            </div>
+        </div>
+        <div class='onlyPictureDiv' style='width: 0px;height: 0px;position:absolute;top: 0px;left: 0px;'></div>
+    </div>
+    <script src="./vendor/js-csv-encoding/js/encoding-indexes.min.js"></script>
+    <script src="./vendor/js-csv-encoding/js/encoding.min.js"></script>
+    <script src="./vendor/file-saver/js/FileSaver.min.js"></script>
+    <script src="./vendor/jquery-3.3.1/jquery.min.js"></script>
+    <script type="text/javascript" src="./vendor/js-security/sha1.js"></script>
+    <script src="./vendor/jquery-ui-1.12.1/jquery-ui.min.js"></script>
+    <script src="./vendor/jquery-ztree-3.5.37/js/jquery.ztree.core.min.js"></script>
+    <script src="./vendor/jquery-ztree-3.5.37/js/jquery.ztree.excheck.min.js"></script>
+    <script src="./vendor/jquery-ztree-3.5.37/js/jquery.ztree.exedit.min.js"></script>
+    <script src="./vendor/js-cookie-2.1.3/cookie.min.js"></script>
+    <script src="./vendor/lodash/lodash.min.js"></script>
+    <script src="./vendor/proj4/proj4.js"></script>
+    <script src="./vendor/popper/popper.min.js"></script>
+    <script src="./vendor/jquery-datatables-1.10.18/js/jquery.dataTables.min.js"></script>
+    <script src="./vendor/jquery-datatables-1.10.18/js/dataTables.bootstrap.min.js"></script>
+    <script src="./vendor/jquery-jedate/jedate/jquery.jedate.min.js"></script>
+    <script src="./vendor/jquery-viewer/js/viewer.min.js"></script>
+    <script src="./vendor/bootstrapValidator/js/bootstrapValidator.js"></script>
+    <script src="./vendor/bootstrap-4.0.0/js/bootstrap.min.js"></script>
+    <script src="./vendor/bootstrap-fileinput-4.0.0/fileinput.min.js"></script>
+    <script src="./vendor/bootstrap-fileinput-4.0.0/zh.js"></script>
+    <script src="./vendor/bootstrap-colorpicker-3.1.2/js/bootstrap-colorpicker.min.js"></script>
+    <script src="./vendor/bootstrap-slider-10.6.1/bootstrap-slider.min.js"></script>
+    <script src="./vendor/bootstrap-input-spinner/bootstrap-input-spinner.js"></script>
+    <script src="./vendor/jquery-buttons-1.5.6/js/dataTables.buttons.min.js"></script>
+    <script src="./vendor/jquery-buttons-1.5.6/js/buttons.html5.min.js"></script>
+    <script src="./vendor/jquery-print/js/jQuery.print.js"></script>
+    <script src="./vendor/jszip/jszip.min.js"></script>
+    <script src="./vendor/bootstrap-select-1.13.7/js/bootstrap-select.min.js"></script>
+    <script src="./vendor/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
+    <script src="./vendor/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js"></script>
+    <script src="./vendor/bootstrap-4.0.0/js/zh_ch.js"></script>
+    <script src="./vendor/greensock/tween.js"></script>
+    <script src="./vendor/echarts-4.2.1/js/echarts.min.js"></script>
+    <script src="./vendor/datejs/date.js"></script>
+    <script type="text/javascript" src="./vendor/multiselect/js/bootstrap-multiselect.js"></script>
+    <script src="./vendor/toflyUI/toflyUI.js"></script>
+    <!-- <script type="text/javascript" src="./vendor/require/require.min.js"></script> -->
+    <script src="./vendor/jspdf/html2canvas-0.4.1.js" type="text/javascript"></script>
+    <script language="javascript" type="text/javascript" src="./vendor/my97datepicker/WdatePicker.js"></script>
+    <script language="javascript" type="text/javascript" src="./vendor/jsonform/jsonform.js"></script>
+    <script language="javascript" type="text/javascript" src="./vendor/glMatrix/gl-matrix-min.js"></script>
+    <script src="//192.168.2.245/api/arcgis/js/3.18/init.js"></script>
+    <!-- <script src="http://localhost:8001/webgl/webglCommon/glmatrix/dist/gl-matrix-min.js"></script> -->
+    <script>
+        require(["./main.js"]);
+    </script>
+</body>
+
+</html>

BIN
src/login/css/YouSheBiaoTiHei.ttf


File diff suppressed because it is too large
+ 6757 - 0
src/login/css/bootstrap.css


BIN
src/login/css/img/bg.png


BIN
src/login/css/img/kuang.png


BIN
src/login/css/img/login.png


BIN
src/login/css/img/mima.png


BIN
src/login/css/img/tubiao.png


BIN
src/login/css/img/yonghu.png


File diff suppressed because it is too large
+ 205 - 0
src/login/css/login copy.css


File diff suppressed because it is too large
+ 232 - 0
src/login/css/login.css


+ 61 - 0
src/login/index.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <title> 德阳燃气管网运维信息化综合管理系统</title>
+    <link rel=”icon” href=”favicon.ico” mce_href=”/dir/favicon.ico” type=”image/x-icon”> <link type="text/css"
+        rel="stylesheet" href="../vendor/bootstrap-4.0.0/css/bootstrap.min.css">
+    <link type="text/css" rel="stylesheet" href="./css/login.css">
+</head>
+
+<body>
+    <div id='mainContainer'>
+        <canvas id='myCanvas'></canvas>
+        <div class="logoContainer">
+            <p>
+                <img src='./css/img/tubiao.png'>德阳燃气管网运维信息化综合管理系统
+            </p>
+        </div>
+        <div class="shadow ">
+            <div class='shadowSpan'>系统登陆</div>
+            <div class='loginitem'>
+                <div class='usernameContainer form-inline'>
+                    <div class='titleName'>用户名:</div>
+                    <div class='loginimg form-inline'>
+                        <img src="./css/img/yonghu.png">
+                    </div>
+                    <div class='backgroundInput'>
+                    <input type="text" autocomplete="off" class="input-sm form-control title username">
+                    </div>
+                </div>
+                <div class='passwordContainer form-inline'>
+                    <div class='titleName'>密&nbsp&nbsp&nbsp码:</div>
+                    <div class='loginimg form-inline'>
+                        <img src="./css/img/mima.png">
+                    </div>
+                    <div class='backgroundInput'>
+                        <input autocomplete="off" type="password" class="input-sm form-control title password">
+                    </div>
+                </div>
+                <div class='loginContainer login'>
+                </div>
+            </div>
+        </div>
+        <div class="error">
+            <span class="spanbackground">
+                <span class="errorInfoUsername">
+                    <div class="errorInfoUsername1"></div>
+                    <div class="errorInfoUsername2"></div>
+                    <div class="errorInfoUsername3"></div>
+                    <div class="errorInfoUsername4"></div>
+                </span>
+            </span>
+        </div>
+    </div>
+</body>
+<script type="text/javascript" src="../vendor/jquery-3.3.1/jquery.min.js"></script>
+<script type="text/javascript" src="../vendor/js-security/sha1.js"></script>
+<script type="text/javascript" src="../vendor/js-cookie-2.1.3/cookie.min.js"></script>
+<script type="text/javascript" src="./js/login.js"></script>
+</html>

+ 280 - 0
src/login/js/login copy.js

@@ -0,0 +1,280 @@
+/* CONFIGURE START */
+var HOST_NAME = "192.168.2.235:1111"//"192.168.2.248:1111",//var HOST_NAME = "192.168.2.248:1111",
+SYS_ADDR = location.href.replace(/login\/+$/, ""),
+    COOKIE_EXPIRES = 1,
+    COOKIE_PATH = location.pathname.replace(/login\/+$/, "");
+/* CONFIGURE END */
+
+window.onload = function () {
+    var userInput = $(".username");
+    var passwordInput = $('.password');
+    var btnLogin = $('.login');
+    initSysName();//修改title
+    if (Cookies.get(hex_sha1("remember")) == "true") {
+        $(".remember_check").addClass("check");
+        userInput.val(getCookies("username"));
+        passwordInput.val(getCookies("psw"));
+        btnLogin[0].focus();
+    } else
+        userInput[0].focus();
+    $(document).keydown(enterKeyDown.bind(this));
+    btnLogin.on('click', loginCallBack.bind(this));
+    userInput.on('focus', function () {
+        $(".error").hide();
+    }.bind(this));
+    passwordInput.on('focus', function () {
+        $(".error").hide();
+    }.bind(this));
+    $(".remember_check").off("click").on("click", function (e) {
+        if ($(e.currentTarget).hasClass("check")) {
+            $(e.currentTarget).removeClass("check");
+        } else {
+            $(e.currentTarget).addClass("check");
+        }
+    }.bind(this))
+
+    function enterKeyDown() {
+        if (event.keyCode == 13) {
+            loginCallBack.bind(this)();
+        }
+    }
+
+    function loginCallBack(result) {
+        if (userInput.val() == '' && passwordInput.val() != '') {
+            $(".error").show();
+            $(".errorInfoUsername").text("用户名不能为空!");
+        } else if (userInput.val() != '' && passwordInput.val() == '') {
+            $(".error").show();
+            $(".errorInfoUsername").show().text("密码不能为空!");
+        } else if (userInput.val() == '' && passwordInput.val() == '') {
+            $(".error").show();
+            $(".errorInfoUsername").show().text("用户名与密码不能为空!");
+        } else {
+            $.ajax({
+                //url: "http://" + HOST_NAME + "/auth/oauth/token",
+                url: "http://" + HOST_NAME + "/auth/oauth/token?project=8000",
+                data: {
+                    "username": $.trim(userInput.val()),
+                    "password": hex_sha1($.trim(passwordInput.val()))
+                },
+                type: "post",
+                dataType: "json",
+                success: ajaxCallBack.bind(this),
+                error: errorCallBack.bind(this)
+            });
+        }
+    }
+
+    function ajaxCallBack(result) {
+        if ($(".remember_check").hasClass("check")) {
+            var remember = hex_sha1("remember");
+            Cookies.set(remember, "true", {
+                path: SYS_ADDR
+            });
+            Cookies.set(hex_sha1("username"), Secret_Key(userInput.val(), 'encryption'), {
+                path: SYS_ADDR
+            });
+            Cookies.set(hex_sha1("psw"), Secret_Key(passwordInput.val(), 'encryption'), {
+                path: SYS_ADDR
+            });
+        } else {
+            Cookies.remove(hex_sha1("remember"));
+            Cookies.remove(hex_sha1("username"));
+            Cookies.remove(hex_sha1("psw"));
+            Cookies.remove(hex_sha1("userid"));
+        }
+        if (result.code == 1) {
+            Cookies.set(hex_sha1("username"), Secret_Key(userInput.val(), 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("token"), Secret_Key(result.result.accessToken, 'encryption'), {
+                path: COOKIE_PATH
+            });
+
+            // Cookies.set(hex_sha1("gistoken"), Secret_Key(result.result.gistoken,'encryption'), {
+            //     path: COOKIE_PATH
+            // });
+            // Cookies.set(hex_sha1("analysistoken"), Secret_Key(result.result.analysistoken,'encryption'), {
+            //     path: COOKIE_PATH
+            // });
+            if (result.result.userLevel == "1") {
+                Cookies.set(hex_sha1("deptname"), Secret_Key("超级管理员", 'encryption'), {
+                    path: COOKIE_PATH
+                });
+            } else {
+                Cookies.set(hex_sha1("deptname"), Secret_Key(result.result.departmentName, 'encryption'), {
+                    path: COOKIE_PATH
+                });
+            }
+            Cookies.set(hex_sha1("deptid"), Secret_Key(result.result.departmentId + "", 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("realname"), Secret_Key(result.result.username, 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("userid"), Secret_Key(result.result.id + "", 'encryption'), {
+                path: COOKIE_PATH
+            });
+            window.location.href = SYS_ADDR;// + "controlPanel";
+        } else {
+            $(".error").show();
+            $(".errorInfoUsername").text(result.message);
+        }
+    }
+
+    function errorCallBack(mesg) {
+        console.log(mesg);
+    }
+
+    /**
+     * 获取cookies值
+     */
+    function getCookies(name) {
+        var tempName = Cookies.get(hex_sha1(name));
+        if (tempName)
+            return Secret_Key(Cookies.get(hex_sha1(name)), 'decryption');
+        else
+            return "";
+    }
+
+    /**
+     * 初始化系统名称
+     */
+    function initSysName() {
+        $.ajax({
+            url: "http://" + HOST_NAME + "/base/projectinfo/get",
+            type: "GET",
+            dataType: "json",
+            success: (result) => {
+                document.title = result.result.projectName;
+            },
+            error: (data) => {
+                console.log(data.message);
+            }
+        });
+    }
+
+
+    let ctx = document.getElementById('myCanvas');
+    let content = ctx.getContext('2d');
+    let drawNumber = 100; //最大线条数
+    let round = [];
+    let lineWidth = 1; //线的宽度;
+    let lineLenght = 200;//控制线的长度;
+    let speed = 0.6; //移动速度
+    let width = document.documentElement.clientWidth;
+    let height = document.documentElement.clientHeight;
+    ctx.width = width;
+    ctx.height = height;
+
+    //设定圆的对象
+    function path(lineWidth, width, height, speed) {
+        //获取随机数
+        let getMath = function (maxMath) {
+            maxMath = parseInt(maxMath);
+            return Math.floor(Math.random() * maxMath);
+        }
+        this.k = 3;//偏移
+        //获取偏移比例
+        this.getB = function () {
+            let b = this.y - this.k * this.x;
+            return b;
+        }
+
+        this.lineWidth = getMath(lineWidth); //获取随机半径
+        this.x = 0; //随机X坐标
+        this.y = 0; //随机Y坐标
+        this.b = 0;
+        this.x2 = 0;
+        this.y2 = 0;
+        this.length = 0;
+        this.alpha = getMath(10) / 10;
+        this.speed = speed;
+        this.color = "rgba(255,255,255," + this.alpha + ")"; //随机透明度
+        this.color2="rgba(255,255,255,0)"
+        //第一次获取第一个点
+        this.getOnePoint = function () {
+            this.x = getMath(width); //随机X坐标
+            this.y = getMath(height); //随机Y坐标
+            this.b = this.getB();
+        }
+        //第一次获取第二个点的坐标
+        this.getOtherPoint = function () {
+            let isOk = true;
+            while (isOk) {
+                this.y2 = getMath(height);
+                let value=this.y2 - this.y ;
+                if (value > 10 && value <= lineLenght) {
+                    isOk = false;
+                }
+            }
+            this.x2 = this.getPoint(this.y2);
+            this.length = this.y2 - this.y;
+        }
+        //根据y坐标获取x坐标,第一个坐标必须齐全
+        this.getPoint = function (y) {
+            return (y - this.b) / this.k;
+        }
+        //绘制线
+        this.draw = function () {
+            content.beginPath();
+            let linearGradient1 = content.createLinearGradient(this.x, this.y, this.x2, this.y2);
+            linearGradient1.addColorStop(0, this.color2);
+            linearGradient1.addColorStop(1, this.color);
+            content.strokeStyle = linearGradient1;
+            content.lineWidth = this.lineWidth;
+            content.moveTo(this.x, this.y);
+            content.lineTo(this.x2, this.y2);
+            content.stroke();
+            content.fillStyle = this.color;
+            content.beginPath();
+            content.arc(this.x2, this.y2, 2, 0, Math.PI * 2, true);
+            content.closePath();
+            content.fill();
+        }
+
+        this.move = function () {
+            if (this.y > height + 10) {
+                this.y = 0; this.x = getMath(width);
+                this.b = this.getB();
+                this.y2 = this.y;
+                this.x2 = this.x;
+                // let isOk=true;
+                // while (isOk) {
+                //     this.length = getMath(lineLenght);
+                //     if (this.length> 10) {
+                //         isOk = false;
+                //     }
+                // }
+            } else {
+                this.y2 += speed;
+                this.x2 = this.getPoint(this.y2);
+                if (this.y2 >= this.length) {
+                    this.y += speed;
+                    this.x = this.getPoint(this.y)
+                }
+            }
+            this.draw();
+        }
+    }
+
+    function drawALL() {
+        for (var i = 0; i < drawNumber; i++) {
+            round[i] = new path(lineWidth, width, height, speed);
+            round[i].getOnePoint();
+            round[i].getOtherPoint();
+            round[i].draw();
+        }
+        animate();
+    }
+
+    function animate() {
+        content.clearRect(0, 0, width, height);
+        for (var i in round) {
+            round[i].move();
+        }
+        requestAnimationFrame(animate);
+    }
+
+    drawALL();
+}

+ 230 - 0
src/login/js/login.js

@@ -0,0 +1,230 @@
+/* CONFIGURE START */
+var HOST_NAME = "192.168.2.248:1111"//"192.168.2.248:1111",//var HOST_NAME = "192.168.2.248:1111",
+SYS_ADDR = location.href.trim().toLowerCase().replace(/login\/+$/, ""),
+    COOKIE_EXPIRES = 1,
+    COOKIE_PATH = location.pathname.trim().toLowerCase().replace(/login\/+$/, "");
+/* CONFIGURE END */
+
+window.onload = function () {
+    var userInput = $(".username");
+    var passwordInput = $('.password');
+    var btnLogin = $('.login');
+    initSysName();//修改title
+    if (Cookies.get(hex_sha1("remember")) == "true") {
+        $(".remember_check").addClass("check");
+        userInput.val(getCookies("username"));
+        passwordInput.val(getCookies("psw"));
+        btnLogin[0].focus();
+    } else
+        userInput[0].focus();
+    $(document).keydown(enterKeyDown.bind(this));
+    btnLogin.on('click', loginCallBack.bind(this));
+    userInput.on('focus', function () {
+        $(".error").hide();
+    }.bind(this));
+    passwordInput.on('focus', function () {
+        $(".error").hide();
+    }.bind(this));
+    $(".remember_check").off("click").on("click", function (e) {
+        if ($(e.currentTarget).hasClass("check")) {
+            $(e.currentTarget).removeClass("check");
+        } else {
+            $(e.currentTarget).addClass("check");
+        }
+    }.bind(this))
+
+    function enterKeyDown() {
+        if (event.keyCode == 13) {
+            loginCallBack.bind(this)();
+        }
+    }
+
+    function loginCallBack(result) {
+
+    // window.location.href = SYS_ADDR;
+        if (userInput.val() == '' && passwordInput.val() != '') {
+            $(".error").show();
+            $(".errorInfoUsername").text("用户名不能为空!");
+        } else if (userInput.val() != '' && passwordInput.val() == '') {
+            $(".error").show();
+            $(".errorInfoUsername").show().text("密码不能为空!");
+        } else if (userInput.val() == '' && passwordInput.val() == '') {
+            $(".error").show();
+            $(".errorInfoUsername").show().text("用户名与密码不能为空!");
+        } else {
+            $.ajax({
+                // url: "http://" + HOST_NAME + "/auth/oauth/token?project=8000",
+                url: "http://" + HOST_NAME + "/auth/oauth/token",
+                data: {
+                    "username": $.trim(userInput.val()),
+                    "password": hex_sha1($.trim(passwordInput.val())),
+                    "isweb":"isweb"
+                },
+                type: "post",
+                dataType: "json",
+                success: ajaxCallBack.bind(this),
+                error: errorCallBack.bind(this)
+            });
+        }
+    }
+
+    function ajaxCallBack(result) {
+        if ($(".remember_check").hasClass("check")) {
+            var remember = hex_sha1("remember");
+            Cookies.set(remember, "true", {
+                path: SYS_ADDR
+            });
+            Cookies.set(hex_sha1("username"), Secret_Key(userInput.val(), 'encryption'), {
+                path: SYS_ADDR
+            });
+            Cookies.set(hex_sha1("psw"), Secret_Key(passwordInput.val(), 'encryption'), {
+                path: SYS_ADDR
+            });
+        } else {
+            Cookies.remove(hex_sha1("remember"));
+            Cookies.remove(hex_sha1("username"));
+            Cookies.remove(hex_sha1("psw"));
+            Cookies.remove(hex_sha1("userid"));
+        }
+        if (result.code == 1) {
+            Cookies.set(hex_sha1("username"), Secret_Key(userInput.val(), 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("token"), Secret_Key(result.result.accessToken, 'encryption'), {
+                path: COOKIE_PATH
+            });
+
+            // Cookies.set(hex_sha1("gistoken"), Secret_Key(result.result.gistoken,'encryption'), {
+            //     path: COOKIE_PATH
+            // });
+            // Cookies.set(hex_sha1("analysistoken"), Secret_Key(result.result.analysistoken,'encryption'), {
+            //     path: COOKIE_PATH
+            // });
+            if (result.result.userLevel == "1") {
+                Cookies.set(hex_sha1("deptname"), Secret_Key("超级管理员", 'encryption'), {
+                    path: COOKIE_PATH
+                });
+            } else {
+                Cookies.set(hex_sha1("deptname"), Secret_Key(result.result.departmentName, 'encryption'), {
+                    path: COOKIE_PATH
+                });
+            }
+            Cookies.set(hex_sha1("deptid"), Secret_Key(result.result.departmentId + "", 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("realname"), Secret_Key(result.result.realName, 'encryption'), {
+                path: COOKIE_PATH
+            });
+            Cookies.set(hex_sha1("userid"), Secret_Key(result.result.id + "", 'encryption'), {
+                path: COOKIE_PATH
+            });
+            window.location.href = SYS_ADDR;// + "controlPanel";
+        } else {
+            $(".error").show();
+            $(".errorInfoUsername").text(result.message);
+        }
+    }
+
+    function errorCallBack(mesg) {
+        console.log(mesg);
+    }
+
+    /**
+     * 获取cookies值
+     */
+    function getCookies(name) {
+        var tempName = Cookies.get(hex_sha1(name));
+        if (tempName)
+            return Secret_Key(Cookies.get(hex_sha1(name)), 'decryption');
+        else
+            return "";
+    }
+
+    /**
+     * 初始化系统名称
+     */
+    function initSysName() {
+        $.ajax({
+            url: "http://" + HOST_NAME + "/base/projectinfo/get",
+            type: "GET",
+            dataType: "json",
+            success: (result) => {
+                document.title = result.result.projectName;
+            },
+            error: (data) => {
+                console.log(data.message);
+            }
+        });
+    }
+
+    //飘动效果
+    let ctx = document.getElementById('myCanvas');
+    let content = ctx.getContext('2d');
+    let drawNumber = 200; //最大圆个数
+    let round = [];
+    let rMax = 3; //圆的最大半径
+    let speed = 1; //移动速度
+    let width = document.documentElement.clientWidth;
+    let height = document.documentElement.clientHeight;
+    ctx.width = width;
+    ctx.height = height;
+
+    //设定圆的对象
+    function circle(rMax, width, height, speed) {
+        //获取随机数
+        let getMath = function (maxMath) {
+            maxMath = parseInt(maxMath);
+            return Math.floor(Math.random() * maxMath);
+        }
+        this.fx = 1;//控制方向
+        this.radius = getMath(rMax); //获取随机半径
+        this.x = getMath(width); //随机X坐标
+        this.y = getMath(height); //随机Y坐标
+        this.alpha = getMath(10) / 10;
+        this.speed = speed;
+        this.fx2 = 1;//控制颜色
+        this.color = "rgba(255,255,255," + this.alpha + ")"; //随机透明度
+        //绘制圆
+        this.draw = function () {
+            content.fillStyle = this.color;
+            content.beginPath();
+            content.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);
+            content.closePath();
+            content.fill();
+        }
+        this.move = function () {
+            if (this.x < -10 || this.x > width + 10) {
+                this.x = getMath(width);
+            } else {
+                this.x = this.x + speed;
+            }
+            if (this.alpha < 0) {
+                this.fx2 = 1;
+            } else if (this.alpha > 1.0) {
+                this.fx2 = -1;
+            }
+            this.alpha = this.alpha + this.fx2 * 0.005
+            this.color = "rgba(255,255,255," + this.alpha + ")";
+            this.draw();
+        }
+    }
+
+    function drawALL() {
+        for (var i = 0; i < drawNumber; i++) {
+            round[i] = new circle(rMax, width, height, speed);
+            round[i].draw();
+        }
+        animate();
+    }
+
+    function animate() {
+        content.clearRect(0, 0, width, height);
+        for (var i in round) {
+            round[i].move();
+        }
+        requestAnimationFrame(animate);
+    }
+
+    drawALL();
+
+}

+ 210 - 0
src/main.ts

@@ -0,0 +1,210 @@
+var configFile = "configure.js";
+declare var esri;
+declare var esriConfig;
+declare var Vue;
+
+require({}, [configFile], (AppX) => {
+    //加载配置文件
+    loadApp(AppX);
+
+    //事件初始化
+    initEvent();
+});
+
+/**
+ * 加载动态配置文件
+ * @param {any} AppX 配置对象
+ */
+function loadApp(AppX: AppX) {
+
+
+//     require(AppX.dojoConfig, ['core/LoadManager.class'], function (LoadManager) {
+//         //是否有首页权限
+//         // let loadOnStartWidgets = _.findIndex(, function (item) { return item.name = 'HomePage' });
+//         if (AppX.appConfig.loadHomePage) {
+//             (new LoadManager).load(AppX.appConfig.homePageStartWidgets);
+//         } else {
+//             //无首页权限直接加载
+//             (new LoadManager).load(AppX.appConfig.loadOnStartWidgets);
+//         }
+//     });
+// return ;
+    var loginAddress = window.location.href.replace(/\/+$/, "/login");
+    var userName = getCookies("username");
+    var token = getCookies("token");
+
+    if (userName && token) {
+        AppX.appConfig.userToken = token;
+        //AppX.appConfig.gisToken = getCookies("gistoken");
+        AppX.appConfig.analysistoken = getCookies("analysistoken");
+        AppX.appConfig.deptName = getCookies("deptname");
+        AppX.appConfig.deptId = getCookies("deptid")!="null"?getCookies("deptid"):"";
+        AppX.appConfig.realName = getCookies("realname");
+        AppX.appConfig.activeSystemModel = getCookies("systemmodeid");
+        var systemid = getCookies("systemid");
+        AppX.appConfig.userSkyBox = null;
+        AppX.appConfig.activeSystemId = systemid;
+        AppX.appConfig.userId = getCookies("userid");
+        esriConfig.defaults.io.timeout = 600000;
+        esri.config.defaults.io.proxyUrl = "";//其中proxyUrl是你部署到IIS下的路径即可。
+        esri.config.defaults.io.alwaysUseProxy = false;//为true时需要修改jquery方式请求gis服务的地址
+        //admin未默认账户不走权限系统,更加config.ts里面的权限配置进入权限管理系统(admin只拥有权限管理系统的权限)。
+        if (userName == "admin" || AppX.appConfig.debug) {
+            //剔除config.ts中权限管理外的其它所有模块
+            // var evens = _.remove(AppX.appConfig.subSystem, function (n) {
+            //     return n.id == "sys";
+            // });
+            // AppX.appConfig.userlevel = "1";
+            // AppX.appConfig.subSystem = evens;
+            // AppX.appConfig.loadOnStartWidgets = _.filter(AppX.appConfig.loadOnStartWidgets, function (item: any) {
+            //     return (item.subsys != null && item.subsys == systemid);
+            // })
+            require(AppX.dojoConfig, ['core/LoadManager.class'], function (LoadManager) {
+                //是否配置首页权限
+                let menuBarWidgets = _.findIndex(AppX.appConfig.menuBarWidgets, function (item) { return item.id == 'HomePage' });
+                if(AppX.appConfig.menuBarWidgets[menuBarWidgets]&&AppX.appConfig.menuBarWidgets[menuBarWidgets].data.length>0){
+                    AppX.appConfig.loadHomePage=true;
+                }else{
+                    AppX.appConfig.loadHomePage=false;
+                }
+                // AppX.appConfig.menuBarWidgets.splice(menuBarWidgets,1);
+                //是否有首页权限
+                if (AppX.appConfig.loadHomePage) {
+                    (new LoadManager).load(AppX.appConfig.homePageStartWidgets);
+                } else {
+                    //无首页权限直接加载
+                    (new LoadManager).load(AppX.appConfig.loadOnStartWidgets);
+                }
+            });
+        } else {
+            $.ajax({
+                headers: {
+                    'Authorization': 'bearer ' + token
+                },
+                url: AppX.appConfig.apiRoot.replace(/\/+$/, "") + '/base/user/initData',
+                type: "GET",
+                data: {
+                    platform: 1,
+                },
+                dataType: "json",
+                success: function (data) {
+                    if (data.code == 1) {
+                        var resData = data.result;
+                        if (resData) {
+                            if (!AppX.appConfig.debug) {
+                                //过滤系统
+                                // AppX.appConfig.subSystem = _.filter(resData.subsystem, function (item: any) {
+                                //     return (item.isenble != null && item.isenble.length > 0);
+                                // });
+                                AppX.appConfig.subSystem = resData.subsystem
+
+                                AppX.appConfig.menuBarWidgets = resData.menubarwidgets;
+
+                                // AppX.appConfig.loadOnStartWidgets = _.filter(AppX.appConfig.loadOnStartWidgets, function (item: any) {
+                                //     return (item.subsys != null && item.subsys == systemid);
+                                // })
+
+                                for (var pro in AppX.appConfig.gisResource) {
+                                    AppX.appConfig.gisResource[pro].config = [];
+                                    if (resData.gisresource && resData.gisresource.length > 0) {
+                                        for (var index = 0; index < resData.gisresource.length; index++) {
+                                            if (resData.gisresource[index].code == pro) {
+                                                var configs = AppX.appConfig.gisResource[pro].config = resData.gisresource[index].config;
+                                                if( AppX.appConfig.gisResource[pro].type&&resData.gisresource[index].type){
+                                                    AppX.appConfig.gisResource[pro].type=resData.gisresource[index].type;
+                                                }
+                                                for (var i = 0; i < configs.length; i++) {
+                                                    configs[configs[i].key] = configs[i];
+                                                }
+                                                break;
+                                            }
+                                        }
+                                    }
+                                }
+                                // 读取配置文件
+                                // for (var pro in AppX.appConfig.gisResource) {
+                                //     var configs = AppX.appConfig.gisResource[pro].config;
+                                //     for (var i = 0; i < configs.length; i++) {
+                                //         AppX.appConfig.gisResource[pro].config[configs[i].key] = configs[i];
+                                //     }
+                                // }
+                            }
+                        }
+                        require(AppX.dojoConfig, ['core/LoadManager.class'], function (LoadManager) {
+                            let menuBarWidgets = _.findIndex(AppX.appConfig.menuBarWidgets, function (item) { return item.id == 'HomePage' });
+                            if(menuBarWidgets!=-1&&AppX.appConfig.menuBarWidgets[menuBarWidgets]&&AppX.appConfig.menuBarWidgets[menuBarWidgets].data.length>0){
+                                AppX.appConfig.loadHomePage=true;
+                            }else{
+                                AppX.appConfig.loadHomePage=false;
+                            }
+                            // AppX.appConfig.menuBarWidgets.splice(menuBarWidgets,1);
+                            //是否有首页权限
+                            if (AppX.appConfig.loadHomePage) {
+                                (new LoadManager).load(AppX.appConfig.homePageStartWidgets);
+                            } else {
+                                //无首页权限直接加载
+                                (new LoadManager).load(AppX.appConfig.loadOnStartWidgets);
+                            }
+                        });
+                    }
+                }.bind(this),
+                error: function (XHR) {
+                    if (XHR.responseJSON&&XHR.responseJSON.code == "401"&&XHR.responseJSON.message&&XHR.responseJSON.message.indexOf("没有访问权限")!=-1) {
+                        window.location.href = loginAddress;
+                    }
+                }
+            });
+        }
+        // require(AppX.dojoConfig, ['vue','core/LoadManager.class'], function (Vue,LoadManager) {
+        //     (new LoadManager).load(AppX.appConfig.loadOnStartWidgets);
+        // });     
+    } else {
+        window.location.href = loginAddress;
+    }
+
+    // 使用本地配置文件
+    // require(AppX.dojoConfig, ['vue','core/LoadManager.class'], function (Vue,LoadManager) {
+    //     (new LoadManager).load(AppX.appConfig.loadOnStartWidgets);
+    // });
+}
+
+/**
+ * 事件初始化
+ */
+function initEvent() {
+    // $(window).on('unload', function () {
+    //     //调用登出接口
+    //     $.ajax({
+    //         headers:{
+    //             "Token":AppX.appConfig.userToken
+    //         },
+    //         url: AppX.appConfig.apiRoot.replace(/\/+$/, "") + '/SysLog/Logout',
+    //         type: "post",
+    //         dataType: "json",
+    //         async: false,
+    //         success: function (data) {
+    //             if (data.code == 1) {
+    //                 Cookies.remove(hex_sha1("token"));
+    //                 Cookies.remove(hex_sha1("username"));
+    //                 Cookies.remove(hex_sha1("gistoken"));
+    //                 Cookies.remove(hex_sha1("analysistoken"));
+    //                 console.log("正常退出系统!");
+    //             }
+    //         }.bind(this),
+    //         error: function (data) {
+    //              this.AppX.runtimeConfig.toast.show("退出系统发生异常!");
+    //         }.bind(this)
+    //     });
+    // });
+}
+
+/**
+ * 获取cookies值
+ */
+function getCookies(name) {
+    var tempName = Cookies.get(hex_sha1(name));
+    if (tempName)
+        return Secret_Key(Cookies.get(hex_sha1(name)), 'decryption');
+    else
+        return "";
+}

+ 5 - 0
src/robots.txt

@@ -0,0 +1,5 @@
+# www.robotstxt.org/
+
+# Disallow crawling of all content
+User-agent: *
+Disallow: /

BIN
src/themes/dyrq/images/header-background.png


BIN
src/themes/dyrq/images/header-background2.png


BIN
src/themes/dyrq/images/header-background_旧.png


BIN
src/themes/dyrq/images/header-status.jpg


BIN
src/themes/dyrq/images/menu-background.png


BIN
src/themes/dyrq/images/menu-background_旧.png


BIN
src/themes/dyrq/images/menu-title.jpg


+ 68 - 0
src/themes/dyrq/style.scss

@@ -0,0 +1,68 @@
+.widget-header {
+    background-image: url(./images/header-background.png) !important;
+    background-repeat: no-repeat;
+    background-size: cover;
+}
+
+.widgets-side_menu {
+    background-image: url(./images/menu-background.png) !important;
+    background-repeat: no-repeat;
+    background-size: cover;
+}
+
+.widgets-side_menu-sidebar {
+    background-color: transparent !important;
+}
+
+.widgets-side_menu-item_content {
+    background-color: transparent !important;
+}
+
+.widgets-side_menu-footer {
+    background-color: transparent !important;
+}
+
+.widgets-side_menu-item_header {
+    color: #ffffff !important;
+    &:hover {
+        border-left: 0px solid #3c8dbc !important; // background: #618bbb !important;
+        background-color: rgba(0, 19, 48, 0.1) !important;
+        color: #d4fdff !important;
+    }
+}
+
+.widgets-side_menu-item_header.ui-state-active {
+    // background: #618bbb !important;
+    background: rgb(93, 139, 209) !important;
+    color: #d4fdff !important;
+}
+
+.widgets-side_menu-flag-label {
+    background: #618bbb !important;
+}
+
+.widgets-side_menu-flag-right_flag-list {
+    background-image: url(./images/menu-background.png) !important;
+    background-repeat: no-repeat;
+    background-size: cover;
+}
+
+.widgets-side_menu-flag-right_flag-list-item {
+    color: #ffffff !important;
+    &:hover {
+        background: #618bbb !important;
+        color: #d4fdff !important;
+    }
+}
+
+.widgets-side_menu-flag-section {
+    color: #ffffff !important;
+    &:hover {
+        background: #618bbb !important;
+        color: #d4fdff !important;
+    }
+}
+
+.widgets-side_menu-item_header.ui-accordion-header.ui-corner-top.ui-accordion-header-collapsed.ui-corner-all.ui-state-default.ui-accordion-icons.ui-state-hover:hover{
+    background:#5d8bd1 !important;
+}

BIN
src/tile.png


+ 9 - 0
src/vendor/README.md

@@ -0,0 +1,9 @@
+# Vendor
+
+此文件夹中存放所有的本地三方资源。
+
+所有的三方资源都按以下方式规范:
+1. 文件夹以三方模块命名
+2. 文件夹内分类型存放(js、css、font、image等)
+
+如果后期需要,可在文件夹中增加 `README.me` 文件,在其中注明版本、官网、安装以及使用方式等

File diff suppressed because it is too large
+ 7 - 0
src/vendor/bootstrap-4.0.0/css/bootstrap.min.css


BIN
src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.eot


File diff suppressed because it is too large
+ 288 - 0
src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.svg


BIN
src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.ttf


BIN
src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.woff


BIN
src/vendor/bootstrap-4.0.0/fonts/glyphicons-halflings-regular.woff2


File diff suppressed because it is too large
+ 7 - 0
src/vendor/bootstrap-4.0.0/js/bootstrap.min.js


+ 370 - 0
src/vendor/bootstrap-4.0.0/js/zh_ch.js

@@ -0,0 +1,370 @@
+(function ($) {
+    /**
+     * Simplified Chinese language package
+     * Translated by @shamiao
+     */
+    $.fn.bootstrapValidator.i18n = $.extend(true, $.fn.bootstrapValidator.i18n, {
+        base64: {
+            'default': '请输入有效的Base64编码'
+        },
+        between: {
+            'default': '请输入在 %s 和 %s 之间的数值',
+            notInclusive: '请输入在 %s 和 %s 之间(不含两端)的数值'
+        },
+        callback: {
+            'default': '请输入有效的值'
+        },
+        choice: {
+            'default': '请输入有效的值',
+            less: '请至少选中 %s 个选项',
+            more: '最多只能选中 %s 个选项',
+            between: '请选择 %s 至 %s 个选项'
+        },
+        color: {
+            'default': '请输入有效的颜色值'
+        },
+        creditCard: {
+            'default': '请输入有效的信用卡号码'
+        },
+        cusip: {
+            'default': '请输入有效的美国CUSIP代码'
+        },
+        cvv: {
+            'default': '请输入有效的CVV代码'
+        },
+        date: {
+            'default': '请输入有效的日期', 
+            min: '请输入 %s 或之后的日期',
+            max: '请输入 %s 或以前的日期',
+            range: '请输入 %s 和 %s 之间的日期'
+        },
+        different: {
+            'default': '请输入不同的值'
+        },
+        digits: {
+            'default': '请输入有效的数字'
+        },
+        ean: {
+            'default': '请输入有效的EAN商品编码'
+        },
+        emailAddress: {
+            'default': '请输入有效的邮件地址'
+        },
+        file: {
+            'default': '请选择有效的文件'
+        },
+        greaterThan: {
+            'default': '请输入大于等于 %s 的数值',
+            notInclusive: '请输入大于 %s 的数值'
+        },
+        grid: {
+            'default': '请输入有效的GRId编码'
+        },
+        hex: {
+            'default': '请输入有效的16进制数'
+        },
+        hexColor: {
+            'default': '请输入有效的16进制颜色值'
+        },
+        iban: {
+            'default': '请输入有效的IBAN(国际银行账户)号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的IBAN(国际银行账户)号码',
+            countries: {
+                AD: '安道​​尔',
+                AE: '阿联酋',
+                AL: '阿尔巴尼亚',
+                AO: '安哥拉',
+                AT: '奥地利',
+                AZ: '阿塞拜疆',
+                BA: '波斯尼亚和黑塞哥维那',
+                BE: '比利时',
+                BF: '布基纳法索',
+                BG: '保加利亚',
+                BH: '巴林',
+                BI: '布隆迪',
+                BJ: '贝宁',
+                BR: '巴西',
+                CH: '瑞士',
+                CI: '科特迪瓦',
+                CM: '喀麦隆',
+                CR: '哥斯达黎加',
+                CV: '佛得角',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                DO: '多米尼加共和国',
+                DZ: '阿尔及利亚',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FO: '法罗群岛',
+                FR: '法国',
+                GB: '英国',
+                GE: '格鲁吉亚',
+                GI: '直布罗陀',
+                GL: '格陵兰岛',
+                GR: '希腊',
+                GT: '危地马拉',
+                HR: '克罗地亚',
+                HU: '匈牙利',
+                IE: '爱尔兰',
+                IL: '以色列',
+                IR: '伊朗',
+                IS: '冰岛',
+                IT: '意大利',
+                JO: '约旦',
+                KW: '科威特',
+                KZ: '哈萨克斯坦',
+                LB: '黎巴嫩',
+                LI: '列支敦士登',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MC: '摩纳哥',
+                MD: '摩尔多瓦',
+                ME: '黑山',
+                MG: '马达加斯加',
+                MK: '马其顿',
+                ML: '马里',
+                MR: '毛里塔尼亚',
+                MT: '马耳他',
+                MU: '毛里求斯',
+                MZ: '莫桑比克',
+                NL: '荷兰',
+                NO: '挪威',
+                PK: '巴基斯坦',
+                PL: '波兰',
+                PS: '巴勒斯坦',
+                PT: '葡萄牙',
+                QA: '卡塔尔',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SA: '沙特阿拉伯',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                SN: '塞内加尔',
+                TN: '突尼斯',
+                TR: '土耳其',
+                VG: '英属维尔京群岛'
+            }
+        },
+        id: {
+            'default': '请输入有效的身份证件号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的身份证件号码',
+            countries: {
+                BA: '波黑',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CL: '智利',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                LT: '立陶宛',
+                LV: '拉脱维亚',
+                ME: '黑山',
+                MK: '马其顿',
+                NL: '荷兰',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                TH: '泰国',
+                ZA: '南非'
+            }
+        },
+        identical: {
+            'default': '请输入相同的值'
+        },
+        imei: {
+            'default': '请输入有效的IMEI(手机串号)'
+        },
+        imo: {
+            'default': '请输入有效的国际海事组织(IMO)号码'
+        },
+        integer: {
+            'default': '请输入有效的整数值'
+        },
+        ip: {
+            'default': '请输入有效的IP地址',
+            ipv4: '请输入有效的IPv4地址',
+            ipv6: '请输入有效的IPv6地址'
+        },
+        isbn: {
+            'default': '请输入有效的ISBN(国际标准书号)'
+        },
+        isin: {
+            'default': '请输入有效的ISIN(国际证券编码)'
+        },
+        ismn: {
+            'default': '请输入有效的ISMN(印刷音乐作品编码)'
+        },
+        issn: {
+            'default': '请输入有效的ISSN(国际标准杂志书号)'
+        },
+        lessThan: {
+            'default': '请输入小于等于 %s 的数值',
+            notInclusive: '请输入小于 %s 的数值'
+        },
+        mac: {
+            'default': '请输入有效的MAC物理地址'
+        },
+        meid: {
+            'default': '请输入有效的MEID(移动设备识别码)'
+        },
+        notEmpty: {
+            'default': '请填写必填项目'
+        },
+        numeric: {
+            'default': '请输入有效的数值,允许小数'
+        },
+        phone: {
+            'default': '请输入有效的电话号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的电话号码',
+            countries: {
+                BR: '巴西',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                ES: '西班牙',
+                FR: '法国',
+                GB: '英国',
+                MA: '摩洛哥',
+                PK: '巴基斯坦',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SK: '斯洛伐克',
+                TH: '泰国',
+                US: '美国',
+                VE: '委内瑞拉'
+            }
+        },
+        regexp: {
+            'default': '请输入符合正则表达式限制的值'
+        },
+        remote: {
+            'default': '请输入有效的值'
+        },
+        rtn: {
+            'default': '请输入有效的RTN号码'
+        },
+        sedol: {
+            'default': '请输入有效的SEDOL代码'
+        },
+        siren: {
+            'default': '请输入有效的SIREN号码'
+        },
+        siret: {
+            'default': '请输入有效的SIRET号码'
+        },
+        step: {
+            'default': '请输入在基础值上,增加 %s 的整数倍的数值'
+        },
+        stringCase: {
+            'default': '只能输入小写字母',
+            upper: '只能输入大写字母'
+        },
+        stringLength: {
+            'default': '请输入符合长度限制的值',
+            less: '最多只能输入 %s 个字符',
+            more: '需要输入至少 %s 个字符',
+            between: '请输入 %s 至 %s 个字符'
+        },
+        uri: {
+            'default': '请输入一个有效的URL地址'
+        },
+        uuid: {
+            'default': '请输入有效的UUID',
+            version: '请输入版本 %s 的UUID'
+        },
+        vat: {
+            'default': '请输入有效的VAT(税号)',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的VAT(税号)',
+            countries: {
+                AT: '奥地利',
+                BE: '比利时',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FR: '法语',
+                GB: '英国',
+                GR: '希腊',
+                EL: '希腊',
+                HU: '匈牙利',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                IT: '意大利',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MT: '马耳他',
+                NL: '荷兰',
+                NO: '挪威',
+                PL: '波兰',
+                PT: '葡萄牙',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                VE: '委内瑞拉',
+                ZA: '南非'
+            }
+        },
+        vin: {
+            'default': '请输入有效的VIN(美国车辆识别号码)'
+        },
+        zipCode: {
+            'default': '请输入有效的邮政编码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的邮政编码',
+            countries: {
+                AT: '奥地利',
+                BR: '巴西',
+                CA: '加拿大',
+                CH: '瑞士',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                FR: '法国',
+                GB: '英国',
+                IE: '爱尔兰',
+                IT: '意大利',
+                MA: '摩洛哥',
+                NL: '荷兰',
+                PT: '葡萄牙',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SE: '瑞典',
+                SG: '新加坡',
+                SK: '斯洛伐克',
+                US: '美国'
+            }
+        }
+    });
+}(window.jQuery));

File diff suppressed because it is too large
+ 10 - 0
src/vendor/bootstrap-colorpicker-3.1.2/css/bootstrap-colorpicker.min.css


File diff suppressed because it is too large
+ 1 - 0
src/vendor/bootstrap-colorpicker-3.1.2/css/bootstrap-colorpicker.min.css.map


BIN
src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/alpha-horizontal.png


BIN
src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/alpha.png


BIN
src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/hue-horizontal.png


BIN
src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/hue.png


BIN
src/vendor/bootstrap-colorpicker-3.1.2/img/bootstrap-colorpicker/saturation.png


File diff suppressed because it is too large
+ 10 - 0
src/vendor/bootstrap-colorpicker-3.1.2/js/bootstrap-colorpicker.min.js


File diff suppressed because it is too large
+ 1 - 0
src/vendor/bootstrap-colorpicker-3.1.2/js/bootstrap-colorpicker.min.js.map


File diff suppressed because it is too large
+ 9 - 0
src/vendor/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css


File diff suppressed because it is too large
+ 1 - 0
src/vendor/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js


+ 16 - 0
src/vendor/bootstrap-datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js

@@ -0,0 +1,16 @@
+/**
+ * Simplified Chinese translation for bootstrap-datetimepicker
+ * Yuan Cheung <advanimal@gmail.com>
+ */
+;(function($){
+	$.fn.datetimepicker.dates['zh-CN'] = {
+			days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"],
+			daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"],
+			daysMin:  ["日", "一", "二", "三", "四", "五", "六", "日"],
+			months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+			monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+			today: "今天",
+			suffix: [],
+			meridiem: ["上午", "下午"]
+	};
+}(jQuery));

File diff suppressed because it is too large
+ 12 - 0
src/vendor/bootstrap-fileinput-4.0.0/fileinput.min.css


+ 0 - 0
src/vendor/bootstrap-fileinput-4.0.0/fileinput.min.js


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