Browse Source

我的项目

old
wangqing 5 years ago
parent
commit
e54a6dcea6
  1. 83
      src/assets/styles/btn.scss
  2. 75
      src/assets/styles/element-ui.scss
  3. 30
      src/assets/styles/element-variables.scss
  4. 7
      src/assets/styles/example.scss
  5. 0
      src/assets/styles/form/home.scss
  6. 138
      src/assets/styles/form/index.scss
  7. 32
      src/assets/styles/form/mixin.scss
  8. 217
      src/assets/styles/index.scss
  9. 85
      src/assets/styles/mixin.scss
  10. 191
      src/assets/styles/sidebar.scss
  11. 42
      src/assets/styles/transition.scss
  12. 35
      src/assets/styles/variables.scss
  13. 2
      src/main.js
  14. 2
      src/views/form/PreView1.vue
  15. 6
      src/views/form/ProjectForm.vue
  16. 2
      src/views/form/RightPanel.vue
  17. 38
      src/views/form/editor.vue
  18. 11
      src/views/form/index.vue
  19. 25
      src/views/form/publish.vue
  20. 11
      src/views/form/setting.vue
  21. 13
      src/views/form/statistics.vue
  22. 10
      src/views/form/theme.vue
  23. 39
      src/views/form/write.vue
  24. 1
      src/views/official/introduction.vue
  25. 177
      src/views/project/MyProject.vue

83
src/assets/styles/btn.scss

@ -0,0 +1,83 @@
@import './variables.scss';
@mixin colorBtn($color) {
background: $color;
&:hover {
color: $color;
&::before,
&::after {
background: $color;
}
}
}
.blue-btn {
@include colorBtn($blue);
}
.light-blue-btn {
@include colorBtn($light-blue);
}
.red-btn {
@include colorBtn($red);
}
.pink-btn {
@include colorBtn($pink);
}
.green-btn {
@include colorBtn($green);
}
.tiffany-btn {
@include colorBtn($tiffany);
}
.yellow-btn {
@include colorBtn($yellow);
}
.pan-btn {
font-size: 14px;
color: #fff;
padding: 14px 36px;
border-radius: 8px;
border: none;
outline: none;
transition: 600ms ease all;
position: relative;
display: inline-block;
&:hover {
background: #fff;
&::before,
&::after {
width: 100%;
transition: 600ms ease all;
}
}
&::before,
&::after {
content: '';
position: absolute;
top: 0;
right: 0;
height: 2px;
width: 0;
transition: 400ms ease all;
}
&::after {
right: inherit;
top: inherit;
left: 0;
bottom: 0;
}
}
.custom-button {
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
color: #fff;
-webkit-appearance: none;
text-align: center;
box-sizing: border-box;
outline: 0;
margin: 0;
padding: 10px 15px;
font-size: 14px;
border-radius: 4px;
}

75
src/assets/styles/element-ui.scss

@ -0,0 +1,75 @@
// cover some element-ui styles
.el-breadcrumb__inner,
.el-breadcrumb__inner a {
font-weight: 400 !important;
}
.el-upload {
input[type="file"] {
display: none !important;
}
}
.el-upload__input {
display: none;
}
.cell {
.el-tag {
margin-right: 0;
}
}
.small-padding {
.cell {
padding-left: 5px;
padding-right: 5px;
}
}
.fixed-width {
.el-button--mini {
padding: 7px 10px;
min-width: 60px;
}
}
.status-col {
.cell {
padding: 0 10px;
text-align: center;
.el-tag {
margin-right: 0;
}
}
}
// to fixed https://github.com/ElemeFE/element/issues/2461
.el-dialog {
transform: none;
left: 0;
position: relative;
margin: 0 auto;
}
// refine element ui upload
.upload-container {
.el-upload {
width: 100%;
.el-upload-dragger {
width: 100%;
height: 200px;
}
}
}
// dropdown
.el-dropdown-menu {
a {
display: block;
}
}
// fix date-picker ui bug in filter-item
.el-range-editor.el-input__inner {
display: inline-flex !important;
}
// to fix el-date-picker css style
.el-range-separator {
box-sizing: content-box;
}

30
src/assets/styles/element-variables.scss

@ -0,0 +1,30 @@
/**
* I think element-ui's default theme color is too light for long-term use.
* So I modified the default color and you can modify it to your liking.
**/
/* theme color */
$--color-primary: #1890ff;
$--color-success: #13ce66;
$--color-warning: #ffba00;
$--color-danger: #ff4949;
// $--color-info: #1E1E1E;
$--button-font-weight: 400;
// $--color-text-regular: #1f2d3d;
$--border-color-light: #dfe4ed;
$--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec;
/* icon font path, required */
$--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "~element-ui/packages/theme-chalk/src/index";
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
theme: $--color-primary;
}

7
src/assets/styles/example.scss

@ -1,7 +0,0 @@
// 改目录下可存放第三方样式文件或者公用样式
// 该例子可在 view/example/sprite.vue 里查看
.sprites {
div {
border: 1px solid #000;
}
}

0
src/assets/styles/home.scss → src/assets/styles/form/home.scss

138
src/assets/styles/form/index.scss

