Commit 7121cc0f by @zhang-bin-1

Initial commit

parents
node_modules
dist
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"name": "zj-manage",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.24.0",
"core-js": "^3.6.4",
"docxtemplater": "^3.31.3",
"echarts": "^4.8.0",
"element-ui": "^2.15.6",
"file-saver": "^2.0.5",
"js-md5": "^0.7.3",
"jszip-utils": "^0.1.0",
"pizzip": "^3.1.1",
"vue": "^2.6.11",
"vue-count-to": "^1.0.13",
"vue-fragment": "^1.5.2",
"vue-router": "^3.2.0",
"vuex": "^3.4.0"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.3.1",
"@vue/cli-plugin-eslint": "~4.3.1",
"@vue/cli-service": "~4.3.1",
"babel-eslint": "^10.1.0",
"eslint": "^6.7.2",
"eslint-plugin-vue": "^6.2.2",
"stylus": "^0.59.0",
"stylus-loader": "^3.0.2",
"vue-template-compiler": "^2.6.11"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"parserOptions": {
"parser": "babel-eslint"
},
"rules": {}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not dead"
]
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="referrer" content="no-referrer" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>镇江管理后台</title>
</head>
<style>
body {
margin: 0;
}
</style>
<body>
<noscript>
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
</body>
<script>
// 关闭浏览器 清空登录信息
var _beforeUnload_time = 0,
_gap_time = 0;
window.onunload = function () {
_gap_time = new Date().getTime() - _beforeUnload_time;
//浏览器关闭
if (_gap_time <= 5) {
window.localStorage.clear();
}
};
window.onbeforeunload = function () {
_beforeUnload_time = new Date().getTime();
};
</script>
</html>
\ No newline at end of file
<template>
<div id="app">
<transition mode="out-in" name="fade-transform">
<router-view />
</transition>
</div>
</template>
<script>
export default {
name: 'App',
}
</script>
<style>
.el-form-item {
margin: 20px 10px 20px 0;
}
::-webkit-scrollbar {
width: 5px;
height: 5px;
}
::-webkit-scrollbar-thumb {
background-color: #a1a3a9;
border-radius: 2px;
}
</style>
import {
api,
formatParams
} from "@/utils/axios";
import {
api1,
formatParams1,
config
} from '@/utils/request'
import axios from 'axios'
/**
* 列表
*/
export function getList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/cold/getList`
}))
}
/**
* 查询详情
*/
export function detail(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/cold/get`
}))
}
/**
* 自主申报列表
*/
export function getSelfList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/cold/getSelfList`
}))
}
/**
* 自主申报详情
*/
export function selfDetail(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/cold/getSelf`
}))
}
/**
* 修改自主申报状态
*/
export function updateSelf(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/updateSelf`
}))
}
/**
* 仓库列表
*/
export function getAddress(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/getAddress`
}))
}
/**
* 操作记录
*/
export function record(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/getRecord`
}))
}
/**
* 修改申报单状态
*/
export function updateState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/updateState`
}))
}
/**
* 打印接口 老
*/
// export function getPrint(params) {
// return api1(Object.assign(formatParams1('POST', params), {
// url: `${config.proxy}cold/getPrinting`
// }))
// }
/**
* 打印接口 新
*/
export function getOutPrinting(params) {
return axios.post(`${config.proxy}cold/getOutPrinting`, params, {
responseType: 'blob'
})
}
/**
* 预约入库
*/
export function storageIn(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/storageIn`
}))
}
/**
* 消杀出库
*/
export function storageOut(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/storageOut`
}))
}
/**
* 入库审核
*/
export function storageVerify(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/storageVerify`
}))
}
/**
* 获取统计申报数量
*/
export function getQuantity(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/getQuantity`
}))
}
/**
* 获取统计消杀和检测
*/
export function getDisinfect(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/getDisinfect`
}))
}
/**
* 查询区域
*/
export function getArea() {
return api1(Object.assign(formatParams1('GET'), {
url: `${config.proxy}cold/getArea?type=2`
}))
}
/**
* 统计出库数据
*/
export function getDelivery(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}cold/getDelivery`
}))
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
/**
* 移动端登录用户列表
*/
export function queryListPreUser(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/appUser/queryListPreUser`
}))
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
/**
* 移动端实名用户列表
*/
export function queryListRealUser(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/appUser/queryListRealUser`
}))
}
\ No newline at end of file
import { api, formatParams } from '@/utils/axios'
import { api1, formatParams1, config } from '@/utils/request'
import axios from 'axios'
/**
* 初审部门列表列表
*/
export function queryListDeedTaxFromInitDepartment(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/deedTax/queryListDeedTaxFromInitDepartment",
})
);
}
/**
* 主审部门列表列表
*/
export function queryListDeedTax(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/deedTax/queryListDeedTax`
}))
}
/**
* 契税补贴查询详情
*/
export function queryDeedTaxDetailInfo(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/deedTax/queryDeedTaxDetailInfo`
}))
}
/**
* 契税补贴查询操作记录
*/
export function queryDeedTaxRecord(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/queryDeedTaxRecord`
}))
}
/**
* 契税补贴初审部门审核
*/
export function updateInitDepartmentState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/updateInitDepartmentState`
}))
}
/**
* 契税补贴主审部门审核
*/
export function updateDeedTaxState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/updateDeedTaxState`
}))
}
/**
* 契税补贴初审部门撤回
*/
export function initDepartmentRevocation(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/initDepartmentRevocation`
}))
}
/**
* 契税补贴主审部门撤回
*/
export function mainRevocation(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/mainRevocation`
}))
}
/**
* 保存申请模板
*/
export function saveFileUrl(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/saveFileUrl`
}))
}
/**
* 修改申请单审核辖市区
*/
export function updateCheckArea(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}deedTax/updateCheckArea`
}))
}
/**
* 导出
*/
export function userExport(params) {
return axios({
method: 'post',
data: params,
url: `${config.proxy}deedTax/userExport`,
responseType: 'blob'
})
}
\ No newline at end of file
import { api1, formatParams1, config } from '@/utils/request'
// import axios from 'axios'
/**
* 获取临时minio
*/
export function getTempUrl(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}file/getTempUrl?file=${params.file}&day=${params.day}`
}))
}
\ No newline at end of file
import { api, formatParams } from "@/utils/axios";
export function login(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/auth/login",
})
);
}
export function listMenus() {
return api(
Object.assign(formatParams("GET"), {
url: "/admin-api/auth/list-menus",
})
);
}
// 修改密码
export function updatePassword(params) {
return api(
Object.assign(formatParams("PUT", params), {
url: `/admin-api/system/user/profile/update-password`
})
);
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
// 获取菜单精简信息
export function listAllSimple() {
return api(
Object.assign(formatParams("GET"), {
url: "/admin-api/system/menu/listAllSimple",
})
);
}
// 创建菜单
export function createMenu(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/system/menu/create",
})
);
}
// 修改菜单
export function updateMenu(params) {
return api(
Object.assign(formatParams("PUT", params), {
url: `/admin-api/system/menu/update?id=${params.id}`
})
);
}
// 删除菜单
export function deleteMenu(params) {
return api(
Object.assign(formatParams("DELETE", params), {
url: `/admin-api/system/menu/delete?id=${params.id}`
})
);
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
import {
api1,
formatParams1,
config
} from '@/utils/request'
/**
* 购房契税补贴住建局审核申请列表
* @param {*} params
* @returns
*/
export function mattersHousingList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/housing/mattersHousingList`
}))
}
/**
* 购房契税补贴其他局审核申请列表
* @param {*} params
* @returns
*/
export function mattersHousingReviewerList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/housing/mattersHousingReviewerList`
}))
}
/**
* 列表
*/
export function mattersParentList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/parent/mattersParentList`
}))
}
/**
* 详情
*/
export function mattersGet(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/parent/mattersGet`
}))
}
/**
* 修改状态
*/
export function mattersUpdateState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersUpdateState`
}))
}
/**
* 查询人才政策指南列表
* @returns <promise>
*/
export function mattersGuideList(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGuideList`
}))
}
/**
* 人才事项部门列表
*/
export function mattersDepartmentList(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersDepartmentList`
}))
}
/**
* 查询人才政策指南详情
* @returns
*/
export function mattersGuideGet(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGuideGet`
}))
}
/**
* 添加人才政策指南
* @returns <promise>
*/
export function mattersGuideAdd(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGuideAdd`
}))
}
/**
* 修改人才政策指南
* @param {*} params
* @returns
*/
export function mattersGuideUpdate(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGuideUpdate`
}))
}
/**
* 删除人才政策指南
* @returns <promise>
*/
export function mattersGuideDelete(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGuideDelete`
}))
}
/**
* 购房契税补贴其他局审核状态修改
* @param {*} params
* @returns
*/
export function mattersHousingReviewerUpdate(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersHousingReviewerUpdate`
}))
}
/**
* 购房契税补贴住建局修改状态
* @param {*} params
* @returns
*/
export function mattersHousingUpdate(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersHousingUpdate`
}))
}
/**
* 记录
*/
export function mattersGetReason(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersGetReason`
}))
}
/**
* 购房契税补贴申请详情
* @param {*} params
* @returns
*/
export function mattersHousingGet(params) {
return api(Object.assign(formatParams('GET', params), {
url: `/admin-api/housing/mattersHousingGet`
}))
}
/**
* 购房契税补贴其他局审核操作记录
* @param {*} params
* @returns
*/
export function mattersHousingReason(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/mattersHousingReason`
}))
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
import {
api1,
formatParams1,
config
} from '@/utils/request'
/**
* 购房契税补贴住建局审核申请列表
* @param {*} params
* @returns
*/
export function mattersHouseList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/house/mattersHouseList`
}))
}
/**
* 购房补贴查询详情
*/
export function mattersHouseGetInfo(params) {
return api(Object.assign(formatParams('GET', params), {
url: `/admin-api/house/mattersHouseGetInfo`
}))
}
/**
* 购房契税补贴四个部门审核申请列表
* @param {*} params
* @returns
*/
export function mattersHouseReviewerList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/house/mattersHouseReviewerList`
}))
}
/**
* 购房补贴4个初审部门通过
*/
export function mattersHouseReviewerPass(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseReviewerPass`
}))
}
/**
* 购房补贴4个初审部门拒绝
*/
export function mattersHouseReviewerReject(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseReviewerReject`
}))
}
/**
* 购房补贴4个初审部门操作记录
*/
export function mattersHouseRevieweReason(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseReviewerReason`
}))
}
/**
* 购房补贴住建局操作记录
*/
export function mattersHouseReason(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseReason`
}))
}
/**
* 购房补贴申请员工列表
*/
export function mattersHouseStaffList(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseStaffList`
}))
}
/**
* 购房补贴住建局拒绝
*/
export function mattersHouseReject(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHouseReject`
}))
}
/**
* 购房补贴住建局通过
*/
export function mattersHousePass(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talentMatters/mattersHousePass`
}))
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
// 获取菜单精简信息
export function rolePage(params) {
return api(
Object.assign(formatParams("GET", params), {
url: `/admin-api/system/role/page`
})
);
}
// 创建角色
export function createRole(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/system/role/create",
})
);
}
// 获取角色已分配菜单列表
export function listRoleMenu(params) {
return api(
Object.assign(formatParams("GET", params), {
url: "/admin-api/system/menu/listRoleMenu",
})
);
}
// 赋予角色菜单
export function assignRoleMenu(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/system/permission/assign-role-menu",
})
);
}
// 删除用户
export function deleteUser(params) {
return api(
Object.assign(formatParams("DELETE", params), {
url: `/admin-api/system/role/delete?id=${params.id}`
})
);
}
\ No newline at end of file
import {
api,
formatParams
} from "@/utils/axios";
import {
api1,
formatParams1,
config
} from '@/utils/request'
/**
* 查询列表
*/
export function getList(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/talent/getList`
}))
}
/**
* 查询详情
*/
export function get(params) {
return api(Object.assign(formatParams('POST', params), {
url: `/admin-api/talent/get`
}))
}
/**
* 查询类型
*/
export function getType(params) {
return api1(Object.assign(formatParams1('GET', params), {
url: `${config.proxy}talent/getType?appId=1234`
}))
}
/**
* 修改状态
*/
export function updateState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/updateState`
}))
}
/**
* 操作记录
*/
export function getRecord(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/getRecord`
}))
}
/**
* 查询责任部门
*/
export function getBranch(params) {
return api1(Object.assign(formatParams1('GET', params), {
url: `${config.proxy}talent/getBranch?appId=1234`
}))
}
/**
* 修改学历状态
*/
export function educationState(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/educationState`
}))
}
/**
* 查看学历
*/
export function educationQuery(params) {
return api1(Object.assign(formatParams1('POST', params), {
url: `${config.proxy}talent/getEducation`
}))
}
\ No newline at end of file
import { api1, formatParams1, config } from '@/utils/request'
import { getToken } from '@/utils/auth'
/**
* 上传图片
*/
export function uploadImg(params) {
let header = {
'Content-Type': 'multipart/form-data'
}
let formData = new FormData();
formData.append('file', params);
return api1(Object.assign(formatParams1('POST', formData, header), {
url: `${config.proxy}file/uploadImg`
}))
}
/**
* 上传课件
*/
export function uploadVideo(params) {
let header = {
'Content-Type': 'multipart/form-data'
}
let formData = new FormData();
formData.append('file', params);
return api1(Object.assign(formatParams1('POST', formData, header), {
url: `${config.proxy}file/examVideo`
}))
}
/**
* 上传文件
*/
export function uploadFile(params) {
console.log('params---',params);
let header = {
'Content-Type': 'multipart/form-data'
}
let formData = new FormData();
formData.append('file', params);
return api1(Object.assign(formatParams1('POST', formData, header), {
url: `${config.proxy}file/examFile`
}))
}
/**
* 上传文件
*/
export function uploadWordFile(params) {
console.log('params---',params);
let header = {
'Content-Type': 'multipart/form-data'
}
let formData = new FormData();
formData.append('file', params);
return api1(Object.assign(formatParams1('POST', formData, header), {
url: `${config.proxy}file/uploadWordFile`
// url: `${config.proxy}file/deedTaxWorldUpload`
}))
}
/**
* 创建题库
*/
export function excelEntrance(params) {
let header = {
'Content-Type': 'multipart/form-data'
}
let formData = new FormData();
formData.append('file', params.file);
formData.append('appId', getToken());
formData.append('name', params.name);
return api1(Object.assign(formatParams1('POST', formData, header), {
url: `${config.proxy}excelFile/excelEntrance`
}))
}
import {
api,
formatParams
} from "@/utils/axios";
// 获取用户列表
export function userPage(params) {
return api(
Object.assign(formatParams("GET", params), {
url: `/admin-api/system/user/page`
})
);
}
// 创建用户
export function createUser(params) {
return api(
Object.assign(formatParams("POST", params), {
url: "/admin-api/system/user/create",
})
);
}
// 修改用户密码
export function updatePassword(params) {
return api(
Object.assign(formatParams("PUT", params), {
url: "/admin-api/system/user/update-password",
})
);
}
// 获取角色列表
export function listAllRole(params) {
return api(
Object.assign(formatParams("GET", params), {
url: "/admin-api/system/role/list-all-simple",
})
);
}
// 赋予用户角色权限
export function updateRole(params) {
return api(
Object.assign(formatParams("PUT", params), {
url: "/admin-api/system/user/update-role",
})
);
}
// 删除用户
export function deleteUser(params) {
return api(
Object.assign(formatParams("DELETE", params), {
url: `/admin-api/system/user/delete?id=${params.id}`
})
);
}
\ No newline at end of file
<template>
<div>
<el-table
:data="tableData"
v-loading="loading"
style="width: 100%"
:header-cell-style="{
'background-color': '#eef1f6',
'font-size': '14px',
color: '#333',
height: '40px'
}"
stripe
show-overflow-tooltip
@selection-change="handleSelectionChange"
>
<!--多选选择-->
<el-table-column v-if="selectionShow" type="selection" align="center" width="50" :selectable="canSelect"></el-table-column>
<!--序号 自定义列序号-->
<el-table-column
v-if="indexShow"
type="index"
align="center"
label="序号"
width="55"
>
<template slot-scope="scope">
<span>{{ (pagination.currentPage - 1) * pagination.pageSize + scope.$index + 1 }}</span>
</template>
</el-table-column>
<template v-for="column in tableColumns">
<slot :name="column.key" v-if="column.type == 'slot'"></slot>
<el-table-column
v-else
:key="column.key"
:prop="column.key"
:label="column.label"
:width="column.width"
align="center"
></el-table-column>
</template>
<slot></slot>
</el-table>
<el-pagination
v-if="showPagination"
class="pagination"
background
@current-change="handleCurrentChange"
:current-page.sync="pagination.currentPage"
:page-size="pagination.pageSize"
layout="total, prev, pager, next, jumper"
:total="pagination.total"
></el-pagination>
</div>
</template>
<script>
export default {
name: "Table",
props: {
loading: {
type: Boolean,
default: false
},
tableData: {
type: Array,
required: true,
default: () => {
return [];
}
},
tableColumns: {
type: Array,
required: true,
default: () => {
return [];
}
},
showPagination: {
type: Boolean,
default: true
},
pagination: {
type: Object,
// required: true,
default: function() {
return {
currentPage: 1,
total: 0,
pageSize: 10
};
}
},
selectionShow: {
// 多选 默认不显示
type: Boolean,
default: false
},
indexShow: {
// 序号 默认不显示
type: Boolean,
default: false
}
},
data() {
return {
// tableHeight: 0
};
},
methods: {
handleCurrentChange() {
this.$emit("Jump");
},
handleSelectionChange(val) {
this.$emit("SelectionChange", val)
},
canSelect(row) {
return !row.diseditable;
}
},
mounted() {
// this.$nextTick(() => {
// this.tableHeight = document.body.clientHeight - 330;
// });
}
};
</script>
<style scoped lang="stylus">
.pagination {
text-align: right;
margin-top: 15px;
}
</style>
const domain = {
// dev: "http://192.168.3.144:8881", // 姚镇接口
// dev: "http://81.69.231.72:8881", // 测试接口
// dev: "https://smart-zj.cn:55901/smartExam/", // 正式接口
dev: "https://exam.smart-zj.cn:9100/smartExam/", // 新正式接口
};
export const baseUrl = domain.dev;
<template>
<div>
<template v-for="menu in this.menuData">
<el-submenu :key="menu.menuName" :index="`${menu.id}`" v-if="menu.children && menu.children.length > 0">
<template slot="title">
<div class="title">
{{ menu.menuName }}
</div>
</template>
<menu-tree :menuData="menu.children" @change="changeRouterName"></menu-tree>
</el-submenu>
<el-menu-item
:key="menu.menuName + ''"
:index="menu.menuUrl"
@click="goPage(menu)"
v-else
>
<div slot="title" class="title">
{{ menu.menuName }}
</div>
</el-menu-item>
</template>
</div>
</template>
<script>
export default {
props: ["menuData"],
name: "MenuTree",
data() {
return {
};
},
created() {},
methods: {
goPage(item) {
localStorage.setItem('menuName',item.menuName),
localStorage.setItem('activeId', item.menuUrl)
this.$emit('change', item.menuUrl)
this.$router.push(item.menuUrl);
},
changeRouterName(val) {
this.$emit('change', val)
}
},
};
</script>
<style>
.el-menu--inline {
background: #f6f6f8;
}
</style>
<style lang="stylus" scoped>
.header-title {
display: block;
width: 120px;
overflow: hidden;
text-overflow: ellipsis;
}
.title {
display: flex;
align-items: center;
// img {
// margin-right: 10px;
// }
}
.el-menu-item {
height: 40px;
min-width: 0px;
}
</style>
<template>
<div>
<div class="home-title">
<!-- <img src="@/assets/logo.png" alt="" /> -->
<span class="title-span">镇江管理后台</span>
</div>
<el-menu :default-active="routerPath" :unique-opened="true" class="el-menu-vertical-demo" text-color="#666">
<MenuTree :menuData="menuList" @change="changeRouterName"></MenuTree>
</el-menu>
</div>
</template>
<script>
// import _ from 'lodash'
import { getMenuList } from "@/utils/auth";
import MenuTree from "./MenuTree.vue";
export default {
name: "Sidebar",
data() {
return {
menuList: [],
routerPath: ''
};
},
components: {
MenuTree,
},
created() {
this.init(JSON.parse(getMenuList()))
this.routerPath = localStorage.getItem('activeId')
},
methods: {
changeRouterName(activeId) {
this.routerPath = activeId
},
init(list) {
let menuList = []
let childrens = []
list.forEach(element => {
if (element.parentId === 0) {
menuList.push(element)
} else {
childrens.push(element)
}
});
childrens.forEach((item) => {
let parent = menuList.find(i => i.id === item.parentId)
if (!parent?.children) return parent.children = [item];
parent.children.push(item)
})
this.menuList = menuList;
}
},
};
</script>
<style>
.el-menu-vertical-demo {
height: calc(100vh - 60px);
overflow: auto;
}
.el-menu-vertical-demo::-webkit-scrollbar {
display: none;
}
</style>
<style lang="stylus" scoped>
.home-title {
height: 55px;
display: flex;
align-items: center;
justify-content: center;
line-height: 50px;
// padding: 0 20px;
font-size: 16px;
font-family: YouSheBiaoTiHei;
color: #fff;
background #4885ff;
img {
display: inline;
width: 25px;
height: 25px;
margin-right: 5px;
}
}
.title-span {
font-weight: bold;
letter-spacing: 2px;
}
.el-menu {
padding: 0 10px;
box-sizing: border-box;
}
.el-menu-item {
height: 40px;
line-height: 40px;
margin: 14px 0;
box-sizing: border-box;
}
.el-menu-item.is-active {
// background-color: pink;
color: #fff;
// background-image: linear-gradient(to right, #ffaa4f, #ff600f);
border-radius: 50px;
font-size: 16px;
/* padding: 0 20px; */
}
.el-submenu__title {
height: 40px;
line-height: 40px;
}
.el-submenu .el-menu-item {
min-width: 0px;
padding-left: 20px !important;
height: 40px;
line-height: 40px;
}
</style>
<template>
<div>
<div class="hander">
<div>
<el-breadcrumb separator="/">
<el-breadcrumb-item>镇江管理后台</el-breadcrumb-item>
<el-breadcrumb-item v-for="(item, index) in $route.meta" :key="index">
{{ item }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="header-right">
<el-avatar :src="squareUrl" :size="32"></el-avatar>
<el-dropdown style="cursor: pointer;" trigger="click" @command="handleCommand">
<span class="el-dropdown-link">
{{ username ? username : '用户' }}<i class="el-icon-caret-bottom el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item command="2">修改密码</el-dropdown-item>
<el-dropdown-item command="1">退出登录</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</div>
<div class="content">
<transition name="fade" mode="out-in">
<router-view></router-view>
</transition>
</div>
<el-dialog title="修改密码" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm">
<el-form-item label="登录名" prop="loginName">
<el-input v-model="ruleForm.loginName" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="旧密码" prop="oldPass">
<el-input v-model="ruleForm.oldPass"></el-input>
</el-form-item>
<el-form-item label="新密码" prop="newPass">
<el-input v-model="ruleForm.newPass"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="submit('ruleForm')">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { updatePassword } from "@/api/login";
export default {
data() {
return {
username: "",
dialogVisible: false,
ruleForm: {
loginName: localStorage.getItem('userName'),
newPass: "",
oldPass: "",
},
rules: {
loginName: [
{ required: true, message: "请输入登录名", trigger: "blur" },
],
newPass: [{ required: true, message: "请输入新密码", trigger: "blur" }],
oldPass: [{ required: true, message: "请输入旧密码", trigger: "blur" }],
},
squareUrl: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01786557e4a6fa0000018c1bf080ca.png%401280w_1l_2o_100sh.png&refer=http%3A%2F%2Fimg.zcool.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665133618&t=fde98110388a533f98b861b95969e91d"
};
},
watch: {
$route: {
immediate: true,
deep: true,
handler(val) {
val.meta[1] = localStorage.getItem('menuName')
},
},
},
methods: {
handleCommand(command) {
if (command == 1) {
this.$confirm("确认退出登录?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
window.localStorage.clear();
this.$router.push("/login");
this.$message({
type: "success",
message: "退出成功!",
});
});
} else {
this.dialogVisible = true;
}
},
// 取消
handleClose() {
this.ruleForm = {
loginName: localStorage.getItem('userName'),
newPass: "",
oldPass: "",
}
this.dialogVisible = false;
},
// 提交
submit(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
console.log(valid)
console.log(this.ruleForm)
updatePassword({ oldPassword: this.ruleForm.oldPass, newPassword: this.ruleForm.newPass }).then((res) => {
console.log(res)
if (res.success) {
this.$message({
type: "success",
message: "修改密码成功,请重新登录!"
})
window.localStorage.clear();
this.$router.push("/login");
} else {
this.$message({
type: "error",
message: res.msg || '修改密码失败,请联系管理员!',
});
}
})
}
});
},
},
created() {
this.username = localStorage.getItem("userName");
},
};
</script>
<style>
.el-breadcrumb__inner,
.el-breadcrumb__separator,
.el-breadcrumb__separator,
.el-dropdown-link,
.el-dropdown-selfdefine,
.el-avatar,
.el-avatar--icon,
.el-avatar--circle {
color: #fff !important;
font-size: 16px;
}
</style>
<style lang="stylus" scoped>
.hander {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 20px;
height: 55px;
border-bottom: 1px solid #ccc;
background #4885ff;
.el-avatar {
width: 35px;
height: 35px;
margin-right: 10px;
}
.header-right {
display: flex;
align-items: center;
.open {
margin-right: 30px;
font-size: 14px;
color: #ff600f;
cursor: pointer;
}
}
}
.content {
padding: 20px;
.fade-enter {
opacity: 0;
}
.fade-enter-active {
transition: opacity 1s;
}
}
</style>
<template>
<div class="layout">
<div class="sidebar">
<Sidebar></Sidebar>
</div>
<div class="subject">
<Subject></Subject>
</div>
</div>
</template>
<script>
import Sidebar from "./components/Sidebar.vue";
import Subject from "./components/Subject";
export default {
components: {
Sidebar,
Subject,
},
};
</script>
<style lang="stylus" scoped>
.layout {
display: flex;
.sidebar {
width: 200px;
background-color: pink;
height: 100vh;
overflow-y: hidden;
// overflow: auto;
background: #ffffff;
box-shadow: 4px 0px 15px 0px rgba(27, 42, 66, 0.1);
// border-radius: 0px 24px 24px 0px;
}
.subject {
width: calc(100vw - 200px);
height: 100vh;
.layoutContent{
width 100%;
height 100%;
}
}
}
</style>
\ No newline at end of file
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import { getToken } from "./utils/auth";
Vue.use(ElementUI)
Vue.config.productionTip = false
const whiteList = ["/login"]; // 不重定向白名单
router.beforeEach((to, from, next) => {
if (getToken()) {
if (to.path == "/login") {
next("/home");
} else {
next();
}
} else {
if (whiteList.indexOf(to.path) !== -1) {
next();
} else {
next("/login");
}
}
});
new Vue({
el: '#app',
router,
render: h => h(App)
})
import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../views/Login'
Vue.use(VueRouter)
const routes = [{
path: '/login',
name: 'login',
component: Login
},
{
path: "*",
name: "layout",
redirect: "/home",
component: () =>
import( /* webpackChunkName: "layout" */ "@/layout/index.vue"),
children: [{
path: "/home",
name: "home",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Home/index.vue"),
meta: ["首页"],
},
// 角色管理
{
path: "/role",
name: "role",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Role/index.vue"),
meta: ["系统管理"],
},
// 用户管理
{
path: "/user",
name: "user",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/User/index.vue"),
meta: ["系统管理"],
},
// 菜单管理
{
path: "/menu",
name: "menu",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Menu/index.vue"),
meta: ["系统管理"],
},
// 80%契税补贴
{
path: "/deedtax",
name: "deedtax",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Deedtax/index.vue"),
meta: ["80%契税补贴"],
}, {
path: "/deedtax-house",
name: "deedtaxHouse",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Deedtax/house.vue"),
meta: ["80%契税补贴"],
},
// 人才政策管理
{
path: "/policy",
name: "policy",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Policy/index.vue"),
meta: ["人才政策管理"],
}, {
path: "/policy-guide",
name: "policyGuide",
component: () =>
import( /* webpackChunkName: "home" */ "@/views/Policy/guide.vue"),
meta: ["人才政策管理"],
},
// 100%契税补贴
{
path: '/policy-house',
name: 'policyHouse',
component: () => import('@/views/Policy/house.vue'),
meta: ["100%契税补贴"],
}, {
path: '/policy-house-main',
name: 'policyHouseMain',
component: () => import('@/views/Policy/housemain.vue'),
meta: ["100%契税补贴"],
}, {
path: '/talent-window',
name: 'talentWindow',
component: () => import('@/views/Policy/talentwindow.vue'),
meta: ["100%契税补贴"],
},
// 购房补贴政策管理
//住建局
{
path: '/purchase',
name: 'purchaseIndex',
component: () => import('@/views/Purchase/index.vue'),
meta: ["购房补贴政策管理"],
},
//四个部门
{
path: '/purchase-details',
name: 'purchaseDetails',
meta: ['购房补贴政策管理'],
component: () => import('@/views/Purchase/details')
},
//人才窗口
{
path: '/purchase-windows',
name: 'purchaseWindows',
meta: ['购房补贴政策管理'],
component: () => import('@/views/Purchase/windows')
},
// 冷链食品申报
{
path: '/coldfood',
name: 'coldFood',
meta: ['冷链食品'],
component: () => import('@/views/Coldfood/index.vue')
},
// 冷链食品自主申报
{
path: '/selfreport',
name: 'selfReport',
meta: ['冷链食品'],
component: () => import('@/views/Coldfood/selfReport')
},
// 冷链食品数据统计
{
path: '/coldfood-statistics',
name: 'coldfoodStatistics',
meta: ['冷链食品'],
component: () => import('@/views/Coldfood/statistics')
},
// 冷链食品商品流向分析
{
path: '/coldfood-flow',
name: 'coldfoodFlow',
meta: ['冷链食品'],
component: () => import('@/views/Coldfood/flowAnalysis')
},
// 人才码
{
path: '/talents',
name: 'talents',
meta: ['人才码申报管理'],
component: () => import('@/views/Talents/index.vue')
},
// 通用管理
// 登录用户管理
{
path: '/loginUser',
name: 'loginUser',
meta: ['通用管理'],
component: () => import('@/views/Currency/loginUser.vue')
},
// 实名用户管理
{
path: '/realUser',
name: 'realUser',
meta: ['通用管理'],
component: () => import('@/views/Currency/realUser.vue')
},
]
},
]
const router = new VueRouter({
mode: 'hash',
base: process.env.BASE_URL,
routes
})
const routerPush = VueRouter.prototype.push;
VueRouter.prototype.push = function push(location) {
return routerPush.call(this, location).catch((error) => error);
};
export default router
\ No newline at end of file
.search-wrapper {
min-height: 108px;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
background: #fff;
box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.05);
border-radius: 5px;
.search_form {
.el-form-item {
margin-bottom: 0;
}
}
}
.table-wrapper {
margin-top: 20px;
padding: 15px;
background: #fff;
border-radius: 5px;
box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.05);
max-height: calc(100vh - 260px);
overflow: auto;
}
.panel-group {
margin-top: 18px;
.el-col-lg-4-8 {
width: 20%;
}
.card-panel-col {
margin-bottom: 32px;
}
.card-panel {
height: 108px;
padding: 0 40px;
display: flex;
align-items: center;
justify-content: space-between;
cursor: pointer;
font-size: 12px;
position: relative;
overflow: hidden;
color: #666;
background: #fff;
box-shadow: 4px 4px 40px rgba(0, 0, 0, 0.05);
border-color: rgba(0, 0, 0, 0.05);
.card-panel-icon {
font-size: 48px;
}
.course-total {
color: #40c9c6;
}
.course-line {
color: #36a3f7;
}
.study-total {
color: #f4516c;
}
.study-check {
color: #34bfa3;
}
.compolte-rate {
color: #FFD700;
}
.card-panel-description {
.card-panel-text {
line-height: 18px;
color: rgba(0, 0, 0, 0.45);
font-size: 16px;
margin-bottom: 12px;
}
.card-panel-num {
font-size: 20px;
}
}
}
}
.lineChart {
width: 100%;
height: 350px;
}
\ No newline at end of file
.el-icon-circle-close {
color #fff
}
\ No newline at end of file
/* fade-transform */
.fade-transform-leave-active,
.fade-transform-enter-active {
transition: all .5s;
}
.fade-transform-enter {
opacity: 0;
transform: translateX(-30px);
}
.fade-transform-leave-to {
opacity: 0;
transform: translateX(30px);
}
/* breadcrumb transition */
.breadcrumb-enter-active,
.breadcrumb-leave-active {
transition: all .5s;
}
.breadcrumb-enter,
.breadcrumb-leave-active {
opacity: 0;
transform: translateX(20px);
}
.breadcrumb-move {
transition: all .5s;
}
.breadcrumb-leave-active {
position: absolute;
}
\ No newline at end of file
/*
* @Descripttion:
* @version:
* @Author: zhouyh
* @Date: 2021-09-24 19:37:58
* @LastEditors: zhouyh
* @LastEditTime: 2021-09-26 10:20:02
*/
const TokenKey = "Authorization";
const MenuList = "MenuList";
export function getToken() {
return localStorage.getItem(TokenKey);
}
export function setToken(value) {
return localStorage.setItem(TokenKey, value);
}
export function getMenuList() {
return localStorage.getItem(MenuList);
}
export function setMenuList(value) {
return localStorage.setItem(MenuList, value);
}
\ No newline at end of file
import axios from "axios";
import { baseUrl } from "@/config";
import { getToken } from "@/utils/auth";
import router from "@/router";
const api = axios.create({
baseURL: `${baseUrl}`,
timeout: 60000,
});
// 请求拦截
api.interceptors.request.use(
(config) => {
return config;
},
(error) => ({ status: 0, msg: error.message })
);
// 请求返回
api.interceptors.response.use(
(response) => {
return Promise.resolve(response).then(checkCode);
},
(error) => {
let msg = "";
if (error.response && error.response.data && error.response.data.message) {
msg = error.response.data.message;
} else {
msg = "系统错误";
}
const returnData = {
success: false,
code: -1,
msg: msg,
};
// token失效返回登陆页面
if (
error.response &&
error.response.data &&
error.response.data.status &&
error.response.data.status == 500
) {
window.localStorage.clear();
router.push("/login");
}
return Promise.resolve(returnData);
}
);
// 后台自定义 code错误处理
const checkCode = (res) => {
if (res) {
if (res.data.code == 200 || res.data.code == 0) {
//code为0成功
const returnData = {
code: 200,
success: true,
data: res.data.data || res,
msg: res.data.message,
};
return returnData;
} else {
//统一处理错误
const returnData = {
success: false,
code: res.data.code,
msg: res.data.msg,
};
return returnData;
}
} else {
const returnData = {
success: false,
code: -1,
msg: "没有返回值",
};
return returnData;
}
};
// 解析参数
const formatParams = (method = "GET", params, type) => {
let contentType = "";
//headers配置token
if (type == "file") {
//文件配置
contentType = "multipart/form-data";
} else if (type == "qs") {
contentType = "application/x-www-form-urlencoded;charset=utf-8";
} else {
//普通接口配置
contentType = "application/json;charset=utf-8";
}
let headers = {
"Content-Type": contentType,
"Authorization": getToken() ? ( 'Bearer ' + getToken()) : "",
};
// appId设置
// 如果接口需要序列化 type == 'qs'
if (type == "qs") {
var tempParams = new URLSearchParams();
Object.keys(params).map((el) => {
tempParams.append(`${el}`, params[el]);
});
params = tempParams;
return {
headers,
method,
data: params,
};
}
switch (method) {
case "POST":
case "DOWNLOAD":
return {
responseType: type,
headers,
method: "POST",
data: params,
};
case "PUT":
return {
responseType: type,
headers,
method,
data: params,
};
case "DELETE":
return {
responseType: type,
headers,
method,
data: params,
};
case "GET":
return {
headers,
method,
params,
};
default:
return {
headers,
method,
params,
};
}
};
export { api, formatParams, baseUrl };
\ No newline at end of file
// 导出文件
export const downFile = function(name, blob) {
let url = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.style.display = 'none';
a.href = url;
a.setAttribute('download', `${name}`);
document.body.appendChild(a);
a.click(); //执行下载
window.URL.revokeObjectURL(a.href); //释放url
document.body.removeChild(a); //释放标签
};
\ No newline at end of file
// import { uploadImg, uploadVideo, uploadFile } from '@/api/upload'
/**
* @param {Function} func
* @param {number} wait
* @param {boolean} immediate
* @return {*}
*/
export function debounce(func, wait, immediate) {
let timeout, args, context, timestamp, result
const later = function () {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function (...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
/**
* 设置浏览器头部标题
*/
export const setTitle = (title) => {
title = title ? `${title}` : '网上考试管理后台'
window.document.title = title
}
/**
* 选项与数字的枚举
*/
export const enumeration = {
1: 'A',
2: 'B',
3: 'C',
4: 'D',
5: 'E',
6: 'F',
7: 'G',
8: 'H',
9: 'I',
10: 'J',
11: 'K',
12: 'L',
13: 'M',
14: 'N',
15: 'O',
16: 'P',
17: 'Q',
18: 'R',
19: 'S',
20: 'T',
21: 'U',
22: 'V',
23: 'W',
24: 'X',
25: 'Y',
26: 'Z'
}
/**
* 上传文件
*/
// export function uploadMixFile(file, type) {
// let fun = new Promise((resolve, reject) => {
// if (type === "image") {
// uploadImg(file).then(
// res => {
// if (res.success) {
// resolve(res.data);
// } else {
// reject(res.msg);
// }
// },
// error => {
// reject(error);
// }
// );
// } else if (type === "video") {
// uploadVideo(file).then(
// res => {
// if (res.success) {
// resolve(res.data);
// } else {
// reject(res.msg);
// }
// },
// error => {
// reject(error);
// }
// );
// } else if (type === 'file') {
// uploadFile(file).then(
// res => {
// if (res.success) {
// resolve(res.data);
// } else {
// reject(res.msg);
// }
// },
// error => {
// reject(error);
// }
// );
// }
// });
// return fun;
// }
export function getQueryString(name) {
console.log('获取到的name---', name);
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i');
const r = window.location.search.substr(1).match(reg);
console.log('r---', r);
if (r != null) {
return r[2];
}
return null;
}
export function fromDate(timestamp) {
const time = new Date(timestamp);
const yy = time.getFullYear().toString(); //年
let MM = time.getMonth() + 1; //月
MM = MM < 10 ? ('0' + MM) : MM;
let dd = time.getDate(); //日
dd = dd < 10 ? ('0' + dd) : dd;
return `${yy}-${MM}-${dd}`
}
export function changeList(list) {
list.map((item) => {
if (item.name) {
item.name = setName(item.name)
}
if (item.contactUser) {
item.contactUser = setName(item.contactUser)
}
if (item.phone) {
item.phone = setTel(item.phone)
}
if (item.contactMobile) {
item.contactMobile = setTel(item.contactMobile)
}
if (item.mobile) {
item.mobile = setTel(item.mobile)
}
if (item.idCard) {
item.idCard = setCertNo(item.idCard)
}
return item
})
return list
}
export function setName(str) {
if (str) {
let str1 = str.substr(0, 1);
let num1 = str.substr(1).length;
let str2 = ''
for (let i = 0; i < num1; i++) {
str2 += ' *'
}
let str3 = str1 + str2;
return str3;
} else {
return '-'
}
}
export function setTel(tel) {
if (tel && tel.length >= 11) {
var pat = /(\d{3})\d*(\d{4})/
let telFinal = tel.replace(pat, '$1****$2');
return telFinal
} else {
return '-';
}
}
export function setCertNo(certNo) {
if (certNo && certNo.length >= 10) {
var certNo1 = certNo.trim();
// let cert1 = certNo.substring(0, certNo.length-4);
// let cert2 = cert1 + "****";
// return cert2;
// let cert1 = certNo.replace(/(\w{6})\w{2}(\w{6})\w{4}/, '$1**$2****');
let cert1 = certNo1.substring(0, 6) + '********' + certNo1.substring(14, certNo1.length);
return cert1;
} else {
return '-';
}
}
\ No newline at end of file
import axios from "axios";
import { Message } from "element-ui";
import { getToken } from "@/utils/auth";
const config = {
// proxy: 'http://192.168.3.144:9089/', // 本地
// proxy: "https://www.smart-zj.cn:55901/exmManage/", // 旧线上地址
proxy: "https://exam.smart-zj.cn:9100/exam/", // 新线上地址
// proxy: "http://81.69.231.72:9089/", // 测试地址
// proxy: "http://36.156.31.171:9100/exam/",
};
//axios基本配置
const api = axios.create({
withCredentials: false,
});
// 请求拦截,配置一些公共的参数
api.interceptors.request.use(
(conf) => {
//请求带token
// conf.headers['Authorization'] = store2('accesstoken')
let appId = /*getToken()*/ "1234";
if (conf.data) conf.data.appId = appId;
return conf;
},
(error) => ({
status: 0,
msg: error.message,
})
);
// 响应拦截
api.interceptors.response.use(
(response) => {
console.log("响应返回--", response);
// console.log(response);
const res = response.data;
if (parseInt(res.code) === 200) {
return Promise.resolve(response).then(checkCode);
} else {
Message.error(res.message || "网络错误");
return Promise.resolve(response).then(checkCode);
}
},
(error) => {
return Promise.resolve(error).then(checkStatus);
}
);
// App应用管理 第二版 appId!=1234
//axios基本配置
const api1 = axios.create({
withCredentials: false,
});
// 请求拦截,配置一些公共的参数
api1.interceptors.request.use(
(conf) => {
//请求带token
// conf.headers['Authorization'] = store2('accesstoken')
let appId = /*getToken()*/ "1234";
if (conf.data) conf.data.appId = appId;
return conf;
},
(error) => ({
status: 0,
msg: error.message,
})
);
// 响应拦截
api1.interceptors.response.use(
(response) => {
console.log("响应返回--", response);
// console.log(response);
const res = response.data;
if (parseInt(res.code) === 200) {
return Promise.resolve(response).then(checkCode);
}
if (parseInt(res.code) === 1002) {
return Promise.resolve(response).then(checkCode);
}
else {
Message.error(res.message || "网络错误");
return Promise.resolve(response).then(checkCode);
}
},
(error) => {
return Promise.resolve(error).then(checkStatus);
}
);
//http状态码错误处理
const checkStatus = () => {
const returnData = {
code: "500",
msg: "服务器存在异常",
};
return returnData;
};
const checkCode = (res) => {
if (res) {
if (parseInt(res.data.code) === 200) {
const returnData = {
success: true,
data: res.data.data,
msg: res.data.message,
};
return returnData;
} else {
//统一处理错误
const returnData = {
success: false,
data: res.data.data,
msg: res.data.message,
};
return returnData;
}
} else {
const returnData = {
success: false,
msg: res.data.message,
};
return returnData;
}
};
// 解析参数
const formatParams = (method = "GET", params, config) => {
//headers配置
const headers = config
? config
: {
"Content-Type": "application/json;charset=utf-8",
};
switch (method) {
case "POST":
return {
headers,
method,
data: params,
};
case "PUT":
return {
headers,
method,
data: params,
};
case "DELETE":
return {
headers,
method,
data: params,
};
case "GET":
return {
headers,
method,
};
default:
return {
headers,
method,
params,
};
}
};
const formatParams1 = (method = "GET", params, config) => {
//headers配置
const headers = config
? config
: {
"Content-Type": "application/json;charset=utf-8",
};
switch (method) {
case "POST":
return {
headers,
method,
data: params,
};
case "PUT":
return {
headers,
method,
data: params,
};
case "DELETE":
return {
headers,
method,
data: params,
};
case "GET":
return {
headers,
method,
};
default:
return {
headers,
method,
params,
};
}
};
const formatUrl = (params) => {
let appId = getToken();
let urlStr = `appId=${appId}`;
for (var k in params) {
let value = params[k] !== undefined ? params[k] : "";
if (value) urlStr += "&" + k + "=" + encodeURIComponent(value);
}
return urlStr;
};
export { api, api1, formatParams, formatParams1, config, formatUrl };
import { debounce } from '@/utils'
export default {
data() {
return {
$_sidebarElm: null,
$_resizeHandler: null
}
},
mounted() {
this.$_resizeHandler = debounce(() => {
if (this.chartOne && this.chartTwo) {
this.chartOne.resize()
this.chartTwo.resize()
}
}, 100)
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
beforeDestroy() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
// to fixed bug when cached by keep-alive
// https://github.com/PanJiaChen/vue-element-admin/issues/2116
activated() {
this.$_initResizeEvent()
this.$_initSidebarResizeEvent()
},
deactivated() {
this.$_destroyResizeEvent()
this.$_destroySidebarResizeEvent()
},
methods: {
// use $_ for mixins properties
// https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
$_initResizeEvent() {
window.addEventListener('resize', this.$_resizeHandler)
},
$_destroyResizeEvent() {
window.removeEventListener('resize', this.$_resizeHandler)
},
$_sidebarResizeHandler(e) {
if (e.propertyName === 'width') {
this.$_resizeHandler()
}
},
$_initSidebarResizeEvent() {
this.$_sidebarElm = document.getElementsByClassName('el-aside')[0]
this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
},
$_destroySidebarResizeEvent() {
this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
}
}
}
<template>
<div class="loginUser">
<div class="search-wrapper">
<el-form :inline="true" :model="searchForm" class="search_form" style="text-align: left">
<el-form-item label="uid">
<el-input v-model="searchForm.uid" placeholder="请输入用户uid" @keyup.enter.native="onSubmit"></el-input>
</el-form-item>
<el-form-item label="电话号码">
<el-input v-model="searchForm.mobile" placeholder="请输入电话号码" @keyup.enter.native="onSubmit">
</el-input>
</el-form-item>
<el-form-item label="企业登录名">
<el-input v-model="searchForm.enterpriseNumber" placeholder="请输入企业登录名"
@keyup.enter.native="onSubmit">
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="table-wrapper">
<table-template :tableData="tableData" :tableColumns="tableColumns" :loading="loading"
:pagination="pagination" @Jump="jumpPage">
<el-table-column fixed="right" label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button type="danger" size="mini" round @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</table-template>
</div>
</div>
</template>
<script>
import TableTemplate from "@/components/Table";
import { changeList } from "@/utils";
import { queryListPreUser } from '@/api/currency/loginUser.js'
export default {
components: { TableTemplate },
data() {
return {
searchForm: {
uid: '',
mobile: '',
enterpriseNumber: ''
},
loading: false,
tableColumns: [
{
key: "uid",
label: "用户id",
}, {
key: "userName",
label: "用户名称",
}, {
key: "mobile",
label: "电话",
}, {
key: "regip",
label: "注册ip",
}, {
key: "enterpriseNumber",
label: "企业登录名",
}, {
key: "enterpriseName",
label: "企业名称",
},
],
tableData: [],
pagination: {
total: 0,
pageSize: 10,
currentPage: 1,
},
}
},
methods: {
init() {
this.loading = true;
let params = {
uid: this.searchForm.uid,
mobile: this.searchForm.mobile,
enterpriseNumber: this.searchForm.enterpriseNumber,
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
}
queryListPreUser(params).then((res) => {
this.loading = false;
console.log(res);
if (res.success) {
this.pagination.total = res.data.total;
if (res.data.total != 0) {
this.tableData = res.data.list;
if (localStorage.getItem('userName') == 'admin') {
this.tableData = changeList(this.tableData)
}
} else {
this.tableData = []
}
}
})
},
jumpPage() {
this.init();
},
onSubmit() {
this.pagination.currentPage = 1;
this.init();
},
del(val) {
console.log(val)
}
},
created() {
this.init()
},
}
</script>
<style lang="stylus" scoped>
@import '~@/stylus/common';
</style>
\ No newline at end of file
<template>
<div class="loginUser">
<div class="search-wrapper">
<el-form :inline="true" :model="searchForm" class="search_form" style="text-align: left">
<el-form-item label="uid">
<el-input v-model="searchForm.uid" placeholder="请输入用户uid" @keyup.enter.native="onSubmit"></el-input>
</el-form-item>
<el-form-item label="用户姓名">
<el-input v-model="searchForm.userName" placeholder="请输入用户姓名" @keyup.enter.native="onSubmit">
</el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
</div>
<div class="table-wrapper">
<table-template :tableData="tableData" :tableColumns="tableColumns" :loading="loading"
:pagination="pagination" @Jump="jumpPage">
<el-table-column fixed="right" label="操作" width="150" align="center">
<template slot-scope="scope">
<el-button type="danger" size="mini" round @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</table-template>
</div>
</div>
</template>
<script>
import TableTemplate from "@/components/Table";
import { setName,setTel } from "@/utils";
import { queryListRealUser } from '@/api/currency/realUser.js'
export default {
components: { TableTemplate },
data() {
return {
searchForm: {
uid: '',
userName: '',
},
loading: false,
tableColumns: [
{
key: "userId",
label: "用户id",
}, {
key: "userName",
label: "用户名称",
}, {
key: "phoneNumber",
label: "电话",
}, {
key: "idCard",
label: "身份证号码",
}, {
key: "createTime",
label: "创建时间",
},
],
tableData: [],
pagination: {
total: 0,
pageSize: 10,
currentPage: 1,
},
}
},
methods: {
init() {
this.loading = true;
let params = {
uid: this.searchForm.uid,
name: this.searchForm.userName,
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
}
queryListRealUser(params).then((res) => {
this.loading = false;
console.log(res);
if (res.success) {
this.pagination.total = res.data.total;
if (res.data.total != 0) {
this.tableData = res.data.list;
if (localStorage.getItem('userName') == 'admin') {
// this.tableData = changeList(this.tableData)
this.tableData.map((item) => {
item.userName = setName(item.userName)
item.phoneNumber = setTel(item.phoneNumber)
})
}
} else {
this.tableData = []
}
}
})
},
jumpPage() {
this.init();
},
onSubmit() {
this.pagination.currentPage = 1;
this.init();
},
del(val) {
console.log(val)
}
},
created() {
this.init()
},
}
</script>
<style lang="stylus" scoped>
@import '~@/stylus/common';
</style>
\ No newline at end of file
<template>
<el-card>
<div class="header">
<div class="inner-header flex">
<h1>欢迎使用镇江管理后台,点击左侧开始吧~</h1>
</div>
<div>
<svg
class="waves"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 24 150 28"
preserveAspectRatio="none"
shape-rendering="auto"
>
<defs>
<path
id="gentle-wave"
d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z"
/>
</defs>
<g class="parallax">
<use
xlink:href="#gentle-wave"
x="48"
y="0"
fill="rgba(255,255,255,0.7)"
/>
<use
xlink:href="#gentle-wave"
x="48"
y="3"
fill="rgba(255,255,255,0.5)"
/>
<use
xlink:href="#gentle-wave"
x="48"
y="5"
fill="rgba(255,255,255,0.3)"
/>
<use xlink:href="#gentle-wave" x="48" y="7" fill="#fff" />
</g>
</svg>
</div>
</div>
</el-card>
</template>
<script>
export default {
data() {
return {
};
},
};
</script>
<style lang="stylus" scoped>
h1
font-family: 'Lato', sans-serif
font-weight: 400
letter-spacing: 2px
font-size: 36px
p
font-family: 'Lato', sans-serif
letter-spacing: 1px
font-size: 14px
color: #333333
.header
position: relative
text-align: center
background: linear-gradient(60deg, $elementColor 0%, $elementColor 100%)
color: white
background #409eff
.inner-header
height: 65vh
width: 100%
margin: 0
padding: 0
.flex
/* Flexbox for containers */
display: flex
justify-content: center
align-items: center
text-align: center
.waves
position: relative
width: 100%
height: 15vh
margin-bottom: -7px /* Fix for safari gap */
min-height: 100px
max-height: 150px
.content
position: relative
height: 20vh
text-align: center
background-color: white
/* Animation */
.parallax > use
animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite
.parallax > use:nth-child(1)
animation-delay: -2s
animation-duration: 7s
.parallax > use:nth-child(2)
animation-delay: -3s
animation-duration: 10s
.parallax > use:nth-child(3)
animation-delay: -4s
animation-duration: 13s
.parallax > use:nth-child(4)
animation-delay: -5s
animation-duration: 20s
@keyframes move-forever
0%
transform: translate3d(-90px, 0, 0)
100%
transform: translate3d(85px, 0, 0)
</style>
\ No newline at end of file
<template>
<div class="s-canvas">
<canvas id="s-canvas" :width="contentWidth" :height="contentHeight"></canvas>
</div>
</template>
<script>
export default {
name: 'SIdentify',
props: {
identifyCode: {
type: String,
default: '1234'
},
fontSizeMin: {
type: Number,
default: 28
},
fontSizeMax: {
type: Number,
default: 40
},
backgroundColorMin: {
type: Number,
default: 180
},
backgroundColorMax: {
type: Number,
default: 240
},
colorMin: {
type: Number,
default: 50
},
colorMax: {
type: Number,
default: 160
},
lineColorMin: {
type: Number,
default: 40
},
lineColorMax: {
type: Number,
default: 180
},
dotColorMin: {
type: Number,
default: 0
},
dotColorMax: {
type: Number,
default: 255
},
contentWidth: {
type: Number,
default: 112
},
contentHeight: {
type: Number,
default: 40
}
},
methods: {
// 生成一个随机数
randomNum (min, max) {
return Math.floor(Math.random() * (max - min) + min)
},
// 生成一个随机的颜色
randomColor (min, max) {
var r = this.randomNum(min, max)
var g = this.randomNum(min, max)
var b = this.randomNum(min, max)
return 'rgb(' + r + ',' + g + ',' + b + ')'
},
drawPic () {
var canvas = document.getElementById('s-canvas')
var ctx = canvas.getContext('2d')
ctx.textBaseline = 'bottom'
// 绘制背景
ctx.fillStyle = this.randomColor(
this.backgroundColorMin,
this.backgroundColorMax
)
ctx.fillRect(0, 0, this.contentWidth, this.contentHeight)
// 绘制文字
for (let i = 0; i < this.identifyCode.length; i++) {
this.drawText(ctx, this.identifyCode[i], i)
}
this.drawLine(ctx)
this.drawDot(ctx)
},
drawText (ctx, txt, i) {
ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax)
ctx.font =
this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei'
var x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1))
var y = this.randomNum(this.fontSizeMax, this.contentHeight - 5)
var deg = this.randomNum(-30, 30)
// 修改坐标原点和旋转角度
ctx.translate(x, y)
ctx.rotate(deg * Math.PI / 270)
ctx.fillText(txt, 0, 0)
// 恢复坐标原点和旋转角度
ctx.rotate(-deg * Math.PI / 270)
ctx.translate(-x, -y)
},
drawLine (ctx) {
// 绘制干扰线
for (let i = 0; i < 2; i++) {
ctx.strokeStyle = this.randomColor(
this.lineColorMin,
this.lineColorMax
)
ctx.beginPath()
ctx.moveTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
)
ctx.lineTo(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight)
)
ctx.stroke()
}
},
drawDot (ctx) {
// 绘制干扰点
for (let i = 0; i < 20; i++) {
ctx.fillStyle = this.randomColor(0, 255)
ctx.beginPath()
ctx.arc(
this.randomNum(0, this.contentWidth),
this.randomNum(0, this.contentHeight),
1,
0,
2 * Math.PI
)
ctx.fill()
}
}
},
watch: {
identifyCode () {
this.drawPic()
}
},
mounted () {
this.drawPic()
}
}
</script>
<style lang="stylus" scoped>
.s-canvas {
height: 38px;
}
.s-canvas canvas{
margin-top: 1px;
margin-left: 8px;
}
</style>
\ No newline at end of file
<template>
<div class="login">
<div class="box">
<span class="title">欢迎来到镇江管理后台</span>
<el-form class="form" :model="form" :rules="rules" ref="form">
<el-form-item label="账号" prop="account">
<el-input size="large" v-model="form.account" style="width: 80%" suffix-icon="el-icon-user">
</el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" size="large" style="width: 80%" show-password></el-input>
</el-form-item>
<el-form-item label="验证码" prop="verification">
<div style="display: flex;">
<el-input v-model="form.verification" size="large" style="width: 54%"></el-input>
<template>
<span @click="refreshCode" style="cursor: pointer;">
<Identify :identifyCode="identifyCode"></Identify>
</span>
</template>
</div>
</el-form-item>
<el-form-item class="fotter">
<el-button type="primary" v-loading.fullscreen.lock="fullscreenLoading" @click="login" size="large">
登录</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script>
import { setToken, setMenuList } from "@/utils/auth.js";
import Identify from "./identify";
// import md5 from "js-md5";
import { login, listMenus } from "@/api/login";
export default {
components: {
Identify,
},
data() {
return {
form: {
account: "",
password: "",
verification: "",
},
rules: {
account: [{ required: true, message: "请输入账号", trigger: "blur" }],
password: [{ required: true, message: "请输入密码", trigger: "blur" }],
verification: [{ required: true, message: "请输入验证码", trigger: "blur" }],
},
// 图片验证码
identifyCode: '',
// 验证码规则
identifyCodes: '3456789ABCDEFGHGKMNPQRSTUVWXY',
fullscreenLoading: false
};
},
mounted() {
window.addEventListener("keydown", this.keyDown);
this.refreshCode()
},
created() {
},
methods: {
// 切换验证码
refreshCode() {
this.identifyCode = ''
this.makeCode(this.identifyCodes, 4)
},
// 生成随机验证码
makeCode(o, l) {
for (let i = 0; i < l; i++) {
this.identifyCode += this.identifyCodes[
Math.floor(Math.random() * (this.identifyCodes.length - 0) + 0)
]
}
},
login() {
//测试账号 username:admin password:Admin@#!2022
this.$refs.form.validate((valid) => {
if (valid) {
if (this.form.verification.toLowerCase() === this.identifyCode.toLowerCase()) {
this.fullscreenLoading = true;
// let password = md5(this.form.password);
let data = {
username: this.form.account,
password: this.form.password,
};
login(data).then((res) => {
this.fullscreenLoading = false;
if (res.success == true) {
setToken(res.data.tokenValue);
localStorage.setItem('userName', res.data.userName),
listMenus({ tokenValue: res.data.tokenValue }).then((res) => {
if (res.success == true) {
console.log(res)
setMenuList(JSON.stringify(res.data));
this.$router.push({ path: "/home" });
this.$message.success("登陆成功~");
} else {
this.$message.error(res.msg || "登陆失败!");
this.refreshCode()
}
})
} else {
this.$message.error(res.msg || "登陆失败!");
this.refreshCode()
}
});
} else {
this.$message.error("请输入正确的验证码!");
this.refreshCode()
}
}
else {
this.refreshCode()
return false;
}
});
},
keyDown(e) {
//如果是回车则执行登录方法
if (e.keyCode == 13) {
this.login();
}
},
},
destroyed() {
window.removeEventListener("keydown", this.keyDown, false);
},
};
</script>
<style lang="stylus" scoped>
.login {
height: 100vh;
background-color: #fff;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
// background: url('~@/assets/login.png');
// background-size: cover;
}
.box {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 580px;
height: 560px;
background-color: #f7faff;
box-shadow: 1px 1px 80px rgb(32, 32, 32);
.title {
margin-bottom: 50px;
letter-spacing: 5px;
color: #2e2e2e;
font-size: 28px;
font-weight: bold;
}
}
.form {
background-color: #fff;
box-shadow: 0px 0px 2px #e0e0e0;
width: 380px;
height: 360px;
padding: 0 30px;
display: flex;
flex-direction: column;
justify-content: center;
.el-form-item__label {
color: #a0a0a0;
font-size: 20px;
margin-bottom: 10px;
}
.fotter {
margin-top: 20px;
width: 100%;
display: flex;
justify-content: center;
}
.el-button {
width: 350px;
}
}
.el-form-item.is-required .el-form-item__label:before {
content: "" !important;
}
</style>
\ No newline at end of file
<template>
<el-card>
<div class="menu">
<el-card class="treeData">
<div>
<el-input placeholder="输入关键字进行过滤" v-model="filterText">
</el-input>
<el-tree
class="tree"
:data="treeList"
:accordion="true"
:expand-on-click-node="false"
:props="defaultProps"
:filter-node-method="filterNode"
@node-click="checkClick"
ref="tree"
>
</el-tree>
</div>
</el-card>
<el-card class="newData">
<el-card class="buttonCard">
<div v-if="firstMenu">
<el-button type="primary" @click="addMenu(0)"
>添加一级菜单</el-button
>
<el-button
type="warning"
icon="el-icon-refresh-right"
@click="refresh"
>刷新</el-button
>
</div>
<div v-else>
<el-button type="danger" @click="delMenu">删除此菜单</el-button>
<el-button type="primary" @click="addMenu(1)">添加子菜单</el-button>
<el-button
type="warning"
icon="el-icon-refresh-right"
@click="refresh"
>刷新</el-button
>
</div>
</el-card>
<div class="contentCard">
<el-form
class="form"
ref="form"
:model="form"
label-width="100px"
:disabled="formDisabled"
>
<el-form-item label="菜单名称:">
<el-input v-model="form.menuName"></el-input>
</el-form-item>
<el-form-item label="菜单路径:">
<el-input v-model="form.menuUrl"></el-input>
</el-form-item>
<el-form-item label="排列序号:">
<el-input v-model="form.sequence"></el-input>
</el-form-item>
</el-form>
<div class="submit">
<el-button type="primary" :disabled="formDisabled" @click="putMenu">提交</el-button>
</div>
</div>
</el-card>
<el-dialog
title="添加菜单"
:visible.sync="dialogVisible"
width="40%"
:before-close="handleClose"
:close-on-click-modal="false"
>
<el-form class="form" ref="form1" :model="form1" label-width="100px">
<el-form-item label="菜单名称:">
<el-input v-model="form1.menuName"></el-input>
</el-form-item>
<el-form-item label="菜单路径:">
<el-input v-model="form1.menuUrl"></el-input>
</el-form-item>
<el-form-item label="排列序号:">
<el-input v-model="form1.sequence"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="handleClose">取 消</el-button>
<el-button type="primary" @click="createMenu">确 定</el-button>
</span>
</el-dialog>
</div>
</el-card>
</template>
<script>
import { listAllSimple, createMenu, deleteMenu, updateMenu } from "@/api/menu";
import { listMenus } from "@/api/login";
import { getToken,setMenuList } from "@/utils/auth.js";
export default {
data() {
return {
filterText: "",
treeList: [],
defaultProps: {
children: "children",
label: "menuName",
},
firstMenu: true,
form: {
parentId: null,
menuName: "",
menuUrl: "",
sequence: "",
},
form1: {
parentId: null,
menuName: "",
menuUrl: "",
sequence: "",
},
dialogVisible: false,
formDisabled: true,
};
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
methods: {
filterNode(value, data) {
if (!value) return true;
return data.menuName.indexOf(value) !== -1;
},
init() {
listAllSimple().then((res) => {
if (res.code == 200) {
this.initTree(res.data);
}
});
},
initTree(list) {
let map = {};
this.treeList = [];
list.forEach((item) => {
item.children = [];
map[item.id] = item;
});
list.forEach((item) => {
const obj = map[item.parentId];
if (obj) {
obj.children.push(item);
} else {
this.treeList.push(item);
}
});
},
addMenu(type) {
if (type == 0) {
this.form1.parentId = 0;
}
this.dialogVisible = true;
},
handleClose() {
this.dialogVisible = false;
this.form1 = {};
},
checkClick(obj) {
this.form = obj;
this.formDisabled = false;
this.firstMenu = false;
this.form1.parentId = obj.id;
},
refresh() {
this.firstMenu = true;
this.formDisabled = true;
this.form = {};
this.form1 = {};
},
createMenu() {
if (!this.form1.menuName && !this.form1.menuUrl && !this.form1.sequence ) {
this.$message({
type: "warning",
message: '请填写完整表单',
});
return
}
let params = {
parentId: this.form1.parentId,
menuName: this.form1.menuName,
menuUrl: this.form1.menuUrl,
sequence: this.form1.sequence,
};
createMenu(params).then((res) => {
if (res.code == 200) {
this.$message({
type: "success",
message: "创建成功!",
});
this.dialogVisible = false;
this.refresh();
this.init();
}
});
},
putMenu() {
console.log(this.form)
updateMenu(this.form).then((res) => {
if (res.code == 200) {
this.$message({
type: "success",
message: "修改成功!",
});
this.dialogVisible = false;
this.refresh();
this.init();
}
})
},
delMenu() {
this.$confirm("此操作将永久删除该菜单, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteMenu({ id: this.form1.parentId }).then((res) => {
if (res.success == true) {
listMenus({ tokenValue: getToken() }).then((res) => {
if (res.success == true) {
setMenuList(JSON.stringify(res.data));
location.reload();
}
})
// this.$message({
// type: "success",
// message: "删除成功!",
// });
// this.refresh();
// this.init();
} else {
this.$message({
type: "warning",
message: res.msg || '删除失败,请联系管理员',
});
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
},
},
created() {
this.init();
},
};
</script>
<style lang="stylus" scoped>
.menu {
width: 100%;
height: calc(100vh - 150px);
display: flex;
align-items: flex-start;
justify-content: space-between;
.treeData {
width: 20%;
height: 100%;
overflow: auto;
.tree {
margin-top: 10px;
}
}
.newData {
width: 78%;
height: 100%;
overflow: auto;
.buttonCard {
display: flex;
justify-content: flex-end;
}
.contentCard {
width: 100%;
margin-top: 10px;
display: flex;
flex-direction: column;
justify-content: center;
.submit {
width: 100%;
display: flex;
justify-content: center;
}
}
}
}
</style>
\ No newline at end of file
<template>
<el-card class="user">
<el-card class="search">
<el-form
:inline="true"
:model="searchForm"
class="search_form"
style="text-align: left"
>
<el-form-item label="角色名称">
<el-input
v-model="searchForm.roleName"
placeholder="请输入角色名称"
@keyup.enter.native="onSubmit"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addUser">添加角色</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="table">
<table-template
:indexShow="true"
:tableData="tableData"
:tableColumns="tableColumns"
:loading="loading"
:pagination="pagination"
@Jump="jumpPage"
>
<el-table-column fixed="right" label="操作" width="300" align="center">
<template slot-scope="scope">
<el-button type="primary" size="mini" round @click="edit(scope.row)">分配权限</el-button>
<el-button type="danger" size="mini" round @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</table-template>
</el-card>
<el-dialog
title="添加角色"
:visible.sync="addVisible"
width="40%"
:before-close="addClose"
:close-on-click-modal="false"
>
<el-form class="form" ref="form" :rules="rules" :model="form" label-width="100px">
<el-form-item label="角色名称:" prop="name">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="角色描述:" prop="remark">
<el-input v-model="form.remark"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addClose">取 消</el-button>
<el-button type="primary" @click="createRole">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="分配权限"
:visible.sync="editVisible"
width="40%"
:before-close="editClose"
:close-on-click-modal="false"
>
<el-tree
class="tree"
:data="treeList"
show-checkbox
node-key="id"
:default-expand-all="true"
:default-checked-keys="idList"
:props="defaultProps"
ref="tree"
>
</el-tree>
<span slot="footer" class="dialog-footer">
<el-button @click="editClose">取 消</el-button>
<el-button type="primary" @click="editUser">确 定</el-button>
</span>
</el-dialog>
</el-card>
</template>
<script>
import TableTemplate from "@/components/Table";
import { rolePage,createRole,listRoleMenu,assignRoleMenu,deleteUser } from "@/api/role";
import { listMenus } from "@/api/login";
import { getToken,setMenuList } from "@/utils/auth.js";
export default {
components: { TableTemplate },
data() {
return {
searchForm: {
roleName: "",
},
loading: false,
pagination: {
total: 0,
pageSize: 10,
currentPage: 1,
},
tableData: [],
tableColumns: [
{
key: "roleName",
label: "角色名称",
},
{
key: "description",
label: "角色描述",
},
{
key: "createTime",
label: "创建时间",
},
],
addVisible: false,
form: {
name: '',
remark: '',
},
rules: {
name: [{ required: true, message: '请输入角色名称', trigger: 'change' }],
remark: [{ required: true, message: '请输入角色描述', trigger: 'change' }]
},
editVisible: false,
treeList: [],
defaultProps: {
children: "children",
label: "menuName",
},
idList: [],
roleId: ''
};
},
methods: {
init() {
this.loading = true;
let params = {
roleName: this.searchForm.roleName,
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
};
rolePage(params).then((res) => {
this.loading = false;
if (res.success) {
this.pagination.total = res.data.total;
this.tableData = res.data.list;
}
});
},
jumpPage() {
this.init();
},
onSubmit() {
this.pagination.currentPage = 1;
this.init();
},
addUser() {
this.addVisible = true
},
addClose() {
this.addVisible = false;
this.form = {};
},
createRole() {
this.$refs.form.validate((valid) => {
if (valid) {
let params = {
roleName: this.form.name,
description: this.form.remark
}
createRole(params).then((res) => {
if (res.success) {
this.$message({
type: "success",
message: "创建成功!",
});
this.addClose();
this.onSubmit();
} else {
this.$message({
type: "error",
message: res.msg ||"创建失败!",
});
}
})
}
})
},
edit(row) {
this.roleId = row.id
listRoleMenu({roleId: this.roleId}).then((res) => {
this.idList = []
res.data.map((item) => {
// 选中菜单回显
if (item.status == 1 && item.parentId != 0) {
return this.idList.push(item.id)
}
})
console.log(this.idList)
this.initTree(res.data);
this.editVisible = true;
})
},
// 平铺数据--->树状结构
initTree(list) {
let map = {};
this.treeList = [];
list.forEach((item) => {
item.children = [];
map[item.id] = item;
});
list.forEach((item) => {
const obj = map[item.parentId];
if (obj) {
obj.children.push(item);
} else {
this.treeList.push(item);
}
});
},
editClose() {
this.editVisible = false;
},
editUser() {
let menuIds = []
this.$refs.tree.getCheckedNodes().map((item) => {
if (item.parentId != 0) {
menuIds.push(item.parentId)
menuIds.push(item.id)
}else {
menuIds.push(item.id)
}
})
assignRoleMenu({menuIds: menuIds,roleId: this.roleId}).then((res) => {
if (res.success) {
listMenus({ tokenValue: getToken() }).then((res) => {
if (res.success == true) {
setMenuList(JSON.stringify(res.data));
location.reload();
}
})
}
})
},
del(row) {
this.$confirm("此操作将永久删除该角色, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteUser({ id: row.id }).then((res) => {
if (res.success == true) {
this.$message({
type: "success",
message: "删除成功!",
});
this.init();
} else {
this.$message({
type: "warning",
message: res.msg || '删除失败,请联系管理员',
});
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
}
},
created() {
this.init();
},
};
</script>
<style lang="stylus" scoped>
.user {
width: 100%;
height: calc(100vh - 100px);
.search {
}
.table {
margin-top: 15px;
max-height: calc(100vh - 260px);
overflow: auto;
}
}
</style>
\ No newline at end of file
<template>
<el-card class="user">
<el-card class="search">
<el-form :inline="true" :model="searchForm" class="search_form" style="text-align: left">
<el-form-item label="用户名称">
<el-input v-model="searchForm.username" placeholder="请输入用户名称" @keyup.enter.native="onSubmit"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addUser">添加用户</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="table">
<table-template :indexShow="true" :tableData="tableData" :tableColumns="tableColumns" :loading="loading"
:pagination="pagination" @Jump="jumpPage">
<el-table-column fixed="right" label="操作" width="300" align="center">
<template slot-scope="scope">
<el-button type="primary" size="mini" round @click="changePassWord(scope.row)">修改密码</el-button>
<el-button type="warning" size="mini" round @click="edit(scope.row)">分配权限</el-button>
<el-button type="danger" size="mini" round @click="del(scope.row)">删除</el-button>
</template>
</el-table-column>
</table-template>
</el-card>
<el-dialog title="添加用户" :visible.sync="addVisible" width="40%" :before-close="addClose"
:close-on-click-modal="false">
<el-form class="form" ref="form" :rules="rules" :model="form" label-width="100px">
<el-form-item label="用户名:" prop="username">
<el-input v-model="form.username"></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password"></el-input>
</el-form-item>
<el-form-item label="邮箱:" prop="email">
<el-input v-model="form.email"></el-input>
</el-form-item>
<el-form-item label="手机号:" prop="telephone">
<el-input v-model="form.telephone"></el-input>
</el-form-item>
<el-form-item label="用户描述:" prop="content">
<el-input v-model="form.content"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="addClose">取 消</el-button>
<el-button type="primary" @click="createUser">确 定</el-button>
</span>
</el-dialog>
<el-dialog title="分配权限" :visible.sync="editVisible" width="40%" :before-close="editClose"
:close-on-click-modal="false">
<el-form class="form" label-width="100px">
<el-form-item label="用户名称:">
<el-input v-model="username" readonly></el-input>
</el-form-item>
<el-form-item label="角色分配:">
<el-select v-model="roleId" filterable placeholder="请选择角色">
<el-option v-for="item in roleList" :key="item.id" :label="item.roleName" :value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editClose">取 消</el-button>
<el-button type="primary" @click="editUser">确 定</el-button>
</span>
</el-dialog>
</el-card>
</template>
<script>
import TableTemplate from "@/components/Table";
import { userPage, createUser, updatePassword, listAllRole, updateRole, deleteUser } from "@/api/user";
export default {
components: { TableTemplate },
data() {
return {
searchForm: {
username: "",
},
loading: false,
pagination: {
total: 0,
pageSize: 10,
currentPage: 1,
},
tableData: [],
tableColumns: [
{
key: "username",
label: "用户名称",
width: 180
},
{
key: "email",
label: "邮箱",
},
{
key: "telephone",
label: "电话",
width: 180
},
{
key: "content",
label: "用户描述",
},
{
key: "createTime",
label: "创建时间",
width: 200
},
],
addVisible: false,
form: {
username: '',
password: '',
email: '',
telephone: '',
content: '',
},
rules: {
username: [{ required: true, message: '请输入用户名', trigger: 'change' }],
password: [{ required: true, message: '请输入用户名', trigger: 'change' }],
email: [{ required: false, message: '请输入邮箱', trigger: 'change' }],
telephone: [{ required: true, message: '请输入手机号', trigger: 'change' }],
content: [{ required: true, message: '请输入用户描述', trigger: 'change' }]
},
editVisible: false,
username: '',
roleList: [],
roleId: '',
id: '',
};
},
methods: {
init() {
this.loading = true;
let params = {
username: this.searchForm.username,
pageNum: this.pagination.currentPage,
pageSize: this.pagination.pageSize,
};
userPage(params).then((res) => {
this.loading = false;
if (res.success) {
console.log(res)
this.pagination.total = res.data.total;
this.tableData = res.data.list;
}
});
},
jumpPage() {
this.init();
},
onSubmit() {
this.pagination.currentPage = 1;
this.init();
},
addUser() {
this.addVisible = true
},
addClose() {
this.addVisible = false;
this.form = {};
},
createUser() {
this.$refs.form.validate((valid) => {
if (valid) {
createUser(this.form).then((res) => {
if (res.success) {
this.$message({
type: "success",
message: "创建成功!",
});
this.addClose();
this.onSubmit();
} else {
this.$message({
type: "error",
message: res.msg ||"创建失败!",
});
}
})
}
})
},
changePassWord(row) {
this.$prompt(`确定修改该用户密码吗?`, `用户名:${row.username}`, {
confirmButtonText: "确定",
cancelButtonText: "取消",
inputPlaceholder: "请输入新密码",
inputType: "text",
}).then(({ value }) => {
if (!value) {
this.$message.error("未输入新密码");
return;
}
updatePassword({ id: row.id, password: value }).then((res) => {
if (res.success) {
this.$message.success("修改成功");
this.init()
} else {
this.$message.error(res.msg || "修改失败");
}
})
}).catch(() => {
this.$message("取消修改");
});
},
edit(row) {
console.log(row)
listAllRole().then((res) => {
console.log(res)
if (res.success) {
this.id = row.id
this.username = row.username
this.roleId = row.role
this.roleList = res.data
this.editVisible = true;
}
})
},
editClose() {
this.editVisible = false;
},
editUser() {
if (this.roleId) {
updateRole({ id: this.id, roleId: this.roleId }).then((res) => {
console.log(res)
if (res.success) {
this.$message.success("分配权限成功");
this.editVisible = false;
this.init()
}
})
} else {
this.$message({
type: "warning",
message: '请选择角色',
});
}
},
del(row) {
this.$confirm("此操作将永久删除该用户, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
deleteUser({ id: row.id }).then((res) => {
if (res.success == true) {
this.$message({
type: "success",
message: "删除成功!",
});
this.init();
} else {
this.$message({
type: "warning",
message: res.msg || '删除失败,请联系管理员',
});
}
});
})
.catch(() => {
this.$message({
type: "info",
message: "已取消删除",
});
});
}
},
created() {
this.init();
},
};
</script>
<style lang="stylus" scoped>
.user {
width: 100%;
height: calc(100vh - 100px);
.search {
}
.table {
margin-top: 15px;
max-height: calc(100vh - 260px);
overflow: auto;
}
}
</style>
\ No newline at end of file
const env = process.env.NODE_ENV === 'production'
const publicPath = env ? '/manage-h5/' : '/';
// const publicPath = env ? '/smartExam-h5/' : '/';
module.exports = {
publicPath,
productionSourceMap: !env,
devServer: {
open: true,
hot: true,
disableHostCheck: true,
proxy: {
'/baiduapi': {
target: 'https://apis.map.qq.com/',
pathRewrite: {
'^/baiduapi': ''
}
},
// 所属社区 网格信息
'/appointment': {
target: 'https://appointment.smart-zj.cn/api/appointment/',
changOrigin: true,
pathRewrite: {
'^/appointment': ''
}
},
// 楼栋 房间信息
'/comApplet': {
// target: 'http://192.168.3.110:10013/comApplet/', //测试地址
target: 'https://www.smart-zj.cn:55901/comApplet/',
changOrigin: true,
pathRewrite: {
'^/comApplet': ''
}
},
}
},
configureWebpack: {
externals: {
BMapGL: "BMapGL",
AMap: 'AMap',
wx: 'wx',
AlipayJSBridge: 'AlipayJSBridge',
qq: 'qq'
},
},
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
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