Browse Source

修复已知问题

demo
科技小王子 2 months ago
parent
commit
c6d8cac29e
  1. 101
      src/api/hjm/hjmBxLog/index.ts
  2. 42
      src/api/hjm/hjmBxLog/model/index.ts
  3. 152
      src/api/hjm/hjmCar/index.ts
  4. 87
      src/api/hjm/hjmCar/model/index.ts
  5. 105
      src/api/hjm/hjmChoices/index.ts
  6. 37
      src/api/hjm/hjmChoices/model/index.ts
  7. 105
      src/api/hjm/hjmCourses/index.ts
  8. 41
      src/api/hjm/hjmCourses/model/index.ts
  9. 114
      src/api/hjm/hjmExamLog/index.ts
  10. 39
      src/api/hjm/hjmExamLog/model/index.ts
  11. 105
      src/api/hjm/hjmFence/index.ts
  12. 39
      src/api/hjm/hjmFence/model/index.ts
  13. 101
      src/api/hjm/hjmGpsLog/index.ts
  14. 42
      src/api/hjm/hjmGpsLog/model/index.ts
  15. 101
      src/api/hjm/hjmQuestions/index.ts
  16. 54
      src/api/hjm/hjmQuestions/model/index.ts
  17. 12
      src/api/system/userVerify/index.ts
  18. 146
      src/api/system/website/field/index.ts
  19. 25
      src/api/system/website/field/model/index.ts
  20. 168
      src/api/system/website/index.ts
  21. 58
      src/api/system/website/model/index.ts
  22. 6
      src/app.config.ts
  23. 22
      src/app.scss
  24. 4
      src/app.ts
  25. 2
      src/components/OrderList.tsx
  26. 2
      src/pages/cart/cart.config.ts
  27. 4
      src/pages/cart/cart.tsx
  28. 6
      src/pages/index/Banner.tsx
  29. 41
      src/pages/index/BestSellers.tsx
  30. 8
      src/pages/index/Header.scss
  31. 37
      src/pages/index/Header.tsx
  32. 10
      src/pages/index/Menu.tsx
  33. 7
      src/pages/index/MySearch.tsx
  34. 6
      src/pages/index/index.tsx
  35. 3
      src/shop/goodsDetail/index.config.ts
  36. 12
      src/shop/goodsDetail/index.scss
  37. 193
      src/shop/goodsDetail/index.tsx
  38. 44
      src/user/car/BestSellers.tsx
  39. 4
      src/user/car/index.config.ts
  40. 62
      src/user/car/index.tsx
  41. 33
      src/utils/common.ts
  42. 3
      src/website/modify.config.ts
  43. 152
      src/website/modify.tsx

101
src/api/hjm/hjmBxLog/index.ts

@ -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));
}

42
src/api/hjm/hjmBxLog/model/index.ts

@ -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;
}

152
src/api/hjm/hjmCar/index.ts

@ -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));
}

87
src/api/hjm/hjmCar/model/index.ts

@ -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;
}

105
src/api/hjm/hjmChoices/index.ts

@ -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));
}

37
src/api/hjm/hjmChoices/model/index.ts

@ -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;
}

105
src/api/hjm/hjmCourses/index.ts

@ -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));
}

41
src/api/hjm/hjmCourses/model/index.ts

@ -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;
}

114
src/api/hjm/hjmExamLog/index.ts

@ -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));
}

39
src/api/hjm/hjmExamLog/model/index.ts

@ -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;
}

105
src/api/hjm/hjmFence/index.ts

@ -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));
}

39
src/api/hjm/hjmFence/model/index.ts

@ -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;
}

101
src/api/hjm/hjmGpsLog/index.ts

@ -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));
}

42
src/api/hjm/hjmGpsLog/model/index.ts

@ -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;
}

101
src/api/hjm/hjmQuestions/index.ts

@ -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));
}

54
src/api/hjm/hjmQuestions/model/index.ts

@ -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;
}

12
src/api/system/userVerify/index.ts

@ -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));
}

146
src/api/system/website/field/index.ts

@ -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));
}

25
src/api/system/website/field/model/index.ts

@ -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;
}

168
src/api/system/website/index.ts

@ -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));
}

58
src/api/system/website/model/index.ts

@ -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;
}

6
src/app.config.ts

@ -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

@ -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 */
}

4
src/app.ts

