tremble 4 лет назад
Родитель
Сommit
22df99f822
100 измененных файлов с 4727 добавлено и 402 удалено
  1. 301 0
      model-page/css/index.css
  2. 156 0
      model-page/css/main.css
  3. 59 0
      model-page/css/reset.css
  4. 272 0
      model-page/css/wx.css
  5. BIN
      model-page/images/bgmusic-play-icon.png
  6. BIN
      model-page/images/icon_home.png
  7. BIN
      model-page/images/icon_info.png
  8. BIN
      model-page/images/icon_left.png
  9. BIN
      model-page/images/icon_right.png
  10. BIN
      model-page/images/play.png
  11. 1 0
      model-page/js/4dage.js
  12. 4 0
      model-page/js/jquery.js
  13. 40 0
      model-page/model.html
  14. 2 0
      new_backstage/package.json
  15. 1 1
      new_backstage/public/index.html
  16. 2 1
      new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.css
  17. 1 1
      new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.min.css
  18. 1 1
      new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.min.css.map
  19. 3 1
      new_backstage/public/static/tinymce/skins/ui/oxide/skin.css
  20. 3060 1
      new_backstage/public/static/tinymce/skins/ui/oxide/skin.min.css
  21. 1 1
      new_backstage/public/static/tinymce/skins/ui/oxide/skin.min.css.map
  22. 1 1
      new_backstage/public/static/tinymce/themes/silver/theme.min.js
  23. 1 1
      new_backstage/src/assets/font/iconfont.json
  24. BIN
      new_backstage/src/assets/img/defaultImg.jpg
  25. 8 9
      new_backstage/src/components/Tinymce/index.vue
  26. 1 1
      new_backstage/src/components/Tinymce/plugins.js
  27. 4 2
      new_backstage/src/components/Tinymce/toolbar.js
  28. 1 1
      new_backstage/src/components/editcomponent/editcon.vue
  29. 1 0
      new_backstage/src/components/editcomponent/editdialog.vue
  30. 2 2
      new_backstage/src/components/editcomponent/usereditdialog.vue
  31. 30 19
      new_backstage/src/components/table/index.vue
  32. 4 4
      new_backstage/src/components/uploadFile/index.vue
  33. 22 1
      new_backstage/src/components/uploadThumb/index.vue
  34. 24 2
      new_backstage/src/configue/api.js
  35. 6 9
      new_backstage/src/configue/http.js
  36. 29 4
      new_backstage/src/mixins/index.js
  37. 30 15
      new_backstage/src/pages/content/collection/componets/img.vue
  38. 15 6
      new_backstage/src/pages/content/collection/componets/model.vue
  39. 12 6
      new_backstage/src/pages/content/collection/componets/video.vue
  40. 6 5
      new_backstage/src/pages/content/collection/data.js
  41. 5 1
      new_backstage/src/pages/content/collection/edit.vue
  42. 5 3
      new_backstage/src/pages/content/collection/index.vue
  43. 22 12
      new_backstage/src/pages/content/interaction/componets/questionGroup.vue
  44. 47 22
      new_backstage/src/pages/content/interaction/componets/sensitive.vue
  45. 4 22
      new_backstage/src/pages/content/interaction/data.js
  46. 83 44
      new_backstage/src/pages/content/interaction/edit.vue
  47. 36 9
      new_backstage/src/pages/content/interaction/index.vue
  48. 2 2
      new_backstage/src/pages/content/scene/index.vue
  49. 24 14
      new_backstage/src/pages/content/study/componets/info.vue
  50. 2 7
      new_backstage/src/pages/content/study/componets/share.vue
  51. 5 3
      new_backstage/src/pages/content/study/data.js
  52. 1 1
      new_backstage/src/pages/content/study/edit.vue
  53. 7 4
      new_backstage/src/pages/content/study/index.vue
  54. 17 23
      new_backstage/src/pages/content/sweep/componets/martyr.vue
  55. 4 3
      new_backstage/src/pages/content/sweep/componets/mourn.vue
  56. 1 0
      new_backstage/src/pages/content/sweep/data.js
  57. 12 5
      new_backstage/src/pages/content/sweep/index.vue
  58. 7 2
      new_backstage/src/pages/layout/head.vue
  59. 6 3
      new_backstage/src/pages/login/index.vue
  60. 39 32
      new_backstage/src/pages/system/role/componets/manage.vue
  61. 1 5
      new_backstage/src/pages/system/role/componets/share.vue
  62. 2 1
      new_backstage/src/pages/system/role/data.js
  63. 2 1
      new_backstage/src/pages/system/role/edit/dialog.vue
  64. 13 5
      new_backstage/src/pages/system/role/index.vue
  65. 9 9
      new_backstage/src/pages/system/user/componets/manage.vue
  66. 6 2
      new_backstage/src/pages/system/user/data.js
  67. 6 11
      new_backstage/src/pages/system/user/edit.vue
  68. 39 5
      new_backstage/src/pages/system/user/index.vue
  69. 1 1
      new_backstage/src/pages/system/worklog/index.vue
  70. 154 0
      new_backstage/src/util/file.js
  71. 17 21
      new_backstage/src/util/index.js
  72. 7 2
      web/.eslintrc.js
  73. 5 2
      web/package.json
  74. 2 2
      web/public/index.html
  75. 11 9
      web/public/static/js/main_2020_show.js
  76. 6 8
      web/public/static/js/manage.js
  77. 16 11
      web/src/App.vue
  78. BIN
      web/src/assets/images/btnlist/bgm.png
  79. BIN
      web/src/assets/images/btnlist/comment.png
  80. BIN
      web/src/assets/images/btnlist/game.png
  81. BIN
      web/src/assets/images/btnlist/like.png
  82. BIN
      web/src/assets/images/btnlist/question.png
  83. BIN
      web/src/assets/images/btnlist/新疆军史管-78.png
  84. BIN
      web/src/assets/images/btnlist/新疆军史管-79.png
  85. BIN
      web/src/assets/images/btnlist/新疆军史管-80.png
  86. BIN
      web/src/assets/images/btnlist/新疆军史管-82.png
  87. BIN
      web/src/assets/images/btnlist/新疆军史管-83.png
  88. BIN
      web/src/assets/images/btnlist/新疆军史管-84.png
  89. BIN
      web/src/assets/images/btnlist/新疆军史管-86.png
  90. BIN
      web/src/assets/images/btnlist/新疆军史管-87.png
  91. BIN
      web/src/assets/images/btnlist/新疆军史管-88.png
  92. BIN
      web/src/assets/images/btnlist/新疆军史管-90.png
  93. BIN
      web/src/assets/images/btnlist/新疆军史管-91.png
  94. BIN
      web/src/assets/images/btnlist/新疆军史管-92.png
  95. BIN
      web/src/assets/images/btnlist/新疆军史管-94.png
  96. BIN
      web/src/assets/images/btnlist/新疆军史管-95.png
  97. BIN
      web/src/assets/images/btnlist/新疆军史管-96.png
  98. BIN
      web/src/assets/images/crosshair.cur
  99. BIN
      web/src/assets/images/icon/iPhone 12、12 Pro – 1_slices/3D模型模式按钮@2x.png
  100. 0 0
      web/src/assets/images/icon/iPhone 12、12 Pro – 1_slices/3D模型模式按钮(选择)@2x.png

+ 301 - 0
model-page/css/index.css

@@ -0,0 +1,301 @@
+html, body {
+    width: 100%;
+    height: 100%;
+    font-family: PingFangSC-Regular, sans-serif;
+}
+
+html, body, h1, h2, h3, h4, h5, h6, div, dl, dt, dd, ul, ol, li, p, blockquote, pre, hr, figure, table, caption, th, td, form, fieldset, legend, input, button, textarea, menu {
+    margin: 0;
+    padding: 0;
+}
+
+/* ::-webkit-scrollbar {
+    display: none;
+} */
+
+iframe {
+    width: 100%;
+    height: 100%;
+}
+
+#ui {
+    position: absolute;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    flex-direction: column;
+    width: 100%;
+    height: 100%;
+    /* color: #494949; */
+    letter-spacing: 3px;
+}
+
+#logoText {
+    z-index: 1;
+    position: absolute;
+    bottom: 20px;
+    font-size: 18px;
+    font-weight: 100;
+    letter-spacing: 4px;
+}
+
+.switch-btn-Wrap {
+    z-index: 1;
+    position: absolute;
+    top: 20px;
+    right: 20px;
+}
+
+.switch-btn-Wrap img {
+    width: 75px;
+    ;
+}
+
+#objName {
+    z-index: 1;
+    position: absolute;
+    top: 20px;
+    left: 32px;
+    font-size: 22px;
+    font-weight: 100;
+    letter-spacing: 4px;
+    color: #ffffff;
+}
+
+#iconWrap {
+    position: absolute;
+    bottom: 30px;
+    width: 200px;
+    display: flex;
+    justify-content: center;
+    z-index: 1;
+}
+
+.mar-right {
+    margin-right: 120px;
+}
+
+#iconLeft {
+    cursor: not-allowed;
+}
+
+#iconRight {
+    cursor: pointer;
+}
+
+#introductionWrap{
+    position: absolute;
+    z-index: 1;
+    display: flex;
+    flex-direction: column;
+    left: 20px;
+    text-align: left;
+    top: 20px;
+    font-size: 16px;
+    color: #ffffff;
+    font-weight: 100;
+    line-height: 30px;
+    letter-spacing: 2px;
+    width: 500px;
+    display:none;
+}
+#companyText{
+    position: absolute;
+    z-index: 1;
+    font-size: 16px;
+    color:rgb(153, 153, 153);
+    font-weight: 100;
+    left: 50%;
+    transform: translateX(-50%);
+    bottom: 20px;
+    letter-spacing: 1px;
+    text-shadow:rgb(51, 51, 51) 0px 1px 1px;
+}
+.bg-audio {
+    display:block;
+    position:absolute;
+    bottom:30px;
+    right:10px;
+    width:30px;
+    height:30px;
+    background:url(../images/bgmusic-play-icon.png)center/100% no-repeat;
+    z-index:99;
+}
+.iconHome{
+    top:30px;
+}
+.iconMenu {
+    position:absolute;
+    z-index:2;
+    right:52px;
+    display:flex;
+    align-items: center;
+    flex-direction: column;
+    text-align: center;
+}
+.iconInfo {
+    top:150px;
+}
+.iconMenu span {
+    color:#fff;
+}
+#time, #size, #content,#excavated_time{
+    margin-top: 8px;
+}
+#content p {
+    text-indent:2em;
+}
+@media screen and (max-width: 600px) {
+     #introductionWrap {
+        width:70%;
+        height:60%;
+        overflow-y:scroll;
+        position:absolute;
+        margin:0 auto;
+        top:10%;
+        font-size:14px;
+        line-height: 20px;
+        display:none;
+    }
+    #time, #size, #content,#excavated_time {
+        margin-top:4px;
+    }
+    #content {
+       
+    }
+    #name {
+        font-weight:bold;
+    }
+    #iconAction {
+        position:absolute;
+        z-index:99;
+    }
+    .iconMenu {
+        width:60px;
+        right:10px;
+    }
+    .iconMenu img {
+        width:50%;
+    }
+    .iconHome {
+
+    }
+    .iconInfo {
+        top:90px;
+    }
+    .iconMenu span {
+        font-size:10px;
+    }
+    #iconWrap {
+        width:50%;
+        z-index:2;
+
+    }
+    #iconLeft,#iconRight {
+        width:30px;
+        height:30px;
+    }
+    #companyText{
+        font-size:13px;
+    }
+}
+@media only screen and (max-height:480px) {
+    .center img, .center-first img {
+        width: 52vw;
+        max-width: 250px;
+        max-height: 110px;
+    }
+    .center:nth-child(8) img {
+        width: 30vw;
+        max-width: 153px;
+        max-height: 127px;
+    }
+    .center:nth-child(17) img {
+        width: 30vw;
+        max-width: 165px;
+        max-height: 176px;
+    }
+   
+}
+.animated {
+    -webkit-animation-duration:1s;
+    animation-duration:1s;
+    -webkit-animation-fill-mode:both;
+    animation-fill-mode:both
+}
+@-webkit-keyframes fadeInRight {
+    0% {
+        opacity:0;
+        -webkit-transform:translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+    to {
+        opacity:1;
+        -webkit-transform:translateZ(0);
+        transform:translateZ(0)
+    }
+}
+@keyframes fadeInRight {
+    0% {
+        opacity:0;
+        -webkit-transform:translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+    to {
+        opacity:1;
+        -webkit-transform:translateZ(0);
+        transform:translateZ(0)
+    }
+}
+.fadeInRight {
+    -webkit-animation-name:fadeInRight;
+    animation-name:fadeInRight
+}
+
+@-webkit-keyframes fadeOutRight {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0;
+        -webkit-transform:translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+}
+@keyframes fadeOutRight {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0;
+        -webkit-transform:translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+}
+.fadeOutRight {
+    -webkit-animation-name:fadeOutRight;
+    animation-name:fadeOutRight
+}
+
+@-webkit-keyframes fadeOut {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0
+    }
+}
+@keyframes fadeOut {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0
+    }
+}
+.fadeOut {
+    -webkit-animation-name:fadeOut;
+    animation-name:fadeOut;
+    -webkit-animation-duration:2s;
+    animation-duration: 2s;
+}

+ 156 - 0
model-page/css/main.css

@@ -0,0 +1,156 @@
+body {
+    background: #dddada;
+    font-family: '微软雅黑';
+}
+
+.containers {
+    width: 1080px;
+    /* overflow: hidden; */
+    min-height: 80vh;
+    margin: 0 auto;
+}
+
+.con-title {
+    font-size: 24px;
+    background: #f9fafc;
+    text-align: center;
+    font-weight: bold;
+    padding-top: 40px;
+}
+
+.con {
+    /* width: 100%; */
+    height: auto;
+    overflow: hidden;
+    background: #f9fafc;
+    margin: 0 auto 0;
+    display: flex;
+    flex-wrap: wrap;
+    padding: 20px 2%;
+    justify-content: center;
+}
+
+.con li {
+    text-align: center;
+    width: 30%;
+    display: inline-block;
+    margin: 25px 10px;
+}
+
+.case {
+    padding: 10px;
+    background: #fff;
+    border-radius: 10px;
+    box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.4);
+    transition: all 0.3s;
+}
+
+.case:hover {
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.6);
+    transform: translateY(-15px);
+}
+
+.case .card-img {
+    width: 100%;
+    height: 180px;
+    background-repeat: no-repeat;
+    background-size: cover;
+    background-position: top center;
+}
+
+.con li p {
+    margin-top: 10px;
+    font-size: 18px;
+    font-weight: 100;
+}
+
+.link-a {
+    width: 100%;
+    height: 100%;
+    display: inline-block;
+}
+
+#introductionWrap{
+    position: absolute;
+    z-index: 1;
+    display: flex;
+    flex-direction: column;
+    right: 20px;
+    text-align: right;
+    top: 20px;
+    font-size: 18px;
+    color: #ffffff;
+    font-weight: 100;
+    line-height: 30px;
+    letter-spacing: 2px;
+}
+#companyText{
+    position: absolute;
+    z-index: 1;
+    font-size: 16px;
+    color:rgb(153, 153, 153);
+    font-weight: 100;
+    left: 50%;
+    transform: translateX(-50%);
+    bottom: 20px;
+    letter-spacing: 1px;
+    text-shadow:rgb(51, 51, 51) 0px 1px 1px;
+}
+@media screen and (max-width: 600px) {
+    .containers {
+        width: 100%;
+    }
+    .con {
+        padding: 0;
+    }
+    .case .card-img {
+        background-size: auto 100%;
+        height: 90px;
+    }
+    .con li {
+        width: 44%;
+    }
+    #introductionWrap{
+        position: absolute;
+        z-index: 1;
+        display: flex;
+        flex-direction: column;
+        right: 10px;
+        text-align: right;
+        top: 16px;
+        font-size: 16px;
+        color: #ffffff;
+        font-weight: 100;
+        line-height: 28px;
+        letter-spacing: 1px;
+    }
+    /* .con li p {
+        font-size: 16px;
+    } */
+}
+
+.hide{
+    display: none;
+}
+
+#companyText{
+    position: absolute;
+    z-index: 1;
+    font-size: 16px;
+    font-weight: 100;
+    left: 50%;
+    transform: translateX(-50%);
+    bottom: 20px;
+    letter-spacing: 1px;
+}
+
+
+@media screen and (max-width: 320px) {
+    .con li {
+        width: 43%;
+    }
+    .con li p {
+        font-size: 16px;
+        font-weight: 100;
+    }
+}

+ 59 - 0
model-page/css/reset.css

@@ -0,0 +1,59 @@
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section, main {
+	display: block;
+}
+a{
+  text-decoration: none;
+  color: #000;
+}
+body {
+	line-height: 1;
+}
+ol, ul {
+	list-style: none;
+}
+blockquote, q {
+	quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+	content: '';
+	content: none;
+}
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
+button{outline:none;}
+input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{
+        -webkit-appearance:textfield;
+}
+input[type="number"]{
+        -moz-appearance:textfield;
+}

+ 272 - 0
model-page/css/wx.css

