android自动登录简书,android 手机号实现登录功能

先看看效果

5fe626fda01b

image.png

我的这个登录功能是手机号和密码都已经在后台数据库有存储的,所以是直接登录。

重点有三个:

1、账号密码的存储,实现自动登录;

2、网络通信;

3、密码一定要Md5加密之后再传输

先把布局放上来

xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/bg_login"

android:orientation="vertical"

>

android:layout_width="match_parent"

android:layout_height="@dimen/item_height_normal"

android:layout_marginLeft="@dimen/margin_large"

android:layout_marginRight="@dimen/margin_large"

android:layout_marginTop="@dimen/dp_300">

android:id="@+id/img_account"

android:layout_width="@dimen/dp_19"

android:layout_height="@dimen/dp_20"

android:layout_alignParentBottom="true"

android:layout_marginBottom="@dimen/margin_tiny"

android:layout_marginLeft="@dimen/margin_tiny"

android:scaleType="fitXY"

android:src="@drawable/ic_login_account"/>

android:id="@+id/et_account"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_gravity="center"

android:layout_marginBottom="@dimen/margin_tiny"

android:layout_marginLeft="@dimen/margin_normal"

android:layout_toRightOf="@+id/img_account"

android:background="@null"

android:hint="@string/account"

android:maxLines="1"

android:textColor="@android:color/black"

android:textColorHint="@color/tv_gray_deep"

android:textSize="@dimen/text_size_normal"/>

android:layout_width="match_parent"

android:layout_height="@dimen/line_height"

android:layout_alignParentBottom="true"

android:layout_marginLeft="@dimen/margin_normal"

android:layout_toRightOf="@+id/img_account"

android:background="@color/line_new"/>

android:layout_width="match_parent"

android:layout_height="@dimen/item_height_normal"

android:layout_marginLeft="@dimen/margin_large"

android:layout_marginRight="@dimen/margin_large">

android:id="@+id/img_pw"

android:layout_width="@dimen/dp_18"

android:layout_height="@dimen/dp_20"

android:layout_alignParentBottom="true"

android:layout_marginBottom="@dimen/margin_tiny"

android:layout_marginLeft="@dimen/margin_tiny"

android:scaleType="fitXY"

android:src="@drawable/ic_login_pw"/>

android:id="@+id/et_password"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_gravity="center"

android:layout_marginBottom="@dimen/margin_tiny"

android:layout_marginLeft="@dimen/margin_normal"

android:layout_toRightOf="@+id/img_pw"

android:background="@null"

android:hint="@string/password"

android:inputType="textPassword"

android:maxLines="1"

android:textColor="@android:color/black"

android:textColorHint="@color/tv_gray_deep"

android:textSize="@dimen/text_size_normal"/>

android:id="@+id/iv_see_password"

android:layout_width="@dimen/image_width_litter"

android:layout_height="@dimen/image_height_litter"

android:src="@drawable/image_password_bg"

android:layout_centerVertical="true"

android:layout_alignParentRight="true"

android:scaleType="fitXY"

/>

android:layout_width="match_parent"

android:layout_height="@dimen/line_height"

android:layout_alignParentBottom="true"

android:layout_marginLeft="@dimen/margin_normal"

android:layout_toRightOf="@+id/img_pw"

android:background="@color/line_new"/>

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="@dimen/margin_large"

android:layout_marginRight="@dimen/margin_large"

android:layout_marginTop="@dimen/margin_small"

android:paddingBottom="@dimen/margin_small"

android:paddingTop="@dimen/margin_small"

android:orientation="horizontal"

android:gravity="center"

>

android:id="@+id/checkBox_login"

android:padding="@dimen/dp_10"

android:textSize="@dimen/text_size_normal"

android:layout_gravity="center"

android:layout_width="wrap_content"

android:layout_weight="1"

android:layout_height="wrap_content"

android:text="@string/check_login"

android:textColor="@color/top_bar_normal_bg" android:checked="false"/>

android:id="@+id/checkBox_password"

android:padding="@dimen/dp_10"

android:textSize="@dimen/text_size_normal"

