Browse Source

登录

master
zhizhi wu 4 years ago
parent
commit
0ab946e3c4
  1. 11
      scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java
  2. 3
      scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJob.java
  3. 27
      scheduler/src/main/java/com/ccsens/scheduler/bean/vo/JobVo.java
  4. 5
      scheduler/src/main/java/com/ccsens/scheduler/service/IJobService.java
  5. 41
      scheduler/src/main/java/com/ccsens/scheduler/service/JobService.java
  6. 2
      scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java
  7. 2
      scheduler/src/main/resources/application.yml
  8. 3
      scheduler/vue-element-admin-master/.env.development
  9. 11
      scheduler/vue-element-admin-master/src/api/role.js
  10. 9
      scheduler/vue-element-admin-master/src/api/task.js
  11. 26
      scheduler/vue-element-admin-master/src/api/user.js
  12. 4
      scheduler/vue-element-admin-master/src/permission.js
  13. 22
      scheduler/vue-element-admin-master/src/router/index.js
  14. 2
      scheduler/vue-element-admin-master/src/settings.js
  15. 1
      scheduler/vue-element-admin-master/src/store/modules/permission.js
  16. 55
      scheduler/vue-element-admin-master/src/store/modules/user.js
  17. 11
      scheduler/vue-element-admin-master/src/utils/request.js
  18. 48
      scheduler/vue-element-admin-master/src/views/login/index.vue
  19. 1
      scheduler/vue-element-admin-master/src/views/permission/role.vue
  20. 120
      scheduler/vue-element-admin-master/src/views/task/index.vue

11
scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java