@@ -0,0 +1,272 @@
+html, body {
+    width: 100%;
+    height: 100%;
+    font-family: PingFangSC-Regular, sans-serif;
+}
+* {
+    margin:0;
+    padding:0;
+    list-style-type:none;
+    box-sizing:border-box
+}
+html, body, h1, h2, h3, h4, h5, h6, div, dl, dt, dd, ul, ol, li, p, blockquote, pre, hr, figure, table, caption, th, td, form, fieldset, legend, input, button, textarea, menu {
+    margin: 0;
+    padding: 0;
+}
+img {
+    max-width:100%;
+}
+/* ::-webkit-scrollbar {
+    display: none;
+} */
+.flexs {
+    display:flex;
+    justify-content: space-between;
+    align-items:center;
+}
+.flex {
+    display:flex;
+    justify-content: center;
+    align-items:center;
+}
+iframe {
+    width: 100%;
+    height: 100%;
+}
+#ui {
+    position: absolute;
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    flex-direction: column;
+    width: 100%;
+    height: 100%;
+    /* color: #494949; */
+    letter-spacing: 3px;
+}
+.antique-name {
+    font-size:20px;
+    text-align:center;
+    color:#fff;
+    width:70%;
+    margin:21vw auto 0;
+}
+.comment_wrapper {
+    position:relative;
+    z-index:9999;
+    width:83vw;
+    margin:0 auto;
+    display:none;
+}
+.introductionWrap {
+    width:100%;
+    background:#1d1d1d;
+    height:28vw;   
+    font-size:12px;
+    color:#ffffffba;
+    padding:4vw;
+
+}
+.introductionWrap .introduction {
+    overflow:scroll;
+    height: 100%;
+}
+.bg-audio {
+    display:block;
+    position:absolute;
+    z-index:2;
+    top:8.5vw;
+    right:7.4vw;
+    width:7.4vw;
+    height:7.4vw;
+    background:url(../images/bgmusic_icon_play.png)center/100% no-repeat;
+}
+.iconAction {
+    position:relative;
+    width:100%;
+
+    
+}
+.iconAction ul {
+    position: relative;
+    z-index: 999;
+    width:100%;
+    padding:0 17.6vw 9vw;
+;
+}
+.iconAction ul li {
+    width:12vw;
+    text-align:center;
+    cursor:pointer;
+}
+.iconAction ul li i{
+    display:block;
+    width:9vw;
+    height:9vw;
+    width:12vw;
+    margin:0 auto;
+}
+/* .iconAction ul li i.explain_icon{
+    background:url(../images/explain_icon.png)center/100% no-repeat;
+}
+.iconAction ul li i.explain_icon2{
+    background:url(../images/explain_icon2.png)center/100% no-repeat;
+} */
+#explain.active p{
+    color:#9a2e2c;
+}
+#explain .explain_icon {
+    background:url(../images/explain_icon.png)center/100% no-repeat;
+}
+#explain.active .explain_icon {
+    background:url(../images/explain_icon2.png)center/100% no-repeat;
+}
+.iconAction ul li i.comment_icon{
+    background:url(../images/comment_icon.png)center/100% no-repeat;
+}
+#favorite .favorite_icon {
+    background:url(../images/favorite_icon1.png)center/100% no-repeat;
+}
+#favorite.active p {
+    color:#9a2e2c;
+}
+#favorite.active .favorite_icon {
+    background:url(../images/favorite_icon2.png)center/100% no-repeat;
+    
+}
+/* .iconAction ul li i.favorite_icon1{
+    background:url(../images/favorite_icon1.png)center/100% no-repeat;
+}
+.iconAction ul li i.favorite_icon2{
+    background:url(../images/favorite_icon2.png)center/100% no-repeat;
+} */
+.iconAction ul li p {
+    font-size:16px;
+    color:#fff;
+}
+.info_voice {
+    margin:0 auto;
+    text-align:center;    
+}
+.audio_controls .icon_play {
+    display:inline-block;
+    width:3.4vw;
+    margin-right:5px;
+}
+.audio_controls .progress {
+    position:relative;
+    display:inline-block;
+    width:60vw;
+    background:#fff;
+    height:2px;
+}
+.audio_controls .progress i {
+    position:absolute;
+    top:-3px;
+    left:0;
+    display:inline-block;
+    width:8px;
+    height:8px;
+    background:#fff;
+    border-radius:4px;
+    -webkit-border-radius:4px;
+}
+.audio_controls .audio_time {
+    font-size:10px;
+    color:#fff;
+    margin-left:5px;
+}
+/* audio::-webkit-media-controls-panel {
+    background:rgba(255,255,255,1);
+}
+audio::-webkit-media-controls-mute-button {}
+audio::-webkit-media-controls-play-button {}
+audio::-webkit-media-controls-timeline-container {
+    background:none;
+}
+audio::-webkit-media-controls-current-time-display {}
+audio::-webkit-media-controls-time-remaining-display {}
+audio::-webkit-media-controls-timeline {}
+audio::-webkit-media-controls-volume-slider-container {
+    background:none;
+}
+audio::-webkit-media-controls-volume-slider {}
+audio::-webkit-media-controls-seek-back-button {}
+audio::-webkit-media-controls-seek-forward-button {}
+audio::-webkit-media-controls-fullscreen-button {}
+audio::-webkit-media-controls-rewind-button {}
+audio::-webkit-media-controls-return-to-realtime-button {}
+audio::-webkit-media-controls-toggle-closed-captions-button {} */
+.animated {
+    -webkit-animation-duration:1s;
+    animation-duration:1s;
+    -webkit-animation-fill-mode:both;
+    animation-fill-mode:both
+}
+@-webkit-keyframes fadeInBottom {
+    0% {
+        opacity:0;
+        -webkit-transform:translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+    to {
+        opacity:1;
+        -webkit-transform:translateZ(0);
+        transform:translateZ(0)
+    }
+}
+@keyframes fadeInBottom {
+    0% {
+        opacity:0;
+        -webkit-transform:translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+    to {
+        opacity:1;
+        -webkit-transform:translateZ(0);
+        transform:translateZ(0)
+    }
+}
+.fadeInBottom {
+    -webkit-animation-name:fadeInBottom;
+    animation-name:fadeInBottom
+}
+
+@-webkit-keyframes fadeOutBottom {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0;
+        -webkit-transform:translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+}
+@keyframes fadeOutBottom {
+    0% {
+        opacity:1
+    }
+    to {
+        opacity:0;
+        -webkit-transform:translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+}
+.fadeOutBottom {
+    -webkit-animation-name:fadeOutBottom;
+    animation-name:fadeOutBottom
+}
+
+.musicRotate {
+    -webkit-animation: musicRotate 5s linear infinite;
+    animation: musicRotate 5s linear infinite;
+} 
+@keyframes musicRotate {
+    from {
+        transform: rotate(0deg);
+      }
+      to {
+        transform: rotate(360deg);
+        transition: all 5s;
+      }
+}

BIN
model-page/images/bgmusic-play-icon.png


BIN
model-page/images/icon_home.png


BIN
model-page/images/icon_info.png


BIN
model-page/images/icon_left.png


BIN
model-page/images/icon_right.png


BIN
model-page/images/play.png


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
model-page/js/4dage.js


Разница между файлами не показана из-за своего большого размера
+ 4 - 0
model-page/js/jquery.js


+ 40 - 0
model-page/model.html

@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<meta name="viewport"
+    content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
+<link rel="icon" type="image/png" sizes="32x32" href="images/favicon.png" class="keep">
+<html>
+
+<head>
+    <title>新疆生产建设兵团总队</title>
+    <!-- <script src="https://model3d.4dage.com/3D/2018/model/DG/js/4dage.js"></script> -->
+    <script src="./js/4dage.js"></script>
+    <style>
+        html {
+            overflow: hidden;
+        }
+    </style>
+</head>
+
+<body>
+    <script src="./js/jquery.js"></script>
+    <!-- <script src="js/constant.js"></script> -->
+
+    <!-- <script type="text/javascript" src="js/data.js"></script> -->
+    <script>
+        var getQueryVariable = function(variable){
+            var query = window.location.search.substring(1);
+            var vars = query.split("&");
+            for (var i=0;i<vars.length;i++) {
+                    var pair = vars[i].split("=");
+                    if(pair[0] == variable){return pair[1];}
+            }
+            return(false);
+        };
+         var number = getQueryVariable("m");
+        /*  window.autoRotate = true; */   // 是否自动旋转
+        fdage.embed('/goods/model/'+ number, { width: 800, height: 600, autoStart: true, fullFrame: true, pagePreset: false });
+    </script>
+</body>
+
+</html>

+ 2 - 0
new_backstage/package.json

@@ -11,8 +11,10 @@
     "axios": "^0.21.1",
     "core-js": "^3.6.5",
     "element-ui": "^2.15.3",
+    "js-base64": "^3.6.1",
     "vue": "^2.6.11",
     "vue-router": "^3.2.0",
+    "vuedraggable": "^2.24.3",
     "vuex": "^3.6.2"
   },
   "devDependencies": {

+ 1 - 1
new_backstage/public/index.html

@@ -5,7 +5,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.png">
-    <title>新疆生产建设兵团总队</title>
+    <title>中国人民武装警察部队新疆生产建设兵团总部</title>
   </head>
   <body>
     <noscript>

+ 2 - 1
new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.css

@@ -1352,6 +1352,7 @@ button::-moz-focus-inner {
   position: absolute;
   width: 100%;
   z-index: 1100;
+  transform:translateX(-50%);left:50%;
 }
 .tox .tox-dialog__body-iframe {
   display: flex;
@@ -2358,7 +2359,7 @@ body.tox-dialog__disable-scroll {
 .tox .tox-pop.tox-pop--align-right::after {
   left: calc(100% - 20px);
 }
-.tox .tox-sidebar-wrap {
+.tox .tox-sidebar-wrap {pointer-events: auto!important;opacity: 1!important;
   display: flex;
   flex-direction: row;
   flex-grow: 1;

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.min.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
new_backstage/public/static/tinymce/skins/ui/oxide-dark/skin.min.css.map


+ 3 - 1
new_backstage/public/static/tinymce/skins/ui/oxide/skin.css

@@ -1352,6 +1352,8 @@ button::-moz-focus-inner {
   position: absolute;
   width: 100%;
   z-index: 1100;
+  transform: translateX(-50%);
+  left: 50%;
 }
 .tox .tox-dialog__body-iframe {
   display: flex;
@@ -2358,7 +2360,7 @@ body.tox-dialog__disable-scroll {
 .tox .tox-pop.tox-pop--align-right::after {
   left: calc(100% - 20px);
 }
-.tox .tox-sidebar-wrap {
+.tox .tox-sidebar-wrap {pointer-events: auto!important;opacity: 1!important;
   display: flex;
   flex-direction: row;
   flex-grow: 1;

Разница между файлами не показана из-за своего большого размера
+ 3060 - 1
new_backstage/public/static/tinymce/skins/ui/oxide/skin.min.css


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
new_backstage/public/static/tinymce/skins/ui/oxide/skin.min.css.map


+ 1 - 1
new_backstage/public/static/tinymce/themes/silver/theme.min.js

@@ -26599,7 +26599,7 @@
       },
       view: {
         title: 'View',
-        items: 'code | visualaid visualchars visualblocks | spellchecker | preview fullscreen | showcomments'
+        items: 'code | visualchars visualblocks | spellchecker | preview fullscreen | showcomments'
       },
       insert: {
         title: 'Insert',

+ 1 - 1
new_backstage/src/assets/font/iconfont.json

@@ -1,6 +1,6 @@
 {
   "id": "1855608",
-  "name": "新疆生产建设兵团总队",
+  "name": "中国人民武装警察部队新疆生产建设兵团总部",
   "font_family": "iconfont",
   "css_prefix_text": "icon",
   "description": "展示界面和管理后台",

BIN
new_backstage/src/assets/img/defaultImg.jpg


+ 8 - 9
new_backstage/src/components/Tinymce/index.vue

@@ -101,37 +101,36 @@ export default {
         },
         file_upload_handler:async (blobInfo,success,failure)=>{
           let form = new FormData()
-          console.log(blobInfo.file)
+          console.log(blobInfo)
           form.append('file',blobInfo.file)
            await this.$http({
             method: "post",
             data: form,
             headers: {
-              token: window.localStorage.getItem("token"),
               'Content-Type':'multipart/form-data'
             },
-            url: `/manage/file/upload`,
+            url: `cms/news/upload/file`,
           }).then(result=>{
-            let url = result.data.urlPath;
+            let url = result.data.filePath;
             success(url)
           }).catch(err=>{
             failure(err)
           })
         },
-        images_upload_handler:async (blobInfo,success,failure)=>{
+        images_upload_handler:async (blobInfo,success)=>{
           let form = new FormData()
-          console.log(failure)
+          console.log(blobInfo.blob(),blobInfo.filename())
           form.append('file',blobInfo.blob(),blobInfo.filename())
+          
           await this.$http({
             method: "post",
             data: form,
             headers: {
-              token: window.localStorage.getItem("token"),
               'Content-Type':'multipart/form-data'
             },
-            url: `/manage/file/upload`,
+            url: `cms/news/upload/img`,
           }).then(result=>{
-            let url = result.data.urlPath;
+            let url = result.data.filePath;
             success(url)
           }).catch(()=>{
             this.$alert("上传失败,请稍后再试", "提示", {

+ 1 - 1
new_backstage/src/components/Tinymce/plugins.js

@@ -1,5 +1,5 @@
 const plugins = [
-    'advlist anchor autolink autosave code indent2em lineheight codesample directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak  preview print save searchreplace tabfocus table template  textpattern visualblocks visualchars wordcount paste axupimgs'
+    'advlist anchor autolink autosave code indent2em lineheight codesample directionality emoticons fullscreen hr image imagetools importcss insertdatetime link lists media nonbreaking noneditable pagebreak  preview print save searchreplace tabfocus table  textpattern visualblocks visualchars wordcount paste axupimgs'
   ]
   
 export default plugins

+ 4 - 2
new_backstage/src/components/Tinymce/toolbar.js

@@ -1,3 +1,5 @@
-const toolbar = ['formatselect fontsizeselect forecolor backcolor bold italic underline strikethrough alignleft aligncenter alignright outdent indent  indent2em lineheight  removeformat  hr undo redo image media axupimgs']
+const toolbar = [
+  "formatselect fontsizeselect forecolor backcolor bold italic underline strikethrough alignleft aligncenter alignright outdent indent  indent2em lineheight  removeformat  hr undo redo image media axupimgs",
+];
 
-export default toolbar
+export default toolbar;

+ 1 - 1
new_backstage/src/components/editcomponent/editcon.vue

@@ -22,7 +22,7 @@
 
        <template v-else>
         <el-button @click="$emit('cancel')">返回</el-button>
-        <el-button type="primary" @click="$emit('determine')">确定</el-button>
+        <el-button v-if="$route.name=='edit-role'||$route.name=='edit-user'" type="primary" @click="$emit('determine')">确定</el-button>
       </template>
     </el-footer>
   </el-container>

+ 1 - 0
new_backstage/src/components/editcomponent/editdialog.vue

@@ -12,6 +12,7 @@
             type="textarea"
             :autosize="{ minRows: 2, maxRows: 4}"
             placeholder="请输入内容"
+            :maxlength="INPUTLENGTH*2" show-word-limit
             v-model="auditForm.reason">
           </el-input>
         </el-form-item>

+ 2 - 2
new_backstage/src/components/editcomponent/usereditdialog.vue

@@ -9,7 +9,7 @@
       <div class="formcon">
         <div class="formtop">
           <div class="left">
-            <el-form-item label="用户身份码:" prop="userName">
+            <el-form-item label="身份码:" prop="userName">
               <el-input :disabled="true" v-model="form.userName"></el-input>
             </el-form-item>
 
@@ -76,7 +76,7 @@
 import {saveSys} from "@/configue/api";
 
 let rule = {
-  userName: [{ required: true, message: "请输入用户身份码", trigger: "blur" }],
+  userName: [{ required: true, message: "请输入身份码", trigger: "blur" }],
   nickName: [{ required: true, message: "请输入用户昵称", trigger: "blur" }],
   unit: [{ required: true, message: "请输入单位名称", trigger: "blur" }],
   roleId: [{ required: true, message: "请选择用户角色", trigger: "change" }],

+ 30 - 19
new_backstage/src/components/table/index.vue

@@ -12,42 +12,52 @@
         :key="idx"
         :prop="item.prop"
         :label="item.label"
-        :width="item.prop === 'thumb' ? 300 : 'auto'"
+        :width="item.prop === 'thumb' ? 300 : (item.width||'auto')"
       >
         <template slot-scope="scope">
 
           <el-image 
             v-if="item.prop === 'thumb'"
-            style="min-width:180px;width:auto;height:160px;"
+            style="min-width:180px;width:auto;height:220px;"
             :fit="'cover'"
-            :src="scope.row[item.prop]"
+            :src="scope.row[item.prop]||(item.default?require('@/assets/img/defaultImg.jpg'):'')"
           :preview-src-list="[scope.row[item.prop]]">
         </el-image>
 
             
-        <template v-else-if="item.prop === 'display' && activeSub['是否显示']">
-          <span v-if="!isNull(scope.row.status)&&scope.row.status!=3">-</span>
-          <el-switch
-            v-else
-            @change="(e)=>{handleSwitch(e,scope.row)}"
-            v-model="scope.row[item.prop]">
-          </el-switch>
-        </template>
+        <template v-else-if="item.prop === 'display' ">
+          <span v-if="!activeSub['是否显示']">-</span>
+          <template v-else>
+             <span v-if="!isNull(scope.row.status)&&scope.row.status!=3">-</span>
+            <el-switch
+              v-else
+              @change="(e)=>{handleSwitch(e,scope.row)}"
+              v-model="scope.row[item.prop]">
+            </el-switch>
+          </template>
          
-          
-
+        </template>
 
-          <el-switch
+        <template v-else-if="item.prop === 'isEnabled'">
+          <span v-if="scope.row.roleKey=='sys_admin'">-</span>
+            <el-switch
             @change="(e)=>{handleDisableSwitch(e,scope.row)}"
-            v-else-if="item.prop === 'isDisable'"
+            v-else
             v-model="scope.row[item.prop]">
           </el-switch>
+        </template>
+        
 
           <template
             v-else-if="item.prop === 'record'">
             <slot :data="scope.row" name="record"></slot>
           </template>
           <span v-else-if="item.prop === 'status'">{{ statusStr[scope.row[item.prop]] || "-" }}</span>
+
+          <template v-else-if="item.canEdit">
+              <slot :name="item.prop" :data="scope.row"></slot>
+          </template>
+          
           <span v-else>{{ scope.row[item.prop] }}</span>
         </template>
       </el-table-column>
@@ -61,7 +71,7 @@
 
           <template v-else>
              <!-- 草稿中 -->  
-            <span v-if="scope.row.status===0 && activeSub['提交']" class="o-span" @click="submit(scope.row,type)">提交</span>
+            <span v-if="scope.row.status===0 && activeSub['提交']" class="o-span" @click="$emit('submit',{item:scope.row,type})">提交</span>
 
             <!-- 待审核 -->
             <span v-if="(scope.row.status==1||scope.row.status==3) && activeSub['查看']" class="o-span" @click="goto(scope.row)">查看</span>
@@ -73,7 +83,8 @@
             <span v-if="(scope.row.status==2||scope.row.status==0) && activeSub['编辑']" class="o-span" @click="goto(scope.row)">编辑</span> 
           </template>
           
-          <span v-if="activeSub['删除']" :class="{disabletxt:scope.row.display}" class="o-span" @click="$emit('del',{item:scope.row,type})">删除</span>
+          <span v-if="activeSub['删除']||scope.row.status===0" :class="{disabletxt:scope.row.display}" class="o-span" @click="$emit('del',{item:scope.row,type})">删除</span>
+          <span v-if="!activeSub['查看']&&!activeSub['提交']&&!activeSub['审核']&&!activeSub['编辑']&&!activeSub['删除']">-</span>
         </template>
       </el-table-column>
       
@@ -129,7 +140,7 @@ export default {
        this.tableData.list && this.tableData.list.forEach((item, i) => {
         item["idx"] = i + 1 + this.page.size * (this.page.pageNum-1);
         item["display"] = Boolean(item["display"]);
-        item["isDisable"] = Boolean(item["isDisable"]);
+        item["isEnabled"] = Boolean(item["isEnabled"]);
         item["sexStr"] = item["sex"]==0?'男':'女'
       });
       return this.tableData
@@ -151,7 +162,7 @@ export default {
       console.log(item);
       handleDisable(this.$route.name,{
         id:item.id,
-        isDisable:Number(val),
+        isEnabled:Number(val),
       },()=>{})
     },
     handleCurrentChange(data){

+ 4 - 4
new_backstage/src/components/uploadFile/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div>
-    <el-input class="fadeDom" v-model="data"></el-input>
+    <el-input class="fadeDom" v-model="filePath"></el-input>
     <el-upload
       class="upload-demo"
       drag
@@ -18,13 +18,13 @@
         <p style="padding:0 10px;">{{desc}}</p>
       </div>
     </el-upload>
-    <p style="color:#999">{{data}}</p>
+    <slot name="filePath" ></slot>
   </div>
 </template>
 
 <script>
 export default {
-  props:['data','url','desc'],
+  props:['filePath','url','desc'],
   data(){
     return {
       token:window.localStorage.getItem('token')
@@ -62,7 +62,7 @@ export default {
     handleSuccess(res) {
       this.loading.close()
       let { data } = res;
-      this.$emit('update',data.filePath)
+      this.$emit('update',data)
     }
   }
 }

+ 22 - 1
new_backstage/src/components/uploadThumb/index.vue

@@ -10,8 +10,14 @@
       :on-error="handleError"
       :before-upload="beforeAvatarUpload"
     >
-      <img v-if="thumb" :src="thumb" class="avatar" />
+    <template v-if="thumb" >
+      <img :src="thumb" class="avatar" />
+      <div class="del" @click.stop="thumb=''">
+        <i class="el-icon-delete"></i>
+      </div>
+    </template>
       <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+     
     </el-upload>
     <span style="color:#999;">格式要求:支持png、jpg、gif和jpeg的图片格式;最大支持20M。</span>
   </div>
@@ -68,8 +74,23 @@ export default {
     position: relative;
     overflow: hidden;
   }
+  .avatar-uploader {
+    .del{
+      position: absolute;
+      right: 0;
+      top: 0;
+      display: none;
+      width: 40px;
+      >i{
+
+      }
+    }
+  }
   .avatar-uploader .el-upload:hover {
     border-color: #409EFF;
+    .del{
+      display: block;
+    }
   }
   .avatar-uploader-icon {
     font-size: 28px;

+ 24 - 2
new_backstage/src/configue/api.js

@@ -40,6 +40,18 @@ export function getSysList(type, data, cb) {
   });
 }
 
+// 获取用户设置的权限列表
+export function getRoleList(cb) {
+
+  axios({
+    method: "get",
+    url: `sys/user/getRole`,
+  }).then((res) => {
+    cb(res);
+  });
+}
+
+
 
 // 保存
 
@@ -172,7 +184,7 @@ export function handleDisplay(type, data, cb) {
 export function handleDisable(type, data, cb) {
   axios({
     method: "get",
-    url: `sys/${type}/editStatus/${data.id}/${data.isDisable}`,
+    url: `sys/${type}/editStatus/${data.id}/${data.isEnabled}`,
   }).then((res) => {
     cb(res);
   });
@@ -222,7 +234,7 @@ export function delQuestion(data, cb) {
 export function delscene(data, cb) {
   axios({
     method: "get",
-    url: `scene/removes/${data.id}`,
+    url: `cms/scene/removes/${data.id}`,
   }).then((res) => {
     cb(res);
   });
@@ -239,6 +251,16 @@ export function delSys(type, data, cb) {
   });
 }
 
+//删除(sys)
+export function delSysSingle(type, data, cb) {
+  axios({
+    method: "get",
+    url: `sys/${type}/remove/${data.id}`,
+  }).then((res) => {
+    cb(res);
+  });
+}
+
 //重置密码
 export function resetPass(data, cb) {
   axios({

+ 6 - 9
new_backstage/src/configue/http.js

@@ -24,6 +24,10 @@ axios.interceptors.request.use(
       spinner: "el-icon-loading",
       background: "rgba(0, 0, 0, 0.7)",
     });
+
+    if(config.headers["Content-Type"]=='multipart/form-data'){
+      return config;
+    }
    
     if (config.method === "post") {
       config.data = {
@@ -35,10 +39,11 @@ axios.interceptors.request.use(
       config.params = {
         rnd: Math.random(),
         ...config.params,
-      };
+      } 
       // config.params = qs.stringify(config.params)
     }
 
+   
     return config;
   },
   function(error) {
@@ -67,14 +72,6 @@ axios.interceptors.response.use(
               router.push("/login");
             },
           });
-        } else {
-          vue.$alert("登录状态失效,请重新登录", "提示", {
-            confirmButtonText: "确定",
-            callback: function() {
-              window.localStorage.setItem("userInfo", "");
-              router.push("/login");
-            },
-          });
         }
         return
       case 5002:

+ 29 - 4
new_backstage/src/mixins/index.js

@@ -11,8 +11,7 @@ Vue.prototype.$http = axios;
 Vue.prototype.isImage = isImage;
 Vue.prototype.isTypeBySend = isTypeBySend;
 
-Vue.prototype.MAXLENGTH = 200;
-Vue.prototype.FONTLENGTH = 25;
+Vue.prototype.INPUTLENGTH = 25;
 Vue.prototype.PAGESIZES = [25, 50, 75, 100];
 Vue.prototype.loading = {
   close() {},
@@ -93,8 +92,20 @@ Vue.prototype.sex = {
   1: "女",
 };
 
+
+
 Vue.prototype.$serverName = serverName; // 挂载到Vue实例上面
 
+let g_political = [{
+  val:'群众'
+},{
+  val:'团员'
+},{
+  val:'党员'
+},{
+  val:'预备党员'
+}]
+
 import MainTop from "@/components/main-top";
 import search from "@/components/search";
 import accordion from "@/components/accordion";
@@ -115,6 +126,11 @@ Vue.mixin({
     editdialog,
     vdialog: dialog,
   },
+  data(){
+    return {
+      g_political
+    }
+  },
   methods: {
     cloneObject,
     isNull,
@@ -209,8 +225,17 @@ Vue.mixin({
         this.alDetail = res;
       });
     },
-    submit(item, type) {
-      console.log(item, type);
+    submit(data,hadTwoParam=null) {
+      let item = ''
+      let type = ''
+      if (hadTwoParam) {
+          item = data
+          type = hadTwoParam
+      }
+      else{
+        item = data.item
+        type = data.type
+      }
       this.confirm("提交后,信息将进入审核,是否继续?", () => {
         apply(type, { id: item.id }, () => {
           this.$alert("提交成功", "提示", {

+ 30 - 15
new_backstage/src/pages/content/collection/componets/img.vue

@@ -1,22 +1,24 @@
 <template>
   <div>
     <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="精品类型:">
       <el-radio disabled v-model="radio" label="选中且禁用">专题图库</el-radio>
     </el-form-item>
 
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
-
     <el-form-item label="图片:" prop="thumb">
+      <el-input v-model="form.thumb" class="fadeDom"></el-input>
       <ul class="tuku">
         <li v-for="(item, i) in filelist" :key="i">
           <div class="imgcon">
-            <img class="img" :src="$serverName + item.filePath" alt="" />
+            <el-image 
+              class="img" 
+              :src="item.filePath"
+              :fit="'cover'"
+              :preview-src-list="[item.filePath]">
+            </el-image>
             <div class="cover" v-if="item.isIndex">封面图片</div>
             <el-button
               @click="del(item, i)"
@@ -48,7 +50,7 @@
 <script>
 import uploadImg from "./plugin/uploadimg.vue";
 
-import { setCover, delImg } from "@/configue/api";
+import { delImg } from "@/configue/api";
 
 export default {
   props: ["data", "rule", "filelist"],
@@ -60,14 +62,19 @@ export default {
       thumbUrl: this.$serverName + "cms/goods/uploadImg",
     };
   },
+  watch:{
+    'filelist':function (newVal) {
+      if (newVal.length<=0) {
+        this.form.indexId = ''
+        this.form.thumb = ''
+      }
+    }
+  },
   methods: {
     setCover(item) {
-      setCover(
-        {
-          fileId: item.id,
-        },
-        () => {
-          this.filelist.forEach((sub) => {
+      this.form.indexId = item.id
+      this.form.thumb = item.filePath
+      this.filelist.forEach((sub) => {
             //匹配置为0
             if (item.id == sub.id) {
               sub.isIndex = 1;
@@ -75,8 +82,6 @@ export default {
               sub.isIndex = 0;
             }
           });
-        }
-      );
     },
 
     del(item, i) {
@@ -99,10 +104,16 @@ export default {
     reupload() {},
 
     updateImg(data) {
+      
       this.filelist.push({
         ...data,
         isIndex:0
       })
+
+      if (this.filelist.length===1) {
+        this.form.indexId = data.id
+        this.form.thumb = data.filePath
+      }
     },
   },
 };
@@ -113,9 +124,11 @@ export default {
 .tuku {
   display: flex;
   margin-bottom: @gap;
+  flex-wrap: wrap;
   li {
     width: 180px;
     margin-right: @gap;
+    margin-bottom: @gap;
     .imgcon {
       cursor: pointer;
       width: 100%;
@@ -123,6 +136,7 @@ export default {
       margin-bottom: @gap / 2;
       position: relative;
       background: #f0f0f0;
+      overflow:hidden;
       .img {
         width: 100%;
         position: absolute;
@@ -141,6 +155,7 @@ export default {
         top: 50%;
         left: 0;
         transform: translateY(-50%);
+        pointer-events: none;
       }
       button {
         display: none;

+ 15 - 6
new_backstage/src/pages/content/collection/componets/model.vue

@@ -1,23 +1,23 @@
 <template>
   <div>
     <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="精品类型:">
       <el-radio disabled v-model="radio" label="选中且禁用">实物模型</el-radio>
     </el-form-item>
 
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
-
     <el-form-item label="封面图片:" prop="thumb">
       <uploadThumb :url="thumbUrl" @update="data=>{form.thumb = data}" :thumb="form.thumb" />
     </el-form-item>
 
     <el-form-item label="模型文件:" prop="filePath">
-      <uploadFile :url="fileUrl" @update="data=>{form.filePath = data}" :data="form.filePath" :desc="'仅支持.4dage格式的模型文件,大小不得超过500m'" />
+      <uploadFile :url="fileUrl" @update="data=>{form.fileName = data.fileName,form.filePath = data.filePath}" :filePath="form.filePath" :desc="'仅支持.4dage格式的模型文件,大小不得超过500m'" >
+        <div slot="filePath" v-if="form.filePath">
+          <iframe :src="`/model-page/model.html?m=${form.fileName}`" frameborder="0"></iframe>
+        </div>
+      </uploadFile>
     </el-form-item>
   </div>
 </template>
@@ -39,3 +39,12 @@ export default {
   },
 };
 </script>
+
+<style lang="less" scoped>
+iframe{
+  width: 50%;
+  height: 400px;
+  pointer-events: auto!important;
+  opacity: 1!important;
+}
+</style>

+ 12 - 6
new_backstage/src/pages/content/collection/componets/video.vue

@@ -1,23 +1,21 @@
 <template>
   <div>
     <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="精品类型:">
       <el-radio disabled v-model="radio" label="选中且禁用">视频档案</el-radio>
     </el-form-item>
 
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
-
     <el-form-item label="封面图片:" prop="thumb">
       <uploadThumb :url="thumbUrl" @update="data=>{form.thumb = data}" :thumb="form.thumb" />
     </el-form-item>
 
     <el-form-item label="视频文件:" prop="filePath">
-      <uploadFile :url="fileUrl" @update="data=>{form.filePath = data}" :data="form.filePath" :desc="'支持AVI、mov、rmvb、rm、FLV、mp4、3GP等格式的视频文件,大小不超过2GB'" />
+      <uploadFile :url="fileUrl"  @update="data=>{form.fileName = data.fileName,form.filePath = data.filePath}" :filePath="form.filePath" :desc="'支持AVI、mov、rmvb、rm、FLV、mp4、3GP等格式的视频文件,大小不超过2GB'" />
+      <video class="svideo" v-if="form.filePath" controls :src="form.filePath">
+      </video>
     </el-form-item>
   </div>
 </template>
@@ -40,3 +38,11 @@ export default {
   },
 };
 </script>
+
+<style lang="less" scoped>
+.svideo{
+  max-width: 50%;
+  pointer-events: auto!important;
+  opacity: 1!important;
+}
+</style>

+ 6 - 5
new_backstage/src/pages/content/collection/data.js

@@ -135,19 +135,20 @@ let formKey = {
     name:'',
     thumb:'',
     filePath:'',
-    display: true
+    display: false
   },
   img:{ 
     name:'',
     thumb:'',
     filePath:'',
-    display: true
+    display: false,
+    indexId:''
   },
   video:{ 
     name:'',
     thumb:'',
     filePath:'',
-    display: true
+    display: false
   }
 }
 
@@ -159,12 +160,12 @@ let rules = {
   },
   img:{ 
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],
-    thumb: [{ required: true, message: "请选择精品类型", trigger: "blur" }],
+    thumb: [{ required: true, message: "请上传图片", trigger: "change" }],
     filePath: [{ required: true, message: "请上传封面图片", trigger: "blur" }]
   },
   video:{ 
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],
-    thumb: [{ required: true, message: "请选择精品类型", trigger: "blur" }],
+    thumb: [{ required: true, message: "请上传封面图片", trigger: "blur" }],
     filePath: [{ required: true, message: "请上传封面图片", trigger: "blur" }]
   }
 }

+ 5 - 1
new_backstage/src/pages/content/collection/edit.vue

@@ -33,6 +33,10 @@ import vvideo from "./componets/video";
 import { formKey, rules } from "./data";
 import { save, getDetail } from "@/configue/api";
 
+import {randomWord} from "@/util/index.js";
+
+let ran = randomWord(true,8,8)
+
 export default {
   components: {
     vmodel,
@@ -71,7 +75,7 @@ export default {
       this.validate(() => {
         let fileIds = this.filelist.map((item) => item.id).join(",");
         let params = {
-          code: "",
+          code: ran,
           description: "",
           fileIds: fileIds,
           fileName: "",

+ 5 - 3
new_backstage/src/pages/content/collection/index.vue

@@ -18,7 +18,7 @@
         <status :status="status" @select="selectStatus"></status>
         <search>
           <div slot="content" class="searchslot">
-            <span>发布时间:</span>
+            <span>提交时间:</span>
             <el-date-picker
               v-model="search.date"
               type="daterange"
@@ -31,13 +31,14 @@
             <span>标题:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               v-model="search.inputKey"
               @keydown.enter.native="getList"
-              placeholder="请输入标题"
+              placeholder="请输入关键字"
             ></el-input>
             <el-button @click="getList" type="primary">查询</el-button>
+            <el-button @click="search.date='',search.inputKey='',getList()" >重置</el-button>
           </div>
         </search>
         <div class="table">
@@ -57,6 +58,7 @@
               }
             "
             @del="del"
+            @submit="submit"
             :tableData="list"
           >
           

+ 22 - 12
new_backstage/src/pages/content/interaction/componets/questionGroup.vue

@@ -1,16 +1,15 @@
 <template>
   <div>
     <el-form-item label="题组标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
-    </el-form-item>
-
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item prop="answerStr">
       <el-input class="fadeDom" v-model="form.answerStr"></el-input>
-      <ul class="questsion">
+      <draggable tag="ul"
+            animation="300"
+            v-model="form.answer"
+            class="questsion">
         <li v-for="(item,i) in form.answer" :key="i">
           <div class="xuhao">
             <span>第{{i+1}}题</span>
@@ -18,22 +17,22 @@
           </div>
           <div class="qtitle">
             <label class="required">题目:</label>
-            <el-input v-model="item.question"></el-input>
+            <el-input v-model="item.question" :maxlength="INPUTLENGTH" show-word-limit></el-input>
           </div>
 
           <div class="qanswer">
             <label class="required">选项:</label>
-            <ul>
+            <draggable tag="ul" animation="300" v-model="item.answer">
               <li v-for="(sub,idx) in item.answer" :key="idx">
                 <el-radio v-model="item.correct" :label="sub.val"><span style="display:none">{{idx}}</span></el-radio>
-                <input v-model="sub.name" placeholder="请输入选项内容" type="text">
+                <input v-model="sub.name" placeholder="请输入选项内容"  :maxlength="INPUTLENGTH" show-word-limit type="text">
                 <i @click="delAnswer(item,idx)" class="el-icon-close"></i>
               </li>
               <el-button size="small" @click="addAnswer(item)" type="primary">增加选项<i class="el-icon-plus el-icon--right"></i></el-button>
-            </ul>
+            </draggable>
           </div>
         </li>
-      </ul>
+      </draggable>
       <el-button @click="addquestion" type="primary">增加题目<i class="el-icon-plus el-icon--right"></i></el-button>
     </el-form-item>
 
@@ -43,6 +42,7 @@
 <script>
 // import { saveQuestion,updateQuestion,delQuestion } from "@/configue/api";
 import {randomWord} from "@/util/index.js";
+import draggable from "vuedraggable";
 
 let ran = randomWord(true,8,8)
 
@@ -62,6 +62,7 @@ export default {
       form: this.data
     };
   },
+  components:{draggable},
   methods:{
     addquestion(){
       this.form.answer.push(this.cloneObject(temp))
@@ -83,7 +84,16 @@ export default {
       this.form.answer.splice(i,1)
     },
     delAnswer(item,i){
-      item.answer.splice(i,1)
+      let isCorrect = item.answer.find(sub=>sub.val==item.correct)
+      if (item.answer.length<=2) {
+        this.$alert("至少设置两个选项");
+      }
+      else{
+        item.answer.splice(i,1)
+        if (isCorrect) {
+          item.correct=''
+        }
+      }
     }
   },
   watch:{

+ 47 - 22
new_backstage/src/pages/content/interaction/componets/sensitive.vue

@@ -1,33 +1,58 @@
 <template>
-  <div class="disable">
-    <el-form-item label="单位名称:">
-      <el-input v-model="form.unit"></el-input>
-    </el-form-item>
-
-    <el-form-item label="真实姓名:">
-      <el-input v-model="form.realName"></el-input>
-    </el-form-item>
-
-    <el-form-item label="致敬烈士姓名:">
-      <el-input v-model="form.martyrId"></el-input>
-    </el-form-item>
-
-    <el-form-item label="缅怀内容:" >
-      <el-input v-model="form.content"
-          type="textarea"
-          :autosize="{ minRows: 2, maxRows: 4 }"></el-input>
-    </el-form-item>
-  </div>
+  <el-dialog title="敏感词新增" @close="$emit('close')" :visible="show">
+    <el-form :model="form" :rules="rules" ref="sensitiveForm">
+      <el-form-item
+        label="敏感词:"
+        :label-width="formLabelWidth"
+        prop="name"
+      >
+        <el-input type="textarea" :rows="2"  :maxlength="INPUTLENGTH" show-word-limit placeholder="请输入内容" v-model="form.name">
+        </el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="$emit('close')">取 消</el-button>
+      <el-button type="primary" @click="saveSensitive">确 定</el-button>
+    </div>
+  </el-dialog>
 </template>
 
 <script>
-
+import { save } from "@/configue/api";
+let rules = {
+  name: [{ required: true, message: "请输入敏感词", trigger: "blur" }]
+};
 export default {
-  props: ["data",'rule'],
+  props: {
+    show: {
+      type: Boolean,
+    },
+    form: Object,
+  },
   data() {
     return {
-      form: this.data
+      formLabelWidth: "100px",
+      rules,
     };
   },
+  methods: {
+    saveSensitive() {
+      this.$refs.sensitiveForm.validate((valid) => {
+        if (valid) {
+          let params = {
+            ...this.form
+          };
+          save("sensitive", params, () => {
+            this.$alert("操作成功", "提示", {
+              confirmButtonText: "确定",
+              callback: () => {
+                this.$emit("close", true);
+              },
+            });
+          });
+        }
+      });
+    },
+  },
 };
 </script>

+ 4 - 22
new_backstage/src/pages/content/interaction/data.js

@@ -19,6 +19,7 @@ let raw = {
     {
       prop: "content",
       label: "留言内容",
+      width: 350
     },
     {
       prop: "createTime",
@@ -50,6 +51,7 @@ let raw = {
     {
       prop: "content",
       label: "弹幕内容",
+      width:350
     },
     {
       prop: "createTime",
@@ -141,24 +143,8 @@ let menu = [
 
 let formKey = {
   comment:{ 
-    birthday: "",
-    description: "",
-    dieDay: "",
-    diePlace: "",
-    display: 0,
-    honor: "",
-    nation: "",
-    nativePlace: "",
-    politicsStatus: "",
-    realName: "",
-    sex: 0,
-    thumb: ""
   },
   barrage:{ 
-    realName:'',
-    martyrId:'',
-    unit:'',
-    content:''
   },
   questionGroup:{ 
     answer: [],
@@ -167,22 +153,18 @@ let formKey = {
     name: ""
   },
   sensitive:{ 
-    realName:'',
-    martyrId:'',
-    unit:'',
-    content:''
+ 
   }
 }
 
 
 var checkAnswer = (rule, value, callback) => {
-  console.log(value);
   if (!value) {
     return callback(new Error('请添加题目'));
   }
   setTimeout(() => {
     callback();
-  }, 1000);
+  }, 500);
 };
 
 let rules = {

+ 83 - 44
new_backstage/src/pages/content/interaction/edit.vue

@@ -10,16 +10,24 @@
       :status="status"
       @cancel="backList"
       @save="save"
-      @submit="submit({id},type)"
+      @submit="submit({ id }, type)"
       @determine="determine"
     >
       <template slot-scope="{ form }" slot="content">
-        <component :data="form" :is="cp"/>
+        <component
+          :data="form"
+          :is="cp"
+          :class="{ disable: status !== 0 && status !== 2 }"
+        />
       </template>
     </editcon>
 
-    <editdialog :type="type" :show='showAudit' @close="showAudit=false" :id="id"/>
-
+    <editdialog
+      :type="type"
+      :show="showAudit"
+      @close="showAudit = false"
+      :id="id"
+    />
   </div>
 </template>
 
@@ -32,26 +40,26 @@ import vbarrage from "./componets/barrage";
 import vquestionGroup from "./componets/questionGroup";
 
 import { formKey, rules } from "./data";
-import {save,getDetail,saveQuestion} from "@/configue/api";
-// import { saveQuestion,updateQuestion,delQuestion } from "@/configue/api";
+import { save, getDetail, saveQuestion } from "@/configue/api";
 
+// import { saveQuestion,updateQuestion,delQuestion } from "@/configue/api";
 
 export default {
   components: {
     vcomment,
     vquestionGroup,
     vsensitive,
-    vbarrage
+    vbarrage,
   },
-   data() {
+  data() {
     let { type, id, status } = this.$route.params;
-    
+
     return {
       type,
-      id:String(id),
-      status:Number(status),
-      form: '',
-      showAudit:false
+      id: String(id),
+      status: Number(status),
+      form: "",
+      showAudit: false,
     };
   },
   computed: {
@@ -66,48 +74,79 @@ export default {
     },
   },
   mounted() {
-    this.getDetail()
+    this.getDetail();
   },
   methods: {
     save() {
       this.validate(() => {
-        
-        saveQuestion(this.form.answer,res=>{
-            save(this.type,{
-              answerIds: res.data.join(','),
+        let flag = true;
+        this.form.answer.forEach((item) => {
+          if(!item.correct){
+            flag = false;
+            return
+          }
+          if (!item.question) {
+            flag = false;
+            return
+          } else {
+            if (item.answer.length < 2) {
+              flag = false;
+              return
+            }
+            item.answer.forEach((sub) => {
+              if (!sub.name) {
+                flag = false;
+                return
+              }
+            });
+          }
+        });
+        if (!flag) {
+          return this.$alert("请完善题目和选项(每道题至少设置两个选项,且设置正确答案)");
+        }
+        saveQuestion(this.form.answer, (res) => {
+          save(
+            this.type,
+            {
+              answerIds: res.data.join(","),
               name: this.form.name,
               id: this.id == "none" ? null : this.id,
-            },()=>{
-              this.$alert('添加成功', '提示', {
-                  confirmButtonText: '确定',
-                  callback: () => {
-                    this.backList()
-                  }
-                })
-            })
-        })
+            },
+            () => {
+              this.$alert(`${this.id == "none"?'添加成功':'保存成功'}`, "提示", {
+                confirmButtonText: "确定",
+                callback: () => {
+                  this.backList();
+                },
+              });
+            }
+          );
+        });
       });
     },
 
-    async getDetail(){
-      if(this.id == 'none'){
-        this.form = this.cloneObject(formKey[this.type])
-      } else{
-        await getDetail(this.type,{id:this.id},res=>{
-          if (this.type == 'questionGroup') {
-            res.data.answer = res.data.answer.map(item=>{
-              item.answer = JSON.parse(item.answer)
-              return item
-            })
-            this.form = {...res.data.entity,answer:res.data.answer,answerStr:JSON.stringify(res.data.answer)}
+    async getDetail() {
+      if (this.id == "none") {
+        this.form = this.cloneObject(formKey[this.type]);
+      } else {
+        await getDetail(this.type, { id: this.id }, (res) => {
+          if (this.type == "questionGroup") {
+            res.data.answer = res.data.answer.map((item) => {
+              item.answer = JSON.parse(item.answer);
+              return item;
+            });
+            this.form = {
+              ...res.data.entity,
+              answer: res.data.answer,
+              answerStr: JSON.stringify(res.data.answer),
+            };
+          } else {
+            this.form = { ...this.form, ...res.data };
           }
-          else{
-            this.form = {...this.form,...res.data}
-          }
-          this.form['display'] = Boolean(this.form['display'])
-        })
+          this.form["display"] = Boolean(this.form["display"]);
+        });
       }
-    }
+    },
   },
 };
 </script>

+ 36 - 9
new_backstage/src/pages/content/interaction/index.vue

@@ -7,7 +7,7 @@
             $route.params.type == 'questionGroup' ||
               $route.params.type == 'sensitive'
           "
-          @click="goto({ id: 'none',status: 0 })"
+          @click="addData()"
           type="primary"
           >新增</el-button
         >
@@ -29,7 +29,7 @@
         <search>
           <div slot="content" class="searchslot">
             <template v-if="$route.params.type != 'sensitive'">
-              <span>发布时间:</span>
+              <span>提交时间:</span>
               <el-date-picker
                 v-model="search.date"
                 type="daterange"
@@ -39,21 +39,22 @@
                 end-placeholder="结束日期"
               >
               </el-date-picker>
-              <span>标题:</span>
+              <span>{{keyObj[$route.params.type]}}:</span>
               <el-input
                 class="elInput paddingmore"
-                :maxlength="50"
+                :maxlength="25"
                 show-word-limit
                 v-model="search.inputKey"
-                placeholder="请输入标题"
+                placeholder="请输入关键字"
+                @keydown.enter.native="getList"
               ></el-input>
             </template>
 
             <template v-else>
-              <span>敏感词:</span>
+              <span>{{keyObj[$route.params.type]}}:</span>
               <el-input
                 class="elInput paddingmore"
-                :maxlength="50"
+                :maxlength="25"
                 show-word-limit
                 v-model="search.inputKey"
                 @keydown.enter.native="getList"
@@ -89,10 +90,11 @@
               }
             "
             @del="del"
+            @submit="submit"
             :tableData="list"
           >
             <template slot-scope="{data}" slot="record">
-              <el-button @click="applyDetail(data,'martyr')" type="text">审核详情</el-button>
+              <el-button @click="applyDetail(data,'questionGroup')" type="text">审核详情</el-button>
             </template>
 
           </vtable>
@@ -101,6 +103,8 @@
     </div>
 
     <vdialog :show="showApplyDetail" @close="showApplyDetail=false" :tableData="alDetail"></vdialog>
+    <sensitivedialog :show="showSensitiveDetail" @close="getList(),showSensitiveDetail=false" :form="sensitiveWord"/>
+
 
   </div>
 </template>
@@ -111,11 +115,17 @@ import {raw,menu,menuStr} from "./data";
 import { getList } from "@/configue/api";
 
 import { mapGetters } from "vuex";
+import sensitivedialog from "./componets/sensitive.vue";
 
 export default {
+  components:{sensitivedialog},
   data() {
     return {
       showApplyDetail:false,
+      showSensitiveDetail:false,
+      sensitiveWord:{
+        name:''
+      },
       alDetail:{},
       search: {
         inputKey: "",
@@ -129,10 +139,27 @@ export default {
         size: 25,
         pageNum: 1,
       },
+      keyObj:{
+        'comment':'留言内容',
+        'barrage':'弹幕内容',
+        'questionGroup':'题组标题',
+        'sensitive':'敏感词',
+      }
     };
   },
   
   methods: {
+    addData(){
+      if (this.$route.params.type == 'questionGroup') {
+        this.goto({ id: 'none',status: 0 })
+      }
+      else{
+        this.showSensitiveDetail = true
+        this.sensitiveWord= {
+            name:''
+          }
+      }
+    },
     selectStatus(item) {
       this.status = item.id;
     },
@@ -193,5 +220,5 @@ export default {
   },
 };
 </script>
-tra
+
 <style lang="less" scoped></style>

+ 2 - 2
new_backstage/src/pages/content/scene/index.vue

@@ -10,7 +10,7 @@
             <span>场景名称:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               v-model="search.inputKey"
               @keydown.enter.native="getList"
@@ -97,7 +97,7 @@ export default {
           pageSize: this.page.size,
           searchKey: inputKey,
         },
-        url: `scene/list`,
+        url: `cms/scene/list`,
       }).then((res) => {
         this.list = res.data;
       });

+ 24 - 14
new_backstage/src/pages/content/study/componets/info.vue

@@ -1,28 +1,28 @@
 <template>
   <div>
-    <el-form-item label="类型:">
-      <el-radio disabled v-model="radio" label="选中且禁用">知识阅览</el-radio>
-    </el-form-item>
-
-    <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
-    </el-form-item>
+    <div :class="{disable:status!==0&&status!==2}">
+      <el-form-item label="类型:">
+        <el-radio disabled v-model="radio" label="选中且禁用">知识阅览</el-radio>
+      </el-form-item>
 
-    <el-form-item label="内容简介:" >
-      <el-input v-model="form.description"></el-input>
-    </el-form-item>
+      <el-form-item label="标题:" prop="name">
+        <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
+      </el-form-item>
 
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
+      <el-form-item label="内容简介:" prop="description">
+        <el-input v-model="form.description"  :maxlength="INPUTLENGTH*2" show-word-limit></el-input>
+      </el-form-item>
+    </div>
 
-    <el-form-item label="信息正文:">
+    <el-form-item label="信息正文:"  prop="content" class="tttttt">
       <tinymce
         ref="tinymce"
         :height="500"
         :htmlstr="form.content"
         @blur="handleBlur"
+        v-if="form.status!=3"
       />
+      <div class="showHtml" v-else v-html="form.content"></div>
     </el-form-item>
 
   </div>
@@ -35,8 +35,11 @@ export default {
   props: ["data",'rule'],
   components:{Tinymce},
   data() {
+    let {  status } = this.$route.params;
+
     return {
       form: this.data,
+      status:Number(status),
       radio: "选中且禁用"
     };
   },
@@ -47,3 +50,10 @@ export default {
   }
 };
 </script>
+
+<style lang="less" scoped>
+.tttttt{
+  word-break: break-all!important;
+}
+
+</style>

+ 2 - 7
new_backstage/src/pages/content/study/componets/share.vue

@@ -5,11 +5,11 @@
     </el-form-item>
 
     <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="内容简介:" prop="description">
-      <el-input v-model="form.description"></el-input>
+      <el-input v-model="form.description" :maxlength="INPUTLENGTH*2" show-word-limit></el-input>
     </el-form-item>
 
    
@@ -18,11 +18,6 @@
         <template slot="prepend">Http://</template>
       </el-input>
     </el-form-item>
-
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
-
   </div>
 </template>
 

+ 5 - 3
new_backstage/src/pages/content/study/data.js

@@ -92,19 +92,21 @@ let formKey = {
     name:'',
     thumb:'',
     filePath:'',
-    display: true
+    display: false
   },
   share:{ 
     name:'',
     thumb:'',
     filePath:'',
-    display: true
+    display: false
   }
 }
 
 let rules = {
   info:{
-    name: [{ required: true, message: "请输入标题", trigger: "blur" }]
+    name: [{ required: true, message: "请输入标题", trigger: "blur" }],
+    description: [{ required: true, message: "请输入内容简介", trigger: "blur" }],
+    content: [{ required: true, message: "请输入信息正文", trigger: "blur" }],
   },
   share:{ 
     name: [{ required: true, message: "请输入标题", trigger: "blur" }],

+ 1 - 1
new_backstage/src/pages/content/study/edit.vue

@@ -14,7 +14,7 @@
       @determine="determine"
     >
       <template slot-scope="{ form }" slot="content">
-        <component :data="form" :is="cp" :class="{disable:status!==0&&status!==2}" />
+        <component :data="form" :is="cp" :class="{disable:status!==0&&status!==2&&type=='share'}" />
       </template>
     </editcon>
 

+ 7 - 4
new_backstage/src/pages/content/study/index.vue

@@ -18,7 +18,7 @@
         <status :status="status" @select="selectStatus"></status>
         <search>
           <div slot="content" class="searchslot">
-            <span>发布时间:</span>
+            <span>提交时间:</span>
             <el-date-picker
               v-model="search.date"
               type="daterange"
@@ -31,13 +31,15 @@
             <span>标题:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               v-model="search.inputKey"
               @keydown.enter.native="getList"
-              placeholder="请输入标题"
+              placeholder="请输入关键字"
             ></el-input>
             <el-button @click="getList" type="primary">查询</el-button>
+            <el-button @click="search.date='',search.inputKey='',getList()" >重置</el-button>
+
           </div>
         </search>
         <div class="table">
@@ -57,6 +59,7 @@
               }
             "
             @del="del"
+            @submit="submit"
             :tableData="list"
           >
              <template slot-scope="{data}" slot="record">
@@ -96,7 +99,7 @@ export default {
       page: {
         size: 25,
         pageNum: 1,
-      },
+      }
     };
   },
   methods: {

+ 17 - 23
new_backstage/src/pages/content/sweep/componets/martyr.vue

@@ -3,33 +3,27 @@
     <div class="formtop">
       <div class="left">
         <el-form-item label="烈士姓名:" prop="realName">
-          <el-input v-model="form.realName"></el-input>
+          <el-input v-model="form.realName" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="籍贯:" prop="nativePlace">
-          <el-input v-model="form.nativePlace"></el-input>
+          <el-input v-model="form.nativePlace" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="出生日期:" prop="birthday">
-          <el-input v-model="form.birthday" class="fadeDom"></el-input>
-          <el-date-picker
-            v-model="form.birthday"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="选择日期">
-          </el-date-picker>
+          <el-input v-model="form.birthday" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="牺牲地点:" prop="diePlace">
-          <el-input v-model="form.diePlace"></el-input>
+          <el-input v-model="form.diePlace" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="所获荣誉:" prop="honor">
-          <el-input v-model="form.honor"></el-input>
+          <el-input v-model="form.honor" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="民族:" prop="nation">
-          <el-input v-model="form.nation"></el-input>
+          <el-input v-model="form.nation" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
       </div>
       <div class="right">
@@ -41,17 +35,18 @@
         </el-form-item>
 
         <el-form-item label="政治面貌:" prop="politicsStatus">
-          <el-input v-model="form.politicsStatus"></el-input>
+            <el-select v-model="form.politicsStatus" placeholder="请选择">
+              <el-option
+                v-for="(item,i) in g_political"
+                :key="i"
+                :label="item.val"
+                :value="item.val">
+              </el-option>
+            </el-select>
         </el-form-item>
 
         <el-form-item label="牺牲日期:" prop="dieDay">
-          <el-input v-model="form.dieDay" class="fadeDom"></el-input>
-          <el-date-picker
-            v-model="form.dieDay"
-            value-format="yyyy-MM-dd"
-            type="date"
-            placeholder="选择日期">
-          </el-date-picker>
+          <el-input v-model="form.dieDay" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="照片:">
@@ -77,12 +72,11 @@
           type="textarea"
           :autosize="{ minRows: 2, maxRows: 4 }"
           placeholder="请输入内容"
+          :maxlength="INPUTLENGTH*4" 
+          show-word-limit
         ></el-input>
       </el-form-item>
 
-      <el-form-item label="是否展示:">
-        <el-switch v-model="form.display"> </el-switch>
-      </el-form-item>
     </div>
   </div>
 </template>

+ 4 - 3
new_backstage/src/pages/content/sweep/componets/mourn.vue

@@ -1,20 +1,21 @@
 <template>
   <div class="disable">
     <el-form-item label="单位名称:">
-      <el-input v-model="form.unit"></el-input>
+      <el-input v-model="form.unit" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="真实姓名:">
-      <el-input v-model="form.realName"></el-input>
+      <el-input v-model="form.realName" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="致敬烈士姓名:">
-      <el-input v-model="form.martyrId"></el-input>
+      <el-input v-model="form.martyrId" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="缅怀内容:" >
       <el-input v-model="form.content"
           type="textarea"
+           :maxlength="INPUTLENGTH*4" show-word-limit
           :autosize="{ minRows: 2, maxRows: 4 }"></el-input>
     </el-form-item>
   </div>

+ 1 - 0
new_backstage/src/pages/content/sweep/data.js

@@ -11,6 +11,7 @@ let raw = {
     {
       prop: "thumb",
       label: "照片",
+      default: true
     },
     {
       prop: "visit",

+ 12 - 5
new_backstage/src/pages/content/sweep/index.vue

@@ -2,7 +2,7 @@
   <div>
     <main-top>
       <div slot='con'>
-        <el-button v-if="$route.params.type == 'martyr'" @click="goto({ id: 'none',status: 0 })" type="primary">新增</el-button>
+        <el-button v-if="$route.params.type == 'martyr'" @click="goto({ id: 'none',status: 0 })" type="primary">登记</el-button>
       </div>
     </main-top>
     <div class="tablecon flexcon" >
@@ -11,7 +11,7 @@
         <status :status="status" v-if="$route.params.type=='martyr'" @select="selectStatus"></status>
         <search>
           <div slot="content" class="searchslot">
-            <span>发布时间:</span>
+            <span>提交时间:</span>
             <el-date-picker
               v-model="search.date"
               type="daterange"
@@ -20,11 +20,13 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期">
             </el-date-picker>
-            <span>标题:</span>
-            <el-input class="elInput paddingmore" :maxlength="50"
+            <span>{{keyObj[$route.params.type]}}:</span>
+            <el-input class="elInput paddingmore" :maxlength="25"
               @keydown.enter.native="getList"
-                show-word-limit v-model="search.inputKey" placeholder="请输入标题"></el-input>
+                show-word-limit v-model="search.inputKey" placeholder="请输入关键字"></el-input>
             <el-button @click="getList" type="primary">查询</el-button>
+            <el-button @click="search.date='',search.inputKey='',getList()" >重置</el-button>
+
           </div>
         </search>
         <div class="table">
@@ -36,6 +38,7 @@
           @pagechange="data=>{page.pageNum = data}"
           @pagesizechange="data=>{page.size = data}"
           @del="del"
+          @submit="submit"
           :tableData="list">
             <template slot-scope="{data}" slot="record">
               <el-button @click="applyDetail(data,'martyr')" type="text">审核详情</el-button>
@@ -73,6 +76,10 @@ export default {
       page:{
         size:25,
         pageNum:1
+      },
+      keyObj:{
+        'martyr':'烈士姓名',
+        'mourn':'缅怀内容'
       }
     }
   },

+ 7 - 2
new_backstage/src/pages/layout/head.vue

@@ -3,14 +3,14 @@
 <div class='header card'>
   <div class="header-title">
     <img src="@/assets/img/logo.png" alt="">
-    <span>新疆生产建设兵团总队</span>
+    <span>中国人民武装警察部队新疆生产建设兵团总部</span>
   </div>
   <div class="header-user">
     <div class="avatars" @click="isShowEdit=true,ran=Math.random()">
       <img v-if="userInfo.img" :src="userInfo.img" alt="">
       <span>{{userInfo.nickName}}</span>
     </div>
-    <div @click="logout" class="logout"><img src="@/assets/img/logout.png" alt="">退出</div>
+    <div @click="logoutcomfirm" class="logout"><img src="@/assets/img/logout.png" alt="">退出</div>
   </div>
 
   <usereditdialog :key="ran" @logout="logout(true)" :form="userInfo" :show="isShowEdit" @close="isShowEdit=false"/>
@@ -34,6 +34,11 @@ export default {
   },
   watch: {},
   methods: {
+    logoutcomfirm(){
+      this.confirm('确定退出登录?',()=>{
+        this.logout()
+      })
+    },
     getDetail(){
       getSysDetail('user',{id:this.userId},res=>{
           this.userInfo = {...res.data}

+ 6 - 3
new_backstage/src/pages/login/index.vue

@@ -4,13 +4,13 @@
   <div class="layout-con">
     <div class="logo">
       <img :src="require('@/assets/img/logo.png')" alt="">
-      <span>新疆生产建设兵团总队</span>
+      <span>中国人民武装警察部队新疆生产建设兵团总部</span>
     </div>
     <img class="bg" :src="require('@/assets/img/bg.jpg')" alt="">
     <div class="mask"></div>
     <div class="middle">
       <div class="middle-left">
-        <div>新疆生产建设兵团总队<br/>管理后台</div>
+        <div>中国人民武装警察部队新疆生产建设兵团总部<br/>管理后台</div>
       </div>
       <div class="middle-right">
         <el-form class="middle-form" :rules="ruleLogin" status-icon :model="formLogin" ref="formLogin">
@@ -32,6 +32,9 @@
 </template>
 
 <script>
+import { encodeStr } from '@/util'
+import { Base64 } from 'js-base64'
+
 export default {
   components: {},
   data () {
@@ -80,7 +83,7 @@ export default {
       this.$refs[formName].validate((valid) => {
         let data = {
           userName: this.formLogin.username,
-          password: this.formLogin.password,
+          password: encodeStr(Base64.encode(this.formLogin.password)),
           from:'cms'
         }
         if (valid) {

+ 39 - 32
new_backstage/src/pages/system/role/componets/manage.vue

@@ -1,60 +1,67 @@
 <template>
   <div>
-   <el-form-item label="权限管理:" >
-     <input class="fadeDom" v-model="form.permission"/>
-      <el-tree show-checkbox
-        :default-expand-all='true'
+    <el-form-item label="权限管理:">
+      <input class="fadeDom" v-model="form.permission" />
+      <el-tree
+        show-checkbox
+        :default-expand-all="true"
         :default-checked-keys="form.resources"
         node-key="id"
         @check="handleCheck"
-        @check-change="handleCheckChange" :data="form.permission" :props="defaultProps" @node-click="handleNodeClick">
+        @check-change="handleCheckChange"
+        :data="form.permission"
+        :props="defaultProps"
+        @node-click="handleNodeClick"
+      >
       </el-tree>
-  </el-form-item>
-
+    </el-form-item>
   </div>
 </template>
 
 <script>
-
 export default {
-  props: ["data",'rule'],
+  props: ["data", "rule"],
   data() {
-
-    let tmp = []
-    this.data.permission.forEach(item => {
-      item.children&&item.children.forEach(sub=>{
-        sub.children&&sub.children.forEach(son=>{
-          if(son.authority){
-            tmp.push(son.id)
+    let tmp = [];
+    this.data.permission.forEach((item) => {
+      item.children &&
+        item.children.forEach((sub) => {
+          if (sub.children) {
+            sub.children.forEach((son) => {
+              if (son.authority) {
+                tmp.push(son.id);
+              }
+            });
+          } else {
+            if (sub.authority) {
+              tmp.push(sub.id);
+            }
           }
-        })
-      })
+        });
     });
 
-    this.data.resources = tmp
+    this.data.resources = tmp;
+
+    console.log(this.data.resources);
 
     return {
       form: this.data,
       defaultProps: {
-        children: 'children',
-        label: 'name'
-      }
+        children: "children",
+        label: "name",
+      },
     };
   },
-  methods:{
-    handleCheckChange(){
+  methods: {
+    handleCheckChange() {
       // console.log(data,data1,data2);
       // this.form.content = data
     },
-    handleNodeClick(){
-
-    },
-    handleCheck(data,data1){
-      this.form.resources = data1.checkedKeys
+    handleNodeClick() {},
+    handleCheck(data, data1) {
+      this.form.resources = data1.checkedKeys;
     },
-    
   },
-  mounted(){
-  }
+  mounted() {},
 };
 </script>

+ 1 - 5
new_backstage/src/pages/system/role/componets/share.vue

@@ -5,7 +5,7 @@
     </el-form-item>
 
     <el-form-item label="标题:" prop="name">
-      <el-input v-model="form.name"></el-input>
+      <el-input v-model="form.name" :maxlength="INPUTLENGTH" show-word-limit></el-input>
     </el-form-item>
 
     <el-form-item label="内容简介:" prop="description">
@@ -19,10 +19,6 @@
       </el-input>
     </el-form-item>
 
-    <el-form-item label="是否展示:">
-      <el-switch v-model="form.display"> </el-switch>
-    </el-form-item>
-
   </div>
 </template>
 

+ 2 - 1
new_backstage/src/pages/system/role/data.js

@@ -11,13 +11,14 @@ let raw = {
     {
       prop: "count",
       label: "成员数量",
+      canEdit: true
     },
     {
       prop: "createTime",
       label: "添加时间",
     },
     {
-      prop: "isDisable",
+      prop: "isEnabled",
       label: "是否启用"
     },
   ]

+ 2 - 1
new_backstage/src/pages/system/role/edit/dialog.vue

@@ -6,7 +6,7 @@
         :label-width="formLabelWidth"
         prop="roleName"
       >
-        <el-input placeholder="请输入角色名称" v-model="form.roleName">
+        <el-input placeholder="请输入角色名称" v-model="form.roleName" :maxlength="INPUTLENGTH" show-word-limit>
         </el-input>
       </el-form-item>
       <el-form-item
@@ -18,6 +18,7 @@
           type="textarea"
           :autosize="{ minRows: 2, maxRows: 4 }"
           placeholder="请输入职能描述"
+          :maxlength="INPUTLENGTH*2" show-word-limit
           v-model="form.roleDesc"
         >
         </el-input>

+ 13 - 5
new_backstage/src/pages/system/role/index.vue

@@ -14,13 +14,15 @@
             <span>角色名称:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               @keydown.enter.native="getList"
               v-model="search.inputKey"
               placeholder="请输入角色名称"
             ></el-input>
             <el-button @click="getList" type="primary">查询</el-button>
+            <el-button @click="search.inputKey='',getList()" >重置</el-button>
+
           </div>
         </search>
         <div class="table">
@@ -40,6 +42,9 @@
             "
             :tableData="list"
           >
+            <template slot-scope="{data}" slot="count">
+              <el-button @click="gtoUser(data)" type="text">{{data.count}}</el-button>
+            </template>
             <template slot-data="data" slot="record">
               <el-button type="text">审核详情</el-button>
             </template>
@@ -66,7 +71,7 @@
 import vdialog from "./edit/dialog.vue";
 
 import { raw } from "./data";
-import { getSysList, delSys } from "@/configue/api";
+import { getSysList, delSysSingle } from "@/configue/api";
 
 import { mapGetters } from "vuex";
 
@@ -93,7 +98,7 @@ export default {
   methods: {
     handleDialogClose(data){
       this.showRoleDetail = false
-      data&&this.getSysList()
+      data&&this.getList()
     },
     gotoEdit(item) {
       let { type } = this.$route.params;
@@ -102,9 +107,9 @@ export default {
         params: { id: item.id, type: type },
       });
     },
-    del(item) {
+    delSys(item) {
       this.confirm("删除后,信息将无法恢复,是否继续?", () => {
-        delSys(
+        delSysSingle(
           "role",
           {
             id: item.id,
@@ -138,6 +143,9 @@ export default {
     openDilog(item=null){
       this.showRoleDetail = true,
       this.currentForm = item?item:{}
+    },
+    gtoUser(item){
+      this.$router.push({path:'/user/manage',query:{roleId:item.id}})
     }
   },
   computed: {

+ 9 - 9
new_backstage/src/pages/system/user/componets/manage.vue

@@ -2,24 +2,24 @@
   <div class="formcon">
     <div class="formtop">
       <div class="left">
-        <el-form-item label="用户身份码:" prop="userName">
-          <el-input :disabled="id!='none'" v-model="form.userName"></el-input>
+        <el-form-item label="身份码:" prop="userName">
+          <el-input :disabled="id!='none'" :maxlength="INPUTLENGTH" show-word-limit v-model="form.userName"></el-input>
         </el-form-item>
 
         <el-form-item label="用户昵称:" prop="nickName">
-          <el-input v-model="form.nickName"></el-input>
+          <el-input v-model="form.nickName" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="单位名称:" prop="unit">
-          <el-input v-model="form.unit"></el-input>
+          <el-input v-model="form.unit" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="联系电话:" prop="phone">
-          <el-input v-model="form.phone"></el-input>
+          <el-input maxlength="11" show-word-limit v-model.number="form.phone"></el-input>
         </el-form-item>
 
-        <el-form-item label="是否启用:">
-          <el-switch v-model="form.isDisable"> </el-switch>
+        <el-form-item label="是否启用:" v-if="form.roleKey!='sys_admin'">
+          <el-switch v-model="form.isEnabled" > </el-switch>
         </el-form-item>
       </div>
       <div class="right">
@@ -36,11 +36,11 @@
         </el-form-item>
 
         <el-form-item label="真实姓名:" prop="realName">
-          <el-input v-model="form.realName"></el-input>
+          <el-input v-model="form.realName" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="通讯地址:" prop="address">
-          <el-input v-model="form.address"></el-input>
+          <el-input v-model="form.address" :maxlength="INPUTLENGTH" show-word-limit></el-input>
         </el-form-item>
 
         <el-form-item label="性别:" prop="sex">

+ 6 - 2
new_backstage/src/pages/system/user/data.js

@@ -13,6 +13,10 @@ let raw = {
       label: "用户昵称",
     },
     {
+      prop: "roleName",
+      label: "用户角色",
+    },
+    {
       prop: "realName",
       label: "真实姓名",
     },
@@ -37,7 +41,7 @@ let raw = {
       label: "注册时间",
     },
     {
-      prop: "isDisable",
+      prop: "isEnabled",
       label: "启用状态"
     },
   ]
@@ -61,7 +65,7 @@ let formKey = {
 
 let rules = {
   manage:{
-    userName: [{ required: true, message: "请输入用户身份码", trigger: "blur" }],
+    userName: [{ required: true, message: "请输入身份码", trigger: "blur" }],
     nickName: [{ required: true, message: "请输入用户昵称", trigger: "blur" }],
     unit: [{ required: true, message: "请输入单位名称", trigger: "blur" }],
     roleId: [{ required: true, message: "请选择用户角色", trigger: "change" }],

+ 6 - 11
new_backstage/src/pages/system/user/edit.vue

@@ -21,7 +21,7 @@
 import vmanage from "./componets/manage";
 
 import { formKey, rules } from "./data";
-import {saveSys,getSysList,getSysDetail} from "@/configue/api";
+import {saveSys,getRoleList,getSysDetail} from "@/configue/api";
 
 export default {
   components: {
@@ -95,10 +95,10 @@ export default {
           "userName": "",
           "id": this.id=='none'?null :this.id,
           ...this.form,
-          isDisable:Number(this.form.isDisable)
+          isEnabled:Number(this.form.isEnabled)
         }
         saveSys(this.val,params,()=>{
-          this.$alert('编辑成功', '提示', {
+          this.$alert('编辑成功(默认密码123456)', '提示', {
               confirmButtonText: '确定',
               callback: () => {
                 this.backList()
@@ -109,14 +109,9 @@ export default {
     },
 
     getRoleList() {
-      getSysList(
-        "role",
-        {
-          pageNum: 0,
-          pageSize: 10000,
-        },
+      getRoleList(
         (data) => {
-          this.roleList = data.data.list;
+          this.roleList = data.data;
         }
       );
     },
@@ -126,7 +121,7 @@ export default {
         this.form = this.cloneObject(formKey[this.$route.params.type])
       } else{
         await getSysDetail(this.val,{id:this.id},res=>{
-          this.form = {...this.form,...res.data}
+          this.form = {...this.form,...res.data,isEnabled:Boolean(res.data.isEnabled)}
         })
       }
 

+ 39 - 5
new_backstage/src/pages/system/user/index.vue

@@ -11,7 +11,7 @@
       <div class="tablebody">
         <search>
           <div slot="content" class="searchslot">
-            <span>发布时间:</span>
+            <span>提交时间:</span>
             <el-date-picker
               v-model="search.date"
               type="daterange"
@@ -24,13 +24,25 @@
             <span>标题:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               @keydown.enter.native="getList"
               v-model="search.inputKey"
-              placeholder="请输入场景名称"
+              placeholder="请输入真实姓名"
             ></el-input>
+
+            <span>用户角色:</span>
+            <el-select v-model="search.roleId" placeholder="请选择">
+              <el-option label="全部"  value="" key=""></el-option>
+              <el-option
+                v-for="item in rolelist"
+                :key="item.roleName"
+                :label="item.roleName"
+                :value="item.id">
+              </el-option>
+            </el-select>
             <el-button @click="getList" type="primary">查询</el-button>
+            <el-button @click="search.date='',search.roleId='',search.inputKey='',getList()" >重置</el-button>
           </div>
         </search>
         <div class="table">
@@ -76,6 +88,7 @@ export default {
         inputKey: "",
         date: "",
         state: "",
+        roleId:''
       },
       type:'user',
       list: {},
@@ -83,6 +96,7 @@ export default {
         size: 25,
         pageNum: 1,
       },
+      rolelist:[]
     };
   },
   methods: {
@@ -114,14 +128,27 @@ export default {
         }}
       )
     },
+    getRoleList() {
+      getSysList(
+        "role",
+        {
+          pageNum: 1,
+          pageSize: 1000,
+        },
+        (data) => {
+          this.rolelist = data.data.list;
+        }
+      );
+    },
     getList() {
-      let { inputKey } = this.search;
+      let { inputKey,roleId } = this.search;
       getSysList(
         this.type,
         {
           pageNum: this.page.pageNum,
           pageSize: this.page.size,
-          searchKey: inputKey
+          searchKey: inputKey,
+          roleId
         },
         (data) => {
           this.list = data.data;
@@ -144,8 +171,15 @@ export default {
         this.getList();
       },
     },
+    '$route.query.roleId':{
+      immediate:true,
+      handler: function (newVal) {
+        newVal && (this.search.roleId = Number(newVal))
+      }
+    }
   },
   mounted() {
+    this.getRoleList()
     this.getList();
   },
 };

+ 1 - 1
new_backstage/src/pages/system/worklog/index.vue

@@ -20,7 +20,7 @@
             <span>操作人员:</span>
             <el-input
               class="elInput paddingmore"
-              :maxlength="50"
+              :maxlength="25"
               show-word-limit
               @keydown.enter.native="getList"
               v-model="search.inputKey"

+ 154 - 0
new_backstage/src/util/file.js

@@ -0,0 +1,154 @@
+// 媒体名称
+export const mediaTypes = {
+    "image": '图片',
+    "video": "视频",
+    "audio": "音频"
+}
+
+// 媒体扩展类型
+export const mediaMimes = {
+    "image": ["jpg", "png", "jpeg", "bmp", "gif"],
+    "audio": ["mp3", "aac", "ogg", "wav" /* , "m4a" */],
+    "video": ["mp4", "mov", "quicktime" /* ,"webm", "rmvb", "wmv" */] //ios:mov
+}
+
+// 媒体大小显示(MB)
+export const mediaMaxSize = {
+    "image": 10,
+    "video": 20,
+    "audio": 5
+}
+
+/**
+ * 获取媒体扩展类型
+ * @param {Stirng} filename 文件名称
+ */
+export const getMime = filename => {
+    if (!filename || filename.indexOf('.') === -1) {
+        return ''
+    }
+
+    return filename.split('.').pop().toLowerCase()
+}
+
+/**
+ * 在路径中获取文件名
+ * @param {*} path 
+ */
+export const getFilename = path => {
+    const segment = (path || '').split('/')
+    return segment[segment.length - 1]
+}
+
+
+
+/**
+ * 检测媒体文件是否超过预设限制
+ * @param {String} type 媒体类型
+ * @param {Number} size 文件大小
+ */
+export const checkSizeLimit = (type, size) => {
+
+    size = size / 1024 / 1024
+
+    return size <= mediaMaxSize[type]
+}
+
+export const checkSizeLimitFree = (size, limit) => {
+
+    size = size / 1024 / 1024
+
+    return size <= limit
+}
+
+/**
+ * 检测媒体类型
+ * @param {String} type 媒体类型
+ * @param {String} filename 文件名称
+ */
+export const checkMediaMime = (type, filename) => {
+    const mime = getMime(filename)
+    const find = mediaMimes[type]
+    if (!find) {
+        return false
+    }
+
+    return find.indexOf(mime) !== -1
+}
+
+export const base64ToBlob = base64 => {
+    let arr = base64.split(','),
+        mime = arr[0].match(/:(.*?);/)[1],
+        bstr = atob(arr[1]),
+        n = bstr.length,
+        u8arr = new Uint8Array(n);
+    while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+    }
+    return new Blob([u8arr], { type: mime });
+}
+
+export const base64ToDataURL = base64 => {
+    return window.URL.createObjectURL(base64ToBlob(base64));
+}
+
+export const blobToBase64 = function (blob) {
+    return new Promise(resolve => {
+        var reader = new FileReader();
+        reader.onload = function () {
+            resolve(reader.result);
+        };
+        reader.readAsDataURL(blob);
+    })
+};
+
+/**
+ * 获取图片文件尺寸
+ * @param {*} file 
+ */
+export const getImgWH = (data) => {
+    let file = data.file
+
+    return new Promise((resolve) => {
+        var reader = new FileReader();
+        //读取图片文件
+        reader.readAsDataURL(file);
+        reader.onload = function (e) {
+            //初始化JavaScript图片对象
+            var image = new Image();
+            //FileReader获得Base64字符串
+            image.src = e.target.result;
+            image.onload = function () {
+                //获得图片高宽
+                var height = this.height;
+                var width = this.width;
+                resolve({
+                    WH: {
+                        height,
+                        width
+                    },
+                    list:data.list,
+                    file
+                })
+            };
+        }
+    })
+
+
+}
+
+
+/**
+ * 转化字节单位
+ * @param {*} file 
+ */
+export const changeByteUnit = (x) => {
+    const units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+    let l = 0, n = parseInt(x, 10) || 0;
+
+    while (n >= 1024 && ++l) {
+        n = n / 1024;
+    }
+    return (n.toFixed(n < 10 && l > 0 ? 2 : 0) + units[l]);
+
+}

+ 17 - 21
new_backstage/src/util/index.js

@@ -176,27 +176,6 @@ module.exports = {
     );
   },
 
-  encodeStr: function(str, strv = "") {
-    const NUM = 2;
-    const front = randomWord(false, 8);
-    const middle = randomWord(false, 8);
-    const end = randomWord(false, 8);
-
-    let str1 = str.substring(0, NUM);
-    let str2 = str.substring(NUM);
-
-    if (strv) {
-      let strv1 = strv.substring(0, NUM);
-      let strv2 = strv.substring(NUM);
-      return [
-        front + str2 + middle + str1 + end,
-        front + strv2 + middle + strv1 + end,
-      ];
-    }
-
-    return front + str2 + middle + str1 + end;
-  },
-
   isImage: function(fileName) {
     if (typeof fileName !== "string") return;
     let name = fileName.toLowerCase();
@@ -247,5 +226,22 @@ module.exports = {
   },
   isNull(arg1) {
     return !arg1 && arg1 !== 0 && typeof arg1 !== "boolean" ? true : false;
+  },
+  encodeStr: function (str, strv = '') {
+    const NUM = 2
+    const front = randomWord(false, 8)
+    const middle = randomWord(false, 8)
+    const end = randomWord(false, 8)
+
+    let str1 = str.substring(0, NUM)
+    let str2 = str.substring(NUM)
+
+    if (strv) {
+      let strv1 = strv.substring(0, NUM)
+      let strv2 = strv.substring(NUM)
+      return [front + str2 + middle + str1 + end, front + strv2 + middle + strv1 + end]
+    }
+
+    return front + str2 + middle + str1 + end
   }
 };

+ 7 - 2
web/.eslintrc.js

@@ -11,7 +11,12 @@ module.exports = {
     parser: 'babel-eslint'
   },
   rules: {
-    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
-    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+    'no-console': process.env.NODE_ENV === 'production' ? 'off' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'off' : 'off',
+    'no-undef': 'off',
+    'vue/no-unused-vars': 'off',
+    'vue/require-v-for-key': 'off',
+    'no-unused-vars': 'off',
+    'vue/no-unused-components': 'off'
   }
 }

+ 5 - 2
web/package.json

@@ -10,10 +10,13 @@
   "dependencies": {
     "axios": "^0.19.2",
     "core-js": "^3.6.5",
-    "swiper": "^6.1.1",
+    "js-base64": "^3.6.1",
     "vue": "^2.6.11",
-    "vue-awesome-swiper": "^4.1.1",
+    "vue-chat-scroll": "^1.4.0",
     "vue-router": "^3.2.0",
+    "swiper": "^5.3.8",
+    "v-viewer": "^1.6.4",
+    "vue-awesome-swiper": "^4.1.1",
     "vuex": "^3.5.1"
   },
   "devDependencies": {

+ 2 - 2
web/public/index.html

@@ -24,8 +24,8 @@
     <script src="<%= VUE_APP_STATIC_DIR %>/js/myShow.js"></script>
     <script src="<%= VUE_APP_STATIC_DIR %>/js/overlay.js"></script>
     <script src="<%= VUE_APP_STATIC_DIR %>/js/main_2020_show.js"></script>
-    <script src="<%= VUE_APP_STATIC_DIR %>/js/CAD/bundle.js"></script>
-    <script src="<%= VUE_APP_STATIC_DIR %>/js/CAD/loadCAD.js"></script>
+    <!-- <script src="<%= VUE_APP_STATIC_DIR %>/js/CAD/bundle.js"></script>
+    <script src="<%= VUE_APP_STATIC_DIR %>/js/CAD/loadCAD.js"></script> -->
     <div id="app"></div>
   </body>
 </html>

+ 11 - 9
web/public/static/js/main_2020_show.js

@@ -1,3 +1,5 @@
+window.hadLoad = false
+
 window.loadMainJs = ()=>{
     /* 许钟文修改的  标记 xzw    
     另外 	所有"matter"字样已被我删除				原因:删除matterport信息
@@ -3389,8 +3391,8 @@ window.loadMainJs = ()=>{
                 e.addEventListener("pointerup", this.onPointerUp.bind(this)),
                 e.addEventListener("pointerout", this.onPointerCancel.bind(this)),
                 e.addEventListener("pointercancel", this.onPointerCancel.bind(this)),
-                document.addEventListener("keydown", this.onKeyDown.bind(this)),
-                document.addEventListener("keyup", this.onKeyUp.bind(this)),
+                !window.hadLoad&&document.addEventListener("keydown", this.onKeyDown.bind(this)),
+                !window.hadLoad&&document.addEventListener("keyup", this.onKeyUp.bind(this)),
                 t.on(d.ActiveModelChanged, function(e) {
                     this.setModelForControls(e.model)
                 }
@@ -6889,7 +6891,7 @@ window.loadMainJs = ()=>{
                     var i = Q.pageTitle;
                     // 2 !== K.valueFromHash("mls", 0) && (i = e.name + " - " + i),
                     2 !== K.valueFromHash("mls", 0) && e.name && (i = e.name),
-                    document.title = i ,
+                    // document.title = i ,
                     K.isMobile() ? $("#gui-fullscreen").css("display", "none") : ($("[rel=tooltip]").tooltip({
                         delay: {
                             show: 50,
@@ -7051,7 +7053,7 @@ window.loadMainJs = ()=>{
                                 a.removeClass("active recent");
                         o(t, i)
                     }),
-                    document.addEventListener("keydown", function(n) {
+                    !window.hadLoad&&document.addEventListener("keydown", function(n) {
                         switch (J.updateInteraction(Se.InteractionKey),
                         n.which) {
                         case we.ZERO:
@@ -7108,7 +7110,7 @@ window.loadMainJs = ()=>{
                         !0
                     }
                     .bind(this)),
-                    document.addEventListener("keyup", function(e) {
+                    !window.hadLoad&&document.addEventListener("keyup", function(e) {
                         switch (e.which) {
                         case we.PLUSEQUALS:
                             t.player.deactivatePersistentZooming();
@@ -9008,7 +9010,7 @@ window.loadMainJs = ()=>{
                     }),
                     $("#drawer img").on(e, a)
                 }),
-                document.addEventListener("keydown", u.bind(this, !1), !0),
+                !window.hadLoad&&document.addEventListener("keydown", u.bind(this, !1), !0),
                 C.on(v.TourStart, function() {
                     E.classList.add("playing")
                 })
@@ -22108,13 +22110,13 @@ window.loadMainJs = ()=>{
                     e.addEventListener("pointerup", this.onPointerUp.bind(this)),
                     e.addEventListener("pointerout", this.onPointerOut.bind(this)),
                     e.addEventListener("pointercancel", this.onPointerCancel.bind(this)),
-                    document.addEventListener("keydown", this.onKeyDown.bind(this)),
+                    (!window.hadLoad&&document.addEventListener("keydown", this.onKeyDown.bind(this))),
                     this.cameraControls.on(_.Move, this.handleControlMove.bind(this)),
                     this.cameraControls.on(_.InputStart, this.handleControlInputStart.bind(this)),
                     this.cameraControls.on(_.Pinch, this.handleControlPinch.bind(this)),
                     this.cameraControls.on(_.Scroll, this.handleControlScroll.bind(this)),
-                    window.addEventListener("snapshotBegin", this.getWrapShot.bind(this)),//xzw add
-                    window.addEventListener("tourAudioEnded", this.changeMusic.bind(this));//xzw add
+                    (!window.hadLoad&&window.addEventListener("snapshotBegin", this.getWrapShot.bind(this))),//xzw add
+                    (!window.hadLoad&&window.addEventListener("tourAudioEnded", this.changeMusic.bind(this)));//xzw add
                     
                     // lzb
                     window.getSeft && getSeft(this);

+ 6 - 8
web/public/static/js/manage.js

@@ -114,13 +114,9 @@ Manage.prototype.loadAudio = function() {
   g_bgAudio.oncanplay = () => {
     this.switchBgmState(true);
   };
-  document.addEventListener(
-    "WeixinJSBridgeReady",
-    () => {
-      this.switchBgmState(true);
-    },
-    false
-  );
+
+  document.removeEventListener("WeixinJSBridgeReady", play);
+  document.addEventListener("WeixinJSBridgeReady",play);
 
   document.addEventListener("touchstart", play); //ios需要加个事件才能播放 不能自动播放;如果还有浏览器不行,换成别的交互事件
   document.addEventListener("click", play);
@@ -221,5 +217,7 @@ function randomTime() {
 }
 
 window.loadMange = () => {
-  window.manage = new Manage();
+  if (!window.manage) {
+    window.manage =  new Manage();
+  }
 };

+ 16 - 11
web/src/App.vue

@@ -39,17 +39,20 @@ export default {
       document.getElementById('app').className = 'theme2'
     }
   },
-  watch:{
-    '$route.name':{
-      deep:true,
-        handler:function (newVal) {
-          if (newVal != 'scene') {
-            window.player&&window.player.sceneRenderer.suspend()
-            window.player = ''
-          }
-        }
-    }
-  },
+  // watch:{
+  //   '$route.name':{
+  //       deep:true,
+  //       handler:function (newVal) {
+  //         if (newVal != 'scene') {
+  //           if (window.player) {
+  //             window.player.sceneRenderer.suspend()
+  //             window.player.removeAllListeners()
+  //             window.player = ''
+  //           }
+  //         }
+  //       }
+  //   }
+  // },
   mounted(){
     this.tips = whatBrowser()
     if(broswer.trident){
@@ -82,6 +85,8 @@ export default {
 #app {
   text-align: center;
   color: #2c3e50;
+  width: 100%;
+  height: 100%;
 }
 
 .banbentips{

BIN
web/src/assets/images/btnlist/bgm.png


BIN
web/src/assets/images/btnlist/comment.png


BIN
web/src/assets/images/btnlist/game.png


BIN
web/src/assets/images/btnlist/like.png


BIN
web/src/assets/images/btnlist/question.png


BIN
web/src/assets/images/btnlist/新疆军史管-78.png


BIN
web/src/assets/images/btnlist/新疆军史管-79.png


BIN
web/src/assets/images/btnlist/新疆军史管-80.png


BIN
web/src/assets/images/btnlist/新疆军史管-82.png


BIN
web/src/assets/images/btnlist/新疆军史管-83.png


BIN
web/src/assets/images/btnlist/新疆军史管-84.png


BIN
web/src/assets/images/btnlist/新疆军史管-86.png


BIN
web/src/assets/images/btnlist/新疆军史管-87.png


BIN
web/src/assets/images/btnlist/新疆军史管-88.png


BIN
web/src/assets/images/btnlist/新疆军史管-90.png


BIN
web/src/assets/images/btnlist/新疆军史管-91.png


BIN
web/src/assets/images/btnlist/新疆军史管-92.png


BIN
web/src/assets/images/btnlist/新疆军史管-94.png


BIN
web/src/assets/images/btnlist/新疆军史管-95.png


BIN
web/src/assets/images/btnlist/新疆军史管-96.png


BIN
web/src/assets/images/crosshair.cur


BIN
web/src/assets/images/icon/iPhone 12、12 Pro – 1_slices/3D模型模式按钮@2x.png


+ 0 - 0
web/src/assets/images/icon/iPhone 12、12 Pro – 1_slices/3D模型模式按钮(选择)@2x.png


Некоторые файлы не были показаны из-за большого количества измененных файлов