基于蓝牙的考勤系统
基于蓝牙的考勤系统-用户界面设计 基于蓝牙的考勤系统 摘 要 随着教育的普及,大学生的数量也越来越多。不同于初高中的管理,大学更偏向于自主学习。且高校流行选分制度班级流动性增强,因此大学生获得了更多课程选择上的自由度,班级概念弱化,因此学生有着充裕的时间可以去做自己喜欢的项目,从而在自己喜欢的项目上大放异彩,但是在这种情况下,学院管理难度变大。有些学生过于放纵导致对上课产生厌倦情绪,因此产生了逃课,代名互相顶替等行为。而且有些老师淡化管理,进一步纵容了这种行为。在传统的考勤方式比如口头点名,在学生人数太多情况下很难有效检测这些行为。因此,为了杜绝这种行为,基于蓝牙的考勤系统被广泛的应用起来。
本设计虽然叫基于蓝牙的考勤系统,但蓝牙只负责签到,连接信息交互这方面的功能,其他数据的交互只要靠app和服务端完成。本文主要描述在设计的工作原理和各个模块的内容。本设计以数据库和服务端的交互和作为核心,让学生的蓝牙名称改为自己学号,让设备自己进行搜寻和定位,从而确定学生状态。mysql是服务端的数据库主要用来处理登录、注册、收发通知sqlite为本地数据库,主要用来存储蓝牙通讯的签到以及请假的数据。对于缺勤的学生做出特殊标记且显示出勤率,事后打包信息传送给相关管理人员。这种方法能提高学生出勤率,也能改善教学质量。而且比口头点名更加现代 化. 。
关键词:蓝牙考勤;
数据库;
服务端;
Bluetooth Management System Based on - User Interface Design Abstract With the popularization of education, the number of college students is increasing. Different from the management of junior and senior high schools, universities prefer autonomous learning. In addition, the class mobility of the popular selection and scoring system in colleges is enhanced, so college students have more freedom in course selection and class concept is weakened. Although there is plenty of time to do the projects they like, so as to shine in the projects they like, in this case, the school management becomes more difficult. Some students are so indulgent that they get bored of classes, so they skip classes and substitute for each other. And some teachers downplay the management, further condoning this kind of behavior. In traditional attendance methods such as oral roll call, it is difficult to detect these behaviors effectively when there are too many students. Therefore, in order to eliminate this kind of behavior, bluetooth based attendance system is widely used.Although this design is called a bluetooth-based attendance system, bluetooth is only responsible for check-in, connection information interaction, other data interaction as long as the app and the server to complete. This paper mainly describes the working principle in the design and the content of each module. The design of the database and server side of the interaction and as the core, let the students' bluetooth name changed to their student number, let the device to search and locate, so as to determine the status of students. Mysql is a server-side database mainly used to handle login, registration, send and receive notification sqlite is a local database, mainly used to store the bluetooth communication check-in and leave data. Students who are absent from school are specially marked and their attendance is displayed. The information is then packaged and sent to the relevant management. This method can improve student attendance and the quality of teaching. And it's more modern than a verbal roll callKeywords: Database;
Bluetooth Managerment System;
Clinet-side System 目 录 1前言 1 1.1本设计的目的、意义及应达到的技术要求 1 1.2本设计在国内外的发展概况及存在的问题 1 1.3本设计应解决的主要问题 2 2搭建环境及工具 2 2.1关于Android Studio 2 2.1.1介绍 2 2.1.2环境搭建 2 2.2 关于MyEclipse 2 2.2.1 介绍 2 2.3关于Mysql 2 2.3.1介绍 2 2.3.2环境搭建 3 2.4操作系统选择 3 2.4.1关于Android 3 2.4.2Android架构 3 2.4.3Andr应用程序oid开发的四个主要模块 4 2.5语言JAVA 4 3设计原理 5 4用户界面设计 5 4.1用户界面设计的原则 5 4.1.1界面整洁 5 4.1.2通用性 5 4.1.3合理的界面布局 5 4.14界面设计使用到的布局属性 6 5教师学生界面设计 10 5.1注册界面 10 5.2欢迎界面 10 5.3查询请假界面 10 5.4工具栏界面 11 5.5 登录界面 11 5.6关于系统界面 11 5.7左滑小菜单 11 5.8教师功能界面 11 5.9学生功能界面 12 6接口设计 12 7考勤签到设计原理 13 8总结工作与展望 13 参考文献 14 谢 辞 16 1 前言 在现代化信息管理的时代下 ,教育工作者可用蓝牙考勤系统进行签到。学生可以进行请假,进而更好安排自己的学习计划。老师端不仅可以通过考勤检查学生到勤状况,还可以发布群消息。不仅节省了人工成本,还提高了效率。本设计的基于蓝牙的考勤系统是基于app和服务端交互,蓝牙之间连接。课题针对用户界面设计,意在做出互动性强的界面。[1] 1.1本设计的目的、意义及应达到的技术要求 目前,考勤签到多采占用时间长效率的口头签到,这样易造成课堂学生学习时间减少,时间花在考勤。为了造就一个良好的教学环境,本设计易在完成一个先进高效的蓝牙考勤系统,并使用Android设计一个一致性高,受众广,易上手,界面切换迅速,字体颜色分布看着舒适的界面。选择一个主要色调作为APP的主题色。让操作达到简单舒适的范畴,合理传达视觉元素,达到信息对于用户来说一目了然。
1.2本设计在国内外的发展概况及存在的问题 近年来随着大学生数量增多,考勤任务变得越来越兼巨,拖延时间也长。教师也不可能每节必点名,这样引起学生的侥幸心理,对学生的学习和发展无疑是种巨大的影响。而改变机制使得点名时间大幅度减少,效率变高。而用户界面设计也是不可或缺的一环,因为考勤的顺利与否会影响积极性(用户体验),所以优化用户使用感受,尽量使用户感受傻瓜式体验。因为企业学习都是追求效率,时间就是金钱,在这种基础上蓝牙考勤系统越来越普及。无论国内还是国外,在不久的将来,口头点名这类地效率低下的方式最终将被淘汰。[4] 在国外,app的设计更加人性化,他们把用户体验作为最终目标,打造了许多让人爱不释手的app。那些app下载率都高居不下,见到有趣十分减压,它由许多元素组成,譬如俏皮的文字,适宜的画面,完美的组合成了这个app,多次使用视觉手法,引发人们的共鸣。
所以一个好的用户体验是用户对这个app的直观感受,不夸张地说一个良好的互动的的确确能影响到用户对其的使用积极性,从而引发一系列相关连锁问题。本设计以安卓为平台,以点名app为媒介,找到符合大众视觉需求的界面样式。以舒适简洁好用出发。
但是受限于某些限制,国内设计的操作系统在经验和性能上与国外还有一定差距,手机用户界面没有国外那么人性化,缺少良性互动,缺少实用性。所以应该想方设法增加客户粘。
1.3本设计应解决的主要问题 打造用户喜欢的用户界面,根据用户的使用习惯设计界面,如阅读习惯,信息语言使用是否恰当,数据对齐排列,屏幕各类图标摆放适宜。减少app中广告植入,过多的广告植入不在用户的享受范围内,而且app应该简单好用,减少复杂的操作和过多的页数。拉近app与客户的距离,应该为了针对该app的专用人群添加该人群熟悉的元素。
2.1关于Android Studio 2.1.1介绍 Android Studio是Google这家技术公司推出的,用于给Android这个需要合适工作环境的工具用于开发应用和调试的集成工具。
2.1.2环境搭建 下载安装Android Studio。(可不选择安装Virtual Device)。设定使用Custom,可按照自己的喜好设置。安装路径不能出现中文,因为Android Studio的默认语言中没有中文。根据自己喜好选择内存。第一次安装会自动配置gradle。
2.2 关于MyEclipse 2.2.1介绍 MyEclipse是一个包含几乎所有Java所学特殊功能于一体开发环境。是高效开发的选择,从Java Spring到REST Web服务再到Maven均可在MyEclipse中统一开发。它有着强大的Java EE优势,也可在WebSphere、WebLogic、Tomcat、Glassfish这种使用各种应用系列服务器。
该软件没有什么特殊之处。但自带的tomcat并没有那么好用,需自己安装一个7x的,导入路即可。再启动服务器, 下方Console可显示内容与相关信息。
2.3关于Mysql 2.3.1介绍 MYsql是一个数据存放的仓库。为了方便管理和使用数据库中的数据,数据被按照早就编写好的规律存放。在数据库对数据的管理下,用户日常的操作将更加有效且组织化,也更加易于管理。它由5部分组合成。数据库服务器。数据库,数据表,字段和行。SQL,结构化查询与程序的应用设计语言,是一种有着不寻常目的编程语言,用于存取查询,更新,管理数据库系统。
2.3.2环境搭建 将Mysql的安装路径配置到Path环境变量中。安装的时候避免中文路径。设置端口为3306.。将字符集设置值为默认的字符其集。
2.4操作系统选择 2.4.1关于Android 2007年刚成立才22个月的Android公司被Google收购并在11月份被Google纳入OHA(Open Handest Ailance),即是所谓的手机开放联盟。它是在Linux系统上建立的,从开发到现在,Android操作系统一直保持着不可思议的进步速率,而它相对于其他操作系统的优势便是其完全开放的代码。在2008年,第一台基于Android的智能手机面向世人。在此次事件之后,Android以凭借着它的优势势不可挡地进入了其他电子设备地开发领域,并在2011年地第一季度成为全球使用最多地操作系统。在2013年,Android成为了这领域当之无愧的霸主。
2.4.2Android架构 Android的架构可具体分为4部分。因为Android操作系统是基于Linux内核的基底上开发的,所以这层为Linux Kernel。在这一层中使用的是C语言开发的,都是一些设备的驱动程序,这些驱动程序均为最基础且核心的功能,功能相对比较简答。其进程和内存管理还有服务功能都需要linux来驱动,如显示蓝牙照相机音频驱动。而在这层上面为LIibararies和虚拟机所构成。Library包含一些C++和C语言的程序包。有了这些程序包,许多功能各异的组件就可以被利用到,使开发者在开发过程中更加便捷方便。如因为大多程序要用到图片和视频,所以录制功能和解码有媒体文件功能要用到媒体库。以及标准的系统都要用到的C语言库。又因为Android使用Java编程语言,所以其拥有一个安卓核心系统运行库。有对2D底层图像处理的库SGL。不同于SGL,Surface是用于子系统管理且对图像处理上更有建树。
Dalvik虚拟机也是这部分的重要组成鹅部分之一,它对于移动的电子设备如平板和智能手机有着与其他设备得天独厚的优势,比如说在有限的组装空间里的芯片储存空间和能快速响应的能力。在这些的上层是应用程序框架(Application Framework),它作为连接程序和linux驱动层能在此基础上开发应用程序,也就是说一个开发人员想要开发应用程序都必须基于开发应用程序框架。在Android程序框架中,而且这必须建立在保证框架是对整个结构没有不良的影响下,为了方便开发人员对程序的访问,一大部分核心重要代码是开放的。因此开发人员在开发不同的应用程序时可以很便捷地互相使用或提供给其他人思路。重复的组件使用减少了,想要替换模块中的组件也更加简单。如内容提供器、通知管理器。
最上层即为用户直接接触的程序层(Application),在我们的日常生活中有丰富且功能各异的应用程序。如最基础的电话和短信功,备忘录时间网页浏览功能。或可从Google play上下载应用程序其中包括许多开发人员自己开发的程序。使用的语言为JAVA,程序比较灵活不会死板。着这很大程度上归因于用户个人开发和Android本身的核心为同一层次,即构建于安卓系统上的应用程序接口。
2.4.3Android应用程序开发的四个主要模块 Activity屏幕组件Service服务组件Broadcast Receiver广播接受组件Content Receiver内容提供者。
Activity 它时一种包含用户界面的组件,这是用户唯一能看到的,也是进行交互的界面。一个应用程序包含着零个或以上的组件。而在活动组件内又包含多个控件。Textview是用来显示文本的EditText顾名思义就是一个可给用户在程序上编辑信息的组件。Button则用来给予用户监听事件活动的功能。具体点理解Activity就是一个程序上的屏幕之一。Activity有四种活动模式,本设计采用默认standard模式。
Service 它不属于一个独立进程,属于用户看不见的界面,它让Android实现了后台运行的方案,比较适用于那些一直长时间运行但又不用用户进行交互的任务。有点类似于电脑的后台进程。它不需要任何用户界面的帮助,且当用户打开或切换应用程序时并不会对它造成影响。
Broadcaster Receiver 用来接收系统或者自身应用程序的广播。比如注册软件时的短信提醒,来电提醒功能,闹铃提醒功能等。在Android的广泛选择中你可以选择自己更加感兴趣的程序进行广播。广播分为有序广播和标准广播。标准广播为完全异步,所有接收器几乎同时接收,效率高,但是不能被拦截。有序广播只有等逻辑执行完才有下一步,有先后顺序,优先级高的先接受且它可拦截广播。
Content Provider 应用程序通常只能访问应用内储存的数据,共享的数据则不能对外提供。内容提供者则实现了跨程序间的数据共享。它有一整套完健全的机制去给权限一个程序去访问另一个程序中的属数据,与此同时还能保证数据在操创建一个供给于数据的访问接口 2.5语言JAVA 目前Java主要应用于中间件的开发 -- 明,Java不适合pc应用程序的开发,其发展逐渐变成在开发手持设备,互联网信息站,及车载计算机的开发. Java的语法与C++语法类似 ,而且Java是完全的彻底的面向对象的,其中提出了很好的GC(Garbage Collector)垃圾处理机制,防止内存溢出。
优点:JAVA语言健壮且安全,使用servlet机制使得编程更加高效不易崩溃。它时多线程工作模式且可移植性好。
3设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。
4用户界面设计 本设计研究内容基于Android这个比较方便使用的系统。设计出来界面内容以XML的格式存储。在研发过程中只需解析这些XML文件,然后再将其中信息补充进相对的界面中。由于本人负责的是用户使用各项功能的见界面设计和界面接口设计。所以本位会着重讲Activity及相关组件。
4.1用户界面设计的原则 它存在的意义在于它是人与机器交互如进行信息交互对话的中间体。随着高科技的发展,人机交互的方式方法也更加多样化。它有很多种元素构成,比如视觉上和听觉上的交互,用户使用时的操作逻辑。因此界面设计可以说时是一款软件的门面。一个好的人性化设计应该涵盖一下几个方面。[1] 4.1.1界面整洁 保持界面整齐简洁,一个好的界面一定能让用户轻松地掌握它地使用方法,尽量达到用户感觉不到很复杂地界面存在但能快速区分信息地重要性。
4.1.2通用性 无论是在此应用内还是与其他app比较起来,大体地布局都应该相似。在整体的界面中应该高度一致,特别是在字体的应用上还有对方块的颜色和放置的位置。这样用户的使用才会更加的舒适整洁。用户熟悉界面后能效率更高的工作或转战于其他app。
4.1.3合理的界面布局 Android中的各种组件位置的放置是非常有讲究的。为了让的界面看起来舒适,排版应均匀,元素放置不应该全聚集于一处或又过于稀疏。可以合理运用颜色,纹理,对比度和光效来制造美感或引导用户的注意力到重点的事物上。文字在某种意义上是传达文化符号的一种信息,所以可对文字进行艺术效果处理,增强联系结构。在重点想描述部分可是用加粗或者黑体下划线来特别说明。应认真思考重点文字的字体和所放置位置,提高可读性和舒适性。除非想打造一种别样的风格,增加视觉感,不然还是以阅读舒适性为主。为了主流大众符合阅读习惯,大多使用左对齐,也可使文字和图片搭配使用,但是还是要以文字为主图片为辅。图形是比较多用到的一种素材。常用于传达信息的用户头像,代表方向的箭头。在一定程度上减少文字的表达,使得app更加多样化且有趣。同时还要注意对应分辨率的大小。在不同情况下,app要按照严格的设计规定。有时候空间有限,应适当剪裁留下重要部分。颜色选用高辨识度。[2] 在进行排版设计中,不仅要靠虑到用户的实际需求还要将想表达的主题信息和视觉要素以适合融洽的方法联系到一起。来自巴塞卢罗那庞培法布拉大学的心理学教授葛思达在研究人类的视觉规律时曾经提到过“最佳视域”这个概念。在一个版面中,它的左和上部分是让人最轻松且容易接收信息的部分,所以设计的时候要注意这两部分的构造。要强调重复性,因为重复的元素不仅可以吸引用户的注意力还能着重强调某种特殊的信息,一般是在用类似和或近似的图片来搭建,可以在律动和放置的位置或者方位上有细微的调整,比只是单一枯燥的重复要好。在构建界面时要注意平衡性,两个有联系的元素上保持视觉的平衡,平衡不一定要完全一样,而是在某些微小特真上改动,大体还是要保持平衡联系性。
因为用户对色彩是十分敏感的,选择正确的颜色能影响客户的心理程序,比如本设计为与学习相关的app,所以使用让人冷静的墨绿色。而如,消防栓,和灭火器这种能让用户十分敏感,刺激视觉能让人马上注意啊到的颜色。文化的不同对颜色和文字使用不一样,如西方13被代表恶魔,和中国 忌讳谐音。色调统一,能代表开发者对本app的主旨,符合设计心灵学。[5] 4.14界面设计使用到的布局属性 线性布局:Android操作系统布局中比较常用到且简易的布局方式。在这种布局里,它的子布局按照横线或者竖线排布。并可分配权重。
1其中可用orientation设置为水平或者竖直的排列方式。
2 gravity里面的控件或者字体的对齐方式,子容器相对于父容器的布局,如左对齐或者底部对齐。而layout_gravity指的是该元素本身的布局。同理width控制控件内文本宽度,layout_width控制控制该元素本身的宽度。height和layout_height一样。layout_weight指布局所占比重,可通过更改属性调整屏幕占比。
3 在Android中有些组件需要一个int值,表示只接收int该类型的值,按照格式必须以@开头。而如果s是@+则表示修改完某些布局后要在文件中生成相应int值,例@+id/bzzb。变量名为/后面的值。但如果文件中已经存在相同名字的变量则会直接使用已经存在的值。常用在一些输入文本上,比如输入id或者密码。
4 background,为你的组件生成一个背景图也可以全用别的颜色。
5 divider,分割线。可以用drawable中的图片,也可以shape定义一个。也可以用showDividers来设置分割线所在位置,有none(无分割线)middle(在两控件中间设置分割线)begining(在顶端设置)end(在末端设置分割线)。
6 fill_parent,wrap_content,match_parent,这三个属性都是用来将视图内容或尺寸的大小及布局作调整的。fill_parent用来强制性的使组件的尺寸填满该布局内的空间.wrap_content用来完整显示整个布局。match_parent与fill_parent一样。
7 drawable图片资源,通过@drawable可获取已放置在里面的图片资源。许多app自定义的图标和背景图及其开发者要使用的图片转为xml文件里放在drawable中储存。
8 values。values存放了colors常用默认的颜色值,使用时可调用,每个颜色有专用的代码。Dimen是屏幕中像素的大小,本设计主要用到的是dp。Strings是字符串,提前写好,使用使直接调用即可。Stylenames是本设计的某些控件主要风格。总的来说就是一个已经整合好的资源库随时可以拿出来调用。
9 layout_margin,指距离父控件的各距离。Padding控制的内容距离四 边界的距离。Visibility可设置控件是否可见,可设置为不可见及可见,但不可见仍占据布局。Scrollbar用来设置滚动条,用法很多,可设置为是否可见,滚动方向,背景色,是否有轨道,褪色方向。
10 Edittext文本编辑。Hint可输入提示信息。在输入账号或者密码的时候经常用到。numeric=integer/decimal当有特殊需求只能输入整数或者小数的时候用到。singleLine=true则为设置只能输入单行。TextColour字体颜色。Textstyle字体。TextColourHint默认字体颜色。Typeface=monospace字体间距。Background背景,可设置为null默认没有。MaxLengtht限制文本长度。CusorVisivle设置光标是否可见。Capitalize设置英文字母大小写类型。可设置为AutoText自动纠正文本错误。Editable是否可编辑。Elipise,TextScaleX=1.5控制字与字之间距离。设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end”——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)。
11 Textview:android:text设置显示文本。android:textappearan设置文字外观。android:textcolor设置文本颜色。android:textcolorhighligh被选中文字的底色,默认为蓝色。android:textcolorhint 设置提示信息文字的颜色,默认为灰色。android:textcolorlink文字链接的颜色 textscalex设置文字之间间隔,默认为1.0f。android:textsize 设置文字大小,推荐度量单位”。textstyle设置字形。android:autolin设置是否当文本为:url链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all)android:autotext设置,将自动执行输入值的拼写纠正。此时是无效果的,只在显示输入法并输入的时候起作用。android:buffertyp指定gettext()方式取得的文本类别。android:capitalize设置英文字母大写类型。需要弹出输入法才能看得到。android:cursorvisible设定光标为显示/隐藏,默认显示。android:digits设置允许输入哪些字符。如“1234567890.+-*/% ()”android:drawablebottom 在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。android:drawableleft在text的左边输出一个drawable。android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”—-省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动)android:freezestext 设置保存文本的内容以及光标的位置。android:gravity 设置文本位置,如设置成“center”,文本将居中显示。android:hinttex为空时显示的文字提示信息,可通过textcolorhint设置提示信息的颜色。android:impositions附加功能,设置右下角ime动作与编辑框相关的动作,如actiondone右下角将显示一个“完成”,而不设置默认是一个回车符号。android:includefontpadding设置文本是否包含顶部和底部额外空白。inputmethod为文本指定输入法,需要完全限定名(完整的包名)。android:inputtype设置文本的类型,用于帮助输入法显示合适的键盘类型。android:linksclickable 设置链接是否点击连接,即使设置了autolink。android:ems设置textview的宽度为n个字符的宽度。这里测试为一个汉字字符宽度。
12ListView是一个能将数据集合起来以动态滚动方式展示到用户界面View。将具体内容 以列表的形式展示并且能够自适应数据内容,然后通过适配器加载到屏幕。如此说来Adapter是用来在View和数据之间传递的。
13Button普通按钮ImageButton为图像按钮,为Textview字类,所以它的很多属性可以应用到Button上,通过drawable里的资源StateListDrawable可以将按钮设置成按下去为一个颜色弹起来又为一个颜色。drawable:引用的Drawable位图,我们可以把他放到最前面,就表示组件的正常状态 。state_focused:是否获得焦点。state_window_focused:是否获得窗口焦。state_enabled:控件是否可用。state_checkable:控件可否被勾选,state_checked:控件是否被勾选,state_selected:控件是否被选择,针对有滚轮的情况,state_pressed:控件是否被按下,state_active:控件是否处于活动状态 。state_single:控件包含多个子控件时,确定是否只显示一个子控件。state_first:控件包含多个子控件时,确定第一个子控件是否处于显示状态。state_middle:控件包含多个子控件时,确定中间一个子控件是否处于显示状态。state_last:控件包含多个子控件时,确定最后一个子控件是否处于显示状态。
14 ImageView为图像视图,就是用来显示图像的一个组件。值得注意的是background背景通常是为了填充屏幕而进行拉伸。而图像试图属于内容,不会进行拉伸而是按照原图片直接进行填充。且在调整缩放的时候要配合maxWIdth最大宽度和maxHeight最大长度这两个属性一起使用,它才会成功调整。fitXY:对图像的横向与纵向进行独立缩放,使得该图片完全适应ImageView,但是图片的横纵比可能会发生改变。fitStart:保持纵横比缩放图片,知道较长的边与Image的编程相等,缩放完成后将图片放在ImageView的左上角。fitCenter:同上,缩放后放于中间;fitEnd:同上,缩放后放于右下角。center:保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。centerCrop:保持横纵比缩放图片,知道完全覆盖ImageView,可能会出现图片的显示不完全。centerInside:保持横纵比缩放图片,直到ImageView能够完全地显示图片matrix:默认值,不改变原图的大小,从ImageView的左上角开始绘制原图, 原图超过ImageView的部分作裁剪处理 15 fragment可看作一个小型Activity,组件多管理过于麻烦,此时就要用到fragment进行模块化管理,但fragment不可单独使用,会收到宿主Activity的生命周期影响。Fragment的生命周期和Activity有点类似:三种状态:Resumed:在允许中的Fragment可见,Paused:所在Activity可见,但是得不到焦点,Stoped: ①调用addToBackStack(),Fragment被添加到Bcak栈 ②该Activity转向后台,或者该Fragment被替换/删除,但是停止状态的fragment仍然活着 不过对用户不可见。
16 progressbar是安卓下的进度条,当使用到加载画面的时候或者在看视频的时候进场用到。
相对布局:也是Android界面设计里常用到的一种布局。顾名思义就是相对父元素或者兄弟组件来有参照的布置子元素。
5教师学生界面设计 这次设计的教师主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、查看考勤、查看请假、发布通知以及打开校园官网、关于和退出系统。
本次设计学生主要功能:登录、注册、蓝牙设置、蓝牙连接、分享至第三方、蓝牙签到、蓝牙请假、吊起qq联系老师、接收通知、关于系统、退出系统。
本设计建立的Activity 主要有介绍本APP应用,添加通知界面,登录界面,查看请假和查看签到界面,注册和加载界面。学生老师操作的界面则为了方便管理使用fragment。
5.1注册界面 当学生或者老师使用本app时首先应注册一个账号,那么就来到了RegisteActivity。采用了线性布局,界面垂直排布,界面占满整个屏幕,调用了drawable里的背景图作为背景,调用了放在layout里面的考勤签到注册布局.整体让这个小长方形里的元素采用竖直线性结构,具体里面采用相关布局因为元素比较多。包含了工具栏toolbar。使用显目大框和bold字体还有符合主题的颜色作为题目。为了能让用户分清哪个框是填对应什么的,使用了hint提示文字并配上对应图标使左对齐。为了能更清晰的让用户看清填的东西将背景色设置为null。并所有文本左对齐layout_marginLeft。使各布局central_vertical垂直居中。服务器地址需要限制输入文本Digits =0,1,2,3,4,5,6,7,8,9,0,.。最下方是提交BUTTON,button放块设置为比其他输入按键稍大。
5.2欢迎界面 背景布局为全绿色。有开场动画,先弹出string里面第一串字符串考勤签到app然后再弹出第二串字符串毕设作品。然后就进入主界面。
5.3查询请假界面 先设置好每个item即每个小项目的的规格。比如查询请假时每个学生的请假信息。然后用ListView加载。如果没有项目将用TestView显示暂无数据记录。
查询签到界面 项目界面与查询签到界面一样。
5.4工具栏界面 Toolbar在界面的最上端,为了方便用户使用,存在于每一个界面最上端。采用了相对布局,在每一个界面的最上方都存在工具栏。
5.5 登录界面 将整体设置为好打理的相对布局。在主要界面的上方有加载图标ImageView,在用户填写完账户后弹出。在左上方设置了一个半圆的图标提示用户现在使用的是学生端或教师端。在最下方用Textview设置2020 毕业设计作品提示字样。然后include登录表格布局与注册中一样。不过在最下方添加了注册和登录的Button。
发布通知界面:最上方是背景图为学校缩略图。往下为三个EditText,分别为发布内容姓名时间。其中发布内容占据板块较大并且都带有hint提示字符。最下方为发布提交Button。
5.6关于系统界面 有关于系统的介绍和使用的工具,app所拥有功能,开发团队及版本号均使用TextView展示。
5.7左滑小菜单 在学生或老师主要功能界面有fragment展示学校背景和两个TextView,分别是学校官网和退出系统。在现有的移动用户端中,大多都采用这种形式,不仅与大众群体的习惯有关,这还能整个操作过程变的更加平滑,让用户的操作更加具有流畅性。而且还能再拥挤的屏幕上节省了时间,用户整洁度提高。
5.8教师功能界面 使用fragment.在登陆界面左上角有可切换为学生端按键。中间有深色底白色字体显示界面的标题。从上到下为符合行业标准的蓝牙地址,账号,密码。并且每个图标必须有特色,不需要字体也可快速分辨出对应图标。登录成功过后下次可记忆最近一次的账号密码。最下面两个功能为注册和登录。最下方字体标明产品来源。登录界面的背景图选用跟app主题颜色相互搭配的图片。
在点击登录之后,在教师端打开蓝牙期间可现实加载图案。最上方像许多常规app一样显示当前界面,方便用户查明所在界面。下方为教师可发布的公告。公告需放置于仅大标题下,但字体放小可滚动的提醒作用。显示蓝牙状态,因为此为重要状态显示功能,用生活种红色代表失去连接,绿色代表已连接的状态显示,并且消息窗口可现实与哪位学生连接,并且显示蓝牙地址,连接成功后有灰底黑字小框提示。登陆界面的切换学生端改为显示教师名字。并且可发布Tips。由于该页面功能较多,有蓝牙设置,考勤签到,查看签到,查看请假,发布通知,及关于系统的介绍。所以排版不可过于紧凑,流出舒适空间。因此,功能均采用圆形图标。图标要符合审美比例,字体要与界面大小和相应功能图标和界面比例要符合用审美。在做到这些的基础上尽量简洁。一个良好的用户界面设计应与用户的显示世界感官相贴近。
在学生进行请假时,会有白底黑字弹窗提示,下方可选择拒绝或同意。同时操作后会有通知更新。关于系统介绍北京采用北理珠图片。有作品介绍及使用了哪些工具。下方为主要涵盖功能,如教师学生端均有的登陆注册,蓝牙设置,蓝牙连接,分享至第三方,查看考勤,查看请加发通知,校园官网,关于系统,通出系统。而学生端有蓝牙签到请假,接收通知。主要开发工具为AndroidStudio,MyEclipse,My'Sql,Tomcat,Navicat for MySQL等开发工具,还有开发人员和版本号。这些都是为了使用者能更好了解本功能。并且在此界面右上角为第三方分享,方便使用。
5.9学生功能界面 同样使用fragment除了开启考勤换成了学生的开连接。
除了学生端界面改了上面的注释标,发布通知换成了联系老师,查看签到和查到请假换成对应的查看和请假,其他均与教师端基本相同。
提示界面:因为提示界面转瞬即逝,所以通常使用fragment。加载界面由TextView显示正在加载和Progressbar进度条即可。分别显示的是在有网络延迟正在加载的“正在玩命加载”界面来提示用户现在的情况和“没有更多了”来提示用户浏览界面已经到头了还有最后出现错误的“出错了”界面,后面还加上猫表情拉近开发者与用户的距离。
6接口设计 界面接口设计指的就是人机的交互形式。因为虽然我们可以用控件做一个精美的界面,但它仅仅只是界面而已,无法与用户进行互动。所以就要用到Android使用最频繁的监听机制。比如用户填写完了基本信之后点击注册按钮,这时候开始向服务器发送登录请求。其实就是在屏幕的后面,当用户交互时看不见的一些动作。
流程:一开始先为事件源注册监听器,一般是组件。然后用户外部的动作触发然后触发事件源的事件。事件源受到影响后会生成对应事件,此时事件监听器将会把事件的参数记录下来,从而对不同的数据进行数据分析,分析后得到事件的处理方法。事件源,事件,事件监听器。
主要方法:
1 直接使用匿名内部类,通常只是用一次,复用性不高,是本设计使用最多的监听方法。
2 使用内部类,好处是可在该类中进行复用并可直接访问所有界面的组件。
3使用外部类,这种形式比较少见,即为创建另一个JAVA文件,但通常会导致代码不够简洁好用。
4 将Activity作为事件的监听器。
5 直接绑定到标签,即为在layout布局的文件中将对应的Activity中可以定义一个事件的处理方法 ,相对应组件触发事件的组件即可。
7考勤签到设计原理 老师与学生之间传递信息使用蓝牙为媒介。服务端则利用Servlet这个用来处置服务器的响应的程序,它是轻量级框架进行HTTP请求和响应的的。响应从教师端或学生端发起到服务端进行处理,再返回到学生或教师端。蓝牙作为每个设备独有地址中的模块是一种载体。
8总结工作与展望 本文主要针对设计的考勤签到系统和交互界面设计的优点和一些不足进行总结。
优点:必要功能健全,使用操作方便,Android系统比较灵活。人和UI界面互动良好,教师可从发布通知,查看考勤情况,也可与学生进行互动。
缺点:虽然手机端操作方便,但电脑端还要打开服务器,用户界面比较拥挤,而且接口项目有限,多个学生同时连接可能存在丢失情况, 展望:可以拓展更多功能,如签到排名,学生可发弹幕,增加学生与学生及学生和老师之间的良性互动。蓝牙考勤的系统普及关系一定越来越高,app已经广为社会使用。随着技术的更新换代,人机交互的形式也必然更加让用户感同身受。
参考文献 [1] 王鹏飞,移动设备应用软件交互界面设计[D].工业设计工程,2013 [2] 王延盼,基于安卓的App界面视觉艺术元素的分析与探究[D].艺术与设计学院,2013 [3] 葛会会,基于蓝牙考勤系统的设计与实现[D].电子与通信工程,2016 [4] 向小琼,李敏,蒲昱霖,刘海燕,基于蓝牙通信的高校课堂手机考勤管理系统[R],长沙医学院,2018 [5] 王曦,有关软件中用户界面设计的探讨[N].山东工业技术,2018-10-25(10). 附 录 MyEclipse所用到代码:
//Food.java package com.bs.bean;
//功能说明:
public class Food { public String id; public String uuid; public String name; public String state; public String time; } //Like.java package com.bs.bean; public class Like { public String id;// public String num;// public String name;// public String like;// } //NotifyInfo.java package com.bs.bean; public class NotifyInfo { // 通知 public String id;// public String name;// 姓名 public String content;// 内空 public String type;// 类型 public String time;// 时间 public NotifyInfo(String name, String content) { super(); this.name = name; this.content = content; } } //RatingBar.java package com.bs.bean; /** * * 功能说明:
* */ public class RatingBar { public String id; public String uuid; public String name; public String state; public String time; } //Suggestion.java package com.bs.bean; /** * * 功能说明:
* */ public class Suggestion { public String id; public String uuid; public String name; public String state; public String time; } //User.java package com.bs.bean; public class User { public String uuid;// public String name;// public String psd;// public String type;// public String logourl;// public String chineseName;// 中文名字 } //=============================== //FunctionServlet.java package com.bs.servlet; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.bs.bean.NotifyInfo; import com.bs.util.DBUtil; import com.bs.util.ReqType; import com.bs.util.RspType; import com.bs.util.T; /** * 项目名称:bs002 功能说明:多功能管理类 */ @SuppressWarnings(“serial“) public class FunctionServlet extends HttpServlet { private String tag = “FunctionServlet:“; private HttpServletResponse response; private boolean result; private List datalist; private String requestType;// 请求参数集 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.response = response; request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); requestType = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); if (!requestType.contains(“QueryNotify“)) { System.out.println(T.getDateTime() + “=====“ + tag + “======正在请求获取:“ + requestType); } if (requestType.startsWith(“Add“) || requestType.startsWith(“Remove“)) { addTypeRequest(requestType); } else if (requestType.startsWith(“Query“)) { queryTypeRequest(requestType); } else if (requestType.startsWith(“Delete“)) { deleteTypeRequest(requestType); } } /** * 新增数据接口 */ private void addTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Add_Notify)) {// 发布通知 String[] params = requestType.split(“:“); NotifyInfo notify = new NotifyInfo(params[1], params[2]); result = DBUtil.addNotify(notify); } else { return; } if (result) { returnResponseStringData(RspType.SUCC); } else { returnResponseStringData(RspType.FAIL); } System.out.println(“add result:“ + result); } /** * 查询数据接口 */ private void queryTypeRequest(String requestType) { if (requestType.startsWith(ReqType.Query_Notify)) { List<NotifyInfo> notify = DBUtil.getFirstNotify(); returnResponseListData(notify, “notify“); } } /** * 删除数据接口 */ private void deleteTypeRequest(String requestType) { } private void returnResponseStringData(String result) { PrintWriter out; try { out = response.getWriter(); out.print(result); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } private void returnResponseListData(List datalist, String type) { try { JSONObject object = new JSONObject(); JSONArray array = new JSONArray(datalist); object.put(type, array); OutputStream os; os = response.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, “utf-8“); BufferedWriter bw = new BufferedWriter(osw); bw.write(new String(object.toJSONString().getBytes())); bw.flush(); } catch (IOException e) { e.printStackTrace(); } } } //LoginServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:登录校验 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class LoginServlet extends HttpServlet { private String Tag = “LoginServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; String result = DBUtil.checkUser(user); String[] reStrings = result.split(“:“); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); out.print(result); out.flush(); out.close(); switch (Integer.parseInt(reStrings[0])) { case -1: // 用户名不存在 response.getWriter().print(“用户名不存在“); System.out.println(Tag + “用户名不存在:“ + user.name); break; case 0:// 登录成功 response.getWriter().print(“登录成功“); System.out.println(Tag + “登录成功:“ + user.name); break; case 1:// 密码错误 response.getWriter().print(“密码错误“); System.out.println(Tag + “密码错误:“ + user.name); break; case 2:// 查询异常 response.getWriter().print(“查询异常“); System.out.println(Tag + “查询异常:“ + user.name); break; } } } //RegisteServlet.java package com.bs.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bs.bean.User; import com.bs.util.DBUtil; /** * * 功能说明:注册 * * 创建时间:2018-6-1 下午3:35:29 */ @SuppressWarnings(“serial“) public class RegisteServlet extends HttpServlet { private String Tag = “RegisteServlet:“; private User user; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); String param = new String(request.getParameter(“param“).getBytes( “iso-8859-1“), “utf-8“); System.out.println(Tag + “收到请求:“ + param); String[] reqArray = param.split(“:“); user = new User(); user.name = reqArray[0]; user.psd = reqArray[1]; user.chineseName = reqArray[2]; boolean result = DBUtil.addUser(user); response.setCharacterEncoding(“UTF-8“); response.setCharacterEncoding(“UTF-8“); response.setContentType(“text/plain;charset=utf-8“); response.setHeader(“Pragma“, “No-Cache“); response.setDateHeader(“Expires“, 0); PrintWriter out = response.getWriter(); if (result) { System.out.println(Tag + “注册成功:“ + user.name); out.print(“0:“ + user.chineseName); } else { System.out.println(Tag + “用户名已存在:“ + user.name); out.print(“-1“); } out.flush(); out.close(); } } //DBUtil.java package com.bs.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import java.util.UUID; import com.bs.bean.NotifyInfo; import com.bs.bean.User; /** * * 数据库连接工具 */ public class DBUtil { private static Connection con; private static PreparedStatement ps; private static ResultSet rs; static { try { Class.forName(“com.mysql.jdbc.Driver“); con = DriverManager .getConnection( “jdbc:mysql://localhost:3306/bs002elm?characterEncoding=utf-8“, “root“, “123“); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } /** * 用户注册 * * @param name * @param psd * @return */ public static Boolean addUser(User u) {// TODO Boolean result = null; List<User> list = DBUtil.getAllUsers(); for (User user : list) { if (u.name.equals(user.name)) { return false; } } String sql = “insert into user(uuid,name,psd,chinese_name) values(?,?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, UUID.randomUUID().toString()); ps.setString(2, u.name); ps.setString(3, u.psd); ps.setString(4, u.chineseName); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addUser Exception]“ + e.toString()); } return !result; } /** * 用户登录校验 * * @param uu * @return */ public static String checkUser(User user) { String result = “-1“; String sql = “select * from user where name=?“; try { ps = con.prepareStatement(sql); ps.setString(1, user.name); rs = ps.executeQuery(); while (rs.next()) { if (user.psd.equals(rs.getString(4))) { result = 0 + “:“ + rs.getString(6);// 返回移动端 中文名字 } else { result = “1“; } } } catch (SQLException e) { e.printStackTrace(); result = “2“; } return result; } /** * 添加通知 * * @param name * @param psd * @return */ public static Boolean addNotify(NotifyInfo notify) { Boolean result = null; String sql = “insert into notify(content,name,time) values(?,?,?)“; try { ps = con.prepareStatement(sql); ps.setString(1, notify.content); ps.setString(2, notify.name); ps.setString(3, T.getCurrentTimeMillis()); result = ps.execute(); } catch (SQLException e) { System.out.println(“[addNotify Exception]“ + e.toString()); } return !result; } /** * 获取通知 * * @return */ public static List<NotifyInfo> getFirstNotify() { List<NotifyInfo> list = null; NotifyInfo m = null; String sql = “select * from notify order By id desc limit 1“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<NotifyInfo>(); } m = new NotifyInfo( rs.getString(“name“),rs.getString(“content“)); list.add(m); } } catch (SQLException e) { System.out.println(“[getNotifyInfo Exception]“ + e.toString()); } return list; } /** * 修改密码 */ public static Boolean updatePsd(String uuid, String psd) { Boolean result = false; String sql = “update user set password=? where id =?“; try { ps = con.prepareStatement(sql); ps.setString(1, psd); ps.setString(2, uuid); result = ps.execute(); result = true; } catch (SQLException e) { e.printStackTrace(); } return result; } /** * 获取注册用户列表 * * @return */ public static List<User> getAllUsers() {// TODO User user; List<User> list = null; String sql = “select * from user“; try { ps = con.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { if (list == null) { list = new ArrayList<User>(); } user = new User(); user.uuid = rs.getString(“uuid“); user.name = rs.getString(“name“); user.psd = rs.getString(“psd“); user.chineseName = rs.getString(“chinese_name“); list.add(user); } } catch (SQLException e) { System.out.println(“[getAllUsers Exception]“ + e.toString()); } return list; } } //JsonUtils.java package com.bs.util; import com.sun.org.apache.bcel.internal.generic.NEW; import test.Student; public class JsonUtils { public static void main(String[] args) { } // public static String toJson(RspType r) { // // 1、使用JSONObject // // JSONObject json = JSONObject.fromObject(r); // // String result = json.toString(); // return result; // } public static String toJson2() { Student stu = new Student(); stu.setName(“JSON“); stu.setAge(“23“); stu.setAddress(“北京市西城区“); // // 1、使用JSONObject // JSONObject json = JSONObject.fromObject(stu); // // 2、使用JSONArray // JSONArray array = JSONArray.fromObject(stu); // String jsonString = com.alibaba.fastjson.JSONObject.toJSONString(stu); System.out.println(jsonString); // String strJson = json.toString(); // String strArray = array.toString(); // // System.out.println(“strJson:“ + strJson); // System.out.println(“strArray:“ + strArray); // strJson:{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“} // strArray:[{“address“:“北京市西城区“,“age“:“23“,“name“:“JSON“}] return jsonString; } public void test2() { } public void test3() { } } //ReqType.java package com.bs.util; public class ReqType { public static final String Query_RatingBar = “QueryRatingBar“; public static final String Query_Suggestion = “QuerySuggestion“; public static final String Query_FoodOrder = “QueryFoodOrder“; public static final String Query_Notify = “QueryNotify“; public static String Add_RatingBar = “AddRatingBar“; public static String Add_Suggestion = “AddSuggestion“; public static String Add_FoodOrder = “AddFoodOrder“; public static String Add_Like = “AddLike“; public static String Add_Notify = “AddNotify“; public static String Remove_Like = “RemoveLike“; public static String Query_Favorite = “QueryFavorite“; } //RspType.java package com.bs.util; public class RspType { // 返回给移动端的状态值 public static String SUCC = “true“; public static String FAIL = “false“; private int code; public RspType(int code) { this.code = code; } @Override public String toString() { return “ResponseCode{“ + “code:“ + code + '}'; } } //T.java /* */ package com.bs.util; import java.io.ByteArrayInputStream; import java.text.SimpleDateFormat; import java.util.Date; /** * 功能介绍:多功能工具类 * * @author JianRong * @date2016-12-30上午11:09:00 */ public class T { public static String getDateTime() { SimpleDateFormat farmatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“);// 获取日期时间 return farmatter.format(System.currentTimeMillis()); } public static String getCurrentTimeMillis() { return String.valueOf(System.currentTimeMillis()); } public static void log(String log) { System.out.println(“===========“ + log); } public static boolean strIsNumber(String str) { String reg = “-?[0-9]+(.[0-9]+)?$“; return str.matches(reg); } } //test //Student.java package test; public class Student { // 姓名 private String name; // 年龄 private String age; // 住址 private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return “Student [name=“ + name + “, age=“ + age + “, address=“ + address + “]“; } } 发送蓝牙连接 package com.app.bs.kqqd.bluetooth.api.request; import org.json.JSONException; import org.json.JSONObject; public class RequestMessage extends com.app.bs.kqqd.bluetooth.api.Request { public RequestMessage() { super(REQ_MSG); } public RequestMessage(int cmd, String msg) { super(REQ_MSG); this.cmdId = cmd; this.msg = msg; } @Override public RequestMessage newInstance() { return new RequestMessage(); } @Override public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(MSG, msg); return jsonObject; } @Override public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getString(MSG); } } //适配器 package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class GanHuoAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public GanHuoAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new GanHuoViewHolder(parent); } } //-------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.graphics.drawable.Drawable; import android.view.ViewGroup; import android.widget.TextView; import com.app.bs.kqqd.R; import com.app.bs.kqqd.model.GanHuo; import com.app.bs.kqqd.util.TimeUtil; import com.jude.easyrecyclerview.adapter.BaseViewHolder; /** * */ public class GanHuoViewHolder extends BaseViewHolder<GanHuo.Result> { private TextView title; private TextView type; private TextView who; private TextView time; public GanHuoViewHolder(ViewGroup parent) { super(parent, R.layout.ganhuo_item); title = $(R.id.title); type = $(R.id.type); who = $(R.id.who); time = $(R.id.time); } @Override public void setData(GanHuo.Result data) { super.setData(data); //标题 title.setText(data.getDesc()); //干货类型 type.setText(data.getType()); //根据干货类型动态替换干货图标 if (data.getType().equals(“Android“)){ setDrawableLeft(R.drawable.ic_android_black_24dp); }else if (data.getType().equals(“iOS“)){ setDrawableLeft(R.drawable.ic_whatshot_black_24dp); }else { setDrawableLeft(R.drawable.ic_play_circle_filled_black_24dp); } //干货贡献者 who.setText(data.getWho()); //干货提交时间 time.setText(TimeUtil.getFormatTime(data.getPublishedAt())); } public void setDrawableLeft(int imageId){ Drawable drawable = getContext().getResources().getDrawable(imageId); drawable.setBounds(0,0,drawable.getMinimumWidth(),drawable.getMinimumHeight()); type.setCompoundDrawables(drawable,null,null,null); } } //----------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } //----------------------------------------------------------------------------- package com.app.bs.kqqd.adapter; import android.content.Context; import android.view.ViewGroup; import com.app.bs.kqqd.model.GanHuo; import com.jude.easyrecyclerview.adapter.BaseViewHolder; import com.jude.easyrecyclerview.adapter.RecyclerArrayAdapter; /** * */ public class MeiZhiAdapter extends RecyclerArrayAdapter<GanHuo.Result> { public MeiZhiAdapter(Context context) { super(context); } @Override public BaseViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { return new MeiZhiViewHolder(parent); } } App注册响应和请求 package com.app.bs.kqqd.bluetooth.api; import com.app.bs.kqqd.bluetooth.api.request.RequestMessage; import com.app.bs.kqqd.bluetooth.api.request.ResponseMessage; import com.app.bs.kqqd.bluetooth.api.request.UnknownReq; import java.util.HashMap; import java.util.Map; public class CmdFactory { private static CmdFactory instance; private Map<Integer, Request> requestMap = new HashMap<>(); private Map<Integer, Response> responseMap = new HashMap<>(); private CmdFactory() { register(new RequestMessage()); register(new ResponseMessage()); } public static CmdFactory getInstance() { if (null == instance) { synchronized (CmdFactory.class) { if (null == instance) { instance = new CmdFactory(); } } } return instance; } public void register(Request req) { requestMap.put(req.getCmdId(), req); } public void register(Response rsp) { responseMap.put(rsp.getCmdId(), rsp); } public Request createRequest(int cmd) { Request request = requestMap.get(cmd); if (null != request) { return request.newInstance(); } return new UnknownReq(); } public Response createResponse(int cmd) { Response response = responseMap.get(cmd); if (null != response) { return response.newInstance(); } return new Response(Request.REQ_UNKNOWN); } } 对app请求响应和处理 package com.app.bs.kqqd.bluetooth.api; import org.json.JSONException; import org.json.JSONObject; public class Response { public static final int SUCCESS_CODE = 0; public static final String CMD = “cmd“; public static final String CODE = “code“; public static final String MSG = “msg“; public int cmdId; public int code; public String msg = ““; public Response(int cmdId) { this.cmdId = cmdId; } public int getCmdId() { return cmdId; } public boolean isOK() { return code == SUCCESS_CODE; } public JSONObject toJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.put(CMD, cmdId); jsonObject.put(CODE, code); jsonObject.put(MSG, msg); return jsonObject; } public void fromJsonObject(JSONObject jsonObject) throws JSONException { jsonObject.getInt(CMD); jsonObject.getInt(CODE); jsonObject.getString(MSG); } public Response newInstance() { return new Response(cmdId); } } 蓝牙连接 package com.app.bs.kqqd.bluetooth.api; import java.io.IOException; import java.util.concurrent.TimeoutException; public interface Connector { void startServer(); void stopServer(); boolean isServerOK(); void connect() throws TimeoutException, IOException; boolean isConnected(); void send(byte[] b) throws IOException; int recv(byte[] b) throws IOException; int recv(byte[] b, int offset, int count) throws IOException; void disconnect(); } 未知请求信息 package com.app.bs.kqqd.bluetooth.api.request; import com.app.bs.kqqd.bluetooth.api.Request; public class UnknownReq extends Request { public UnknownReq() { super(Request.REQ_UNKNOWN); } @Override public UnknownReq newInstance() { return new UnknownReq(); } } 调用蓝牙进行匹配连接 package com.app.bs.kqqd.bluetooth.api; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothServerSocket; import android.bluetooth.BluetoothSocket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Set; import java.util.UUID; public class BluetoothConnector implements Connector { public final static String MOS_UUID = “6c12a327-0e0b-4344-8137-c41e2a79a50d“; private String deviceAddress; BluetoothServerSocket serverSocket; private boolean stopServerFlag; private BluetoothSocket localSocket; private BluetoothSocket remoteSocket; private BluetoothSocket connectedSocket; private InputStream inputStream; private OutputStream outputStream; public BluetoothConnector() { } public BluetoothConnector remoteDeviceAddress(String deviceAddress) { this.deviceAddress = deviceAddress; return this; } public void startServer() { new Thread(new Runnable() { @Override public void run() { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (null == bluetoothAdapter) { return; } try { serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(“MOS_SERVICE“, UUID.fromString(MOS_UUID)); } catch (IOException e) { serverSocket = null; return; } stopServerFlag = false; while (!stopServerFlag) { try { remoteSocket = serverSocket.accept(); connectedSocket = remoteSocket; inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } catch (IOException e) { } } stopServer(); } }, “Bluetooth Server“).start(); } public void stopServer() { disconnect(); stopServerFlag = true; if (null != serverSocket) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } serverSocket = null; } } @Override public boolean isServerOK() { if (null == serverSocket) { return false; } return true; } @Override public void connect() throws IOException { BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); boolean deviceFound = false; for (BluetoothDevice device : bondedDevices) { if (device.getAddress().equals(deviceAddress)) { deviceFound = true; localSocket = device.createRfcommSocketToServiceRecord(UUID.fromString(MOS_UUID)); localSocket.connect(); connectedSocket = localSocket; if (null != connectedSocket) { inputStream = connectedSocket.getInputStream(); outputStream = connectedSocket.getOutputStream(); } break; } } if (!deviceFound) { throw new IOException(“bluetooth device not found“); } } @Override public boolean isConnected() { if (null == connectedSocket) { return false; } return connectedSocket.isConnected(); } @Override public void send(byte[] b) throws IOException { if (null != outputStream) { outputStream.write(b); } } @Override public int recv(byte[] b) throws IOException { return recv(b, 0, b.length); } @Override public int recv(byte[] b, int offset, int count) throws IOException { if (null != inputStream) { return inputStream.read(b, offset, count); } return 0; } @Override public void disconnect() { if (null != connectedSocket) { try { inputStream = null; outputStream = null; connectedSocket.close(); connectedSocket = null; } catch (IOException e) { e.printStackTrace(); } } } }
推荐访问:
- 文秘
- 范文
- 文秘知识
- 书信条据
- 行政
- 求职离职
- 名人名言
-
致国家领导人的一封信:
写信是一种最古老的信息传递方法,同时也是一种原始的写作训练。那么,致国家领导人的一封信要怎么写呢?下面小编整理了致国家领导人的一封信范文,供您参考! 致国家领...
【办公】 日期:2019-10-07
-
2020党员大会会议记录三篇
2020党员大会会议记录三篇 学校党建工作是党的基层组织建设的有机组成部分,抓好学校党建工作,发挥
【办公】 日期:2020-11-07
-
会计继续教育《政府会计准则-,基本准则》试题答案_
一、单选题1、《政府会计准则——基本准则》已经财政部部务会议审议通过,现予公布,开始施行日是()。A
【毕业设计】 日期:2019-11-16
-
入党动机应该怎么写 入党动机50字
【入党动机怎么写】 入党动机,就是为什么要入党,这是每一名共产党员在入党前和入党后都要深深思考的问题。因为,共产党员不仅要在组织上入党,更要从思想上入党。...
【毕业设计】 日期:2019-07-24
-
关于开展医保基金监管专项治理自查自纠情况报告
关于开展医保基金监管专项治理自查自纠情况报告县医疗保障局:根据《河源市医疗保障局关于印发2020年河
【秘书基础】 日期:2020-07-31
-
国开《电子政务》形考1234参考试题答案
第1次形成性考核题目1电子政务发展的内在动力是为了应用与普及信息技术。这一说法正确吗?对错反馈正确的
【毕业设计】 日期:2020-10-30
-
党支部查摆问题及整改措施 [党支部组织生活会整改落实情况的报告(四页)]
党支部组织生活会整改落实情况的报告 2019年度我支部以学习贯彻党的十九届四中全会精神为主题,紧紧
【毕业设计】 日期:2020-04-13
-
电大形考任务1答案 国开(中央电大)专科《外国文学》网上形考(任务一至三)试题及答案
国开(中央电大)专科《外国文学》网上形考(任务一至三)试题及答案备注:本资料整理于2020年5月10
【工商税务】 日期:2020-06-11
-
红阳牌盐藻是骗局吗【盐藻哪些人不能吃】
在众多的保健品中,盐藻是近年来被普遍追捧的。据说盐藻能提高免疫力,含有很多人体所需的营养物质。每一种东西,都有宜忌人群。那么盐藻哪些人不能吃?下面小编带你一一...
【办公】 日期:2019-10-24
-
【少年宫舞蹈活动优秀案例舞动童年美丽起航】销售优秀案例
活动目标:1、在活动中培养孩子的优美体态和对艺术的审美能力。2、在训练中打好扎实的基本功。并能准确地找到节拍,跳舞有自娱感。3、通过集体活动培养孩子载歌载舞的习...
【秘书基础】 日期:2019-07-17
-
部编版四年级语文下册全册八单元1-23课外类文阅读练习题及答案
目录类文阅读-1古诗词三首2类文阅读-2乡下人家5类文阅读-3天窗11类文阅读-4三月桃花水17类文
【策划书】 日期:2020-08-03
-
桥梁顶升安全管理和质量控制案例(第一课)(每日一练):桥梁安全监测
单项选择题(共2题)1、《公路工程施工标准招标文件》(2018年版)规定:专业工程分包的工程量累计不
【心得体会】 日期:2020-01-22
-
吸毒的人最怕吃什么 冰毒的危害有哪些症状
在各种神经性毒品,甚至所有毒品中,冰毒能够被称为的“毒王,”不光是因为它绵延隐蔽而又强烈的毒性,还有很重要的一点,就是它能导致的超强心瘾。下面小编和大家一起学习冰...
【心得体会】 日期:2019-09-25
-
在偏远山区支教的日子里_农村支教工作叙事写在支教日子里
暑假自从接到工作调动的那一刻,瞬间我的泪在眼眶里直打转。我非常舍不得离开工作十几年的校园环境,舍不得离开朝夕相处的同事,更舍不得离开还在学校就读的女儿和一起工作的...
【合同范文】 日期:2019-10-16
-
《中华人民共和国公职人员政务处分法》学习培训测试题(含答案)
《中华人民共和国公职人员政务处分法》学习培训测试题(撒哈拉秀才◇精心拟制2020 07 11)姓名:
【心得体会】 日期:2020-07-12
-
县局的政治生态建设落实情况自查报告|政治生态研判自查报告
政治生态建设工作落实情况自查报告按照省局、市局的要求,xx局党委对我局政治生态建设工作情况进行了认真
【汇报体会】 日期:2020-01-26
-
青年干部警示教育心得体会交流发言(全文)
一般指国家机关、军队、人民团体中的公职人员、担任一定的领导工作或管理工作的人员。即“干部是党和国家事业的骨干,是人民的公仆”,以下是为大家整理的关于青年干部警示教...
【心得体会】 日期:2022-09-18
-
施工项目部管理人员职责_项目部生产管理职责分工表
1、项目经理(1)组织编制工程质量计划,使整个工程按照ISO9001标准体系运作。(2)主持编制工程
【心得体会】 日期:2020-02-09
-
头像女生简单气质唯美 [头像女生简单气质淡淡]
总有一天,你会站在最亮的地方,活成自己曾经渴望的模样。下面是小编带来的头像女生简单气质淡淡,希望大家喜欢! 头像女生简单气质淡淡 头像女生简单气质淡淡1 头像女...
【策划书】 日期:2019-08-27
-
国家开放大学电大《马克思主义基本原理概论》网络核心课终结性试卷二及试卷三试题及答案
国家开放大学电大《马克思主义基本原理概论》网络核心课终结性试卷二及试卷三试题及答案提示:利用Ctrl
【心得体会】 日期:2020-09-05
-
我偷喝了我班主任的尿_小学班主任工作经验分享班上有管家老师偷着闲
最后一节的下课铃已经响了,我走出教室,抿了几口茶,再踱步进入教室,教室里一切都在有条不紊的进行,可能不了解的老师会觉得乱糟糟的,但是在我看来满是骄傲。最后一节语文...
【广告】 日期:2019-10-09
-
[讲忠诚、严纪律、立政德”警示教育民主生活会对照检查材料心得体会]警示教育组织生活发言
为贯彻落实市委《关于在全市党员领导干部中开展“讲忠诚、严纪律、立政德”专题警示教育的实施方案》精神,
【接收函】 日期:2020-02-05
-
党总支红头文件格式 [成立党总支决定文件]
同意成立党支部的批复如何写呢?下文是小编给大家整理的关于同意成立党总支的批复范例,欢迎大家参考! 党总支成立决定批复文件一 泰州市祥安建筑机械检测有限公司: ...
【接收函】 日期:2019-10-03
-
(精华版)国家开放大学电大《文论专题》网络课形考网考作业及答案_文论专题形考答案
(精华版)国家开放大学电大《文论专题》网络课形考网考作业及答案100%通过考试说明:2020年秋期电
【借条】 日期:2020-06-08
-
个人思想境界方面问题_个人能力境界方面存在的问题及整改措施
过这次党的群众路线教育实践活动,我深刻认识到作为一名党员肩负的使命和责任,自觉把参加教育实践活动的过
【广告】 日期:2019-08-21
-
[关于进一步精简文件数量提高政府工作效率的通知]数量效率
各镇人民政府,生态工业园区管委会,县政府各部门,县直及省市驻民各单位:为深入贯彻落实党的十九大关于作
【邀请函】 日期:2020-02-06
-
[标准化党支部建设] 甘肃省党支部建设标准化手册
标准化党支部建设党支部是党的组织中最基层的组织形式,是党的全部工作和战斗力的基础。为深入贯彻党的十八
【新闻】 日期:2020-02-09
-
巡察问题整改措施怎么写 巡视巡察整改工作存在问题整改措施
篇一省委巡视组在对我县工作进行了为期一个月的全面巡视后,在肯定我县经济社会发展工作的同时,中肯地指出
【新闻】 日期:2019-09-06
-
十八项医疗核心制度--信息安全管理制度:医疗安全核心制度
十八、信息安全管理制度(一)定义指医疗机构按照信息安全管理相关法律法规和技术标准要求,对医疗机构患者
【借条】 日期:2020-08-11
-
学校中层干部考核细则_洲沙中学中层干部考核方案
洲沙中学中层干部考核方案 为继续深化学校内部管理体制改革,加强我校中层干部队伍建设,全面、客观、公正、准确地评价学校中层干部的政治业务素质及履行职责情况,对中层...
【调档函】 日期:2019-07-19
-
八项规定心得体会(800字):八项规定心得体会500字
下面是教师范文吧整理的两篇八项规定心得体会800字,欢迎阅读。八项规定心得体会800字(一) 按照局要求精神,认真学习了关于改进工作作风、密切联系群众的八项规定的内容,...
【慰问】 日期:2019-09-30
-
杨小华的幸福家庭生活 幸福家庭的绘画作品有哪些
家庭是社会的细胞,家庭的和睦影响着整个社会的安定。小编整理了幸福家庭绘画作品,欢迎阅读! 幸福家庭绘画作品图片展示 我的幸福家庭绘画图片 我的幸福家庭绘画作品...
【慰问】 日期:2019-07-30
-
关于XX同志母亲XX同志的证明材料
关于XX同志母亲XX同志的证明材料XX党委:李XX,女,X族,XX文化,XX省XX市XX县XX乡(镇
【道歉】 日期:2020-08-11
-
[关于加强对党员干部日常管理监督的研究论文] 党员干部监督管理制度
党的十八大以来,中央不断加大党要管党、从严治党工作力度,积极推动从严管理监督干部新常态,重点解决党员
【介绍】 日期:2020-02-18
-
【廉洁谈话记录(3篇)】一对一廉洁谈话记录
今天和你在这里,是想进行一次任前廉政谈话,这既是学习勉励的过程,也是警示教育的过程。廉洁自律对于任何
【自荐】 日期:2020-02-06
-
工作标准不高整改措施_工作要求不高不严整改措施
篇一职务:党支部书记姓名:杜学锋(20XX年9月)一、导语:为使自己在前期查摆出的问题能够得到真正的
【自荐】 日期:2019-12-16
-
关于进一步严格执行会议请假制度严肃会风会纪的通知 严肃会风会纪的规定
各镇党委、人民政府,生态工业园区党工委、管委会,县委各部门,县级国家机关及各部门单位,各人民团体,省
【感谢】 日期:2020-02-06
-
财税2019年36号文件全文及解析:
第一章纳税人和扣缴义务人第一条在中华人民共和国境内(以下称境内)销售服务、无形资产或者不动产(以下称
【道歉】 日期:2019-11-19
-
总经理办公会议制度_总经理办公会议参加人数要求
**********集团有限公司总经理办公会议制度(试行)第一章总则第一条为明确总经理办公会议事程序
【求职】 日期:2020-02-29
-
基层干部存在的不足 年轻基层干部如何扎根基层
年轻基层干部如何扎根基层十九大报告指出:大力发现储备年轻干部,注重在基层一线和困难艰苦的地方培养锻炼
【感谢】 日期:2020-02-06
-
【国开(中央电大)本科《政府经济学》网上形考(任务三)试题及答案】经济学性考任务3
国开(中央电大)本科《政府经济学》网上形考(任务三)试题及答案说明:1 课程代码:02047;2 适
【企划文案】 日期:2020-06-09
-
成立妇女联合会请示格式:成立妇女联合会的请示
为了维护妇女的合法权利,在许多地方都设有妇女联合会。该如何写一篇成立妇女联合会的请示呢?下面小编给大家带来成立妇联的决定范文,仅供参考! 成立妇女联合会请示格式一...
【调研报告】 日期:2019-09-25
-
雨季八防内容 胜利油田雨季八防内容
雨季八防雨季“八防”(防触电、防中暑、防工伤事故、防淹溺、防洪汛、防倒塌、防车祸、防中毒):防
【规章制度】 日期:2019-08-21
-
老公打屁股份作文大全【打屁股的作文大全精选模板】
你有过被打屁股的经历吗?关于打屁股的作文你知道该如何写吗?下面小编给大家分享一些打屁股的作文,大家快来跟小编一起看看吧。 打屁股的作文篇1:第一次撒谎 你们撒过...
【调研报告】 日期:2019-09-29
-
[《乡村振兴战略规划(2018-2022年)》试题(127题)及答案(附原文)]
一、单选题(共25题)1、《中共中央国务院关于实施乡村振兴战略的意见》的施行日期是:。(A)A、20
【调研报告】 日期:2019-11-27
-
乡村振兴案例分析 乡村振兴典型案例五篇
篇一党的十九大明确提出实施乡村振兴战略并写入党章,意义重大而深远。围绕聚焦产业兴旺、生态宜居、乡风文
【礼仪文书】 日期:2020-01-22
-
工会知识及相关法律法规 工会相关法律法规和条例
工会知识及相关法律法规1、《中华人民共和国工会法》共几章几条?答:共七章、五十七条。第一章总则;第二
【法律文书】 日期:2020-04-06
-
深入基层不够整改措施:
篇一党的群众路线教育实践活动开展以来,我按照中省和委党组的要求,认真参加委教育实践办和支部组织的各类
【规章制度】 日期:2019-11-04
-
二次元动漫手机壁纸_二次元女生高清动漫壁纸
二次元中的女生壁纸有很多都很好看,被很多人用来做壁纸做头像,下面是小编整理的二次元女生高清动漫壁纸,欢迎欣赏。 二次元女生高清动漫壁纸欣赏 二次元女生高清动漫...
【礼仪文书】 日期:2019-09-30
-
2020年秋冬季森林防火工作安排部署会讲话_冬季森林防火
2020年秋冬季森林防火工作安排部署会讲话为进一步贯彻好省会议精神,市政府接着开套会,总结今年以来森
【规章制度】 日期:2020-03-24
-
真人真事的恐怖故事:真实鬼故事亲身经历
鬼故事大量出现于志怪小说始于魏晋南北朝时期。鬼故事作为民间文学的一种,具有广泛的社会触及面和丰富的时代内容,应该予以足够的重视。下面是小编为您整理的真人真事的恐怖故...
【离职报告】 日期:2019-08-28
-
离婚后,写给婆婆一封信【致公公婆婆的一封信】
书信就好比桥梁,能沟通了公婆与儿媳之间两个全然不同的世界。下面小编整理了致公公婆婆的一封信范文,供您参考! 致公公婆婆的一封信范文一 敬爱的公爹公婆: 你们好...
【转正工作】 日期:2019-10-13
-
疫情防控工作先进集体事迹材料5篇|疫情防控先进个人事迹材料
防控疫情先进单位事迹(1)——xx市xx单位共产党员战斗在疫情防控第一线的事迹新型冠状病毒感染的肺炎
【离职报告】 日期:2020-02-21
-
履职尽责问题整改措施_担当作为方面方面存在的问题及整改措施
篇一一、基本情况针对在具体工作中,部分干部职工缺乏责任心、事业心,对待工作不敢担当,不愿负责,见困难
【实习报告】 日期:2019-10-18
-
7人党支部委员分工 党支部委员职责分工
党支部委员职责分工(一)党支部书记的职责党支部书记在党支部委员会的集体领导下,按照支部党员大会、支部
【转正工作】 日期:2020-07-02
-
1389国开电大本科《管理英语4》历年期末考试(第三大题阅读判断题)题库(分学期版)
1389国开电大本科《管理英语4》历年期末考试(第三大题阅读判断题)题库(分学期版)2021年7月试
【转正工作】 日期:2022-01-23
-
【工作重部署轻落实整改措施】
篇一1.学习仅限于看看文件、翻翻报纸,开会听讲,不能有的放矢的学习和深入思考。整改目标:加强学习,通
【实习报告】 日期:2019-12-17
-
【2篇2020年党委书记在全国两会精神专题学习会上的研讨发言心得交流(党课讲稿)】
党委书记在全国两会精神专题学习会上的讲话1同志们:2020年全国两会,是在决战脱贫攻坚、决胜全面小康
【述职报告】 日期:2020-05-29
-
最新国家开放大学电大《理工英语3》形考任务一试题及答案
最新国家开放大学电大《理工英语3》形考任务一试题及答案一、完形填空:阅读下面的短文,选择合适的内容将
【述职报告】 日期:2020-08-08
-
沈王一现在在哪儿 [沈浩]
下午,和女儿一起去省图看书。一入大厅,就被沈浩的巨幅照片所吸引。把女儿送进少儿阅览室,我走回大厅,走进一幅幅书写着沈浩日记的书法作品。虽然我们学校是书法实验学校,...
【实习报告】 日期:2019-10-07
-
2023年经典好句80例
经典好句80例1 要有“会当凌绝顶、一览众山小”的壮志豪情。2 以信心凝聚力量、以实干谱写华章,3 不忘初心、牢记使命,勇挑时代赋予的重任,不负人民寄予的厚望,以永不懈...
【经典名言】 日期:2023-10-17
-
乡创建卫生乡镇爱国卫生组织管理工作情况报告(完整)
X乡党委、政府十分重视爱国卫生工作,自从2022年提出创建国家卫生乡镇以来,把它列入乡党委、政府重要的议事日程,将创建国家卫生乡镇工作作为一项民心工程来抓。同时加强爱国...
【爱国】 日期:2023-10-12
-
基于我国国际传播力建设的旅游英语多样化翻译策略研究
成家慧(四川商务职业学院旅游管理系,成都611131)2021年,习近平总书记在中共中央政治局第三十
【英语名言】 日期:2023-08-13
-
新时代背景下的高职英语教育改革研究
刘斌(贵州食品工程职业学院文化课基础部,贵州贵阳551400)近几年发展中,随着国内产业升级和经济结
【英语名言】 日期:2023-08-11
-
英语弱否定句子结构探析
李雨名(吉林工业职业技术学院通识教育中心,吉林吉林132013)在英语中,否定的强化通常被讨论得很多
【英语名言】 日期:2023-08-07
-
在英语学科中实现红色文化育人
文 深圳市大鹏新区葵涌中心小学赵乐李颖王乙男英语教学是学生初步了解西方文明,学习西方文化的途径。如若
【英语名言】 日期:2023-08-07
-
目的论下科技英语长句翻译策略研究
张瑾强艳颜(华北理工大学,河北唐山063210)翻译目的论(Skopostheory)作为功能主义学
【英语名言】 日期:2023-08-04
-
基于POA的高校英语视听说混合式教学模式创新探究
余析悯从文秋芳(2008)提出的“输出驱动假设”,到她(2014)修订的“输出驱动—输入促成假设”被
【英语名言】 日期:2023-08-03
-
地方高校“综合英语”课程对接产业链的素能协同创新与实践
邹其彦,林芸(重庆对外经贸学院,重庆401520)走产教融合的道路以培养高素质应用型人才是地方高校提
【英语名言】 日期:2023-07-31
-
商务环境下英语教学中英汉词汇不对等及其教学策略
李雪峰(安徽财经大学文学院,安徽蚌埠233000)商务英语作为在商务背景下使用的英语,可以说是传统英
【英语名言】 日期:2023-07-31