diff --git a/README.md b/README.md index 9ceda3c1e8e31cd7624bea3406ee6ab39715ed27..c3b52bcce4de2955affa55e5befa43babf54bf7c 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,51 @@ -# hmmm-complete - -## Project setup -``` -npm install -``` - -### Compiles and hot-reloads for development -``` -npm run serve -``` - -### Compiles and minifies for production -``` -npm run build -``` - -### Lints and fixes files -``` -npm run lint -``` - -### Customize configuration -See [Configuration Reference](https://cli.vuejs.org/config/). - - -### remove git hook -```json -, - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.{js,jsx,vue}": [ - "vue-cli-service lint", - "git add" - ] - } -``` +# 黑马面面项目实战 +### 一、项目模块介绍: + +### 功能模块 + +| 序号 | 模块 | 子模块 | 描述 | +| ---- | -------- | -------- | ------------------------------------------------------------ | +| 1 | 题库管理 | 基础题库 | 可查看题库中的基础题库,可完成新增、批量导入、筛选、预览、修改、删除、加入精选操作。 | +| 2 | | 精选题库 | 可查看题库中的精选题库,可完成试题的新增、批量导入、筛选、预览、审核、修改、删除、状态修改 | +| 3 | | 试题录入 | 可通过学科、方向等条件完成试题的添加,试题添加分为单选、多选、简答三个类型,每种题型可分为一般、简单、困难。 | +| 4 | | 组题列表 | 该列表中显示的所有模拟面试的组题结果,会将用户每次的组题全部进行保存,并显示用户对该套试卷的完成情况。 | +| 5 | 学科管理 | 学科管理 | 可查看平台中已经录入学科,可完成学科的增删改查操作同时提供学科下二级目录、标签管理的入口。 | +| 6 | | 目录管理 | 可查看平台中所有面试题的分类目录,目录归属于学科下,通过学科中的目录管理进行管理 | +| 7 | | 标签管理 | 管理题库中试题的标签,标签归属学科下,不同学科的标签不可混用,添加时仅可使用本学科下的标签 | +| 8 | 面试技巧 | 文章列表 | 显示管理元提交的所有面试技巧文章或视频,通过输入文章标题 正文或视频地址完成对面试技巧的添加 | +| %%% | %%%%% | %%%%% | | + +### 二、人员分工: + +#### 题库管理: + +**陶表力:** + + 基础题库 (basics) + +精选题库 (choiceness) + +**胡腾辉:** + +试题录入(questions) + +组题列表(pleaselist) + +#### 学科管理: + +**杨凯华:** + +学科(subject) + +目录(catalogue) + +**刘会刚:** + +标签(tag) + +#### **面试技巧:** + +**周康** + +面试技巧(interview) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6fae16edff6930c1317eb8e1043e808ae07ccfbe..4a2394ba326d508e9a4f322be7d9fef05d5ce7d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3467,6 +3467,14 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "cos-js-sdk-v5": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/cos-js-sdk-v5/download/cos-js-sdk-v5-1.3.4.tgz", + "integrity": "sha512-+bEfiehZJ9ZnYG+uE4emKFqQovmt7058wG2OrZ8mrpftXikNm1kiYvqSEKXRImveYhhcKsFFmoxW6tBgGVt+aw==", + "requires": { + "xmldom": "^0.1.31" + } + }, "cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npm.taobao.org/cosmiconfig/download/cosmiconfig-5.2.1.tgz?cache=0&sync_timestamp=1572710682964&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcosmiconfig%2Fdownload%2Fcosmiconfig-5.2.1.tgz", @@ -13241,6 +13249,11 @@ "async-limiter": "~1.0.0" } }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmmirror.com/xmldom/download/xmldom-0.1.31.tgz", + "integrity": "sha1-t2yaG9nwqXN+WnLcNyMc84N14v8=" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index e7e2f0f9bf30da033844035aa197592959a61a1d..dfab4e6dfedcc539c0e4da325e423882a54942a0 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "axios": "^0.19.2", "core-js": "^3.6.4", + "cos-js-sdk-v5": "^1.3.4", "echarts": "^4.6.0", "element-ui": "^2.13.0", "font-awesome": "^4.7.0", diff --git a/src/module-hmmm/components/questions-uploadImg.vue b/src/module-hmmm/components/questions-uploadImg.vue new file mode 100644 index 0000000000000000000000000000000000000000..b3b97f6fd831274876fc4f184f244da8a3e2a662 --- /dev/null +++ b/src/module-hmmm/components/questions-uploadImg.vue @@ -0,0 +1,90 @@ + + + + diff --git a/src/module-hmmm/pages/questions-new.vue b/src/module-hmmm/pages/questions-new.vue index a6d5b6d90afbfabba37d601a9de2db9975fd4260..a5b50a09c70dd4cd71e3459775b366882f39e0b4 100644 --- a/src/module-hmmm/pages/questions-new.vue +++ b/src/module-hmmm/pages/questions-new.vue @@ -1,9 +1,422 @@ +// 引入富文本编辑器样式 +import 'quill/dist/quill.core.css' +import 'quill/dist/quill.snow.css' +import 'quill/dist/quill.bubble.css' +import { quillEditor } from 'vue-quill-editor' + +// 引入上传图片插件 +import uploadImg from '../components/questions-uploadImg.vue' +// 学科api +import { list as sublist } from '@/api/hmmm/subjects' +// 目录api +import { simple as direlist } from '@/api/hmmm/directorys' +// 企业api +import { list as complist } from '@/api/hmmm/companys' +// 城市api +import { provinces, citys } from '@/api/hmmm/citys' +// 试题标签 api +import { list as alltaglist } from '@/api/hmmm/tags' +// 就业方向& +import { direction } from '@/api/hmmm/constants' +// 发送添加录入请求 +import { add as addquestion } from '@/api/hmmm/questions' +export default { + components: { + quillEditor, + uploadImg + }, + data () { + return { + testForm: { + subjectID: '', // 学科 + catalogID: '', // 目录 + enterpriseID: '', // 企业 + province: '', // 城市 + city: '', // 区 + direction: '', // 方向 + questionType: '单选', // 题型 + difficulty: '简单', // 难度 + question: '', // 题干 + options: [ + { + code: 'A', // 选项编号 + title: '', // 选项描述 + isRight: false, // 是否选中 + img: '' // 图片解析路径 + }, + { + code: 'B', // 选项编号 + title: '', // 选项描述 + isRight: false, // 是否选中 + img: '' // 图片解析路径 + }, + { + code: 'C', // 选项编号 + title: '', // 选项描述 + isRight: false, // 是否选中 + img: '' // 图片解析路径 + }, + { + code: 'D', // 选项编号 + title: '', // 选项描述 + isRight: false, // 是否选中 + img: '' // 图片解析路径 + } + ], + videoURL: '', // 解析视频 + answer: '', // 答案解析 + remarks: '', // 题目备注 + tags: '' // 试题标签 + }, + // 单选组 选中状态 + isCode: '', + // 多选组收集选中代码 + reCodelist: [], + testFormRules: { + subjectID: [{ required: true, message: '请选择学科', trigger: 'change' }], + catalogID: [{ required: true, message: '请选择目录', trigger: 'change' }], + enterpriseID: [{ required: true, message: '请选择企业', trigger: 'change' }], + province: [{ required: true, message: '请选择城市', trigger: 'change' }], + direction: [{ required: true, message: '请选择方向', trigger: 'change' }], + questionType: [{ required: true, message: '请选择题型', trigger: 'change' }], + difficulty: [{ required: true, message: '请选择难度', trigger: 'change' }], + question: [{ required: true, message: '请输入题干', trigger: 'blur' }], + answer: [{ required: true, message: '请输入答案解析', trigger: 'blur' }] + }, + editorOption: { + placeholder: '', + modules: { + toolbar: [ + ['bold', 'italic', 'underline', 'strike'], + [{ list: 'ordered' }, { list: 'bullet' }], + ['blockquote'], + ['code-block', 'image', 'link'] + ] + } + }, + // 学科列表 + subjectsList: [], + // 选中学科 id + subjectsId: '', + // 目录列表 + directorysList: [], + // 企业列表 + companysList: [], + // 城市 + provinces: provinces(), + // 城市地区 + citys, + // 就业方向 + directions: direction, + // 城市列表 + cityslist: [], + // 试题标签列表 + tagslist: [], + // 单选&多选&简答 状态 + status: true + } + }, + created () { + // 渲染学科列表挂载下拉 + this.subjectList() + // 渲染企业列表挂载下拉 + this.companyList() + }, + methods: { + // 学科列表 + async subjectList () { + try { + const { data } = await sublist() + this.subjectsList = data.items + } catch (err) { return err } + }, + // 渲染目录列表 + async directoryList (id) { + console.log(id) + try { + const { data } = await direlist({ subjectID: id }) + this.directorysList = data + } catch (err) { return err } + }, + // 渲染企业管理列表 + async companyList () { + try { + const { data } = await complist() + this.companysList = data.items + } catch (err) { return err } + }, + // 渲染试题标签列表 + async tagList (id) { + try { + const { data } = await alltaglist({ subjectID: id }) + this.tagslist = data.items + } catch (err) { return err } + }, + // 选择学科改变目录触发事件 + selectSubject (id) { + // 渲染目录列表挂载下拉 + this.directoryList(id) + // 渲染试题标签 + this.tagList(id) + }, + // 选择城市change事件 + selectCity (val) { + if (val) { + this.cityslist = this.citys(val) + this.$refs.testForm.validateField('city') + } + }, + // 改变单选组按钮状态 + isCodeChange (val) { + this.testForm.options.forEach(item => { + if (item.code === val) { + item.isRight = true + } else { + item.isRight = false + } + }) + }, + // 多选组修改isRight状态 + reCodelistChange () { + this.testForm.options.forEach(item => { + if (this.reCodelist.includes(item.code)) { + item.isRight = true + } else { + item.isRight = false + } + }) + }, + // 难度选择 + questionChange (val) { + // 清空选项 + this.clearOption() + if (val === '多选') { + this.status = false + } else { + this.status = true + } + }, + // 清空选项 + clearOption () { + // 清空单选选中的状态 + this.isCode = '' + // 重新收集多选组,清空状态 + this.reCodelist = [] + // 清空多选isRight状态 + this.testForm.options.forEach(item => { + item.isRight = false + item.img = '' + item.title = '' + }) + this.status = true + }, + // 提交录入 + subject () { + this.$refs.testForm.validate(async valid => { + if (!valid) return + // console.log(this.testForm) + // 将标签数组转换为字符串 + this.testForm.tags = this.testForm.tags.join(',') + try { + await addquestion(this.testForm) + this.$message.success('添加成功') + this.$refs.testForm.resetFields() + // 清空选项 + this.clearOption() + // 清空题目备注 + this.testForm.remarks = '' + // 清空标签数组 + this.tagslist = [] - + // 跳转 精选题库 + } catch (err) { + console.log(err) + } + }) + }, + // 增加选项与答案 + addOptions () { + const nowcode = this.testForm.options[this.testForm.options.length - 1].code + if (nowcode === '~') { + return this.$message.success('选项已达上限!') + } + const code = String.fromCharCode(nowcode.charCodeAt() + 1) + this.testForm.options.push({ + code: code, + img: '', + isRight: false, + title: '' + }) + } + } +} + + diff --git a/src/module-hmmm/pages/questions-randoms.vue b/src/module-hmmm/pages/questions-randoms.vue index ab6dd1be88fcaf707e4b6b4f198a43ce583f4bc1..863b3f1602bc137e5626fda42e24cf1eff579769 100644 --- a/src/module-hmmm/pages/questions-randoms.vue +++ b/src/module-hmmm/pages/questions-randoms.vue @@ -1,9 +1,13 @@ - -