yiming
2024-03-15 2ddff89413a44ca11e26c2210096457a2b65acaa
Merge refs/remotes/origin/master into refs/heads/master
4个文件已修改
422 ■■■■■ 已修改文件
pages/teacherCertification/index.js 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/teacherCertification/index.json 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/teacherCertification/index.wxml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/teacherCertification/index.wxss 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/teacherCertification/index.js
@@ -1,17 +1,51 @@
const app = getApp();
import tool from "../../assets/js/toolClass.js";
import { getTopicMsgCmsItemFile } from '../../assets/js/middleGround/tool.js'
Page({
  /**
   * 页面的初始数据
   */
  data: {
    teacherInfo: {
      schoolName: '', //学校名称
      fullName: '', //姓名
      positionalTitle: '', //职称
      courseName: '', //任课教程
      phone: '', //联系电话
      telphone: '', //座机
      email: '', //联系邮箱
      detailedAddress: '', //通讯地址
      relevantCertificates: [], //相关证件
      state: '', //审核状态默认待审核
      agree: false
    },
    teachPosts: [],
    teachText: '',
    teachVisible: false,
    phoneError: false,
    telphoneError: false,
    emailError: false,
    topicMessageList: [],
    topicId: "",
    worksInfo: [],
    userId: '',
    fileList: [],
    protocolTxt: '', //教师协议
    editState: true,
    reasonTxt: ""
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    console.log(options);
    console.log(options, 111);
    this.getpositionalTitle();
    this.getAgreement();
    if (wx.getStorageSync(app.config.tokenKey)) {
      this.getUserRole()
    }
  },
  /**
@@ -41,6 +75,290 @@
  onUnload() {
  },
  getUserRole() {
    app.MG.identity.getCurrentAppUser().then((res) => {
      if (res) {
        this.getType()
        this.setData({
          userId: res.userId
        })
        let teacherRole = res.roleLinks.find((item) => item.role.refCode == 'teacher')
        let teacherInfos = res.infoList.find((item) => item.type == 'teacherInfo')
        let wechatInfo = res.infoList.find((item) => item.type == 'WeChat')
        let studentInfo = res.infoList.find((item) => item.type == 'Default')
        let phoneInfo = res.secretList.find((item) => item.type == 'MobilePhone')
        let emailInfo = res.secretList.find((item) => item.type == 'EMail')
        let defaultUser = {};
        if (teacherRole && teacherInfos) {
          defaultUser = {
            ...teacherInfos,
            nickName: teacherInfos.fullName,
            avatarUrl: teacherInfos.icon,
            userId: res.userId,
            phoneNumber: phoneInfo?.credential,
            Email: emailInfo ? emailInfo.credential : JSON.parse(teacherInfos.data).email,
            role: 'Teacher',
            roleId: teacherRole.role.id
          }
        } else if (wechatInfo) {
          defaultUser = {
            ...wechatInfo,
            nickName: wechatInfo.name,
            avatarUrl: wechatInfo.icon,
            userId: res.userId,
            phoneNumber: phoneInfo?.credential,
            Email: emailInfo?.credential,
            role: 'Student'
          }
        } else if (studentInfo) {
          defaultUser = {
            ...studentInfo,
            nickName: wechatInfo.name,
            avatarUrl: wechatInfo.icon,
            userId: res.userId,
            phoneNumber: phoneInfo?.credential,
            Email: emailInfo?.credential,
            role: 'Student'
          }
        }
        wx.setStorageSync(app.config.userInfoKey, JSON.stringify(this.data.userInfo));
      }
    })
  },
  getType() {
    const data = {
      refCodes: ['jsek_teacherCertification']
    }
    app.MG.resource.getCmsTypeByRefCode(data).then((res) => {
      this.setData({
        worksInfo: res[0].cmsTypeLinks[0].children,
      })
      this.newGetTeacherInfo()
    })
  },
  newGetTeacherInfo() {
    const data = {
      start: 0,
      size: 10,
      topicIdOrRefCode: 'teacherRoleApproval',
      appRefCode: app.config.appRefCode,
      sort: {
        type: 'Desc',
        field: 'CreateDate'
      }
    }
    app.MG.ugc.getTopicMessageList(data).then((res) => {
      try {
        this.setData({
          fileList: [],
        })
        const resData = res.datas.find((i) => i.appUserCreator.userId === this.data.userId)
        if (resData) {
          if (resData.state == 'WaitAudit') {
            this.setData({
              editState: false,
            })
          } else {
            this.setData({
              editState: true,
            })
          }
          let info = getTopicMsgCmsItemFile(this.data.worksInfo, resData.cmsItemDataList)
          this.setData({
            'teacherInfo.fullName': info.fullName,
            'teacherInfo.schoolName ': info.schoolName,
            'teacherInfo.positionalTitle': info.positionalTitle,
            'teacherInfo.courseName': info.courseName,
            'teacherInfo.phone': info.phone,
            'teacherInfo.telphone': info.telphone ? info.telphone : '',
            'teacherInfo.email': info.email,
            'teacherInfo.detailedAddress': info.detailedAddress ? info.detailedAddress : '',
            'teacherInfo.relevantCertificates': info.relevantCertificates,
            'teacherInfo.agree': true,
            'teacherInfo.state': resData.state,
            topicId: resData.id,
            topicMessageList: resData.cmsItemDataList
          })
          if (resData.feedBack != null) {
            this.setData({
              reasonTxt: JSON.parse(resData.feedBack).reason,
            })
          }
          if (this.data.teacherInfo.relevantCertificates.length > 0) {
            if (typeof this.data.teacherInfo.relevantCertificates == 'object') {
              this.data.teacherInfo.relevantCertificates.forEach((ele) => {
                let imgObj = {
                  md5: ele.file.md5,
                  linkType: 'LinkFile',
                  linkProtectType: 'Public',
                  url: app.config.requestCtx + `/file/GetPreViewImage?md5=` + ele.file.md5
                }
                this.data.fileList.push(imgObj)
              })
            } else {
              let imgObj = {
                md5: this.data.teacherInfo.relevantCertificates,
                linkType: 'LinkFile',
                linkProtectType: 'Public',
                url:
                  app.config.requestCtx + `/file/GetPreViewImage?md5=` + this.data.teacherInfo.relevantCertificates
              }
              this.data.fileList.push(imgObj)
            }
          }
        }
      } catch (error) {
      }
    })
  },
  getpositionalTitle() {
    const data = {
      refCodes: ['positionalTitle']
    }
    app.MG.store.getProductTypeField(data).then((res) => {
      try {
        let list = res[0]
        let options = JSON.parse(list.config).option
        options.forEach((item) => {
          item.label = item.name;
        })
        this.setData({
          teachPosts: options,
        })
      } catch (error) {
      }
    })
  },
  getAgreement() {
    let query = {
      path: 'jsek_protocol',
      fields: {
        content: []
      }
    }
    app.MG.resource.getItem(query).then((res) => {
      try {
        const data = res.datas.find((e) => e.refCode == 'jsek_teacherCertificationAgreement')
        this.setData({
          protocolTxt: data ? data.content : '暂无协议',
        })
      } catch (error) {
        this.setData({
          protocolTxt: '暂无协议',
        })
      }
    })
  },
  //选择职称
  onTeachPicker() {
    this.setData({ teachVisible: true });
  },
  onPickerChange(e) {
    const { value, label } = e.detail;
    this.setData({
      teachVisible: false,
      teachText: label[0],
      'teacherInfo.positionalTitle': value.join[0],
    });
  },
  onPickerCancel(e) {
    this.setData({
      'teacherInfo.positionalTitle': '',
      teachVisible: false,
    });
  },
  //输入手机号
  onPhoneInput(e) {
    const { phoneError } = this.data;
    const isPhoneNumber = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/.test(e.detail.value);
    if (phoneError === isPhoneNumber) {
      this.setData({
        phoneError: !isPhoneNumber,
      });
    }
  },
  //输入座机
  onTelphoneInput(e) {
    const { telphoneError } = this.data;
    const isPhoneNumber = /^0\d{2}-\d{8}$|^0\d{3}-\d{7}$/.test(e.detail.value);
    if (telphoneError === isPhoneNumber) {
      this.setData({
        telphoneError: !isPhoneNumber,
      });
    }
  },
  onEmailInput(e) {
    const { emailError } = this.data;
    const isPhoneNumber = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/.test(e.detail.value);
    if (emailError === isPhoneNumber) {
      this.setData({
        emailError: !isPhoneNumber,
      });
    }
  },
  handleAdd(e) {
    const { fileList } = this.data;
    console.log(e)
    const { files } = e.detail;
    // 方法2:每次选择图片都上传,展示每次上传图片的进度
    files.forEach(file => {
      this.onUpload(file)
    })
  },
  onUpload(file) {
    console.log(file, '123')
    const isLt2M = (0.5 * file.size) / 1024 / 1024 < 0.5
    if (!isLt2M) {
      wx.showToast({
        title: "上传文件大小不能超过 500KB!",
        icon: 'none',
        duration: 1000,
      })
      return reject()
    }
    const FileName = file.name.split('.')[0]
    const Extension = file.name.split('.')[1]
    const FileType = file.type
    let size = 1024
    tool.getFileMd5(file, size * 1024).then((e) => {
      if (!this.data.fileList.find((item) => item.md5 == e)) {
        const imgData = new FormData()
        imgData.append('Md5', e)
        imgData.append('FileName', FileName)
        imgData.append('Extension', Extension)
        imgData.append('FileType', FileType)
        imgData.append('MetaData', null)
        imgData.append('file', file)
        app.MG.file.upload(imgData).then(() => {
          this.data.fileList.push({
            md5: e,
            linkType: 'LinkFile',
            linkProtectType: 'Public',
            name: FileName,
            type: FileType,
            url: app.config.requestCtx + `/file/GetPreViewImage?md5=` + e
          })
        })
      } else {
        ElMessage.error('当前文件已上传,请勿重复操作!')
      }
    })
      .catch((e) => {
        console.error(e)
      })
  },
  handleRemove(e) {
    const { index } = e.detail;
    const { fileList } = this.data;
    fileList.splice(index, 1);
    this.setData({
      fileList,
    });
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
pages/teacherCertification/index.json
@@ -1,6 +1,10 @@
{
  "navigationBarTitleText": "教师认证",
  "enablePullDownRefresh": true,
  "backgroundTextStyle": "light",
  "usingComponents": {}
  "usingComponents": {
    "t-cell": "tdesign-miniprogram/cell/cell",
    "t-picker": "tdesign-miniprogram/picker/picker",
    "t-picker-item": "tdesign-miniprogram/picker-item/picker-item",
    "t-input": "tdesign-miniprogram/input/input",
    "t-upload": "tdesign-miniprogram/upload/upload"
  }
}
pages/teacherCertification/index.wxml
@@ -4,61 +4,70 @@
    <form catchsubmit="formSubmit" catchreset="formReset" class="formBox">
      <view class="from-item">
        <view class="label"> 当前状态: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="" />
        <view class="stateBox">
          <text class="wait" wx:if="{{teacherInfo.state == 'WaitAudit'}}">等待审核</text>
          <text class="yes" wx:if="{{teacherInfo.state == 'Normal'}}">已认证</text>
          <text class="no" wx:if="{{teacherInfo.state == 'Reject'}}">已驳回</text>
          <text class="wait" wx:if="{{teacherInfo.state == ''}}">待认证</text>
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 学校: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入学校" />
          <t-input placeholder="请输入学校" borderless value="{{teacherInfo.schoolName}}" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 真实姓名: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入真实姓名" />
          <t-input placeholder="请输入真实姓名" borderless value="{{teacherInfo.fullName}}" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 职称: </view>
        <view class="item-content">
          <!-- <input class="weui-input" name="input" placeholder="请选择职称" /> -->
          <t-cell arrow note="{{teachText}}" bind:click="onTeachPicker" />
          <t-picker visible="{{teachVisible}}" default-value="{{teacherInfo.positionalTitle}}" title="选择职称" cancelBtn="取消" confirmBtn="确认" bindchange="onPickerChange" bindcancel="onPickerCancel">
            <t-picker-item options="{{teachPosts}}" />
          </t-picker>
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 任教课程: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入任教课程" />
          <t-input placeholder="请输入任教课程" borderless value="{{teacherInfo.courseName}}" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 手机号: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入手机号" />
          <t-input placeholder="输入手机号码" borderless value="{{teacherInfo.phone}}" type="number" tips="{{phoneError ? '手机号输入不正确' : ''}}" bindchange="onPhoneInput" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 座机: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入座机" />
          <t-input placeholder="输入座机号" borderless value="{{teacherInfo.telphone}}" type="number" tips="{{telphoneError ? '座机号输入不正确' : ''}}" bindchange="onTelphoneInput" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 邮箱: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入邮箱" />
          <t-input placeholder="输入邮箱" borderless value="{{teacherInfo.email}}" type="number" tips="{{emailError ? '邮箱输入不正确' : ''}}" bindchange="onEmailInput" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 详细地址: </view>
        <view class="item-content">
          <input class="weui-input" name="input" placeholder="请输入详细地址" />
          <t-input placeholder="请输入详细地址" borderless value="{{teacherInfo.detailedAddress}}" />
        </view>
      </view>
      <view class="from-item">
        <view class="label"> 在职教师工作证: </view>
        <view class="item-content"> </view>
        <view class="wrapper">
          <t-upload mediaType="{{['image']}}" files="{{fileList}}" bind:add="handleAdd" bind:remove="handleRemove">
          </t-upload>
        </view>
      </view>
      <view class="btn-area">
        <button class="submit" formType="submit">提交</button>
pages/teacherCertification/index.wxss
@@ -30,7 +30,66 @@
  padding: 10rpx;
}
.from-item .stateBox {
  padding: 10rpx;
}
.from-item .t-input {
  padding: 0 !important;
}
.submit {
  background: #ff6c00;
  color: #fff;
}
.t-cell {
  padding: 0 !important;
}
.t-cell::after {
  border-bottom: 0 !important;
}
.t-cell__title {
  flex: 0 !important;
}
.t-cell__note {
  justify-content: flex-start !important;
  display: block !important;
  /* width: 300rpx; */
}
.t-input__wrap .t-input__content,
.t-input__control {
  font-size: 28rpx !important;
}
.t-picker-item__wrapper {
  padding: 80rpx 0 !important;
}
.t-picker__indicator {
  top: 80rpx !important;
}
.wait {
  color: #ff6d00;
}
.no {
  color: #EE1818
}
.yes {
  color: #1FBC1F
}
.wrapper {
  width: 56%;
}
.t-grid-item {
  width: 50% !important;
}