Compare commits

..

No commits in common. 'develop' and 'master' have entirely different histories.

@ -8,4 +8,4 @@ VITE_PUBLIC_PATH = /
VITE_ROUTER_HISTORY = "hash" VITE_ROUTER_HISTORY = "hash"
# 开发环境后端地址 # 开发环境后端地址
VITE_APP_BASE_URL = 'http://192.168.10.14:8008' VITE_APP_BASE_URL = 'http://192.168.10.13:8000'

@ -1,5 +1,5 @@
{ {
"name": "xznsh-admin", "name": "tp-admin",
"version": "2.0.0", "version": "2.0.0",
"private": true, "private": true,
"scripts": { "scripts": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 164 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

@ -1,6 +1,6 @@
{ {
"Version": "4.4.0", "Version": "4.4.0",
"Title": "XZNSHAdmin", "Title": "TpAdmin",
"FixedHeader": true, "FixedHeader": true,
"HiddenSideBar": false, "HiddenSideBar": false,
"MultiTagsCache": false, "MultiTagsCache": false,

@ -8,20 +8,14 @@ type Result = {
type Data = { type Data = {
success: boolean; success: boolean;
msg: any; msg: any;
data?: Array<any>; results?: Array<any>;
}; };
export const getHomeList = (params?: object) => { export const getHomeList = (params?: object) => {
return http.request<Result>("get", baseUrlApi(""), { params }); return http.request<Result>("get", baseUrlApi("tps"), { params });
}; };
export const getEvents = (params?: object) => { export const getEvents = (params?: object) => {
return http.request<Data>("get", baseUrlApi("events"), { params }); return http.request<Data>("get", baseUrlApi("tps/events"), { params });
};
export const getScenes = (params?: object) => {
return http.request<Data>("get", baseUrlApi("scenes"), { params });
};
export const getReasons = (params?: object) => {
return http.request<Data>("get", baseUrlApi("violation_reasons"), { params });
}; };
export const updateHomeList = (params?: object) => { export const updateHomeList = (params?: object) => {
return http.request<Data>("put", baseUrlApi(""), { params }); return http.request<Data>("put", baseUrlApi(""), { params });

@ -7,7 +7,7 @@ type deptResult = {
/** 部门列表查询 */ /** 部门列表查询 */
export const getDeptList = (params?: object) => { export const getDeptList = (params?: object) => {
return http.request<deptResult>("get", baseUrlApi("organization/trees/"), { return http.request<deptResult>("get", baseUrlApi("departments/"), {
params params
}); });
}; };
@ -19,20 +19,16 @@ type deptStatus = {
/** 新增部门 */ /** 新增部门 */
export const addDept = (data?: object) => { export const addDept = (data?: object) => {
return http.request<deptStatus>( return http.request<deptStatus>("post", baseUrlApi("departments/"), {
"post", data
baseUrlApi("organization/departments/"), });
{
data
}
);
}; };
/** 更新部门 */ /** 更新部门 */
export const updateDept = (data?: object | any) => { export const updateDept = (data?: object | any) => {
return http.request<deptStatus>( return http.request<deptStatus>(
"put", "put",
baseUrlApi(`organization/departments/${data.id}/`), baseUrlApi(`departments/${data.id}/`),
{ {
data data
} }
@ -43,7 +39,7 @@ export const updateDept = (data?: object | any) => {
export const deleteDept = (data?: object | any) => { export const deleteDept = (data?: object | any) => {
return http.request<deptStatus>( return http.request<deptStatus>(
"delete", "delete",
baseUrlApi(`organization/departments/${data}/`), baseUrlApi(`departments/${data}/`),
{ {
data data
} }
@ -59,7 +55,7 @@ type userList = {
/** 用户列表查询 */ /** 用户列表查询 */
export const getUserList = (params?: object) => { export const getUserList = (params?: object) => {
return http.request<userList>("get", baseUrlApi("organization/users/"), { return http.request<userList>("get", baseUrlApi("user/"), {
params params
}); });
}; };
@ -70,29 +66,19 @@ type userStatus = {
}; };
/** 新增用户 */ /** 新增用户 */
export const addUser = (data?: object) => { export const addUser = (data?: object) => {
return http.request<userStatus>("post", baseUrlApi("organization/users/"), { return http.request<userStatus>("post", baseUrlApi("user/"), { data });
data
});
}; };
/** 更新用户 */ /** 更新用户 */
export const updateUser = (data?: object | any) => { export const updateUser = (data?: object | any) => {
return http.request<userStatus>( return http.request<userStatus>("put", baseUrlApi(`user/${data.id}/`), {
"put", data
baseUrlApi(`organization/users/${data.id}/`), });
{
data
}
);
}; };
/** 删除用户 */ /** 删除用户 */
export const deleteUser = (data?: object | any) => { export const deleteUser = (data?: object | any) => {
return http.request<userStatus>( return http.request<userStatus>("delete", baseUrlApi(`user/${data}/`), {
"delete", data
baseUrlApi(`organization/users/${data}/`), });
{
data
}
);
}; };

@ -37,9 +37,7 @@ export type RefreshTokenResult = {
// return http.request<UserResult>("post", "/login", { data }); // return http.request<UserResult>("post", "/login", { data });
// }; // };
export const getLogin = (data?: object) => { export const getLogin = (data?: object) => {
return http.request<UserResult>("post", baseUrlApi("organization/login/"), { return http.request<UserResult>("post", baseUrlApi("user/login/"), { data });
data
});
}; };
// export const getLogin = (data?: object) => { // export const getLogin = (data?: object) => {

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

@ -8,7 +8,7 @@ import { FormProps } from "./utils/types";
const props = withDefaults(defineProps<FormProps>(), { const props = withDefaults(defineProps<FormProps>(), {
formInline: () => ({ formInline: () => ({
higherDeptOptions: [], higherDeptOptions: [],
parent_id: "", parentId: 0,
name: "", name: "",
principal: "", principal: "",
phone: "", phone: "",
@ -16,8 +16,7 @@ const props = withDefaults(defineProps<FormProps>(), {
sort: 0, sort: 0,
status: 1, status: 1,
remark: "", remark: "",
id: "", id: ""
is_active: true
}) })
}); });
@ -44,7 +43,7 @@ defineExpose({ getRef });
<el-form-item label="上级部门"> <el-form-item label="上级部门">
<el-cascader <el-cascader
class="w-full" class="w-full"
v-model="newFormInline.parent_id" v-model="newFormInline.parentId"
:options="newFormInline.higherDeptOptions" :options="newFormInline.higherDeptOptions"
:props="{ :props="{
value: 'id', value: 'id',
@ -52,7 +51,6 @@ defineExpose({ getRef });
emitPath: false, emitPath: false,
checkStrictly: true checkStrictly: true
}" }"
:disabled="newFormInline.id ? true : false"
clearable clearable
filterable filterable
placeholder="请选择上级部门" placeholder="请选择上级部门"
@ -112,22 +110,22 @@ defineExpose({ getRef });
controls-position="right" controls-position="right"
/> />
</el-form-item> </el-form-item>
</re-col> --> </re-col>
<!-- <re-col :value="12" :xs="24" :sm="24"> <re-col :value="12" :xs="24" :sm="24">
<el-form-item label="部门状态"> <el-form-item label="部门状态">
<el-switch <el-switch
v-model="newFormInline.is_active" v-model="newFormInline.status"
inline-prompt inline-prompt
:active-value="true" :active-value="1"
:inactive-value="false" :inactive-value="0"
active-text="启用" active-text="启用"
inactive-text="停用" inactive-text="停用"
:style="switchStyle" :style="switchStyle"
/> />
</el-form-item> </el-form-item>
</re-col> --> </re-col>
<!-- <re-col> <re-col>
<el-form-item label="备注"> <el-form-item label="备注">
<el-input <el-input
v-model="newFormInline.remark" v-model="newFormInline.remark"

@ -47,17 +47,17 @@ console.log(dataList);
class="!w-[200px]" class="!w-[200px]"
/> />
</el-form-item> </el-form-item>
<!-- <el-form-item label="状态:" prop="is_active"> <el-form-item label="状态:" prop="status">
<el-select <el-select
v-model="form.is_active" v-model="form.status"
placeholder="请选择状态" placeholder="请选择状态"
clearable clearable
class="!w-[180px]" class="!w-[180px]"
> >
<el-option label="启用" :value="true" /> <el-option label="启用" :value="1" />
<el-option label="停用" :value="false" /> <el-option label="停用" :value="0" />
</el-select> </el-select>
</el-form-item> --> </el-form-item>
<el-form-item> <el-form-item>
<el-button <el-button
type="primary" type="primary"

@ -3,7 +3,7 @@ import editForm from "../form.vue";
// import { handleTree } from "@/utils/tree"; // import { handleTree } from "@/utils/tree";
import { message } from "@/utils/message"; import { message } from "@/utils/message";
import { getDeptList, addDept, updateDept, deleteDept } from "@/api/system"; import { getDeptList, addDept, updateDept, deleteDept } from "@/api/system";
// import { usePublicHooks } from "../../hooks"; import { usePublicHooks } from "../../hooks";
import { addDialog } from "@/components/ReDialog"; import { addDialog } from "@/components/ReDialog";
import { reactive, ref, onMounted, h } from "vue"; import { reactive, ref, onMounted, h } from "vue";
import { type FormItemProps } from "../utils/types"; import { type FormItemProps } from "../utils/types";
@ -12,13 +12,13 @@ import { cloneDeep, isAllEmpty } from "@pureadmin/utils";
export function useDept() { export function useDept() {
const form = reactive({ const form = reactive({
name: "", name: "",
is_active: null status: null
}); });
const formRef = ref(); const formRef = ref();
const dataList = ref([]); const dataList = ref([]);
const loading = ref(true); const loading = ref(true);
// const { tagStyle } = usePublicHooks(); const { tagStyle } = usePublicHooks();
const columns: TableColumnList = [ const columns: TableColumnList = [
{ {
@ -32,28 +32,28 @@ export function useDept() {
// prop: "sort", // prop: "sort",
// minWidth: 70 // minWidth: 70
// }, // },
// { {
// label: "状态", label: "状态",
// prop: "is_active", prop: "status",
// minWidth: 100, minWidth: 100,
// cellRenderer: ({ row, props }) => ( cellRenderer: ({ row, props }) => (
// <el-tag size={props.size} style={tagStyle.value(row.is_active ? 1 : 0)}> <el-tag size={props.size} style={tagStyle.value(row.status)}>
// {row.is_active ? "启用" : "停用"} {row.status === 1 ? "启用" : "停用"}
// </el-tag> </el-tag>
// ) )
// }, },
{ {
label: "创建时间", label: "创建时间",
minWidth: 200, minWidth: 200,
prop: "insert_time", prop: "createTime",
formatter: ({ insert_time }) => formatter: ({ createTime }) =>
dayjs(insert_time).format("YYYY-MM-DD HH:mm:ss") dayjs(createTime).format("YYYY-MM-DD HH:mm:ss")
},
{
label: "备注",
prop: "remark",
minWidth: 320
}, },
// {
// label: "备注",
// prop: "remark",
// minWidth: 320
// },
{ {
label: "操作", label: "操作",
fixed: "right", fixed: "right",
@ -103,15 +103,11 @@ export function useDept() {
// newData = newData.filter(item => item.name.includes(form.name)); // newData = newData.filter(item => item.name.includes(form.name));
newData = filterNested(newData, item => item.name.includes(form.name)); newData = filterNested(newData, item => item.name.includes(form.name));
} }
// if (!isAllEmpty(form.is_active)) { if (!isAllEmpty(form.status)) {
// // 前端搜索状态 // 前端搜索状态
// // newData = newData.filter(item => item.status === form.status); // newData = newData.filter(item => item.status === form.status);
// // newData = filterNested( newData = filterNested(newData, item => item.status === form.status);
// // newData, }
// // item => item.is_active === form.is_active
// // );
// newData = newData.filter(item => item.is_active === form.is_active);
// }
// dataList.value = handleTree(newData); // 处理成树结构 // dataList.value = handleTree(newData); // 处理成树结构
dataList.value = newData; // 处理成树结构 dataList.value = newData; // 处理成树结构
setTimeout(() => { setTimeout(() => {
@ -137,7 +133,7 @@ export function useDept() {
props: { props: {
formInline: { formInline: {
higherDeptOptions: formatHigherDeptOptions(cloneDeep(dataList.value)), higherDeptOptions: formatHigherDeptOptions(cloneDeep(dataList.value)),
parent_id: row?.parent_id ?? "", parentId: row?.id ?? "",
name: row?.name ?? "", name: row?.name ?? "",
principal: row?.principal ?? "", principal: row?.principal ?? "",
phone: row?.phone ?? "", phone: row?.phone ?? "",
@ -145,8 +141,7 @@ export function useDept() {
sort: row?.sort ?? 0, sort: row?.sort ?? 0,
status: row?.status ?? 1, status: row?.status ?? 1,
remark: row?.remark ?? "", remark: row?.remark ?? "",
id: row?.id ?? "", id: row?.id ?? ""
is_active: row?.is_active ?? true
} }
}, },
width: "40%", width: "40%",
@ -165,9 +160,8 @@ export function useDept() {
onSearch(); // 刷新表格数据 onSearch(); // 刷新表格数据
} }
FormRef.validate(valid => { FormRef.validate(valid => {
console.log("curData", curData);
if (valid) { if (valid) {
console.log("curData", curData);
// 表单规则校验通过 // 表单规则校验通过
if (title === "新增") { if (title === "新增") {
// 实际开发先调用新增接口,再进行下面操作 // 实际开发先调用新增接口,再进行下面操作
@ -189,25 +183,18 @@ export function useDept() {
// deptList.data.push(addItem); // deptList.data.push(addItem);
const params = { const params = {
department_name: curData.name, department_name: curData.name,
department_id: curData.parent_id, department_id: curData.parentId
is_active: curData.is_active
}; };
addDept(params).then(res => { addDept(params).then(res => {
if (res.success) { if (res.success) {
chores(); chores();
} else {
message(`${res.msg}`, {
type: "warning"
});
} }
}); });
} else { } else {
const params = { const params = {
name: curData.name, name: curData.name,
id: curData.id, id: curData.id
department_id: curData.parent_id ? curData.parent_id : null,
is_active: curData.is_active
}; };
updateDept(params) updateDept(params)
.then(res => { .then(res => {

@ -1,6 +1,6 @@
interface FormItemProps { interface FormItemProps {
higherDeptOptions: Record<string, unknown>[]; higherDeptOptions: Record<string, unknown>[];
parent_id: string | number; parentId: number;
name: string; name: string;
principal: string; principal: string;
phone: string | number; phone: string | number;
@ -9,7 +9,6 @@ interface FormItemProps {
status: number; status: number;
remark: string; remark: string;
id: string | number; id: string | number;
is_active: boolean;
} }
interface FormProps { interface FormProps {
formInline: FormItemProps; formInline: FormItemProps;

@ -10,10 +10,9 @@ const props = withDefaults(defineProps<FormProps>(), {
department_id: "", department_id: "",
username: "", username: "",
phone_number: "", phone_number: "",
is_active: true, status: 1,
gender: null, gender: null,
id: "" id: ""
// password: ""
}) })
}); });
@ -47,7 +46,7 @@ defineExpose({ getRef });
emitPath: false, emitPath: false,
checkStrictly: true, checkStrictly: true,
disabled: function (data) { disabled: function (data) {
if (!data.is_active) { if (data.children && data.children.length > 0) {
return true; return true;
} else { } else {
return false; return false;
@ -76,16 +75,7 @@ defineExpose({ getRef });
/> />
</el-form-item> </el-form-item>
</re-col> </re-col>
<!-- <re-col>
<el-form-item label="密码" prop="password">
<el-input
clearable
show-password
v-model="newFormInline.password"
placeholder="密码"
/>
</el-form-item>
</re-col> -->
<re-col :value="12" :xs="24" :sm="24"> <re-col :value="12" :xs="24" :sm="24">
<el-form-item label="手机号" prop="phone_number"> <el-form-item label="手机号" prop="phone_number">
<el-input <el-input
@ -95,27 +85,27 @@ defineExpose({ getRef });
/> />
</el-form-item> </el-form-item>
</re-col> </re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="性别" prop="gender">
<el-select v-model="newFormInline.gender" placeholder="请选择">
<el-option label="男" :value="1" />
<el-option label="女" :value="0" />
</el-select>
</el-form-item>
</re-col>
<re-col :value="12" :xs="24" :sm="24"> <re-col :value="12" :xs="24" :sm="24">
<el-form-item label="用户状态"> <el-form-item label="用户状态">
<el-switch <el-switch
v-model="newFormInline.is_active" v-model="newFormInline.status"
inline-prompt inline-prompt
:active-value="true" :active-value="1"
:inactive-value="false" :inactive-value="0"
active-text="已开用" active-text="已开用"
inactive-text="已关闭" inactive-text="已关闭"
/> />
</el-form-item> </el-form-item>
</re-col> </re-col>
<re-col :value="12" :xs="24" :sm="24">
<el-form-item label="性别" prop="gender">
<el-select v-model="newFormInline.gender" placeholder="请选择">
<el-option label="未知" :value="2" />
<el-option label="男" :value="1" />
<el-option label="女" :value="0" />
</el-select>
</el-form-item>
</re-col>
</el-row> </el-row>
</el-form> </el-form>
</template> </template>

@ -76,15 +76,15 @@ const {
class="!w-[160px]" class="!w-[160px]"
/> />
</el-form-item> </el-form-item>
<el-form-item label="状态:" prop="is_active"> <el-form-item label="状态:" prop="status">
<el-select <el-select
v-model="form.is_active" v-model="form.status"
placeholder="请选择" placeholder="请选择"
clearable clearable
class="!w-[160px]" class="!w-[160px]"
> >
<el-option label="已开启" :value="true" /> <el-option label="已开启" value="1" />
<el-option label="已关闭" :value="false" /> <el-option label="已关闭" value="0" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>

@ -35,7 +35,7 @@ export function useUser() {
/** 手机号 */ /** 手机号 */
phone_number: "", phone_number: "",
/** 状态 */ /** 状态 */
is_active: null, status: "",
/** 部门 */ /** 部门 */
department_id: "" department_id: ""
}); });
@ -93,15 +93,15 @@ export function useUser() {
}, },
{ {
label: "状态", label: "状态",
prop: "is_active", prop: "status",
minWidth: 90, minWidth: 90,
cellRenderer: scope => ( cellRenderer: scope => (
<el-switch <el-switch
size={scope.props.size === "small" ? "small" : "default"} size={scope.props.size === "small" ? "small" : "default"}
loading={switchLoadMap.value[scope.index]?.loading} loading={switchLoadMap.value[scope.index]?.loading}
v-model={scope.row.is_active} v-model={scope.row.status}
active-value={true} active-value={1}
inactive-value={false} inactive-value={0}
active-text="已开启" active-text="已开启"
inactive-text="已关闭" inactive-text="已关闭"
inline-prompt inline-prompt
@ -134,7 +134,7 @@ export function useUser() {
function onChange({ row, index }) { function onChange({ row, index }) {
ElMessageBox.confirm( ElMessageBox.confirm(
`确认要<strong>${ `确认要<strong>${
row.is_active === false ? "停用" : "启用" row.status === 0 ? "停用" : "启用"
}</strong><strong style='color:var(--el-color-primary)'>${ }</strong><strong style='color:var(--el-color-primary)'>${
row.username row.username
}</strong>?`, }</strong>?`,
@ -148,42 +148,28 @@ export function useUser() {
} }
) )
.then(() => { .then(() => {
const params = { switchLoadMap.value[index] = Object.assign(
department_id: row.department_id, {},
username: row.username, switchLoadMap.value[index],
phone_number: row.phone_number, {
is_active: row.is_active, loading: true
gender: row.gender,
id: row.id
};
updateUser(params).then(res => {
if (res.success) {
setTimeout(() => {
switchLoadMap.value[index] = Object.assign(
{},
switchLoadMap.value[index],
{
loading: false
}
);
message("已成功修改用户状态", {
type: "success"
});
}, 300);
} else {
row.is_active === false
? (row.is_active = true)
: (row.is_active = false);
message(`${res.msg}`, {
type: "warning"
});
} }
}); );
setTimeout(() => {
switchLoadMap.value[index] = Object.assign(
{},
switchLoadMap.value[index],
{
loading: false
}
);
message("已成功修改用户状态", {
type: "success"
});
}, 300);
}) })
.catch(() => { .catch(() => {
row.is_active === false row.status === 0 ? (row.status = 1) : (row.status = 0);
? (row.is_active = true)
: (row.is_active = false);
}); });
} }
@ -260,8 +246,8 @@ export function useUser() {
department_id: row?.department_id ?? "", department_id: row?.department_id ?? "",
username: row?.username ?? "", username: row?.username ?? "",
phone_number: row?.phone_number ?? "", phone_number: row?.phone_number ?? "",
status: row?.status ?? 1,
gender: row?.gender ?? null, gender: row?.gender ?? null,
is_active: row?.is_active ?? true,
id: row?.id ?? "" id: row?.id ?? ""
} }
}, },
@ -286,11 +272,7 @@ export function useUser() {
// 表单规则校验通过 // 表单规则校验通过
if (title === "新增") { if (title === "新增") {
// 实际开发先调用新增接口,再进行下面操作 // 实际开发先调用新增接口,再进行下面操作
const params = { addUser(curData).then(res => {
...curData,
password: "test1234"
};
addUser(params).then(res => {
console.log(res); console.log(res);
if (res.success) { if (res.success) {
chores(); chores();
@ -305,7 +287,7 @@ export function useUser() {
department_id: curData.department_id, department_id: curData.department_id,
username: curData.username, username: curData.username,
phone_number: curData.phone_number, phone_number: curData.phone_number,
is_active: curData.is_active, status: curData.status,
gender: curData.gender, gender: curData.gender,
id: curData.id id: curData.id
}; };
@ -394,24 +376,13 @@ export function useUser() {
isIndeterminate.value = value.length !== allRole.value.length; isIndeterminate.value = value.length !== allRole.value.length;
} }
/** 密码正则密码格式应为8-18位数字、字母、符号的任意两种组合 */
const REGEXP_PWD =
/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){8,18}$/;
function resetPassword(row: { username: string; id: any }) { function resetPassword(row: { username: string; id: any }) {
ElMessageBox.prompt( ElMessageBox.prompt(
"请输入用户「" + row.username + "」的新密码", "请输入用户「" + row.username + "」的新密码",
"重置密码", "重置密码",
{ {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消"
inputValidator: val => {
if (val === null) {
return true; //初始化的值为null不做处理的话刚打开MessageBox就会校验出错影响用户体验
}
return REGEXP_PWD.test(val);
},
inputErrorMessage: "密码格式应为8-18位数字、字母、符号的任意两种组合"
} }
) )
.then(({ value }) => { .then(({ value }) => {
@ -420,30 +391,6 @@ export function useUser() {
type: "warning" type: "warning"
}); });
return false; return false;
} else {
console.log(value);
const params = {
id: row.id,
password: value
};
updateUser(params)
.then(res => {
console.log(res);
if (res.success) {
message(`${res.msg}`, {
type: "success"
});
} else {
message(`${res.msg}`, {
type: "warning"
});
}
})
.catch(error => {
message(`${error}`, {
type: "warning"
});
});
} }
}) })
.catch(() => {}); .catch(() => {});

@ -2,10 +2,6 @@ import { reactive } from "vue";
import type { FormRules } from "element-plus"; import type { FormRules } from "element-plus";
import { isPhone } from "@pureadmin/utils"; import { isPhone } from "@pureadmin/utils";
/** 密码正则密码格式应为8-18位数字、字母、符号的任意两种组合 */
export const REGEXP_PWD =
/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)]|[()])+$)(?!^.*[\u4E00-\u9FA5].*$)([^(0-9a-zA-Z)]|[()]|[a-z]|[A-Z]|[0-9]){8,18}$/;
/** 自定义表单规则校验 */ /** 自定义表单规则校验 */
export const formRules = reactive(<FormRules>{ export const formRules = reactive(<FormRules>{
username: [{ required: true, message: "角色名称为必填项", trigger: "blur" }], username: [{ required: true, message: "角色名称为必填项", trigger: "blur" }],
@ -13,7 +9,9 @@ export const formRules = reactive(<FormRules>{
phone_number: [ phone_number: [
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (!isPhone(value)) { if (value === "") {
callback();
} else if (!isPhone(value)) {
callback(new Error("请输入正确的手机号码格式")); callback(new Error("请输入正确的手机号码格式"));
} else { } else {
callback(); callback();
@ -23,21 +21,5 @@ export const formRules = reactive(<FormRules>{
// trigger: "click" // 如果想在点击确定按钮时触发这个校验trigger 设置成 click 即可 // trigger: "click" // 如果想在点击确定按钮时触发这个校验trigger 设置成 click 即可
} }
], ],
gender: [{ required: true, message: "性别为必填项", trigger: "blur" }], gender: [{ required: true, message: "性别为必填项", trigger: "blur" }]
password: [
{
validator: (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入密码"));
} else if (!REGEXP_PWD.test(value)) {
callback(
new Error("密码格式应为8-18位数字、字母、符号的任意两种组合")
);
} else {
callback();
}
},
trigger: "blur"
}
]
}); });

@ -2,11 +2,10 @@ interface FormItemProps {
higherDeptOptions: Record<string, unknown>[]; higherDeptOptions: Record<string, unknown>[];
username: string; username: string;
phone_number: string | number; phone_number: string | number;
is_active: boolean; status: number;
department_id: string | number; department_id: string | number;
gender: string | number; gender: string | number;
id: string | number; id: string | number;
// password: string | number;
} }
interface FormProps { interface FormProps {
formInline: FormItemProps; formInline: FormItemProps;

@ -5,7 +5,7 @@ import { ref, h } from "vue";
export function welcomeUtil() { export function welcomeUtil() {
const currentPlayingIndex = ref(-1); const currentPlayingIndex = ref(-1);
function openDialog(title = "视频", row, index: number) { function openDialog(title = "视频", row, index: number) {
console.log(row.video_path, "row.video_path"); console.log(row.video_dir, "row.video_dir");
addDialog({ addDialog({
title: `${title}用户`, title: `${title}用户`,
width: "40%", width: "40%",
@ -20,7 +20,7 @@ export function welcomeUtil() {
id: "video-" + index, id: "video-" + index,
onPlay: () => playVideo(row, index) onPlay: () => playVideo(row, index)
}, },
[h("source", { src: row.video_path, type: "video/mp4" })] [h("source", { src: row.video_dir, type: "video/mp4" })]
); );
} }
}); });

@ -9,7 +9,7 @@ import { type PaginationProps } from "@pureadmin/table";
import { ElMessageBox } from "element-plus"; import { ElMessageBox } 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, getEvents, getScenes, getReasons } from "@/api/home"; import { getHomeList, getEvents } from "@/api/home";
import { welcomeUtil } from "./hook"; import { welcomeUtil } from "./hook";
defineOptions({ defineOptions({
@ -20,10 +20,10 @@ defineOptions({
const { openDialog } = welcomeUtil(); const { openDialog } = welcomeUtil();
const formInline = reactive({ const formInline = reactive({
date: "", date: "",
policeId: "",
event: "", event: "",
violation: "", violation: "",
violationReason: "", violationType: ""
scene: ""
}); });
const currentPage = ref(1); const currentPage = ref(1);
@ -37,10 +37,6 @@ const tableData = ref([]);
const eventMap = ref({}); const eventMap = ref({});
const sceneMap = ref({});
const vioReasonMap = ref({});
const violationMap = ref({ const violationMap = ref({
: "1", : "1",
: "0", : "0",
@ -74,10 +70,10 @@ function onSearch() {
const params = { const params = {
start_time: formInline.date === null ? undefined : formInline.date[0], start_time: formInline.date === null ? undefined : formInline.date[0],
end_time: formInline.date === null ? undefined : formInline.date[1], end_time: formInline.date === null ? undefined : formInline.date[1],
scene: formInline.scene || undefined, police_id: formInline.policeId || undefined,
event_type: formInline.event || undefined, event_type: formInline.event || undefined,
violation: violationMap.value[formInline.violation] || undefined, violation: violationMap.value[formInline.violation] || undefined,
violation_type: formInline.violationReason || undefined, violation_type: formInline.violationType || undefined,
page: currentPage.value || undefined, page: currentPage.value || undefined,
page_size: pageSize.value || undefined page_size: pageSize.value || undefined
}; };
@ -169,18 +165,25 @@ const handleClose = (done: () => void) => {
}; };
async function getEvent() { async function getEvent() {
const { data } = await getEvents(); // axios({
eventMap.value = data; // url: AdminHostUrl + "events",
} // headers: {
// token: formatToken(getToken().accessToken)
async function getScene() { // }
const { data } = await getScenes(); // })
sceneMap.value = data; // .then(response => {
} // eventMap.value = response.data.data;
// // console.log(eventMap.value);
async function getReason() { // })
const { data } = await getReasons(); // .catch(error => {
vioReasonMap.value = data; // ElMessage({
// message: "",
// type: "warning"
// });
// console.log(error);
// });
const { results } = await getEvents();
eventMap.value = results;
} }
function pickerOptions(time) { function pickerOptions(time) {
@ -199,12 +202,12 @@ const columns: TableColumnList = [
sortable: true sortable: true
}, },
{ {
label: "场景", label: "警号",
prop: "scene", prop: "police_id",
minWidth: 100 minWidth: 100
}, },
{ {
label: "事件类型", label: "违法行为",
prop: "event_type", prop: "event_type",
minWidth: 100 minWidth: 100
}, },
@ -215,19 +218,24 @@ const columns: TableColumnList = [
slot: "violation" slot: "violation"
}, },
{ {
label: "违规原因", label: "违规行为",
prop: "violation_reason", prop: "ai_analysis",
minWidth: 100
},
{
label: "时间点",
prop: "relative_time",
minWidth: 100 minWidth: 100
}, },
{ {
label: "缩率图", label: "缩率图",
slot: "image" slot: "image"
}, },
// { {
// label: "", label: "车牌号",
// prop: "car_number", prop: "car_number",
// minWidth: 100 minWidth: 100
// }, },
// { // {
// label: "", // label: "",
// slot: "video" // slot: "video"
@ -286,7 +294,7 @@ onMounted(() => {
:default-value="lastMonth" :default-value="lastMonth"
/> />
</el-form-item> </el-form-item>
<!--
<el-form-item label="警号:"> <el-form-item label="警号:">
<el-input <el-input
v-model="formInline.policeId" v-model="formInline.policeId"
@ -294,28 +302,15 @@ onMounted(() => {
clearable clearable
style="width: 198px" style="width: 198px"
/> />
</el-form-item> -->
<el-form-item label="场景:">
<el-select
v-model="formInline.scene"
placeholder="场景"
clearable
@click="getScene()"
>
<el-option
v-for="(scene, type) in sceneMap"
:key="type"
:label="scene"
:value="scene"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="事件类型:">
<el-form-item label="违法行为:">
<!-- <el-input v-model="formInline.event" placeholder="事件"/>-->
<el-select <el-select
v-model="formInline.event" v-model="formInline.event"
placeholder="事件类型" placeholder="违法行为"
clearable clearable
@click="getEvent()" @click="getEvent"
> >
<el-option <el-option
v-for="(event, type) in eventMap" v-for="(event, type) in eventMap"
@ -341,20 +336,13 @@ onMounted(() => {
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="违规原因:"> <el-form-item label="违规行为:">
<el-select <el-input
v-model="formInline.violationReason" v-model="formInline.violationType"
placeholder="违规原因" placeholder="违规行为"
clearable clearable
@click="getReason()" style="width: 198px"
> />
<el-option
v-for="(reason, type) in vioReasonMap"
:key="type"
:label="reason"
:value="reason"
/>
</el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -392,8 +380,8 @@ onMounted(() => {
<el-image <el-image
preview-teleported preview-teleported
loading="lazy" loading="lazy"
:src="row.thumbnail" :src="row.small_image"
:preview-src-list="[row.thumbnail]" :preview-src-list="[row.small_image]"
:initial-index="index" :initial-index="index"
fit="cover" fit="cover"
class="w-[100px] h-[100px]" class="w-[100px] h-[100px]"

@ -45,7 +45,7 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
// 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy // 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
proxy: { proxy: {
"/api": { "/api": {
target: "http://192.168.10.14:8008", target: "http://192.168.10.13:8000",
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api/, "") rewrite: path => path.replace(/^\/api/, "")
} }

Loading…
Cancel
Save