7021f2fd创建于 2025年5月14日历史提交
<route lang="json5" type="page">
{
  layout: 'default',
  style: {
    navigationBarTitleText: '创建群组',
    navigationStyle: 'custom',
    disableScroll: true, // 微信禁止页面滚动
    'app-plus': {
      bounce: 'none', // 禁用 iOS 弹性效果
    },
  },
}
</route>

<template>
  <PageLayout navTitle="创建群组" backRouteName="myGroup">
    <view class="add-group-container">
      <view class="avatar-section">
        <view class="avatar-wrapper" @click="handleUploadAvatar">
          <wd-img
            v-if="groupAvatar"
            width="80px"
            radius="50%"
            height="80px"
            :src="groupAvatar"
          ></wd-img>
          <view v-else class="avatar-upload cuIcon-cameraadd"></view>
        </view>
      </view>

      <wd-form ref="form" :model="formData">
        <wd-cell-group border class="mt-10px mb-10px">
          <wd-input
            label="群组名称"
            label-width="80px"
            prop="groupName"
            clearable
            v-model="formData.groupName"
            placeholder="输入群组名称"
            :rules="[{ required: true, message: '请填写群组名称' }]"
          />
          <wd-input
            label="群组公告"
            label-width="80px"
            prop="groupIntroduce"
            clearable
            v-model="formData.groupIntroduce"
            placeholder="输入群组公告"
            :rows="3"
          />
        </wd-cell-group>
      </wd-form>

      <view class="footer">
        <wd-button type="primary" size="large" @click="handleSubmit" block>创建群组</wd-button>
      </view>
    </view>
  </PageLayout>
</template>

<script lang="ts" setup>
import { ref, reactive } from 'vue'
import { onShow, onHide, onLoad, onReady } from '@dcloudio/uni-app'
import { useMessage, useToast } from 'wot-design-uni'
import { useRouter } from '@/plugin/uni-mini-router'
import { useUserStore } from '@/store/user'
import { http } from '@/utils/http'
import { useParamsStore } from '@/store/page-params'
import { getEnvBaseUrl } from '@/utils/index'
import { cache, getFileAccessHttpUrl, hasRoute } from '@/common/uitls'
defineOptions({
  name: 'AddGroup',
  options: {
    styleIsolation: 'shared',
  },
})
const router = useRouter()
const paramsStore = useParamsStore()
const userStore = useUserStore()
const toast = useToast()
const message = useMessage()
const form = ref()
const groupAvatar = ref()
let stopWatch: any = null

const formData = reactive({
  groupName: '',
  groupIntroduce: '',
})
const handleUploadAvatar = (params) => {
  const { loading, data, error, run } = useUpload(
    { name: 'file' },
    { url: `${getEnvBaseUrl()}/sys/common/upload` },
  )
  if (stopWatch) stopWatch()
  run()
  stopWatch = watch(
    () => [loading.value, error.value, data.value],
    ([loading, err, data], oldValue) => {
      if (loading == false) {
        if (err) {
          // toast.warning('上传图片失败~')
        } else {
          // @ts-ignore
          groupAvatar.value = getFileAccessHttpUrl(data.message)
          // toast.success('上传图片成功~')
        }
      }
    },
  )
}
function handleSubmit() {
  form.value
    .validate()
    .then(({ valid, errors }) => {
      if (valid) {
        http
          .post(`/eoa/im/newApi/creatGroupSession`, {
            avatar: groupAvatar.value,
            groupIntroduce: formData.groupIntroduce,
            groupName: formData.groupName,
            type: 'group',
          })
          .then((res: any) => {
            if (res.success) {
              const { result } = res
              paramsStore.setPageParams('groupPage', {
                backRouteName: 'myGroup',
                data: {
                  groupId: result.msgTo,
                  groupName: result.fromUserName,
                  avatar: groupAvatar.value,
                },
              })
              router.push({ name: 'groupPage' })
              uni.$emit('myGroup:reload')
            } else {
              toast.warning(res.message)
            }
          })
      }
    })
    .catch((error) => {
      console.log(error, 'error')
      message.alert('表单验证失败')
    })
}
</script>

<style lang="scss" scoped>
.add-group-container {
  display: flex;
  flex-direction: column;
  height: 100%;

  .avatar-section {
    padding: 80px 0;
    display: flex;
    justify-content: center;
    background-image: linear-gradient(180deg, #0081ff, #1cbbb4);

    .avatar-wrapper {
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .avatar-upload {
      width: 80px;
      height: 80px;
      border-radius: 50%;
      background-color: rgba(0, 0, 0, 0.3);
      display: flex;
      justify-content: center;
      align-items: center;
      cursor: pointer;
      font-size: 40px;
      color: #fff;
    }
  }

  .footer {
    margin: 20px;
    padding-bottom: calc(env(safe-area-inset-bottom) + 10px);
  }
}
</style>