android:layout_gravity="right"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/check_password"

android:textColor="@color/top_bar_normal_bg" android:checked="false"/>

android:id="@+id/btn_login"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginLeft="@dimen/margin_large"

android:layout_marginRight="@dimen/margin_large"

android:layout_marginTop="@dimen/margin_huge"

android:paddingBottom="@dimen/margin_small"

android:paddingTop="@dimen/margin_small"

android:text="@string/login"

android:background="@drawable/btn_orange_selector"

android:textColor="@android:color/white"

android:textSize="@dimen/text_size_normal"/>

进入正题,同理,先上源码,再解释关键的一些地方

public class LoginByPhone extends AppCompatActivity implements View.OnClickListener,CompoundButton.OnCheckedChangeListener{

private EditText etPhone;

private EditText etPassword;

private Button btn_login;

private CheckBox checkBox_password;

private CheckBox checkBox_login;

private ImageView iv_see_password;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login_first);

initView();

initEvent();

initData();

}

private void initEvent() {

btn_login.setOnClickListener(this);

checkBox_password.setOnCheckedChangeListener(this);

checkBox_login.setOnCheckedChangeListener(this);

iv_see_password.setOnClickListener(this);

}

private void initView() {

etPassword = (EditText) findViewById(R.id.et_password);

etPhone = (EditText) findViewById(R.id.et_account);

checkBox_password = (CheckBox) findViewById(R.id.checkBox_password);

checkBox_login = (CheckBox) findViewById(R.id.checkBox_login);

iv_see_password = (ImageView) findViewById(R.id.iv_see_password);

btn_login = findViewById(R.id.btn_login);

}

/**

* 登录

*/

private void login(){

Log.i("etPhone",etPhone.getText().toString());

if(TextUtils.isEmpty(etPhone.getText().toString() )){

Toast.makeText(LoginByPhone.this,R.string.phone_num_can_not_be_empty,Toast.LENGTH_LONG).show();

return;

}

if(TextUtils.isEmpty(etPassword.getText())){

Toast.makeText(LoginByPhone.this,R.string.password_can_not_be_empty,Toast.LENGTH_LONG).show();

return;

}

final ProgressDialog pd = ProgressDialog.show(LoginByPhone.this,getResources().getString(R.string.connecting),getResources().getString(R.string.connecting_to_server));

Thread loginRunnable = new Thread(){

@Override

public void run() {

super.run();

setLoginBtnClickable(false);

new baichuang.callmonitor.Net.Login(etPhone.getText().toString(), Md5.md5(etPassword.getText().toString()),new baichuang.callmonitor.Net.Login.SuccessCallback(){

@Override

public void onSuccess(String token){

Config.cachedToken(LoginByPhone.this,token);

Config.cachedPhoneNum(LoginByPhone.this,etPhone.getText().toString());

pd.dismiss();

loadCheckBoxState();//记录下当前用户记住密码和自动登录的状态;

Intent i = new Intent(LoginByPhone.this,Call_Monitor.class);

i.putExtra(Config.KEY_TOKEN,token);

i.putExtra(Config.KEY_PHONE_NUM, etPhone.getText().toString());

startActivity(i);

finish();

}

}, new Login.FailCallback(){

@Override

public void onFail(){

setLoginBtnClickable(true); //这里解放登录按钮,设置为可以点击

pd.dismiss();

Toast.makeText(LoginByPhone.this,R.string.fail_to_login,Toast.LENGTH_LONG).show();

}

});

}

};

loginRunnable.start();

}

/**

* 保存用户选择“记住密码”和“自动登陆”的状态

*/

private void loadCheckBoxState() {

loadCheckBoxState(checkBox_password, checkBox_login);

}

/**

* 保存按钮的状态值

*/