@ -2,6 +2,7 @@ package com.ccsens.scheduler.api;
import com.ccsens.scheduler.bean.dto.QuartzJob;
import com.ccsens.scheduler.bean.dto.QueryDto;
import com.ccsens.scheduler.bean.vo.JobVo;
import com.ccsens.scheduler.service.IJobService;
import com.ccsens.scheduler.util.CodeEnum;
import com.ccsens.util.JsonResponse;
@ -13,6 +14,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* @description:
@ -32,11 +34,12 @@ public class JobController {
@ApiImplicitParams({
})
@RequestMapping(value="add",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse add(@ApiParam @Validated @RequestBody QueryDto<QuartzJob.Job> dto) {
public JsonResponse<JobVo.SimpleJob> add(@ApiParam @Validated @RequestBody QueryDto<QuartzJob.Job> dto) {
log.info("添加任务:{}", dto);
CodeEnum codeEnum = jobService.add(dto.getParam(), dto.getUserId());
log.info("添加任务结果:{}", codeEnum);
return JsonResponse.newInstance().ok(codeEnum);
QuartzJob.Job job = dto.getParam();
JobVo.SimpleJob result = jobService.add(job, dto.getUserId());
log.info("添加任务结果:{}", result);
return JsonResponse.newInstance().ok(result);
}

3
scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJob.java

@ -27,12 +27,10 @@ public class QuartzJob {
@Data
@ApiModel("任务")
public static class Job{
@NotEmpty
@ApiModelProperty("job名称")
private String jobName;
@ApiModelProperty("job组名")
private String jobGroupName = Constant.Quartz.QZ_JOB_GROUP_NAME;
@NotEmpty
@ApiModelProperty("定时器名称")
private String triggerName;
@ApiModelProperty("定时器组名")
@ -67,6 +65,7 @@ public class QuartzJob {
@ApiModelProperty("job的附加信息")
private JobDataMap jobDataMap = new JobDataMap();
/**
* 校验
* @return

27
scheduler/src/main/java/com/ccsens/scheduler/bean/vo/JobVo.java

@ -0,0 +1,27 @@
package com.ccsens.scheduler.bean.vo;
import com.ccsens.scheduler.util.Constant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description:
* @author: whj
* @time: 2021/8/13 10:49
*/
public class JobVo {
@Data
@ApiModel("添加job后返回")
public static class SimpleJob{
@ApiModelProperty("job名称")
private String jobName;
@ApiModelProperty("job组名")
private String jobGroupName = Constant.Quartz.QZ_JOB_GROUP_NAME;
@ApiModelProperty("定时器名称")
private String triggerName;
@ApiModelProperty("定时器组名")
private String triggerGroupName = Constant.Quartz.QZ_TRIGGER_GROUP_NAME;
}
}

5
scheduler/src/main/java/com/ccsens/scheduler/service/IJobService.java

@ -1,6 +1,7 @@
package com.ccsens.scheduler.service;
import com.ccsens.scheduler.bean.dto.QuartzJob;
import com.ccsens.scheduler.bean.vo.JobVo;
import com.ccsens.scheduler.util.CodeEnum;
/**
@ -12,9 +13,9 @@ public interface IJobService {
* 添加定时任务
* @param job 任务
* @param userId 操作人
* @return 结果
* @return 结果 任务名和触发器名
*/
CodeEnum add(QuartzJob.Job job, Long userId);
JobVo.SimpleJob add(QuartzJob.Job job, Long userId);
/**
* 修改定时任务
* @param job 任务

41
scheduler/src/main/java/com/ccsens/scheduler/service/JobService.java

@ -6,6 +6,8 @@ import cn.hutool.core.util.StrUtil;
import com.ccsens.scheduler.bean.dto.QuartzJob;
import com.ccsens.scheduler.bean.po.Task;
import com.ccsens.scheduler.bean.po.TaskExample;
import com.ccsens.scheduler.bean.vo.JobVo;
import com.ccsens.scheduler.exception.BaseException;
import com.ccsens.scheduler.persist.dao.TaskDao;
import com.ccsens.scheduler.util.CodeEnum;
import com.ccsens.scheduler.util.Constant;
@ -41,13 +43,17 @@ public class JobService implements IJobService {
@Override
public CodeEnum add(QuartzJob.Job job, Long userId) {
public JobVo.SimpleJob add(QuartzJob.Job job, Long userId) {
// 初始化对象
JobVo.SimpleJob result = initName(job);
log.info("job:{}", job);
// 写缓存,防重复
String key = Constant.Quartz.JOB_KEY_PREFIX + job.getJobName() + Constant.Quartz.JOB_KEY_SPLIT + job.getJobGroupName();
boolean writeSuc = redisUtil.setNx(key, "", Constant.Quartz.JOB_KEY_EXPIRE_TIME);
log.info("缓存{}结果:{}", job.getJobName(), writeSuc);
if (!writeSuc) {
return CodeEnum.JOB_EXISTED;
log.info("任务正在处理");
throw new BaseException(CodeEnum.JOB_EXISTED);
}
// 查数据库
// 查询任务
@ -56,14 +62,14 @@ public class JobService implements IJobService {
long count = taskDao.countByExample(example);
log.info("数据库中任务数量:{}", count);
if (count > 0) {
return CodeEnum.JOB_EXISTED;
throw new BaseException(CodeEnum.JOB_EXISTED);
}
// 添加任务
boolean suc = quartzJobUtil.addJob(job);
log.info("添加Quartz任务成功:{}", suc);
if (!suc) {
redisUtil.del(key);
return CodeEnum.JOB_ADD_FAIL;
throw new BaseException(CodeEnum.JOB_ADD_FAIL);
}
Task task = new Task();
BeanUtils.copyProperties(job, task);
@ -71,7 +77,32 @@ public class JobService implements IJobService {
taskDao.insertSelective(task);
log.info("添加任务成功");
redisUtil.del(key);
return CodeEnum.SUCCESS;
return result;
}
/**
* 初始化任务名和触发器名
* @param job 任务
* @return
*/
private JobVo.SimpleJob initName(QuartzJob.Job job) {
// TODO 命名规范待优化(业务系统名)
JobVo.SimpleJob simpleJob = new JobVo.SimpleJob();
long id = snowflake.nextId();
if (StrUtil.isBlank(job.getJobName())) {
job.setJobName(Constant.Quartz.QZ_JOB_NAME_PREFIX + id);
}
if (StrUtil.isBlank(job.getJobGroupName())) {
job.setJobGroupName(Constant.Quartz.QZ_JOB_GROUP_NAME);
}
if (StrUtil.isBlank(job.getTriggerName())) {
job.setTriggerName(Constant.Quartz.QZ_TRIGGER_NAME_PREFIX + id);
}
if (StrUtil.isBlank(job.getTriggerGroupName())) {
job.setTriggerGroupName(Constant.Quartz.QZ_TRIGGER_GROUP_NAME);
}
BeanUtils.copyProperties(job, simpleJob);
return simpleJob;
}
@Override

2
scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java

@ -31,6 +31,8 @@ public class Constant {
public static class Quartz {
public static final String QZ_JOB_GROUP_NAME = "JOB_GROUP_NAME";
public static final String QZ_TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME";
public static final String QZ_JOB_NAME_PREFIX = "job_name_";
public static final String QZ_TRIGGER_NAME_PREFIX = "trigger_name_";
public static final String JOB_KEY_PREFIX = "scheduler:job:";
public static final long JOB_KEY_EXPIRE_TIME = 60;
public static final String JOB_KEY_SPLIT = ":";

2
scheduler/src/main/resources/application.yml

@ -1,4 +1,4 @@
spring:
profiles:
active: dev
active: test
include: common

3
scheduler/vue-element-admin-master/.env.development

@ -2,4 +2,5 @@
ENV = 'development'
# base api
VUE_APP_BASE_API = '/dev-api'
VUE_APP_BASE_API = 'https://test.tall.wiki/gateway'
VUE_APP_MOCK_API = '/dev-api'

11
scheduler/vue-element-admin-master/src/api/role.js

@ -1,22 +1,23 @@
import request from '@/utils/request'
const base = process.env.VUE_APP_MOCK_API
export function getRoutes() {
return request({
url: '/vue-element-admin/routes',
url: `${base}/vue-element-admin/routes`,
method: 'get'
})
}
export function getRoles() {
return request({
url: '/vue-element-admin/roles',
url: `${base}/vue-element-admin/roles`,
method: 'get'
})
}
export function addRole(data) {
return request({
url: '/vue-element-admin/role',
url: `${base}/vue-element-admin/role`,
method: 'post',
data
})
@ -24,7 +25,7 @@ export function addRole(data) {
export function updateRole(id, data) {
return request({
url: `/vue-element-admin/role/${id}`,
url: `${base}/vue-element-admin/role/${id}`,
method: 'put',
data
})
@ -32,7 +33,7 @@ export function updateRole(id, data) {
export function deleteRole(id) {
return request({
url: `/vue-element-admin/role/${id}`,
url: `${base}/vue-element-admin/role/${id}`,
method: 'delete'
})
}

9
scheduler/vue-element-admin-master/src/api/task.js

@ -0,0 +1,9 @@
import request from '@/utils/request'
export function fetchList(query) {
return request({
url: '/vue-element-admin/article/list',
method: 'get',
params: query
})
}

26
scheduler/vue-element-admin-master/src/api/user.js

@ -1,20 +1,26 @@
import request from '@/utils/request'
const tall = `${process.env.VUE_APP_BASE_API}/tall3/v3.0`
export function login(data) {
export function login(formData) {
return request({
url: '/vue-element-admin/user/login',
url: `${tall}/users/signin`,
method: 'post',
data
data: {
'client': 1,
'data': formData,
'scene': 0,
'type': 3
}
})
}
export function getInfo(token) {
return request({
url: '/vue-element-admin/user/info',
method: 'get',
params: { token }
})
}
// export function getInfo(token) {
// return request({
// url: '/vue-element-admin/user/info',
// method: 'get',
// params: { token }
// })
// }
export function logout() {
return request({

4
scheduler/vue-element-admin-master/src/permission.js

@ -27,7 +27,8 @@ router.beforeEach(async(to, from, next) => {
NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
} else {
// determine whether the user has obtained his permission roles through getInfo
const hasRoles = store.getters.roles && store.getters.roles.length > 0
// const hasRoles = store.getters.roles && store.getters.roles.length > 0
const hasRoles = true
if (hasRoles) {
next()
} else {
@ -35,7 +36,6 @@ router.beforeEach(async(to, from, next) => {
// get user info
// note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
const { roles } = await store.dispatch('user/getInfo')
// generate accessible routes map based on roles
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)

22
scheduler/vue-element-admin-master/src/router/index.js

@ -73,13 +73,13 @@ export const constantRoutes = [
{
path: '/',
component: Layout,
redirect: '/dashboard',
redirect: '/task',
children: [
{
path: 'dashboard',
component: () => import('@/views/dashboard/index'),
name: 'Dashboard',
meta: { title: 'Dashboard', icon: 'dashboard', affix: true }
path: 'index',
component: () => import('@/views/task/index'),
name: 'task',
meta: { title: '调度任务', icon: 'el-icon-alarm-clock', noCache: true }
}
]
},
@ -129,6 +129,18 @@ export const constantRoutes = [
* the routes that need to be dynamically loaded based on user roles
*/
export const asyncRoutes = [
{
path: '/task',
component: Layout,
children: [
{
path: 'index',
component: () => import('@/views/task/index'),
name: 'task',
meta: { title: '调度任务', icon: 'el-icon-alarm-clock', noCache: true }
}
]
},
{
path: '/permission',
component: Layout,

2
scheduler/vue-element-admin-master/src/settings.js

@ -1,5 +1,5 @@
module.exports = {
title: 'Vue Element Admin',
title: '调度系统运维界面',
/**
* @type {boolean} true | false

1
scheduler/vue-element-admin-master/src/store/modules/permission.js

@ -54,6 +54,7 @@ const actions = {
accessedRoutes = asyncRoutes || []
} else {
accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
console.info('routes:', accessedRoutes)
}
commit('SET_ROUTES', accessedRoutes)
resolve(accessedRoutes)

55
scheduler/vue-element-admin-master/src/store/modules/user.js

@ -1,4 +1,4 @@
import { login, logout, getInfo } from '@/api/user'
import { login, logout } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router, { resetRouter } from '@/router'
@ -31,12 +31,16 @@ const mutations = {
const actions = {
// user login
login({ commit }, userInfo) {
const { username, password } = userInfo
const { identifier, credential } = userInfo
return new Promise((resolve, reject) => {
login({ username: username.trim(), password: password }).then(response => {
login({ identifier: identifier.trim(), credential: credential }).then(response => {
const { data } = response
commit('SET_TOKEN', data.token)
setToken(data.token)
commit('SET_ROLES', ['admin'])
commit('SET_NAME', data.account)
commit('SET_AVATAR', data.wxInfo ? data.wxInfo.headImgUrl : '')
// commit('SET_INTRODUCTION', introduction)
resolve()
}).catch(error => {
reject(error)
@ -47,28 +51,29 @@ const actions = {
// get user info
getInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token).then(response => {
const { data } = response
if (!data) {
reject('Verification failed, please Login again.')
}
const { roles, name, avatar, introduction } = data
// roles must be a non-empty array
if (!roles || roles.length <= 0) {
reject('getInfo: roles must be a non-null array!')
}
commit('SET_ROLES', roles)
commit('SET_NAME', name)
commit('SET_AVATAR', avatar)
commit('SET_INTRODUCTION', introduction)
resolve(data)
}).catch(error => {
reject(error)
})
resolve()
// getInfo(state.token).then(response => {
// const { data } = response
// if (!data) {
// reject('Verification failed, please Login again.')
// }
// const { roles, name, avatar, introduction } = data
// // roles must be a non-empty array
// if (!roles || roles.length <= 0) {
// reject('getInfo: roles must be a non-null array!')
// }
// commit('SET_ROLES', roles)
// commit('SET_NAME', name)
// commit('SET_AVATAR', avatar)
// commit('SET_INTRODUCTION', introduction)
// resolve(data)
// }).catch(error => {
// reject(error)
// })
})
},

11
scheduler/vue-element-admin-master/src/utils/request.js

@ -5,11 +5,10 @@ import { getToken } from '@/utils/auth'
// create an axios instance
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
baseURL: '', // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000 // request timeout
})
// request interceptor
service.interceptors.request.use(
config => {
@ -19,8 +18,11 @@ service.interceptors.request.use(
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
config.headers['X-Token'] = getToken()
config.headers['Authorization'] = `Bearer ${getToken()}`
console.info('token:{}', `Bearer ${getToken()}`)
console.info('token2:{}', getToken())
}
config.headers['content-type'] = 'application/json;charset=utf-8'
return config
},
error => {
@ -44,9 +46,8 @@ service.interceptors.response.use(
*/
response => {
const res = response.data
// if the custom code is not 20000, it is judged as an error.
if (res.code !== 20000) {
if (res.code !== 200) {
Message({
message: res.message || 'Error',
type: 'error',

48
scheduler/vue-element-admin-master/src/views/login/index.vue

@ -12,7 +12,7 @@
</span>
<el-input
ref="username"
v-model="loginForm.username"
v-model="loginForm.identifier"
placeholder="Username"
name="username"
type="text"
@ -29,7 +29,7 @@
<el-input
:key="passwordType"
ref="password"
v-model="loginForm.password"
v-model="loginForm.credential"
:type="passwordType"
placeholder="Password"
name="password"
@ -46,43 +46,21 @@
</el-tooltip>
<el-button :loading="loading" type="primary" style="width:100%;margin-bottom:30px;" @click.native.prevent="handleLogin">Login</el-button>
<div style="position:relative">
<div class="tips">
<span>Username : admin</span>
<span>Password : any</span>
</div>
<div class="tips">
<span style="margin-right:18px;">Username : editor</span>
<span>Password : any</span>
</div>
<el-button class="thirdparty-button" type="primary" @click="showDialog=true">
Or connect with
</el-button>
</div>
</el-form>
<el-dialog title="Or connect with" :visible.sync="showDialog">
Can not be simulated on local, so please combine you own business simulation! ! !
<br>
<br>
<br>
<social-sign />
</el-dialog>
</div>
</template>
<script>
import { validUsername } from '@/utils/validate'
import SocialSign from './components/SocialSignin'
// import { validUsername } from '@/utils/validate'
// import SocialSign from './components/SocialSignin'
export default {
name: 'Login',
components: { SocialSign },
// components: { SocialSign },
data() {
const validateUsername = (rule, value, callback) => {
if (!validUsername(value)) {
// if (!validUsername(value)) {
if (!value) {
callback(new Error('Please enter the correct user name'))
} else {
callback()
@ -97,12 +75,12 @@ export default {
}
return {
loginForm: {
username: 'admin',
password: '111111'
identifier: 'whj',
credential: '1234567'
},
loginRules: {
username: [{ required: true, trigger: 'blur', validator: validateUsername }],
password: [{ required: true, trigger: 'blur', validator: validatePassword }]
identifier: [{ required: true, trigger: 'blur', validator: validateUsername }],
credential: [{ required: true, trigger: 'blur', validator: validatePassword }]
},
passwordType: 'password',
capsTooltip: false,
@ -161,11 +139,11 @@ export default {
this.$router.push({ path: this.redirect || '/', query: this.otherQuery })
this.loading = false
})
.catch(() => {
.catch((e) => {
console.info(e)
this.loading = false
})
} else {
console.log('error submit!!')
return false
}
})

1
scheduler/vue-element-admin-master/src/views/permission/role.vue

@ -93,6 +93,7 @@ export default {
},
created() {
// Mock: get all routes and roles list from server
debugger
this.getRoutes()
this.getRoles()
},

120
scheduler/vue-element-admin-master/src/views/task/index.vue

@ -0,0 +1,120 @@
<template>
<div class="app-container">
<el-card class="box-card">
<div slot="header">
<a class="link-type link-title" target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/guide/advanced/theme.html">
Theme documentation
</a>
</div>
<div class="box-item">
<span class="field-label">Change Theme : </span>
<el-switch v-model="theme" />
<aside style="margin-top:15px;">
Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.
</aside>
</div>
</el-card>
<div class="block">
<el-button type="primary">
Primary
</el-button>
<el-button type="success">
Success
</el-button>
<el-button type="info">
Info
</el-button>
<el-button type="warning">
Warning
</el-button>
<el-button type="danger">
Danger
</el-button>
</div>
<div class="block">
<el-button type="primary" icon="el-icon-edit" />
<el-button type="primary" icon="el-icon-share" />
<el-button type="primary" icon="el-icon-delete" />
<el-button type="primary" icon="el-icon-search">
Search
</el-button>
<el-button type="primary">
Upload
<i class="el-icon-upload el-icon-right" />
</el-button>
</div>
<div class="block">
<el-tag v-for="tag in tags" :key="tag.type" :type="tag.type" class="tag-item">
{{ tag.name }}
</el-tag>
</div>
<div class="block">
<el-radio-group v-model="radio">
<el-radio :label="3">
Option A
</el-radio>
<el-radio :label="6">
Option B
</el-radio>
<el-radio :label="9">
Option C
</el-radio>
</el-radio-group>
</div>
<div class="block">
<el-slider v-model="slideValue" />
</div>
</div>
</template>
<script>
import { toggleClass } from '@/utils'
import '@/assets/custom-theme/index.css' // the theme changed version element-ui css
export default {
name: 'Theme',
data() {
return {
theme: false,
tags: [
{ name: 'Tag One', type: '' },
{ name: 'Tag Two', type: 'info' },
{ name: 'Tag Three', type: 'success' },
{ name: 'Tag Four', type: 'warning' },
{ name: 'Tag Five', type: 'danger' }
],
slideValue: 50,
radio: 3
}
},
watch: {
theme() {
toggleClass(document.body, 'custom-theme')
}
}
}
</script>
<style scoped>
.field-label{
vertical-align: middle;
}
.box-card {
width: 400px;
max-width: 100%;
margin: 20px auto;
}
.block {
padding: 30px 24px;
}
.tag-item {
margin-right: 15px;
}
</style>
Loading…
Cancel
Save