便民通讯录
This commit is contained in:
		
							
								
								
									
										45
									
								
								src/apps/AppMailList/AppMailList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/apps/AppMailList/AppMailList.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| <template> | ||||
|   <div class="AppMailList"> | ||||
|     <component | ||||
|       :is="component" | ||||
|       @change="onChange" | ||||
|       :params="params"> | ||||
|     </component> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Add from './components/add' | ||||
| import List from './components/list' | ||||
| import MyAddList from './components/myAddList' | ||||
|  | ||||
| export default { | ||||
|   name: 'AppMailList', | ||||
|   appName: '便民通讯录', | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       component: 'List', | ||||
|       params: {} | ||||
|     } | ||||
|   }, | ||||
|  | ||||
|   components: { Add, List , MyAddList}, | ||||
|  | ||||
|   methods: { | ||||
|     onChange(e) { | ||||
|       this.params = e.params | ||||
|       this.component = e.type | ||||
|     } | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| uni-page-body{ | ||||
|   height: 100%; | ||||
| } | ||||
| .AppMailList{ | ||||
|   height: 100%; | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										182
									
								
								src/apps/AppMailList/components/add.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								src/apps/AppMailList/components/add.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| <template> | ||||
|   <div class="add"> | ||||
|     <div class="pad-l32"> | ||||
|       <div class="item border"> | ||||
|         <span class="label"><span class="tips">*</span>名称</span> | ||||
|         <div class="value"> | ||||
|           <u-input type="text" placeholder="请输入" v-model="userInfo.name" input-align="right" placeholder-style="color:#999;font-size:16px;" height="48"  :maxlength="7" /> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item border"> | ||||
|         <span class="label"><span class="tips">*</span>类型</span> | ||||
|         <div class="value"> | ||||
|           <u-input type="text" placeholder="请输入" v-model="userInfo.type" input-align="right" placeholder-style="color:#999;font-size:16px;" height="48"  :maxlength="7" /> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item border"> | ||||
|         <span class="label"><span class="tips">*</span>电话</span> | ||||
|         <div class="value"> | ||||
|           <u-input type="number" placeholder="请输入" v-model="userInfo.phone" input-align="right" placeholder-style="color:#999;font-size:16px;" height="48"  :maxlength="7" /> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item border"> | ||||
|         <span class="label"><span class="tips">*</span>是否公开</span> | ||||
|         <div class="value" @click="showSelect=true"> | ||||
|           <span :class="userInfo.isPublic === '' ? 'color-999' : ''">{{$dict.getLabel('yesOrNo', userInfo.isPublic) || '请选择'}}</span> | ||||
|           <u-icon name="arrow-right" color="#cccccc" size="14"></u-icon> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item"> | ||||
|         <span class="label"><span class="tips">*</span>地区</span> | ||||
|         <div class="value"> | ||||
|           <AiAreaPicker :areaId="user.areaId" v-model="userInfo.areaId" @select="areaSelect"> | ||||
|             <span class="label" v-if="userInfo.areaName">{{ userInfo.areaName }}</span> | ||||
|             <span v-else class="color-999">请选择</span> | ||||
|             <u-icon name="arrow-right" color="#cccccc" size="14"></u-icon> | ||||
|           </AiAreaPicker> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|      | ||||
|     <div class="footer" @click="submit"> | ||||
|       <div class="btn">保存</div> | ||||
|     </div> | ||||
|  | ||||
|     <u-select v-model="showSelect" :list="$dict.getDict('yesOrNo')"  label-name="dictName" value-name="dictValue" @confirm="confirmSelect"></u-select> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from 'vuex' | ||||
| export default { | ||||
|   props: ['params'], | ||||
|   data() { | ||||
|     return { | ||||
|       id: '', | ||||
|       userInfo: { | ||||
|         id: '', | ||||
|         name: '', | ||||
|         phone: '', | ||||
|         type: '', | ||||
|         isPublic: '', | ||||
|         areaId: '', | ||||
|         areaName: '' | ||||
|       }, | ||||
|       showSelect: false, | ||||
|     } | ||||
|   }, | ||||
|   computed: { ...mapState(['user']) }, | ||||
|   mounted() {     | ||||
|     this.$dict.load('yesOrNo').then(() => { | ||||
|       if(this.params.id) { | ||||
|         this.userInfo.id = this.params.id | ||||
|         this.getDetail() | ||||
|       } | ||||
|     }) | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     areaSelect(e) { | ||||
|       this.userInfo.areaId = e.id | ||||
|       this.userInfo.areaName = e.name | ||||
|     }, | ||||
|     confirmSelect(e) { | ||||
|       this.userInfo.isPublic = e[0].value | ||||
|     }, | ||||
|     getDetail() { | ||||
|       this.$http.post(`/app/appconvenientaddressbook/queryDetailById?id=${this.userInfo.id}`).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.userInfo = res.data | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     submit() { | ||||
|       if(!this.userInfo.name) { | ||||
|         return this.$u.toast('请输入名称') | ||||
|       } | ||||
|       if(!this.userInfo.type) { | ||||
|         return this.$u.toast('请输入类型') | ||||
|       } | ||||
|       if(!this.userInfo.phone) { | ||||
|         return this.$u.toast('请输入电话') | ||||
|       } | ||||
|       if(this.userInfo.isPublic === '') { | ||||
|         return this.$u.toast('请选择是否公开') | ||||
|       } | ||||
|       if(!this.userInfo.areaId) { | ||||
|         return this.$u.toast('请选择地区') | ||||
|       } | ||||
|       this.$http.post(`/app/appconvenientaddressbook/addOrUpdate`, this.userInfo).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.$u.toast('提交成功') | ||||
|           setTimeout(() => { | ||||
|             uni.navigateBack() | ||||
|           }, 600) | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|   } | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .add { | ||||
|   padding-bottom: 112px; | ||||
|   .border{ | ||||
|     border-bottom: 1px solid #ddd; | ||||
|   } | ||||
|   .item{ | ||||
|     width: 100%; | ||||
|     padding: 40px 32px 40px 0; | ||||
|     background: #FFFFFF; | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     font-size: 34px; | ||||
|     font-family: PingFangSC-Medium, PingFang SC; | ||||
|     font-weight: 500; | ||||
|     color: #666; | ||||
|     line-height: 48px; | ||||
|     box-sizing: border-box; | ||||
|     .color-999{ | ||||
|       color: #999; | ||||
|     } | ||||
|     .value{ | ||||
|       color: #333; | ||||
|       .u-icon{ | ||||
|         margin-left: 16px; | ||||
|       } | ||||
|     } | ||||
|     .tips{ | ||||
|       display: inline-block; | ||||
|       width: 16px; | ||||
|       font-size: 32px; | ||||
|       font-family: PingFangSC-Regular, PingFang SC; | ||||
|       color: #FF4466; | ||||
|       line-height: 44px; | ||||
|       margin-right: 4px; | ||||
|     } | ||||
|   } | ||||
|   .footer{ | ||||
|     width: 100%; | ||||
|     position: fixed; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|   } | ||||
|   .btn{ | ||||
|     width: 100%; | ||||
|     height: 112px; | ||||
|     line-height: 112px; | ||||
|     text-align: center; | ||||
|     background: #3975C6; | ||||
|     font-size: 32px; | ||||
|     font-family: PingFangSC-Medium, PingFang SC; | ||||
|     font-weight: 500; | ||||
|     color: #FFF; | ||||
|   } | ||||
|   .pad-l32{ | ||||
|     padding-left: 32px; | ||||
|     background-color: #fff; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/del-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/del-icon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/edit-icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/edit-icon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 1.5 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/empty.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/apps/AppMailList/components/img/empty.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.2 KiB | 
							
								
								
									
										159
									
								
								src/apps/AppMailList/components/list.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								src/apps/AppMailList/components/list.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| <template> | ||||
|   <div class="list"> | ||||
|     <div class="list-content"> | ||||
|       <div class="item" :id="'id'+item.label"  v-for="(item, index) in list" :key="index"> | ||||
|         <div class="title">{{item.label}}</div> | ||||
|         <div class="phone-list"> | ||||
|           <div class="item-info" v-for="(e, indexs) in item.dataList" :key="indexs"> | ||||
|             <p>{{e.name}}</p> | ||||
|             <div class="phone"> | ||||
|               <span>{{e.type}}</span>{{e.phone}} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="id-list"> | ||||
|       <a class="item" :href="'#id'+item.label" v-for="(item, index) in list" :key="index">{{item.label}}</a> | ||||
|     </div> | ||||
|     <div class="footer-btn" @click="toAddList">我添加的</div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from 'vuex' | ||||
| export default { | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       list: [], | ||||
|     } | ||||
|   }, | ||||
|   computed: { ...mapState(['user']) }, | ||||
|   mounted() { | ||||
|     this.getList() | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.$http.post(`/app/appconvenientaddressbook/list`, null, { | ||||
|         params: { | ||||
|           areaId: this.user.areaId, | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           var list = [] | ||||
|           var data = [] | ||||
|           res.data.records.map((item) => { | ||||
|             if(list.indexOf(item.nameInitials)) { | ||||
|               list.push(item.nameInitials) | ||||
|             } | ||||
|           }) | ||||
|           list.map((item) => { | ||||
|             var obj = { | ||||
|               label: item, | ||||
|               dataList: [] | ||||
|             } | ||||
|             data.push(obj) | ||||
|           }) | ||||
|           data.map((item, index) => { | ||||
|             res.data.records.map((items) => { | ||||
|               if(item.label == items.nameInitials) { | ||||
|                 data[index].dataList.push(items) | ||||
|               } | ||||
|             }) | ||||
|           }) | ||||
|           this.list = data | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     toAddList() { | ||||
|       this.$emit('change', { | ||||
|         type: 'MyAddList', | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .list { | ||||
|   background-color: #F3F6F9; | ||||
|   .list-content{ | ||||
|     padding-bottom: 112px; | ||||
|     .title{ | ||||
|       padding-left: 48px; | ||||
|       line-height: 64px; | ||||
|       font-size: 26px; | ||||
|       font-family: PingFangSC-Semibold, PingFang SC; | ||||
|       font-weight: 600; | ||||
|       color: #999; | ||||
|     } | ||||
|     .phone-list{ | ||||
|       background-color: #fff; | ||||
|       width: 100%; | ||||
|       .item-info{ | ||||
|         width: 100%; | ||||
|         padding: 32px 48px; | ||||
|         box-sizing: border-box; | ||||
|         box-shadow: 0px 0px 8px 0px rgba(0, 0, 0, 0.02); | ||||
|         p{ | ||||
|           font-size: 32px; | ||||
|           font-family: PingFangSC-Medium, PingFang SC; | ||||
|           font-weight: 500; | ||||
|           color: #333; | ||||
|           line-height: 44px; | ||||
|           word-break: break-all; | ||||
|           margin-bottom: 8px; | ||||
|         } | ||||
|         .phone{ | ||||
|           font-size: 26px; | ||||
|           font-family: PingFangSC-Regular, PingFang SC; | ||||
|           color: #333; | ||||
|           line-height: 36px; | ||||
|           span{ | ||||
|             display: inline-block; | ||||
|             margin-right: 16px; | ||||
|             color: #999; | ||||
|           } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   .id-list{ | ||||
|     width: 50px; | ||||
|     text-align: center; | ||||
|     position: fixed; | ||||
|     top: 160px; | ||||
|     right: 32px; | ||||
|     z-index: 99; | ||||
|     .item{ | ||||
|       display: block; | ||||
|       font-size: 24px; | ||||
|       font-family: PingFangSC-Semibold, PingFang SC; | ||||
|       font-weight: 600; | ||||
|       color: #CCC; | ||||
|       line-height: 40px; | ||||
|     } | ||||
|   } | ||||
|   .footer-btn{ | ||||
|     width: 100%; | ||||
|     text-align: center; | ||||
|     height: 112px; | ||||
|     line-height: 112px; | ||||
|     background: #3975C6; | ||||
|     box-shadow: 0px 1px 0px 0px #EEEEEE; | ||||
|     position: fixed; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     font-size: 32px; | ||||
|     font-family: PingFangSC-Medium, PingFang SC; | ||||
|     font-weight: 500; | ||||
|     color: #FFF; | ||||
|     z-index: 999; | ||||
|   } | ||||
|   a { | ||||
|     text-decoration: none; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
							
								
								
									
										160
									
								
								src/apps/AppMailList/components/myAddList.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								src/apps/AppMailList/components/myAddList.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| <template> | ||||
|   <div class="myAddList"> | ||||
|     <div class="list-content" v-if="list.length"> | ||||
|       <div class="item-info" v-for="(item, index) in list" :key="index"> | ||||
|         <div class="left"> | ||||
|           <p>{{item.name}}</p> | ||||
|           <div class="phone"> | ||||
|             <span>{{item.type}}</span>{{item.phone}} | ||||
|           </div> | ||||
|         </div> | ||||
|         <div class="right"> | ||||
|           <img src="./img/edit-icon.png" alt="" @click="edit(item)"> | ||||
|           <img src="./img/del-icon.png" alt="" @click="del(item)"> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div class="empty" v-else> | ||||
|       <img src="./img/empty.png" alt=""> | ||||
|       <p>您还未添加便民通讯录<br/>点击<span>新增按钮</span>试试吧</p> | ||||
|     </div> | ||||
|     <div class="footer-btn" @click="edit('')">新增</div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from 'vuex' | ||||
| export default { | ||||
|  | ||||
|   data() { | ||||
|     return { | ||||
|       list: [], | ||||
|     } | ||||
|   }, | ||||
|   computed: { ...mapState(['user']) }, | ||||
|   mounted() { | ||||
|     this.getList() | ||||
|   }, | ||||
|  | ||||
|   methods: { | ||||
|     getList() { | ||||
|       this.$http.post(`/app/appconvenientaddressbook/list`, null, { | ||||
|         params: { | ||||
|           areaId: this.user.areaId, | ||||
|           createUserId: this.user.id | ||||
|         } | ||||
|       }).then(res => { | ||||
|         if (res.code == 0) { | ||||
|           this.list = res.data.records | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     edit(id) { | ||||
|       this.$emit('change', { | ||||
|         type: 'Add', | ||||
|         params: { | ||||
|           id: id, | ||||
|         } | ||||
|       }) | ||||
|     }, | ||||
|     del(item) { | ||||
|       this.$confirm("是否确认删除该发布信息?").then(() => { | ||||
|         this.$http.post("/app/appconvenientaddressbook/delete", null, { | ||||
|           params: {ids: item.id} | ||||
|         }).then(res => { | ||||
|           if (res?.code == 0) { | ||||
|             this.$u.toast("删除成功!") | ||||
|             this.getList() | ||||
|           } | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|   }, | ||||
| } | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .myAddList { | ||||
|   height: 100%; | ||||
|   background-color: #F3F6F9; | ||||
|   .list-content{ | ||||
|     padding-bottom: 112px; | ||||
|     .item-info{ | ||||
|       width: 100%; | ||||
|       padding: 32px 48px; | ||||
|       box-sizing: border-box; | ||||
|       background-color: #fff; | ||||
|       margin-bottom: 4px; | ||||
|       p{ | ||||
|         font-size: 32px; | ||||
|         font-family: PingFangSC-Medium, PingFang SC; | ||||
|         font-weight: 500; | ||||
|         color: #333; | ||||
|         line-height: 44px; | ||||
|         word-break: break-all; | ||||
|         margin-bottom: 8px; | ||||
|       } | ||||
|       .phone{ | ||||
|         font-size: 26px; | ||||
|         font-family: PingFangSC-Regular, PingFang SC; | ||||
|         color: #333; | ||||
|         line-height: 36px; | ||||
|         span{ | ||||
|           display: inline-block; | ||||
|           margin-right: 16px; | ||||
|           color: #999; | ||||
|         } | ||||
|       } | ||||
|       .left{ | ||||
|         display: inline-block; | ||||
|         width: calc(100% - 176px); | ||||
|       } | ||||
|       .right{ | ||||
|         display: inline-block; | ||||
|         width: 176px; | ||||
|         img{ | ||||
|           width: 56px; | ||||
|           height: 56px; | ||||
|           margin-left: 32px; | ||||
|           vertical-align: super; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   .empty{ | ||||
|     height: 100%; | ||||
|     background-color: #fff; | ||||
|     img{ | ||||
|       width: 282px; | ||||
|       height: 306px; | ||||
|       margin: 168px 0 0 234px; | ||||
|     } | ||||
|     p{ | ||||
|       text-align: center; | ||||
|       font-size: 28px; | ||||
|       font-family: PingFangSC-Regular, PingFang SC; | ||||
|       color: #999; | ||||
|       line-height: 44px; | ||||
|       span{ | ||||
|         color: #467DFE; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|   .footer-btn{ | ||||
|     width: 100%; | ||||
|     text-align: center; | ||||
|     height: 112px; | ||||
|     line-height: 112px; | ||||
|     background: #3975C6; | ||||
|     box-shadow: 0px 1px 0px 0px #EEEEEE; | ||||
|     position: fixed; | ||||
|     bottom: 0; | ||||
|     left: 0; | ||||
|     font-size: 32px; | ||||
|     font-family: PingFangSC-Medium, PingFang SC; | ||||
|     font-weight: 500; | ||||
|     color: #FFF; | ||||
|     z-index: 999; | ||||
|   } | ||||
| } | ||||
| </style> | ||||
		Reference in New Issue
	
	Block a user