Selaa lähdekoodia

完成成绩管理页面

hzj18279462576@163.com 2 vuotta sitten
vanhempi
commit
e1c0afb2d0

+ 1 - 1
index.html

@@ -8,7 +8,7 @@
       href="./src/assets/items/favicon.ico"
     />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>靖安乡村民宿民宿端</title>
+    <title>智慧校园</title>
   </head>
 
   <body>

+ 13 - 0
package-lock.json

@@ -441,6 +441,11 @@
         "vue-demi": "*"
       }
     },
+    "@xmldom/xmldom": {
+      "version": "0.8.10",
+      "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+      "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw=="
+    },
     "acorn": {
       "version": "8.8.2",
       "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz",
@@ -701,6 +706,14 @@
         "vary": "^1"
       }
     },
+    "cos-js-sdk-v5": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmmirror.com/cos-js-sdk-v5/-/cos-js-sdk-v5-1.5.0.tgz",
+      "integrity": "sha512-1Y3VFFIaPnnCcxJRoWRrCCxmhihihMjDh+2F61iUdT6fOGtVq8hYPQF6uBnKNwB/aF41wCeBgvibGy0wimXDlA==",
+      "requires": {
+        "@xmldom/xmldom": "^0.8.6"
+      }
+    },
     "css-select": {
       "version": "4.3.0",
       "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
     "@element-plus/icons-vue": "^2.0.10",
     "@liveqing/liveplayer-v3": "^3.7.10",
     "axios": "^1.3.2",
+    "cos-js-sdk-v5": "^1.5.0",
     "dayjs": "^1.11.8",
     "echarts": "^5.4.3",
     "element-plus": "^2.2.29",

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
src/assets/icons/evaluate_s.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
src/assets/icons/grade.svg


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 0
src/assets/icons/grade_s.svg


BIN
src/assets/school_logo.jpg


+ 1 - 1
src/layout/sidebar/Navbar.vue

@@ -25,7 +25,7 @@
 
     <div class="logo">
       <!-- <img src="@/assets/nanchang.png" style="width: 30px; height: 30px" /> -->
-      <span>智慧校园管理平台</span>
+      <span>万载县第三中学</span>
     </div>
     <div class="login">
       <span class="dateTime">{{ dateTime }}</span>

+ 33 - 0
src/layout/sidebar/SidevarItem.vue

@@ -108,6 +108,39 @@
           <svg-icon v-else iconName="caller" class="iconClass"></svg-icon>
           <span>{{ item.meta.title }}</span>
         </el-menu-item>
+        <!-- 成绩管理 -->
+        <el-menu-item
+          :index="`/wanzai/${item.name}`"
+          v-if="item.name == 'grade'"
+        >
+          <svg-icon
+            v-if="activeIndex == '/wanzai/grade'"
+            iconName="grade_s"
+            class="iconClass"
+          ></svg-icon>
+          <svg-icon v-else iconName="grade" class="iconClass"></svg-icon>
+          <span>{{ item.meta.title }}</span>
+        </el-menu-item>
+        <!-- 综合素质评价 -->
+        <el-sub-menu :index="item.name" v-if="item.name == 'evaluate'">
+          <template #title>
+            <svg-icon
+              v-if="
+                activeIndex == '/wanzai/teacher' ||
+                activeIndex == '/wanzai/student'
+              "
+              iconName="evaluate_s"
+              class="iconClass"
+            ></svg-icon>
+            <svg-icon v-else iconName="evaluate" class="iconClass"></svg-icon>
+            <span>{{ item.meta.title }}</span>
+          </template>
+          <el-menu-item v-for="i in item.children" :index="`/wanzai/${i.name}`">
+            <template #title>
+              <span>{{ i.meta.title }}</span>
+            </template>
+          </el-menu-item>
+        </el-sub-menu>
         <!-- 数据交换 -->
         <el-sub-menu :index="item.name" v-if="item.name == 'dataExchange'">
           <template #title>

+ 19 - 1
src/router/index.js

@@ -63,6 +63,24 @@ const routes = [
         component: () => import("@/views/caller/caller.vue"),
       },
       {
+        path: "grade",
+        name: "grade",
+        meta: { isAuth: true, title: "成绩管理" },
+        component: () => import("@/views/grade/grade.vue"),
+      },
+      {
+        path: "teacher",
+        name: "teacher",
+        meta: { isAuth: true, title: "教师" },
+        component: () => import("@/views/teacher/teacher.vue"),
+      },
+      {
+        path: "student",
+        name: "student",
+        meta: { isAuth: true, title: "学生" },
+        component: () => import("@/views/student/student.vue"),
+      },
+      {
         path: "info",
         name: "info",
         meta: { isAuth: true, title: "基本信息" },
@@ -103,7 +121,7 @@ const routes = [
 ];
 const router = createRouter({
   // history: createWebHashHistory("/business"), // 线上地址
-  history: createWebHashHistory("/business"), // 测试环境发布地址
+  history: createWebHashHistory("/smartManage"), // 测试环境发布地址
   // history: createWebHashHistory("/hotelReservation/pc3/"), // 测试环境发布地址
   routes: routes,
 });

+ 93 - 66
src/store/modules/user.js

@@ -9,8 +9,8 @@ const state = {
   activeIndex: 1,
   username: "",
   password: "",
-  // api: "/carstop/carbook", // 线上
-  api: "/hotelReservation", // 测试
+  // api: "/carstop/carbook", //
+  api: "/smartApi/wanzai/api", // 线上
   islogin: 1,
   hasRoutes: false,
   level: 1,
@@ -47,6 +47,27 @@ const state = {
       name: "caller",
       meta: { isAuth: true, title: "访客预约" },
     },
+
+    // 成绩管理
+    {
+      name: "grade",
+      meta: { isAuth: true, title: "成绩管理" },
+    },
+    // 综合素质评价
+    {
+      name: "evaluate",
+      meta: { isAuth: true, title: "综合素质评价" },
+      children: [
+        {
+          name: "teacher",
+          meta: { isAuth: true, title: "教师" },
+        },
+        {
+          name: "student",
+          meta: { isAuth: true, title: "学生" },
+        },
+      ],
+    },
     // 数据交换
     {
       name: "dataExchange",
@@ -69,7 +90,7 @@ const state = {
     // 系统设置
     {
       name: "system",
-      meta: { isAuth: true, title: "系统通知" },
+      meta: { isAuth: true, title: "系统设置" },
       children: [
         {
           name: "info",
@@ -93,95 +114,101 @@ const state = {
     meta: { isAuth: true, title: "公寓", icons: "" },
     children: [
       {
-        path: "roomStatus",
-        name: "roomStatus",
-        meta: { isAuth: true, title: "房态管理" },
-        component: () => import("@/views/roomStatus/roomStatus.vue"),
+        path: "home",
+        name: "home",
+        meta: { isAuth: true, title: "系统首页" },
+        component: () => import("@/views/home/home.vue"),
       },
       {
-        path: "roomType",
-        name: "roomType",
-        meta: { isAuth: true, title: "房型管理", sign: "roomTypes" },
-        component: () => import("@/views/roomType/roomType.vue"),
+        path: "user",
+        name: "user",
+        meta: { isAuth: true, title: "用户管理" },
+        component: () => import("@/views/user/user.vue"),
       },
       {
-        path: "roomPrice",
-        name: "roomPrice",
-        meta: { isAuth: true, title: "房价管理", sign: "roomTypes" },
-        component: () => import("@/views/roomPrice/roomPrice.vue"),
+        path: "identity",
+        name: "identity",
+        meta: { isAuth: true, title: "身份管理" },
+        component: () => import("@/views/identity/identity.vue"),
       },
       {
-        path: "order",
-        name: "order",
-        meta: { isAuth: true, title: "订单管理" },
-        component: () => import("@/views/order/order.vue"),
+        path: "apply",
+        name: "apply",
+        meta: { isAuth: true, title: "应用管理" },
+        component: () => import("@/views/apply/apply.vue"),
       },
       {
-        path: "class",
-        name: "class",
-        meta: { isAuth: true, title: "课表管理", sign: "classs" },
-        component: () => import("@/views/class/class.vue"),
+        path: "energy",
+        name: "energy",
+        meta: { isAuth: true, title: "能耗管理" },
+        component: () => import("@/views/energy/energy.vue"),
       },
       {
-        path: "process",
-        name: "process",
-        meta: { isAuth: true, title: "流程管理", sign: "classs" },
-        component: () => import("@/views/process/process.vue"),
+        path: "safety",
+        name: "safety",
+        meta: { isAuth: true, title: "校园安全" },
+        component: () => import("@/views/safety/safety.vue"),
       },
       {
-        path: "statement",
-        name: "statement",
-        meta: { isAuth: true, title: "统计报表" },
-        component: () => import("@/views/statement/statement.vue"),
+        path: "caller",
+        name: "caller",
+        meta: { isAuth: true, title: "访客预约" },
+        component: () => import("@/views/caller/caller.vue"),
       },
       {
-        path: "user",
-        name: "user",
-        meta: { isAuth: true, title: "用户管理", sign: "users" },
-        component: () => import("@/views/user/user.vue"),
+        path: "grade",
+        name: "grade",
+        meta: { isAuth: true, title: "成绩管理" },
+        component: () => import("@/views/grade/grade.vue"),
+      },
+      {
+        path: "teacher",
+        name: "teacher",
+        meta: { isAuth: true, title: "教师" },
+        component: () => import("@/views/teacher/teacher.vue"),
+      },
+      {
+        path: "student",
+        name: "student",
+        meta: { isAuth: true, title: "学生" },
+        component: () => import("@/views/student/student.vue"),
+      },
+      {
+        path: "info",
+        name: "info",
+        meta: { isAuth: true, title: "基本信息" },
+        component: () => import("@/views/info/info.vue"),
+      },
+      {
+        path: "screenShot",
+        name: "screenShot",
+        meta: { isAuth: true, title: "截屏风险" },
+        component: () => import("@/views/screenShot/screenShot.vue"),
       },
       {
         path: "roles",
         name: "roles",
-        meta: { isAuth: true, title: "角色管理", sign: "users" },
+        meta: { isAuth: true, title: "权限管理" },
         component: () => import("@/views/roles/roles.vue"),
       },
       {
-        path: "doorLock",
-        name: "doorLock",
-        meta: { isAuth: true, title: "门锁管理", sign: "doorLocks" },
-        component: () => import("@/views/doorLock/doorLock.vue"),
-      },
-      {
-        path: "meter",
-        name: "meter",
-        meta: { isAuth: true, title: "水电表管理", sign: "doorLocks" },
-        component: () => import("@/views/meter/meter.vue"),
+        path: "source",
+        name: "source",
+        meta: { isAuth: true, title: "我的数据源" },
+        component: () => import("@/views/source/source.vue"),
       },
       {
-        path: "account",
-        name: "account",
-        meta: { isAuth: true, title: "账号管理" },
-        component: () => import("@/views/account/account.vue"),
+        path: "task",
+        name: "task",
+        meta: { isAuth: true, title: "任务管理" },
+        component: () => import("@/views/task/task.vue"),
       },
       {
-        path: "system",
-        name: "system",
-        meta: { isAuth: true, title: "系统设置" },
-        component: () => import("@/views/system/system.vue"),
+        path: "log",
+        name: "log",
+        meta: { isAuth: true, title: "业务日志" },
+        component: () => import("@/views/log/log.vue"),
       },
-      // {
-      //   path: "icCard",
-      //   name: "icCard",
-      //   meta: { isAuth: true, title: "IC卡管理" },
-      //   component: () => import("@/views/icCard/icCard.vue"),
-      // },
-      // {
-      //   path: "fingerprint",
-      //   name: "fingerprint",
-      //   meta: { isAuth: true, title: "指纹管理" },
-      //   component: () => import("@/views/fingerprint/fingerprint.vue"),
-      // },
     ],
   },
 };

+ 292 - 124
src/views/apply/apply.vue

@@ -37,10 +37,11 @@
             label="序号"
           />
           <el-table-column align="center" prop="name" label="名称" />
-          <el-table-column align="center" prop="type" label="类别" />
+          <el-table-column align="center" prop="category" label="类别" />
           <el-table-column align="center" label="操作" width="200">
             <template #default="scope">
               <div class="edit">
+                <div class="look" @click="applyClick(scope.row)">打开项目</div>
                 <div class="look" @click="editClick(scope.row)">编辑</div>
                 <el-popconfirm
                   width="220"
@@ -111,10 +112,14 @@
               placeholder="请选择类别"
               style="width: 500px"
             >
-              <el-option label="小程序" value="1" />
-              <el-option label="管理端" value="2" />
+              <el-option label="小程序" value="小程序" />
+              <el-option label="管理后台" value="管理后台" />
             </el-select>
           </el-form-item>
+          <el-form-item label="logo图标 :" prop="logoUrl">
+            <input type="file" @change="handleFileUpload" />
+            <img :src="imgUrl" alt="" style="width: 20px; height: 20px" />
+          </el-form-item>
           <el-form-item label="应用链接 :" prop="applyLink">
             <el-input
               v-model="editRuleForm.applyLink"
@@ -137,6 +142,28 @@
           </el-form-item>
         </el-form>
       </el-dialog>
+
+      <el-dialog
+        class="applyDialog"
+        v-model="applyVisible"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+        :title="applyTitle"
+        align-center
+        width="1800"
+        :before-close="cancelApply"
+      >
+        <div style="width: 100%; height: 800px">
+          <iframe
+            :src="iframeSrc"
+            width="100%"
+            height="100%"
+            frameborder="0"
+            scrolling="no"
+          >
+          </iframe>
+        </div>
+      </el-dialog>
     </div>
   </div>
 </template>
@@ -161,6 +188,7 @@ import { useStore } from "vuex";
 const store = useStore();
 const api = ref("");
 const router = useRouter();
+import COS from "cos-js-sdk-v5";
 // 表格数据
 const loading = ref(false);
 const tableData = reactive({
@@ -198,10 +226,16 @@ const editVisible = ref(false);
 const editRef = ref();
 const editRuleForm = reactive({
   name: "", // 名称
-  applyLink: "", // 类别
-  type: "", // 应用链接
+  applyLink: "", // 应用链接
+  type: "", // 类别
   id: "",
 });
+const imgUrl = ref();
+
+// 打开项目弹窗
+const applyVisible = ref(false);
+const applyTitle = ref();
+const iframeSrc = ref();
 
 // 表单验证
 const editRules = reactive({
@@ -222,43 +256,43 @@ const editRules = reactive({
   ],
 });
 
-// 查看房型列表
+// 应用管理分页数据
 const getList = async () => {
-  // loading.value = true;
-  // let data = {
-  //   page: currentPage.value,
-  //   rows: pageSize.value,
-  //   managerId: sessionStorage.getItem("token"),
-  // };
-  // let res = await axios({
-  //   method: "post",
-  //   url: api.value + "/mhotel/housequeryPage.action",
-  //   headers: {
-  //     // token: sessionStorage.getItem("token"),
-  //     // user_head: sessionStorage.getItem("userhead"),
-  //   },
-  //   params: data,
-  // });
-  // console.log(res, "房型管理");
-  // if (res.data.code == 200) {
-  //   loading.value = false;
-  //   tableData.list = res.data.data.pageList;
-  //   total.value = res.data.data.total;
-  //   // ElMessage({
-  //   //   type: "success",
-  //   //   showClose: true,
-  //   //   message: res.data.message,
-  //   //   center: true,
-  //   // });
-  // } else {
-  //   loading.value = false;
-  //   ElMessage({
-  //     type: "error",
-  //     showClose: true,
-  //     message: res.data.message,
-  //     center: true,
-  //   });
-  // }
+  loading.value = true;
+  let data = {
+    currentPage: currentPage.value,
+    pageCount: pageSize.value,
+    // managerId: sessionStorage.getItem("token"),
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/smartApply/queryPageSmartApply",
+    headers: {
+      // token: sessionStorage.getItem("token"),
+      // user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "应用管理分页数据");
+  if (res.data.code == 200) {
+    loading.value = false;
+    tableData.list = res.data.data.list;
+    total.value = res.data.data.total;
+    // ElMessage({
+    //   type: "success",
+    //   showClose: true,
+    //   message: res.data.message,
+    //   center: true,
+    // });
+  } else {
+    loading.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 };
 
 // 搜索功能
@@ -269,6 +303,10 @@ const searchBtn = lodash.debounce(async () => {
 const addApply = async () => {
   titleDialog.value = "新建应用";
   editVisible.value = true;
+  editRef.value.resetFields();
+  editRuleForm.name = "";
+  editRuleForm.applyLink = "";
+  editRuleForm.type = "";
   //   let data = {
   //     linkId: row.id,
   //   };
@@ -317,6 +355,10 @@ const confirmEdit = (formEl) => {
 const editClick = async (row) => {
   titleDialog.value = "编辑应用";
   editVisible.value = true;
+  editRuleForm.name = row.name;
+  editRuleForm.type = row.category;
+  editRuleForm.applyLink = row.urlLink;
+  editRuleForm.id = row.id;
   //   let data = {
   //     linkId: row.id,
   //   };
@@ -357,6 +399,201 @@ const cancelEdit = () => {
   editVisible.value = false;
   editRef.value.resetFields();
 };
+const handleFileUpload = (event) => {
+  const cos = new COS({
+    SecretId: "AKIDCPVZdcWIxgHpy5FYxVyPiqkZGrhdXUBg",
+    SecretKey: "NkyCN3cz97qKaeXLvHOGxOcdS8f184pL",
+    SecurityToken: "1306339220",
+    Bucket: "wanzai-1306339220",
+    Region: "ap-shanghai",
+  });
+
+  const file = event.target.files[0];
+  console.log(event.target.files);
+
+  const key = event.target.files[0].name; // 设置上传到 COS 后的文件名
+
+  cos.putObject(
+    {
+      Bucket: "wanzai-1306339220",
+      Region: "ap-shanghai",
+      Key: key,
+      Body: file,
+      onProgress: function (progressData) {
+        console.log(JSON.stringify(progressData));
+      },
+    },
+    function (err, data) {
+      if (err) {
+        console.error(err);
+      } else {
+        console.log(data);
+        imgUrl.value = "https://" + data.Location;
+        // 成功
+      }
+    }
+  );
+};
+
+// 计算签名
+const getAuthorization = (opt, callback) => {
+  // 替换为自己服务端地址 获取put上传签名
+  const url = `http://127.0.0.1:3000/put-sign?ext=${opt.ext}`;
+  const xhr = new XMLHttpRequest();
+  xhr.open("GET", url, true);
+  xhr.onload = function (e) {
+    let credentials;
+    try {
+      const result = JSON.parse(e.target.responseText);
+      credentials = result;
+    } catch (e) {
+      callback("获取签名出错");
+    }
+    if (credentials) {
+      callback(null, {
+        securityToken: credentials.sessionToken,
+        authorization: credentials.authorization,
+        cosKey: credentials.cosKey,
+        cosHost: credentials.cosHost,
+      });
+    } else {
+      console.error(xhr.responseText);
+      callback("获取签名出错");
+    }
+  };
+  xhr.onerror = function (e) {
+    callback("获取签名出错");
+  };
+  xhr.send();
+};
+const uploadFile = (file, callback) => {
+  const fileName = file.name;
+  let ext = "";
+  const lastDotIndex = fileName.lastIndexOf(".");
+  if (lastDotIndex > -1) {
+    // 这里获取文件后缀 由服务端生成最终上传的路径
+    ext = fileName.substring(lastDotIndex + 1);
+  }
+  getAuthorization({ ext }, function (err, info) {
+    if (err) {
+      alert(err);
+      return;
+    }
+    const auth = info.authorization;
+    const securityToken = info.securityToken;
+    const Key = info.cosKey;
+    const protocol = location.protocol === "https:" ? "https:" : "http:";
+    const prefix = protocol + "//" + info.cosHost;
+    const url = prefix + "/" + camSafeUrlEncode(Key).replace(/%2F/g, "/");
+    const xhr = new XMLHttpRequest();
+    xhr.open("PUT", url, true);
+    xhr.setRequestHeader("Authorization", auth);
+    securityToken &&
+      xhr.setRequestHeader("x-cos-security-token", securityToken);
+    xhr.upload.onprogress = function (e) {
+      console.log(
+        "上传进度 " + Math.round((e.loaded / e.total) * 10000) / 100 + "%"
+      );
+    };
+    xhr.onload = function () {
+      if (/^2\d\d$/.test("" + xhr.status)) {
+        const ETag = xhr.getResponseHeader("etag");
+        callback(null, { url: url, ETag: ETag });
+      } else {
+        callback("文件 " + Key + " 上传失败,状态码:" + xhr.status);
+      }
+    };
+    xhr.onerror = function () {
+      callback("文件 " + Key + " 上传失败,请检查是否没配置 CORS 跨域规则");
+    };
+    xhr.send(file);
+  });
+};
+// 监听表单提交
+// document.getElementById('submitBtn').onclick = function (e) {
+//         const file = document.getElementById('fileSelector').files[0];
+//         if (!file) {
+//           document.getElementById('msg').innerText = '未选择上传文件';
+//           return;
+//         }
+//         file &&
+//           uploadFile(file, function (err, data) {
+//             console.log(err || data);
+//             document.getElementById('msg').innerText = err
+//               ? err
+//               : '上传成功,ETag=' + data.ETag;
+//           });
+//       };
+//     })();
+
+// const beforePicUpload = async () => {
+//   await getSign();
+// };
+// const getSign = async () => {
+//   //让这个请求变成同步请求
+//   let data = { suffix: ".png" };
+//   let res = await axios({
+//     method: "get",
+//     url: api.value + "/upload/ossSign",
+//     headers: {},
+//     params: data,
+//   });
+//   console.log(res, "编辑中查找图片");
+//   // await this.$http.get("/common/oss/sign").then(response => {
+//   //   //接收预签名url链接
+//   //   console.log(response.data.data);// response.data
+//   // });
+//   uploadUrl.value = response.data.data;
+// };
+// const uploadImage = (file) => {
+//   // 这里的`file`参数是要上传的文件对象
+//   // 在这里根据需要添加一些逻辑,如显示进度条
+//   console.log(file, "upload");
+
+//   return new Promise((resolve, reject) => {
+//     const xhr = new XMLHttpRequest();
+//     //element-ui默认使用post提交,但是我们生成的url需要使用 put 提交
+//     //需要指定 put 直传,以及this.uploadUrl(后端返回的url)
+//     xhr.open("PUT", uploadUrl.value, true);
+//     //设置上传文件的类型
+//     xhr.setRequestHeader("Content-Type", file.file.type); // 或者 file.type
+//     xhr.onreadystatechange = () => {
+//       if (xhr.readyState === 4) {
+//         if (xhr.status === 200) {
+//           resolve(xhr.response);
+//           //进入到这里就表明上传成功了
+//           //我这里对后端返回的url进行截取方便存入数据库,因为前端还需要展示图片
+//           let indexOf = this.uploadUrl.indexOf("?");
+//           this.addForm.pic = this.uploadUrl.slice(0, indexOf);
+//         } else {
+//           reject(xhr.statusText);
+//         }
+//       }
+//     };
+//     xhr.onerror = () => {
+//       reject(xhr.statusText);
+//     };
+//     //发送
+//     xhr.send(file.file); //或者 file
+//   });
+// };
+// // 文件上传成功时的钩子
+// const handleAvatarSuccess = (response, uploadFile) => {
+//   console.log(uploadFile.raw, "上传成功");
+// };
+// // 上传文件之前的钩子,参数为上传的文件
+// const beforeAvatarUpload = (rawFile) => {
+//   if (rawFile.type !== "image/jpeg" && rawFile.type !== "image/png") {
+//     ElMessage.error("图片格式必须为JPG/PNG格式!");
+//     return false;
+//   } else if (rawFile.size / 1024 / 1024 > 10) {
+//     ElMessage.error("图片的大小不能超过10MB!");
+//     return false;
+//   }
+//   return true;
+// };
+
+// (-------------------------------------------------------------)
 
 //删除按钮
 const del = async (row) => {
@@ -394,6 +631,18 @@ const del = async (row) => {
   // console.log(res);
 };
 
+// 打开别的项目
+const applyClick = (row) => {
+  applyVisible.value = true;
+  applyTitle.value = "嵌套项目";
+  applyTitle.value = row.name;
+  iframeSrc.value = row.urlLink;
+  console.log(row.urlLink);
+};
+const cancelApply = () => {
+  applyVisible.value = false;
+};
+
 // 多选框功能
 const handleSelectionChange = (val) => {
   console.log(val);
@@ -419,9 +668,6 @@ onBeforeMount(async () => {
   api.value = store.state.user.api;
   getList();
 });
-onUnmounted(() => {
-  // document.removeEventListener("keyup", Enters);
-});
 </script>
 
 <style scoped lang="scss">
@@ -638,46 +884,7 @@ onUnmounted(() => {
     }
   }
 
-  // 指纹弹窗
-  :deep(.fingerprint) {
-    width: 611px;
-    height: 486px;
-    border-radius: 11px;
-    .el-dialog__header {
-      border-radius: 11px 11px 0 0;
-      background: rgba(237, 241, 245, 1);
-      font-weight: 600;
-      margin: 0;
-
-      .el-dialog__headerbtn {
-        outline: none;
-      }
-    }
-    .el-dialog__body {
-      padding: 0;
-      .elbody {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        padding: 20px 20px;
-        font-size: 18px;
-        color: #000;
-        border-bottom: 0.5px solid #ccc;
-
-        i {
-          cursor: pointer;
-        }
-      }
-    }
-    .el-dialog__footer {
-      .el-button--primary {
-        background: rgba(41, 109, 227, 1);
-      }
-    }
-  }
-
-  // 身份证读取
-  :deep(.addIdentityCard) {
+  :deep(.applyDialog) {
     //   height: 420px;
     border-radius: 11px;
     .el-dialog__header {
@@ -690,46 +897,7 @@ onUnmounted(() => {
       }
     }
     .el-dialog__body {
-      padding: 30px 20px 10px 20px;
-      height: 330px;
-      font-size: 16px;
-      font-weight: 600;
-      color: #000;
-      .el-steps {
-        width: 600px;
-        transform: translateX(90px);
-        margin: 0 0 40px 0;
-      }
-      .title {
-        text-align: center;
-      }
-      .icons {
-        display: flex;
-        justify-content: center;
-        img {
-          width: 70px;
-          margin: 40px 0;
-        }
-        .loading {
-          animation: move 3s linear;
-        }
-        @keyframes move {
-          0% {
-            transform: rotate(0);
-          }
-          100% {
-            transform: rotate(360deg);
-          }
-        }
-      }
-      .retry {
-        text-align: center;
-        span {
-          color: red;
-          padding: 0 8px;
-          cursor: pointer;
-        }
-      }
+      padding: 10px;
     }
   }
 

+ 49 - 48
src/views/caller/caller.vue

@@ -26,13 +26,15 @@
           >
           <div class="condition">
             <span>状态&nbsp;&nbsp;</span>
-            <el-select v-model="value" class="m-2" placeholder="请选择状态">
-              <el-option
-                v-for="item in options"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              />
+            <el-select
+              v-model="searchInput.type"
+              class="m-2"
+              placeholder="请选择状态"
+            >
+              <el-option label="全部" value="0" />
+              <el-option label="待审核" value="1" />
+              <el-option label="已拒绝" value="2" />
+              <el-option label="已推送" value="3" />
             </el-select>
           </div>
           <div class="condition">
@@ -327,11 +329,12 @@ const tableData = reactive({
 
 const searchInput = reactive({
   keyWord: "",
+  type: "",
   createTime: "",
 }); // 搜索按钮数据
 
 const currentPage = ref(1); // 当前页
-const pageSize = ref(10);
+const pageCount = ref(10);
 const total = ref(4); // 当前总数
 
 // 编辑功能
@@ -396,41 +399,42 @@ const selDelVisible = ref(false);
 // 查看房型列表
 const getList = async () => {
   // loading.value = true;
-  // let data = {
-  //   page: currentPage.value,
-  //   rows: pageSize.value,
-  //   hName: searchInput.keyWord, // 房型名称
-  //   managerId: sessionStorage.getItem("token"),
-  // };
-  // let res = await axios({
-  //   method: "post",
-  //   url: api.value + "/mhotel/housequeryPage.action",
-  //   headers: {
-  //     // token: sessionStorage.getItem("token"),
-  //     // user_head: sessionStorage.getItem("userhead"),
-  //   },
-  //   params: data,
-  // });
-  // console.log(res, "房型管理");
-  // if (res.data.code == 200) {
-  //   loading.value = false;
-  //   tableData.list = res.data.data.pageList;
-  //   total.value = res.data.data.total;
-  //   // ElMessage({
-  //   //   type: "success",
-  //   //   showClose: true,
-  //   //   message: res.data.message,
-  //   //   center: true,
-  //   // });
-  // } else {
-  //   loading.value = false;
-  //   ElMessage({
-  //     type: "error",
-  //     showClose: true,
-  //     message: res.data.message,
-  //     center: true,
-  //   });
-  // }
+  let data = {
+    currentPage: currentPage.value,
+    pageCount: pageCount.value,
+    userId: "", // 当前用户ID
+    type: searchInput.keyWord, // 类型
+    // managerId: sessionStorage.getItem("token"),
+  };
+  let res = await axios({
+    method: "get",
+    url: api.value + "/smartVisitor/appointmentPageRecor",
+    headers: {
+      // token: sessionStorage.getItem("token"),
+      // user_head: sessionStorage.getItem("userhead"),
+    },
+    params: data,
+  });
+  console.log(res, "房型管理");
+  if (res.data.code == 200) {
+    loading.value = false;
+    tableData.list = res.data.data.pageList;
+    total.value = res.data.data.total;
+    // ElMessage({
+    //   type: "success",
+    //   showClose: true,
+    //   message: res.data.message,
+    //   center: true,
+    // });
+  } else {
+    // loading.value = false;
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 };
 
 // 搜索功能
@@ -809,12 +813,9 @@ onUnmounted(() => {
         li {
           list-style: none;
           color: #000;
-          font-weight: 600;
-          font-size: 17px;
+          font-weight: 400;
+          font-size: 16px;
           margin-bottom: 10px;
-          span {
-            // font-weight: 600;
-          }
         }
       }
       .options {

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1176 - 0
src/views/grade/grade.vue


+ 5 - 1
src/views/home/home.vue

@@ -368,7 +368,6 @@ const cartogram = async () => {
         },
         labelLine: {
           show: true,
-          //   length: -1,
         },
         emphasis: {
           itemStyle: {
@@ -827,6 +826,11 @@ const behaviorClick = async () => {
           show: true,
           //   length: -1,
         },
+        // itemStyle: {
+        //   shadowBlur: 10,
+        //   shadowOffsetX: 0,
+        //   shadowColor: "rgba(0, 0, 0, 0.5)",
+        // },
       },
     ],
   });

+ 7 - 12
src/views/info/info.vue

@@ -49,12 +49,7 @@
         </el-button>
       </el-upload>
 
-      <el-image
-        v-if="schoolImg"
-        class="info_img"
-        :src="schoolImg"
-        fit="cover"
-      />
+      <img class="info_img" src="@/assets/school_logo.jpg" fit="cover" />
       <div class="info_img" v-if="!schoolImg">暂无图片</div>
       <div class="icon_delete" v-if="showSchool" @click="handleDelete">
         <el-icon>
@@ -71,8 +66,8 @@
         </el-button>
       </el-upload>
 
-      <el-image v-if="logoImg" class="info_img" :src="logoImg" fit="cover" />
-      <div class="info_img" v-if="!logoImg">暂无图片</div>
+      <img class="info_img" src="@/assets/school_logo.jpg" fit="cover" />
+      <!-- <div class="info_img" v-if="!logoImg">暂无图片</div> -->
 
       <div class="icon_delete" v-if="showSchool" @click="handleDelete">
         <el-icon>
@@ -133,16 +128,16 @@ import { ref } from "vue";
 const schoolCode = ref(4851511515);
 
 // 学校名称
-const schoolName = ref("万载三中");
+const schoolName = ref("万载县第三中");
 
 // 校徽图片地址
-const schoolImg = ref();
+const schoolImg = ref("@/assets/school_logo.jpg");
 
 // 管理平台logo图片地址
-const logoImg = ref();
+const logoImg = ref("");
 
 // 公众号名称
-const appName = ref("万载三中");
+const appName = ref("万载县第三中");
 
 // 公众号appid
 const appAppid = ref("wxd87cbe1db0437303");

+ 22 - 2
src/views/login/index.vue

@@ -10,7 +10,7 @@
         <qrcode-vue :value="codeUrl" :size="codeSize" level="H" />
       </div>
       <div class="login_btn">
-        <div class="btn">单点登录</div>
+        <div class="btn" @click="login">单点登录</div>
         <div class="btn">统一认证</div>
       </div>
     </div>
@@ -18,11 +18,31 @@
 </template>
 
 <script setup>
-import { ref } from "vue";
+import {
+  ref,
+  reactive,
+  watch,
+  nextTick,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { dayjs } from "element-plus";
+import lodash from "lodash";
+import axios from "axios";
 import QrcodeVue from "qrcode.vue";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
+const router = useRouter();
 
 const codeUrl = ref("123");
 const codeSize = ref(200);
+const login = () => {
+  router.push({ path: `/wanzai/home` });
+  sessionStorage.setItem("sidevarItem", "/wanzai/home");
+};
 </script>
 
 <style lang="scss" scoped>

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1066 - 0
src/views/student/student.vue


Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1066 - 0
src/views/teacher/teacher.vue


+ 4 - 4
vite.config.js

@@ -42,12 +42,12 @@ export default defineConfig({
 
     // // 测试地址
     proxy: {
-      "/hotelReservation": {
+      "/smartApi/wanzai/api": {
         // target: "https://chtech.ncjti.edu.cn/hotelReservation",
-        // target: "http://101.42.162.31/hotelReservation/", // 测试环境
-        target: "https://www.jinganrenjiams.com/hotelReservation/", // 测试环境
+        // target: "https://www.campussmartlife.com/smartManage", // 测试环境
+        target: "https://www.campussmartlife.com/smartApi/wanzai/api", // 线上环境
         changeOrigin: true,
-        rewrite: (path) => path.replace(/^\/hotelReservation/, ""),
+        rewrite: (path) => path.replace(/^\/smartApi\/wanzai\/api/, ""),
       },
     },
   },