Compare commits

...
32 Commits
Author SHA1 Message Date
ops ddb8c1a504 fix(ci): 构建容器名唯一化 + npm 走国内镜像源(避免并发互踩 exit 137) 2026-10-21 06:24:27 +00:00
ops 09abba90ff ci: apk 源统一走 aliyun(规避 dl-cdn 时段性被拦卡 60s) 2026-10-21 01:36:58 +00:00
lijing 2269b4da56 1
build / build (push) Failing after 8s
deploy-bschclass-front / build-and-deploy (push) Successful in 5m10s
2026-09-04 15:36:02 +08:00
lijing 6f2edb171c refactor: API base 路径 /bschclass 改为 /userclass
build / build (push) Failing after 5s
deploy-bschclass-front / build-and-deploy (push) Failing after 24s
2026-09-04 15:22:57 +08:00
lijing 9e0c12ad42 merge projman injected files 2026-09-04 15:20:26 +08:00
lijing 487239724d init: 用户班级前端代码(源 BSchClassManageFront) 2026-09-04 15:20:04 +08:00
admin 0073213216 ci: init build workflow [skip ci] 2026-09-04 10:07:42 +08:00
admin c189c5ed1d init: readme guide [skip ci] 2026-09-04 10:07:12 +08:00
admin f77e5c7714 Initial commit 2026-09-04 10:07:12 +08:00
lijing 28afbc07e5 1
deploy-bschclass-front / build-and-deploy (push) Successful in 5m41s
2026-09-03 23:41:27 +08:00
lijing 6c7e1c9308 1
deploy-bschclass-front / build-and-deploy (push) Successful in 5m38s
2026-09-01 15:46:39 +08:00
lijing 8529add85d 1
deploy-bschclass-front / build-and-deploy (push) Successful in 2m13s
2026-09-01 08:45:54 +08:00
lijing 6c1ace7a59 1
deploy-bschclass-front / build-and-deploy (push) Successful in 3m57s
2026-08-28 14:32:31 +08:00
lijing 174e80f89a 1
deploy-bschclass-front / build-and-deploy (push) Successful in 6m55s
2026-08-27 17:55:32 +08:00
lijing da0bc74ae2 1
deploy-bschclass-front / build-and-deploy (push) Failing after 3m50s
2026-08-26 15:25:12 +08:00
lijing 79ab93547c 1
deploy-bschclass-front / build-and-deploy (push) Successful in 5m12s
2026-08-26 08:37:13 +08:00
lijing f9205ccf77 init
deploy-bschclass-front / build-and-deploy (push) Successful in 3m27s
2026-08-25 17:23:01 +08:00
lijing 35deb3b115 init
deploy-bschclass-front / build-and-deploy (push) Successful in 4m32s
2026-08-24 15:37:43 +08:00
lijing ec5ca29207 1
deploy-bschclass-front / build-and-deploy (push) Successful in 2m34s
2026-08-21 10:13:49 +08:00
lijing 41c7c73c73 init
deploy-bschclass-front / build-and-deploy (push) Successful in 4m57s
2026-08-20 22:06:47 +08:00
lijing 8f46d0731d 1
deploy-bschclass-front / build-and-deploy (push) Successful in 5m12s
2026-08-19 15:36:34 +08:00
lijing 67824097d3 1
deploy-bschclass-front / build-and-deploy (push) Successful in 4m12s
2026-08-19 15:02:37 +08:00
lijing b0e7ee6d80 init
deploy-bschclass-front / build-and-deploy (push) Successful in 3m9s
2026-08-19 14:59:30 +08:00
lijing 3e7439647c init
deploy-bschclass-front / build-and-deploy (push) Successful in 5m9s
2026-08-19 14:49:38 +08:00
lijing 95baccaa71 init
deploy-bschclass-front / build-and-deploy (push) Successful in 6m12s
2026-08-19 14:40:02 +08:00
lijing 78424636ce init
deploy-bschclass-front / build-and-deploy (push) Successful in 3m29s
2026-08-19 14:21:08 +08:00
lijing fb17d564c7 init
deploy-bschclass-front / build-and-deploy (push) Successful in 3m30s
2026-08-18 17:10:35 +08:00
lijing c5bfa3b623 1
deploy-bschclass-front / build-and-deploy (push) Successful in 2m22s
2026-08-18 09:39:53 +08:00
lijing 04ff7a8895 1
deploy-bschclass-front / build-and-deploy (push) Successful in 4m34s
2026-08-17 15:31:53 +08:00
lijing 0e48281920 init
deploy-bschclass-front / build-and-deploy (push) Successful in 3m19s
2026-08-14 10:03:36 +08:00
lijing 3e2d8dbb0c Merge branch 'main' of http://gitea.yunhaixingtong.com/lijing/BSchClassManageFront
deploy-bschclass-front / build-and-deploy (push) Successful in 8m30s
2026-08-13 16:20:36 +08:00
lijing 1815178fec init 2026-08-13 16:20:34 +08:00
39 changed files with 899 additions and 567 deletions
+99
View File
@@ -0,0 +1,99 @@
name: build
# 前端应用 CI:构建 → 打包 zip → 推 Nexus raw → 通知 projman 建档
# 触发:push 到 main / 手动 Run workflow
# 链路:clone 源码 -> node 容器 npm ci + npm run build -> 打包 dist 为 zip -> 推 Nexus raw -> 通知 projman 建档
# 依赖仓库 Secrets:DEPLOY_TOKEN(webhook 鉴权)、NEXUS_USER / NEXUS_PASSWORD(上传 zip 到 Nexus raw)
# 注意:CI 构建后自动建档(status=pending),前端发布仍由用户在「前端发布」Tab 点部署触发
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
container:
image: docker:24
options: --network infra-infra-net
steps:
- name: 安装 git / curl / zip(alpine)
run: |
# 统一走 aliyun 源:dl-cdn 时段性被拦会卡满 60s×2(2026-10-20 事故)
sed -i 's#dl-cdn.alpinelinux.org#mirrors.aliyun.com#g' /etc/apk/repositories
apk add --no-cache git curl zip
# 内网 Gitea 无法访问 GitHub 拉 actions/checkout,手动 clone 本仓库
- name: 拉取源码(内网无 GitHub,手动 clone 本仓库)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git clone --depth 1 --branch main "http://x-access-token:${GITHUB_TOKEN}@gitea.yunhaixingtong.com/${{ github.repository }}.git" /tmp/src
cp -a /tmp/src/. .
rm -rf /tmp/src
# 取提交备注首行,脱去换行/双引号/反斜杠(避免破坏 webhook JSON),截断到 200 字符
COMMIT_MSG=$(git log -1 --pretty=%s | tr '\n' ' ' | sed 's/["\\]/ /g' | cut -c1-200)
echo "COMMIT_MSG=${COMMIT_MSG}" >> "$GITHUB_ENV"
# 前端构建:起独立 node 容器(通过 docker.sock 调宿主 dockerd)
# node:20 镜像预装 npm,npm ci 按 lockfile 安装依赖
- name: 构建前端(node 容器)
run: |
set -e
# 构建容器名必须全局唯一:runner 挂的是宿主 docker.sock,容器名在整个 daemon 上共享
# 命名空间。固定名会在多仓/多条 workflow 并发时互相 docker rm -f 掉对方正在构建的
# 容器,表现为无编译报错的 exit 137(SIGKILL,2026-10-21 实测复现)。
# GITHUB_RUN_ID 实例级唯一,再拼时间戳兜底。
BUILD_CONTAINER="frontbuild-${GITHUB_RUN_ID:-0}-$(date +%s)"
echo "BUILD_CONTAINER=${BUILD_CONTAINER}"
docker rm -f "$BUILD_CONTAINER" 2>/dev/null || true
docker run -d --name "$BUILD_CONTAINER" -w /build node:20 sleep 3600
docker cp "${PWD}/." "$BUILD_CONTAINER":/build/
docker exec "$BUILD_CONTAINER" sh -c '
set -e
cd /build
if [ -f .npmrc ]; then sed -i "/SASS_BINARY_PATH/d" .npmrc; fi
# 国内镜像源:内网直连 registry.npmjs.org 跨境极慢(实测 npm install 12 分 46 秒 / 754 包)
npm config set registry https://registry.npmmirror.com
npm ci
npm run build
'
echo "=== dist 产物 ==="
docker exec "$BUILD_CONTAINER" sh -c 'ls -la /build/dist/ | head -20'
# 从容器 cp dist 到宿主工作目录
docker cp "$BUILD_CONTAINER":/build/dist ./dist
docker rm -f "$BUILD_CONTAINER"
echo "BUILD CHECK OK"
# 打包 dist → zip(进入 dist 目录打包,zip 根目录直接是 html/css/js 文件)
- name: 打包产物
run: |
TAG=$(echo "$GITHUB_SHA" | cut -c1-8)
ZIP_FILE="userclass-front-${TAG}.zip"
cd dist && zip -r "../${ZIP_FILE}" . && cd ..
echo "ZIP_FILE=${ZIP_FILE}" >> "$GITHUB_ENV"
echo "TAG=${TAG}" >> "$GITHUB_ENV"
ls -la "${ZIP_FILE}"
# 上传到 Nexus raw 仓库
- name: 上传产物到 Nexus
env:
NEXUS_USER: ${{ secrets.NEXUS_USER }}
NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }}
run: |
NEXUS_URL="http://nexus.yunhaixingtong.com:8081/repository/front-hosted/${ZIP_FILE}"
curl -sS -X PUT \
-u "${NEXUS_USER}:${NEXUS_PASSWORD}" \
--upload-file "${ZIP_FILE}" \
"${NEXUS_URL}"
echo "NEXUS_URL=${NEXUS_URL}" >> "$GITHUB_ENV"
echo "uploaded to ${NEXUS_URL}"
# 通知 projman:webhook 收到后建档(type=front, status=pending),部署由用户在「前端发布」Tab 手动触发
- name: 通知 projman 建档
run: |
curl -sS -X POST "http://192.168.10.160:8090/projman/api/deploy/webhook" \
-H "Content-Type: application/json" \
-H "X-Deploy-Token: ${{ secrets.DEPLOY_TOKEN }}" \
-d "{\"app\":\"userclass\",\"front\":\"front\",\"tag\":\"${TAG}\",\"sha\":\"${GITHUB_SHA}\",\"message\":\"${COMMIT_MSG}\",\"nexusUrl\":\"${NEXUS_URL}\"}"
+18 -7
View File
@@ -24,7 +24,10 @@ jobs:
image: docker:24
steps:
- name: Install git (alpine)
run: apk add --no-cache git
run: |
# 统一走 aliyun 源:dl-cdn 时段性被拦会卡满 60s×2(2026-10-20 事故)
sed -i 's#dl-cdn.alpinelinux.org#mirrors.aliyun.com#g' /etc/apk/repositories
apk add --no-cache git
# 内网 Gitea 无法访问 github.com 拉取 actions/checkout,改为直接 clone 本仓库(main 分支)
- name: Checkout (manual, internal Gitea)
@@ -37,20 +40,26 @@ jobs:
- name: Build & Deploy (symlink versioning)
run: |
set -e
# 构建容器名必须全局唯一:runner 挂的是宿主 docker.sock,容器名在整个 daemon 上共享
# 命名空间。固定名会在多仓/多条 workflow 并发时互相 docker rm -f 掉对方正在构建的
# 容器,表现为无编译报错的 exit 137(SIGKILL,2026-10-21 实测复现)。
# GITHUB_RUN_ID 实例级唯一,再拼时间戳兜底。
BUILD_CONTAINER="frontbuild-${GITHUB_RUN_ID:-0}-$(date +%s)"
echo "BUILD_CONTAINER=${BUILD_CONTAINER}"
# 版本号:short sha + 时间戳
VERSION="$(echo ${GITHUB_SHA} | cut -c1-7)-$(date +%Y%m%d-%H%M)"
echo "Deploying version: $VERSION"
docker rm -f frontbuild 2>/dev/null || true
docker run -d --name frontbuild \
docker rm -f "$BUILD_CONTAINER" 2>/dev/null || true
docker run -d --name "$BUILD_CONTAINER" \
-e VERSION="$VERSION" \
-v /data/www/bschclass:/data/www/bschclass \
-w /build node:16 sleep 3600
# 源码拷入构建容器(绕过 act 工作区非宿主路径的坑,与 service 的 mavenbuild 一致)
docker cp "${PWD}/." frontbuild:/build/
docker cp "${PWD}/." "$BUILD_CONTAINER":/build/
docker exec frontbuild sh -c '
docker exec "$BUILD_CONTAINER" sh -c '
set -e
cd /build
# 去掉 Windows 专用 sass 二进制路径(Linux 容器内该路径无效,否则 build 报错)
@@ -59,12 +68,14 @@ jobs:
# 用 npm install 而非 npm ci:仓库 package-lock.json 与 package.json 不同步
#(sortablejs 锁 1.10.2 但 package.json 要求 1.15.7),npm ci 会强校验同步而失败;
# npm install 会按 package.json 重新对齐 lock 并安装,避免阻塞部署。
# 国内镜像源:内网直连 registry.npmjs.org 跨境极慢(实测 npm install 12 分 46 秒 / 754 包)
npm config set registry https://registry.npmmirror.com
npm install
npm run build
'
# 部署:首次把真实目录 front 迁入 releases/initial 并建软链;之后均为软链替换
docker exec frontbuild sh -c '
docker exec "$BUILD_CONTAINER" sh -c '
set -e
cd /build
# ---- 首次初始化:front 当前是真实目录,无法直接 ln -sfn 覆盖 ----
@@ -88,5 +99,5 @@ jobs:
echo "remaining versions:"; ls -1t
'
docker rm -f frontbuild
docker rm -f "$BUILD_CONTAINER"
echo "DEPLOY OK: $VERSION"
+53
View File
@@ -0,0 +1,53 @@
# UserclassFront
> 本仓库由 projman 自动创建并注入 CI(`.gitea/workflows/build.yml`)与 Dockerfile(`docker/Dockerfile`)。
> 推送代码到 main 分支即自动构建镜像并推送到 Nexus,projman 收到通知后建档待部署,由运维在 projman「后端发布」手动点部署。
## 首次推送本地代码到本仓库
> 目标:把本地已有代码推上去,同时**保留** projman 注入的文件(`build.yml`、`Dockerfile`)。
```bash
# 1. 进入本地代码目录
cd /your/local/code/dir
# 2. 初始化 git(目录已有 .git 也安全,git init 幂等无副作用)
git init
git branch -M main
# 3. 先把本地代码提交成一个 commit(关键!不提交直接 merge 会丢失本地代码)
git add -A
git commit -m "init local code"
# 4. 关联远程仓库(幂等:已存在 origin 则改地址,不报错)
git remote add origin http://gitea.yunhaixingtong.com/userclass/UserclassFront.git 2>/dev/null \
|| git remote set-url origin http://gitea.yunhaixingtong.com/userclass/UserclassFront.git
# 5. 拉取远程信息(只下载,不合并)
git fetch origin
# 6. 合并远程 main(关键步骤)
# 本地与远程是两条独立历史,需允许合并不相关历史。
# 此步会把 projman 注入的 build.yml 与 Dockerfile 合并进你的本地工作区。
git merge origin/main --allow-unrelated-histories -m "merge projman injected files"
# 7. 查看状态(确认 .gitea/workflows/build.yml、docker/Dockerfile 已在本地)
git status
# 8. 提交并推送
git add -A
git commit -m "sync local code" 2>/dev/null || true
git push origin main
```
## 推送后验证
push 触发 CI 构建,前往 Gitea 仓库 → **Actions** 查看日志;构建成功后镜像推送到 Nexus,projman 建档待部署,在 projman 应用详情「后端发布」手动点部署。
## 禁止写法(会导致注入文件被删)
`git reset origin/main` + `git add -A` 会把远程已注入、但你本地没有的文件(`build.yml`、`Dockerfile`)当作"删除"提交并推送,导致这些文件被删、CI 失败。务必用 `git merge` 而非 `git reset`,且 merge 前先提交本地代码。
## 关于 Dockerfile
projman 注入的 Dockerfile 仅在仓库不存在时写入;你自备的 Dockerfile 优先,不会被覆盖。
+1
View File
@@ -8,6 +8,7 @@
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@riophae/vue-treeselect": "^0.4.0",
"core-js": "^3.6.5",
"node-sass": "latest",
"sortablejs": "^1.15.7",
+2
View File
@@ -10,6 +10,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title><%= htmlWebpackPlugin.options.title %></title>
<script src="./config/index.js"></script>
<link rel="stylesheet" href="./libs/base.layout.css" />
<link rel="stylesheet" href="./libs/default-theme.css" />
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4962449_bwzjcx59wz4.css" />
</head>
<body>
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
.header-container{background:#577afb}.header-container .school-bg{display:none}.left-menu{background:#F6F8F9}.left-menu li:hover{background:#EFF4FF}.left-menu li.active{background:#EFF4FF;border-left:none ;border-right:4px solid #577afb}
+21 -38
View File
@@ -26,10 +26,10 @@
import layout from "./frame/layout.vue";
import layoutOld from "./frame/layout_old.vue";
const appendLink = (baseHost, name, version) => {
var headHTML = `<link type="text/css" rel="stylesheet" href="${baseHost}/BschHome/front/css/${name}.css?v=${version}">`;
$("head:eq(0)").append(headHTML);
};
// const appendLink = (baseHost, name, version) => {
// var headHTML = `<link type="text/css" rel="stylesheet" href="${baseHost}/BschHome/front/css/${name}.css?v=${version}">`;
// $("head:eq(0)").append(headHTML);
// };
export default {
components: { layout, layoutOld },
@@ -54,14 +54,17 @@ export default {
try {
const baseHost = window.conf.baseHost,
ssoHost = window.conf.ssoHost;
var version = localStorage.getItem("themeVersion") || new Date().getTime();
appendLink(baseHost, "base.layout.beta", version);
// var version = localStorage.getItem("themeVersion") || new Date().getTime();
// appendLink(baseHost, "base.layout.beta", version);
var info = await this.getUserInfo();
var bschResult = await this.getBschHomeJsonp(baseHost, info.id);
this.setCurrentRole(bschResult, baseHost, info.id);
// var bschResult = await this.getBschHomeJsonp(baseHost, info.id);
// this.setCurrentRole(bschResult, baseHost, info.id);
localStorage.setItem("currentRole", encodeURI(JSON.stringify({ childId:0, roleId:info.roleIds[0], schId:info.school?info.school.id:0, userId:info.id })));
var mod = await this.getUserMod();
this.layoutInit(info, mod, bschResult.appList, baseHost, ssoHost);
if(info.type==1){
mod=mod.filter(a=>a.customId<4)
}
this.layoutInit(info, mod, [], baseHost, ssoHost);
this.isLogin = true;
} catch (error) {
console.error(error);
@@ -105,27 +108,7 @@ export default {
APIConfig.Base.GetUserMod,
null,
resp => {
let resps = {
"code": 0, "msg": "", "data":
[
{ "id": 1493, "appId": 551, "modId": 1, "name": "学制选择", "parentId": 0, "path": null, "level": 0, "page": "/", "icon": null, "orderNumber": 1493, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 2, "name": "时段设置", "parentId": 0, "path": null, "level": 0, "page": "/itemSet", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 3, "name": "区域操作日志", "parentId": 0, "path": null, "level": 0, "page": "/areaOperateDaily", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 4, "name": "学校设置", "parentId": 0, "path": null, "level": 0, "page": "/schoolSetting", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 5, "name": "课程设置", "parentId": 0, "path": null, "level": 0, "page": "/subjectManForZy", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 6, "name": "学科管理", "parentId": 0, "path": null, "level": 0, "page": "/subjectSetzhi", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 7, "name": "班级管理", "parentId": 0, "path": null, "level": 0, "page": "/classManage", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 8, "name": "选修班管理", "parentId": 0, "path": null, "level": 0, "page": "/electiveClassManage", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 9, "name": "教师管理", "parentId": 0, "path": null, "level": 0, "page": "/teacherManage", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 10, "name": "学生管理", "parentId": 0, "path": null, "level": 0, "page": "/studentManage", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 11, "name": "历史查询", "parentId": 0, "path": null, "level": 0, "page": "/historySearch", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 12, "name": "学生异动管理", "parentId": 0, "path": null, "level": 0, "page": "/studentYDManage", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 13, "name": "教师转入管理", "parentId": 0, "path": null, "level": 0, "page": "/zhuanruinfo", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 14, "name": "学生转入管理", "parentId": 0, "path": null, "level": 0, "page": "/zhuanruinfostu", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
{ "id": 1494, "appId": 551, "modId": 15, "name": "日志管理", "parentId": 0, "path": null, "level": 0, "page": "/dailySearch", "icon": null, "orderNumber": 1494, "usable": true, "children": [], "modules": [] },
], "timeNow": "2026-06-17 14:44:05"
}
resolve(resps.data);
resolve(resp.data);
},
error => reject(error)
);
@@ -169,7 +152,7 @@ export default {
});
},
layoutInit(info, mod, appList, baseHost, ssoHost) {
this.layoutData.appName = "班级管理";
this.layoutData.appName = "学校管理";
this.layoutData.baseHost = baseHost;
this.layoutData.ssoHost = ssoHost;
const routes = this.$router.options.routes;
@@ -180,14 +163,14 @@ export default {
typeof x.meta !== "undefined" &&
typeof x.meta.modId !== "undefined" &&
typeof x.meta.icon !== "undefined" &&
x.meta.modId == element.modId
x.meta.modId == element.customId
);
let icon = iconIndex > -1 ? "iconfont " + routes[iconIndex].meta.icon : ""; //icon不传则为默认
arr.push({
id: element.id,
name: element.name,
modId: element.modId,
page: element.page,
modId: element.customId,
page: element.path,
children: element.children || [],
icon,
});
@@ -208,10 +191,10 @@ export default {
if (result) {
let { childId, roleId, schId } = result.checkRole;
localStorage.setItem("currentRole", encodeURI(JSON.stringify({ childId, roleId, schId, userId })));
localStorage.setItem("themeVersion", result.themeVersion);
appendLink(baseHost, result.themeName, result.themeVersion);
// localStorage.setItem("themeVersion", result.themeVersion);
// appendLink(baseHost, result.themeName, result.themeVersion);
} else {
appendLink(baseHost, "default-theme", new Date().getTime());
// appendLink(baseHost, "default-theme", new Date().getTime());
}
},
},
+16 -3
View File
@@ -3,8 +3,8 @@ let BaseUrl = conf.serviceUrl;
export default {
Base: {
GetUserInfo: BaseUrl + "/api/GetUserInfo",
GetUserMod: BaseUrl + "/api/GetUserMod",
GetUserInfo: BaseUrl + "/api/base/getUserInfo",
GetUserMod: BaseUrl + "/api/base/getUserMod",
},
BschClassSystem: {
//年级树
@@ -21,12 +21,15 @@ export default {
getselectBySchIdAndGradeId:BaseUrl + "/api/schclass/selectBySchIdAndGradeId",//通过学校ID、年级ID获取班级下拉
getselectBySchsystemId:BaseUrl + "/api/grade/selectBySchsystemId",//通过学制ID获取年级下拉
getTeacherTree:BaseUrl + "/api/tree/getTeacherTree",//获取教师选人树
getClassHistoryTree:BaseUrl + "/api/tree/getClassHistoryTree",//获取历年班级树
//学制选择
getschsystemlist: BaseUrl + "/api/schsystem/list",//获取学校绑定学制列表
schsystemsave: BaseUrl + "/api/schsystem/save",//保存学制
getschsystemselect: BaseUrl + "/api/schsystem/select",//获取选择的学制
getType: BaseUrl + "/api/schsystem/getType",//获取学制类型
selectTree: BaseUrl + "/api/schsystem/selectTree",//获取学制树
addSchool: BaseUrl + "/api/school/addSchool",//添加学校学制
//时段设置
getyeartermlist: BaseUrl + "/api/yearterm/list",//获取学年学期
@@ -102,7 +105,11 @@ export default {
transferOutSchSelect: BaseUrl + "/api/teacher/transferOutSchSelect",//教师转出学校下拉
getsearchTransferOut: BaseUrl + "/api/teacher/searchTransferOut",//教师转出教师列表
teacherdownloadTemplate: BaseUrl + "/api/teacher/downloadTemplate",//下载教师模版
teacherImport: BaseUrl + "/api/teacher/Import",//教师导入
teacherImport: BaseUrl + "/api/teacher/importTeachers",//教师导入
addGroup: BaseUrl + "/api/usergroup/addGroup",//同步添加子组
editGroup: BaseUrl + "/api/usergroup/editGroup",//同步编辑子组
deleteGroup: BaseUrl + "/api/usergroup/deleteGroup",//同步删除子组
moveGroup: BaseUrl + "/api/usergroup/moveGroup",//同步移动子组
// 教师任教
getteachssearch: BaseUrl + "/api/teachs/search",//获取任教列表
@@ -148,6 +155,12 @@ export default {
getbaseSchAbnormalSearch: BaseUrl + "/api/student/baseSchAbnormalSearch",//获取K12学生异动列表
gethigherSchAbnormalSearch: BaseUrl + "/api/student/higherSchAbnormalSearch",//获取高校学生异动列表
//历史查询
getClass: BaseUrl + "/api/history/getClass",//获取班级信息
getHistoryClassTeach: BaseUrl + "/api/history/getHistoryClassTeach",//获取历史任教信息
getHistoryClassStudent: BaseUrl + "/api/history/getHistoryClassStudent",//获取历史班级信息
getHistoryClassTeachByStuId: BaseUrl + "/api/history/getHistoryClassTeachByStuId",//通过学生id获取历史任教信息
//日志管理
getlogsearch: BaseUrl + "/api/log/search",//获取日志列表
+2 -2
View File
@@ -1,8 +1,8 @@
let conf = {
baseHost: "http://base.yunhaixingtong.com",
ssoHost: "http://sso.yunhaixingtong.com",
serviceUrl: "http://base.yunhaixingtong.com/bschclass",
fileHost: "http://base.yunhaixingtong.com/bschclass",
serviceUrl: "http://base.yunhaixingtong.com/userclass",
fileHost: "http://base.yunhaixingtong.com/userclass",
isLayoutOld: false
// serviceUrl: "http://basedebug.bestsch.com/BschHome/",
};
+10 -7
View File
@@ -2,9 +2,11 @@
<div class="layout-wrap">
<header class="header-container fix">
<div class="fl align-middle icon-box">
 <div title="常用应用" :class="['icon-btn', isPanel ? 'active' : '']" @click="showPanel">
                    <i class="iconfont icon-apps"></i>
                </div>
<div title="常用应用" :class="['icon-btn', isPanel ? 'active' : '']" @click="showPanel">
<!-- <i class="iconfont icon-apps"></i> -->
<Icon type="md-cube" color="#fff" size="16" />
<!-- <Icon type="md-cart" color="#fff" size="16" /> -->
</div>
</div>
<div class="delimiter fl align-middle"></div>
<h4 class="fl align-middle">{{ appName }}</h4>
@@ -15,9 +17,10 @@
{{ userInfo.name }}
</a>
<div class="delimiter fl align-middle"></div>
<a href=" " @click="logout" class="logout fl align-middle" title="退出登陆">
                    <i class="iconfont icon-logout"></i>
                </a>
<a href="javascript:void(0);" @click="logout" class="logout fl align-middle" title="退出登陆">
<!-- <i class="iconfont icon-logout"></i> -->
<Icon type="md-power" color="#fff" size="18" />
</a>
</div>
</header>
@@ -94,7 +97,7 @@
</div>
<div class="path-nav" v-if="!isAlone">
<Breadcrumb separator=">">
<a :href="baseHost + '/BschHome/front/index.html'">
<a :href="baseHost + '/userhome/front/index.html'">
<BreadcrumbItem>
<i class="iconfont icon-category"></i>
首页
+1 -1
View File
@@ -24,7 +24,7 @@ Vue.use(VueRouter);
const routes = [
{
path: "/",
path: "/studySystemChoice",
name: "studySystemChoice",
component: studySystemChoice,
meta: { title: "学制选择", modId: 1, icon: "icon-shezhi" }
-1
View File
@@ -17,7 +17,6 @@
<!-- 表格自适应滚动容器(核心滚动区域) -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
+4 -5
View File
@@ -26,7 +26,6 @@
<!-- 表格容器:填充剩余高度,纵向滚动 -->
<div class="table-auto-scroll">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -77,9 +76,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -625,7 +624,7 @@ export default {
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.getsearcBaseSchClass();
@@ -40,7 +40,6 @@
<div v-if="activeTab === 'student'" class="student-wrap">
<div class="table-scroll-box">
<Table
border
stripe
:columns="studentColumns"
:data="studentData"
+9 -8
View File
@@ -30,7 +30,7 @@
style="width:200px"
@keyup.enter="searchList"
>
<Icon slot="suffix" type="ios-search"></Icon>
<Icon slot="suffix" type="ios-search" @click="searchList" style="cursor:pointer;"></Icon>
</Input>
</div>
</div>
@@ -39,7 +39,6 @@
<div class="table-adapt-wrap">
<div class="table-scroll-box">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -119,9 +118,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -157,7 +156,7 @@
return {
// 左侧树形数据
treeData: [],
selectnodeid: new Date().getFullYear()-1,
selectnodeid: new Date().getFullYear(),
// 顶部筛选
keyword: '',
@@ -213,6 +212,7 @@
// 表格模拟数据
tableData: [],
spinShow:false,
UpParmas:{
fileName:'',
listData:{},
@@ -430,7 +430,7 @@
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.getsearcHigherSchClass();
@@ -482,7 +482,7 @@
// 查看详情
viewDetail(row) {
this.$router.push('/ChristianityDetail?id='+row.id);
this.$router.push('/ChristianityDetail?gradeId='+row.gradeId+'&classId='+row.classId+'&gradeclassName='+row.name);
},
// 编辑回填
@@ -598,6 +598,7 @@
border: 1px solid #e8e8e8;
padding: 8px;
overflow-y: auto;
min-width: 220px;;
}
/* 右侧整体 */
+2 -3
View File
@@ -17,7 +17,6 @@
<!-- 自适应滚动表格容器 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -74,10 +73,10 @@
initTableColumn() {
this.tableColumns = [
{ title: '序号', type: 'index', align: 'center', width: 70 },
{ title: '用户', key: 'operator', align: 'center', width: 130 },
{ title: 'IP', key: 'ip', align: 'center', width: 150 },
{ title: '模块', key: 'module', align: 'center', width: 160 },
{ title: '详细操作', key: 'content', align: 'left' },
{ title: '用户', key: 'operator', align: 'center', width: 130 },
{ title: 'IP', key: 'ip', align: 'center', width: 150 },
{
title: '时间',
key: 'operateTime',
+1 -1
View File
@@ -310,7 +310,7 @@
// 表格列配置:操作第一个改为编辑图标按钮
tableColumns: [
{ type: "selection", width: 50 },
{ type: "selection", width: 60 },
{ title: "#", type: "index", align: "center", width: 70 },
{ title: "班级名称", key: "className", align: "left" },
{ title: "开班时间", key: "openTime", align: "center", width: 160 },
+1 -1
View File
@@ -132,7 +132,7 @@
selectedStudentRows: [],
// 表格列配置
tableColumns: [
{ type: "selection", width: 50 },
{ type: "selection", width: 60 },
{ title: "序号", type: "index", align: "center", width: 70 },
{ title: "姓名", key: "name", align: "left" },
{ title: "年级", key: "grade", align: "center" },
+173 -179
View File
@@ -2,22 +2,17 @@
<div class="class-history-wrap">
<!-- 左侧树形区域:固定高度纵向滚动、单选、默认首班级选中 -->
<div class="left-tree-box">
<Tree
:data="treeData"
ref="tree"
single
:selected.sync="selectedTreeNode"
@on-select="treeNodeChange"
></Tree>
<my-tree :treeData="treeData" :selectId="selectnodeid" @on-tree-click="treeLink"></my-tree>
</div>
<!-- 右侧主内容区域 -->
<div class="right-main">
<!-- 顶部基础信息栏 -->
<div class="top-info-bar">
<span class="info-item">学级:{{ currentGrade }}</span>
<span class="info-item">班级:{{ currentClassName }}</span>
<span class="info-item">入学时间:{{ enrollDate }}</span>
<span v-if="ClassMap.schType==2" class="info-item">专业:{{ ClassMap.majorsName }}</span>
<span class="info-item"><b>学级:</b>{{ ClassMap.gradeName }}</span>
<span class="info-item"><b>班级:</b>{{ ClassMap.name }}</span>
<span class="info-item"><b>入学时间:</b>{{ ClassMap.createDate }}</span>
</div>
<!-- 标签页切换:历史任教 / 历史学生 -->
@@ -25,143 +20,76 @@
<TabPane label="历史任教" name="teach"></TabPane>
<TabPane label="历史学生" name="student"></TabPane>
</Tabs>
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ dateRange }} &nbsp;&nbsp;年级:{{ currentGradeShort }}</span>
<span v-if="activeTab === 'student'" style="margin-left:20px">学生数:{{ studentTotal }}</span>
</div>
<!-- 滚动内容容器:高度自适应溢出滚动 -->
<div class="scroll-content-box">
<!-- 历史任教布局 -->
<div v-if="activeTab === 'teach'" class="teach-wrap">
<div class="item-card" v-for="(item,idx) in teachList" :key="idx">
<div class="card-title">{{ item.subject }}</div>
<div class="card-value">{{ item.teacher }}</div>
<div v-if="activeTab === 'teach'" v-for="(item,index) in HistoryClassTeachList" :key="index">
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ item.yearDate }}</span>
<span v-if="ClassMap.schType==2" style="margin-left:20px">学年:{{ item.gradeName }}</span>
<span v-else style="margin-left:20px">年级:{{ item.gradeName }}</span>
</div>
<!-- 历史任教布局 -->
<div class="teach-wrap">
<div class="item-card" v-for="(itt,idx) in item.teach" :key="idx">
<div class="card-title">{{ itt.subName }}</div>
<div class="card-value">{{ itt.teacherName }}</div>
</div>
</div>
</div>
<!-- 历史学生布局 -->
<div v-if="activeTab === 'student'" class="student-wrap">
<div class="item-card student-card" style="cursor: pointer;" v-for="(item,idx) in studentList" :key="idx" @click="tolink(item)">
{{ item.name }}<span v-if="item.idCard">({{ item.idCard }})</span>
<div v-if="activeTab === 'student'" v-for="(item,index) in HistoryClassStudentList" :key="index">
<!-- 筛选头部行 -->
<div class="filter-bar">
<span>日期:{{ item.yearDate }}</span>
<span v-if="ClassMap.schType==2" style="margin-left:20px">学年:{{ item.gradeName }}</span>
<span v-else style="margin-left:20px">年级:{{ item.gradeName }}</span>
<span style="margin-left:20px">学生数:{{ item.student.length }}</span>
</div>
<!-- 历史学生布局 -->
<div class="student-wrap">
<div class="item-card student-card" style="cursor: pointer;" v-for="(itt,idx) in item.student" :key="idx" @click="tolink(itt)">
{{ itt.name }}
<!-- <span v-if="itt.teacherName">({{ itt.teacherName }})</span> -->
</div>
</div>
</div>
</div>
<!-- 底部分页固定区域(预留分页逻辑) -->
<div class="page-bottom-bar">
<span>共 {{ activeTab === 'teach' ? teachList.length : studentTotal }} 条</span>
<Page
v-if="needPage"
:current.sync="pageNum"
:page-size="pageSize"
:total="activeTab === 'teach' ? teachList.length : studentTotal"
:page-size-opts="[20,40,60]"
show-sizer
@on-change="pageChange"
@on-page-size-change="sizeChange"
></Page>
</div>
</div>
</div>
</template>
</template>
<script>
import myTree from "../components/my_tree";
export default {
name: 'ClassHistoryPage',
components: { myTree },
data() {
return {
// 树形配置
treeData: [
{
title: '上海市进才中学北校',
expand: true,
children: [
{
title: '2025级(预备)',
expand: true,
children: [
{ title: '1班' },{ title: '2班' },{ title: '3班' },{ title: '4班' },{ title: '5班' },
{ title: '6班' },{ title: '7班' },{ title: '8班' },{ title: '9班' },{ title: '10班' },
{ title: '11班' },{ title: '12班' },{ title: '13班' },{ title: '14班' },{ title: '15班' },
{ title: '16班' },{ title: '17班' },{ title: '18班' },{ title: '19班' },{ title: '20班' },
{ title: '21班' },{ title: '22班' },{ title: '23班' },
]
},
{ title: '2024级(初一)', expand: true, children: [] },
{ title: '2023级(初二)', expand: true, children: [] },
]
}
],
selectedTreeNode: null,
currentClassName: '1班',
currentGrade: '2025级',
currentGradeShort: '预备',
enrollDate: '2025-07-11',
dateRange: '2025-07-11 - 2026-07-15',
treeData: [],
ClassMap:{
gradeName:'',
name:'',
createDate:'',
graduate:'',
majorsName:'',
schType:'',
},
selectnodeid:'',
schsystemId:'',
gradeId:'',
classId:'',
// 标签页
activeTab: 'teach',
// 任教数据
teachList: [
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '语文', teacher: '卫红' },
{ subject: '数学', teacher: '伍芳芳' },
{ subject: '英语', teacher: '俞莉玉' },
{ subject: '体育', teacher: '郑浩淼' },
{ subject: '美术', teacher: '蔡婷婷' },
{ subject: '科学', teacher: '游宝玲' },
{ subject: '劳技', teacher: '牛乐' },
{ subject: '地理', teacher: '沈晓燕' },
{ subject: '音乐', teacher: '李海昆' },
{ subject: '心理', teacher: '展望' },
{ subject: '道德与法治', teacher: '郭雨佳' },
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '劳动', teacher: '牛乐' },
{ subject: '信息科技', teacher: '张颖' },
{ subject: '副班主任', teacher: '展望' },
{ subject: '校本(劳动教育)', teacher: '牛乐' },
{ subject: '体育与健康', teacher: '郑浩淼' },
{ subject: '二外', teacher: '季思飞' },
{ subject: '校本(心理+二外)', teacher: '数字化中心09' },
],
HistoryClassTeachList:[],
// 学生数据
studentTotal: 48,
studentList: [
{ name: '金俊辰', idCard: '' },
{ name: '周泽恒', idCard: '310115201404031836' },
{ name: '杨城宁', idCard: '310115201406110407' },
{ name: '李琪琪', idCard: '310115201403072281' },
{ name: '浦森隽', idCard: '310115201311290011' },
{ name: '沈奕欣', idCard: '310115201402286384' },
{ name: '李赛乐', idCard: '31011520131110037X' },
{ name: '林欣宜', idCard: '310109201403261560' },
{ name: '胡艺涵', idCard: '310115201403251167' },
{ name: '周维哲', idCard: '310115201311182221' },
{ name: '曹维德', idCard: '310115201311182213' },
{ name: '陈茂萌', idCard: '310115201406020516' },
{ name: '施锐朗', idCard: '31011520140412491X' },
{ name: '袁唯格', idCard: '310115201401270022' },
{ name: '徐睿辰', idCard: '310115201406284490' },
{ name: '姚欣蕊', idCard: '310115201402161848' },
{ name: '王立仁', idCard: '310115201312030377' },
{ name: '朱思媛', idCard: '310115201407220026' },
{ name: '李文心', idCard: '310115201312165167' },
{ name: '刘烁恒', idCard: '310115201407273873' },
{ name: '严潇宇', idCard: '310115201312120372' },
{ name: '唐羿', idCard: '310107201401013958' },
{ name: '于楚涵', idCard: '230110201408063729' },
{ name: '肖梦晞', idCard: '340102201401081524' },
{ name: '郑聿铭', idCard: '310114201401071633' },
{ name: '宗柠', idCard: '310115201310094481' },
{ name: '张子煜', idCard: '310115201401292619' },
{ name: '刘孜宸', idCard: '430602201312280205' },
{ name: '潘思羽', idCard: '310115201312310280' },
],
HistoryClassStudentList: [],
// 分页配置
needPage: false,
@@ -170,66 +98,132 @@
total: 0
}
},
watch: {
// 切换标签页重新初始化拖拽
activeTab(val) {
if (val === 'teach') {
this.getHistoryClassTeach();
}else{
this.getHistoryClassStudent();
}
}
},
created() {
// 页面初始化:自动选中最后一级第一个班级(2025级(预备) -> 1班)
this.initDefaultSelectTree()
this.loadClassDetail()
this.getClassTree()
},
methods: {
// 默认选中叶子第一个班级
initDefaultSelectTree() {
const schoolNode = this.treeData[0]
const targetGrade = schoolNode.children.find(g => g.title === '2025级(预备)')
if (targetGrade && targetGrade.children.length) {
this.selectedTreeNode = targetGrade.children[0]
this.currentClassName = this.selectedTreeNode.title
this.currentGrade = '2025级'
this.currentGradeShort = '预备'
}
//获取班级树
getClassTree:function(){
const _this = this;
var item={};
_this.$api.get(APIConfig.BschClassSystem.getClassHistoryTree, item, resp => {
if(resp.code==0)
{
this.treeData=resp.data;
if(resp.data.children.length>0){
// 起始节点为 data
const pathArr = _this.getFirstPath(resp.data);
_this.schsystemId=pathArr[pathArr.length-1].schsystemId;
_this.gradeId=pathArr[pathArr.length-1].gradeId+'';
_this.classId=pathArr[pathArr.length-1].classId+'';
_this.selectnodeid=pathArr[pathArr.length-1].id;
_this.getClass();
_this.getHistoryClassTeach();
}
}
});
},
// 树节点点击切换
treeNodeChange(node) {
// 只响应叶子班级节点,过滤年级、学校父节点
if (!node.children || node.children.length === 0) {
this.currentClassName = node.title
this.pageNum = 1
this.loadClassDetail()
}
},
// 加载班级对应任教/学生数据
loadClassDetail() {
console.log('当前选中班级:', this.currentGrade + this.currentClassName)
// 此处可替换后端接口请求
/*
this.$axios.get('/api/class/history', {
params: {
grade: this.currentGrade,
className: this.currentClassName,
tabType: this.activeTab
//获取最后一级的map
getFirstPath(rootNode) {
const path = [];
let cur = rootNode;
while (cur) {
// 存入当前层级关键信息
path.push({
id: cur.id,
name: cur.name,
type: cur.type,
schsystemId:cur.schsystemId,
gradeId:cur.gradeId,
classId:cur.classId,
});
// 有子节点就取第一个,没有就终止
if (cur.children && cur.children.length > 0) {
cur = cur.children[0];
} else {
cur = null;
}
}).then(res => {
this.teachList = res.data.teachList
this.studentList = res.data.studentList
this.studentTotal = res.data.studentTotal
this.total = this.activeTab === 'teach' ? this.teachList.length : this.studentTotal
})
*/
}
return path;
},
// 树形选中切换
treeLink(treeNode) {
this.schsystemId=treeNode.schsystemId;
this.gradeId=treeNode.gradeId?treeNode.gradeId+'':'';
this.classId=treeNode.classId?treeNode.classId+'':'';
this.selectnodeid=treeNode.id;
this.pageNum = 1;
this.getClass();
if (this.activeTab === 'teach') {
this.getHistoryClassTeach();
}else{
this.getHistoryClassStudent();
}
},
//获取班级信息
getClass:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getClass, item, resp => {
if(resp.code==0)
{
this.ClassMap={
gradeName:resp.data.gradeName,
name:resp.data.name,
createDate:resp.data.createDate,
graduate:resp.data.graduate,
majorsName:resp.data.majorsName,
schType:resp.data.schType
};
}
});
},
//获取历史任教信息
getHistoryClassTeach:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassTeach, item, resp => {
if(resp.code==0)
{
this.HistoryClassTeachList=resp.data;
}
});
},
//获取历史学生信息
getHistoryClassStudent:function(){
const _this = this;
var item={
gradeId:_this.gradeId,
classId:_this.classId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassStudent, item, resp => {
if(resp.code==0)
{
this.HistoryClassStudentList=resp.data;
}
});
},
//跳转详情
tolink(item){
this.$router.push({path:'/historySearchDetail'});
this.$router.push({path:'/historySearchDetail?stuId='+item.id});
},
// 分页切换
pageChange(p) {
this.pageNum = p
this.loadClassDetail()
},
sizeChange(size) {
this.pageSize = size
this.pageNum = 1
this.loadClassDetail()
}
}
}
</script>
@@ -246,7 +240,7 @@
/* 左侧树固定宽度+固定高度滚动 */
.left-tree-box {
width: 260px;
width: 220px;
border: 1px solid #e5e7eb;
overflow-y: auto;
flex-shrink: 0;
@@ -262,9 +256,9 @@
/* 顶部班级信息行 */
.top-info-bar {
font-size: 20px;
font-size: 18px;
font-weight: 500;
padding: 8px 0 12px;
padding: 0px 0 12px;
}
.info-item {
margin-right: 30px;
@@ -282,7 +276,7 @@
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 10px 0;
/* padding: 10px 0; */
}
/* 任教方块流式布局 */
+40 -44
View File
@@ -10,64 +10,60 @@
</div>
<Button type="primary" @click="goBack">返回上一级</Button>
</div>
<!-- 时间段+学校班级栏 -->
<div class="time-school-bar">
<span>日期:{{ dateRange }}</span>
<span style="margin-left: 20px;">{{ schoolName }} &nbsp;&nbsp;{{ className }}</span>
</div>
<!-- 科目教师卡片流式容器,超出纵向滚动 -->
<div class="card-scroll-wrap">
<div class="card-container">
<div class="subject-card" v-for="(item, index) in subjectList" :key="index">
<div class="card-title">{{ item.subject }}</div>
<div class="card-teacher">{{ item.teacher }}</div>
<div v-for="(item,index) in HistoryClassTeachByStuIdList" :key="index">
<!-- 时间段+学校班级栏 -->
<div class="time-school-bar">
<span>日期:{{ item.yearDate }}</span>
<span style="margin-left: 20px;">{{ item.schName }} &nbsp;&nbsp;{{ item.gradeName }}</span>
</div>
<!-- 科目教师卡片流式容器,超出纵向滚动 -->
<div class="card-scroll-wrap">
<div class="card-container">
<div class="subject-card" v-for="(itt, index) in item.teach" :key="index">
<div class="card-title">{{ itt.subName }}</div>
<div class="card-teacher">{{ itt.teacherName }}</div>
</div>
</div>
</div>
</div>
</div>
</template>
</template>
<script>
export default {
name: 'StudentTeachDetail',
data() {
return {
// 头部信息
studentName: '朱思媛',
className: '预备1班',
schoolName: '上海市进才中学北校',
dateRange: '2025-07-11~2026-07-15',
studentName:'',
className:'',
// 科目+教师数据源(完全匹配截图)
subjectList: [
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '副班主任', teacher: '未设置' },
{ subject: '语文', teacher: '卫红' },
{ subject: '数学', teacher: '伍芳芳' },
{ subject: '英语', teacher: '俞莉玉' },
{ subject: '体育', teacher: '郑浩淼' },
{ subject: '美术', teacher: '蔡婷婷' },
{ subject: '科学', teacher: '游宝玲' },
{ subject: '劳技', teacher: '牛乐' },
{ subject: '地理', teacher: '沈晓燕' },
{ subject: '音乐', teacher: '李海昆' },
{ subject: '心理', teacher: '展望' },
{ subject: '道德与法治', teacher: '郭雨佳' },
{ subject: '班主任', teacher: '伍芳芳' },
{ subject: '劳动', teacher: '牛乐' },
{ subject: '信息科技', teacher: '张颖' },
{ subject: '副班主任', teacher: '展望' },
{ subject: '校本(劳动教育)', teacher: '牛乐' },
{ subject: '体育与健康', teacher: '郑浩淼' },
{ subject: '二外', teacher: '季思飞' },
{ subject: '校本(心理+二外)', teacher: '数字化中心09' }
]
HistoryClassTeachByStuIdList: []
}
},
created(){
if(this.$route.query.stuId){
this.getHistoryClassTeachByStuId();
}
},
methods: {
//通过学生Id获取历史任教信息
getHistoryClassTeachByStuId:function(){
const _this = this;
var item={
stuId:_this.$route.query.stuId
};
_this.$api.get(APIConfig.BschClassSystem.getHistoryClassTeachByStuId, item, resp => {
if(resp.code==0)
{
this.studentName=resp.data.stuName;
this.className=resp.data.className;
this.HistoryClassTeachByStuIdList=resp.data.classTeachs;
}
});
},
// 返回上一页
goBack() {
this.$router.go(-1)
-1
View File
@@ -5,7 +5,6 @@
</div>
<!-- 表格 -->
<Table
border
:columns="tableColumns"
:data="yeartermlist"
stripe
-1
View File
@@ -87,7 +87,6 @@
<div class="table-scroll-box" ref="tableBoxRef">
<Table
border
stripe
:columns="majorColumns"
:data="majorTableData"
+29 -23
View File
@@ -33,7 +33,6 @@
<!-- 表格容器:自适应剩余高度滚动 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -157,9 +156,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -202,9 +201,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas2.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas2.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas2.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas2.fileName" style="margin-bottom:10px">
<div v-if="UpParmas2.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas2.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -385,14 +384,14 @@
// 新增学生表单
addForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', pwd:'' },
// 编辑学生表单
editForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', id:null,stuId:0,status:1 },
editForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', id:null,stuId:0,status:0 },
// 调班弹窗
currentSelectClass: '',
targetClass: '',
// 异动弹窗
currentStuName: '',
selectedStatus: 1,
selectedStatus: 0,
studentabnormallist: [],
formRules: {
grade: [{ required: true, message: '请选择年级', trigger: 'change' }],
@@ -408,8 +407,8 @@
uploadHeader() { //附件上传header
let config = {};
if (localStorage.getItem("currentRole")) {
let currentRole = localStorage.getItem("currentRole");
config["currentRole"] = currentRole;
let currentRole = localStorage.getItem("currentRole");
config["currentRole"] = currentRole;
}
return config;
},
@@ -502,13 +501,13 @@
// 初始化表格列 配置式columns
initTableColumn() {
this.tableColumns = [
{type: 'selection',width: 55,align: 'center'},
{type: 'selection',width: 60,align: 'center'},
{ title: '姓名', key: 'name', align: 'center' },
{ title: '用户名', key: 'account', align: 'center' },
{ title: '学号', key: 'stuClassNo', align: 'center', width: 140 },
{ title: '身份证', key: 'idCard', align: 'center' },
{ title: '学号', key: 'stuClassNo', align: 'center', width: 120 },
{ title: '身份证', key: 'idCard', align: 'center', minWidth: 130 },
{ title: '班级', key: 'className', align: 'center' },
{ title: '状态', key: 'statusName', align: 'center', width: 90 },
{ title: '状态', key: 'statusName', align: 'center', width: 80 },
{
title: '操作',
align: 'center',
@@ -593,7 +592,7 @@
account:this.addForm.account,
pwd:this.addForm.pwd,
stuId:0,
status:1
status:0
}
const url = APIConfig.BschClassSystem.studentsave;
this.$api.post(url, JSON.stringify(newItem), resp => {
@@ -684,7 +683,7 @@
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.loadData()
@@ -718,16 +717,23 @@
}
},
//按照学生学号导入
openStuIdImportModal() { this.stuIdImportModalVisible = true },
openStuIdImportModal() {
this.UpParmas2.datapre={
schsystemId:this.schsystemId,
gradeId:this.gradeId,
classId:this.classId
};
this.stuIdImportModalVisible = true
},
//导入成功返回
importFil2(response, file, fileList){
importFile2(response, file, fileList){
const _this=this;
console.log(response);
console.log(file);
_this.spinShow=false;
_this.UpParmas2.fileName=file.name;
_this.UpParmas2.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.loadData()
@@ -745,7 +751,7 @@
if (localStorage.getItem("currentRole")) {
let currentRole = localStorage.getItem("currentRole");
let { schId, roleId, userId, childId } = JSON.parse(decodeURIComponent(currentRole));
var url=APIConfig.BschClassSystem.studentClassNoTemplate+'?schId='+schId;
var url=APIConfig.BschClassSystem.studentClassNoTemplate+'?schId='+schId+'&schsystemId='+this.schsystemId+'&gradeId='+this.gradeId+'&classId='+this.classId;
window.location.href=url;
}else{
this.$Message.info('获取不了学校!');
@@ -813,7 +819,7 @@
this.changeStatusModalVisible = true;
this.currentStuName = this.selectedRows[0].name;
this.getstudentabnormal();
this.selectedStatus = 1;
this.selectedStatus = 0;
},
submitChangeStatus() {
const newItem = {
@@ -847,7 +853,7 @@
}
/* 左侧树固定高度 */
.left-tree-box {
width: 260px;
width: 220px;
border: 1px solid #e6e6e6;
overflow-y: auto;
flex-shrink: 0;
+102 -98
View File
@@ -32,7 +32,6 @@
<!-- 表格容器:自适应剩余高度滚动 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -144,9 +143,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -174,25 +173,25 @@
<!-- 弹窗4:学号导入 -->
<Modal v-model="stuIdImportModalVisible" title="学生学号导入" width="520">
<div class="main-contents">
<Form ref="UpParmas2.datapre" :model="UpParmas2.datapre" :label-width="100" inline>
<FormItem label="Excel上传:" style="margin-bottom:10px;width:100%;">
<i-input type="text" style="width:90%;" v-model="UpParmas2.fileName" class="import-input" placeholder="未选中任何文件.." readonly></i-input>
<Upload class="fr btn"
:action="UpParmas2.actionUrl"
:data="UpParmas2.datapre"
:show-upload-list="false"
:headers="uploadHeader"
accept=".xls,.xlsx"
:before-upload="handleUpload2"
:on-success="importFile2"
>
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas2.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas2.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas2.listData.code!=0" style="color:green">导入成功!</div>
</FormItem>
<Form ref="UpParmas2.datapre" :model="UpParmas2.datapre" :label-width="100" inline>
<FormItem label="Excel上传:" style="margin-bottom:10px;width:100%;">
<i-input type="text" style="width:90%;" v-model="UpParmas2.fileName" class="import-input" placeholder="未选中任何文件.." readonly></i-input>
<Upload class="fr btn"
:action="UpParmas2.actionUrl"
:data="UpParmas2.datapre"
:show-upload-list="false"
:headers="uploadHeader"
accept=".xls,.xlsx"
:before-upload="handleUpload2"
:on-success="importFile2"
>
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas2.fileName" style="margin-bottom:10px">
<div v-if="UpParmas2.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas2.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
<Alert show-icon>
@@ -339,22 +338,22 @@ export default {
datapre:{},
actionUrl:APIConfig.BschClassSystem.importStudentClassNo,
columns:[
{
title: '行号',
key: 'rows',
align: 'center',
width:'80'
},
{
title: '内容',
key: 'columnValue',
align: 'center',
},
{
title: '错误详情',
key: 'errorMsg',
align: 'center',
}
{
title: '行号',
key: 'rows',
align: 'center',
width:'80'
},
{
title: '内容',
key: 'columnValue',
align: 'center',
},
{
title: '错误详情',
key: 'errorMsg',
align: 'center',
}
],
},
@@ -370,14 +369,14 @@ export default {
// 新增学生表单
addForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', pwd:'' },
// 编辑学生表单
editForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', id:null,stuId:0,status:1 },
editForm: { grade:'', classId:'', name:'', stuClassNo:'', idCard:'', account:'', id:null,stuId:0,status:0 },
// 调班弹窗
currentSelectClass: '',
targetClass: '',
filterschclassselectlist: [],
// 异动弹窗
currentStuName: '',
selectedStatus: 1,
selectedStatus: 0,
studentabnormallist: [],
formRules: {
grade: [{ required: true, message: '请选择年级', trigger: 'change' }],
@@ -393,8 +392,8 @@ export default {
uploadHeader() { //附件上传header
let config = {};
if (localStorage.getItem("currentRole")) {
let currentRole = localStorage.getItem("currentRole");
config["currentRole"] = currentRole;
let currentRole = localStorage.getItem("currentRole");
config["currentRole"] = currentRole;
}
return config;
},
@@ -402,7 +401,7 @@ export default {
created() {
this.getgradeselect();
this.getClassTree();
this.initTableColumn()
this.initTableColumn();
},
methods: {
//获取年级下拉
@@ -410,10 +409,10 @@ export default {
const _this = this;
var item={};
_this.$api.get(APIConfig.BschClassSystem.getgradeselect, item, resp => {
if(resp.code==0)
{
this.gradeselectlist=resp.data;
}
if(resp.code==0)
{
this.gradeselectlist=resp.data;
}
});
},
//获取班级下拉
@@ -423,10 +422,10 @@ export default {
gradeId:_this.enrollYear
};
_this.$api.get(APIConfig.BschClassSystem.getschclassselect, item, resp => {
if(resp.code==0)
{
this.schclassselectlist=resp.data;
}
if(resp.code==0)
{
this.schclassselectlist=resp.data;
}
});
},
//获取学生状态列表
@@ -487,7 +486,7 @@ export default {
this.tableColumns = [
{
type: 'selection',
width: 55,
width: 60,
align: 'center'
},
{ title: '姓名', key: 'name', align: 'center', width: 110 },
@@ -514,12 +513,12 @@ export default {
this.enrollYear=treeNode.enrollYear?treeNode.enrollYear+'':'';
this.classId=treeNode.classId?treeNode.classId+'':'';
this.selectnodeid=treeNode.id;
this.pageNum = 1
this.loadData()
this.pageNum = 1;
this.loadData();
},
// 多选行回调
selectionChange(rows) {
this.selectedRows = rows
this.selectedRows = rows;
},
// 加载列表数据
@@ -576,7 +575,7 @@ export default {
account:this.addForm.account,
pwd:this.addForm.pwd,
stuId:0,
status:1
status:0
}
const url = APIConfig.BschClassSystem.studentsave;
this.$api.post(url, JSON.stringify(newItem), resp => {
@@ -624,7 +623,7 @@ export default {
this.$api.post(url, JSON.stringify(newItem), resp => {
if (resp.code == 0) {
this.$Message.success("编辑保存成功!");
this.editModalVisible = false
this.editModalVisible = false;
this.loadData();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
@@ -636,7 +635,7 @@ export default {
// 批量删除
batchDelete() {
if (!this.selectedRows.length) {
return this.$Message.warning('请先勾选学生')
return this.$Message.warning('请先勾选学生');
}
this.$Modal.confirm({
title: '提示',
@@ -647,8 +646,8 @@ export default {
this.$api.post(url,{}, resp => {
if (resp.code == 0) {
this.$Message.success("删除成功!");
this.selectedRows = []
this.loadData()
this.selectedRows = [];
this.loadData();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
@@ -667,7 +666,7 @@ export default {
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.loadData()
@@ -695,27 +694,32 @@ export default {
UpfileModalcloseclick:function(){
this.importModalVisible=false;
this.UpParmas={
fileName:'',
listData:{},
datapre:{},
fileName:'',
listData:{},
datapre:{},
}
},
//按照学生学号导入
openStuIdImportModal() { this.stuIdImportModalVisible = true },
openStuIdImportModal() {
this.UpParmas2.datapre={
schsystemId:this.schsystemId,
gradeId:this.gradeId,
classId:this.classId
};
this.stuIdImportModalVisible = true;
},
//导入成功返回
importFil2(response, file, fileList){
const _this=this;
console.log(response);
console.log(file);
_this.spinShow=false;
_this.UpParmas2.fileName=file.name;
_this.UpParmas2.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.loadData()
_this.$Message.info('导入成功!');
_this.loadData()
}else{
_this.$Message.info(response.Message);
_this.$Message.info(response.Message);
}
},
//附件上传之前的方法
@@ -723,27 +727,27 @@ export default {
const _this=this;
_this.spinShow=true;
},
MoBanExceldaochu2() {
var _this = this;
if (localStorage.getItem("currentRole")) {
let currentRole = localStorage.getItem("currentRole");
let { schId, roleId, userId, childId } = JSON.parse(decodeURIComponent(currentRole));
var url=APIConfig.BschClassSystem.studentClassNoTemplate+'?schId='+schId;
window.location.href=url;
}else{
this.$Message.info('获取不了学校!');
}
},
//附件上传模态框关闭事件
UpfileModalcloseclick2:function(){
this.stuIdImportModalVisible=false;
this.UpParmas2={
fileName:'',
listData:{},
datapre:{},
}
},
MoBanExceldaochu2() {
var _this = this;
if (localStorage.getItem("currentRole")) {
let currentRole = localStorage.getItem("currentRole");
let { schId, roleId, userId, childId } = JSON.parse(decodeURIComponent(currentRole));
var url=APIConfig.BschClassSystem.studentClassNoTemplate+'?schId='+schId+'&schsystemId='+this.schsystemId+'&gradeId='+this.gradeId+'&classId='+this.classId;
window.location.href=url;
}else{
this.$Message.info('获取不了学校!');
}
},
//附件上传模态框关闭事件
UpfileModalcloseclick2:function(){
this.stuIdImportModalVisible=false;
this.UpParmas2={
fileName:'',
listData:{},
datapre:{},
}
},
//学生转出
batchTransferStudent(){
@@ -783,9 +787,9 @@ export default {
this.$api.post(url, JSON.stringify(newItem), resp => {
if (resp.code == 0) {
this.$Message.success("调班成功!");
this.moveClassModalVisible = false
this.selectedRows = []
this.loadData()
this.moveClassModalVisible = false;
this.selectedRows = [];
this.loadData();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
@@ -798,7 +802,7 @@ export default {
this.changeStatusModalVisible = true;
this.currentStuName = this.selectedRows[0].name;
this.getstudentabnormal();
this.selectedStatus = 1;
this.selectedStatus = 0;
},
submitChangeStatus() {
const newItem = {
@@ -832,7 +836,7 @@ export default {
}
/* 左侧树固定高度 */
.left-tree-box {
width: 260px;
width: 220px;
border: 1px solid #e6e6e6;
overflow-y: auto;
flex-shrink: 0;
+11 -12
View File
@@ -24,18 +24,17 @@
<!-- 表格容器:自适应剩余高度滚动 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
:height="useTableHeight()-12"
:height="useTableHeight()+24"
@on-selection-change="selectionChange"
></Table>
</div>
<!-- 左下角批量删除 + 底部分页固定 -->
<div class="bottom-bar">
<Button type="default" @click="selectedStatus=1;submitChangeStatus()">还原</Button>
<Button type="default" @click="selectedStatus=0;submitChangeStatus()">还原</Button>
<div class="page-right">
<span style="margin-right:12px">共 {{ total }} 条</span>
<Page
@@ -180,13 +179,13 @@
// 初始化表格列 配置式columns
initTableColumn() {
this.tableColumns = [
{type: 'selection',width: 55,align: 'center'},
{ title: '年级', key: 'gradeName', align: 'center' },
{ title: '班级', key: 'className', align: 'center' },
{ title: '姓名', key: 'name', align: 'center', width: 140 },
{ title: '异动详情', key: 'abnormalStatusName', align: 'center' },
{ title: '异动日期', key: 'className', align: 'center' },
{ title: '身份证', key: 'idCard', align: 'center', width: 90 },
{ type: 'selection',width: 60,align: 'center' },
{ title: '年级', key: 'gradeName', align: 'center', minWidth: 80 },
{ title: '班级', key: 'className', align: 'center', minWidth: 80 },
{ title: '姓名', key: 'name', align: 'center', minWidth: 100 },
{ title: '异动详情', key: 'abnormalStatusName', align: 'center', width: 100 },
{ title: '异动日期', key: 'abnormalDate', align: 'center', minWidth: 130 },
{ title: '身份证', key: 'idCard', align: 'center', minWidth: 140 },
{
title: '操作',
align: 'center',
@@ -265,7 +264,7 @@
submitChangeStatus() {
if (!this.selectedRows.length) return this.$Message.warning('请勾选学生');
const newItem = {
abnormalStatus: 1,
abnormalStatus: this.selectedStatus,
stuIds:this.selectedRows.map(a=>a.id)
}
const url = APIConfig.BschClassSystem.studentsetAbnormalStatus;
@@ -295,7 +294,7 @@
}
/* 左侧树固定高度 */
.left-tree-box {
width: 260px;
width: 220px;
border: 1px solid #e6e6e6;
overflow-y: auto;
flex-shrink: 0;
+10 -11
View File
@@ -24,18 +24,17 @@
<!-- 表格容器:自适应剩余高度滚动 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
:height="useTableHeight()-12"
:height="useTableHeight()+24"
@on-selection-change="selectionChange"
></Table>
</div>
<!-- 左下角批量删除 + 底部分页固定 -->
<div class="bottom-bar">
<Button type="default" @click="selectedStatus=1;submitChangeStatus()">还原</Button>
<Button type="default" @click="selectedStatus=0;submitChangeStatus()">还原</Button>
<div class="page-right">
<span style="margin-right:12px">共 {{ total }} 条</span>
<Page
@@ -177,13 +176,13 @@ export default {
// 初始化表格列 配置式columns
initTableColumn() {
this.tableColumns = [
{type: 'selection',width: 55,align: 'center'},
{ title: '年级', key: 'gradeName', align: 'center' },
{ title: '班级', key: 'className', align: 'center' },
{ title: '姓名', key: 'name', align: 'center', width: 140 },
{ title: '异动详情', key: 'abnormalStatusName', align: 'center' },
{ title: '异动日期', key: 'className', align: 'center' },
{ title: '身份证', key: 'idCard', align: 'center', width: 90 },
{ type: 'selection',width: 60,align: 'center' },
{ title: '年级', key: 'gradeName', align: 'center', minWidth: 80 },
{ title: '班级', key: 'className', align: 'center', minWidth: 80 },
{ title: '姓名', key: 'name', align: 'center', minWidth: 100 },
{ title: '异动详情', key: 'abnormalStatusName', align: 'center', width: 100 },
{ title: '异动日期', key: 'abnormalDate', align: 'center', minWidth: 130 },
{ title: '身份证', key: 'idCard', align: 'center', minWidth: 140 },
{
title: '操作',
align: 'center',
@@ -288,7 +287,7 @@ export default {
}
/* 左侧树固定高度 */
.left-tree-box {
width: 260px;
width: 220px;
border: 1px solid #e6e6e6;
overflow-y: auto;
flex-shrink: 0;
+115 -20
View File
@@ -8,9 +8,11 @@
</Col>
<!-- 右侧:学制选择 -->
<Col span="20" class="right-select-wrap" :style="'height:'+(useTableHeight({ isSearch: true, isOperat: true })+160)+'px'">
<div class="select-title">学制选择</div>
<div class="select-title">
学制选择
<Button v-if="selecttype!=2" class="fr" style="margin-right:10px;" type="primary" @click="openAddModal">添加学校</Button>
</div>
<!-- 幼儿园分组 -->
<div class="group-wrap" v-for="(itt,index) in schsystemlist" :key="index">
<div class="group-label">{{ itt.academicStageName }}</div>
@@ -29,27 +31,67 @@
</div>
<div style="margin-bottom:20px;"></div>
<!-- 底部确定按钮 -->
<div class="confirm-btn-wrap" style="position: fixed;bottom: 0;text-align: center;left: 0;right: 0;background: #fff;padding: 10px;border-top: 1px solid #eee;">
<div v-if="selecttype==2" class="confirm-btn-wrap" style="position: fixed;bottom: 0;text-align: center;left: 0;right: 0;background: #fff;padding: 10px;border-top: 1px solid #eee;">
<Button type="primary" style="padding:0px 40px;" @click="handleConfirm">确定</Button>
</div>
</Col>
</Row>
<!-- 新增弹窗 -->
<Modal v-model="addModalVisible" title="添加学校" width="520">
<Form ref="addFormRef" :model="addForm" :rules="formRules" label-width="90">
<FormItem label="学校名称" prop="schname">
<Input size="large" v-model="addForm.schname" placeholder="请输入学校名称" />
</FormItem>
<FormItem label="学制" prop="systemlist">
<treeselect
v-model="addForm.systemlist"
:options="schsystemtree"
:multiple="true"
:disable-branch-nodes="true"
:defaultExpandLevel="Infinity"
:normalizer="node => ({
id: node.id,
label: node.label,
children: node.children ? node.children : undefined
})"
placeholder="请选择学制"
/>
</FormItem>
</Form>
<div slot="footer" align="right">
<Button @click="addModalVisible = false" style="margin-right: 10px">取消</Button>
<Button type="primary" @click="submitAdd">提交</Button>
</div>
</Modal>
</div>
</template>
<script>
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
import myTree from "../components/my_tree";
import { self_viewport } from "@/mixins/self_viewport";
export default {
name: "EduYearSelect",
components: { myTree},
components: { myTree,Treeselect },
data() {
return {
selectedEdu: "",
selectedSchool: null,
treeData: [],
schsystemlist:[],
selectnodeid:0
schsystemtree:[],
selecttype:0,
selectnodeid:1,
addModalVisible:false,
addForm: {
schname:'',
systemlist:[]
},
formRules: {
schname: [{ required: true, message: "请输入学校名称", trigger: "blur" }],
systemlist: [{ required: true, type: 'array', min: 1, message: '请选择学制', trigger: 'change' }]
}
};
},
@@ -68,19 +110,24 @@ export default {
const _this = this;
var item={};
_this.$api.get(APIConfig.BschClassSystem.getGroupTree, item, resp => {
if(resp.code==0)
{
_this.treeData = resp.data;
}else{
_this.treeData=[];
}
if(resp.code==0)
{
_this.treeData = resp.data;
}else{
_this.treeData=[];
}
});
},
//节点点击事件
treeLink(treeNode){
this.selecttype=treeNode.type;
this.selectnodeid=treeNode.id;
if(treeNode.type==2){
this.selectnodeid=treeNode.id;
this.getschsystemlist();
}else{
this.getschsystemlist();
this.$Message.warning("请先选择学校!");
return;
}
},
//获取学校绑定学制列表
@@ -90,15 +137,63 @@ export default {
schId:this.selectnodeid
};
_this.$api.get(APIConfig.BschClassSystem.getschsystemlist, item, resp => {
if(resp.code==0)
{
_this.schsystemlist = resp.data;
}else{
_this.schsystemlist=[];
}
if(resp.code==0)
{
_this.schsystemlist = resp.data;
}else{
_this.schsystemlist=[];
}
});
},
//添加学校
openAddModal() {
this.$nextTick(() => {
this.$refs.addFormRef?.resetFields();
});
this.addForm = {
schname: '',
systemlist: [],
};
this.getselectTree();
this.addModalVisible = true;
},
//获取学制下拉树
getselectTree:function(){
const _this = this;
var item={};
_this.$api.get(APIConfig.BschClassSystem.selectTree, item, resp => {
if(resp.code==0)
{
_this.schsystemtree = resp.data;
}else{
_this.schsystemtree=[];
}
});
},
//提交学制事件
submitAdd() {
this.$refs.addFormRef.validate(valid => {
if (!valid) return;
const form = this.addForm;
const submitData = {
name: form.schname,
groupId:this.selectnodeid,
schsystemIds: form.systemlist
};
const url = APIConfig.BschClassSystem.addSchool;
this.$api.post(url, JSON.stringify(submitData), resp => {
if (resp.code == 0) {
this.$Message.success("添加成功!");
this.addModalVisible = false;
this.getGroupTree();
this.getschsystemlist();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
});
});
},
//选中学制事件
selectEduType(val,index,index2) {
const list = this.schsystemlist[index].academicStageList;
// 先记录当前点击项原本的勾选状态
@@ -162,7 +257,7 @@ export default {
flex-direction: column;
}
.tree-title {
font-size: 22px;
font-size: 20px;
font-weight: 500;
padding: 10px 10px 10px;
border-bottom: 1px solid #eee;
+1 -2
View File
@@ -30,7 +30,6 @@
<!-- 表格滚动容器 -->
<div class="table-scroll-box">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -189,7 +188,7 @@
},
// 表单校验规则
formRules: {
courseCode: [{ required: true, message: '请输入课程代码', trigger: 'blur' }],
// courseCode: [{ required: true, message: '请输入课程代码', trigger: 'blur' }],
courseName: [{ required: true, message: '请输入课程名称', trigger: 'blur' }],
courseType: [{ required: true, message: '请选择课程类别', trigger: 'change' }],
bindMajor: [{ required: true, type: 'array', min: 1, message: '请选择所属专业', trigger: 'change' }],
+1 -1
View File
@@ -144,7 +144,7 @@
const url = APIConfig.BschClassSystem.subjectsave;
this.$api.post(url, JSON.stringify(submitData), resp => {
if (resp.code == 0) {
this.$Message.success("启用成功!");
this.$Message.success(submap.enable?"启用成功!":"禁用成功!");
this.getsubjectlist();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
+1 -1
View File
@@ -1,5 +1,5 @@
<template>
<div class="outer-wrap" style="height:calc(100% - 50px);">
<div class="outer-wrap" style="height:calc(100% - 52px);">
<!-- 顶部标签切换 -->
<Tabs v-model="activeTab" type="line">
<TabPane label="教师信息管理" :name="1"></TabPane>
+4 -5
View File
@@ -32,7 +32,6 @@
<div class="col-bottom-btns">
<Button type="error" @click="delGroup">删除分组</Button>
<Button style="margin-left:8px" @click="editGroup">编辑分组</Button>
<Button type="primary">Primary</Button>
</div>
</div>
@@ -108,9 +107,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -397,7 +396,7 @@
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.getteachssearch();
@@ -16,7 +16,6 @@
<!-- 核心:表格自适应滚动容器 -->
<div class="table-scroll-box">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
+112 -62
View File
@@ -51,7 +51,6 @@
<div class="table-adapt-wrap">
<div class="table-scroll">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -162,9 +161,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -232,7 +231,7 @@
</div>
<div style="margin-top:10px">
<span>移动至:</span>
<Tree :data="treeData" ref="moveGroupTreeRef"></Tree>
<my-tree :treeData="treeData" @on-tree-click="movetreeLink"></my-tree>
</div>
<div slot="footer" align="right">
<Button @click="moveGroupModal = false" style="margin-right:10px">取消</Button>
@@ -306,8 +305,8 @@
<Form ref="statusForm" :model="statusFormData" label-width="120">
<FormItem label="选择设置状态">
<RadioGroup v-model="statusFormData.status">
<Radio label="1">正常</Radio>
<Radio label="0">禁用</Radio>
<Radio label="0">正常</Radio>
<Radio label="1">禁用</Radio>
</RadioGroup>
</FormItem>
</Form>
@@ -340,6 +339,8 @@ export default {
selectnodetitle: '',
selectnodetype:7,
searchKeyword: '',
selectparentId:0,
moveselectnodeid:0,
selectedRows: [],
pageNum: 1,
pageSize: 20,
@@ -367,7 +368,7 @@ export default {
},
tableColumns: [
{ type: 'selection', width: 50 },
{ type: 'selection', width: 60 },
{ title: '序号', type: 'index', align: 'center', width: 70 },
{ title: '教师账号', key: 'account', align: 'center' },
{ title: '教师姓名', key: 'name', align: 'center' },
@@ -471,7 +472,7 @@ export default {
moveGroupTargetName: '',
moveTeacherName: '',
statusFormData: { status: '1' }
statusFormData: { status: '0' }
}
},
mixins: [self_viewport],
@@ -500,6 +501,7 @@ export default {
_this.selectnodeid=resp.data.id;
_this.selectnodetitle=resp.data.name;
_this.selectnodetype=resp.data.type;
_this.selectparentId=resp.data.parentId;
_this.loadData();
}
});
@@ -509,6 +511,8 @@ export default {
this.selectnodeid=treeNode.id;
this.selectnodetitle=treeNode.name;
this.selectnodetype=treeNode.type;
this.editGroupFormData.sort=treeNode.sort;
this.selectparentId=treeNode.parentId;
this.pageNum = 1
this.loadData()
},
@@ -575,7 +579,7 @@ export default {
tel:this.addTeacherFormData.phone,
gender:this.addTeacherFormData.gender,
teaId:0,
status:1
status:0
}
const url = APIConfig.BschClassSystem.teachersave;
this.$api.post(url, JSON.stringify(newItem), resp => {
@@ -636,12 +640,10 @@ export default {
//导入成功返回
importFile(response, file, fileList){
const _this=this;
console.log(response);
console.log(file);
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.getsearcBaseSchClass();
@@ -676,13 +678,17 @@ export default {
},
batchDeleteTeacher() {
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师')
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师');
this.batchDeleteModal = true
},
confirmBatchDelete() {
const idlist = this.selectedRows.map(i => i.id);
const url = APIConfig.BschClassSystem.teacherdelete+idlist.join(',');
this.$api.post(url,{}, resp => {
const url = APIConfig.BschClassSystem.teacherdelete;
let item={
groupId:this.selectnodeid,
ids:idlist.join(',')
};
this.$api.post(url,item, resp => {
if (resp.code == 0) {
this.$Message.success("删除成功!");
this.selectedRows = [];
@@ -695,37 +701,37 @@ export default {
},
// 弹窗打开初始化
openBatchMoveTeacherModal() {
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师')
this.moveTeacherName = this.selectedRows.map(i => i.name).join('、')
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师');
this.moveTeacherName = this.selectedRows.map(i => i.name).join('、');
// 清空数据
this.checkedTreeNodes = []
this.targetGroupList = []
this.checkedTreeNodes = [];
this.targetGroupList = [];
this.$nextTick(() => {
// 清空整棵树所有勾选
const ztree = this.$refs.moveTeacherLeftTree.getZtreeInstance()
ztree.checkAllNodes(false)
const ztree = this.$refs.moveTeacherLeftTree.getZtreeInstance();
ztree.checkAllNodes(false);
})
this.moveTeacherModal = true
this.moveTeacherModal = true;
},
// 右侧点击X删除单条 → 反向取消左侧树勾选
handleDeleteRightItem(delItem, index) {
// 删除右侧数组
this.targetGroupList.splice(index, 1)
this.targetGroupList.splice(index, 1);
// 获取树实例,取消对应节点复选框
const ztree = this.$refs.moveTeacherLeftTree.getZtreeInstance()
const targetNode = ztree.getNodeByParam('id', delItem.id)
const ztree = this.$refs.moveTeacherLeftTree.getZtreeInstance();
const targetNode = ztree.getNodeByParam('id', delItem.id);
if (targetNode) {
ztree.checkNode(targetNode, false, false)
ztree.checkNode(targetNode, false, false);
}
},
// 确定按钮 直接提交
submitMoveTeacher() {
if (this.targetGroupList.length === 0) {
return this.$Message.warning('请至少选择一个目标分组')
return this.$Message.warning('请至少选择一个目标分组');
}
const teacherIdArr = this.selectedRows.map(row => row.id)
const groupIdArr = this.targetGroupList.map(item => item.id)
const teacherIdArr = this.selectedRows.map(row => row.id);
const groupIdArr = this.targetGroupList.map(item => item.id);
// console.log('待移动教师ID', teacherIdArr)
// console.log('目标分组ID', groupIdArr)
@@ -750,8 +756,8 @@ export default {
});
},
batchTransferTeacher() {
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师')
this.transferTeacherModal = true
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师');
this.transferTeacherModal = true;
},
//转出事件
confirmTransferTeacher() {
@@ -770,19 +776,19 @@ export default {
},
openBatchMoveTeacherModal() {
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师')
this.moveTeacherName = this.selectedRows.map(i => i.name).join('、')
this.moveTeacherModal = true
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师');
this.moveTeacherName = this.selectedRows.map(i => i.name).join('、');
this.moveTeacherModal = true;
},
confirmMoveTeacher() {
this.moveTeacherModal = false
this.$Message.success('移动教师成功')
this.moveTeacherModal = false;
this.$Message.success('移动教师成功');
},
openSetStatusModal() {
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师')
this.statusFormData.status = '1'
this.setStatusModal = true
if (!this.selectedRows.length) return this.$Message.warning('请先勾选教师');
this.statusFormData.status = '0';
this.setStatusModal = true;
},
submitSetStatus() {
const idlist = this.selectedRows.map(i => i.id);
@@ -804,17 +810,30 @@ export default {
},
openAddGroupModal() {
if (!this.selectnodeid) return this.$Message.warning('请先选择父分组')
this.addGroupFormData.parentGroupName = this.selectnodetitle
this.addGroupFormData.groupName = ''
this.addGroupFormData.sort = ''
this.addGroupModal = true
if (!this.selectnodeid) return this.$Message.warning('请先选择父分组');
this.addGroupFormData.parentGroupName = this.selectnodetitle;
this.addGroupFormData.groupName = '';
this.addGroupFormData.sort = '';
this.addGroupModal = true;
},
submitAddGroup() {
this.$refs.addGroupForm.validate(valid => {
if (!valid) return;
this.$Message.success('新增分组成功');
this.addGroupModal = false;
let item={
name:this.addGroupFormData.groupName,
parentId:this.selectnodeid,
sort:this.addGroupFormData.sort
};
const url = APIConfig.BschClassSystem.addGroup;
this.$api.post(url,JSON.stringify(item), resp => {
if (resp.code == 0) {
this.$Message.success('新增分组成功');
this.addGroupModal = false;
this.getTeaTree();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
});
})
},
@@ -822,35 +841,66 @@ export default {
if (!this.selectnodeid) return this.$Message.warning('请先选择分组')
this.editGroupIndex = this.selectnodeid;
this.editGroupFormData.groupName = this.selectnodetitle;
this.editGroupFormData.sort = '';
this.editGroupModal = true;
},
submitEditGroup() {
this.$refs.editGroupForm.validate(valid => {
if (!valid) return
this.selectedTreeNode.title = this.editGroupFormData.groupName
this.editGroupModal = false
this.$Message.success('修改分组成功')
if (!valid) return;
let item={
name:this.editGroupFormData.groupName,
id:this.selectnodeid,
parentId:this.selectparentId,
sort:this.editGroupFormData.sort
};
const url = APIConfig.BschClassSystem.editGroup;
this.$api.post(url,JSON.stringify(item), resp => {
if (resp.code == 0) {
this.$Message.success('修改分组成功');
this.editGroupModal = false;
this.getTeaTree();
} else if (resp.code == 4) {
this.$Message.info(resp.msg);
}
});
})
},
openMoveGroupModal() {
if (!this.selectnodeid) return this.$Message.warning('请先选择分组')
this.moveGroupTargetName = this.selectnodetitle
this.moveGroupModal = true
if (!this.selectnodeid) return this.$Message.warning('请先选择分组');
this.moveGroupTargetName = this.selectnodetitle;
this.moveGroupModal = true;
},
// 移动组树形选中切换
movetreeLink(treeNode) {
this.moveselectnodeid=treeNode.id;
},
confirmMoveGroup() {
this.moveGroupModal = false
this.$Message.success('移动分组成功')
let item={
moveId:this.selectnodeid,
pid:this.moveselectnodeid
};
var url=APIConfig.BschClassSystem.moveGroup;
this.$api.post(url,JSON.stringify(item),(resp)=>{
this.moveGroupModal = false;
this.$Message.success('移动分组成功!');
this.getTeaTree();
});
},
delCurrentGroup() {
if (!this.selectnodeid) return this.$Message.warning('请先选择分组')
if (!this.selectnodeid) return this.$Message.warning('请先选择分组');
this.$Modal.confirm({
title: '提示',
content: `确定删除分组【${this.selectedTreeNode.title}】?`,
content: `确定删除分组【${this.selectnodetitle}】?`,
onOk: () => {
this.$Message.success('删除分组成功')
let item={
id:this.selectnodeid
};
var url=APIConfig.BschClassSystem.deleteGroup;
this.$api.post(url,item,(resp)=>{
this.$Message.success('删除分组成功!');
this.getTeaTree();
});
}
})
}
@@ -861,7 +911,7 @@ export default {
<style scoped>
/* 全局布局逐级修复高度 + min-height:0 解决flex塌陷 */
.outer-wrap {
border: 1px solid #e5e7eb;
/* border: 1px solid #e5e7eb; */
border-radius: 4px;
padding: 16px;
width: 100%;
@@ -879,7 +929,7 @@ export default {
min-height: 0; /* 第一层修复 */
}
.tree-sidebar {
width: 250px;
width: 225px;
border: 1px solid #e8e8e8;
display: flex;
flex-direction: column;
+10 -7
View File
@@ -19,7 +19,6 @@
<!-- 关键外层嵌套:强制横向溢出滚动 -->
<div class="table-outer">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -67,9 +66,9 @@
<i-button icon="md-add"></i-button>
</Upload>
</FormItem>
<FormItem v-if="UpParmas.listData.data!=null" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code==0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code!=0" style="color:green">导入成功!</div>
<FormItem v-if="UpParmas.fileName" style="margin-bottom:10px">
<div v-if="UpParmas.listData.code!=0" style="color:red">导入失败,请修改Excel文件中相关数据后再重新上传!</div>
<div v-if="UpParmas.listData.code==0" style="color:green">导入成功!</div>
</FormItem>
</Form>
@@ -133,7 +132,7 @@ export default {
fileName:'',
listData:{},
datapre:{},
actionUrl:APIConfig.BschClassSystem.teacherImport,
actionUrl:APIConfig.BschClassSystem.importTeach,
columns:[
{
title: '行号',
@@ -447,6 +446,10 @@ export default {
this.getteachssearch();
},
handleBatchImport() {
this.UpParmas.datapre={
schsystemId: this.majorVal,
gradeId: this.gradeVal
}
this.importModalVisible = true;
},
//导入成功返回
@@ -457,12 +460,12 @@ export default {
_this.spinShow=false;
_this.UpParmas.fileName=file.name;
_this.UpParmas.listData=response;
if(response.State)
if(response.code==0)
{
_this.$Message.info('导入成功!');
_this.getteachssearch();
}else{
_this.$Message.info(response.Message);
_this.$Message.info(response.msg);
}
},
//附件上传之前的方法
+24 -10
View File
@@ -23,14 +23,12 @@
v-model="searchName"
/>
</span>
</div>
</div>
<!-- 自适应滚动表格容器 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -41,7 +39,8 @@
<!-- 底部栏:转入按钮 + 固定分页 -->
<div class="bottom-bar">
<Button type="default" status="danger" @click="openTransferModal">转入</Button>
<div>&nbsp;</div>
<!-- <Button type="default" status="danger" @click="openTransferModal">转入</Button> -->
<div class="page-area">
<span style="margin-right: 12px">共 {{ total }} 条</span>
<Page
@@ -140,6 +139,7 @@
if(resp.code==0)
{
_this.groupSelectBySchIdlList = resp.data;
_this.handleFilterChange();
}else{
_this.groupSelectBySchIdlList=[];
}
@@ -148,12 +148,23 @@
// 初始化配置式表格列
initTableColumn() {
this.tableColumns = [
{ type: 'selection', width: 55, align: 'center' },
// { type: 'selection', width: 55, align: 'center' },
{ title: '序号', type: 'index', align: 'center', width: 70 },
{ title: '学校', key: 'schName', align: 'center' },
{ title: '学科组', key: 'groupNames', align: 'center', width: 110 },
{ title: '教师姓名', key: 'name', align: 'center' },
{ title: '身份证', key: 'idCard', align: 'center' },
{
title: '操作',
align: 'center',
width: 100,
render: (h, params) => {
return h('Button', {
props: { type: 'text' },
on: { click: () => this.openTransferModal(params.row) }
},'转入')
}
}
]
},
@@ -206,10 +217,11 @@
},
// 打开转入弹窗
openTransferModal() {
if (!this.selectedRows.length) {
return this.$Message.warning('请先勾选需要转入的教师')
}
openTransferModal(row) {
// if (!this.selectedRows.length) {
// return this.$Message.warning('请先勾选需要转入的教师')
// }
this.selectedRows=[row];
this.moveTeacherName=this.selectedRows.map(a=>a.name).join(',');
this.transferModalVisible = true
this.getTeaTree();
@@ -234,9 +246,11 @@
if (!this.selectnodeid) {
return this.$Message.warning('请选择目标分组')
}
const teacherIdArr = this.selectedRows.map(row => row.schId+'_'+row.teaId);
const teaIdArr = this.selectedRows.map(row => row.teaId);
const schIdArr = this.selectedRows.map(row => row.schId);
let item={
schTeaIds:teacherIdArr,
teaId:teaIdArr.join(','),
schId:schIdArr.join(','),
transferGroupId:this.selectnodeid
};
const url = APIConfig.BschClassSystem.setTransferIn;
+1 -1
View File
@@ -1,7 +1,7 @@
<template>
<div style="height:100%;">
<Christianity v-if="type==1"></Christianity>
<HigherEducation v-if="type==2"></HigherEducation>
<Christianity v-if="type==2"></Christianity>
</div>
</template>
+22 -8
View File
@@ -36,7 +36,6 @@
<!-- 自适应滚动表格容器 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -47,7 +46,8 @@
<!-- 底部栏:转入按钮 + 固定分页 -->
<div class="bottom-bar">
<Button type="default" status="danger" @click="openMoveModal">转入</Button>
<!-- <Button type="default" status="danger" @click="openMoveModal">转入</Button> -->
<div>&nbsp;</div>
<div class="page-area">
<span style="margin-right: 12px">共 {{ total }} 条</span>
<Page
@@ -132,6 +132,7 @@ export default {
if(resp.code==0)
{
_this.SchoolList = resp.data;
_this.handleFilterChange();
}else{
_this.SchoolList=[];
}
@@ -147,6 +148,7 @@ export default {
if(resp.code==0)
{
_this.gradeselectList = resp.data;
_this.handleFilterChange();
}else{
_this.gradeselectList=[];
}
@@ -169,13 +171,24 @@ export default {
// 初始化表格列
initTableColumn() {
this.tableColumns = [
{ type: 'selection', width: 55, align: 'center' },
// { type: 'selection', width: 55, align: 'center' },
{ title: '序号', type: 'index', align: 'center', width: 70 },
{ title: '学校', key: 'schName', align: 'center' },
{ title: '年级', key: 'gradeName', align: 'center', width: 110 },
{ title: '班级', key: 'className', align: 'center', width: 90 },
{ title: '姓名', key: 'name', align: 'center' },
{ title: '身份号', key: 'idCard', align: 'center' },
{
title: '操作',
align: 'center',
width: 100,
render: (h, params) => {
return h('Button', {
props: { type: 'text' },
on: { click: () => this.openMoveModal(params.row) }
},'转入')
}
}
]
},
@@ -229,10 +242,11 @@ export default {
},
// 打开转入弹窗
openMoveModal() {
if (!this.selectedRows.length) {
return this.$Message.warning('请先勾选需要转入的学生')
}
openMoveModal(row) {
// if (!this.selectedRows.length) {
// return this.$Message.warning('请先勾选需要转入的学生')
// }
this.selectedRows=[row];
this.moveStuName = this.selectedRows.map(a=>a.name).join(',');
this.moveModalVisible = true;
this.getClassTree();
@@ -259,7 +273,7 @@ export default {
}
const teacherIdArr = this.selectedRows.map(row => row.id);
let item={
stuIds:teacherIdArr,
stuId:teacherIdArr.join(','),
transferClassId:this.selectnodeid
};
const url = APIConfig.BschClassSystem.studentsetTransferIn;
+1 -2
View File
@@ -43,7 +43,6 @@
<!-- 自适应滚动表格容器 -->
<div class="table-scroll-wrap">
<Table
border
stripe
:columns="tableColumns"
:data="tableData"
@@ -154,7 +153,7 @@ export default {
// 初始化表格列
initTableColumn() {
this.tableColumns = [
{ type: 'selection', width: 55, align: 'center' },
{ type: 'selection', width: 60, align: 'center' },
{ title: '序号', key: 'serial', align: 'center', width: 70 },
{ title: '学校', key: 'school', align: 'center' },
{ title: '年级', key: 'grade', align: 'center', width: 110 },