public void loadCheckBoxState(CheckBox checkBox_password, CheckBox checkBox_login) {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

//如果设置自动登录

if (checkBox_login.isChecked()) {

//创建记住密码和自动登录是都选择,保存密码数据

helper.putValues(

new SharedPreferencesUtils.ContentValue("remenberPassword", true),

new SharedPreferencesUtils.ContentValue("autoLogin", true),

new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));

} else if (!checkBox_password.isChecked()) { //如果没有保存密码,那么自动登录也是不选的

//创建记住密码和自动登录是默认不选,密码为空

helper.putValues(

new SharedPreferencesUtils.ContentValue("remenberPassword", false),

new SharedPreferencesUtils.ContentValue("autoLogin", false),

new SharedPreferencesUtils.ContentValue("password", ""));

} else if (checkBox_password.isChecked()) { //如果保存密码,没有自动登录

//创建记住密码为选中和自动登录是默认不选,保存密码数据

helper.putValues(

new SharedPreferencesUtils.ContentValue("remenberPassword", true),

new SharedPreferencesUtils.ContentValue("autoLogin", false),

new SharedPreferencesUtils.ContentValue("password", Base64Utils.encryptBASE64(getPassword())));

}

}

/**

* 是否可以点击登录按钮

*

* @param clickable

*/

public void setLoginBtnClickable(boolean clickable) {

btn_login.setClickable(clickable);

}

/**

* 获取密码

*/

public String getPassword() {

return etPassword.getText().toString().trim();//去掉空格

}

private void initData() {

//判断用户第一次登陆

if (firstLogin()) {

checkBox_password.setChecked(false);//取消记住密码的复选框

checkBox_login.setChecked(false);//取消自动登录的复选框

}

//判断是否记住密码

if (remenberPassword()) {

checkBox_password.setChecked(true);//勾选记住密码

setTextNameAndPassword();//把密码和账号输入到输入框中

} else {

setTextName();//把用户账号放到输入账号的输入框中

}

//判断是否自动登录

if (autoLogin()) {

checkBox_login.setChecked(true);

login();//去登录就可以

}

}

/**

* 设置数据到输入框中

*/

public void setTextName() {

etPhone.setText("" + getLocalName());

}

/**

* 把本地保存的数据设置数据到输入框中

*/

public void setTextNameAndPassword() {

etPhone.setText("" + getLocalName());

etPassword.setText("" + getLocalPassword());

}

/**

* 获得保存在本地的用户名

*/

public String getLocalName() {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

String name = helper.getString("name");

return name;

}

/**

* 获得保存在本地的密码

*/

public String getLocalPassword() {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

String password = helper.getString("password");

return Base64Utils.decryptBASE64(password); //解码一下

}

/**

* 判断是否是第一次登陆

*/

private boolean firstLogin() {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

boolean first = helper.getBoolean("first", true);

if (first) {

//创建一个ContentVa对象(自定义的)设置不是第一次登录,,并创建记住密码和自动登录是默认不选,创建账号和密码为空

helper.putValues(new SharedPreferencesUtils.ContentValue("first", false),

new SharedPreferencesUtils.ContentValue("remenberPassword", false),

new SharedPreferencesUtils.ContentValue("autoLogin", false),

new SharedPreferencesUtils.ContentValue("name", ""),

new SharedPreferencesUtils.ContentValue("password", ""));

return true;

}

return false;

}

/**

* 判断是否自动登录

*/

private boolean autoLogin() {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

boolean autoLogin = helper.getBoolean("autoLogin", false);

return autoLogin;

}

/**

* 判断是否记住密码

*/

private boolean remenberPassword() {

//获取SharedPreferences对象,使用自定义类的方法来获取对象

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

boolean remenberPassword = helper.getBoolean("remenberPassword", false);

return remenberPassword;

}

@Override

public void onClick(View view) {

switch (view.getId()) {

case R.id.btn_login:

loadUserName(); //无论如何保存一下用户名

login(); //登陆

break;

case R.id.iv_see_password:

setPasswordVisibility(); //改变图片并设置输入框的文本可见或不可见

break;

}

}

/**

* 保存用户账号

*/

public void loadUserName() {

if (!getAccount().equals("") || !getAccount().equals("请输入登录账号")) {

SharedPreferencesUtils helper = new SharedPreferencesUtils(this, "setting");

helper.putValues(new SharedPreferencesUtils.ContentValue("name", getAccount()));

}

}

