This commit is contained in:
Unique-Jerry 2023-12-15 01:01:10 +08:00
parent 02825fdfed
commit b4cdf86580
89 changed files with 4867 additions and 336 deletions

View File

@ -0,0 +1,2 @@
export default function $$var_textInFile() {
}

21
.templates/.editorconfig Normal file
View File

@ -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

View File

@ -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__;

View File

@ -0,0 +1,3 @@
.__templateNameToParamCase__ {
display: inline-block;
}

View File

@ -0,0 +1,5 @@
export default function __templateNameToPascalCase__() {
console.log("TemplateName -> __templateName__");
console.log("TemplateName to ParamCase -> __templateNameToParamCase__");
console.log("TemplateName to PascalCase -> __templateNameToPascalCase__");
}

View File

@ -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>

View File

@ -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",

View File

@ -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

View File

@ -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
})

View File

@ -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
})

View File

@ -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
}
})

View File

@ -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
}
})

View File

@ -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 })

View File

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 258 KiB

View File

@ -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')

View File

@ -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')
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -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,

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -75,6 +75,7 @@ defineExpose({
title="添加Logo"
width="30%"
align-center
:close-on-click-modal="false"
>
<el-form
label-width="100px"

View File

@ -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>

View File

@ -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="上传头像">

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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"

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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({

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

34
template.config.js Normal file
View File

@ -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);
}
};

View File

@ -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: {