Commit 9aa070f4 authored by 拾柒's avatar 拾柒

Merge branch 'dev-sunyu'

parents f413bd43 2951a6d9
...@@ -6,42 +6,29 @@ ...@@ -6,42 +6,29 @@
@select="handleSelect" @select="handleSelect"
style="margin-right: 120px" style="margin-right: 120px"
> >
<template> <template v-for="(item, index) in newTopNev">
<el-menu-item class="menuStyle" <el-menu-item class="menuStyle" style="font-size: small;background-color: #F6F6FA;border-top-right-radius: 15px;border-top-left-radius: 15px;text-align: center;margin-left: 1px" :index="item.path" :key="index"
style="font-size: small;background-color: #F6F6FA;border-top-right-radius: 15px;border-top-left-radius: 15px;text-align: center;margin-left: 1px" index="/monitoring/video"
> >
<i style="width: 10px;height: 10px;margin-top: -12px"></i> <i :class="item.icon" style="width: 10px;height: 10px;margin-top: -12px"></i>
首页</el-menu-item {{ item.name }}</el-menu-item
>
<el-menu-item class="menuStyle"
style="font-size: small;background-color: #F6F6FA;border-top-right-radius: 15px;border-top-left-radius: 15px;text-align: center;margin-left: 1px" index="/employee/employee"
>
<i style="width: 10px;height: 10px;margin-top: -12px"></i>
员工信息</el-menu-item
>
<el-menu-item class="menuStyle"
style="font-size: small;background-color: #F6F6FA;border-top-right-radius: 15px;border-top-left-radius: 15px;text-align: center;margin-left: 1px" index="/monitoringhistory/history"
>
<i style="width: 10px;height: 10px;margin-top: -12px"></i>
历史记录</el-menu-item
> >
</template> </template>
<!-- 顶部菜单超出数量折叠 --> <!-- 顶部菜单超出数量折叠 -->
<!-- <el-submenu :style="{'&#45;&#45;theme': theme}" index="more" v-if="topMenus.length > visibleNumber">--> <!-- <el-submenu :style="{'&#45;&#45;theme': theme}" index="more" v-if="topMenus.length > visibleNumber">-->
<!-- <template slot="title">更多菜单</template>--> <!-- <template slot="title">更多菜单</template>-->
<!-- <template v-for="(item, index) in topMenus">--> <!-- <template v-for="(item, index) in topMenus">-->
<!-- <el-menu-item--> <!-- <el-menu-item-->
<!-- :index="item.path"--> <!-- :index="item.path"-->
<!-- :key="index"--> <!-- :key="index"-->
<!-- v-if="index >= visibleNumber">--> <!-- v-if="index >= visibleNumber">-->
<!-- <svg-icon--> <!-- <svg-icon-->
<!-- v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"--> <!-- v-if="item.meta && item.meta.icon && item.meta.icon !== '#'"-->
<!-- :icon-class="item.meta.icon"/>--> <!-- :icon-class="item.meta.icon"/>-->
<!-- {{ item.meta.title }}--> <!-- {{ item.meta.title }}-->
<!-- </el-menu-item>--> <!-- </el-menu-item>-->
<!-- </template>--> <!-- </template>-->
<!-- </el-submenu>--> <!-- </el-submenu>-->
</el-menu> </el-menu>
</template> </template>
......
import Vue from 'vue' import Vue from "vue";
import Router from 'vue-router' import Router from "vue-router";
Vue.use(Router) Vue.use(Router);
/* Layout */ /* Layout */
import Layout from '@/layout' import Layout from "@/layout";
/** /**
* Note: 路由配置项 * Note: 路由配置项
...@@ -31,213 +31,210 @@ import Layout from '@/layout' ...@@ -31,213 +31,210 @@ import Layout from '@/layout'
// 公共路由 // 公共路由
export const constantRoutes = [ export const constantRoutes = [
{ {
path: '/redirect', path: "/redirect",
component: Layout, component: Layout,
hidden: true, hidden: true,
children: [ children: [
{ {
path: '/redirect/:path(.*)', path: "/redirect/:path(.*)",
component: () => import('@/views/redirect') component: () => import("@/views/redirect"),
} },
] ],
}, },
{ {
path: '/login', path: "/login",
component: () => import('@/views/login'), component: () => import("@/views/login"),
hidden: true hidden: true,
}, },
{ {
path: '/register', path: "/register",
component: () => import('@/views/register'), component: () => import("@/views/register"),
hidden: true hidden: true,
}, },
{ {
path: '/404', path: "/404",
component: () => import('@/views/error/404'), component: () => import("@/views/error/404"),
hidden: true hidden: true,
}, },
{ {
path: '/401', path: "/401",
component: () => import('@/views/error/401'), component: () => import("@/views/error/401"),
hidden: true hidden: true,
}, },
{ {
path: '', path: "",
component: Layout, component: Layout,
redirect: 'index', redirect: "index",
children: [ children: [
{ {
path: 'index', path: "index",
component: () => import('@/views/video/index'), component: () => import("@/views/video/index"),
name: 'Index', name: "Index",
meta: { title: '首页', icon: 'dashboard', affix: true } meta: { title: "首页", icon: "dashboard", affix: true },
} },
] ],
}, },
{ {
path: '/user', path: "/user",
component: Layout, component: Layout,
hidden: true, hidden: true,
redirect: 'noredirect', redirect: "noredirect",
children: [ children: [
{ {
path: 'profile', path: "profile",
component: () => import('@/views/system/user/profile/index'), component: () => import("@/views/system/user/profile/index"),
name: 'Profile', name: "Profile",
meta: { title: '个人中心', icon: 'user' } meta: { title: "个人中心", icon: "user" },
} },
],
]
}, },
{ {
path: '/monitoring', path: "/monitoring",
component: Layout, component: Layout,
hidden: false, hidden: false,
redirect: '/monitoring/video', redirect: "/monitoring/video",
children: [ children: [
{ {
path: 'video', path: "video",
component: () => import('@/views/video/index'), component: () => import("@/views/video/index"),
name: 'Video', name: "Video",
meta: { title: '视频监控', icon: 'user' } meta: { title: "视频监控", icon: "user" },
} },
] ],
}, },
{ {
path: '/monitoringPlayback', path: "/monitoringPlayback",
component: Layout, component: Layout,
hidden: false, hidden: false,
redirect: 'monitoringPlayback/playback', redirect: "monitoringPlayback/playback",
children: [ children: [
{ {
path: 'playback', path: "playback",
component: () => import('@/views/video/playback'), component: () => import("@/views/video/playback"),
name: 'Playback', name: "Playback",
meta: { title: '视频回放', icon: 'user' } meta: { title: "视频回放", icon: "user" },
} },
] ],
}, },
{ {
path: '/monitoringhistory', path: "/monitoringhistory",
component: Layout, component: Layout,
hidden: false, hidden: false,
redirect: 'monitoringhistory/history', redirect: "monitoringhistory/history",
children: [ children: [
{ {
path: 'history', path: "history",
component: () => import('@/views/history/index'), component: () => import("@/views/history/index"),
name: 'History', name: "History",
meta: { title: '历史记录', icon: 'user' } meta: { title: "历史记录", icon: "user" },
} },
] ],
}, },
{ {
path: '/employee', path: "/employee",
component: Layout, component: Layout,
hidden: false, hidden: false,
redirect: 'employee', redirect: "employee",
children: [ children: [
{ {
path: 'employee', path: "employee",
component: () => import('@/views/employee/index'), component: () => import("@/views/employee/index"),
name: 'employee', name: "employee",
meta: { title: '员工信息', icon: 'user' } meta: { title: "员工信息", icon: "user" },
} },
] ],
} },
];
]
// 动态路由,基于用户权限动态去加载 // 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [ export const dynamicRoutes = [
{ {
path: '/system/user-auth', path: "/system/user-auth",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:user:edit'], permissions: ["system:user:edit"],
children: [ children: [
{ {
path: 'role/:userId(\\d+)', path: "role/:userId(\\d+)",
component: () => import('@/views/system/user/authRole'), component: () => import("@/views/system/user/authRole"),
name: 'AuthRole', name: "AuthRole",
meta: { title: '分配角色', activeMenu: '/system/user' } meta: { title: "分配角色", activeMenu: "/system/user" },
} },
] ],
}, },
{ {
path: '/system/role-auth', path: "/system/role-auth",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:role:edit'], permissions: ["system:role:edit"],
children: [ children: [
{ {
path: 'user/:roleId(\\d+)', path: "user/:roleId(\\d+)",
component: () => import('@/views/system/role/authUser'), component: () => import("@/views/system/role/authUser"),
name: 'AuthUser', name: "AuthUser",
meta: { title: '分配用户', activeMenu: '/system/role' } meta: { title: "分配用户", activeMenu: "/system/role" },
} },
] ],
}, },
{ {
path: '/system/dict-data', path: "/system/dict-data",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['system:dict:list'], permissions: ["system:dict:list"],
children: [ children: [
{ {
path: 'index/:dictId(\\d+)', path: "index/:dictId(\\d+)",
component: () => import('@/views/system/dict/data'), component: () => import("@/views/system/dict/data"),
name: 'Data', name: "Data",
meta: { title: '字典数据', activeMenu: '/system/dict' } meta: { title: "字典数据", activeMenu: "/system/dict" },
} },
] ],
}, },
{ {
path: '/monitor/job-log', path: "/monitor/job-log",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['monitor:job:list'], permissions: ["monitor:job:list"],
children: [ children: [
{ {
path: 'index/:jobId(\\d+)', path: "index/:jobId(\\d+)",
component: () => import('@/views/monitor/job/log'), component: () => import("@/views/monitor/job/log"),
name: 'JobLog', name: "JobLog",
meta: { title: '调度日志', activeMenu: '/monitor/job' } meta: { title: "调度日志", activeMenu: "/monitor/job" },
} },
] ],
}, },
{ {
path: '/tool/gen-edit', path: "/tool/gen-edit",
component: Layout, component: Layout,
hidden: true, hidden: true,
permissions: ['tool:gen:edit'], permissions: ["tool:gen:edit"],
children: [ children: [
{ {
path: 'index/:tableId(\\d+)', path: "index/:tableId(\\d+)",
component: () => import('@/views/tool/gen/editTable'), component: () => import("@/views/tool/gen/editTable"),
name: 'GenEdit', name: "GenEdit",
meta: { title: '修改生成配置', activeMenu: '/tool/gen' } meta: { title: "修改生成配置", activeMenu: "/tool/gen" },
} },
] ],
} },
] ];
// 防止连续点击多次路由报错 // 防止连续点击多次路由报错
let routerPush = Router.prototype.push; let routerPush = Router.prototype.push;
let routerReplace = Router.prototype.replace; let routerReplace = Router.prototype.replace;
// push // push
Router.prototype.push = function push(location) { Router.prototype.push = function push(location) {
return routerPush.call(this, location).catch(err => err) return routerPush.call(this, location).catch((err) => err);
} };
// replace // replace
Router.prototype.replace = function push(location) { Router.prototype.replace = function push(location) {
return routerReplace.call(this, location).catch(err => err) return routerReplace.call(this, location).catch((err) => err);
} };
export default new Router({ export default new Router({
mode: 'history', // 去掉url中的# mode: "history", // 去掉url中的#
scrollBehavior: () => ({ y: 0 }), scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes routes: constantRoutes,
}) });
...@@ -124,29 +124,36 @@ service.interceptors.response.use(res => { ...@@ -124,29 +124,36 @@ service.interceptors.response.use(res => {
// 通用下载方法 // 通用下载方法
export function download(url, params, filename, config) { export function download(url, params, filename, config) {
downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) downloadLoadingInstance = Loading.service({
text: "正在下载数据,请稍候",
spinner: "el-icon-loading",
background: "rgba(0, 0, 0, 0.7)"
});
return service.post(url, params, { return service.post(url, params, {
transformRequest: [(params) => { return tansParams(params) }], transformRequest: [function (data) {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, return JSON.stringify(data); // 将参数转换为 JSON 字符串
}],
headers: { 'Content-Type': 'application/json' }, // 设置 Content-Type 为 application/json
responseType: 'blob', responseType: 'blob',
...config ...config
}).then(async (data) => { }).then(async (data) => {
const isBlob = blobValidate(data); const isBlob = blobValidate(data);
if (isBlob) { if (isBlob) {
const blob = new Blob([data]) const blob = new Blob([data]);
saveAs(blob, filename) saveAs(blob, filename);
} else { } else {
const resText = await data.text(); const resText = await data.text();
const rspObj = JSON.parse(resText); const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
Message.error(errMsg); Message.error(errMsg);
} }
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}).catch((r) => { }).catch((error) => {
console.error(r) console.error(error);
Message.error('下载文件出现错误,请联系管理员!') Message.error('下载文件出现错误,请联系管理员!');
downloadLoadingInstance.close(); downloadLoadingInstance.close();
}) });
} }
export default service export default service
...@@ -43,15 +43,34 @@ ...@@ -43,15 +43,34 @@
<!-- @keyup.enter.native="handleQuery"--> <!-- @keyup.enter.native="handleQuery"-->
<!-- />--> <!-- />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<el-form-item prop="userName">
<el-input
v-model="queryParams.userName"
placeholder="请输入账号"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item prop="nickName">
<el-input
v-model="queryParams.nickName"
placeholder="请输入员工姓名"
clearable
style="width: 200px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item prop="phonenumber"> <el-form-item prop="phonenumber">
<el-input <el-input
v-model="queryParams.phonenumber" v-model="queryParams.phonenumber"
placeholder="请输入账号/员工姓名/手机号码" placeholder="请输入手机号码"
clearable clearable
style="width: 240px" style="width: 200px"
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item prop="status"> <el-form-item prop="status">
<el-select <el-select
v-model="queryParams.status" v-model="queryParams.status"
...@@ -81,7 +100,7 @@ ...@@ -81,7 +100,7 @@
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="2"> <el-col :span="1.5">
<el-button <el-button
style="background-color: #0D8EEE; color: #F6F6FA" style="background-color: #0D8EEE; color: #F6F6FA"
plain plain
...@@ -90,7 +109,7 @@ ...@@ -90,7 +109,7 @@
@click="handleAdd" @click="handleAdd"
>新增人员</el-button> >新增人员</el-button>
</el-col> </el-col>
<el-col :span="2"> <el-col :span="1.5">
<el-button <el-button
plain plain
icon="el-icon-top-right" icon="el-icon-top-right"
...@@ -98,7 +117,7 @@ ...@@ -98,7 +117,7 @@
@click="handleSelectAll" @click="handleSelectAll"
>选择全部</el-button> >选择全部</el-button>
</el-col> </el-col>
<el-col :span="2"> <el-col :span="1.5">
<el-button <el-button
plain plain
icon="el-icon-top-left" icon="el-icon-top-left"
...@@ -115,7 +134,7 @@ ...@@ -115,7 +134,7 @@
@click="handleImport" @click="handleImport"
>批量导入</el-button> >批量导入</el-button>
</el-col> --> </el-col> -->
<el-col :span="2"> <el-col :span="1.5">
<el-button <el-button
plain plain
icon="el-icon-download" icon="el-icon-download"
...@@ -123,10 +142,10 @@ ...@@ -123,10 +142,10 @@
@click="handleExport" @click="handleExport"
>批量导出</el-button> >批量导出</el-button>
</el-col> </el-col>
<el-col :span="14" class="text-right"> <el-col :span="17" class="text-right">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
</el-col> </el-col>
<el-col :span="2" class="text-right"> <el-col :span="1" class="text-right">
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-col> </el-col>
<!-- <!--
...@@ -141,7 +160,7 @@ ...@@ -141,7 +160,7 @@
<el-table-column label="员工姓名" align="center" key="nickName" prop="nickName" width="190" v-if="columns[2].visible" :show-overflow-tooltip="true" /> <el-table-column label="员工姓名" align="center" key="nickName" prop="nickName" width="190" v-if="columns[2].visible" :show-overflow-tooltip="true" />
<!-- <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />--> <!-- <el-table-column label="部门" align="center" key="deptName" prop="dept.deptName" v-if="columns[3].visible" :show-overflow-tooltip="true" />-->
<el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" width="190" v-if="columns[4].visible" /> <el-table-column label="手机号码" align="center" key="phonenumber" prop="phonenumber" width="190" v-if="columns[4].visible" />
<el-table-column label="权重" align="center" key="weightNum" prop="weightNum" width="190" v-if="columns[8].visible" /> <el-table-column label="权重" align="center" key="weightNum" prop="weightNum" width="150" v-if="columns[8].visible" />
<el-table-column label="创建人" align="center" key="createBy" prop="createBy" width="190" v-if="columns[7].visible" /> <el-table-column label="创建人" align="center" key="createBy" prop="createBy" width="190" v-if="columns[7].visible" />
<el-table-column label="创建时间" align="center" key="createTime" prop="createTime" width="190" v-if="columns[6].visible" > <el-table-column label="创建时间" align="center" key="createTime" prop="createTime" width="190" v-if="columns[6].visible" >
<template slot-scope="scope"> <template slot-scope="scope">
...@@ -158,37 +177,28 @@ ...@@ -158,37 +177,28 @@
<el-table-column <el-table-column
label="操作" label="操作"
align="center" align="center"
width="192" width="232"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
> >
<template slot-scope="scope" v-if="scope.row.userId !== 1"> <template slot-scope="scope" v-if="scope.row.userId !== 1">
<!-- 查看--> <el-button
<!-- <el-button size="medium"
size="mini"
style="border: transparent" style="border: transparent"
icon="el-icon-view" icon="el-icon-refresh"
></el-button>--> @click="handleResetPwd(scope.row)"
></el-button>
<el-button <el-button
size="mini" size="medium"
style="border: transparent" style="border: transparent"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
></el-button> ></el-button>
<el-button <el-button
size="mini" size="medium"
style="border: transparent" style="border: transparent "
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
></el-button> ></el-button>
<!-- <el-dropdown size="mini" @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:user:resetPwd', 'system:user:edit']">-->
<!-- <el-button size="mini" type="text" icon="el-icon-d-arrow-right">更多</el-button>-->
<!-- <el-dropdown-menu slot="dropdown">-->
<!-- <el-dropdown-item command="handleResetPwd" icon="el-icon-key"-->
<!-- v-hasPermi="['system:user:resetPwd']">重置密码</el-dropdown-item>-->
<!-- <el-dropdown-item command="handleAuthRole" icon="el-icon-circle-check"-->
<!-- v-hasPermi="['system:user:edit']">分配角色</el-dropdown-item>-->
<!-- </el-dropdown-menu>-->
<!-- </el-dropdown>-->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -249,68 +259,9 @@ ...@@ -249,68 +259,9 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="权重"> <el-form-item label="权重">
<el-input-number v-model="form.weightNum" controls-position="right" :min="0" ></el-input-number> <el-input-number v-model="form.weightNum" controls-position="right" :min="1" ></el-input-number>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item label="用户性别">
<el-select v-model="form.sex" placeholder="请选择性别">
<el-option
v-for="dict in dict.type.sys_user_sex"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
</el-col>-->
<!-- </el-row>
<el-row>
<el-col :span="12">
<el-form-item label="岗位">
<el-select v-model="form.postIds" multiple placeholder="请选择岗位">
<el-option
v-for="item in postOptions"
:key="item.postId"
:label="item.postName"
:value="item.postId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="角色">
<el-select v-model="form.roleIds" multiple placeholder="请选择角色">
<el-option
v-for="item in roleOptions"
:key="item.roleId"
:label="item.roleName"
:value="item.roleId"
:disabled="item.status == 1"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>-->
<el-row>
<el-col :span="12">
<el-form-item label="创建账号">
<el-input v-model="form.createBy" maxlength="11" ></el-input>
</el-form-item>
</el-col>
<!-- <el-col :span="12">
<el-form-item label="创建时间" >
<el-date-picker
v-model="form.createTime"
type="datetime"
placeholder="选择日期和时间">
</el-date-picker>
</el-form-item>
</el-col>-->
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
...@@ -331,18 +282,18 @@ ...@@ -331,18 +282,18 @@
<div class="form-header"> <div class="form-header">
<h3><span class="blue-square"></span> 用户详细信息</h3> <h3><span class="blue-square"></span> 用户详细信息</h3>
</div> </div>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="updaterules" label-width="80px">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="账号" prop="userName"> <el-form-item label="账号" prop="userName">
<el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="10px" /> <el-input v-model="form.userName" placeholder="请输入用户名称" maxlength="10px" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <!-- <el-col :span="12">
<el-form-item label="用户密码" prop="password"> <el-form-item label="用户密码" prop="password">
<el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/> <el-input v-model="form.password" placeholder="请输入用户密码" type="password" maxlength="20" show-password/>
</el-form-item> </el-form-item>
</el-col> </el-col>-->
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
...@@ -482,7 +433,6 @@ import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUs ...@@ -482,7 +433,6 @@ import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUs
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect"; import Treeselect from "@riophae/vue-treeselect";
import "@riophae/vue-treeselect/dist/vue-treeselect.css"; import "@riophae/vue-treeselect/dist/vue-treeselect.css";
import {update} from "script-ext-html-webpack-plugin/lib/elements";
export default { export default {
name: "User", name: "User",
...@@ -530,8 +480,12 @@ export default { ...@@ -530,8 +480,12 @@ export default {
roleOptions: [], roleOptions: [],
// 表单参数 // 表单参数
form: { form: {
createBy: '', // 创建账号 // 创建账号
createTime: '', // 创建时间 createBy: '',
// 创建时间
createTime: '',
// 默认排序
weightNum: 1,
}, },
defaultProps: { defaultProps: {
children: "children", children: "children",
...@@ -557,6 +511,7 @@ export default { ...@@ -557,6 +511,7 @@ export default {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
userName: undefined, userName: undefined,
nickName: undefined,
phonenumber: undefined, phonenumber: undefined,
status: undefined, status: undefined,
deptId: undefined, deptId: undefined,
...@@ -577,6 +532,16 @@ export default { ...@@ -577,6 +532,16 @@ export default {
{ key: 8, label: '权重', visible: true} { key: 8, label: '权重', visible: true}
], ],
// 表单校验 // 表单校验
updaterules:{
userName: [
{ required: true, message: "账号不能为空", trigger: "blur" },
{ min: 2, max: 20, message: '账号长度必须介于 2 和 20 之间', trigger: 'blur' }
],
nickName: [
{ required: true, message: "姓名不能为空", trigger: "blur" }
],
},
rules: { rules: {
userName: [ userName: [
{ required: true, message: "账号不能为空", trigger: "blur" }, { required: true, message: "账号不能为空", trigger: "blur" },
...@@ -696,7 +661,7 @@ export default { ...@@ -696,7 +661,7 @@ export default {
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.selectedRowKeys = selection.map(row => row.userId ); this.selectedRowKeys = selection.map(row => row.userId );
this.ids = selection.map(item => item.id); this.ids = selection.map(item => item.userId);
this.single = selection.length !== 1; this.single = selection.length !== 1;
this.multiple = selection.length > 1; this.multiple = selection.length > 1;
}, },
...@@ -776,20 +741,14 @@ export default { ...@@ -776,20 +741,14 @@ export default {
}, },
/** 重置密码按钮操作 */ /** 重置密码按钮操作 */
handleResetPwd(row) { handleResetPwd(row) {
this.$prompt('请输入"' + row.userName + '"的新密码', "提示", { this.$confirm('是否重置"' + row.nickName + '"密码为123456', "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
closeOnClickModal: false, closeOnClickModal: false,
inputPattern: /^.{5,20}$/, }).then(({}) => {
inputErrorMessage: "用户密码长度必须介于 5 和 20 之间", const newPassword = "123456";
inputValidator: (value) => { resetUserPwd(row.userId, newPassword).then(response => {
if (/<|>|"|'|\||\\/.test(value)) { this.$modal.msgSuccess("成功将"+row.nickName + "的密码重置为:" + newPassword);
return "不能包含非法字符:< > \" ' \\\ |"
}
},
}).then(({ value }) => {
resetUserPwd(row.userId, value).then(response => {
this.$modal.msgSuccess("修改成功,新密码是:" + value);
}); });
}).catch(() => {}); }).catch(() => {});
}, },
...@@ -802,13 +761,15 @@ export default { ...@@ -802,13 +761,15 @@ export default {
submitForm: function() { submitForm: function() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate(valid => {
if (valid) { if (valid) {
if (this.form.userId != undefined) { if (this.form.userId !== undefined) {
// 更新现有记录
updateUser(this.form).then(response => { updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功"); this.$modal.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); this.getList();
}); });
} else { } else {
// 添加新记录
addUser(this.form).then(response => { addUser(this.form).then(response => {
this.$modal.msgSuccess("新增成功"); this.$modal.msgSuccess("新增成功");
this.open = false; this.open = false;
...@@ -821,7 +782,7 @@ export default { ...@@ -821,7 +782,7 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const userIds = row.userId || this.ids; const userIds = row.userId || this.ids;
this.$modal.confirm('是否确认删除用户编号为"' + userIds + '"的数据项?').then(function() { this.$modal.confirm('是否确认删除该用户').then(function() {
return delUser(userIds); return delUser(userIds);
}).then(() => { }).then(() => {
this.getList(); this.getList();
...@@ -832,10 +793,7 @@ export default { ...@@ -832,10 +793,7 @@ export default {
handleExport() { handleExport() {
// 获取选中的用户 ID // 获取选中的用户 ID
const userIds = this.ids; const userIds = this.ids;
this.download('system/user/export', { this.download('system/user/export', userIds, `user_${new Date().getTime()}.xlsx`);
...this.queryParams,
userIds, // 将用户 ID 传递给服务器
}, `user_${new Date().getTime()}.xlsx`)
}, },
/** 导入按钮操作 */ /** 导入按钮操作 */
handleImport() { handleImport() {
......
<template> <template>
<div class="app-container"> <div class="app-container">
<div style="background-color: white;height: 95vh;padding-left: 30px;padding-right: 30px"> <div
style="
background-color: white;
height: 95vh;
padding-left: 30px;
padding-right: 30px;
"
>
<div> <div>
<span style="display: flex;justify-content: flex-start;align-items: center;"><div <span
style="border: 1px solid #116FBB;width: 2px;height: 20px;margin-right: 5px"></div><h5 style="
style="color: #116FBB;font-weight: bolder">历史记录</h5></span> display: flex;
justify-content: flex-start;
align-items: center;
"
><div
style="
border: 1px solid #116fbb;
width: 2px;
height: 20px;
margin-right: 5px;
"
></div>
<h5 style="color: #116fbb; font-weight: bolder">历史记录</h5></span
>
</div> </div>
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px"> <el-form
:model="queryParams"
ref="queryForm"
size="small"
:inline="true"
v-show="showSearch"
label-width="100px"
>
<el-form-item prop="monitoringName"> <el-form-item prop="monitoringName">
<el-input <el-select
v-model.trim="queryParams.monitoringName" v-model="queryParams.monitoringName"
placeholder="请输入监控点名称" placeholder="请输入监控点名称"
clearable clearable
@keyup.enter.native="handleQuery" >
/> <el-option value="01">Camera 01</el-option>
<el-option value="02">Camera 02</el-option>
<el-option value="03">Camera 03</el-option>
<el-option value="04">Camera 04</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item prop="monitorState"> <el-form-item prop="monitorState">
<el-select v-model="queryParams.monitorState" placeholder="请选择监控状态" clearable> <el-select
v-model="queryParams.monitorState"
placeholder="请选择监控状态"
clearable
>
<el-option value="0">进行中</el-option> <el-option value="0">进行中</el-option>
<el-option value="1">已完成</el-option> <el-option value="1">已完成</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="monitorTime"> <el-form-item prop="monitorTime">
<el-date-picker <el-date-picker
placeholder="请选择监控时间" placeholder="请选择监控时间"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
v-model="queryParams.monitorTime" v-model="queryParams.monitoringStarttime"
type="datetimerange" type="date"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
> >
</el-date-picker> </el-date-picker>
<!-- <el-date-picker clearable--> <!-- <el-date-picker clearable-->
...@@ -50,76 +81,143 @@ ...@@ -50,76 +81,143 @@
<!-- @keyup.enter.native="handleQuery"--> <!-- @keyup.enter.native="handleQuery"-->
<!-- />--> <!-- />-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<div style="margin-left: 92%"> <div style="margin-left: 90%">
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> type="primary"
icon="el-icon-search"
size="mini"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item> </el-form-item>
</div> </div>
</el-form> </el-form>
<!-- <el-table v-loading="loading" :data="histableList" @selection-change="handleSelectionChange">--> <!-- <el-table v-loading="loading" :data="histableList" @selection-change="handleSelectionChange">-->
<el-table :data="histableList" @selection-change="handleSelectionChange" style="min-height: 650px"> <el-table
<el-table-column type="selection" width="55" align="center"/> :data="histableList"
<el-table-column label="序号" align="center" width="100" prop="id"/> @selection-change="handleSelectionChange"
style="min-height: 650px"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" width="100">
<template slot-scope="scope">
<span>{{ calculateIndex(scope.$index) }}</span>
</template>
</el-table-column>
<!-- <template slot-scope="scope">--> <!-- <template slot-scope="scope">-->
<!-- <span>{{ (scope.$index+1)+(queryParams.pageNum-1)*queryParams.pageSize }}</span>--> <!-- <span>{{ (scope.$index+1)+(queryParams.pageNum-1)*queryParams.pageSize }}</span>-->
<!-- </template>--> <!-- </template>-->
<el-table-column label="监控点名称" align="center" prop="monitoringName"/> <el-table-column
<el-table-column label="监控开始时间" align="center" prop="monitoringStarttime" width="300"> label="监控点名称"
align="center"
prop="monitoringName"
/>
<el-table-column
label="监控开始时间"
align="center"
prop="monitoringStarttime"
width="300"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.monitoringStarttime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> <span>{{
parseTime(
scope.row.monitoringStarttime,
"{y}-{m}-{d} {h}:{i}:{s}"
)
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="监控结束时间" align="center" prop="monitoringFinallytime" width="500"> <el-table-column
label="监控结束时间"
align="center"
prop="monitoringFinallytime"
width="350"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ parseTime(scope.row.monitoringFinallytime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span> <span>{{
parseTime(
scope.row.monitoringFinallytime,
"{y}-{m}-{d} {h}:{i}:{s}"
)
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="监控时间" align="center" prop="monitorTime" width="180"> <el-table-column
label="监控时间"
align="center"
prop="monitorTime"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ formatHoursAsHMS(scope.row.monitorTime) }}</span> <span>{{ formatHoursAsHMS(scope.row.monitorTime) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="监控状态" align="center" prop="monitorState" width="500"> <el-table-column
label="监控状态"
align="center"
prop="monitorState"
width="200"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span :class="scope.row.monitorState === '0' ? 'green-text' : 'black-text'">{{ <span
scope.row.monitorState === '0' ? '·进行中' : '·已完成' :class="
}}</span> scope.row.monitorState === '0' ? 'green-text' : 'black-text'
"
>{{
scope.row.monitorState === "0" ? "·进行中" : "·已完成"
}}</span
>
<!-- <dict-tag :options="dict.type.history_state" :value="scope.row.monitorState"/>--> <!-- <dict-tag :options="dict.type.history_state" :value="scope.row.monitorState"/>-->
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
style="border: transparent;background-color: transparent;color: green;font-size: 20px" style="
border: transparent;
background-color: transparent;
color: green;
font-size: 20px;
"
size="mini" size="mini"
plain plain
icon="el-icon-view" icon="el-icon-view"
class="green-icon" class="green-icon"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
></el-button> ></el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
style="display: flex;align-items: center;justify-content: center;" style="display: flex; align-items: center; justify-content: center"
:total="total" :total="total"
:page.sync="queryParams.pageNum" :page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize" :limit.sync="queryParams.pageSize"
:current-page.sync="currentPage"
:page-size="pageSize"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@pagination="getList" @pagination="getList"
/> />
<!-- 添加或修改history对话框 --> <!-- 添加或修改history对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog
:title="title"
:visible.sync="open"
width="500px"
append-to-body
>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
...@@ -132,21 +230,27 @@ ...@@ -132,21 +230,27 @@
</template> </template>
<script> <script>
import {listHistable, getHistable, delHistable, addHistable, updateHistable} from "@/api/system/histable"; import {
import {parseTime} from "../../utils/ruoyi"; listHistable,
getHistable,
delHistable,
addHistable,
updateHistable,
} from "@/api/system/histable";
import { parseTime } from "../../utils/ruoyi";
export default { export default {
name: "Histable", name: "Histable",
dicts: ['history_state'], dicts: ["history_state"],
data() { data() {
return { return {
carryRowCode:{ carryRowCode: {
id:"", id: "",
monitoringName:"", monitoringName: "",
monitoringStarttime: "", monitoringStarttime: "",
monitoringFinallytime: "", monitoringFinallytime: "",
monitorState:"", monitorState: "",
monitorTime:"", monitorTime: "",
}, },
// 遮罩层 // 遮罩层
loading: true, loading: true,
...@@ -162,6 +266,9 @@ export default { ...@@ -162,6 +266,9 @@ export default {
total: 0, total: 0,
// history表格数据 // history表格数据
histableList: [], histableList: [],
currentPage: 1,
pageSize: 10,
currentPageData: [],
// 弹出层标题 // 弹出层标题
title: "", title: "",
// 是否显示弹出层 // 是否显示弹出层
...@@ -170,27 +277,62 @@ export default { ...@@ -170,27 +277,62 @@ export default {
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
monitoringName: null, monitoringName: undefined,
monitorTime: null, monitorTime: undefined,
monitorState: null, monitorState: undefined,
id:null, id: undefined,
}, },
// 表单参数 // 表单参数
form: {}, form: {},
// 表单校验 // 表单校验
rules: {} rules: {},
}; };
}, },
created() { created() {
this.getList(); this.getList();
this.updateCurrentPageData();
},
computed: {
startIndexOfPage() {
return (this.currentPage - 1) * this.total;
}, },
},
methods: { methods: {
handleSizeChange(val) {
this.total = val;
this.updateCurrentPageData();
},
handleCurrentChange(val) {
this.currentPage = val;
this.updateCurrentPageData();
},
updateCurrentPageData() {
const startIndex = (this.currentPage - 1) * this.total;
const endIndex = startIndex + this.total;
this.currentPageData = this.histableList.slice(startIndex, endIndex);
},
calculateIndex(index) {
return this.startIndexOfPage + index + 1;
},
prevPage() {
if (this.currentPage > 1) {
this.currentPage--;
}
},
nextPage() {
const maxPage = Math.ceil(this.items.length / this.total);
if (this.currentPage < maxPage) {
this.currentPage++;
}
},
formatHoursAsHMS(hours) { formatHoursAsHMS(hours) {
// 确保小时数为整数 // 确保小时数为整数
const intHours = Math.floor(hours); const intHours = Math.floor(hours);
// 使用 padStart 方法确保小时数始终有两位数字 // 使用 padStart 方法确保小时数始终有两位数字
const hoursStr = intHours.toString().padStart(2, '0'); const hoursStr = intHours.toString().padStart(2, "0");
// 返回格式化的字符串 // 返回格式化的字符串
return `${hoursStr}:00:00`; return `${hoursStr}:00:00`;
...@@ -199,12 +341,11 @@ export default { ...@@ -199,12 +341,11 @@ export default {
/** 查询history列表 */ /** 查询history列表 */
getList() { getList() {
this.loading = true; this.loading = true;
listHistable(this.queryParams).then(response => { listHistable(this.queryParams).then((response) => {
this.histableList = response.rows; this.histableList = response.rows;
this.total = response.total; this.total = response.total;
this.loading = false; this.loading = false;
}); });
}, },
// 取消按钮 // 取消按钮
cancel() { cancel() {
...@@ -214,17 +355,12 @@ export default { ...@@ -214,17 +355,12 @@ export default {
// 表单重置 // 表单重置
reset() { reset() {
this.form = { this.form = {
ID: null, ID: undefined,
monitoringName: null, monitoringName: undefined,
monitoringStarttime: null, monitoringStarttime: undefined,
monitoringFinallytime: null, monitoringFinallytime: undefined,
monitorTime: null, monitorTime: undefined,
monitorState: null, monitorState: undefined,
CREATETIME: null,
CREATEBY: null,
UPDATETIME: null,
UPDATEBY: null,
delFlag: null
}; };
this.resetForm("form"); this.resetForm("form");
}, },
...@@ -240,9 +376,9 @@ export default { ...@@ -240,9 +376,9 @@ export default {
}, },
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.ID) this.ids = selection.map((item) => item.ID);
this.single = selection.length !== 1 this.single = selection.length !== 1;
this.multiple = !selection.length this.multiple = !selection.length;
}, },
/** 新增按钮操作 */ /** 新增按钮操作 */
handleAdd() { handleAdd() {
...@@ -252,27 +388,27 @@ export default { ...@@ -252,27 +388,27 @@ export default {
}, },
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.carryRowCode=row; this.carryRowCode = row;
// 查看详情页面(把id换成code) // 查看详情页面(把id换成code)
this.$router.push({path: '/monitoringPlayback/playback', this.$router.push({
path: "/monitoringPlayback/playback",
query: { query: {
carryRowCode :this.carryRowCode carryRowCode: this.carryRowCode,
} },
}) });
}, },
/** 提交按钮 */ /** 提交按钮 */
submitForm() { submitForm() {
this.$refs["form"].validate(valid => { this.$refs["form"].validate((valid) => {
if (valid) { if (valid) {
if (this.form.ID != null) { if (this.form.ID != null) {
updateHistable(this.form).then(response => { updateHistable(this.form).then((response) => {
this.$modal.msgSuccess("修改成功"); this.$modal.msgSuccess("修改成功");
this.open = false; this.open = false;
this.getList(); this.getList();
}); });
} else { } else {
addHistable(this.form).then(response => { addHistable(this.form).then((response) => {
this.$modal.msgSuccess("新增成功"); this.$modal.msgSuccess("新增成功");
this.open = false; this.open = false;
this.getList(); this.getList();
...@@ -284,21 +420,28 @@ export default { ...@@ -284,21 +420,28 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const IDs = row.ID || this.ids; const IDs = row.ID || this.ids;
this.$modal.confirm('是否确认删除history编号为"' + IDs + '"的数据项?').then(function () { this.$modal
.confirm('是否确认删除history编号为"' + IDs + '"的数据项?')
.then(function () {
return delHistable(IDs); return delHistable(IDs);
}).then(() => { })
.then(() => {
this.getList(); this.getList();
this.$modal.msgSuccess("删除成功"); this.$modal.msgSuccess("删除成功");
}).catch(() => { })
}); .catch(() => {});
}, },
/** 导出按钮操作 */ /** 导出按钮操作 */
handleExport() { handleExport() {
this.download('system/histable/export', { this.download(
...this.queryParams "system/histable/export",
}, `histable_${new Date().getTime()}.xlsx`) {
} ...this.queryParams,
} },
`histable_${new Date().getTime()}.xlsx`
);
},
},
}; };
</script> </script>
<style scoped> <style scoped>
......
'use strict' "use strict";
const path = require('path') const path = require("path");
function resolve(dir) { function resolve(dir) {
return path.join(__dirname, dir) return path.join(__dirname, dir);
} }
const CompressionPlugin = require('compression-webpack-plugin') const CompressionPlugin = require("compression-webpack-plugin");
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题 const name = process.env.VUE_APP_TITLE || "若依管理系统"; // 网页标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口 const port = process.env.port || process.env.npm_config_port || 80; // 端口
// vue.config.js 配置说明 // vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions //官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions
...@@ -20,16 +20,16 @@ module.exports = { ...@@ -20,16 +20,16 @@ module.exports = {
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: process.env.NODE_ENV === "production" ? "/" : "/", publicPath: process.env.NODE_ENV === "production" ? "/" : "/",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist) // 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: 'dist', outputDir: "dist",
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下) // 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static', assetsDir: "static",
// 是否开启eslint保存检测,有效值:ture | false | 'error' // 是否开启eslint保存检测,有效值:ture | false | 'error'
lintOnSave: process.env.NODE_ENV === 'development', lintOnSave: process.env.NODE_ENV === "development",
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。 // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false, productionSourceMap: false,
// webpack-dev-server 相关配置 // webpack-dev-server 相关配置
devServer: { devServer: {
host: '0.0.0.0', host: "0.0.0.0",
port: port, port: port,
open: true, open: true,
proxy: { proxy: {
...@@ -38,93 +38,92 @@ module.exports = { ...@@ -38,93 +38,92 @@ module.exports = {
target: `http://106.3.99.64:20004`, target: `http://106.3.99.64:20004`,
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ["^" + process.env.VUE_APP_BASE_API]: "",
}
}
}, },
disableHostCheck: true },
},
disableHostCheck: true,
}, },
css: { css: {
loaderOptions: { loaderOptions: {
sass: { sass: {
sassOptions: { outputStyle: "expanded" } sassOptions: { outputStyle: "expanded" },
} },
} },
}, },
configureWebpack: { configureWebpack: {
name: name, name: name,
resolve: { resolve: {
alias: { alias: {
'@': resolve('src') "@": resolve("src"),
} },
}, },
plugins: [ plugins: [
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件 // http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
new CompressionPlugin({ new CompressionPlugin({
cache: false, // 不启用文件缓存 cache: false, // 不启用文件缓存
test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式 test: /\.(js|css|html|jpe?g|png|gif|svg)?$/i, // 压缩文件格式
filename: '[path][base].gz[query]', // 压缩后的文件名 filename: "[path][base].gz[query]", // 压缩后的文件名
algorithm: 'gzip', // 使用gzip压缩 algorithm: "gzip", // 使用gzip压缩
minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩 minRatio: 0.8, // 压缩比例,小于 80% 的文件不会被压缩
deleteOriginalAssets: false // 压缩后删除原文件 deleteOriginalAssets: false, // 压缩后删除原文件
}) }),
], ],
}, },
chainWebpack(config) { chainWebpack(config) {
config.plugins.delete('preload') // TODO: need test config.plugins.delete("preload"); // TODO: need test
config.plugins.delete('prefetch') // TODO: need test config.plugins.delete("prefetch"); // TODO: need test
// set svg-sprite-loader // set svg-sprite-loader
config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
config.module config.module
.rule('svg') .rule("icons")
.exclude.add(resolve('src/assets/icons'))
.end()
config.module
.rule('icons')
.test(/\.svg$/) .test(/\.svg$/)
.include.add(resolve('src/assets/icons')) .include.add(resolve("src/assets/icons"))
.end() .end()
.use('svg-sprite-loader') .use("svg-sprite-loader")
.loader('svg-sprite-loader') .loader("svg-sprite-loader")
.options({ .options({
symbolId: 'icon-[name]' symbolId: "icon-[name]",
}) })
.end() .end();
config.when(process.env.NODE_ENV !== 'development', config => { config.when(process.env.NODE_ENV !== "development", (config) => {
config config
.plugin('ScriptExtHtmlWebpackPlugin') .plugin("ScriptExtHtmlWebpackPlugin")
.after('html') .after("html")
.use('script-ext-html-webpack-plugin', [{ .use("script-ext-html-webpack-plugin", [
{
// `runtime` must same as runtimeChunk name. default is `runtime` // `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/ inline: /runtime\..*\.js$/,
}]) },
.end() ])
.end();
config.optimization.splitChunks({ config.optimization.splitChunks({
chunks: 'all', chunks: "all",
cacheGroups: { cacheGroups: {
libs: { libs: {
name: 'chunk-libs', name: "chunk-libs",
test: /[\\/]node_modules[\\/]/, test: /[\\/]node_modules[\\/]/,
priority: 10, priority: 10,
chunks: 'initial' // only package third parties that are initially dependent chunks: "initial", // only package third parties that are initially dependent
}, },
elementUI: { elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package name: "chunk-elementUI", // split elementUI into a single package
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
priority: 20 // the weight needs to be larger than libs and app or it will be packaged into libs or app priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
}, },
commons: { commons: {
name: 'chunk-commons', name: "chunk-commons",
test: resolve('src/components'), // can customize your rules test: resolve("src/components"), // can customize your rules
minChunks: 3, // minimum common number minChunks: 3, // minimum common number
priority: 5, priority: 5,
reuseExistingChunk: true reuseExistingChunk: true,
} },
} },
}) });
config.optimization.runtimeChunk('single') config.optimization.runtimeChunk("single");
}) });
} },
} };
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