鸿蒙特色实战2

服务卡片开发

创建服务卡片

创建一个新的工程后,可以通过如下方法进行创建服务卡片:

  1. 创建服务卡片包括如下两种方式:

    • 选择模块(如entry模块)下的任意文件,单击菜单栏File > New > Service Widget创建服务卡片。
    • 选择模块(如entry模块)下的任意文件,单击右键 > New > Service Widget创建服务卡片。
  2. Choose a Template for Your Service Widget界面中,选择卡片模板,单击Next

在这里插入图片描述

  1. Configure Your Service Widget界面中,配置卡片的基本信息,包括:

  2. 单击Finish完成卡片的创建。创建完成后,工具会自动创建出服务卡片的布局文件,并在form_config.json文件中写入服务卡片的属性字段,关于各字段的说明请参考配置文件说明。

    在这里插入图片描述

  3. 卡片创建完成后,请根据开发指导,完成服务卡片的开发,详情请参考服务卡片开发指南。

  4. 本项目开发两个卡片,分别为 2X2 和 4X4卡片,2X2卡片为一张Logo图片,4X4卡片为新闻列表。如图:

    2X2卡片4X4卡片
    在这里插入图片描述

|在这里插入图片描述|

2X2卡片开发

2X2卡片比较简单,就是一张Logo图片,点击跳转到主界面,全部代码以下:

@Entry
@Component
struct WidgetCard {readonly ACTION_TYPE: string = 'router';readonly ABILITY_NAME: string = 'EntryAbility';readonly FULL_WIDTH_PERCENT: string = '100%';readonly FULL_HEIGHT_PERCENT: string = '100%';build() {Stack() {// Logo图片Image($r("app.media.startIcon")).width(this.FULL_WIDTH_PERCENT).height(this.FULL_HEIGHT_PERCENT).objectFit(ImageFit.Contain)}.width(this.FULL_WIDTH_PERCENT).height(this.FULL_HEIGHT_PERCENT).onClick(() => {// 点击跳转到主界面postCardAction(this, {action: this.ACTION_TYPE,abilityName: this.ABILITY_NAME});})}
}

4X4卡片开发

4X4卡片相对复杂些,获取网络上新闻列表数组,循环数据显示出现,点击每条新闻,把新闻Id传过去,获取相应的详情新闻。

  1. 卡片页面布局代码:

    Column() {Row() {Row() {Text('Days Matter').fontColor(0xF55A42).fontWeight(700).fontSize(18)}.height(40).justifyContent(FlexAlign.Start)Text('更多 >').width(64).height("100%").textAlign(TextAlign.End).onClick(() => {console.info(`xx 跳转到更多`)postCardAction(this, {action: this.ACTION_TYPE,abilityName: this.ABILITY_NAME,params: {'id': '-1','targetPage': 'Index'}});})}.width("100%").height(40).justifyContent(FlexAlign.SpaceBetween)List({ space: 20, initialIndex: 0 }) {ForEach(this.newsArticles, (item:object) => {ListItem() {Text(item['title']).width("100%").height(20).fontSize(14).padding({ left: 10, right: 10}).textOverflow({ overflow: TextOverflow.Ellipsis }).fontWeight(FontWeight.Regular).maxLines(this.MAX_LINES)}.onClick(() => {this.routerPage(item['id'])})})}.listDirection(Axis.Vertical).divider({ strokeWidth: 1, color: "#E4EBF5", startMargin: 10, endMargin: 10 }).edgeEffect(EdgeEffect.Spring).margin({ top: 4 }).padding( { bottom: 40 })}.width("100%").height("100%").justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start).padding($r('app.float.column_padding'))
    
  2. 路由跳转代码:

      routerPage(uid: string) {console.info(`xx 跳转文章Id: ${uid}`)postCardAction(this, {action: this.ACTION_TYPE,abilityName: this.ABILITY_NAME,params: {'id': uid,'targetPage': 'Detail'}});}
    
  3. 卡片页面中使用LocalStorageProp装饰需要刷新的卡片数据

    let storageCard = new LocalStorage();@Entry(storageCard)
    @Component
    struct Widget4Card {@LocalStorageProp('newsArticles') newsArticles: Array<object> = [];......
    }
    
  4. 4x4服务卡片完整代码如下:

    let storageCard = new LocalStorage();@Entry(storageCard)
    @Component
    struct Widget4Card {@LocalStorageProp('newsArticles') newsArticles: Array<object> = [];readonly MAX_LINES: number = 1;readonly ACTION_TYPE: string = 'router';readonly ABILITY_NAME: string = 'EntryAbility';routerPage(uid: string) {console.info(`xx 跳转文章Id: ${uid}`)postCardAction(this, {action: this.ACTION_TYPE,abilityName: this.ABILITY_NAME,params: {'id': uid,'targetPage': 'Detail'}});}build() {Column() {Row() {Row() {Text('Days Matter').fontColor(0xF55A42).fontWeight(700).fontSize(18)}.height(40).justifyContent(FlexAlign.Start)Text('更多 >').width(64).height("100%").textAlign(TextAlign.End).onClick(() => {console.info(`xx 跳转到更多`)postCardAction(this, {action: this.ACTION_TYPE,abilityName: this.ABILITY_NAME,params: {'id': '-1','targetPage': 'Index'}});})}.width("100%").height(40).justifyContent(FlexAlign.SpaceBetween)List({ space: 20, initialIndex: 0 }) {ForEach(this.newsArticles, (item:object) => {ListItem() {Text(item['title']).width("100%").height(20).fontSize(14).padding({ left: 10, right: 10}).textOverflow({ overflow: TextOverflow.Ellipsis }).fontWeight(FontWeight.Regular).maxLines(this.MAX_LINES)}.onClick(() => {this.routerPage(item['id'])})})}.listDirection(Axis.Vertical).divider({ strokeWidth: 1, color: "#E4EBF5", startMargin: 10, endMargin: 10 }).edgeEffect(EdgeEffect.Spring).margin({ top: 4 }).padding( { bottom: 40 })}.width("100%").height("100%").justifyContent(FlexAlign.Start).alignItems(HorizontalAlign.Start).padding($r('app.float.column_padding'))}
    }
    

卡片保存开发

  1. 根据配置文件form_config.json配置定时更新卡片数据

    "updateEnabled": true, // 表示卡片是否支持周期性刷新(包含定时刷新和定点刷新)
    "scheduledUpdateTime": "10:30",	// 表示卡片的定点刷新的时刻,采用24小时制,精确到分钟。
    "updateDuration": 1,	// 表示卡片定时刷新的更新周期,单位为30分钟,取值为自然数。
    
  2. 卡片存储

    2.1 在EntryAbility.ets里onCreate回调函数初始化存储卡片数据库和表。

    onCreate() {// 初始化保存卡片数据库RdbUtils.initDb(this.context, Const.RDB_NAME.dbName ? Const.RDB_NAME.dbName : '');await RdbUtils.createDb();RdbUtils.createTable(Const.FORM_INFO.tableName ? Const.FORM_INFO.tableName : '', columnFormInfoList).catch((err: Error) => {LogUtil.error(`RdbHelper formInfo err : ${JSON.stringify(err)}`);});
    }
    

    2.2 在EntryFormAbility.ets里onAddForm回调存储添加的卡片信息

    onAddForm(want: Want) {LogUtil.info('xx 开始添加卡片')let parameters = want.parameters;if (parameters) {let formId: string = parameters[Const.FORM_PARAM_IDENTITY_KEY] as string;let formName: string = parameters[Const.FORM_PARAM_NAME_KEY] as string;let formDimension: number = parameters[Const.FORM_PARAM_DIMENSION_KEY] as number;let formInfo: FormInfoModel = {formId: formId,formName: formName,formDimension: formDimension};LogUtil.info('xx 开始卡片保存到数据库')FormUtils.insertFormData(this.context, formInfo);LogUtil.info('xx 结束卡片保存到数据库')}LogUtil.info('xx 卡片创建成功')return formBindingData.createFormBindingData({'latestArticles': []});}
    

    2.3 卡片周期性刷新时,调用卡片onUpdateForm更新回调

