Bladeren bron

no message

xiaoxin 1 jaar geleden
bovenliggende
commit
a6cec8e738

+ 6 - 6
src/components/Map/index.vue

@@ -23,9 +23,9 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import AMapLoader from "@amap/amap-jsapi-loader"
 import { onMounted, onUnmounted, ref } from "vue"
 import { onMounted, onUnmounted, ref } from "vue"
 import { ElMessage } from "element-plus"
 import { ElMessage } from "element-plus"
+import AMapLoader from "@amap/amap-jsapi-loader"
 
 
 const $emit = defineEmits(["change"])
 const $emit = defineEmits(["change"])
 
 
@@ -42,16 +42,16 @@ onMounted(() => {
 
 
 function initMap() {
 function initMap() {
   window._AMapSecurityConfig = {
   window._AMapSecurityConfig = {
-    securityJsCode: "aeecbbed516ac15400631deb4ba44c79"
+    securityJsCode: "0d17744f13fff85605b79354540fd67b"
   }
   }
   AMapLoader.load({
   AMapLoader.load({
-    key: "d5b00a2684bdf5b38fcfbcf1f35c30bf", // 申请好的Web端开发者Key,首次调用 load 时必填
-    version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
-    plugins: ["AMap.AutoComplete", "AMap.PlaceSearch"] // 需要使用的的插件列表,如比例尺'AMap.Scale'等
+    key: "ba26d52282a8ade8c422acfe679b6672",
+    version: "2.0",
+    plugins: ["AMap.AutoComplete", "AMap.PlaceSearch"]
   }).then((AMap) => {
   }).then((AMap) => {
     map = new AMap.Map("container", {
     map = new AMap.Map("container", {
       resizeEnable: true,
       resizeEnable: true,
-      viewMode: "3D", // 是否为3D地图模式
+      viewMode: "3D",
       zoom: 15 // 初始化地图级别
       zoom: 15 // 初始化地图级别
     })
     })
 
 

+ 31 - 3
src/views/account-management/index.vue

@@ -8,6 +8,8 @@ import { cloneDeep } from "lodash-es"
 const loading = ref(false)
 const loading = ref(false)
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 
 
+const isShow = ref(false)
+
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
@@ -31,13 +33,14 @@ const validatePass = (_rule, value, callback) => {
   if (!reg.test(value)) {
   if (!reg.test(value)) {
     callback(new Error("姓名格式有误"))
     callback(new Error("姓名格式有误"))
   }
   }
+  callback()
 }
 }
 const formRules = {
 const formRules = {
   account: [{ required: true, trigger: "blur", message: "账号必填" }],
   account: [{ required: true, trigger: "blur", message: "账号必填" }],
   cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
   cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
-  name: [{ validator: validatePass, trigger: "blur" }],
+  name: [{ required: true, validator: validatePass, trigger: "blur" }],
   password: [{ required: true, trigger: "blur", message: "密码必填" }],
   password: [{ required: true, trigger: "blur", message: "密码必填" }],
-  roleId: [{ required: true, trigger: "blur", message: "角色必填" }]
+  roleId: [{ required: true, trigger: "change", message: "角色必填" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
@@ -79,6 +82,7 @@ const handleDelete = (row) => {
 //#region 改
 //#region 改
 const handleUpdate = (row) => {
 const handleUpdate = (row) => {
   dialogVisible.value = true
   dialogVisible.value = true
+  isShow.value = false
   formData.value = cloneDeep(row)
   formData.value = cloneDeep(row)
   getTypes()
   getTypes()
 }
 }
@@ -125,6 +129,7 @@ const resetSearch = () => {
 // 新增按钮回调
 // 新增按钮回调
 const handleAdd = () => {
 const handleAdd = () => {
   dialogVisible.value = true
   dialogVisible.value = true
+  resetForm()
   getTypes()
   getTypes()
 }
 }
 
 
@@ -197,6 +202,7 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
     <!-- 新增/修改 -->
     <!-- 新增/修改 -->
     <el-dialog
     <el-dialog
       v-model="dialogVisible"
       v-model="dialogVisible"
+      :close-on-click-modal="false"
       :title="formData.id === undefined ? '创建' : '编辑'"
       :title="formData.id === undefined ? '创建' : '编辑'"
       @closed="resetForm"
       @closed="resetForm"
       width="50%"
       width="50%"
@@ -212,7 +218,11 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
           <el-input v-model="formData.name" placeholder="请输入" />
           <el-input v-model="formData.name" placeholder="请输入" />
         </el-form-item>
         </el-form-item>
         <el-form-item prop="password" label="密码">
         <el-form-item prop="password" label="密码">
-          <el-input v-model="formData.password" placeholder="请输入" type="password" show-password />
+          <el-input v-model="formData.password" :class="!isShow ? 'no_autofill_pwd' : ''" placeholder="请输入" />
+          <div class="pwd_icon" @click="isShow = !isShow">
+            <el-icon v-if="isShow" color="#a8abb2" size="18"><View /></el-icon>
+            <el-icon v-else color="#a8abb2" size="18"><Hide /></el-icon>
+          </div>
         </el-form-item>
         </el-form-item>
         <el-form-item prop="roleId" label="角色">
         <el-form-item prop="roleId" label="角色">
           <el-select v-model="formData.roleId" placeholder="请选择">
           <el-select v-model="formData.roleId" placeholder="请选择">
@@ -244,4 +254,22 @@ watch([() => paginationData.currentPage, () => paginationData.pageSize], getTabl
   display: flex;
   display: flex;
   justify-content: flex-end;
   justify-content: flex-end;
 }
 }
+
+.pwd_icon {
+  position: absolute;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  top: 10px;
+  right: 15px;
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+.no_autofill_pwd {
+  ::v-deep(.el-input__inner) {
+    -webkit-text-security: disc !important;
+  }
+}
 </style>
 </style>

+ 2 - 1
src/views/activity-management/index.vue

@@ -84,6 +84,7 @@ const validatePass = (_rule, value, callback) => {
   if (!reg.test(value)) {
   if (!reg.test(value)) {
     callback(new Error("咨询方式格式有误,请输入手机号"))
     callback(new Error("咨询方式格式有误,请输入手机号"))
   }
   }
+  callback()
 }
 }
 const formRules = {
 const formRules = {
   orgId: [{ required: true, trigger: "blur", message: "必填" }],
   orgId: [{ required: true, trigger: "blur", message: "必填" }],
@@ -95,7 +96,7 @@ const formRules = {
   registrationTime: [{ required: true, trigger: "blur", message: "必填" }],
   registrationTime: [{ required: true, trigger: "blur", message: "必填" }],
   totalNumber: [{ required: true, trigger: "blur", message: "必填" }],
   totalNumber: [{ required: true, trigger: "blur", message: "必填" }],
   scope: [{ required: true, trigger: "blur", message: "必填" }],
   scope: [{ required: true, trigger: "blur", message: "必填" }],
-  phone: [{ validator: validatePass, trigger: "blur" }]
+  phone: [{ required: true, validator: validatePass, trigger: "blur" }]
 }
 }
 const handleCreateOrUpdate = () => {
 const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {

+ 76 - 47
src/views/alumni-organization/index.vue

@@ -19,13 +19,14 @@ import { cloneDeep } from "lodash-es"
 const loading = ref(false)
 const loading = ref(false)
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 const { paginationData, handleCurrentChange, handleSizeChange } = usePagination()
 
 
+const allData = ref([])
+
 //#region 增
 //#region 增
 const DEFAULT_FORM_DATA = {
 const DEFAULT_FORM_DATA = {
   id: undefined,
   id: undefined,
   name: undefined,
   name: undefined,
   categoryId: undefined,
   categoryId: undefined,
   categoryName: undefined,
   categoryName: undefined,
-  number: 6,
   description: undefined,
   description: undefined,
   contact: undefined,
   contact: undefined,
   contacts: undefined,
   contacts: undefined,
@@ -47,35 +48,34 @@ const formData = ref(cloneDeep(DEFAULT_FORM_DATA))
 const formRules = {
 const formRules = {
   name: [{ required: true, trigger: "blur", message: "请输入组织名称" }],
   name: [{ required: true, trigger: "blur", message: "请输入组织名称" }],
   categoryId: [{ required: true, trigger: "blur", message: "请选择组织分类" }],
   categoryId: [{ required: true, trigger: "blur", message: "请选择组织分类" }],
-  number: [{ required: true, trigger: "blur", message: "请设置人数" }],
   admin: [{ required: true, trigger: "blur", message: "请选择管理员" }],
   admin: [{ required: true, trigger: "blur", message: "请选择管理员" }],
-  admins: [{ required: true, trigger: "blur", message: "请选择管理员" }],
-  description: [{ required: true, trigger: "blur", message: "请输入描述" }],
-  contact: [{ required: true, trigger: "blur", message: "请输入联系人" }],
-  phone: [
-    { required: true, trigger: "blur", message: "请输入联系方式" },
-    {
-      pattern: /^(?:\+86)?1[3-9]\d{9}|(?:\+86)?\d{3,4}-?\d{7,8}$/,
-      trigger: "blur",
-      message: "请输入有效的手机号或座机号码"
-    }
-  ],
-  email: [
-    { required: false, trigger: "blur" }, // 不强制要求填写
-    {
-      pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
-      trigger: "blur",
-      message: "请输入有效的邮箱地址"
-    }
-  ],
-  address: [
-    { required: false, trigger: "blur" }, // 不是必填项
-    {
-      pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s,-.]+$/, // 基本地址模式
-      trigger: "blur",
-      message: "请输入有效的地址" // 无效地址时的提示信息
-    }
-  ]
+  admins: [{ required: true, trigger: "blur", message: "请选择管理员" }]
+  // description: [{ required: true, trigger: "blur", message: "请输入描述" }],
+  // contact: [{ required: true, trigger: "blur", message: "请输入联系人" }],
+  // phone: [
+  //   { required: true, trigger: "blur", message: "请输入联系方式" },
+  //   {
+  //     pattern: /^(?:\+86)?1[3-9]\d{9}|(?:\+86)?\d{3,4}-?\d{7,8}$/,
+  //     trigger: "blur",
+  //     message: "请输入有效的手机号或座机号码"
+  //   }
+  // ],
+  // email: [
+  //   { required: false, trigger: "blur" }, // 不强制要求填写
+  //   {
+  //     pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
+  //     trigger: "blur",
+  //     message: "请输入有效的邮箱地址"
+  //   }
+  // ],
+  // address: [
+  //   { required: false, trigger: "blur" }, // 不是必填项
+  //   {
+  //     pattern: /^[\u4e00-\u9fa5a-zA-Z0-9\s,-.]+$/, // 基本地址模式
+  //     trigger: "blur",
+  //     message: "请输入有效的地址" // 无效地址时的提示信息
+  //   }
+  // ]
 }
 }
 /**
 /**
  * 转化数据
  * 转化数据
@@ -96,6 +96,19 @@ const handleCreateOrUpdate = () => {
   formRef.value?.validate((valid, fields) => {
   formRef.value?.validate((valid, fields) => {
     if (!valid) return console.error("表单校验不通过", fields)
     if (!valid) return console.error("表单校验不通过", fields)
     loading.value = true
     loading.value = true
+
+    // 处理参数
+    const newArr = []
+    allData.value.forEach((_v, index_v) => {
+      formData.value.admin.forEach((_i, index_i) => {
+        if (allData.value[index_v].id === formData.value.admin[index_i]) {
+          newArr.push(allData.value[index_v])
+          // console.log(newArr)
+        }
+      })
+    })
+    formData.value.admins = newArr
+
     const api = formData.value.id === undefined ? insertClubDataApi : updateClubDataApi
     const api = formData.value.id === undefined ? insertClubDataApi : updateClubDataApi
     api(formData.value)
     api(formData.value)
       .then(() => {
       .then(() => {
@@ -165,20 +178,27 @@ const handleUpdate = (row) => {
   // 默认勾选
   // 默认勾选
   checkUserList.value = row.admins.map((item) => item.id)
   checkUserList.value = row.admins.map((item) => item.id)
 }
 }
+
 const handleTop = (row) => {
 const handleTop = (row) => {
-  loading.value = true
-  clubTopupApi({
-    id: row.id,
-    isTop: 1
-  })
-    .then(() => {
-      ElMessage.success("置顶成功")
-      getTableData()
-    })
-    .catch(() => ({}))
-    .finally(() => {
-      loading.value = false
+  ElMessageBox.confirm("确认置顶?", "提示", {
+    confirmButtonText: "确定",
+    cancelButtonText: "取消",
+    type: "warning"
+  }).then(() => {
+    loading.value = true
+    clubTopupApi({
+      id: row.id,
+      isTop: 1
     })
     })
+      .then(() => {
+        ElMessage.success("置顶成功")
+        getTableData()
+      })
+      .catch(() => ({}))
+      .finally(() => {
+        loading.value = false
+      })
+  })
 }
 }
 //#endregion
 //#endregion
 
 
@@ -320,6 +340,17 @@ const handleNodeClick = (e) => {
         cardNumber: item.cardNumber
         cardNumber: item.cardNumber
       }))
       }))
       userData.value = transformData(data.list)
       userData.value = transformData(data.list)
+
+      // 数组去重
+      if (allData.value.length) {
+        const flag = allData.value.some((item) => item.id == formData.value.admins[0].id)
+
+        if (!flag) {
+          allData.value.push(formData.value.admins[0])
+        }
+      } else {
+        allData.value.push(formData.value.admins[0])
+      }
     })
     })
     .catch(() => {
     .catch(() => {
       userData.value = []
       userData.value = []
@@ -386,17 +417,18 @@ onBeforeMount(() => {
           <el-table-column prop="name" label="组织名称" align="center" />
           <el-table-column prop="name" label="组织名称" align="center" />
           <el-table-column prop="categoryName" label="所属分类" align="center" />
           <el-table-column prop="categoryName" label="所属分类" align="center" />
           <el-table-column prop="number" label="人数" align="center" />
           <el-table-column prop="number" label="人数" align="center" />
-          <el-table-column prop="admins" label="管理员" align="center">
+          <el-table-column label="管理员" align="center">
             <template v-slot="scope">
             <template v-slot="scope">
-              <el-text v-for="admin in scope.row.admins" :key="admin.id" type="primary">{{ admin.name }}</el-text>
+              <el-text v-for="item in scope.row.admins" :key="item.id" type="primary">{{ item.name }}&nbsp;</el-text>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <el-table-column prop="createUserName" label="创建人" align="center" />
           <el-table-column prop="createUserName" label="创建人" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
           <el-table-column prop="createTime" label="创建时间" align="center" />
           <el-table-column fixed="right" label="操作" width="200" align="center">
           <el-table-column fixed="right" label="操作" width="200" align="center">
             <template #default="scope">
             <template #default="scope">
+              <el-link v-if="scope.row.isTop == 2" type="warning" @click="handleTop(scope.row)">置顶组织</el-link>
+              <el-link v-else type="warning">已置顶</el-link>
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
               <el-link type="primary" @click="handleUpdate(scope.row)">编辑</el-link>
-              <el-link type="warning" @click="handleTop(scope.row)">置顶组织</el-link>
               <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
               <el-link type="danger" @click="handleDelete(scope.row)">删除</el-link>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
@@ -447,9 +479,6 @@ onBeforeMount(() => {
             </el-select>
             </el-select>
           </div>
           </div>
         </el-form-item>
         </el-form-item>
-        <el-form-item prop="number" label="人数">
-          <el-input-number v-model="formData.number" type="number" :min="1" :max="1000" />
-        </el-form-item>
         <el-form-item prop="description" label="本会简介">
         <el-form-item prop="description" label="本会简介">
           <el-input v-model="formData.description" type="textarea" :rows="5" placeholder="请输入简介" />
           <el-input v-model="formData.description" type="textarea" :rows="5" placeholder="请输入简介" />
         </el-form-item>
         </el-form-item>

+ 58 - 7
src/views/login/index.vue

@@ -1,5 +1,5 @@
 <script setup>
 <script setup>
-import { reactive, ref, onMounted, onBeforeUnmount } from "vue"
+import { ref, onMounted, onBeforeUnmount } from "vue"
 import { useRouter } from "vue-router"
 import { useRouter } from "vue-router"
 import { useUserStore } from "@/store/modules/user"
 import { useUserStore } from "@/store/modules/user"
 import Logo from "@/assets/login/logo.svg?component"
 import Logo from "@/assets/login/logo.svg?component"
@@ -10,13 +10,15 @@ import Name from "@/assets/login/name.svg?component"
 
 
 const router = useRouter()
 const router = useRouter()
 
 
+const isShow = ref(false)
+
 /** 登录表单元素的引用 */
 /** 登录表单元素的引用 */
 const loginFormRef = ref(null)
 const loginFormRef = ref(null)
 
 
 /** 登录按钮 Loading */
 /** 登录按钮 Loading */
 const loading = ref(false)
 const loading = ref(false)
 /** 登录表单数据 */
 /** 登录表单数据 */
-const loginFormData = reactive({
+const loginFormData = ref({
   account: "",
   account: "",
   password: ""
   password: ""
 })
 })
@@ -36,13 +38,20 @@ const handleLogin = () => {
     if (valid) {
     if (valid) {
       loading.value = true
       loading.value = true
       useUserStore()
       useUserStore()
-        .login(loginFormData)
+        .login(loginFormData.value)
         .then(() => {
         .then(() => {
+          if (rememberPassword.value) {
+            localStorage.setItem("rememberPassword", true)
+            localStorage.setItem("loginFormData", JSON.stringify(loginFormData.value))
+          } else {
+            localStorage.removeItem("rememberPassword")
+            localStorage.removeItem("loginFormData")
+          }
           router.push({ path: "/" })
           router.push({ path: "/" })
         })
         })
         .catch(() => {
         .catch(() => {
           createCode()
           createCode()
-          loginFormData.password = ""
+          loginFormData.value.password = ""
         })
         })
         .finally(() => {
         .finally(() => {
           loading.value = false
           loading.value = false
@@ -67,6 +76,10 @@ const preventTextSelection = (e) => {
 }
 }
 
 
 onMounted(() => {
 onMounted(() => {
+  rememberPassword.value = localStorage.getItem("rememberPassword") ? true : false
+
+  loginFormData.value = localStorage.getItem("loginFormData") ? JSON.parse(localStorage.getItem("loginFormData")) : {}
+
   document.addEventListener("contextmenu", preventDefaultActions)
   document.addEventListener("contextmenu", preventDefaultActions)
   document.addEventListener("keydown", (e) => {
   document.addEventListener("keydown", (e) => {
     if (e.ctrlKey && (e.key === "A" || e.key === "a")) {
     if (e.ctrlKey && (e.key === "A" || e.key === "a")) {
@@ -109,17 +122,29 @@ onBeforeUnmount(() => {
       <div class="content">
       <div class="content">
         <el-form ref="loginFormRef" :model="loginFormData" :rules="loginFormRules" @keyup.enter="handleLogin">
         <el-form ref="loginFormRef" :model="loginFormData" :rules="loginFormRules" @keyup.enter="handleLogin">
           <el-form-item prop="account">
           <el-form-item prop="account">
-            <el-input v-model.trim="loginFormData.account" placeholder="用户名" type="text" tabindex="1" size="large" />
+            <el-input
+              v-model.trim="loginFormData.account"
+              placeholder="用户名"
+              type="text"
+              tabindex="1"
+              size="large"
+              clearable
+            />
           </el-form-item>
           </el-form-item>
           <el-form-item prop="password">
           <el-form-item prop="password">
             <el-input
             <el-input
               v-model.trim="loginFormData.password"
               v-model.trim="loginFormData.password"
               placeholder="密码"
               placeholder="密码"
-              type="password"
+              type="text"
               tabindex="2"
               tabindex="2"
               size="large"
               size="large"
-              show-password
+              clearable
+              :class="!isShow ? 'no_autofill_pwd' : ''"
             />
             />
+            <div class="pwd_icon" @click="isShow = !isShow">
+              <el-icon v-if="isShow" color="#a8abb2" size="22"><View /></el-icon>
+              <el-icon v-else color="#a8abb2" size="22"><Hide /></el-icon>
+            </div>
           </el-form-item>
           </el-form-item>
           <el-checkbox v-model="rememberPassword" label="记住密码" />
           <el-checkbox v-model="rememberPassword" label="记住密码" />
           <el-button :loading="loading" type="primary" size="large" @click.prevent="handleLogin">登 录</el-button>
           <el-button :loading="loading" type="primary" size="large" @click.prevent="handleLogin">登 录</el-button>
@@ -216,6 +241,32 @@ onBeforeUnmount(() => {
   }
   }
 }
 }
 
 
+.no_autofill_pwd {
+  ::v-deep(.el-input__inner) {
+    -webkit-text-security: disc !important;
+  }
+}
+
+.pwd_icon {
+  position: absolute;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  top: 12px;
+  right: 5px;
+  width: 40px;
+  height: 40px;
+  cursor: pointer;
+}
+
+::v-deep(.el-input__wrapper) {
+  padding-right: 50px;
+}
+
+::v-deep(.el-input__suffix .el-input__clear) {
+  font-size: 24px;
+}
+
 // 媒体查询 1680px
 // 媒体查询 1680px
 @media screen and (max-width: 1680px) {
 @media screen and (max-width: 1680px) {
   .login-container {
   .login-container {

+ 2 - 1
src/views/school-endorsement/index.vue

@@ -68,10 +68,11 @@ const validatePass = (_rule, value, callback) => {
   if (!reg.test(value)) {
   if (!reg.test(value)) {
     callback(new Error("姓名格式有误"))
     callback(new Error("姓名格式有误"))
   }
   }
+  callback()
 }
 }
 const formRules = {
 const formRules = {
   cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
   cardNumber: [{ required: true, trigger: "blur", message: "微校卡号必填" }],
-  name: [{ validator: validatePass, trigger: "blur" }],
+  name: [{ required: true, validator: validatePass, trigger: "blur" }],
   image: [{ required: true, trigger: "blur", message: "照片必填" }],
   image: [{ required: true, trigger: "blur", message: "照片必填" }],
   descript: [{ required: true, trigger: "blur", message: "个人简介必填" }]
   descript: [{ required: true, trigger: "blur", message: "个人简介必填" }]
 }
 }