修复已知问题
This commit is contained in:
@@ -1,101 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmBxLog, HjmBxLogParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询黄家明_保险记录
|
||||
*/
|
||||
export async function pageHjmBxLog(params: HjmBxLogParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmBxLog>>>(
|
||||
'/hjm/hjm-bx-log/page',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询黄家明_保险记录列表
|
||||
*/
|
||||
export async function listHjmBxLog(params?: HjmBxLogParam) {
|
||||
const res = await request.get<ApiResult<HjmBxLog[]>>(
|
||||
'/hjm/hjm-bx-log',
|
||||
params
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加黄家明_保险记录
|
||||
*/
|
||||
export async function addHjmBxLog(data: HjmBxLog) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-bx-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改黄家明_保险记录
|
||||
*/
|
||||
export async function updateHjmBxLog(data: HjmBxLog) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-bx-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除黄家明_保险记录
|
||||
*/
|
||||
export async function removeHjmBxLog(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-bx-log/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除黄家明_保险记录
|
||||
*/
|
||||
export async function removeBatchHjmBxLog(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-bx-log/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询黄家明_保险记录
|
||||
*/
|
||||
export async function getHjmBxLog(id: number) {
|
||||
const res = await request.get<ApiResult<HjmBxLog>>(
|
||||
'/hjm/hjm-bx-log/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 黄家明_保险记录
|
||||
*/
|
||||
export interface HjmBxLog {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 用户ID
|
||||
userId?: number;
|
||||
// 事故类型
|
||||
accidentType?: string;
|
||||
// 车辆ID
|
||||
carId?: number;
|
||||
// 车辆编号
|
||||
carNo?: string;
|
||||
// 保险图片
|
||||
image?: any;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 黄家明_保险记录搜索条件
|
||||
*/
|
||||
export interface HjmBxLogParam extends PageParam {
|
||||
id?: number;
|
||||
userId?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,152 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmCar, HjmCarParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询黄家明_车辆管理
|
||||
*/
|
||||
export async function pageHjmCar(params: HjmCarParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmCar>>>(
|
||||
'/hjm/hjm-car/page',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询黄家明_车辆管理列表
|
||||
*/
|
||||
export async function listHjmCar(params?: HjmCarParam) {
|
||||
const res = await request.get<ApiResult<HjmCar[]>>(
|
||||
'/hjm/hjm-car',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加黄家明_车辆管理
|
||||
*/
|
||||
export async function addHjmCar(data: HjmCar) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-car',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改黄家明_车辆管理
|
||||
*/
|
||||
export async function updateHjmCar(data: HjmCar) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-car',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除黄家明_车辆管理
|
||||
*/
|
||||
export async function removeHjmCar(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-car/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除黄家明_车辆管理
|
||||
*/
|
||||
export async function removeBatchHjmCar(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-car/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询黄家明_车辆管理
|
||||
*/
|
||||
export async function getHjmCar(id: number) {
|
||||
const res = await request.get<ApiResult<HjmCar>>(
|
||||
'/hjm/hjm-car/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据code查询黄家明_车辆管理
|
||||
*/
|
||||
export async function getHjmCarByCode(code: string) {
|
||||
const res = await request.get<ApiResult<HjmCar>>(
|
||||
'/hjm/hjm-car/getByCode/' + code
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
export async function pageByQQMap(params: HjmCarParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmCar>>>(
|
||||
'/hjm/hjm-car/pageByQQMap',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
export async function pushSubscriptionMessages(data: any) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/wx-subscription/send-template',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动mqtt服务
|
||||
*/
|
||||
export async function mqttStart() {
|
||||
const res = await request.get<ApiResult<unknown>>(
|
||||
'/hjm/hjm-car/mqtt'
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,87 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
import {HjmFence} from "@/api/hjm/hjmFence/model";
|
||||
|
||||
/**
|
||||
* 黄家明_车辆管理
|
||||
*/
|
||||
export interface HjmCar {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 车辆名称
|
||||
name?: string;
|
||||
// 车辆图片
|
||||
image?: string;
|
||||
// 类型 0汽车 1其他车
|
||||
type?: number;
|
||||
// 快递公司
|
||||
kuaidi?: string;
|
||||
// 管理负责人
|
||||
kuaidiAdmin?: string;
|
||||
organization?: string;
|
||||
organizationId?: number;
|
||||
organizationParentId?: number;
|
||||
parentOrganization?: string;
|
||||
parentOrganizationAdmin?: string;
|
||||
// 车辆编号
|
||||
code?: string;
|
||||
// 操作员ID
|
||||
driverId?: number;
|
||||
// 操作员
|
||||
driver?: any;
|
||||
// 操作员名称
|
||||
driverName?: string;
|
||||
// 保险状态
|
||||
insuranceStatus?: number;
|
||||
// GPS设备编号
|
||||
gpsNo?: string;
|
||||
// 速度
|
||||
speed?: string;
|
||||
// 电子围栏ID
|
||||
fenceId?: number;
|
||||
// 电子围栏名称
|
||||
fenceName?: string;
|
||||
// 电子围栏
|
||||
fence?: HjmFence;
|
||||
// 位置
|
||||
location?: string;
|
||||
// 经度
|
||||
longitude?: number,
|
||||
// 纬度
|
||||
latitude?: number,
|
||||
// 地址
|
||||
address?: string,
|
||||
// 用户ID
|
||||
userId?: number;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 更新时间
|
||||
updateTime?: string;
|
||||
// 是否在电子围栏内
|
||||
inFence?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* 黄家明_车辆管理搜索条件
|
||||
*/
|
||||
export interface HjmCarParam extends PageParam {
|
||||
id?: number;
|
||||
userId?: number;
|
||||
driverId?: number;
|
||||
organizationId?: number;
|
||||
organizationParentId?: number;
|
||||
status?: number;
|
||||
latitude?: number;
|
||||
longitude?: number;
|
||||
deleted?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmChoices, HjmChoicesParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询选择题选项
|
||||
*/
|
||||
export async function pageHjmChoices(params: HjmChoicesParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmChoices>>>(
|
||||
'/hjm/hjm-choices/page',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询选择题选项列表
|
||||
*/
|
||||
export async function listHjmChoices(params?: HjmChoicesParam) {
|
||||
const res = await request.get<ApiResult<HjmChoices[]>>(
|
||||
'/hjm/hjm-choices',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加选择题选项
|
||||
*/
|
||||
export async function addHjmChoices(data: HjmChoices) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-choices',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改选择题选项
|
||||
*/
|
||||
export async function updateHjmChoices(data: HjmChoices) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-choices',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除选择题选项
|
||||
*/
|
||||
export async function removeHjmChoices(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-choices/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除选择题选项
|
||||
*/
|
||||
export async function removeBatchHjmChoices(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-choices/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询选择题选项
|
||||
*/
|
||||
export async function getHjmChoices(id: number) {
|
||||
const res = await request.get<ApiResult<HjmChoices>>(
|
||||
'/hjm/hjm-choices/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 选择题选项
|
||||
*/
|
||||
export interface HjmChoices {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 题目ID
|
||||
questionId?: number;
|
||||
// 题目
|
||||
content?: string;
|
||||
// 是否正确
|
||||
isCorrect?: boolean;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择题选项搜索条件
|
||||
*/
|
||||
export interface HjmChoicesParam extends PageParam {
|
||||
id?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type {ApiResult, PageResult} from '@/api/index';
|
||||
import type {HjmCourses, HjmCoursesParam} from './model';
|
||||
|
||||
/**
|
||||
* 分页查询课程
|
||||
*/
|
||||
export async function pageHjmCourses(params: HjmCoursesParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmCourses>>>(
|
||||
'/hjm/hjm-courses/page',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询课程列表
|
||||
*/
|
||||
export async function listHjmCourses(params?: HjmCoursesParam) {
|
||||
const res = await request.get<ApiResult<HjmCourses[]>>(
|
||||
'/hjm/hjm-courses',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加课程
|
||||
*/
|
||||
export async function addHjmCourses(data: HjmCourses) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-courses',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改课程
|
||||
*/
|
||||
export async function updateHjmCourses(data: HjmCourses) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-courses',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除课程
|
||||
*/
|
||||
export async function removeHjmCourses(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-courses/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除课程
|
||||
*/
|
||||
export async function removeBatchHjmCourses(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-courses/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询课程
|
||||
*/
|
||||
export async function getHjmCourses(id: number) {
|
||||
const res = await request.get<ApiResult<HjmCourses>>(
|
||||
'/hjm/hjm-courses/' + id
|
||||
);
|
||||
if (res.code === 0 && res) {
|
||||
return res;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 课程
|
||||
*/
|
||||
export interface HjmCourses {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 课程名称
|
||||
name?: string;
|
||||
// 类型
|
||||
type?: number;
|
||||
// 课程编号
|
||||
code?: string;
|
||||
// 课程封面图
|
||||
image?: string;
|
||||
// 用户ID
|
||||
userId?: number;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 课程搜索条件
|
||||
*/
|
||||
export interface HjmCoursesParam extends PageParam {
|
||||
id?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmExamLog, HjmExamLogParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询黄家明_学习记录
|
||||
*/
|
||||
export async function pageHjmExamLog(params: HjmExamLogParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmExamLog>>>(
|
||||
'/hjm/hjm-exam-log/page',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询黄家明_学习记录列表
|
||||
*/
|
||||
export async function listHjmExamLog(params?: HjmExamLogParam) {
|
||||
const res = await request.get<ApiResult<HjmExamLog[]>>(
|
||||
'/hjm/hjm-exam-log',
|
||||
params
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加黄家明_学习记录
|
||||
*/
|
||||
export async function addHjmExamLog(data: HjmExamLog) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-exam-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改黄家明_学习记录
|
||||
*/
|
||||
export async function updateHjmExamLog(data: HjmExamLog) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-exam-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除黄家明_学习记录
|
||||
*/
|
||||
export async function removeHjmExamLog(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-exam-log/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除黄家明_学习记录
|
||||
*/
|
||||
export async function removeBatchHjmExamLog(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-exam-log/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询黄家明_学习记录
|
||||
*/
|
||||
export async function getHjmExamLog(id: number) {
|
||||
const res = await request.get<ApiResult<HjmExamLog>>(
|
||||
'/hjm/hjm-exam-log/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
|
||||
export async function checkMonthTaskCompleted() {
|
||||
const res = await request.get<ApiResult<HjmExamLog>>(
|
||||
'/hjm/hjm-exam-log/checkMonthTaskCompleted'
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 黄家明_学习记录
|
||||
*/
|
||||
export interface HjmExamLog {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 用户ID
|
||||
userId?: number;
|
||||
// 得分
|
||||
total?: string;
|
||||
// 用时
|
||||
useTime?: string;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 黄家明_学习记录搜索条件
|
||||
*/
|
||||
export interface HjmExamLogParam extends PageParam {
|
||||
id?: number;
|
||||
userId?: number;
|
||||
status?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type {ApiResult, PageResult} from '@/api/index';
|
||||
import type {HjmFence, HjmFenceParam} from './model';
|
||||
|
||||
/**
|
||||
* 分页查询电子围栏
|
||||
*/
|
||||
export async function pageHjmFence(params: HjmFenceParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmFence>>>(
|
||||
'/hjm/hjm-fence/page',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询电子围栏列表
|
||||
*/
|
||||
export async function listHjmFence(params?: HjmFenceParam) {
|
||||
const res = await request.get<ApiResult<HjmFence[]>>(
|
||||
'/hjm/hjm-fence',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加电子围栏
|
||||
*/
|
||||
export async function addHjmFence(data: HjmFence) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-fence',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改电子围栏
|
||||
*/
|
||||
export async function updateHjmFence(data: HjmFence) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-fence',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除电子围栏
|
||||
*/
|
||||
export async function removeHjmFence(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-fence/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除电子围栏
|
||||
*/
|
||||
export async function removeBatchHjmFence(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-fence/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询电子围栏
|
||||
*/
|
||||
export async function getHjmFence(id: number) {
|
||||
const res = await request.get<ApiResult<HjmFence>>(
|
||||
'/hjm/hjm-fence/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 电子围栏
|
||||
*/
|
||||
export interface HjmFence {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 围栏名称
|
||||
name?: string;
|
||||
// 类型 0圆形 1方形
|
||||
type?: number;
|
||||
// 位置
|
||||
location?: string;
|
||||
// 经度
|
||||
longitude?: number;
|
||||
// 纬度
|
||||
latitude?: number;
|
||||
// 区域
|
||||
district?: string;
|
||||
// 轮廓
|
||||
points?: string;
|
||||
// 颜色
|
||||
color?: string;
|
||||
// 填充颜色
|
||||
fillColor?: string;
|
||||
// 圆角
|
||||
radius?: number;
|
||||
// 边框宽度
|
||||
strokeWidth?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 电子围栏搜索条件
|
||||
*/
|
||||
export interface HjmFenceParam extends PageParam {
|
||||
id?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmGpsLog, HjmGpsLogParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询黄家明_gps轨迹
|
||||
*/
|
||||
export async function pageHjmGpsLog(params: HjmGpsLogParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmGpsLog>>>(
|
||||
'/hjm/hjm-gps-log/page',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询黄家明_gps轨迹列表
|
||||
*/
|
||||
export async function listHjmGpsLog(params?: HjmGpsLogParam) {
|
||||
const res = await request.get<ApiResult<HjmGpsLog[]>>(
|
||||
'/hjm/hjm-gps-log',
|
||||
params
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加黄家明_gps轨迹
|
||||
*/
|
||||
export async function addHjmGpsLog(data: HjmGpsLog) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-gps-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改黄家明_gps轨迹
|
||||
*/
|
||||
export async function updateHjmGpsLog(data: HjmGpsLog) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-gps-log',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除黄家明_gps轨迹
|
||||
*/
|
||||
export async function removeHjmGpsLog(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-gps-log/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除黄家明_gps轨迹
|
||||
*/
|
||||
export async function removeBatchHjmGpsLog(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-gps-log/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询黄家明_gps轨迹
|
||||
*/
|
||||
export async function getHjmGpsLog(id: number) {
|
||||
const res = await request.get<ApiResult<HjmGpsLog>>(
|
||||
'/hjm/hjm-gps-log/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
|
||||
/**
|
||||
* 黄家明_gps轨迹
|
||||
*/
|
||||
export interface HjmGpsLog {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 车辆ID
|
||||
carId?: number;
|
||||
// gps编号
|
||||
gpsNo?: string;
|
||||
// 经度
|
||||
longitude?: string;
|
||||
// 纬度
|
||||
latitude?: string;
|
||||
// 时间
|
||||
ddmmyy?: string;
|
||||
// 时分秒
|
||||
hhmmss?: string;
|
||||
// 速度
|
||||
speed?: string;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 黄家明_gps轨迹搜索条件
|
||||
*/
|
||||
export interface HjmGpsLogParam extends PageParam {
|
||||
id?: number;
|
||||
gpsNo?: string;
|
||||
ddmmyy?: string;
|
||||
hhmmss?: string;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { HjmQuestions, HjmQuestionsParam } from './model';
|
||||
|
||||
/**
|
||||
* 分页查询题目
|
||||
*/
|
||||
export async function pageHjmQuestions(params: HjmQuestionsParam) {
|
||||
const res = await request.get<ApiResult<PageResult<HjmQuestions>>>(
|
||||
'/hjm/hjm-questions/page',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询题目列表
|
||||
*/
|
||||
export async function listHjmQuestions(params?: HjmQuestionsParam) {
|
||||
const res = await request.get<ApiResult<HjmQuestions[]>>(
|
||||
'/hjm/hjm-questions',
|
||||
params
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加题目
|
||||
*/
|
||||
export async function addHjmQuestions(data: HjmQuestions) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/hjm/hjm-questions',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改题目
|
||||
*/
|
||||
export async function updateHjmQuestions(data: HjmQuestions) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/hjm/hjm-questions',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除题目
|
||||
*/
|
||||
export async function removeHjmQuestions(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-questions/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除题目
|
||||
*/
|
||||
export async function removeBatchHjmQuestions(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/hjm/hjm-questions/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询题目
|
||||
*/
|
||||
export async function getHjmQuestions(id: number) {
|
||||
const res = await request.get<ApiResult<HjmQuestions>>(
|
||||
'/hjm/hjm-questions/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,54 +0,0 @@
|
||||
import type { PageParam } from '@/api/index';
|
||||
import {HjmChoices} from "@/api/hjm/hjmChoices/model";
|
||||
|
||||
/**
|
||||
* 题目
|
||||
*/
|
||||
export interface HjmQuestions {
|
||||
// 自增ID
|
||||
id?: number;
|
||||
// 课程ID
|
||||
courseId?: number;
|
||||
// 课程名称
|
||||
courseName?: string;
|
||||
// 类型 0choice 1fill 2essay
|
||||
type?: number;
|
||||
// 题目
|
||||
question?: string;
|
||||
// 正确答案
|
||||
correctAnswer?: string;
|
||||
// 难度,'easy', 'medium', 'hard'
|
||||
difficulty?: number;
|
||||
// 用户ID
|
||||
userId?: number;
|
||||
// 排序(数字越小越靠前)
|
||||
sortNumber?: number;
|
||||
// 备注
|
||||
comments?: string;
|
||||
// 状态, 0正常, 1冻结
|
||||
status?: number;
|
||||
// 是否删除, 0否, 1是
|
||||
deleted?: number;
|
||||
// 租户id
|
||||
tenantId?: number;
|
||||
// 创建时间
|
||||
createTime?: string;
|
||||
// 修改时间
|
||||
updateTime?: string;
|
||||
// 选项
|
||||
choicesA?: string,
|
||||
choicesB?: string,
|
||||
choicesC?: string,
|
||||
choicesD?: string,
|
||||
choices?: number;
|
||||
choicesList?: HjmChoices[];
|
||||
}
|
||||
|
||||
/**
|
||||
* 题目搜索条件
|
||||
*/
|
||||
export interface HjmQuestionsParam extends PageParam {
|
||||
id?: number;
|
||||
courseId?: number;
|
||||
keywords?: string;
|
||||
}
|
||||
@@ -128,3 +128,15 @@ export async function submit(data: UserVerify) {
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
export async function myTenantList(params: any) {
|
||||
const res = await request.get<ApiResult<UserVerify>>(
|
||||
'http://127.0.0.1:8080/api/v1/tenants',
|
||||
params
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
|
||||
@@ -1,146 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type {
|
||||
Config,
|
||||
CmsWebsiteField,
|
||||
CmsWebsiteFieldParam
|
||||
} from "@/api/cms/cmsWebsiteField/model";
|
||||
|
||||
|
||||
/**
|
||||
* 分页查询项目参数
|
||||
*/
|
||||
export async function pageWebsiteField(params: CmsWebsiteFieldParam) {
|
||||
const res = await request.get<ApiResult<PageResult<CmsWebsiteField>>>(
|
||||
'/cms/cms-website-field/page',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目参数列表
|
||||
*/
|
||||
export async function listWebsiteField(params?: CmsWebsiteFieldParam) {
|
||||
const res = await request.get<ApiResult<CmsWebsiteField[]>>(
|
||||
'/cms/cms-website-field',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询项目参数
|
||||
*/
|
||||
export async function getWebsiteField(id: number) {
|
||||
const res = await request.get<ApiResult<CmsWebsiteField>>(
|
||||
'/cms/cms-website-field/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加项目参数
|
||||
*/
|
||||
export async function addWebsiteField(data: CmsWebsiteField) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/cms/cms-website-field',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目参数
|
||||
*/
|
||||
export async function updateWebsiteField(data: CmsWebsiteField) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/cms/cms-website-field',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除项目参数
|
||||
*/
|
||||
export async function removeWebsiteField(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/cms/cms-website-field/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除项目参数
|
||||
*/
|
||||
export async function removeBatchWebsiteField(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/cms/cms-website-field/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查IP是否存在
|
||||
*/
|
||||
export async function checkExistence(
|
||||
field: string,
|
||||
value: string,
|
||||
id?: number
|
||||
) {
|
||||
const res = await request.get<ApiResult<unknown>>(
|
||||
'/cms/cms-website-field/existence',
|
||||
{
|
||||
params: { field, value, id }
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目参数列表
|
||||
*/
|
||||
export async function configWebsiteField(params?: CmsWebsiteFieldParam) {
|
||||
const res = await request.get<ApiResult<Config>>(
|
||||
'https://modules.gxwebsoft.com/api/cms/cms-website-field/config',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
import type { PageParam } from '@/api';
|
||||
|
||||
/**
|
||||
* 网站参数
|
||||
*/
|
||||
export interface WebsiteField {
|
||||
id?: number;
|
||||
name?: string;
|
||||
value?: string;
|
||||
comments?: string;
|
||||
userId?: number;
|
||||
websiteId?: number;
|
||||
status?: any;
|
||||
sortNumber?: any;
|
||||
createTime?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 网站参数搜索条件
|
||||
*/
|
||||
export interface WebsiteFieldParam extends PageParam {
|
||||
id?: number;
|
||||
userId?: number;
|
||||
websiteId?: number;
|
||||
}
|
||||
@@ -1,168 +0,0 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ApiResult, PageResult } from '@/api/index';
|
||||
import type { Website, WebsiteParam } from './model';
|
||||
|
||||
/**
|
||||
* 获取网站信息
|
||||
*/
|
||||
export async function getSiteInfo() {
|
||||
const res = await request.get<ApiResult<Website>>(
|
||||
'/system/website/getSiteInfo'
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除缓存
|
||||
*/
|
||||
export async function removeSiteInfoCache(key?: string) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/system/website/clearSiteInfo/' + key
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询网站
|
||||
*/
|
||||
export async function pageWebsite(params: WebsiteParam) {
|
||||
const res = await request.get<ApiResult<PageResult<Website>>>(
|
||||
'/system/website/page',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询网站列表
|
||||
*/
|
||||
export async function listWebsite(params?: WebsiteParam) {
|
||||
const res = await request.get<ApiResult<Website[]>>(
|
||||
'/system/website',
|
||||
{
|
||||
params
|
||||
}
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加网站
|
||||
*/
|
||||
export async function addWebsite(data: Website) {
|
||||
const res = await request.post<ApiResult<unknown>>(
|
||||
'/system/website',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改网站
|
||||
*/
|
||||
export async function updateWebsite(data: Website) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/system/website',
|
||||
data
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除网站
|
||||
*/
|
||||
export async function removeWebsite(id?: number) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/system/website/' + id
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除网站
|
||||
*/
|
||||
export async function removeBatchWebsite(data: (number | undefined)[]) {
|
||||
const res = await request.del<ApiResult<unknown>>(
|
||||
'/system/website/batch',
|
||||
{
|
||||
data
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改用户状态
|
||||
*/
|
||||
export async function updateWebsiteStatus(websiteId?: number, status?: number) {
|
||||
const res = await request.put<ApiResult<unknown>>(
|
||||
'/system/website/status',
|
||||
{
|
||||
websiteId,
|
||||
status
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id查询网站
|
||||
*/
|
||||
export async function getWebsite(id: number) {
|
||||
const res = await request.get<ApiResult<Website>>(
|
||||
'/system/website/' + id
|
||||
);
|
||||
if (res.code === 0 && res.data) {
|
||||
return res.data;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查IP是否存在
|
||||
*/
|
||||
export async function checkExistence(
|
||||
field: string,
|
||||
value: string,
|
||||
id?: number
|
||||
) {
|
||||
const res = await request.get<ApiResult<unknown>>(
|
||||
'/system/website/existence',
|
||||
{
|
||||
params: { field, value, id }
|
||||
}
|
||||
);
|
||||
if (res.code === 0) {
|
||||
return res.message;
|
||||
}
|
||||
return Promise.reject(new Error(res.message));
|
||||
}
|
||||
@@ -1,58 +0,0 @@
|
||||
import { WebsiteField } from '@/api/cms/website/field/model';
|
||||
import { Navigation } from '@/api/cms/navigation/model';
|
||||
import { Link } from '@/api/cms/link/model';
|
||||
import { ArrangeCategory } from '@/api/cms/category/model';
|
||||
|
||||
/**
|
||||
* 菜单
|
||||
*/
|
||||
export interface Website {
|
||||
websiteId?: number;
|
||||
websiteName?: string;
|
||||
websiteCode?: string;
|
||||
websiteIcon?: string;
|
||||
websiteLogo?: string;
|
||||
websiteDarkLogo?: string;
|
||||
keywords?: string;
|
||||
address?: string;
|
||||
phone?: string;
|
||||
email?: string;
|
||||
websiteType?: string;
|
||||
expirationTime?: string;
|
||||
templateId?: string;
|
||||
industryParent?: string;
|
||||
industryChild?: string;
|
||||
companyId?: number;
|
||||
domain?: string;
|
||||
icpNo?: string;
|
||||
policeNo?: string;
|
||||
comments?: string;
|
||||
sortNumber?: number;
|
||||
createTime?: string;
|
||||
disabled?: boolean;
|
||||
country?: string;
|
||||
province?: string;
|
||||
recommend?: number;
|
||||
city?: string;
|
||||
region?: string;
|
||||
appId?: number;
|
||||
fields?: WebsiteField[];
|
||||
status?: number;
|
||||
tenantId?: number;
|
||||
tenantName?: string;
|
||||
navigations?: Navigation[];
|
||||
categoryList?: ArrangeCategory[];
|
||||
links?: Link[];
|
||||
// 配置信息
|
||||
config?: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜单搜索参数
|
||||
*/
|
||||
export interface WebsiteParam {
|
||||
title?: string;
|
||||
path?: string;
|
||||
authority?: string;
|
||||
parentId?: number;
|
||||
}
|
||||
@@ -2,9 +2,8 @@ export default defineAppConfig({
|
||||
pages: [
|
||||
'pages/index/index',
|
||||
'pages/order/order',
|
||||
'pages/kefu/kefu',
|
||||
'pages/user/user',
|
||||
// 'pages/find/find'
|
||||
'pages/cart/cart',
|
||||
'pages/user/user'
|
||||
],
|
||||
"subpackages": [
|
||||
{
|
||||
@@ -30,7 +29,6 @@ export default defineAppConfig({
|
||||
{
|
||||
"root": "user",
|
||||
"pages": [
|
||||
"car/index",
|
||||
"company/company",
|
||||
"profile/profile",
|
||||
"setting/setting",
|
||||
|
||||
22
src/app.scss
22
src/app.scss
@@ -48,4 +48,26 @@ button[open-type="chooseAvatar"] {
|
||||
border-radius: 100px 0 0 100px;
|
||||
height: 70px;
|
||||
}
|
||||
.cart-add{
|
||||
background: #e9fff2;
|
||||
color: #333333;
|
||||
border-radius: 20px 0 0 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 80px;
|
||||
}
|
||||
.cart-buy{
|
||||
background: linear-gradient(-45deg, #1fbfa2, #94e0ce);
|
||||
color: #ffffff;
|
||||
border-radius: 0 20px 20px 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 80px;
|
||||
}
|
||||
}
|
||||
|
||||
image {
|
||||
margin: 0; /* 全局设置图片的 margin */
|
||||
}
|
||||
|
||||
@@ -6,13 +6,9 @@ import './app.scss'
|
||||
import {loginByOpenId} from "@/api/layout";
|
||||
import {TenantId} from "@/utils/config";
|
||||
import {saveStorageByLoginUser} from "@/utils/server";
|
||||
import {mqttStart} from "@/api/hjm/hjmCar";
|
||||
|
||||
function App(props) {
|
||||
const reload = () => {
|
||||
mqttStart().then(() => {
|
||||
console.log('mqttStart')
|
||||
})
|
||||
Taro.login({
|
||||
success: (res) => {
|
||||
loginByOpenId({
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
import {Avatar, Cell, Space, Tabs, Button, TabPane} from '@nutui/nutui-react-taro'
|
||||
import {useEffect, useState, CSSProperties} from "react";
|
||||
import Taro from '@tarojs/taro';
|
||||
import {BszxPay} from "@/api/bszx/bszxPay/model";
|
||||
import {InfiniteLoading} from '@nutui/nutui-react-taro'
|
||||
import dayjs from "dayjs";
|
||||
import {pageShopOrder} from "@/api/shop/shopOrder";
|
||||
@@ -167,7 +166,6 @@ function OrderList(props: any) {
|
||||
</div>
|
||||
<div className={' w-full text-right'}>实付金额:¥{item.payPrice}</div>
|
||||
<Space className={'btn flex justify-end'}>
|
||||
<Button size={'small'}>取消订单</Button>
|
||||
<Button size={'small'}>发货</Button>
|
||||
</Space>
|
||||
</Space>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export default definePageConfig({
|
||||
navigationBarTitleText: '商品列表',
|
||||
navigationBarTitleText: '购物车',
|
||||
navigationBarTextStyle: 'black',
|
||||
navigationStyle: 'custom'
|
||||
})
|
||||
@@ -4,7 +4,7 @@ import {Space, NavBar} from '@nutui/nutui-react-taro'
|
||||
import {Search, Received, Scan} from '@nutui/icons-react-taro'
|
||||
import GoodsList from "@/components/GoodsList";
|
||||
|
||||
function Kefu() {
|
||||
function Cart() {
|
||||
const [statusBarHeight, setStatusBarHeight] = useState<number>()
|
||||
|
||||
useShareTimeline(() => {
|
||||
@@ -64,4 +64,4 @@ function Kefu() {
|
||||
);
|
||||
}
|
||||
|
||||
export default Kefu;
|
||||
export default Cart;
|
||||
@@ -7,7 +7,7 @@ import {getCmsAd} from "@/api/cms/cmsAd";
|
||||
const MyPage = () => {
|
||||
const [item, setItem] = useState<CmsAd>()
|
||||
const reload = () => {
|
||||
getCmsAd(433).then(data => {
|
||||
getCmsAd(439).then(data => {
|
||||
setItem(data)
|
||||
})
|
||||
}
|
||||
@@ -18,10 +18,10 @@ const MyPage = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<Swiper defaultValue={0} height={item?.height} indicator style={{ height: item?.height, display: 'none' }}>
|
||||
<Swiper defaultValue={0} height={item?.height} indicator style={{ height: item?.height + 'px', display: 'none' }}>
|
||||
{item?.imageList?.map((item) => (
|
||||
<Swiper.Item key={item}>
|
||||
<Image width="100%" height="100%" src={item.url} mode={'scaleToFill'} style={{ height: item.height }} />
|
||||
<Image width="100%" height="100%" src={item.url} mode={'scaleToFill'} style={{ height: item.height + 'px' }} />
|
||||
</Swiper.Item>
|
||||
))}
|
||||
</Swiper>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {useEffect, useState} from "react";
|
||||
import {Image, Space, Tag, Divider} from '@nutui/nutui-react-taro'
|
||||
import {Cart} from '@nutui/icons-react-taro'
|
||||
import {Image} from '@nutui/nutui-react-taro'
|
||||
import {Share} from '@nutui/icons-react-taro'
|
||||
import Taro from '@tarojs/taro'
|
||||
import {ShopGoods} from "@/api/shop/shopGoods/model";
|
||||
import {pageShopGoods} from "@/api/shop/shopGoods";
|
||||
@@ -9,11 +9,11 @@ import './BestSellers.scss'
|
||||
|
||||
const BestSellers = () => {
|
||||
const [list, setList] = useState<ShopGoods[]>([])
|
||||
|
||||
const reload = () => {
|
||||
pageShopGoods({}).then(res => {
|
||||
setList(res?.list || []);
|
||||
})
|
||||
console.log(list)
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
@@ -21,48 +21,45 @@ const BestSellers = () => {
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className={'py-0'}>
|
||||
<div className={'flex flex-col justify-between items-center rounded-lg px-2'}>
|
||||
{list?.map((item, index) => {
|
||||
return (
|
||||
<div key={index} className={'flex flex-col rounded-lg bg-white shadow-sm w-full mb-5'}
|
||||
onClick={() => Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}>
|
||||
<Image src={item.image} mode={'scaleToFill'}
|
||||
radius="10px 10px 0 0" height="180"/>
|
||||
<div className={'flex flex-col p-2 rounded-lg'}>
|
||||
<div>
|
||||
<div className={'car-no text-sm'}>{item.name} #{item.goodsId}</div>
|
||||
<div className={'flex justify-between text-xs py-1'}>
|
||||
<span className={'text-orange-500'}>丰江桥佛手瓜面,非油炸,Q弹爽口,营养丰</span>
|
||||
<span className={'text-gray-400'}>已售 {item.sales}</span>
|
||||
</div>
|
||||
<Space>
|
||||
<Tag plain round background={'#ff0000'}>会客厅循环劵<Divider direction={'vertical'} style={{
|
||||
borderStyle: 'dashed', padding: '0',
|
||||
borderColor: '#fd8989', margin: '0 5px'
|
||||
}}/>每拍2减10元</Tag>
|
||||
<Tag plain round background={'#ff0000'}>会客厅专享<Divider direction={'vertical'} style={{
|
||||
borderStyle: 'dashed', padding: '0',
|
||||
borderColor: '#fd8989', margin: '0 5px'
|
||||
}}/>拍1减3元</Tag>
|
||||
</Space>
|
||||
<div className={'flex justify-between items-center py-2'}>
|
||||
<div className={'flex text-red-500 text-xl items-baseline'}>
|
||||
<span className={'text-xs'}>¥</span>
|
||||
<span className={'font-bold text-2xl'}>19.9</span>
|
||||
<>
|
||||
<div className={'py-3'}>
|
||||
<div className={'flex flex-col justify-between items-center rounded-lg px-2'}>
|
||||
{list?.map((item, index) => {
|
||||
return (
|
||||
<div key={index} className={'flex flex-col rounded-lg bg-white shadow-sm w-full mb-5'}>
|
||||
<Image src={item.image} mode={'scaleToFill'}
|
||||
radius="10px 10px 0 0" height="180"
|
||||
onClick={() => Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}/>
|
||||
<div className={'flex flex-col p-2 rounded-lg'}>
|
||||
<div>
|
||||
<div className={'car-no text-sm'}>{item.name}</div>
|
||||
<div className={'flex justify-between text-xs py-1'}>
|
||||
<span className={'text-orange-500'}>{item.comments}</span>
|
||||
<span className={'text-gray-400'}>已售 {item.sales}</span>
|
||||
</div>
|
||||
<div className={'buy-btn'}>
|
||||
<div className={'cart-icon'}><Cart size={20} className={'mx-4 mt-2'} /></div>
|
||||
<div className={'text-white pl-4 pr-5'}>购买</div>
|
||||
<div className={'flex justify-between items-center py-2'}>
|
||||
<div className={'flex text-red-500 text-xl items-baseline'}>
|
||||
<span className={'text-xs'}>¥</span>
|
||||
<span className={'font-bold text-2xl'}>{item.price}</span>
|
||||
</div>
|
||||
<div className={'buy-btn'}>
|
||||
<div className={'cart-icon'}>
|
||||
<Share size={20} className={'mx-4 mt-2'}
|
||||
onClick={() => Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}/>
|
||||
</div>
|
||||
<div className={'text-white pl-4 pr-5'}
|
||||
onClick={() => Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}>购买
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
export default BestSellers
|
||||
|
||||
8
src/pages/index/Header.scss
Normal file
8
src/pages/index/Header.scss
Normal file
@@ -0,0 +1,8 @@
|
||||
.header-bg{
|
||||
background: linear-gradient(to bottom, #03605c, #18ae4f);
|
||||
height: 335px;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
position: absolute;
|
||||
z-index: 0;
|
||||
}
|
||||
@@ -6,9 +6,11 @@ import {Popup, Avatar, NavBar} from '@nutui/nutui-react-taro'
|
||||
import {getSiteInfo, getUserInfo, getWxOpenId} from "@/api/layout";
|
||||
import {TenantId} from "@/utils/config";
|
||||
import {getOrganization} from "@/api/system/organization";
|
||||
import {myUserVerify} from "@/api/system/userVerify";
|
||||
import {myTenantList, myUserVerify} from "@/api/system/userVerify";
|
||||
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
|
||||
import {User} from "@/api/system/user/model";
|
||||
import './Header.scss';
|
||||
import MySearch from "./MySearch";
|
||||
|
||||
const Header = () => {
|
||||
const [userInfo, setUserInfo] = useState<User>()
|
||||
@@ -33,7 +35,7 @@ const Header = () => {
|
||||
if (data) {
|
||||
setIsLogin(true);
|
||||
setUserInfo(data)
|
||||
console.log('用户信息>>>',data.phone)
|
||||
console.log('用户信息>>>', data.phone)
|
||||
// 保存userId
|
||||
Taro.setStorageSync('UserId', data.userId)
|
||||
// 获取openId
|
||||
@@ -46,27 +48,27 @@ const Header = () => {
|
||||
})
|
||||
}
|
||||
// 是否已认证
|
||||
if(data.certification){
|
||||
Taro.setStorageSync('Certification','1')
|
||||
if (data.certification) {
|
||||
Taro.setStorageSync('Certification', '1')
|
||||
}
|
||||
// 机构ID
|
||||
Taro.setStorageSync('OrganizationId',data.organizationId)
|
||||
Taro.setStorageSync('OrganizationId', data.organizationId)
|
||||
// 父级机构ID
|
||||
if(Number(data.organizationId) > 0){
|
||||
if (Number(data.organizationId) > 0) {
|
||||
getOrganization(Number(data.organizationId)).then(res => {
|
||||
Taro.setStorageSync('OrganizationParentId',res.parentId)
|
||||
Taro.setStorageSync('OrganizationParentId', res.parentId)
|
||||
})
|
||||
}
|
||||
// 管理员
|
||||
const isKdy = data.roles?.findIndex(item => item.roleCode == 'admin')
|
||||
if(isKdy != -1){
|
||||
if (isKdy != -1) {
|
||||
Taro.setStorageSync('RoleName', '管理')
|
||||
Taro.setStorageSync('RoleCode', 'admin')
|
||||
return false;
|
||||
}
|
||||
// 注册用户
|
||||
const isUser = data.roles?.findIndex(item => item.roleCode == 'user')
|
||||
if(isUser != -1){
|
||||
if (isUser != -1) {
|
||||
Taro.setStorageSync('RoleName', '注册用户')
|
||||
Taro.setStorageSync('RoleCode', 'user')
|
||||
return false;
|
||||
@@ -78,10 +80,14 @@ const Header = () => {
|
||||
});
|
||||
// 认证信息
|
||||
myUserVerify({status: 1}).then(data => {
|
||||
if(data?.realName){
|
||||
Taro.setStorageSync('RealName',data.realName)
|
||||
if (data?.realName) {
|
||||
Taro.setStorageSync('RealName', data.realName)
|
||||
}
|
||||
})
|
||||
//
|
||||
myTenantList({page: 2, page_size: 50}).then(res => {
|
||||
console.log(res, '...res...lei')
|
||||
})
|
||||
}
|
||||
|
||||
/* 获取用户手机号 */
|
||||
@@ -107,7 +113,7 @@ const Header = () => {
|
||||
TenantId
|
||||
},
|
||||
success: function (res) {
|
||||
if(res.data.code == 1){
|
||||
if (res.data.code == 1) {
|
||||
Taro.showToast({
|
||||
title: res.data.message,
|
||||
icon: 'error',
|
||||
@@ -138,6 +144,9 @@ const Header = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<div className={'fixed top-0 header-bg'}>
|
||||
<MySearch done={reload}/>
|
||||
</div>
|
||||
<NavBar
|
||||
style={{marginTop: `${statusBarHeight}px`, marginBottom: '0px', backgroundColor: 'transparent'}}
|
||||
onBackClick={() => {
|
||||
@@ -162,8 +171,8 @@ const Header = () => {
|
||||
size="22"
|
||||
src={config?.websiteLogo}
|
||||
/>
|
||||
{config?.websiteName}
|
||||
<TriangleDown size={9}/>
|
||||
<span className={'text-white'}>{config?.websiteName}</span>
|
||||
<TriangleDown className={'text-white'} size={9}/>
|
||||
</div>
|
||||
)}>
|
||||
</NavBar>
|
||||
|
||||
@@ -30,20 +30,18 @@ const Page = () => {
|
||||
|
||||
return (
|
||||
loading ? (<Loading>加载中</Loading>) :
|
||||
<div className={'p-3'}>
|
||||
<div className={'rounded-2xl'}>
|
||||
<div className={'flex justify-between pb-2 px-1'}>
|
||||
{
|
||||
navItems.map((item, index) => (
|
||||
<div key={index} className={'text-center'} onClick={() => onNav(item)}>
|
||||
<div className={'flex flex-col justify-center items-center'}>
|
||||
<Image src={item.icon} height={36} width={36}/>
|
||||
<div className={'mt-2 text-gray-600'} style={{fontSize: '14px'}}>{item?.title}</div>
|
||||
</div>
|
||||
<div className={'p-2 z-50 mt-1'}>
|
||||
<div className={'flex justify-between pb-2 p-2 bg-white rounded-xl shadow-sm'}>
|
||||
{
|
||||
navItems.map((item, index) => (
|
||||
<div key={index} className={'text-center'} onClick={() => onNav(item)}>
|
||||
<div className={'flex flex-col justify-center items-center p-1'}>
|
||||
<Image src={item.icon} height={36} width={36}/>
|
||||
<div className={'mt-1 text-gray-600'} style={{fontSize: '14px'}}>{item?.title}</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -22,15 +22,16 @@ function MySearch(props) {
|
||||
|
||||
|
||||
return (
|
||||
<div className={'z-20 left-0 w-full'}>
|
||||
<div className={'z-50 left-0 w-full'}>
|
||||
<div className={'px-2'}>
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
background: '#fff',
|
||||
background: '#ffffff',
|
||||
padding: '0 7px',
|
||||
borderRadius: '20px'
|
||||
borderRadius: '20px',
|
||||
marginTop: '100px',
|
||||
}}
|
||||
>
|
||||
<Search size={18} className={'ml-2 text-gray-400'}/>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import Header from './Header';
|
||||
import MySearch from "./MySearch";
|
||||
import BestSellers from './BestSellers';
|
||||
import Taro from '@tarojs/taro';
|
||||
import {useShareAppMessage, useShareTimeline} from "@tarojs/taro"
|
||||
@@ -103,10 +102,9 @@ function Home() {
|
||||
return (
|
||||
<>
|
||||
<Header/>
|
||||
<MySearch done={reload}/>
|
||||
<div className={'flex flex-col mt-3'}>
|
||||
<Banner />
|
||||
<div className={'flex flex-col mt-12'}>
|
||||
<Menu />
|
||||
<Banner />
|
||||
<BestSellers/>
|
||||
</div>
|
||||
</>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
export default definePageConfig({
|
||||
navigationBarTitleText: '商品详情',
|
||||
navigationBarTextStyle: 'black'
|
||||
navigationBarTextStyle: 'black',
|
||||
navigationStyle: 'custom'
|
||||
})
|
||||
|
||||
@@ -3,3 +3,15 @@
|
||||
border-radius: 100px 0 0 100px;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
/* 去掉 RichText 中图片的间距 */
|
||||
rich-text img {
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* 在全局样式或组件样式文件中 */
|
||||
.no-margin {
|
||||
margin: 0 !important; /* 使用 !important 来确保覆盖默认样式 */
|
||||
}
|
||||
|
||||
@@ -1,70 +1,193 @@
|
||||
import {useEffect, useState} from "react";
|
||||
import {Image, Space, Tag, Divider} from '@nutui/nutui-react-taro'
|
||||
import {Cart} from '@nutui/icons-react-taro'
|
||||
import Taro from '@tarojs/taro'
|
||||
import {Image, Divider, Badge} from "@nutui/nutui-react-taro";
|
||||
import {ArrowLeft, Headphones, Share, Cart} from "@nutui/icons-react-taro";
|
||||
import Taro, {useShareAppMessage, useShareTimeline} from "@tarojs/taro";
|
||||
import {RichText, View} from '@tarojs/components'
|
||||
import {ShopGoods} from "@/api/shop/shopGoods/model";
|
||||
import {getShopGoods} from "@/api/shop/shopGoods";
|
||||
import './index.scss'
|
||||
import {Swiper} from '@nutui/nutui-react-taro'
|
||||
import {wxParse} from "@/utils/common";
|
||||
import "./index.scss";
|
||||
|
||||
const GoodsDetail = () => {
|
||||
const [goods, setGoods] = useState<ShopGoods | null>(null);
|
||||
const [files, setFiles] = useState<any[]>([]);
|
||||
const router = Taro.getCurrentInstance().router;
|
||||
const goodsId = router?.params?.id;
|
||||
|
||||
useEffect(() => {
|
||||
if (goodsId) {
|
||||
getShopGoods(Number(goodsId)).then(res => {
|
||||
setGoods(res);
|
||||
}).catch(error => {
|
||||
console.error("Failed to fetch goods detail:", error);
|
||||
});
|
||||
getShopGoods(Number(goodsId))
|
||||
.then((res) => {
|
||||
// 处理富文本内容,去掉图片间距
|
||||
if (res.content) {
|
||||
res.content = wxParse(res.content);
|
||||
}
|
||||
setGoods(res);
|
||||
if (res.files) {
|
||||
const arr = JSON.parse(res.files);
|
||||
arr.length > 0 && setFiles(arr);
|
||||
}
|
||||
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error("Failed to fetch goods detail:", error);
|
||||
});
|
||||
}
|
||||
}, [goodsId]);
|
||||
|
||||
// 分享给好友
|
||||
useShareAppMessage(() => {
|
||||
return {
|
||||
title: goods?.name || '精选商品',
|
||||
path: `/shop/goodsDetail/index?id=${goodsId}`,
|
||||
imageUrl: goods?.image, // 分享图片
|
||||
success: function (res: any) {
|
||||
console.log('分享成功', res);
|
||||
Taro.showToast({
|
||||
title: '分享成功',
|
||||
icon: 'success',
|
||||
duration: 2000
|
||||
});
|
||||
},
|
||||
fail: function (res: any) {
|
||||
console.log('分享失败', res);
|
||||
Taro.showToast({
|
||||
title: '分享失败',
|
||||
icon: 'none',
|
||||
duration: 2000
|
||||
});
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
// 分享到朋友圈
|
||||
useShareTimeline(() => {
|
||||
return {
|
||||
title: `${goods?.name || '精选商品'} - 云上商店`,
|
||||
path: `/shop/goodsDetail/index?id=${goodsId}`,
|
||||
imageUrl: goods?.image
|
||||
};
|
||||
});
|
||||
|
||||
if (!goods) {
|
||||
return <div>加载中...</div>;
|
||||
}
|
||||
|
||||
return (
|
||||
<div className={'py-0'}>
|
||||
<div className={'flex flex-col justify-between items-center rounded-lg px-2'}>
|
||||
<div className={'flex flex-col rounded-lg bg-white shadow-sm w-full mb-5'}>
|
||||
<Image src={goods.image} mode={'scaleToFill'}
|
||||
radius="10px 10px 0 0" height="300"/>
|
||||
<div className={'flex flex-col p-2 rounded-lg'}>
|
||||
<div>
|
||||
<div className={'car-no text-sm'}>{goods.name} #{goods.goodsId}</div>
|
||||
<div className={'flex justify-between text-xs py-1'}>
|
||||
<span className={'text-orange-500'}>丰江桥佛手瓜面,非油炸,Q弹爽口,营养丰</span>
|
||||
<span className={'text-gray-400'}>已售 {goods.sales}</span>
|
||||
</div>
|
||||
<Space>
|
||||
<Tag plain round background={'#ff0000'}>会客厅循环劵<Divider direction={'vertical'} style={{
|
||||
borderStyle: 'dashed', padding: '0',
|
||||
borderColor: '#fd8989', margin: '0 5px'
|
||||
}}/>每拍2减10元</Tag>
|
||||
<Tag plain round background={'#ff0000'}>会客厅专享<Divider direction={'vertical'} style={{
|
||||
borderStyle: 'dashed', padding: '0',
|
||||
borderColor: '#fd8989', margin: '0 5px'
|
||||
}}/>拍1减3元</Tag>
|
||||
</Space>
|
||||
<div className={'flex justify-between items-center py-2'}>
|
||||
<div className={"py-0"}>
|
||||
<div
|
||||
className={
|
||||
"fixed z-10 bg-white flex justify-center items-center font-bold shadow-sm opacity-70"
|
||||
}
|
||||
style={{
|
||||
borderRadius: "100%",
|
||||
width: "32px",
|
||||
height: "32px",
|
||||
top: "50px",
|
||||
left: "10px",
|
||||
}}
|
||||
onClick={() => Taro.navigateBack()}
|
||||
>
|
||||
<ArrowLeft size={14}/>
|
||||
</div>
|
||||
<div className={
|
||||
"fixed z-10 bg-white flex justify-center items-center font-bold shadow-sm opacity-90"
|
||||
}
|
||||
style={{
|
||||
borderRadius: "100%",
|
||||
width: "32px",
|
||||
height: "32px",
|
||||
top: "50px",
|
||||
right: "110px",
|
||||
}}>
|
||||
<Badge value={8} top="-2" right="2">
|
||||
<div style={{display: 'flex', alignItems: 'center'}}>
|
||||
<Cart size={16}/>
|
||||
</div>
|
||||
</Badge>
|
||||
</div>
|
||||
{
|
||||
files.length > 0 && (
|
||||
<Swiper defaultValue={0} indicator height={'350px'}>
|
||||
{files.map((item) => (
|
||||
<Swiper.Item key={item}>
|
||||
<Image width="100%" height={'100%'} src={item.url} mode={'scaleToFill'}/>
|
||||
</Swiper.Item>
|
||||
))}
|
||||
</Swiper>
|
||||
)
|
||||
}
|
||||
{
|
||||
files.length == 0 && (
|
||||
<Image
|
||||
src={goods.image}
|
||||
mode={"scaleToFill"}
|
||||
radius="10px 10px 0 0"
|
||||
height="300"
|
||||
/>
|
||||
)
|
||||
}
|
||||
<div
|
||||
className={"flex flex-col justify-between items-center rounded-lg px-2"}
|
||||
>
|
||||
<div
|
||||
className={
|
||||
"flex flex-col rounded-lg bg-white shadow-sm w-full mt-2"
|
||||
}
|
||||
>
|
||||
<div className={"flex flex-col p-2 rounded-lg"}>
|
||||
<>
|
||||
<div className={'flex justify-between'}>
|
||||
<div className={'flex text-red-500 text-xl items-baseline'}>
|
||||
<span className={'text-xs'}>¥</span>
|
||||
<span className={'font-bold text-2xl'}>{goods.price}</span>
|
||||
</div>
|
||||
<div className={'buy-btn'} onClick={() => Taro.navigateTo({url: '/shop/orderConfirm/index?goodsId=' + goods.goodsId})}>
|
||||
<div className={'cart-icon'}><Cart size={20} className={'mx-4 mt-2'} /></div>
|
||||
<div className={'text-white pl-4 pr-5'}>购买</div>
|
||||
<span className={"text-gray-400 text-xs"}>已售 {goods.sales}</span>
|
||||
</div>
|
||||
<div className={'flex justify-between items-center'}>
|
||||
<div className={'goods-info'}>
|
||||
<div className={"car-no text-lg"}>
|
||||
{goods.name}
|
||||
</div>
|
||||
<div className={"flex justify-between text-xs py-1"}>
|
||||
<span className={"text-orange-500"}>
|
||||
{goods.comments}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
className={'flex flex-col justify-center items-center text-gray-500 px-1 gap-1 text-nowrap whitespace-nowrap'}
|
||||
open-type="share"><Share
|
||||
size={20}/>
|
||||
<span className={'text-xs'}>分享</span>
|
||||
</button>
|
||||
</div>
|
||||
<div className={'py-2'}>
|
||||
<h3>商品详情</h3>
|
||||
<div dangerouslySetInnerHTML={{ __html: goods.content || '' }} />
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
</div>
|
||||
</div>
|
||||
<div className={"mt-2 py-2"}>
|
||||
<Divider>商品详情</Divider>
|
||||
<RichText nodes={goods.content || '内容详情'}/>
|
||||
</div>
|
||||
</div>
|
||||
{/*底部购买按钮*/}
|
||||
<div className={'fixed bg-white w-full bottom-0 left-0 pt-4 pb-10'}>
|
||||
<View className={'btn-bar flex justify-between items-center'}>
|
||||
<div className={'flex justify-center items-center mx-4'}>
|
||||
<button open-type="contact" className={'flex items-center'}>
|
||||
<Headphones size={18} style={{marginRight: '4px'}}/>咨询
|
||||
</button>
|
||||
</div>
|
||||
<div className={'buy-btn mx-4'}>
|
||||
<div className={'cart-add px-4 text-sm'}
|
||||
onClick={() => Taro.showToast({title: '加入购物车成功', icon: 'success'})}>加入购物车
|
||||
</div>
|
||||
<div className={'cart-buy pl-4 pr-5 text-sm'}
|
||||
onClick={() => Taro.navigateTo({url: '/shop/orderConfirm/index'})}>立即购买
|
||||
</div>
|
||||
</div>
|
||||
</View>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
import {useEffect} from "react";
|
||||
import {Image, Space} from '@nutui/nutui-react-taro'
|
||||
import Taro from '@tarojs/taro'
|
||||
|
||||
const BestSellers = (props: any) => {
|
||||
const reload = () => {
|
||||
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
reload()
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<div className={'px-2 mb-4'}>
|
||||
<div className={'flex flex-col justify-between items-center rounded-lg px-3'}>
|
||||
{props.data?.map((item, index) => {
|
||||
return (
|
||||
<div key={index} className={'flex bg-white rounded-lg w-full p-3 mb-3'}
|
||||
onClick={() => Taro.navigateTo({url: '/hjm/query?id=' + item.code})}>
|
||||
{item.image && (
|
||||
<Image src={JSON.parse(item.image)[0].url} mode={'scaleToFill'}
|
||||
radius="10%" width="80" height="80"/>
|
||||
)}
|
||||
<div className={'mx-3 flex flex-col'}>
|
||||
<Space direction={'vertical'}>
|
||||
<div className={'car-no text-lg font-bold'}>{item.code}</div>
|
||||
<div className={'flex text-xs text-gray-500'}>快递公司:<span
|
||||
className={'text-gray-700'}>{item.parentOrganization}</span></div>
|
||||
<div className={'flex text-xs text-gray-500'}>保险状态:<span className={'text-green-600'}>{item.insuranceStatus}</span>
|
||||
</div>
|
||||
<div className={'flex text-xs text-gray-500'}>绑定操作员:<span
|
||||
className={'text-gray-700'}>{item.driver}</span></div>
|
||||
</Space>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
<div style={{height: '170px'}}></div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
export default BestSellers
|
||||
@@ -1,4 +0,0 @@
|
||||
export default definePageConfig({
|
||||
navigationBarTitleText: '车辆管理',
|
||||
navigationStyle: 'custom'
|
||||
})
|
||||
@@ -1,62 +0,0 @@
|
||||
import {useEffect, useState} from "react";
|
||||
import Taro from '@tarojs/taro'
|
||||
import {ArrowLeft} from '@nutui/icons-react-taro'
|
||||
import {NavBar, InfiniteLoading} from '@nutui/nutui-react-taro'
|
||||
import {pageHjmCar} from "@/api/hjm/hjmCar";
|
||||
import {HjmCar} from "@/api/hjm/hjmCar/model";
|
||||
import BestSellers from "./BestSellers";
|
||||
|
||||
/**
|
||||
* 文章终极列表
|
||||
* @constructor
|
||||
*/
|
||||
const Index = () => {
|
||||
const [statusBarHeight, setStatusBarHeight] = useState<number>()
|
||||
const [list, setList] = useState<HjmCar[]>([])
|
||||
|
||||
const reload = () => {
|
||||
// 获取车辆列表
|
||||
pageHjmCar({driverId: Taro.getStorageSync('UserId')}).then(res => {
|
||||
setList(res?.list || [])
|
||||
})
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
Taro.getSystemInfo({
|
||||
success: (res) => {
|
||||
setStatusBarHeight(res.statusBarHeight)
|
||||
},
|
||||
})
|
||||
reload()
|
||||
}, [])
|
||||
|
||||
|
||||
return (
|
||||
<>
|
||||
<NavBar
|
||||
fixed={true}
|
||||
style={{marginTop: `${statusBarHeight}px`}}
|
||||
onBackClick={() => {
|
||||
}}
|
||||
left={
|
||||
<>
|
||||
<ArrowLeft size={18} onClick={() => {Taro.navigateBack()}} />
|
||||
{/*<SearchBar shape="round" maxLength={5} style={{paddingLeft: '1px'}}/>*/}
|
||||
{/*<div className={'flex flex-col text-center justify-center items-center'}>*/}
|
||||
{/* <Filter size={14}/>*/}
|
||||
{/* <div className={'text-xs text-gray-600 whitespace-nowrap'}>筛选</div>*/}
|
||||
{/*</div>*/}
|
||||
</>
|
||||
}
|
||||
>
|
||||
<span>车辆管理</span>
|
||||
</NavBar>
|
||||
<InfiniteLoading
|
||||
className={'w-full fixed left-0 top-24'}
|
||||
>
|
||||
<BestSellers data={list}/>
|
||||
</InfiniteLoading>
|
||||
</>
|
||||
)
|
||||
}
|
||||
export default Index
|
||||
@@ -36,11 +36,11 @@ export function fileToBase64(filePath) {
|
||||
* @param htmlText
|
||||
*/
|
||||
export function wxParse(htmlText) {
|
||||
// Replace <img> tags with max-width and height styles
|
||||
htmlText = htmlText.replace(/\<img/gi, '<img style="max-width:100%;height:auto;"');
|
||||
// Replace <img> tags with max-width, height and margin styles to remove spacing
|
||||
htmlText = htmlText.replace(/\<img/gi, '<img style="max-width:100%;height:auto;margin:0;padding:0;display:block;"');
|
||||
|
||||
// Replace style attributes that do not contain text-align
|
||||
htmlText = htmlText.replace(/style\s*?=\s*?(['"])(?!.*?text-align)[\s\S]*?\1/ig, 'style="max-width:100%;height:auto;"');
|
||||
// Replace style attributes that do not contain text-align, add margin:0 to remove spacing
|
||||
htmlText = htmlText.replace(/style\s*?=\s*?(['"])(?!.*?text-align)[\s\S]*?\1/ig, 'style="max-width:100%;height:auto;margin:0;padding:0;display:block;"');
|
||||
|
||||
return htmlText;
|
||||
}
|
||||
@@ -65,3 +65,28 @@ export function copyText(text: string) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 分享商品链接
|
||||
* @param goodsId 商品ID
|
||||
* @param goodsName 商品名称
|
||||
*/
|
||||
export function shareGoodsLink(goodsId: string | number, goodsName?: string) {
|
||||
// 构建分享链接,这里需要根据你的实际域名调整
|
||||
const baseUrl = 'https://your-domain.com'; // 请替换为你的实际域名
|
||||
const shareUrl = `${baseUrl}/shop/goodsDetail/index?id=${goodsId}`;
|
||||
|
||||
copyText(shareUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示分享引导提示
|
||||
*/
|
||||
export function showShareGuide() {
|
||||
Taro.showModal({
|
||||
title: '分享提示',
|
||||
content: '请点击右上角的"..."按钮,然后选择"转发"来分享给好友,或选择"分享到朋友圈"',
|
||||
showCancel: false,
|
||||
confirmText: '知道了'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,3 +0,0 @@
|
||||
export default definePageConfig({
|
||||
navigationBarTitleText: '店铺设置'
|
||||
})
|
||||
@@ -1,152 +0,0 @@
|
||||
import {useEffect, useState} from "react";
|
||||
import {ConfigProvider} from '@nutui/nutui-react-taro'
|
||||
import Taro, {getCurrentInstance} from '@tarojs/taro'
|
||||
import {updateUserInfo} from "@/api/layout";
|
||||
import {Uploader} from '@nutui/nutui-react-taro'
|
||||
|
||||
const {router} = getCurrentInstance()
|
||||
import {
|
||||
Form,
|
||||
Button,
|
||||
Input
|
||||
} from '@nutui/nutui-react-taro'
|
||||
import {CmsWebsite} from "@/api/cms/cmsWebsite/model";
|
||||
import {getSiteInfo} from "@/api/layout";
|
||||
|
||||
function Modify() {
|
||||
const formId = Number(router?.params.id)
|
||||
|
||||
const [form] = Form.useForm()
|
||||
const [FormData, setFormData] = useState<CmsWebsite>(
|
||||
{
|
||||
websiteId: undefined,
|
||||
websiteName: undefined,
|
||||
websiteLogo: undefined,
|
||||
websiteCode: undefined,
|
||||
phone: undefined,
|
||||
address: undefined,
|
||||
comments: undefined
|
||||
}
|
||||
)
|
||||
const reload = () => {
|
||||
// 获取用户信息
|
||||
getSiteInfo().then((data) => {
|
||||
setFormData(data)
|
||||
})
|
||||
}
|
||||
|
||||
// 提交表单
|
||||
const submitSucceed = (values: any) => {
|
||||
console.log(values, 'values')
|
||||
console.log(formId, 'formId>>')
|
||||
if (values.type === 1 && values.name == '') {
|
||||
Taro.showToast({
|
||||
title: '请填写单位名称',
|
||||
icon: 'error'
|
||||
});
|
||||
return false;
|
||||
}
|
||||
updateUserInfo(values).then(() => {
|
||||
Taro.showToast({title: `保存成功`, icon: 'success'})
|
||||
return Taro.navigateBack()
|
||||
}).catch(() => {
|
||||
Taro.showToast({
|
||||
title: '保存失败',
|
||||
icon: 'error'
|
||||
});
|
||||
})
|
||||
}
|
||||
const submitFailed = (error: any) => {
|
||||
console.log(error, 'err...')
|
||||
// Taro.showToast({ title: error[0].message, icon: 'error' })
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
reload()
|
||||
}, [form]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<ConfigProvider>
|
||||
<Form
|
||||
divider
|
||||
initialValues={FormData}
|
||||
labelPosition="left"
|
||||
onFinish={(values) => submitSucceed(values)}
|
||||
onFinishFailed={(errors) => submitFailed(errors)}
|
||||
footer={
|
||||
<div
|
||||
style={{
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
width: '100%'
|
||||
}}
|
||||
>
|
||||
<Button nativeType="submit" block type="info">
|
||||
提交
|
||||
</Button>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<Form.Item
|
||||
label="LOGO"
|
||||
name="websiteLogo"
|
||||
initialValue={[
|
||||
{
|
||||
name: 'file1.png',
|
||||
url: FormData.websiteLogo,
|
||||
status: 'success',
|
||||
message: 'success',
|
||||
type: 'image',
|
||||
uid: '122',
|
||||
},
|
||||
]}
|
||||
>
|
||||
<Uploader url={FormData.websiteLogo}/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label={'店铺名称'}
|
||||
name="websiteName"
|
||||
initialValue={FormData.websiteName}
|
||||
rules={[{message: '请输入店铺名称'}]}
|
||||
>
|
||||
<Input placeholder="请输入姓名或单位名称" type="text"/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label={'详细地址'}
|
||||
name="address"
|
||||
initialValue={FormData.address}
|
||||
rules={[{message: '请输入详细地址'}]}
|
||||
>
|
||||
<Input placeholder="请输入详细地址" type="text"/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
label="备注信息"
|
||||
name="comments"
|
||||
initialValue={FormData.comments}
|
||||
rules={[{message: '备注信息'}]}
|
||||
>
|
||||
<Input
|
||||
placeholder={'可注明身份,如:家长、小学教师、公务员等'}/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</ConfigProvider>
|
||||
{/*<Cascader*/}
|
||||
{/* popupProps={{*/}
|
||||
{/* className: 'cascader-popup',*/}
|
||||
{/* }}*/}
|
||||
{/* visible={navBarState.visible}*/}
|
||||
{/* optionKey={{valueKey: 'name', textKey: 'name', childrenKey: 'children'}}*/}
|
||||
{/* title="选择所在班级"*/}
|
||||
{/* options={classList}*/}
|
||||
{/* closeable*/}
|
||||
{/* onChange={change6}*/}
|
||||
{/* onClose={() => {*/}
|
||||
{/* changeNarBar(false)*/}
|
||||
{/* }}*/}
|
||||
{/*/>*/}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default Modify
|
||||
Reference in New Issue
Block a user