| | |
| | | ## 内置功能 |
| | | |
| | | 1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 |
| | | 2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 |
| | | 2. 部门管理:配置系统组织机构(单位、部门、小组),树结构展现支持数据权限。 |
| | | 3. 岗位管理:配置系统用户所属担任职务。 |
| | | 4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 |
| | | 5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 |
| | |
| | | |
| | | ## 若依前后端分离交流群 |
| | | |
| | | QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) 点击按钮入群。 |
| | | QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) 点击按钮入群。 |
| | |
| | | <h1>请升级您的浏览器,以便我们更好的为您提供服务!</h1> |
| | | <p>您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。</p> |
| | | <hr> |
| | | <h2>请注意:微软公司对Windows XP 及 Internet Explorer 早期版本的支持已经结束</h2> |
| | | <h2>请注意:微软单位对Windows XP 及 Internet Explorer 早期版本的支持已经结束</h2> |
| | | <p>自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 <a href="https://www.microsoft.com/zh-cn/WindowsForBusiness/End-of-IE-support">微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明</a> 。</p> |
| | | <hr> |
| | | <h2>您可以选择更先进的浏览器</h2> |
| | |
| | | </ul> |
| | | <hr> |
| | | </body> |
| | | </html> |
| | | </html> |
| | |
| | | }) |
| | | } |
| | | |
| | | //企业课时变更记录列表(分页) |
| | | //单位课时变更记录列表(分页) |
| | | export function getCompanyPeriod(param) { |
| | | return request({ |
| | | url: '/company-period/list', |
| | |
| | | { |
| | | path: 'company', |
| | | name: 'company', |
| | | meta: { title: '企业管理',icon: 'list'} |
| | | meta: { title: '单位管理',icon: 'list'} |
| | | } , |
| | | { |
| | | path: 'user', |
| | |
| | | path: 'company', |
| | | component: () => import('@/views/onlineEducation/systemManage/company/index.vue'), |
| | | name: 'company', |
| | | meta: { title: '企业管理',icon: 'form'} |
| | | meta: { title: '单位管理',icon: 'form'} |
| | | }, |
| | | { |
| | | path: 'user', |
| | |
| | | // // export default () => { |
| | | // // Vue.directive('selectScroll', { |
| | | // // bind (el, binding) { |
| | | // // // 如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到企业类型下的select框,所以,我通过传参控制了监听的哪个select框 |
| | | // // // 如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到单位类型下的select框,所以,我通过传参控制了监听的哪个select框 |
| | | // // var className = '.' + binding.arg |
| | | // // el.className = binding.arg |
| | | // // // 获取滚动页面DOM |
| | |
| | | // |
| | | // const selectScroll: Directive = { |
| | | // beforeMount(el: any, binding: DirectiveBinding) { |
| | | // // 如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到企业类型下的select框,所以,我通过传参控制了监听的哪个select框 |
| | | // // 如上图,我通过v-if来控制了两个select框,当没有binding.arg这个参数时,我只能监听到单位类型下的select框,所以,我通过传参控制了监听的哪个select框 |
| | | // const className = '.' + binding.arg; |
| | | // el.className = binding.arg |
| | | // // 获取滚动页面DOM |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > |
| | | <el-form-item label="所属公司:" prop="companyName" v-if="!state.isAdmin"> |
| | | <el-form-item label="所属单位:" prop="companyName" v-if="!state.isAdmin"> |
| | | <el-input v-model.trim="state.form.companyName" disabled></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="批次名称:" prop="name"> |
| | |
| | | </el-form-item> |
| | | </el-form> |
| | | <span v-if="!data.isAdmin" style="font-size: 19px;font-weight: 600;margin-right: 20px"> |
| | | {{data.companyName}},您的企业当前系统可用课时总计 |
| | | {{data.companyName}},您的单位当前系统可用课时总计 |
| | | <span style="font-size: 19px;font-weight: 600;color: #1ab394">{{data.remainPeriod}}</span> 分钟。<span @click="openDetail" style="cursor: pointer; font-size: 19px;font-weight: 600;color: #1890ff">[明细]</span> |
| | | </span> |
| | | </div> |
| | |
| | | <el-table-column label="批次编号" prop="code" align="center" width="135" /> |
| | | <el-table-column label="创建时间" prop="createTime" align="center" width="120" /> |
| | | <el-table-column label="批次名称" prop="name" align="center" /> |
| | | <el-table-column label="创建企业" prop="companyName" align="center" /> |
| | | <el-table-column label="创建单位" prop="companyName" align="center" /> |
| | | <el-table-column label="批次级别" prop="level" align="center" > |
| | | <template #default="scope"> |
| | | <span>{{scope.row.level === 1 ? '单位级' : scope.row.level === 2 ? '学院级' : scope.row.level === 3 ? '实验室级' : '其他' }}</span> |
| | |
| | | return { |
| | | ...item, |
| | | coursePeriodNum: item.coursePeriod ? (item.coursePeriod /60).toFixed(2).replace(/\.00$/, '') + '分钟':'', |
| | | finishRate: item.finishCount ? item.finishCount ===0 && item.studentCount ===0 ? '0%': (item.finishCount / item.studentCount).toFixed(2) *100 + '%' : '' |
| | | finishRate: item.finishCount ? item.finishCount ===0 && item.studentCount ===0 ? '0%': ((item.finishCount / item.studentCount)*100).toFixed(2).replace(/\.00$/, '') + '%' : '' |
| | | } |
| | | }) |
| | | data.total = res.data.total |
| | |
| | | <div class="app-container"> |
| | | <div> |
| | | <el-form style="display: flex;flex-wrap: wrap"> |
| | | <el-form-item label="企业:" v-if="state.isAdmin"> |
| | | <el-form-item label="单位:" v-if="state.isAdmin"> |
| | | <el-select |
| | | v-model="state.queryParams.companyName" |
| | | filterable |
| | | remote |
| | | @change="selectValue" |
| | | reserve-keyword |
| | | placeholder="请输入企业名称" |
| | | placeholder="请输入单位名称" |
| | | remote-show-suffix |
| | | :remote-method="getCompanyList" |
| | | :loading="loadingCompany" |
| | |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="state.dataList" :border="true" row-key="id"> |
| | | <el-table-column label="序号" type="index" align="center" width="80" /> |
| | | <el-table-column label="企业名称" prop="companyName" align="center" /> |
| | | <el-table-column label="企业编号" prop="companyCode" align="center" /> |
| | | <el-table-column label="单位名称" prop="companyName" align="center" /> |
| | | <el-table-column label="单位编号" prop="companyCode" align="center" /> |
| | | <el-table-column label="总批次/人数" prop="sort" align="center" > |
| | | <template #default="scope"> |
| | | <span>{{scope.row.phaseStudentCount && scope.row.phaseCount ? scope.row.phaseCount + '/' +scope.row.phaseStudentCount:''}}</span> |
| | |
| | | state.dataList = res.data.list.map(item => { |
| | | return { |
| | | ...item, |
| | | passRate: item.passStudentCount && item.paperStudentCount ? (item.passStudentCount / item.paperStudentCount).toFixed(2) *100 + '%': item.passStudentCount == 0 && item.paperStudentCount == 0? '0%': '' |
| | | passRate: item.passStudentCount && item.paperStudentCount ? ((item.passStudentCount / item.paperStudentCount)*100).toFixed(2).replace(/\.00$/, '') + '%': item.passStudentCount == 0 && item.paperStudentCount == 0? '0%': '' |
| | | |
| | | } |
| | | }) |
| | |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="编号" prop="code" align="center" width="135" /> |
| | | <el-table-column label="考试名称" prop="name" align="center" /> |
| | | <el-table-column label="企业名称" prop="companyName" align="center" /> |
| | | <el-table-column label="单位名称" prop="companyName" align="center" /> |
| | | <el-table-column label="创建账户" prop="createBy" align="center" /> |
| | | <el-table-column label="科目/类别" prop="categoryName" align="center" /> |
| | | <el-table-column label="完成人数/总人数" prop="" align="center" width="135"> |
| | |
| | | data.dataList = res.data.list.map(item => { |
| | | return { |
| | | ...item, |
| | | passRate: item.paperStudentInfoVO.passStudentCount ===0 && item.paperStudentInfoVO.studentCount ===0 ? '0%': (item.paperStudentInfoVO.passStudentCount / item.paperStudentInfoVO.studentCount).toFixed(2) *100 + '%', |
| | | passRate: item.paperStudentInfoVO.passStudentCount ===0 && item.paperStudentInfoVO.studentCount ===0 ? '0%': ((item.paperStudentInfoVO.passStudentCount / item.paperStudentInfoVO.studentCount)*100).toFixed(2).replace(/\.00$/, '') + '%', |
| | | deadlineNum: item.deadline ? item.deadline.slice(0,10) : '' |
| | | } |
| | | }) |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="180px" > |
| | | <el-form-item label="企业名称:" prop="companyName" > |
| | | <el-form-item label="单位名称:" prop="companyName" > |
| | | <el-select |
| | | v-if="state.isAdmin" |
| | | v-model="state.form.companyName" |
| | |
| | | |
| | | }, |
| | | formRules:{ |
| | | companyName: [{ required: true, message: '请输入企业名称', trigger: 'blur' }], |
| | | companyName: [{ required: true, message: '请输入单位名称', trigger: 'blur' }], |
| | | planName: [{ required: true, message: '请输入计划名称', trigger: 'blur' }], |
| | | studentName: [{ required: true, message: '请选择学员', trigger: 'blur' }], |
| | | level: [{ required: true, message: '请输入培训等级', trigger: 'blur' }], |
| | |
| | | @click="openDialog('add',{})" |
| | | >新增登记</el-button> |
| | | </el-form-item> |
| | | <el-form-item label="企业名称:" > |
| | | <el-input v-model="data.queryParams.companyName" placeholder="请输入企业名称"></el-input> |
| | | <el-form-item label="单位名称:" > |
| | | <el-input v-model="data.queryParams.companyName" placeholder="请输入单位名称"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="课程名称:" > |
| | | <el-input v-model="data.queryParams.courseName" placeholder="请输入课程名称"></el-input> |
| | |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="序号" type="index" align="center" width="80" /> |
| | | <el-table-column label="企业名称" prop="companyName" align="center" /> |
| | | <el-table-column label="单位名称" prop="companyName" align="center" /> |
| | | <el-table-column label="计划名称" prop="planName" align="center" /> |
| | | <el-table-column label="学员姓名" prop="studentName" align="center"> |
| | | <template #default="scope"> |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="180px" > |
| | | <el-form-item label="企业:" prop="companyName" v-if="state.title !== '修改密码'"> |
| | | <el-form-item label="单位:" prop="companyName" v-if="state.title !== '修改密码'"> |
| | | <el-input v-model.trim="state.form.companyName" disabled></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="姓名:" prop="name" v-if="state.title !== '修改密码'"> |
| | |
| | | } |
| | | checkStuIdNo(param).then((res)=>{ |
| | | if(res.data.status == 1){ |
| | | callback(new Error('身份证号在该企业已被占用,请更换其他身份证号')) |
| | | callback(new Error('身份证号在该单位已被占用,请更换其他身份证号')) |
| | | }else if(res.data.status == 2){ |
| | | if(state.title == '新增'){ |
| | | ElMessageBox.confirm( |
| | | `该人员 ${state.form.name} (身份证号: ${state.form.idNo} )与 ${res.data.companyName} 已经绑定,确定将该人员的责任归属变更到贵公企业?`, |
| | | `该人员 ${state.form.name} (身份证号: ${state.form.idNo} )与 ${res.data.companyName} 已经绑定,确定将该人员的责任归属变更到贵公单位?`, |
| | | '提示', |
| | | { |
| | | confirmButtonText: '确认', |
| | |
| | | }) |
| | | }) |
| | | }else { |
| | | callback(new Error('身份证号在其他企业已被占用,请更换身份证号')) |
| | | callback(new Error('身份证号在其他单位已被占用,请更换身份证号')) |
| | | } |
| | | }else { |
| | | callback() |
| | |
| | | {{scope.row.trainType == 2 ? scope.row.name : ''}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="所在公司" prop="companyName" align="center"/> |
| | | <el-table-column label="所在单位" prop="companyName" align="center"/> |
| | | </el-table> |
| | | </el-dialog> |
| | | </div> |
| | |
| | | |
| | | const openDialog = (type, value) => { |
| | | if(type == 'add' && data.isAdmin){ |
| | | ElMessage.warning('监管学院请联系企业创建企业学员') |
| | | ElMessage.warning('监管学院请联系单位创建单位学员') |
| | | } |
| | | // else if(userType.value !== 3 && (type == 'add' || type == 'edit')) { |
| | | // ElMessage.warning(' 只有实验室级用户才能新增和编辑') |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > |
| | | <el-form-item label="所属公司:" prop="companyName" v-if="!state.isAdmin"> |
| | | <el-form-item label="所属单位:" prop="companyName" v-if="!state.isAdmin"> |
| | | <el-input v-model.trim="state.form.companyName" disabled></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="题库名称:" prop="name"> |
| | |
| | | :close-on-click-modal="false" |
| | | > |
| | | <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" > |
| | | <el-form-item label="企业信用代码:" prop="creditCode" v-if="title!=='分配课时'"> |
| | | <el-input v-model.trim="state.form.creditCode" placeholder="请输入企业信用代码"></el-input> |
| | | <el-form-item label="单位信用代码:" prop="creditCode" v-if="title!=='分配课时'"> |
| | | <el-input v-model.trim="state.form.creditCode" placeholder="请输入单位信用代码"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="企业名称:" prop="name" v-if="title!=='分配课时'"> |
| | | <el-input v-model.trim="state.form.name" placeholder="请输入企业名称"></el-input> |
| | | <el-form-item label="单位名称:" prop="name" v-if="title!=='分配课时'"> |
| | | <el-input v-model.trim="state.form.name" placeholder="请输入单位名称"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="负责人:" prop="major" v-if="title!=='分配课时'"> |
| | | <el-input v-model.trim="state.form.major" placeholder="请输入负责人"></el-input> |
| | |
| | | |
| | | const validateName = (rule, value, callback)=>{ |
| | | if(value === ''){ |
| | | callback(new Error('请输入企业名称')) |
| | | callback(new Error('请输入单位名称')) |
| | | }else if(title.value === '编辑' && value === startUsername.value){ |
| | | callback() |
| | | }else{ |
| | |
| | | } |
| | | checkName(param).then((res)=>{ |
| | | if(res.data == false){ |
| | | callback(new Error('企业名称已被占用,请更换其他名称')) |
| | | callback(new Error('单位名称已被占用,请更换其他名称')) |
| | | }else{ |
| | | callback() |
| | | } |
| | |
| | | totalPeriod: '' |
| | | }, |
| | | formRules:{ |
| | | creditCode: [{ required: true, message: '请输入企业信用代码', trigger: 'blur' }], |
| | | creditCode: [{ required: true, message: '请输入单位信用代码', trigger: 'blur' }], |
| | | major:[{ required: true, message: '请输入负责人', trigger: 'blur' }], |
| | | remainPeriod:[{ required: true, message: '请输入剩余课时', trigger: 'blur' }], |
| | | spendPeriod:[{ required: true, message: '请输入已用课时', trigger: 'blur' }], |
| | |
| | | @click="openDialog('add',{})" |
| | | >新增</el-button> |
| | | </el-form-item> |
| | | <el-form-item label="企业名称:" > |
| | | <el-input v-model="data.queryParams.name" placeholder="请输入企业名称"></el-input> |
| | | <el-form-item label="单位名称:" > |
| | | <el-input v-model="data.queryParams.name" placeholder="请输入单位名称"></el-input> |
| | | </el-form-item> |
| | | <el-form-item > |
| | | <el-button |
| | |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="序号" type="index" align="center" width="80" /> |
| | | <el-table-column label="企业信用代码" prop="creditCode" align="center" /> |
| | | <el-table-column label="企业名称" prop="name" align="center" /> |
| | | <el-table-column label="单位信用代码" prop="creditCode" align="center" /> |
| | | <el-table-column label="单位名称" prop="name" align="center" /> |
| | | <el-table-column label="负责人" prop="major" align="center" /> |
| | | <el-table-column label="联系电话" prop="phone" align="center"/> |
| | | <el-table-column label="当前剩余课时(分)" prop="remainPeriodMin" align="center" width="150" /> |
| | |
| | | remote |
| | | @change="selectValue" |
| | | reserve-keyword |
| | | placeholder="请输入企业名称" |
| | | placeholder="请输入单位名称" |
| | | remote-show-suffix |
| | | :remote-method="getCompanyList" |
| | | :loading="loading" |
| | |
| | | }, |
| | | formRules:{ |
| | | name: [{ required: true, message: '请输入学院、实验室名称称', trigger: 'blur' }], |
| | | companyName: [{ required: true, message: '请选择上级企业', trigger: 'blur' }], |
| | | companyName: [{ required: true, message: '请选择上级单位', trigger: 'blur' }], |
| | | username: [{ required: true, trigger: "blur", validator: validateUsername }], |
| | | password: [{ required: true, validator: validatePwd, trigger: 'blur' }], |
| | | confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], |