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 @@
- 试题录入
+
+
+
+
+ 试题录入
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{item.code}}:
+
+
+
+
+
+
+
+ {{item.code}}:
+
+
+
+
+
+
+ +增加选项与答案
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认提交
+
+
+
+
+
+// 引入富文本编辑器样式
+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 @@
- 精选题库
+
-
-