Browse Source

完善部分功能

old
wangqing 5 years ago
parent
commit
f440c5b67f
  1. 1
      package.json
  2. 1
      public/index.html
  3. 8
      src/components/parser/Parser.vue
  4. 5
      src/router/modules/root.js
  5. 7
      src/utils/convert.js
  6. 200
      src/views/account/member.vue
  7. 15
      src/views/form/ProjectForm.vue
  8. 15
      src/views/home/index.vue
  9. 21
      src/views/official/index.vue
  10. 14
      yarn.lock

1
package.json

@ -22,6 +22,7 @@
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"vue": "^2.6.12", "vue": "^2.6.12",
"vue-clipboard2": "^0.3.1", "vue-clipboard2": "^0.3.1",
"vue-image-crop-upload": "^2.5.0",
"vue-meta": "^2.4.0", "vue-meta": "^2.4.0",
"vue-qr": "^2.3.0", "vue-qr": "^2.3.0",
"vue-router": "^3.4.8", "vue-router": "^3.4.8",

1
public/index.html

@ -3,7 +3,6 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>-->
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> <link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= htmlWebpackPlugin.options.title %></title> <title><%= htmlWebpackPlugin.options.title %></title>
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %> <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>

8
src/components/parser/Parser.vue

@ -31,12 +31,7 @@ const layouts = {
if (config.showLabel === false) labelWidth = '0' if (config.showLabel === false) labelWidth = '0'
let label = config.label let label = config.label
if (formConfCopy.showNumber) { if (formConfCopy.showNumber) {
this.serialNumber = this.serialNumber + 1 label = scheme.serialNumber + ': ' + label
label = serialNumber + ': ' + label
}
//
if (config.tag === 'el-upload') {
scheme.action = scheme.action + this.formConf.projectKey
} }
return ( return (
<el-col span={config.span}> <el-col span={config.span}>
@ -238,7 +233,6 @@ export default {
}, },
data() { data() {
const data = { const data = {
// serialNumber: 1,//
formConfCopy: deepClone(this.formConf), formConfCopy: deepClone(this.formConf),
[this.formConf.formModel]: {}, [this.formConf.formModel]: {},
[this.formConf.labelFormModel]: {}, [this.formConf.labelFormModel]: {},

5
src/router/modules/root.js

@ -54,6 +54,11 @@ export default [
path: '/', path: '/',
meta: {requireLogin: true}, meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/home/HomeView') component: () => import(/* webpackChunkName: 'root' */ '@/views/home/HomeView')
},
{
path: 'member',
meta: {requireLogin: true},
component: () => import(/* webpackChunkName: 'root' */ '@/views/account/member')
} }
] ]
}, { }, {

7
src/utils/convert.js

@ -16,6 +16,7 @@ export function formItemConvertData(item, projectKey) {
'required': item.__config__.required, 'required': item.__config__.required,
'placeholder': item.placeholder, 'placeholder': item.placeholder,
'regList': item.__config__.regList, 'regList': item.__config__.regList,
'showLabel': item.__config__.showLabel,
'projectKey': projectKey 'projectKey': projectKey
} }
let expand = {} let expand = {}
@ -58,6 +59,7 @@ export function dbDataConvertForItemJson(data) {
jsonItem.__config__.label = data.label jsonItem.__config__.label = data.label
jsonItem.__config__.required = data.required jsonItem.__config__.required = data.required
jsonItem.__config__.regList = data.regList jsonItem.__config__.regList = data.regList
jsonItem.__config__.showLabel = data.showLabel
if (data.defaultValue) { if (data.defaultValue) {
if (data.defaultValue.json) { if (data.defaultValue.json) {
jsonItem.__config__.defaultValue = JSON.parse(data.defaultValue.value) jsonItem.__config__.defaultValue = JSON.parse(data.defaultValue.value)
@ -65,7 +67,10 @@ export function dbDataConvertForItemJson(data) {
jsonItem.__config__.defaultValue = data.defaultValue.value jsonItem.__config__.defaultValue = data.defaultValue.value
} }
} }
//不同项目地址区分
if (jsonItem.tag === 'el-upload') {
jsonItem.action = jsonItem.action + data.projectKey
}
jsonItem.regList = data.regList jsonItem.regList = data.regList
jsonItem.placeholder = data.placeholder jsonItem.placeholder = data.placeholder
jsonItem.__vModel__ = 'field' + data.formItemId jsonItem.__vModel__ = 'field' + data.formItemId

200
src/views/account/member.vue

@ -0,0 +1,200 @@
<template>
<div class="member-container">
<el-card class="member-box-card">
<div class="member-info-view">
<p class="title pl-5">账号信息</p>
<el-divider />
<div v-if="userInfo" class="account-info-view">
<table>
<tbody>
<tr>
<td width="80" style="text-align: right;">用户名</td>
<td>
{{ userInfo.name }}
<el-link type="primary" @click="editDialogVisible=true">修改</el-link>
</td>
</tr>
<tr>
<td width="80" style="text-align: right;">账号邮箱</td>
<td>
{{ userInfo.email }}
<el-link type="primary">绑定</el-link>
</td>
</tr>
<tr>
<td width="80" style="text-align: right;">密码</td>
<td>
******
<el-link type="primary">修改</el-link>
</td>
</tr>
<tr>
<td width="80" style="text-align: right;">手机号</td>
<td>
{{ userInfo.phoneNumber }}
<el-link type="primary">修改</el-link>
</td>
</tr>
</tbody>
</table>
<div class="account-avatar-view">
<my-upload v-model="showUploadAvatar"
field="file"
:width="300"
:height="300"
:url="getUploadUrl()"
:headers="getUploadHeader()"
img-format="png"
@crop-upload-success="cropUploadSuccess"
/>
<el-avatar
style="width: 100px; height: 100px;"
:src="userInfo.avatar"
@click.native="showUploadAvatar=true"
/>
<div style="margin-left: 10px; margin-top: 5px;">
<el-button @click.native="showUploadAvatar=true">更换头像</el-button>
</div>
</div>
</div>
<p class="title pl-5">第三方账号</p>
<el-divider />
<div v-if="userInfo" class="account-info-view">
<table>
<tbody>
<tr>
<td width="80" style="text-align: right;">smile</td>
<td>
{{ userInfo.name }}
<el-link type="primary" @click="editDialogVisible=true">修改</el-link>
</td>
</tr>
<tr>
<td width="80" style="text-align: right;">smile</td>
<td>
{{ userInfo.name }}
<el-link type="primary" @click="editDialogVisible=true">修改</el-link>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</el-card>
<el-dialog
title="提示"
:visible.sync="editDialogVisible"
width="30%"
center
>
<el-form ref="form" :model="userInfo" label-width="80px">
<el-form-item label="新用户名">
<el-input v-model="userInfo.name" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editDialogVisible = false"> </el-button>
<el-button type="primary"
@click="()=>{this.editDialogVisible = false;this.updateUserHandle()}"
> </el-button>
</span>
</el-dialog>
<el-dialog
title="提示"
:visible.sync="pwdDialogVisible"
width="30%"
center
>
<el-form ref="form" :model="userInfo" label-width="80px">
<el-form-item label="新用户名">
<el-input v-model="userInfo.name" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="pwdDialogVisible = false"> </el-button>
<el-button type="primary"
@click="()=>{this.pwdDialogVisible = false;this.updateUserHandle()}"
> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import myUpload from 'vue-image-crop-upload'
export default {
name: 'Member',
components: {
myUpload
},
data() {
return {
editDialogVisible: false,
userInfo: {},
showUploadAvatar: false
}
},
created() {
this.$api.get('/user/current/detail').then(res => {
if (res.data) {
this.userInfo = res.data
}
})
},
methods: {
getUploadHeader() {
return {
'token': this.$store.getters['user/isLogin']
}
},
getUploadUrl() {
return `${process.env.VUE_APP_API_ROOT}/user/file/upload`
},
updateUserHandle() {
this.$api.post('/user/update', this.userInfo).then(res => {
if (res.data) {
console.log(res.data)
this.msgSuccess('保存成功')
}
})
},
cropUploadSuccess(res) {
console.log(res)
this.userInfo.avatar = res.data
this.updateUserHandle()
}
}
}
</script>
<style lang="scss" scoped>
.member-container {
display: flex;
align-content: center;
justify-content: center;
}
.title {
font-size: 16px;
}
.member-box-card {
margin-top: 20px;
width: 900px;
table {
color: #666;
font-size: 14px;
}
table tr {
line-height: 30px;
}
}
.account-info-view {
padding: 10px;
display: flex;
justify-content: space-between;
}
.account-avatar-view {
width: 180px;
}
</style>

15
src/views/form/ProjectForm.vue

@ -51,7 +51,7 @@ export default {
}, },
data() { data() {
return { return {
startParser:false, startParser: false,
projectTheme: { projectTheme: {
headImgUrl: '', headImgUrl: '',
logoImg: '', logoImg: '',
@ -60,7 +60,7 @@ export default {
}, },
formConf: { formConf: {
fields: [], fields: [],
projectKey:'', projectKey: '',
__methods__: {}, __methods__: {},
formRef: 'elForm', formRef: 'elForm',
formModel: 'formData', formModel: 'formData',
@ -98,10 +98,14 @@ export default {
this.formConf.size = window.innerWidth < 480 ? 'medium' : 'small' this.formConf.size = window.innerWidth < 480 ? 'medium' : 'small'
}, },
mounted() { mounted() {
this.$api.get(`/user/project/details/${this.formConf.projectKey }`).then(res => { this.$api.get(`/user/project/details/${this.formConf.projectKey}`).then(res => {
if (res.data) { if (res.data) {
let serialNumber = 1
let fields = res.data.projectItems.map(item => { let fields = res.data.projectItems.map(item => {
return dbDataConvertForItemJson(item) let projectItem = dbDataConvertForItemJson(item)
projectItem.serialNumber = serialNumber
serialNumber++
return projectItem
}) })
this.formConf.fields = fields this.formConf.fields = fields
this.formConf.title = res.data.project.name this.formConf.title = res.data.project.name
@ -120,7 +124,7 @@ export default {
this.formConf.submitBtnColor = btnsColor this.formConf.submitBtnColor = btnsColor
} }
} }
this.startParser=true this.startParser = true
} }
}) })
@ -184,6 +188,7 @@ export default {
width: 80%; width: 80%;
} }
} }
@media screen and (max-width: 500px) { @media screen and (max-width: 500px) {
.el-message { .el-message {
min-width: 300px !important; min-width: 300px !important;

15
src/views/home/index.vue

@ -2,7 +2,7 @@
<div> <div>
<el-container> <el-container>
<el-header height="92" class="home-header-view"> <el-header height="92" class="home-header-view">
<el-row type="flex" align="middle"> <el-row type="flex" align="middle" justify="center">
<el-col :span="4" :offset="1"> <el-col :span="4" :offset="1">
<img src="@/assets/images/indexLogo.png" class="header-logo-img" <img src="@/assets/images/indexLogo.png" class="header-logo-img"
@click="$router.push({path:'/'})" @click="$router.push({path:'/'})"
@ -23,7 +23,10 @@
<el-button round>升级</el-button> <el-button round>升级</el-button>
</el-col> </el-col>
<el-col :span="1"> <el-col :span="1">
<div style="display: flex; align-items: center; justify-content: center;"> <div style="display: flex;
align-items: center;
justify-content: center;"
>
<svg-icon name="loginWx" style="width: 24px; height: 24px;" /> <svg-icon name="loginWx" style="width: 24px; height: 24px;" />
</div> </div>
</el-col> </el-col>
@ -42,7 +45,7 @@
</div> </div>
<div class="person-menu-divider" /> <div class="person-menu-divider" />
<div> <div>
<p class="person-menu-item"> <p class="person-menu-item" @click="$router.push({path: '/home/member'})">
<font-icon class="fab fa-get-pocket" /> <font-icon class="fab fa-get-pocket" />
我的账户 我的账户
</p> </p>
@ -157,13 +160,14 @@ export default {
.home-header-view { .home-header-view {
line-height: 92px; line-height: 92px;
height: 92px; height: 92px;
min-width: 960px;
background-color: rgba(255, 255, 255, 100); background-color: rgba(255, 255, 255, 100);
color: rgba(16, 16, 16, 100); color: rgba(16, 16, 16, 100);
font-size: 14px; font-size: 14px;
text-align: center; text-align: center;
.header-logo-img { .header-logo-img {
width: 225px; width: 90%;
height: 62px; height: 90%;
float: left; float: left;
} }
} }
@ -182,6 +186,7 @@ export default {
} }
.person-menu-item:hover { .person-menu-item:hover {
cursor: pointer; cursor: pointer;
color: rgba(32, 91, 181, 100);
} }
.person-menu-divider { .person-menu-divider {
background-color: rgba(210, 210, 210, 78); background-color: rgba(210, 210, 210, 78);

21
src/views/official/index.vue

@ -2,15 +2,17 @@
<div class="official-container"> <div class="official-container">
<div class="header-container"> <div class="header-container">
<el-row type="flex" align="middle"> <el-row type="flex" align="middle">
<el-col class="header-col" :span="3" :offset="3"> <el-col class="header-col" :span="3" :offset="2">
<div> <div>
<img src="@/assets/images/indexLogo.png" class="header-logo" <img src="@/assets/images/indexLogo.png" class="header-logo"
@click="$router.push({path:'/home'})" @click="$router.push({path:'/home'})"
> >
</div> </div>
</el-col> </el-col>
<el-col class="header-col" :span="10" :offset="3"> <el-col class="header-col" :span="12" :offset="2">
<el-menu :default-active="menuIndex" mode="horizontal" :router="true" text-color="#205BB5" <el-menu :default-active="menuIndex" mode="horizontal"
style="width: 100%;"
:router="true" text-color="#205BB5"
active-text-color="#205BB5" active-text-color="#205BB5"
> >
<el-menu-item v-for="(item, index) in menuRouters" :key="index" :index="item.routerPath" <el-menu-item v-for="(item, index) in menuRouters" :key="index" :index="item.routerPath"
@ -44,6 +46,10 @@ export default {
return { return {
menuIndex: null, menuIndex: null,
menuRouters: [ menuRouters: [
{
routerPath: '/',
title: '首页'
},
{ {
routerPath: '/proposal', routerPath: '/proposal',
title: '提出建议' title: '提出建议'
@ -55,11 +61,8 @@ export default {
{ {
routerPath: '/enterprise', routerPath: '/enterprise',
title: '企业部署' title: '企业部署'
},
{
routerPath: '/',
title: '首页'
} }
] ]
} }
}, },
@ -90,6 +93,7 @@ export default {
.header-container { .header-container {
background-color: white; background-color: white;
width: 100%; width: 100%;
min-width: 960px;
top: 0; top: 0;
z-index: 100; z-index: 100;
} }
@ -100,16 +104,15 @@ export default {
border: none; border: none;
} }
.header-logo { .header-logo {
float: left;
cursor: pointer; cursor: pointer;
height: 60px; height: 60px;
float: left;
} }
.menu-item { .menu-item {
line-height: 90px; line-height: 90px;
height: 90px; height: 90px;
font-size: 18px; font-size: 18px;
font-weight: 900; font-weight: 900;
float: right;
} }
.header-btn { .header-btn {
margin: 35px 0 35px 20px; margin: 35px 0 35px 20px;

14
yarn.lock

@ -2373,7 +2373,7 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies: dependencies:
object.assign "^4.1.0" object.assign "^4.1.0"
babel-runtime@6.x: babel-runtime@6.x, babel-runtime@^6.11.6:
version "6.26.0" version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@ -6354,11 +6354,6 @@ js-cookie@^2.2.1:
resolved "https://registry.npm.taobao.org/js-cookie/download/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8" resolved "https://registry.npm.taobao.org/js-cookie/download/js-cookie-2.2.1.tgz#69e106dc5d5806894562902aa5baec3744e9b2b8"
integrity sha1-aeEG3F1YBolFYpAqpbrsN0Tpsrg= integrity sha1-aeEG3F1YBolFYpAqpbrsN0Tpsrg=
js-md5@^0.7.3:
version "0.7.3"
resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2"
integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ==
js-message@1.0.5: js-message@1.0.5:
version "1.0.5" version "1.0.5"
resolved "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15" resolved "https://registry.npm.taobao.org/js-message/download/js-message-1.0.5.tgz#2300d24b1af08e89dd095bc1a4c9c9cfcb892d15"
@ -11038,6 +11033,13 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" resolved "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha1-UylVzB6yCKPZkLOp+acFdGV+CPI= integrity sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=
vue-image-crop-upload@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/vue-image-crop-upload/-/vue-image-crop-upload-2.5.0.tgz#2dcf499e5b4944bc5077fc30b5f24d5e977f313c"
integrity sha512-AV+ZwPuaZ8tKdSopaSOCk4v0JqKZjFu6uLQg5D06pzt2GLcIR8NgrFz+/S0YN25RgkC4vHvUr9+XcNSUTk28ng==
dependencies:
babel-runtime "^6.11.6"
"vue-loader-v16@npm:vue-loader@^16.0.0-beta.7": "vue-loader-v16@npm:vue-loader@^16.0.0-beta.7":
version "16.0.0-beta.8" version "16.0.0-beta.8"
resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz#1f523d9fea8e8c6e4f5bb99fd768165af5845879" resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.8.tgz#1f523d9fea8e8c6e4f5bb99fd768165af5845879"

Loading…
Cancel
Save