/**

* 设置密码可见和不可见的相互转换

*/

private void setPasswordVisibility() {

if (iv_see_password.isSelected()) {

iv_see_password.setSelected(false);

//密码不可见

etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

} else {

iv_see_password.setSelected(true);

//密码可见

etPassword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

}

}

/**

* 获取账号

*/

public String getAccount() {

return etPhone.getText().toString().trim();//去掉空格

}

@Override

public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

if (compoundButton == checkBox_password) { //记住密码选框发生改变时

if (!isChecked) { //如果取消“记住密码”,那么同样取消自动登陆

checkBox_login.setChecked(false);

}

} else if (compoundButton == checkBox_login) { //自动登陆选框发生改变时

if (isChecked) { //如果选择“自动登录”,那么同样选中“记住密码”

checkBox_password.setChecked(true);

}

}

}

}

基本的initView(),initData()就不啰嗦了。

先看login()这个函数

/**

* 登录

*/

private void login(){

Log.i("etPhone",etPhone.getText().toString());

if(TextUtils.isEmpty(etPhone.getText().toString() )){

Toast.makeText(LoginByPhone.this,R.string.phone_num_can_not_be_empty,Toast.LENGTH_LONG).show();

return;

}

if(TextUtils.isEmpty(etPassword.getText())){

Toast.makeText(LoginByPhone.this,R.string.password_can_not_be_empty,Toast.LENGTH_LONG).show();

return;

}

final ProgressDialog pd = ProgressDialog.show(LoginByPhone.this,getResources().getString(R.string.connecting),getResources().getString(R.string.connecting_to_server));

Thread loginRunnable = new Thread(){

@Override

public void run() {

super.run();

setLoginBtnClickable(false);

new baichuang.callmonitor.Net.Login(etPhone.getText().toString(), Md5.md5(etPassword.getText().toString()),new baichuang.callmonitor.Net.Login.SuccessCallback(){

@Override

public void onSuccess(String token){

Config.cachedToken(LoginByPhone.this,token);

Config.cachedPhoneNum(LoginByPhone.this,etPhone.getText().toString());

pd.dismiss();

loadCheckBoxState();//记录下当前用户记住密码和自动登录的状态;

Intent i = new Intent(LoginByPhone.this,Call_Monitor.class);

i.putExtra(Config.KEY_TOKEN,token);

i.putExtra(Config.KEY_PHONE_NUM, etPhone.getText().toString());

startActivity(i);

finish();

}

}, new Login.FailCallback(){

@Override

public void onFail(){

setLoginBtnClickable(true); //这里解放登录按钮,设置为可以点击

pd.dismiss();

Toast.makeText(LoginByPhone.this,R.string.fail_to_login,Toast.LENGTH_LONG).show();

}

});

}

};

loginRunnable.start();

}

ProgressDialog可设可不设,但是考虑到有些人的网络情况不好,所以给用户点友好体验还是蛮重要的。所以还是加上吧。

new一个Thread(),在其中实现网络请求将用户名和密码传输给后台并获取结果。

这个网络封装类用的是HttpUrlConnection,自己写一个NetConnection封装好基本网络请求,这样之后关于字符串和json的网络请求就不用每次都这样重新写了。

public class NetConnection {

private static String TAG="netConnection: ";

public NetConnection(final String url,final HttpMethod method,final SuccessCallback successCallback,final FailCallback failCallback,final String...kvs ){

new AsyncTask(){

@Override

protected String doInBackground(Void... voids) {

StringBuffer paramsStr = new StringBuffer();

for (int i = 0; i

paramsStr.append(kvs[i]).append("=").append(kvs[i+1]).append("&");

}

try{

HttpURLConnection uc;

switch (method){

case POST:

uc = (HttpURLConnection)new URL(url).openConnection();

System.out.println(uc);

// 显示开启请求体

uc.setDoInput(true);

uc.setDoOutput(true);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(uc.getOutputStream(), Config.CHARSET));

bw.write(paramsStr.toString());

bw.flush();

bw.close();

break;

default:

uc = (HttpURLConnection) new URL(url+"?"+ paramsStr.toString()).openConnection();

break;

}

BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream(),Config.CHARSET));

if(uc.getResponseCode() == 200){

String line = null;

StringBuffer result = new StringBuffer();

while((line=br.readLine())!=null){

result.append(line);

}

return result.toString();

} else if( uc.getResponseCode() == 404){

Log.i(TAG,"404访问服务器失败");

} else if( uc.getResponseCode() == 500 ){

Log.i(TAG,"500服务器拒绝访问");

}

} catch (MalformedURLException e){

e.printStackTrace();

} catch (IOException e){

e.printStackTrace();

}

return null;

}

