guhongwei 2 年 前
コミット
7b2d192965

+ 4 - 3
app.json

@@ -1,7 +1,5 @@
 {
     "pages": [
-        "pages/updatepd/index",
-        "pages/me/index",
         "pages/index/index",
         "pages/login/index",
         "pages/register/index",
@@ -9,9 +7,12 @@
         "pages/search/index",
         "pages/administration/index",
         "pages/team/index",
+        "pages/me/index",
         "pages/editBasic/index",
         "pages/uploadimg/index",
-   
+        "pages/updatepd/index",
+        "pages/user/index",
+        "pages/user/detail",
         "pages/test/index",
         "pages/logs/logs"
     ],

+ 37 - 0
commpents/dialog/index.js

@@ -0,0 +1,37 @@
+// commpents/mobile-frame/mobile-main.js
+const app = getApp()
+Component({
+    /**
+     * 组件的属性列表
+     */
+    options: { multipleSlots: true },
+    properties: {
+        dialog: { type: Object, value: {} },
+    },
+
+    // 生命周期函数,可以为函数,或一个在methods段中定义的方法名
+    attached: function () { }, // 此处attached的声明会被lifetimes字段中的声明覆盖
+    ready: function () { },
+    pageLifetimes: {
+        // 组件所在页面的生命周期函数
+        show: function () { },
+        hide: function () { },
+        resize: function () { },
+    },
+    /**
+     * 组件的初始数据
+     */
+    data: {
+
+    },
+    /**
+     * 组件的方法列表
+     */
+    methods: {
+        // 关闭弹框
+        toClose() {
+            this.triggerEvent('toClose')
+        }
+    }
+})
+

+ 4 - 0
commpents/dialog/index.json

@@ -0,0 +1,4 @@
+{
+    "component": true,
+    "usingComponents": {}
+}

+ 8 - 0
commpents/dialog/index.wxml

@@ -0,0 +1,8 @@
+<van-dialog use-slot title="{{dialog.title}}" show="{{ dialog.show }}" showConfirmButton="{{false}}">
+    <view class="info">
+        <slot name="info"></slot>
+    </view>
+    <view class="btn">
+        <button type="warn" size="mini" bindtap="toClose">关闭</button>
+    </view>
+</van-dialog>

+ 19 - 0
commpents/dialog/index.wxss

@@ -0,0 +1,19 @@
+.info {
+    float: left;
+    width: 95%;
+    padding: 0 10px;
+    max-height: 300px;
+    overflow-y: auto;
+}
+
+.btn {
+    float: left;
+    width: 100%;
+    text-align: center;
+    margin: 5px 0;
+}
+
+.btn button {
+    font-size: 12px;
+    padding: 0 15px;
+}

+ 170 - 0
pages/user/detail.js

@@ -0,0 +1,170 @@
+// pages/login/login.js
+import WxValidate from '../../utils/wxValidate'
+import { gender } from '../../utils/dict';
+const app = getApp()
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        frameStyle: { useTop: true, name: '维护个人信息', leftArrow: true, useBar: false },
+        // 主体高度
+        infoHeight: '',
+        form: { icon: [] },
+        // 头像
+        icon: [],
+        // 性别
+        genderList: gender,
+        statusList: [{ label: '待审核', value: '0' }, { label: '审核通过', value: '1' }, { label: '审核拒绝', value: '-1' }],
+        // 用户id
+        id: ''
+    },
+    initValidate() {
+        const rules = { nickname: { required: true }, phone: { required: true, tel: true }, password: { required: false }, status: { required: true } }
+        // 验证字段的提示信息,若不传则调用默认的信息
+        const messages = { nickname: { required: '请输入昵称', }, phone: { required: '请输入手机号', }, password: { required: '请输入登录密码', }, status: { required: '请选择状态' } };
+        this.WxValidate = new WxValidate(rules, messages)
+    },
+    back: function () {
+        wx.navigateBack({ url: '/pages/user/index' })
+    },
+    // 上傳圖片
+    imgUpload: function (e) {
+        const that = this;
+        let data = that.data.icon;
+        data.push(e.detail)
+        that.setData({ icon: data })
+    },
+    // 删除图片
+    imgDel: function (e) {
+        const that = this;
+        let list = that.data.icon;
+        let arr = list.filter((i, index) => index != e.detail.index)
+        that.setData({ icon: arr })
+    },
+    // 选择性别
+    genderChange: function (e) {
+        const that = this;
+        let index = e.detail.value;
+        let value = that.data.genderList[index];
+        that.setData({ 'form.gender': value });
+    },
+    // 选择状态
+    statusChange: function (e) {
+        const that = this;
+        const { value } = e.detail;
+        that.setData({ 'form.status': value })
+    },
+    // 提交登录
+    onSubmit: async function (e) {
+        const that = this;
+        const params = e.detail.value;
+        const data = that.data.form;
+        if (!this.WxValidate.checkForm(params)) {
+            const error = this.WxValidate.errorList[0];
+            wx.showToast({ title: `${error.msg}`, icon: 'error', duration: 2000 })
+            return false
+        } else {
+            let arr;
+            if (data._id) {
+                arr = await app.$post(`/courtAdmin/api/user/${data._id}`, params);
+                if (arr.errcode == '0') { wx.showToast({ title: `维护信息完成`, icon: 'error', duration: 2000 }); that.back(); }
+                else wx.showToast({ title: `${error.msg}`, icon: 'error', duration: 2000 })
+            } else {
+                arr = await app.$get(`/courtAdmin/api/user`, { phone: params.phone });
+                if (arr.errcode == '0' && arr.total > 0) wx.showToast({ title: `该账号已有用户使用`, icon: 'error', duration: 2000 })
+                else {
+                    arr = await app.$post(`/courtAdmin/api/user`, params);
+                    if (arr.errcode == '0') { wx.showToast({ title: `维护信息完成`, icon: 'error', duration: 2000 }); that.back(); }
+                    else wx.showToast({ title: `${error.msg}`, icon: 'error', duration: 2000 })
+                }
+            }
+
+        }
+    },
+    /**
+     * 生命周期函数--监听页面加载
+     */
+    onLoad: function (options) {
+        if (options && options.id) this.setData({ id: options.id })
+        //验证规则函数
+        this.initValidate();
+        // 计算高度
+        this.searchHeight();
+        // 监听用户是否登录
+        this.watchLogin();
+    },
+    // 监听用户是否登录
+    watchLogin: async function () {
+        const that = this;
+        wx.getStorage({
+            key: 'token',
+            success: async res => {
+                const arr = await app.$get(`/courtAdmin/api/user/${that.data.id}`);
+                if (arr.errcode == '0') that.setData({ form: arr.data })
+            },
+            fail: res => {
+                wx.redirectTo({ url: '/pages/index/index', })
+            }
+        })
+    },
+    // 计算高度
+    searchHeight: function () {
+        let frameStyle = this.data.frameStyle;
+        let client = app.globalData.client;
+        let infoHeight = client.windowHeight;
+        // 是否去掉状态栏
+        if (frameStyle.useTop) infoHeight = infoHeight - (client.statusBarHeight + client.getMenu.height + (client.getMenu.top - client.statusBarHeight) * 2);
+        // 是否减去底部菜单
+        if (frameStyle.useBar) infoHeight = infoHeight - 50;
+        if (infoHeight) this.setData({ infoHeight: infoHeight })
+    },
+
+    /**
+     * 生命周期函数--监听页面初次渲染完成
+     */
+    onReady: function () {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面显示
+     */
+    onShow: function () { },
+
+    /**
+     * 生命周期函数--监听页面隐藏
+     */
+    onHide: function () {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面卸载
+     */
+    onUnload: function () {
+
+    },
+
+    /**
+     * 页面相关事件处理函数--监听用户下拉动作
+     */
+    onPullDownRefresh: function () {
+
+    },
+
+    /**
+     * 页面上拉触底事件的处理函数
+     */
+    onReachBottom: function () {
+
+    },
+
+    /**
+     * 用户点击右上角分享
+     */
+    onShareAppMessage: function () {
+
+    }
+})

