HarmonyOS鸿蒙Next《仿盒马》app开发技术分享插入积分信息

HarmonyOS鸿蒙Next《仿盒马》app开发技术分享插入积分信息

技术栈

Appgallery connect

开发准备

上一节我们实现了积分页面的大概框架,那么现在我们开始进行数据的填充和查询,积分相关的内容现在之后当回收订单结算之后才会进行积分数据的添加,那我们想查询出对应的积分数据,还需要新增一张积分信息表

功能分析

现在积分相关的有订单结算以及后续的积分兑换功能,我们先实现订单结算的积分新增以及用户信息表的积分总额计算。

首先在回收单待完成页面点击确认按钮时进行数据的添加,我们这里要用type去区分积分数据的状态,状态分为收入和支出。然后我们修改userinfo的积分信息,在积分列表全部选项里查询出积分的数据在list列表中进行展示

代码实现

首先我们创建对应的表、实体、db类

{
  "objectTypeName": "points_info",
  "fields": [
    {"fieldName": "id", "fieldType": "Integer", "notNull": true, "belongPrimaryKey": true},
    {"fieldName": "user_id", "fieldType": "Integer", "notNull": true, "defaultValue": 0},
    {"fieldName": "points", "fieldType": "String"},
    {"fieldName": "create_time", "fieldType": "String"},
    {"fieldName": "points_type", "fieldType": "String"},
    {"fieldName": "address", "fieldType": "String"},
    {"fieldName": "year", "fieldType": "String"},
    {"fieldName": "month", "fieldType": "String"},
    {"fieldName": "day", "fieldType": "String"},
    {"fieldName": "time", "fieldType": "String"}
  ],
  "indexes": [
    {"indexName": "field1Index", "indexList": [{"fieldName":"id","sortType":"ASC"}]}
  ],
  "permissions": [
    {"role": "World", "rights": ["Read", "Upsert", "Delete"]},
    {"role": "Authenticated", "rights": ["Read", "Upsert", "Delete"]},
    {"role": "Creator", "rights": ["Read", "Upsert", "Delete"]},
    {"role": "Administrator", "rights": ["Read", "Upsert", "Delete"]}
  ]
}
class PointsInfo {
  id: number;
  user_id: number = 0;
  points: string;
  create_time: string;
  points_type: string;
  address: string;
  year: string;
  month: string;
  day: string;
  time: string;

  constructor() {}

  setId(id: number): void {
    this.id = id;
  }

  getId(): number {
    return this.id;
  }

  setUser_id(user_id: number): void {
    this.user_id = user_id;
  }

  getUser_id(): number {
    return this.user_id;
  }

  setPoints(points: string): void {
    this.points = points;
  }

  getPoints(): string {
    return this.points;
  }

  setCreate_time(create_time: string): void {
    this.create_time = create_time;
  }

  getCreate_time(): string {
    return this.create_time;
  }

  setPoints_type(points_type: string): void {
    this.points_type = points_type;
  }

  getPoints_type(): string {
    return this.points_type;
  }

  setAddress(address: string): void {
    this.address = address;
  }

  getAddress(): string {
    return this.address;
  }

  setYear(year: string): void {
    this.year = year;
  }

  getYear(): string {
    return this.year;
  }

  setMonth(month: string): void {
    this.month = month;
  }

  getMonth(): string {
    return this.month;
  }

  setDay(day: string): void {
    this.day = day;
  }

  getDay(): string {
    return this.day;
  }

  setTime(time: string): void {
    this.time = time;
  }

  getTime(): string {
    return this.time;
  }
}

export { PointsInfo };
import { cloudDatabase } from '@kit.CloudFoundationKit';

class points_info extends cloudDatabase.DatabaseObject {
  public id: number;
  public user_id = 0;
  public points: string;
  public create_time: string;
  public points_type: string;
  public address: string;
  public year: string;
  public month: string;
  public day: string;
  public time: string;

  public naturalbase_ClassName(): string {
    return 'points_info';
  }
}

export { points_info };

在订单确认完成按钮处我们实现云数据库数据新增

let points = new points_info();
points.id = Math.floor(Math.random() * 1000000);
points.user_id = this.user!.user_id;
points.points = String(item.money);
points.points_type = '0';
points.address = '客户端下单奖励';
points.year = this.year;
points.month = this.month;
points.day = this.day;
points.time = this.time;
points.create_time = this.year + "-" + this.month + "-" + this.day + " " + this.time;
let points_nums = await databaseZone.upsert(money);

用户账号内的总积分数修改

let userData = new user_info();
userData.id = this.userInfo!.id;
userData.user_id = this.userInfo!.user_id;
userData.sex = this.userInfo!.sex;
userData.bind_phone = this.userInfo!.bind_phone;
userData.create_time = this.userInfo!.create_time;
userData.nickname = this.userInfo!.nickname;
userData.head_img = this.userInfo!.head_img;

if (this.userInfo?.money != null) {
  userData.money = this.userInfo!.money + item.money;
} else {
  userData.money = item.money;
}

if (this.userInfo?.points != null) {
  userData.points = this.userInfo!.points + item.integral;
} else {
  userData.points = item.integral;
}

let s = await databaseZone.upsert(userData);

到这里我们就实现了用户积分信息的插入


更多关于HarmonyOS鸿蒙Next《仿盒马》app开发技术分享插入积分信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在鸿蒙Next中实现《仿盒马》积分信息插入,可使用ArkUI的声明式UI开发。通过自定义组件展示积分数据,主要涉及以下技术点:

  1. 使用Column/Row布局构建积分显示区域
  2. Text组件显示积分数值,配合@State装饰器实现数据绑定
  3. 条件渲染控制积分模块的显隐状态
  4. 样式设置采用HarmonyOS设计规范
  5. 数据传递通过组件间通信机制实现

典型代码结构:

@Component
struct PointsDisplay {
  [@State](/user/State) points: number = 65
  build() {
    Row() {
      Image($r('app.media.points_icon'))
      Text(`${this.points}`).fontSize(16)
    }
  }
}

更多关于HarmonyOS鸿蒙Next《仿盒马》app开发技术分享插入积分信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个很好的HarmonyOS Next应用开发实践分享。关于积分系统的实现,我有几点技术建议:

  1. 数据库设计方面:
  • 建议将points字段改为Integer类型而非String,便于后续数值计算
  • 考虑添加事务处理确保积分记录和用户总额的原子性更新
  1. 代码实现优化:
  • 使用@Watch装饰器监听积分变化自动更新UI
  • 积分类型points_type建议使用枚举值替代魔术数字’0’
  1. 性能考虑:
  • 高频积分操作可考虑本地缓存+定时同步策略
  • 用户总额计算可添加防并发修改机制
  1. 安全性:
  • 积分变动建议添加操作日志
  • 关键操作需增加权限校验

整体实现方案合理,遵循了HarmonyOS的云数据库开发规范,后续可考虑加入分布式事务确保数据一致性。

回到顶部