Browse Source

Merge remote-tracking branch 'v2/master' into master-v2

old
wangqing 4 years ago
parent
commit
d1fa11ae52
  1. 2
      .env.development
  2. 2
      .env.production
  3. 2
      .eslintignore
  4. 2
      plop-templates/component/prompt.js
  5. 35
      src/api/index.js
  6. 10
      src/assets/styles/index.scss
  7. 2
      src/assets/styles/resources/element-variables.scss
  8. 24
      src/assets/styles/resources/variables.scss
  9. 2
      src/components/form/SignPad/index.vue
  10. 11
      src/components/generator/config.js
  11. 12
      src/components/parser/Parser.vue
  12. 2
      src/components/render/slots/el-carousel.js
  13. 4
      src/router/modules/form.js
  14. 50
      src/router/modules/project.js
  15. 66
      src/router/modules/root.js
  16. 4
      src/utils/constants.js
  17. 4
      src/utils/convert.js
  18. 1
      src/utils/sign.js
  19. 39
      src/views/account/ForgetPwd.vue
  20. 110
      src/views/account/login.vue
  21. 0
      src/views/form/editor/DraggableItem.vue
  22. 0
      src/views/form/editor/IconsDialog.vue
  23. 223
      src/views/form/editor/RightPanel.vue
  24. 2
      src/views/form/editor/TreeNodeDialog.vue
  25. 2
      src/views/form/editor/index.vue
  26. 202
      src/views/form/index.vue
  27. 2
      src/views/form/logic/index.vue
  28. 165
      src/views/form/newIndex.vue
  29. 85
      src/views/form/oldIndex.vue
  30. 0
      src/views/form/preview/ProjectForm.vue
  31. 0
      src/views/form/preview/index.vue
  32. 0
      src/views/form/publish/index.vue
  33. 17
      src/views/form/setting/index.vue
  34. 33
      src/views/form/statistics/index.vue
  35. 55
      src/views/form/statistics/item.vue
  36. 185
      src/views/form/statistics/public.vue
  37. 2
      src/views/form/theme/index.vue
  38. 40
      src/views/form/write/index.vue
  39. 271
      src/views/home/NewIndex.vue
  40. 322
      src/views/home/index.vue
  41. 205
      src/views/home/oldIndex.vue
  42. 2
      src/views/project/my/index.vue
  43. 0
      src/views/project/recycle/index.vue
  44. 91
      src/views/project/template/index.vue
  45. 2
      src/views/project/template/preview.vue

2
.env.development

@ -9,3 +9,5 @@ VUE_APP_CDN = OFF
VUE_APP_DEBUG_TOOL =
# 高德地图key
VUE_APP_MAP_KEY = f2200337d0d08538e78729572749882d
# 微信功能开关 开启设置 ON,关闭设置 OFF
VUE_APP_WX = ON

2
.env.production

@ -9,3 +9,5 @@ VUE_APP_CDN = OFF
VUE_APP_DEBUG_TOOL =
# 高德地图key
VUE_APP_MAP_KEY = f2200337d0d08538e78729572749882d
# 微信功能开关 开启设置 ON,关闭设置 OFF
VUE_APP_WX = ON

2
.eslintignore

@ -7,4 +7,4 @@ src/components/echarts/china.js
src/components/render/
src/components/verifition/
src/components/tinymce/
src/views/form/RightPanel.vue
src/views/form/editor/RightPanel.vue

2
plop-templates/component/prompt.js