+ 7 - 0
pages/user/detail.json

@@ -0,0 +1,7 @@
+{
+    "component": true,
+    "usingComponents": {
+        "mobile-main": "/commpents/mobile-frame/mobile-main",
+        "vanupload": "/commpents/upload/index"
+    }
+}

+ 69 - 0
pages/user/detail.wxml

@@ -0,0 +1,69 @@
+<mobile-main frameStyle="{{frameStyle}}" bind:back="back">
+    <view slot="info" class="main" style="height:{{infoHeight}}px;">
+        <view class="one">
+            <form bindsubmit="onSubmit">
+                <view class="content">
+                    <view class="label textOver">头像</view>
+                    <view class="value">
+                        <vanupload list="{{icon}}" count="{{1}}" previewSize="{{50}}" bind:imgUpload="imgUpload" bind:imgDel="imgDel"></vanupload>
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">昵称</view>
+                    <view class="value">
+                        <input type="text" name="nickname" value="{{form.nickname}}" placeholder="请输入昵称" />
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">机构</view>
+                    <view class="value">
+                        <input type="text" name="mechanism" value="{{form.mechanism}}" placeholder="请输入机构" />
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">性别</view>
+                    <view class="value">
+                        <picker name="gender" bindchange="genderChange" value="{{form.gender}}" range="{{genderList}}">
+                            <view class="input">{{form.gender||'选择性别'}}</view>
+                        </picker>
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">岗位</view>
+                    <view class="value">
+                        <input type="text" name="work" value="{{form.work}}" placeholder="请输入岗位" />
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">手机号</view>
+                    <view class="value">
+                        <input type="text" name="phone" value="{{form.phone}}" maxlength="11" placeholder="请输入手机号" />
+                    </view>
+                </view>
+                <view class="content" wx:if="{{!form._id}}">
+                    <view class="label textOver">密码</view>
+                    <view class="value">
+                        <input type="text" password name="password" value="{{form.password}}" placeholder="请输入密码" />
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">电子邮箱</view>
+                    <view class="value">
+                        <input type="text" name="email" value="{{form.email}}" placeholder="请输入电子邮箱" />
+                    </view>
+                </view>
+                <view class="content">
+                    <view class="label textOver">状态</view>
+                    <view class="value">
+                        <picker mode="selector" bindchange="statusChange" name="status" value="{{form.status}}" range-key="label" range="{{statusList}}">
+                            <view class="input">{{form.status=='0'?'待审中':form.status=='1'?'审核通过':form.status=='-1'?'审核拒绝':'选择状态'}}</view>
+                        </picker>
+                    </view>
+                </view>
+                <view class="btn">
+                    <button type="primary" size="mini" formType="submit">提交保存</button>
+                </view>
+            </form>
+        </view>
+    </view>
+</mobile-main>