      onUpdateForm(formId: string) {// Called to notify the form provider to update a specified form.FormUtils.updateCards(this.context);}
    

    2.4 卡片移除时,调用卡片onRemoveForm回调

      onRemoveForm(formId: string) {// Called to notify the form provider that a specified form has been destroyed.FormUtils.deleteFormData(this.context, formId);}
    

卡片保存在关系型数据库

接口RdbHelper

定义一个关系型数据库操作接口RdbHelper

import dataRdb from '@ohos.data.relationalStore';
import ColumnInfo from '../model/ColumnInfo';export interface RdbHelper {getDbName(): string;getRdb(context: Context): Promise<RdbHelper>;executeSql(sql: string): Promise<void>;createTable(tableName: string, columns: Array<ColumnInfo>): Promise<void>;deleteTable(tableName: string): Promise<void>;addTableColumn(tableName: string, column: ColumnInfo): Promise<void>;insert(tableName: string, values: dataRdb.ValuesBucket | Array<dataRdb.ValuesBucket>): Promise<number>;update(values: dataRdb.ValuesBucket, rdbPredicates: dataRdb.RdbPredicates): Promise<number>;query(rdbPredicates: dataRdb.RdbPredicates, columns?: Array<string>): Promise<dataRdb.ResultSet>;queryAll(tableName: string): Promise<dataRdb.ResultSet>;queryBySql(sql: string, bindArgs?: Array<dataRdb.ValueType>): Promise<dataRdb.ResultSet>;delete(rdbPredicates: dataRdb.RdbPredicates): Promise<number>;
}

实现类RdbHelperImp

定义一个实现RdbHelper接口的实现类RdbHelperImp

import { LogUtil } from '../../utils/LogUtil';
import { RdbHelper } from './RdbHelper';
import dataRdb from '@ohos.data.relationalStore';
import ColumnInfo from '../model/ColumnInfo';
import tableHelper from './TableHelper';export class RdbHelperImp implements RdbHelper {private mDatabaseName: string;private rdbStore: dataRdb.RdbStore = {} as dataRdb.RdbStore;private storeConfig: dataRdb.StoreConfig = {  name: '', securityLevel: dataRdb.SecurityLevel.S1 } as dataRdb.StoreConfig;constructor(databaseName: string) {this.mDatabaseName = databaseName;}getDbName(): string {return this.mDatabaseName;}getRdb(context: Context): Promise<RdbHelper> {this.storeConfig = {name: this.mDatabaseName, securityLevel: dataRdb.SecurityLevel.S1};return new Promise<RdbHelper>((success, error) => {dataRdb.getRdbStore(context, this.storeConfig).then(dbStore => {this.rdbStore = dbStore;success(this);}).catch((err: Error) => {LogUtil.error(`initRdb err : ${JSON.stringify(err)}`);error(err);})})}executeSql(sql: string): Promise<void> {LogUtil.info(`executeSql sql : ${sql}`);return this.rdbStore.executeSql(sql);}createTable(tableName: string, columns: Array<ColumnInfo>): Promise<void> {LogUtil.info(`createTable tableName : ${tableName}, columns : ${JSON.stringify(columns)}`);let createTableSql = tableHelper.createTableSql(tableName, columns);return this.executeSql(createTableSql);}deleteTable(tableName: string): Promise<void> {LogUtil.info(`deleteTable tableName : ${tableName}`);let deleteTableSql = tableHelper.deleteTableSql(tableName);return this.executeSql(deleteTableSql);}addTableColumn(tableName: string, column: ColumnInfo): Promise<void> {LogUtil.info(`addTableColumn tableName : ${tableName}, column : ${JSON.stringify(column)}`);let addTableColumnSql = tableHelper.addTableColumnSql(tableName, column);return this.executeSql(addTableColumnSql);}insert(tableName: string, values: dataRdb.ValuesBucket | Array<dataRdb.ValuesBucket>): Promise<number> {return new Promise<number>((success, error) => {LogUtil.info(`insert tableName : ${tableName}, values : ${JSON.stringify(values)}`);if (!values) {LogUtil.info(`insert failed, values is undefined`);error(0);return;}if (values instanceof Array) {LogUtil.info(`insert values isArray = ${values.length}`);this.rdbStore.beginTransaction();this.saveArray(tableName, values).then(data => {LogUtil.info(`insert success, data : ${JSON.stringify(data)}`);success(data);this.rdbStore.commit();}).catch((err: Error) => {LogUtil.error(`insert failed, err : ${err}`);error(err);this.rdbStore.commit();})} else {this.rdbStore.insert(tableName, values).then(data => {LogUtil.info(`insert success id : ${data}`);success(data);this.rdbStore.commit();}).catch((err: Error) => {LogUtil.error(`insert failed, err : ${JSON.stringify(err)}`);error(err);this.rdbStore.commit();})}})}private saveArray(tableName: string, values: Array<dataRdb.ValuesBucket>): Promise<number> {return new Promise<number>((success, error) => {if (!values || values.length === 0) {error(0);return;}let index = 0let callback = (data: number, err: Error) => {if (err) {LogUtil.info(`saveArray failed, err : ${err}`);error(err);return;}if (data) {if (index < values.length - 1) {this.saveData(tableName, values, ++index, callback);} else {success(data);}}}this.saveData(tableName, values, index, callback);})}private saveData(tableName: string, values: Array<dataRdb.ValuesBucket>, index: number, callback: Function): void   {LogUtil.info(`saveData tableName : ${tableName}, index : ${JSON.stringify(index)}`);this.rdbStore.insert(tableName, values[index]).then((data: number) => {LogUtil.info(`saveData success id : ${data}`);callback(data);}).catch((err: Error) => {LogUtil.error(`saveData failed, err : ${err}`);callback(err);})}update(values: dataRdb.ValuesBucket, rdbPredicates: dataRdb.RdbPredicates): Promise<number> {return this.rdbStore.update(values, rdbPredicates);}query(rdbPredicates: dataRdb.RdbPredicates, columns?: Array<string>): Promise<dataRdb.ResultSet> {LogUtil.info(`query rdbPredicates : ${JSON.stringify(rdbPredicates)}`);return this.rdbStore.query(rdbPredicates, columns);}queryAll(tableName: string): Promise<dataRdb.ResultSet> {LogUtil.info(`queryAllSize tableName : ${tableName}`);return this.rdbStore.querySql(`select * from ${tableName}`);}queryBySql(sql: string, bindArgs?: Array<dataRdb.ValueType>): Promise<dataRdb.ResultSet> {LogUtil.info(`queryBySql sql : ${sql}`);return this.rdbStore.querySql(sql, bindArgs);}delete(rdbPredicates: dataRdb.RdbPredicates): Promise<number> {LogUtil.info(`delete rdbPredicates : ${JSON.stringify(rdbPredicates)}`);return this.rdbStore.delete(rdbPredicates);}
}

操作类TableHelper

定义表操作类TableHelper

import { LogUtil } from '../../utils/LogUtil';
import ColumnInfo from '../model/ColumnInfo';class TableHelper {createTableSql(tableName: string, columns: Array<ColumnInfo>): string {let sql = `create table if not exists ${tableName}(`;for (let column of columns) {sql = sql.concat(`${column.name} ${column.type}`);sql = sql.concat(`${column.length && column.length > 0 ? `(${column.length})` : ''}`);sql = sql.concat(`${column.primary ? ' primary key' : ''}`);sql = sql.concat(`${column.autoincrement ? ' autoincrement' : ''}`);sql = sql.concat(`${column.nullable ? '' : ' not null'}`);sql = sql.concat(', ');}sql = `${sql.substring(0, sql.length - 2)})`;return sql;}addTableColumnSql(tableName: string, column: ColumnInfo): string {LogUtil.info(`TableHelper updateTableSql : ${JSON.stringify(column)}`);let sql = `alter table ${tableName} add `;sql = sql.concat(`${column.name} ${column.type}`);sql = sql.concat(`${column.length && column.length > 0 ? `(${column.length})` : ''}`);LogUtil.info(`TableHelper updateTableSql : ` + sql);return sql;}deleteTableSql(tableName: string): string {LogUtil.info(`TableHelper deleteTableSql : ${JSON.stringify(tableName)}`);return `drop table if exists ${tableName}`;}
}const tableHelper = new TableHelper();
export default tableHelper;

公共操作类RdbUtils

import { LogUtil } from '../../utils/LogUtil';
import ColumnInfo from '../model/ColumnInfo';
import { RdbHelper } from './RdbHelper';
import { RdbHelperImp } from './RdbHelperImp';
import dataRdb from '@ohos.data.relationalStore';let dbContext: Context;
let mDatabaseName: string = '';export class RdbUtils {private rdbHelpers = new Map<string, RdbHelper>();initDb(context: Context, databaseName: string) {dbContext = context;mDatabaseName = databaseName;}createDb(): Promise<RdbHelper> {return new Promise<RdbHelper>((success, error) => {let dbName = mDatabaseName;if (!dbContext || !dbName || dbName.length === 0) {error("init err");return;}let dbHelper = this.rdbHelpers.get(dbName);if (!dbHelper) {LogUtil.info(`initRdb  RdbUtils success`);let rdbHelper: RdbHelper = new RdbHelperImp(dbName);rdbHelper.getRdb(dbContext).then(data => {this.rdbHelpers.set(dbName, data);success(data);}).catch((err: Error) => {error(err);})} else {success(dbHelper);}})}deleteDb(context: Context, dbName: string): Promise<void> {this.rdbHelpers.delete(dbName);return dataRdb.deleteRdbStore(context, dbName);}createTable(tableName: string, columns: Array<ColumnInfo>): Promise<void> {return this.createDb().then(dbHelper => {return dbHelper.createTable(tableName, columns);});}isCreateTable(tableName: string, columns: Array<ColumnInfo>): Promise<boolean> {return this.createTable(tableName, columns).then(() => {return true;}).catch((error: Error) => {LogUtil.error('RdbUtils', 'create table error ' + JSON.stringify(error));return false;});}deleteTable(tableName: string): Promise<void> {return this.createDb().then(dbHelper => {return dbHelper.deleteTable(tableName);})}executeSql(sql: string): Promise<void> {return this.createDb().then(dbHelper => {return dbHelper.executeSql(sql);})}addTableColumn(tableName: string, column: ColumnInfo): Promise<void> {return this.createDb().then(dbHelper => {return dbHelper.addTableColumn(tableName, column);})}insert(tableName: string, values: dataRdb.ValuesBucket | Array<dataRdb.ValuesBucket>): Promise<number> {return this.createDb().then(dbHelper => {return dbHelper.insert(tableName, values);})}update(values: dataRdb.ValuesBucket, rdbPredicates: dataRdb.RdbPredicates): Promise<number> {return this.createDb().then(dbHelper => {return dbHelper.update(values, rdbPredicates);})}query(rdbPredicates: dataRdb.RdbPredicates, columns?: Array<string>): Promise<dataRdb.ResultSet> {return this.createDb().then(dbHelper => {return dbHelper.query(rdbPredicates, columns);})}queryAll(tableName: string): Promise<dataRdb.ResultSet> {return this.createDb().then(dbHelper => {return dbHelper.queryAll(tableName);})}queryBySql(sql: string, bindArgs?: Array<dataRdb.ValueType>): Promise<dataRdb.ResultSet> {return this.createDb().then(dbHelper => {return dbHelper.queryBySql(sql, bindArgs);})}del(rdbPredicates: dataRdb.RdbPredicates): Promise<number> {return this.createDb().then(dbHelper => {return dbHelper.delete(rdbPredicates);})}
}let rdbUtils = new RdbUtils();
export default rdbUtils as RdbUtils;

公共操作类使用

  1. 如何使用公共操作类

        // 初始化保存卡片数据库RdbUtils.initDb(this.context, Const.RDB_NAME.dbName ? Const.RDB_NAME.dbName : '');await RdbUtils.createDb();RdbUtils.createTable(Const.FORM_INFO.tableName ? Const.FORM_INFO.tableName : '', columnFormInfoList).catch((err: Error) => {LogUtil.error(`RdbHelper formInfo err : ${JSON.stringify(err)}`);});
    
  2. 关系型数据库这里使用了接口型开发,使用Map缓存数据库对象,如果Map包含指定数据库名,直接从Map缓存返回,否则创建数据库,并缓存到Map里。

卡片信息API

import RdbUtils from '../database/rdb/RdbUtils';
import FormInfoModel from '../model/FormInfoModel';
import { LogUtil } from '../utils/LogUtil';
import dataRdb from '@ohos.data.relationalStore';
import { RdbConstants as Const } from '../constant/RdbConstants';class FormInfoApi {public insertData(formInfo: FormInfoModel, callback: Function): void {const valueBucket = generateBucket(formInfo);RdbUtils.insert('formInfo', valueBucket).then(result => {callback(result);});LogUtil.info('FormInfoTable', 'Insert formInfo finished.');}public queryFormData(callback: Function): void {let predicates = new dataRdb.RdbPredicates(Const.FORM_INFO.tableName ? Const.FORM_INFO.tableName : '');RdbUtils.query(predicates).then(resultSet => {let count = resultSet.rowCount;if (count === 0) {callback([]);} else {resultSet.goToFirstRow();let resultArray: Array<FormInfoModel> = new Array<FormInfoModel>();do {let result = new FormInfoModel();result.formId = resultSet.getString(resultSet.getColumnIndex('formId'));result.formName = resultSet.getString(resultSet.getColumnIndex('formName'));result.formDimension = resultSet.getLong(resultSet.getColumnIndex('formDimension'));resultArray.push(result);} while (resultSet.goToNextRow());resultSet.close();callback(resultArray);}}).catch((error: Error) => {LogUtil.error('FormInfoTable', 'queryFormData error ' + JSON.stringify(error));});}public deleteFormData(formId: string): void {let predicates = new dataRdb.RdbPredicates(Const.FORM_INFO.tableName ? Const.FORM_INFO.tableName : '');predicates.equalTo('formId', formId);RdbUtils.del(predicates).catch((error: Error) => {LogUtil.error('FormInfoTable', 'deleteFormData error ' + JSON.stringify(error));});}
}function generateBucket(formInfo: FormInfoModel): dataRdb.ValuesBucket {let valueBucket = {} as dataRdb.ValuesBucket;Const.FORM_INFO.columns?.forEach((item: string) => {if (item !== 'id') {switch (item) {case 'formId':valueBucket[item] = formInfo.formId;break;case 'formName':valueBucket[item] = formInfo.formName;break;case 'formDimension':valueBucket[item] = formInfo.formDimension;break;default:break;}}});return valueBucket;
}let formInfoApi = new FormInfoApi();
export default formInfoApi as FormInfoApi;

卡片保存操作类FormUtils

import FormInfoApi from '../api/FormInfoApi';
import RdbUtils from '../database/rdb/RdbUtils';
import FormInfoModel from '../model/FormInfoModel';
import { RdbConstants as Const } from '../constant/RdbConstants';
import { columnFormInfoList } from '../database/model/RdbColumnModel';
import { LogUtil } from './LogUtil';
import formProvider from '@ohos.app.form.formProvider';
import formBindingData from '@ohos.app.form.formBindingData';
import http from '@ohos.net.http';
import { RequestConstants } from '../constant/RequestConstants';
import { ResponseArray } from '../../model/StandardResponse';
import { BusinessError } from '@ohos.base';class FormUtils {public insertFormData(context: Context, formInfo: FormInfoModel): void {LogUtil.info('xx 初始化数据库')RdbUtils.initDb(context, Const.RDB_NAME.dbName ? Const.RDB_NAME.dbName : '');LogUtil.info('xx 初始化数据表')let isCreatePromise = RdbUtils.isCreateTable(Const.FORM_INFO.tableName ?Const.FORM_INFO.tableName : '', columnFormInfoList);isCreatePromise.then((result: boolean) => {if (!result) {LogUtil.error(Const.TAG, 'xx insertFormData form table create error');return;}LogUtil.info('xx 插入卡片数据')FormInfoApi.insertData(formInfo, (isDone: number) => {if (isDone) {LogUtil.info(Const.TAG, 'insert formInfo success: ' + JSON.stringify(isDone));LogUtil.info('xx 插入卡片数据成功')this.queryForms();} else {LogUtil.info('xx 插入卡片数据失败')}});});}public deleteFormData(context: Context, formId: string): void {RdbUtils.initDb(context, Const.RDB_NAME.dbName ? Const.RDB_NAME.dbName : '');let isCreatePromise = RdbUtils.isCreateTable(Const.FORM_INFO.tableName ?Const.FORM_INFO.tableName : '', columnFormInfoList);isCreatePromise.then((result: boolean) => {if (!result) {LogUtil.error(Const.TAG, 'deleteFormData form table create error');return;}FormInfoApi.deleteFormData(formId);});}/*** Update form operation*/public queryForms(): void {LogUtil.info('xx 查询所有卡片信息')FormInfoApi.queryFormData((resultSet: Array<FormInfoModel>) => {resultSet.forEach((item: FormInfoModel) => {this.updateArticleCards(item);});});}public updateCards(context: Context): void {RdbUtils.initDb(context, Const.RDB_NAME.dbName ? Const.RDB_NAME.dbName : '');let isCreatePromise = RdbUtils.isCreateTable(Const.FORM_INFO.tableName ?Const.FORM_INFO.tableName : '', columnFormInfoList);isCreatePromise.then((result: boolean) => {if (!result) {LogUtil.error(Const.TAG, 'updateCards form table create error');return;}this.queryForms();});}private updateArticleCards(formInfo: FormInfoModel): void {LogUtil.info('xx 更新卡片信息')if (formInfo.formDimension === Const.DEFAULT_DIMENSION_4X4) {LogUtil.info('xx 更新4x4卡片信息')this.getNewsList(formInfo);}}getNewsList(formInfo: FormInfoModel) {let httpRequest = http.createHttp()const now = new Date();const monthStr = String(now.getMonth() + 1).padStart(2, '0');const dayStr = String(now.getDate()).padStart(2, '0');httpRequest.request(RequestConstants.EVENT_HISTORY_URL, {method: http.RequestMethod.POST,header: {'Content-Type': 'application/json'},extraData: {"token": RequestConstants.TOKEN_KEY,"monthday": `${monthStr}${dayStr}`,"page": 1},expectDataType: http.HttpDataType.OBJECT}, (err, res) => {if (!err) {let standardResponse:ResponseArray = res.result as ResponseArray;console.info('xx Code:' + standardResponse.code);if (standardResponse.code === 200) {let newsArticles = standardResponse.data;LogUtil.info('xx 数据:' + JSON.stringify(newsArticles))LogUtil.info('xx 卡片:' + JSON.stringify(formInfo))let obj = formBindingData.createFormBindingData({'newsArticles': newsArticles});try {formProvider.updateForm(formInfo.formId, obj).then(() => {LogUtil.info('xx formProvider updateForm success');}).catch((error: BusinessError) => {LogUtil.info('xx formProvider updateForm, error:' + JSON.stringify(error));});} catch (error) {LogUtil.info(`xx catch err->${JSON.stringify(error)}`);}}LogUtil.info(`xx get news article data ---> `)} else {console.info('error:' + JSON.stringify(err));// 取消订阅HTTP响应头事件httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁。httpRequest.destroy();}})}}export default new FormUtils();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/34644.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

php基础:文件处理2

1.文件属性 当我们在程序中操作文件时&#xff0c;可能会使用到文件的一些常见属性&#xff0c;比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数&#xff0c;如下表所示。 2.目录操作 新建目录&#xff1a;mkdir(路…

激活函数在神经网络中的应用与选择

目录 ​编辑 Sigmoid函数 代码示例与分析 Tanh函数 代码示例与分析 ReLU函数 代码示例与分析 Leaky ReLU函数 代码示例与分析 PReLU函数 代码示例与分析 ELU函数 代码示例与分析 SELU函数 代码示例与分析 Softmax函数 代码示例与分析 结论 在深度学习领域&am…

如何在.NET 8.0 上安装 FastReport 并创建简单报告(下)

FastReport 是一款灵活而强大的报告工具。它允许用户以各种格式访问数据源并以可视化方式呈现它们。使用 FastReport 创建的报告可以在用户界面中使用拖放逻辑轻松设计&#xff0c;并转换为不同的格式&#xff08;PDF、Excel、Word 等&#xff09;。>> 如何在.NET 8.0 上…

SpringBoot期末知识点大全

一、学什么 IoC AOP&#xff1a;面向切面编程。 事物处理 整合MyBatis Spring框架思想&#xff01; 二、核心概念 问题&#xff1a;类之间互相调用/实现&#xff0c;导致代码耦合度高。 解决&#xff1a;使用对象时&#xff0c;程序中不主动new对象&#xff0c;转换为由外部提…

vscode CMakeLists中对opencv eigen的引用方法

CMakeLists.txt 项目模式&#xff08;只有一个main函数入口&#xff09; cmake_minimum_required(VERSION 3.5)project(vsin01 VERSION 0.1 LANGUAGES CXX)set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)set(OpenCV_DIR G:/MinGW_Opencv/opencv4.10/opencv…

11.15【JAVA】【网络编程】【DEBUG】

代码以开源至cqujk/CquJavaEE 的myExp-socketCode分支,欢迎拷打 参考REPO Java 11: Standardized HTTP Client API 没反应 这是因为这应当是两个线程,当server创建好套接字后,进入accept时,就不会继续向下运行,客户端自然也就无法发送请求 首先要保证server进入accept(这个…

华为HCIE-Datacom认证笔试+实验考试介绍

华为HCIE数通认证考试是面向那些希望成为数通网络领域专家的人员&#xff0c;考试通常两部分&#xff1a;笔试和实验考试。 考试科目&#xff1a; HCIE-Datacom笔试考试内容&#xff1a; HCIE-Datacom V1.0考试覆盖数据通信领域路由交换高阶技术、企业网络架构全景、园区网络…

Android环境搭建

Android环境搭建 第一步&#xff1a;安装 Homebrew 执行以下命令来安装 Homebrew&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"检测是否安装成功&#xff1a; brew --version第二步&#xff1a;安装 No…

WLAN漫游

定义 WLAN漫游 是指STA在不同AP覆盖范围之间移动且保持用户业务不中断的行为 实现WLAN漫游的两个AP必须使用相同的SSID和安全模板&#xff08;安全模板名称可以不同&#xff0c;但是安全模板下的配置必须相同&#xff09;&#xff0c;认证模板的认证方式和认证参数也要配置相…

排序2(万字详细版)

一 快速排序 快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法&#xff0c;其基本思想为&#xff1a;任取待排序元素 序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两⼦序列&#xff0c;左⼦序列中所有元素均⼩ 于基准值&#xff0c;右⼦序列…

[ACTF2020 新生赛]Include

感觉毫无头绪e一下&#xff0c;发现要使用伪协议 伪协议&#xff1a;是PHP自己支持的一种协议与封装协议&#xff0c;简单说就是PHP定义的一种特殊访问资源的方法。 2.什么时候用PHP伪协议? 可能遇到的文件包含函数&#xff1a; 1、include 2、require 3、include_once 4、r…

链表【Lecode_HOT100】

1.相交链表No.160 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headAnull||headBnull) return null;ListNode pAheadA;ListNode pBheadB;while(pA!pB){pA(pAnull)?headB:pA.next;pB(pBnull)?headA:pB.next;}return pA; }2.反转链表No.206 pu…

时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 时频转换 | Matlab格拉姆角和场Gramian angular summation field一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x x(1:5120); % 本数据只选择5120个点进行分析 fs 6400 ; % 数据采样频…

试题转excel;pdf转excel;试卷转Excel,word试题转excel

一、问题描述 一名教师朋友&#xff0c;偶尔会需要整理一些高质量的题目到excel中 以往都是手动复制搬运&#xff0c;几百道题几乎需要一个下午的时间 关键这些事&#xff0c;枯燥无聊费眼睛&#xff0c;实在是看起来就很蠢的工作 就想着做一个工具&#xff0c;可以自动处理…

借助vector实现进制转换详解

进制转换&#xff0c;没什么可说的&#xff0c;大一级别的水平&#xff0c;不过在某些考研题目中可能会涉及到顺序栈的实现&#xff0c;本贴不使用顺序栈&#xff0c;用STL里面的vector模拟一下&#xff1a;关键在于想清楚【除留取余】的逻辑&#xff0c;至于用什么结构存放中间…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

iptables防火墙(DNAT、SNAT)小实验

这篇是iptables服务器当中DNAT、SNAT的部分 网络拓扑图&#xff1a; 实验要求&#xff1a; 实现内外网web互访问将内web的网关指向iptables服务器ens33的IPiptables服务器添加两块网卡&#xff0c;外web服务器要跟iptables的ens36同一块网卡内部web&#xff1a;192.168.180.1…

Oracle ASM特性介绍和增删盘操作

1. 介绍 1.1. 在没有ASM之前ORACLE数据库靠什么去解决存储问题&#xff1a; 裸设备:裸设备就是没有被文件系统格式化的分区或者是直接挂载到操作系统上的磁盘。ORACLE可以直接将数据写入到裸设备中&#xff0c;读写能非常优异。像ORACLE的数据文件、控制文件、REDO日志在过去…

UiPath API接口说明

Swagger网址 私有云网址&#xff08;企业版&#xff09; https://企业/swagger/index.html 公有云网址&#xff08;社区版&#xff09; https://cloud.uipath.com/linan/LinanZhang/orchestrator_/swagger/index.html#/ 常见问题 Swagger页面测试请求时报错“You are not a…

【机械加工】数字化软件打造,如何实现3D交互可视化?

机械加工是制造业的重要领域之一&#xff0c;随着制造技术和工艺的不断发展&#xff0c;机械加工的精度和效率要求越来越高。HOOPS作为一款专业的3D图形引擎&#xff0c;可以为机械加工行业提供高效、灵活的3D建模、可视化和交互工具。下面将从以下几个方面介绍HOOPS技术在机械…