演示
一、功能:
面向用户:
1、商品浏览 (LVGL)
2、商品选择
3、商品购买(预留)+存量更新
4、搜索商品(拓展)
面向商家:
1、广告表现
2、订单天生(服务器+数据库)
3、管理员后台对售卖货物的管理
二、框架
1、lvgl库:
①:参考:
欢迎阅读百问网LVGL中文开辟手册! — 百问网LVGL中文教程文档 文档
②:屏幕无操作时返回广告页面,在主函数while循环里面检测屏幕空闲度,达到100且到 达一定时间就返回
- unsigned int time_count = 0;//计算屏幕空闲时间
- /*4、循环不断的监测用户有没有操作屏幕*/
- while(1)
- {
-
- lv_timer_handler();
- usleep(5000);
- /*屏幕无操作返回广告页面*/
- //printf("lv_timer_get_idle() = %d\n", lv_timer_get_idle());
- //屏幕空闲等于100时,开始计数
- if(lv_timer_get_idle() >= 100)
- {
- time_count++;
- //printf("time_count = %d\n", time_count);
- }
- //不等于100时计数清零
- else
- {
- time_count = 0;
- }
- if(time_count >= 2000)//计数达到2000,大约14秒
- {
- AdvertisingPage();//跳转广告页面
- }
- }
复制代码
2、C根本部分
略
3、体系+网络编程
1、商品信息由本地文件提供变为服务器(虚拟机)数据库提供
2、数据库使用sqlite3,轻量高效,容易操作
3、TCP协议,虚拟机作为服务器,6818开辟板为客户端,可以多台客户端毗连服务器 (两者之间的通信)
三、部分代码
- /*贩卖机主界面*/
- void Main_Menu(lv_event_t * e)
- {
- usleep(50000);
- lv_obj_clean(lv_scr_act()); // 清理屏幕
- //选择商品界面
- C_choose = lv_obj_create(lv_scr_act());
- lv_obj_set_size(C_choose, 160, 260);
- lv_obj_set_pos(C_choose, 640, 50);
- //初始提示语
- lv_obj_t * label_wel = lv_label_create(C_choose);
- lv_obj_align(label_wel, LV_ALIGN_CENTER, 0, 20);
- lv_label_set_text(label_wel, " Welcome!");
- lv_obj_set_width(label_wel, 100);
- lv_obj_set_height(label_wel, 80);
- // 确定按钮
- lv_obj_t * btn1 = lv_obj_create(lv_scr_act());
- lv_obj_set_size(btn1, 85, 65);
- lv_obj_align(btn1, LV_ALIGN_BOTTOM_LEFT, 715, 0);
- lv_obj_t * label_en = lv_label_create(btn1);
- lv_label_set_text(label_en, "Enter");
- lv_obj_center(label_en);
- //管理员功能
- lv_obj_t * btn2 = lv_btn_create(lv_scr_act());
- lv_obj_set_size(btn2, 70, 480);
- lv_obj_set_pos(btn2, 0, 0);
- lv_obj_t * label_en2 = lv_label_create(btn2);
- lv_label_set_text(label_en2, "Root");
- lv_obj_center(label_en2);
- lv_obj_add_event_cb(btn2, Root_login, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
- /*选项卡列表*/
- lv_obj_t * tabview;
- tabview = lv_tabview_create(lv_scr_act(), LV_DIR_LEFT, 0);
- lv_obj_set_size(tabview, 570, 480); // 设置选项卡列表的大小
- lv_obj_set_pos(tabview, 70, 0);
- lv_obj_set_style_bg_color(tabview, lv_palette_lighten(LV_PALETTE_LIGHT_BLUE, 2), 0); // 颜色
- lv_obj_t * tab_btns = lv_tabview_get_tab_btns(tabview);
- lv_obj_set_style_bg_color(tab_btns, lv_palette_darken(LV_PALETTE_BLUE, 3), 0);
- lv_obj_set_style_text_color(tab_btns, lv_palette_lighten(LV_PALETTE_BLUE, 6), 0);
- lv_obj_set_style_border_side(tab_btns, LV_BORDER_SIDE_RIGHT, LV_PART_ITEMS | LV_STATE_CHECKED);
- /*选项卡Tab1*/
- lv_obj_t * tab1 = lv_tabview_add_tab(tabview, "Welcome!");
- lv_obj_set_flex_flow(tab1, LV_FLEX_FLOW_ROW_WRAP); // 布局
- // Get_CInfo();
- CL * p = Head->next;
- // 循环根据链表的节点个数来创建对象
- while(1) {
- lv_obj_t * temp = lv_obj_create(tab1);
-
- lv_obj_set_size(temp, 160, 260); // 设置商品对象的大小
- lv_obj_t * label_name = lv_label_create(temp); // 创建标签对象--商品名
- lv_obj_t * label_price = lv_label_create(temp); // 创建标签对象--商品价格
- lv_obj_t * label_Margin = lv_label_create(temp); // 创建标签对象--商品余量
- lv_obj_t * img_picture = lv_img_create(temp); // 创建标签对象--商品照片
- if(p->CInfo.CMargin > 0) // 商品余量大于0,可以购买
- {
- lv_obj_t * C_add = lv_obj_create(temp); // 购买
- lv_obj_align(C_add, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
- lv_obj_set_size(C_add, 35, 35);
- lv_obj_add_event_cb(C_add, CI_Choose, LV_EVENT_SHORT_CLICKED, p); // 调用选择商品函数
- lv_obj_t * img_picture1 = lv_img_create(temp); // 图片
- lv_obj_align(img_picture1, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
- lv_img_set_src(img_picture1, "S:/root/user/mydemo/goumai.bmp");
- }
- if(p->CInfo.CMargin == 0) // 少于0则不能购买,显示为NULL
- {
- lv_obj_t * label_null = lv_label_create(temp);
- lv_label_set_text(label_null, "NULL!");
- lv_obj_align(label_null, LV_ALIGN_BOTTOM_RIGHT, 0, 0);
- }
- // 显示标签--商品信息
- lv_label_set_text(label_name, p->CInfo.CName); // 商品名
- lv_obj_align(label_name, LV_ALIGN_CENTER, 0, 30);
- char buf[128] = {"\0"};
- sprintf(buf, "$%.1f", p->CInfo.CPrice); // 商品价格
- lv_label_set_text(label_price, buf);
- lv_obj_align(label_price, LV_ALIGN_BOTTOM_LEFT, 20, 0);
- sprintf(buf, "%d", p->CInfo.CMargin); // 商品余量
- lv_label_set_text(label_Margin, buf);
- lv_obj_align(label_Margin, LV_ALIGN_CENTER, 0, 50);
- lv_img_set_src(img_picture, p->CInfo.CPicture); // 商品图片
- lv_obj_set_size(img_picture, 100, 128); // 设置图片大小
- lv_obj_set_pos(img_picture, 0, 0);
- // 切换到下一个节点
- p = p->next;
- if(p == Head) break; // 绘制完成即结束商品打印
- }
- lv_obj_clear_flag(lv_tabview_get_content(tabview), LV_OBJ_FLAG_SCROLLABLE);
- sum = 1; // 更新默认购买数量
- Search_box(); // 搜素框+键盘
- }
- /*广告页面*/
- void AdvertisingPage(void)
- {
-
- lv_obj_clean(lv_scr_act()); // 清理屏幕
- lv_obj_t * img_advertisement = lv_img_create(lv_scr_act());
- lv_obj_set_size(img_advertisement, 800, 480); // 设置大小
- lv_obj_set_pos(img_advertisement, 0, 0); // 位置
- lv_img_set_src(img_advertisement, "S:/root/user/mydemo/gg.bmp");
- lv_obj_add_flag(img_advertisement, LV_OBJ_FLAG_CLICKABLE); // 使图片可点击
- // 滚动文字
- lv_obj_t * label1 = lv_label_create(lv_scr_act());
- lv_label_set_long_mode(label1, LV_LABEL_LONG_SCROLL_CIRCULAR); // 滚动文字
- lv_obj_set_width(label1, 400);
- lv_obj_set_height(label1, 80);
- lv_label_set_text(label1, "Tap the screen to start buying! "
- "Tap the screen to start buying!"
- "Tap the screen to start buying!"); // 文本
- lv_obj_set_style_text_color(label1, lv_color_hex(0xED1C1C), LV_PART_SCROLLBAR); // 字体颜色
- lv_obj_set_style_text_font(label1, &lv_font_montserrat_36, LV_STATE_DEFAULT);
- lv_obj_align(label1, LV_ALIGN_BOTTOM_MID, 0, 0); // 位置;参考对象,对齐方式,x轴偏移量,y轴偏移量
- lv_obj_add_event_cb(img_advertisement, Request, LV_EVENT_LONG_PRESSED, NULL);
- lv_obj_add_event_cb(img_advertisement, Main_Menu, LV_EVENT_LONG_PRESSED, NULL); // 点击广告调出主界面
-
- }
复制代码- //获取商品信息
- void Get_CInfo(void)
- {
- char *p = Rbuf;
- char *p1;
- Head = List_Create();//创建链表
- CI temp ;//创建结构体
- while(1)
- {
- p1 = strchr(p,'#');
- if(p1 == NULL)
- {
- break;
- }
- *p1 = '\0';
- strcpy(temp.CName,p);//商品名字
- p = p1 + 1;
- p1 = strchr(p,'#');
- *p1 = '\0';
- temp.CID = atoi(p);//商品编号
- p = p1+1;
- p1 = strchr(p,'#');
- *p1 = '\0';
- temp.CPrice = atof(p);//商品价格
- p = p1+1;
- p1 = strchr(p,'#');
- *p1 = '\0';
- strcpy(temp.CPicture,p);//商品图片地址
- p = p1+1;
- p1 = strchr(p,'\n');
- *p1 = '\0';
- temp.CMargin = atoi(p);//商品余量
- p = p1+1;
- if(p == NULL)
- {
- break;
- }
- List_TailInsert(Head,temp );
- }
- printf("链表:\n");
- List_Ergodic(Head,1);
- memset(Rbuf,0,sizeof(Rbuf));//清空
-
- }
- //读取服务器发送的数据
- void *Client_read(void *arg)
- {
- // int socket_fd = (int)arg;
- while(1)
- {
- // pthread_mutex_lock(&mutex);
- ssize_t n = read(socket_fd,Rbuf,sizeof(Rbuf));
- printf("收到服务器:%s\n",Rbuf);
- // pthread_mutex_unlock(&mutex);
- if(n == 0)
- {
- printf("服务器关闭\n");
- exit(0);
- }
- if(n>0)
- {
- Get_CInfo();
- }
- }
-
- // memset(Rbuf,0,sizeof(Rbuf));
- // return NULL;
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |