parent
86d919887c
commit
fa465a2b62
@ -0,0 +1 @@
|
||||
node_modules
|
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
'@vue/cli-plugin-babel/preset'
|
||||
]
|
||||
}
|
||||
|
@ -0,0 +1,19 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "es5",
|
||||
"module": "esnext",
|
||||
"baseUrl": "./",
|
||||
"moduleResolution": "node",
|
||||
"paths": {
|
||||
"@/*": [
|
||||
"src/*"
|
||||
]
|
||||
},
|
||||
"lib": [
|
||||
"esnext",
|
||||
"dom",
|
||||
"dom.iterable",
|
||||
"scripthost"
|
||||
]
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "supermarket-manager",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vue-cli-service serve",
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vue-cli-service build"
|
||||
},
|
||||
"dependencies": {
|
||||
"axios.js": "1.6.3",
|
||||
"core-js": "^3.8.3",
|
||||
"jquery": "^3.6.4",
|
||||
"js-cookie": "^3.0.1",
|
||||
"qs": "^6.11.1",
|
||||
"vue": "^2.6.14",
|
||||
"vue-router": "^3.5.1",
|
||||
"vue-vibe": "8.2.6",
|
||||
"vuex": "^3.6.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@vue/cli-plugin-babel": "~5.0.0",
|
||||
"@vue/cli-plugin-router": "~5.0.0",
|
||||
"@vue/cli-plugin-vuex": "~5.0.0",
|
||||
"@vue/cli-service": "~5.0.0",
|
||||
"element-ui": "^2.15.13",
|
||||
"sass": "^1.32.7",
|
||||
"sass-loader": "^12.0.0",
|
||||
"vue-template-compiler": "^2.6.14",
|
||||
"webpack": "^5.76.2"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
"last 2 versions",
|
||||
"not dead"
|
||||
],
|
||||
"description": "## Project setup ``` npm install ```",
|
||||
"main": "babel.config.js",
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
After Width: | Height: | Size: 8.6 KiB |
@ -0,0 +1,23 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Author:
|
||||
* @Date: 09-07 20:58:35
|
||||
-->
|
||||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<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"> -->
|
||||
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
|
||||
<title><%= htmlWebpackPlugin.options.title %></title>
|
||||
</head>
|
||||
<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>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,22 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Author:
|
||||
* @Date: 09-07 20:58:35
|
||||
-->
|
||||
<template>
|
||||
<div id="app">
|
||||
<router-view/>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import '@/assets/font/font.css'
|
||||
export default {
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
body,html {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,37 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/goods_management/goods'
|
||||
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
/*上/下架业务*/
|
||||
export function upOrdown(data) {
|
||||
return ajaxPost(apiPrefix + "/upOrdown", data)
|
||||
}
|
||||
//修改
|
||||
export function update(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
/*查询商品信息*/
|
||||
export function queryGoodsById(data) {
|
||||
return ajaxGet(apiPrefix + "/queryGoodsById", data)
|
||||
}
|
||||
|
||||
|
||||
export function selected_goodsAll() {
|
||||
return ajaxGet(apiPrefix + "/selected_goodsAll", {})
|
||||
}
|
||||
|
||||
export function selected_storeAll() {
|
||||
return ajaxGet(apiPrefix + "/selected_storeAll", {})
|
||||
}
|
||||
|
||||
export function returnGoods(data) {
|
||||
return ajaxPost(apiPrefix + "/returnGoods", data)
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/goods_management/goods_category'
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
/*修改*/
|
||||
export function update(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
/*停用*/
|
||||
export function deactivate(sid) {
|
||||
return ajaxPost(apiPrefix + "/deactivate", {cid:sid})
|
||||
}
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
|
||||
export function getNormalCategoryAll(){
|
||||
return ajaxGet(apiPrefix+"/normalCategoryAll")
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/goods_management/goods_store'
|
||||
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
|
||||
export function queryGoodsStoreById(data) {
|
||||
return ajaxGet(apiPrefix + "/queryGoodsStoreById", data)
|
||||
}
|
||||
|
||||
export function updateInventory(data) {
|
||||
return ajaxPost(apiPrefix + "/updateInventory", data)
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/goods_management/point_products'
|
||||
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
|
||||
export function del(data) {
|
||||
return ajaxGet(apiPrefix + "/del", data)
|
||||
}
|
||||
|
||||
export function queryOptionGoods() {
|
||||
return ajaxGet(apiPrefix + "/queryOptionGoods", {})
|
||||
}
|
||||
|
||||
export function savePointGoods(data) {
|
||||
return ajaxPost(apiPrefix + "/savePointGoods", data)
|
||||
}
|
||||
|
||||
|
||||
export function queryPointGoodsById(data) {
|
||||
return ajaxGet(apiPrefix + "/queryPointGoodsById", data)
|
||||
}
|
||||
|
||||
export function updatePointGoods(data) {
|
||||
return ajaxPost(apiPrefix + "/updatePointGoods", data)
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/goods_management/statistic_sale'
|
||||
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
|
||||
const apiPrefix_in = '/inventory_management/detail_store_goods_in'
|
||||
const apiPrefix_out = '/inventory_management/detail_store_goods_out'
|
||||
/**入库模块**/
|
||||
/*入库保存*/
|
||||
export function saveIn(data) {
|
||||
return ajaxPost(apiPrefix_in + "/save", data)
|
||||
}
|
||||
/*入库列表显示*/
|
||||
export function queryPageByQoIn(data) {
|
||||
return ajaxPost(apiPrefix_in + "/queryPageByQo", data)
|
||||
}
|
||||
/*删除入库记录*/
|
||||
export function delIn(data) {
|
||||
return ajaxPost(apiPrefix_in + "/delIn", data)
|
||||
}
|
||||
/*删除出库记录*/
|
||||
export function delOut(data) {
|
||||
return ajaxPost(apiPrefix_out + "/delOut", data)
|
||||
}
|
||||
|
||||
export function queryOptionsSuppliers() {
|
||||
return ajaxGet(apiPrefix_in + "/queryOptionsSuppliers", {})
|
||||
}
|
||||
|
||||
/**出库模块**/
|
||||
/*出库列表显示*/
|
||||
export function queryPageByQoOut(data) {
|
||||
return ajaxPost(apiPrefix_out + "/queryPageByQoOut", data)
|
||||
}
|
||||
/*初始化选择框*/
|
||||
export function initOutOptions() {
|
||||
return ajaxGet(apiPrefix_out + "/initOutOptions",{})
|
||||
}
|
||||
/*出库选择商品导致仓库改变*/
|
||||
export function changeOutGoods(data) {
|
||||
return ajaxGet(apiPrefix_out + "/changeOutGoods",data)
|
||||
}
|
||||
/*出库选择仓库导致商品改变*/
|
||||
export function changeOutStore(data) {
|
||||
return ajaxGet(apiPrefix_out + "/changeOutStore",data)
|
||||
}
|
||||
|
||||
|
||||
export function queryOutGoods(data) {
|
||||
return ajaxPost(apiPrefix_out + "/queryOutGoods", data)
|
||||
}
|
||||
|
||||
|
||||
export function saveOut(data) {
|
||||
return ajaxPost(apiPrefix_out + "/save", data)
|
||||
}
|
@ -0,0 +1,23 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
|
||||
const apiPrefix = '/inventory_management/detail_store_goods/notice'
|
||||
|
||||
export function queryPageNoticeIn(data) {
|
||||
return ajaxPost(apiPrefix+ "/queryPageNoticeIn", data)
|
||||
}
|
||||
export function queryPageNoticeOut_shelves(data) {
|
||||
return ajaxPost(apiPrefix+ "/queryPageNoticeOut_shelves", data)
|
||||
}
|
||||
|
||||
export function saveOut_shelves(data) {
|
||||
return ajaxPost(apiPrefix+ "/saveOut_shelves", data)
|
||||
}
|
||||
|
||||
export function queryPageNoticeOut_untreated(data) {
|
||||
return ajaxPost(apiPrefix+ "/queryPageNoticeOut_untreated", data)
|
||||
}
|
||||
|
||||
export function resolveOutUntreatedForm(data) {
|
||||
return ajaxPost(apiPrefix+ "/resolveOutUntreatedForm", data)
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/inventory_management/store/storage_situation'
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
|
||||
export function queryStoreGoodsByStoreId(data) {
|
||||
return ajaxPost(apiPrefix + "/queryStoreGoodsByStoreId", data)
|
||||
}
|
@ -0,0 +1,21 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const storeApiPrefix = '/inventory_management/store'
|
||||
|
||||
//获取仓库信息
|
||||
export function storeList(data) {
|
||||
return ajaxPost(storeApiPrefix + "/list", data)
|
||||
}
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(storeApiPrefix + "/save", data)
|
||||
}
|
||||
/*修改*/
|
||||
export function update(data) {
|
||||
return ajaxPost(storeApiPrefix + "/update", data)
|
||||
}
|
||||
/*停用*/
|
||||
export function deactivate(sid) {
|
||||
return ajaxPost(storeApiPrefix + "/deactivate", {sid:sid})
|
||||
}
|
||||
|
@ -0,0 +1,23 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/inventory_management/supplier'
|
||||
|
||||
//获取供货商信息
|
||||
export function queryPageSupplier(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
export function saveSupplier(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
|
||||
export function updateSupplier(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
|
||||
export function queryByCn(data) {
|
||||
return ajaxGet(apiPrefix + "/queryByCn", data)
|
||||
}
|
||||
|
||||
export function delSupplier(data) {
|
||||
return ajaxPost(apiPrefix + "/deactivate", data)
|
||||
}
|
@ -0,0 +1 @@
|
||||
|
@ -0,0 +1,28 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/member_management/member'
|
||||
|
||||
/*列表显示*/
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQo", data)
|
||||
}
|
||||
/*删除操作*/
|
||||
export function delMember(data) {
|
||||
return ajaxPost(apiPrefix + "/delMember", data)
|
||||
}
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
|
||||
//修改
|
||||
export function update(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
/*查询会员信息*/
|
||||
export function queryMemberById(data) {
|
||||
return ajaxGet(apiPrefix + "/queryMemberById", data)
|
||||
}
|
||||
export function queryMemberByPhone(data) {
|
||||
return ajaxGet(apiPrefix + "/queryMemberByPhone", data)
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
import {ajaxGet} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/personal'
|
||||
|
||||
export function queryInformation() {
|
||||
return ajaxGet(apiPrefix + "/information", {})
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/personnel_management/dept'
|
||||
|
||||
//获取仓库信息
|
||||
export function listByQo(data) {
|
||||
return ajaxGet(apiPrefix + "/list", data)
|
||||
}
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
/*修改*/
|
||||
export function update(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
/*停用*/
|
||||
export function deactivate(id) {
|
||||
return ajaxPost(apiPrefix + "/deactivate", {id:id})
|
||||
}
|
@ -0,0 +1,32 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/personnel_management/employee'
|
||||
|
||||
//获取仓库信息
|
||||
export function pageByQo(data) {
|
||||
return ajaxPost(apiPrefix + "/list", data)
|
||||
}
|
||||
/*保存*/
|
||||
export function save(data) {
|
||||
return ajaxPost(apiPrefix + "/save", data)
|
||||
}
|
||||
/*修改*/
|
||||
export function update(data) {
|
||||
return ajaxPost(apiPrefix + "/update", data)
|
||||
}
|
||||
/*离职*/
|
||||
export function deactivate(id) {
|
||||
return ajaxPost(apiPrefix + "/deactivate", {id:id})
|
||||
}
|
||||
/*详情*/
|
||||
export function detail(id) {
|
||||
return ajaxGet(apiPrefix + "/detail", {uid:id})
|
||||
}
|
||||
/*修改按钮*/
|
||||
export function editBtnClick(id) {
|
||||
return ajaxGet(apiPrefix + "/editbtn", {uid:id})
|
||||
}
|
||||
/*重置密码*/
|
||||
export function resetPwd(data){
|
||||
return ajaxPost(apiPrefix+"/resetPwd",data)
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
import {ajaxGet, ajaxJson, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/sale_management/exchange_point_products_records'
|
||||
|
||||
export function queryPointProductBymemberId(data) {
|
||||
return ajaxGet(apiPrefix + "/queryPointProductBymemberId", data)
|
||||
}
|
||||
|
||||
export function queryMemberByGoodsId(data) {
|
||||
return ajaxGet(apiPrefix + "/queryMemberByGoodsId", data)
|
||||
}
|
||||
export function queryPointProductByGoodsId(data) {
|
||||
return ajaxGet(apiPrefix + "/queryPointProductByGoodsId", data)
|
||||
}
|
||||
|
||||
export function saveExchangePointProductRecords(data) {
|
||||
return ajaxPost(apiPrefix + "/saveExchangePointProductRecords", data)
|
||||
}
|
||||
|
||||
|
||||
export function queryOptionsMemberPhone() {
|
||||
return ajaxGet(apiPrefix + "/queryOptionsMemberPhone", {})
|
||||
}
|
||||
|
||||
export function queryPageByQoExchangePointProducts(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQoExchangePointProducts", data)
|
||||
}
|
||||
|
||||
|
||||
export function delExchangePointProducts(data) {
|
||||
return ajaxGet(apiPrefix + "/delExchangePointProducts", data)
|
||||
}
|
||||
|
||||
|
||||
export function queryOptionsPointProducts() {
|
||||
return ajaxGet(apiPrefix + "/queryOptionsPointProducts", {})
|
||||
}
|
||||
export function queryOptionsMember() {
|
||||
return ajaxGet(apiPrefix + "/queryOptionsMember", {})
|
||||
}
|
||||
|
@ -0,0 +1,23 @@
|
||||
import {ajaxGet, ajaxJson, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const apiPrefix = '/sale_management/sale_record'
|
||||
/*得到订单号*/
|
||||
export function getCn() {
|
||||
return ajaxGet(apiPrefix + "/getCn", {})
|
||||
}
|
||||
|
||||
export function getOptionSaleRecordsGoods() {
|
||||
return ajaxGet(apiPrefix + "/getOptionSaleRecordsGoods", {})
|
||||
}
|
||||
|
||||
export function saveSaleRecords(data) {
|
||||
return ajaxJson(apiPrefix + "/saveSaleRecords", data)
|
||||
}
|
||||
|
||||
export function queryPageByQoSaleRecords(data) {
|
||||
return ajaxPost(apiPrefix + "/queryPageByQoSaleRecords", data)
|
||||
}
|
||||
|
||||
export function delSaleRecords(data) {
|
||||
return ajaxGet(apiPrefix + "/delSaleRecords", data)
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
import {ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const menuApiPrefix = '/system/menu'
|
||||
|
||||
//条件分页获取菜单的信息
|
||||
export function queryPageByQo(data) {
|
||||
return ajaxPost(menuApiPrefix + "/queryPageByQo", data)
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
import {ajaxGet, ajaxPost} from "@/assets/js/common";
|
||||
|
||||
const roleApiPrefix = '/system/role'
|
||||
|
||||
//获取角色全部信息
|
||||
export function roleList(data) {
|
||||
return ajaxPost(roleApiPrefix + "/list", data)
|
||||
}
|
||||
|
||||
//停用角色
|
||||
export function forbiddenRole(id) {
|
||||
return ajaxPost(roleApiPrefix + "/forbiddenRole", {rid: id})
|
||||
}
|
||||
|
||||
//修改角色信息
|
||||
export function edit_role(data) {
|
||||
return ajaxPost(roleApiPrefix + "/edit_role", data)
|
||||
}
|
||||
|
||||
//创建角色
|
||||
export function save_role(data) {
|
||||
return ajaxPost(roleApiPrefix + "/save", data)
|
||||
}
|
||||
|
||||
/*授权按钮*/
|
||||
export function checkPermissons(rid) {
|
||||
return ajaxGet(roleApiPrefix + "/checkPermissons", {rid: rid})
|
||||
}
|
||||
|
||||
/*保存角色-权限关系*/
|
||||
export function saveRolePermissons(data) {
|
||||
return ajaxPost(roleApiPrefix + "/saveRolePermissons", data)
|
||||
}
|
||||
export function getAllRole(){
|
||||
return ajaxGet(roleApiPrefix +"/all",{})
|
||||
}
|
||||
/*保存角色和员工的关系*/
|
||||
export function saveRoleEmp(data) {
|
||||
return ajaxPost(roleApiPrefix + "/saveRoleEmp", data)
|
||||
}
|
||||
|
||||
export function queryRoleIdsByEid(eid) {
|
||||
return ajaxGet(roleApiPrefix+"/queryRoleIdsByEid",{eid:eid})
|
||||
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
|
||||
body{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
background-color: #E9EEF3;
|
||||
}
|
||||
#app{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.el-header {
|
||||
background-color: #6495ED;
|
||||
color: #333;
|
||||
border-bottom: 1px black solid;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
.el-aside {
|
||||
background-color: #6495ED;
|
||||
}
|
||||
|
||||
.el-main {
|
||||
background-color: #E9EEF3;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
}
|
@ -0,0 +1,123 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 4215199 */
|
||||
src: url('font.woff2?t=1693416579183') format('woff2'),
|
||||
url('font.woff?t=1693416579183') format('woff'),
|
||||
url('font.ttf?t=1693416579183') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-r-bottom:before {
|
||||
content: "\e621";
|
||||
}
|
||||
|
||||
.icon-r-left:before {
|
||||
content: "\e622";
|
||||
}
|
||||
|
||||
.icon-r-top:before {
|
||||
content: "\e623";
|
||||
}
|
||||
|
||||
.icon-r-no:before {
|
||||
content: "\e61b";
|
||||
}
|
||||
|
||||
.icon-r-refresh:before {
|
||||
content: "\e61c";
|
||||
}
|
||||
|
||||
.icon-r-yes:before {
|
||||
content: "\e61d";
|
||||
}
|
||||
|
||||
.icon-r-building:before {
|
||||
content: "\e61e";
|
||||
}
|
||||
|
||||
.icon-r-team:before {
|
||||
content: "\e61f";
|
||||
}
|
||||
|
||||
.icon-r-right:before {
|
||||
content: "\e620";
|
||||
}
|
||||
|
||||
.icon-r-find:before {
|
||||
content: "\e610";
|
||||
}
|
||||
|
||||
.icon-r-add:before {
|
||||
content: "\e611";
|
||||
}
|
||||
|
||||
.icon-r-edit:before {
|
||||
content: "\e612";
|
||||
}
|
||||
|
||||
.icon-r-user2:before {
|
||||
content: "\e613";
|
||||
}
|
||||
|
||||
.icon-r-delete:before {
|
||||
content: "\e614";
|
||||
}
|
||||
|
||||
.icon-r-lock:before {
|
||||
content: "\e615";
|
||||
}
|
||||
|
||||
.icon-r-paper:before {
|
||||
content: "\e616";
|
||||
}
|
||||
|
||||
.icon-r-setting:before {
|
||||
content: "\e617";
|
||||
}
|
||||
|
||||
.icon-r-list:before {
|
||||
content: "\e618";
|
||||
}
|
||||
|
||||
.icon-r-home:before {
|
||||
content: "\e619";
|
||||
}
|
||||
|
||||
.icon-r-shield:before {
|
||||
content: "\e61a";
|
||||
}
|
||||
|
||||
.icon-r-user3:before {
|
||||
content: "\e60f";
|
||||
}
|
||||
|
||||
.icon-r-mark1:before {
|
||||
content: "\e609";
|
||||
}
|
||||
|
||||
.icon-r-user1:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icon-r-love:before {
|
||||
content: "\e60b";
|
||||
}
|
||||
|
||||
.icon-r-mark2:before {
|
||||
content: "\e60c";
|
||||
}
|
||||
|
||||
.icon-r-mark3:before {
|
||||
content: "\e60d";
|
||||
}
|
||||
|
||||
.icon-r-mark4:before {
|
||||
content: "\e60e";
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,198 @@
|
||||
{
|
||||
"id": "4215199",
|
||||
"name": "rbicon",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "37171292",
|
||||
"name": "下",
|
||||
"font_class": "r-bottom",
|
||||
"unicode": "e621",
|
||||
"unicode_decimal": 58913
|
||||
},
|
||||
{
|
||||
"icon_id": "37171293",
|
||||
"name": "左",
|
||||
"font_class": "r-left",
|
||||
"unicode": "e622",
|
||||
"unicode_decimal": 58914
|
||||
},
|
||||
{
|
||||
"icon_id": "37171289",
|
||||
"name": "上",
|
||||
"font_class": "r-top",
|
||||
"unicode": "e623",
|
||||
"unicode_decimal": 58915
|
||||
},
|
||||
{
|
||||
"icon_id": "37009521",
|
||||
"name": "拒绝",
|
||||
"font_class": "r-no",
|
||||
"unicode": "e61b",
|
||||
"unicode_decimal": 58907
|
||||
},
|
||||
{
|
||||
"icon_id": "37009520",
|
||||
"name": "刷新",
|
||||
"font_class": "r-refresh",
|
||||
"unicode": "e61c",
|
||||
"unicode_decimal": 58908
|
||||
},
|
||||
{
|
||||
"icon_id": "37009518",
|
||||
"name": "同意",
|
||||
"font_class": "r-yes",
|
||||
"unicode": "e61d",
|
||||
"unicode_decimal": 58909
|
||||
},
|
||||
{
|
||||
"icon_id": "37009517",
|
||||
"name": "建筑",
|
||||
"font_class": "r-building",
|
||||
"unicode": "e61e",
|
||||
"unicode_decimal": 58910
|
||||
},
|
||||
{
|
||||
"icon_id": "37009519",
|
||||
"name": "团队",
|
||||
"font_class": "r-team",
|
||||
"unicode": "e61f",
|
||||
"unicode_decimal": 58911
|
||||
},
|
||||
{
|
||||
"icon_id": "37009516",
|
||||
"name": "右",
|
||||
"font_class": "r-right",
|
||||
"unicode": "e620",
|
||||
"unicode_decimal": 58912
|
||||
},
|
||||
{
|
||||
"icon_id": "36984024",
|
||||
"name": "查找",
|
||||
"font_class": "r-find",
|
||||
"unicode": "e610",
|
||||
"unicode_decimal": 58896
|
||||
},
|
||||
{
|
||||
"icon_id": "36984020",
|
||||
"name": "新增",
|
||||
"font_class": "r-add",
|
||||
"unicode": "e611",
|
||||
"unicode_decimal": 58897
|
||||
},
|
||||
{
|
||||
"icon_id": "36984023",
|
||||
"name": "修改",
|
||||
"font_class": "r-edit",
|
||||
"unicode": "e612",
|
||||
"unicode_decimal": 58898
|
||||
},
|
||||
{
|
||||
"icon_id": "36984022",
|
||||
"name": "用户2",
|
||||
"font_class": "r-user2",
|
||||
"unicode": "e613",
|
||||
"unicode_decimal": 58899
|
||||
},
|
||||
{
|
||||
"icon_id": "36984021",
|
||||
"name": "删除",
|
||||
"font_class": "r-delete",
|
||||
"unicode": "e614",
|
||||
"unicode_decimal": 58900
|
||||
},
|
||||
{
|
||||
"icon_id": "36984014",
|
||||
"name": "锁",
|
||||
"font_class": "r-lock",
|
||||
"unicode": "e615",
|
||||
"unicode_decimal": 58901
|
||||
},
|
||||
{
|
||||
"icon_id": "36984016",
|
||||
"name": "草纸",
|
||||
"font_class": "r-paper",
|
||||
"unicode": "e616",
|
||||
"unicode_decimal": 58902
|
||||
},
|
||||
{
|
||||
"icon_id": "36984015",
|
||||
"name": "齿轮",
|
||||
"font_class": "r-setting",
|
||||
"unicode": "e617",
|
||||
"unicode_decimal": 58903
|
||||
},
|
||||
{
|
||||
"icon_id": "36984013",
|
||||
"name": "列表",
|
||||
"font_class": "r-list",
|
||||
"unicode": "e618",
|
||||
"unicode_decimal": 58904
|
||||
},
|
||||
{
|
||||
"icon_id": "36984012",
|
||||
"name": "房子",
|
||||
"font_class": "r-home",
|
||||
"unicode": "e619",
|
||||
"unicode_decimal": 58905
|
||||
},
|
||||
{
|
||||
"icon_id": "36984011",
|
||||
"name": "盾牌",
|
||||
"font_class": "r-shield",
|
||||
"unicode": "e61a",
|
||||
"unicode_decimal": 58906
|
||||
},
|
||||
{
|
||||
"icon_id": "36984025",
|
||||
"name": "用户3",
|
||||
"font_class": "r-user3",
|
||||
"unicode": "e60f",
|
||||
"unicode_decimal": 58895
|
||||
},
|
||||
{
|
||||
"icon_id": "36983993",
|
||||
"name": "印章",
|
||||
"font_class": "r-mark1",
|
||||
"unicode": "e609",
|
||||
"unicode_decimal": 58889
|
||||
},
|
||||
{
|
||||
"icon_id": "36983994",
|
||||
"name": "用户1",
|
||||
"font_class": "r-user1",
|
||||
"unicode": "e60a",
|
||||
"unicode_decimal": 58890
|
||||
},
|
||||
{
|
||||
"icon_id": "36983995",
|
||||
"name": "爱心",
|
||||
"font_class": "r-love",
|
||||
"unicode": "e60b",
|
||||
"unicode_decimal": 58891
|
||||
},
|
||||
{
|
||||
"icon_id": "36983996",
|
||||
"name": "水滴",
|
||||
"font_class": "r-mark2",
|
||||
"unicode": "e60c",
|
||||
"unicode_decimal": 58892
|
||||
},
|
||||
{
|
||||
"icon_id": "36983997",
|
||||
"name": "波纹",
|
||||
"font_class": "r-mark3",
|
||||
"unicode": "e60d",
|
||||
"unicode_decimal": 58893
|
||||
},
|
||||
{
|
||||
"icon_id": "36983998",
|
||||
"name": "阳光",
|
||||
"font_class": "r-mark4",
|
||||
"unicode": "e60e",
|
||||
"unicode_decimal": 58894
|
||||
}
|
||||
]
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 708 KiB |
After Width: | Height: | Size: 632 KiB |
After Width: | Height: | Size: 459 KiB |
@ -0,0 +1,26 @@
|
||||
import Cookies from 'js-cookie'
|
||||
import router from '../../router/index';
|
||||
const TokenKey = 'token'
|
||||
|
||||
export function getToken() {
|
||||
return Cookies.get(TokenKey)
|
||||
}
|
||||
|
||||
export function setToken(token) {
|
||||
return Cookies.set(TokenKey, token)
|
||||
}
|
||||
|
||||
export function removeToken() {
|
||||
return Cookies.remove(TokenKey)
|
||||
}
|
||||
export function loginEmp() {
|
||||
let str = Cookies.get("employee")
|
||||
if(str == undefined) {
|
||||
router.push('/')
|
||||
return null
|
||||
}
|
||||
return JSON.parse(str)
|
||||
}
|
||||
export function clearCookie(name) {
|
||||
Cookies.remove(name)
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* @Description:
|
||||
* @Author:
|
||||
* @Date: 04-07 20:58:35
|
||||
*/
|
||||
import { getToken } from "@/assets/js/auth";
|
||||
import axios from "axios.js";
|
||||
import { Message } from "element-ui";
|
||||
import Cookies from "js-cookie";
|
||||
import qs from 'qs';
|
||||
|
||||
const prefix_url = "http://localhost:9291"
|
||||
|
||||
/*刷新Cooke的存活时间*/
|
||||
function refreshCookies() {
|
||||
var token=getToken()
|
||||
if (token){
|
||||
//刷新cookie
|
||||
axios({
|
||||
url:prefix_url+"/checkedToken",
|
||||
method:"GET",
|
||||
params:{token:token}
|
||||
}).then(res=>{
|
||||
res=res.data
|
||||
|
||||
if (res.code==200){
|
||||
Cookies.set("token", res.data.token, {expires: 1/48})
|
||||
Cookies.set("employee", JSON.stringify(res.data.employee), {expires: 1/48})
|
||||
}
|
||||
|
||||
}).catch((e)=>{
|
||||
console.log(e)
|
||||
})
|
||||
}
|
||||
return token;
|
||||
|
||||
}
|
||||
|
||||
/*post请求*/
|
||||
export function ajaxPost(url, param) {
|
||||
return axios({
|
||||
url: prefix_url + url,
|
||||
method: "POST",
|
||||
headers:{
|
||||
'token': refreshCookies() //设置token 其中K名要和后端协调好
|
||||
},
|
||||
data: qs.stringify(param)
|
||||
}).catch((e) => {
|
||||
|
||||
console.log(e);
|
||||
if (
|
||||
e.response == undefined ||
|
||||
e.response.data == undefined
|
||||
) {
|
||||
popup(e, "error")
|
||||
} else {
|
||||
popup(e.response.data, "error")
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
/*json请求*/
|
||||
export function ajaxJson(url, param) {
|
||||
return axios({
|
||||
url: prefix_url + url,
|
||||
method: "POST",
|
||||
headers:{
|
||||
'Content-Type':'application/json',
|
||||
'token': refreshCookies() //设置token 其中K名要和后端协调好
|
||||
},
|
||||
data: param
|
||||
}).catch((e) => {
|
||||
console.log(e);
|
||||
if (
|
||||
e.response == undefined ||
|
||||
e.response.data == undefined
|
||||
) {
|
||||
popup(e, "error")
|
||||
} else {
|
||||
popup(e.response.data, "error")
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
/*GET请求*/
|
||||
export function ajaxGet(url, param) {
|
||||
return axios({
|
||||
url: prefix_url + url,
|
||||
method: "GET",
|
||||
headers: {
|
||||
'token': refreshCookies() //设置token 其中K名要和后端协调好
|
||||
},
|
||||
params:param
|
||||
}).catch((e) => {
|
||||
console.log(e);
|
||||
if (
|
||||
e.response == undefined ||
|
||||
e.response.data == undefined
|
||||
) {
|
||||
popup(e, "error")
|
||||
} else {
|
||||
popup(e.response.data, "error")
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
/*给用户弹出相应的提示*/
|
||||
export function popup(msg, type) {
|
||||
switch (type) {
|
||||
case "warning":
|
||||
Message.warning(msg);
|
||||
break;
|
||||
case "error":
|
||||
Message.error({message: msg, duration: 5000, showClose: true});
|
||||
break;
|
||||
case "info":
|
||||
Message.info(msg);
|
||||
break;
|
||||
default:
|
||||
Message.success(msg);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
require("vue-vibe")
|
@ -0,0 +1,24 @@
|
||||
import Vue from 'vue'
|
||||
import App from './App.vue'
|
||||
import router from './router'
|
||||
import store from './store'
|
||||
//ElementUI相关
|
||||
import ElementUI from 'element-ui'
|
||||
//ElementUI相关
|
||||
import 'element-ui/lib/theme-chalk/index.css'
|
||||
import '@/assets/css/globel.css'
|
||||
import qs from 'qs';
|
||||
import axios from 'axios.js'
|
||||
Vue.prototype.qs = qs;
|
||||
Vue.prototype.$axios = axios
|
||||
|
||||
//ElementUI相关
|
||||
Vue.use(ElementUI)
|
||||
|
||||
Vue.config.productionTip = false
|
||||
|
||||
new Vue({
|
||||
router,
|
||||
store,
|
||||
render: h => h(App)
|
||||
}).$mount('#app')
|
@ -0,0 +1,151 @@
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
|
||||
Vue.use(VueRouter)
|
||||
const routes = [
|
||||
{
|
||||
path: '/',
|
||||
name: 'login',
|
||||
component: () => import('../views/Login.vue'),
|
||||
},
|
||||
{
|
||||
path: '/index',
|
||||
name: 'index',
|
||||
redirect:'/home',
|
||||
component: () => import('../views/index.vue'),
|
||||
children: [
|
||||
{
|
||||
path: '/home',
|
||||
name: '/home',
|
||||
component: () => import('../views/Home.vue')
|
||||
},
|
||||
{
|
||||
path: '/personal/edit_pwd',
|
||||
name: '/personal/edit_pwd',
|
||||
component: () => import('../views/personal/Edit_pwd.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/personal/information',
|
||||
name: '/personal/information',
|
||||
component: () => import('../views/personal/Information.vue')
|
||||
},
|
||||
{
|
||||
path: '/system/role/list',
|
||||
name: '/system/role/list',
|
||||
component: () => import('../views/system/role/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/system/menu/list',
|
||||
name: '/system/menu/list',
|
||||
component: () => import('../views/system/menu/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/inventory_management/store/list',
|
||||
name: '/inventory_management/store/list',
|
||||
component: () => import('../views/inventory_management/store/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/inventory_management/detail_store_goods_in/list',
|
||||
name: '/inventory_management/detail_store_goods_in/list',
|
||||
component: () => import('../views/inventory_management/detail_store_goods_in/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/inventory_management/detail_store_goods_out/list',
|
||||
name: '/inventory_management/detail_store_goods_out/list',
|
||||
component: () => import('../views/inventory_management/detail_store_goods_out/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/inventory_management/supplier/list',
|
||||
name: '/inventory_management/supplier/list',
|
||||
component: () => import('../views/inventory_management/supplier/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/inventory_management/detail_store_goods_in/notice/list',
|
||||
name: '/inventory_management/detail_store_goods_in/notice/list',
|
||||
component: () => import('../views/inventory_management/detail_store_goods_in/notice/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/inventory_management/detail_store_goods_out/notice/list',
|
||||
name: '/inventory_management/detail_store_goods_out/notice/list',
|
||||
component: () => import('../views/inventory_management/detail_store_goods_out/notice/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/inventory_management/store/storage_situation',
|
||||
name: '/inventory_management/store/storage_situation',
|
||||
component: () => import('../views/inventory_management/store/StorageSituation.vue')
|
||||
},
|
||||
{
|
||||
path: '/goods_management/goods_category/list',
|
||||
name: '/goods_management/goods_category/list',
|
||||
component: () => import('../views/goods_management/goods_category/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/goods_management/goods/list',
|
||||
name: '/goods_management/goods/list',
|
||||
component: () => import('../views/goods_management/goods/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/goods_management/goods_store/list',
|
||||
name: '/goods_management/goods_store/list',
|
||||
component: () => import('../views/goods_management/goods_store/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/goods_management/statistic_sale/list',
|
||||
name: '/goods_management/statistic_sale/list',
|
||||
component: () => import('../views/goods_management/statistic_sale/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/goods_management/point_products/list',
|
||||
name: '/goods_management/point_products/list',
|
||||
component: () => import('../views/goods_management/point_products/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/personnel_management/dept/list',
|
||||
name: '/personnel_management/dept/list',
|
||||
component: () => import('../views/personnel_management/dept/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/personnel_management/employee/list',
|
||||
name: '/personnel_management/employee/list',
|
||||
component: () => import('../views/personnel_management/employee/List.vue')
|
||||
},
|
||||
{
|
||||
path: '/member_management/member/list',
|
||||
name: '/member_management/member/list',
|
||||
component: () => import('../views/member_management/member/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/sale_management/sale_cmd/list',
|
||||
name: '/sale_management/sale_cmd/list',
|
||||
component: () => import('../views/sale_management/sale_cmd/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/sale_management/sale_records/list',
|
||||
name: '/sale_management/sale_records/list',
|
||||
component: () => import('../views/sale_management/sale_records/List.vue')
|
||||
},
|
||||
|
||||
{
|
||||
path: '/sale_management/exchange_point_products_records/list',
|
||||
name: '/sale_management/exchange_point_products_records/list',
|
||||
component: () => import('../views/sale_management/exchange_point_products_records/List.vue')
|
||||
},
|
||||
|
||||
]
|
||||
},
|
||||
]
|
||||
import 'vue-vibe'
|
||||
const router = new VueRouter({
|
||||
mode: "history",
|
||||
routes
|
||||
})
|
||||
|
||||
export default router
|
@ -0,0 +1,18 @@
|
||||
import Vue from 'vue'
|
||||
import Vuex from 'vuex'
|
||||
|
||||
Vue.use(Vuex)
|
||||
|
||||
export default new Vuex.Store({
|
||||
state: {
|
||||
BaseApi: "http://localhost:9291"
|
||||
},
|
||||
getters: {
|
||||
},
|
||||
mutations: {
|
||||
},
|
||||
actions: {
|
||||
},
|
||||
modules: {
|
||||
}
|
||||
})
|
@ -0,0 +1,41 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Author:
|
||||
* @Date: 09-12 00:42:31
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
</el-breadcrumb><br />
|
||||
|
||||
<div id="home_bg">
|
||||
<h1 style="color: white;font-size: 28px;">欢迎访问超市管理系统</h1>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
||||
},
|
||||
mounted() {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
#home_bg {
|
||||
top: 0;
|
||||
left: 0;
|
||||
overflow-y: auto;
|
||||
height: 80vh;
|
||||
background: url("../assets/img/13.jpg") center top / cover no-repeat;
|
||||
|
||||
}
|
||||
</style>
|
@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<div id="login">
|
||||
<div class="loginForm">
|
||||
<el-form :model="loginForm" ref="loginForm" class="demo-ruleForm">
|
||||
<br />
|
||||
<i class="iconfont icon-r-building" style="font-size: 36px">
|
||||
<b style="font-size: 28px"> 超市管理系统 </b> </i><br /><br />
|
||||
<el-form-item prop="username">
|
||||
<el-row>
|
||||
<el-col :span="5" style="text-align: right">
|
||||
<i class="iconfont icon-r-user1" style="font-size: 28px; color: grey">
|
||||
</i>
|
||||
</el-col>
|
||||
<el-col :span="19" style="text-align: left; padding-left: 10px">
|
||||
<el-input v-model="loginForm.username" placeholder="账号"></el-input>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="password">
|
||||
<el-row>
|
||||
<el-col :span="5" style="text-align: right">
|
||||
<i class="iconfont icon-r-lock" style="font-size: 28px; color: grey">
|
||||
</i>
|
||||
</el-col>
|
||||
<el-col :span="19" style="text-align: left; padding-left: 10px">
|
||||
<el-input type="password" v-model="loginForm.password" placeholder="密码"></el-input>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: center;padding-left: 45px;">
|
||||
<el-button type="primary" @click="submitForm('loginForm')">
|
||||
登录</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<style>
|
||||
#login {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
overflow-y: hidden;
|
||||
height: 100%;
|
||||
background: url("../assets/img/01.jpg") center top / cover no-repeat;
|
||||
}
|
||||
|
||||
.loginForm {
|
||||
background-color: white;
|
||||
width: 400px;
|
||||
height: 280px;
|
||||
margin: 150px auto;
|
||||
text-align: center;
|
||||
padding-top: 10px;
|
||||
border-color: #555555;
|
||||
border-style: solid;
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.loginForm input {
|
||||
width: 260px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.loginForm button {
|
||||
margin-right: 40px;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
import { ajaxPost, popup } from "@/assets/js/common";
|
||||
import Cookies from "js-cookie";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loginForm: {
|
||||
username: "",
|
||||
password: "",
|
||||
},
|
||||
rules: {
|
||||
username: [
|
||||
{
|
||||
required: true,
|
||||
message: "账号不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
password: [
|
||||
{
|
||||
required: true,
|
||||
message: "密码不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
{
|
||||
min: 6,
|
||||
max: 8,
|
||||
message: "密码长度为5-8位",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
submitForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
ajaxPost("/login", this.loginForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
Cookies.set("token", res.data.token, {
|
||||
expires: 1 / 48,
|
||||
});
|
||||
Cookies.set(
|
||||
"employee",
|
||||
JSON.stringify(res.data.employee),
|
||||
{ expires: 1 / 48 }
|
||||
);
|
||||
popup("登录成功,请稍等...");
|
||||
this.$router.push("/index");
|
||||
} else {
|
||||
popup(res.msg, "warning");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
popup("账号或密码格式不正确!", "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
resetForm(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
@ -0,0 +1,353 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>商品管理</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>分类管理</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
<el-row>
|
||||
<el-col :span="8" style="text-align: left; padding-right: 10px">
|
||||
<el-input placeholder="分类名称" v-model="searchForm.name" />
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-select
|
||||
v-model="searchForm.state"
|
||||
placeholder="状态"
|
||||
clearable
|
||||
>
|
||||
<el-option label="正常" value="0"></el-option>
|
||||
<el-option label="停用" value="-1"></el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: left">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitSearchForm"
|
||||
|
||||
>
|
||||
搜索</el-button
|
||||
>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="newVisable = true"
|
||||
|
||||
>
|
||||
创建分类
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
|
||||
<div class="table">
|
||||
<el-table :data="tableData" style="width: 100%" size="medium">
|
||||
<el-table-column type="index" label-width="100px" label="序号">
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label-width="100px" label="名称">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="info"
|
||||
label-width="100px"
|
||||
:show-overflow-tooltip="true"
|
||||
label="描述"
|
||||
>
|
||||
</el-table-column>
|
||||
<el-table-column prop="state" label-width="100px" label="状态">
|
||||
<template v-slot="scope">
|
||||
<el-tag type="success" v-if="scope.row.state == '0'"
|
||||
>正常</el-tag
|
||||
>
|
||||
<el-tag type="danger" v-else>停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="260" fixed="right">
|
||||
<template v-slot="scope">
|
||||
<el-button
|
||||
type="success"
|
||||
@click="editbtn(scope.row)"
|
||||
|
||||
>
|
||||
修改</el-button
|
||||
>
|
||||
<el-button
|
||||
type="danger"
|
||||
@click="forbidden(scope.row.id)"
|
||||
|
||||
>
|
||||
停用</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="margin: 10px 0 15px 0">
|
||||
<el-pagination
|
||||
@size-change="handleSizeChange"
|
||||
@current-change="handleCurrentChange"
|
||||
:current-page.sync="searchForm.currentPage"
|
||||
:page-sizes="[5, 10, 20, 50]"
|
||||
:page-size="searchForm.pageSize"
|
||||
layout="total,sizes, prev, pager, next,jumper"
|
||||
:total="searchForm.total"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--创建弹出框-->
|
||||
<el-dialog title="创建商品分类" :visible.sync="newVisable" width="50%">
|
||||
<el-form
|
||||
:model="newForm"
|
||||
:rules="rules"
|
||||
ref="newForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-form-item label="名称:" prop="name">
|
||||
<el-input v-model="newForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="textarea" v-model="newForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitNewForm('newForm')"
|
||||
|
||||
>
|
||||
提交</el-button
|
||||
>
|
||||
<el-button @click="saveCancel"
|
||||
> 取消</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
<!--修改描述/状态弹出框-->
|
||||
<el-dialog
|
||||
title="分类信息修改"
|
||||
:visible.sync="dialogVisible"
|
||||
width="50%"
|
||||
>
|
||||
<el-form
|
||||
:model="editForm"
|
||||
:rules="rules"
|
||||
ref="editForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-form-item label="名称:" prop="name">
|
||||
<el-input v-model="editForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="editForm.info"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态:" prop="state">
|
||||
<el-select
|
||||
v-model="editForm.state"
|
||||
clearable
|
||||
@change="$forceUpdate()"
|
||||
placeholder="请选择状态"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitEditForm('editForm')"
|
||||
|
||||
>
|
||||
提交</el-button
|
||||
>
|
||||
<el-button
|
||||
@click="resetEditForm('editForm')"
|
||||
|
||||
>
|
||||
重置</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { popup } from "@/assets/js/common";
|
||||
import {
|
||||
deactivate,
|
||||
queryPageByQo,
|
||||
save,
|
||||
update,
|
||||
} from "@/api/goods_management/goods_category/goodsCategoryApi";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
/*搜索*/
|
||||
newVisable: false,
|
||||
dialogVisible: false,
|
||||
options: [
|
||||
{ label: "正常", value: "0" },
|
||||
{ label: "停用", value: "-1" },
|
||||
],
|
||||
/*表格*/
|
||||
tableData: [],
|
||||
searchForm: {
|
||||
total: 0,
|
||||
currentPage: 1,
|
||||
pageSize: 5,
|
||||
},
|
||||
editForm: {},
|
||||
newForm: {},
|
||||
rules: {
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
message: "名称不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
state: [
|
||||
{
|
||||
required: true,
|
||||
message: "状态不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
queryPageByQo(this.searchForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
console.log(res.data);
|
||||
this.tableData = res.data.records;
|
||||
this.searchForm.total = res.data.total;
|
||||
this.searchForm.pageSize = res.data.size;
|
||||
this.searchForm.currentPage = res.data.current;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
submitSearchForm() {
|
||||
this.init();
|
||||
},
|
||||
/*分页*/
|
||||
handleSizeChange(val) {
|
||||
this.searchForm.pageSize = val;
|
||||
this.init();
|
||||
console.log(`每页 ${val} 条`);
|
||||
},
|
||||
handleCurrentChange(val) {
|
||||
this.searchForm.currentPage = val;
|
||||
this.init();
|
||||
console.log(`当前页: ${val}`);
|
||||
},
|
||||
submitNewForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
save(this.newForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.newForm = {};
|
||||
this.newVisable = false;
|
||||
this.init();
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
saveCancel() {
|
||||
this.newVisable = false;
|
||||
this.$refs["newForm"].resetFields();
|
||||
},
|
||||
/*修改信息业务*/
|
||||
editbtn(row) {
|
||||
this.editForm = { ...row };
|
||||
this.dialogVisible = true;
|
||||
},
|
||||
submitEditForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
update(this.editForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.editForm = {};
|
||||
this.dialogVisible = false;
|
||||
this.init();
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
resetEditForm(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
},
|
||||
/*停用业务*/
|
||||
forbidden(sid) {
|
||||
deactivate(sid).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.searchForm.currentPage = 1;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
this.init();
|
||||
});
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
.searchForm {
|
||||
height: 134px;
|
||||
}
|
||||
|
||||
.table {
|
||||
height: 320px;
|
||||
}
|
||||
|
||||
.pageUtils {
|
||||
position: absolute;
|
||||
width: 84%;
|
||||
margin: 2px auto;
|
||||
height: 43px;
|
||||
}
|
||||
.searchForm {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
height: 51px;
|
||||
line-height: 51px;
|
||||
}
|
||||
|
||||
.searchForm .column {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin-right: 2px;
|
||||
line-height: 48px;
|
||||
height: 51px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,204 @@
|
||||
<template>
|
||||
<el-container>
|
||||
<el-header style="height: 80px">
|
||||
<el-row>
|
||||
<el-col :span="12" style="margin-top: 20px">
|
||||
<i style="color: white; font-size: 32px" class="iconfont icon-r-building">
|
||||
<b style="font-size: 26px"> 超市管理系统</b></i>
|
||||
</el-col>
|
||||
<el-col :span="12" style="text-align: right; margin-top: 15px; cursor: pointer">
|
||||
<el-dropdown>
|
||||
<el-avatar :size="50" shape="square" :src="BaseApi + circleUrl"></el-avatar>
|
||||
<b style="
|
||||
font-size: 24px;
|
||||
color: white;
|
||||
margin-top: -10px;
|
||||
">
|
||||
{{ isAdmin ? "管理员 " : "用户 " }}
|
||||
{{ loginName }}</b>
|
||||
|
||||
<el-dropdown-menu slot="dropdown">
|
||||
<el-dropdown-item @click.native="informationBtn">个人资料完善</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="empExit">退出</el-dropdown-item>
|
||||
<el-dropdown-item @click.native="logoutVisable = true">注销</el-dropdown-item>
|
||||
</el-dropdown-menu>
|
||||
</el-dropdown>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-header>
|
||||
<!--注销账户-->
|
||||
<el-dialog title="注销账户" :visible.sync="logoutVisable" width="70%">
|
||||
<el-form :model="logoutform" :rules="rules" ref="logoutform" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="内容" prop="content">
|
||||
<el-input v-model="logoutform.content" placeholder="请填写“本人确定注销”"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="logoutSubmit('logoutform')">确 定</el-button>
|
||||
<el-button @click="logoutCel('logoutform')">取 消</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
|
||||
<el-container>
|
||||
<el-aside width="200px" style="overflow-y: hidden;min-height: 900px;">
|
||||
<el-menu background-color="#6495ED" text-color="white" :router="true" :unique-opened="true"
|
||||
active-text-color="#FFDEAD">
|
||||
<el-submenu v-for="item in menu_catalogs" :key="item.id" :index="item.id + ''">
|
||||
<template slot="title">
|
||||
<i :class="item.icon" style="font-size: 28px; color: white">
|
||||
</i>
|
||||
<b style="font-size: 21px;"> {{ item.label }}</b>
|
||||
</template>
|
||||
<el-menu-item-group>
|
||||
<el-menu-item v-for="c in item.children" :key="c.id" :index="c.purl">
|
||||
<i :class="c.icon" style="font-size: 24px"> </i>
|
||||
<b> {{ c.label }}</b>
|
||||
</el-menu-item>
|
||||
</el-menu-item-group>
|
||||
</el-submenu>
|
||||
</el-menu>
|
||||
</el-aside>
|
||||
<el-main>
|
||||
<router-view />
|
||||
</el-main>
|
||||
</el-container>
|
||||
</el-container>
|
||||
</template>
|
||||
<script>
|
||||
import { clearCookie, loginEmp } from "@/assets/js/auth";
|
||||
import { ajaxGet, ajaxPost, popup } from "@/assets/js/common";
|
||||
import Cookies from "js-cookie";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
BaseApi: this.$store.state.BaseApi,
|
||||
logoutVisable: false,
|
||||
loginName: "",
|
||||
isAdmin: "",
|
||||
logoutform: {},
|
||||
circleUrl: loginEmp().headImg,
|
||||
menu_catalogs: [],
|
||||
rules: {
|
||||
content: [
|
||||
{
|
||||
required: true,
|
||||
message: "内容不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
this.isAdmin = loginEmp().isAdmin;
|
||||
this.loginName = loginEmp().nickName;
|
||||
ajaxGet("/empMenu", {}).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
this.menu_catalogs = res.data;
|
||||
}
|
||||
});
|
||||
},
|
||||
/*个人资料*/
|
||||
informationBtn() {
|
||||
this.$router.push("/personal/information");
|
||||
popup("请完善个人的资料");
|
||||
},
|
||||
/*账户退出*/
|
||||
empExit() {
|
||||
this.$confirm("确定要退出系统?", "警示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
ajaxGet("/exit", this.pwdForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("成功退出系统...");
|
||||
clearCookie("employee");
|
||||
clearCookie("token");
|
||||
this.$router.push("/");
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
this.$message({
|
||||
type: "info",
|
||||
message: "已取消操作",
|
||||
});
|
||||
});
|
||||
},
|
||||
/*注销账户*/
|
||||
logoutCel(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
this.logoutform = {};
|
||||
this.logoutVisable = false;
|
||||
},
|
||||
logoutSubmit(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
ajaxPost("/logout", {
|
||||
content: this.logoutform.content,
|
||||
}).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("注销成功");
|
||||
clearCookie("employee");
|
||||
clearCookie("token");
|
||||
this.logoutVisable = false;
|
||||
this.$router.push("/");
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
.avatar {
|
||||
display: inline-block;
|
||||
width: 200px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.personalFul {
|
||||
background-color: #ffffff;
|
||||
position: absolute;
|
||||
z-index: 999999;
|
||||
top: 58px;
|
||||
right: 20px;
|
||||
width: 151px;
|
||||
}
|
||||
|
||||
/* .personalFul ul > li {
|
||||
margin: 1px auto;
|
||||
padding: 0px;
|
||||
height: 20px;
|
||||
color: #ffffff;
|
||||
background-color: #6495ED;
|
||||
list-style-type: none;
|
||||
} */
|
||||
|
||||
.personalFul ul>li:hover {
|
||||
background-color: #fc4316;
|
||||
}
|
||||
|
||||
.el-menu-item i {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.el-submenu__title i {
|
||||
color: white;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,265 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>库存管理 </el-breadcrumb-item>
|
||||
<el-breadcrumb-item>仓库管理</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
|
||||
<el-row>
|
||||
<el-col :span="8" style="text-align: left;padding-right: 10px;">
|
||||
<el-input placeholder="仓库名称" v-model="searchForm.name"/>
|
||||
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-select v-model="searchForm.state" placeholder="请选择状态" clearable>
|
||||
<el-option label="正常" value="0"></el-option>
|
||||
<el-option label="停用" value="-1"></el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: left">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="subSearchForm"
|
||||
|
||||
>
|
||||
搜索</el-button
|
||||
>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="newVisable = true"
|
||||
|
||||
>
|
||||
创建仓库
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-table
|
||||
:data="tableData"
|
||||
style="width: 100%">
|
||||
<el-table-column
|
||||
type="index"
|
||||
label="序号"
|
||||
width="180">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="name"
|
||||
label="名称"
|
||||
width="180">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="address"
|
||||
label="地址"
|
||||
width="180">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="info"
|
||||
:show-overflow-tooltip="true"
|
||||
label="描述">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="state"
|
||||
label="状态">
|
||||
<template v-slot="scope">
|
||||
<el-tag v-if="scope.row.state=='0'" type="success">正常</el-tag>
|
||||
<el-tag v-else type="danger">停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="260" fixed="right"
|
||||
label="操作">
|
||||
<template v-slot="scope">
|
||||
<el-button type="success" @click="editStore(scope.row)">
|
||||
|
||||
修改
|
||||
</el-button>
|
||||
<el-button type="danger" @click="forbidden(scope.row.id)">
|
||||
|
||||
停用
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--修改仓库弹出框-->
|
||||
<el-dialog
|
||||
title="仓库信息修改"
|
||||
:visible.sync="dialogVisible"
|
||||
width="50%">
|
||||
<el-form v-model="editForm" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="名称:">
|
||||
<el-input v-model="editForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="地址:">
|
||||
<el-input type="text" v-model="editForm.address"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="text" v-model="editForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态:">
|
||||
<el-select v-model="editForm.state"
|
||||
clearable
|
||||
@change="$forceUpdate()"
|
||||
placeholder="请选择状态">
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitEditForm" >
|
||||
|
||||
提交
|
||||
</el-button>
|
||||
<el-button @click="editCancel" > 取消</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
<!--创建仓库弹出框-->
|
||||
<el-dialog
|
||||
title="创建仓库"
|
||||
:visible.sync="newVisable"
|
||||
width="50%">
|
||||
<el-form :model="newForm" :rules="rules" ref="newForm" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="名称:" prop="name">
|
||||
<el-input v-model="newForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="地址:" prop="address">
|
||||
<el-input type="text" v-model="newForm.address"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="text" v-model="newForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitNewForm('newForm')" >
|
||||
提交</el-button>
|
||||
<el-button @click="saveCancel" > 取消</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import {deactivate, save, storeList, update} from "@/api/inventory_management/store/storeApi";
|
||||
import {popup} from "@/assets/js/common";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tableData: [],
|
||||
newStoreVisable: false,
|
||||
dialogVisible: false,
|
||||
editForm: {},
|
||||
searchForm:{},
|
||||
newVisable: false,
|
||||
newForm:{},
|
||||
options: [
|
||||
{label: '正常', value: '0'},
|
||||
{label: '停用', value: '-1'}
|
||||
],
|
||||
rules: {
|
||||
name:[
|
||||
{required: true, message: '名称不能为空', trigger: 'blur'},
|
||||
],
|
||||
address:[
|
||||
{required: true, message: '地名不能为空', trigger: 'blur'},
|
||||
],
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
subSearchForm(){
|
||||
this.init()
|
||||
},
|
||||
init() {
|
||||
storeList(this.searchForm).then(res => {
|
||||
if (res.data.code == 200) {
|
||||
this.tableData = res.data.data
|
||||
} else {
|
||||
popup(res.data.msg, "error")
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
editStore(row) {
|
||||
this.editForm = {...row}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
forbidden(sid) {
|
||||
deactivate(sid).then(res => {
|
||||
res = res.data
|
||||
if (res.code == 200) {
|
||||
popup("操作成功")
|
||||
} else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
this.init()
|
||||
})
|
||||
},
|
||||
submitEditForm() {
|
||||
update(this.editForm).then(res => {
|
||||
res = res.data
|
||||
if (res.code == 200) {
|
||||
popup("操作成功")
|
||||
this.init()
|
||||
this.dialogVisible=false
|
||||
} else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
|
||||
})
|
||||
},
|
||||
editCancel() {
|
||||
this.dialogVisible = false
|
||||
this.editForm = {}
|
||||
popup("已取消操作", "info")
|
||||
},
|
||||
submitNewForm(formName){
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
save(this.newForm).then(res=>{
|
||||
res=res.data
|
||||
if (res.code==200){
|
||||
popup("操作成功")
|
||||
this.newForm={}
|
||||
this.newVisable=false
|
||||
this.init()
|
||||
}else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
saveCancel(){
|
||||
this.newVisable=false
|
||||
this.$refs["newForm"].resetFields()
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.init()
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.search {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
height: 51px;
|
||||
line-height: 51px;
|
||||
}
|
||||
|
||||
.search .column {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin-right: 2px;
|
||||
line-height: 48px;
|
||||
height: 51px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,154 @@
|
||||
<!--
|
||||
* @Description:
|
||||
* @Author:
|
||||
* @Date: 09-07 20:58:35
|
||||
-->
|
||||
<template>
|
||||
<div>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>个人中心 </el-breadcrumb-item>
|
||||
<el-breadcrumb-item>密码修改</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
<div id="edit_pwd">
|
||||
<el-form
|
||||
:model="pwdForm"
|
||||
:rules="rules"
|
||||
ref="pwdForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<i class="iconfont icon-r-lock" style="font-size: 32px">
|
||||
<b style="font-size: 28px">密码修改</b></i
|
||||
>
|
||||
<br />
|
||||
<br />
|
||||
<el-form-item label="账号">
|
||||
<el-input disabled v-model="pwdForm.username"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="旧密码" prop="oldPwd">
|
||||
<el-input
|
||||
type="password"
|
||||
v-model="pwdForm.oldPwd"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="新密码" prop="newPwd">
|
||||
<el-input
|
||||
type="password"
|
||||
v-model="pwdForm.newPwd"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitForm('pwdForm')"
|
||||
|
||||
>
|
||||
确定</el-button
|
||||
>
|
||||
<el-button
|
||||
@click="resetForm('pwdForm')"
|
||||
|
||||
>
|
||||
重置</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { loginEmp, removeToken } from "@/assets/js/auth";
|
||||
import Cookies from "js-cookie";
|
||||
import { ajaxPost, popup } from "@/assets/js/common";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
pwdForm: {},
|
||||
rules: {
|
||||
newPwd: [
|
||||
{
|
||||
required: true,
|
||||
message: "新密码不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
{
|
||||
min: 6,
|
||||
max: 8,
|
||||
message: "新密码长度为6-8位",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
oldPwd: [
|
||||
{
|
||||
required: true,
|
||||
message: "旧密码不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
{
|
||||
min: 6,
|
||||
max: 8,
|
||||
message: "旧密码长度为6-8位",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
this.pwdForm.username = loginEmp().username;
|
||||
},
|
||||
resetForm(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
},
|
||||
submitForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
this.$confirm("确定修改密码?", "警示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning",
|
||||
})
|
||||
.then(() => {
|
||||
ajaxPost("/personal/edit_pwd", this.pwdForm).then(
|
||||
(res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("密码修改成功,请重新登录...");
|
||||
this.pwdForm = {
|
||||
username: this.pwdForm.username,
|
||||
};
|
||||
Cookies.remove("employee");
|
||||
removeToken();
|
||||
this.$router.push("/");
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
}
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
this.$message({
|
||||
type: "info",
|
||||
message: "已取消操作",
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
#edit_pwd {
|
||||
width: 50%;
|
||||
margin: 50px auto;
|
||||
background-color: #ffffff;
|
||||
padding: 20px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,275 @@
|
||||
<template>
|
||||
<div id="information">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>个人中心 </el-breadcrumb-item>
|
||||
<el-breadcrumb-item>个人资料</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
|
||||
<i class="iconfont icon-r-paper" style="font-size: 32px">
|
||||
<b style="font-size: 28px">完善个人资料</b></i
|
||||
>
|
||||
<br />
|
||||
<br />
|
||||
<el-form
|
||||
:model="informationForm"
|
||||
:rules="rules"
|
||||
ref="informationForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item style="width: 40%">
|
||||
<el-upload
|
||||
class="avatar-uploader"
|
||||
action="http://localhost:9291/personnel_management/employee/uploadImg"
|
||||
:show-file-list="false"
|
||||
:on-success="handleAvatarSuccess"
|
||||
:before-upload="beforeAvatarUpload"
|
||||
>
|
||||
<img
|
||||
v-if="imageUrl"
|
||||
:src="BaseApi + imageUrl"
|
||||
class="avatar"
|
||||
/>
|
||||
<i
|
||||
v-else
|
||||
class="el-icon-plus avatar-uploader-icon"
|
||||
></i>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
style="width: 40%"
|
||||
label="电话号码:"
|
||||
prop="username"
|
||||
>
|
||||
<el-input
|
||||
max="11"
|
||||
v-model="informationForm.username"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
style="width: 40%"
|
||||
label="姓名:"
|
||||
prop="nickName"
|
||||
>
|
||||
<el-input
|
||||
v-model="informationForm.nickName"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
style="width: 40%"
|
||||
label="身份证号:"
|
||||
prop="idCard"
|
||||
>
|
||||
<el-input
|
||||
v-model="informationForm.idCard"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item style="width: 40%" label="年龄:">
|
||||
<el-input
|
||||
type="number"
|
||||
min="18"
|
||||
max="70"
|
||||
v-model="informationForm.age"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
style="width: 40%"
|
||||
label="所属部门:"
|
||||
>
|
||||
<el-select
|
||||
disabled
|
||||
style="width: 200px"
|
||||
v-model="informationForm.deptId"
|
||||
placeholder="请选择部门"
|
||||
filterable
|
||||
@change="$forceUpdate()"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.id"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item style="width: 40%" label="住址:">
|
||||
<el-input
|
||||
type="text"
|
||||
v-model="informationForm.address"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item style="width: 40%" label="备注:">
|
||||
<el-input
|
||||
type="textarea"
|
||||
cols="50"
|
||||
rows="3"
|
||||
v-model="informationForm.info"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item style="width: 40%" label="性别:">
|
||||
<el-select
|
||||
style="width: 200px"
|
||||
v-model="informationForm.sex"
|
||||
@change="$forceUpdate()"
|
||||
placeholder="请选择性别"
|
||||
clearable
|
||||
>
|
||||
<el-option label="女" value="0"></el-option>
|
||||
<el-option label="男" value="1"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitInformationForm('informationForm')"
|
||||
|
||||
>
|
||||
提交</el-button
|
||||
>
|
||||
<el-button
|
||||
@click="resetForm('informationForm')"
|
||||
|
||||
>
|
||||
重置</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { listByQo } from "@/api/personnel_management/department/deptApi";
|
||||
import { popup } from "@/assets/js/common";
|
||||
import { queryInformation } from "@/api/personal/personApi";
|
||||
import { update } from "@/api/personnel_management/employee/empApi";
|
||||
import { loginEmp } from "@/assets/js/auth";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
BaseApi: this.$store.state.BaseApi,
|
||||
loginEid: loginEmp().id,
|
||||
informationForm: {},
|
||||
imageUrl: "",
|
||||
options: [],
|
||||
rules: {
|
||||
username: [
|
||||
{
|
||||
required: true,
|
||||
message: "手机号不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
nickName: [
|
||||
{
|
||||
required: true,
|
||||
message: "姓名不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
idCard: [
|
||||
{
|
||||
required: true,
|
||||
message: "身份证号不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
deptAll() {
|
||||
listByQo({}).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
this.options = res.data;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
init() {
|
||||
queryInformation().then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
this.informationForm = { ...res.data };
|
||||
this.imageUrl = this.informationForm.headImg;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
submitInformationForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
update(this.informationForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("更新成功");
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
this.init();
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
resetForm(formName) {
|
||||
this.$refs[formName].resetFields();
|
||||
this.init();
|
||||
},
|
||||
/*上传头像*/
|
||||
handleAvatarSuccess(res) {
|
||||
this.informationForm.headImg = res.url;
|
||||
this.imageUrl = res.url;
|
||||
},
|
||||
beforeAvatarUpload(file) {
|
||||
const isJPG =
|
||||
file.type === "image/jpeg" || file.type === "image/png";
|
||||
const isLt2M = file.size / 1024 / 1024 < 3;
|
||||
if (!isJPG) {
|
||||
this.$message.error("上传头像图片只能是 JPG或PNG 格式!");
|
||||
}
|
||||
if (!isLt2M) {
|
||||
this.$message.error("上传头像图片大小不能超过 3MB!");
|
||||
}
|
||||
return isJPG && isLt2M;
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.imageUrl = "";
|
||||
this.deptAll();
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
@ -0,0 +1,254 @@
|
||||
<template>
|
||||
<div id="dept_list">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item
|
||||
>首页</el-breadcrumb-item
|
||||
>
|
||||
<el-breadcrumb-item
|
||||
>人事管理
|
||||
</el-breadcrumb-item>
|
||||
<el-breadcrumb-item
|
||||
>部门管理</el-breadcrumb-item
|
||||
> </el-breadcrumb
|
||||
><br />
|
||||
|
||||
<el-row>
|
||||
<el-col :span="7">
|
||||
<el-input placeholder="部门名称" v-model="searchForm.name"/>
|
||||
</el-col>
|
||||
<el-col :span="7">
|
||||
<el-select v-model="searchForm.state" placeholder="请选择状态" clearable>
|
||||
<el-option label="正常" value="0"></el-option>
|
||||
<el-option label="停用" value="-1"></el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: left">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="subSearchForm"
|
||||
|
||||
>
|
||||
搜索</el-button
|
||||
>
|
||||
<el-button type="success" @click="newVisable=true"
|
||||
|
||||
>
|
||||
创建部门
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
|
||||
<el-table
|
||||
:data="tableData"
|
||||
style="width: 100%">
|
||||
<el-table-column
|
||||
type="index"
|
||||
label="序号"
|
||||
width="180">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="name"
|
||||
label="名称"
|
||||
width="180">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="info"
|
||||
label="描述">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="state"
|
||||
label="状态">
|
||||
<template v-slot="scope">
|
||||
<el-tag v-if="scope.row.state=='0'" type="success" style="font-size: 14px;">
|
||||
<i class="iconfont icon-r-yes" style="font-size: 14px;"> </i> 正常</el-tag>
|
||||
<el-tag v-else type="danger" style="font-size: 14px;">
|
||||
<i class="iconfont icon-r-no" style="font-size: 14px;"> </i> 停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作" width="260" fixed="right">
|
||||
<template v-slot="scope">
|
||||
<el-button type="success" @click="edit(scope.row)" >
|
||||
修改</el-button>
|
||||
<el-button type="danger" @click="forbidden(scope.row.id)" >
|
||||
停用</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--修改描述/状态弹出框-->
|
||||
<el-dialog
|
||||
title="部门修改"
|
||||
:visible.sync="dialogVisible"
|
||||
width="50%">
|
||||
<el-form v-model="editForm" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="名称:">
|
||||
<el-input disabled v-model="editForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="text" v-model="editForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态:">
|
||||
<el-select v-model="editForm.state"
|
||||
clearable
|
||||
@change="$forceUpdate()"
|
||||
placeholder="请选择状态">
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitEditForm" >
|
||||
提交</el-button>
|
||||
<el-button @click="canCelEdit" >
|
||||
关闭</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
<!--创建弹出框-->
|
||||
<el-dialog
|
||||
title="创建部门"
|
||||
:visible.sync="newVisable"
|
||||
width="50%">
|
||||
<el-form :model="newForm" :rules="rules" ref="newForm" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="名称:" prop="name">
|
||||
<el-input v-model="newForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="text" v-model="newForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="submitNewForm('newForm')"> 提交</el-button>
|
||||
<el-button @click="resetNewForm('newForm')"> 重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { popup} from "@/assets/js/common";
|
||||
import {deactivate, listByQo, save, update} from "@/api/personnel_management/department/deptApi";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tableData: [],
|
||||
editForm: {},
|
||||
editRow:{},
|
||||
dialogVisible: false,
|
||||
newVisable:false,
|
||||
newForm:{},
|
||||
searchForm: {},
|
||||
options: [
|
||||
{label: '正常', value: '0'},
|
||||
{label: '停用', value: '-1'}
|
||||
],
|
||||
rules: {
|
||||
name:[
|
||||
{required: true, message: '名称不能为空', trigger: 'blur'},
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
listByQo(this.searchForm).then(res => {
|
||||
if (res.data.code == 200) {
|
||||
this.tableData = res.data.data
|
||||
}else {
|
||||
popup(res.data.msg,"error")
|
||||
}
|
||||
|
||||
})
|
||||
},
|
||||
forbidden(id) {
|
||||
deactivate(id).then(res => {
|
||||
res = res.data
|
||||
if (res.code == 200) {
|
||||
popup("操作成功")
|
||||
} else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
this.init()
|
||||
})
|
||||
},
|
||||
|
||||
/*弹出修改表单*/
|
||||
edit(row) {
|
||||
this.editForm= {...row}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
/*条件搜索*/
|
||||
subSearchForm() {
|
||||
this.init()
|
||||
},
|
||||
/*对接后端修改接口*/
|
||||
submitEditForm() {
|
||||
update(this.editForm).then(res=>{
|
||||
res=res.data
|
||||
if (res.code==200){
|
||||
popup("操作成功")
|
||||
this.dialogVisible=false
|
||||
this.init()
|
||||
}else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
})
|
||||
},
|
||||
/*修改重置按钮*/
|
||||
canCelEdit(){
|
||||
this.dialogVisible=false
|
||||
this.editForm={}
|
||||
},
|
||||
/*创建新角色*/
|
||||
submitNewForm(formName){
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
console.log(this.newForm)
|
||||
save(this.newForm).then(res=>{
|
||||
res=res.data
|
||||
if (res.code==200){
|
||||
popup("操作成功")
|
||||
this.newVisable=false
|
||||
this.newForm={}
|
||||
this.init()
|
||||
}else {
|
||||
popup(res.msg, "error")
|
||||
}
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
resetNewForm(formname){
|
||||
this.$refs[formname].resetFields()
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.init()
|
||||
}
|
||||
|
||||
}
|
||||
</script>
|
||||
<style>
|
||||
.search {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
height: 51px;
|
||||
line-height: 51px;
|
||||
}
|
||||
|
||||
.search .column {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin-right: 2px;
|
||||
line-height: 48px;
|
||||
height: 51px;
|
||||
}
|
||||
</style>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,209 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>系统管理</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>菜单管理</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
<el-row>
|
||||
<el-col :span="8" style="text-align: left; padding-right: 10px">
|
||||
<el-input placeholder="菜单名称" v-model="searchForm.name" />
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: left">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitSearchForm"
|
||||
|
||||
>
|
||||
搜索</el-button
|
||||
>
|
||||
<el-button
|
||||
type="info"
|
||||
@click="resetSearchForm"
|
||||
|
||||
>
|
||||
重置
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<div class="table">
|
||||
<el-table
|
||||
:data="tableData"
|
||||
style="width: 100%"
|
||||
size="medium"
|
||||
row-key="id"
|
||||
border
|
||||
:tree-props="{ children: 'children' }"
|
||||
>
|
||||
<el-table-column prop="label" label="菜单名"> </el-table-column>
|
||||
<el-table-column
|
||||
width="150"
|
||||
prop="flag"
|
||||
:show-overflow-tooltip="true"
|
||||
label="标识符"
|
||||
>
|
||||
<template v-slot="scope">
|
||||
<el-tag type="info">{{
|
||||
scope.row.flag ? scope.row.flag : "暂定"
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="type" label="类型">
|
||||
<template v-slot="scope">
|
||||
<el-tag v-if="scope.row.type == 0"
|
||||
>目录</el-tag
|
||||
>
|
||||
<el-tag
|
||||
|
||||
v-else-if="scope.row.type == 1"
|
||||
type="success"
|
||||
>菜单</el-tag
|
||||
>
|
||||
<el-tag v-else type="warning"
|
||||
>按钮</el-tag
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="icon" label="图标">
|
||||
<template v-slot="scope">
|
||||
<i :class="scope.row.icon"></i>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="info"
|
||||
:show-overflow-tooltip="true"
|
||||
label="描述"
|
||||
>
|
||||
<template v-slot="scope">
|
||||
<el-tag type="info">{{
|
||||
scope.row.info ? scope.row.info : "无"
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="component"
|
||||
:show-overflow-tooltip="true"
|
||||
label="组件路径"
|
||||
>
|
||||
<template v-slot="scope">
|
||||
<el-tag type="info">{{
|
||||
scope.row.component ? scope.row.component : "暂定"
|
||||
}}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="state" label="状态">
|
||||
<template v-slot="scope">
|
||||
<el-tag
|
||||
|
||||
type="success"
|
||||
v-if="scope.row.state == 0"
|
||||
>正常</el-tag
|
||||
>
|
||||
<el-tag type="danger" v-else>禁用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="margin: 10px 0 15px 0">
|
||||
<el-pagination
|
||||
@size-change="handleSizeChange"
|
||||
@current-change="handleCurrentChange"
|
||||
:current-page.sync="searchForm.currentPage"
|
||||
:page-sizes="[5, 10, 20, 50]"
|
||||
:page-size="searchForm.pageSize"
|
||||
layout="total,sizes, prev, pager, next,jumper"
|
||||
:total="searchForm.total"
|
||||
>
|
||||
</el-pagination>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import { queryPageByQo } from "@/api/system/menu/menuApi";
|
||||
import { popup } from "@/assets/js/common";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
/*搜索*/
|
||||
/*表格*/
|
||||
tableData: [],
|
||||
searchForm: {
|
||||
total: 0,
|
||||
currentPage: 1,
|
||||
pageSize: 5,
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
init() {
|
||||
queryPageByQo(this.searchForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
console.log(res.data);
|
||||
this.tableData = res.data.records;
|
||||
this.searchForm.total = res.data.total;
|
||||
this.searchForm.pageSize = res.data.size;
|
||||
this.searchForm.currentPage = res.data.current;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
submitSearchForm() {
|
||||
this.init();
|
||||
},
|
||||
resetSearchForm() {
|
||||
this.searchForm.name = "";
|
||||
},
|
||||
/*分页*/
|
||||
handleSizeChange(val) {
|
||||
this.searchForm.pageSize = val;
|
||||
this.init();
|
||||
console.log(`每页 ${val} 条`);
|
||||
},
|
||||
handleCurrentChange(val) {
|
||||
this.searchForm.currentPage = val;
|
||||
this.init();
|
||||
console.log(`当前页: ${val}`);
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
.searchForm {
|
||||
height: 134px;
|
||||
}
|
||||
|
||||
.table {
|
||||
height: 320px;
|
||||
}
|
||||
|
||||
.pageUtils {
|
||||
position: absolute;
|
||||
width: 84%;
|
||||
margin: 2px auto;
|
||||
height: 43px;
|
||||
}
|
||||
.searchForm {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
height: 51px;
|
||||
line-height: 51px;
|
||||
}
|
||||
|
||||
.searchForm .column {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin-right: 2px;
|
||||
line-height: 48px;
|
||||
height: 51px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,416 @@
|
||||
<template>
|
||||
<div id="role_list">
|
||||
<el-breadcrumb separator="/">
|
||||
<el-breadcrumb-item>首页</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>系统管理</el-breadcrumb-item>
|
||||
<el-breadcrumb-item>角色管理</el-breadcrumb-item> </el-breadcrumb
|
||||
><br />
|
||||
|
||||
<el-row>
|
||||
<el-col :span="8" style="text-align: left; padding-right: 10px">
|
||||
<el-input
|
||||
placeholder="角色名称"
|
||||
v-model="roleSearchForm.name"
|
||||
/>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-select
|
||||
@change="$forceUpdate"
|
||||
v-model="roleSearchForm.state"
|
||||
placeholder="状态"
|
||||
clearable
|
||||
>
|
||||
<el-option label="正常" value="0"></el-option>
|
||||
<el-option label="停用" value="-1"></el-option>
|
||||
</el-select>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-row>
|
||||
<el-col :span="24" style="text-align: left">
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="subSearchForm('ruleForm')"
|
||||
|
||||
>
|
||||
搜索</el-button
|
||||
>
|
||||
<el-button
|
||||
type="success"
|
||||
@click="newRoleVisable = true"
|
||||
|
||||
>
|
||||
创建角色
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br />
|
||||
<el-table :data="tableData" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="180">
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="名称" width="180">
|
||||
</el-table-column>
|
||||
<el-table-column prop="info" label="描述"> </el-table-column>
|
||||
<el-table-column prop="state" label="状态">
|
||||
<template v-slot="scope">
|
||||
<el-tag v-if="scope.row.state == '0'" type="success"
|
||||
>正常</el-tag
|
||||
>
|
||||
<el-tag v-else type="danger">停用</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="420" fixed="right">
|
||||
<template v-slot="scope">
|
||||
<el-button
|
||||
type="success"
|
||||
@click="editRole(scope.row)"
|
||||
|
||||
>
|
||||
修改</el-button
|
||||
>
|
||||
<el-button
|
||||
v-if="scope.row.state == '0'"
|
||||
type="danger"
|
||||
@click="forbidden(scope.row.id)"
|
||||
|
||||
>
|
||||
停用</el-button
|
||||
>
|
||||
<el-button
|
||||
type="warning"
|
||||
@click="checkPermissons(scope.row.id)"
|
||||
|
||||
>
|
||||
授权</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--修改描述/状态弹出框-->
|
||||
<el-dialog
|
||||
title="角色信息修改"
|
||||
:visible.sync="dialogVisible"
|
||||
width="50%"
|
||||
>
|
||||
<el-form
|
||||
v-model="editRoleForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-form-item label="名称:">
|
||||
<el-input disabled v-model="editRoleForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input
|
||||
type="text"
|
||||
v-model="editRoleForm.info"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态:">
|
||||
<el-select
|
||||
v-model="editRoleForm.state"
|
||||
clearable
|
||||
@change="$forceUpdate()"
|
||||
placeholder="请选择状态"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitEditForm"
|
||||
|
||||
>
|
||||
提交</el-button
|
||||
>
|
||||
<el-button @click="resetEditForm" >
|
||||
重置</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
<!--创建角色弹出框-->
|
||||
<el-dialog title="创建角色" :visible.sync="newRoleVisable" width="50%">
|
||||
<el-form
|
||||
:model="newRoleForm"
|
||||
:rules="rules"
|
||||
ref="newRoleForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-form-item label="名称:" prop="name">
|
||||
<el-input v-model="newRoleForm.name"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="描述:">
|
||||
<el-input type="text" v-model="newRoleForm.info"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitNewForm('newRoleForm')"
|
||||
|
||||
>
|
||||
创建角色</el-button
|
||||
>
|
||||
<el-button @click="resetNewForm" >
|
||||
重置</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
<!--职能分配框-->
|
||||
<el-dialog
|
||||
title="权限分配"
|
||||
:visible.sync="distributionFulVisable"
|
||||
width="50%"
|
||||
>
|
||||
<el-form
|
||||
:model="distributionFulForm"
|
||||
label-width="100px"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-form-item>
|
||||
<el-input
|
||||
placeholder="输入关键字进行过滤"
|
||||
v-model="filterText"
|
||||
>
|
||||
</el-input>
|
||||
<el-tree
|
||||
:data="fuloptions"
|
||||
class="filter-tree"
|
||||
show-checkbox
|
||||
node-key="value"
|
||||
:default-checked-keys="default_checked_mid"
|
||||
default-expand-all
|
||||
:filter-node-method="filterNode"
|
||||
ref="tree"
|
||||
:props="props"
|
||||
></el-tree>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
@click="submitDistributionFulForm"
|
||||
|
||||
>
|
||||
提交</el-button
|
||||
>
|
||||
<el-button
|
||||
@click="celDistributionFul"
|
||||
> 取消</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
<script>
|
||||
import {
|
||||
forbiddenRole,
|
||||
roleList,
|
||||
edit_role,
|
||||
save_role,
|
||||
checkPermissons,
|
||||
saveRolePermissons,
|
||||
} from "@/api/system/role/roleApi";
|
||||
import { ajaxPost, popup } from "@/assets/js/common";
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tableData: [],
|
||||
editRoleForm: {},
|
||||
editRoleRow: {},
|
||||
dialogVisible: false,
|
||||
newRoleVisable: false,
|
||||
distributionFulVisable: false,
|
||||
newRoleForm: {},
|
||||
roleSearchForm: {},
|
||||
distributionFulForm: {},
|
||||
options: [
|
||||
{ label: "正常", value: "0" },
|
||||
{ label: "停用", value: "-1" },
|
||||
],
|
||||
/*职能分配*/
|
||||
props: { multiple: true },
|
||||
fuloptions: [],
|
||||
default_checked_mid: [],
|
||||
filterText: "",
|
||||
rules: {
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
message: "名称不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
filterText(val) {
|
||||
this.$refs.tree.filter(val);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
filterNode(value, data) {
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
},
|
||||
init() {
|
||||
roleList(this.roleSearchForm).then((res) => {
|
||||
res = res.data;
|
||||
if ((res.code = 200)) {
|
||||
this.tableData = res.data;
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
forbidden(id) {
|
||||
forbiddenRole(id).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
this.roleSearchForm.state = "0";
|
||||
this.init();
|
||||
popup("操作成功");
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/*弹出修改表单*/
|
||||
editRole(row) {
|
||||
this.editRoleForm = { ...row };
|
||||
this.editRoleRow = { ...row };
|
||||
this.dialogVisible = true;
|
||||
},
|
||||
/*条件搜索*/
|
||||
subSearchForm() {
|
||||
this.init();
|
||||
},
|
||||
/*对接后端修改角色接口*/
|
||||
submitEditForm() {
|
||||
if (
|
||||
this.editRoleForm.info == this.editRoleRow.info &&
|
||||
this.editRoleForm.state == this.editRoleRow.state
|
||||
) {
|
||||
popup("您没有更改内容", "warning");
|
||||
return;
|
||||
}
|
||||
edit_role(this.editRoleForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.editRoleForm = {};
|
||||
this.editRoleRow = {};
|
||||
this.dialogVisible = false;
|
||||
this.roleSearchForm.state = "0";
|
||||
this.init();
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
},
|
||||
/*修改角色重置按钮*/
|
||||
resetEditForm() {
|
||||
this.editRoleForm = { ...this.editRoleRow };
|
||||
},
|
||||
/*创建新角色*/
|
||||
submitNewForm(formName) {
|
||||
this.$refs[formName].validate((valid) => {
|
||||
if (valid) {
|
||||
console.log(this.newRoleForm);
|
||||
save_role(this.newRoleForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.newRoleForm = {};
|
||||
this.newRoleVisable = false;
|
||||
this.init();
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
resetNewForm() {
|
||||
this.newRoleForm = {};
|
||||
},
|
||||
/*职能分配*/
|
||||
/*授权按钮*/
|
||||
checkPermissons(rid) {
|
||||
this.distributionFulForm.rid = rid;
|
||||
this.default_checked_mid = [];
|
||||
checkPermissons(rid).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
this.fuloptions = res.data.menus;
|
||||
this.default_checked_mid = res.data.menuIds.sort(
|
||||
(x, y) => x - y
|
||||
);
|
||||
console.log(typeof this.default_checked_mid);
|
||||
console.log(this.default_checked_mid);
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
|
||||
this.distributionFulVisable = true;
|
||||
},
|
||||
submitDistributionFulForm() {
|
||||
var keys = this.$refs.tree.getCheckedKeys();
|
||||
var v = JSON.stringify(keys).replace("[", "").replace("]", "");
|
||||
this.distributionFulForm.menuIds = v;
|
||||
console.log(this.distributionFulForm.menuIds);
|
||||
saveRolePermissons(this.distributionFulForm).then((res) => {
|
||||
res = res.data;
|
||||
if (res.code == 200) {
|
||||
popup("操作成功");
|
||||
this.distributionFulVisable = false;
|
||||
this.distributionFulForm = {};
|
||||
this.default_checked_mid = [];
|
||||
this.fuloptions = [];
|
||||
} else {
|
||||
popup(res.msg, "error");
|
||||
}
|
||||
});
|
||||
this.distributionFulVisable = false;
|
||||
},
|
||||
celDistributionFul() {
|
||||
this.default_checked_mid = [];
|
||||
this.fuloptions = [];
|
||||
this.distributionFulForm = {};
|
||||
this.distributionFulVisable = false;
|
||||
},
|
||||
},
|
||||
created() {
|
||||
this.init();
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style>
|
||||
.search {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
height: 51px;
|
||||
line-height: 51px;
|
||||
}
|
||||
|
||||
.search .column {
|
||||
display: inline-block;
|
||||
margin: 0 auto;
|
||||
margin-right: 2px;
|
||||
line-height: 48px;
|
||||
height: 51px;
|
||||
}
|
||||
</style>
|
@ -0,0 +1,17 @@
|
||||
|
||||
const { defineConfig } = require('@vue/cli-service')
|
||||
module.exports = defineConfig({
|
||||
transpileDependencies: true
|
||||
})
|
||||
|
||||
module.exports = {
|
||||
devServer: {
|
||||
host: "localhost",
|
||||
port: 9292,
|
||||
|
||||
client: {
|
||||
overlay: false
|
||||
}
|
||||
},
|
||||
}
|
||||
|
Loading…
Reference in new issue