|                                                                                                                                                                                                                                                                                                             |  | <template>  <view class="page__view">    <navbar title="意见反馈" leftClick @leftClick="$utils.navigateBack" bgColor="transparent" />
    <view class="bg">      <view class="title">Hello</view>      <view class="desc">有什么好的建议可以告诉我们哦~</view>    </view>
    <view class="main">      <view class="form">        <uv-form           ref="form"          :model="form"          errorType="toast"        >          <view class="form-item">            <uv-form-item prop="textDetails" :customStyle="formItemStyle">              <view class="card">                <view class="editor-header">                  <view class="editor-header-content">                    <view>反馈内容</view>                    <view class="editor-icon">                      <uv-icon name="star-fill" color="#FFFFFF" size="26rpx"></uv-icon>                    </view>                  </view>                </view>                <view class="editor__view">                  <editor id="editor" class="editor"                    placeholder="请填写10个字以上的内容,以便我们为您提供更好的服务"                    @ready="onEditorReady"                    @input="onEditroInput"                  ></editor>                  <view class="editor-tools">                    <button @click="insertImage" plain class="flex btn">                      <!-- todo: 缺切图 -->                      <uv-icon name="camera-fill" color="#014FA2" size="56rpx"></uv-icon>                    </button>                  </view>                </view>              </view>            </uv-form-item>          </view>          <view class="form-item">            <uv-form-item prop="phone" :customStyle="formItemStyle">              <view class="flex card phone">                <view class="label">联系电话</view>                <input                   v-model="form.phone"                   placeholder-style="color: #999999; font-size: 28rpx;"                  placeholder="请输入手机号"                 />              </view>            </uv-form-item>          </view>        </uv-form>      </view>    </view>  </view></template>
<script>  export default {    data() {      return {        form: {          textDetails: null,          phone: null,				},        formItemStyle: { padding: 0 },      }    },		onReady() {			this.$refs.form.setRules(this.getRules());		},    methods: {      onEditorReady() {				uni.createSelectorQuery().select('#editor').context((res) => {					this.editorCtx = res.context				}).exec()			},      onEditroInput(e) {        const { text } = e.detail
        this.descLen = text?.length || 0      },			insertImage() {				uni.chooseImage({					count: 1,					success: (res) => {						// this.editorCtx.insertImage({
						// 	src: res.tempFilePaths[0],
						// 	alt: '图像',
						// })
            // todo: check
            this.$Oss.ossUpload(res.tempFilePaths[0]).then(url => {              this.editorCtx.insertImage({                src: url,                alt: '图像',              })            })					}				})			},      setEditorContents(html) {        if (!this.editorCtx) {          setTimeout(() => {            this.setEditorContents(html)          }, 200)
          return        }
        this.editorCtx.setContents({ html })      },      getEditorContents() {        return new Promise((resolve, reject) => {          this.editorCtx.getContents({            success: (e) => {              const { html, text } = e              resolve({ html, text })            },            fail: () => {              reject()            }          })        })      },      getRules() {        const textDetailsValidator = async (rule, value, callback) => {          const textDetails = (await this.getEditorContents())?.html
          if (textDetails) {            callback()            return          }
          callback(new Error('请填写10个字以上的内容,以便我们为您提供更好的服务'))        }
        return {					'phone': {						type: 'string',						required: true,						message: '请输入手机号',					},					'textDetails': {            asyncValidator: textDetailsValidator,					},				}      },      async onSubmit(headImage) {        try {
          await this.$refs.form.validate()
          const textDetails = (await this.getEditorContents())?.html
          const {            phone,          } = this.form
          const params = {            phone,            textDetails,          }
          // todo
          // await this.$fetch('saveOrUpdateArticleShare', params)
                    uni.showToast({            title: '提交成功',            icon: 'none'          })
          setTimeout(uni.navigateBack, 1000, -1)						        } catch (err) {
        }      },    },  }</script>
<style scoped lang="scss">
  .page__view {    background: #F5F5F5;        /deep/ .nav-bar__view {      position: fixed;      top: 0;      left: 0;    }  }
  .bg {    width: 100%;    height: 501rpx;    padding-top: 203rpx;    box-sizing: border-box;    color: #FFFFFF;		background: linear-gradient(164deg, #014FA2 30%, #4C8FD6);
    .title {      padding: 0 73rpx;      font-size: 64rpx;      font-weight: 600;    }
    .desc {      margin-top: 18rpx;      padding: 0 68rpx;      box-sizing: border-box;      font-size: 28rpx;    }  }
  .main {    width: 100%;    padding: 0 28rpx;    box-sizing: border-box;    background: #F5F5F5;  }
  .form {    // transform: translateY(-98rpx);
    transform: translateY(-46rpx);
    &-item {      & + & {        margin-top: 36rpx;      }    }  }
  .editor__view {    padding: 43rpx 30rpx;    background-color: #FFFFFF;    border-radius: 12rpx;  }
  .editor-header {    position: absolute;    top: 0;    left: 12rpx;    transform: translateY(-100%);    // margin-left: 12rpx;
    &-content {      position: relative;      padding: 9rpx 20rpx 3rpx 20rpx;      font-size: 28rpx;      font-weight: 600;      color: #FFFFFF;      border-top-left-radius: 30rpx;      background: linear-gradient(to right, #014FA2, #6A9ACE);    }  }
  .editor-icon {    position: absolute;    top: 0;    right: 0;    transform: translate(30rpx, -4rpx);  }
  .editor {    height: 462rpx;
    &-tools {      padding: 0 7rpx;      .btn {        width: 133rpx;        height: 133rpx;        border: 2rpx dashed #014FA2;      }    }
  }
  .card {    position: relative;  }
  .phone {    justify-content: flex-start;    padding: 44rpx 27rpx;    column-gap: 31rpx;    background: #FFFFFF;    border-radius: 15rpx;
    .label {      font-size: 28rpx;      color: #000000;    }  }
</style>
 |