Commit f13f920d authored by 夏敏伟's avatar 夏敏伟

首次修改

parent 849c265f
Pipeline #507 canceled with stages
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/logo.png" /> <link rel="icon" type="image/svg+xml" href="/logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>旅馆项目</title> <title>xxx_phaseTwo_web</title>
<style> <style>
html,body{ html,body{
width: 100%; width: 100%;
......
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//获取所有国家
export const getAllCountry = () => {
return request({
url: '/agile/rest/index/api/default/queryNationalityType',
method: 'GET'
});
}
//获取签证类型
export const getAllVisa = () => {
return request({
url: '/agile/rest/index/api/default/queryVisaType',
method: 'GET'
});
}
//获取性别
export const getAllGender = () => {
return request({
url: '/agile/rest/index/api/default/queryGenderType',
method: 'GET'
});
}
//获取外宾证件种类
export const getAllForeignGuest = () => {
return request({
url: '/agile/rest/index/api/default/queryForeignGuestType',
method: 'GET'
});
}
//获取内宾证件种类
export const getAllInternalGuest = () => {
return request({
url: '/agile/rest/index/api/default/queryInternalGuestType',
method: 'GET'
});
}
//获取车牌类型
export const getAllPlateNumber = () => {
return request({
url: '/agile/rest/index/api/default/queryPlateNumberType',
method: 'GET'
});
}
//入境事由
export const getAllReasonEntry = () => {
return request({
url: '/agile/rest/index/api/default/queryReasonEntryType',
method: 'GET'
});
}
//查询省市县
export const getAllProvinciaUrbanAreas = () => {
return request({
url: '/agile/rest/index/api/default/queryProvincialUrbanAreas',
method: 'GET'
});
}
//查询民族
export const getAllNation = () => {
return request({
url: '/agile/rest/index/api/default/queryNationType',
method: 'GET'
});
}
//查询房间类型
export const getAllRoomType = () => {
return request({
url: '/agile/rest/index/api/default/queryRoomType',
method: 'GET'
});
}
//查询所有字典
export const getAllCode = () => {
return request({
url: '/rest/hotel/code/queryList',
method: 'GET'
});
}
//图片上传
export const uploadImg = (data) => {
return request({
url: '/rest/file/upload?bucket=PHOTO',
method: 'POST',
data
});
}
//查看图片路径
export const getImgByUrl = (params) => {
return request({
url: '/rest/file/pathPhoto',
method: 'POST',
params
});
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//获取派出所组织机构
export const getDeptTree = () => {
return request({
url: '/rest/hotel/dept/queryTree',
method: 'GET'
});
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
/**内宾分页查询 */
export const inlandQuery = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/queryListByParams',
method: 'POST',
data
});
}
/**内宾单个查询 */
export const inlandQueryOne = (params) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/queryDomesticGuestDetail',
method: 'GET',
params
});
}
/**内宾登记 */
export const inlandAdd = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/add',
method: 'POST',
data
});
}
/**内宾更新 */
export const inlandEdit = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/updateInfo',
method: 'POST',
data
});
}
/**内宾删除 */
export const inlandDelete = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/bulkRemove',
method: 'POST',
data
});
}
/**内宾离店 */
export const inlandCheckOut = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/departure',
method: 'POST',
data
});
}
// /**内宾个人信息查询 */
// export const inlandOneQuery = params => {
// return request({
// url: '/rest/hotel/domesticGuestCheckIn/departure',
// method: 'GET',
// params
// });
// }
/**字典查询 */
export const inlandGender = params => {
return request({
url: '/agile/rest/index/api/default/queryGenderType',
method: 'GET',
params
});
}
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//新增外宾
export const addForeignGuestCheckIn = (data) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/add',
method: 'POST',
data
});
}
//查询外宾
export const getForeignGuestCheckInList = (data) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/queryListByParams',
method: 'POST',
data
});
}
//外宾离店
export const departureForeignGuestCheckIn = (data) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/departure',
method: 'POST',
data
});
}
//更新外宾
export const updateForeignGuestCheckInList = (data) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/updateInfo',
method: 'POST',
data
});
}
//查询外宾详情
export const queryForeignGuestDetail = (params) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/queryForeignGuestDetail',
method: 'GET',
params
});
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//根据派出所编号查找旅馆
export const queryHotelByDept = (params) => {
return request({
url: '/rest/hotel/hotel/queryList',
method: 'GET',
params
});
}
//根据旅馆编号查找旅馆信息
export const queryHotel = (params) => {
return request({
url: '/rest/hotel/hotel/queryHotelInfo',
method: 'POST',
params
});
}
//修改旅馆基本信息
export const updateHotel = (data) => {
return request({
url: '/rest/hotel/hotel/updateInfo',
method: 'POST',
data
});
}
//多图片上传
export const upLoadArrayImage = (data) => {
return request({
url: "/rest/hotel/hotel/uploadImage",
method: 'POST',
data
})
}
//删除旅馆单图片上传的图片
export const removeArrayImage = (data) => {
return request({
url: "/rest/file/batchRemove",
method: 'POST',
data
})
}
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//查询主页面菜单
export const getTree = (data) => {
return request({
url: '/rest/system/menu/queryTree',
method: "POST",
data
})
};
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
/**恢复内宾 */
export const restoreDomesticGuestsToStay = (data) => {
return request({
url: '/rest/hotel/domesticGuestCheckIn/restoreDomesticGuestsToStay',
method: 'POST',
data
});
}
/**恢复外宾 */
export const restoreForeignGuestsToStay = (data) => {
return request({
url: '/rest/hotel/foreignGuestCheckIn/restoreForeignGuestsToStay',
method: 'POST',
data
});
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//权限查询
export const queryRole = () => {
return request({
url: '/rest/system/role/queryList',
method: 'GET'
})
}
//权限菜单提交
export const grantMenuRole = (data,roleId) => {
return request({
url: '/rest/system/role/grantMenu/'+roleId,
method: 'POST',
data
})
}
//角色新增
export const addRoles = (data) => {
return request({
url: '/rest/system/role/add',
method: 'POST',
data
})
}
//角色编辑
export const updateRoles = (data) => {
return request({
url: '/rest/system/role/updateInfo',
method: 'POST',
data
})
}
//角色删除
export const bulkRemoveRoles = (data) => {
return request({
url: '/rest/system/role/bulkRemove',
method: 'POST',
data
})
}
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//获取所有房间号
export const getAllRoom = params => {
return request({
url: '/rest/hotel/room/queryList',
method: 'GET',
params
});
}
//新增房间号
export const addRooms = data => {
return request({
url: '/rest/hotel/room/batchAddRoom',
method: 'POST',
data
});
}
//预览新增房间号
export const previewRooms = data => {
return request({
url: '/rest/hotel/room/createRooms',
method: 'POST',
data
});
}
//分页查询房间
export const getRooms = data=>{
return request({
url:'/rest/hotel/room/queryListByParams',
method:'POST',
data
})
}
//编辑房间
export const updateRoomsInfo = data=>{
return request({
url:'/rest/hotel/room/updateInfo',
method:'POST',
data
})
}
//删除房间
export const bulkRemoveRooms = data=>{
return request({
url:'/rest/hotel/room/bulkRemove',
method:'POST',
data
})
}
//查询房间状态 上部分
export const queryRoomStatus = params=>{
return request({
url:'/rest/hotel/hotelManger/statistics',
method:'POST',
params
})
}
//查询房间状态 下部分
export const queryStatisticsRoomStatus = params=>{
return request({
url:'/rest/hotel/hotelManger/statisticsRoomStatus',
method:'POST',
params
})
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//入境事由
export const getAllTeam = (params) => {
return request({
url: '/rest/hotel/team/queryList',
method: 'GET',
params
});
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//获取验证码
export const getVerifyCode = (params) => {
return request({
url: "/rest/system/user/verifyCode",
method: "GET",
params,
responseType: 'arraybuffer'
});
};
//查询用户列表
export const getUserList = (data) => {
return request({
url: '/rest/system/user/queryList',
method: "POST",
data
})
}
//用户登录
export const login = (data) => {
return request({
url: '/rest/system/user/login',
method: 'POST',
data
})
}
//用户注册
export const register = (data) => {
return request({
url: '/rest/system/user/add',
method: 'POST',
data
});
}
//修改用户密码
export const editPassword = params => {
return request({
url: "/rest/system/user/updatePassword",
method: 'GET',
params
})
}
//重置密码
export const resetPassword = params => {
return request({
url: "/rest/system/user/resetPassword",
method: 'GET',
params
})
}
//图片上传
export const upLoadImg = (data) => {
return request({
url: "/rest/file/uploadPhoto",
method: 'POST',
data
})
}
//用户新增
export const addPersonnel = (data) => {
return request({
url: "/rest/system/user/add",
method: 'POST',
data
})
}
//用户更新
export const updatePersonnel = (data) => {
return request({
url: "/rest/system/user/updateInfo",
method: 'POST',
data
})
}
//删除用户
export const removePersonnel = (params) => {
return request({
url: "/rest/system/user/remove",
method: 'GET',
params
})
}
\ No newline at end of file
import request from "@/utils/request";
/**
* @param data请求接口传递的参数
* @return {Promise}
*/
//新增访客
export const addVisitorRegist = (data) => {
return request({
url: '/rest/hotel/visitorRegist/add',
method: 'POST',
data
});
}
//查询访客
export const getVisitorList = (data) => {
return request({
url: '/rest/hotel/visitorRegist/queryListByParams',
method: 'POST',
data
});
}
//编辑访客
export const updateVisitorRegist = (data) => {
return request({
url: '/rest/hotel/visitorRegist/updateInfo',
method: 'POST',
data
});
}
//离店访客
export const departureVisitorRegist = (data) => {
return request({
url: '/rest/hotel/visitorRegist/departure',
method: 'POST',
data
});
}
//查询访客详情
export const queryVisitorRegistDetail = (params) => {
return request({
url: '/rest/hotel/visitorRegist/queryVisitorRegistDetail',
method: 'GET',
params
});
}
\ No newline at end of file
...@@ -16,85 +16,18 @@ const router = createRouter({ ...@@ -16,85 +16,18 @@ const router = createRouter({
// createWebHashHistory路由模式路径带#号 // createWebHashHistory路由模式路径带#号
history: createWebHashHistory(), history: createWebHashHistory(),
routes: [{ routes: [{
path: "/login", path: "/login",
name: "login", name: "login",
component: () => import("../views/login/login.vue"), component: () => import("../views/login/login.vue"),
}, },
{ {
path: "/", path: "/",
name: "homepage", name: "homepage",
component: () => import("../views/homePage/homepage.vue"), component: () => import("../views/homePage/homepage.vue"),
redirect: '/inland/inlandAdd', meta: {
meta: { keepAlive: false
keepAlive: false }
}, },
children: [{
path: "/hotel/index",
name: "旅馆概况",
component: () => import("@/views/hotel/index.vue"),
},
{
path: "/inland/inland",
name: "内宾基本情况",
component: () => import("@/views/inland/inland.vue"),
},
{
path: "/inland/inlandAdd",
name: "内宾入住",
component: () => import("@/views/inland/inlandAdd.vue"),
},
{
path: "/abroad/abroad",
name: "外宾基本情况",
component: () => import("@/views/abroad/abroad.vue"),
},
{
path: "/abroad/abroadAdd",
name: "外宾入住",
component: () => import("@/views/abroad/abroadAdd.vue"),
},
{
path: "/room/room",
name: "房号管理",
component: () => import("@/views/room/room.vue"),
},
{
path: "/visitor/visitor",
name: "访客管理",
component: () => import("@/views/visitor/visitor.vue"),
},
{
path: "/visitor/visitorAdd",
name: "访客登记",
component: () => import("@/views/visitor/visitorAdd.vue"),
},
{
path: "/departure/departure",
name: "离店",
component: () => import("@/views/departure/departure.vue"),
},
{
path: "/hotel/hotelEdit",
name: "旅馆基础信息管理",
component: () => import("@/views/hotel/hotelEdit.vue"),
},
{
path: "/restoreCheckIn/restoreCheckIn",
name: "酒店误操作恢复在住",
component: () => import("@/views/restoreCheckIn/restoreCheckIn.vue"),
},
{
path: "/employeeManagement/personnelManagement",
name: "人员管理",
component: () => import("@/views//employeeManagement/personnelManagement.vue"),
},
{
path: "/employeeManagement/rolesManagement",
name: "角色管理",
component: () => import("@/views//employeeManagement/rolesManagement.vue"),
}
]
},
], ],
}); });
// 全局前置守卫 // 全局前置守卫
......
import {
defineStore
} from 'pinia';
export const websocketStore = defineStore('websocket', () => {
const identityInformation = ref({});
return {
identityInformation
}
}, {
persist: true
})
\ No newline at end of file
import {
websocketStore
} from "@/store/websocketStore.js";
const myWebsocketStore = websocketStore();
class initWebsocket {
constructor() {
this.obj = {
certificatecardid: '',
msg: '',
cardinfo: '',
cardName: '',
str: '',
devicetype: '',
statusbar: '',
certificatePhoto: ''
};
this.websocket = null;
}
connect() {
try {
var readyState = new Array("on connection", "Connection established",
"Closing connection", "Close connection");
var host = "ws://127.0.0.1:90/echo/";
this.websocket = new WebSocket(host);
this.websocket.onopen = () => {
this.obj.statusbar = readyState[this.websocket.readyState];
this.websocket.send(18601);
this.websocket.send(18402);
}
this.websocket.onmessage = (event) => {
var str = event.data;
var strsub = str;
//此处要加多种扫描仪
var deviceArr = new Array();
deviceArr[0] = "D300+";
deviceArr[1] = "D800II";
deviceArr[2] = "D120+";
deviceArr[3] = "L1250+";
deviceArr[4] = "L1250";
deviceArr[5] = "B660";
deviceArr[6] = "M110";
deviceArr[7] = "E2000";
deviceArr[8] = "CR620+";
deviceArr[9] = "DSL3100";
deviceArr[10] = "AVA5";
deviceArr[11] = "B6680";
deviceArr[12] = "AW570";
deviceArr[13] = "M1260";
deviceArr[14] = "DSL62";
deviceArr[15] = "U350II";
deviceArr[16] = "L7280+";
deviceArr[17] = "AVA5+";
deviceArr[18] = "D800II+";
deviceArr[19] = "AVA5 Plus";
if (this.IsInArray(deviceArr, str)) {
//此处可更换为自己使用的扫描仪型号
this.obj.devicetype = "scanner";
return;
}
if (strsub != "") {
str = strsub.replace(/\*/g, "\r\n");
this.obj.str = str; //传入textarea中
//console.log('Message state', websocket.readyState);
}
this.tup() //对返回信息进行处理,显示到页面
}
this.websocket.onclose = () => {
this.obj.statusbar = readyState[this.websocket.readyState];
}
setInterval(() => {
this.AutoPhotoAndRecog()
}, 1000);
} catch (exception) {
this.obj.statusbar = "Error";
}
}
//判断字符串是否在数组中方法
IsInArray(arr, val) {
let testStr = ',' + arr.join(",") + ",";
return testStr.indexOf("," + val + ",") != -1;
}
send() {
try {
this.websocket.send("181026150"); //发送护照芯片内容读取设置指令,固定指令,请勿变动
this.websocket.send("1810331"); //设置保存图片类型,18103+31 表示所有图片都保存
this.websocket.send("181041"); //是否识别识读区,请勿变动
this.websocket.send("181061"); //是否返回base64格式图片
this.websocket.send("1810731"); //哪些图片返回base64,默认所有图片都返回
} catch (exception) {
this.obj.msg = "Error sending data";
}
}
AutoPhotoAndRecog() {
var str = this.obj.devicetype;
if (str = "scanner") {
setInterval(() => {
this.getInformation()
}, 2000);
} else {
this.getInformation();
}
}
getInformation() {
if (this.websocket != null) {
this.websocket.send("11112");
}
}
tup() {
var str = this.obj.str;
//字符分割
var seek = str.split("data:image/jpeg;base64,");
var len = seek.length; //没有找到报头 此时会返回原串,长度也为1
if (len > 1) //有证件信息和图像,当只有一张图片的时候,有一个base64的头,会分割成两段,第一段为空,第二段会去掉头的图像base64串
{
var seek0 = seek[0]; //身份信息数据
//alert(seek0);
var strhead = "";
var strChipHead = "";
for (var i = 1; i < len; i++) //头像数据//头像数据 data:image/jpeg;base64,xx.... xx 表示图片的类型 01 为白光,以此类推
{
if (seek[i].length > 2) {
var strType = seek[i][0] + seek[i][1];
seek[i] = seek[i].substr(2);
if (strType == "01") //白光
{
seek[i] = "data:image/jpeg;base64," + seek[i];
} else if (strType == "02") //红外
{
seek[i] = "data:image/jpeg;base64," + seek[i];
} else if (strType == "04") //紫外
{
seek[i] = "data:image/jpeg;base64," + seek[i];
} else if (strType == "08") //版面头像
{
strhead = seek[i];
seek[i] = "data:image/jpeg;base64," + seek[i];
} else if (strType == "16") //芯片头像
{
strChipHead = seek[i];
seek[i] = "data:image/jpeg;base64," + seek[i];
}
}
}
//优先显示芯片头像
let seek1 = null;
if (strChipHead != "") {
seek1 = "data:image/jpeg;base64," + strChipHead;
this.obj.certificatePhoto = seek1;
} else {
seek1 = "data:image/jpeg;base64," + strhead;
}
if (seek0 != "") {
seek0 = seek0.replace(/\*/g, "\r\n");
this.obj.msg = "Receive information:" + seek0;
this.getcardInfo();
}
} else {
//var strsub = str.substr(1);
if (str != "") {
str = str.replace(/\*/g, "\r\n");
this.obj.msg = "Receive information:" + str;
//getcardInfo();
}
}
}
singlerecog() {
var str = this.obj.msg;
if (str == "scanner") {
this.websocket.send("1000" + this.obj.certificateType + "02");
}
this.websocket.send("18201" + this.obj.certificateType);
}
getcardInfo() {
var str = this.obj.msg;
var cardid = str.substring(str.indexOf(":") + 1, str.indexOf("\r\n")); //获取返回信息中的证件类型编号IDCardID
if (cardid == "二代证读卡") {
this.obj.cardinfo = "二代证读芯片";
myWebsocketStore.identityInformation = {};
myWebsocketStore.identityInformation = this.obj;
return;
}
var card1by1;
var cardname;
for (var i = 0; i < 80; i++) {
if (this.obj.certificateType) {
card1by1 = this.obj.certificatecardid;
}
if (card1by1 == cardid) {
cardname = this.obj.cardName;
break;
}
this.obj.msg = "证件类型:" + cardid + "\n" + "证件名称:" + cardname;
myWebsocketStore.identityInformation = this.obj;
return this.obj;
}
}
close() {
// 关闭连接
this.websocket.close()
// 销毁 websocket 实例对象
this.websocket = null;
}
}
export default initWebsocket;
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<a-modal :visible="visible" :title="title" width="60%" @cancel="handleCancel" @ok="handleCancel">
<div class="roleAdd">
<div style="margin: 0px 5px">
<a-form class="form" ref="formRef" :model="formState" :labelCol="{ span: 8 }" :wrapper-col="{ span: 16 }" layout="inline" :rules="rules">
<table class="form-tables">
<tr>
<td colspan="1">
<a-form-item name="name" :label="`角色名称`">
<a-input v-model:value="formState.name" :allowClear="true" placeholder="请输入角色名称" />
</a-form-item>
</td>
<td colspan="1">
<a-form-item name="description" :label="`角色描述`">
<a-input v-model:value="formState.description" :allowClear="true" placeholder="角色描述" />
</a-form-item>
</td>
</tr>
</table>
</a-form>
</div>
<div class="titleBox">
<div style="margin: 0 auto">
<a-space :size="10">
<a-button type="primary" size="large" @click="saveInfo">
<template #icon><file-protect-outlined /></template>保存
</a-button>
<a-button type="primary" size="large" @click="() => formRef.resetFields()" v-if="operateStatus==1">
<template #icon>
<reload-outlined />
</template>清空
</a-button>
</a-space>
</div>
</div>
</div>
</a-modal>
</template>
<script setup>
import { useStore } from '@/store/index.js'
import { message } from 'ant-design-vue';
import { onMounted, reactive } from 'vue';
import { addRoles, updateRoles } from '@/api/role.js';
import { forIn } from "lodash-es";
const props = defineProps({
visible: Boolean,
title: String,
formData: {},
flogStatus: Number
});
const emit = defineEmits(["changeCancel", "changeData"]);
const handleCancel = async () => {
await emit("changeCancel");
};
const userstore = useStore();
const formRef = ref();
const formState = reactive({
name: '',
description: ''
});
const rules = {
name: [
{
required: true,
message: '请输入角色名称'
}
],
description: [
{
required: true,
message: '请输入角色描述'
}
]
};
const roles = ref([]);
const operateStatus = ref(1);
const loading = ref(false);
const saveInfo = () => {
if (operateStatus.value == 1) {
addRoles(formState).then(res => {
if (res.code == '9000') {
message.success('新增成功!');
handleCancel();
emit("changeData");
}
}).catch(error => {
message.error(error.message);
});
} else if (operateStatus.value == 2) {
updateRoles(formState).then(res => {
if (res.code == '9000') {
message.success('编辑成功!');
handleCancel();
emit("changeData");
}
}).catch(error => {
message.error(error.message);
});
}
}
// let socket = null;
// // 提交按钮的点击事件处理函数
// const send = () => {
// // 向服务器发送消息
// socket.emit('send', '')
// }
onMounted(() => {
operateStatus.value = props?.flogStatus;
if (operateStatus.value == 2) {
forIn(props?.formData, (value, key) => (formState[key] = value));
}
// //实例websocket
// socket = io('ws://127.0.0.1:90/echo/');
// // 建立连接的事件
// socket.on('connect', () => console.log('connect: websocket 连接成功!'));
// // 关闭连接的事件
// socket.on('disconnect', () => console.log('disconnect: websocket 连接关闭!'));
// // 接收到消息的事件
// socket.on('message', msg => console.log(msg));
})
// onBeforeUnmount(() => {
// // 关闭连接
// socket.close()
// // 销毁 websocket 实例对象
// socket = null;
// })
</script>
<style lang="less">
.roleAdd {
width: 100%;
height: 100%;
padding: 0px;
margin: 0px;
.form {
.ant-form-item-with-help {
margin-bottom: 0px;
}
.ant-form-item-label {
flex: auto;
}
}
.form-tables {
width: 100%;
border-collapse: collapse;
tr {
width: 100%;
height: 60px;
td {
border: 1px solid #e7e7e7;
max-width: 222px;
.img-wp {
width: 186.829px;
height: 230px;
border: 1px solid #a5a5a5;
.img-div {
border-image-source: radial-gradient(
60% 60%,
transparent 0px,
transparent 100%,
#6691ef 100%
);
border-image-slice: 1;
border-width: 1px;
border-style: solid;
border-image-outset: 0px;
width: calc(100% - 40px);
height: calc(100% - 80px);
margin: 20px;
.img-span {
margin: 23px auto;
width: 14px;
line-height: 35px;
font-weight: 400;
font-size: 15px;
}
}
}
}
}
}
.titleBox {
display: flex;
justify-content: space-between;
align-items: center;
background: #fafafa;
border-radius: 0px 0px 2px 2px;
border: 1px solid #e9e9e9;
padding: 10px;
margin: 25px 5px;
}
.sign {
display: inline-block;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
line-height: 16px;
&::before {
content: "";
display: inline-block;
width: 4px;
height: 12px;
background: #3162f5;
border-radius: 2px;
margin-right: 8px;
}
}
}
</style>
\ No newline at end of file
<template>
<a-drawer v-model:visible="visible" class="custom-class" style="color: red" title="编辑权限" placement="right" @close="handleClose">
<a-tree mode="inline" v-model:checkedKeys="checkedKeys" checkable :tree-data="treeData" :fieldNames="{title:'label',key:'id'}" @check="changeChecked">
<template #label="{ label, id }">
<template>{{ label }}</template>
</template>
</a-tree>
<div style="margin-top:40px;margin-left:40px;">
<a-button type="primary" @click="confirm">
<template #icon>
<edit-filled />
</template>
确定
</a-button>
</div>
</a-drawer>
</template>
<script setup>
import { onMounted } from "vue";
import { forIn } from "lodash-es";
import { grantMenuRole } from '@/api/role.js';
import { message } from "ant-design-vue";
import { treeForeach } from '@/utils/http_util.js';
const props = defineProps({
visible: Boolean,
roleInfo: {},
treeData: []
});
const emit = defineEmits(["changeCancel"]);
const visible = ref(false);
const roleInformation = ref({});
const treeData = ref([]);
const checkedKeys = ref([]);
const showDrawer = () => {
visible.value = true;
};
const handleClose = () => {
emit("changeCancel");
}
const changeChecked = e => {
console.log(e);
}
//权限提交
const confirm = () => {
grantMenuRole(checkedKeys.value, roleInformation.value.id).then(res => {
if (res.code == '9000') {
message.success('权限添加成功!');
}
}).catch(error => {
message.error(error.message);
});
};
onMounted(() => {
visible.value = props.visible;
forIn(props?.roleInfo, (value, key) => { roleInformation.value[key] = value });
treeData.value = props?.treeData;
treeForeach(roleInformation.value.roles, node => {
checkedKeys.value.push(node.id);
})
});
</script>
\ No newline at end of file
<template>
<div class="personnelManagement">
<a-spin :spinning="loading">
<div class="titleBox">
<div>
<span class="sign">人员管理</span>
</div>
</div>
<div style="margin: 0px 25px">
<a-form ref="formRef" name="advanced_search" class="ant-advanced-search-form" :model="formState">
<a-row :gutter="24">
<a-col :span="3">
<a-form-item name="name" label="姓名">
<a-input v-model:value="formState.name" placeholder="请输入用户姓名"></a-input>
</a-form-item>
</a-col>
<a-col :span="3">
<a-form-item name="username" label="账号">
<a-input v-model:value="formState.username" placeholder="请输入用户账号"></a-input>
</a-form-item>
</a-col>
<a-col :span="3">
<a-form-item name="gender" label="性别">
<a-select v-model:value="formState.gender" show-search placeholder="请选择性别" :options="allGender" :filter-option="filterOption" :fieldNames="{value:'code',label:'name'}" :notFoundContent="'暂无数据'"></a-select>
</a-form-item>
</a-col>
<a-col style="text-align: right">
<a-button type="primary" @click="queryUser">
<template #icon>
<SearchOutlined />
</template>查询</a-button>&nbsp;
<a-button type="primary" @click="add">
<template #icon><plus-outlined /></template>新增</a-button>
</a-col>
</a-row>
</a-form>
</div>
<div style="margin: 0px 25px; height: calc(100% - 210px)">
<a-table :columns="columns" :data-source="data" :pagination="false" :scroll="{y:450}"><template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'cz'">
<a-space :size="0">
<a-button type="link" primary size="small" style="color: #52c41a" @click="showInfo(record)">
<template #icon>
<eye-filled />
</template>
查看
</a-button>
<a-button type="link" primary size="small" style="color:#faad14" @click="edit(record)">
<template #icon>
<edit-filled />
</template>
修改
</a-button>
<a-button type="link" primary size="small" style="color: #52c41a" @click="reset(record)">
<template #icon>
<eye-filled />
</template>
重置密码
</a-button>
<a-popconfirm title="删除不可恢复,是否确认?" @confirm="deleteUser(record)">
<a-button type="link" primary size="small" style="color:#ff4d1f">
<template #icon>
<swap-outlined />
</template>
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
</template>
</a-table>
</div>
</a-spin>
</div>
<PersonnelAdd v-if="personnelAddVisible" :flogStatus="operateStatus" :visible="personnelAddVisible" :formData="personnelInfo" @change-Cancel="changeCancelPersonnelAdd" :title="title" :updateUserList="queryUser" />
</template>
<script setup>
import { onMounted, reactive } from "vue";
import { getUserList, removePersonnel, resetPassword } from '@/api/user.js';
import { useStore } from '@/store/index.js';
import { message } from "ant-design-vue";
import PersonnelAdd from '@/views/employeeManagement/components/personnelAdd.vue';
const userstore = useStore();
const allGender = ref(userstore.returnCode(5));
const loading = ref(false);
const formState = reactive({
hotelId: userstore.hotelInfo.hotelId,
username: null,
name: null,
gender: null
});
/**下拉框筛选 */
const filterOption = (input, option) => {
return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
const personnelAddVisible = ref(false);
const operateStatus = ref(1);
const personnelInfo = ref({});
const title = ref('');
const changeCancelPersonnelAdd = () => {
personnelAddVisible.value = false;
}
const data = ref([]);
//查询用户
const queryUser = () => {
loading.value = true;
getUserList(formState).then(res => {
if (res.code == '9000') {
data.value = [];
res.data.forEach((item, index) => {
item['index'] = index + 1;
item['key'] = item.id;
data.value.push(item);
});
loading.value = false;
}
}).catch(error => {
message.error(error.message);
})
}
const columns = [
{
title: "序号",
dataIndex: "index",
},
{
title: "姓名",
dataIndex: "nickname",
},
{
title: "联系方式",
dataIndex: "phone",
},
{
title: "身份证号",
dataIndex: "identityCard",
},
{
title: "车牌号",
dataIndex: "licensePlate",
},
{
title: "操作",
dataIndex: "cz",
fixed: "right",
width: 350
}
];
//查看详情
const showInfo = (record) => {
personnelInfo.value = record;
operateStatus.value = 2;
personnelAddVisible.value = true;
title.value = '查看用户';
}
//新增
const add = () => {
personnelInfo.value = [];
operateStatus.value = 1;
personnelAddVisible.value = true;
title.value = '新增用户';
}
//编辑详情
const edit = (record) => {
personnelInfo.value = record;
operateStatus.value = 3;
personnelAddVisible.value = true;
title.value = '编辑用户';
}
//删除用户
const deleteUser = record => {
removePersonnel({ userId: record.id }).then(res => {
if (res.code == '9000') {
message.success('删除成功!');
queryUser();
}
}).catch(error => {
message.error(error.message);
});
}
const reset = record=> {
resetPassword({username: record.username, hotelId: userstore.hotelInfo.hotelId}).then(res => {
message.success('重置成功:' + res);
}).catch(error => {
message.error(error.message);
});
}
onMounted(() => {
queryUser();
})
</script>
<style lang="less">
.personnelManagement {
width: 100%;
height: 100%;
padding: 0%;
margin: 0px;
.titleBox {
display: flex;
justify-content: space-between;
align-items: center;
background: #fafafa;
border-radius: 0px 0px 2px 2px;
border: 1px solid #e9e9e9;
padding: 10px;
margin: 25px 5px;
}
.sign {
display: inline-block;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
line-height: 16px;
&::before {
content: "";
display: inline-block;
width: 4px;
height: 12px;
background: #3162f5;
border-radius: 2px;
margin-right: 8px;
}
}
}
</style>
<template>
<div class="rolesManagement">
<a-spin :spinning="loading">
<div class="titleBox">
<div>
<span class="sign">角色管理</span>
</div>
</div>
<div style="margin: 0px 25px 20px 25px">
<a-button type="primary" @click="queryRoleList">
<template #icon>
<SearchOutlined />
</template>查询</a-button>&nbsp;
<a-button type="primary" @click="addRoles">
<template #icon><plus-outlined /></template>新增</a-button>
</div>
<div style="margin: 0px 25px; height: calc(100% - 210px)">
<a-table :columns="columns" :data-source="data" :pagination="false" :scroll="{y:450}"><template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'cz'">
<a-space :size="0">
<a-button type="link" primary size="small" style="color:#faad14" @click="edit(record)">
<template #icon>
<edit-filled />
</template>
修改
</a-button>
<a-popconfirm title="删除不可恢复,是否确认?" @confirm="deleteRole(record)">
<a-button type="link" primary size="small" style="color:#ff4d1f;">
<template #icon>
<swap-outlined />
</template>
删除
</a-button>
</a-popconfirm>
<a-button type="link" primary size="small" style="color: #52c41a;" @click="changeRole(record)">
<template #icon>
<edit-filled />
</template>
权限
</a-button>
</a-space>
</template>
</template>
</a-table>
</div>
</a-spin>
<RolePermissionDrawer v-if="drawerVisible" :visible="drawerVisible" :roleInfo="roleInfo" @change-Cancel="changeCancelRole" :treeData="treeData" />
<RoleAdd v-if="roleAddVisible" :flogStatus="operateStatus" :visible="roleAddVisible" :formData="roleData" @change-Cancel="changeCancelRoleAdd" :title="title" @changeData="queryRoleList" />
</div>
</template>
<script setup>
import { onMounted, reactive } from "vue";
import { queryRole, bulkRemoveRoles } from '@/api/role.js';
import { useStore } from '@/store/index.js';
import { getTree } from '@/api/menu.js';
import { message } from "ant-design-vue";
import RolePermissionDrawer from '@/views/employeeManagement/components/rolePermissionDrawer.vue';
import RoleAdd from '@/views/employeeManagement/components/roleAdd.vue';
const userstore = useStore();
const loading = ref(false);
const data = ref([]);
const roleAddVisible = ref(false);
const operateStatus = ref(1);//1为新增 2为编辑
const roleData = ref({});
const title = ref('角色新增');
//查询用户
const queryRoleList = () => {
loading.value = true;
queryRole().then(res => {
if (res.code == '9000') {
data.value = res.data;
loading.value = false;
}
}).catch(error => {
message.error(error.message);
loading.value = false;
})
}
const columns = [
{
title: "角色名称",
dataIndex: "name",
},
{
title: "创建时间",
dataIndex: "createTime",
},
{
title: "描述",
dataIndex: "description",
},
{
title: "操作",
dataIndex: "cz",
fixed: "right",
width: 300
},
];
const changeCancelRoleAdd = () => {
roleAddVisible.value = false;
}
//编辑详情
const edit = (record) => {
roleData.value = record;
operateStatus.value = 2;
title.value = '角色编辑!';
roleAddVisible.value = true;
}
//新增角色
const addRoles = () => {
operateStatus.value = 1;
title.value = '角色新增!';
roleAddVisible.value = true;
}
//删除
const deleteRole = record => {
bulkRemoveRoles([record.id]).then(res => {
if (res.code == '9000') {
message.success('删除成功!');
queryRoleList();
}
}).catch(error=>{
message.error(error.message);
});
}
//权限
const drawerVisible = ref(false);
const roleInfo = ref({});
const treeData = ref([]);
const changeRole = async record => {
getTree({ type: 'ROLE', value: record.id }).then(res => {
if (res.code == '9000') {
roleInfo.value = record;
roleInfo.value['roles'] = res.data;
drawerVisible.value = true;
}
});
}
const changeCancelRole = () => {
drawerVisible.value = false;
}
const defaultRoleMenu = (paramas, type) => {
}
onMounted(() => {
queryRoleList();
getTree({ type: 'USER', value: '1' }).then(res => {
if (res.code == '9000') {
treeData.value = res.data;
}
}).catch(error => {
console.log(error);
});
})
</script>
<style lang="less">
.rolesManagement {
width: 100%;
height: 100%;
padding: 0%;
margin: 0px;
.titleBox {
display: flex;
justify-content: space-between;
align-items: center;
background: #fafafa;
border-radius: 0px 0px 2px 2px;
border: 1px solid #e9e9e9;
padding: 10px;
margin: 25px 5px;
}
.sign {
display: inline-block;
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: rgba(0, 0, 0, 0.85);
line-height: 16px;
&::before {
content: "";
display: inline-block;
width: 4px;
height: 12px;
background: #3162f5;
border-radius: 2px;
margin-right: 8px;
}
}
}
</style>
<template>
<a-modal class="handleForm" :visible="visible" :title="title" :width="600" :bodyStyle="{ padding: '16px 24px' }" @ok="handleOk" @cancel="handleCancel">
<a-form class="form" ref="formRef" :model="formState" :labelCol="{ span: 5 }" :wrapper-col="{ span: 19 }">
<a-form-item name="pass" :label="`旅馆代码`" :rules="{
required: true,
message: '请输入旅馆代码',
}">
<a-input v-model:value="formState.pass" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass" :label="`旅馆名称`" :rules="{
required: true,
message: '请输入旅馆名称',
}">
<a-input v-model:value="formState.pass" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass" :label="`旅馆招牌名称`" :rules="{
required: true,
message: '请输入旅馆招牌名称',
}">
<a-input v-model:value="formState.pass" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass" :label="`旅馆负责人`" :rules="{
required: true,
message: '请输入旅馆负责人',
}">
<a-input v-model:value="formState.pass" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass1" :label="`联系电话`" :rules="{
required: true,
}">
<a-input v-model:value="formState.pass1" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass" :label="`地址`" :rules="{
required: true,
message: '请输入地址',
}">
<a-textarea v-model:value="formState.pass" placeholder="请输入" />
</a-form-item>
<a-form-item name="pass" :label="`相关证书`">
<a-upload v-model:file-list="fileList1" list-type="picture-card" @preview="handlePreview" :before-upload="beforeUpload" accept=".jpg, .jpeg, .png">
<div v-if="fileList1.length < 1">
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</a-upload>
</a-form-item>
<a-form-item name="pass" :label="`旅馆平面图`">
<a-upload v-model:file-list="fileList" list-type="picture-card" @preview="handlePreview" :before-upload="beforeUpload" :multiple="true" accept=".jpg, .jpeg, .png">
<div>
<plus-outlined />
<div style="margin-top: 8px">Upload</div>
</div>
</a-upload>
</a-form-item>
</a-form>
</a-modal>
</template>
<script setup>
import { reactive, ref, defineProps, onMounted } from "vue";
import { PlusOutlined } from "@ant-design/icons-vue";
const props = defineProps({
visible: Boolean,
title: String,
edits: Boolean,
});
const fileList = ref([]);
const fileList1 = ref([]);
const previewVisible = ref(false);
const previewImage = ref("");
const previewTitle = ref("");
const formState = reactive({
pass: "",
pass1: "",
});
const emit = defineEmits(["handleSubmit", "changeform", "previewImage"]);
const formRef = ref();
// 提交事件
const handleOk = async () => {
formRef.value?.validateFields().then(async (values) => {
await emit("handleSubmit", values);
});
};
function getBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
});
}
const handlePreview = async (file) => {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj);
}
previewImage.value = file.url || file.preview;
previewVisible.value = true;
previewTitle.value =
file.name || file.url.substring(file.url.lastIndexOf("/") + 1);
await emit("previewImage", {
previewVisibles: previewVisible.value,
previewImages: previewImage.value,
previewTitles: previewTitle.value,
});
};
const beforeUpload = (file) => {
return false;
};
const checkePhonenumber = (rule, value) => {
if (value) {
const reg = /^1[3456789]\d{9}$/;
if (!reg.test(value)) {
return Promise.reject("请输入正确的手机号格式");
} else {
return Promise.resolve();
}
} else {
return Promise.reject("请输入联系电话");
}
};
// 关闭弹框事件
const handleCancel = async () => {
await emit("changeform", false);
};
onMounted(() => {
if (!props.edits) {
formState.pass = 1;
}
});
</script>
<style lang="less" scoped>
.handleForm {
:deep(.ant-modal-content .ant-modal-close-x) {
width: 49px;
height: 49px;
line-height: 49px;
}
:deep(.ant-modal-content .ant-modal-body) {
padding-block: 16px;
}
.form {
:deep(.ant-form-item-with-help) {
margin-bottom: -16px;
}
:deep(.ant-input-number, .ant-picker) {
width: 100%;
}
:deep(.ant-form-item) {
margin-right: 0;
margin-bottom: 10px;
}
}
.dropPoint {
display: flex;
justify-content: space-between;
align-items: center;
> .ant-input {
flex: 1;
margin-right: 10px;
}
}
}
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<template>
<div class="login">
<div class="login-content">
<h2>旅馆业治安管理信息系统</h2>
<a-form ref="formRef" :model="formState" :rules="rules">
<a-form-item name="department">
<a-tree-select v-model:value="formState.department" v-model:searchValue="searchValue" show-search style="width: 100%" :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="请选择派出所" allow-clear tree-default-expand-all :tree-data="treeData" tree-node-filter-prop="label">
<template #title="{ value: val, label }">
<b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
<template v-else>
<template v-for="(fragment, i) in label.toString().split(new RegExp(`(?<=${searchValue})|(?=${searchValue})`, 'i'))">
<span v-if="fragment.toLowerCase() === searchValue.toLowerCase()" :key="i" style="color: #08c">
{{ fragment }}
</span>
<template v-else>{{ fragment }}</template>
</template>
</template>
</template>
</a-tree-select>
</a-form-item>
<a-form-item name="hotel">
<a-spin :spinning="loading">
<a-select v-model:value="formState.hotel" show-search placeholder="请选择旅馆" :options="hotelList" :filter-option="filterOption" @change="handleChange" :fieldNames="{value:'id',label:'name'}" :notFoundContent="'暂无数据'"></a-select>
</a-spin>
</a-form-item>
<a-form-item ref="username" name="username">
<a-input v-model:value="formState.username" placeholder="请输入您的用户名">
<template #prefix>
<UserOutlined />
</template>
</a-input>
</a-form-item>
<a-form-item ref="password" name="password">
<a-input-password v-model:value="formState.password" placeholder="请输入您的密码">
<template #prefix>
<LockOutlined />
</template>
</a-input-password>
</a-form-item>
<a-form-item ref="code" name="code">
<a-input v-model:value="formState.code" placeholder="验证码" style="width:200px;">
<template #prefix>
<KeyOutlined />
</template>
</a-input>
<img :src="formState.imgCode" alt="" style="width:100px;height:30px;margin-left:2px;margin-top: -2px;margin-right: 10px;">
<a-button type="primary" class="login-button" @click="getVerifyCodeFn" style="position:relative;top:0px;">
<template #icon>
<ReloadOutlined />
</template>
</a-button>
</a-form-item>
<a-form-item>
<a-button class="login-button" type="primary" block @click="onSubmit">登录</a-button>
</a-form-item>
<a-form-item>
<a-button class="login-button" type="primary" block @click="onRegister">单位注册</a-button>
</a-form-item>
</a-form>
</div>
<registerModal ref="register" />
</div>
</template>
<script setup>
import router from '../../router/index.js';
import registerModal from '../login/register.vue';
import { getVerifyCode, getUserList, login, } from '../../api/user';
import { getDeptTree } from '../../api/dept';
import { queryHotelByDept } from '../../api/hotel';
import { onMounted } from 'vue';
import { message } from 'ant-design-vue';
import { useStore } from '@/store/index.js'
const userStore = useStore();
const formRef = ref();
const treeData = ref([]);
const searchValue = ref('');
const loading = ref(false);
const register = ref();
const hotelAdress = ref('');
const formState = reactive({
department: undefined,
hotel: undefined,
username: '',
password: '',
imgCode: ''
});
const checkKey1 = ref();
const rules = {
username: [
{
required: true,
message: '请输入您的真实用户信息',
trigger: 'blur',
},
{
min: 2,
max: 10,
message: '用户名长度为 2 到 10',
trigger: 'blur',
},
],
password: [
{
required: true,
message: '请输入正确的密码',
trigger: 'blur',
}
],
department: [
{
required: true,
message: '请选择派出所',
trigger: 'change',
},
],
hotel: [
{
required: true,
message: '请选择旅馆',
trigger: 'change',
},
],
};
const hotelList = ref([]);
const onSubmit = () => {
const param = {
// "hotelId": "1",
"hotelId": formState.hotel,
"passwordBase64": btoa(formState.password),
"username": formState.username,
"verifyCode": formState.code,
"checkKey": checkKey1.value,
"address": hotelAdress.value
};
userStore.getUserInfo(param);
getVerifyCodeFn();
//表单验证 ---- 暂时封闭
// formRef.value
// .validate()
// .then(() => {
// console.log('values', formState, toRaw(formState));
// })
// .catch(error => {
// console.log('error', error);
// });
};
const onRegister = () => {
register.value.showModal();
};
const resetForm = () => {
formRef.value.resetFields();
};
//获取验证码
const getVerifyCodeFn = () => {
checkKey1.value = new Date().getTime();
getVerifyCode({ checkKey: checkKey1.value }).then(res => {
let blob = new Blob([res], { type: "image/png" });
let imageUrl = (window.URL || window.webkitURL).createObjectURL(blob)
formState.imgCode = imageUrl || '';
});
}
//获取派出所组织机构树
const getDeptTreeFn = () => {
getDeptTree().then(res => {
treeData.value = res.data;
}).catch(err => {
message.error(err.message);
});
}
//监听派出所部门变化
watch(() => formState.department, (newVal, oldVal) => {
formState.hotel = undefined;
loading.value = true;
queryHotelByDept({ 'deptid': formState.department }).then(res => {
hotelList.value = res.data;
loading.value = false;
}).catch(res => {
loading.value = false;
});
});
const handleChange = (value, options) => {
hotelAdress.value = options.address;
};
const filterOption = (input, option) => {
return option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0;
};
//获取验证码
onMounted(() => {
//获取派出所组织机构树
getDeptTreeFn();
//首次获取验证码
getVerifyCodeFn();
})
</script>
<style lang="less" scoped>
.login {
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
background-color: rgb(41, 23, 91);
.login-content {
width: 500px;
height: 600px;
margin-top: 13%;
h2 {
padding: 20px 0px;
text-align: center;
color: white;
}
.login-button {
background-color: rgb(41, 23, 91);
border: 1px solid white;
box-shadow: 0px 0px 1px 1px #ddddddb3;
&:hover,
&:focus,
&:visited {
background-color: #26184b;
border: 1px solid #26184b;
}
}
}
}
</style>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -47,7 +47,7 @@ export default defineConfig({ ...@@ -47,7 +47,7 @@ export default defineConfig({
proxy: { proxy: {
//拦截请求地址包含/api,匹配到的是生产环境 //拦截请求地址包含/api,匹配到的是生产环境
"/api": { "/api": {
target: "http://172.16.60.201:8081", //后台服务地址 target: "http://192.168.168.107:8081", //后台服务地址
changeOrigin: true, changeOrigin: true,
//重写,/api开头的替换成空字符串,即去掉接口中去掉这个字符串 //重写,/api开头的替换成空字符串,即去掉接口中去掉这个字符串
rewrite: (path) => path.replace(/^\/api/, "") rewrite: (path) => path.replace(/^\/api/, "")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment