Commit 984283a7 authored by FE-安焕焕's avatar FE-安焕焕 👣

Merge branch 'deploy' into 'master'

Deploy

See merge request !3
parents 86f798b3 219f604e
......@@ -9,21 +9,27 @@ function resolve (dir) {
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
// test: /\.(js|vue)$/,
// loader: 'eslint-loader',
// enforce: 'pre',
// include: [resolve('src'), resolve('test')],
// options: {
// formatter: require('eslint-friendly-formatter'),
// emitWarning: !config.dev.showEslintErrorsInOverlay
// }
})
module.exports = {
externals: {
"CKEDITOR": "window.CKEDITOR"
},
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
externals:{
'CKEDITOR':'window.CKEDITOR'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
......
......@@ -31,7 +31,7 @@ const devWebpackConfig = merge(baseWebpackConfig, {
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
host: '192.168.28.10' || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
......@@ -76,6 +76,7 @@ module.exports = new Promise((resolve, reject) => {
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
devWebpackConfig.devServer.host = '0.0.0.0'
// add port to devServer config
devWebpackConfig.devServer.port = port
......
......@@ -10,12 +10,13 @@ module.exports = {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
proxyTable: {
},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
host: '0.0.0.0', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
......
......@@ -2,11 +2,16 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>recruiting-management</title>
<!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=0"/>
<title>思坦途</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
<script src="/static/ckeditor/ckeditor.js" type="text/javascript" charset="utf-8"></script>
<script>
// window.CKEDITOR_BASEPATH = 'http://example.com/static/';
</script>
</html>
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -11,11 +11,18 @@
"build": "node build/build.js"
},
"dependencies": {
"axios": "^0.19.0",
"es6-promise": "^4.2.8",
"iview": "^3.4.2",
"js-cookie": "^2.2.0",
"less": "^3.9.0",
"less-loader": "^5.0.0",
"moment": "^2.24.0",
"qs": "^6.7.0",
"vue": "^2.5.2",
"vue-router": "^3.0.1"
"vue-router": "^3.0.1",
"vue-upload-component": "^2.8.20",
"vuex": "^3.1.1"
},
"devDependencies": {
"autoprefixer": "^7.1.2",
......@@ -54,6 +61,7 @@
"shelljs": "^0.7.6",
"uglifyjs-webpack-plugin": "^1.1.1",
"url-loader": "^0.5.8",
"vue-happy-scroll": "^2.1.0",
"vue-loader": "^13.3.0",
"vue-style-loader": "^3.0.1",
"vue-template-compiler": "^2.5.2",
......
<template>
<div id="app">
<div id="app" :class="appClass">
<router-view/>
</div>
</template>
<script>
window.onload = function() {
  document.addEventListener('touchstart', function(event) {
    if (event.touches.length > 1) {
      event.preventDefault()
    }
  })
  document.addEventListener('gesturestart', function(event) {
    event.preventDefault()
  })
}
export default {
name: 'App',
data() {
return {
appClass: 'pc',
}
},
created: function () {
if (document.documentElement.clientWidth <= 640) {
this.appClass = 'mobile'
}
}
};
</script>
<style>
#app {
#app{
position: absolute;
top: 0;
bottom: 0;
width: 100%;
min-width: 1341px;
min-height: 741px;
cursor:auto;
text-align: left;
font-family: 'PingFangSC-Regular', 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
......@@ -29,4 +48,16 @@ export default {
-ms-user-select: text !important; /*IE10*/
user-select: text !important;
}
.pc {
min-width: 1341px;
min-height: 741px;
}
.mobile {
min-width: unset;
min-height: unset;
}
.ivu-btn-primary{
background: #0092FF!important
}
</style>
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
// 获取个人信息
export function getpersonMassage(params) {
// params=qs.stringify(params)
return axios.get(`${sapi}/api/login/me`,params,{headers: {
'Content-Type':'application/json'
}})
}
// 用户退出
export function loginOUT() {
// params=qs.stringify(params)
return axios.get(`${sapi}/api/login/logout`,{headers: {
'Content-Type':'application/json'
}})
}
//通过某一来源查询简历信息
export function adoptOneSeeResumeList(parmars) {
return axios.post(`${sapi}/api/resume/findListBySource`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
//通过渠道机简历信息
export function getChannelMassage() {
return axios.get(`${sapi}/api/resume/getSourceList`,{headers: {
'Content-Type':'application/json'
}})
}
// 判断是否为超级管理员
export function judeAdmin() {
return axios.get(`${sapi}/api/user/isAdmin`,{headers: {
'Content-Type':'application/json'
}})
}
\ No newline at end of file
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
// 更改约面信息
export function changeinterviewMassage(parmars) {
return axios.post(`${sapi}/api/resumeInterview/update`,parmars,{headers: {
'Content-Type':'application/json;',
}})
}
// 重启面试
export function oppenInterview(tid,tstatus) {
console.log(tid,tstatus)
return axios.post(`${sapi}/api/resumeFlow/reset/${tid}/${tstatus}`,{headers: {
'Content-Type':'application/json;',
}})
}
// 终止面试
export function SInterview(tid) {
return axios.post(`${sapi}/api/resumeFlow/end/${tid}`,{headers: {
'Content-Type':'application/json;',
}})
}
// 面试管理查询
export function SerchList(parmars) {
return axios.post(`${sapi}/api/interview/findListByQueryVO`,parmars,{headers: {
'Content-Type':'application/json;',
'X-Requested-With':'XMLHttpRequest'
}})
}
//查看简历详情页
export function seedetail (parmars) {
return axios.get(`${sapi}/api/html/get/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json'
}})
}
//面试官查询
export function Serchinterviewor() {
return axios.post(`${sapi}/api/interview/findInterviewerList`,{headers: {
'Content-Type':'application/json;',
}})
}
//邀约人查询
export function SerchInvitationOwer() {
return axios.post(`${sapi}/api/interview/findInviterList`,{headers: {
'Content-Type':'application/json;',
}})
}
//新增约面信息
export function NewAddInterview(parmars) {
return axios.post(`${sapi}/api/resumeInterview/add`,parmars,{headers: {
'Content-Type':'application/json;',
}})
}
// 查询记录
export function recodeLIST (parmars) {
return axios.post(`${sapi}/api/resumeFlow/history/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json'
}})
}
// 变更状态
export function changestatus (tid,tstatus) {
return axios.post(`${sapi}/api/resumeFlow/uploadStatus/${tid}/${tstatus}`,{headers: {
'Content-Type':'application/json'
}})
}
// 获取终止面试前的前一个状态
export function formstatus (parmars) {
return axios.post(`${sapi}/api/resumeFlow/getPreReset/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json'
}})
}
\ No newline at end of file
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
//登录
export function login(params) {
// params=qs.stringify(params)
return axios.post(`${sapi}/api/login/doLogin`,params,{headers: {
'Content-Type':'application/json'
}})
}
//修改密码
export function updatePsd(params) {
// params=qs.stringify(params)
return axios.post(`${sapi}/api/login/modifyPassword`,params,{headers: {
'Content-Type':'application/json'
}})
}
\ No newline at end of file
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
// 查询简历列表
export function serchList(parmars){
return axios.post(`${sapi}/api/resume/findList`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
// 下载简历(单条)
export function downloadone (parmars) {
parmars=qs.stringify(parmars)
return axios.post(`${sapi}/api/resumeFile/download/formatted/one`,parmars,{headers: {
'Content-Type':'application/x-www-form-urlencoded'
}})
}
// 搜索
export function sousuoList (parmars) {
return axios.post(`${sapi}/api/resume/findListByQueryVO`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
//查看简历详情页
export function seedetail (parmars) {
return axios.get(`${sapi}/api/html/get/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json'
}})
}
// 简历pass
export function PASS (parmars) {
return axios.post(`${sapi}/api/resumeFlow/uploadStatus/${parmars.id}/${parmars.status}`,'',{headers: {
'Content-Type':'application/json'
}})
}
//待处理
export function TODORes (parmars) {
return axios.post(`${sapi}/api/resumeFlow/uploadStatus/${parmars.id}/${parmars.status}`,'',{headers: {
'Content-Type':'application/json'
}})
}
// 备选
export function OPTION (parmars) {
return axios.post(`${sapi}/api/resumeFlow/uploadStatus/${parmars.id}/${parmars.status}`,'',{headers: {
'Content-Type':'application/json'
}})
}
// 删除简历
export function deleteREsume (deleteallArr) {
return axios.post(`${sapi}/api/resume/delete`,JSON.stringify(deleteallArr),{headers: {
'Content-Type':'application/json'
}})
}
// 单条下载简历
export function downloadOne (parmars) {
return axios.get(`${sapi}/api/resume/download/formatted/one?resumeId=${parmars.resumeId}`,{headers: {
// 'Content-Type':'application/x-www-form-urlencoded'
}})
}
// 批量下载简历
export function downloadALL () {
return axios.get(`${sapi}/api/resumeFile/download/formatted/compress`,{headers: {
'Content-Type':'application/x-www-form-urlencoded'
}})
}
// 导出列表
export function exportLIST (parmars) {
return axios.get(`${sapi}/api/excel/output?optSource=${parmars.optSource}&keywordString=${parmars.keywordString}&company=${parmars.company}&ownerSex=${parmars.ownerSex}&highestDegreeNum=${parmars.highestDegreeNum}&flowStatusList=${parmars.flowStatusList}&ownerWorkYears1=${parmars.ownerWorkYears1}&ownerWorkYears2=${parmars.ownerWorkYears2}`,
{headers: {
'Content-Type':'application/json'
}})
}
// 操作记录
export function recodeLIST (parmars) {
return axios.post(`${sapi}/api/resumeFlow/history/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json'
}})
}
//通过某一来源查询简历信息
export function adoptOneSeeResumeList(parmars) {
return axios.post(`${sapi}/api/resume/findListBySource`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
// 新增约面信息
export function addinterview(parmars) {
return axios.post(`${sapi}/api/resumeInterview/add`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
// 修改流程状态
export function updatastatus(parmars) {
return axios.post(`${sapi}/api/resumeFlow/uploadStatus/${parmars.id}/${parmars.status}`,{headers: {
'Content-Type':'application/json'
}})
}
//获取邮件模板
export function getEmailMoo() {
return axios.post(`${sapi}/api/emailTemplate/getAllTemplateList`,{headers: {
'Content-Type':'application/json'
}})
}
//根据获取id邮件模板内容
export function getEmailContent(parmars) {
return axios.post(`${sapi}/api/emailTemplate/loadTemplate`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
//上传图片
export function uploadimage() {
return axios.get(`${sapi}/api/ckeditor/uploadImage`,{headers: {
'Content-Type':'application/json'
}})
}
// 发送邮件
export function sendEmail(parmars) {
return axios.post(`${sapi}/api/sendMail/sendEmailTemplate`,parmars,{headers: {
'Content-Type':'multipart/form-data',
// 'Content-Disposition':'multipart/form-data'
// 'Content-Type':'application/json'
}})
}
export function findCompanyEmailByKey(key) { //公司通讯录
return axios.get(`${sapi}/api/companyEmail/findCompanyEmailByKey?key=${key}`)
}
// 转发邮箱通知
export function forwardResume(params) {
return axios.post(`${sapi}/api/resume/forwardResume`,params, {headers: {
'Content-Type':'application/json'
}})
}
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
//账号列表查询
export function queryaccountList(params) {
return axios.post(`${sapi}/api/user/findList`,params,{headers: {
'Content-Type':'application/json;',
}})
}
//添加账户
export function addAccount (params) {
return axios.post(`${sapi}/api/user/add`,params,{headers: {
'Content-Type':'application/json'
}})
}
//删除单条账户
export function Delateaccount(parmars){
return axios.get(`${sapi}/api/user/delete/${parmars.id}`,{headers: {
'Content-Type':'application/json',
}})
}
//批量删除
export function delateAllAccount(DelateARR){
return axios.post(`${sapi}//api/user/delete`,JSON.stringify(DelateARR),{headers: {
'Content-Type':'application/json',
}})
}
//恢复初始密码
export function recoveryPassword(parmars){
return axios.post(`${sapi}/api/user/initial/${parmars.id}`,{headers: {
'Content-Type':'application/json',
}})
}
//查询邮箱列表
export function queryemailList(parmars){
return axios.post(`${sapi}/api/email/list`,parmars,{headers: {
'Content-Type':'application/json',
}})
}
// 同步邮箱
export function Synchronization(parmars){
return axios.post(`${sapi}/api/email/bindAndSync`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
// 解绑邮箱
export function jiebangEmail(id){
return axios.post(`${sapi}/api/email/unbind/${id}`,{headers: {
'Content-Type':'application/x-www-form-urlencoded'
}})
}
// 修改邮箱并重新绑定
export function updateemailTWO(parmars){
return axios.post(`${sapi}/api/email/modify`,parmars,{headers: {
'Content-Type':'application/json'
}})
}
// 批量解绑邮箱
export function UntyingAll(UntyingAllARR){
return axios.post(`${sapi}/api/email/unbind/batch`,JSON.stringify(UntyingAllARR),{headers: {
'Content-Type':'application/json'
}})
}
// 获取二维码
export function getErcode(){
return axios.get(`${sapi}/api/qrCode/getInterviewQrcode`,{headers: {
'Content-Type':'application/json',
}})
}
// //下载二维码
// export function downloadErcode(){
// return axios.get(`${sapi}/qrCode/downQrCode`,{headers: {
// 'Content-Type':'application/json',
// }})
// }
\ No newline at end of file
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
// 提交应聘登记表
export function submitMassage(params) {
// params=qs.stringify(params)
return axios.post(`${sapi}/api/interview/arrive`,params,{headers: {
'Content-Type':'application/json' }})
}
\ No newline at end of file
import axios from '../service/http.service'
import {
sapi
} from '../config'
import qs from 'qs'
// 获取上传批次号
export function getuploadNumber() {
// params=qs.stringify(params)
return axios.get(`${sapi}/api/resume/upload/batchNum`,{headers: {
'Content-Type':'application/json'
}})
}
//上传文件
export function uploadfile(parmars) {
return axios.post(`${sapi}/api/resume/upload`,parmars,{headers: {
// 'Content-Type':'multipart/form-data',
processData : false,
contentType : false,
async: false,
}})
}
// 查询上传列表记录
export function serchList(parmars) {
return axios.post(`${sapi}/api/resume/upload/history`,parmars,{headers: {
'Content-Type':'application/json',
}})
}
// 查询简历详情
export function serchRESUMEdetail(parmars) {
return axios.get(`${sapi}/api/html/get/${parmars.resumeId}`,{headers: {
'Content-Type':'application/json',
}})
}
// 查询简历详情
export function deleteREsumeUPLOad(deleteallArr) {
return axios.post(`${sapi}/api/resume/delete`,JSON.stringify(deleteallArr),{headers: {
'Content-Type':'application/json',
}})
}
<template>
<div>
<textarea id="editor" rows="10" cols="80"></textarea>
</div>
</template>
<script type="text/ecmascript-6">
import CKEDITOR from 'CKEDITOR';
export default {
name: 'ckeditor',
props: {
height: {
default: '400px'
},
width: {
default: '100%'
},
color: {
default: '#ffffff'
},
uploadUrl: {
require: true,
default: ''
},
tokenUrl: {
default: ''
},
value: {
require: true,
default: ''
}
},
data() {
return {
isInit: false
};
},
watch: {
value:{
deep: true,
immediate:true,
handler(value) {
this.isInit&&this.editor.setData(value.value)
}
}
},
mounted() {
this.init()
},
beforeDestroy() {
},
methods: {
init () {
CKEDITOR.replace('editor', {
height: this.height,
width: this.width,
uiColor: this.color,
lang: 'zh-cn',
filebrowserImageUploadUrl: this.uploadUrl,
filebrowserUploadMethod: 'form'
});
this.editor = CKEDITOR.instances.editor;
setTimeout(()=> {
this.isInit = true
}, 1000)
},
getValue(){
return this.editor.getData()
}
},
components: {}
};
</script>
<style lang="less" rel="stylesheet/less" scoped>
</style>
\ No newline at end of file
<template>
<div>
<!-- bidirectional data binding(双向数据绑定) -->
<Modal v-model='modal' :fullscreen='fullscreen'>
<Input v-model='value'></Input>
<editor @getValue='getInfo' :uploadUrl='uploadUrl' :value='value' height='400px'></editor>
<div slot='footer'>
<Button @click='getInfo'>获取内容</Button>
</div>
</Modal>
<Form ref="formInline" :model="formInline" :rules="ruleInline" inline>
<FormItem prop="user">
<Input type="text" v-model="formInline.user" placeholder="Username">
<Icon type="ios-person-outline" slot="prepend"></Icon>
</Input>
</FormItem>
<FormItem prop="password">
<Input type="password" v-model="formInline.password" placeholder="Password">
<Icon type="ios-lock-outline" slot="prepend"></Icon>
</Input>
</FormItem>
<FormItem>
<Button type="primary" @click="handleSubmit('formInline')">Signin</Button>
</FormItem>
</Form>
</div>
</template>
<script>
import editor from './ckeditor.vue'
import {sapi} from '../config/index.js'
import localStorage from '../service/localstorage.service.js'
export default {
data () {
return {
modal: true,
fullscreen: true,
content: '<h2>I am Example</h2>',
content1: '<h2>I am Example</h2>',
uploadUrl: `${sapi}/api/ckeditor/uploadImage?token=${localStorage.get('token')}&&backUrl=/getimage`,
value: '22',
editorOption: {
// some quill options
},
formInline: {
user: '',
password: ''
},
ruleInline: {
user: [
{ required: false, message: 'Please fill in the user name', trigger: 'blur', pattern:/^1[3456789]\d{9}$/, validator: function(rule, value, call){
console.log(rule, value)
return call(new Error()) } }
],
password: [
{ required: true, message: 'Please fill in the password.', trigger: 'blur' },
{ type: 'string', min: 6, message: 'The password length cannot be less than 6 bits', trigger: 'blur' }
]
}
}
},
watch:{},
components: {
editor
},
// manually control the data synchronization
// 如果需要手动控制数据同步,父组件需要显式地处理changed事件
methods: {
getInfo(value) {
console.log(value)
},
handleSubmit(name) {
// this.$refs[name].validate((valid) => {
// if (valid) {
// this.$Message.success('Success!');
// } else {
// this.$Message.error('Fail!');
// }
// })
this.$refs[name].validateField('user', (error) => {
console.log('------', error)
})
}
},
computed: {
},
mounted() {
}
}
</script>
\ No newline at end of file
<template>
<div></div>
</template>
<script>
function GetQueryString(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg); //获取url中"?"符后的字符串并正则匹配
var context = "";
if (r != null)
context = r[2];
reg = null;
r = null;
return context == null || context == "" || context == "undefined" ? "" : decodeURIComponent(context);
}
export default{
data () {
return {}
},
mounted() {
console.log(777)
window.parent.CKEDITOR.tools.callFunction(GetQueryString("CKEditorFuncNum"),GetQueryString("ImageUrl"),GetQueryString("Message"))
}
}
</script>
\ No newline at end of file
This diff is collapsed.
<template>
<Row class="login">
<Col span="16" class="left">
<img src="https://org.modao.cc/uploads4/images/3427/34276822/v2_prfobz.jpg" alt="">
</Col>
<Col span="8" class="right">
<Row class="head">
<img src="https://org.modao.cc/uploads4/images/3427/34274354/v2_prfn6r.png" alt="">
<h1>登录</h1>
</Row>
<Row class="login-content">
<span class="tip"><Icon type="md-alert" /> 请输入正确的手机号码</span>
<Input type="text" placeholder="请输入11为手机号">
<Icon color="#2d8cf0" type="ios-person-outline" slot="prepend"></Icon>
</Input>
<span class="tip"><Icon type="md-alert" /> 请输入正确的密码</span>
<Input type="password" placeholder="请输入密码">
<Icon color="#2d8cf0" type="ios-lock-outline" slot="prepend"></Icon>
</Input>
<Button type="primary" @click="login" >登录</Button>
<span class="tip"><Icon type="md-alert" /> 请输入正确的手机号码</span>
</Row>
<Row class="foot">
<span>量化派为您提供全程服务</span>
<span>量化派版权所有</span>
</Row>
</Col>
</Row>
</template>
<script>
export default {
methods: {
login() {
this.$router.push('/user/login')
}
}
}
</script>
<style lang="less" scoped>
.login{
height: 100%;
padding: 6% 22%;
background: #F5F5F5;
display: flex;
.left{
img{
height: 100%;
width: 100%;
}
}
.right{
padding: 80px 20px;
background: #fff;
.head{
img{
width: 63%;
}
}
.foot{
position: absolute;
bottom: 40px;
span{
display: block;
}
}
}
}
</style>
<style lang="less">
.login-content{
text-align: center;
.tip{
color: red;
}
button{
width: 100%;
margin-bottom: 10px;
}
.ivu-input-wrapper{
margin-bottom: 20px;
border-bottom: 1px solid #dcdee2;
.ivu-input-group-prepend{
border: 0;
background: #fff;
.ivu-icon{
font-size: 20px !important;
font-weight: 300 !important;
}
}
input{
border: 0;
&:focus{
outline: 0 !important;
box-shadow: none;
}
}
}
}
</style>
\ No newline at end of file
const sapi = "http://recruitapi-ai3.liangkebang.net"
export {
sapi
}
\ No newline at end of file
const sapi = '//api.stantoo.com'
export {
sapi
}
\ No newline at end of file
......@@ -5,14 +5,19 @@ import iView from 'iview';
import 'iview/dist/styles/iview.css';
import App from './App';
import router from './router';
import initRouter from './service/init.service.js'
import 'vue-happy-scroll/docs/happy-scroll.css'
import {Notice} from 'iview'
import store from '../src/store'
Vue.use(iView);
Vue.use(Notice)
Vue.config.productionTip = false;
initRouter.init(router)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>',
});
This diff is collapsed.
<template>
<div class="login">
<div class="login-content">
<div class="loginContent-left">
<div class="logimg">
<img src="https://o7oe0d6qz.qnssl.com/image/logo99.png">
</div>
</div>
<div class="loginContent-right">
<div class="logo">
<img src="https://o7oe0d6qz.qnssl.com/image/log.jpg">
<h3>登录</h3>
</div>
<div class="login_content">
<Form ref="formInline" :model="formInline" :rules="ruleInline" style="height:161px">
<FormItem prop="user" style="height:60px">
<Input type="text" v-model="formInline.user" placeholder="请输入账号" class="wordStyle" size="large">
<Icon type="ios-person-outline" slot="prepend" ></Icon>
</Input>
</FormItem>
<FormItem prop="password">
<Input type="password" v-model="formInline.password" placeholder="请输入密码" class="wordStyle" @keyup.enter.native='login' size="large">
<Icon type="ios-lock-outline" slot="prepend"></Icon>
</Input>
<span style="color:red;margin-top;5px" v-show="noteconTime==true">{{notecontent}}</span>
</FormItem>
</Form>
<Button type="primary" class="loginBtu" @click.prevent="login">登录</Button>
</div>
<div class="copy">
<p>量化派为你提供全程服务</p>
<p>量化派版权所有</p>
</div>
</div>
</div>
</div>
</template>
<script>
import { login} from '../../api/login.server.js'
import localstorage from '../../service/localstorage.service.js'
export default {
data () {
return {
channelarr:[],
notecontent:'',
noteconTime:false,
ISIDMIN:'',
formInline: {
user: '',
password: ''
},
ruleInline: {
user: [
{ required: true, pattern:/^[1][3,4,5,7,8,6,9][0-9]{9}$/, message: '请输入正确的手机号', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入正确的密码', trigger: 'blur' },
// { type: 'string', min: 4, message: '请输入正确的密码', trigger: 'blur' }
]
}
}
},
methods: {
handleSubmit(name) {
this.$refs[name].validate((valid) => {
if (valid) {
this.$Message.success('Success!');
} else {
this.$Message.error('Fail!');
}
})
},
login(){
let params={
userCode:this.formInline.user,
password:this.formInline.password
}
if(this.formInline.user==''||this.formInline.password==''){
return
}
login(params).then(res=>{
if(res.data.body.code=='100'){
this.$router.push({name:'update',params:{userCode:this.formInline.user}})
return
}
if(res.data.success==true){
this.ISIDMIN=res.data.body
localstorage.set('token', res.data.body.token)
this.$router.push({name:"allResume"})
localstorage.set('isADMIN',JSON.stringify(this.ISIDMIN))
return
}
if(res.data.success==false){
this.noteconTime=true
this.notecontent=res.data.body.message
setTimeout(() => {
this.noteconTime=false
}, 3000)
return
}
})
}
}
}
</script>
<style scoped>
.login{
width:100%;
height:100%;
overflow: hidden;
}
.login .login-content{
width: 100%;
height: 100%;
overflow: hidden;
}
.loginContent-left {
float: left;
width: 70%;
height:100%;
}
.logimg{
height: 100%;
width:100%;
}
.logimg img{
width:100%;
height: 100%
}
.loginBtu{
width:90%;
height: 40px;
font-size: 18px
}
.loginContent-right{
float: left;
width: 30%;
height:100%;
border: 1px solid GhostWhite
}
.logo{
width:70%;
height:180px;
margin-top:160px;
/* border: 1px solid black; */
margin-left:15%
}
.logo img {
width:50%;
height:50% ;
/* margin-left: 30px */
}
.logo h3{
font-size: 30px;
color: black;
margin-top: 0px
}
.login_content{
height: 300px;
width: 70%;
/* border:1px solid black; */
margin-left:15%;
margin-top: 0px
}
.copy{
width: 100%;
height:100px;
margin-top: 80px;
margin-left: 7%
}
.copy p{
font-size: 17px;
color: #999
}
.wordStyle{
width: 90%;
line-height: 50px
/* margin-left: 30px */
}
</style>
<template>
<div class="updatePsd">
<div class="updatePsd-content">
<div class="updatePsdContent-left">
<div class="logimg">
<img src="https://o7oe0d6qz.qnssl.com/image/logo99.png">
</div>
</div>
<div class="updatePsdContent-right">
<div class="logo">
<img src="https://o7oe0d6qz.qnssl.com/image/log.jpg">
<h3>首次登录请修改密码</h3>
</div>
<div class="updatePsd_content">
<Form ref="formInline" :model="formInline" class="formcontent">
<FormItem class="formitemcontent">
<Input type="password" v-model="formInline.password" placeholder="Password" class="wordStyle2" @on-change='verification' size="large">
<Icon type="ios-lock-outline" slot="prepend"></Icon>
</Input>
<span style="color:Grey;margin-left:30px" v-show="fistcontent">4-20位且不得与默认密码相同</span>
</FormItem>
<FormItem style="margin-top:-20px" class="formitemcontent">
<Input type="password" v-model="formInline.passwordTwo" placeholder="Password" class="wordStyle2" @keyup.enter.native='loginT' size="large">
<Icon type="ios-lock-outline" slot="prepend"></Icon>
</Input>
<span style="color:Grey;margin-left:30px;color:red" v-show="twocontent">{{twocontentmessage}}</span>
</FormItem>
</Form>
<Button type="primary" style="height:40px;width:100%;border-radius: 5px;background:rgb(0, 146, 255);color:rgb(255,255,255);font-size:18px;margin-top:10px" @click="loginT">登录</Button>
</div>
<div class="copy">
<p>量化派为你提供全程服务</p>
<p>量化派版权所有</p>
</div>
</div>
</div>
</div>
</template>
<script>
import { updatePsd} from '../../api/login.server.js'
export default {
data () {
return {
formInline: {
passwordTwo: '',
password: ''
},
fistcontent:true,
twocontent:false,
twocontentmessage:'',
channelarr:[],
Massage:'',
ISIDMIN:'',
}
},
methods: {
handleSubmit(name) {
this.$refs[name].validate((valid) => {
if (valid) {
this.$Message.success('Success!');
} else {
this.$Message.error('Fail!');
}
})
},
loginT(){
let params={
userCode:this.$route.params.userCode,
password:this.formInline.password,
confirmPassWord:this.formInline.passwordTwo
}
if(this.formInline.passwordTwo!==this.formInline.password){
this.twocontentmessage='输入密码不一致,请重新输入'
this.twocontent=true
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
if(this.formInline.passwordTwo.length<4||this.formInline.password.length<4){
this.twocontentmessage='请输入4-20位密码'
this.twocontent=true
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
if(this.formInline.password.length>20){
this.twocontentmessage='请输入4-20位密码'
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
if(this.formInline.password.length<4){
this.twocontentmessage='请输入4-20位密码'
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
if(this.formInline.password.length==0){
this.twocontentmessage='密码不能为空'
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
if(this.formInline.passwordTwo.length==0){
this.twocontentmessage='请输入相同的确认密码'
setTimeout(() => {
this.twocontent=false
}, 3000)
return
}
updatePsd(params).then(res=>{
if(res.data.success==true){
this.ISIDMIN=res.data.body
localStorage.setItem('isADMIN',JSON.stringify(this.ISIDMIN))
localStorage.setItem('token',res.data.body.token)
this.$router.replace({name:'allResume'})
}
if(res.data.success==false){
this.Massage=res.data.body.message
this.twocontent=true
this.twocontentmessage=this.Massage
setTimeout(() => {
this.twocontent=false
}, 3000)
}
})
},
verification(){
if(this.formInline.password==123456){
this.twocontentmessage='输入密码与初始密码相同,请重新输入'
setTimeout(() => {
this.twocontent=false
}, 3000)
}
if(this.formInline.password.length==0){
this.fistcontent=true
}
if(this.formInline.password==''){
this.fistcontent=true
}
if(this.formInline.password.length<4){
this.fistcontent=true
}
if(this.formInline.password.length>4){
this.fistcontent=false
}
if(this.formInline.password.length>20){
this.fistcontent=true
}
},
}
}
</script>
<style scoped>
.updatePsd{
width:100%;
height:100%;
}
.updatePsd-content{
width: 100%;
height: 100%;
overflow: hidden;
}
.updatePsdContent-left {
float: left;
width: 70%;
height: 100%
}
.updatePsdContent-right{
float: left;
width: 30%;
height: 858px;
background: #ffffff
}
.logo{
width:70%;
height:180px;
margin-top:160px;
/* border: 1px solid black; */
margin-left:15%
}
.logo img {
width:50%;
height:50% ;
/* margin-left: 30px */
}
.logo h3{
font-size: 30px;
color: black;
margin-top: 0px
}
.updatePsd_content{
height: 200px;
width: 70%;
margin-left:15%
}
.copy{
width: 100%;
height:100px;
margin-top: 160px;
margin-left: 7%;
}
.copy p{
font-size: 17px;
color: #999
}
.wordStyle2{
width: 100%;
}
.formcontent{
height:130px;
}
.formitemcontent{
height:60px;
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div>
<h3 style="color:#2d8cf0;font-size:18px;margin:14px 0 0 15px">二维码管理</h3>
<h5 style="margin:24px 0 0 15px;display:inline-block">前台扫描二维码</h5>
<div class="Qrcode">
<img :src="url" style="width:100%;height:100%">
</div>
<p class="xiazai" @click="downPic">下载</p>
</div>
</template>
<script>
import {getErcode,downloadErcode} from '../../api/stystem.server.js'
import {
sapi
} from '../../config'
export default {
data(){
return {
url:'',
url2:''
}
},
methods:{
//取到二维码
getercode(){
getErcode().then(res=>{
if(res.data.success==true){
this.url=res.data.body
}
})
},
downPic (img) {
window.location.href=`${sapi}/api/qrCode/downQrCode`
}
},
mounted(){
this.getercode()
}
}
</script>
<style>
.Qrcode{
height: 200px;
width: 200px;
border: 1px solid black;
margin: 20px 0 0 15px
}
.xiazai{
height: 30px;
width: 100px;
background:#2d8cf0;
color: white;
line-height: 30px;
text-align: center;
border-radius: 5px ;
position: absolute;
left: 230px;
top:270px
}
</style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
import Cookie from 'js-cookie'
export default{
set: function (name, value) {Cookie.set(name, value)},
get: function (name) {
return Cookie.get(name)
},
remove: function (name) {Cookie.remove(name)}
}
\ No newline at end of file
http.service.js
\ No newline at end of file
import axios from 'axios'
import Promise from './promise.service.js'
import {Notice} from 'iview'
import Vue from 'vue'
import router from '../router/index.js'
import store from '../store'
var instance = axios.create({});
instance.defaults.timeout = 3600000;
instance.defaults.withCredentials = true;
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
instance.defaults.headers['X-Requested-With'] = 'XMLHttpRequest'
instance.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
if (!config.headers['Content-Type']) {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
}
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
instance.interceptors.response.use(function (response) {
// 在发送请求之前做些什么
let errorInfo = {
'900': '您的账号已在其他地方登录,如不是您个人操作,请及时修改密码',
'901': '',
'902': 'cookie已失效,请重新登录'
}
if(response.status >= 200 && response.status < 300){
let code = response.data&&response.data.body&&response.data.body.code || ''
if (code == '900' || code == '901' || code == '902'){
if (!store.state.cookieTips && code != '901') {
store.dispatch('cookieTipsShow', true)
Notice.error({render:(h) => {return h('div', {style: {
paddingRight: '5px',
fontSize: '14px',
lineHeight: '20px',
color: '#17233d'
}}, errorInfo[code])}})
setTimeout(() => {
store.dispatch('cookieTipsHide', false)
}, 2000)
}
// router.replace({name: 'login'})
}
if(response.data.success){
return Promise.resolve(response)
}
else {
return Promise.resolve(response);
}
} else {
// return Promise.resolve(response);
}
return response;
}, error => {
// Notice.error({desc:`${error.response.data.body.message}`})
});
export default instance
// export default axios
import localstorage from './localstorage.service.js'
export default{
init: function (router) {
router.beforeEach((to, form, next) => {
let token = localstorage.get('token')
if (to.meta && !to.meta.allowBack && window.history && window.history.pushState) { //登录页面不能后退
history.pushState(null, null, document.URL)
}
if (to.name =='login' || to.name =='update' || to.name =='sweepCode'|| to.name== 'resumeDetail'){
next()
return
}
if(!token){
window.location.href = `${window.location.origin}/login`
return
}
next()
})
}
}
\ No newline at end of file
This diff is collapsed.
module.exports = require('es6-promise');
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment