31
0
Fork 0

feat: 代码更新

develop
JINGYJ 2 years ago
parent fc4fe75d24
commit d810b6abce

@ -6,3 +6,6 @@ VITE_PUBLIC_PATH = /
# 开发环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数" # 开发环境路由历史模式Hash模式传"hash"、HTML5模式传"h5"、Hash模式带base参数传"hash,base参数"、HTML5模式带base参数传"h5,base参数"
VITE_ROUTER_HISTORY = "hash" VITE_ROUTER_HISTORY = "hash"
# 开发环境后端地址
VITE_APP_BASE_URL = 'http://192.168.10.13:8000'

@ -0,0 +1,11 @@
import { http } from "@/utils/http";
import { baseUrlApi } from "./utils";
type Result = {
count: number;
results?: Array<any>;
};
export const getHomeList = (params?: object) => {
return http.request<Result>("get", baseUrlApi(""), { params });
};

@ -1,4 +1,5 @@
import { http } from "@/utils/http"; import { http } from "@/utils/http";
import { baseUrlApi } from "./utils";
// import { getConfig } from "@/config"; // import { getConfig } from "@/config";
export type UserResult = { export type UserResult = {
@ -32,8 +33,11 @@ export type RefreshTokenResult = {
}; };
/** 登录 */ /** 登录 */
// export const getLogin = (data?: object) => {
// return http.request<UserResult>("post", "/login", { data });
// };
export const getLogin = (data?: object) => { export const getLogin = (data?: object) => {
return http.request<UserResult>("post", "/login", { data }); return http.request<UserResult>("post", baseUrlApi("login"), { data });
}; };
// export const getLogin = (data?: object) => { // export const getLogin = (data?: object) => {
@ -44,5 +48,7 @@ export const getLogin = (data?: object) => {
/** 刷新token */ /** 刷新token */
export const refreshTokenApi = (data?: object) => { export const refreshTokenApi = (data?: object) => {
return http.request<RefreshTokenResult>("post", "/refreshToken", { data }); return http.request<RefreshTokenResult>("post", baseUrlApi("/refreshToken"), {
data
});
}; };

@ -0,0 +1,2 @@
const { VITE_APP_BASE_URL } = import.meta.env;
export const baseUrlApi = (url: string) => `${VITE_APP_BASE_URL}/api/${url}`;

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="133px" height="143px" viewBox="0 0 133 143" enable-background="new 0 0 133 143" xml:space="preserve"> <image id="image0" width="133" height="143" x="0" y="0"
href="data:image/png;base64,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" />
</svg>

After

Width:  |  Height:  |  Size: 6.2 KiB

@ -4,7 +4,8 @@ export default {
icon: "informationLine", icon: "informationLine",
title: "系统管理", title: "系统管理",
// showLink: false, // showLink: false,
rank: 3 rank: 3,
roles: ["admin"]
}, },
children: [ children: [
{ {
@ -25,11 +26,11 @@ export default {
} }
}, },
{ {
path: "/system/organization", path: "/system/dept/index",
name: "organization", name: "dept",
component: () => import("@/views/common/common.vue"), component: () => import("@/views/system/dept/index.vue"),
meta: { meta: {
title: "组织" title: "部门"
} }
} }
] ]

@ -8,7 +8,7 @@ import { getLogin, refreshTokenApi } from "@/api/user";
import { UserResult, RefreshTokenResult } from "@/api/user"; import { UserResult, RefreshTokenResult } from "@/api/user";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { type DataInfo, setToken, removeToken, sessionKey } from "@/utils/auth"; import { type DataInfo, setToken, removeToken, sessionKey } from "@/utils/auth";
import {ElMessage} from "element-plus"; import { ElMessage } from "element-plus";
export const useUserStore = defineStore({ export const useUserStore = defineStore({
id: "pure-user", id: "pure-user",
@ -37,8 +37,8 @@ export const useUserStore = defineStore({
setToken(data.data); setToken(data.data);
resolve(data); resolve(data);
} else { } else {
ElMessage.error(data.msg) ElMessage.error(data.msg);
resolve(data) resolve(data);
} }
}) })
.catch(error => { .catch(error => {

@ -52,6 +52,7 @@ class PureHttp {
return new Promise(resolve => { return new Promise(resolve => {
PureHttp.requests.push((token: string) => { PureHttp.requests.push((token: string) => {
config.headers["Authorization"] = formatToken(token); config.headers["Authorization"] = formatToken(token);
config.headers["token"] = formatToken(token);
resolve(config); resolve(config);
}); });
}); });
@ -90,6 +91,7 @@ class PureHttp {
.then(res => { .then(res => {
const token = res.data.accessToken; const token = res.data.accessToken;
config.headers["Authorization"] = formatToken(token); config.headers["Authorization"] = formatToken(token);
config.headers["token"] = formatToken(token);
PureHttp.requests.forEach(cb => cb(token)); PureHttp.requests.forEach(cb => cb(token));
PureHttp.requests = []; PureHttp.requests = [];
}) })
@ -102,6 +104,7 @@ class PureHttp {
config.headers["Authorization"] = formatToken( config.headers["Authorization"] = formatToken(
data.accessToken data.accessToken
); );
config.headers["token"] = formatToken(data.accessToken);
resolve(config); resolve(config);
} }
} else { } else {

@ -8,7 +8,7 @@ import type { FormInstance } from "element-plus";
import { useLayout } from "@/layout/hooks/useLayout"; import { useLayout } from "@/layout/hooks/useLayout";
import { useUserStoreHook } from "@/store/modules/user"; import { useUserStoreHook } from "@/store/modules/user";
import { initRouter, getTopMenu } from "@/router/utils"; import { initRouter, getTopMenu } from "@/router/utils";
import { avatar } from "./utils/static"; import { logo } from "./utils/static";
import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { ref, reactive, onMounted, onBeforeUnmount } from "vue"; import { ref, reactive, onMounted, onBeforeUnmount } from "vue";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange"; import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
@ -75,6 +75,7 @@ function onkeypress({ code }: KeyboardEvent) {
onMounted(() => { onMounted(() => {
window.document.addEventListener("keypress", onkeypress); window.document.addEventListener("keypress", onkeypress);
console.log(logo);
}); });
onBeforeUnmount(() => { onBeforeUnmount(() => {
@ -101,7 +102,7 @@ onBeforeUnmount(() => {
</div> --> </div> -->
<div class="login-box"> <div class="login-box">
<div class="login-form"> <div class="login-form">
<avatar class="avatar" /> <logo class="logo" />
<Motion> <Motion>
<h2 class="outline-none">{{ title }}</h2> <h2 class="outline-none">{{ title }}</h2>
</Motion> </Motion>
@ -170,4 +171,8 @@ onBeforeUnmount(() => {
:deep(.el-input-group__append, .el-input-group__prepend) { :deep(.el-input-group__append, .el-input-group__prepend) {
padding: 0; padding: 0;
} }
.logo {
margin: 0 auto;
}
</style> </style>

@ -1,5 +1,6 @@
import bg from "@/assets/login/bg.png"; import bg from "@/assets/login/bg.png";
import avatar from "@/assets/login/avatar.svg?component"; import avatar from "@/assets/login/avatar.svg?component";
import illustration from "@/assets/login/illustration.svg?component"; import illustration from "@/assets/login/illustration.svg?component";
import logo from "@/assets/login/logo.svg?component";
export { bg, avatar, illustration }; export { bg, avatar, illustration, logo };

@ -0,0 +1,138 @@
<script setup lang="ts">
import { ref } from "vue";
import ReCol from "@/components/ReCol";
import { formRules } from "./utils/rule";
import { FormProps } from "./utils/types";
import { usePublicHooks } from "../hooks";
const props = withDefaults(defineProps<FormProps>(), {
formInline: () => ({
higherDeptOptions: [],
parentId: 0,
name: "",
principal: "",
phone: "",
email: "",
sort: 0,
status: 1,
remark: ""
})
});
const ruleFormRef = ref();
const { switchStyle } = usePublicHooks();
const newFormInline = ref(props.formInline);
function getRef() {
return ruleFormRef.value;
}
defineExpose({ getRef });
</script>
<template>
<el-form
ref="ruleFormRef"
:model="newFormInline"
:rules="formRules"
label-width="82px"
>
<el-row :gutter="30">
<re-col>
<el-form-item label="上级部门">
<el-cascader
class="w-full"
v-model="newFormInline.parentId"
:options="newFormInline.higherDeptOptions"
:props="{
value: 'id',
label: 'name',
emitPath: false,
checkStrictly: true
}"
clearable
filterable
placeholder="请选择上级部门"
>
<template #default="{ node, data }">
<span>{{ data.name }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="部门名称" prop="name">
<el-input
v-model="newFormInline.name"
clearable
placeholder="请输入部门名称"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="部门负责人">
<el-input
v-model="newFormInline.principal"
clearable
placeholder="请输入部门负责人"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="手机号" prop="phone">
<el-input
v-model="newFormInline.phone"
clearable
placeholder="请输入手机号"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="邮箱" prop="email">
<el-input
v-model="newFormInline.email"
clearable
placeholder="请输入邮箱"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="排序">
<el-input-number
v-model="newFormInline.sort"
:min="0"
:max="9999"
controls-position="right"
/>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="部门状态">
<el-switch
v-model="newFormInline.status"
inline-prompt
:active-value="1"
:inactive-value="0"
active-text="启用"
inactive-text="停用"
:style="switchStyle"
/>
</el-form-item>
</re-col>
<re-col>
<el-form-item label="备注">
<el-input
v-model="newFormInline.remark"
placeholder="请输入备注信息"
type="textarea"
/>
</el-form-item>
</re-col>
</el-row>
</el-form>
</template>

@ -0,0 +1,151 @@
<script setup lang="ts">
import { ref } from "vue";
import { useDept } from "./utils/hook";
import { PureTableBar } from "@/components/RePureTableBar";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { PureTable } from "@pureadmin/table";
import Delete from "@iconify-icons/ep/delete";
import EditPen from "@iconify-icons/ep/edit-pen";
import Search from "@iconify-icons/ep/search";
import Refresh from "@iconify-icons/ep/refresh";
import AddFill from "@iconify-icons/ri/add-circle-line";
defineOptions({
name: "Dept"
});
const formRef = ref();
const tableRef = ref();
const {
form,
loading,
columns,
dataList,
onSearch,
resetForm,
openDialog,
handleDelete,
handleSelectionChange
} = useDept();
</script>
<template>
<div class="main">
<el-form
ref="formRef"
:inline="true"
:model="form"
class="search-form bg-bg_color w-[99/100] pl-8 pt-[12px]"
>
<el-form-item label="部门名称:" prop="name">
<el-input
v-model="form.name"
placeholder="请输入部门名称"
clearable
class="!w-[200px]"
/>
</el-form-item>
<el-form-item label="状态:" prop="status">
<el-select
v-model="form.status"
placeholder="请选择状态"
clearable
class="!w-[180px]"
>
<el-option label="启用" :value="1" />
<el-option label="停用" :value="0" />
</el-select>
</el-form-item>
<el-form-item>
<el-button
type="primary"
:icon="useRenderIcon(Search)"
:loading="loading"
@click="onSearch"
>
搜索
</el-button>
<el-button :icon="useRenderIcon(Refresh)" @click="resetForm(formRef)">
重置
</el-button>
</el-form-item>
</el-form>
<PureTableBar
title="部门列表(仅演示,操作后不生效)"
:columns="columns"
:tableRef="tableRef?.getTableRef()"
@refresh="onSearch"
>
<template #buttons>
<el-button
type="primary"
:icon="useRenderIcon(AddFill)"
@click="openDialog()"
>
新增部门
</el-button>
</template>
<template v-slot="{ size, dynamicColumns }">
<pure-table
ref="tableRef"
border
adaptive
:adaptiveConfig="{ offsetBottom: 32 }"
align-whole="center"
row-key="id"
showOverflowTooltip
table-layout="auto"
default-expand-all
:loading="loading"
:size="size"
:data="dataList"
:columns="dynamicColumns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
@selection-change="handleSelectionChange"
>
<template #operation="{ row }">
<el-button
class="reset-margin"
link
type="primary"
:size="size"
:icon="useRenderIcon(EditPen)"
@click="openDialog('编辑', row)"
>
编辑
</el-button>
<el-popconfirm
:title="`是否确认删除部门名称为${row.name}的这条数据`"
@confirm="handleDelete(row)"
>
<template #reference>
<el-button
class="reset-margin"
link
type="primary"
:size="size"
:icon="useRenderIcon(Delete)"
>
删除
</el-button>
</template>
</el-popconfirm>
</template>
</pure-table>
</template>
</PureTableBar>
</div>
</template>
<style lang="scss" scoped>
.search-form {
:deep(.el-form-item) {
margin-bottom: 12px;
}
}
</style>

@ -0,0 +1,335 @@
import dayjs from "dayjs";
import editForm from "../form.vue";
import { handleTree } from "@/utils/tree";
import { message } from "@/utils/message";
// import { getDeptList } from "@/api/system";
import { usePublicHooks } from "../../hooks";
import { addDialog } from "@/components/ReDialog";
import { reactive, ref, onMounted, h } from "vue";
import { type FormItemProps } from "../utils/types";
import { cloneDeep, isAllEmpty } from "@pureadmin/utils";
export function useDept() {
const form = reactive({
name: "",
status: null
});
const formRef = ref();
const dataList = ref([]);
const loading = ref(true);
const { tagStyle } = usePublicHooks();
const columns: TableColumnList = [
{
label: "部门名称",
prop: "name",
width: 180,
align: "left"
},
{
label: "排序",
prop: "sort",
minWidth: 70
},
{
label: "状态",
prop: "status",
minWidth: 100,
cellRenderer: ({ row, props }) => (
<el-tag size={props.size} style={tagStyle.value(row.status)}>
{row.status === 1 ? "启用" : "停用"}
</el-tag>
)
},
{
label: "创建时间",
minWidth: 200,
prop: "createTime",
formatter: ({ createTime }) =>
dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
},
{
label: "备注",
prop: "remark",
minWidth: 320
},
{
label: "操作",
fixed: "right",
width: 160,
slot: "operation"
}
];
function handleSelectionChange(val) {
console.log("handleSelectionChange", val);
}
function resetForm(formEl) {
if (!formEl) return;
formEl.resetFields();
onSearch();
}
const deptList = reactive({
data: [
{
name: "杭州总公司",
parentId: 0,
id: 100,
sort: 0,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1, // 状态 1 启用 0 停用
type: 1, // 1 公司 2 分公司 3 部门
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "郑州分公司",
parentId: 100,
id: 101,
sort: 1,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 2,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "研发部门",
parentId: 101,
id: 103,
sort: 1,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "市场部门",
parentId: 102,
id: 108,
sort: 1,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "深圳分公司",
parentId: 100,
id: 102,
sort: 2,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 2,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "市场部门",
parentId: 101,
id: 104,
sort: 2,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "财务部门",
parentId: 102,
id: 109,
sort: 2,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "测试部门",
parentId: 101,
id: 105,
sort: 3,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 0,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "财务部门",
parentId: 101,
id: 106,
sort: 4,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 1,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
},
{
name: "运维部门",
parentId: 101,
id: 107,
sort: 5,
phone: "15888888888",
principal: "@cname()",
email: "@email",
status: 0,
type: 3,
createTime: 1605456000000,
remark: "@cparagraph(1, 3)"
}
]
});
function getDeptList() {
// http.request("post", "/login")
return deptList;
}
async function onSearch() {
loading.value = true;
// const { data } = await getDeptList(); // 这里是返回一维数组结构前端自行处理成树结构返回格式要求唯一id加父节点parentIdparentId取父节点id
const data = getDeptList();
let newData = data.data;
console.log(newData, "newData");
if (!isAllEmpty(form.name)) {
// 前端搜索部门名称
newData = newData.filter(item => item.name.includes(form.name));
}
if (!isAllEmpty(form.status)) {
// 前端搜索状态
newData = newData.filter(item => item.status === form.status);
}
dataList.value = handleTree(newData); // 处理成树结构
setTimeout(() => {
loading.value = false;
}, 500);
}
function formatHigherDeptOptions(treeList) {
// 根据返回数据的status字段值判断追加是否禁用disabled字段返回处理后的树结构用于上级部门级联选择器的展示实际开发中也是如此不可能前端需要的每个字段后端都会返回这时需要前端自行根据后端返回的某些字段做逻辑处理
if (!treeList || !treeList.length) return;
const newTreeList = [];
for (let i = 0; i < treeList.length; i++) {
treeList[i].disabled = treeList[i].status === 0 ? true : false;
formatHigherDeptOptions(treeList[i].children);
newTreeList.push(treeList[i]);
}
return newTreeList;
}
function openDialog(title = "新增", row?: FormItemProps) {
addDialog({
title: `${title}部门`,
props: {
formInline: {
higherDeptOptions: formatHigherDeptOptions(cloneDeep(dataList.value)),
parentId: row?.parentId ?? 0,
name: row?.name ?? "",
principal: row?.principal ?? "",
phone: row?.phone ?? "",
email: row?.email ?? "",
sort: row?.sort ?? 0,
status: row?.status ?? 1,
remark: row?.remark ?? ""
}
},
width: "40%",
draggable: true,
fullscreenIcon: true,
closeOnClickModal: false,
contentRenderer: () => h(editForm, { ref: formRef }),
beforeSure: (done, { options }) => {
const FormRef = formRef.value.getRef();
const curData = options.props.formInline as FormItemProps;
function chores() {
message(`${title}了部门名称为${curData.name}的这条数据`, {
type: "success"
});
done(); // 关闭弹框
onSearch(); // 刷新表格数据
}
FormRef.validate(valid => {
if (valid) {
console.log("curData", curData);
// 表单规则校验通过
if (title === "新增") {
// 实际开发先调用新增接口,再进行下面操作
const addItem: any = curData;
// const addItem = {
// name: "运维部门",
// parentId: 101,
// id: 110,
// sort: 5,
// phone: "15888888888",
// principal: "@cname()",
// email: "@email",
// status: 0,
// type: 3,
// createTime: 1605456000000,
// remark: "@cparagraph(1, 3)"
// };
// const { addItem } = curData;
deptList.data.push(addItem);
chores();
} else {
// 实际开发先调用编辑接口,再进行下面操作
chores();
}
}
});
}
});
}
function handleDelete(row) {
message(`您删除了部门名称为${row.name}的这条数据`, { type: "success" });
onSearch();
}
onMounted(() => {
onSearch();
});
return {
form,
loading,
columns,
dataList,
/** 搜索 */
onSearch,
/** 重置 */
resetForm,
/** 新增、编辑部门 */
openDialog,
/** 删除部门 */
handleDelete,
handleSelectionChange
};
}

@ -0,0 +1,37 @@
import { reactive } from "vue";
import type { FormRules } from "element-plus";
import { isPhone, isEmail } from "@pureadmin/utils";
/** 自定义表单规则校验 */
export const formRules = reactive(<FormRules>{
name: [{ required: true, message: "部门名称为必填项", trigger: "blur" }],
phone: [
{
validator: (rule, value, callback) => {
if (value === "") {
callback();
} else if (!isPhone(value)) {
callback(new Error("请输入正确的手机号码格式"));
} else {
callback();
}
},
trigger: "blur"
// trigger: "click" // 如果想在点击确定按钮时触发这个校验trigger 设置成 click 即可
}
],
email: [
{
validator: (rule, value, callback) => {
if (value === "") {
callback();
} else if (!isEmail(value)) {
callback(new Error("请输入正确的邮箱格式"));
} else {
callback();
}
},
trigger: "blur"
}
]
});

@ -0,0 +1,16 @@
interface FormItemProps {
higherDeptOptions: Record<string, unknown>[];
parentId: number;
name: string;
principal: string;
phone: string | number;
email: string;
sort: number;
status: number;
remark: string;
}
interface FormProps {
formInline: FormItemProps;
}
export type { FormItemProps, FormProps };

@ -26,6 +26,11 @@ const {
dataList, dataList,
pagination, pagination,
// buttonClass, // buttonClass,
drawerShow,
selectArr,
menuArr,
treeRef,
defaultProps,
onSearch, onSearch,
resetForm, resetForm,
openDialog, openDialog,
@ -201,6 +206,30 @@ const {
</pure-table> </pure-table>
</template> </template>
</PureTableBar> </PureTableBar>
<!-- 抽屉组件:分配职位的菜单权限与按钮的权限 -->
<el-drawer v-model="drawerShow">
<template #header>
<h4>分配菜单与按钮的权限</h4>
</template>
<template #default>
<!-- 树形控件 -->
<el-tree
ref="treeRef"
:data="menuArr"
show-checkbox
node-key="id"
default-expand-all
:default-checked-keys="selectArr"
:props="defaultProps"
/>
</template>
<template #footer>
<div style="flex: auto">
<el-button @click="drawerShow = false">取消</el-button>
<el-button type="primary">确定</el-button>
</div>
</template>
</el-drawer>
</div> </div>
</template> </template>

@ -5,9 +5,11 @@ import { message } from "@/utils/message";
import { ElMessageBox } from "element-plus"; import { ElMessageBox } from "element-plus";
import { usePublicHooks } from "../../hooks"; import { usePublicHooks } from "../../hooks";
import { addDialog } from "@/components/ReDialog"; import { addDialog } from "@/components/ReDialog";
import { type FormItemProps } from "../utils/types"; import { type FormItemProps, MunuData } from "../utils/types";
import { type PaginationProps } from "@pureadmin/table"; import { type PaginationProps } from "@pureadmin/table";
import { reactive, ref, onMounted, h } from "vue"; import { reactive, ref, onMounted, h } from "vue";
import type { ElTreeV2 } from "element-plus";
// import { any } from "vue-types";
export function useRole() { export function useRole() {
const form = reactive({ const form = reactive({
@ -258,12 +260,143 @@ export function useRole() {
/** 菜单权限 */ /** 菜单权限 */
function handleMenu() { function handleMenu() {
message("等菜单管理页面开发后完善"); // message("等菜单管理页面开发后完善");
drawerShow.value = true;
Object.assign(menuArr, result);
selectArr.value = filterSelectArr(menuArr, []);
console.log(selectArr, "selectArr");
} }
/** 数据权限 可自行开发 */ /** 数据权限 可自行开发 */
// function handleDatabase() {} // function handleDatabase() {}
const drawerShow = ref(false);
//准备一个数组:数组用于存储勾选的节点的ID(四级的)
const selectArr = ref<number[]>([]);
//定义数组存储用户权限的数据
const menuArr = reactive<MunuData[]>([]);
//获取tree组件实例
const treeRef = ref<InstanceType<typeof ElTreeV2>>();
//树形控件的测试数据
const defaultProps = {
children: "children",
label: "name"
};
const filterSelectArr = (allData: any, initArr: any) => {
allData.forEach((item: any) => {
if (item.select && item.level == 4) {
initArr.push(item.id);
}
if (item.children && item.children.length > 0) {
filterSelectArr(item.children, initArr);
}
});
return initArr;
};
const result = reactive([
{
code: null,
createTime: "2019-11-15 17:13:06",
id: 1,
level: 1,
name: "全部数据",
pid: 0,
select: false,
status: null,
toCode: null,
type: 1,
updateTime: "2020-09-25 13:47:54",
children: [
{
id: 7,
createTime: "2020-11-30 16:40:08",
updateTime: "2021-12-04 19:39:41",
pid: 1,
name: "权限管理",
code: "Acl",
toCode: "",
type: 1,
status: null,
select: true,
level: 2,
children: [
{
id: 8,
createTime: "2020-11-30 16:40:38",
updateTime: "2021-12-04 19:40:01",
pid: 7,
name: "用户管理",
code: "User",
toCode: "",
type: 1,
status: null,
select: true,
level: 3,
children: [
{
children: [],
code: "btn.User.add",
createTime: "2020-11-30 16:43:16",
id: 11,
level: 4,
name: "添加用户",
pid: 8,
select: true,
status: null,
toCode: "",
type: 2,
updateTime: "2021-12-04 19:42:37"
}
]
},
{
id: 9,
createTime: "2020-11-30 16:40:55",
updateTime: "2021-12-04 19:40:02",
pid: 7,
name: "角色管理",
code: "Role",
toCode: "",
type: 1,
status: null,
select: true,
level: 3,
children: [
{
children: [],
code: "btn.Role.assgin",
createTime: "2020-11-30 16:50:13",
id: 15,
level: 4,
name: "分配权限",
pid: 9,
select: false,
status: null,
toCode: "RoleAuth",
type: 2,
updateTime: "2021-12-04 19:42:45"
}
]
},
{
id: 10,
createTime: "2020-11-30 16:41:21",
updateTime: "2021-12-04 19:40:06",
pid: 7,
name: "菜单管理",
code: "Permission",
toCode: "",
type: 1,
status: null,
select: true,
level: 3,
children: []
}
]
}
]
}
]);
onMounted(() => { onMounted(() => {
onSearch(); onSearch();
}); });
@ -275,6 +408,11 @@ export function useRole() {
dataList, dataList,
pagination, pagination,
// buttonClass, // buttonClass,
drawerShow,
selectArr,
menuArr,
treeRef,
defaultProps,
onSearch, onSearch,
resetForm, resetForm,
openDialog, openDialog,

@ -11,5 +11,19 @@ interface FormItemProps {
interface FormProps { interface FormProps {
formInline: FormItemProps; formInline: FormItemProps;
} }
//菜单与按钮数据的ts类型
export type { FormItemProps, FormProps }; interface MunuData {
id: number;
createTime: string;
updateTime: string;
pid: number;
name: string;
code: string;
toCode: string;
type: number;
status: null;
level: number;
children?: MunuData[];
select: boolean;
}
export type { FormItemProps, FormProps, MunuData };

@ -19,6 +19,7 @@ defineOptions({
}); });
const formRef = ref(); const formRef = ref();
const formDrawer = ref();
const { const {
form, form,
loading, loading,
@ -26,6 +27,16 @@ const {
dataList, dataList,
pagination, pagination,
buttonClass, buttonClass,
drawerShow,
formData,
checkAll,
userRole,
allRole,
isIndeterminate,
setRole,
confirmClick,
handleCheckAllChange,
handleCheckedCitiesChange,
onSearch, onSearch,
openDialog, openDialog,
resetForm, resetForm,
@ -35,6 +46,7 @@ const {
handleCurrentChange, handleCurrentChange,
handleSelectionChange handleSelectionChange
} = useUser(); } = useUser();
console.log(allRole);
</script> </script>
<template> <template>
@ -172,6 +184,7 @@ const {
link link
type="primary" type="primary"
:size="size" :size="size"
@click="setRole(row)"
:icon="useRenderIcon(Role)" :icon="useRenderIcon(Role)"
> >
分配角色 分配角色
@ -184,6 +197,45 @@ const {
</pure-table> </pure-table>
</template> </template>
</PureTableBar> </PureTableBar>
<el-drawer v-model="drawerShow">
<template #header>
<h4>分配角色</h4>
</template>
<template #default>
<el-form ref="formDrawer" :model="formData">
<el-form-item label="用户姓名">
<el-input :model="formData.username" :disabled="true" />
</el-form-item>
<el-form-item label="职位列表">
<el-checkbox
v-model="checkAll"
:indeterminate="isIndeterminate"
@change="handleCheckAllChange"
class="!w-[200px]"
>全部</el-checkbox
>
<el-checkbox-group
v-model="userRole"
@change="handleCheckedCitiesChange"
>
<el-checkbox
v-for="(role, index) in allRole"
:key="index"
:label="role"
>
{{ role.roleName }}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
</template>
<template #footer>
<div style="flex: auto">
<el-button @click="drawerShow = false">取消</el-button>
<el-button type="primary" @click="confirmClick"></el-button>
</div>
</template>
</el-drawer>
</div> </div>
</div> </div>
</template> </template>

@ -9,6 +9,7 @@ import { type PaginationProps } from "@pureadmin/table";
import { reactive, ref, computed, h, onMounted } from "vue"; import { reactive, ref, computed, h, onMounted } from "vue";
// import { http } from "@/utils/http"; // import { http } from "@/utils/http";
import { number } from "echarts"; import { number } from "echarts";
import { string } from "vue-types";
export function useUser() { export function useUser() {
const form = reactive({ const form = reactive({
@ -334,7 +335,67 @@ export function useUser() {
} }
}); });
} }
const formData = reactive({
username: string
});
const drawerShow = ref(null);
const checkAll = ref(false);
const allRole = ref([]);
const userRole = ref([]);
function setRole(row) {
Object.assign(formData, row);
Object.assign(allRole.value, [
{
createTime: "2021-05-31 18:09:18",
id: 1,
remark: null,
roleName: "超级管理员",
updateTime: "2023-04-28 11:03:38"
},
{
createTime: "2021-05-31 18:09:18",
id: 1,
remark: null,
roleName: "普通角色",
updateTime: "2023-04-28 11:03:38"
}
]);
Object.assign(userRole.value, [
{
createTime: "2021-05-31 18:09:18",
id: 1,
remark: null,
roleName: "超级管理员",
updateTime: "2023-04-28 11:03:38"
}
]);
console.log(allRole);
drawerShow.value = true;
}
function confirmClick() {
drawerShow.value = false;
}
//控制顶部全选复选框不确定的样式
const isIndeterminate = ref(true);
//顶部的全部复选框的change事件
function handleCheckAllChange(val: boolean) {
console.log(val);
console.log(allRole.value);
//val:true(全选)|false(没有全选)
userRole.value = val ? allRole.value : [];
//不确定的样式(确定样式)
isIndeterminate.value = false;
}
//顶部全部的复选框的change事件
function handleCheckedCitiesChange(value: string[]) {
console.log(value);
//顶部复选框的勾选数据
//代表:勾选上的项目个数与全部的职位个数相等,顶部的复选框勾选上
checkAll.value = value.length === allRole.value.length;
//不确定的样式
isIndeterminate.value = value.length !== allRole.value.length;
}
onMounted(() => { onMounted(() => {
onSearch(); onSearch();
}); });
@ -346,6 +407,14 @@ export function useUser() {
dataList, dataList,
pagination, pagination,
buttonClass, buttonClass,
drawerShow,
formData,
allRole,
userRole,
setRole,
confirmClick,
handleCheckAllChange,
handleCheckedCitiesChange,
onSearch, onSearch,
openDialog, openDialog,
resetForm, resetForm,

@ -9,6 +9,7 @@ import { type PaginationProps } from "@pureadmin/table";
import { ElMessageBox, ElMessage } from "element-plus"; import { ElMessageBox, ElMessage } from "element-plus";
import { getConfig } from "@/config"; import { getConfig } from "@/config";
import { getToken, formatToken } from "@/utils/auth"; import { getToken, formatToken } from "@/utils/auth";
import { getHomeList } from "@/api/home";
defineOptions({ defineOptions({
name: "Welcome" name: "Welcome"
@ -63,47 +64,73 @@ function onSearch() {
start_time = formInline.value.date[0]; start_time = formInline.value.date[0];
end_time = formInline.value.date[1]; end_time = formInline.value.date[1];
} }
const params = {
axios({ start_time: start_time || undefined,
url: AdminHostUrl, end_time: end_time || undefined,
params: { police_id: formInline.value.policeId || undefined,
start_time: start_time || undefined, event_type: formInline.value.event || undefined,
end_time: end_time || undefined, violation: violationMap.value[formInline.value.violation] || undefined,
police_id: formInline.value.policeId || undefined, violation_type: formInline.value.violationType || undefined,
event_type: formInline.value.event || undefined, page: currentPage.value || undefined,
violation: violationMap.value[formInline.value.violation] || undefined, page_size: pageSize.value || undefined
violation_type: formInline.value.violationType || undefined, };
page: currentPage.value || undefined, getHomeList(params).then(response => {
page_size: pageSize.value || undefined const dataList = response;
}, totalNumber.value = dataList.count;
headers: { pagination.total = dataList.count;
token: formatToken(getToken().accessToken) console.log(totalNumber.value, "totalNumber");
} if (!isDisplay) {
}) tableData.value = dataList.results.filter(data => {
.then(response => { return data.is_display === true;
// console.log(response.data);
totalNumber.value = response.data.count;
if (!isDisplay) {
tableData.value = response.data.results.filter(data => {
return data.is_display === true;
});
} else {
tableData.value = response.data.results;
}
setTimeout(() => {
loading.value = false;
}, 500);
})
.catch(error => {
ElMessage({
message: "网络暂不通畅",
type: "warning"
}); });
setTimeout(() => { } else {
loading.value = false; tableData.value = dataList.results;
}, 500); }
console.log(error); console.log(pagination, "pagination");
}); setTimeout(() => {
loading.value = false;
}, 500);
});
// axios({
// url: AdminHostUrl,
// params: {
// start_time: start_time || undefined,
// end_time: end_time || undefined,
// police_id: formInline.value.policeId || undefined,
// event_type: formInline.value.event || undefined,
// violation: violationMap.value[formInline.value.violation] || undefined,
// violation_type: formInline.value.violationType || undefined,
// page: currentPage.value || undefined,
// page_size: pageSize.value || undefined
// },
// headers: {
// token: formatToken(getToken().accessToken)
// }
// })
// .then(response => {
// // console.log(response.data);
// totalNumber.value = response.data.count;
// if (!isDisplay) {
// tableData.value = response.data.results.filter(data => {
// return data.is_display === true;
// });
// } else {
// tableData.value = response.data.results;
// }
// setTimeout(() => {
// loading.value = false;
// }, 500);
// })
// .catch(error => {
// ElMessage({
// message: "",
// type: "warning"
// });
// setTimeout(() => {
// loading.value = false;
// }, 500);
// console.log(error);
// });
} }
function handleSearch() { function handleSearch() {
@ -217,6 +244,8 @@ const pagination = reactive<PaginationProps>({
currentPage: currentPage.value, currentPage: currentPage.value,
background: true background: true
}); });
console.log(totalNumber.value, "totalNumber");
console.log(pagination, "pagination111111");
onMounted(() => { onMounted(() => {
onSearch(); onSearch();
@ -231,7 +260,7 @@ onMounted(() => {
:before-close="handleClose" :before-close="handleClose"
destroy-on-close destroy-on-close
> >
<our-player /> <!-- <our-player /> -->
</el-dialog> </el-dialog>
<el-form <el-form
:inline="true" :inline="true"
@ -240,7 +269,7 @@ onMounted(() => {
> >
<el-form-item label="日期:" style="font-weight: bold"> <el-form-item label="日期:" style="font-weight: bold">
<el-date-picker <el-date-picker
v-model="formInline.date" :model="formInline.date"
type="daterange" type="daterange"
unlink-panels unlink-panels
range-separator="--" range-separator="--"
@ -334,9 +363,11 @@ onMounted(() => {
<el-image <el-image
preview-teleported preview-teleported
loading="lazy" loading="lazy"
:src="row.image" :src="row.small_image"
:preview-src-list="[row.small_image]" :preview-src-list="[row.small_image]"
:initial-index="index" :initial-index="index"
fit="cover"
class="w-[100px] h-[100px]"
/> />
</template> </template>
<template #video="{ row }"> <template #video="{ row }">

Loading…
Cancel
Save