@ -0,0 +1,138 @@
$editorTabsborderColor: #121315;
body,
html {
margin: 0;
padding: 0;
background: #fff;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;
}
input,
textarea {
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;
}
.editor-tabs {
background: $editorTabsborderColor;
.el-tabs__header {
margin: 0;
border-bottom-color: $editorTabsborderColor;
.el-tabs__nav {
border-color: $editorTabsborderColor;
}
}
.el-tabs__item {
height: 32px;
line-height: 32px;
color: #888a8e;
border-left: 1px solid $editorTabsborderColor !important;
background: #363636;
margin-right: 5px;
user-select: none;
}
.el-tabs__item.is-active {
background: #1e1e1e;
border-bottom-color: #1e1e1e !important;
color: #fff;
}
.el-icon-edit {
color: #f1fa8c;
}
.el-icon-document {
color: #a95812;
}
:focus.is-active.is-focus:not(:active) {
box-shadow: none;
border-radius: 0;
}
}
// home
.right-scrollbar {
.el-scrollbar__view {
padding: 12px 18px 15px 15px;
}
}
.el-scrollbar__wrap {
box-sizing: border-box;
overflow-x: hidden !important;
margin-bottom: 0 !important;
}
.center-tabs {
.el-tabs__header {
margin-bottom: 0 !important;
}
.el-tabs__item {
width: 50%;
text-align: center;
}
.el-tabs__nav {
width: 100%;
}
}
.reg-item {
padding: 12px 6px;
background: #f8f8f8;
position: relative;
border-radius: 4px;
.close-btn {
position: absolute;
right: -6px;
top: -6px;
display: block;
width: 16px;
height: 16px;
line-height: 16px;
background: rgba(0, 0, 0, 0.2);
border-radius: 50%;
color: #fff;
text-align: center;
z-index: 1;
cursor: pointer;
font-size: 12px;
&:hover {
background: rgba(210, 23, 23, 0.5);
}
}
& + .reg-item {
margin-top: 18px;
}
}
.action-bar {
& .el-button + .el-button {
margin-left: 15px;
}
& i {
font-size: 20px;
vertical-align: middle;
position: relative;
top: -1px;
}
}
.custom-tree-node {
width: 100%;
font-size: 14px;
.node-operation {
float: right;
}
i[class*="el-icon"] + i[class*="el-icon"] {
margin-left: 6px;
}
.el-icon-plus {
color: #409eff;
}
.el-icon-delete {
color: #157a0c;
}
}
.el-scrollbar__view {
overflow-x: hidden;
}
.el-rate {
display: inline-block;
vertical-align: text-top;
}
.el-upload__tip {
line-height: 1.2;
}

32
src/assets/styles/form/mixin.scss

@ -0,0 +1,32 @@
@mixin action-bar {
.action-bar {
height: 33px;
background: #f2fafb;
padding: 0 15px;
box-sizing: border-box;
.bar-btn {
display: inline-block;
padding: 0 6px;
line-height: 32px;
color: #8285f5;
cursor: pointer;
font-size: 14px;
user-select: none;
& i {
font-size: 20px;
}
&:hover {
color: #4348d4;
}
}
.bar-btn + .bar-btn {
margin-left: 8px;
}
.delete-btn {
color: #f56c6c;
&:hover {
color: #ea0b30;
}
}
}
}

217
src/assets/styles/index.scss