@ -47,7 +47,7 @@ module.exports = {
actions: data => {
let path = ''
if (data.isGlobal) {
path = 'src/components/{{properCase name}}/index.vue'
path = 'src/components/{{properCase name}}/oldIndex.vue'
} else {
path = `${data.path}/components/{{properCase name}}/index.vue`
}

35
src/api/index.js

@ -1,6 +1,6 @@
import axios from 'axios'
// import qs from 'qs'
import {MessageBox, Message} from 'element-ui'
import {Message, MessageBox} from 'element-ui'
import Verification from '@/components/verifition/verification.js'
import router from '@/router/index'
import store from '@/store/index'
@ -39,7 +39,11 @@ api.interceptors.request.use(
}
)
function signRequest(request) {
/**
* 签名请求
* @param request
*/
const signRequest = request => {
// 签名验证
if (request.params == undefined) {
request.params = {}
@ -51,7 +55,8 @@ function signRequest(request) {
}
api.interceptors.response.use(
response => {
async response => {
console.log(response)
/**
* 全局拦截请求发送后返回的数据如果数据有报错则在这做全局的错误提示
* 假设返回数据格式为{"code":500,"msg":"邮箱地址不正确","data":null}
@ -60,16 +65,11 @@ api.interceptors.response.use(
* 请求出错时 msg 会返回错误信息
* 则代码如下
*/
console.log(response)
let errCodes = [500, 405, 403]
const res = response.data
// eslint-disable-next-line no-debugger
debugger
if (res.code === 200) {
return Promise.resolve(res)
} else if (errCodes.includes(res.code)) {
// eslint-disable-next-line no-debugger
debugger
// 这里做错误提示,如果使用了 element ui 则可以使用 Message 进行提示
Message({
message: res.msg || 'Error',
@ -99,18 +99,17 @@ api.interceptors.response.use(
}
return Promise.reject(res)
} else if (res.code === 416) {
console.log('validate')
Verification().then(value => {
console.log(value)
setTimeout(function() {
response.config.params.slideCode = value
delete response.config.params.sign
// 需要滑动验证
let result = {}
await Verification().then(async value => {
response.config.params.slideCode = value
delete response.config.params.sign
if (response.config.data) {
response.config.data = JSON.parse(response.config.data)
signRequest(response.config)
return axios(response.config)
}, 1000)
}
result = await api.request(response.config)
})
return Promise.reject(res)
return Promise.resolve(result)
}
return Promise.resolve(res)
},

10
src/assets/styles/index.scss

@ -72,7 +72,7 @@ div:focus {
margin-right: 10px;
}
.ml-20 {
margin-left: 20px;
margin-left: 20px !important;
}
.ml-10 {
margin-left: 10px;
@ -99,6 +99,11 @@ div:focus {
flex-direction: column;
box-sizing: border-box;
}
.flex-center {
display: flex;
justify-content: center;
align-content: center;
}
.desc-text {
color: rgba(155, 155, 155, 100);
font-size: 14px;
@ -107,6 +112,9 @@ div:focus {
.width-full {
width: 100% !important;
}
.width50 {
width: 50% !important;
}
.width80 {
width: 80% !important;
margin: 0 auto;

2
src/assets/styles/resources/element-variables.scss

@ -19,6 +19,8 @@ $--border-color-lighter: #e6ebf5;
$--table-border: 1px solid #dfe6ec;
$--box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
/* icon font path, required */
$--font-path: "~element-ui/lib/theme-chalk/fonts";
@import "../../../../node_modules/element-ui/packages/theme-chalk/src/index";

24
src/assets/styles/resources/variables.scss

@ -1,23 +1,23 @@
// base color
$blue:#324157;
$light-blue:#3a71a8;
$red:#c03639;
$blue: #324157;
$light-blue: #3a71a8;
$red: #c03639;
$pink: #e65d6e;
$green: #30b08f;
$tiffany: #4ab7bd;
$yellow:#fec171;
$yellow: #fec171;
$panGreen: #30b08f;
$backgroundColor: rgba(247, 247, 247, 90);
// sidebar
$menuText:#bfcbd9;
$menuActiveText:#409eff;
$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuText: #bfcbd9;
$menuActiveText: #409eff;
$subMenuActiveText: #f4f4f5; // https://github.com/ElemeFE/element/issues/12951
$menuBg:#304156;
$menuHover:#263445;
$menuBg: #304156;
$menuHover: #263445;
$subMenuBg:#1f2d3d;
$subMenuHover:#001528;
$subMenuBg: #1f2d3d;
$subMenuHover: #001528;
$sideBarWidth: 210px;

2
src/components/form/SignPad/index.vue

@ -2,7 +2,7 @@
<div id="signature-pad" class="signature-pad">
<div class="signature-pad--body" style="min-height: 300px; width: 100%;">
<canvas v-show="!signImageUrl" class="canvasId" style="border: 2px dashed #f7f7f7;" />
<img v-if="signImageUrl" :src="signImageUrl">
<img v-if="signImageUrl" :src="signImageUrl" style="width: 100%; height: 100%;">
</div>
<p class="desc-text">请在上面区域完成签名 然后点击确"确认"按钮</p>
<div v-if="!signImageUrl">

11
src/components/generator/config.js

@ -496,6 +496,7 @@ export const imageComponents = [
__config__: {
label: '图片展示',
showLabel: false,
displayType: true,
labelWidth: null,
showDefaultValue: false,
showRequired: false,
@ -505,7 +506,7 @@ export const imageComponents = [
tagIcon: 'image',
layout: 'colFormItem',
span: 24,
required: true,
required: false,
regList: [],
changeTag: true
},
@ -522,6 +523,7 @@ export const imageComponents = [
__config__: {
label: '图片轮播',
showLabel: false,
displayType: true,
labelWidth: null,
defaultValue: null,
showDefaultValue: false,
@ -579,6 +581,7 @@ export const assistComponents = [
__config__: {
label: '文字描述',
defaultValue: '描述文字',
displayType: true,
showDefaultValue: true,
showRequired: false,
showClearable: false,
@ -600,6 +603,7 @@ export const assistComponents = [
__config__: {
label: '分割线',
defaultValue: '分割线',
displayType: true,
showLabel: false,
showDefaultValue: false,
showRequired: false,
@ -621,7 +625,7 @@ export const assistComponents = [
typeId: 'SIGN_PAD',
__config__: {
label: '手写签名',
defaultValue: '手写签名',
defaultValue: '',
showLabel: true,
showDefaultValue: true,
showRequired: true,
@ -644,6 +648,7 @@ export const assistComponents = [
__config__: {
label: '分页',
defaultValue: '分页',
displayType: true,
showLabel: false,
showDefaultValue: false,
showRequired: false,
@ -667,7 +672,7 @@ export const assistComponents = [
]
// 个人信息组件
export const personalInfoComponents = [
export const personalInfoComponents = [
{
typeId: 'INPUT',
__config__: {

12
src/components/parser/Parser.vue

@ -150,9 +150,9 @@ function setUpload(config, scheme, response, file, fileList) {
newValue = []
}
newValue.push({fileName: file.name, url: response.data})
this.$set(config, 'defaultValue', JSON.stringify(newValue))
this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
setValueLabel.call(this, {type: 'file', files: JSON.stringify(newValue)}, config, scheme)
this.$set(config, 'defaultValue', newValue)
this.$set(this[this.formConf.formModel], scheme.__vModel__, newValue)
setValueLabel.call(this, {type: 'file', files: newValue}, config, scheme)
}
function deleteUpload(config, scheme, file, fileList) {
@ -160,9 +160,9 @@ function deleteUpload(config, scheme, file, fileList) {
fileList.forEach(element => {
newValue.push({fileName: element.name, url: element.url})
})
this.$set(config, 'defaultValue', JSON.stringify(newValue))
this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
setValueLabel.call(this, {type: 'file', files: JSON.stringify(newValue)}, config, scheme)
this.$set(config, 'defaultValue', newValue)
this.$set(this[this.formConf.formModel], scheme.__vModel__, newValue)
setValueLabel.call(this, {type: 'file', files: newValue}, config, scheme)
}
function setValue(event, config, scheme) {

2
src/components/render/slots/el-carousel.js

@ -4,7 +4,7 @@ export default {
let style = 'height: 100%;'
conf.__slot__.options.forEach(item => {
list.push(<el-carousel-item style={'text-align: center;'}>
<span>{item.label}</span>
<p>{item.label}</p>
<el-image fit="contain" style={style} src={item.image}></el-image>
</el-carousel-item>)
})

4
src/router/modules/form.js

@ -2,7 +2,7 @@ export default [
{
path: '/project/form',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/newIndex.vue'),
component: () => import(/* webpackChunkName: 'root' */ '@/views/form'),
children: [
{
path: '',
@ -22,7 +22,7 @@ export default [
{
path: 'preview',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/PreView')
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/preview')
},
{
path: 'setting',

50
src/router/modules/project.js

@ -0,0 +1,50 @@
export default [
{
path: '/project',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/home'),
children: [
{
path: 'my',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/my/index')
},
{
path: 'recycle',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/recycle/index')
},
{
path: 'template',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/template/index')
},
{
path: 'template/preview',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/template/preview.vue')
}
]
},
{
path: '/project/view',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/preview/ProjectForm.vue')
},
{
path: '/project/public/result',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/statistics/public')
},
{
path: '/s/:key',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/write')
},
{
path: '/project/write',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/write')
}
]

66
src/router/modules/root.js

@ -54,27 +54,12 @@ export default [
{
path: '/home',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/home/NewIndex'),
component: () => import(/* webpackChunkName: 'root' */ '@/views/home'),
children: [
{
path: '/',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/MyProject')
},
{
path: 'my',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/MyProject')
},
{
path: 'recycle',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/RecycleBin')
},
{
path: 'template',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/template.vue')
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/my/index')
},
{
path: 'member',
@ -82,51 +67,6 @@ export default [
component: () => import(/* webpackChunkName: 'root' */ '@/views/account/member')
}
]
}, {
path: '/project',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/home/index.vue'),
children: [
{
path: 'create',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/template.vue')
},
{
path: 'my',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/MyProject.vue')
},
{
path: 'template/preview',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/project/TemplatePreview.vue')
}
// {
// path: 'form',
// meta: {requireLogin: true},
// component: () => import(/* webpackChunkName: 'root' */ '@/views/form/index1.vue')
// }
]
},
{
path: '/project/preview',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/PreView.vue')
}, {
path: '/project/view',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/ProjectForm.vue')
},
{
path: '/s/:key',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/write.vue')
},
{
path: '/project/write',
meta: {requireLogin: false},
component: () => import(/* webpackChunkName: 'root' */ '@/views/form/write.vue')
}
]

4
src/utils/constants.js

@ -4,5 +4,7 @@ export default {
// 密码正则
passwordReg: /^.{6,}$/,
passwordRegDesc: '密码最少为6位字符',
userUploadUrl: `${process.env.VUE_APP_API_ROOT}/user/file/upload`
userUploadUrl: `${process.env.VUE_APP_API_ROOT}/user/file/upload`,
// 启用微信功能
enableWx: process.env.VUE_APP_WX == 'ON'
}

4
src/utils/convert.js

@ -20,6 +20,7 @@ export function formItemConvertData(item, projectKey) {
'regList': item.__config__.regList,
'showLabel': item.__config__.showLabel,
'span': item.__config__.span,
'displayType': item.displayType,
'projectKey': projectKey
}
let expand = {}
@ -64,6 +65,7 @@ export function dbDataConvertForItemJson(data) {
jsonItem.dId = data.id
jsonItem.sort = data.sort
jsonItem.typeId = data.type
jsonItem.displayType = data.displayType
jsonItem.__config__.span = data.span
jsonItem.__config__.formId = data.formItemId
jsonItem.__config__.label = data.label
@ -97,7 +99,9 @@ const dataParams = {
// 单行文本
'INPUT': {
'prepend': '__slot__.prepend',
'prefixIcon': 'prefix-icon',
'maxlength': 'maxlength',
'showWordLimit': 'show-word-limit',
'append': '__slot__.append'
},
// 多行文本

1
src/utils/sign.js

@ -48,6 +48,7 @@ export default class sign {
let jsonObj = _.merge(urlParams, requestParams)
jsonObj = _.merge(jsonObj, dataParams)
let requestBody = this.sortAsc(jsonObj)
console.log(jsonObj)
return CryptoJS.MD5(constants.signSecret + JSON.stringify(requestBody)).toString().toLowerCase()
}

39
src/views/account/ForgetPwd.vue

@ -14,7 +14,7 @@
/>
</el-form-item>
<el-form-item label="" prop="code">
<el-input v-model="retrieveAccountForm.code" autocomplete="off" placeholder="请输入验证码" />
<el-input v-model="retrieveAccountForm.code" class="width50" autocomplete="off" placeholder="请输入验证码" />
<el-button :disabled="emailValidateCodeBtn" class="ml-20" type="primary"
@click="sendPhoneValidateCodeHandle"
>
@ -22,7 +22,7 @@
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="phoneRetrievePassWordHandle">
<el-button class="width-full" type="primary" @click="phoneRetrievePassWordHandle">
找回密码
</el-button>
</el-form-item>
@ -37,7 +37,7 @@
<el-input v-model="retrieveAccountForm.email" autocomplete="off" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="sendEmailValidateHandle">
<el-button class="width-full" type="primary" @click="sendEmailValidateHandle">
找回密码
</el-button>
</el-form-item>
@ -78,26 +78,14 @@
没有收到邮件请检查您的垃圾邮件或者重新发送
</p>
</div>
<Verify
ref="verify"
:captcha-type="'blockPuzzle'"
:img-size="{ width: '330px', height: '155px' }"
:mode="'pop'"
@success="verifySuccessHandle"
/>
</div>
</template>
<script>
//
import Verify from '@/components/verifition/Verify'
import constants from '@/utils/constants'
export default {
name: 'RetrievePwd',
components: {
Verify
},
data() {
let validateRePass = (rule, value, callback) => {
if (value === '') {
@ -168,12 +156,11 @@ export default {
sendPhoneValidateCodeHandle() {
this.$refs['phoneForm'].validateField('phoneNumber', err => {
if (!err) {
this.$refs.verify.show()
this.sendPhoneValidateCode()
}
})
},
sendPhoneValidateCode(params) {
let slideCode = params.captchaVerification
sendPhoneValidateCode() {
let phoneNumber = this.retrieveAccountForm.phoneNumber
this.$refs['phoneForm'].validateField('phoneNumber', err => {
if (!err) {
@ -181,7 +168,7 @@ export default {
this.$api.request({
url: '/retrieve/password/phone/code',
method: 'get',
params: {slideCode: slideCode, phoneNumber: phoneNumber}
params: {phoneNumber: phoneNumber}
}).then(() => {
this.msgSuccess('验证码发送成功,5分钟内有效')
this.emailValidateCodeBtn = true
@ -230,30 +217,22 @@ export default {
sendEmailValidateHandle() {
this.$refs['emailForm'].validateField('email', err => {
if (!err) {
this.$refs.verify.show()
this.sendEmailValidate()
}
})
},
sendEmailValidate(params) {
let slideCode = params.captchaVerification
sendEmailValidate() {
this.$refs['emailForm'].validate(valid => {
if (valid) {
this.$api.request({
url: '/retrieve/password/email',
method: 'get',
params: {slideCode: slideCode, email: this.retrieveAccountForm.email}
params: {email: this.retrieveAccountForm.email}
}).then(() => {
this.retrieveStep = 3
})
}
})
},
verifySuccessHandle(params) {
if (this.retrieveType == 'phone') {
this.sendPhoneValidateCode(params)
} else {
this.sendEmailValidate(params)
}
}
}
}

110
src/views/account/login.vue

@ -1,20 +1,20 @@
<template>
<div class="login-container">
<el-row class="login-body">
<el-col :span="5" :offset="4">
<el-col :offset="4" :span="5">
<img class="login-img" src="@/assets/images/5b968a75b5e42.png">
</el-col>
<el-col :offset="3" :span="10">
<el-tabs v-if="formType=='login'"
v-model="loginType" class="login-form-tab"
>
<el-tab-pane label="微信扫码登录" name="wx">
<el-tab-pane v-if="enableWx" label="微信扫码登录" name="wx">
<div class="wx-login">
<div>
<el-image
v-loading="wxQrCodeLoading"
class="wx-login-qrcode"
:src="wxLoginQrCode"
class="wx-login-qrcode"
fit="fill"
@load="(e)=>{
this.wxQrCodeLoading=false
@ -22,8 +22,8 @@
/>
</div>
<div>
<el-link icon="el-icon-refresh-left"
:underline="false"
<el-link :underline="false"
icon="el-icon-refresh-left"
@click="getLoginWxQrCode"
>
刷新二维码
@ -39,10 +39,10 @@
<el-link class="login-tip" @click="()=>{this.formType='reg'}">立即注册</el-link>
</el-link>
</el-col>
<el-col :span="9" :offset="3">
<el-col :offset="3" :span="9">
<div class="other-login">
<span @click="redirectUrl(qqLoginAuthorizeUrl)">
<svg-icon name="loginQQ" class="other-login-icon" />
<svg-icon class="other-login-icon" name="loginQQ" />
</span>
</div>
</el-col>
@ -57,23 +57,24 @@
</div>
</el-tab-pane>
<el-tab-pane label="账号密码登录" name="account">
<el-form ref="accountLoginForm" label-position="top" size="small" :model="accountForm"
:rules="accountLoginRules"
status-icon
hide-required-asterisk
<el-form ref="accountLoginForm" :model="accountForm" :rules="accountLoginRules"
class="account-login-form"
hide-required-asterisk
label-position="top"
size="small"
status-icon
@keyup.enter.native="loginHandle"
>
<el-form-item label="手机号/邮箱登录" prop="account">
<el-input v-model="accountForm.account" placeholder="请输入手机号/邮箱" autocomplete="off" />
<el-input v-model="accountForm.account" autocomplete="off" placeholder="请输入手机号/邮箱" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="accountForm.password" placeholder="请输入密码" autocomplete="off"
<el-input v-model="accountForm.password" autocomplete="off" placeholder="请输入密码"
show-password
/>
</el-form-item>
<el-form-item label="">
<el-row type="flex" align="middle">
<el-row align="middle" type="flex">
<el-col :span="3">
<el-radio v-model="agreeProtocol" label="" />
</el-col>
@ -81,12 +82,12 @@
<span class="protocol-tip">我已同意</span>
</el-col>
<el-col :span="10">
<el-link :underline="false" type="primary" class="protocol-tip">
<el-link :underline="false" class="protocol-tip" type="primary">
TDuck用户服务协议
</el-link>
</el-col>
<el-col :span="6" :offset="1">
<el-link :underline="false" type="primary" class="protocol-tip"
<el-col :offset="1" :span="6">
<el-link :underline="false" class="protocol-tip" type="primary"
@click="toForgetPwdHandle"
>
忘记密码
@ -98,12 +99,12 @@
<el-button class="width-full" type="primary" @click="loginHandle">登录</el-button>
</el-form-item>
<el-form-item>
<el-row type="flex" align="middle">
<el-col :span="8" :offset="6">
<el-row align="middle" type="flex">
<el-col :offset="6" :span="8">
<span class="protocol-tip">使用第三方登录 </span>
</el-col>
<el-col :span="6">
<el-link :underline="false" type="primary" class="protocol-tip"
<el-link :underline="false" class="protocol-tip" type="primary"
@click="()=>{this.formType='reg'}"
>
立即注册
@ -114,10 +115,10 @@
<el-col :offset="8">
<div class="other-login">
<span @click="redirectUrl(qqLoginAuthorizeUrl)">
<svg-icon name="loginQQ" class="other-login-icon" />
<svg-icon class="other-login-icon" name="loginQQ" />
</span>
<svg-icon name="loginWx"
class="other-login-icon"
<svg-icon class="other-login-icon"
name="loginWx"
@click="()=>{
this.formType='login'
this.loginType='wx'
@ -136,53 +137,53 @@
<el-tab-pane label="手机号注册" name="regPhone">
<el-form ref="phoneRegForm" :model="accountForm" :rules="phoneRegRules" label-width="0px">
<el-form-item label="" prop="phoneNumber">
<el-input v-model="accountForm.phoneNumber" placeholder="请输入手机号" autocomplete="off" />
<el-input v-model="accountForm.phoneNumber" autocomplete="off" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="" prop="password">
<el-input v-model="accountForm.password" show-password placeholder="请输入密码"
autocomplete="off"
<el-input v-model="accountForm.password" autocomplete="off" placeholder="请输入密码"
show-password
/>
</el-form-item>
<el-form-item label="" prop="code">
<el-input v-model="accountForm.code" class="code-input" placeholder="请输入验证码"
autocomplete="off"
<el-input v-model="accountForm.code" autocomplete="off" class="code-input"
placeholder="请输入验证码"
/>
<el-button class="ml-20" :disabled="phoneValidateCodeBtn" type="primary"
<el-button :disabled="phoneValidateCodeBtn" class="ml-20" type="primary"
@click="sendPhoneCodeHandle"
>
{{ phoneValidateCodeBtnText }}
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="width-full" @click="phoneRegHandle">确定</el-button>
<el-button class="width-full" type="primary" @click="phoneRegHandle">确定</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
<el-tab-pane label="邮箱注册" name="regEmail">
<el-form ref="emailRegForm" status-icon :rules="emailRegRules" :model="accountForm"
label-width="0px"
<el-form ref="emailRegForm" :model="accountForm" :rules="emailRegRules" label-width="0px"
status-icon
>
<el-form-item label="" prop="email">
<el-input v-model="accountForm.email" placeholder="请输入邮箱" autocomplete="off" />
<el-input v-model="accountForm.email" autocomplete="off" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="" prop="password">
<el-input v-model="accountForm.password" show-password placeholder="请输入密码"
autocomplete="off"
<el-input v-model="accountForm.password" autocomplete="off" placeholder="请输入密码"
show-password
/>
</el-form-item>
<el-form-item label="" prop="code">
<el-input v-model="accountForm.code" oninput="value=value.replace(/[^\d]/g,'')"
class="code-input" maxlength="4" placeholder="请输入验证码"
autocomplete="off"
<el-input v-model="accountForm.code" autocomplete="off"
class="code-input" maxlength="4" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="请输入验证码"
/>
<el-button class="ml-20" :disabled="emailValidateCodeBtn" type="primary"
<el-button :disabled="emailValidateCodeBtn" class="ml-20" type="primary"
@click="sendEmailCodeHandle"
>
{{ emailValidateCodeBtnText }}
</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" class="width-full" @click="emailRegHandle">确定</el-button>
<el-button class="width-full" type="primary" @click="emailRegHandle">确定</el-button>
</el-form-item>
</el-form>
</el-tab-pane>
@ -191,10 +192,10 @@
<el-link class="ml-20" @click="registerHandleClick">立即注册</el-link>
<div class="other-login">
<span @click="redirectUrl(qqLoginAuthorizeUrl)">
<svg-icon name="loginQQ" class="other-login-icon" />
<svg-icon class="other-login-icon" name="loginQQ" />
</span>
<svg-icon name="loginWx"
class="other-login-icon"
<svg-icon class="other-login-icon"
name="loginWx"
@click="()=>{
this.formType='login',
this.loginType='wx'
@ -292,16 +293,25 @@ export default {
qqLoginAuthorizeUrl: ''
}
},
computed: {
enableWx() {
return constants.enableWx
}
},
watch: {},
created() {
this.getLoginWxQrCode()
this.refreshWxQrcodeTimer = setInterval(() => {
if (constants.enableWx) {
this.getLoginWxQrCode()
}, 5 * 60 * 1000)
// this.wxQrcodeResultTimer = setInterval(() => {
// this.getLoginWxQrCodeResult()
// }, 5 * 1000)
this.getQQLoginAuthorizeUrl()
this.refreshWxQrcodeTimer = setInterval(() => {
this.getLoginWxQrCode()
}, 5 * 60 * 1000)
this.wxQrcodeResultTimer = setInterval(() => {
this.getLoginWxQrCodeResult()
}, 5 * 1000)
this.getQQLoginAuthorizeUrl()
} else {
this.loginType = 'account'
}
},
destroyed() {
clearInterval(this.refreshWxQrcodeTimer)

0
src/views/form/DraggableItem.vue → src/views/form/editor/DraggableItem.vue

0
src/views/form/IconsDialog.vue → src/views/form/editor/IconsDialog.vue

223
src/views/form/RightPanel.vue → src/views/form/editor/RightPanel.vue

@ -1,7 +1,7 @@
<template>
<div class="right-board">
<el-tabs v-model="currentTab" class="center-tabs">
<el-tab-pane label="组件属性" name="field"/>
<el-tab-pane label="组件属性" name="field" />
</el-tabs>
<div class="field-box">
<el-scrollbar class="right-scrollbar">
@ -21,7 +21,7 @@
:label="item.__config__.label"
:value="item.__config__.tagIcon"
>
<svg-icon :name="item.__config__.tagIcon" class="node-icon"/>
<svg-icon :name="item.__config__.tagIcon" class="node-icon" />
<!-- <svg-icon class="node-icon" :icon-class="item.__config__.tagIcon" />-->
<span> {{ item.__config__.label }}{{ item.__config__.tagIcon }}</span>
</el-option>
@ -38,16 +38,16 @@
v-if="activeData.__config__.label!==undefined&&activeData.__config__.showLabel!==false"
label="标题"
>
<el-input v-model="activeData.__config__.label" placeholder="请输入标题" @input="changeRenderKey"/>
<el-input v-model="activeData.__config__.label" placeholder="请输入标题" @input="changeRenderKey" />
</el-form-item>
<el-form-item v-if="activeData.placeholder!==undefined" label="占位提示">
<el-input v-model="activeData.placeholder" placeholder="请输入占位提示" @input="changeRenderKey"/>
<el-input v-model="activeData.placeholder" placeholder="请输入占位提示" @input="changeRenderKey" />
</el-form-item>
<el-form-item v-if="activeData['start-placeholder']!==undefined" label="开始占位">
<el-input v-model="activeData['start-placeholder']" placeholder="请输入占位提示"/>
<el-input v-model="activeData['start-placeholder']" placeholder="请输入占位提示" />
</el-form-item>
<el-form-item v-if="activeData['end-placeholder']!==undefined" label="结束占位">
<el-input v-model="activeData['end-placeholder']" placeholder="请输入占位提示"/>
<el-input v-model="activeData['end-placeholder']" placeholder="请输入占位提示" />
</el-form-item>
<el-form-item v-if="activeData.__config__.span!==undefined" label="表单栅格">
<el-slider v-model="activeData.__config__.span" :marks="{12:''}" :max="24" :min="1"
@ -57,14 +57,14 @@
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.gutter!==undefined"
label="栅格间隔"
>
<el-input-number v-model="activeData.gutter" :min="0" placeholder="栅格间隔"/>
<el-input-number v-model="activeData.gutter" :min="0" placeholder="栅格间隔" />
</el-form-item>
<el-form-item v-if="activeData.__config__.layout==='rowFormItem'&&activeData.type!==undefined"
label="布局模式"
>
<el-radio-group v-model="activeData.type">
<el-radio-button label="default"/>
<el-radio-button label="flex"/>
<el-radio-button label="default" />
<el-radio-button label="flex" />
</el-radio-group>
</el-form-item>
<el-form-item v-if="activeData.justify!==undefined&&activeData.type==='flex'" label="水平排列">
@ -79,9 +79,9 @@
</el-form-item>
<el-form-item v-if="activeData.align!==undefined&&activeData.type==='flex'" label="垂直排列">
<el-radio-group v-model="activeData.align">
<el-radio-button label="top"/>
<el-radio-button label="middle"/>
<el-radio-button label="bottom"/>
<el-radio-button label="top" />
<el-radio-button label="middle" />
<el-radio-button label="bottom" />
</el-radio-group>
</el-form-item>
<!-- <el-form-item v-if="activeData.__config__.labelWidth!==undefined" label="标签宽度">-->
@ -118,10 +118,10 @@
/>
</el-form-item>
<el-form-item v-if="activeData.__slot__&&activeData.__slot__.prepend!==undefined" label="前缀">
<el-input v-model="activeData.__slot__.prepend" placeholder="请输入前缀"/>
<el-input v-model="activeData.__slot__.prepend" placeholder="请输入前缀" />
</el-form-item>
<el-form-item v-if="activeData.__slot__&&activeData.__slot__.append!==undefined" label="后缀">
<el-input v-model="activeData.__slot__.append" placeholder="请输入后缀"/>
<el-input v-model="activeData.__slot__.append" placeholder="请输入后缀" />
</el-form-item>
<el-form-item v-if="activeData['prefix-icon']!==undefined" label="前图标">
<el-input v-model="activeData['prefix-icon']" placeholder="请输入前图标名称">
@ -148,28 +148,28 @@
</el-input>
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-cascader'" label="选项分隔符">
<el-input v-model="activeData.separator" placeholder="请输入选项分隔符"/>
<el-input v-model="activeData.separator" placeholder="请输入选项分隔符" />
</el-form-item>
<el-form-item v-if="activeData.autosize !== undefined" label="最小行数">
<el-input-number v-model="activeData.autosize.minRows" :min="1" placeholder="最小行数"/>
<el-input-number v-model="activeData.autosize.minRows" :min="1" placeholder="最小行数" />
</el-form-item>
<el-form-item v-if="activeData.autosize !== undefined" label="最大行数">
<el-input-number v-model="activeData.autosize.maxRows" :min="1" placeholder="最大行数"/>
<el-input-number v-model="activeData.autosize.maxRows" :min="1" placeholder="最大行数" />
</el-form-item>
<el-form-item v-if="isShowMin" label="最小值">
<el-input-number v-model="activeData.min" placeholder="最小值"/>
<el-input-number v-model="activeData.min" placeholder="最小值" />
</el-form-item>
<el-form-item v-if="isShowMax" label="最大值">
<el-input-number v-model="activeData.max" placeholder="最大值"/>
<el-input-number v-model="activeData.max" placeholder="最大值" />
</el-form-item>
<el-form-item v-if="activeData.height!==undefined" label="组件高度">
<el-input-number v-model="activeData.height" placeholder="高度" @input="changeRenderKey"/>
<el-input-number v-model="activeData.height" placeholder="高度" @input="changeRenderKey" />
</el-form-item>
<el-form-item v-if="isShowStep" label="步长">
<el-input-number v-model="activeData.step" placeholder="步数"/>
<el-input-number v-model="activeData.step" placeholder="步数" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-input-number'" label="精度">
<el-input-number v-model="activeData.precision" :min="0" placeholder="精度"/>
<el-input-number v-model="activeData.precision" :min="0" placeholder="精度" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-input-number'" label="按钮位置">
<el-radio-group v-model="activeData['controls-position']">
@ -189,10 +189,10 @@
</el-input>
</el-form-item>
<el-form-item v-if="activeData['active-text'] !== undefined" label="开启提示">
<el-input v-model="activeData['active-text']" placeholder="请输入开启提示"/>
<el-input v-model="activeData['active-text']" placeholder="请输入开启提示" />
</el-form-item>
<el-form-item v-if="activeData['inactive-text'] !== undefined" label="关闭提示">
<el-input v-model="activeData['inactive-text']" placeholder="请输入关闭提示"/>
<el-input v-model="activeData['inactive-text']" placeholder="请输入关闭提示" />
</el-form-item>
<el-form-item v-if="activeData['active-value'] !== undefined" label="开启值">
<el-input
@ -236,13 +236,13 @@
clearable
placeholder="请选择文件类型"
>
<el-option label="图片" value="image/*"/>
<el-option label="视频" value="video/*"/>
<el-option label="音频" value="audio/*"/>
<el-option label="excel" value=".xls,.xlsx"/>
<el-option label="word" value=".doc,.docx"/>
<el-option label="pdf" value=".pdf"/>
<el-option label="txt" value=".txt"/>
<el-option label="图片" value="image/*" />
<el-option label="视频" value="video/*" />
<el-option label="音频" value="audio/*" />
<el-option label="excel" value=".xls,.xlsx" />
<el-option label="word" value=".doc,.docx" />
<el-option label="pdf" value=".pdf" />
<el-option label="txt" value=".txt" />
</el-select>
</el-form-item>
<el-form-item v-if="activeData.__config__.fileSize !== undefined" label="文件大小">
@ -250,9 +250,9 @@
<el-select slot="append" v-model="activeData.__config__.sizeUnit"
:style="{ width: '66px' }"
>
<el-option label="KB" value="KB"/>
<el-option label="MB" value="MB"/>
<el-option label="GB" value="GB"/>
<el-option label="KB" value="KB" />
<el-option label="MB" value="MB" />
<el-option label="GB" value="GB" />
</el-select>
</el-input>
</el-form-item>
@ -277,12 +277,12 @@
label="按钮类型"
>
<el-select v-model="activeData.type" :style="{ width: '100%' }">
<el-option label="primary" value="primary"/>
<el-option label="success" value="success"/>
<el-option label="warning" value="warning"/>
<el-option label="danger" value="danger"/>
<el-option label="info" value="info"/>
<el-option label="text" value="text"/>
<el-option label="primary" value="primary" />
<el-option label="success" value="success" />
<el-option label="warning" value="warning" />
<el-option label="danger" value="danger" />
<el-option label="info" value="info" />
<el-option label="text" value="text" />
</el-select>
</el-form-item>
<el-form-item
@ -290,16 +290,16 @@
v-show="'picture-card' !== activeData['list-type']"
label="按钮文字"
>
<el-input v-model="activeData.__config__.buttonText" placeholder="请输入按钮文字"/>
<el-input v-model="activeData.__config__.buttonText" placeholder="请输入按钮文字" />
</el-form-item>
<el-form-item
v-if="activeData.__config__.tag === 'el-button'"
label="按钮文字"
>
<el-input v-model="activeData.__slot__.default" placeholder="请输入按钮文字"/>
<el-input v-model="activeData.__slot__.default" placeholder="请输入按钮文字" />
</el-form-item>
<el-form-item v-if="activeData['range-separator'] !== undefined" label="分隔符">
<el-input v-model="activeData['range-separator']" placeholder="请输入分隔符"/>
<el-input v-model="activeData['range-separator']" placeholder="请输入分隔符" />
</el-form-item>
<el-form-item v-if="activeData['picker-options'] !== undefined" label="时间段">
<el-input
@ -326,9 +326,9 @@
>
<div v-for="(item, index) in activeData.__slot__.options" :key="index" class="select-item">
<div class="select-line-icon option-drag">
<i class="el-icon-s-operation"/>
<i class="el-icon-s-operation" />
</div>
<el-input v-model="item.label" placeholder="选项名" size="small"/>
<el-input v-model="item.label" placeholder="选项名" size="small" />
<!-- <el-input-->
<!-- placeholder="选项值"-->
<!-- size="small"-->
@ -338,7 +338,7 @@
<div class="close-btn select-line-icon"
@click="activeData.__slot__.options.splice(index, 1)"
>
<i class="el-icon-remove-outline"/>
<i class="el-icon-remove-outline" />
</div>
</div>
</draggable>
@ -361,7 +361,7 @@
添加其他
</el-button>
</div>
<el-divider/>
<el-divider />
</template>
<template
@ -376,19 +376,19 @@
>
<div v-for="(item, index) in activeData.__slot__.options" :key="index" class="select-item">
<div class="select-line-icon option-drag">
<i class="el-icon-s-operation"/>
<i class="el-icon-s-operation" />
</div>
<div class="width-full">
<div class="flex-row">
<el-input v-model="item.label" placeholder="选项名" size="small"/>
<el-input v-model="item.label" placeholder="选项名" size="small" />
<div class="close-btn select-line-icon"
@click="activeData.__slot__.options.splice(index, 1)"
>
<i class="el-icon-remove-outline"/>
<i class="el-icon-remove-outline" />
</div>
</div>
<div class="flex-row">
<el-input v-model="item.image" placeholder="图片" size="small"/>
<el-input v-model="item.image" placeholder="图片" size="small" />
<el-upload
ref="logoUpload"
:action="getUploadUrl"
@ -401,9 +401,10 @@
}"
:show-file-list="false"
accept=".jpg,.jpeg,.png,.gif,.bmp,.JPG,.JPEG,.PBG,.GIF,.BMP"
style="text-align: center;">
style="text-align: center;"
>
<div slot="trigger" class=" select-line-icon">
<i class="el-icon-upload"/>
<i class="el-icon-upload" />
</div>
</el-upload>
</div>
@ -420,7 +421,7 @@
添加选项
</el-button>
</div>
<el-divider/>
<el-divider />
</template>
<template
v-if="['image-select'].indexOf(activeData.__config__.tag) > -1"
@ -434,19 +435,19 @@
>
<div v-for="(item, index) in activeData.options" :key="index" class="select-item">
<div class="select-line-icon option-drag">
<i class="el-icon-s-operation"/>
<i class="el-icon-s-operation" />
</div>
<div class="width-full">
<div class="flex-row">
<el-input v-model="item.label" placeholder="选项名" size="small"/>
<el-input v-model="item.label" placeholder="选项名" size="small" />
<div class="close-btn select-line-icon"
@click="activeData.options.splice(index, 1)"
>
<i class="el-icon-remove-outline"/>
<i class="el-icon-remove-outline" />
</div>
</div>
<div class="flex-row">
<el-input v-model="item.image" placeholder="图片" size="small"/>
<el-input v-model="item.image" placeholder="图片" size="small" />
<el-upload
ref="logoUpload"
:action="getUploadUrl"
@ -459,9 +460,10 @@
}"
:show-file-list="false"
accept=".jpg,.jpeg,.png,.gif,.bmp,.JPG,.JPEG,.PBG,.GIF,.BMP"
style="text-align: center;">
style="text-align: center;"
>
<div slot="trigger" class=" select-line-icon">
<i class="el-icon-upload"/>
<i class="el-icon-upload" />
</div>
</el-upload>
</div>
@ -478,7 +480,7 @@
添加选项
</el-button>
</div>
<el-divider/>
<el-divider />
</template>
<template v-if="['el-cascader'].indexOf(activeData.__config__.tag) > -1">
<el-divider>选项</el-divider>
@ -546,7 +548,7 @@
添加父级
</el-button>
</div>
<el-divider/>
<el-divider />
</template>
<el-form-item v-if="activeData.__config__.optionType !== undefined" label="选项样式">
@ -560,34 +562,34 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="activeData['active-color'] !== undefined" label="开启颜色">
<el-color-picker v-model="activeData['active-color']"/>
<el-color-picker v-model="activeData['active-color']" />
</el-form-item>
<el-form-item v-if="activeData['inactive-color'] !== undefined" label="关闭颜色">
<el-color-picker v-model="activeData['inactive-color']"/>
<el-color-picker v-model="activeData['inactive-color']" />
</el-form-item>
<el-form-item v-if="activeData.__config__.showLabel !== undefined
&& activeData.__config__.labelWidth !== undefined" label="显示标签"
>
<el-switch v-model="activeData.__config__.showLabel"/>
<el-switch v-model="activeData.__config__.showLabel" />
</el-form-item>
<el-form-item v-if="activeData.branding !== undefined" label="品牌烙印">
<el-switch v-model="activeData.branding" @input="changeRenderKey"/>
<el-switch v-model="activeData.branding" @input="changeRenderKey" />
</el-form-item>
<el-form-item v-if="activeData['allow-half'] !== undefined" label="允许半选">
<el-switch v-model="activeData['allow-half']"/>
<el-switch v-model="activeData['allow-half']" />
</el-form-item>
<el-form-item v-if="activeData['show-text'] !== undefined" label="辅助文字">
<el-switch v-model="activeData['show-text']" @change="rateTextChange"/>
<el-switch v-model="activeData['show-text']" @change="rateTextChange" />
</el-form-item>
<el-form-item v-if="activeData['show-score'] !== undefined" label="显示分数">
<el-switch v-model="activeData['show-score']" @change="rateScoreChange"/>
<el-switch v-model="activeData['show-score']" @change="rateScoreChange" />
</el-form-item>
<el-form-item v-if="activeData['show-stops'] !== undefined" label="显示间断点">
<el-switch v-model="activeData['show-stops']"/>
<el-switch v-model="activeData['show-stops']" />
</el-form-item>
<el-form-item v-if="activeData.range !== undefined" label="范围选择">
<el-switch v-model="activeData.range" @change="rangeChange"/>
<el-switch v-model="activeData.range" @change="rangeChange" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-color-picker'" label="颜色格式">
<el-select
@ -608,7 +610,7 @@
<el-form-item
v-if="activeData.size !== undefined &&
(
activeData.__config__.border ||
activeData.__config__.border ||
activeData.__config__.tag === 'el-color-picker' ||
activeData.__config__.tag === 'el-button')"
label="组件尺寸"
@ -626,52 +628,52 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="activeData['show-word-limit'] !== undefined" label="输入统计">
<el-switch v-model="activeData['show-word-limit']"/>
<el-switch v-model="activeData['show-word-limit']" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-input-number'" label="严格步数">
<el-switch v-model="activeData['step-strictly']"/>
<el-switch v-model="activeData['step-strictly']" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-cascader'" label="任选层级">
<el-switch v-model="activeData.props.props.checkStrictly"/>
<el-switch v-model="activeData.props.props.checkStrictly" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-cascader'" label="是否多选">
<el-switch v-model="activeData.props.props.multiple"/>
<el-switch v-model="activeData.props.props.multiple" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-cascader'" label="展示全路径">
<el-switch v-model="activeData['show-all-levels']"/>
<el-switch v-model="activeData['show-all-levels']" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-cascader'" label="可否筛选">
<el-switch v-model="activeData.filterable"/>
<el-switch v-model="activeData.filterable" />
</el-form-item>
<el-form-item v-if="activeData.clearable !== undefined" label="能否清空">
<el-switch v-model="activeData.clearable"/>
<el-switch v-model="activeData.clearable" />
</el-form-item>
<el-form-item v-if="activeData.__config__.showTip !== undefined" label="显示提示">
<el-switch v-model="activeData.__config__.showTip"/>
<el-switch v-model="activeData.__config__.showTip" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-upload'" label="多选文件">
<el-switch v-model="activeData.multiple"/>
<el-switch v-model="activeData.multiple" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-upload'" label="文件个数">
<el-input-number v-model="activeData.limit"/>
<el-input-number v-model="activeData.limit" />
</el-form-item>
<!-- <el-form-item v-if="activeData['auto-upload'] !== undefined" label="自动上传">-->
<!-- <el-switch v-model="activeData['auto-upload']" />-->
<!-- </el-form-item>-->
<el-form-item v-if="activeData.readonly !== undefined" label="是否只读">
<el-switch v-model="activeData.readonly"/>
<el-switch v-model="activeData.readonly" />
</el-form-item>
<el-form-item v-if="activeData.disabled !== undefined" label="是否禁用">
<el-switch v-model="activeData.disabled"/>
<el-switch v-model="activeData.disabled" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-select'" label="能否搜索">
<el-switch v-model="activeData.filterable"/>
<el-switch v-model="activeData.filterable" />
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-select'" label="是否多选">
<el-switch v-model="activeData.multiple" @change="multipleChange"/>
<el-switch v-model="activeData.multiple" @change="multipleChange" />
</el-form-item>
<el-form-item v-if="activeData['color'] !== undefined" label="颜色">
<el-color-picker v-model="activeData['color']"/>
<el-color-picker v-model="activeData['color']" />
</el-form-item>
<el-form-item v-if="activeData['textAlign'] !== undefined" label="对齐方式">
<el-radio-group v-model="activeData.textAlign">
@ -687,7 +689,7 @@
</el-radio-group>
</el-form-item>
<el-form-item v-if="activeData.__config__.tag === 'el-image'" label="图片地址">
<el-input v-model="activeData.src" placeholder="请输入图片url地址"/>
<el-input v-model="activeData.src" placeholder="请输入图片url地址" />
<el-upload
ref="logoUpload"
:action="getUploadUrl"
@ -708,7 +710,7 @@
v-if="activeData.__config__.required !== undefined&&activeData.__config__.showRequired!==false"
label="是否必填"
>
<el-switch v-model="activeData.__config__.required"/>
<el-switch v-model="activeData.__config__.required" />
</el-form-item>
<template v-if="activeData.__config__.layoutTree">
@ -723,7 +725,8 @@
<span slot-scope="{ node, data }">
<span class="node-label">
<svg-icon :name="data.__config__?data.__config__.tagIcon:data.tagIcon"
class="node-icon"/>
class="node-icon"
/>
{{ node.label }}
</span>
</span>
@ -740,13 +743,13 @@
class="reg-item"
>
<span class="close-btn" @click="activeData.__config__.regList.splice(index, 1)">
<i class="el-icon-close"/>
<i class="el-icon-close" />
</span>
<el-form-item label="表达式">
<el-input v-model="item.pattern" placeholder="请输入正则"/>
<el-input v-model="item.pattern" placeholder="请输入正则" />
</el-form-item>
<el-form-item label="错误提示" style="margin-bottom: 0;">
<el-input v-model="item.message" placeholder="请输入错误提示"/>
<el-input v-model="item.message" placeholder="请输入错误提示" />
</el-form-item>
</div>
<div style="margin-left: 20px;">
@ -758,13 +761,13 @@
</el-form>
<el-form v-show="currentTab === 'form'" label-width="90px" size="small">
<el-form-item label="表单名">
<el-input v-model="formConf.formRef" placeholder="请输入表单名(ref)"/>
<el-input v-model="formConf.formRef" placeholder="请输入表单名(ref)" />
</el-form-item>
<el-form-item label="表单模型">
<el-input v-model="formConf.formModel" placeholder="请输入数据模型"/>
<el-input v-model="formConf.formModel" placeholder="请输入数据模型" />
</el-form-item>
<el-form-item label="校验模型">
<el-input v-model="formConf.formRules" placeholder="请输入校验模型"/>
<el-input v-model="formConf.formRules" placeholder="请输入校验模型" />
</el-form-item>
<el-form-item label="表单尺寸">
<el-radio-group v-model="formConf.size">
@ -793,33 +796,33 @@
</el-radio-group>
</el-form-item>
<el-form-item label="标签宽度">
<el-input v-model.number="formConf.labelWidth" placeholder="请输入标签宽度" type="number"/>
<el-input v-model.number="formConf.labelWidth" placeholder="请输入标签宽度" type="number" />
</el-form-item>
<el-form-item label="栅格间隔">
<el-input-number v-model="formConf.gutter" :min="0" placeholder="栅格间隔"/>
<el-input-number v-model="formConf.gutter" :min="0" placeholder="栅格间隔" />
</el-form-item>
<el-form-item label="禁用表单">
<el-switch v-model="formConf.disabled"/>
<el-switch v-model="formConf.disabled" />
</el-form-item>
<el-form-item label="表单按钮">
<el-switch v-model="formConf.formBtns"/>
<el-switch v-model="formConf.formBtns" />
</el-form-item>
<el-form-item label="显示未选中组件边框">
<el-switch v-model="formConf.unFocusedComponentBorder"/>
<el-switch v-model="formConf.unFocusedComponentBorder" />
</el-form-item>
</el-form>
</el-scrollbar>
</div>
<treeNode-dialog :visible.sync="dialogVisible" title="添加选项" @commit="addNode"/>
<icons-dialog :current="activeData[currentIconModel]" :visible.sync="iconsVisible" @select="setIcon"/>
<treeNode-dialog :visible.sync="dialogVisible" title="添加选项" @commit="addNode" />
<icons-dialog :current="activeData[currentIconModel]" :visible.sync="iconsVisible" @select="setIcon" />
</div>
</template>
<script>
import {isArray} from 'util'
import TreeNodeDialog from '@/views/form/TreeNodeDialog'
import {isNumberStr} from '@/utils/index'
import TreeNodeDialog from '@/views/form/editor/TreeNodeDialog'
import {isNumberStr} from '@/utils'
import IconsDialog from './IconsDialog'
import {imageComponents, inputComponents, selectComponents} from '@/components/generator/config'
import {saveFormConf} from '@/utils/db'
@ -1028,7 +1031,7 @@ export default {
})
},
addImageSelectItem() {
let lastItem = _.last(this.activeData.__slot__.options)
let lastItem = _.last(this.activeData.options)
this.activeData.options.push({
label: '',
image: '',
@ -1079,12 +1082,12 @@ export default {
<span>{node.label}</span>
<span class="node-operation">
<i on-click={() => this.append(data)}
class="el-icon-plus"
title="添加"
class="el-icon-plus"
title="添加"
></i>
<i on-click={() => this.remove(node, data)}
class="el-icon-delete"
title="删除"
class="el-icon-delete"
title="删除"
></i>
</span>
</div>

2
src/views/form/TreeNodeDialog.vue → src/views/form/editor/TreeNodeDialog.vue

@ -71,7 +71,7 @@
</div>
</template>
<script>
import { isNumberStr } from '@/utils/index'
import { isNumberStr } from '@/utils'
import { getTreeNodeId, saveTreeNodeId } from '@/utils/db'
const id = getTreeNodeId()

2
src/views/form/editor.vue → src/views/form/editor/index.vue

@ -119,7 +119,7 @@ import {
personalInfoComponents,
selectComponents
} from '@/components/generator/config'
import {deepClone} from '@/utils/index'
import {deepClone} from '@/utils'
import {dbDataConvertForItemJson, formItemConvertData} from '@/utils/convert'
import drawingDefalut from '@/components/generator/drawingDefalut'
import DraggableItem from './DraggableItem'

202
src/views/form/index.vue

@ -1,85 +1,165 @@
<template>
<div class="container" style="overflow-y: hidden !important;">
<el-row type="flex" align="middle" justify="justify">
<el-col :offset="1" :span="4">
<el-button size="mini" round @click="$router.back(-1)">
<i class="el-icon-arrow-left" />
返回
</el-button>
</el-col>
<el-col :span="10" :offset="3">
<el-menu :default-active="activeTab" style="background-color: transparent;" mode="horizontal"
@select="handleSelect"
<div class="form-index-container">
<el-card class="header-container">
<el-row align="middle" type="flex">
<el-col :span="2">
<i class="el-icon-back" @click="$router.back(-1)" />
</el-col>
<el-col :span="3">
<img class="header-logo" src="@/assets/images/indexLogo.png" @click="$router.push({path:'/home'})">
</el-col>
<el-col :span="1">
<el-button type="primary">编辑</el-button>
</el-col>
<el-col :span="2">
<el-button type="success">保存为模板</el-button>
</el-col>
</el-row>
</el-card>
<div class="main-container">
<div class="left-menu-container">
<el-menu :collapse="isCollapse" class="el-menu-vertical"
:default-active="defaultActiveMenu"
@select="menuSelectHandle"
>
<el-menu-item index="editor">编辑</el-menu-item>
<el-menu-item index="logic">逻辑</el-menu-item>
<el-menu-item index="theme">外观</el-menu-item>
<el-menu-item index="setting">设置</el-menu-item>
<el-menu-item index="publish">发布</el-menu-item>
<el-menu-item index="statistics">统计</el-menu-item>
<el-menu-item v-for="menuItem in menuItemList" :key="menuItem.route" :index="menuItem.route">
<i :class="menuItem.icon" />
<span slot="title">{{ menuItem.title }}</span>
</el-menu-item>
</el-menu>
</el-col>
</el-row>
<div v-if="projectKey">
<editor v-if="activeTab=='editor'" :project-key="projectKey" :is-edit="isEdit" />
<logic v-if="activeTab=='logic'" :project-key="projectKey" />
<theme v-if="activeTab=='theme'" :project-key="projectKey" />
<setting v-if="activeTab=='setting'" :project-key="projectKey" />
<publish v-if="activeTab=='publish'" :project-key="projectKey" />
<statistics v-if="activeTab=='statistics'" :project-key="projectKey" />
<i v-if="!isCollapse" class="el-icon-d-arrow-left" @click="collapseHandle" />
<i v-else class="el-icon-d-arrow-right" @click="collapseHandle" />
</div>
<div class="right-content-container">
<router-view />
</div>
</div>
</div>
</template>
<script>
import editor from './editor'
import theme from './theme'
import setting from './setting'
import publish from './publish'
import statistics from './statistics'
import logic from './logic'
export default {
components: {
editor,
theme,
setting,
publish,
statistics,
logic
},
name: 'NewIndex',
components: {},
data() {
return {
activeTab: 'editor',
isEdit: false,
projectKey: ''
defaultActiveMenu: 'editor',
projectKey: null,
isCollapse: false,
menuItemList: [
{
title: '编辑',
icon: 'el-icon-edit',
route: '/project/form/editor'
},
{
title: '逻辑',
icon: 'el-icon-menu',
route: '/project/form/logic'
}, {
title: '外观',
icon: 'el-icon-view',
route: '/project/form/theme'
},
{
title: '设置',
icon: 'el-icon-setting',
route: '/project/form/setting'
},
{
title: '发布',
icon: 'el-icon-video-play',
route: '/project/form/publish'
}, {
title: '统计',
icon: 'el-icon-data-line',
route: '/project/form/statistics'
}
]
}
},
computed: {},
watch: {},
mounted() {
created() {
this.projectKey = this.$route.query.key
this.isEdit = !!this.$route.query.active
if (this.$route.query.active) {
this.activeTab = this.$route.query.active
}
this.defaultActiveMenu = this.$route.path
this.isCollapse = this.$store.state.form.isCollapse
},
methods: {
handleSelect(type) {
if (type) {
this.activeTab = type
this.$router.replace({path: '/project/form', query: {key: this.projectKey, active: type}})
}
menuSelectHandle(index) {
this.$router.replace({path: index, query: {key: this.projectKey}})
},
collapseHandle() {
let isCollapse = !this.isCollapse
this.$store.dispatch('form/setIsCollapse', isCollapse).then(() => {
this.isCollapse = isCollapse
})
}
}
}
</script>
<style lang='scss'>
.container {
position: relative;
width: 100%;
<style lang="scss" scoped>
.form-index-container {
height: 100%;
//overflow-y: hidden;
width: 100%;
}
::v-deep .el-card__body {
padding: 0;
}
::v-deep .el-menu {
border: none;
background-color: transparent;
}
.header-container {
width: 100%;
height: 60px;
.el-icon-back {
font-size: 22px;
font-weight: 550;
cursor: pointer;
color: #000;
margin-left: 40px;
&:hover {
color: rgb(32, 160, 255);
}
}
.header-logo {
height: 60px;
width: 200px;
}
}
.main-container {
width: 100vw;
height: calc(100vh - 60px);
display: flex;
flex-direction: row;
.right-content-container {
width: calc(100vw - 100px);
height: calc(100vh - 60px);
}
}
.left-menu-container {
max-width: 100px;
text-align: center;
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: solid 1px #e6e6e6;
.el-menu-vertical:not(.el-menu--collapse) {
width: 100px;
min-height: 400px;
}
.el-icon-d-arrow-left,
.el-icon-d-arrow-right {
font-size: 19px;
cursor: pointer;
font-weight: 550;
color: #000;
margin-bottom: 100px;
&:hover {
color: rgb(32, 160, 255);
}
}
}
</style>

2
src/views/form/logic.vue → src/views/form/logic/index.vue

@ -129,7 +129,7 @@
<script>
import _ from 'lodash'
import {jsonSimpleClone} from '@/utils/index'
import {jsonSimpleClone} from '@/utils'
export default {
name: 'ProjectLogic',

165
src/views/form/newIndex.vue

@ -1,165 +0,0 @@
<template>
<div class="form-index-container">
<el-card class="header-container">
<el-row align="middle" type="flex">
<el-col :span="2">
<i class="el-icon-back" @click="$router.back(-1)" />
</el-col>
<el-col :span="3">
<img class="header-logo" src="@/assets/images/indexLogo.png" @click="$router.push({path:'/home'})">
</el-col>
<el-col :span="1">
<el-button type="primary">编辑</el-button>
</el-col>
<el-col :span="2">
<el-button type="success">保存为模板</el-button>
</el-col>
</el-row>
</el-card>
<div class="main-container">
<div class="left-menu-container">
<el-menu :collapse="isCollapse" class="el-menu-vertical"
:default-active="defaultActiveMenu"
@select="menuSelectHandle"
>
<el-menu-item v-for="menuItem in menuItemList" :key="menuItem.route" :index="menuItem.route">
<i :class="menuItem.icon" />
<span slot="title">{{ menuItem.title }}</span>
</el-menu-item>
</el-menu>
<i v-if="!isCollapse" class="el-icon-d-arrow-left" @click="collapseHandle" />
<i v-else class="el-icon-d-arrow-right" @click="collapseHandle" />
</div>
<div class="right-content-container">
<router-view />
</div>
</div>
</div>
</template>
<script>
export default {
name: 'NewIndex',
components: {},
data() {
return {
defaultActiveMenu: 'editor',
projectKey: null,
isCollapse: false,
menuItemList: [
{
title: '编辑',
icon: 'el-icon-edit',
route: '/project/form/editor'
},
{
title: '逻辑',
icon: 'el-icon-menu',
route: '/project/form/logic'
}, {
title: '外观',
icon: 'el-icon-view',
route: '/project/form/theme'
},
{
title: '设置',
icon: 'el-icon-setting',
route: '/project/form/setting'
},
{
title: '发布',
icon: 'el-icon-video-play',
route: '/project/form/publish'
}, {
title: '统计',
icon: 'el-icon-data-line',
route: '/project/form/statistics'
}
]
}
},
created() {
this.projectKey = this.$route.query.key
this.defaultActiveMenu = this.$route.path
this.isCollapse = this.$store.state.form.isCollapse
},
methods: {
menuSelectHandle(index) {
this.$router.replace({path: index, query: {key: this.projectKey}})
},
collapseHandle() {
let isCollapse = !this.isCollapse
this.$store.dispatch('form/setIsCollapse', isCollapse).then(() => {
this.isCollapse = isCollapse
})
}
}
}
</script>
<style lang="scss" scoped>
.form-index-container {
height: 100%;
width: 100%;
}
::v-deep .el-card__body {
padding: 0;
}
::v-deep .el-menu {
border: none;
background-color: transparent;
}
.header-container {
width: 100%;
height: 60px;
.el-icon-back {
font-size: 22px;
font-weight: 550;
cursor: pointer;
color: #000;
margin-left: 40px;
&:hover {
color: rgb(32, 160, 255);
}
}
.header-logo {
height: 60px;
width: 200px;
}
}
.main-container {
width: 100vw;
height: calc(100vh - 60px);
display: flex;
flex-direction: row;
.right-content-container {
width: calc(100vw - 100px);
height: calc(100vh - 60px);
}
}
.left-menu-container {
max-width: 100px;
text-align: center;
position: relative;
display: flex;
flex-direction: column;
justify-content: space-between;
border-right: solid 1px #e6e6e6;
.el-menu-vertical:not(.el-menu--collapse) {
width: 100px;
min-height: 400px;
}
.el-icon-d-arrow-left,
.el-icon-d-arrow-right {
font-size: 19px;
cursor: pointer;
font-weight: 550;
color: #000;
margin-bottom: 100px;
&:hover {
color: rgb(32, 160, 255);
}
}
}
</style>

85
src/views/form/oldIndex.vue

@ -0,0 +1,85 @@
<!--<template>-->
<!-- <div class="container" style="overflow-y: hidden !important;">-->
<!-- <el-row type="flex" align="middle" justify="justify">-->
<!-- <el-col :offset="1" :span="4">-->
<!-- <el-button size="mini" round @click="$router.back(-1)">-->
<!-- <i class="el-icon-arrow-left" />-->
<!-- 返回-->
<!-- </el-button>-->
<!-- </el-col>-->
<!-- <el-col :span="10" :offset="3">-->
<!-- <el-menu :default-active="activeTab" style="background-color: transparent;" mode="horizontal"-->
<!-- @select="handleSelect"-->
<!-- >-->
<!-- <el-menu-item index="editor">编辑</el-menu-item>-->
<!-- <el-menu-item index="logic">逻辑</el-menu-item>-->
<!-- <el-menu-item index="theme">外观</el-menu-item>-->
<!-- <el-menu-item index="setting">设置</el-menu-item>-->
<!-- <el-menu-item index="publish">发布</el-menu-item>-->
<!-- <el-menu-item index="statistics">统计</el-menu-item>-->
<!-- </el-menu>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <div v-if="projectKey">-->
<!-- <editor v-if="activeTab=='editor'" :project-key="projectKey" :is-edit="isEdit" />-->
<!-- <logic v-if="activeTab=='logic'" :project-key="projectKey" />-->
<!-- <theme v-if="activeTab=='theme'" :project-key="projectKey" />-->
<!-- <setting v-if="activeTab=='setting'" :project-key="projectKey" />-->
<!-- <publish v-if="activeTab=='publish'" :project-key="projectKey" />-->
<!-- <statistics v-if="activeTab=='statistics'" :project-key="projectKey" />-->
<!-- </div>-->
<!-- </div>-->
<!--</template>-->
<!--<script>-->
<!--import editor from './editor'-->
<!--import theme from './theme'-->
<!--import setting from './setting'-->
<!--import publish from './publish'-->
<!--import statistics from './statistics'-->
<!--import logic from './logic'-->
<!--export default {-->
<!-- components: {-->
<!-- editor,-->
<!-- theme,-->
<!-- setting,-->
<!-- publish,-->
<!-- statistics,-->
<!-- logic-->
<!-- },-->
<!-- data() {-->
<!-- return {-->
<!-- activeTab: 'editor',-->
<!-- isEdit: false,-->
<!-- projectKey: ''-->
<!-- }-->
<!-- },-->
<!-- computed: {},-->
<!-- watch: {},-->
<!-- mounted() {-->
<!-- this.projectKey = this.$route.query.key-->
<!-- this.isEdit = !!this.$route.query.active-->
<!-- if (this.$route.query.active) {-->
<!-- this.activeTab = this.$route.query.active-->
<!-- }-->
<!-- },-->
<!-- methods: {-->
<!-- handleSelect(type) {-->
<!-- if (type) {-->
<!-- this.activeTab = type-->
<!-- this.$router.replace({path: '/project/form', query: {key: this.projectKey, active: type}})-->
<!-- }-->
<!-- }-->
<!-- }-->
<!--}-->
<!--</script>-->
<!--<style lang='scss'>-->
<!--.container {-->
<!-- position: relative;-->
<!-- width: 100%;-->
<!-- height: 100%;-->
<!-- //overflow-y: hidden;-->
<!--}-->
<!--</style>-->

0
src/views/form/ProjectForm.vue → src/views/form/preview/ProjectForm.vue

0
src/views/form/PreView.vue → src/views/form/preview/index.vue

0
src/views/form/publish.vue → src/views/form/publish/index.vue

17
src/views/form/setting.vue → src/views/form/setting/index.vue

@ -5,7 +5,6 @@
<p class="project-setting-title">
提交设置
</p>
<p class="project-setting-label">提交后</p>
<el-row type="flex" align="middle">
<el-col :span="12">
<p class="project-setting-label">显示提示图片</p>
@ -87,8 +86,21 @@
/>
</el-col>
</el-row>
<el-row type="flex" align="middle">
<el-col :span="12">
<p class="project-setting-label">公开反馈结果</p>
</el-col>
<el-col :span="12">
<el-switch
v-model="userProjectSettingData.publicResult"
@change="()=>{
this.saveUserProjectSetting()
}"
/>
</el-col>
</el-row>
</el-col>
<el-col :span="6" class="project-setting-view" style="text-align: center;">
<el-col :span="6" class="project-setting-view text-center">
<p class="project-setting-title">
回收设置
</p>
@ -572,6 +584,7 @@ export default {
submitPromptText: '提交成功 !',
submitJumpUrl: '',
wxWrite: false,
publicResult: false,
timedNotEnabledPromptText: '填写尚未启用',
timedDeactivatePromptText: '填写尚已经停用',
timedQuantitativeQuantity: null,

33
src/views/form/statistics.vue → src/views/form/statistics/index.vue

@ -65,6 +65,7 @@
</el-table-column>
</el-table>
<el-drawer
v-if="activeResultRow"
:visible.sync="detailDrawer"
:with-header="false"
>
@ -76,25 +77,10 @@
<div>
<div v-for="item in projectItemList" :key="item.id">
<h4>{{ item.label }}</h4>
<!-- 如果是文件输入-->
<div
v-if="item.type==17 &&activeResultRow&&activeResultRow['processData'][`field${item.formItemId}`]"
>
<el-link
v-for="file in JSON.parse(activeResultRow['processData'][`field${item.formItemId}`]['files'])"
:key="file"
:href="file.url" target="_blank"
type="primary"
>
<span> {{ file.fileName }}</span>
</el-link>
</div>
<el-tag v-else>
{{
activeResultRow ?
activeResultRow['processData'][`field${item.formItemId}`] : ''
}}
</el-tag>
<result-item :field-item-id="item.formItemId" :project-item-data="item"
:result-data="activeResultRow"
/>
<el-divider />
</div>
</div>
</el-card>
@ -146,7 +132,7 @@
<script>
import _ from 'lodash'
import ResultItem from './item'
import {getCheckedColumn, saveCheckedColumn} from '@/utils/db'
const fixedDefaultFormColumn = ['serialNumber', 'submitAddress', 'createTime']
@ -154,7 +140,9 @@ const fixedDefaultLabelFormColumn = {serialNumber: '提交序号', submitAddress
export default {
name: 'ProjectStatistics',
components: {},
components: {
ResultItem
},
data() {
return {
projectKey: null,
@ -297,7 +285,8 @@ export default {
margin: 6px auto;
}
.detail-container {
padding: 10px;
padding: 20px;
height: 100% !important;
}
.filter-table-view {
width: 80%;

55
src/views/form/statistics/item.vue

@ -0,0 +1,55 @@
<template>
<div>
<div v-if="projectItemData.type=='UPLOAD'">
<div v-if="getItemValue['files']">
<el-link
v-for="file in getItemValue['files']"
:key="file"
:href="file.url" target="_blank"
type="primary"
>
<span> {{ file.fileName }}</span>
</el-link>
</div>
<span v-else>/</span>
</div>
<div v-else>
{{ getItemValue ? getItemValue : '/' }}
</div>
</div>
</template>
<script>
export default {
name: 'ResultItem',
props: {
projectItemData: {
type: Object,
default: function() {
return {}
}
},
resultData: {
type: Object,
default: function() {
return {}
}
},
fieldItemId: {
type: Number,
default: 0
}
},
computed: {
processData() {
return this.resultData ? this.resultData['processData'] : {}
},
getItemValue() {
return this.processData[`field${this.fieldItemId}`] ? this.processData[`field${this.fieldItemId}`] : ''
}
}
}
</script>

185
src/views/form/statistics/public.vue

@ -0,0 +1,185 @@
<template>
<el-container>
<el-header class="el-page-header">
<h5 v-if="projectData">{{ projectData.name }}</h5>
<el-button type="primary" @click="openFormHandle">访问表单</el-button>
</el-header>
<el-main>
<el-table
:data="projectResultList"
class="public-result-table"
>
<el-table-column type="expand">
<template slot-scope="props">
<el-form class="public-table-expand" label-position="left">
<el-form-item v-for="item in projectItemList" :key="item.id" :label="item.label">
<result-item :field-item-id="item.formItemId" :project-item-data="item"
:result-data="props.row"
/>
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column
label="提交序号"
prop="serialNumber"
/>
<el-table-column
label="提交地址"
prop="submitAddress"
/>
<el-table-column
label="提交时间"
prop="createTime"
/>
</el-table>
</el-main>
</el-container>
</template>
<script>
import _ from 'lodash'
import ResultItem from './item'
export default {
name: 'StatisticsPublic',
components: {
ResultItem
},
metaInfo: {
title: '反馈结果',
meta: [
{
name: 'viewport',
content: 'width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2,user-scalable=yes'
}
]
},
data() {
return {
projectResultList: [],
projectItemList: [],
projectData: null,
projectItemColumns: {},
//
queryConditions: {
current: 1,
size: 10,
projectKey: '',
beginDateTime: '',
endDateTime: ''
},
projectKey: null,
tableData: [{
id: '12987122',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987123',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987125',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}, {
id: '12987126',
name: '好滋好味鸡蛋仔',
category: '江浙小吃、小吃零食',
desc: '荷兰优质淡奶,奶香浓而不腻',
address: '上海市普陀区真北路',
shop: '王小虎夫妻店',
shopId: '10333'
}]
}
},
created() {
this.projectKey = this.$route.query.projectKey
this.queryConditions.projectKey = this.projectKey
this.queryProjectResult()
this.queryProjectItems()
this.queryProject()
},
methods: {
openFormHandle() {
this.$router.replace({path: `/s/${this.projectKey}`})
},
queryProject() {
this.$api.get(`/user/project/${this.projectKey}`).then(res => {
this.projectData = res.data
})
},
queryProjectResult() {
this.$api.get('/user/project/result/public/page', {params: this.queryConditions}).then(res => {
let {records, total, size} = res.data
this.projectResultList = records
this.total = total
this.queryConditions.size = size
})
},
queryProjectItems() {
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)
})
}
this.projectItemList = res.data
})
}
}
}
</script>
<style lang="scss" scoped>
.el-header {
display: flex;
flex-direction: row;
justify-content: space-around;
align-items: center;
.el-button {
height: 50%;
}
}
.el-main {
background-color: $backgroundColor;
height: calc(100vh - 60px);
}
@media screen and (max-width: 750px) {
.public-result-table {
width: 100% !important;
}
.el-header {
justify-content: space-between !important;
}
}
.public-result-table {
width: 60%;
margin: 0 auto;
}
.public-table-expand {
font-size: 0;
label {
width: 90px;
color: #99a9bf;
}
.el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 50%;
}
}
</style>

2
src/views/form/theme.vue → src/views/form/theme/index.vue

@ -237,7 +237,7 @@
</template>
<script>
import PreView from './PreView'
import PreView from '../preview'
export default {
name: 'Theme',

40
src/views/form/write.vue → src/views/form/write/index.vue

@ -31,15 +31,19 @@
fit="cover"
/>
</div>
<el-button v-if="userProjectSetting.publicResult" type="primary" @click="openPublicResultHandle">
查看数据
</el-button>
</div>
</div>
</template>
<script>
import ProjectForm from './ProjectForm'
import ProjectForm from '../preview/ProjectForm'
import loadWXJs from '@/utils/loadWxSdk'
import defaultValue from '@/utils/defaultValue'
import { getQueryString} from '@/utils'
import {getQueryString} from '@/utils'
import constants from '@/utils/constants'
const uaParser = require('ua-parser-js')
const ua = uaParser(navigator.userAgent)
@ -72,11 +76,13 @@ export default {
wxSignature: {}
}
},
beforeCreate() {
let meta = document.createElement('meta')
meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'
meta.name = 'viewport'
document.getElementsByTagName('head')[0].appendChild(meta)
metaInfo: {
meta: [
{
name: 'viewport',
content: 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no'
}
]
},
created() {
let key = this.$route.query.key || this.$route.params.key
@ -89,11 +95,14 @@ export default {
this.getWxAuthorizationUrl()
this.queryProjectSettingStatus()
this.queryProjectSetting()
//
this.$api.get('/wx/jsapi/signature', {params: {url: window.location.href}}).then(res => {
this.wxSignature = res.data
this.setWxConfig()
})
if (constants.enableWx) {
//
this.$api.get('/wx/jsapi/signature', {params: {url: window.location.href}}).then(res => {
this.wxSignature = res.data
this.setWxConfig()
})
}
},
mounted() {
this.viewProjectHandle()
@ -233,6 +242,9 @@ export default {
}
})
},
/**
* 仅在微信打开
*/
onlyWxOpenHandle() {
let wxUa = navigator.userAgent.toLowerCase()
let isWeixin = wxUa.indexOf('micromessenger') != -1
@ -241,6 +253,10 @@ export default {
document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">请在微信客户端打开链接</h4></div></div>'
}
},
openPublicResultHandle() {
let projectKey = this.projectConfig.projectKey
this.$router.replace({path: '/project/public/result', query: {projectKey}})
},
submitForm(data) {
//
let inActiveTime = document.getElementById('inActiveTime').innerText

271
src/views/home/NewIndex.vue

@ -1,271 +0,0 @@
<template>
<div class="home-container">
<el-container>
<el-header class="header-container" height="38">
<div>
<img class="header-logo-img" src="@/assets/images/indexLogo.png"
@click="$router.push({path:'/'})"
>
</div>
<div class="right-header">
<el-link href="https://doc.tduckapp.com/" target="_blank">帮助文档</el-link>
<el-popover
placement="bottom-end"
trigger="click"
width="150"
>
<div class="user-person-menu">
<div>
<p v-if="getUserInfo" class="nick-name">{{ getUserInfo.name }}</p>
</div>
<el-divider />
<div>
<p class="person-menu-item" @click="$router.push({path: '/home/member'})">
<font-icon class="fab fa-get-pocket" />
我的账户
</p>
<el-divider />
<p class="person-menu-item" @click="logoutHandle">
<font-icon class="fas fa-sign-out" />
退出登录
</p>
</div>
</div>
<div slot="reference">
<img v-if="getUserInfo" :src="getUserInfo.avatar" class="user-avatar">
</div>
</el-popover>
</div>
</el-header>
<!-- <div class="banner-container">-->
<!-- <el-carousel height="60px">-->
<!-- <el-carousel-item v-for="item in 4" :key="item">-->
<!-- <img style="height: 60px;" src="https://static.wenjuan.pub/1620698916041_333.jpg">-->
<!-- </el-carousel-item>-->
<!-- </el-carousel>-->
<!-- </div>-->
<el-container>
<el-aside width="280px">
<el-card>
<el-button class="width90" type="primary" @click="createBlankTemplate">新建项目</el-button>
<div class="menu-view">
<div v-for="menu in menuList" :key="menu.route"
:class="defaultActiveMenu==menu.route?'menu-item-active menu-item':'menu-item'"
@click="menuClickHandle(menu)"
>
<font-icon :class="menu.icon" />
<span>{{ menu.name }}</span>
</div>
</div>
<div class="text-center">
<h5>加入社群</h5>
<el-image
fit="fill"
src="https://oss.smileyi.top/static/wx-qrcode.png"
style="width: 200px; height: 200px;"
/>
</div>
</el-card>
</el-aside>
<el-container>
<el-main>
<router-view />
</el-main>
<el-footer>
<div class="about-container">
<font-icon class="fas fa-user" />
<span class="desc-text">关于填鸭</span>
</div>
</el-footer>
</el-container>
</el-container>
</el-container>
</div>
</template>
<script>
import {formConf} from '@/components/generator/config'
import store from '@/store'
import router from '@/router'
export default {
name: 'NewIndex',
components: {},
data() {
return {
defaultActiveMenu: '',
menuList: [
{
route: '/home',
name: '工作台',
icon: 'fas fa-laptop'
},
{
route: '/home/template',
name: '模板中心',
icon: 'fas fa-clipboard'
}, {
route: '/home/recycle',
name: '回收站',
icon: 'fas fa-user'
}
]
}
},
computed: {
getStore() {
return store
},
getUserInfo() {
let user = JSON.parse(this.getStore.getters['user/userInfo'])
return user
}
},
created() {
this.defaultActiveMenu = this.$route.path
},
methods: {
menuClickHandle(menu) {
this.$router.replace({path: menu.route})
},
createBlankTemplate() {
this.$api.post('/user/project/create', {
'describe': formConf.description,
'name': formConf.title
}).then(res => {
console.log(res)
this.$router.push({path: '/project/form', query: {key: res.data}})
})
},
logoutHandle() {
this.$confirm('您确定要退出登录吗?', '退出确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('user/logout').then(() => {
router.push({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
})
})
}).catch(() => {
})
}
}
}
</script>
<style lang="scss" scoped>
.home-container {
background-color: rgba(247, 247, 247, 90);
display: flex;
height: 100%;
width: 100%;
flex-direction: column;
}
.header-container {
display: flex;
justify-content: space-between;
background-color: #fff;
line-height: 38px;
height: 38px;
min-width: 1024px;
.header-logo-img {
width: 120px;
height: 35px;
float: left;
}
.right-header {
display: flex;
flex-direction: row;
> * {
margin: 0 20px;
}
}
.user-avatar {
width: 35px;
height: 35px;
border-radius: 100px;
cursor: pointer;
}
}
.menu-view {
margin-top: 20px;
height: 501px;
background-color: rgba(255, 255, 255, 100);
padding: 20px;
.menu-item-active {
color: $menuActiveText !important;
}
.menu-item {
color: #333;
font-size: 16px;
text-align: left;
line-height: 25px;
&:hover {
cursor: pointer;
color: $menuActiveText;
}
& .fas:hover {
color: $menuActiveText;
}
.fas {
display: inline-block;
width: 20px;
height: 20px;
margin: 5px;
}
span {
margin-left: 10px;
}
}
}
.banner-container {
height: 60px;
}
.el-aside {
padding: 0;
margin: 0;
.el-card {
height: 100%;
}
}
.user-person-menu {
.nick-name {
height: 16px;
color: rgba(70, 70, 70, 86);
font-size: 14px;
line-height: 16px;
text-align: left;
}
.person-menu-item {
color: rgba(70, 70, 70, 86);
font-size: 14px;
text-align: left;
&:hover {
cursor: pointer;
color: $menuActiveText;
}
}
.el-divider {
margin: 5px 0;
}
.person-menu-divider {
background-color: rgba(210, 210, 210, 78);
border: 1px solid rgba(210, 210, 210, 78);
}
}
.about-container {
text-align: center;
.fa-user {
font-size: 19px;
color: rgba(172, 172, 172, 100);
margin: 1px;
}
}
</style>

322
src/views/home/index.vue

@ -1,102 +1,106 @@
<template>
<div>
<div class="home-container">
<el-container>
<el-header height="92" class="home-header-view">
<el-row type="flex" align="middle" justify="center">
<el-col :span="4" :offset="1">
<img src="@/assets/images/indexLogo.png" class="header-logo-img"
@click="$router.push({path:'/'})"
>
</el-col>
<el-col :span="10">
<el-menu :default-active="menuIndex" mode="horizontal"
text-color="#205BB5"
active-text-color="#205BB5"
@select="activeMenuHandle"
>
<el-menu-item v-for="(item, index) in menuRouters"
:key="index"
:index="item.routerPath"
class="menu-item"
>
{{ item.title }}
</el-menu-item>
</el-menu>
</el-col>
<el-col :span="1">
<!-- <el-button round>升级</el-button>-->
</el-col>
<el-col :span="1">
<div style="display: flex;
align-items: center;
justify-content: center;"
>
<!-- <svg-icon name="loginWx" style="width: 24px; height: 24px;" />-->
</div>
</el-col>
<el-col :span="1">
<el-link href="https://gitee.com/TDuckApp/tduck-platform/wikis/%E6%9C%AC%E5%9C%B0%E8%BF%90%E8%A1%8C?sort_id=3681729" target="_blank">帮助</el-link>
</el-col>
<el-col :span="3">
<el-popover
placement="bottom-end"
width="200"
trigger="click"
>
<div class="user-person-menu">
<div>
<p v-if="getUserInfo" class="nick-name">{{ getUserInfo.name }}</p>
</div>
<div class="person-menu-divider" />
<div>
<p class="person-menu-item" @click="$router.push({path: '/home/member'})">
<font-icon class="fab fa-get-pocket" />
我的账户
</p>
<div class="person-menu-divider" />
<p class="person-menu-item" @click="logoutHandle">
<font-icon class="fas fa-sign-out" />
退出登录
</p>
</div>
<el-header class="header-container" height="38">
<div>
<img class="header-logo-img" src="@/assets/images/indexLogo.png"
@click="$router.push({path:'/'})"
>
</div>
<div class="right-header">
<el-link href="https://doc.tduckapp.com/" target="_blank">帮助文档</el-link>
<el-popover
placement="bottom-end"
trigger="click"
width="150"
>
<div class="user-person-menu">
<div>
<p v-if="getUserInfo" class="nick-name">{{ getUserInfo.name }}</p>
</div>
<div slot="reference" style="display: flex; align-items: center; justify-content: center;">
<img v-if="getUserInfo" :src="getUserInfo.avatar" class="user-avatar">
<el-divider />
<div>
<p class="person-menu-item" @click="$router.push({path: '/home/member'})">
<font-icon class="fab fa-get-pocket" />
我的账户
</p>
<el-divider />
<p class="person-menu-item" @click="logoutHandle">
<font-icon class="fas fa-sign-out" />
退出登录
</p>
</div>
</el-popover>
</el-col>
</el-row>
</div>
<div slot="reference">
<img v-if="getUserInfo" :src="getUserInfo.avatar" class="user-avatar">
</div>
</el-popover>
</div>
</el-header>
<el-main class="home-main-view">
<router-view />
</el-main>
<el-container>
<el-aside width="280px">
<el-card>
<el-button type="primary" @click="createBlankTemplate">新建项目</el-button>
<div class="menu-view">
<div v-for="menu in menuList" :key="menu.route"
:class="defaultActiveMenu==menu.route?'menu-item-active menu-item':'menu-item'"
@click="menuClickHandle(menu)"
>
<font-icon :class="menu.icon" />
<span>{{ menu.name }}</span>
</div>
</div>
<div class="text-center">
<h5>加入社群</h5>
<el-image
fit="fill"
src="https://oss.smileyi.top/static/wx-qrcode.png"
style="width: 200px; height: 200px;"
/>
</div>
</el-card>
</el-aside>
<el-container>
<el-main>
<router-view />
</el-main>
<el-footer>
<div class="about-container">
<font-icon class="fas fa-user" />
<span class="desc-text">关于填鸭</span>
</div>
</el-footer>
</el-container>
</el-container>
</el-container>
</div>
</template>
<script>
import store from '@/store/index.js'
import FontIcon from '@/components/FontIcon'
import {formConf} from '@/components/generator/config'
import store from '@/store'
import router from '@/router'
import {openUrl, checkIsUrl} from '@/utils/index'
export default {
name: 'Home',
components: {FontIcon},
name: 'NewIndex',
components: {},
data() {
return {
menuIndex: null,
menuRouters: [
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform?time=1',
title: '免费模板'
},
defaultActiveMenu: '',
menuList: [
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform',
title: '开源项目'
route: '/home',
name: '工作台',
icon: 'fas fa-laptop'
},
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform/issues',
title: '提出建议'
route: '/project/template',
name: '模板中心',
icon: 'fas fa-clipboard'
}, {
route: '/project/recycle',
name: '回收站',
icon: 'fas fa-user'
}
]
}
@ -110,16 +114,21 @@ export default {
return user
}
},
mounted() {
this.menuIndex = this.$route.path
created() {
this.defaultActiveMenu = this.$route.path
},
methods: {
activeMenuHandle(routerPath) {
if (checkIsUrl(routerPath)) {
openUrl(routerPath)
} else {
this.menuIndex = routerPath
}
menuClickHandle(menu) {
this.$router.replace({path: menu.route})
},
createBlankTemplate() {
this.$api.post('/user/project/create', {
'describe': formConf.description,
'name': formConf.title
}).then(res => {
console.log(res)
this.$router.push({path: '/project/form', query: {key: res.data}})
})
},
logoutHandle() {
this.$confirm('您确定要退出登录吗?', '退出确认', {
@ -142,34 +151,91 @@ export default {
}
}
</script>
<style lang="scss" scoped>
.menu-item {
line-height: 80px;
height: 80px;
text-align: left;
font-weight: 550;
color: rgba(32, 91, 181, 100);
font-size: 20px;
&:hover {
<style lang="scss" scoped>
.home-container {
background-color: rgba(247, 247, 247, 90);
display: flex;
height: 100%;
width: 100%;
flex-direction: column;
}
.header-container {
display: flex;
justify-content: space-between;
background-color: #fff;
line-height: 38px;
height: 38px;
min-width: 1024px;
.header-logo-img {
width: 120px;
height: 35px;
float: left;
}
.right-header {
display: flex;
flex-direction: row;
> * {
margin: 0 20px;
}
}
.user-avatar {
width: 35px;
height: 35px;
border-radius: 100px;
cursor: pointer;
}
}
.el-menu.el-menu--horizontal {
border-bottom: none;
}
.home-header-view {
line-height: 92px;
height: 92px;
min-width: 1024px;
.menu-view {
margin-top: 20px;
height: 501px;
background-color: rgba(255, 255, 255, 100);
color: rgba(16, 16, 16, 100);
font-size: 14px;
padding: 20px;
text-align: center;
.header-logo-img {
width: 90%;
height: 90%;
float: left;
.menu-item-active {
color: $menuActiveText !important;
}
.menu-item {
color: #333;
font-size: 16px;
text-align: left;
line-height: 25px;
&:hover {
cursor: pointer;
color: $menuActiveText;
}
& .fas:hover {
color: $menuActiveText;
}
.fas {
display: inline-block;
width: 20px;
height: 20px;
margin: 5px;
}
span {
margin-left: 10px;
}
}
}
.banner-container {
height: 60px;
}
.el-aside {
padding: 0;
margin: 0;
.el-card {
height: 100%;
::v-deep .el-card__body {
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
align-items: center !important;
}
.el-button {
width: 80%;
margin-top: 20px;
}
}
}
.user-person-menu {
@ -184,22 +250,26 @@ export default {
color: rgba(70, 70, 70, 86);
font-size: 14px;
text-align: left;
&:hover {
cursor: pointer;
color: $menuActiveText;
}
}
.person-menu-item:hover {
cursor: pointer;
color: rgba(32, 91, 181, 100);
.el-divider {
margin: 5px 0;
}
.person-menu-divider {
background-color: rgba(210, 210, 210, 78);
border: 1px solid rgba(210, 210, 210, 78);
}
}
.user-avatar {
width: 50px;
height: 50px;
border-radius: 100px;
cursor: pointer;
}
.home-main-view {
height: calc(100vh - 92px);
min-width: 1024px;
background-color: #f7f7f7;
padding: 0;
.about-container {
text-align: center;
.fa-user {
font-size: 19px;
color: rgba(172, 172, 172, 100);
margin: 1px;
}
}
</style>

205
src/views/home/oldIndex.vue

@ -0,0 +1,205 @@
<template>
<div>
<el-container>
<el-header height="92" class="home-header-view">
<el-row type="flex" align="middle" justify="center">
<el-col :span="4" :offset="1">
<img src="@/assets/images/indexLogo.png" class="header-logo-img"
@click="$router.push({path:'/'})"
>
</el-col>
<el-col :span="10">
<el-menu :default-active="menuIndex" mode="horizontal"
text-color="#205BB5"
active-text-color="#205BB5"
@select="activeMenuHandle"
>
<el-menu-item v-for="(item, index) in menuRouters"
:key="oldIndex"
:index="item.routerPath"
class="menu-item"
>
{{ item.title }}
</el-menu-item>
</el-menu>
</el-col>
<el-col :span="1">
<!-- <el-button round>升级</el-button>-->
</el-col>
<el-col :span="1">
<div style="display: flex;
align-items: center;
justify-content: center;"
>
<!-- <svg-icon name="loginWx" style="width: 24px; height: 24px;" />-->
</div>
</el-col>
<el-col :span="1">
<el-link href="https://gitee.com/TDuckApp/tduck-platform/wikis/%E6%9C%AC%E5%9C%B0%E8%BF%90%E8%A1%8C?sort_id=3681729" target="_blank">帮助</el-link>
</el-col>
<el-col :span="3">
<el-popover
placement="bottom-end"
width="200"
trigger="click"
>
<div class="user-person-menu">
<div>
<p v-if="getUserInfo" class="nick-name">{{ getUserInfo.name }}</p>
</div>
<div class="person-menu-divider" />
<div>
<p class="person-menu-item" @click="$router.push({path: '/home/member'})">
<font-icon class="fab fa-get-pocket" />
我的账户
</p>
<div class="person-menu-divider" />
<p class="person-menu-item" @click="logoutHandle">
<font-icon class="fas fa-sign-out" />
退出登录
</p>
</div>
</div>
<div slot="reference" style="display: flex; align-items: center; justify-content: center;">
<img v-if="getUserInfo" :src="getUserInfo.avatar" class="user-avatar">
</div>
</el-popover>
</el-col>
</el-row>
</el-header>
<el-main class="home-main-view">
<router-view />
</el-main>
</el-container>
</div>
</template>
<script>
import store from '@/store/index.js'
import FontIcon from '@/components/FontIcon'
import router from '@/router'
import {openUrl, checkIsUrl} from '@/utils/index'
export default {
name: 'Home',
components: {FontIcon},
data() {
return {
menuIndex: null,
menuRouters: [
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform?time=1',
title: '免费模板'
},
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform',
title: '开源项目'
},
{
routerPath: 'https://gitee.com/TDuckApp/tduck-platform/issues',
title: '提出建议'
}
]
}
},
computed: {
getStore() {
return store
},
getUserInfo() {
let user = JSON.parse(this.getStore.getters['user/userInfo'])
return user
}
},
mounted() {
this.menuIndex = this.$route.path
},
methods: {
activeMenuHandle(routerPath) {
if (checkIsUrl(routerPath)) {
openUrl(routerPath)
} else {
this.menuIndex = routerPath
}
},
logoutHandle() {
this.$confirm('您确定要退出登录吗?', '退出确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$store.dispatch('user/logout').then(() => {
router.push({
path: '/login',
query: {
redirect: router.currentRoute.fullPath
}
})
})
}).catch(() => {
})
}
}
}
</script>
<style lang="scss" scoped>
.menu-item {
line-height: 80px;
height: 80px;
text-align: left;
font-weight: 550;
color: rgba(32, 91, 181, 100);
font-size: 20px;
&:hover {
cursor: pointer;
}
}
.el-menu.el-menu--horizontal {
border-bottom: none;
}
.home-header-view {
line-height: 92px;
height: 92px;
min-width: 1024px;
background-color: rgba(255, 255, 255, 100);
color: rgba(16, 16, 16, 100);
font-size: 14px;
text-align: center;
.header-logo-img {
width: 90%;
height: 90%;
float: left;
}
}
.user-person-menu {
.nick-name {
height: 16px;
color: rgba(70, 70, 70, 86);
font-size: 14px;
line-height: 16px;
text-align: left;
}
.person-menu-item {
color: rgba(70, 70, 70, 86);
font-size: 14px;
text-align: left;
}
.person-menu-item:hover {
cursor: pointer;
color: rgba(32, 91, 181, 100);
}
}
.user-avatar {
width: 50px;
height: 50px;
border-radius: 100px;
cursor: pointer;
}
.home-main-view {
height: calc(100vh - 92px);
min-width: 1024px;
background-color: #f7f7f7;
padding: 0;
}
</style>

2
src/views/project/MyProject.vue → src/views/project/my/index.vue

@ -120,7 +120,7 @@
</div>
</div>
</div>
<div v-if="!projectListLoading&&!projectList">
<div v-if="!projectListLoading&&projectList.length==0">
<data-empty />
</div>
</div>

0
src/views/project/RecycleBin.vue → src/views/project/recycle/index.vue

91
src/views/project/template.vue → src/views/project/template/index.vue

@ -1,48 +1,41 @@
<template>
<div class="create-wrapper">
<div class="create-container">
<el-row>
<div class="filter-container">
<el-form ref="form" :inline="true">
<el-form-item label="">
<el-input
v-model="queryParams.name"
class="width80"
placeholder="请输入模板名称"
@keyup.enter="queryTemplatePage"
/>
</el-form-item>
<el-form-item>
<el-button class="search-template-btn"
type="primary"
@click="queryTemplatePage"
>
查询
</el-button>
</el-form-item>
</el-form>
</div>
<el-row>
<el-col :offset="6" :span="10">
<el-menu :default-active="queryParams.type"
mode="horizontal"
style="background-color: transparent;" @select="(index)=>{
this.queryParams.type=index
this.queryTemplatePage()}"
<div class="create-header-container">
<div class="filter-container">
<el-form ref="form" :inline="true">
<el-form-item label="">
<el-input
v-model="queryParams.name"
class="width80"
placeholder="请输入模板名称"
@keyup.enter="queryTemplatePage"
/>
</el-form-item>
<el-form-item>
<el-button class="search-template-btn"
type="primary"
@click="queryTemplatePage"
>
查询
</el-button>
</el-form-item>
</el-form>
</div>
<el-menu :default-active="queryParams.type"
mode="horizontal"
style="background-color: transparent;" @select="(index)=>{
this.queryParams.type=index
this.queryTemplatePage()}"
>
<el-menu-item :`index`="null">全部</el-menu-item>
<el-menu-item v-for="(item, index) in templateTypeList" :key="index"
:index="item.id.toString()"
>
<el-menu-item :`index`="null">全部</el-menu-item>
<el-menu-item v-for="(item, index) in templateTypeList" :key="index"
:index="item.id.toString()"
>
{{ item.name }}
</el-menu-item>
</el-menu>
</el-col>
</el-row>
<el-row>
<el-col :span="3">
<span class="tag-title">推荐模板</span>
</el-col>
</el-row>
{{ item.name }}
</el-menu-item>
</el-menu>
</div>
<div class="project-grid-container">
<div
class="project-grid-view"
@ -56,7 +49,7 @@
<p style="font-size: 14px;">创建一个空白模板</p>
</div>
</div>
<div v-for="template in templateList" :key="template.title" class="project-template-view">
<div v-for="template in templateList" :key="template.id" class="project-template-view">
<img :src="template.coverImg" style="width: 144px; height: 133px;">
<p class="project-template-title">
{{ template.name }}
@ -68,7 +61,7 @@
<div class="project-template-use-view">
<div
class="project-template-use-view-btn"
@click="toProjectTemplate(template.key)"
@click="toProjectTemplate(index.key)"
>
<div>
<font-icon class="fa fa-eye" style="font-size: 40px;" />
@ -149,7 +142,7 @@ export default {
</script>
<style lang="scss" scoped>
.create-wrapper {
.create-container {
display: flex;
width: 100%;
height: 100%;
@ -160,9 +153,14 @@ export default {
margin-top: 20px;
}
}
.create-header-container {
display: flex;
flex-direction: column;
justify-content: flex-start;
}
.filter-container {
display: flex;
justify-content: center;
justify-content: flex-start;
margin-top: 20px !important;
.el-input {
display: inline-block;
@ -194,6 +192,7 @@ export default {
}
.project-template-view:hover .project-template-use-view {
display: block;
cursor: pointer;
}
.project-template-use-view {
position: absolute;

2
src/views/project/TemplatePreview.vue → src/views/project/template/preview.vue

@ -27,7 +27,7 @@
</template>
<script>
import ProjectForm from '@/views/form/ProjectForm'
import ProjectForm from '@/views/form/preview/ProjectForm'
export default {
name: 'TemplatePreview',
Loading…
Cancel
Save