|
@ -0,0 +1,2 @@
|
|||
export default function $$var_textInFile() {
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
# @see https://editorconfig-specification.readthedocs.io/en/latest/
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
charset = utf-8
|
||||
|
||||
# 4 space indentation
|
||||
[*.py]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
# Tab indentation (no size specified)
|
||||
[Makefile]
|
||||
indent_style = tab
|
|
@ -0,0 +1,12 @@
|
|||
import React from "react";
|
||||
import classNames from "classnames/bind";
|
||||
|
||||
import styles from "./index.scss";
|
||||
|
||||
const cx = classNames.bind(styles);
|
||||
|
||||
function __templateNameToPascalCase__() {
|
||||
return <div className={cx("__templateNameToParamCase__")}>Hello :)</div>;
|
||||
}
|
||||
|
||||
export default __templateNameToPascalCase__;
|
|
@ -0,0 +1,3 @@
|
|||
.__templateNameToParamCase__ {
|
||||
display: inline-block;
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
export default function __templateNameToPascalCase__() {
|
||||
console.log("TemplateName -> __templateName__");
|
||||
console.log("TemplateName to ParamCase -> __templateNameToParamCase__");
|
||||
console.log("TemplateName to PascalCase -> __templateNameToPascalCase__");
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="icon" href="/favicon.ico">
|
||||
<link rel="icon" href="./src/assets/bankIcon.png">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Ai_面试管理后台</title>
|
||||
</head>
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
"dependencies": {
|
||||
"@arco-design/web-vue": "^2.53.0",
|
||||
"@element-plus/icons-vue": "^2.1.0",
|
||||
"ant-design-vue": "4.x",
|
||||
"axios": "^1.5.1",
|
||||
"echarts": "^5.4.3",
|
||||
"element-china-area-data": "^6.1.0",
|
||||
|
|
193
pnpm-lock.yaml
|
@ -11,6 +11,9 @@ dependencies:
|
|||
'@element-plus/icons-vue':
|
||||
specifier: ^2.1.0
|
||||
version: registry.npmmirror.com/@element-plus/icons-vue@2.1.0(vue@3.3.4)
|
||||
ant-design-vue:
|
||||
specifier: 4.x
|
||||
version: registry.npmmirror.com/ant-design-vue@4.0.7(vue@3.3.4)
|
||||
axios:
|
||||
specifier: ^1.5.1
|
||||
version: registry.npmmirror.com/axios@1.5.1
|
||||
|
@ -98,6 +101,33 @@ packages:
|
|||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@ant-design/colors@6.0.0:
|
||||
resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz}
|
||||
name: '@ant-design/colors'
|
||||
version: 6.0.0
|
||||
dependencies:
|
||||
'@ctrl/tinycolor': registry.npmmirror.com/@ctrl/tinycolor@3.6.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@ant-design/icons-svg@4.3.1:
|
||||
resolution: {integrity: sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz}
|
||||
name: '@ant-design/icons-svg'
|
||||
version: 4.3.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@ant-design/icons-vue@7.0.1(vue@3.3.4):
|
||||
resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz}
|
||||
id: registry.npmmirror.com/@ant-design/icons-vue/7.0.1
|
||||
name: '@ant-design/icons-vue'
|
||||
version: 7.0.1
|
||||
peerDependencies:
|
||||
vue: '>=3.0.3'
|
||||
dependencies:
|
||||
'@ant-design/colors': registry.npmmirror.com/@ant-design/colors@6.0.0
|
||||
'@ant-design/icons-svg': registry.npmmirror.com/@ant-design/icons-svg@4.3.1
|
||||
vue: registry.npmmirror.com/vue@3.3.4
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@antfu/utils@0.7.6:
|
||||
resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.6.tgz}
|
||||
name: '@antfu/utils'
|
||||
|
@ -152,6 +182,15 @@ packages:
|
|||
dependencies:
|
||||
'@babel/types': registry.npmmirror.com/@babel/types@7.23.0
|
||||
|
||||
registry.npmmirror.com/@babel/runtime@7.23.2:
|
||||
resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz}
|
||||
name: '@babel/runtime'
|
||||
version: 7.23.2
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
regenerator-runtime: registry.npmmirror.com/regenerator-runtime@0.14.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@babel/types@7.23.0:
|
||||
resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz}
|
||||
name: '@babel/types'
|
||||
|
@ -180,6 +219,18 @@ packages:
|
|||
vue: registry.npmmirror.com/vue@3.3.4
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@emotion/hash@0.9.1:
|
||||
resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/hash/-/hash-0.9.1.tgz}
|
||||
name: '@emotion/hash'
|
||||
version: 0.9.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@emotion/unitless@0.8.1:
|
||||
resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.8.1.tgz}
|
||||
name: '@emotion/unitless'
|
||||
version: 0.8.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@esbuild/android-arm64@0.18.20:
|
||||
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz}
|
||||
name: '@esbuild/android-arm64'
|
||||
|
@ -585,6 +636,15 @@ packages:
|
|||
version: 1.5.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/@simonwep/pickr@1.8.2:
|
||||
resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz}
|
||||
name: '@simonwep/pickr'
|
||||
version: 1.8.2
|
||||
dependencies:
|
||||
core-js: registry.npmmirror.com/core-js@3.33.2
|
||||
nanopop: registry.npmmirror.com/nanopop@2.3.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/@sxzz/popperjs-es@2.11.7:
|
||||
resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz}
|
||||
name: '@sxzz/popperjs-es'
|
||||
|
@ -865,6 +925,40 @@ packages:
|
|||
engines: {node: '>=12'}
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/ant-design-vue@4.0.7(vue@3.3.4):
|
||||
resolution: {integrity: sha512-oHTtc1GZkfENZTkt2aDvjaD4yoRsowYvCOmxA6+5AGqm5uz/datdJOXsq9nokIhC+vrAMhk6JQVFZ2hh7eU6Pw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-4.0.7.tgz}
|
||||
id: registry.npmmirror.com/ant-design-vue/4.0.7
|
||||
name: ant-design-vue
|
||||
version: 4.0.7
|
||||
engines: {node: '>=12.22.0'}
|
||||
peerDependencies:
|
||||
vue: '>=3.2.0'
|
||||
dependencies:
|
||||
'@ant-design/colors': registry.npmmirror.com/@ant-design/colors@6.0.0
|
||||
'@ant-design/icons-vue': registry.npmmirror.com/@ant-design/icons-vue@7.0.1(vue@3.3.4)
|
||||
'@babel/runtime': registry.npmmirror.com/@babel/runtime@7.23.2
|
||||
'@ctrl/tinycolor': registry.npmmirror.com/@ctrl/tinycolor@3.6.1
|
||||
'@emotion/hash': registry.npmmirror.com/@emotion/hash@0.9.1
|
||||
'@emotion/unitless': registry.npmmirror.com/@emotion/unitless@0.8.1
|
||||
'@simonwep/pickr': registry.npmmirror.com/@simonwep/pickr@1.8.2
|
||||
array-tree-filter: registry.npmmirror.com/array-tree-filter@2.1.0
|
||||
async-validator: registry.npmmirror.com/async-validator@4.2.5
|
||||
csstype: registry.npmmirror.com/csstype@3.1.2
|
||||
dayjs: registry.npmmirror.com/dayjs@1.11.10
|
||||
dom-align: registry.npmmirror.com/dom-align@1.12.4
|
||||
dom-scroll-into-view: registry.npmmirror.com/dom-scroll-into-view@2.0.1
|
||||
lodash: registry.npmmirror.com/lodash@4.17.21
|
||||
lodash-es: registry.npmmirror.com/lodash-es@4.17.21
|
||||
resize-observer-polyfill: registry.npmmirror.com/resize-observer-polyfill@1.5.1
|
||||
scroll-into-view-if-needed: registry.npmmirror.com/scroll-into-view-if-needed@2.2.31
|
||||
shallow-equal: registry.npmmirror.com/shallow-equal@1.2.1
|
||||
stylis: registry.npmmirror.com/stylis@4.3.0
|
||||
throttle-debounce: registry.npmmirror.com/throttle-debounce@5.0.0
|
||||
vue: registry.npmmirror.com/vue@3.3.4
|
||||
vue-types: registry.npmmirror.com/vue-types@3.0.2(vue@3.3.4)
|
||||
warning: registry.npmmirror.com/warning@4.0.3
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/anymatch@3.1.3:
|
||||
resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz}
|
||||
name: anymatch
|
||||
|
@ -881,6 +975,12 @@ packages:
|
|||
version: 2.0.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/array-tree-filter@2.1.0:
|
||||
resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz}
|
||||
name: array-tree-filter
|
||||
version: 2.1.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/async-validator@4.2.5:
|
||||
resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz}
|
||||
name: async-validator
|
||||
|
@ -1140,6 +1240,13 @@ packages:
|
|||
dependencies:
|
||||
is-what: registry.npmmirror.com/is-what@3.14.1
|
||||
|
||||
registry.npmmirror.com/core-js@3.33.2:
|
||||
resolution: {integrity: sha512-XeBzWI6QL3nJQiHmdzbAOiMYqjrb7hwU7A39Qhvd/POSa/t9E1AeZyEZx3fNvp/vtM8zXwhoL0FsiS0hD0pruQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.33.2.tgz}
|
||||
name: core-js
|
||||
version: 3.33.2
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/cross-spawn@7.0.3:
|
||||
resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz}
|
||||
name: cross-spawn
|
||||
|
@ -1249,6 +1356,18 @@ packages:
|
|||
esutils: registry.npmmirror.com/esutils@2.0.3
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/dom-align@1.12.4:
|
||||
resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz}
|
||||
name: dom-align
|
||||
version: 1.12.4
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/dom-scroll-into-view@2.0.1:
|
||||
resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz}
|
||||
name: dom-scroll-into-view
|
||||
version: 2.0.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/eastasianwidth@0.2.0:
|
||||
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz}
|
||||
name: eastasianwidth
|
||||
|
@ -1976,6 +2095,13 @@ packages:
|
|||
engines: {node: '>=8'}
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/is-plain-object@3.0.1:
|
||||
resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz}
|
||||
name: is-plain-object
|
||||
version: 3.0.1
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/is-stream@2.0.1:
|
||||
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz}
|
||||
name: is-stream
|
||||
|
@ -2010,6 +2136,12 @@ packages:
|
|||
version: 2.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/js-tokens@4.0.0:
|
||||
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz}
|
||||
name: js-tokens
|
||||
version: 4.0.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/js-yaml@4.1.0:
|
||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz}
|
||||
name: js-yaml
|
||||
|
@ -2185,6 +2317,15 @@ packages:
|
|||
wrap-ansi: registry.npmmirror.com/wrap-ansi@8.1.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/loose-envify@1.4.0:
|
||||
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz}
|
||||
name: loose-envify
|
||||
version: 1.4.0
|
||||
hasBin: true
|
||||
dependencies:
|
||||
js-tokens: registry.npmmirror.com/js-tokens@4.0.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/lru-cache@6.0.0:
|
||||
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz}
|
||||
name: lru-cache
|
||||
|
@ -2321,6 +2462,12 @@ packages:
|
|||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||
hasBin: true
|
||||
|
||||
registry.npmmirror.com/nanopop@2.3.0:
|
||||
resolution: {integrity: sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanopop/-/nanopop-2.3.0.tgz}
|
||||
name: nanopop
|
||||
version: 2.3.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/natural-compare@1.4.0:
|
||||
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz}
|
||||
name: natural-compare
|
||||
|
@ -2659,6 +2806,12 @@ packages:
|
|||
picomatch: registry.npmmirror.com/picomatch@2.3.1
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/regenerator-runtime@0.14.0:
|
||||
resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz}
|
||||
name: regenerator-runtime
|
||||
version: 0.14.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/resize-detector@0.3.0:
|
||||
resolution: {integrity: sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz}
|
||||
name: resize-detector
|
||||
|
@ -2806,6 +2959,12 @@ packages:
|
|||
lru-cache: registry.npmmirror.com/lru-cache@6.0.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/shallow-equal@1.2.1:
|
||||
resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz}
|
||||
name: shallow-equal
|
||||
version: 1.2.1
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/shebang-command@2.0.0:
|
||||
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz}
|
||||
name: shebang-command
|
||||
|
@ -2931,6 +3090,12 @@ packages:
|
|||
acorn: registry.npmmirror.com/acorn@8.10.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/stylis@4.3.0:
|
||||
resolution: {integrity: sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/stylis/-/stylis-4.3.0.tgz}
|
||||
name: stylis
|
||||
version: 4.3.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/supports-color@7.2.0:
|
||||
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz}
|
||||
name: supports-color
|
||||
|
@ -2963,6 +3128,13 @@ packages:
|
|||
version: 0.2.0
|
||||
dev: true
|
||||
|
||||
registry.npmmirror.com/throttle-debounce@5.0.0:
|
||||
resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz}
|
||||
name: throttle-debounce
|
||||
version: 5.0.0
|
||||
engines: {node: '>=12.22'}
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/titleize@3.0.0:
|
||||
resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/titleize/-/titleize-3.0.0.tgz}
|
||||
name: titleize
|
||||
|
@ -3291,6 +3463,19 @@ packages:
|
|||
vue: registry.npmmirror.com/vue@2.7.15
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/vue-types@3.0.2(vue@3.3.4):
|
||||
resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz}
|
||||
id: registry.npmmirror.com/vue-types/3.0.2
|
||||
name: vue-types
|
||||
version: 3.0.2
|
||||
engines: {node: '>=10.15.0'}
|
||||
peerDependencies:
|
||||
vue: ^3.0.0
|
||||
dependencies:
|
||||
is-plain-object: registry.npmmirror.com/is-plain-object@3.0.1
|
||||
vue: registry.npmmirror.com/vue@3.3.4
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/vue-uuid@3.0.0(vue@3.3.4):
|
||||
resolution: {integrity: sha512-+5DP857xVmTHYd00dMC1c1gVg/nxG6+K4Lepojv9ckHt8w0fDpGc5gQCCttS9D+AkSkTJgb0cekidKjTWu5OQQ==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vue-uuid/-/vue-uuid-3.0.0.tgz}
|
||||
id: registry.npmmirror.com/vue-uuid/3.0.0
|
||||
|
@ -3324,6 +3509,14 @@ packages:
|
|||
'@vue/server-renderer': registry.npmmirror.com/@vue/server-renderer@3.3.4(vue@3.3.4)
|
||||
'@vue/shared': registry.npmmirror.com/@vue/shared@3.3.4
|
||||
|
||||
registry.npmmirror.com/warning@4.0.3:
|
||||
resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz}
|
||||
name: warning
|
||||
version: 4.0.3
|
||||
dependencies:
|
||||
loose-envify: registry.npmmirror.com/loose-envify@1.4.0
|
||||
dev: false
|
||||
|
||||
registry.npmmirror.com/webpack-sources@3.2.3:
|
||||
resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, registry: http://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz}
|
||||
name: webpack-sources
|
||||
|
|
|
@ -1,12 +1,14 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
//-------------------logo-----------------------------------
|
||||
// 根据公司编码查询logo列表
|
||||
export const useGetLogoList = (encoding) =>
|
||||
request.get('interview/get_logoList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 添加公司logo
|
||||
export const useAddLogo = ({ name, encoding, image, userId, filename }) =>
|
||||
request.post('interview/add_logo', {
|
||||
name,
|
||||
|
@ -15,16 +17,18 @@ export const useAddLogo = ({ name, encoding, image, userId, filename }) =>
|
|||
userId,
|
||||
filename
|
||||
})
|
||||
|
||||
// 根据logoID删除公司logo
|
||||
export const useDeleteLogo = (id) =>
|
||||
request.get('interview/delete_logo', { params: { id: id } })
|
||||
|
||||
request.delete('interview/delete_logo', { params: { id: id } })
|
||||
//-------------------------背景图片-----------------------------------
|
||||
// 根据公司编码查询背景图片列表
|
||||
export const useGetBackgroundList = (encoding) =>
|
||||
request.get('interview/get_backgroundList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
// 添加面试背景
|
||||
export const useAddBackground = ({ name, encoding, image, userId, filename }) =>
|
||||
request.post('interview/add_background', {
|
||||
name,
|
||||
|
@ -33,23 +37,86 @@ export const useAddBackground = ({ name, encoding, image, userId, filename }) =>
|
|||
userId,
|
||||
filename
|
||||
})
|
||||
// 根据背景id删除面试背景
|
||||
export const useDeleteBackground = (id) =>
|
||||
request.get('interview/delete_background', { params: { id: id } })
|
||||
request.delete('interview/delete_background', { params: { id: id } })
|
||||
|
||||
//-------------------------------------------面试官形象-----------------------------------
|
||||
// 根据公司编码查询面试管形象
|
||||
export const useGetImagesList = (encoding) =>
|
||||
request.get('interview/get_imagesList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
export const useAddImage = ({ name, encoding, image, userId, filename }) =>
|
||||
// 添加面试官形象
|
||||
export const useAddImage = ({
|
||||
name,
|
||||
encoding,
|
||||
image,
|
||||
video,
|
||||
userId,
|
||||
filename,
|
||||
sex
|
||||
}) =>
|
||||
request.post('interview/add_image', {
|
||||
name,
|
||||
encoding,
|
||||
image,
|
||||
video,
|
||||
userId,
|
||||
filename
|
||||
filename,
|
||||
sex
|
||||
})
|
||||
// 根据形象id删除形象图片
|
||||
export const useDeleteImage = (id) =>
|
||||
request.get('interview/delete_image', { params: { id: id } })
|
||||
request.delete('interview/delete_image', { params: { id: id } })
|
||||
|
||||
//通知面试
|
||||
export const addInterviewNotice = ({
|
||||
encoding,
|
||||
jobId,
|
||||
postId,
|
||||
selectQuestions,
|
||||
promote,
|
||||
inviteUser,
|
||||
userId,
|
||||
applicationId,
|
||||
endTime
|
||||
}) =>
|
||||
request.post('interview/sendInterviewNotice', {
|
||||
encoding,
|
||||
jobId,
|
||||
postId,
|
||||
selectQuestions,
|
||||
promote,
|
||||
inviteUser,
|
||||
userId,
|
||||
applicationId,
|
||||
endTime
|
||||
})
|
||||
|
||||
export const getPostInfoList = (encoding) =>
|
||||
request.get('interview/getPostingInfoList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
export const getInterviewRecordList = (postId, jobId, encoding, status) =>
|
||||
request.get('/interview/getInterviewRecordList', {
|
||||
params: {
|
||||
postId: postId,
|
||||
jobId: jobId,
|
||||
encoding: encoding,
|
||||
status: status
|
||||
}
|
||||
})
|
||||
|
||||
export const agreeUsersPassInterview = (jobId, postId, userList, userId) =>
|
||||
request.post('/interview/agreeUsersPassInterview', {
|
||||
jobId: jobId,
|
||||
postId: postId,
|
||||
userList: userList,
|
||||
userId: userId
|
||||
})
|
||||
|
|
|
@ -1,45 +1,47 @@
|
|||
import requset from '@/utils/request'
|
||||
|
||||
import request from '@/utils/request'
|
||||
//------------------------------------题库-------------------------------------------
|
||||
//根据公司编码获取题库列表
|
||||
export const useGetTypeList = (encoding) =>
|
||||
requset.get('question/get_typeList', {
|
||||
request.get('question/get_typeList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 搜索题库
|
||||
export const useSearchType = (name, type, encoding) =>
|
||||
requset.get('question/search_typeName', {
|
||||
request.get('question/search_typeName', {
|
||||
params: {
|
||||
name: name,
|
||||
type: type,
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 根据题库类型获取题库
|
||||
export const useGetTypeListByType = (encoding, type) =>
|
||||
requset.get('question/get_typeListByType', {
|
||||
request.get('question/get_typeListByType', {
|
||||
params: {
|
||||
encoding: encoding,
|
||||
type: type
|
||||
}
|
||||
})
|
||||
|
||||
// 添加题库
|
||||
export const useAddTypeName = (typeName, description, type, encoding, userId) =>
|
||||
requset.post('question/add_typeName', {
|
||||
request.post('question/add_typeName', {
|
||||
typeName,
|
||||
description,
|
||||
type,
|
||||
encoding,
|
||||
userId
|
||||
})
|
||||
|
||||
// 根据题库id删除题库
|
||||
export const useDeleteTypeName = (typeId) =>
|
||||
requset.get('question/delete_type', {
|
||||
request.delete('question/delete_type', {
|
||||
params: {
|
||||
typeId: typeId
|
||||
}
|
||||
})
|
||||
|
||||
// 编辑题库
|
||||
export const useChangeTypeName = (
|
||||
typeId,
|
||||
typeName,
|
||||
|
@ -47,7 +49,7 @@ export const useChangeTypeName = (
|
|||
type,
|
||||
userId
|
||||
) =>
|
||||
requset.post('question/change_type', {
|
||||
request.post('question/change_type', {
|
||||
typeId,
|
||||
typeName,
|
||||
description,
|
||||
|
@ -55,61 +57,232 @@ export const useChangeTypeName = (
|
|||
userId
|
||||
})
|
||||
|
||||
export const useGetTypeById = (id) =>
|
||||
request.get('question/get_typeById', { params: { id: id } })
|
||||
//-------------------------------------题目-------------------------------------
|
||||
// 根据公司编码获取题目列表
|
||||
export const useGetQuestionList = (encoding) =>
|
||||
requset.get('question/get_questionList', {
|
||||
request.get('question/get_questionList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 搜索题目
|
||||
export const useSearchQuestion = (name, type, encoding) =>
|
||||
requset.get('question/search_questionList', {
|
||||
request.get('question/search_questionList', {
|
||||
params: {
|
||||
name: name,
|
||||
type: type,
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 添加题目
|
||||
export const useAddQuestion = (
|
||||
title,
|
||||
bankId,
|
||||
details,
|
||||
promote,
|
||||
answer,
|
||||
encoding,
|
||||
userId
|
||||
) =>
|
||||
requset.post('question/add_question', {
|
||||
request.post('question/add_question', {
|
||||
title,
|
||||
bankId,
|
||||
details,
|
||||
promote,
|
||||
answer,
|
||||
encoding,
|
||||
userId
|
||||
})
|
||||
|
||||
// 编辑题目
|
||||
export const useUpdateQuestion = (
|
||||
id,
|
||||
title,
|
||||
bankId,
|
||||
details,
|
||||
promote,
|
||||
answer,
|
||||
encoding,
|
||||
userId
|
||||
) =>
|
||||
requset.post('question/update_question', {
|
||||
request.post('question/update_question', {
|
||||
id,
|
||||
title,
|
||||
bankId,
|
||||
details,
|
||||
promote,
|
||||
answer,
|
||||
encoding,
|
||||
userId
|
||||
})
|
||||
|
||||
// 删除题目
|
||||
export const useDeleteQuestion = (id) =>
|
||||
requset.get('question/del_question', {
|
||||
request.delete('question/del_question', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
//---------------------------------题库广场----------------------------
|
||||
//获取分享题库列表
|
||||
export const useGetSharedQuestionType = () =>
|
||||
request.get('question/get_sharedQuestionType')
|
||||
// 搜索分享题库
|
||||
export const useSearchSharedQuestionType = (searchName) =>
|
||||
request.get('question/search_sharedQuestionType', {
|
||||
params: {
|
||||
searchName: searchName
|
||||
}
|
||||
})
|
||||
// 根据公司编码获取分享题库列表
|
||||
export const useGetSharedQuestionTypeByCompany = (encoding) =>
|
||||
request.get('question/get_sharedQuestionType', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
// 添加分享题库
|
||||
export const useAddSharedQuestionType = ({
|
||||
typeName,
|
||||
type,
|
||||
description,
|
||||
userId,
|
||||
encoding
|
||||
}) =>
|
||||
request.post('question/add_sharedQuestionBank', {
|
||||
typeName,
|
||||
type,
|
||||
description,
|
||||
userId,
|
||||
encoding
|
||||
})
|
||||
// 从分享题库中添加题库到本公司题库下
|
||||
export const useAddQuestionTypeFromShare = ({
|
||||
SharedBankIds,
|
||||
userId,
|
||||
encoding
|
||||
}) =>
|
||||
request.post('question/add_QuestionBankFromShare', {
|
||||
SharedBankIds,
|
||||
userId,
|
||||
encoding
|
||||
})
|
||||
|
||||
//根据
|
||||
//-------------------------------------题目广场-----------------------------
|
||||
// 获取分享题目列表
|
||||
export const useGetSharedQuestion = () =>
|
||||
request.get('question/get_sharedQuestion')
|
||||
// 搜索分享题目
|
||||
export const useSearchSharedQuestion = (searchName) =>
|
||||
request.get('question/search_sharedQuestion', {
|
||||
params: {
|
||||
searchName: searchName
|
||||
}
|
||||
})
|
||||
// 根据分享题库id获取分享题目列表
|
||||
export const useGetSharedQuestionByBankId = (sharedBankId) =>
|
||||
request.get('question/get_sharedQuestionByBankId', {
|
||||
params: {
|
||||
sharedBankId: sharedBankId
|
||||
}
|
||||
})
|
||||
// 添加分享题目
|
||||
export const useAddSharedQuestionList = ({
|
||||
sharedBankId,
|
||||
selectQuestionId,
|
||||
userId,
|
||||
encoding
|
||||
}) =>
|
||||
request.post('question/add_sharedQuestion', {
|
||||
sharedBankId,
|
||||
selectQuestionId,
|
||||
userId,
|
||||
encoding
|
||||
})
|
||||
// 从分享题目中添加题目到本公司下的题库中
|
||||
export const useAddQuestionFromShare = ({
|
||||
selectSharedQuestionIds,
|
||||
bankId,
|
||||
userId,
|
||||
encoding
|
||||
}) =>
|
||||
request.post('question/add_QuestionFromShare', {
|
||||
selectSharedQuestionIds,
|
||||
bankId,
|
||||
userId,
|
||||
encoding
|
||||
})
|
||||
//---------------------------------我的分享题库---------------------------
|
||||
//根据公司编码获取本公司分享的题库
|
||||
export const useGetOurSharedQuestionTypeList = (encoding) =>
|
||||
request.get('question/get_OurQuestionTypeList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
//搜索本公司的分享的题库
|
||||
export const useSearchOurSharedQuestionType = (encoding, searchName) =>
|
||||
request.get('question/search_OurSharedQuestionType', {
|
||||
params: {
|
||||
encoding: encoding,
|
||||
searchName: searchName
|
||||
}
|
||||
})
|
||||
//根据分享题库id修改题库信息
|
||||
export const useEditOurSharedQuestionType = ({
|
||||
id,
|
||||
typeName,
|
||||
description,
|
||||
type,
|
||||
userId
|
||||
}) =>
|
||||
request.post('question/edit_OurSharedQuestionType', {
|
||||
id,
|
||||
typeName,
|
||||
description,
|
||||
type,
|
||||
userId
|
||||
})
|
||||
//根据分享题库id删除分享题库
|
||||
export const useDeleteOurSharedQuestionType = (id) =>
|
||||
request.delete('question/delete_OurSharedQuestionType', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
|
||||
//----------------------------------我的分享题目-------------------------
|
||||
//根据公司编码获取本公司分享的题目
|
||||
export const useGetOurSharedQuestionList = (encoding) =>
|
||||
request.get('question/get_OurQuestionList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
//搜索本公司的分享的题库
|
||||
export const useSearchOurSharedQuestion = (encoding, searchName) =>
|
||||
request.get('question/search_OurSharedQuestion', {
|
||||
params: {
|
||||
encoding: encoding,
|
||||
searchName: searchName
|
||||
}
|
||||
})
|
||||
//根据ID删除本公司下的分享ID
|
||||
export const useDeleteOurSharedQuestion = (sharedQuestionId) =>
|
||||
request.post('question/delete_OurSharedQuestion', {
|
||||
sharedQuestionId: sharedQuestionId
|
||||
})
|
||||
|
||||
export const useEditOurSharedQuestion = ({
|
||||
id,
|
||||
title,
|
||||
details,
|
||||
answer,
|
||||
bankId,
|
||||
userId
|
||||
}) =>
|
||||
request.post('question/update_OurSharedQuestion', {
|
||||
id,
|
||||
title,
|
||||
details,
|
||||
answer,
|
||||
bankId,
|
||||
userId
|
||||
})
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
//-----------------------------------岗位管理-----------------------------
|
||||
// 添加岗位
|
||||
export const useAddJob = ({
|
||||
address,
|
||||
addressDetail,
|
||||
|
@ -34,21 +35,21 @@ export const useAddJob = ({
|
|||
userId,
|
||||
encoding
|
||||
})
|
||||
|
||||
// 根据公司编码获取岗位列表
|
||||
export const useGetJobList = (encoding) =>
|
||||
request.get('recruitment/get_jobList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 根据岗位id获取岗位详情
|
||||
export const useGetJobById = (id) =>
|
||||
request.get('recruitment/get_jobById', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
|
||||
// 编辑岗位
|
||||
export const useUpdateJob = ({
|
||||
id,
|
||||
address,
|
||||
|
@ -85,20 +86,30 @@ export const useUpdateJob = ({
|
|||
userId,
|
||||
encoding
|
||||
})
|
||||
|
||||
// 搜索岗位
|
||||
export const useSearchJob = (jobName, jobType, encoding) =>
|
||||
request.get('recruitment/search_job', {
|
||||
params: {
|
||||
jobName: jobName,
|
||||
jobType: jobType,
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
// 根据岗位id修改岗位状态
|
||||
export const useChangeJobStatus = (id, userId) =>
|
||||
request.post('recruitment/update_jobStatus', {
|
||||
id,
|
||||
userId
|
||||
})
|
||||
|
||||
// 根据岗位id删除岗位信息
|
||||
export const useDelJob = (id) =>
|
||||
request.get('recruitment/delete_job', {
|
||||
request.delete('recruitment/delete_job', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
|
||||
//------------------------------面试设置--------------------------
|
||||
// 添加面试设置
|
||||
export const useAddJobSetting = ({
|
||||
jobId,
|
||||
imagesId,
|
||||
|
@ -123,21 +134,21 @@ export const useAddJobSetting = ({
|
|||
userId,
|
||||
encoding
|
||||
})
|
||||
|
||||
// 根据公司编码获取面试设置列表
|
||||
export const useGetJobSettingList = (encoding) =>
|
||||
request.get('recruitment/get_jobSettingList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 根据面试设置id删除面试设置
|
||||
export const useDeleteJobSetting = (id) =>
|
||||
request.get('recruitment/delete_jobJobSetting', {
|
||||
request.delete('recruitment/delete_jobJobSetting', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
|
||||
// 编辑面试设置
|
||||
export const useUpdateJobSetting = ({
|
||||
id,
|
||||
jobId,
|
||||
|
@ -164,22 +175,7 @@ export const useUpdateJobSetting = ({
|
|||
userId,
|
||||
encoding
|
||||
})
|
||||
|
||||
export const useGetCompanyDetail = (encoding) =>
|
||||
request.get('recruitment/get_companyDetail', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
export const useSearchJob = (jobName, jobType, encoding) =>
|
||||
request.get('recruitment/search_job', {
|
||||
params: {
|
||||
jobName: jobName,
|
||||
jobType: jobType,
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 根据岗位名称搜索面试设置
|
||||
export const useSearchSettings = (jobName, encoding) =>
|
||||
request.get('recruitment/search_setting', {
|
||||
params: {
|
||||
|
@ -187,3 +183,128 @@ export const useSearchSettings = (jobName, encoding) =>
|
|||
encoding: encoding
|
||||
}
|
||||
})
|
||||
//------------------------------公司详情---------------------
|
||||
// 根据公司编码获取公司详情
|
||||
export const useGetCompanyDetail = (encoding) =>
|
||||
request.get('recruitment/get_companyDetail', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
// 修改公司详情
|
||||
export const useUploadCompanyDetail = ({
|
||||
address,
|
||||
addressDetail,
|
||||
companyDetail,
|
||||
companyName,
|
||||
creditCode,
|
||||
encoding,
|
||||
established,
|
||||
subImages,
|
||||
legalRepresentative,
|
||||
treatment,
|
||||
registeredCapital,
|
||||
userId,
|
||||
subLogo,
|
||||
type,
|
||||
staffNumber,
|
||||
companyAllName
|
||||
}) =>
|
||||
request.post('recruitment/update_companyDetail', {
|
||||
address,
|
||||
addressDetail,
|
||||
companyDetail,
|
||||
companyName,
|
||||
creditCode,
|
||||
encoding,
|
||||
established,
|
||||
images: subImages,
|
||||
legalRepresentative,
|
||||
treatment,
|
||||
registeredCapital,
|
||||
userId,
|
||||
type,
|
||||
companyLogo: subLogo,
|
||||
staffNumber,
|
||||
companyAllName
|
||||
})
|
||||
//招聘发布
|
||||
export const addJobPosting = ({
|
||||
name,
|
||||
startTime,
|
||||
endTime,
|
||||
checkList,
|
||||
userId,
|
||||
encoding
|
||||
}) =>
|
||||
request.post('/recruitment/add_jobPosting', {
|
||||
name,
|
||||
startTime,
|
||||
endTime,
|
||||
checkList,
|
||||
userId,
|
||||
encoding
|
||||
})
|
||||
export const updateJobPosting = ({
|
||||
id,
|
||||
name,
|
||||
startTime,
|
||||
endTime,
|
||||
checkList,
|
||||
userId,
|
||||
status
|
||||
}) =>
|
||||
request.post('/recruitment/update_jobPosting', {
|
||||
id,
|
||||
name,
|
||||
startTime,
|
||||
endTime,
|
||||
checkList,
|
||||
userId,
|
||||
status
|
||||
})
|
||||
|
||||
export const deleteJobPosting = (id) =>
|
||||
request.delete('/recruitment/delete_jobPosting', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
export const getJobPostingList = (encoding) =>
|
||||
request.get('/recruitment/get_jobPostingList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
//获取求职者信息
|
||||
export const getApplicationList = (encoding, jobId) =>
|
||||
request.get('/recruitment/getApplicationList', {
|
||||
params: {
|
||||
encoding: encoding,
|
||||
jobId: jobId
|
||||
}
|
||||
})
|
||||
|
||||
//搜索求职者
|
||||
export const searchApplicationByName = (searchName, encoding) =>
|
||||
request.get('/recruitment/searchApplicationByName', {
|
||||
params: {
|
||||
searchName: searchName,
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
export const disagreeApplication = (id) =>
|
||||
request.get('/recruitment/disagreeApplication', {
|
||||
params: {
|
||||
id: id
|
||||
}
|
||||
})
|
||||
|
||||
export const getJobSettingByJobId = (jobId) =>
|
||||
request.get('/recruitment/get_jobSettingByJobId', {
|
||||
params: {
|
||||
jobId: jobId
|
||||
}
|
||||
})
|
||||
|
|
|
@ -1,30 +1,41 @@
|
|||
import request from '@/utils/request'
|
||||
|
||||
//------------------------图片---------------------
|
||||
// 上传图片
|
||||
export const useUploadPic = (fd) =>
|
||||
request.post('upload_picture', fd, {
|
||||
headers: { 'Content-Type': 'multipart/form-data' }
|
||||
})
|
||||
|
||||
// 根据图片名称删除图片
|
||||
export const useDeletePic = (imagePath) =>
|
||||
request.get('delete_picture', {
|
||||
request.delete('delete_picture', {
|
||||
params: {
|
||||
imagePath: imagePath
|
||||
}
|
||||
})
|
||||
|
||||
// ------------------------------简历-------------------
|
||||
// 上传简历
|
||||
export const useUploadResume = (fd) =>
|
||||
request.post('upload_resume', fd, {
|
||||
headers: { 'Content-Type': 'multipart/form-data' }
|
||||
})
|
||||
|
||||
// 根据简历名称删除简历
|
||||
export const useDeleteResume = (resumePath) =>
|
||||
request.get('delete_resume', {
|
||||
request.delete('delete_resume', {
|
||||
params: {
|
||||
resumePath: resumePath
|
||||
}
|
||||
})
|
||||
|
||||
export const useUploadCompanyImage = (fd) =>
|
||||
request.post('upload_companyImage', fd, {
|
||||
// ---------------------------------视频-------------------------
|
||||
// 上传视频
|
||||
export const useUploadVideo = (fd) =>
|
||||
request.post('upload_video', fd, {
|
||||
headers: { 'Content-Type': 'multipart/form-data' }
|
||||
})
|
||||
// 根据视频名称删除视频
|
||||
export const useDeleteVideo = (videoPath) =>
|
||||
request.delete('delete_video', {
|
||||
params: {
|
||||
videoPath: videoPath
|
||||
}
|
||||
})
|
||||
|
|
|
@ -1,48 +1,50 @@
|
|||
import request from '@/utils/request.js'
|
||||
|
||||
// 用户登陆
|
||||
export const adminLogin = ({ phone, encoding, password }) =>
|
||||
request.post('admin/login', {
|
||||
phone,
|
||||
encoding,
|
||||
password
|
||||
})
|
||||
|
||||
// 根据token获取用户信息
|
||||
export const useGetUserInfo = (token) =>
|
||||
request.get('admin/get_userInfo', {
|
||||
params: {
|
||||
token: token
|
||||
}
|
||||
})
|
||||
|
||||
// 用户登出
|
||||
export const useAdminLogout = (token) =>
|
||||
request.get('admin/logout', {
|
||||
params: {
|
||||
token: token
|
||||
}
|
||||
})
|
||||
|
||||
// 根据公司编码获取员工列表
|
||||
export const useGetAdminList = (encoding) =>
|
||||
request.get('admin/get_adminList', {
|
||||
params: {
|
||||
encoding: encoding
|
||||
}
|
||||
})
|
||||
|
||||
// 添加管理员
|
||||
export const useAddAdmin = (encoding, userId, username, phone, role) =>
|
||||
request.post('admin/add_admin', { encoding, userId, username, phone, role })
|
||||
|
||||
// 删除管理员
|
||||
export const useDelAdmin = (userId, deleteId) =>
|
||||
request.post('admin/del_admin', {
|
||||
userId,
|
||||
deleteId
|
||||
request.delete('admin/del_admin', {
|
||||
params: {
|
||||
userId: userId,
|
||||
deleteId: deleteId
|
||||
}
|
||||
})
|
||||
|
||||
// 更换头像
|
||||
export const useChangeAvatar = ({ userId, avatar }) =>
|
||||
request.post('admin/change_avatar', {
|
||||
userId,
|
||||
avatar
|
||||
})
|
||||
|
||||
// 重置密码
|
||||
export const useResetPassword = ({
|
||||
userId,
|
||||
oldPassword,
|
||||
|
@ -55,7 +57,7 @@ export const useResetPassword = ({
|
|||
Password,
|
||||
resetPassword
|
||||
})
|
||||
|
||||
// 搜索管理员
|
||||
export const useSearchAdmin = (name, encoding) =>
|
||||
request.get('admin/search_admin', {
|
||||
params: {
|
||||
|
@ -63,3 +65,24 @@ export const useSearchAdmin = (name, encoding) =>
|
|||
encoding: encoding
|
||||
}
|
||||
})
|
||||
// 编辑用户信息
|
||||
export const useUploadUserInfo = ({
|
||||
userId,
|
||||
updateId,
|
||||
username,
|
||||
age,
|
||||
email,
|
||||
sex
|
||||
}) =>
|
||||
request.post('admin/upload_userInfo', {
|
||||
userId,
|
||||
updateId,
|
||||
username,
|
||||
age,
|
||||
email,
|
||||
sex
|
||||
})
|
||||
//系统管理员修改公司管理员密码||公司管理员修改HR的密码
|
||||
|
||||
export const useAdminEditPassword = ({ userId, updateUserId, password }) =>
|
||||
request.post('admin/adminEditPassword', { userId, updateUserId, password })
|
||||
|
|
Before Width: | Height: | Size: 258 KiB After Width: | Height: | Size: 258 KiB |
|
@ -5,11 +5,9 @@ import App from './App.vue'
|
|||
import router from './router'
|
||||
import './assets/main.scss'
|
||||
|
||||
|
||||
const app = createApp(App)
|
||||
|
||||
app.use(pinia)
|
||||
app.use(router)
|
||||
|
||||
|
||||
app.mount('#app')
|
||||
|
|
|
@ -23,6 +23,10 @@ const router = createRouter({
|
|||
path: '/question/manager',
|
||||
component: () => import('@/views/question/QuestionManager.vue')
|
||||
},
|
||||
{
|
||||
path: '/question/square',
|
||||
component: () => import('@/views/question/QuestionSquare.vue')
|
||||
},
|
||||
{
|
||||
path: '/home',
|
||||
component: () => import('@/views/home/HomeindexPage.vue')
|
||||
|
@ -56,6 +60,10 @@ const router = createRouter({
|
|||
{
|
||||
path: '/recruitment/companyManagement',
|
||||
component: () => import('@/views/recruitment/CompanyManagement.vue')
|
||||
},
|
||||
{
|
||||
path: '/recruitment/publicJob',
|
||||
component: () => import('@/views/recruitment/PublicJob.vue')
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 74 KiB |
Before Width: | Height: | Size: 181 KiB |
Before Width: | Height: | Size: 105 KiB |
Before Width: | Height: | Size: 181 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 4.4 KiB |
Before Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 1.6 MiB |
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 1.5 MiB |
Before Width: | Height: | Size: 1.0 MiB |
Before Width: | Height: | Size: 1.5 MiB |
|
@ -2,7 +2,7 @@ import { useUserStore } from '@/stores'
|
|||
import axios from 'axios'
|
||||
import router from '@/router'
|
||||
|
||||
const baseURL = 'http://localhost'
|
||||
const baseURL = 'http://localhost:5380'
|
||||
|
||||
const instance = axios.create({
|
||||
baseURL,
|
||||
|
|
|
@ -6,19 +6,56 @@ import { CanvasRenderer } from 'echarts/renderers'
|
|||
|
||||
import VChart, { THEME_KEY } from 'vue-echarts'
|
||||
import { ref, provide } from 'vue'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { useGetJobList } from '@/api/recruitment'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import {
|
||||
Search,
|
||||
View,
|
||||
CloseBold,
|
||||
ChatDotSquare,
|
||||
Tickets
|
||||
} from '@element-plus/icons-vue'
|
||||
import {
|
||||
useGetJobList,
|
||||
getApplicationList,
|
||||
searchApplicationByName
|
||||
} from '@/api/recruitment'
|
||||
import {
|
||||
getPostInfoList,
|
||||
getInterviewRecordList,
|
||||
agreeUsersPassInterview
|
||||
} from '@/api/interview'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import DisagreeDialog from './components/DisagreeDialog.vue'
|
||||
import InviteDialog from './components/InviteDialog.vue'
|
||||
import ViewResume from './components/ViewResume.vue'
|
||||
|
||||
use([TooltipComponent, GridComponent, BarChart, CanvasRenderer])
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const activeName = ref()
|
||||
const jobList = ref([])
|
||||
const activeJob = ref()
|
||||
const originalInterviewerList = ref([])
|
||||
const isProcess = ref('1')
|
||||
const ListLoading = ref(false)
|
||||
const getJobList = async () => {
|
||||
isProcess.value = '1'
|
||||
const res = await useGetJobList(companyStore.encoding)
|
||||
jobList.value = res.data.data
|
||||
activeName.value = jobList.value[0].id
|
||||
if (activeJob.value === undefined || activeJob.value === '') {
|
||||
activeJob.value = jobList.value[0].id
|
||||
}
|
||||
interviewerListLoading.value = true
|
||||
const resinterviewerList = await getApplicationList(
|
||||
companyStore.encoding,
|
||||
activeJob.value
|
||||
)
|
||||
originalInterviewerList.value = resinterviewerList.data.data
|
||||
|
||||
console.log(originalInterviewerList.value)
|
||||
interviewerList.value = resinterviewerList.data.data.filter(
|
||||
(item) => item.status === 1
|
||||
)
|
||||
interviewerListLoading.value = false
|
||||
}
|
||||
getJobList()
|
||||
|
||||
|
@ -154,19 +191,194 @@ const option2 = ref({
|
|||
]
|
||||
})
|
||||
|
||||
const Agreement = () => {
|
||||
console.log('同意面试')
|
||||
}
|
||||
|
||||
const filterApplication = ref('1')
|
||||
const inputName = ref('')
|
||||
const searchUserName = () => {
|
||||
const searchUserName = async () => {
|
||||
if (inputName.value) {
|
||||
console.log('搜索' + inputName.value)
|
||||
const res = await searchApplicationByName(
|
||||
inputName.value,
|
||||
companyStore.encoding
|
||||
)
|
||||
interviewerList.value = res.data.data
|
||||
inputName.value = ''
|
||||
} else {
|
||||
ElMessage.error('请输入求职者姓名')
|
||||
}
|
||||
}
|
||||
const inviteDialog = ref()
|
||||
const handleInvite = (row) => {
|
||||
console.log(row)
|
||||
inviteDialog.value.open(row)
|
||||
}
|
||||
const disagreeDialog = ref()
|
||||
const handleDisagree = (row) => {
|
||||
disagreeDialog.value.open(row)
|
||||
}
|
||||
|
||||
const interviewerList = ref([])
|
||||
const interviewerListLoading = ref(false)
|
||||
|
||||
const handleClick = () => {
|
||||
getJobList()
|
||||
}
|
||||
const viewResume = ref()
|
||||
const handleViewResume = (row) => {
|
||||
viewResume.value.open(row)
|
||||
}
|
||||
|
||||
const handleChange = () => {
|
||||
console.log(isProcess.value)
|
||||
|
||||
interviewerList.value = originalInterviewerList.value.filter(
|
||||
(item) => item.status === parseInt(isProcess.value)
|
||||
)
|
||||
}
|
||||
//第二个页面
|
||||
const postintList = ref([])
|
||||
|
||||
const activePosting = ref('')
|
||||
|
||||
const postFilterJob = ref()
|
||||
|
||||
const postJobList = ref([])
|
||||
|
||||
const interviewPostList = ref([])
|
||||
|
||||
const filterRecored = ref('1')
|
||||
|
||||
const getPostListLoading = ref(false)
|
||||
const getPostintList = async () => {
|
||||
getPostListLoading.value = true
|
||||
const res = await getPostInfoList(companyStore.encoding)
|
||||
postintList.value = res.data.data
|
||||
activePosting.value = postintList.value[0].postId
|
||||
postFilterJob.value = postintList.value[0].jobList[0].jobId
|
||||
postJobList.value = postintList.value[0].jobList
|
||||
|
||||
const resPostList = await getInterviewRecordList(
|
||||
activePosting.value,
|
||||
postFilterJob.value,
|
||||
companyStore.encoding,
|
||||
parseInt(filterRecored.value)
|
||||
)
|
||||
|
||||
interviewPostList.value = resPostList.data.data
|
||||
|
||||
console.log(interviewPostList.value)
|
||||
|
||||
getPostListLoading.value = false
|
||||
}
|
||||
getPostintList()
|
||||
|
||||
const selectAgreeUsers = ref([])
|
||||
|
||||
const handleSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectAgreeUsers.value = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectAgreeUsers.value.indexOf(item.interviewer) === -1) {
|
||||
selectAgreeUsers.value.push(item.interviewer)
|
||||
}
|
||||
})
|
||||
if (val.length !== selectAgreeUsers.value.length) {
|
||||
selectAgreeUsers.value = []
|
||||
val.forEach((item) => {
|
||||
if (selectAgreeUsers.value.indexOf(item.interviewer) === -1) {
|
||||
selectAgreeUsers.value.push(item.interviewer)
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log(selectAgreeUsers.value)
|
||||
}
|
||||
const userStore = useUserStore()
|
||||
const PassInterview = async () => {
|
||||
if (filterRecored.value === '2') {
|
||||
ElMessage.error('所勾选的列表已经通过面试啦,请不要重复操作')
|
||||
return
|
||||
}
|
||||
|
||||
getPostListLoading.value = true
|
||||
const res = await agreeUsersPassInterview(
|
||||
postFilterJob.value,
|
||||
activePosting.value,
|
||||
JSON.stringify(selectAgreeUsers.value),
|
||||
userStore.userInfo.id
|
||||
)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
const resPostList = await getInterviewRecordList(
|
||||
activePosting.value,
|
||||
postFilterJob.value,
|
||||
companyStore.encoding,
|
||||
parseInt(filterRecored.value)
|
||||
)
|
||||
|
||||
interviewPostList.value = resPostList.data.data
|
||||
|
||||
getPostListLoading.value = false
|
||||
}
|
||||
const handleRecordChangeStatus = async () => {
|
||||
getPostListLoading.value = true
|
||||
const res = await getInterviewRecordList(
|
||||
activePosting.value,
|
||||
postFilterJob.value,
|
||||
companyStore.encoding,
|
||||
parseInt(filterRecored.value)
|
||||
)
|
||||
interviewPostList.value = res.data.data
|
||||
|
||||
getPostListLoading.value = false
|
||||
}
|
||||
|
||||
const handleRecordChangeJob = async () => {
|
||||
filterRecored.value = '1'
|
||||
getPostListLoading.value = true
|
||||
|
||||
const res = await getInterviewRecordList(
|
||||
activePosting.value,
|
||||
postFilterJob.value,
|
||||
companyStore.encoding,
|
||||
parseInt(filterRecored.value)
|
||||
)
|
||||
interviewPostList.value = res.data.data
|
||||
getPostListLoading.value = false
|
||||
}
|
||||
|
||||
const handleChangePost = async () => {
|
||||
filterRecored.value = '1'
|
||||
// postJobList.value = postintList.value.filter(
|
||||
// (item) => item.postId === activePosting.value
|
||||
// )
|
||||
let choosePostInfo = postintList.value.filter(
|
||||
(item) => item.postId === activePosting.value
|
||||
)
|
||||
|
||||
postJobList.value = choosePostInfo[0].jobList
|
||||
|
||||
postFilterJob.value = postJobList.value[0].jobId
|
||||
|
||||
const resPostList = await getInterviewRecordList(
|
||||
activePosting.value,
|
||||
postFilterJob.value,
|
||||
companyStore.encoding,
|
||||
parseInt(filterRecored.value)
|
||||
)
|
||||
|
||||
interviewPostList.value = resPostList.data.data
|
||||
|
||||
console.log(interviewPostList.value)
|
||||
|
||||
getPostListLoading.value = false
|
||||
}
|
||||
const handleDisagreeApplication = (row) => {
|
||||
console.log(row)
|
||||
}
|
||||
|
||||
const handleViewRecordDetail = (row) => {
|
||||
console.log(row)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -197,20 +409,151 @@ const searchUserName = () => {
|
|||
:option="option2"
|
||||
style="width: 90%; height: 80%"
|
||||
/>
|
||||
<!-- 第一个页面 -->
|
||||
<el-tabs
|
||||
v-model="activeName"
|
||||
style="margin-top: 2%"
|
||||
v-model="activeJob"
|
||||
type="card"
|
||||
class="demo-tabs"
|
||||
@tab-click="handleClick"
|
||||
@tab-change="handleClick()"
|
||||
>
|
||||
<el-tab-pane
|
||||
v-for="item in jobList"
|
||||
:key="item.id"
|
||||
:label="item.jobName"
|
||||
:name="item.id"
|
||||
><page-container :title="item.jobName">
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="Agreement">通过面试 </el-button>
|
||||
><page-container :title="item.jobName" v-loading="ListLoading">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="inputName"
|
||||
placeholder="请输入姓名"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-select
|
||||
v-model="isProcess"
|
||||
placeholder="筛选"
|
||||
style="width: 115px"
|
||||
@change="handleChange"
|
||||
>
|
||||
<el-option label="待处理" value="1" />
|
||||
<el-option label="已通过" value="2" />
|
||||
<el-option label="已拒绝" value="3" />
|
||||
</el-select>
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button :icon="Search" @click="searchUserName" />
|
||||
<el-button @click="getJobList" style="margin-left: 1%"
|
||||
>重置</el-button
|
||||
>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<el-scrollbar height="400px">
|
||||
<el-table
|
||||
stripe
|
||||
ref="multipleTableRef"
|
||||
:data="interviewerList"
|
||||
style="width: 100%"
|
||||
v-loading="interviewerListLoading"
|
||||
height="400"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="userName" label="姓名" />
|
||||
<el-table-column property="jobName" label="投递岗位" />
|
||||
<el-table-column property="resume.eduBack" label="学历" />
|
||||
<el-table-column property="resume.experience" label="工作时间">
|
||||
<template #default="{ row }"
|
||||
>{{ row.resume.experience }}年</template
|
||||
>
|
||||
</el-table-column>
|
||||
<el-table-column property="resume.major" label="专业" />
|
||||
<el-table-column property="createTime" label="投递时间" />
|
||||
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="面试邀请"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
v-if="row.status === 1 || row.status === 3"
|
||||
type="primary"
|
||||
:icon="ChatDotSquare"
|
||||
@click="handleInvite(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="拒绝申请"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
v-if="row.status === 1"
|
||||
type="danger"
|
||||
:icon="CloseBold"
|
||||
@click="handleDisagree(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="查看简历"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="success"
|
||||
:icon="Tickets"
|
||||
@click="handleViewResume(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-scrollbar> </page-container
|
||||
></el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<!-- 第二个页面 -->
|
||||
<el-tabs
|
||||
style="margin-top: 2%"
|
||||
v-model="activePosting"
|
||||
type="card"
|
||||
class="demo-tabs"
|
||||
@tab-change="handleChangePost()"
|
||||
>
|
||||
<el-tab-pane
|
||||
v-for="item in postintList"
|
||||
:key="item.postId"
|
||||
:label="item.postName"
|
||||
:name="item.postId"
|
||||
>
|
||||
<page-container title="面试结果" v-loading="getPostListLoading">
|
||||
<template #search>
|
||||
<el-select
|
||||
v-model="postFilterJob"
|
||||
placeholder="筛选"
|
||||
style="width: 115px"
|
||||
@change="handleRecordChangeJob"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in postJobList"
|
||||
:key="item.jobId"
|
||||
:label="item.jobName"
|
||||
:value="item.jobId"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
|
@ -221,9 +564,10 @@ const searchUserName = () => {
|
|||
>
|
||||
<template #prepend>
|
||||
<el-select
|
||||
v-model="filterApplication"
|
||||
v-model="filterRecored"
|
||||
placeholder="筛选"
|
||||
style="width: 115px"
|
||||
@change="handleRecordChangeStatus"
|
||||
>
|
||||
<el-option label="待处理" value="1" />
|
||||
<el-option label="已处理" value="2" />
|
||||
|
@ -236,25 +580,109 @@ const searchUserName = () => {
|
|||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="PassInterview">通过面试 </el-button>
|
||||
</template>
|
||||
<el-scrollbar height="400px">
|
||||
<el-table
|
||||
stripe
|
||||
ref="multipleTableRef"
|
||||
:data="tableData"
|
||||
:data="interviewPostList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleSelectionChange"
|
||||
height="400"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column label="Date" width="120">
|
||||
<template #default="scope">{{ scope.row.date }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column property="name" label="Name" width="120" />
|
||||
<el-table-column
|
||||
property="address"
|
||||
label="Address"
|
||||
show-overflow-tooltip
|
||||
property="userInfo.username"
|
||||
label="姓名"
|
||||
width="120"
|
||||
/>
|
||||
</el-table> </page-container
|
||||
></el-tab-pane>
|
||||
<el-table-column label="照片">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
:width="300"
|
||||
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; padding: 20px; width:550px; height:550px;"
|
||||
>
|
||||
<template #reference>
|
||||
<el-image
|
||||
:src="row.userInfo.avatar"
|
||||
style="height: 100px; width: 100px"
|
||||
/>
|
||||
</template>
|
||||
<el-image
|
||||
:src="row.userInfo.avatar"
|
||||
style="height: 500px; width: 500px"
|
||||
/>
|
||||
</el-popover>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
property="postInfo.talentInfo.execution"
|
||||
label="执行力"
|
||||
/>
|
||||
<el-table-column
|
||||
property="postInfo.talentInfo.internalDrive"
|
||||
label="内驱力"
|
||||
/>
|
||||
<el-table-column
|
||||
property="postInfo.talentInfo.pressureResistance"
|
||||
label="抗压力"
|
||||
/>
|
||||
|
||||
<el-table-column
|
||||
property="postInfo.talentInfo.matchRate"
|
||||
label="匹配度"
|
||||
/>
|
||||
|
||||
<el-table-column property="createTime" label="面试时间" />
|
||||
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="查看面试详情"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="View"
|
||||
@click="handleViewRecordDetail(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="不合格"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
v-if="filterRecored === 1"
|
||||
type="danger"
|
||||
:icon="CloseBold"
|
||||
@click="handleDisagreeApplication(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-scrollbar>
|
||||
</page-container>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<DisagreeDialog
|
||||
ref="disagreeDialog"
|
||||
@getJobList="getJobList"
|
||||
></DisagreeDialog>
|
||||
<InviteDialog ref="inviteDialog" @getJobList="getJobList"></InviteDialog>
|
||||
<ViewResume ref="viewResume"></ViewResume>
|
||||
</template>
|
||||
|
||||
<style scoped></style>
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { disagreeApplication } from '@/api/recruitment'
|
||||
const centerDialogVisible = ref(false)
|
||||
|
||||
const info = ref({})
|
||||
|
||||
const emit = defineEmits(['getJobList'])
|
||||
|
||||
const open = (row) => {
|
||||
info.value = row
|
||||
centerDialogVisible.value = true
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
await disagreeApplication(info.value.id)
|
||||
ElMessage.error('已拒绝!')
|
||||
centerDialogVisible.value = false
|
||||
emit('getJobList')
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="centerDialogVisible"
|
||||
title="警告"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<span
|
||||
>您确定拒绝<span class="typeNsme">{{ info.userName }}的面试申请</span
|
||||
>?</span
|
||||
>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="centerDialogVisible = false">取消</el-button>
|
||||
<el-button type="danger" @click="handleDelete"> 确定 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer button:first-child {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.typeNsme {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,384 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { Edit } from '@element-plus/icons-vue'
|
||||
import { getJobSettingByJobId, useGetCompanyDetail } from '@/api/recruitment'
|
||||
import { addInterviewNotice } from '@/api/interview'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
|
||||
const submitForm = ref({
|
||||
encoding: '',
|
||||
jobId: '',
|
||||
postId: '',
|
||||
selectQuestions: '',
|
||||
promote: '',
|
||||
inviteUser: '',
|
||||
userId: '',
|
||||
applicationId: '',
|
||||
companyName: ''
|
||||
})
|
||||
|
||||
const emit = defineEmits(['getJobList'])
|
||||
|
||||
const inviteDialogVisible = ref(false)
|
||||
|
||||
const activeSteps = ref(0)
|
||||
|
||||
const Professional = ref({})
|
||||
|
||||
const QuestionListLoading = ref(false)
|
||||
|
||||
const Comprehensive = ref({})
|
||||
|
||||
const applicationInfo = ref()
|
||||
|
||||
const ProfessionalQuestionListLength = ref(0)
|
||||
|
||||
const ComprehensiveQuestionListLength = ref(0)
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
|
||||
const open = async (row) => {
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
|
||||
submitForm.value.inviteUser = row.userId
|
||||
|
||||
submitForm.value.jobId = row.jobId
|
||||
|
||||
submitForm.value.postId = row.postingId
|
||||
|
||||
submitForm.value.applicationId = row.id
|
||||
|
||||
inviteDialogVisible.value = true
|
||||
|
||||
applicationInfo.value = row
|
||||
|
||||
console.log(applicationInfo.value)
|
||||
const res = await getJobSettingByJobId(row.jobId)
|
||||
|
||||
Professional.value = res.data.data.Professional
|
||||
|
||||
Comprehensive.value = res.data.data.Comprehensive
|
||||
|
||||
ProfessionalQuestionListLength.value =
|
||||
Professional.value.ProfessionalQuestionList.length
|
||||
|
||||
ComprehensiveQuestionListLength.value =
|
||||
Comprehensive.value.ComprehensiveQuestionList.length
|
||||
|
||||
console.log(res)
|
||||
|
||||
const resCompany = await useGetCompanyDetail(companyStore.encoding)
|
||||
|
||||
submitForm.value.companyName = resCompany.data.data.companyAllName
|
||||
}
|
||||
|
||||
const selectProfessionalList = ref([])
|
||||
|
||||
const selectProfessionalDetailList = ref([])
|
||||
|
||||
const handleSelectProfessionalChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectProfessionalList.value = []
|
||||
selectProfessionalDetailList.value = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectProfessionalList.value.indexOf(item.id) === -1) {
|
||||
selectProfessionalList.value.push(item.id)
|
||||
|
||||
let addArray = [
|
||||
{
|
||||
title: item.title,
|
||||
detail: item.details
|
||||
}
|
||||
]
|
||||
selectProfessionalDetailList.value = [
|
||||
...new Set([...selectProfessionalDetailList.value, ...addArray])
|
||||
]
|
||||
}
|
||||
})
|
||||
if (val.length !== selectProfessionalList.value.length) {
|
||||
selectProfessionalList.value = []
|
||||
selectProfessionalDetailList.value = []
|
||||
val.forEach((item) => {
|
||||
if (selectProfessionalList.value.indexOf(item.id) === -1) {
|
||||
selectProfessionalList.value.push(item.id)
|
||||
let addArray = [
|
||||
{
|
||||
title: item.title,
|
||||
detail: item.details
|
||||
}
|
||||
]
|
||||
selectProfessionalDetailList.value = [
|
||||
...new Set([...selectProfessionalDetailList.value, ...addArray])
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const selectComprehensiveList = ref([])
|
||||
const selectComprehensiveDetailList = ref([])
|
||||
const handleSelectComprehensiveChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectComprehensiveList.value = []
|
||||
selectComprehensiveDetailList.value = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectComprehensiveList.value.indexOf(item.id) === -1) {
|
||||
selectComprehensiveList.value.push(item.id)
|
||||
let addArray = [
|
||||
{
|
||||
title: item.title,
|
||||
detail: item.details
|
||||
}
|
||||
]
|
||||
selectComprehensiveDetailList.value = [
|
||||
...new Set([...selectComprehensiveDetailList.value, ...addArray])
|
||||
]
|
||||
}
|
||||
})
|
||||
if (val.length !== selectComprehensiveList.value.length) {
|
||||
selectComprehensiveList.value = []
|
||||
selectComprehensiveDetailList.value = []
|
||||
val.forEach((item) => {
|
||||
if (selectComprehensiveList.value.indexOf(item.id) === -1) {
|
||||
selectComprehensiveList.value.push(item.id)
|
||||
let addArray = [
|
||||
{
|
||||
title: item.title,
|
||||
detail: item.details
|
||||
}
|
||||
]
|
||||
selectComprehensiveDetailList.value = [
|
||||
...new Set([...selectComprehensiveDetailList.value, ...addArray])
|
||||
]
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const AllQuestionDetailList = ref([])
|
||||
const questionPromoteArray = ref([])
|
||||
|
||||
const nextStep = () => {
|
||||
//将题目整合
|
||||
submitForm.value.selectQuestions = [
|
||||
...new Set([
|
||||
...selectProfessionalList.value,
|
||||
...selectComprehensiveList.value
|
||||
])
|
||||
]
|
||||
|
||||
AllQuestionDetailList.value = [
|
||||
...new Set([
|
||||
...selectProfessionalDetailList.value,
|
||||
...selectComprehensiveDetailList.value
|
||||
])
|
||||
]
|
||||
|
||||
if (submitForm.value.selectQuestions.length === 0) {
|
||||
ElMessage.error('请选择题目!')
|
||||
return
|
||||
}
|
||||
|
||||
console.log(AllQuestionDetailList.value)
|
||||
AllQuestionDetailList.value.map((item) => {
|
||||
let questionpromote = [
|
||||
`你将扮演${submitForm.value.companyName}公司的面试官,我扮演面试${applicationInfo.value.jobName}的面试者${applicationInfo.value.userName}。你要用面试官的语气对我的回答进行简短的评价,除此之外不要说多余的话,不要提供解释,不要对回复提问,之后提出下一个问题:“${item.detail}”`
|
||||
]
|
||||
questionPromoteArray.value.push(questionpromote)
|
||||
console.log(questionPromoteArray.value)
|
||||
})
|
||||
activeSteps.value++
|
||||
}
|
||||
const promote = ref({
|
||||
systemPromote: '我是系统的promote',
|
||||
qustionsPromote: []
|
||||
})
|
||||
|
||||
const submit = async () => {
|
||||
if (
|
||||
submitForm.value.endTime === undefined ||
|
||||
submitForm.value.endTime === ''
|
||||
) {
|
||||
ElMessage.error('请选择面试结束时间!')
|
||||
return
|
||||
}
|
||||
const submitLoading = ElLoading.service({
|
||||
lock: true,
|
||||
text: 'Loading',
|
||||
background: 'rgba(0, 0, 0, 0.7)'
|
||||
})
|
||||
|
||||
submitForm.value.selectQuestions = JSON.stringify(
|
||||
submitForm.value.selectQuestions
|
||||
)
|
||||
promote.value.qustionsPromote = questionPromoteArray.value
|
||||
|
||||
submitForm.value.promote = JSON.stringify(promote.value)
|
||||
|
||||
console.log(submitForm.value)
|
||||
|
||||
const res = await addInterviewNotice(submitForm.value)
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
submitForm.value = {
|
||||
encoding: '',
|
||||
jobId: '',
|
||||
postId: '',
|
||||
selectQuestions: '',
|
||||
promote: '',
|
||||
inviteUser: '',
|
||||
userId: '',
|
||||
endTime: ''
|
||||
}
|
||||
selectProfessionalList.value = []
|
||||
|
||||
selectProfessionalDetailList.value = []
|
||||
|
||||
selectComprehensiveList.value = []
|
||||
|
||||
selectComprehensiveDetailList.value = []
|
||||
|
||||
inviteDialogVisible.value = false
|
||||
|
||||
emit('getJobList')
|
||||
|
||||
submitLoading.close()
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="inviteDialogVisible"
|
||||
title="邀请面试设置"
|
||||
width="60%"
|
||||
align-center
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-steps
|
||||
:active="activeSteps"
|
||||
finish-status="success"
|
||||
simple
|
||||
style="margin-top: 20px"
|
||||
>
|
||||
<el-step title="设置面试题目" :icon="Edit" />
|
||||
<el-step title="填写面试promote" :icon="Edit" />
|
||||
</el-steps>
|
||||
<el-scrollbar height="500px">
|
||||
<div v-if="activeSteps === 0">
|
||||
<el-card v-if="ProfessionalQuestionListLength !== 0" class="box-card">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span>{{ Professional.ProfessionalName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-scrollbar height="400px">
|
||||
<el-table
|
||||
v-loading="QuestionListLoading"
|
||||
ref="professionalRef"
|
||||
:data="Professional.ProfessionalQuestionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleSelectProfessionalChange"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column property="title" label="标题" />
|
||||
<el-table-column property="details" label="题目详情" />
|
||||
</el-table>
|
||||
</el-scrollbar>
|
||||
</el-card>
|
||||
<el-card v-if="ComprehensiveQuestionListLength !== 0" class="box-card">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span>{{ Comprehensive.ComprehensiveName }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-scrollbar height="400px">
|
||||
<el-table
|
||||
v-loading="QuestionListLoading"
|
||||
ref="professionalRef"
|
||||
:data="Comprehensive.ComprehensiveQuestionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleSelectComprehensiveChange"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column property="title" label="标题" />
|
||||
<el-table-column property="details" label="题目详情" />
|
||||
</el-table>
|
||||
</el-scrollbar>
|
||||
</el-card>
|
||||
</div>
|
||||
<div v-if="activeSteps === 1">
|
||||
<el-form
|
||||
ref="form"
|
||||
label-width="150px"
|
||||
style="padding-right: 30px"
|
||||
:model="FormModel"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item
|
||||
:style="{ marginTop: '20px' }"
|
||||
label="系统promote"
|
||||
prop="systemPromote"
|
||||
>
|
||||
<el-input
|
||||
v-model="promote.systemPromote"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
type="textarea"
|
||||
placeholder="Please input"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-for="(item, index) in AllQuestionDetailList"
|
||||
:key="item.id"
|
||||
:style="{ marginTop: '20px' }"
|
||||
:label="'题目promote' + index"
|
||||
:prop="'QuestionPromote' + index"
|
||||
>
|
||||
<el-input
|
||||
v-model="questionPromoteArray[index]"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
type="textarea"
|
||||
placeholder="Please input"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="面试结束时间" prop="endTime">
|
||||
<el-date-picker
|
||||
v-model="submitForm.endTime"
|
||||
type="date"
|
||||
placeholder="面试结束时间"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-scrollbar>
|
||||
<template #footer>
|
||||
<span v-if="activeSteps === 0">
|
||||
<el-button @click="inviteDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="nextStep"> 下一步 </el-button>
|
||||
</span>
|
||||
<span v-if="activeSteps === 1">
|
||||
<el-button @click="activeSteps--">上一步</el-button>
|
||||
<el-button type="primary" @click="submit"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.box-card {
|
||||
margin-top: 5%;
|
||||
width: 90%;
|
||||
margin-left: 5%;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,144 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
const openResume = ref(false)
|
||||
|
||||
const resumeDetail = ref({})
|
||||
|
||||
const open = (row) => {
|
||||
openResume.value = true
|
||||
resumeDetail.value = row.resume.resume
|
||||
resumeDetail.value.status =
|
||||
resumeDetail.value.status === 0 ? '职场人' : '应聘者'
|
||||
resumeDetail.value.sex = resumeDetail.value.sex === 0 ? '女' : '男'
|
||||
console.log(resumeDetail.value)
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-drawer
|
||||
v-model="openResume"
|
||||
:title="resumeDetail.name + '的简历详情'"
|
||||
direction="rtl"
|
||||
size="50%"
|
||||
>
|
||||
<div class="resume-form">
|
||||
<el-form ref="resumeForm" :model="resumeDetail" label-width="120px">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="头像">
|
||||
<img :src="resumeDetail.avatar" class="avatar" />
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名">
|
||||
<el-input v-model="resumeDetail.name" :disabled="true"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别">
|
||||
<el-input v-model="resumeDetail.sex" :disabled="true"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份">
|
||||
<el-input
|
||||
v-model="resumeDetail.status"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="手机号">
|
||||
<el-input
|
||||
v-model="resumeDetail.phone"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="邮箱">
|
||||
<el-input
|
||||
v-model="resumeDetail.email"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="微信号">
|
||||
<el-input v-model="resumeDetail.vx" :disabled="true"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="毕业年份">
|
||||
<el-input
|
||||
v-model="resumeDetail.graduateTime"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="出生年月">
|
||||
<el-input
|
||||
v-model="resumeDetail.birthday"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="个人优势">
|
||||
<el-input
|
||||
:disabled="true"
|
||||
type="textarea"
|
||||
v-model="resumeDetail.personalAdvantage"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位期望">
|
||||
<el-input
|
||||
:disabled="true"
|
||||
type="textarea"
|
||||
v-model="resumeDetail.jobExpectation"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="工作经历">
|
||||
<el-input
|
||||
:disabled="true"
|
||||
type="textarea"
|
||||
v-model="resumeDetail.workExperience"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="项目经历">
|
||||
<el-input
|
||||
:disabled="true"
|
||||
type="textarea"
|
||||
v-model="resumeDetail.projectExperience"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="其他信息">
|
||||
<el-input
|
||||
:disabled="true"
|
||||
type="textarea"
|
||||
v-model="resumeDetail.other"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.resume-form {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.el-form-item__label {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
|
@ -42,7 +42,7 @@ const handleDelete = (row) => {
|
|||
>
|
||||
<el-table-column type="index" label="序号" width="200" />
|
||||
<el-table-column prop="picName" label="名称" width="200" />
|
||||
<el-table-column prop="image" label="背景图片" width="900">
|
||||
<el-table-column prop="image" label="背景图片">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
:width="300"
|
||||
|
@ -55,9 +55,20 @@ const handleDelete = (row) => {
|
|||
</el-popover>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="picName" label="地址">
|
||||
<template #default="{ row }">
|
||||
<a :href="row.image || row.video" target="_blank">点我查看</a>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -65,6 +76,7 @@ const handleDelete = (row) => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
|
|
@ -40,11 +40,26 @@ const handleDelete = (row) => {
|
|||
<el-table v-loading="loading" :data="imageList" stripe style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="200" />
|
||||
<el-table-column prop="picName" label="名称" width="200" />
|
||||
<el-table-column prop="image" label="形象图片" width="900">
|
||||
|
||||
<el-table-column prop="image" label="形象图片">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
:width="300"
|
||||
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; padding: 20px; width:450px; height:550px;"
|
||||
v-if="row.image === ''"
|
||||
>
|
||||
<template #reference>
|
||||
<video
|
||||
:src="row.video"
|
||||
style="height: 100px; width: 100px"
|
||||
></video>
|
||||
</template>
|
||||
<video :src="row.video" style="height: 500px; width: 400px"></video>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
:width="300"
|
||||
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; padding: 20px; width:450px; height:550px;"
|
||||
v-else
|
||||
>
|
||||
<template #reference>
|
||||
<el-image :src="row.image" style="height: 100px; width: 100px" />
|
||||
|
@ -53,9 +68,20 @@ const handleDelete = (row) => {
|
|||
</el-popover>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="picName" label="地址">
|
||||
<template #default="{ row }">
|
||||
<a :href="row.image || row.video" target="_blank">点我查看</a>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -63,6 +89,7 @@ const handleDelete = (row) => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
|
|
@ -38,7 +38,7 @@ const handleDelete = (row) => {
|
|||
<el-table v-loading="loading" :data="logoList" stripe style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="200" />
|
||||
<el-table-column prop="picName" label="名称" width="200" />
|
||||
<el-table-column prop="image" label="Logo" width="900">
|
||||
<el-table-column prop="image" label="Logo">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
:width="300"
|
||||
|
@ -51,9 +51,20 @@ const handleDelete = (row) => {
|
|||
</el-popover>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="picName" label="地址">
|
||||
<template #default="{ row }">
|
||||
<a :href="row.image || row.video" target="_blank">点我查看</a>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -61,6 +72,7 @@ const handleDelete = (row) => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useUploadPic, useDeletePic } from '@/api/upload'
|
||||
import {
|
||||
useUploadPic,
|
||||
useDeletePic,
|
||||
useUploadVideo,
|
||||
useDeleteVideo
|
||||
} from '@/api/upload'
|
||||
import { useAddImage } from '@/api/interview'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
|
@ -13,36 +18,76 @@ const open = () => {
|
|||
|
||||
const form = ref({
|
||||
image: '',
|
||||
video: '',
|
||||
userId: '',
|
||||
name: '',
|
||||
encoding: '',
|
||||
filename: ''
|
||||
filename: '',
|
||||
sex: '0'
|
||||
})
|
||||
const uploadPic = ref()
|
||||
const fileList = ref([])
|
||||
const dialogImageUrl = ref('')
|
||||
const dialogVisible = ref(false)
|
||||
const dialogImageVisible = ref(false)
|
||||
const dialogVideoVisible = ref(false)
|
||||
|
||||
//hideUploadEdit: false, //是否隐藏上传按钮
|
||||
//上传图片的方法
|
||||
|
||||
const UploadImage = async (file) => {
|
||||
console.log(file.raw)
|
||||
console.log(file)
|
||||
console.log(file.raw.type)
|
||||
let fd = new FormData()
|
||||
fd.append('file', file.raw) //传给后台接收的名字 file
|
||||
if (file.raw.type === 'video/mp4') {
|
||||
const res = await useUploadVideo(fd)
|
||||
form.value.video = res.data.data.video
|
||||
form.value.filename = res.data.data.filename
|
||||
console.log(form.value.video)
|
||||
return
|
||||
}
|
||||
if (
|
||||
file.raw.type === 'image/png' ||
|
||||
file.raw.type === 'image/gif' ||
|
||||
file.raw.type === 'image/bmp' ||
|
||||
file.raw.type === 'image/jpg' ||
|
||||
file.raw.type === 'image/jpeg'
|
||||
) {
|
||||
const res = await useUploadPic(fd)
|
||||
console.log(res.data.data)
|
||||
form.value.image = res.data.data.image
|
||||
form.value.filename = res.data.data.filename
|
||||
console.log(form.value)
|
||||
return
|
||||
}
|
||||
}
|
||||
//移除图片功能
|
||||
const handleRemove = async () => {
|
||||
if (form.value.image !== '') {
|
||||
await useDeletePic(form.value.filename)
|
||||
} else {
|
||||
console.log(form.value.filename)
|
||||
await useDeleteVideo(form.value.filename)
|
||||
}
|
||||
}
|
||||
//预览图片功能
|
||||
const handlePictureCardPreview = (file) => {
|
||||
console.log(file.url)
|
||||
dialogVisible.value = true
|
||||
dialogImageUrl.value = file.url
|
||||
if (
|
||||
file.raw.type === 'image/png' ||
|
||||
file.raw.type === 'image/gif' ||
|
||||
file.raw.type === 'image/bmp' ||
|
||||
file.raw.type === 'image/jpg' ||
|
||||
file.raw.type === 'image/jpeg'
|
||||
) {
|
||||
dialogImageVisible.value = true
|
||||
dialogImageUrl.value = form.value.image
|
||||
console.log(dialogImageUrl.value)
|
||||
console.log('打开图片')
|
||||
}
|
||||
if (file.raw.type === 'video/mp4') {
|
||||
dialogVideoVisible.value = true
|
||||
dialogImageUrl.value = form.value.video
|
||||
console.log('打开视频')
|
||||
}
|
||||
}
|
||||
const uploadForm = ref()
|
||||
const companyStore = useCompanyStore()
|
||||
|
@ -57,13 +102,22 @@ const upload = async () => {
|
|||
ElMessage.success(res.data.data)
|
||||
emit('getImagesList')
|
||||
centerDialogVisible.value = false
|
||||
form.value = {}
|
||||
form.value = {
|
||||
image: '',
|
||||
video: '',
|
||||
userId: '',
|
||||
name: '',
|
||||
encoding: '',
|
||||
filename: '',
|
||||
sex: '0'
|
||||
}
|
||||
|
||||
uploadPic.value.clearFiles()
|
||||
}
|
||||
|
||||
const rules = {
|
||||
name: [{ required: true, message: '请输入图片名称', trigger: 'blur' }]
|
||||
name: [{ required: true, message: '请输入图片名称', trigger: 'blur' }],
|
||||
sex: [{ required: true, message: '请选择面试官性别', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
|
@ -88,6 +142,12 @@ defineExpose({
|
|||
<el-form-item label="名称" prop="name">
|
||||
<el-input placeholder="请输入图片名称" v-model="form.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="面试官性别" prop="sex">
|
||||
<el-radio-group v-model="form.sex" class="ml-4">
|
||||
<el-radio label="0" size="large">男</el-radio>
|
||||
<el-radio label="1" size="large">女</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="形象图片">
|
||||
<el-upload
|
||||
ref="uploadPic"
|
||||
|
@ -103,14 +163,25 @@ defineExpose({
|
|||
<i class="el-icon-plus"></i>
|
||||
<template #tip>
|
||||
<div style="font-size: 12px; color: #919191">
|
||||
单次限制上传一张图片
|
||||
单次限制上传一张图片或视频
|
||||
</div>
|
||||
</template>
|
||||
<el-icon><Plus /></el-icon>
|
||||
</el-upload>
|
||||
<el-dialog v-model="dialogVisible" style="line-height: 0">
|
||||
<el-dialog
|
||||
v-model="dialogImageVisible"
|
||||
style="line-height: 0"
|
||||
v-if="form.image !== ''"
|
||||
>
|
||||
<img style="width: 100%; height: 100%" :src="dialogImageUrl" alt="" />
|
||||
</el-dialog>
|
||||
<el-dialog v-model="dialogVideoVisible" style="line-height: 0" v-else>
|
||||
<video
|
||||
style="width: 100%; height: 100%"
|
||||
:src="dialogImageUrl"
|
||||
controls="controls"
|
||||
></video>
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
|
|
|
@ -75,6 +75,7 @@ defineExpose({
|
|||
title="添加Logo"
|
||||
width="30%"
|
||||
align-center
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-form
|
||||
label-width="100px"
|
||||
|
|
|
@ -14,7 +14,9 @@ import {
|
|||
DataBoard,
|
||||
SetUp,
|
||||
Phone,
|
||||
Setting
|
||||
Setting,
|
||||
Share,
|
||||
Compass
|
||||
} from '@element-plus/icons-vue'
|
||||
import avatar from '@/assets/default.png'
|
||||
import { useUserStore, useCompanyStore } from '@/stores'
|
||||
|
@ -23,6 +25,7 @@ import { useRouter } from 'vue-router'
|
|||
import ChangeAvatarDialog from './components/ChangeAvatarDialog.vue'
|
||||
import RestPasswordDialog from './components/ResetPasswordDialog.vue'
|
||||
import { ref } from 'vue'
|
||||
import UserInfoDialog from './components/UserInfoDialog.vue'
|
||||
|
||||
const userStore = useUserStore()
|
||||
const companyStore = useCompanyStore()
|
||||
|
@ -35,6 +38,13 @@ const Logout = async () => {
|
|||
ElMessage.success('退出成功')
|
||||
router.replace('/login')
|
||||
}
|
||||
|
||||
const userInfoDialog = ref()
|
||||
const OpenUserInfo = () => {
|
||||
console.log('打开')
|
||||
userInfoDialog.value.open()
|
||||
}
|
||||
|
||||
const changeAvatarDialog = ref()
|
||||
const ChangeAvatar = () => {
|
||||
changeAvatarDialog.value.open()
|
||||
|
@ -98,6 +108,10 @@ const RestPassword = () => {
|
|||
<el-icon><EditPen /></el-icon>
|
||||
<span>题目管理</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="/question/square">
|
||||
<el-icon><Share /></el-icon>
|
||||
<span>题目广场</span>
|
||||
</el-menu-item>
|
||||
</el-sub-menu>
|
||||
<el-sub-menu index="/recruitment/publicManagement">
|
||||
<template #title>
|
||||
|
@ -110,7 +124,7 @@ const RestPassword = () => {
|
|||
<span>面试设置</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="/recruitment/jobManagement">
|
||||
<el-icon><Discount /></el-icon>
|
||||
<el-icon><Compass /></el-icon>
|
||||
<span>岗位管理</span>
|
||||
</el-menu-item>
|
||||
|
||||
|
@ -118,6 +132,10 @@ const RestPassword = () => {
|
|||
<el-icon><Discount /></el-icon>
|
||||
<span>公司详情</span>
|
||||
</el-menu-item>
|
||||
<el-menu-item index="/recruitment/publicJob">
|
||||
<el-icon><Discount /></el-icon>
|
||||
<span>面试发布</span>
|
||||
</el-menu-item>
|
||||
</el-sub-menu>
|
||||
</el-menu>
|
||||
</el-aside>
|
||||
|
@ -133,7 +151,10 @@ const RestPassword = () => {
|
|||
</span>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item command="profile" :icon="User"
|
||||
<el-dropdown-item
|
||||
command="profile"
|
||||
:icon="User"
|
||||
@click="OpenUserInfo"
|
||||
>基本资料</el-dropdown-item
|
||||
>
|
||||
<el-dropdown-item
|
||||
|
@ -167,6 +188,10 @@ const RestPassword = () => {
|
|||
</el-container>
|
||||
<ChangeAvatarDialog ref="changeAvatarDialog"> </ChangeAvatarDialog>
|
||||
<RestPasswordDialog ref="restPasswordDialog"></RestPasswordDialog>
|
||||
<UserInfoDialog
|
||||
ref="userInfoDialog"
|
||||
@changeAvatarDialog="changeAvatarDialog"
|
||||
></UserInfoDialog>
|
||||
</el-container>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@ defineExpose({
|
|||
title="更改头像"
|
||||
width="30%"
|
||||
align-center
|
||||
:append-to-body="true"
|
||||
>
|
||||
<el-form label-width="100px" :model="form" style="padding-right: 30px">
|
||||
<el-form-item label="上传头像">
|
||||
|
|
|
@ -0,0 +1,223 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useUserStore } from '@/stores'
|
||||
import { useUploadPic, useDeletePic } from '@/api/upload'
|
||||
import { useChangeAvatar, useUploadUserInfo } from '@/api/user'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
const form = ref()
|
||||
const submitForm = ref({})
|
||||
const UserInfoDialog = ref(false)
|
||||
const userStore = useUserStore()
|
||||
const PictureCardPreviewDialog = ref(false)
|
||||
const dialogImageUrl = ref('')
|
||||
|
||||
const AvatarDialog = ref(false)
|
||||
|
||||
const AvartarForm = ref({})
|
||||
|
||||
const userRole = ref()
|
||||
const open = () => {
|
||||
UserInfoDialog.value = true
|
||||
submitForm.value = userStore.userInfo
|
||||
userRole.value =
|
||||
userStore.userInfo.role === '1'
|
||||
? '超级管理员'
|
||||
: userStore.userInfo.role === '2'
|
||||
? 'HR'
|
||||
: userStore.userInfo.role === '3'
|
||||
? '员工'
|
||||
: '面试者'
|
||||
|
||||
submitForm.value.userId = submitForm.value.id
|
||||
submitForm.value.updateId = submitForm.value.id
|
||||
}
|
||||
|
||||
const rules = ref({
|
||||
phone: [{ required: true, message: '请输入手机号码', trigger: 'blur' }],
|
||||
role: [{ required: true, message: '请输入权限', trigger: 'blur' }],
|
||||
username: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
|
||||
age: [{ required: true, message: '请输入年龄', trigger: 'blur' }],
|
||||
email: [{ required: true, message: '请输入电子邮箱', trigger: 'blur' }]
|
||||
})
|
||||
|
||||
//上传图片的方法
|
||||
|
||||
const UploadImage = async (file) => {
|
||||
console.log(file.raw)
|
||||
let fd = new FormData()
|
||||
fd.append('file', file.raw) //传给后台接收的名字 file
|
||||
const res = await useUploadPic(fd)
|
||||
console.log(res.data.data)
|
||||
AvartarForm.value.avatar = res.data.data.image
|
||||
AvartarForm.value.filename = res.data.data.filename
|
||||
}
|
||||
//移除图片功能
|
||||
const handleRemove = async () => {
|
||||
await useDeletePic(AvartarForm.value.filename)
|
||||
}
|
||||
//预览图片功能
|
||||
const handlePictureCardPreview = (file) => {
|
||||
console.log(file)
|
||||
PictureCardPreviewDialog.value = true
|
||||
dialogImageUrl.value = file.url
|
||||
}
|
||||
//提交图片
|
||||
const uploadPicture = async () => {
|
||||
AvartarForm.value.userId = submitForm.value.id
|
||||
const res = await useChangeAvatar(AvartarForm.value)
|
||||
AvatarDialog.value = false
|
||||
userStore.setUserInfo(res.data.data)
|
||||
submitForm.value.avatar = AvartarForm.value.avatar
|
||||
ElMessage.success('更新头像成功')
|
||||
}
|
||||
|
||||
const submit = async () => {
|
||||
await form.value.validate()
|
||||
const res = await useUploadUserInfo(submitForm.value)
|
||||
userStore.userInfo = res.data.data
|
||||
ElMessage.success('更新数据成功')
|
||||
UserInfoDialog.value = false
|
||||
submitForm.value = ''
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog title="修改个人信息" v-model="UserInfoDialog" width="60%">
|
||||
<el-form
|
||||
:model="submitForm"
|
||||
ref="form"
|
||||
:rules="rules"
|
||||
label-width="160px"
|
||||
>
|
||||
<div class="updateinfo">
|
||||
<div class="left">
|
||||
<el-form-item>
|
||||
<img
|
||||
style="width: 200px; height: 200px"
|
||||
:src="submitForm.avatar"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<div style="padding-left: 25%; padding-top: 10%">
|
||||
<el-button @click="AvatarDialog = true">更换头像</el-button>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</div>
|
||||
<div class="right">
|
||||
<el-form-item label="手机号码/账号" prop="phone">
|
||||
<el-input
|
||||
style="width: 50%"
|
||||
size="large"
|
||||
v-model="submitForm.phone"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="权限" prop="role">
|
||||
<el-input
|
||||
style="width: 50%"
|
||||
size="large"
|
||||
v-model="userRole"
|
||||
:disabled="true"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名" prop="username">
|
||||
<el-input
|
||||
style="width: 50%"
|
||||
size="large"
|
||||
v-model="submitForm.username"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="年龄" prop="age">
|
||||
<el-input
|
||||
style="width: 50%"
|
||||
size="large"
|
||||
v-model="submitForm.age"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="邮箱" prop="email">
|
||||
<el-input
|
||||
style="width: 50%"
|
||||
size="large"
|
||||
v-model="submitForm.email"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别">
|
||||
<el-radio-group v-model="submitForm.sex">
|
||||
<el-radio label="男">男</el-radio>
|
||||
<el-radio label="女">女</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="handleClose">取 消</el-button>
|
||||
<el-button type="primary" @click="submit">提 交</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog
|
||||
v-model="AvatarDialog"
|
||||
title="更改头像"
|
||||
width="30%"
|
||||
align-center
|
||||
:append-to-body="true"
|
||||
>
|
||||
<el-form label-width="100px" :model="form" style="padding-right: 30px">
|
||||
<el-form-item label="上传头像">
|
||||
<el-upload
|
||||
ref="uploadPic"
|
||||
action=""
|
||||
list-type="picture-card"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="handleRemove"
|
||||
:on-change="UploadImage"
|
||||
:limit="1"
|
||||
:file-list="fileList"
|
||||
:auto-upload="false"
|
||||
>
|
||||
<i class="el-icon-plus"></i>
|
||||
<template #tip>
|
||||
<div style="font-size: 12px; color: #919191">
|
||||
单次限制上传一张图片
|
||||
</div>
|
||||
</template>
|
||||
<el-icon><Plus /></el-icon>
|
||||
</el-upload>
|
||||
<el-dialog v-model="PictureCardPreviewDialog" style="line-height: 0">
|
||||
<img
|
||||
style="width: 100%; height: 100%"
|
||||
:src="dialogImageUrl"
|
||||
alt=""
|
||||
/>
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="AvatarDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="uploadPicture"> 更改 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<style scoped>
|
||||
.updateinfo {
|
||||
height: 350px;
|
||||
overflow: auto;
|
||||
}
|
||||
.left {
|
||||
/* width: 330px; */
|
||||
float: left;
|
||||
}
|
||||
.right {
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
|
@ -1,11 +1,11 @@
|
|||
<script setup>
|
||||
import { Delete } from '@element-plus/icons-vue'
|
||||
import { useGetAdminList, useSearchAdmin } from '@/api/user'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { Search, Edit, Delete } from '@element-plus/icons-vue'
|
||||
import { ref } from 'vue'
|
||||
import AdminAddEndit from './components/AdminAddEndit.vue'
|
||||
import AdminDelEndit from './components/AdminDelEndit.vue'
|
||||
import ResetPasswordDialog from './components/ResetPasswordDialog.vue'
|
||||
|
||||
const loading = ref(false)
|
||||
const adminAddEndit = ref()
|
||||
|
@ -13,7 +13,7 @@ const adminList = ref([])
|
|||
|
||||
const searchName = ref('')
|
||||
const companyStore = useCompanyStore()
|
||||
|
||||
const userStore = useUserStore()
|
||||
const searchUserName = async () => {
|
||||
loading.value = true
|
||||
const res = await useSearchAdmin(searchName.value, companyStore.encoding)
|
||||
|
@ -38,6 +38,10 @@ const adminDelEndit = ref()
|
|||
const handleDelete = (row) => {
|
||||
adminDelEndit.value.open(row)
|
||||
}
|
||||
const resetPasswordDialog = ref()
|
||||
const handleEdit = (row) => {
|
||||
resetPasswordDialog.value.open(row)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -59,7 +63,12 @@ const handleDelete = (row) => {
|
|||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="onAddEdit">添加管理员 </el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="onAddEdit"
|
||||
:disabled="userStore.userInfo.role === '2' ? false : true"
|
||||
>添加管理员
|
||||
</el-button>
|
||||
</template>
|
||||
<el-table v-loading="loading" :data="adminList" stripe style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
|
@ -68,13 +77,36 @@ const handleDelete = (row) => {
|
|||
<el-table-column prop="email" label="电子邮箱" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改密码"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
:disabled="userStore.userInfo.role === '2' ? false : true"
|
||||
@click="handleEdit(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
:disabled="userStore.userInfo.role === '2' ? false : true"
|
||||
@click="handleDelete(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
@ -87,5 +119,6 @@ const handleDelete = (row) => {
|
|||
></AdminAddEndit>
|
||||
<AdminDelEndit ref="adminDelEndit" @getAdminList="getAdminList">
|
||||
</AdminDelEndit>
|
||||
<ResetPasswordDialog ref="resetPasswordDialog"></ResetPasswordDialog>
|
||||
</page-container>
|
||||
</template>
|
||||
|
|
|
@ -9,7 +9,11 @@ const companyStore = useCompanyStore()
|
|||
const addEnditDialog = ref(false)
|
||||
|
||||
const form = ref()
|
||||
const FormModel = ref({})
|
||||
const FormModel = ref({
|
||||
username: '',
|
||||
phone: '',
|
||||
role: ''
|
||||
})
|
||||
|
||||
const open = () => {
|
||||
addEnditDialog.value = true
|
||||
|
@ -23,7 +27,8 @@ const rules = {
|
|||
message: '输入的手机号码格式不正确,请重新输入',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
],
|
||||
role: [{ required: true, message: '请选择添加人权限', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
const emit = defineEmits(['getAdminList'])
|
||||
|
@ -35,10 +40,14 @@ const submitForm = async () => {
|
|||
userStore.userInfo.id,
|
||||
FormModel.value.username,
|
||||
FormModel.value.phone,
|
||||
userStore.userInfo.role
|
||||
FormModel.value.role
|
||||
)
|
||||
ElMessage.success('添加成功!')
|
||||
FormModel.value = {}
|
||||
FormModel.value = {
|
||||
username: '',
|
||||
phone: '',
|
||||
role: ''
|
||||
}
|
||||
|
||||
addEnditDialog.value = false
|
||||
|
||||
|
@ -64,6 +73,12 @@ defineExpose({
|
|||
placeholder="请输入管理员姓名"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="管理员权限" prop="role">
|
||||
<el-radio-group v-model="FormModel.role" class="ml-4">
|
||||
<el-radio label="2" size="large">公司管理员</el-radio>
|
||||
<el-radio label="3" size="large">HR</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="账号/手机号码" prop="phone">
|
||||
<el-input v-model="FormModel.phone" placeholder="请输入账号/手机号码" />
|
||||
</el-form-item>
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useUserStore } from '@/stores'
|
||||
import { useAdminEditPassword } from '@/api/user'
|
||||
|
||||
const Restepassword = ref(false)
|
||||
|
||||
const FormModel = ref({
|
||||
password: '',
|
||||
userId: '',
|
||||
updateUserId: ''
|
||||
})
|
||||
const rules = {
|
||||
password: [{ required: true, message: '请输入新密码', trigger: 'blur' }]
|
||||
}
|
||||
const userStore = useUserStore()
|
||||
const open = (row) => {
|
||||
Restepassword.value = true
|
||||
FormModel.value.userId = userStore.userInfo.id
|
||||
FormModel.value.updateUserId = row.id
|
||||
}
|
||||
const form = ref()
|
||||
const PsswordEdit = async () => {
|
||||
await form.value.validate()
|
||||
const res = await useAdminEditPassword(FormModel.value)
|
||||
ElMessage.success(res.data.data)
|
||||
Restepassword.value = false
|
||||
FormModel.value = { password: '', userId: '', updateUserId: '' }
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog v-model="Restepassword" title="修改密码" width="30%" align-center>
|
||||
<el-form
|
||||
ref="form"
|
||||
label-width="150px"
|
||||
style="padding-right: 30px"
|
||||
:model="FormModel"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="新密码" prop="password">
|
||||
<el-input
|
||||
v-model="FormModel.password"
|
||||
placeholder="请输入新密码"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="centerDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="PsswordEdit"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -1,5 +1,5 @@
|
|||
<script setup>
|
||||
import { Edit, Delete, View, Search } from '@element-plus/icons-vue'
|
||||
import { Edit, Delete, View, Search, Share } from '@element-plus/icons-vue'
|
||||
import {
|
||||
useGetQuestionList,
|
||||
useGetTypeList,
|
||||
|
@ -10,6 +10,7 @@ import { useCompanyStore } from '@/stores'
|
|||
import QuestionEndit from './components/QuestionEndit.vue'
|
||||
import QuestionDelDialog from './components/QuestionDelDialog.vue'
|
||||
import QuestionDetailDialog from './components/QuestionDetailDialog.vue'
|
||||
import SharedQuestionDialog from './components/SharedQuestionDialog.vue'
|
||||
|
||||
const questionList = ref([])
|
||||
|
||||
|
@ -56,6 +57,12 @@ const handleDelete = (row) => {
|
|||
questionDelDialog.value.openDialog(row)
|
||||
}
|
||||
|
||||
const sharedQuestionDialog = ref()
|
||||
|
||||
const handleShared = (row) => {
|
||||
sharedQuestionDialog.value.open(row)
|
||||
}
|
||||
|
||||
const questionDetailDialog = ref()
|
||||
const showDetail = (row) => {
|
||||
console.log(row)
|
||||
|
@ -116,10 +123,17 @@ const searchQuestion = async () => {
|
|||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column prop="title" label="题目标题" />
|
||||
<el-table-column prop="typeName" label="题库类型" />
|
||||
<el-table-column prop="details" label="题目详情" />
|
||||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column prop="updateTime" label="更新时间" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<el-table-column label="操作" width="250">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改题目信息"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
|
@ -127,6 +141,14 @@ const searchQuestion = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除题目"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -134,9 +156,31 @@ const searchQuestion = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="分享题目"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="warning"
|
||||
:icon="Share"
|
||||
@click="handleShared(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="查看题目详情"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button type="info" :icon="View" plain @click="showDetail(row)"
|
||||
>更多</el-button
|
||||
>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
@ -152,5 +196,7 @@ const searchQuestion = async () => {
|
|||
ref="questionDelDialog"
|
||||
></QuestionDelDialog>
|
||||
<QuestionDetailDialog ref="questionDetailDialog"> </QuestionDetailDialog>
|
||||
|
||||
<SharedQuestionDialog ref="sharedQuestionDialog"></SharedQuestionDialog>
|
||||
</page-container>
|
||||
</template>
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import QuestionTypeSquareContainer from './container/QuestionTypeSquareContainer.vue'
|
||||
import QuestionSquareContainer from './container/QuestionSquareContainer.vue'
|
||||
import MyShareQuestionTypeContainer from './container/MyShareQuestionTypeContainer.vue'
|
||||
import MyShareQuestionContainer from './container/MyShareQuestionContainer.vue'
|
||||
const activeIndex = ref('1')
|
||||
|
||||
const handleSelect = (index) => {
|
||||
activeIndex.value = index
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<el-menu
|
||||
:default-active="activeIndex"
|
||||
class="el-menu-demo"
|
||||
mode="horizontal"
|
||||
@select="handleSelect"
|
||||
>
|
||||
<el-menu-item index="1">题库广场</el-menu-item>
|
||||
<el-menu-item index="2">题目广场</el-menu-item>
|
||||
<el-sub-menu index="3">
|
||||
<template #title>我的分享</template>
|
||||
<el-menu-item index="3-1">题库</el-menu-item>
|
||||
<el-menu-item index="3-2">题目</el-menu-item>
|
||||
</el-sub-menu>
|
||||
</el-menu>
|
||||
|
||||
<QuestionTypeSquareContainer
|
||||
v-if="activeIndex === '1'"
|
||||
></QuestionTypeSquareContainer>
|
||||
<QuestionSquareContainer v-if="activeIndex === '2'"></QuestionSquareContainer>
|
||||
<MyShareQuestionTypeContainer
|
||||
v-if="activeIndex === '3-1'"
|
||||
></MyShareQuestionTypeContainer>
|
||||
<MyShareQuestionContainer
|
||||
v-if="activeIndex === '3-2'"
|
||||
></MyShareQuestionContainer>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.page-container {
|
||||
min-height: 90%;
|
||||
box-sizing: border-box;
|
||||
.header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -1,5 +1,5 @@
|
|||
<script setup>
|
||||
import { Edit, Delete, Search } from '@element-plus/icons-vue'
|
||||
import { Edit, Delete, Search, Share } from '@element-plus/icons-vue'
|
||||
import { useGetTypeList, useSearchType } from '@/api/question'
|
||||
|
||||
import { useCompanyStore } from '@/stores'
|
||||
|
@ -7,6 +7,8 @@ import { ref } from 'vue'
|
|||
import QuestionTypeEdit from './components/QuestionTypeEdit.vue'
|
||||
|
||||
import QuestionTypeDialog from './components/QuestionTypeDialog.vue'
|
||||
|
||||
import ShareQuestionTypeDialog from './components/ShareQuestionTypeDialog.vue'
|
||||
const filterType = ref()
|
||||
const searchTypeName = ref('')
|
||||
const questionTypeList = ref([])
|
||||
|
@ -31,7 +33,10 @@ const deleteDialog = ref()
|
|||
const handleDelete = (row) => {
|
||||
deleteDialog.value.openDialog(row)
|
||||
}
|
||||
|
||||
const shareQuestionTypeDialog = ref()
|
||||
const handleShared = (row) => {
|
||||
shareQuestionTypeDialog.value.open(row)
|
||||
}
|
||||
const onAddEdit = () => {
|
||||
dialog.value.open({})
|
||||
}
|
||||
|
@ -107,6 +112,12 @@ const search = async () => {
|
|||
<el-table-column prop="updateTime" label="更新时间" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改题库"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
|
@ -114,6 +125,13 @@ const search = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除题库"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -121,6 +139,21 @@ const search = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="分享题库"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="warning"
|
||||
:icon="Share"
|
||||
@click="handleShared(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
@ -135,5 +168,7 @@ const search = async () => {
|
|||
@getQuestionTypeList="getQuestionTypeList"
|
||||
ref="deleteDialog"
|
||||
></QuestionTypeDialog>
|
||||
<ShareQuestionTypeDialog ref="shareQuestionTypeDialog">
|
||||
</ShareQuestionTypeDialog>
|
||||
</page-container>
|
||||
</template>
|
||||
|
|
|
@ -32,9 +32,9 @@ defineExpose({
|
|||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="题目promote" prop="promote">
|
||||
<el-form-item label="题目预设答案" prop="answer">
|
||||
<el-input
|
||||
:value="questionDetails.promote"
|
||||
:value="questionDetails.answer"
|
||||
:autosize="{ minRows: 2, maxRows: 6 }"
|
||||
type="textarea"
|
||||
disabled
|
||||
|
|
|
@ -21,8 +21,7 @@ const FormModel = ref({})
|
|||
const rules = {
|
||||
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
|
||||
typeName: [{ required: true, message: '请选择题库类型', trigger: 'blur' }],
|
||||
details: [{ required: true, message: '请输入题目详情', trigger: 'blur' }],
|
||||
promote: [{ required: true, message: '请输入题目的promote', trigger: 'blur' }]
|
||||
details: [{ required: true, message: '请输入题目详情', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
|
@ -46,16 +45,19 @@ const userStore = useUserStore()
|
|||
const updateForm = async () => {
|
||||
await form.value.validate()
|
||||
const isEndit = FormModel.value.id
|
||||
|
||||
if (FormModel.value.answer === undefined) {
|
||||
FormModel.value.answer = ''
|
||||
}
|
||||
if (isEndit) {
|
||||
//编辑
|
||||
console.log('编辑')
|
||||
|
||||
await useUpdateQuestion(
|
||||
FormModel.value.id,
|
||||
FormModel.value.title,
|
||||
FormModel.value.typeId,
|
||||
FormModel.value.details,
|
||||
FormModel.value.promote,
|
||||
FormModel.value.answer,
|
||||
companyStore.encoding,
|
||||
userStore.userInfo.id
|
||||
)
|
||||
|
@ -69,7 +71,7 @@ const updateForm = async () => {
|
|||
FormModel.value.title,
|
||||
FormModel.value.typeId,
|
||||
FormModel.value.details,
|
||||
FormModel.value.promote,
|
||||
FormModel.value.answer,
|
||||
companyStore.encoding,
|
||||
userStore.userInfo.id
|
||||
)
|
||||
|
@ -130,12 +132,12 @@ defineExpose({
|
|||
placeholder="请输入题目详情"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="题目promote" prop="promote">
|
||||
<el-form-item label="预设答案" prop="answer">
|
||||
<el-input
|
||||
v-model="FormModel.promote"
|
||||
v-model="FormModel.answer"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
type="textarea"
|
||||
placeholder="请输入题目的promote"
|
||||
placeholder="请输入题目的预设答案"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
|
|
@ -0,0 +1,185 @@
|
|||
<script setup>
|
||||
import { Edit, UploadFilled } from '@element-plus/icons-vue'
|
||||
import {
|
||||
useSearchQuestion,
|
||||
useAddSharedQuestionType,
|
||||
useAddSharedQuestionList,
|
||||
useDeleteOurSharedQuestionType
|
||||
} from '@/api/question'
|
||||
import { ref } from 'vue'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { ElMessage } from 'element-plus'
|
||||
const openSharedQuestionType = ref(false)
|
||||
const questionTypeInfo = ref({})
|
||||
const questionList = ref([])
|
||||
|
||||
const questionLoading = ref(false)
|
||||
const setpsActive = ref(1)
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const submitBankInfoForm = ref({})
|
||||
|
||||
const selectQuestion = ref({
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
const userStore = useUserStore()
|
||||
const open = (row) => {
|
||||
openSharedQuestionType.value = true
|
||||
questionTypeInfo.value = row
|
||||
submitBankInfoForm.value = questionTypeInfo.value
|
||||
submitBankInfoForm.value.userId = userStore.userInfo.id
|
||||
selectQuestion.value.userId = userStore.userInfo.id
|
||||
submitBankInfoForm.value.encoding = companyStore.encoding
|
||||
selectQuestion.value.encoding = companyStore.encoding
|
||||
console.log(submitBankInfoForm.value)
|
||||
}
|
||||
const rules = {
|
||||
typeName: [{ required: true, message: '请输入题库名称', trigger: 'blur' }],
|
||||
description: [{ required: true, message: '请输入题库描述', trigger: 'blur' }]
|
||||
}
|
||||
const form = ref()
|
||||
const nextStep = async () => {
|
||||
if (setpsActive.value === 1) {
|
||||
await form.value.validate()
|
||||
console.log(submitBankInfoForm.value)
|
||||
const resType = await useAddSharedQuestionType(submitBankInfoForm.value)
|
||||
|
||||
ElMessage.success(resType.data.message)
|
||||
selectQuestion.value.sharedBankId = resType.data.data.id
|
||||
console.log(selectQuestion.value.sharedBankId)
|
||||
setpsActive.value++
|
||||
questionLoading.value = true
|
||||
const res = await useSearchQuestion(
|
||||
'',
|
||||
questionTypeInfo.value.id,
|
||||
companyStore.encoding
|
||||
)
|
||||
|
||||
questionList.value = res.data.data
|
||||
console.log(questionList.value)
|
||||
questionLoading.value = false
|
||||
}
|
||||
}
|
||||
const backTo1 = async () => {
|
||||
await useDeleteOurSharedQuestionType(selectQuestion.value.sharedBankId)
|
||||
setpsActive.value--
|
||||
}
|
||||
|
||||
const handleQuestionSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectQuestion.value.selectQuestionId = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectQuestion.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
selectQuestion.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== selectQuestion.value.selectQuestionId.length) {
|
||||
selectQuestion.value.selectQuestionId = []
|
||||
val.forEach((item) => {
|
||||
if (selectQuestion.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
selectQuestion.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
// this.multipleSelection = val
|
||||
|
||||
console.log(selectQuestion.value.selectQuestionId)
|
||||
}
|
||||
const submitForm = async () => {
|
||||
if (selectQuestion.value.selectQuestionId.length === 0) {
|
||||
ElMessage.error('请选择题目!')
|
||||
return
|
||||
}
|
||||
const res = await useAddSharedQuestionList(selectQuestion.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
openSharedQuestionType.value = false
|
||||
|
||||
selectQuestion.value = { sharedBankId: '', selectQuestionId: [], userId: '' }
|
||||
submitBankInfoForm.value = {}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="'分享' + questionTypeInfo.typeName + '题库'"
|
||||
v-model="openSharedQuestionType"
|
||||
width="50%"
|
||||
>
|
||||
<el-scrollbar height="400px">
|
||||
<el-steps :space="200" :active="setpsActive" simple>
|
||||
<el-step title="创建分享题库" :icon="Edit" />
|
||||
<el-step title="添加题目" :icon="UploadFilled" />
|
||||
</el-steps>
|
||||
<el-form
|
||||
ref="form"
|
||||
v-if="setpsActive === 1"
|
||||
label-width="100px"
|
||||
style="padding-right: 30px; padding-top: 10%"
|
||||
:model="submitBankInfoForm"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="题库名称" prop="typeName">
|
||||
<el-input
|
||||
v-model="submitBankInfoForm.typeName"
|
||||
placeholder="请输入题库名称"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="description">
|
||||
<el-input
|
||||
v-model="submitBankInfoForm.description"
|
||||
placeholder="请输入题库描述"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="type">
|
||||
<el-radio-group v-model="submitBankInfoForm.type">
|
||||
<el-radio :label="1">专业面试题库</el-radio>
|
||||
<el-radio :label="2">综合面试题库</el-radio>
|
||||
<el-radio :label="3">心理测试题库</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<page-container title="添加题目" v-if="setpsActive === 2">
|
||||
<el-scrollbar height="250px">
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="questionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleQuestionSelectionChange"
|
||||
v-loading="questionLoading"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
|
||||
<el-table-column
|
||||
property="details"
|
||||
label="内容"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="promote" label="promote" width="200" />
|
||||
</el-table>
|
||||
</el-scrollbar>
|
||||
</page-container>
|
||||
</el-scrollbar>
|
||||
<template #footer>
|
||||
<span class="dialog-footer" v-if="setpsActive === 1">
|
||||
<el-button @click="openSharedQuestionType = false">取消</el-button>
|
||||
<el-button type="primary" @click="nextStep"> 创建 </el-button>
|
||||
</span>
|
||||
<span class="dialog-footer" v-if="setpsActive === 2">
|
||||
<el-button @click="backTo1">上一步</el-button>
|
||||
<el-button type="primary" @click="submitForm"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,82 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import {
|
||||
useGetSharedQuestionTypeByCompany,
|
||||
useAddSharedQuestionList
|
||||
} from '@/api/question'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const sharedQuestionDialog = ref(false)
|
||||
|
||||
const submitForm = ref({
|
||||
selectQuestionId: [],
|
||||
sharedBankId: '',
|
||||
encoding: '',
|
||||
userId: '',
|
||||
questionTitle: ''
|
||||
})
|
||||
|
||||
const userStore = useUserStore()
|
||||
const companyStore = useCompanyStore()
|
||||
|
||||
const sharedBankList = ref([])
|
||||
const getsharedBankList = async () => {
|
||||
const res = await useGetSharedQuestionTypeByCompany()
|
||||
sharedBankList.value = res.data.data
|
||||
}
|
||||
getsharedBankList()
|
||||
const open = (row) => {
|
||||
sharedQuestionDialog.value = true
|
||||
console.log(row)
|
||||
submitForm.value.selectQuestionId.push(row.id)
|
||||
submitForm.value.questionTitle = row.title
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
}
|
||||
|
||||
const shareQuestionEndit = async () => {
|
||||
if (!submitForm.value.sharedBankId) {
|
||||
ElMessage.error('请选择分享题库')
|
||||
return
|
||||
}
|
||||
const res = await useAddSharedQuestionList(submitForm.value)
|
||||
console.log(res)
|
||||
ElMessage.success(res.data.data)
|
||||
sharedQuestionDialog.value = false
|
||||
submitForm.value = {
|
||||
selectQuestionId: [],
|
||||
sharedBankId: '',
|
||||
encoding: '',
|
||||
userId: '',
|
||||
questionTitle: ''
|
||||
}
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="sharedQuestionDialog"
|
||||
:title="'分享' + submitForm.questionTitle + '题目'"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<el-radio-group v-model="submitForm.sharedBankId">
|
||||
<el-radio
|
||||
v-for="item in sharedBankList"
|
||||
:key="item.id"
|
||||
:label="item.id"
|
||||
>{{ item.typeName }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="centerDialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="shareQuestionEndit"> 分享 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,169 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { Search, Edit, Delete } from '@element-plus/icons-vue'
|
||||
import {
|
||||
useGetOurSharedQuestionList,
|
||||
useSearchOurSharedQuestion,
|
||||
useDeleteOurSharedQuestion
|
||||
} from '@/api/question'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import AddShareQuestionDialog from './components/AddShareQuestionDialog.vue'
|
||||
import MySharedQuestionEditDialog from './components/MySharedQuestionEditDialog.vue'
|
||||
|
||||
const questionLoading = ref(false)
|
||||
const ourSharedQuestionList = ref([])
|
||||
const searchQuestionName = ref()
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const getSharedQuestionList = async () => {
|
||||
searchQuestionName.value = ''
|
||||
questionLoading.value = true
|
||||
const res = await useGetOurSharedQuestionList(companyStore.encoding)
|
||||
ourSharedQuestionList.value = res.data.data
|
||||
questionLoading.value = false
|
||||
}
|
||||
getSharedQuestionList()
|
||||
const searchSharedQuestion = async () => {
|
||||
questionLoading.value = true
|
||||
const res = await useSearchOurSharedQuestion(
|
||||
companyStore.encoding,
|
||||
searchQuestionName.value
|
||||
)
|
||||
ourSharedQuestionList.value = res.data.data
|
||||
questionLoading.value = false
|
||||
}
|
||||
const addShareQuestionDialog = ref()
|
||||
const onAddEdit = () => {
|
||||
addShareQuestionDialog.value.open()
|
||||
}
|
||||
|
||||
const mySharedQuestionEditDialog = ref()
|
||||
const handleEdit = (row) => {
|
||||
mySharedQuestionEditDialog.value.open(row)
|
||||
}
|
||||
const deleteSharedQuestionsId = ref([])
|
||||
|
||||
const handleQuestionSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
deleteSharedQuestionsId.value = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (deleteSharedQuestionsId.value.indexOf(item.id) === -1) {
|
||||
deleteSharedQuestionsId.value.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== deleteSharedQuestionsId.value.length) {
|
||||
deleteSharedQuestionsId.value = []
|
||||
val.forEach((item) => {
|
||||
if (deleteSharedQuestionsId.value.indexOf(item.id) === -1) {
|
||||
deleteSharedQuestionsId.value.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log(deleteSharedQuestionsId.value)
|
||||
}
|
||||
const handleDelete = async (row) => {
|
||||
console.log(row.id)
|
||||
if (row.id === undefined || row === '') {
|
||||
console.log(deleteSharedQuestionsId.value)
|
||||
const res = await useDeleteOurSharedQuestion(deleteSharedQuestionsId.value)
|
||||
ElMessage.success(res.data.data)
|
||||
getSharedQuestionList()
|
||||
}
|
||||
let deleteQuestionArray = []
|
||||
deleteQuestionArray.push(row.id)
|
||||
console.log(deleteQuestionArray)
|
||||
const res = await useDeleteOurSharedQuestion(deleteQuestionArray)
|
||||
ElMessage.success(res.data.data)
|
||||
getSharedQuestionList()
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<page-container title="">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="searchQuestionName"
|
||||
placeholder="请输入题目名称"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-button :icon="Search" @click="searchSharedQuestion" />
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button @click="getSharedQuestionList">重置</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="handleDelete">批量删除 </el-button>
|
||||
|
||||
<el-button type="primary" @click="onAddEdit">添加分享题目 </el-button>
|
||||
</template>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="ourSharedQuestionList"
|
||||
style="width: 100%"
|
||||
v-loading="questionLoading"
|
||||
@selection-change="handleQuestionSelectionChange"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
<el-table-column
|
||||
property="sharedQuestionBankName"
|
||||
label="题库名称"
|
||||
width="300"
|
||||
/>
|
||||
<el-table-column property="details" label="内容" show-overflow-tooltip />
|
||||
<el-table-column property="answer" label="题目预设答案" />
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
<el-table-column label="操作">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改分享题目详情"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
@click="handleEdit(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除分享题目"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
@click="handleDelete(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</page-container>
|
||||
<AddShareQuestionDialog
|
||||
ref="addShareQuestionDialog"
|
||||
@getSharedQuestionList="getSharedQuestionList"
|
||||
></AddShareQuestionDialog>
|
||||
<MySharedQuestionEditDialog
|
||||
ref="mySharedQuestionEditDialog"
|
||||
@getSharedQuestionList="getSharedQuestionList"
|
||||
></MySharedQuestionEditDialog>
|
||||
</template>
|
|
@ -0,0 +1,204 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import {
|
||||
Search,
|
||||
ArrowRight,
|
||||
ArrowLeft,
|
||||
Edit,
|
||||
Delete
|
||||
} from '@element-plus/icons-vue'
|
||||
import {
|
||||
useGetOurSharedQuestionTypeList,
|
||||
useSearchOurSharedQuestionType,
|
||||
useGetSharedQuestionByBankId
|
||||
} from '@/api/question'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import MySharedQuestionTypeEnditDialog from './components/MySharedQuestionTypeEnditDialog.vue'
|
||||
import MySharedQuestionTypeDeleteDialog from './components/MySharedQuestionTypeDeleteDialog.vue'
|
||||
import AddShareQuestionTypeDialog from './components/AddShareQuestionTypeDialog.vue'
|
||||
const sharedQuestionTypeList = ref([])
|
||||
const isShowQuestion = ref(false)
|
||||
const questionTypeLoading = ref(false)
|
||||
const questionLoading = ref(false)
|
||||
const sharedQuestionList = ref([])
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const getSharedBankList = async () => {
|
||||
questionTypeLoading.value = true
|
||||
const res = await useGetOurSharedQuestionTypeList(companyStore.encoding)
|
||||
sharedQuestionTypeList.value = res.data.data
|
||||
questionTypeLoading.value = false
|
||||
}
|
||||
getSharedBankList()
|
||||
const searchSharedBank = async () => {
|
||||
questionTypeLoading.value = true
|
||||
|
||||
const res = await useSearchOurSharedQuestionType(
|
||||
companyStore.encoding,
|
||||
searchTypeName.value
|
||||
)
|
||||
sharedQuestionTypeList.value = res.data.data
|
||||
questionTypeLoading.value = false
|
||||
}
|
||||
const addShareQuestionTypeDialog = ref()
|
||||
const onAddEdit = () => {
|
||||
addShareQuestionTypeDialog.value.open()
|
||||
}
|
||||
const showQuestion = async (row) => {
|
||||
isShowQuestion.value = true
|
||||
questionLoading.value = true
|
||||
const res = await useGetSharedQuestionByBankId(row.id)
|
||||
sharedQuestionList.value = res.data.data
|
||||
questionLoading.value = false
|
||||
}
|
||||
const searchTypeName = ref()
|
||||
const myySharedQuestionTypeEnditDialog = ref()
|
||||
const handleEdit = (row) => {
|
||||
myySharedQuestionTypeEnditDialog.value.open(row)
|
||||
}
|
||||
const mySharedQuestionTypeDeleteDialog = ref()
|
||||
const handleDelete = (row) => {
|
||||
mySharedQuestionTypeDeleteDialog.value.open(row)
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<page-container title="">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="searchTypeName"
|
||||
placeholder="请输入题库名称"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-button :icon="Search" @click="searchSharedBank" />
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button @click="getSharedBankList">重置</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="onAddEdit">添加分享题库 </el-button>
|
||||
</template>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="sharedQuestionTypeList"
|
||||
style="width: 100%"
|
||||
v-loading="questionTypeLoading"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="typeName" label="题库名称" width="200" />
|
||||
|
||||
<el-table-column property="type" label="题库类型" width="200">
|
||||
<template #default="{ row }">
|
||||
{{
|
||||
row.type === 1
|
||||
? '专业面试题库'
|
||||
: row.type === 2
|
||||
? '综合面试题库'
|
||||
: '心理测试题库'
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
property="description"
|
||||
label="题库描述"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
<el-table-column label="操作">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改分享题库信息"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
@click="handleEdit(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除分享题库"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
@click="handleDelete(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="查看题目"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="isShowQuestion ? ArrowRight : ArrowLeft"
|
||||
@click="showQuestion(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-drawer
|
||||
v-model="isShowQuestion"
|
||||
title="题库详情"
|
||||
direction="rtl"
|
||||
size="50%"
|
||||
>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="sharedQuestionList"
|
||||
style="width: 100%"
|
||||
v-loading="questionLoading"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
<el-table-column property="sharedQuestionBankName" label="题库名称" />
|
||||
<el-table-column
|
||||
property="details"
|
||||
label="内容"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="answer" label="题目预设答案" />
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
</el-table>
|
||||
</el-drawer>
|
||||
<MySharedQuestionTypeEnditDialog
|
||||
ref="myySharedQuestionTypeEnditDialog"
|
||||
@getSharedBankList="getSharedBankList"
|
||||
></MySharedQuestionTypeEnditDialog>
|
||||
<MySharedQuestionTypeDeleteDialog
|
||||
ref="mySharedQuestionTypeDeleteDialog"
|
||||
@getSharedBankList="getSharedBankList"
|
||||
>
|
||||
</MySharedQuestionTypeDeleteDialog>
|
||||
<AddShareQuestionTypeDialog
|
||||
ref="addShareQuestionTypeDialog"
|
||||
@getSharedBankList="getSharedBankList"
|
||||
></AddShareQuestionTypeDialog>
|
||||
</page-container>
|
||||
</template>
|
|
@ -0,0 +1,110 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { Search } from '@element-plus/icons-vue'
|
||||
import { useGetSharedQuestion, useSearchSharedQuestion } from '@/api/question'
|
||||
import AddSharedQuestionToMineDialog from './components/AddSharedQuestionToMineDialog.vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const questionLoading = ref(false)
|
||||
const sharedQuestionList = ref([])
|
||||
const searchQuestionName = ref()
|
||||
|
||||
const selectQuestion = ref({
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
const getSharedQuestionList = async () => {
|
||||
searchQuestionName.value = ''
|
||||
questionLoading.value = true
|
||||
const res = await useGetSharedQuestion()
|
||||
sharedQuestionList.value = res.data.data
|
||||
console.log(res.data.data)
|
||||
questionLoading.value = false
|
||||
}
|
||||
getSharedQuestionList()
|
||||
const searchSharedQuestion = async () => {
|
||||
const res = await useSearchSharedQuestion(searchQuestionName.value)
|
||||
sharedQuestionList.value = res.data.data
|
||||
}
|
||||
const addSharedQuestionToMineDialog = ref()
|
||||
const onAddEdit = () => {
|
||||
if (selectQuestion.value.selectQuestionId.length === 0) {
|
||||
ElMessage.error('请选择想要添加的题目')
|
||||
return
|
||||
}
|
||||
addSharedQuestionToMineDialog.value.open(
|
||||
selectQuestion.value.selectQuestionId
|
||||
)
|
||||
}
|
||||
|
||||
const handleQuestionSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectQuestion.value.selectQuestionId = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectQuestion.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
selectQuestion.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== selectQuestion.value.selectQuestionId.length) {
|
||||
selectQuestion.value.selectQuestionId = []
|
||||
val.forEach((item) => {
|
||||
if (selectQuestion.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
selectQuestion.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log(selectQuestion.value.selectQuestionId)
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<page-container title="">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="searchQuestionName"
|
||||
placeholder="请输入题目名称"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-button :icon="Search" @click="searchSharedQuestion" />
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button @click="getSharedQuestionList">重置</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="onAddEdit">添加到题库 </el-button>
|
||||
</template>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="sharedQuestionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleQuestionSelectionChange"
|
||||
v-loading="questionLoading"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
<el-table-column
|
||||
property="sharedQuestionBankName"
|
||||
label="题库名称"
|
||||
width="300"
|
||||
/>
|
||||
<el-table-column property="details" label="内容" show-overflow-tooltip />
|
||||
<el-table-column property="answer" label="题目预设答案" />
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
</el-table>
|
||||
<AddSharedQuestionToMineDialog
|
||||
ref="addSharedQuestionToMineDialog"
|
||||
></AddSharedQuestionToMineDialog>
|
||||
</page-container>
|
||||
</template>
|
|
@ -0,0 +1,168 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { Search, ArrowLeft, ArrowRight } from '@element-plus/icons-vue'
|
||||
import {
|
||||
useGetSharedQuestionType,
|
||||
useGetSharedQuestionByBankId,
|
||||
useSearchSharedQuestionType
|
||||
} from '@/api/question'
|
||||
import AddSharedQuestionTypeToMineDialog from './components/AddSharedQuestionTypeToMineDialog.vue'
|
||||
|
||||
const sharedQuestionTypeList = ref([])
|
||||
const selectSharedQuestionTypeId = ref([])
|
||||
const questionTypeLoading = ref(false)
|
||||
const searchTypeName = ref()
|
||||
const getSharedBankList = async () => {
|
||||
questionTypeLoading.value = true
|
||||
const res = await useGetSharedQuestionType()
|
||||
searchTypeName.value = ''
|
||||
sharedQuestionTypeList.value = res.data.data
|
||||
questionTypeLoading.value = false
|
||||
}
|
||||
|
||||
getSharedBankList()
|
||||
const addSharedQuestionTypeToMineDialog = ref()
|
||||
|
||||
const onAddEdit = () => {
|
||||
addSharedQuestionTypeToMineDialog.value.open(selectSharedQuestionTypeId.value)
|
||||
}
|
||||
|
||||
const searchSharedBank = async () => {
|
||||
const res = await useSearchSharedQuestionType(searchTypeName.value)
|
||||
sharedQuestionTypeList.value = res.data.data
|
||||
}
|
||||
const handleQuestionTypeSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
selectSharedQuestionTypeId.value = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (selectSharedQuestionTypeId.value.indexOf(item.id) === -1) {
|
||||
selectSharedQuestionTypeId.value.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== selectSharedQuestionTypeId.value.length) {
|
||||
selectSharedQuestionTypeId.value = []
|
||||
val.forEach((item) => {
|
||||
if (selectSharedQuestionTypeId.value.indexOf(item.id) === -1) {
|
||||
selectSharedQuestionTypeId.value.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
const questionLoading = ref(false)
|
||||
const isShowQuestion = ref(false)
|
||||
const sharedQuestionList = ref([])
|
||||
const showQuestion = async (row) => {
|
||||
isShowQuestion.value = true
|
||||
questionLoading.value = true
|
||||
const res = await useGetSharedQuestionByBankId(row.id)
|
||||
sharedQuestionList.value = res.data.data
|
||||
questionLoading.value = false
|
||||
}
|
||||
</script>
|
||||
<template>
|
||||
<page-container title="">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="searchTypeName"
|
||||
placeholder="请输入题库名称"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-button :icon="Search" @click="searchSharedBank" />
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button @click="getSharedBankList">重置</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="onAddEdit">添加到题库 </el-button>
|
||||
</template>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="sharedQuestionTypeList"
|
||||
style="width: 100%"
|
||||
row-key="id"
|
||||
@selection-change="handleQuestionTypeSelectionChange"
|
||||
v-loading="questionTypeLoading"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="typeName" label="题库名称" width="200" />
|
||||
|
||||
<el-table-column property="type" label="题库类型" width="200">
|
||||
<template #default="{ row }">
|
||||
{{
|
||||
row.type === 1
|
||||
? '专业面试题库'
|
||||
: row.type === 2
|
||||
? '综合面试题库'
|
||||
: '心理测试题库'
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
property="description"
|
||||
label="题库描述"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
<el-table-column label="查看题目">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="查看题目"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="isShowQuestion ? ArrowRight : ArrowLeft"
|
||||
@click="showQuestion(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-drawer
|
||||
v-model="isShowQuestion"
|
||||
title="题库详情"
|
||||
direction="rtl"
|
||||
size="50%"
|
||||
>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="sharedQuestionList"
|
||||
style="width: 100%"
|
||||
v-loading="questionLoading"
|
||||
stripe
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
<el-table-column property="sharedQuestionBankName" label="题库名称" />
|
||||
<el-table-column
|
||||
property="details"
|
||||
label="内容"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="answer" label="题目预设答案" />
|
||||
<el-table-column property="createCompanyName" label="创建公司" />
|
||||
<el-table-column property="createUserName" label="分享人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
</el-table>
|
||||
</el-drawer>
|
||||
<AddSharedQuestionTypeToMineDialog
|
||||
ref="addSharedQuestionTypeToMineDialog"
|
||||
></AddSharedQuestionTypeToMineDialog>
|
||||
</page-container>
|
||||
</template>
|
|
@ -0,0 +1,142 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import {
|
||||
useGetOurSharedQuestionTypeList,
|
||||
useGetQuestionList,
|
||||
useAddSharedQuestionList
|
||||
} from '@/api/question'
|
||||
import { Edit, UploadFilled } from '@element-plus/icons-vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const openSharedQuestion = ref(false)
|
||||
const questionLoading = ref(false)
|
||||
const setpsActive = ref(1)
|
||||
const sharedBankList = ref([])
|
||||
const submitForm = ref({
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
const QuestionList = ref([])
|
||||
const companyStore = useCompanyStore()
|
||||
const userStore = useUserStore()
|
||||
const open = async () => {
|
||||
openSharedQuestion.value = true
|
||||
const res = await useGetOurSharedQuestionTypeList(companyStore.encoding)
|
||||
sharedBankList.value = res.data.data
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
}
|
||||
|
||||
const nextStep = async () => {
|
||||
if (
|
||||
submitForm.value.sharedBankId === '' ||
|
||||
submitForm.value.sharedBankId === undefined
|
||||
) {
|
||||
ElMessage.error('请选择分享题库!')
|
||||
return
|
||||
}
|
||||
setpsActive.value++
|
||||
questionLoading.value = true
|
||||
const res = await useGetQuestionList(companyStore.encoding)
|
||||
QuestionList.value = res.data.data
|
||||
console.log(res.data.data)
|
||||
questionLoading.value = false
|
||||
}
|
||||
const handleQuestionSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
submitForm.value.selectQuestionId = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (submitForm.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
submitForm.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== submitForm.value.selectQuestionId.length) {
|
||||
submitForm.value.selectQuestionId = []
|
||||
val.forEach((item) => {
|
||||
if (submitForm.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
submitForm.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
// this.multipleSelection = val
|
||||
|
||||
console.log(submitForm.value.selectQuestionId)
|
||||
}
|
||||
const submit = async () => {
|
||||
if (submitForm.value.selectQuestionId.length === 0) {
|
||||
ElMessage.error('请选择题目!')
|
||||
return
|
||||
}
|
||||
const res = await useAddSharedQuestionList(submitForm.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
openSharedQuestion.value = false
|
||||
|
||||
sharedBankList.value = []
|
||||
submitForm.value = {
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog title="分享题目" v-model="openSharedQuestion" width="60%">
|
||||
<el-scrollbar>
|
||||
<el-steps :space="200" :active="setpsActive" simple>
|
||||
<el-step title="选择分享题库" :icon="Edit" />
|
||||
<el-step title="添加题目" :icon="UploadFilled" />
|
||||
</el-steps>
|
||||
</el-scrollbar>
|
||||
<div v-if="setpsActive === 1" style="padding-left: 30px; padding-top: 10%">
|
||||
<el-radio-group v-model="submitForm.sharedBankId">
|
||||
<el-radio
|
||||
v-for="item in sharedBankList"
|
||||
:key="item.id"
|
||||
:label="item.id"
|
||||
size="large"
|
||||
>{{ item.typeName }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="QuestionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleQuestionSelectionChange"
|
||||
v-loading="questionLoading"
|
||||
stripe
|
||||
v-else
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
<el-table-column property="typeName" label="题库名称" />
|
||||
<el-table-column property="details" label="内容" show-overflow-tooltip />
|
||||
<el-table-column property="promote" label="promote" />
|
||||
<el-table-column property="createUserName" label="创建人" />
|
||||
<el-table-column property="updateTime" label="更新时间" />
|
||||
</el-table>
|
||||
<template #footer>
|
||||
<span class="dialog-footer" v-if="setpsActive === 1">
|
||||
<el-button @click="openSharedQuestion = false">取消</el-button>
|
||||
<el-button type="primary" @click="nextStep"> 选择 </el-button>
|
||||
</span>
|
||||
<span class="dialog-footer" v-if="setpsActive === 2">
|
||||
<el-button @click="setpsActive--">上一步</el-button>
|
||||
<el-button type="primary" @click="submit"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,227 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { Edit, UploadFilled } from '@element-plus/icons-vue'
|
||||
import {
|
||||
useSearchQuestion,
|
||||
useAddSharedQuestionType,
|
||||
useAddSharedQuestionList,
|
||||
useGetTypeList,
|
||||
useGetTypeById,
|
||||
useDeleteOurSharedQuestionType
|
||||
} from '@/api/question'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const openSharedQuestionType = ref(false)
|
||||
const setpsActive = ref(1)
|
||||
const emit = defineEmits(['getSharedBankList'])
|
||||
const submitForm = ref({
|
||||
bankId: '',
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
const bankInfo = ref({})
|
||||
const bankList = ref([])
|
||||
const companyStore = useCompanyStore()
|
||||
const userStore = useUserStore()
|
||||
const open = async () => {
|
||||
openSharedQuestionType.value = true
|
||||
const res = await useGetTypeList(companyStore.encoding)
|
||||
bankList.value = res.data.data
|
||||
}
|
||||
const handleQuestionSelectionChange = (val) => {
|
||||
if (val.length === 0) {
|
||||
submitForm.value.selectQuestionId = []
|
||||
}
|
||||
|
||||
val.forEach((item) => {
|
||||
if (submitForm.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
submitForm.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
if (val.length !== submitForm.value.selectQuestionId.length) {
|
||||
submitForm.value.selectQuestionId = []
|
||||
val.forEach((item) => {
|
||||
if (submitForm.value.selectQuestionId.indexOf(item.id) === -1) {
|
||||
submitForm.value.selectQuestionId.push(item.id)
|
||||
}
|
||||
})
|
||||
}
|
||||
// this.multipleSelection = val
|
||||
|
||||
console.log(submitForm.value.selectQuestionId)
|
||||
}
|
||||
|
||||
const rules = {
|
||||
typeName: [{ required: true, message: '请输入题库名称', trigger: 'blur' }],
|
||||
description: [{ required: true, message: '请输入题库描述', trigger: 'blur' }]
|
||||
}
|
||||
const questionLoading = ref(false)
|
||||
const questionList = ref([])
|
||||
const nextStep = async () => {
|
||||
if (setpsActive.value === 1) {
|
||||
const res = await useGetTypeById(submitForm.value.bankId)
|
||||
bankInfo.value = res.data.data
|
||||
bankInfo.value.userId = userStore.userInfo.id
|
||||
bankInfo.value.encoding = companyStore.encoding
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
console.log(bankInfo.value)
|
||||
setpsActive.value++
|
||||
return
|
||||
}
|
||||
|
||||
if (setpsActive.value === 2) {
|
||||
if (
|
||||
bankInfo.value.typeName === '' ||
|
||||
bankInfo.value.typeName === undefined
|
||||
) {
|
||||
ElMessage.error('请填写分享题库名称')
|
||||
return
|
||||
}
|
||||
if (
|
||||
bankInfo.value.description === '' ||
|
||||
bankInfo.value.description === undefined
|
||||
) {
|
||||
ElMessage.error('请填写分享题库描述')
|
||||
return
|
||||
}
|
||||
const resType = await useAddSharedQuestionType(bankInfo.value)
|
||||
ElMessage.success(resType.data.message)
|
||||
submitForm.value.sharedBankId = resType.data.data.id
|
||||
console.log(submitForm.value.sharedBankId)
|
||||
setpsActive.value++
|
||||
questionLoading.value = true
|
||||
const res = await useSearchQuestion(
|
||||
'',
|
||||
submitForm.value.bankId,
|
||||
companyStore.encoding
|
||||
)
|
||||
|
||||
questionList.value = res.data.data
|
||||
console.log(questionList.value)
|
||||
questionLoading.value = false
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
const backTo2 = async () => {
|
||||
await useDeleteOurSharedQuestionType(submitForm.value.sharedBankId)
|
||||
setpsActive.value--
|
||||
}
|
||||
const submit = async () => {
|
||||
if (submitForm.value.selectQuestionId.length === 0) {
|
||||
ElMessage.error('请选择题目!')
|
||||
return
|
||||
}
|
||||
const res = await useAddSharedQuestionList(submitForm.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
openSharedQuestionType.value = false
|
||||
setpsActive.value = 1
|
||||
submitForm.value = {
|
||||
bankId: '',
|
||||
sharedBankId: '',
|
||||
selectQuestionId: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
}
|
||||
bankInfo.value = {}
|
||||
emit('getSharedBankList')
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog title="分享题库" v-model="openSharedQuestionType" width="50%">
|
||||
<el-scrollbar height="400px">
|
||||
<el-steps :space="200" :active="setpsActive" simple>
|
||||
<el-step title="选择分享题库" :icon="Edit" />
|
||||
<el-step title="编辑分享题库" :icon="Edit" />
|
||||
<el-step title="添加题目" :icon="UploadFilled" />
|
||||
</el-steps>
|
||||
<div
|
||||
v-if="setpsActive === 1"
|
||||
style="padding-left: 30px; padding-top: 10%"
|
||||
>
|
||||
<el-radio-group v-model="submitForm.bankId">
|
||||
<el-radio
|
||||
v-for="item in bankList"
|
||||
:key="item.id"
|
||||
:label="item.id"
|
||||
size="large"
|
||||
>{{ item.typeName }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
</div>
|
||||
<el-form
|
||||
ref="bankInfoForm"
|
||||
v-if="setpsActive === 2"
|
||||
label-width="100px"
|
||||
style="padding-right: 30px; padding-top: 10%"
|
||||
:model="bankInfo"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="题库名称" prop="typeName">
|
||||
<el-input
|
||||
v-model="bankInfo.typeName"
|
||||
placeholder="请输入题库名称"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="description">
|
||||
<el-input
|
||||
v-model="bankInfo.description"
|
||||
placeholder="请输入题库描述"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="type">
|
||||
<el-radio-group v-model="bankInfo.type">
|
||||
<el-radio :label="1">专业面试题库</el-radio>
|
||||
<el-radio :label="2">综合面试题库</el-radio>
|
||||
<el-radio :label="3">心理测试题库</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<page-container title="添加题目" v-if="setpsActive === 3">
|
||||
<el-scrollbar height="250px">
|
||||
<el-table
|
||||
ref="multipleTableRef"
|
||||
:data="questionList"
|
||||
style="width: 100%"
|
||||
@selection-change="handleQuestionSelectionChange"
|
||||
v-loading="questionLoading"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column property="title" label="标题" width="200" />
|
||||
|
||||
<el-table-column
|
||||
property="details"
|
||||
label="内容"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column property="promote" label="promote" width="200" />
|
||||
</el-table>
|
||||
</el-scrollbar>
|
||||
</page-container>
|
||||
</el-scrollbar>
|
||||
<template #footer>
|
||||
<span class="dialog-footer" v-if="setpsActive === 1">
|
||||
<el-button @click="openSharedQuestionType = false">取消</el-button>
|
||||
<el-button type="primary" @click="nextStep"> 选择 </el-button>
|
||||
</span>
|
||||
<span class="dialog-footer" v-if="setpsActive === 2">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="nextStep"> 创建 </el-button>
|
||||
</span>
|
||||
<span class="dialog-footer" v-if="setpsActive === 3">
|
||||
<el-button @click="backTo2">上一步</el-button>
|
||||
<el-button type="primary" @click="submit"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,66 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useUserStore, useCompanyStore } from '@/stores'
|
||||
import { useGetTypeList, useAddQuestionFromShare } from '@/api/question'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const addSharedQuestionDialogVisible = ref(false)
|
||||
const submitForm = ref({
|
||||
selectSharedQuestionIds: [],
|
||||
bankId: '',
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
|
||||
const bankList = ref({})
|
||||
const userStore = useUserStore()
|
||||
const companyStore = useCompanyStore()
|
||||
const open = async (selectSharedQuestionIds) => {
|
||||
addSharedQuestionDialogVisible.value = true
|
||||
submitForm.value.selectSharedQuestionIds = selectSharedQuestionIds
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
|
||||
const res = await useGetTypeList(submitForm.value.encoding)
|
||||
bankList.value = res.data.data
|
||||
}
|
||||
const addEndit = async () => {
|
||||
if (submitForm.value.bankId === '' || submitForm.value.bankId === undefined) {
|
||||
ElMessage.error('请选择添加的题库')
|
||||
return
|
||||
}
|
||||
const res = await useAddQuestionFromShare(submitForm.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="addSharedQuestionDialogVisible"
|
||||
title="请选择想要加入到的题库"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<el-radio-group v-model="submitForm.bankId">
|
||||
<el-radio
|
||||
v-for="item in bankList"
|
||||
:key="item.id"
|
||||
:label="item.id"
|
||||
size="large"
|
||||
>{{ item.typeName }}</el-radio
|
||||
>
|
||||
</el-radio-group>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="addSharedQuestionDialogVisible = false"
|
||||
>取消</el-button
|
||||
>
|
||||
<el-button type="primary" @click="addEndit"> 确认 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,52 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useUserStore, useCompanyStore } from '@/stores'
|
||||
import { useAddQuestionTypeFromShare } from '@/api/question'
|
||||
|
||||
const addSharedQuestionTypeDialogVisible = ref(false)
|
||||
|
||||
const submitForm = ref({
|
||||
SharedBankIds: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
})
|
||||
const userStore = useUserStore()
|
||||
const companyStore = useCompanyStore()
|
||||
const open = (SharedBankIds) => {
|
||||
addSharedQuestionTypeDialogVisible.value = true
|
||||
submitForm.value.SharedBankIds = SharedBankIds
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
}
|
||||
const addEndit = async () => {
|
||||
const res = await useAddQuestionTypeFromShare(submitForm.value)
|
||||
ElMessage.success(res.data.data)
|
||||
submitForm.value = {
|
||||
SharedBankIds: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
}
|
||||
addSharedQuestionTypeDialogVisible.value = false
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="addSharedQuestionTypeDialogVisible"
|
||||
title="添加确认框"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<span>您确定要添加选中的题库以及题库下的题目到贵公司的题库列表中吗?</span>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="addSharedQuestionTypeDialogVisible = false"
|
||||
>取消</el-button
|
||||
>
|
||||
<el-button type="primary" @click="addEndit"> 确定 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,112 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import {
|
||||
useGetOurSharedQuestionTypeList,
|
||||
useEditOurSharedQuestion
|
||||
} from '@/api/question'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { ArrowDown } from '@element-plus/icons-vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const openEdit = ref(false)
|
||||
const updateForm = ref({})
|
||||
const typeList = ref([])
|
||||
const emit = defineEmits(['getSharedQuestionList'])
|
||||
const companyStore = useCompanyStore()
|
||||
const userStore = useUserStore()
|
||||
const open = (row) => {
|
||||
openEdit.value = true
|
||||
updateForm.value = row
|
||||
updateForm.value.userId = userStore.userInfo.id
|
||||
}
|
||||
const getTypeList = async () => {
|
||||
const res = await useGetOurSharedQuestionTypeList(companyStore.encoding)
|
||||
typeList.value = res.data.data
|
||||
console.log(typeList.value)
|
||||
}
|
||||
const setTypeName = (item) => {
|
||||
updateForm.value.sharedQuestionBankName = item.typeName
|
||||
}
|
||||
const rules = {
|
||||
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
|
||||
typeName: [{ required: true, message: '请选择题库类型', trigger: 'blur' }],
|
||||
details: [{ required: true, message: '请输入题目详情', trigger: 'blur' }],
|
||||
promote: [{ required: true, message: '请输入题目的promote', trigger: 'blur' }]
|
||||
}
|
||||
const form = ref()
|
||||
const update = async () => {
|
||||
await form.value.validate()
|
||||
const res = await useEditOurSharedQuestion(updateForm.value)
|
||||
ElMessage.success(res.data.data)
|
||||
openEdit.value = false
|
||||
emit('getSharedQuestionList')
|
||||
|
||||
updateForm.value = {}
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog v-model="openEdit" title="编辑题目" width="30%">
|
||||
<el-form
|
||||
ref="form"
|
||||
label-width="150px"
|
||||
style="padding-right: 30px"
|
||||
:model="updateForm"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="题目标题" prop="title">
|
||||
<el-input
|
||||
v-model="updateForm.title"
|
||||
placeholder="请输入题目标题"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库类型名" prop="sharedQuestionBankName">
|
||||
<el-dropdown>
|
||||
<el-button type="primary" @click="getTypeList">
|
||||
{{
|
||||
updateForm.sharedQuestionBankName
|
||||
? updateForm.sharedQuestionBankName
|
||||
: '请选择题库类型'
|
||||
}}<el-icon><ArrowDown /></el-icon>
|
||||
</el-button>
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<el-dropdown-item
|
||||
v-for="item in typeList"
|
||||
:key="item.id"
|
||||
@click="setTypeName(item)"
|
||||
>{{ item.typeName }}</el-dropdown-item
|
||||
>
|
||||
</el-dropdown-menu>
|
||||
</template>
|
||||
</el-dropdown>
|
||||
</el-form-item>
|
||||
<el-form-item label="题目详情" prop="details">
|
||||
<el-input
|
||||
v-model="updateForm.details"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
type="textarea"
|
||||
placeholder="请输入题目详情"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="题目promote" prop="promote">
|
||||
<el-input
|
||||
v-model="updateForm.promote"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
type="textarea"
|
||||
placeholder="请输入题目的promote"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="update" @keydown.enter="keyDown()">
|
||||
确认
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,47 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useDeleteOurSharedQuestionType } from '@/api/question'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const deleteTypeDialog = ref(false)
|
||||
const deleteInfo = ref({})
|
||||
const emit = defineEmits(['getSharedBankList'])
|
||||
|
||||
const open = (row) => {
|
||||
deleteTypeDialog.value = true
|
||||
deleteInfo.value = row
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
const res = await useDeleteOurSharedQuestionType(deleteInfo.value.id)
|
||||
ElMessage.success(res.data.data)
|
||||
deleteTypeDialog.value = false
|
||||
emit('getSharedBankList')
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog v-model="deleteTypeDialog" title="警告" width="30%" align-center>
|
||||
<span
|
||||
>您确定要删除题库<span class="typeNsme">{{ deleteInfo.typeName }}</span
|
||||
>以及该题库的所有题目?</span
|
||||
>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="centerDialogVisible = false">取消</el-button>
|
||||
<el-button type="danger" @click="handleDelete"> 确定 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
<style scoped>
|
||||
.dialog-footer button:first-child {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.typeNsme {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,79 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useEditOurSharedQuestionType } from '@/api/question'
|
||||
import { useUserStore } from '@/stores'
|
||||
import { ElMessage } from 'element-plus'
|
||||
const questionTypeEnditDialogVisible = ref(false)
|
||||
const submitFormModel = ref({})
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
const emit = defineEmits(['getSharedBankList'])
|
||||
const open = (row) => {
|
||||
questionTypeEnditDialogVisible.value = true
|
||||
submitFormModel.value = row
|
||||
submitFormModel.value.userId = userStore.userInfo.id
|
||||
console.log(row)
|
||||
}
|
||||
const rules = {
|
||||
typeName: [{ required: true, message: '请输入题库名称', trigger: 'blur' }],
|
||||
description: [{ required: true, message: '请输入题库描述', trigger: 'blur' }]
|
||||
}
|
||||
const handleEndit = async () => {
|
||||
const res = await useEditOurSharedQuestionType(submitFormModel.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
questionTypeEnditDialogVisible.value = false
|
||||
emit('getSharedBankList')
|
||||
}
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="questionTypeEnditDialogVisible"
|
||||
title="编辑题库"
|
||||
width="30%"
|
||||
>
|
||||
<el-form
|
||||
ref="form"
|
||||
label-width="100px"
|
||||
style="padding-right: 30px"
|
||||
:model="submitFormModel"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="题库名称" prop="typeName">
|
||||
<el-input
|
||||
v-model="submitFormModel.typeName"
|
||||
placeholder="请输入题库名称"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="description">
|
||||
<el-input
|
||||
v-model="submitFormModel.description"
|
||||
placeholder="请输入题库描述"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="题库描述" prop="type">
|
||||
<el-radio-group v-model="submitFormModel.type">
|
||||
<el-radio :label="1">专业面试题库</el-radio>
|
||||
<el-radio :label="2">综合面试题库</el-radio>
|
||||
<el-radio :label="3">心理测试题库</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="handleEndit"
|
||||
@keydown.enter="keyDown()"
|
||||
>
|
||||
确认
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -1,27 +1,87 @@
|
|||
<script setup>
|
||||
import { useGetCompanyDetail } from '@/api/recruitment'
|
||||
import { useGetCompanyDetail, useUploadCompanyDetail } from '@/api/recruitment'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { pcaTextArr } from 'element-china-area-data'
|
||||
import { useUploadPic, useDeletePic, useUploadCompanyImage } from '@/api/upload'
|
||||
import { useUploadPic, useDeletePic } from '@/api/upload'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { ref } from 'vue'
|
||||
const fileList = ref([])
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
|
||||
const dialogImageUrl = ref()
|
||||
|
||||
const submitForm = ref({
|
||||
treatment: []
|
||||
})
|
||||
const companyStore = useCompanyStore()
|
||||
const limit = ref(5)
|
||||
|
||||
const hideUpload = ref(false)
|
||||
|
||||
const userStore = useUserStore()
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
|
||||
const submitForm = ref({
|
||||
companyName: '',
|
||||
images: [],
|
||||
subImages: '',
|
||||
companyDetail: '',
|
||||
address: '',
|
||||
legalRepresentative: '',
|
||||
treatment: [],
|
||||
creditCode: '',
|
||||
established: '',
|
||||
companyLogo: [],
|
||||
subLogo: '',
|
||||
type: '',
|
||||
companyAllName: ''
|
||||
})
|
||||
|
||||
const region_data = ref()
|
||||
|
||||
region_data.value = pcaTextArr
|
||||
|
||||
const getCompanyDetail = async () => {
|
||||
const res = await useGetCompanyDetail(companyStore.encoding)
|
||||
|
||||
submitForm.value = res.data.data
|
||||
console.log(res.data.data)
|
||||
submitForm.value.treatment = [...res.data.data.treatment]
|
||||
// fileList.value = res.data.data.images
|
||||
|
||||
if (res.data.data.treatment) {
|
||||
submitForm.value.treatment = [...JSON.parse(res.data.data.treatment)]
|
||||
} else {
|
||||
submitForm.value.treatment = []
|
||||
}
|
||||
if (submitForm.value.address) {
|
||||
submitForm.value.address = submitForm.value.address.slice(1, -1).split(', ')
|
||||
} else {
|
||||
submitForm.value.address = []
|
||||
}
|
||||
|
||||
if (res.data.data.images) {
|
||||
submitForm.value.images = [...JSON.parse(res.data.data.images)]
|
||||
} else {
|
||||
submitForm.value.images = []
|
||||
}
|
||||
|
||||
if (res.data.data.companyLogo) {
|
||||
submitForm.value.companyLogo = [...JSON.parse(res.data.data.companyLogo)]
|
||||
} else {
|
||||
submitForm.value.companyLogo = []
|
||||
}
|
||||
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
|
||||
// submitForm.value.address = submitForm.value.address.slice(1, -1).split(', ')
|
||||
|
||||
// submitForm.value.treatment = submitForm.value.treatment
|
||||
// .slice(1, -1)
|
||||
// .split(', ')
|
||||
|
||||
// submitForm.value.images = submitForm.value.images.slice(1, -1).split(', ')
|
||||
|
||||
if (res.data.data.images === '') {
|
||||
submitForm.value.images = []
|
||||
}
|
||||
if (res.data.data.companyLogo === '') {
|
||||
submitForm.value.companyLogo = []
|
||||
}
|
||||
}
|
||||
getCompanyDetail()
|
||||
|
||||
|
@ -45,28 +105,122 @@ const rules = {
|
|||
],
|
||||
established: [
|
||||
{ required: true, message: '请选择公司成立日期', trigger: 'blur' }
|
||||
],
|
||||
staffNumber: [
|
||||
{ required: true, message: '请输入公司大概人数', trigger: 'blur' }
|
||||
],
|
||||
type: [{ required: true, message: '请输入公司类型', trigger: 'blur' }],
|
||||
companyAllName: [
|
||||
{ required: true, message: '请输入公司全称', trigger: 'blur' }
|
||||
]
|
||||
}
|
||||
//上传图片的方法
|
||||
|
||||
const UploadImage = async (file) => {
|
||||
console.log(file.raw)
|
||||
|
||||
let fd = new FormData()
|
||||
|
||||
fd.append('file', file.raw) //传给后台接收的名字 file
|
||||
|
||||
const res = await useUploadPic(fd)
|
||||
fileList.value = fileList.value.push(res.data.data)
|
||||
|
||||
var newLogoObject = {
|
||||
name: res.data.data.filename,
|
||||
url: res.data.data.image
|
||||
}
|
||||
file.name = res.data.data.filename
|
||||
file.url = res.data.data.image
|
||||
|
||||
console.log(newLogoObject)
|
||||
|
||||
submitForm.value.companyLogo.push(newLogoObject)
|
||||
|
||||
console.log(submitForm.value.companyLogo)
|
||||
}
|
||||
//移除图片功能
|
||||
const handleRemove = async () => {
|
||||
const handleRemove = async (file) => {
|
||||
console.log('删除')
|
||||
// await useDeletePic(form.value.filename)
|
||||
console.log(file.name)
|
||||
await useDeletePic(file.name)
|
||||
|
||||
handleEndit()
|
||||
}
|
||||
//预览图片功能
|
||||
const handlePictureCardPreview = (file) => {
|
||||
console.log(file.url)
|
||||
dialogVisible.value = true
|
||||
dialogImageUrl.value = file.url
|
||||
}
|
||||
|
||||
const handleExceed = (files, fileList) => {
|
||||
ElMessage.warning(
|
||||
`当前限制选择 5 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
|
||||
files.length + fileList.length
|
||||
} 个文件`
|
||||
)
|
||||
}
|
||||
|
||||
const OnChange = async (file, fileList) => {
|
||||
console.log('改变')
|
||||
const isType = file.type === 'image/jpeg' || 'image/png'
|
||||
const isLt5M = file.size / 1024 / 1024 < 5
|
||||
|
||||
if (!isType) {
|
||||
ElMessage.error('上传头像图片只能是 JPG 格式!')
|
||||
fileList.pop()
|
||||
}
|
||||
if (!isLt5M) {
|
||||
ElMessage.error('上传头像图片大小不能超过 5MB!')
|
||||
fileList.pop()
|
||||
}
|
||||
console.log(submitForm.value.images)
|
||||
|
||||
hideUpload.value = submitForm.value.images.length >= limit.value
|
||||
let fd = new FormData()
|
||||
|
||||
fd.append('file', file.raw) //传给后台接收的名字 file
|
||||
|
||||
const res = await useUploadPic(fd)
|
||||
|
||||
var newImageObject = {
|
||||
name: res.data.data.filename,
|
||||
url: res.data.data.image
|
||||
}
|
||||
file.name = res.data.data.filename
|
||||
file.url = res.data.data.image
|
||||
|
||||
submitForm.value.images.push(newImageObject)
|
||||
}
|
||||
const handleEndit = async () => {
|
||||
if (submitForm.value.treatment.length > 5) {
|
||||
ElMessage.error('公司待遇最大只能选择5个')
|
||||
return
|
||||
}
|
||||
submitForm.value.subImages = JSON.stringify(
|
||||
submitForm.value.images.map((item) => {
|
||||
return {
|
||||
name: item.name,
|
||||
url: item.url
|
||||
}
|
||||
})
|
||||
)
|
||||
console.log(submitForm.value.companyLogo)
|
||||
submitForm.value.subLogo = JSON.stringify(
|
||||
submitForm.value.companyLogo.map((item) => {
|
||||
return {
|
||||
name: item.name,
|
||||
url: item.url
|
||||
}
|
||||
})
|
||||
)
|
||||
submitForm.value.treatment = JSON.stringify(submitForm.value.treatment)
|
||||
console.log(submitForm.value)
|
||||
const res = await useUploadCompanyDetail(submitForm.value)
|
||||
ElMessage.success(res.data.data)
|
||||
|
||||
getCompanyDetail()
|
||||
}
|
||||
|
||||
const defaultTreatment = ref([
|
||||
{
|
||||
value: '五险一金',
|
||||
|
@ -102,16 +256,9 @@ const defaultTreatment = ref([
|
|||
style="padding-right: 30px; padding-top: 5%"
|
||||
:model="submitForm"
|
||||
:rules="rules"
|
||||
:class="hideUpload ? 'hide' : 'display'"
|
||||
>
|
||||
<el-form-item label="公司名称" prop="companyName">
|
||||
<el-input
|
||||
v-model="submitForm.companyName"
|
||||
placeholder="请输入公司名称"
|
||||
id="companyName"
|
||||
size="large"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司图片">
|
||||
<el-form-item label="公司logo" prop="companyName">
|
||||
<el-upload
|
||||
ref="uploadPic"
|
||||
action=""
|
||||
|
@ -119,19 +266,79 @@ const defaultTreatment = ref([
|
|||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="handleRemove"
|
||||
:on-change="UploadImage"
|
||||
:file-list="fileList"
|
||||
:limit="1"
|
||||
:file-list="submitForm.companyLogo"
|
||||
:auto-upload="false"
|
||||
>
|
||||
<i class="el-icon-plus"></i>
|
||||
<template #tip>
|
||||
<div style="font-size: 12px; color: #919191">可以上传多张图片</div>
|
||||
<div style="font-size: 12px; color: #919191">
|
||||
单次限制上传一张图片
|
||||
</div>
|
||||
</template>
|
||||
<el-icon><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司简称" prop="companyName" style="width: 30%">
|
||||
<el-input
|
||||
v-model="submitForm.companyName"
|
||||
placeholder="请输入公司简称"
|
||||
id="companyName"
|
||||
size="large"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司全称" prop="companyAllName" style="width: 30%">
|
||||
<el-input
|
||||
v-model="submitForm.companyAllName"
|
||||
placeholder="请输入公司全称"
|
||||
id="companyAllName"
|
||||
size="large"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司图片">
|
||||
<el-upload
|
||||
ref="upload"
|
||||
action="#"
|
||||
multiple
|
||||
:limit="limit"
|
||||
:file-list="submitForm.images"
|
||||
list-type="picture-card"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-change="OnChange"
|
||||
:on-remove="handleRemove"
|
||||
:on-exceed="handleExceed"
|
||||
accept="image/jpeg,image/png"
|
||||
:auto-upload="false"
|
||||
>
|
||||
<i class="el-icon-plus">
|
||||
<el-icon><Plus /></el-icon
|
||||
></i>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip">
|
||||
只能上传jpg/png文件,最多上传5张且单张图片不超过5M
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
<el-dialog v-model="dialogVisible" style="line-height: 0">
|
||||
<img style="width: 100%; height: 100%" :src="dialogImageUrl" alt="" />
|
||||
</el-dialog>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司类型" prop="type" style="width: 30%">
|
||||
<el-input
|
||||
v-model="submitForm.type"
|
||||
placeholder="请输入公司类型,例如:银行,软件等"
|
||||
id="type"
|
||||
size="large"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司人数" prop="staffNumber" style="width: 30%">
|
||||
<el-input
|
||||
v-model="submitForm.staffNumber"
|
||||
placeholder="请输入公司人数,例如:1000-9999"
|
||||
id="staffNumber"
|
||||
size="large"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="公司详情" prop="conpanyDetail">
|
||||
<el-input
|
||||
v-model="submitForm.companyDetail"
|
||||
|
|
|
@ -5,7 +5,7 @@ import { Delete, Edit, Hide, View, Search } from '@element-plus/icons-vue'
|
|||
import { useGetJobList, useSearchJob } from '@/api/recruitment'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import JobStatusDialog from './components/JobStatusDialog.vue'
|
||||
import JobDelDialog from './components/JobDelDialog.vue'
|
||||
import JobDelDialog from './components/JobdelDialog.vue'
|
||||
const loading = ref(false)
|
||||
const jobEndit = ref()
|
||||
|
||||
|
@ -83,7 +83,7 @@ const search = async () => {
|
|||
<el-button type="primary" @click="onAddEdit">添加岗位 </el-button>
|
||||
</template>
|
||||
<el-table v-loading="loading" stripe :data="jobList" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="200" />
|
||||
<el-table-column type="index" label="序号" width="100" />
|
||||
<el-table-column prop="jobName" label="岗位名称" width="200" />
|
||||
<el-table-column prop="jobType" label="岗位类型" width="200">
|
||||
<template #default="{ row }">
|
||||
|
@ -98,11 +98,11 @@ const search = async () => {
|
|||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="detail" label="岗位详情" width="300" />
|
||||
<el-table-column prop="salary" label="预期工资" width="150" />
|
||||
<el-table-column prop="number" label="招聘人数" width="150" />
|
||||
<el-table-column prop="createTime" label="创建时间" width="150" />
|
||||
<el-table-column prop="address" label="工作地址" width="250" />
|
||||
<el-table-column prop="detail" label="岗位详情" />
|
||||
<el-table-column prop="salary" label="预期工资" />
|
||||
<el-table-column prop="number" label="招聘人数" />
|
||||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column prop="address" label="工作地址" />
|
||||
<el-table-column prop="status" label="状态" width="70">
|
||||
<template #default="{ row }">
|
||||
{{ row.status === 1 ? '正常' : '禁用' }}
|
||||
|
@ -110,13 +110,12 @@ const search = async () => {
|
|||
</el-table-column>
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改岗位信息"
|
||||
placement="top-start"
|
||||
title="编辑岗位"
|
||||
:width="30"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
|
@ -124,16 +123,14 @@ const search = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-tooltip>
|
||||
|
||||
<el-popover
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
:content="row.status === 1 ? '禁用岗位' : '恢复岗位'"
|
||||
placement="top-start"
|
||||
:title="row.status === 1 ? '禁用岗位' : '启用岗位'"
|
||||
:width="30"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button
|
||||
:type="row.status === 1 ? 'info' : 'success'"
|
||||
:icon="row.status === 1 ? Hide : View"
|
||||
|
@ -141,15 +138,13 @@ const search = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除岗位"
|
||||
placement="top-start"
|
||||
title="删除岗位"
|
||||
:width="30"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -157,8 +152,7 @@ const search = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
<script setup>
|
||||
import { Search, Edit, Delete, Hide, View } from '@element-plus/icons-vue'
|
||||
import { ref } from 'vue'
|
||||
import PublicJobAddDialog from './components/PublicJobAddDialog.vue'
|
||||
import { getJobPostingList } from '@/api/recruitment'
|
||||
import { useCompanyStore } from '@/stores'
|
||||
import PublicJobDelDialog from './components/PublicJobDelDialog.vue'
|
||||
|
||||
const searchName = ref('')
|
||||
const loading = ref(false)
|
||||
const jobPostingList = ref([])
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const getPublicList = async () => {
|
||||
loading.value = true
|
||||
const res = await getJobPostingList(companyStore.encoding)
|
||||
|
||||
jobPostingList.value = res.data.data
|
||||
|
||||
console.log(jobPostingList.value)
|
||||
|
||||
loading.value = false
|
||||
}
|
||||
|
||||
getPublicList()
|
||||
const publicJobAddDialog = ref()
|
||||
const onAddEdit = (row) => {
|
||||
console.log(row)
|
||||
publicJobAddDialog.value.open(row)
|
||||
}
|
||||
const searchPublic = () => {
|
||||
console.log('搜索')
|
||||
}
|
||||
const publicJobDelDialog = ref()
|
||||
const handleDelete = (row) => {
|
||||
publicJobDelDialog.value.open(row)
|
||||
}
|
||||
|
||||
const handlestatus = () => {}
|
||||
</script>
|
||||
<template>
|
||||
<page-container title="招聘管理">
|
||||
<template #filter>
|
||||
<div class="mt-4">
|
||||
<el-input
|
||||
v-model="searchName"
|
||||
placeholder="请输入岗位名称"
|
||||
class="input-with-select"
|
||||
>
|
||||
<template #prepend>
|
||||
<el-button :icon="Search" @click="searchPublic" />
|
||||
</template>
|
||||
<template #append>
|
||||
<el-button @click="getPublicList">重置</el-button>
|
||||
</template>
|
||||
</el-input>
|
||||
</div>
|
||||
</template>
|
||||
<template #extra>
|
||||
<el-button type="primary" @click="onAddEdit">招聘发布</el-button>
|
||||
</template>
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
stripe
|
||||
:data="jobPostingList"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="200" />
|
||||
<el-table-column prop="recruitmentName" label="招聘名称" />
|
||||
<el-table-column prop="jobName" label="招聘岗位" />
|
||||
<el-table-column prop="describe" label="招聘描述" />
|
||||
<el-table-column prop="time" label="招聘时间" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="{ row }">
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="修改招聘信息"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
@click="onAddEdit(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="禁用招聘"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
:type="row.status === 1 ? 'info' : 'success'"
|
||||
:icon="row.status === 1 ? Hide : View"
|
||||
@click="handlestatus(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除岗位招聘"
|
||||
placement="top-start"
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
@click="handleDelete(row)"
|
||||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<PublicJobAddDialog
|
||||
ref="publicJobAddDialog"
|
||||
@getPublicList="getPublicList"
|
||||
></PublicJobAddDialog>
|
||||
<PublicJobDelDialog
|
||||
ref="publicJobDelDialog"
|
||||
@getPublicList="getPublicList"
|
||||
></PublicJobDelDialog>
|
||||
</page-container>
|
||||
</template>
|
|
@ -93,6 +93,23 @@ const searchJob = async () => {
|
|||
<el-table-column prop="imageUrl" label="面试官形象">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
:width="300"
|
||||
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; padding: 20px; width:450px; height:550px;"
|
||||
v-if="row.imageUrl === undefined || row.imageUrl === ''"
|
||||
>
|
||||
<template #reference>
|
||||
<video
|
||||
:src="row.videoUrl"
|
||||
style="height: 100px; width: 100px"
|
||||
></video>
|
||||
</template>
|
||||
<video
|
||||
:src="row.videoUrl"
|
||||
style="height: 500px; width: 400px"
|
||||
></video>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
v-else
|
||||
:width="300"
|
||||
popper-style="box-shadow: rgb(14 18 22 / 35%) 0px 10px 38px -10px, rgb(14 18 22 / 20%) 0px 10px 20px -15px; padding: 20px; width:550px; height:550px;"
|
||||
>
|
||||
|
@ -126,13 +143,12 @@ const searchJob = async () => {
|
|||
<el-table-column prop="createTime" label="创建时间" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="{ row }">
|
||||
<el-popover
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="编辑面试设置"
|
||||
placement="top-start"
|
||||
title="编辑"
|
||||
:width="30"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button
|
||||
type="primary"
|
||||
:icon="Edit"
|
||||
|
@ -140,15 +156,14 @@ const searchJob = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
<el-popover
|
||||
</el-tooltip>
|
||||
|
||||
<el-tooltip
|
||||
class="box-item"
|
||||
effect="dark"
|
||||
content="删除面试设置"
|
||||
placement="top-start"
|
||||
title="删除岗位"
|
||||
:width="30"
|
||||
trigger="hover"
|
||||
>
|
||||
<template #reference>
|
||||
<el-button
|
||||
type="danger"
|
||||
:icon="Delete"
|
||||
|
@ -156,8 +171,7 @@ const searchJob = async () => {
|
|||
circle
|
||||
plain
|
||||
></el-button>
|
||||
</template>
|
||||
</el-popover>
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #empty>
|
||||
|
|
|
@ -74,6 +74,7 @@ const options = ref([
|
|||
// const emit = defineEmits(['getAdminList'])
|
||||
|
||||
const submitForm = async () => {
|
||||
console.log(FormModel.value)
|
||||
await form.value.validate()
|
||||
FormModel.value.userId = userStore.userInfo.id
|
||||
FormModel.value.encoding = companyStore.encoding
|
||||
|
|
|
@ -192,11 +192,24 @@ const before = () => {
|
|||
active.value = active.value - 1
|
||||
}
|
||||
const submit = async () => {
|
||||
if (submitFormModel.value.professional === '') {
|
||||
submitFormModel.value.professional = 0
|
||||
}
|
||||
if (submitFormModel.value.comprehensive === '') {
|
||||
submitFormModel.value.comprehensive = 0
|
||||
}
|
||||
if (submitFormModel.value.psychology === '') {
|
||||
submitFormModel.value.psychology = 0
|
||||
}
|
||||
|
||||
submitFormModel.value.userId = userStore.userInfo.id
|
||||
console.log(submitFormModel.value)
|
||||
const res = await useUpdateJobSetting(submitFormModel.value)
|
||||
ElMessage.success(res.data.data)
|
||||
console.log(submitFormModel.value)
|
||||
active.value = 0
|
||||
enditDialog.value = false
|
||||
|
||||
emit('getJobSettingList')
|
||||
}
|
||||
defineExpose({
|
||||
|
|
|
@ -10,6 +10,7 @@ const id = ref()
|
|||
const emit = defineEmits(['getJobList'])
|
||||
|
||||
const open = (row) => {
|
||||
console.log(row)
|
||||
status.value = row.status
|
||||
jobName.value = row.jobName
|
||||
id.value = row.id
|
||||
|
@ -30,23 +31,21 @@ defineExpose({
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="status === '正常' ? '禁用岗位' : '启用岗位'"
|
||||
:title="status === 1 ? '禁用岗位' : '启用岗位'"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<span
|
||||
>您确定要{{ status === '正常' ? '禁用' : '启用' }}岗位:{{
|
||||
jobName
|
||||
}}?</span
|
||||
>您确定要{{ status === 1 ? '禁用' : '启用' }}岗位:{{ jobName }}?</span
|
||||
>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button
|
||||
:type="status === '正常' ? 'danger' : 'success'"
|
||||
:type="status === 1 ? 'danger' : 'success'"
|
||||
@click="changeStatus"
|
||||
>
|
||||
{{ status === '正常' ? '禁用' : '启用' }}
|
||||
{{ status === 1 ? '禁用' : '启用' }}
|
||||
</el-button>
|
||||
</span>
|
||||
</template>
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import {
|
||||
useGetJobSettingList,
|
||||
addJobPosting,
|
||||
updateJobPosting
|
||||
} from '@/api/recruitment'
|
||||
import { useCompanyStore, useUserStore } from '@/stores'
|
||||
import { Edit } from '@element-plus/icons-vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
|
||||
const PublicAddDialog = ref(false)
|
||||
const dialogLoading = ref(false)
|
||||
const isEdit = ref(false)
|
||||
const submitForm = ref({
|
||||
name: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
checkList: [],
|
||||
userId: '',
|
||||
encoding: '',
|
||||
initCheckList: []
|
||||
})
|
||||
const jobList = ref([])
|
||||
|
||||
const emit = defineEmits(['getPublicList'])
|
||||
|
||||
const companyStore = useCompanyStore()
|
||||
const userStore = useUserStore()
|
||||
const open = async (row) => {
|
||||
console.log(row.id)
|
||||
if (row.id) {
|
||||
isEdit.value = true
|
||||
submitForm.value.id = row.id
|
||||
submitForm.value.name = row.recruitmentName
|
||||
submitForm.value.startTime = row.startTime
|
||||
submitForm.value.endTime = row.endTime
|
||||
submitForm.value.checkList = row.checkedList
|
||||
console.log('修改初始化')
|
||||
console.log(submitForm.value)
|
||||
}
|
||||
|
||||
PublicAddDialog.value = true
|
||||
dialogLoading.value = true
|
||||
const res = await useGetJobSettingList(companyStore.encoding)
|
||||
jobList.value = res.data.data
|
||||
console.log(jobList.value)
|
||||
dialogLoading.value = false
|
||||
}
|
||||
|
||||
const rules = {
|
||||
name: [{ required: true, message: '请输入招聘名称', trigger: 'blur' }],
|
||||
startTime: [
|
||||
{ required: true, message: '请选择招聘开始时间', trigger: 'blur' }
|
||||
],
|
||||
endTime: [{ required: true, message: '请选择招聘结束时间', trigger: 'blur' }],
|
||||
checkList: [{ required: true, message: '请选择招聘职位', trigger: 'blur' }]
|
||||
}
|
||||
|
||||
const submit = async () => {
|
||||
await ruleFormRef.value.validate()
|
||||
submitForm.value.encoding = companyStore.encoding
|
||||
submitForm.value.userId = userStore.userInfo.id
|
||||
submitForm.value.checkList = JSON.stringify(submitForm.value.checkList)
|
||||
if (isEdit.value) {
|
||||
console.log('修改' + isEdit.value)
|
||||
const res = await updateJobPosting()
|
||||
ElMessage.success(res.data.data)
|
||||
} else {
|
||||
const res = await addJobPosting(submitForm.value)
|
||||
|
||||
ElMessage.success(res.data.data)
|
||||
}
|
||||
|
||||
emit('getPublicList')
|
||||
|
||||
submitForm.value = {
|
||||
name: '',
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
checkList: [],
|
||||
userId: '',
|
||||
encoding: ''
|
||||
}
|
||||
PublicAddDialog.value = false
|
||||
console.log(submitForm.value)
|
||||
}
|
||||
const ruleFormRef = ref()
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog v-model="PublicAddDialog" title="招聘发布" width="50%">
|
||||
<el-scrollbar height="600px">
|
||||
<el-form
|
||||
v-loading="dialogLoading"
|
||||
ref="ruleFormRef"
|
||||
:model="submitForm"
|
||||
:rules="rules"
|
||||
label-width="120px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-steps :active="0" simple finish-status="success">
|
||||
<el-step title="填写招聘信息" :icon="Edit" />
|
||||
</el-steps>
|
||||
<el-form-item label="招聘名称" prop="name" style="margin-top: 10%">
|
||||
<el-input v-model="submitForm.name" style="width: 60%" size="large" />
|
||||
</el-form-item>
|
||||
<el-form-item label="开始时间" prop="startTime">
|
||||
<el-date-picker
|
||||
v-model="submitForm.startTime"
|
||||
type="date"
|
||||
placeholder="请选择招聘开始时间"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="结束时间" prop="endTime">
|
||||
<el-date-picker
|
||||
v-model="submitForm.endTime"
|
||||
type="date"
|
||||
placeholder="请选择招聘结束时间"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="招聘岗位" prop="checkList">
|
||||
<el-checkbox-group v-model="submitForm.checkList">
|
||||
<el-checkbox
|
||||
v-for="item in jobList"
|
||||
:key="item.id"
|
||||
:label="item.jobId"
|
||||
>{{ item.jobName }}</el-checkbox
|
||||
>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="PublicAddDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="submit"> 提交 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
|
@ -0,0 +1,56 @@
|
|||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { deleteJobPosting } from '@/api/recruitment'
|
||||
|
||||
const centerDialogVisible = ref(false)
|
||||
|
||||
const info = ref({})
|
||||
|
||||
const emit = defineEmits(['getPublicList'])
|
||||
|
||||
const open = (row) => {
|
||||
info.value = row
|
||||
centerDialogVisible.value = true
|
||||
}
|
||||
|
||||
const handleDelete = async () => {
|
||||
const res = await deleteJobPosting(info.value.id)
|
||||
ElMessage.success(res.data.data)
|
||||
centerDialogVisible.value = false
|
||||
emit('getPublicList')
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
open
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="centerDialogVisible"
|
||||
title="警告"
|
||||
width="30%"
|
||||
align-center
|
||||
>
|
||||
<span
|
||||
>您确定要删除<span class="typeNsme">{{ info.recruitmentName }}</span
|
||||
>?</span
|
||||
>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="centerDialogVisible = false">取消</el-button>
|
||||
<el-button type="danger" @click="handleDelete"> 确定 </el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer button:first-child {
|
||||
margin-right: 10px;
|
||||
}
|
||||
.typeNsme {
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
|
@ -200,6 +200,16 @@ const handlePsychology = async () => {
|
|||
}
|
||||
}
|
||||
const submit = async () => {
|
||||
if (submitFormModel.value.Professional === '') {
|
||||
submitFormModel.value.Professional = 0
|
||||
}
|
||||
if (submitFormModel.value.Comprehensive === '') {
|
||||
submitFormModel.value.Comprehensive = 0
|
||||
}
|
||||
if (submitFormModel.value.Psychology === '') {
|
||||
submitFormModel.value.Psychology = 0
|
||||
}
|
||||
console.log(submitFormModel.value)
|
||||
submitFormModel.value.userId = userStore.userInfo.id
|
||||
submitFormModel.value.encoding = companyStore.encoding
|
||||
if (!submitFormModel.value.jobPromote) {
|
||||
|
@ -229,7 +239,18 @@ const submit = async () => {
|
|||
userId: '',
|
||||
encoding: ''
|
||||
}
|
||||
submitFormModel.value = {}
|
||||
submitFormModel.value = {
|
||||
jobId: '',
|
||||
imagesId: '',
|
||||
backgroundId: '',
|
||||
logoId: '',
|
||||
Professional: '',
|
||||
Comprehensive: '',
|
||||
Psychology: '',
|
||||
userId: '',
|
||||
encoding: '',
|
||||
jobPromote: ''
|
||||
}
|
||||
openComprehensive.value = '0'
|
||||
openProfessional.value = '0'
|
||||
openPsychology.value = '0'
|
||||
|
@ -257,7 +278,7 @@ defineExpose({
|
|||
<el-step title="选择背景" :icon="Picture" />
|
||||
<el-step title="选择logo" :icon="Picture" />
|
||||
<el-step title="选择题库" :icon="Picture" />
|
||||
<el-step title="填写岗位promote" :icon="Picture" />
|
||||
<el-step title="预设promote" :icon="Picture" />
|
||||
</el-steps>
|
||||
<div v-if="active === 0" class="select">
|
||||
<p>请选择岗位</p>
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
* This file is a configuration file generated by the `Template` extension on `vscode`
|
||||
* @see https://marketplace.visualstudio.com/items?itemName=yongwoo.template
|
||||
*/
|
||||
module.exports = {
|
||||
// You can change the template path to another path
|
||||
templateRootPath: "./.templates",
|
||||
// After copying the template file the `replaceFileTextFn` function is executed
|
||||
replaceFileTextFn: (fileText, templateName, utils) => {
|
||||
// @see https://www.npmjs.com/package/change-case
|
||||
const { changeCase } = utils;
|
||||
// You can change the text in the file
|
||||
return fileText
|
||||
.replace(/__templateName__/g, templateName)
|
||||
.replace(
|
||||
/__templateNameToPascalCase__/g,
|
||||
changeCase.pascalCase(templateName)
|
||||
)
|
||||
.replace(
|
||||
/__templateNameToParamCase__/g,
|
||||
changeCase.paramCase(templateName)
|
||||
);
|
||||
},
|
||||
renameFileFn: (fileName, templateName, utils) => {
|
||||
const { path } = utils;
|
||||
const { base } = path.parse(fileName);
|
||||
return base.replace(/__templateName__/gm, templateName);
|
||||
},
|
||||
renameSubDirectoriesFn: (directoryName, templateName, _utils) => {
|
||||
const { changeCase } = _utils;
|
||||
const newDirectoryName = changeCase.paramCase(templateName);
|
||||
return directoryName.replace(/__templateName__/g, newDirectoryName);
|
||||
}
|
||||
};
|
|
@ -23,8 +23,21 @@ export default defineConfig({
|
|||
]
|
||||
})
|
||||
],
|
||||
|
||||
//代理设置
|
||||
server: {
|
||||
host: '0.0.0.0'
|
||||
port: 5173,
|
||||
host: '0.0.0.0',
|
||||
base: './',
|
||||
cors: true, // 默认启用并允许任何源
|
||||
open: true, // 在服务器启动时自动在浏览器中打开应用程序
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://117.88.94.226:5380',
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api/, 'api')
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
resolve: {
|
||||
|
|