@ -1,138 +1,161 @@
$editorTabsborderColor: #121315;
body,
html {
@import './variables.scss';
@import './mixin.scss';
@import './transition.scss';
@import './element-ui.scss';
@import './sidebar.scss';
@import './btn.scss';
body {
height: 100%;
margin: 0;
padding: 0;
background: #fff;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;
font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
}
input,
textarea {
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji;
label {
font-weight: 700;
}
.editor-tabs {
background: $editorTabsborderColor;
.el-tabs__header {
html {
height: 100%;
margin: 0;
border-bottom-color: $editorTabsborderColor;
.el-tabs__nav {
border-color: $editorTabsborderColor;
box-sizing: border-box;
}
#app {
margin: 0;
height: 100%;
}
.el-tabs__item {
height: 32px;
line-height: 32px;
color: #888a8e;
border-left: 1px solid $editorTabsborderColor !important;
background: #363636;
margin-right: 5px;
user-select: none;
}
.el-tabs__item.is-active {
background: #1e1e1e;
border-bottom-color: #1e1e1e !important;
color: #fff;
*,
*::before,
*::after {
box-sizing: inherit;
}
.el-icon-edit {
color: #f1fa8c;
.no-padding {
padding: 0 !important;
}
.el-icon-document {
color: #a95812;
.padding-content {
padding: 4px 0;
}
:focus.is-active.is-focus:not(:active) {
box-shadow: none;
border-radius: 0;
a:focus,
a:active {
outline: none;
}
a,
a:focus,
a:hover {
cursor: pointer;
color: inherit;
text-decoration: none;
}
// home
.right-scrollbar {
.el-scrollbar__view {
padding: 12px 18px 15px 15px;
div:focus {
outline: none;
}
.fr {
float: right;
}
.el-scrollbar__wrap {
box-sizing: border-box;
overflow-x: hidden !important;
margin-bottom: 0 !important;
.fl {
float: left;
}
.center-tabs {
.el-tabs__header {
margin-bottom: 0 !important;
.pr-5 {
padding-right: 5px;
}
.el-tabs__item {
width: 50%;
text-align: center;
.pl-5 {
padding-left: 5px;
}
.el-tabs__nav {
width: 100%;
.block {
display: block;
}
.pointer {
cursor: pointer;
}
.reg-item {
padding: 12px 6px;
background: #f8f8f8;
position: relative;
border-radius: 4px;
.close-btn {
position: absolute;
right: -6px;
top: -6px;
.inlineBlock {
display: block;
width: 16px;
height: 16px;
line-height: 16px;
background: rgba(0, 0, 0, 0.2);
border-radius: 50%;
color: #fff;
text-align: center;
z-index: 1;
}
.clearfix {
&::after {
visibility: hidden;
display: block;
font-size: 0;
content: " ";
clear: both;
height: 0;
}
}
aside {
background: #eef1f6;
padding: 8px 24px;
margin-bottom: 20px;
border-radius: 2px;
display: block;
line-height: 32px;
font-size: 16px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
color: #2c3e50;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
a {
color: #337ab7;
cursor: pointer;
font-size: 12px;
&:hover {
background: rgba(210, 23, 23, 0.5);
}
color: rgb(32, 160, 255);
}
& + .reg-item {
margin-top: 18px;
}
}
.action-bar {
& .el-button + .el-button {
margin-left: 15px;
//main-container全局样式
.app-container {
padding: 20px;
}
& i {
font-size: 20px;
vertical-align: middle;
.components-container {
margin: 30px 50px;
position: relative;
top: -1px;
}
.pagination-container {
margin-top: 30px;
}
.custom-tree-node {
.text-center {
text-align: center;
}
.sub-navbar {
height: 50px;
line-height: 50px;
position: relative;
width: 100%;
font-size: 14px;
.node-operation {
float: right;
text-align: right;
padding-right: 20px;
transition: 600ms ease position;
background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
.subtitle {
font-size: 20px;
color: #fff;
}
i[class*="el-icon"] + i[class*="el-icon"] {
margin-left: 6px;
&.draft {
background: #d0d0d0;
}
.el-icon-plus {
color: #409eff;
&.deleted {
background: #d0d0d0;
}
.el-icon-delete {
color: #157a0c;
}
.link-type,
.link-type:focus {
color: #337ab7;
cursor: pointer;
&:hover {
color: rgb(32, 160, 255);
}
.el-scrollbar__view {
overflow-x: hidden;
}
.el-rate {
.filter-container {
padding-bottom: 10px;
.filter-item {
display: inline-block;
vertical-align: text-top;
vertical-align: middle;
margin-bottom: 10px;
}
}
//refine vue-multiselect plugin
.multiselect {
line-height: 16px;
}
.el-upload__tip {
line-height: 1.2;
.multiselect--active {
z-index: 1000 !important;
}

85
src/assets/styles/mixin.scss

@ -1,32 +1,57 @@
@mixin action-bar {
.action-bar {
height: 33px;
background: #f2fafb;
padding: 0 15px;
box-sizing: border-box;
.bar-btn {
display: inline-block;
padding: 0 6px;
line-height: 32px;
color: #8285f5;
cursor: pointer;
font-size: 14px;
user-select: none;
& i {
font-size: 20px;
}
&:hover {
color: #4348d4;
}
}
.bar-btn + .bar-btn {
margin-left: 8px;
}
.delete-btn {
color: #f56c6c;
&:hover {
color: #ea0b30;
}
}
@mixin clearfix {
&::after {
content: "";
display: table;
clear: both;
}
}
@mixin scrollBar {
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
@mixin relative {
position: relative;
width: 100%;
height: 100%;
}
@mixin pct($pct) {
width: #{$pct};
position: relative;
margin: 0 auto;
}
@mixin triangle($width, $height, $color, $direction) {
$width: $width/2;
$color-border-style: $height solid $color;
$transparent-border-style: $width solid transparent;
height: 0;
width: 0;
@if $direction==up {
border-bottom: $color-border-style;
border-left: $transparent-border-style;
border-right: $transparent-border-style;
}
@else if $direction==right {
border-left: $color-border-style;
border-top: $transparent-border-style;
border-bottom: $transparent-border-style;
}
@else if $direction==down {
border-top: $color-border-style;
border-left: $transparent-border-style;
border-right: $transparent-border-style;
}
@else if $direction==left {
border-right: $color-border-style;
border-top: $transparent-border-style;
border-bottom: $transparent-border-style;
}
}

191
src/assets/styles/sidebar.scss

@ -0,0 +1,191 @@
#app {
.main-container {
min-height: 100%;
transition: margin-left 0.28s;
margin-left: $sideBarWidth;
position: relative;
}
.sidebar-container {
transition: width 0.28s;
width: $sideBarWidth !important;
background-color: $menuBg;
height: 100%;
position: fixed;
font-size: 0;
top: 0;
bottom: 0;
left: 0;
z-index: 1001;
overflow: hidden;
// reset element-ui css
.horizontal-collapse-transition {
transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
}
.scrollbar-wrapper {
overflow-x: hidden !important;
}
.el-scrollbar__bar.is-vertical {
right: 0;
}
.el-scrollbar {
height: 100%;
}
&.has-logo {
.el-scrollbar {
height: calc(100% - 50px);
}
}
.is-horizontal {
display: none;
}
a {
display: inline-block;
width: 100%;
overflow: hidden;
}
.svg-icon {
margin-right: 16px;
}
.sub-el-icon {
margin-right: 12px;
margin-left: -2px;
}
.el-menu {
border: none;
height: 100%;
width: 100% !important;
}
// menu hover
.submenu-title-noDropdown,
.el-submenu__title {
&:hover {
background-color: $menuHover !important;
}
}
.is-active > .el-submenu__title {
color: $subMenuActiveText !important;
}
& .nest-menu .el-submenu > .el-submenu__title,
& .el-submenu .el-menu-item {
min-width: $sideBarWidth !important;
background-color: $subMenuBg !important;
&:hover {
background-color: $subMenuHover !important;
}
}
}
.hideSidebar {
.sidebar-container {
width: 54px !important;
}
.main-container {
margin-left: 54px;
}
.submenu-title-noDropdown {
padding: 0 !important;
position: relative;
.el-tooltip {
padding: 0 !important;
.svg-icon {
margin-left: 20px;
}
.sub-el-icon {
margin-left: 19px;
}
}
}
.el-submenu {
overflow: hidden;
& > .el-submenu__title {
padding: 0 !important;
.svg-icon {
margin-left: 20px;
}
.sub-el-icon {
margin-left: 19px;
}
.el-submenu__icon-arrow {
display: none;
}
}
}
.el-menu--collapse {
.el-submenu {
& > .el-submenu__title {
& > span {
height: 0;
width: 0;
overflow: hidden;
visibility: hidden;
display: inline-block;
}
}
}
}
}
.el-menu--collapse .el-menu .el-submenu {
min-width: $sideBarWidth !important;
}
// mobile responsive
.mobile {
.main-container {
margin-left: 0;
}
.sidebar-container {
transition: transform 0.28s;
width: $sideBarWidth !important;
}
&.hideSidebar {
.sidebar-container {
pointer-events: none;
transition-duration: 0.3s;
transform: translate3d(-$sideBarWidth, 0, 0);
}
}
}
.withoutAnimation {
.main-container,
.sidebar-container {
transition: none;
}
}
}
// when menu collapsed
.el-menu--vertical {
& > .el-menu {
.svg-icon {
margin-right: 16px;
}
.sub-el-icon {
margin-right: 12px;
margin-left: -2px;
}
}
.nest-menu .el-submenu > .el-submenu__title,
.el-menu-item {
&:hover {
// you can use $subMenuHover
background-color: $menuHover !important;
}
}
// the scroll bar appears when the subMenu is too long
>.el-menu--popup {
max-height: 100vh;
overflow-y: auto;
&::-webkit-scrollbar-track-piece {
background: #d3dce6;
}
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background: #99a9bf;
border-radius: 20px;
}
}
}

42
src/assets/styles/transition.scss

@ -0,0 +1,42 @@
// global transition css
/* fade */
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.28s;
}
.fade-enter,
.fade-leave-active {
opacity: 0;
}
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {
transition: all 0.5s;
}
.fade-transform-enter {
opacity: 0;
transform: translateX(-30px);
}
.fade-transform-leave-to {
opacity: 0;
transform: translateX(30px);
}
/* breadcrumb transition */
.breadcrumb-enter-active,
.breadcrumb-leave-active {
transition: all 0.5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
}
.breadcrumb-move {
transition: all 0.5s;
}
.breadcrumb-leave-active {
position: absolute;
}

35
src/assets/styles/variables.scss

@ -0,0 +1,35 @@
// base color
$blue:#324157;
$light-blue:#3a71a8;
$red:#c03639;
$pink: #e65d6e;
$green: #30b08f;
$tiffany: #4ab7bd;
$yellow:#fec171;
$panGreen: #30b08f;
// sidebar
$menuText:#bfcbd9;
$menuActiveText:#409eff;
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg:#304156;
$menuHover:#263445;
$subMenuBg:#1f2d3d;
$subMenuHover:#001528;
$sideBarWidth: 210px;
// the :export directive is the magic sauce for webpack
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
:export {
menutext: $menuText;
menuactivetext: $menuActiveText;
submenuactivetext: $subMenuActiveText;
menubg: $menuBg;
menuhover: $menuHover;
submenubg: $subMenuBg;
submenuhover: $subMenuHover;
sidebarwidth: $sideBarWidth;
}

2
src/main.js

@ -9,6 +9,8 @@ import Cookies from 'js-cookie'
import router from './router/index'
import api from './api'
import store from './store/index'
import '@/assets/styles/index.scss' // global css
// 全局组件自动注册
import '@/components/autoRegister'
import VueClipboard from 'vue-clipboard2'

2
src/views/form/PreView1.vue

@ -87,7 +87,7 @@ export default {
this.formConf.size = window.innerWidth < 480 ? 'medium' : 'small'
},
mounted() {
this.$api.get(`/user/project/query/details/${this.$route.query.key}`).then(res => {
this.$api.get(`/user/project/details/${this.$route.query.key}`).then(res => {
if (res.data) {
let fields = res.data.projectItems.map(item => {
return dbDataConvertForItemJson(item)

6
src/views/form/ProjectForm.vue

@ -12,13 +12,13 @@
:src="projectTheme.headImgUrl"
fit="scale-down"></el-image>
<el-row v-if="projectTheme.showTitle" type="flex" justify="center" align="middle">
<el-col :sm="{span:20}" :xs="{span:24,offset:0}" style="text-align: center">
<el-col style="text-align: center">
<h4 class="form-name-text">
{{ formConf.title }}</h4>
</el-col>
</el-row>
<el-row v-if="projectTheme.showDescribe" type="flex" justify="center" align="middle">
<el-col :sm="{span:20}" :xs="{span:24,offset:0}" style="text-align: center">
<el-col style="text-align: center">
<p class="form-name-text">
{{ formConf.description }}
</p>
@ -103,7 +103,7 @@ export default {
this.formConf.size = window.innerWidth < 480 ? 'medium' : 'small'
},
mounted() {
this.$api.get(`/user/project/details/query/${this.projectKey}`).then(res => {
this.$api.get(`/user/project/details/${this.projectKey}`).then(res => {
if (res.data) {
let fields = res.data.projectItems.map(item => {
return dbDataConvertForItemJson(item)

2
src/views/form/RightPanel.vue

@ -971,7 +971,7 @@ export default {
</script>
<style lang="scss" scoped>
@import '@/assets/styles/index';
@import '@/assets/styles/form/index';
.right-board {
width: 350px;
position: absolute;

38
src/views/form/editor.vue

@ -63,7 +63,8 @@
:disabled="formConf.disabled"
:label-width="formConf.labelWidth + 'px'"
>
<draggable class="drawing-board" :list="drawingList" :animation="340" group="componentsGroup" @end="onItemEnd">
<draggable class="drawing-board" :list="drawingList" :animation="340" group="componentsGroup"
@end="onItemEnd">
<draggable-item
v-for="(item, index) in drawingList"
:key="item.renderKey"
@ -108,7 +109,7 @@ import {
import {
exportDefault, beautifierConf, isNumberStr, titleCase, deepClone
} from '@/utils/index'
import {formItemConvertData} from '@/utils/convert'
import {dbDataConvertForItemJson, formItemConvertData} from '@/utils/convert'
import drawingDefalut from '@/components/generator/drawingDefalut'
import DraggableItem from './DraggableItem'
import {
@ -118,7 +119,6 @@ import {
let oldActiveId
let tempActiveData
let drawingListInDB
let formConfInDB
let idGlobal
export default {
@ -129,7 +129,8 @@ export default {
DraggableItem
},
props: {
projectKey:''
projectKey: '',
isEdit: true //
},
data() {
return {
@ -198,6 +199,10 @@ export default {
mounted() {
//key
let projectKey = this.projectKey
//
if (this.isEdit) {
this.queryProjectItems()
} else {
// 使
drawingListInDB = getDrawingList(projectKey)
if (Array.isArray(drawingListInDB) && drawingListInDB.length > 0) {
@ -205,23 +210,20 @@ export default {
} else {
this.drawingList = drawingDefalut
}
}
if (this.drawingList.length) {
this.activeFormItem(this.drawingList[0])
}
//
// formConfInDB = getFormConf(projectKey)
// if (formConfInDB) {
// this.formConf = formConfInDB
// }
//
this.$api.get(`/user/project/query/${projectKey}`).then(res => {
//
this.$api.get(`/user/project/${projectKey}`).then(res => {
this.formConf.title = res.data.name
this.formConf.description = res.data.describe
})
//Id
if (getIdGlobal(projectKey)) {
this.idGlobal = getIdGlobal(projectKey)
}
this.$api.get(`/user/project/item/max-form-id`, {params: {key: this.projectKey}}).then(res => {
this.idGlobal = res.data ? res.data : 100
})
this.projectKey = projectKey
},
@ -242,7 +244,6 @@ export default {
})
},
deleteProjectItemInfo(val) {
console.log(val)
let data = formItemConvertData(val, this.projectKey)
this.$api.post('/user/project/item/delete', data).then((res) => {
@ -254,6 +255,11 @@ export default {
item.sort = res.data.sort
})
},
queryProjectItems() {
this.$api.get(`/user/project/item/list`, {params: {key: this.projectKey}}).then(res => {
this.drawingList = res.data.map(item => dbDataConvertForItemJson(item))
})
},
activeFormItem(currentItem) {
this.activeData = currentItem
this.activeId = currentItem.__config__.formId
@ -383,6 +389,6 @@ export default {
</script>
<style lang='scss'>
@import '@/assets/styles/home';
@import '@/assets/styles/index';
@import '@/assets/styles/form/home';
@import '@/assets/styles/form/index';
</style>

11
src/views/form/index.vue

@ -18,11 +18,13 @@
</el-menu>
</el-col>
</el-row>
<editor :projectKey="projectKey" v-if="activeIndex==1&&projectKey"/>
<div v-if="projectKey">
<editor :projectKey="projectKey" :is-edit="isEdit" v-if="activeIndex==1"/>
<theme :projectKey="projectKey" v-if="activeIndex==2"/>
<setting :projectKey="projectKey" v-if="activeIndex==3"/>
<publish :projectKey="projectKey" v-if="activeIndex==4"/>
<statistics :projectKey="projectKey" v-if="activeIndex==5&&projectKey"/>
<statistics :projectKey="projectKey" v-if="activeIndex==5"/>
</div>
</div>
</template>
@ -32,6 +34,7 @@ import theme from './theme'
import setting from './setting'
import publish from './publish'
import statistics from './statistics'
export default {
components: {
editor,
@ -43,6 +46,7 @@ export default {
data() {
return {
activeIndex: '5',
isEdit: false,
projectKey:''
}
},
@ -50,7 +54,8 @@ export default {
watch: {},
mounted() {
this.projectKey = this.$route.query.key
console.log(this.projectKey)
this.isEdit = !!this.$route.query.active
this.activeIndex=this.$route.query.active
},
methods: {
handleSelect(key, keyPath) {

25
src/views/form/publish.vue

@ -42,7 +42,8 @@
<div style="text-align: center">
<el-link type="primary" @click="()=>{
this.downloadFile('qrcode.png',this.qrCodeUrl)
}">下载分享二维码</el-link>
}">下载分享二维码
</el-link>
</div>
</el-col>
</el-row>
@ -66,6 +67,7 @@ export default {
mounted() {
let url = window.location.protocol + '//' + window.location.host
this.writeLink = `${url}/project/write?key=${this.projectKey}`
this.getProjectStatus()
},
data() {
return {
@ -74,8 +76,15 @@ export default {
qrCodeUrl: ''
}
}, methods: {
getProjectStatus() {
this.$api.get(`/user/project/${this.projectKey}`).then(res => {
if (res.data.status != 1) {
this.publishStatus = true
}
})
},
publishProject() {
this.$api.post(`/user/project/publish/${this.projectKey}`).then(res => {
this.$api.post(`/user/project/publish`, {key: this.projectKey}).then(res => {
this.publishStatus = true
this.msgSuccess('发布成功')
})
@ -84,12 +93,12 @@ export default {
this.qrCodeUrl = dataUrl
},
downloadFile(fileName, content) {
let aLink = document.createElement('a');
let blob = this.base64ToBlob(content); //new Blob([content]);
let evt = document.createEvent("HTMLEvents");
evt.initEvent("click", true, true);//initEvent FF
aLink.download = fileName;
aLink.href = URL.createObjectURL(blob);
let aLink = document.createElement('a')
let blob = this.base64ToBlob(content) //new Blob([content]);
let evt = document.createEvent('HTMLEvents')
evt.initEvent('click', true, true)//initEvent FF
aLink.download = fileName
aLink.href = URL.createObjectURL(blob)
// aLink.dispatchEvent(evt);
aLink.click()
},

11
src/views/form/setting.vue

@ -474,7 +474,8 @@
class="setting-input" style="width: 80%" v-model="userProjectSettingData.shareDesc"/>
</el-col>
</el-row>
<div v-if="userProjectSettingData.shareDesc||userProjectSettingData.shareTitle||userProjectSettingData.shareImg">
<div
v-if="userProjectSettingData.shareDesc||userProjectSettingData.shareTitle||userProjectSettingData.shareImg">
<div class="share-preview">
<div class="share-preview-msg">
<div>
@ -590,7 +591,7 @@ export default {
},
queryUserProjectSetting() {
this.userProjectSettingData.projectKey = this.projectKey
this.$api.get(`/user/project/setting/query/${this.projectKey}`).then(res => {
this.$api.get(`/user/project/setting/${this.projectKey}`).then(res => {
if (res.data) {
this.userProjectSettingData = res.data
let {
@ -630,7 +631,7 @@ export default {
}, 5 * 1000)
},
querySubNotifyWxUser(openIdStr) {
this.$api.get('/user/project/wx/notify/user', {
this.$api.get('/user/project/wx/notify-user', {
params: {
key: this.projectKey,
openIdStr: openIdStr
@ -647,7 +648,7 @@ export default {
})
},
getSubNotifyWxQrCode() {
this.$api.get('/user/project/wx/notify/qrcode', {params: {key: this.projectKey}}).then(res => {
this.$api.get('user/project/wx/notify-qrcode', {params: {key: this.projectKey}}).then(res => {
this.subNotifyWxQrCode = res.data
})
},
@ -655,7 +656,7 @@ export default {
if (this.subNotifyWxUserList) {
let openId = this.subNotifyWxUserList[i].openId
let key = this.projectKey
this.$api.post(`/user/project/wx/notify/user/delete/${key}/${openId}`).then(res => {
this.$api.post(`/user/project/wx/delete/notify-user?key=${key}&openId=${openId}`).then(res => {
this.subNotifyWxUserList.splice(i)
this.userProjectSettingData.newWriteNotifyWx = this.subNotifyWxUserList.map(item => item.openId).join(';')
this.saveUserProjectSetting()

13
src/views/form/statistics.vue

@ -6,12 +6,15 @@
<el-date-picker
v-model="queryConditions.beginDateTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始时间">
</el-date-picker>
<span> </span>
<el-date-picker
v-model="queryConditions.endDateTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="'23:59:59'"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
@ -28,7 +31,7 @@
type="selection"
width="55">
</el-table-column>
<el-table-column v-for="col in fixedCustomColumns" :key="col"
<el-table-column v-for="col in fixedCustomColumns" :key="`t${col}`"
:label="fixedDefaultLabelFormColumn[col]">
<template slot-scope="scope">
{{ scope.row[col] }}
@ -57,7 +60,7 @@
<el-divider></el-divider>
<el-checkbox-group v-model="checkFixedCustomColumns">
<el-row>
<el-col :span="4" v-for="(val, key, index) in fixedDefaultLabelFormColumn">
<el-col :span="4" v-for="(val, key, index) in fixedDefaultLabelFormColumn" :key="key">
<el-checkbox :label="key">{{ val }}</el-checkbox>
</el-col>
</el-row>
@ -65,7 +68,7 @@
<el-divider></el-divider>
<el-checkbox-group v-model="checkOtherCustomColumns">
<el-row>
<el-col :span="8" v-for="(val, key, index) in projectItemColumns">
<el-col :span="8" v-for="(val, key, index) in projectItemColumns" :key="key">
<el-checkbox :label="key">{{ val }}</el-checkbox>
</el-col>
</el-row>
@ -126,7 +129,7 @@ export default {
)
},
queryProjectResult() {
this.$api.post(`/user/project/result/query`, this.queryConditions).then(res => {
this.$api.post(`/user/project/result/page`, this.queryConditions).then(res => {
this.projectResultList = res.data.records
})
},
@ -151,7 +154,7 @@ export default {
}
},
queryProjectItems() {
this.$api.get(`/user/project/item/list/${this.projectKey}`).then(res => {
this.$api.get(`/user/project/item/list`, {params: {key: this.projectKey}}).then(res => {
if (res.data) {
res.data.map((item) => {
_.set(this.projectItemColumns, `field${item.formItemId}`, item.label)

10
src/views/form/theme.vue

@ -9,7 +9,9 @@
<el-col :span="3">
<span class="theme-prompt-text">风格</span>
</el-col>
<el-col :span="3" v-for="item in styleList">
<el-col
:key="item.key"
:span="3" v-for="item in styleList">
<span
:class="{'style-btn-active':activeStyle==item.key}"
class="style-btn" @click="activeStyleHandle(item)">{{item.label}}</span>
@ -28,12 +30,14 @@
:class="{'style-btn-active':activeColor==c}"
@click.native="activeColorHandle(c)" v-bind:style="{backgroundColor: c}"
class="color-btn"
:key="c"
:span="3" v-for="c in colorList">
</el-col>
</el-row>
<el-row>
<el-col
class="theme-img-view"
:key="t.id"
:span="8" v-for="t in themeList"
@click.native="activeThemeHandle(t)">
<p :class="{'head-list-view-select':activeTheme.id==t.id}">
@ -321,7 +325,7 @@ export default {
})
},
queryUserProjectTheme() {
this.$api.get(`/user/project/theme/query/${this.projectKey}`).then(res => {
this.$api.get(`/user/project/theme/${this.projectKey}`).then(res => {
if(!res.data){
return
}
@ -359,7 +363,7 @@ export default {
this.queryProjectTheme()
},
queryProjectTheme() {
this.$api.get('/project/theme/query', {
this.$api.get('/project/theme/list', {
params: {
'color': this.activeColor,
'style': this.activeStyle

39
src/views/form/write.vue

@ -1,11 +1,9 @@
<template>
<div class="write-container">
<div v-if="writeStatus==0">
<div style="display: flex;justify-content: center">
<div class="icon-view" style="background-color: red">
<div v-if="writeStatus==0" class="title-icon-view">
<div class="icon-view">
<i class="el-icon-check success-icon"/>
</div>
</div>
<p style="text-align: center" v-if="writeNotStartPrompt">
<span v-if="writeNotStartPrompt">{{ writeNotStartPrompt }}</span>
</p>
@ -16,20 +14,17 @@
:projectConfig="projectConfig"
v-if="projectConfig.projectKey"/>
</div>
<div v-if="writeStatus==2">
<div style="text-align: center">
<div v-if="writeStatus==2" class="title-icon-view">
<div>
<el-image
v-if="userProjectSetting.submitPromptImg"
:src="userProjectSetting.submitPromptImg"
fit="cover"></el-image>
</div>
<div style="display: flex;justify-content: center">
<div class="icon-view">
<i class="el-icon-check success-icon"/>
</div>
</div>
<p style="text-align: center">
<span v-if="userProjectSetting.submitPromptText">{{ userProjectSetting.submitPromptText }}</span>
<span v-else>{{ globalDefaultValue.projectSubmitPromptText }}</span>
</p>
@ -55,7 +50,7 @@ export default {
preview: false,
showBtns: true
},
writeStatus: 3,
writeStatus: 2,
writeNotStartPrompt: '',
userProjectSetting: {
submitPromptText: ''
@ -96,7 +91,7 @@ export default {
}, methods: {
queryProjectSettingStatus() {
//
this.$api.get(`/user/project/setting/status/${this.projectConfig.projectKey}`).then(res => {
this.$api.get(`/user/project/setting/status`, {params: {projectKey: this.projectConfig.projectKey}}).then(res => {
if (res.msg) {
this.writeNotStartPrompt = res.msg
this.writeStatus = 0
@ -184,7 +179,7 @@ export default {
})
},
queryProjectSetting() {
this.$api.get(`/user/project/setting/query/${this.projectConfig.projectKey}`).then(res => {
this.$api.get(`/user/project/setting/${this.projectConfig.projectKey}`).then(res => {
if (res.data) {
this.userProjectSetting = res.data
//
@ -223,21 +218,33 @@ export default {
}
</script>
<style scoped>
<style lang="scss" scoped>
.write-container {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
}
.title-icon-view {
display: flex;
align-items: center;
align-content: center;
justify-content: center;
flex-direction: column;
height: 100%;
width: 100%;
}
.icon-view {
width: 59px;
height: 59px;
border-radius: 100px;
background-color: #0076FF;
display: flex;
align-items: center;
align-content: center;
justify-items: center;
align-items: center;
justify-content: center;
}

1
src/views/official/introduction.vue

@ -184,7 +184,6 @@ export default {
float: left;
cursor: pointer;
height: 60px;
padding: 25px 0 20px 0;
}
.menu-item {
line-height: 110px;

177
src/views/project/MyProject.vue

@ -1,60 +1,66 @@
<template>
<div class="my-project-container">
<div class="filter-view">
<el-row type="flex" align="middle" justify="center" style="height: 50px;">
<el-col :span="3">
<font-icon class="fas fa-th-large show-view-type-icon show-view-type-icon-active" />
<font-icon class="fas fa-th-list show-view-type-icon" />
</el-col>
<el-col :span="3">
<span class="title">项目更新时间</span>
</el-col>
<el-col :span="10">
<div>
<span @click="switchDataShowTypeHandle('gird')">
<font-icon
class="fas fa-th-large show-view-type-icon "
:class="{'show-view-type-icon-active':dataShowType=='gird'}"
/>
</span>
<span @click="switchDataShowTypeHandle('table')">
<font-icon
class="fas fa-th-list show-view-type-icon"
:class="{'show-view-type-icon-active':dataShowType=='table'}"
/>
</span>
</div>
<el-form ref="form" label-width="100px">
<el-form-item label="项目更新时间">
<el-date-picker
style="width: 50%;"
v-model="queryParams.beginDateTime"
style="width: 20%;"
value-format="yyyy-MM-dd HH:mm:ss"
type="datetime"
placeholder="选择开始时间"
/>
<el-date-picker
style="width: 50%;"
v-model="queryParams.endDateTime"
style="width: 20%;"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="'23:59:59'"
placeholder="选择结束时间"
/>
</el-col>
<el-col :span="4" :offset="1">
<el-input v-model="queryParams.name" type="text" placeholder="请输入项目名称" />
</el-col>
<el-col :span="3" :offset="1">
<el-button type="primary" @click="queryProjectPage">查询</el-button>
</el-col>
<el-col :span="6">
<el-button>
<el-input
v-model="queryParams.name"
style="width: 20%; margin-left: 20px;" type="text" placeholder="请输入项目名称"
/>
<el-button style="margin-left: 20px;" type="primary" @click="queryProjectPage">查询</el-button>
<el-button style="margin-left: 20px;">
<font-icon class="fas fa-plus-square" />
新建文件夹
</el-button>
<el-button>
<el-button style="margin-left: 10px;">
<font-icon class="fas fa-recycle" />
回收站
</el-button>
</el-col>
</el-row>
<el-row type="flex" align="middle" justify="center" style="height: 50px;">
<el-col :span="2" :offset="3">
<span class="title">项目状态</span>
</el-col>
<el-col :span="6">
</el-form-item>
<el-form-item label="项目状态">
<el-radio-group v-model="queryParams.status" size="small" @change="queryProjectPage">
<el-radio-button v-for="status in projectStatusList" :key="status.code" :label="status.code">
{{ status.name }}
</el-radio-button>
</el-radio-group>
</el-col>
<el-col :span="13" />
</el-row>
</el-form-item>
</el-form>
</div>
<div class="project-grid-view">
<el-row>
<el-col v-for="p in projectList" :key="p.id" class="project-grid-item-view" :span="4">
<div v-if="dataShowType=='gird'" class="project-grid-container">
<div
class="project-grid-view"
>
<div v-for="p in projectList" :key="p.id" class="project-grid-item-view" :span="4">
<span v-for="status in projectStatusList" :key="status.code">
<span
v-if="status.code==p.status"
@ -69,8 +75,68 @@
src="https://freebrio.oss-cn-shanghai.aliyuncs.com/t/pic%20(1).png"
>
<p class="project-grid-view-time">创建时间2020/12/8</p>
</el-col>
</el-row>
</div>
</div>
</div>
<div v-if="dataShowType=='table'" class="project-table-view">
<el-table
:data="projectList"
stripe
border
highlight-current-row
style="width: 100%;"
empty-text="暂无数据"
>
<el-table-column
prop="name"
align="center"
label="标题"
/>
<el-table-column
show-overflow-tooltip
prop="describe"
align="center"
label="描述"
/>
<el-table-column
align="center"
label="状态"
>
<template slot-scope="scope">
<span v-for="status in projectStatusList" :key="status.code">
<span
v-if="status.code==scope.row.status"
>
{{ status.name }}
</span>
</span>
</template>
</el-table-column>
<el-table-column
align="center"
prop="createTime"
label="创建时间"
/>
<el-table-column
align="center"
prop="updateTime"
label="更新时间"
/>
<el-table-column label="操作">
<template slot-scope="scope">
<el-link type="primary"
style="margin: 2px;"
@click="$router.push({path: '/project/form', query: {key: scope.row.key,active:1}})"
>
编辑
</el-link>
<el-link type="danger" style="margin: 2px;">
删除
</el-link>
</template>
</el-table-column>
</el-table>
</div>
<div class="project-page-view">
<el-pagination
@ -97,11 +163,14 @@ export default {
components: {},
data() {
return {
dataShowType: 'gird',
total: 0,
queryParams: {
current: 1,
size: 10,
name: '',
beginDateTime: null,
endDateTime: null,
status: null
},
projectStatusList: projectStatusList,
@ -114,6 +183,9 @@ export default {
},
methods: {
switchDataShowTypeHandle(type) {
this.dataShowType = type
},
getStatusColorClass(code) {
let color = this.projectStatusList.find(item => item.code = code).color
return {
@ -138,18 +210,17 @@ export default {
<style scoped>
.my-project-container {
margin: 0;
padding: 0;
width: 100%;
height: 80vh;
overflow-x: hidden !important;
display: flex;
width: 100%;
flex-direction: column;
align-items: center;
align-content: center;
justify-content: center;
}
.filter-view {
margin-top: 40px;
width: 60%;
display: flex;
flex-direction: row;
}
.title {
color: rgba(16, 16, 16, 100);
@ -158,18 +229,32 @@ export default {
line-height: 20px;
}
.show-view-type-icon {
width: 20px;
height: 20px;
width: 17px;
height: 17px;
color: #a8a8a8;
font-size: 20px;
margin: 5px;
cursor: pointer;
}
.show-view-type-icon-active {
color: rgba(92, 155, 249, 100);
}
.project-grid-view {
.project-grid-container {
margin-top: 20px;
display: flex;
width: 100%;
justify-content: center;
}
.project-grid-view {
display: flex;
width: 60%;
flex-direction: row;
flex-wrap: wrap;
justify-content: center;
}
.project-table-view {
margin-top: 20px;
width: 80%;
}
.project-grid-item-view {
width: 169px;
@ -191,7 +276,7 @@ export default {
background-color: rgba(0, 110, 255, 100);
text-align: center;
border: 1px solid rgba(0, 110, 255, 100);
border-radius: 80px;
border-radius: 20px;
position: absolute;
left: 10px;
top: 20px;

Loading…
Cancel
Save