@Override

protected void onPostExecute(String result) {

if (result!= null) {

successCallback.onSuccess(result);

} else {

if(failCallback!=null){

failCallback.onFail();

}

}

super.onPostExecute(result);

}

}.execute();

}

public static interface SuccessCallback{

void onSuccess(String result);

}

public static interface FailCallback{

void onFail();

}

}

两个接口记得写哦。

Login网络请求类如下

public class Login {

public Login(String phone, String password, final SuccessCallback successCallback, final FailCallback failCallback){

new NetConnection(Config.SVERVICE_URL, HttpMethod.POST, new NetConnection.SuccessCallback() {

@Override

public void onSuccess(String result) {

try {

JSONObject obj = new JSONObject(result);

switch (obj.getInt(Config.KEY_STATUS)){

case Config.RESULT_STATUS_SUCCESS:

System.out.println(successCallback);

if(successCallback!=null){

successCallback.onSuccess(obj.getString(Config.KEY_TOKEN));

}

break;

default:

if(failCallback!=null){

failCallback.onFail();

}

break;

}

} catch (JSONException e) {

e.printStackTrace();

if(failCallback!=null){

failCallback.onFail();

}

}

}

}, new NetConnection.FailCallback() {

@Override

public void onFail() {

if(failCallback!=null){

failCallback.onFail();

}

}

},Config.PHONE_NUM,phone,Config.PASS_WORD,password);

}

public static interface SuccessCallback{

void onSuccess(String token);

}

public static interface FailCallback{

void onFail();

}

}

这样其实登录基本功能就好了。其他的都是关于记住密码啊之类的了。

本地保存密码用到的是SharedPreferences, 我自己封装的如下:

public class SharedPreferencesUtils {

//定义一个SharePreference对象

SharedPreferences sharedPreferences;

//定义一个上下文对象

//创建SharePreference对象时要上下文和存储的模式

//通过构造方法传入一个上下文

public SharedPreferencesUtils(Context context, String fileName) {

//实例化SharePreference对象,使用的是get方法,而不是new创建

//第一个参数是文件的名字

//第二个参数是存储的模式,一般都是使用私有方式:Context.MODE_PRIVATE

sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);

}

/**

* 存储数据

* 这里要对存储的数据进行判断在存储

* 只能存储简单的几种数据

* 这里使用的是自定义的ContentValue类,来进行对多个数据的处理

*/

//创建一个内部类使用,里面有key和value这两个值

public static class ContentValue {

String key;

Object value;

//通过构造方法来传入key和value

public ContentValue(String key, Object value) {

this.key = key;

this.value = value;

}

}

//一次可以传入多个ContentValue对象的值

public void putValues(ContentValue... contentValues) {

//获取SharePreference对象的编辑对象,才能进行数据的存储

SharedPreferences.Editor editor = sharedPreferences.edit();

//数据分类和存储

for (ContentValue contentValue : contentValues) {

//如果是字符型类型

if (contentValue.value instanceof String) {

editor.putString(contentValue.key, contentValue.value.toString()).commit();

}

//如果是int类型

if (contentValue.value instanceof Integer) {

editor.putInt(contentValue.key, Integer.parseInt(contentValue.value.toString())).commit();

}

//如果是Long类型

if (contentValue.value instanceof Long) {

editor.putLong(contentValue.key, Long.parseLong(contentValue.value.toString())).commit();

}

//如果是布尔类型

if (contentValue.value instanceof Boolean) {

editor.putBoolean(contentValue.key, Boolean.parseBoolean(contentValue.value.toString())).commit();

}

}

}

//获取数据的方法

public String getString(String key) {

return sharedPreferences.getString(key, null);

}

public boolean getBoolean(String key, Boolean b) {

return sharedPreferences.getBoolean(key, b);

}

public int getInt(String key) {

return sharedPreferences.getInt(key, -1);

}

public long getLong(String key) {

return sharedPreferences.getLong(key, -1);

}

//清除当前文件的所有的数据

public void clear() {

sharedPreferences.edit().clear().commit();

}

}

其他好像没啥可讲的了,都在代码中。大家有想要了解的,可以私我。

服务器端:

controllers/android/login.js

5fe626fda01b

image.png

models/android/login.js

5fe626fda01b

image.png

顺便讲一下服务器端的路由逻辑,

main.js中声明路由路径是根目录到controllers

5fe626fda01b

image.png

在controllers/android.js中再配置一次controllers里面路由的路径

5fe626fda01b

image.png

没什么难的。大家不懂私我吧~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在uni-app中使用手机号一键登录

1、首先需要在dcloud开发者控制台开通一键登录 https://dev.dcloud.net.cn/uniLogin 开通一键登录服务, 获取关键最关键的两个参数 ApiKey 和 ApiSecret 真机调试无需添加应用,如需打包使用请添加。一键登录应用ID为离线打包时配置的appid 2、登录云服务空间&#x…

用计算机搞音乐,一种使用计算机自动创作歌曲的方法与流程

