diff --git a/.env.development b/.env.development index cd7ef6b..f740e56 100644 --- a/.env.development +++ b/.env.development @@ -8,6 +8,12 @@ VITE_APP_ENV='development' # 开发环境 VITE_APP_BASE_API='/dev-api' +# 本机环境 +VITE_LOCALHOUSET=true +# 本地开发环境 +VITE_BASE_API='http://192.168.0.212:8082' + + # 应用访问路径 例如使用前缀 /admin/ VITE_APP_CONTEXT_PATH='/' diff --git a/src/api/system/agreement/index.ts b/src/api/system/agreement/index.ts new file mode 100644 index 0000000..238aaf9 --- /dev/null +++ b/src/api/system/agreement/index.ts @@ -0,0 +1,64 @@ +import type {AgreementForm, AgreementQuery, AgreementVO} from '@/api/system/agreement/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询协议配置列表 + * @param query + * @returns {*} + */ +export const listAgreement = (query?: AgreementQuery): AxiosPromise> => { + return request({ + url: '/system/agreement/list', + method: 'get', + params: query + }); +}; + +/** + * 查询协议配置详细 + * @param agreementId + */ +export const getAgreement = (agreementId: string | number): AxiosPromise => { + return request({ + url: '/system/agreement/' + agreementId, + method: 'get' + }); +}; + +/** + * 新增协议配置 + * @param data + */ +export const addAgreement = (data: AgreementForm) => { + return request({ + url: '/system/agreement', + method: 'post', + data: data + }); +}; + +/** + * 修改协议配置 + * @param data + */ +export const updateAgreement = (data: AgreementForm) => { + return request({ + url: '/system/agreement', + method: 'put', + data: data + }); +}; + + +/** + * 删除协议配置 + * @param agreementId + */ +export const delAgreement = (agreementId: string | number | Array) => { + return request({ + url: '/system/agreement/' + agreementId, + method: 'delete' + }); +}; diff --git a/src/api/system/agreement/types.ts b/src/api/system/agreement/types.ts new file mode 100644 index 0000000..9f66d52 --- /dev/null +++ b/src/api/system/agreement/types.ts @@ -0,0 +1,156 @@ +export interface AgreementVO { + /** + * 主键(雪花) + */ + agreementId: string | number; + /** + * 协议编号 + */ + agreementNo: string; + /** + * 类型(user/privacy/service) + */ + agreementType: string; + /** + * 协议名称 + */ + name: string; + /** + * 版本号 + */ + versionName: string; + /** + * 协议正文 + */ + content: string; + /** + * 状态(0草稿 1已生效 2停用) + */ + status: boolean; + /** + * 生效时间 + */ + publishTime: string; + /** + * 已生效类型;同类型仅一条,非生效或已删除为 NULL + */ + activeType: string; +} + +export interface AgreementForm extends BaseEntity { + /** + * 主键(雪花) + */ + agreementId?: string | number; + /** + * 协议编号 + */ + agreementNo?: string; + /** + * 类型(user/privacy/service) + */ + agreementType?: string; + /** + * 协议名称 + */ + name?: string; + /** + * 版本号 + */ + versionName?: string; + /** + * 协议正文 + */ + content?: string; + /** + * 状态(0草稿 1已生效 2停用) + */ + status?: boolean; + /** + * 生效时间 + */ + publishTime?: string; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 已生效类型;同类型仅一条,非生效或已删除为 NULL + */ + activeType?: string; +} + +export interface AgreementQuery extends PageQuery { + /** + * 协议编号 + */ + agreementNo?: string; + /** + * 类型(user/privacy/service) + */ + agreementType?: string; + /** + * 协议名称 + */ + name?: string; + /** + * 版本号 + */ + versionName?: string; + /** + * 协议正文 + */ + content?: string; + /** + * 状态(0草稿 1已生效 2停用) + */ + status?: boolean; + /** + * 生效时间 + */ + publishTime?: string; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 已生效类型;同类型仅一条,非生效或已删除为 NULL + */ + activeType?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/conversation/index.ts b/src/api/system/conversation/index.ts new file mode 100644 index 0000000..8088ea6 --- /dev/null +++ b/src/api/system/conversation/index.ts @@ -0,0 +1,64 @@ +import type {CsSessionForm, CsSessionQuery, CsSessionVO} from '@/api/system/conversation/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询客服会话列表 + * @param query + * @returns {*} + */ +export const listCsSession = (query?: CsSessionQuery): AxiosPromise> => { + return request({ + url: '/conversation/csSession/list', + method: 'get', + params: query + }); +}; + +/** + * 查询客服会话详细 + * @param sessionId + */ +export const getCsSession = (sessionId: string | number): AxiosPromise => { + return request({ + url: '/conversation/csSession/' + sessionId, + method: 'get' + }); +}; + +/** + * 新增客服会话 + * @param data + */ +export const addCsSession = (data: CsSessionForm) => { + return request({ + url: '/conversation/csSession', + method: 'post', + data: data + }); +}; + +/** + * 修改客服会话 + * @param data + */ +export const updateCsSession = (data: CsSessionForm) => { + return request({ + url: '/conversation/csSession', + method: 'put', + data: data + }); +}; + + +/** + * 删除客服会话 + * @param sessionId + */ +export const delCsSession = (sessionId: string | number | Array) => { + return request({ + url: '/conversation/csSession/' + sessionId, + method: 'delete' + }); +}; diff --git a/src/api/system/conversation/types.ts b/src/api/system/conversation/types.ts new file mode 100644 index 0000000..6971f25 --- /dev/null +++ b/src/api/system/conversation/types.ts @@ -0,0 +1,176 @@ +export interface CsSessionVO { + /** + * 主键(雪花) + */ + sessionId: string | number; + /** + * 会话编号 + */ + sessionNo: string; + /** + * APP 用户 + */ + userId: string | number; + /** + * 关联设备,可空 + */ + deviceId: string | number; + /** + * 问题类型 + */ + problemType: string; + /** + * 用户问题摘要 + */ + summary: string; + /** + * 状态(0机器人 1排队 2人工 3已结束) + */ + status: boolean; + /** + * 当前接待客服 + */ + agentId: string | number; + /** + * 接入方式(bot/bot_to_human/human) + */ + accessType: string; + /** + * 排队序号 + */ + queueNo: number; + /** + * 会话开始时间 + */ + startTime: string; + /** + * 人工接入时间 + */ + acceptTime: string; + /** + * 结束时间 + */ + endTime: string; + /** + * 最后消息时间 + */ + lastMessageTime: string; +} + +export interface CsSessionForm extends BaseEntity { + /** + * 主键(雪花) + */ + sessionId?: string | number; + /** + * 会话编号 + */ + sessionNo?: string; + /** + * APP 用户 + */ + userId?: string | number; + /** + * 关联设备,可空 + */ + deviceId?: string | number; + /** + * 问题类型 + */ + problemType?: string; + /** + * 用户问题摘要 + */ + summary?: string; + /** + * 状态(0机器人 1排队 2人工 3已结束) + */ + status?: boolean; + /** + * 当前接待客服 + */ + agentId?: string | number; + /** + * 接入方式(bot/bot_to_human/human) + */ + accessType?: string; + /** + * 排队序号 + */ + queueNo?: number; + /** + * 会话开始时间 + */ + startTime?: string; + /** + * 人工接入时间 + */ + acceptTime?: string; + /** + * 结束时间 + */ + endTime?: string; + /** + * 最后消息时间 + */ + lastMessageTime?: string; +} + +export interface CsSessionQuery extends PageQuery { + /** + * 会话编号 + */ + sessionNo?: string; + /** + * APP 用户 + */ + userId?: string | number; + /** + * 关联设备,可空 + */ + deviceId?: string | number; + /** + * 问题类型 + */ + problemType?: string; + /** + * 用户问题摘要 + */ + summary?: string; + /** + * 状态(0机器人 1排队 2人工 3已结束) + */ + status?: boolean; + /** + * 当前接待客服 + */ + agentId?: string | number; + /** + * 接入方式(bot/bot_to_human/human) + */ + accessType?: string; + /** + * 排队序号 + */ + queueNo?: number; + /** + * 会话开始时间 + */ + startTime?: string; + /** + * 人工接入时间 + */ + acceptTime?: string; + /** + * 结束时间 + */ + endTime?: string; + /** + * 最后消息时间 + */ + lastMessageTime?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/cskb/index.ts b/src/api/system/cskb/index.ts new file mode 100644 index 0000000..effb82c --- /dev/null +++ b/src/api/system/cskb/index.ts @@ -0,0 +1,64 @@ +import type {CsKbForm, CsKbQuery, CsKbVO} from '@/api/system/cskb/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询客服知识库列表 + * @param query + * @returns {*} + */ +export const listCsKb = (query?: CsKbQuery): AxiosPromise> => { + return request({ + url: '/system/csKb/list', + method: 'get', + params: query + }); +}; + +/** + * 查询客服知识库详细 + * @param kbId + */ +export const getCsKb = (kbId: string | number): AxiosPromise => { + return request({ + url: '/system/csKb/' + kbId, + method: 'get' + }); +}; + +/** + * 新增客服知识库 + * @param data + */ +export const addCsKb = (data: CsKbForm) => { + return request({ + url: '/system/csKb', + method: 'post', + data: data + }); +}; + +/** + * 修改客服知识库 + * @param data + */ +export const updateCsKb = (data: CsKbForm) => { + return request({ + url: '/system/csKb', + method: 'put', + data: data + }); +}; + + +/** + * 删除客服知识库 + * @param kbId + */ +export const delCsKb = (kbId: string | number | Array) => { + return request({ + url: '/system/csKb/' + kbId, + method: 'delete' + }); +}; diff --git a/src/api/system/cskb/types.ts b/src/api/system/cskb/types.ts new file mode 100644 index 0000000..1766c3e --- /dev/null +++ b/src/api/system/cskb/types.ts @@ -0,0 +1,132 @@ +export interface CsKbVO { + /** + * 主键(雪花) + */ + kbId: string | number; + /** + * 知识编号,如 KB-001 + */ + kbNo: string; + /** + * 问题标题 + */ + title: string; + /** + * 分类(设备配网/耗材滤芯/固件升级/设备报修;固件升级仅文案分类) + */ + category: string; + /** + * 机器人回复内容 + */ + content: string; + /** + * 排序权重,数字越小越靠前 + */ + sort: number; + /** + * 状态(0停用 1启用) + */ + status: boolean; +} + +export interface CsKbForm extends BaseEntity { + /** + * 主键(雪花) + */ + kbId?: string | number; + /** + * 知识编号,如 KB-001 + */ + kbNo?: string; + /** + * 问题标题 + */ + title?: string; + /** + * 分类(设备配网/耗材滤芯/固件升级/设备报修;固件升级仅文案分类) + */ + category?: string; + /** + * 机器人回复内容 + */ + content?: string; + /** + * 排序权重,数字越小越靠前 + */ + sort?: number; + /** + * 状态(0停用 1启用) + */ + status?: boolean; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; +} + +export interface CsKbQuery extends PageQuery { + /** + * 知识编号,如 KB-001 + */ + kbNo?: string; + /** + * 问题标题 + */ + title?: string; + /** + * 分类(设备配网/耗材滤芯/固件升级/设备报修;固件升级仅文案分类) + */ + category?: string; + /** + * 机器人回复内容 + */ + content?: string; + /** + * 排序权重,数字越小越靠前 + */ + sort?: number; + /** + * 状态(0停用 1启用) + */ + status?: boolean; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/cssAgent/index.ts b/src/api/system/cssAgent/index.ts new file mode 100644 index 0000000..f625985 --- /dev/null +++ b/src/api/system/cssAgent/index.ts @@ -0,0 +1,64 @@ +import type {CsAgentForm, CsAgentQuery, CsAgentVO} from '@/api/system/cssAgent/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询客服人员列表 + * @param query + * @returns {*} + */ +export const listCsAgent = (query?: CsAgentQuery): AxiosPromise> => { + return request({ + url: '/system/csAgent/list', + method: 'get', + params: query + }); +}; + +/** + * 查询客服人员详细 + * @param agentId + */ +export const getCsAgent = (agentId: string | number): AxiosPromise => { + return request({ + url: '/system/csAgent/' + agentId, + method: 'get' + }); +}; + +/** + * 新增客服人员 + * @param data + */ +export const addCsAgent = (data: CsAgentForm) => { + return request({ + url: '/system/csAgent', + method: 'post', + data: data + }); +}; + +/** + * 修改客服人员 + * @param data + */ +export const updateCsAgent = (data: CsAgentForm) => { + return request({ + url: '/system/csAgent', + method: 'put', + data: data + }); +}; + + +/** + * 删除客服人员 + * @param agentId + */ +export const delCsAgent = (agentId: string | number | Array) => { + return request({ + url: '/system/csAgent/' + agentId, + method: 'delete' + }); +}; diff --git a/src/api/system/cssAgent/types.ts b/src/api/system/cssAgent/types.ts new file mode 100644 index 0000000..8121990 --- /dev/null +++ b/src/api/system/cssAgent/types.ts @@ -0,0 +1,168 @@ +export interface CsAgentVO { + /** + * 主键(雪花) + */ + agentId: string | number; + /** + * 客服编号,如 KF-001 + */ + agentNo: string; + /** + * 工号 + */ + jobNo: string; + /** + * 客服姓名 + */ + name: string; + /** + * 登录账号 + */ + account: string; + /** + * 密码(BCrypt) + */ + password: string; + /** + * 手机号 + */ + phone: string; + /** + * 头像 oss_id + */ + avatarOssId: string | number; + /** + * 在线状态(0离线 1在线 2忙碌) + */ + onlineStatus: boolean; + /** + * 账号状态(0启用 1禁用) + */ + status: boolean; +} + +export interface CsAgentForm extends BaseEntity { + /** + * 主键(雪花) + */ + agentId?: string | number; + /** + * 客服编号,如 KF-001 + */ + agentNo?: string; + /** + * 工号 + */ + jobNo?: string; + /** + * 客服姓名 + */ + name?: string; + /** + * 登录账号 + */ + account?: string; + /** + * 密码(BCrypt) + */ + password?: string; + /** + * 手机号 + */ + phone?: string; + /** + * 头像 oss_id + */ + avatarOssId?: string | number; + /** + * 在线状态(0离线 1在线 2忙碌) + */ + onlineStatus?: boolean; + /** + * 账号状态(0启用 1禁用) + */ + status?: boolean; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; +} + +export interface CsAgentQuery extends PageQuery { + /** + * 客服编号,如 KF-001 + */ + agentNo?: string; + /** + * 工号 + */ + jobNo?: string; + /** + * 客服姓名 + */ + name?: string; + /** + * 登录账号 + */ + account?: string; + /** + * 密码(BCrypt) + */ + password?: string; + /** + * 手机号 + */ + phone?: string; + /** + * 头像 oss_id + */ + avatarOssId?: string | number; + /** + * 在线状态(0离线 1在线 2忙碌) + */ + onlineStatus?: boolean; + /** + * 账号状态(0启用 1禁用) + */ + status?: boolean; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/customer/index.ts b/src/api/system/customer/index.ts new file mode 100644 index 0000000..2b3ee6c --- /dev/null +++ b/src/api/system/customer/index.ts @@ -0,0 +1,64 @@ +import type {UserForm, UserQuery, UserVO} from '@/api/system/customer/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询App用户列表 + * @param query + * @returns {*} + */ +export const listUser = (query?: UserQuery): AxiosPromise> => { + return request({ + url: '/system/user/list', + method: 'get', + params: query + }); +}; + +/** + * 查询App用户详细 + * @param userId + */ +export const getUser = (userId: string | number): AxiosPromise => { + return request({ + url: '/system/user/' + userId, + method: 'get' + }); +}; + +/** + * 新增App用户 + * @param data + */ +export const addUser = (data: UserForm) => { + return request({ + url: '/system/user', + method: 'post', + data: data + }); +}; + +/** + * 修改App用户 + * @param data + */ +export const updateUser = (data: UserForm) => { + return request({ + url: '/system/user', + method: 'put', + data: data + }); +}; + + +/** + * 删除App用户 + * @param userId + */ +export const delUser = (userId: string | number | Array) => { + return request({ + url: '/system/user/' + userId, + method: 'delete' + }); +}; diff --git a/src/api/system/customer/types.ts b/src/api/system/customer/types.ts new file mode 100644 index 0000000..154efbe --- /dev/null +++ b/src/api/system/customer/types.ts @@ -0,0 +1,276 @@ +export interface UserVO { + /** + * 用户ID(雪花ID) + */ + userId: string | number; + /** + * 用户账号(默认使用手机号) + */ + userName: string; + /** + * 用户展示编号,如 U20260918001 + */ + userNo: string; + /** + * 手机号码 + */ + phonenumber: string; + /** + * 用户昵称 + */ + nickName: string; + /** + * 头像 oss_id + */ + avatarOssId: string | number; + /** + * 头像 URL + */ + avatarUrl: string; + /** + * 密码(BCrypt 加密) + */ + password: string; + /** + * 最近一次修改密码时间 + */ + passwordUpdateTime: string; + /** + * 性别(0未知 1男 2女) + */ + gender: string; + /** + * 生日 + */ + birthday: string; + /** + * 省份 + */ + province: string; + /** + * 城市 + */ + city: string; + /** + * 区县 + */ + district: string; + /** + * 账号状态(0正常 1停用) + */ + status: boolean; + /** + * 注销时间;停用仍用 status + */ + cancelTime: string; + /** + * 最后登录IP + */ + loginIp: string; + /** + * 最后登录时间 + */ + loginDate: string; + /** + * 登录次数 + */ + loginCount: number; + /** + * 备注 + */ + remark: string; +} + +export interface UserForm extends BaseEntity { + /** + * 用户ID(雪花ID) + */ + userId?: string | number; + /** + * 用户账号(默认使用手机号) + */ + userName?: string; + /** + * 用户展示编号,如 U20260918001 + */ + userNo?: string; + /** + * 手机号码 + */ + phonenumber?: string; + /** + * 用户昵称 + */ + nickName?: string; + /** + * 头像 oss_id + */ + avatarOssId?: string | number; + /** + * 头像 URL + */ + avatarUrl?: string; + /** + * 密码(BCrypt 加密) + */ + password?: string; + /** + * 最近一次修改密码时间 + */ + passwordUpdateTime?: string; + /** + * 性别(0未知 1男 2女) + */ + gender?: string; + /** + * 生日 + */ + birthday?: string; + /** + * 省份 + */ + province?: string; + /** + * 城市 + */ + city?: string; + /** + * 区县 + */ + district?: string; + /** + * 账号状态(0正常 1停用) + */ + status?: boolean; + /** + * 注销时间;停用仍用 status + */ + cancelTime?: string; + /** + * 最后登录IP + */ + loginIp?: string; + /** + * 最后登录时间 + */ + loginDate?: string; + /** + * 登录次数 + */ + loginCount?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 备注 + */ + remark?: string; +} + +export interface UserQuery extends PageQuery { + /** + * 用户账号(默认使用手机号) + */ + userName?: string; + /** + * 用户展示编号,如 U20260918001 + */ + userNo?: string; + /** + * 手机号码 + */ + phonenumber?: string; + /** + * 用户昵称 + */ + nickName?: string; + /** + * 头像 oss_id + */ + avatarOssId?: string | number; + /** + * 头像 URL + */ + avatarUrl?: string; + /** + * 密码(BCrypt 加密) + */ + password?: string; + /** + * 最近一次修改密码时间 + */ + passwordUpdateTime?: string; + /** + * 性别(0未知 1男 2女) + */ + gender?: string; + /** + * 生日 + */ + birthday?: string; + /** + * 省份 + */ + province?: string; + /** + * 城市 + */ + city?: string; + /** + * 区县 + */ + district?: string; + /** + * 账号状态(0正常 1停用) + */ + status?: boolean; + /** + * 注销时间;停用仍用 status + */ + cancelTime?: string; + /** + * 最后登录IP + */ + loginIp?: string; + /** + * 最后登录时间 + */ + loginDate?: string; + /** + * 登录次数 + */ + loginCount?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/system/device/index.ts b/src/api/system/device/index.ts new file mode 100644 index 0000000..3858a2b --- /dev/null +++ b/src/api/system/device/index.ts @@ -0,0 +1,64 @@ +import type {DeviceForm, DeviceQuery, DeviceVO} from '@/api/system/device/types'; +import type {PageResult} from '@/api/types'; +import type {AxiosPromise} from '@/utils/api-types'; +import request from '@/utils/request'; + +/** + * 查询设备主列表 + * @param query + * @returns {*} + */ +export const listDevice = (query?: DeviceQuery): AxiosPromise> => { + return request({ + url: '/device/device/list', + method: 'get', + params: query + }); +}; + +/** + * 查询设备主详细 + * @param deviceId + */ +export const getDevice = (deviceId: string | number): AxiosPromise => { + return request({ + url: '/device/device/' + deviceId, + method: 'get' + }); +}; + +/** + * 新增设备主 + * @param data + */ +export const addDevice = (data: DeviceForm) => { + return request({ + url: '/device/device', + method: 'post', + data: data + }); +}; + +/** + * 修改设备主 + * @param data + */ +export const updateDevice = (data: DeviceForm) => { + return request({ + url: '/device/device', + method: 'put', + data: data + }); +}; + + +/** + * 删除设备主 + * @param deviceId + */ +export const delDevice = (deviceId: string | number | Array) => { + return request({ + url: '/device/device/' + deviceId, + method: 'delete' + }); +}; diff --git a/src/api/system/device/types.ts b/src/api/system/device/types.ts new file mode 100644 index 0000000..ae6abf5 --- /dev/null +++ b/src/api/system/device/types.ts @@ -0,0 +1,428 @@ +export interface DeviceVO { + /** + * 主键(雪花,仅内部关联) + */ + deviceId: string | number; + /** + * 业务编号,未删除记录内唯一;逻辑删除后可再次使用 + */ + deviceNo: string; + /** + * 绑定码IMEI,可空;未删除记录内唯一,逻辑删除后可再次使用 + */ + imei: string; + /** + * 用户侧名称≤20字符 + */ + name: string; + /** + * 产品模板 + */ + productId: string | number; + /** + * 型号快照,新增时取自产品模板 + */ + model: string; + /** + * 出厂序列号 + */ + sn: string; + /** + * 硬件版本 + */ + hwVersion: string; + /** + * 软件版本 + */ + swVersion: string; + /** + * 固件版本 + */ + fwVersion: string; + /** + * 数据包版本 + */ + pkgVersion: string; + /** + * 设备IP + */ + ip: string; + /** + * MAC,未删除记录内唯一;逻辑删除后可再次添加 + */ + mac: string; + /** + * WiFi SSID + */ + wifiSsid: string | number; + /** + * 蓝牙(0未连接 1已连接) + */ + bluetoothConnected: string; + /** + * 状态(0未激活 1在线 2离线) + */ + status: boolean; + /** + * 当前绑定APP用户 + */ + bindUserId: string | number; + /** + * 最近一次绑定时间 + */ + bindTime: string; + /** + * 当前家庭 + */ + homeId: string | number; + /** + * 当前房间 + */ + locationId: string | number; + /** + * 信号等级(0离线 1弱 2一般 3强) + */ + signalLevel: number; + /** + * 最新经度 + */ + lng: number; + /** + * 最新纬度 + */ + lat: number; + /** + * 地址(设备上报) + */ + address: string; + /** + * 充电(0否 1充电中;无电池设备为空) + */ + charging: string; + /** + * 设备电量0-100 + */ + deviceBattery: number; + /** + * 最近一次运行数据上报时间 + */ + lastReportTime: string; + /** + * 最后在线时间 + */ + lastOnlineTime: string; + /** + * 备注 + */ + remark: string; + /** + * 未删除时的业务编号 + */ + activeDeviceNo: string; + /** + * 未删除时的IMEI + */ + activeImei: string; + /** + * 未删除时的MAC + */ + activeMac: string; +} + +export interface DeviceForm extends BaseEntity { + /** + * 主键(雪花,仅内部关联) + */ + deviceId?: string | number; + /** + * 业务编号,未删除记录内唯一;逻辑删除后可再次使用 + */ + deviceNo?: string; + /** + * 绑定码IMEI,可空;未删除记录内唯一,逻辑删除后可再次使用 + */ + imei?: string; + /** + * 用户侧名称≤20字符 + */ + name?: string; + /** + * 产品模板 + */ + productId?: string | number; + /** + * 型号快照,新增时取自产品模板 + */ + model?: string; + /** + * 出厂序列号 + */ + sn?: string; + /** + * 硬件版本 + */ + hwVersion?: string; + /** + * 软件版本 + */ + swVersion?: string; + /** + * 固件版本 + */ + fwVersion?: string; + /** + * 数据包版本 + */ + pkgVersion?: string; + /** + * 设备IP + */ + ip?: string; + /** + * MAC,未删除记录内唯一;逻辑删除后可再次添加 + */ + mac?: string; + /** + * WiFi SSID + */ + wifiSsid?: string | number; + /** + * 蓝牙(0未连接 1已连接) + */ + bluetoothConnected?: string; + /** + * 状态(0未激活 1在线 2离线) + */ + status?: boolean; + /** + * 当前绑定APP用户 + */ + bindUserId?: string | number; + /** + * 最近一次绑定时间 + */ + bindTime?: string; + /** + * 当前家庭 + */ + homeId?: string | number; + /** + * 当前房间 + */ + locationId?: string | number; + /** + * 信号等级(0离线 1弱 2一般 3强) + */ + signalLevel?: number; + /** + * 最新经度 + */ + lng?: number; + /** + * 最新纬度 + */ + lat?: number; + /** + * 地址(设备上报) + */ + address?: string; + /** + * 充电(0否 1充电中;无电池设备为空) + */ + charging?: string; + /** + * 设备电量0-100 + */ + deviceBattery?: number; + /** + * 最近一次运行数据上报时间 + */ + lastReportTime?: string; + /** + * 最后在线时间 + */ + lastOnlineTime?: string; + /** + * 备注 + */ + remark?: string; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 未删除时的业务编号 + */ + activeDeviceNo?: string; + /** + * 未删除时的IMEI + */ + activeImei?: string; + /** + * 未删除时的MAC + */ + activeMac?: string; +} + +export interface DeviceQuery extends PageQuery { + /** + * 业务编号,未删除记录内唯一;逻辑删除后可再次使用 + */ + deviceNo?: string; + /** + * 绑定码IMEI,可空;未删除记录内唯一,逻辑删除后可再次使用 + */ + imei?: string; + /** + * 用户侧名称≤20字符 + */ + name?: string; + /** + * 产品模板 + */ + productId?: string | number; + /** + * 型号快照,新增时取自产品模板 + */ + model?: string; + /** + * 出厂序列号 + */ + sn?: string; + /** + * 硬件版本 + */ + hwVersion?: string; + /** + * 软件版本 + */ + swVersion?: string; + /** + * 固件版本 + */ + fwVersion?: string; + /** + * 数据包版本 + */ + pkgVersion?: string; + /** + * 设备IP + */ + ip?: string; + /** + * MAC,未删除记录内唯一;逻辑删除后可再次添加 + */ + mac?: string; + /** + * WiFi SSID + */ + wifiSsid?: string | number; + /** + * 蓝牙(0未连接 1已连接) + */ + bluetoothConnected?: string; + /** + * 状态(0未激活 1在线 2离线) + */ + status?: boolean; + /** + * 当前绑定APP用户 + */ + bindUserId?: string | number; + /** + * 最近一次绑定时间 + */ + bindTime?: string; + /** + * 当前家庭 + */ + homeId?: string | number; + /** + * 当前房间 + */ + locationId?: string | number; + /** + * 信号等级(0离线 1弱 2一般 3强) + */ + signalLevel?: number; + /** + * 最新经度 + */ + lng?: number; + /** + * 最新纬度 + */ + lat?: number; + /** + * 地址(设备上报) + */ + address?: string; + /** + * 充电(0否 1充电中;无电池设备为空) + */ + charging?: string; + /** + * 设备电量0-100 + */ + deviceBattery?: number; + /** + * 最近一次运行数据上报时间 + */ + lastReportTime?: string; + /** + * 最后在线时间 + */ + lastOnlineTime?: string; + /** + * 创建部门 + */ + createDept?: number; + /** + * 创建者 + */ + createBy?: number; + /** + * 创建时间 + */ + createTime?: string; + /** + * 更新者 + */ + updateBy?: number; + /** + * 更新时间 + */ + updateTime?: string; + /** + * 未删除时的业务编号 + */ + activeDeviceNo?: string; + /** + * 未删除时的IMEI + */ + activeImei?: string; + /** + * 未删除时的MAC + */ + activeMac?: string; + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/assets/styles/base/_document.scss b/src/assets/styles/base/_document.scss index 49f11f4..f9b5dc9 100644 --- a/src/assets/styles/base/_document.scss +++ b/src/assets/styles/base/_document.scss @@ -8,9 +8,8 @@ body { -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; background: var(--app-shell-bg); - font-family: - 'MiSans', 'HarmonyOS Sans SC', 'PingFang SC', 'Source Han Sans SC', 'Noto Sans SC', 'Hiragino Sans GB', - 'Microsoft YaHei', sans-serif; + font-family: 'MiSans', 'HarmonyOS Sans SC', 'PingFang SC', 'Source Han Sans SC', 'Noto Sans SC', 'Hiragino Sans GB', + 'Microsoft YaHei', sans-serif; } label { @@ -88,3 +87,18 @@ h6 { line-height: 1.1; color: inherit; } + +ul, li { + list-style: none; + padding: 0; + margin: 0; +} + + +// 通用卡片 +.commonCard { + padding: 24px; + border-radius: 16px 16px 16px 16px; + border: 1px solid rgba(238, 240, 243, 1); + margin-top: 8px; +} diff --git a/src/assets/styles/components/_card-shell.scss b/src/assets/styles/components/_card-shell.scss index 927bf7d..5e843e9 100644 --- a/src/assets/styles/components/_card-shell.scss +++ b/src/assets/styles/components/_card-shell.scss @@ -1,4 +1,4 @@ -/* 业务列表/卡片页:分页、树、列表、el-card 等(与 vendors/element-plus 通用覆盖叠加,入口顺序见 index.scss)。 +/* 业务列表/卡片页:分页、树、列表、el-card 等(与 vendors/element-plus 通用覆盖叠加,入口顺序见 index.vue.scss)。 * 属「页面模式」而非 EP 公共主题,故放在 components。 */ // --- 历史「表单分区标题」样式 --- @@ -51,9 +51,8 @@ box-shadow: var(--app-shadow-sm); border-color: var(--app-surface-border); overflow: hidden; - transition: - box-shadow 0.2s ease, - border-color 0.2s ease; + transition: box-shadow 0.2s ease, + border-color 0.2s ease; background: var(--app-surface-bg); } diff --git a/src/assets/styles/layout/sidebar/_menu.scss b/src/assets/styles/layout/sidebar/_menu.scss index 727df33..21e1ae1 100644 --- a/src/assets/styles/layout/sidebar/_menu.scss +++ b/src/assets/styles/layout/sidebar/_menu.scss @@ -22,6 +22,7 @@ margin: 0; height: 40px; color: var(--side-menu-text) !important; + &:hover { background-color: var(--side-menu-hover-bg) !important; color: var(--side-menu-hover-text) !important; @@ -54,12 +55,12 @@ //margin: 3px 8px; //background: transparent !important; background: #f7f7f7 !important; + &.is-active { background: var(--side-menu-active-bg) !important; color: var(--side-menu-active-text) !important; - box-shadow: - inset 3px 0 0 var(--side-menu-active-line), - inset 0 0 0 1px var(--side-menu-active-border); + box-shadow: inset 3px 0 0 var(--side-menu-active-line), + inset 0 0 0 1px var(--side-menu-active-border); } &:not(.is-active):hover { @@ -75,12 +76,12 @@ //margin: 3px 8px; //background: transparent !important; background: #f7f7f7 !important; + &.is-active { background: var(--side-menu-active-bg) !important; color: var(--side-menu-active-text) !important; - box-shadow: - inset 3px 0 0 var(--side-menu-active-line), - inset 0 0 0 1px var(--side-menu-active-border); + box-shadow: inset 3px 0 0 var(--side-menu-active-line), + inset 0 0 0 1px var(--side-menu-active-border); } &:not(.is-active):hover { @@ -111,3 +112,48 @@ } } } + +#app { + // 侧边栏滚动容器,假设侧边栏滚动区域 class 为 sidebar-scroll + .beautify_scroll { + // Firefox 滚动条 + scrollbar-width: thin; + scrollbar-color: var(--side-scrollbar-thumb) var(--side-scrollbar-bg); + + // webkit 滚动条 + &::-webkit-scrollbar { + width: 6px; // 滚动条宽度 + height: 6px; + } + + &::-webkit-scrollbar-track { + background: var(--side-scrollbar-bg); + border-radius: 3px; + } + + &::-webkit-scrollbar-thumb { + background: var(--side-scrollbar-thumb); + border-radius: 3px; + + &:hover { + background: var(--side-scrollbar-thumb-hover); + } + } + + &::-webkit-scrollbar-corner { + background: transparent; + } + } + + // 浅色主题变量 + --side-scrollbar-bg: transparent; + --side-scrollbar-thumb: #c0c4cc; + --side-scrollbar-thumb-hover: #909399; + + // 暗黑主题覆盖变量 + &.theme-dark { + --side-scrollbar-bg: transparent; + --side-scrollbar-thumb: #414243; + --side-scrollbar-thumb-hover: #58595b; + } +} diff --git a/src/assets/styles/tokens/_theme.scss b/src/assets/styles/tokens/_theme.scss index 4562c1f..e671f19 100644 --- a/src/assets/styles/tokens/_theme.scss +++ b/src/assets/styles/tokens/_theme.scss @@ -64,4 +64,6 @@ --el-box-shadow-light: var(--app-shadow-sm); --el-box-shadow: var(--app-shadow-md); --el-bg-color-page: var(--app-shell-bg); + + } diff --git a/src/assets/styles/vendors/element-plus/_overrides.scss b/src/assets/styles/vendors/element-plus/_overrides.scss index 41c8d81..6793f3e 100644 --- a/src/assets/styles/vendors/element-plus/_overrides.scss +++ b/src/assets/styles/vendors/element-plus/_overrides.scss @@ -28,12 +28,21 @@ // --- primary 品牌色(亮色;暗色见 tokens/_theme-dark) --- .el-button--primary { - --el-button-bg-color: var(--app-accent-strong); + border: none; + --el-button-bg-color: #2563eb; --el-button-border-color: var(--app-accent-strong); --el-button-hover-bg-color: #4a7cff; --el-button-hover-border-color: #4a7cff; --el-button-active-bg-color: #2e5ce0; --el-button-active-border-color: #2e5ce0; + + &.is-plain { + //color: rgba(37, 99, 235, 1); + } +} + +.el-button--info { + border: 1px solid #e5e7eb; } // --- 表格 CSS 变量接业务 token --- @@ -82,3 +91,4 @@ html.dark .el-table { .el-select__wrapper { box-shadow: 0 0 0 1px var(--el-border-color) inset; } + diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 8a8f5dc..724d492 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -11,8 +11,8 @@ + + diff --git a/src/components/FormItemTip/index.vue b/src/components/FormItemTip/index.vue new file mode 100644 index 0000000..d4eabac --- /dev/null +++ b/src/components/FormItemTip/index.vue @@ -0,0 +1,371 @@ + + + + + + + diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index 3374da4..fe82c9c 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -26,7 +26,7 @@ @@ -35,17 +35,17 @@ + + + + diff --git a/src/components/tableTag/index.vue b/src/components/tableTag/index.vue new file mode 100644 index 0000000..5caae91 --- /dev/null +++ b/src/components/tableTag/index.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 69066d9..b1b6bd7 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -1,21 +1,21 @@ + diff --git a/src/views/system/conversation/index.vue b/src/views/system/conversation/index.vue new file mode 100644 index 0000000..3a2ac94 --- /dev/null +++ b/src/views/system/conversation/index.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/views/system/conversation/main.vue b/src/views/system/conversation/main.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/system/cskb/add.vue b/src/views/system/cskb/add.vue new file mode 100644 index 0000000..c5aea73 --- /dev/null +++ b/src/views/system/cskb/add.vue @@ -0,0 +1,306 @@ + + + + + diff --git a/src/views/system/cskb/edit.vue b/src/views/system/cskb/edit.vue new file mode 100644 index 0000000..c5aea73 --- /dev/null +++ b/src/views/system/cskb/edit.vue @@ -0,0 +1,306 @@ + + + + + diff --git a/src/views/system/cskb/index.vue b/src/views/system/cskb/index.vue new file mode 100644 index 0000000..4e40247 --- /dev/null +++ b/src/views/system/cskb/index.vue @@ -0,0 +1,359 @@ + + + + + + diff --git a/src/views/system/cssAgent/Add.vue b/src/views/system/cssAgent/Add.vue new file mode 100644 index 0000000..1073913 --- /dev/null +++ b/src/views/system/cssAgent/Add.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/views/system/cssAgent/edit.vue b/src/views/system/cssAgent/edit.vue new file mode 100644 index 0000000..a765e3b --- /dev/null +++ b/src/views/system/cssAgent/edit.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/views/system/cssAgent/index.vue b/src/views/system/cssAgent/index.vue new file mode 100644 index 0000000..3780664 --- /dev/null +++ b/src/views/system/cssAgent/index.vue @@ -0,0 +1,394 @@ + + + + diff --git a/src/views/system/customer/edit.vue b/src/views/system/customer/edit.vue new file mode 100644 index 0000000..33b0e31 --- /dev/null +++ b/src/views/system/customer/edit.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/src/views/system/customer/index.vue b/src/views/system/customer/index.vue new file mode 100644 index 0000000..6d4baaa --- /dev/null +++ b/src/views/system/customer/index.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/src/views/system/customer/main.vue b/src/views/system/customer/main.vue new file mode 100644 index 0000000..c33acd4 --- /dev/null +++ b/src/views/system/customer/main.vue @@ -0,0 +1,311 @@ + + + + + diff --git a/src/views/system/device/devicelist/edit.vue b/src/views/system/device/devicelist/edit.vue new file mode 100644 index 0000000..50be02d --- /dev/null +++ b/src/views/system/device/devicelist/edit.vue @@ -0,0 +1,474 @@ + + + + + diff --git a/src/views/system/device/devicelist/index.vue b/src/views/system/device/devicelist/index.vue new file mode 100644 index 0000000..8a17314 --- /dev/null +++ b/src/views/system/device/devicelist/index.vue @@ -0,0 +1,366 @@ + + + + + + diff --git a/src/views/system/device/devicelist/main.vue b/src/views/system/device/devicelist/main.vue new file mode 100644 index 0000000..602f9a5 --- /dev/null +++ b/src/views/system/device/devicelist/main.vue @@ -0,0 +1,611 @@ + + + + + diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue index b311015..ab872bc 100644 --- a/src/views/system/oss/index.vue +++ b/src/views/system/oss/index.vue @@ -12,7 +12,7 @@ - + - + 搜索 @@ -109,11 +109,11 @@ @selection-change="handleSelectionChange" @header-click="handleHeaderCLick" > - - - - - + + + + + @@ -131,8 +131,8 @@ {{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }} - - + +