通知公告
This commit is contained in:
		
							
								
								
									
										355
									
								
								src/apps/AppNotification/AppNotification.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										355
									
								
								src/apps/AppNotification/AppNotification.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,355 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="notification">
 | 
			
		||||
    <AiTopFixed>
 | 
			
		||||
      <u-tabs :list="tabs" :is-scroll="false" height="96" bar-width="192" :current="index" @change="change"></u-tabs>
 | 
			
		||||
    </AiTopFixed>
 | 
			
		||||
    <div class="body" v-if="dataList.length">
 | 
			
		||||
      <div class="card" v-for="(item,idx) in dataList" :key="idx" @click="handeClick(item)">
 | 
			
		||||
        <template v-if="!item.imgUrl">
 | 
			
		||||
          <label>
 | 
			
		||||
            <b v-if="index==0 && item.readStatus==0"></b>
 | 
			
		||||
            <div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
 | 
			
		||||
            {{item.title}}
 | 
			
		||||
          </label>
 | 
			
		||||
          <u-gap height="16"></u-gap>
 | 
			
		||||
          <span class="info">
 | 
			
		||||
            <text>{{item.releaseUserName}}</text>
 | 
			
		||||
            <text>{{item.releaseTime}}</text>
 | 
			
		||||
          </span>
 | 
			
		||||
        </template>
 | 
			
		||||
        <template v-else>
 | 
			
		||||
          <div class="has-pic">
 | 
			
		||||
            <div class="left">
 | 
			
		||||
              <label>
 | 
			
		||||
                <b v-if="index==0 && item.readStatus==0"></b>
 | 
			
		||||
                <div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
 | 
			
		||||
                {{item.title}}
 | 
			
		||||
              </label>
 | 
			
		||||
              <u-gap height="16"></u-gap>
 | 
			
		||||
              <span class="info">
 | 
			
		||||
                <text>{{item.releaseUserName}}</text>
 | 
			
		||||
                <text>{{item.releaseTime}}</text>
 | 
			
		||||
              </span>
 | 
			
		||||
            </div>
 | 
			
		||||
            <img :src="item.imgUrl" alt="">
 | 
			
		||||
          </div>
 | 
			
		||||
        </template>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <AiEmpty v-else/>
 | 
			
		||||
    <u-loadmore :status="status" v-if="dataList.length"/>
 | 
			
		||||
    <AiAdd @add="add"/>
 | 
			
		||||
    <u-popup v-model="show" mode="bottom">
 | 
			
		||||
      <div class="popup-wrap">
 | 
			
		||||
        <u-row justify="between">
 | 
			
		||||
          <div class="colum" v-for="(item,index) in optList" :key="index" @click="handleOpt(item)">
 | 
			
		||||
            <u-icon :name="item.icon" size="100" :custom-style="{backgroundColor:'#fff',borderRadius:'16px'}"></u-icon>
 | 
			
		||||
            <u-gap height="16"></u-gap>
 | 
			
		||||
            {{item.name}}
 | 
			
		||||
          </div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <div class="btn" @click="show=false">关闭</div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </u-popup>
 | 
			
		||||
    <u-modal v-model="modal" :content="'是否确定' + content + '该公告?'" title="" show-confirm-button
 | 
			
		||||
             show-cancel-button confirm-text="确定" cancel-text="取消"
 | 
			
		||||
             @confirm="confirm"></u-modal>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import AiAdd from "../../components/AiAdd";
 | 
			
		||||
  import AiEmpty from "../../components/AiEmpty/AiEmpty";
 | 
			
		||||
  import AiTopFixed from "../../components/AiTopFixed";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "notification",
 | 
			
		||||
    appName: "通知公告",
 | 
			
		||||
    components: {AiAdd, AiEmpty,AiTopFixed},
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
        index: 0,
 | 
			
		||||
        show: false,
 | 
			
		||||
        modal: false,
 | 
			
		||||
        content: "",
 | 
			
		||||
        current: 1,
 | 
			
		||||
        dataList: [],
 | 
			
		||||
        detail: {},
 | 
			
		||||
        status: "加载更多",
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onLoad(){
 | 
			
		||||
      this.$dict.load("announcementStatus");
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    computed: {
 | 
			
		||||
      tabs() {
 | 
			
		||||
        return [{name: "最新公告"},{name: "公告管理"}];
 | 
			
		||||
      },
 | 
			
		||||
      optList(){
 | 
			
		||||
        return [
 | 
			
		||||
          {
 | 
			
		||||
            name: "详情",
 | 
			
		||||
            icon: this.$cdn + "notice/yl.png",
 | 
			
		||||
            val: 0,
 | 
			
		||||
            show: true,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            name: "撤回",
 | 
			
		||||
            icon: this.$cdn + "notice/ch.png",
 | 
			
		||||
            val: 1,
 | 
			
		||||
            show: this.detail?.status == 1,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            name: "发布",
 | 
			
		||||
            icon: this.$cdn + "notice/fb.png",
 | 
			
		||||
            val: 2,
 | 
			
		||||
            show: this.detail?.status == 0,
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
            name: "编辑",
 | 
			
		||||
            icon: this.$cdn + "notice/bj.png",
 | 
			
		||||
            val: 3,
 | 
			
		||||
            show: this.detail?.status == 0 || this.detail?.status == 3,
 | 
			
		||||
          }, {
 | 
			
		||||
            name: "删除",
 | 
			
		||||
            icon: this.$cdn + "notice/sc.png",
 | 
			
		||||
            val: 4,
 | 
			
		||||
            show: true,
 | 
			
		||||
          }
 | 
			
		||||
        ].filter(e=>e.show)
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    methods: {
 | 
			
		||||
      changeState(){
 | 
			
		||||
        this.$http.post(this.content =='删除' ? '/app/appannouncement/delete' : "/app/appannouncement/update-status",null,{
 | 
			
		||||
          params: {
 | 
			
		||||
            [this.content =='删除' ? 'ids' : 'id']:this.detail.id
 | 
			
		||||
          }
 | 
			
		||||
        }).then(res=>{
 | 
			
		||||
          if(res.code==0){
 | 
			
		||||
            this.$u.toast(this.content + "成功");
 | 
			
		||||
            this.getList();
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
      confirm(){
 | 
			
		||||
        this.show = false;
 | 
			
		||||
        this.changeState();
 | 
			
		||||
      },
 | 
			
		||||
      handleOpt(item){
 | 
			
		||||
        this.content = {
 | 
			
		||||
          1: "撤回",
 | 
			
		||||
          2: "发布",
 | 
			
		||||
          4: "删除",
 | 
			
		||||
        }[item.val];
 | 
			
		||||
 | 
			
		||||
        if (item.val == 0) {
 | 
			
		||||
          this.show = false;
 | 
			
		||||
          return uni.navigateTo({
 | 
			
		||||
            url: "/pages/notification/components/detail?id=" + this.detail.id
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ([1,2,4].includes(item.val)) {
 | 
			
		||||
          return this.modal = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(item.val==3){
 | 
			
		||||
          this.show = false;
 | 
			
		||||
          return uni.navigateTo({
 | 
			
		||||
            url:"/pages/notification/components/add?id=" + this.detail.id + "&flag=" + false
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      color(status){
 | 
			
		||||
        return [
 | 
			
		||||
          {backgroundColor:"rgba(255,136,34,0.1)",color:"#FF8822"},
 | 
			
		||||
          {backgroundColor:"rgba(34,102,255,0.1)",color:"#2266FF"},
 | 
			
		||||
          {backgroundColor:"rgba(102,102,102,0.1)",color:"#666666"},
 | 
			
		||||
          {backgroundColor:"rgba(255,136,34,0.1)",color:"#FF8822"}
 | 
			
		||||
        ][status];
 | 
			
		||||
      },
 | 
			
		||||
      handeClick(item) {
 | 
			
		||||
        this.detail = item;
 | 
			
		||||
        if (this.index == 1) {
 | 
			
		||||
          this.show = true;
 | 
			
		||||
        }else {
 | 
			
		||||
          uni.navigateTo({
 | 
			
		||||
            url: "/pages/notification/components/detail?id=" + this.detail.id + "&flag=" + true
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      add(){
 | 
			
		||||
        uni.navigateTo({
 | 
			
		||||
          url: "/pages/notification/components/add"
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
      change(val) {
 | 
			
		||||
        this.index = val;
 | 
			
		||||
        this.current = 1;
 | 
			
		||||
        this.getList()
 | 
			
		||||
      },
 | 
			
		||||
      getList() {
 | 
			
		||||
        this.$http.post(this.index ==0 ? "/app/appannouncement/list-latest" : "/app/appannouncement/list-mgr", null, {
 | 
			
		||||
          params: {
 | 
			
		||||
            size: 10,
 | 
			
		||||
            current: this.current
 | 
			
		||||
          }
 | 
			
		||||
        }).then(res => {
 | 
			
		||||
          if (res && res.data) {
 | 
			
		||||
            if (this.current > 1 && this.current > res.data.pages) {
 | 
			
		||||
              this.status = "已经到底啦"
 | 
			
		||||
            }
 | 
			
		||||
            this.dataList = this.current > 1 ? [...this.dataList, ...res.data.records] : res.data.records
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onShow() {
 | 
			
		||||
      this.current = 1;
 | 
			
		||||
      this.getList();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    onReachBottom() {
 | 
			
		||||
      this.current = this.current + 1;
 | 
			
		||||
      this.getList()
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  .notification {
 | 
			
		||||
    min-height: 100%;
 | 
			
		||||
    background-color: #F5F5F5;
 | 
			
		||||
    padding-bottom: 32px;
 | 
			
		||||
 | 
			
		||||
    ::v-deep .content{
 | 
			
		||||
      padding: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .body {
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 32px;
 | 
			
		||||
 | 
			
		||||
      .card {
 | 
			
		||||
        height: 208px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        flex-direction: column;
 | 
			
		||||
        justify-content: space-between;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 32px;
 | 
			
		||||
        border-radius: 8px;
 | 
			
		||||
        background-color: #ffffff;
 | 
			
		||||
        margin-bottom: 32px;
 | 
			
		||||
 | 
			
		||||
        &:last-child{
 | 
			
		||||
          margin-bottom: 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        & > label {
 | 
			
		||||
          font-size: 32px;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          text-overflow: ellipsis;
 | 
			
		||||
          display: -webkit-box;
 | 
			
		||||
          -webkit-box-orient: vertical;
 | 
			
		||||
          -webkit-line-clamp: 2;
 | 
			
		||||
          color: #333333;
 | 
			
		||||
          line-height: 44px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        b {
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
          font-style: normal;
 | 
			
		||||
          width: 16px;
 | 
			
		||||
          height: 16px;
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          background: #FF4466;
 | 
			
		||||
          margin-right: 8px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .tag{
 | 
			
		||||
          width: 96px;
 | 
			
		||||
          height: 44px;
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
          border-radius: 8px;
 | 
			
		||||
          margin-right: 16px;
 | 
			
		||||
          font-size: 26px;
 | 
			
		||||
          font-weight: 400;
 | 
			
		||||
          line-height: 46px;
 | 
			
		||||
          text-align: center;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .info {
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          color: #999999;
 | 
			
		||||
          line-height: 40px;
 | 
			
		||||
 | 
			
		||||
          & > text:first-child {
 | 
			
		||||
            margin-right: 32px;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        & > .has-pic {
 | 
			
		||||
          display: flex;
 | 
			
		||||
          justify-content: space-between;
 | 
			
		||||
 | 
			
		||||
          & > .left {
 | 
			
		||||
            display: flex;
 | 
			
		||||
            flex-direction: column;
 | 
			
		||||
            justify-content: space-between;
 | 
			
		||||
 | 
			
		||||
            & > label {
 | 
			
		||||
              overflow: hidden;
 | 
			
		||||
              text-overflow: ellipsis;
 | 
			
		||||
              display: -webkit-box;
 | 
			
		||||
              -webkit-box-orient: vertical;
 | 
			
		||||
              -webkit-line-clamp: 2;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          & > img{
 | 
			
		||||
            width: 192px;
 | 
			
		||||
            height: 144px;
 | 
			
		||||
            flex-shrink: 0;
 | 
			
		||||
            margin-left: 32px;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .popup-wrap {
 | 
			
		||||
      height: 368px;
 | 
			
		||||
      background-color: #F7F7F7;
 | 
			
		||||
 | 
			
		||||
      .btn{
 | 
			
		||||
        height: 96px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        font-size: 30px;
 | 
			
		||||
        font-weight: 500;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        background-color: #ffffff;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > .u-row {
 | 
			
		||||
        height: 272px;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 0 46px;
 | 
			
		||||
 | 
			
		||||
        & > .colum {
 | 
			
		||||
          display: flex;
 | 
			
		||||
          flex-direction: column;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          justify-content: center;
 | 
			
		||||
          font-size: 26px;
 | 
			
		||||
          color: #666666;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										358
									
								
								src/apps/AppNotification/components/add.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										358
									
								
								src/apps/AppNotification/components/add.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,358 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="add-meeting">
 | 
			
		||||
    <div v-if="!userSelect">
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <header><em>*</em>公告标题</header>
 | 
			
		||||
        <input v-model="form.title" placeholder="请输入" :maxlength="30">
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <header><em>*</em>公告内容</header>
 | 
			
		||||
        <textarea v-model="form.content" placeholder="请输入" :maxlength="500"></textarea>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <AiUploader :multiple="true" type="image" :limit="9" placeholder="上传图片" @list="fileList" :def="form.files"></AiUploader>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card item-wrap" @click="select">
 | 
			
		||||
        <u-row justify="between" class="item" style="border-bottom: 1px solid #eeeeee" @click="userSelect=true">
 | 
			
		||||
          <header><em>*</em>发送对象</header>
 | 
			
		||||
          <div class="right">
 | 
			
		||||
            <template v-if="!form.persons.length">
 | 
			
		||||
              <span>请选择</span>
 | 
			
		||||
            </template>
 | 
			
		||||
            <template v-else>
 | 
			
		||||
              已选择<em>{{form.persons.map(e=>e.name).slice(0,2).join("、")}}</em>等<em>{{form.persons.length}}</em>人
 | 
			
		||||
            </template>
 | 
			
		||||
            <div class="right-arrow"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
 | 
			
		||||
        <u-row justify="between" class="item" @click="userSelect=true">
 | 
			
		||||
          <header><em>*</em>发送时间</header>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <u-row justify="between">
 | 
			
		||||
          <div class="type" :class="[index==0 && 'active']" @click="index=0,form.releaseTime=null">立即发送
 | 
			
		||||
            <img :src="$cdn + 'notice/jiaobiao.png'" alt="" v-show="index==0">
 | 
			
		||||
          </div>
 | 
			
		||||
          <div class="type" :class="[index==1 && 'active']"  @click="index=1">定时发送
 | 
			
		||||
            <img :src="$cdn + 'notice/jiaobiao.png'" alt="" v-show="index==1">
 | 
			
		||||
          </div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <u-gap height="38"></u-gap>
 | 
			
		||||
        <u-row justify="between" class="item" style="box-shadow: none;" @click="show=true" v-show="index==1">
 | 
			
		||||
          <header><em>*</em>定时发送时间</header>
 | 
			
		||||
          <div class="right">
 | 
			
		||||
            <template v-if="!form.releaseTime">
 | 
			
		||||
              <span>请选择</span>
 | 
			
		||||
            </template>
 | 
			
		||||
            <template v-else>
 | 
			
		||||
              <span>{{form.releaseTime}}</span>
 | 
			
		||||
            </template>
 | 
			
		||||
            <div class="right-arrow"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="footer">
 | 
			
		||||
        <div @click="add(0)">保存草稿</div>
 | 
			
		||||
        <div @click="add(1)">立即发布</div>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <AiBack ref="aiBack" v-if="!userSelect"/>
 | 
			
		||||
    <u-picker v-model="show" mode="time" :params="params" @confirm="confirm"></u-picker>
 | 
			
		||||
    <AiSelectEnterprise :visible.sync="userSelect" :value="form.persons" v-if="userSelect" @change="change"></AiSelectEnterprise>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import AiBack from "../../../components/AiBack";
 | 
			
		||||
  import AiSelectEnterprise from "../../../components/AiSelectEnterprise/AiSelectEnterprise";
 | 
			
		||||
  import AiUploader from "../../../components/AiUploader";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "add",
 | 
			
		||||
    components: {AiBack,AiSelectEnterprise,AiUploader},
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
        show: false,
 | 
			
		||||
        index: 0,
 | 
			
		||||
        list: [],
 | 
			
		||||
        form: {
 | 
			
		||||
          id: null,
 | 
			
		||||
          title: "",
 | 
			
		||||
          content: "",
 | 
			
		||||
          persons: [],
 | 
			
		||||
          releaseTime:null,
 | 
			
		||||
          files: [],
 | 
			
		||||
        },
 | 
			
		||||
        userSelect: false,
 | 
			
		||||
        params: {
 | 
			
		||||
          year: true,
 | 
			
		||||
          month: true,
 | 
			
		||||
          day: true,
 | 
			
		||||
          hour: true,
 | 
			
		||||
          minute: true,
 | 
			
		||||
          second: true,
 | 
			
		||||
          timestamp: true,
 | 
			
		||||
        },
 | 
			
		||||
        flag: null,
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    onLoad(opt) {
 | 
			
		||||
      if(opt.id) {
 | 
			
		||||
        this.form.id = opt.id;
 | 
			
		||||
        this.flag = opt.flag;
 | 
			
		||||
        this.getDetail();
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      confirm(e){
 | 
			
		||||
        if(e.timestamp< (Date.now()/1000)|0){
 | 
			
		||||
          return this.$u.toast("发送时间不能小于当前时间");
 | 
			
		||||
        }
 | 
			
		||||
        this.form.releaseTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`;
 | 
			
		||||
      },
 | 
			
		||||
      fileList(e){
 | 
			
		||||
        this.form.files = e
 | 
			
		||||
      },
 | 
			
		||||
      change(e){
 | 
			
		||||
        this.form.persons = e
 | 
			
		||||
      },
 | 
			
		||||
      getDetail(){
 | 
			
		||||
        this.$http.post("/app/appannouncement/detail",null,{
 | 
			
		||||
          params:{
 | 
			
		||||
            id:this.form.id,
 | 
			
		||||
            detail: this.flag
 | 
			
		||||
          }
 | 
			
		||||
        }).then(res=>{
 | 
			
		||||
          if (res && res.data) {
 | 
			
		||||
            this.form.releaseTime = res.data.releaseTime;
 | 
			
		||||
            Object.keys(this.form).map(e=>{
 | 
			
		||||
              this.form[e] =  res.data[e];
 | 
			
		||||
            })
 | 
			
		||||
            this.index = res.data.releaseTime ? 1 : 0;
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      add(status) {
 | 
			
		||||
        if(status==1){
 | 
			
		||||
          if (!this.form.title) return this.$u.toast("请输入会议标题")
 | 
			
		||||
 | 
			
		||||
          if (!this.form.content) return this.$u.toast("请输入会议内容")
 | 
			
		||||
 | 
			
		||||
          if(!this.form.persons.length) return this.$u.toast("请选择发送对象")
 | 
			
		||||
 | 
			
		||||
          if(this.index==1 && !this.form.releaseTime) return this.$u.toast("请选择定时发送时间")
 | 
			
		||||
 | 
			
		||||
          if(this.form.releaseTime && new Date(this.form.releaseTime).getTime() < Date.now()) return this.$u.toast("发送时间不能小于当前时间");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.$http.post("/app/appannouncement/addOrUpdate", {
 | 
			
		||||
          ...this.form,
 | 
			
		||||
          status,
 | 
			
		||||
        }).then(res => {
 | 
			
		||||
          if (res.code == 0) {
 | 
			
		||||
            this.$u.toast(status == 1 ? "发布成功" : "保存成功")
 | 
			
		||||
            this.$refs["aiBack"].back()
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
      select() {
 | 
			
		||||
        uni.navigateTo({
 | 
			
		||||
          url: "/pages/meetingNotice/components/notice"
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    computed:{
 | 
			
		||||
      background(){
 | 
			
		||||
        return `url(${this.$cdn}/notice/jiaobiao.png) no-repeat; background-size: 46px 48px;position: absolute;bottom: 0;right: 0;`
 | 
			
		||||
      },
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  .add-meeting {
 | 
			
		||||
    min-height: 100%;
 | 
			
		||||
    background: #F5F5F5;
 | 
			
		||||
    padding-bottom: 140px;
 | 
			
		||||
 | 
			
		||||
    .card {
 | 
			
		||||
      background-color: #FFFFFF;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 32px;
 | 
			
		||||
      margin-top: 16px;
 | 
			
		||||
 | 
			
		||||
      header {
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
        font-weight: 400;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
 | 
			
		||||
        em {
 | 
			
		||||
          font-style: normal;
 | 
			
		||||
          font-size: 32px;
 | 
			
		||||
          color: #FF4466;
 | 
			
		||||
          margin-right: 8px;
 | 
			
		||||
          vertical-align: middle;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      input {
 | 
			
		||||
        margin: 32px 0 16px;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 0 16px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      textarea {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        height: 160px;
 | 
			
		||||
        margin: 32px 0 16px;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 0 16px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .u-row {
 | 
			
		||||
        margin-top: 34px;
 | 
			
		||||
 | 
			
		||||
        .time {
 | 
			
		||||
          display: flex;
 | 
			
		||||
          flex-direction: column;
 | 
			
		||||
 | 
			
		||||
          & > span:first-child {
 | 
			
		||||
            font-size: 60px;
 | 
			
		||||
            font-weight: 600;
 | 
			
		||||
            color: #333333;
 | 
			
		||||
            line-height: 84px;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          & > span:last-child {
 | 
			
		||||
            font-size: 22px;
 | 
			
		||||
            color: #333333;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .arrow {
 | 
			
		||||
          width: 28px;
 | 
			
		||||
          height: 68px;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          position: relative;
 | 
			
		||||
          transform: rotate(180deg);
 | 
			
		||||
 | 
			
		||||
          &:before, &:after {
 | 
			
		||||
            content: "";
 | 
			
		||||
            width: 50px;
 | 
			
		||||
            height: 50px;
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &:before {
 | 
			
		||||
            top: 59px;
 | 
			
		||||
            background-color: #CCCCCC;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          &:after {
 | 
			
		||||
            left: 7px;
 | 
			
		||||
            top: 59px;
 | 
			
		||||
            background-color: #FFFFFF;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .type{
 | 
			
		||||
          width: 320px;
 | 
			
		||||
          height: 112px;
 | 
			
		||||
          background: #F5F5F5;
 | 
			
		||||
          color: #333333;
 | 
			
		||||
          border-radius: 4px;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          justify-content: center;
 | 
			
		||||
          font-size: 30px;
 | 
			
		||||
          font-weight: 500;
 | 
			
		||||
          letter-spacing: 1px;
 | 
			
		||||
          position: relative;
 | 
			
		||||
 | 
			
		||||
          & > img{
 | 
			
		||||
            width: 46px;
 | 
			
		||||
            height: 48px;
 | 
			
		||||
            position: absolute;
 | 
			
		||||
            right: 0;
 | 
			
		||||
            bottom: 0;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        .active{
 | 
			
		||||
          background-color: #E7F1FE;
 | 
			
		||||
          color: #1174FE;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .item {
 | 
			
		||||
        height: 112px;
 | 
			
		||||
        box-shadow: 0px -1px 0px 0px #D8DDE6;
 | 
			
		||||
        margin-top: 0;
 | 
			
		||||
 | 
			
		||||
        .right {
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          color: #999999;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
 | 
			
		||||
          em {
 | 
			
		||||
            font-style: normal;
 | 
			
		||||
            color: #1365DD;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .right-arrow {
 | 
			
		||||
          width: 16px;
 | 
			
		||||
          height: 16px;
 | 
			
		||||
          display: inline-block;
 | 
			
		||||
          border-top: 5px solid #CCCCCC;
 | 
			
		||||
          border-right: 5px solid #CCCCCC;
 | 
			
		||||
          transform: rotate(45deg);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .item-wrap {
 | 
			
		||||
      padding: 0 32px;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .footer {
 | 
			
		||||
      height: 112px;
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      position: fixed;
 | 
			
		||||
      left: 0;
 | 
			
		||||
      bottom: 0;
 | 
			
		||||
      background-color: #FFFFFF;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      align-items: center;
 | 
			
		||||
 | 
			
		||||
      & > div {
 | 
			
		||||
        font-size: 36px;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > div:first-child {
 | 
			
		||||
        width: 270px;
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > div:last-child {
 | 
			
		||||
        width: calc(100% - 270px);
 | 
			
		||||
        height: 100%;
 | 
			
		||||
        color: #FFFFFF;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        justify-content: center;
 | 
			
		||||
        background-color: #1365DD;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										345
									
								
								src/apps/AppNotification/components/detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								src/apps/AppNotification/components/detail.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,345 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="detail">
 | 
			
		||||
    <template v-if="detailObj">
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <header>{{detailObj.title}}</header>
 | 
			
		||||
        <u-gap height="16"></u-gap>
 | 
			
		||||
        <u-row>
 | 
			
		||||
          <span>发布人:</span>
 | 
			
		||||
          <span>{{detailObj.releaseUserName}}</span>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <u-gap height="8"></u-gap>
 | 
			
		||||
        <u-row>
 | 
			
		||||
          <span>发布部门:</span>
 | 
			
		||||
          <span>{{detailObj.unitName}}</span>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <u-gap height="8"></u-gap>
 | 
			
		||||
        <u-row>
 | 
			
		||||
          <span>发布日期:</span>
 | 
			
		||||
          <span>{{detailObj.releaseTime}}</span>
 | 
			
		||||
        </u-row>
 | 
			
		||||
        <u-gap height="8"></u-gap>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card">
 | 
			
		||||
        <div class="label">公告内容</div>
 | 
			
		||||
        <u-parse :html="detailObj.content"></u-parse>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card" style="padding-top: 0" v-if="detailObj.files && detailObj.files.length">
 | 
			
		||||
        <div class="label">相关附件</div>
 | 
			
		||||
        <div class="file" v-for="(item,index) in detailObj.files" :key="index" @click="preFile(item)">
 | 
			
		||||
          <u-row justify="between">
 | 
			
		||||
            <label class="left">
 | 
			
		||||
              <img :src="$cdn + 'common/appendix.png'" alt="">
 | 
			
		||||
              <span>{{item.name}}.{{item.postfix}}</span>
 | 
			
		||||
            </label>
 | 
			
		||||
            <span>{{(item.size/1024).toFixed(2)}}KB</span>
 | 
			
		||||
          </u-row>
 | 
			
		||||
        </div>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      <div class="card" @click="handleClick">
 | 
			
		||||
        <u-row justify="between" class="item">
 | 
			
		||||
          <span>接收对象</span>
 | 
			
		||||
          <div class="right">
 | 
			
		||||
            <em>{{detailObj.readNum}}人</em>已读
 | 
			
		||||
            <em>{{detailObj.unReadNum}}人</em>未读
 | 
			
		||||
            <div class="arrow"></div>
 | 
			
		||||
          </div>
 | 
			
		||||
        </u-row>
 | 
			
		||||
      </div>
 | 
			
		||||
    </template>
 | 
			
		||||
    <AiEmpty description="该通知已撤回" v-else/>
 | 
			
		||||
    <AiBack />
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import AiBack from "../../../components/AiBack";
 | 
			
		||||
  import {mapActions} from "vuex";
 | 
			
		||||
  import AiEmpty from "../../../components/AiEmpty/AiEmpty";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "detail",
 | 
			
		||||
    components:{AiBack,AiEmpty},
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
        detailObj: null,
 | 
			
		||||
        id: null,
 | 
			
		||||
        flag: null,
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    onLoad(opt){
 | 
			
		||||
      this.id = opt.id;
 | 
			
		||||
      this.flag = opt.flag;
 | 
			
		||||
      this.getDetail();
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      ...mapActions(['previewFile', 'injectJWeixin']),
 | 
			
		||||
      preFile(e) {
 | 
			
		||||
        if([".jpg",".png",".gif"].includes(e.postfix.toLowerCase())){
 | 
			
		||||
          uni.previewImage({
 | 
			
		||||
            current: e.url,
 | 
			
		||||
            urls: [e.url]
 | 
			
		||||
          })
 | 
			
		||||
        }else {
 | 
			
		||||
          this.previewFile({...e})
 | 
			
		||||
        }
 | 
			
		||||
      },
 | 
			
		||||
      getDetail() {
 | 
			
		||||
        this.$http.post("/app/appannouncement/detail", null, {
 | 
			
		||||
          params: {
 | 
			
		||||
            id: this.id,
 | 
			
		||||
            detail: this.flag
 | 
			
		||||
          }
 | 
			
		||||
        }).then(res=>{
 | 
			
		||||
          if(res && res.data){
 | 
			
		||||
            this.detailObj = res.data;
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
      handleClick() {
 | 
			
		||||
        uni.navigateTo({
 | 
			
		||||
          url:"/pages/notification/components/read?id=" + this.id,
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  .detail {
 | 
			
		||||
    min-height: 100%;
 | 
			
		||||
    background-color: #F5F5F5;
 | 
			
		||||
    padding-bottom: 140px;
 | 
			
		||||
 | 
			
		||||
    ::v-deep .content {
 | 
			
		||||
      padding: 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .card {
 | 
			
		||||
      background-color: #FFFFFF;
 | 
			
		||||
      margin-bottom: 8px;
 | 
			
		||||
      box-sizing: border-box;
 | 
			
		||||
      padding: 16px 32px;
 | 
			
		||||
 | 
			
		||||
      header {
 | 
			
		||||
        font-size: 40px;
 | 
			
		||||
        font-weight: 600;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        line-height: 64px;
 | 
			
		||||
        letter-spacing: 1px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .u-row {
 | 
			
		||||
        & > div {
 | 
			
		||||
          border-radius: 50%;
 | 
			
		||||
          text-align: center;
 | 
			
		||||
          font-size: 22px;
 | 
			
		||||
          font-weight: bold;
 | 
			
		||||
          color: #FFFFFF;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          justify-content: center;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        & > span:first-child {
 | 
			
		||||
          font-size: 30px;
 | 
			
		||||
          color: #999999;;
 | 
			
		||||
          line-height: 48px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        & > span:last-child {
 | 
			
		||||
          font-size: 30px;
 | 
			
		||||
          color: #343D65;
 | 
			
		||||
          margin-left: 16px;
 | 
			
		||||
          line-height: 48px;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .title {
 | 
			
		||||
          width: 490px;
 | 
			
		||||
          height: 112px;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          font-size: 32px;
 | 
			
		||||
          color: #333333;
 | 
			
		||||
          overflow: hidden;
 | 
			
		||||
          text-overflow: ellipsis;
 | 
			
		||||
          white-space: nowrap;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .right {
 | 
			
		||||
          font-size: 28px;
 | 
			
		||||
          display: flex;
 | 
			
		||||
          align-items: center;
 | 
			
		||||
          color: #666666;
 | 
			
		||||
 | 
			
		||||
          .arrow {
 | 
			
		||||
            width: 16px;
 | 
			
		||||
            height: 16px;
 | 
			
		||||
            border-top: 3px solid #CCCCCC;
 | 
			
		||||
            border-right: 3px solid #CCCCCC;
 | 
			
		||||
            transform: rotate(45deg);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .item {
 | 
			
		||||
        position: relative;
 | 
			
		||||
        height: 80px;
 | 
			
		||||
 | 
			
		||||
        &:after {
 | 
			
		||||
          width: 100%;
 | 
			
		||||
          height: 1px;
 | 
			
		||||
          background-color: rgba(216, 221, 230, 0.5);
 | 
			
		||||
          content: "";
 | 
			
		||||
          position: absolute;
 | 
			
		||||
          left: 0;
 | 
			
		||||
          bottom: 0;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > span {
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        line-height: 48px;
 | 
			
		||||
        letter-spacing: 1px;
 | 
			
		||||
        display: inline-block;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .label {
 | 
			
		||||
        height: 80px;
 | 
			
		||||
        font-size: 32px;
 | 
			
		||||
        color: #333333;
 | 
			
		||||
        display: flex;
 | 
			
		||||
        align-items: center;
 | 
			
		||||
        margin-bottom: 16px;
 | 
			
		||||
 | 
			
		||||
        & > em {
 | 
			
		||||
          font-style: normal;
 | 
			
		||||
          font-size: 32px;
 | 
			
		||||
          color: #1365DD;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .file {
 | 
			
		||||
        height: 128px;
 | 
			
		||||
        background: #FFFFFF;
 | 
			
		||||
        border-radius: 8px;
 | 
			
		||||
        border: 1px solid #CCCCCC;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 0 16px;
 | 
			
		||||
        margin-bottom: 32px;
 | 
			
		||||
 | 
			
		||||
        & > .u-row {
 | 
			
		||||
          height: 100%;
 | 
			
		||||
 | 
			
		||||
          .left {
 | 
			
		||||
            width: 476px;
 | 
			
		||||
            display: flex;
 | 
			
		||||
            align-items: center;
 | 
			
		||||
 | 
			
		||||
            & > img {
 | 
			
		||||
              flex-shrink: 0;
 | 
			
		||||
              width: 96px;
 | 
			
		||||
              height: 96px;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            & > span {
 | 
			
		||||
              font-size: 32px;
 | 
			
		||||
              color: #333333;
 | 
			
		||||
              display: inline-block;
 | 
			
		||||
              line-height: 44px;
 | 
			
		||||
              overflow: hidden;
 | 
			
		||||
              text-overflow: ellipsis;
 | 
			
		||||
              display: -webkit-box;
 | 
			
		||||
              -webkit-box-orient: vertical;
 | 
			
		||||
              -webkit-line-clamp: 2;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          & > span {
 | 
			
		||||
            font-size: 28px;
 | 
			
		||||
            color: #999999;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .active {
 | 
			
		||||
        background-color: #F3F6F9;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      & > text {
 | 
			
		||||
        width: 100%;
 | 
			
		||||
        display: inline-block;
 | 
			
		||||
        font-size: 30px;
 | 
			
		||||
        color: #649EFD;
 | 
			
		||||
        text-align: center;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      .progress {
 | 
			
		||||
        height: 12px;
 | 
			
		||||
        background: #F2F4FC;
 | 
			
		||||
        border-radius: 12px;
 | 
			
		||||
        position: relative;
 | 
			
		||||
        margin: 16px 0 64px 0;
 | 
			
		||||
 | 
			
		||||
        .pro-active {
 | 
			
		||||
          height: 12px;
 | 
			
		||||
          background: #639EFD;
 | 
			
		||||
          border-radius: 12px;
 | 
			
		||||
          position: absolute;
 | 
			
		||||
          left: 0;
 | 
			
		||||
          top: 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      em {
 | 
			
		||||
        font-style: normal;
 | 
			
		||||
        font-size: 28px;
 | 
			
		||||
        color: #1365DD;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      ::v-deep .u-collapse {
 | 
			
		||||
        position: relative;
 | 
			
		||||
 | 
			
		||||
        &:after {
 | 
			
		||||
          content: "";
 | 
			
		||||
          width: 718px;
 | 
			
		||||
          height: 1px;
 | 
			
		||||
          background-color: rgba(216, 221, 230, 0.5);
 | 
			
		||||
          position: absolute;
 | 
			
		||||
          left: 0;
 | 
			
		||||
          bottom: 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .u-collapse-head {
 | 
			
		||||
          padding: 40px 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        .u-collapse-content {
 | 
			
		||||
          font-size: 32px;
 | 
			
		||||
          color: #333333;
 | 
			
		||||
          line-height: 48px;
 | 
			
		||||
          letter-spacing: 1px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .footer {
 | 
			
		||||
      height: 112px;
 | 
			
		||||
      width: 100%;
 | 
			
		||||
      position: fixed;
 | 
			
		||||
      left: 0;
 | 
			
		||||
      bottom: 0;
 | 
			
		||||
      background: #1365DD;
 | 
			
		||||
      display: flex;
 | 
			
		||||
      align-items: center;
 | 
			
		||||
      justify-content: center;
 | 
			
		||||
      font-size: 36px;
 | 
			
		||||
      color: #FFFFFF;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										93
									
								
								src/apps/AppNotification/components/read.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								src/apps/AppNotification/components/read.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="read">
 | 
			
		||||
    <AiTopFixed>
 | 
			
		||||
      <u-tabs :list="tabs" :is-scroll="false" height="96" bar-width="192" :current="current" @change="change"></u-tabs>
 | 
			
		||||
    </AiTopFixed>
 | 
			
		||||
    <div class="body">
 | 
			
		||||
      <div class="item" v-for="(item,index) in (current==0 ? list.read : list.unRead)" :key="index">
 | 
			
		||||
        <u-avatar :src="item.avatar" mode="square" size="76"></u-avatar>
 | 
			
		||||
        <span class="name">{{item.name}}</span>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    <AiBack/>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  import AiBack from "../../../components/AiBack";
 | 
			
		||||
  import AiTopFixed from "../../../components/AiTopFixed";
 | 
			
		||||
 | 
			
		||||
  export default {
 | 
			
		||||
    name: "read",
 | 
			
		||||
    components: {AiBack, AiTopFixed},
 | 
			
		||||
    data() {
 | 
			
		||||
      return {
 | 
			
		||||
        current: 0,
 | 
			
		||||
        id: null,
 | 
			
		||||
        list: [],
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    onLoad(opt) {
 | 
			
		||||
      this.id = opt.id;
 | 
			
		||||
      this.getList();
 | 
			
		||||
    },
 | 
			
		||||
    methods: {
 | 
			
		||||
      getList() {
 | 
			
		||||
        this.$http.post("/app/appannouncementreader/list-unread",null,{
 | 
			
		||||
          params:{
 | 
			
		||||
            id:this.id
 | 
			
		||||
          }
 | 
			
		||||
        }).then(res => {
 | 
			
		||||
          if (res && res.data) {
 | 
			
		||||
            this.list = res.data;
 | 
			
		||||
          }
 | 
			
		||||
        })
 | 
			
		||||
      },
 | 
			
		||||
      change(val) {
 | 
			
		||||
        this.current = val;
 | 
			
		||||
        this.getList();
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    computed: {
 | 
			
		||||
      tabs() {
 | 
			
		||||
        return [
 | 
			
		||||
          {name: this.list?.read?.length + "人已读"},
 | 
			
		||||
          {name: this.list?.unRead?.length + "人未读"},
 | 
			
		||||
        ];
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
  }
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
  .read {
 | 
			
		||||
    min-height: 100%;
 | 
			
		||||
    background-color: #F5F5F5;
 | 
			
		||||
 | 
			
		||||
    ::v-deep .content{
 | 
			
		||||
      padding: 0 !important;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .body {
 | 
			
		||||
      padding: 16px 0;
 | 
			
		||||
 | 
			
		||||
     .item {
 | 
			
		||||
        height: 120px;
 | 
			
		||||
        display: flex;
 | 
			
		||||
       align-items: center;
 | 
			
		||||
        box-sizing: border-box;
 | 
			
		||||
        padding: 0 50px;
 | 
			
		||||
        background-color: #ffffff;
 | 
			
		||||
        border-bottom: 1px solid #eeeeee;
 | 
			
		||||
 | 
			
		||||
        & > .name{
 | 
			
		||||
          font-size: 36px;
 | 
			
		||||
          font-weight: 600;
 | 
			
		||||
          color: #333333;
 | 
			
		||||
          line-height: 50px;
 | 
			
		||||
          margin-left: 32px;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
</style>
 | 
			
		||||
		Reference in New Issue
	
	Block a user