@ -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({

2
src/components/OrderList.tsx

@ -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>

2
src/pages/kefu/kefu.config.ts → src/pages/cart/cart.config.ts

@ -1,5 +1,5 @@
export default definePageConfig({
navigationBarTitleText: '商品列表',
navigationBarTitleText: '购物车',
navigationBarTextStyle: 'black',
navigationStyle: 'custom'
})

4
src/pages/kefu/kefu.tsx → src/pages/cart/cart.tsx

@ -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;

6
src/pages/index/Banner.tsx

@ -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>

41
src/pages/index/BestSellers.tsx

@ -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,39 +21,35 @@ const BestSellers = () => {
}, [])
return (
<div className={'py-0'}>
<>
<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'}
onClick={() => Taro.navigateTo({url: '/shop/goodsDetail/index?id=' + item.goodsId})}>
<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"/>
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} #{item.goodsId}</div>
<div className={'car-no text-sm'}>{item.name}</div>
<div className={'flex justify-between text-xs py-1'}>
<span className={'text-orange-500'}>Q弹爽口</span>
<span className={'text-orange-500'}>{item.comments}</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'
}}/>210</Tag>
<Tag plain round background={'#ff0000'}><Divider direction={'vertical'} style={{
borderStyle: 'dashed', padding: '0',
borderColor: '#fd8989', margin: '0 5px'
}}/>13</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>
<span className={'font-bold text-2xl'}>{item.price}</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={'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>
@ -63,6 +59,7 @@ const BestSellers = () => {
})}
</div>
</div>
</>
)
}
export default BestSellers

8
src/pages/index/Header.scss

@ -0,0 +1,8 @@
.header-bg{
background: linear-gradient(to bottom, #03605c, #18ae4f);
height: 335px;
width: 100%;
top: 0;
position: absolute;
z-index: 0;
}

37
src/pages/index/Header.tsx

@ -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>

10
src/pages/index/Menu.tsx

@ -30,22 +30,20 @@ const Page = () => {
return (
loading ? (<Loading></Loading>) :
<div className={'p-3'}>
<div className={'rounded-2xl'}>
<div className={'flex justify-between pb-2 px-1'}>
<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'}>
<div className={'flex flex-col justify-center items-center p-1'}>
<Image src={item.icon} height={36} width={36}/>
<div className={'mt-2 text-gray-600'} style={{fontSize: '14px'}}>{item?.title}</div>
<div className={'mt-1 text-gray-600'} style={{fontSize: '14px'}}>{item?.title}</div>
</div>
</div>
))
}
</div>
</div>
</div>
)
}
export default Page

7
src/pages/index/MySearch.tsx

@ -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'}/>

6
src/pages/index/index.tsx

@ -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>
</>

3
src/shop/goodsDetail/index.config.ts

@ -1,4 +1,5 @@
export default definePageConfig({
navigationBarTitleText: '商品详情',
navigationBarTextStyle: 'black'
navigationBarTextStyle: 'black',
navigationStyle: 'custom'
})

12
src/shop/goodsDetail/index.scss

@ -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 来确保覆盖默认样式 */
}

193
src/shop/goodsDetail/index.tsx

@ -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 => {
getShopGoods(Number(goodsId))
.then((res) => {
// 处理富文本内容,去掉图片间距
if (res.content) {
res.content = wxParse(res.content);
}
setGoods(res);
}).catch(error => {
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'
}}/>210</Tag>
<Tag plain round background={'#ff0000'}><Divider direction={'vertical'} style={{
borderStyle: 'dashed', padding: '0',
borderColor: '#fd8989', margin: '0 5px'
}}/>13</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>
</div>
<div className={"mt-2 py-2"}>
<Divider></Divider>
<RichText nodes={goods.content || '内容详情'}/>
</div>
</div>
<div className={'py-2'}>
<h3></h3>
<div dangerouslySetInnerHTML={{ __html: goods.content || '' }} />
{/*底部购买按钮*/}
<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>
);

44
src/user/car/BestSellers.tsx

@ -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

4
src/user/car/index.config.ts

@ -1,4 +0,0 @@
export default definePageConfig({
navigationBarTitleText: '车辆管理',
navigationStyle: 'custom'
})

62
src/user/car/index.tsx

@ -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

33
src/utils/common.ts

@ -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: '知道了'
});
}

3
src/website/modify.config.ts

@ -1,3 +0,0 @@
export default definePageConfig({
navigationBarTitleText: '店铺设置'
})

152
src/website/modify.tsx

@ -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
Loading…
Cancel
Save