zhuliu há 5 meses atrás
pai
commit
30248e5a8c

+ 3 - 0
src/api/index.js

@@ -15,6 +15,8 @@ import personnel from "./personnel"
 import examine from "./examine";
 import tenant from './tenant'
 
+import stat from './stat';
+
 
 export default {
 
@@ -32,4 +34,5 @@ export default {
   ...examine,
   ...tenant,
   ...personnel,
+  ...stat
 }

+ 6 - 0
src/api/registerAndLogin.js

@@ -83,4 +83,10 @@ export default {
     companySignUp(data) {
         return axios.post('/permission/qiaoBi/qiaoBiPerson/companySignUp',data)
     },
+    /**
+     * 邀请信息
+     */
+    queryInvitationMessage(data) {
+        return axios.post('/permission/qiaoBi/qiaoBiPerson/queryInvitationMessage',data)
+    },
 }

+ 12 - 0
src/api/stat.js

@@ -0,0 +1,12 @@
+import axios from '@/utils/axios'
+
+export default {
+    /**
+     * 统计注册人数以及付费人数
+     * @param {*} data 
+     * @returns 
+     */
+    getStatsMessage(params){
+        return axios.get('/permission/qiaoBi/stats/getStatsMessage',{params})
+    },
+}

+ 7 - 0
src/router/index.js

@@ -115,6 +115,13 @@ export const defaultBackStageManageRouterItem = [
         meta: {title: '人员清单',icon: '人员',sign:'administrator/personnel'},
       },
       {
+        path: 'invitationMessage',
+        name: 'Administrator_invitationMessage',
+        component: () => import('@/views/backStageManage/organization/personnel/components/invitationMessage/index.vue'),
+        meta: {title: '邀请人员清单',icon: '人员',sign:'administrator/invitationMessage'},
+        hidden:true
+      },
+      {
         path: 'department',
         name: 'Administrator_department',
         component: () => import('@/views/backStageManage/organization/department/index.vue'),

+ 8 - 4
src/store/modules/permission.js

@@ -18,11 +18,15 @@ const permission = {
     }
   },
   actions: {
-    getPersonPermission({ commit }, data) {
+    async getPersonPermission({ commit }, data) {
+      let userinfo = await Api.getUserInfo()
+      if(userinfo.code == 200){
+        commit('SET_ADMIN_USERINFO', userinfo.data)
+      }
       return new Promise((resolve, reject) => {
-        Api.getUserInfo().then(response => {
-          commit('SET_ADMIN_USERINFO', response.data)
-        })
+        // Api.getUserInfo().then(response => {
+        //   commit('SET_ADMIN_USERINFO', response.data)
+        // })
         var params = {
           code : '4e95e3d926a2a4befa5d913acc0bb8t6'
         }

+ 1 - 0
src/utils/permissions.js

@@ -1,5 +1,6 @@
 import Store from '@/store'
 
+//roleType: 1是系统管理员 2是租户管理员 3是窍笔管理员 0是普通人员
 export default{
   /**
    * 功能权限

+ 171 - 6
src/views/backStageManage/home/index.vue

@@ -1,11 +1,95 @@
 <template>
   <div class="height_100 home">
-    <div class="content">
+    <template v-if="$permission.hasPermission([1,3])">
       <div>
-        <span v-html="getTimeState()"></span>{{ userinfo.name }}
+        <div class="header">
+          <div class="avatar">
+            <img class="user-avatar" v-if="avatar" :src="$commonJS.checkViewer(avatar)">
+            <img class="user-avatar" v-else :src="require('@/assets/user-avatar.jpeg')">
+          </div>
+          <div>
+            <div class="title">
+              <span v-html="getTimeState()"></span>{{ userinfo.name }}
+            </div>
+            欢迎使用窍笔后台管理系统
+          </div>
+        </div>
+        <div class="content">
+          <div class="content_item loginNum">
+            <div class="logo">
+              <el-image :src="require('@/assets/image/logo3.png')" class="img" fit="contain"></el-image>
+            </div>
+            <div class="content_item_loginNum">
+              今日登录用户数量:{{stats.loginCount || 0}}
+            </div>
+          </div>
+          <div class="content_item">
+            <el-row>
+              <template>
+                <el-col :span="12">
+                  <span class="content_item_title">
+                    总注册人数
+                  </span>
+                </el-col>
+                <el-col :span="12">
+                  <span class="content_item_title">
+                    上月注册人数
+                  </span>
+                </el-col>
+              </template>
+              <template>
+                <el-col :span="12">
+                  <span class="content_item_content">
+                    {{stats.signCount || 0}}
+                  </span>
+                </el-col>
+                <el-col :span="12">
+                  <span class="content_item_content">
+                    {{stats.lastMonthSignCount || 0}}
+                  </span>
+                </el-col>
+              </template>
+            </el-row>
+          </div>
+          <div class="content_item">
+            <el-row>
+              <template>
+                <el-col :span="12">
+                  <span class="content_item_title">
+                    总付费人数
+                  </span>
+                </el-col>
+                <el-col :span="12">
+                  <span class="content_item_title">
+                    上月付费人数
+                  </span>
+                </el-col>
+              </template>
+              <template>
+                <el-col :span="12">
+                  <span class="content_item_content">
+                    {{stats.paidCount || 0}}
+                  </span>
+                </el-col>
+                <el-col :span="12">
+                  <span class="content_item_content">
+                    {{stats.lastMonthPaidCount || 0}}
+                  </span>
+                </el-col>
+              </template>
+            </el-row>
+          </div>
+        </div>
       </div>
-      欢迎使用窍笔后台管理系统
-    </div>
+    </template>
+    <template v-else>
+      <div class="content2">
+        <div>
+          <span v-html="getTimeState()"></span>{{ userinfo.name }}
+        </div>
+        欢迎使用窍笔后台管理系统
+      </div>
+    </template>
     
   </div>
 </template>
@@ -16,17 +100,31 @@ export default {
   props: {},
   data() {
     return {
+      stats:{}
     };
   },
   watch: {},
   computed: {
     userinfo(){
       return this.$store.getters.userinfo
-    }
+    },
+    avatar(){
+      return this.$s.getCookie('SET_AVATAR')
+    },
+  },
+  created() {
+    this.getStats()
   },
-  created() {},
   mounted() {},
   methods: {
+    //获取注册人数以及付费人数
+    getStats(){
+      this.$api.getStatsMessage().then(response=>{
+        if(response.code == 200){
+          this.stats = response.data
+        }
+      })
+    },
     getTimeState() {
       // 获取当前时间
       let timeNow = new Date();
@@ -54,8 +152,75 @@ export default {
 <style lang="scss" scoped>
 .home{
  position: relative;
+ --background:#d8d8ea;
+}
+.header{
+  display: flex;
+  align-items: center;
+  padding: 15px;
+  line-height: 40px;
+  font-size: 18px;
+  background: var(--background) !important;
+  border-radius: 8px;
+  .avatar{
+    margin-right:15px;
+  }
+  .user-avatar {
+    width: 80px;
+    height: 80px;
+    border-radius: 40px;
+    margin-right: 8px;
+  }
+  .title{
+    font-weight: bold;
+    background: linear-gradient(to right, red, blue);
+    -webkit-background-clip: text;
+    color: transparent;
+    font-size: 28px;
+  }
 }
 .content{
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  .content_item{
+    width: 500px;
+    height: 100px;
+    background: var(--background);
+    border-radius: 8px;
+    margin-top: 15px;
+    margin-right: 15px;
+    padding: 20px;
+    line-height: 50px;
+    text-align: center;
+    &:last-child{
+      margin-right: 0;
+    }
+    .content_item_content{
+      font-size: 32px;
+      font-weight: bold;
+    }
+  }
+  .loginNum{
+    width: 350px;
+    font-weight: bold;
+    .logo{
+      width: 140px;
+      height: 40px;
+      .img{
+          width: 100%;
+          height: 100%;
+      }
+    }
+    .content_item_loginNum{
+      line-height: 60px;
+      text-align: start;
+      padding-left: 16px;
+      font-size: 20px;
+    }
+  }
+}
+.content2{
   position: absolute;
   inset: 0;
   margin: auto;

+ 45 - 0
src/views/backStageManage/organization/personnel/components/dialog/invitationMessage.vue

@@ -0,0 +1,45 @@
+<template>
+  <div>
+    <el-dialog
+        title="邀请记录"
+        :visible.sync="visible"
+        width="500px"
+        :append-to-body="true" 
+        :close-on-click-modal="false"
+        custom-class="expitrDays"
+        @close="handleClose">
+
+        <span slot="footer" class="dialog-footer">
+            <el-button size="mini" @click="handleClose">关闭</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {},
+  data() {
+    return {
+        visible:false,
+        personId:''
+    };
+  },
+  watch: {},
+  computed: {},
+  created() {},
+  mounted() {},
+  methods: {
+    open(personId){
+        this.personId = personId
+        this.visible = true
+    },
+    handleClose(){
+        this.visible = false
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 30 - 0
src/views/backStageManage/organization/personnel/components/invitationMessage/index.vue

@@ -0,0 +1,30 @@
+<template>
+  <div class="height_100">
+    <invitationMessage :personId="personId"></invitationMessage>
+  </div>
+</template>
+
+<script>
+import invitationMessage from './invitationMessage.vue';
+export default {
+  components: {
+    invitationMessage
+  },
+  props: {},
+  data() {
+    return {
+    };
+  },
+  watch: {},
+  computed: {
+    personId(){
+        return this.$route.query.personId
+    },
+  },
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 102 - 0
src/views/backStageManage/organization/personnel/components/invitationMessage/invitationMessage.vue

@@ -0,0 +1,102 @@
+<template>
+  <div class="height_100">
+    <el-container>
+        <el-main class="padding_10">
+            <el-table ref="table" border :data="tableData" row-key="id" style="width: 100%" height="calc(100% - 0px)" v-loading="loading">     
+            <el-table-column type="index" label="#" width="55" align="center">
+              <template slot-scope="scope">
+                <span>{{ (scope.$index + 1) + ((queryParams.current - 1) * queryParams.size) }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="mobile" label="手机号" align="center" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="username" label="账号" align="center" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="createTime" label="邀请时间" align="center" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="" label="邀请人" align="center" show-overflow-tooltip>
+              <template>
+                <div>
+                  {{ currentPerson.name ||  currentPerson.mobile || currentPerson.username}}
+                </div>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-main>
+        <el-footer class="pagination">
+            <el-pagination background layout="total, sizes, prev, pager, next, jumper"
+                :current-page.sync="queryParams.current" :page-size.sync="queryParams.size"
+                @current-change="handleCurrentChange" @size-change="changeSize" :total="total">
+            </el-pagination>
+        </el-footer>
+    </el-container>
+  </div>
+</template>
+
+<script>
+export default {
+  components: {},
+  props: {
+    personId:{}
+  },
+  data() {
+    return {
+        queryParams:{
+            size:10,
+            current:1
+        },
+        total:0,
+        loading:false,
+        tableData:[],
+        currentPerson:{},
+    };
+  },
+  watch: {
+    personId(){
+        this.init()
+    },
+  },
+  computed: {},
+  created() {},
+  mounted() {
+    this.init()
+  },
+  methods: {
+    init(){
+        this.queryParams = {
+            size:10,
+            current:1,
+            personId:this.personId
+        }
+        this.currentPerson = {}
+        this.tableData = []
+        this.getInvitationMessage()
+    },
+    getInvitationMessage(){
+        this.loading = true
+        this.$api.queryInvitationMessage(this.queryParams).then(response=>{
+            if(response.code == 200){
+                this.tableData = response.data.invitedPeople
+                this.currentPerson = response.data.personVO
+                this.total = response.pageColumn.total
+                this.loading = false
+            }
+        }).catch(error=>{
+            this.tableData = []
+            this.loading = false
+        })
+    },
+    //切换分页
+    handleCurrentChange(val){
+        this.queryParams.current = val
+        this.getInvitationMessage()
+    },
+
+    //切换页大小
+    changeSize(val){
+        this.queryParams.current = 1
+        this.queryParams.size = val
+        this.getInvitationMessage()
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 20 - 2
src/views/backStageManage/organization/personnel/components/personnel.vue

@@ -52,6 +52,14 @@
             <el-table-column prop="email" label="邮箱" align="center" show-overflow-tooltip></el-table-column>
             <el-table-column prop="mobile" label="联系方式" align="center" show-overflow-tooltip></el-table-column>
             <el-table-column prop="tenantName" label="所属租户" align="center" show-overflow-tooltip></el-table-column>
+            <el-table-column v-if="$permission.hasPermission([1,3])" prop="invitedNum" label="邀请数量" align="center" show-overflow-tooltip>
+                <template slot-scope="scope">
+                    <div>
+                        {{ scope.row.invitedNum }}
+                        <el-button v-if="scope.row.invitedNum" size="mini" type="text" @click="invitationRecord(scope.row)">详情</el-button>
+                    </div>
+                </template>
+            </el-table-column>
             <el-table-column prop="expitrTime" label="到期时间" align="center" width="250px" show-overflow-tooltip>
                 <template slot-scope="scope">
                     <div class="block">
@@ -80,8 +88,7 @@
             </el-table-column>
             <el-table-column label="剩余天数" align="center" width="180px" show-overflow-tooltip>
                 <template slot-scope="scope">
-                    <div v-html="getRemainDays(scope.row.expitrTime)">
-                    </div>
+                    <div v-html="getRemainDays(scope.row.expitrTime)"></div>
                 </template>
             </el-table-column>
             <el-table-column label="是否启用" align="center" show-overflow-tooltip>
@@ -200,6 +207,17 @@ export default {
         this.getTenantList();
     },
     methods: {
+        //查看邀请记录
+        invitationRecord(row){
+            this.$router.push(
+                {
+                    path:'/administrator/invitationMessage',
+                    query:{
+                        personId:row.id
+                    }
+                }
+            )
+        },
         //下拉框添加选项
         addOption(field,data){
             this.$set(this.queryParams,field,null)