本发明属于歌曲创作方法技术领域,具体的说是涉及一种使用计算机自动创作歌曲的方法。 背景技术: 自动创作歌曲在流程上分为三种技术,即计算机作曲、计算机编曲和计算机演唱。计算机作曲(automated composition)或称算法作曲(algorithmic comp…

将哼唱转换为旋律音符

# coding: utf-8# In[1]:import matplotlib.pyplot as plt import librosa import librosa.display import librosa.util import numpy as np import pysynth# In[2]:#要转换的输入wav音频文件 input_wavr"d:\test0.wav" #要输出的音频文件 output_wavr"d:\libr…

忘却的旋律java2_mc忘却的旋律启动器下载

mclauncher+(我的世界旋律启动器)是忘却的旋律神隐制作的mc游戏启动器,又叫做mc忘却的旋律启动器,我的世界玩家必备的游戏启动辅助,功能非常期待,目前支持mc1.8、1.7等各个版本,欢迎下载使用。 minecraft+特色功能 1.自动获取推荐服务器在主界面显示 2.自动选择最优设置 您…

计算机在音乐教学的应用论文开题报告,音乐教育论文开题报告(范文详解)

开题报告随着现代科学研究活动计划性的增强和科研选题程序化管理的需要而产生的。论文写作是更是少不了开题报告,而开题报告作为科研课题的说明材料,其写作也是有一定的方法的,下面我们就给大家例出一篇音乐教育论文开题报告的范文&#xff0…

学生用计算机app,大学生计算器app

大学生数学计算器是一款专为大学生设计的多功能计算器,汇集了普通和科学计算器功能,并且支持悬浮使用,随时选择开启不同的使用模式,适合学生多场景使用,可以根据不同数学公式进行不同计算功能选择,计算结果…

如何开发亲戚计算器

这是M小白实验室第一篇娱乐性科普文章 笔者博客:mwhitelab.com 笔者公众号:技术杂学铺 又到了过年的时候,每到这个时候,你总是能见到自己几乎没印象但父母就是很熟的亲戚。 而且关系凌乱到你自己都说不清。 不信?那…

分享一款学生、工程师多功能计算器

下 载 ​【软件名称】:全能计算器 【软件语言】:简体中文 【软件大小】:10.1M 【安装环境】:Android 【下载方式 】: 百度网盘链接 链接:https://pan.baidu.com/s/1xJvFQ7Qp_AYIDs0DvNsfpg 提取码&a…

仅200行代码实现科学计算器,Antlr真是太强大了

由于最近参加的Talent Plan,需要自己实现一个基于Raft的KV引擎,所以之前说的分布式事务的内容,还要再鸽一段时间,所以为了补偿大家,我们来学学antlr吧,这次我们不在外部维护变量表,而是通过设置…

学生专用计算机多少人,怎么使用学生专用计算器?

计算机是大家生活常用的辅助设备,但普通计算器只能够计算加减乘除等基础需要,学生专用计算器是可以满足高难度的计算需求,其中的一些功能可能大家不太清楚,下面就来讲解一下它的是使用方法。 基本按键 学生专用计算器采用的是双行…

小狗为什么敢对大狗挑衅?原来有这几个“原因”

相信很多人都见过小型犬对着大型犬吠叫得很凶,“挑衅”大狗的行为。明明双方都不是一个量级的,难道小狗就没有自知之明,真的敢和大狗开战吗? 其实小狗对大狗凶,是有几个原因的!如果没有这些因素了&#xf…

威洛特:狗狗乱咬东西都是有原因的

有的时候,主人回到家中,发现狗狗把沙发、拖鞋都啃了个遍,看到这种场景是不是都想原地爆炸呢?不过狗狗出现这种行为都是有原因的,有些时候主人自身也有责任的。狗狗为什么会喜欢咬东西呢?威洛特这就带你来了…

威洛特:导致狗狗食欲不振的原因有哪些

狗狗食欲不佳可以先观察它的精神状态怎么样,有没有呕吐腹泻的症状,如果除了食欲不好之外没有其他症状表现可以给狗狗喂食益生菌调理一下肠胃。如果有出现呕吐腹泻的现象的话则需要进行对症治疗。接下来可以跟着威洛特一起来了解狗食欲不好的常见原因&…

狗狗出现这五种“现象”,多半是讨厌主人了,而你还不自知?

现在养狗的人很多,有时候在饲养的过程中,主人做了一些让狗狗不喜欢的事情,但是主人还不自知。当狗狗出现这五种“现象”时,多半是讨厌主人了。 第一种:不对你摇尾巴 摇尾巴是狗狗最常见的一种示好方式,尤其…

每日一犬 · 哈瓦那犬

哈瓦那犬 是一种坚强的短腿小型犬 具有柔软而厚密的未经修剪的毛发 它的多毛尾巴弯曲翘向后背 是一种富有感情令人喜欢的犬 哈瓦那犬 身 高:21cm-26cm 体 重:3kg-6kg 寿 命: 10年-14年 习 性:温和、惹人喜爱 喜 食:适当的饲…

小狗7岁了

变量就是在程序的运行过程中数值可变的数据,用来记录运算中间结果或保存数据。程序会为变量在内存中开辟一个存储区域,该区域有自己的名称(变量名),类型(数据类型),该区域的数据可以…

争当“猫狗”爹妈,“它经济”成流量引擎

随着国民收入水平的逐步提高、消费观念升级以及宠物观念的日益成熟,宠物经济发展迅猛且潜力大。 无论是之前"金毛siri被托运致死“登上各平台热搜,还是疫情封控期间大家分享宠物在家等主人回家的各类视频,都印证了现今宠物地位的大幅度提…

日语中动物的叫声是怎样的-狗子怎么叫的

在日文中动物的一些叫声是怎么样的,用日文怎么形容呢 动物的叫声(动物の鸣き声) 大象(ぞう):パオーンパオーン paon paon 猴子(さる):ウキーキー uki kii 熊&#xf…

四、狗狗大全应用实战

传送门 《一、Android Studio的安装和使用》 《二、Android界面开发》 《三、Android网络开发》 《四、狗狗大全应用实战》 视频教程 https://space.bilibili.com/249229063/channel/seriesdetail?sid1930119 学习目标 综合前面学习内容,完成狗狗大全App&…

网络对大学生影响的调查研究报告

作者:倪宇轩,王伟燃,卢锴,徐新顺, 胡大宸(排名不分先后) 摘要:现在大多数大学生由于在高中时期,对网络接触的十分少,进入大学之后难以端正对待网络的态度,并且…