Browse Source

Merge branch 'startLogin' into jenkins

mo 1 year ago
parent
commit
d8d380e192

+ 1 - 1
dev-dist/sw.js

@@ -82,7 +82,7 @@ define(['./workbox-5357ef54'], (function (workbox) { 'use strict';
     "revision": "fbe553e78a1e04cfe0370756493c2178"
   }, {
     "url": "index.html",
-    "revision": "0.g5gr265ofhg"
+    "revision": "0.3gj68epgpk8"
   }], {});
   workbox.cleanupOutdatedCaches();
   workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), {

BIN
src/components/layout/images/chioseAdd.png


BIN
src/components/layout/images/opinionIcon.png


+ 17 - 0
src/components/layout/index.module.less

@@ -223,6 +223,21 @@
           transition: 0.2s;
         }
       }
+
+      .optons {
+        width: 32px;
+        height: 32px;
+        margin-right: 24px;
+        display: flex;
+        flex-direction: row;
+        align-items: center;
+        cursor: pointer;
+
+        img {
+          width: 100%;
+          height: 100%;
+        }
+      }
     }
   }
 }
@@ -245,6 +260,8 @@
   }
 }
 
+
+
 .propWrap {
   background-color: var(--n-color);
   border-radius: 16px;

+ 4 - 2
src/components/layout/index.tsx

@@ -31,6 +31,7 @@ import { state } from '/src/state';
 import PreviewWindow from '/src/views/preview-window';
 import { fscreen } from '@/utils/index';
 import AttendClass from '/src/views/prepare-lessons/model/attend-class';
+
 export default defineComponent({
   name: 'layoutView',
   setup() {
@@ -634,10 +635,11 @@ export default defineComponent({
 
         <NModal
           class={['modalTitle background']}
+          style={{ width: '687px' }}
           title={'节拍器'}
           preset="card"
-          v-model:show={showModalBeat.value}
-          style={{ width: '687px' }}>
+          v-model:show={showModalBeat.value}>
+
           <div class={styles.modeWrap}>
             <iframe
               src={`${vaildUrl()}/metronome/?id=${new Date().getTime()}`}

+ 17 - 3
src/components/layout/layoutTop.tsx

@@ -11,11 +11,11 @@ import personIcon from './images/personIcon.png';
 import { useUserStore } from '@/store/modules/users';
 import { useRouter } from 'vue-router';
 import { storeToRefs } from 'pinia';
-
+import opinionIcon from './images/opinionIcon.png'
 import 'animate.css';
 import ForgotPassword from '/src/views/setting/modal/forgotPassword';
 import ImGroup from './imGroup';
-
+import SuggestionOption from './modals/suggestion-option'
 export default defineComponent({
   name: 'layoutTop',
   setup() {
@@ -24,7 +24,7 @@ export default defineComponent({
     const showHeadFlag = ref(false);
     const showImGroup = ref(false);
     const showImGroupLoading = ref(true);
-
+    const showSuggestionViseble = ref(false)
     const users = useUserStore();
     const showWord = ref(false);
     const { info } = storeToRefs(users);
@@ -86,6 +86,9 @@ export default defineComponent({
             </p>
           </div>
           <div class={styles.layoutRight}>
+            <div class={styles.optons} onClick={()=>showSuggestionViseble.value = true}>
+                <NImage src={opinionIcon} previewDisabled></NImage>
+            </div>
             <div onClick={() => (showImGroup.value = true)}>
               <NBadge
                 value={noReadCount.value}
@@ -230,6 +233,17 @@ export default defineComponent({
             displayDirective="show">
             <ImGroup />
           </NModal>
+
+
+          <NModal
+            class={['modalTitle', 'background']}
+            style={{ width: '910px' }}
+            v-model:show={showSuggestionViseble.value}
+            preset="card"
+            showIcon={false}
+            title="意见反馈">
+              <SuggestionOption onClose={()=>showSuggestionViseble.value = false}></SuggestionOption>
+          </NModal>
         </div>
       </>
     );

+ 31 - 0
src/components/layout/modals/api.ts

@@ -0,0 +1,31 @@
+import request from '@/utils/request';
+/**
+ * 新增意见
+ */
+export const addSuggestion = (params: any) => {
+  return request.post('/edu-app/sysSuggestion/save', {
+    data: params
+    // requestType: 'form'
+  });
+};
+
+/**
+ * 获取意见类型
+ */
+
+export const getSuggestionList = (params: any) => {
+  return request.post('/edu-app/sysSuggestionType/page', {
+    data: params
+    // requestType: 'form'
+  });
+};
+
+/**
+ * 获取系统参数
+ */
+export const sysParamConfigPage = (params: any) => {
+  return request.post('/edu-app/sysParamConfig/page', {
+    data: params
+    // requestType: 'form'
+  });
+};

+ 76 - 0
src/components/layout/modals/suggestion-option.module.less

@@ -0,0 +1,76 @@
+.updateBtnGroup {
+  padding: 0;
+  justify-content: center !important;
+
+  :global {
+    .n-button {
+      height: 48px !important;
+      min-width: 156px;
+    }
+  }
+}
+
+.updatePassword {
+  padding: 40px;
+}
+
+.countInput {
+  border-radius: 8px;
+  min-height: 265px;
+}
+
+.addInput {
+  font-size: 16px;
+  font-weight: 400;
+  color: #777777;
+  line-height: 22px;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+
+  img {
+    width: 36px;
+    height: 36px;
+    margin-bottom: 20px;
+  }
+}
+
+:global {
+  .n-upload-trigger.n-upload-trigger--image-card {
+    width: 150px;
+    height: 150px;
+    background: #FDFDFD;
+    border-radius: 8px;
+  }
+
+  .n-upload-file-list .n-upload-file.n-upload-file--image-card-type {
+    width: 150px;
+    height: 150px;
+    background: #FDFDFD;
+    border-radius: 8px;
+
+  }
+
+
+  .n-upload-file-list.n-upload-file-list--grid {
+    display: grid;
+    grid-template-columns: repeat(auto-fill, 150px);
+    grid-gap: 20px;
+    margin-top: 0;
+  }
+}
+
+.messageWrap {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+
+  p {
+    height: 25px;
+    font-size: 18px;
+    font-weight: 400;
+    color: #777777;
+    line-height: 25px;
+    margin-right: 40px;
+  }
+}

+ 272 - 0
src/components/layout/modals/suggestion-option.tsx

@@ -0,0 +1,272 @@
+import { defineComponent, onMounted, reactive, ref } from 'vue';
+import styles from './suggestion-option.module.less';
+import {
+  NButton,
+  NForm,
+  NFormItem,
+  NInput,
+  NSelect,
+  NSpace,
+  useMessage,
+  NUpload,
+  UploadFileInfo,
+  NImage
+} from 'naive-ui';
+
+import { useUserStore } from '/src/store/modules/users';
+import chioseAdd from '../images/chioseAdd.png';
+import CSelect from '../../CSelect';
+import { policy } from '../../upload-file/api';
+import { addSuggestion, getSuggestionList,sysParamConfigPage } from '../modals/api';
+export default defineComponent({
+  name: 'train-update',
+  emits: ['close', 'submit'],
+  setup(props, { emit }) {
+    const message = useMessage();
+    const userStore = useUserStore();
+    const forms = reactive({
+      suggestionTypeId: null,
+      clientType: 'TEACHER',
+      content: '',
+      attachmentUrls: ''
+    });
+    const state = reactive([]) as any;
+
+    const suggestionTypeList = ref([]as any)
+    const ossUploadUrl = `https://gyt.ks3-cn-beijing.ksyuncs.com/`;
+    const uploadRef = ref();
+    const fileListRef = ref<UploadFileInfo[]>([]);
+    const formsRef = ref();
+    const btnLoading = ref(false);
+    const tempFiileBuffer = ref();
+    const email = ref('')
+    const phone = ref('')
+    const onSubmit = async () => {
+      if (!forms.suggestionTypeId) {
+        message.error('请选择反馈类型');
+        return;
+      }
+      if (!forms.content) {
+        message.error('请填写反馈信息');
+        return;
+      }
+      const attachmentUrlsList = fileListRef.value.map((item:any)=>{
+        console.log(item,'item')
+        const name = item.name;
+        // const suffix = name.slice(name.lastIndexOf('.'));
+        const fileName = `${item.id + name}`;
+        const url = ossUploadUrl + fileName;
+        return url
+      })
+      const attachmentUrls = attachmentUrlsList.join(',')
+      try{
+
+        const res = await addSuggestion({...forms,attachmentUrls})
+        message.success('提交成功')
+        emit('close')
+      }catch(e){
+        console.log(e)
+      }
+      console.log('onSubmit');
+    };
+    const onBeforeUpload = async (options: any) => {
+      console.log(options, 'onBeforeUpload');
+      const file = options.file;
+      // 文件大小
+      let isLt2M = true;
+
+      const size = 2;
+      if (size) {
+        isLt2M = file.file.size / 1024 / 1024 < size;
+        if (!isLt2M) {
+          message.error(`文件大小不能超过${size}M`);
+          return false;
+        }
+      }
+
+      if (!isLt2M) {
+        return isLt2M;
+      }
+      // 是否裁切
+      try {
+        btnLoading.value = true;
+        const name = file.file.name;
+        const fileName = `${file.id + name}`;
+        const obj = {
+          filename: fileName,
+          bucketName: 'gyt',
+          postData: {
+            filename: fileName,
+            acl: 'public-read',
+            key: fileName,
+            unknowValueField: []
+          }
+        };
+        const { data } = await policy(obj);
+        state.push({
+          id: file.id,
+          tempFiileBuffer: file.file,
+          policy: data.policy,
+          signature: data.signature,
+          acl: 'public-read',
+          key: fileName,
+          KSSAccessKeyId: data.kssAccessKeyId,
+          name: fileName
+        })
+      } catch {
+        //
+        // message.error('上传失败')
+        btnLoading.value = false;
+        return false;
+      }
+      return true;
+    };
+    const onFinish = (options: any) => {
+      // const url =
+      const name = options.file.name;
+      // const suffix = name.slice(name.lastIndexOf('.'));
+      const fileName = `${options.file.id + name}`;
+      const url = ossUploadUrl + fileName;
+      // urlList.value.push(url);
+      // onFinishAfter(options);
+    };
+    const onRemove = async (event:any) => {
+      console.log(event)
+      btnLoading.value = false;
+    };
+
+    const getTypeList = async () => {
+      try {
+        const res = await getSuggestionList({ rows: 9999, page: 1 });
+      suggestionTypeList.value = res.data.rows;
+      } catch (e) {
+        console.log('请求报错')
+        console.log(e);
+      }
+    };
+
+
+    const getPhoneInfo = async ()=>{
+
+
+      try {
+        const {data} = await sysParamConfigPage({ page: 1, rows: 999, group: 'OTHER' });
+        const rows = data.rows || []
+        email.value = rows.find((item:any)=>{
+          return item.paramName == 'customer_service_email'
+        }).paramValue
+        phone.value = rows.find((item:any)=>{
+          return item.paramName == 'customer_service_phone'
+        }).paramValue
+
+        console.log( email.value , phone.value)
+      } catch (e) {
+        console.log('请求报错')
+        console.log(e);
+      }
+
+    }
+    onMounted(()=>{
+      getTypeList()
+      getPhoneInfo()
+    })
+    return () => (
+      <div class={styles.updatePassword}>
+        <NForm
+          labelAlign="right"
+          labelPlacement="left"
+          labelWidth={'auto'}
+          ref={formsRef}
+          model={forms}
+          requireMarkPlacement="left">
+          {/* <NFormItem
+            path="currentClass"
+            label=""
+            class={styles.phoneContainer}>
+            <p class={styles.phone}>{forms.mobile}</p>
+          </NFormItem> */}
+
+          <NFormItem
+            rule={[
+              {
+                required: true,
+                message: '请选择反馈类型'
+              }
+            ]}
+            path="suggestionTypeId">
+            <CSelect
+              value-field="id"
+              label-field="name"
+              style={{ width: '357px!important' }}
+              {...({
+                options: suggestionTypeList.value,
+                placeholder: '反馈类型(必选)',
+                clearable: true,
+                inline: true
+              } as any)}
+              v-model:value={forms.suggestionTypeId}></CSelect>
+          </NFormItem>
+          <NFormItem path='content'         rule={[
+              {
+                required: true,
+                message: '请输入反馈内容'
+              }
+            ]}>
+            <NInput
+              class={styles.countInput}
+              type="textarea"
+              rows={5}
+              placeholder={'请输入反馈内容'}
+              maxlength={500}
+              showCount
+              v-model:value={forms.content}></NInput>
+          </NFormItem>
+          <NFormItem>
+            <NUpload
+              list-type="image-card"
+              accept=".jpg,jpeg,.png"
+              v-model:fileList={fileListRef.value}
+              ref={uploadRef}
+              multiple={true}
+              max={5}
+              data={(file: any) => {
+                const item = state.find((c: any) => {
+                  return c.id == file.file.id;
+                });
+                const { id, tempFiileBuffer, ...more } = item;
+                return { ...more };
+              }}
+              showPreviewButton
+              action={ossUploadUrl}
+              onBeforeUpload={(options: any) => onBeforeUpload(options)}
+              onRemove={(options: any) => onRemove(options)}
+              onFinish={(options: any) => onFinish(options)}>
+              <div class={styles.addInput}>
+                <NImage previewDisabled src={chioseAdd}></NImage>
+                点击上传
+              </div>
+            </NUpload>
+          </NFormItem>
+          {
+            (phone.value || email.value)?  <NFormItem>
+            <div class={styles.messageWrap}>
+             {phone.value? <p>客服电话:{phone.value}</p>:null}
+             {email.value?  <p>邮箱:{email.value}</p>:null}
+
+            </div>
+           </NFormItem>:null
+          }
+
+          <NSpace class={styles.updateBtnGroup}>
+            <NButton strong type="default" round onClick={() => emit('close')}>
+              取消
+            </NButton>
+            <NButton strong type="primary" round onClick={() => onSubmit()}>
+              确认
+            </NButton>
+          </NSpace>
+        </NForm>
+      </div>
+    );
+  }
+});

BIN
src/custom-plugins/guide-page/images/student1.png