+ 46 - 0
pages/user/detail.wxss

@@ -0,0 +1,46 @@
+.main {
+    position: relative;
+    width: 100%;
+    background-color: #ffffff;
+}
+
+.main .one {
+    float: left;
+    width: 95%;
+    padding: 0 10px;
+}
+
+.main .one .content {
+    float: left;
+    width: 100%;
+    border-bottom: 1px solid #ccc;
+    padding: 10px 0;
+}
+
+.main .one .content .label {
+    float: left;
+    width: 20%;
+}
+
+.main .one .content .value {
+    float: left;
+    width: 80%;
+    text-align: right;
+}
+
+.main .one .content .value .input {
+    color: #868686;
+}
+
+.main .one .btn {
+    position: absolute;
+    bottom: 50px;
+    width: 95%;
+    text-align: center;
+}
+
+.main .one .btn button {
+    width: 100%;
+    background-image: linear-gradient(to right, #fd3c1e, #c74df0);
+    border-radius: 25px;
+}

+ 181 - 0
pages/user/index.js

@@ -0,0 +1,181 @@
+// pages/login/login.js
+import WxValidate from '../../utils/wxValidate'
+const app = getApp()
+Page({
+
+    /**
+     * 页面的初始数据
+     */
+    data: {
+        frameStyle: { useTop: true, name: '用户管理', leftArrow: true, useBar: false },
+        // 主体高度
+        infoHeight: '',
+        list: [],
+        // 弹框
+        dialog: { title: '详细信息', show: false, type: '1' },
+        form: {},
+        statusList: [{ label: '待审核', value: '0' }, { label: '审核通过', value: '1' }, { label: '审核拒绝', value: '-1' }]
+    },
+    initValidate() {
+        const rules = { status: { required: true } }
+        // 验证字段的提示信息,若不传则调用默认的信息
+        const messages = { status: { required: '请选择状态', } };
+        this.WxValidate = new WxValidate(rules, messages)
+    },
+    back: function () {
+        wx.navigateBack({ url: '/pages/me/index' })
+    },
+    // 添加用户
+    toAdd: function () {
+        wx.navigateTo({ url: `/pages/user/detail` })
+    },
+    // 查看
+    toView: async function (e) {
+        const that = this;
+        let { id } = e.currentTarget.dataset;
+        const arr = await app.$get(`/courtAdmin/api/user/${id}`);
+        if (arr.errcode == '0') {
+            that.setData({ form: arr.data })
+            that.setData({ dialog: { title: '详细信息', show: true, type: '1' } })
+        }
+    },
+    // 修改
+    toEdit: function (e) {
+        const that = this;
+        let { id } = e.currentTarget.dataset;
+        wx.navigateTo({ url: `/pages/user/detail?id=${id}` })
+    },
+    // 审核
+    toCheck: async function (e) {
+        const that = this;
+        let { id } = e.currentTarget.dataset;
+        const arr = await app.$get(`/courtAdmin/api/user/${id}`);
+        if (arr.errcode == '0') {
+            that.setData({ form: arr.data })
+            that.setData({ dialog: { title: '信息审核', show: true, type: '2' } })
+        }
+    },
+    // 删除
+    toDel: async function (e) {
+        const that = this;
+        let { id } = e.currentTarget.dataset;
+        const arr = await app.$delete(`/courtAdmin/api/user/${id}`);
+        if (arr.errcode == '0') {
+            wx.showToast({ title: `删除信息成功`, icon: 'error', duration: 2000 });
+            that.watchLogin();
+        }
+    },
+    // 选择状态
+    statusChange: function (e) {
+        const that = this;
+        const { value } = e.detail;
+        that.setData({ 'form.status': value })
+    },
+    // 提交审核
+    onSubmit: async function (e) {
+        const that = this;
+        const data = that.data.form;
+        const params = e.detail.value;
+        if (!this.WxValidate.checkForm(params)) {
+            const error = this.WxValidate.errorList[0];
+            wx.showToast({ title: `${error.msg}`, icon: 'error', duration: 2000 })
+            return false
+        } else {
+            const arr = await app.$post(`/courtAdmin/api/user/${data.id}`, params);
+            if (arr.errcode == '0') {
+                wx.showToast({ title: `审核信息成功`, icon: 'error', duration: 2000 });
+                that.toClose();
+                that.watchLogin();
+            } else wx.showToast({ title: `${arr.errmsg}`, icon: 'error', duration: 2000 })
+        }
+    },
+    // 关闭弹框
+    toClose: function () {
+        this.setData({ dialog: { show: false } })
+    },
+    /**
+     * 生命周期函数--监听页面加载
+     */
+    onLoad: function (options) {
+        //验证规则函数
+        this.initValidate();
+        // 计算高度
+        this.searchHeight();
+        // 监听用户是否登录
+        this.watchLogin();
+    },
+    // 监听用户是否登录
+    watchLogin: function () {
+        const that = this;
+        wx.getStorage({
+            key: 'token',
+            success: async res => {
+                const arr = await app.$get(`/courtAdmin/api/user`);
+                if (arr.errcode == '0') this.setData({ list: arr.data })
+            },
+            fail: res => {
+                wx.redirectTo({ url: '/pages/login/index', })
+            }
+        })
+    },
+    // 计算高度
+    searchHeight: function () {
+        let frameStyle = this.data.frameStyle;
+        let client = app.globalData.client;
+        let infoHeight = client.windowHeight;
+        // 是否去掉状态栏
+        if (frameStyle.useTop) infoHeight = infoHeight - (client.statusBarHeight + client.getMenu.height + (client.getMenu.top - client.statusBarHeight) * 2);
+        // 是否减去底部菜单
+        if (frameStyle.useBar) infoHeight = infoHeight - 50;
+        if (infoHeight) this.setData({ infoHeight: infoHeight })
+    },
+
+    /**
+     * 生命周期函数--监听页面初次渲染完成
+     */
+    onReady: function () {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面显示
+     */
+    onShow: function () {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面隐藏
+     */
+    onHide: function () {
+
+    },
+
+    /**
+     * 生命周期函数--监听页面卸载
+     */
+    onUnload: function () {
+
+    },
+
+    /**
+     * 页面相关事件处理函数--监听用户下拉动作
+     */
+    onPullDownRefresh: function () {
+
+    },
+
+    /**
+     * 页面上拉触底事件的处理函数
+     */
+    onReachBottom: function () {
+
+    },
+
+    /**
+     * 用户点击右上角分享
+     */
+    onShareAppMessage: function () {
+
+    }
+})

+ 7 - 0
pages/user/index.json

@@ -0,0 +1,7 @@
+{
+    "component": true,
+    "usingComponents": {
+        "mobile-main": "/commpents/mobile-frame/mobile-main",
+        "e-dialog": "/commpents/dialog/index"
+    }
+}

+ 68 - 0
pages/user/index.wxml

@@ -0,0 +1,68 @@
+<mobile-main frameStyle="{{frameStyle}}" bind:back="back">
+    <view slot="info" class="main" style="height:{{infoHeight}}px;">
+        <view class="one">
+            <button size="mini" bindtap="toAdd">添加用户</button>
+        </view>
+        <view class="two">
+            <view class="list" wx:for="{{list}}" wx:key="item">
+                <view class="name textOver">{{item.nickname||'暂无昵称'}}</view>
+                <view class="other">
+                    <view class="other_1"><text>性别:</text><text>{{item.gender}}</text></view>
+                    <view class="other_1"><text>手机:</text><text>{{item.phone}}</text></view>
+                    <view class="other_1"><text>状态:</text><text>{{item.status=='1'?'审核通过':item.status=='0'?'待审核':'拒绝审核'}}</text></view>
+                </view>
+                <view class="btn">
+                    <button size="mini" type="default" bindtap="toView" data-id="{{item._id}}">详情</button>
+                    <button size="mini" type="primary" bindtap="toEdit" data-id="{{item._id}}" wx:if="{{item.status=='0'||item.status=='-1'}}">修改</button>
+                    <button size="mini" type="default" bindtap="toCheck" data-id="{{item._id}}" wx:if="{{item.status=='0'}}">审核</button>
+                    <button size="mini" type="warn" bindtap="toDel" data-id="{{item._id}}">删除</button>
+                </view>
+            </view>
+        </view>
+    </view>
+</mobile-main>
+<e-dialog dialog="{{dialog}}" bind:toClose="toClose">
+    <view slot="info">
+        <view class="dialog_one" wx:if="{{dialog.type=='1'}}">
+            <view class="one_1">
+                <text>头像:</text>
+                <image src="{{form.icon[0].url}}"></image>
+            </view>
+            <view class="one_1">
+                <text class="text">名称:</text>
+                <text class="text1">{{form.nickname||'暂无昵称'}}</text>
+            </view>
+            <view class="one_1">
+                <text class="text">电话:</text>
+                <text class="text1">{{form.phone||'暂无'}}</text>
+            </view>
+            <view class="one_1">
+                <text class="text">性别:</text>
+                <text class="text1">{{form.gender||'暂无'}}</text>
+            </view>
+            <view class="one_1">
+                <text class="text">岗位:</text>
+                <text class="text1">{{form.work||'暂无'}}</text>
+            </view>
+            <view class="one_1">
+                <text class="text">邮箱:</text>
+                <text class="text1">{{form.email||'暂无'}}</text>
+            </view>
+        </view>
+        <view class="dialog_two" wx:elif="{{dialog.type=='2'}}">
+            <form bindsubmit="onSubmit">
+                <view class="content">
+                    <view class="label textOver">状态</view>
+                    <view class="value">
+                        <picker mode="selector" bindchange="statusChange" name="status" value="{{form.status}}" range-key="label" range="{{statusList}}">
+                            <view class="input">{{form.status=='0'?'待审中':form.status=='1'?'审核通过':'审核拒绝'}}</view>
+                        </picker>
+                    </view>
+                </view>
+                <view class="btn">
+                    <button type="primary" size="mini" formType="submit">提交审核</button>
+                </view>
+            </form>
+        </view>
+    </view>
+</e-dialog>

+ 140 - 0
pages/user/index.wxss

@@ -0,0 +1,140 @@
+.main {
+    position: relative;
+    width: 100%;
+}
+
+.main .one {
+    float: left;
+    width: 100%;
+    text-align: center;
+    background-color: #fff;
+    padding: 5px 0;
+    margin: 0 0 10px 0;
+    overflow-x: hidden;
+}
+
+.main .one button {
+    font-size: 14px;
+    background-color: #409eff;
+    color: #fff;
+}
+
+.main .two {
+    float: left;
+    width: 95%;
+    padding: 0 10px;
+    overflow-x: hidden;
+}
+
+.main .two .list {
+    float: left;
+    width: 95%;
+    background-color: #fff;
+    border-radius: 5px;
+    padding: 10px;
+    margin: 0 0 10px 0;
+}
+
+.main .two .list .name {
+    float: left;
+    width: 100%;
+    font-size: 14px;
+    font-weight: bold;
+    margin: 0 0 5px 0;
+}
+
+.main .two .list .other {
+    float: left;
+    width: 100%;
+    margin: 0 0 5px 0;
+}
+
+.main .two .list .other .other_1 {
+    float: left;
+    width: 100%;
+    font-size: 12px;
+    margin: 0 0 5px 0;
+}
+
+.main .two .list .other .other_1 text:nth-child(1) {
+    color: #666;
+}
+
+.main .two .list .btn {
+    float: left;
+    width: 100%;
+    text-align: center;
+}
+
+.main .two .list .btn button {
+    margin: 0 5px;
+    padding: 0 20px;
+    font-size: 14px;
+}
+
+.dialog_one {
+    float: left;
+    width: 100%;
+    margin: 10px 0 0 0;
+}
+
+.dialog_one .one_1 {
+    float: left;
+    width: 91%;
+    border: 1px solid #ccc;
+    border-radius: 5px;
+    margin: 0 0 10px 0;
+    padding: 10px;
+
+}
+
+.dialog_one .one_1 text {
+    color: #666;
+    font-size: 14px;
+}
+
+.dialog_one .one_1 text:nth-child(2) {
+    float: right;
+    color: #000;
+}
+
+.dialog_one .one_1 image {
+    float: right;
+    width: 60px;
+    height: 60px;
+}
+
+.dialog_two {
+    float: left;
+    width: 100%;
+}
+
+.dialog_two .content {
+    float: left;
+    width: 100%;
+    border-bottom: 1px solid #ccc;
+    padding: 10px 0;
+    margin: 0 0 10px 0;
+    font-size: 14px;
+}
+
+.dialog_two .content .label {
+    float: left;
+    width: 20%;
+}
+
+.dialog_two .content .value {
+    float: left;
+    width: 80%;
+    text-align: right;
+}
+
+.dialog_two .btn {
+    float: left;
+    width: 100%;
+    text-align: center;
+}
+
+.dialog_two .btn button {
+    font-size: 14px;
+}

+ 3 - 2
utils/dict.js

@@ -9,12 +9,13 @@ export const system = [
 // 我的页面-我的服务
 export const btn = [
     { title: '已上传图片', icon: 'icon-shangchuanzhaopian', route: 'uploadimg', type: '0|1|2' },
-    { title: '修改密码', icon: 'icon-xiugaimima', route: 'updatepd', type: '0|1|2' },
-    { title: '退出登录', icon: 'icon-tuichudenglu', route: '', type: '0|1|2', method: 'signout' },
+    { title: '用户管理', icon: 'icon-shenhe', route: 'user', type: '0' },
     { title: '比赛管理', icon: 'icon-bisaiguanli', route: 'matchadmin', type: '0' },
     { title: '审核队员', icon: 'icon-shenhe', route: 'exammembers', type: '1' },
     { title: '解散团队', icon: 'icon-ren_jiesantuandui_line', route: 'dismissteam', type: '1' },
     { title: '比赛管理', icon: 'icon-bisaiguanli', route: 'matchteam', type: '1' },
+    { title: '修改密码', icon: 'icon-xiugaimima', route: 'updatepd', type: '0|1|2' },
+    { title: '退出登录', icon: 'icon-tuichudenglu', route: '', type: '0|1|2', method: 'signout' },
 ]
 // 性别
 export const gender = ['男', '女', '未知']