py-21-Android

Android


目录:

01:培优讲义_移动端

day01:Bootstrap

day02:拼多商城

day03:登录商品显示功能

day04:微信小程序

day05:微信支付


01:培优讲义_移动端

1.启动夜神模拟器

2.查看夜神安装目录

py-21-Android_第1张图片

3.执行nox_adb.exe

执行的命令是

nox_adb.exe connect 127.0.0.1:62001

py-21-Android_第2张图片

4.运行程序

点下图中绿箭头,会出现”Samsung Nexus”,如果不出现,在dos窗口中再执行一次” nox_adb.exe connect 127.0.0.1:62001”

py-21-Android_第3张图片

点“Proceed without Instant Run”不用闪电安装功能

py-21-Android_第4张图片

5.设置夜神模拟器屏幕大小

py-21-Android_第5张图片

3.Android入门案例

6.Android项目结构

py-21-Android_第6张图片

7.修改界面

在android视图中修改action_main.xml

  1. 将相对布局RelativeLayout改成线性布局LinearLayout,设置方向orientation.

  2. 修改文本,字号

  3. 增加button





8.修改代码

修改MainActivity.java

public class MainActivity extends AppCompatActivity {

//程序启动时执行onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到btn
Button btn = (Button) findViewById(R.id.registerBtn);
//给btn设置事件监听
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显示文本
Toast.makeText(MainActivity.this, "注册", Toast.LENGTH_LONG).show();
}
});

}
}

py-21-Android_第7张图片

9.从网站上下载apk

  1. 到\app\build\outputs\apk文件夹下找到apk,拷贝到\pdServer\src\main\webapp\文件夹中。

  2. 制作apk.html

    
    

    apk

     3.Android模拟器中访问apk.html,下载apkpy-21-Android_第8张图片

4.商城的登录注册

py-21-Android_第9张图片

 10.欢迎页

MainActivity.java 中增实现跳转到登录首页

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//启线程
MyThread myThread=new MyThread();
myThread.start();
}
//内部类
class  MyThread extends  Thread
{
@Override
public void run() {
try{
//停3秒
sleep(3000);
//跳到LoginActiviyt
//从mainActivity跳到LoginActivity
Intent intent=new Intent(MainActivity.this,LoginActivity.class);
//开始跳到loginActivity
startActivity(intent);
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}

在activity_main.xml中增加 background属性设置背景



11.登录

  1. 界面分析

py-21-Android_第10张图片

2.实现

1.创建LoginActivity

py-21-Android_第11张图片

public class LoginActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//单击登录界面中的注册按钮跳到注册界面
Button registerBtn= (Button) findViewById(R.id.login_register_btn);

registerBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳到注册界面
Intent intent=new Intent(LoginActivity.this,RegisterActivity.class);
startActivity(intent);
}
});
}
}
















   12. 自动跳到登录

py-21-Android_第12张图片

13.R类出错的原因

Res下的文件名以数字开头或大写,重新build就报错。

14.注册

需求

py-21-Android_第13张图片

1.创建RegisterActivity

2.拷贝activity_login.xml中的内容到activity_register.xml中。修改id,增加确认密码,手机号,邮箱

3.登录中单击按钮跳到到RegisterActivity

在LoginActivity增加下面代码

public class RegisterActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
}
}
































15.联网注册用户

3.测试服务器接口

1. 查看源码 pdServer\src\main\java\com\pd\controller\UserController.java

@RequestMapping("/user/register.html")
@ResponseBody
//http://ip/user/register.html
//?username=180501&password=123456&phone=13691481001&email=1@qq.com
public PdResult register(PdUser ajiaUser)
throws Exception
{
PdResult ajiaResult=new PdResult();
ajiaResult.setStatus(500);
String password=ajiaUser.getPassword();
password=DesUtil.encrypt(password, "88889999");
password=MD5Encrypt.MD5Encode(password);

ajiaUser.setPassword(password);

String username=ajiaUser.getUsername();
PdUser dbPdUser=userService
.selectByUsername(username);
if (dbPdUser==null)
{
int row=userService.insert(ajiaUser);
if (row>=1)
{
ajiaResult.setStatus(200);
}
}
return ajiaResult;
}

2. 浏览器测试

http://ip/user/register.html?username=180501&password=123456&phone=13691481001&email=1@qq.com

第一次访问,服务器返回

{"status":200,"msg":null,"data":null}

再刷新url,服务器返回

{"status":500,"msg":null,"data":null}

3. 查看数据库有没有注册成功

执行下面select查询最新用户

SELECT * FROM pd_user  ORDER BY id desc

4.联网过程分析

py-21-Android_第14张图片

5.拷贝jar

py-21-Android_第15张图片

把两个jar加到编译路径中有两种方 法

第一种方法

py-21-Android_第16张图片

在下图中点击ok

py-21-Android_第17张图片

第二种方法

6.代码实现

1,创建实体类

//{"status":200,"msg":null,"data":null}
public class ServerResult implements Serializable {
private int status;
private String msg;
private Object data;

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}
}

在manifests\AndroidManifest.xml内增加权限

py-21-Android_第18张图片




定义常量

public class PdApplication {
final static String serverIP="http://192.168.221.194";
}

2.联网发数据

public class RegisterActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
final Button registerBtn = (Button) findViewById(R.id.register_registerButton);
registerBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

try {
//1.找到5个控件
EditText usernameEt = (EditText) findViewById(R.id.register_usernameEditText);
EditText passwordEt = (EditText) findViewById(R.id.register_paswordEditText);
EditText confirmPasswordEt = (EditText) findViewById(R.id.register_confirm_paswordEditText);
EditText phoneEt = (EditText) findViewById(R.id.register_phoneEditText);
EditText emailEt = (EditText) findViewById(R.id.register_emailEditText);
//2.接收信息
String username = usernameEt.getText().toString();
String passowrd = passwordEt.getText().toString();
String confirmPassword = confirmPasswordEt.getText().toString();
String phone = phoneEt.getText().toString();
String email = emailEt.getText().toString();

//3.判断信息
if (passowrd.equals(confirmPassword)) {
//4. 联网
//4.1 拼出url
String url = PdApplication.serverIP+"/user/register.html?" +
"username=" + username +
"&password=" + passowrd +
"&phone=" + phone +
"&email=" + email;
//4.2 发数据
MyListener myListener = new MyListener();
MyErrorListener myErrorListener = new MyErrorListener();
StringRequest request = new StringRequest(url, myListener, myErrorListener);

RequestQueue requestQueue = Volley.newRequestQueue(RegisterActivity.this);
requestQueue.add(request);

} else {
Toast.makeText(RegisterActivity.this, "密码不一致", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

//内部类
class MyListener implements Response.Listener {

@Override
public void onResponse(String s) {
Log.i("pd", s);
//4.3 收数据
//4.4 把json转成对象
ServerResult result = JSON.parseObject(s, ServerResult.class);
if (result.getStatus() == 200) {
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(RegisterActivity.this, "注册失败", Toast.LENGTH_LONG).show();

}
}
}

class MyErrorListener implements Response.ErrorListener {

@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("pd", volleyError.getMessage());
}
}
}

16.联网登录

7.分析

1.测试服务器接口

1. 查看源码 pdServer\src\main\java\com\pd\controller\UserController.java

//http://localhost:8090/user/login.html?username=b&password=123457
@RequestMapping("/user/login.html")
@ResponseBody
public PdResult Login
(String username,String password) throws Exception
{
password=DesUtil.encrypt(password, "88889999");
password=MD5Encrypt.MD5Encode(password);


PdResult ajiaResult=new PdResult();
ajiaResult.setStatus(500);

PdUser dbPdUser=userService
.selectByUsername(username);
if (dbPdUser!=null &&
password.equals(dbPdUser.getPassword()))
{
ajiaResult.setStatus(200);
}

return ajiaResult;
}

2. 浏览器测试

http://192.168.221.194/user/login.html?username=180601&password=123456

2.实现

LoginActivity.oncreate()中增加如下代码

final Button loginButton = (Button)
findViewById(R.id.login_loginButton);
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1.找到2个控件
EditText usernameEditText = (EditText)
findViewById(R.id.login_usernameEditText);
EditText passwordEditText = (EditText)
findViewById(R.id.login_paswordEditText);

//2.接收信息
String username = usernameEditText.getText().toString();
String password = passwordEditText.getText().toString();

//3.判断信息
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(LoginActivity.this, "用户名或密码为空", Toast.LENGTH_LONG).show();
} else {
//4.联网发送
String url = PdApplication.serverIP+"/user/login.html?" +
"username=" + username +
"&password=" + password;
StringRequest request = new StringRequest(url, new Response.Listener() {
@Override
public void onResponse(String s) {
ServerResult result = JSON.parseObject(s, ServerResult.class);
if (result.getStatus() == 200) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(LoginActivity.this, "登录失败", Toast.LENGTH_LONG).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {

}
});
RequestQueue requestQueue = Volley.newRequestQueue(LoginActivity.this);
requestQueue.add(request);
}
}
});

5.显示主界面

17.分析

py-21-Android_第19张图片

18.拷贝res文件

要拷贝的res文件夹中有ic_launcher.png等文件。

没有activity_main.xml, activity_register.xml, activity_login.xmlM平in

19.显示三个按钮

创建java Class MainFragment

加载main_framgent,只出button

public class MainFragmentActivity
extends FragmentActivity{
//只有一个参数
@Override
protected void onCreate
(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
}
}

清单文件注册



   




20.登录成功跳到主界面

if (result.getStatus() == 200) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
try {//保存用户

Intent intent = new Intent(LoginActivity.this, MainFragmentActivity.class);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}

}

6.数据保存

21.分析

py-21-Android_第20张图片

py-21-Android_第21张图片

22.设计

23.保存数据

3.databaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {

public DatabaseHelper(Context context) {
super(context, "pd.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table pd_user ("
+ "username varchar(50)) ";

db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

4. UserDAO

public class UserDAO {
public long insert(Activity activity, String username) {
long result = -1;
DatabaseHelper databaseHelper = new DatabaseHelper(activity);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", username);
String table = "pd_user";
String nullColumnHack = null;
//添加数据的id
result = db.insert(table, nullColumnHack, values);
db.close();
return result;
}


}

5.LoginActivity

if (result.getStatus() == 200) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
try {//保存用户
UserDAO userDAO = new UserDAO();
userDAO.insert(LoginActivity.this, username);
Intent intent = new Intent(LoginActivity.this, MainFragmentActivity.class);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}

}

6.查看数据

使用原生模拟器执行android-sdk-windows\platform-tools下的adb

使用夜神模拟器执行D:\Program Files\Nox\bin>文件夹下的adb

在 dos中切换到文件夹中执行下面的命令

adb shell
root@android:/ # ls
data
etc
root@android:/ # cd data
root@android:/data # ls
data
root@android:/data # cd data
root@android:/data/data # ls
com.pd.pdmobilestore
root@android:/data/data # cd com.pd.pdmobilestore
root@android:/data/data/com.pd.pdmobilestore # ls
app_webview
cache
databases
lib
root@android:/data/data/com.pd.pdmobilestore # cd databases
root@android:/data/data/com.pd.pdmobilestore/databases # ls
pd.db
pd.db-journal
root@android:/data/data/com.pd.pdmobilestore/databases # sqlite3 pd.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
android_metadata  pd_user
sqlite> select * from pd_user;
180611
sqlite> .quit
root@android:/data/data/com.pd.pdmobilestore/databases # exit
D:\Program Files\Nox\bin>

24.查询数据

  1. userDao增加query

public int query(Activity activity) {
DatabaseHelper databaseHelper = new DatabaseHelper(activity);
SQLiteDatabase db = databaseHelper.getReadableDatabase();

String[] args = null;
//cursor 相当于jdbc中的resultSet
Cursor cursor = db.rawQuery("select * from pd_user", args);
if (cursor != null) {
int count = cursor.getCount();
return count;
}

cursor.close();

return 0;
}

2.MainActivity修改代码

class ToLoginThread extends Thread {
@Override
public void run() {
try {
sleep(3000);
//从数据库中查询用户是否登录
UserDAO userDAO = new UserDAO();
int count = userDAO.query(MainActivity.this);
if (count >= 1) {
//已经登录过,直接显示主界面
Intent intent = new Intent(MainActivity.this, MainFragmentActivity.class);
startActivity(intent);
} else {
//没登录,跳到loginActivity
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

7.主界面

25.分析

py-21-Android_第22张图片

Fragment是可重用的界面

创建三个fragment   IndexFragment,MessageFragment,MeFragment

26.显示首页

添加联网权限


















创建IndexFragment

//fragment类是v4包
public class IndexFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//把fragment_index.xml转成view
/*getActiviyt()返回的是mainFragmentActivity*/
View view=View.inflate(getActivity(),R.layout.fragment_index,null);
//找到webView
WebView webView= (WebView) view.findViewById(R.id.webView);
//单击超连接,打开的是手机的浏览器,不能打开浏览器
webView.setWebViewClient(new WebViewClient());
//用webView加载网页
String url=PdApplication.serverIP+"/mobileIndex.html";
webView.loadUrl(url);
WebSettings webSettings=webView.getSettings();
//允许webview执行js
webSettings.setJavaScriptEnabled(true);
//返回view
return view;
}
}
public class MainActivity extends FragmentActivity {
IndexFragment indexFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
//显示storefragment
FragmentManager fragmentManager=getSupportFragmentManager();
//transaction事务:包含多个动作,有一个失败,都失败
FragmentTransaction transaction=fragmentManager.beginTransaction();
indexFragment=new IndexFragment();
transaction.add(R.id.fragment_container,indexFragment);
transaction.show(indexFragment);
//add()和show()有一个失败了,出异常,不执行commit()
transaction.commit();
}


}

27.显示 消息,我

创建messageFragment

public class MessageFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=View.inflate
(getActivity(),
R.layout.fragment_message,
null);
return view;
}
}

创建meFragment

public class MeFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=View.inflate
(getActivity(),
R.layout.fragment_me,
null);
return view;
}
}

修改MainFragmentActivity

//管理商城,消息,我3个fragment
//所有的activity必须在androidManifest.xml中注册
public class MainFragmentActivity
extends FragmentActivity{
IndexFragment storeFragment;
MessageFragment messageFragment;
MeFragment meFragment;
//store,message,me
Fragment[] fragments=new Fragment[3];
//storebtn,messageBtn,meBtn
Button[] buttons=new Button[3];
//正在显示的fragment下标
int currentFragmentIndex=0;
//单击的btn下标
int clickBtnIndex=0;
//只有一个参数
@Override
protected void onCreate
(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
storeFragment=new IndexFragment();
//得到fragment管理对象
//v4包
FragmentManager manager=getSupportFragmentManager();
//开始事务
FragmentTransaction transaction=manager.beginTransaction();
//1,添置fragment
//fragment_container是主界面里的一个linearLayout
//用linearLayout显示fragment
transaction.add(R.id.fragment_container,storeFragment);
//2,显示fragment
transaction.show(storeFragment);
//add()和show()都执行成功提交事务
transaction.commit();

//创建message,me fragment
messageFragment=new MessageFragment();
meFragment=new MeFragment();
//把三个fragment放到数组
fragments[0]=storeFragment;
fragments[1]=messageFragment;
fragments[2]=meFragment;
//找到三个button
buttons[0]= (Button) findViewById
(R.id.btn_main_fragment_store);
buttons[1]= (Button) findViewById
(R.id.btn_main_fragment_message);
buttons[2]= (Button) findViewById
(R.id.btn_main_fragment_me);
//为三个button设置事件监听
MyBtnListener listener=new MyBtnListener();
buttons[0].setOnClickListener(listener);
buttons[1].setOnClickListener(listener);
buttons[2].setOnClickListener(listener);
buttons[currentFragmentIndex].setSelected(true);
}
class  MyBtnListener implements
View.OnClickListener
{

@Override
public void onClick(View v) {
//判断单击的是第几个按钮
switch (v.getId())
{
case R.id.btn_main_fragment_store:
clickBtnIndex=0;
break;
case R.id.btn_main_fragment_message:
clickBtnIndex=1;
break;
case R.id.btn_main_fragment_me:
clickBtnIndex=2;
break;
}
//判断单击的是不是当前按钮
if (clickBtnIndex!=currentFragmentIndex) {
//得到fragment管理对象
FragmentManager manager=getSupportFragmentManager();
//开始事务
FragmentTransaction transaction=manager.beginTransaction();
//显示新的fragment
Fragment showFragment=fragments[clickBtnIndex];
if (showFragment.isAdded()==false) {
transaction.add(R.id.fragment_container,
showFragment);
}
transaction.show(showFragment);
//隐藏旧的fragment
Fragment hideFragment=fragments[currentFragmentIndex];
transaction.hide(hideFragment);
//提交事务
transaction.commit();
buttons[clickBtnIndex].setSelected(true);
buttons[currentFragmentIndex].setSelected(false);
currentFragmentIndex=clickBtnIndex;
}
}
}
}

8.Android与js交互

28.服务器上一改,客户端就变

setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView);
String url = "http://172.60.50.123:8020/html4/jd.html";
webView.loadUrl(url);
// 清除缓存
webView.clearCache(true);

29.Android调JavaScript()

py-21-Android_第23张图片

在电脑上测试changeUsername

function setUsername()
{
var username=document.getElementById("username");
username.value="android";
}

在webView 中测试

用button调用javascript

TextView tv1=(TextView) findViewById(R.id.textView1);
tv1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
try {
webView.loadUrl("javascript:setUsername()");
} catch (Exception e) {
// TODO: handle exception
}         
}
});

30.通过JavaScript调用Android中的方法。

py-21-Android_第24张图片

 加call_phone权限

7.写android代码

final class MyPhone
{
@JavascriptInterface
public void call(String mobile)
{
try {
Uri uri=Uri.parse("tel:"+mobile);//geo:latitude,longitude
Intent intent=new Intent(Intent.ACTION_CALL,uri);        
startActivity(intent);
} catch (Exception e) {
// TODO: handle exception
}
}
}
MyPhone myPhone=new MyPhone();
webView.addJavascriptInterface(myPhone, "androidMyPhoneObject");
@SuppressLint("JavascriptInterface")
public class MainActivity extends Activity {

js代码

function callAndroid()
{
window.androidMyPhoneObject.call("138");
}
window.onload=function(){
var btn=document.getElementById("testjs");
btn.onclick=callAndroid;
}

9.总结

py-21-Android_第25张图片


day01:Bootstrap

  1. 复习

py-21-Android_第26张图片

2.移动端

  1. Android app

Bootstrap响应式布局

Vue

androidApp

2.微信小程序

2.bootstrap

是个css框架

主要功能是实现了响应式布局。

案例:\bootstrap\WebContent\intel完整版

3.Bootstrap使用场景

运行intel项目

4.Bootstrap定义

是一个css前端框架,能制作响应式网页

5.Bootstrap 原理

媒体查询





Insert title here




2.组合样式





Insert title here



test1
test2
test3
test4

3.不同屏幕显示的网页不一样





Insert title here



div1
div2

6.bootStrap概念

超小屏幕

手机 0-768px

小屏幕

平板768-992

中等屏幕

电脑992-1200

大屏幕

电脑1200-?

Col-xs-

Col-sm-

Col-md

Col-lg

Bootstrap源码分析

py-21-Android_第27张图片

7.Bootstrap使用

py-21-Android_第28张图片

分析
Col_xs超小
Col_sm小
Col_md 中









1111
222
333

4.Vue数据绑定

8.部署服务器端

4.部署数据库

  1. 文件—》新建查询编辑器

  2. 设置数据包的大小 ,如果不设置,sql文件态大,只能执行一部分sql

SET GLOBAL max_allowed_packet=1024*1024*400;

3.拷贝pd.sql中的所有内容到查询窗口中,选中所有内容,执行

4.刷新对象浏览器

5.看到pd_store数据库

py-21-Android_第29张图片

5.部署代码

1.eclipse中import pdserver

2.Eclipse中打开server窗口,添加tomcat,

py-21-Android_第30张图片

3.部署pdServer项目

py-21-Android_第31张图片

4.把访问path设置成/

py-21-Android_第32张图片

修改MySql密码

pdServer\src\main\resources\properties\ db.properties

5.通过http://ip:port 能看到商城电脑端的首页

py-21-Android_第33张图片

6. /mobileIndex.html能看到商城移动端首页

py-21-Android_第34张图片

9.创建响应式网页

py-21-Android_第35张图片

在pdServer/src/main/webapp中创建网页pdIndex.html





Insert title here




10.Mounted事件





Insert title here





11.数据绑定

6.分析

py-21-Android_第36张图片

Vue数据绑定
读取数据
//从vue框架取数据
foreach 设置数据 Mode.addAttribute(items) New vue({ //把item放到vue框架中了 data:{items:[{title,price},{}]} })

7.实现


{{item.title}}
{{item.price}}

5.Vue 联网

12.测试服务器端接口

http://ip:port/api/getIndexItem.html

chrome插件jsonView能格式化网页中的json.

\培优课前资料\亿发,移动端课前资料\software\jsonView\ chrome中安装jsonView.doc

py-21-Android_第37张图片

13.联网

mounted : function() {
console.log("网页加载完成");
var url="/api/getIndexItem.html";
axios.get(url)
.then(
function(response)
{
console.log(response);
}
)
.catch(
function(err)
{
console.log(err)
}
);
},

联网成功后,取到的数据如下图

py-21-Android_第38张图片

14.测试两个this的区别

8.测试mounted中的this

mounted : function() {
console.log("网页加载完成");
console.log("mount中的this");
//this是vue,包含了items
console.log(this);
}

Mounted函数

9.测试then中的this

then(
function(response)
{
console.log(response);
console.log("联网成功后回调函数 this")
//this是window,没有items             
console.log(this);
}
)

then中的this是window,没有items对象

py-21-Android_第39张图片

10.把mounted中的this传给then回调的函数

11.显示商品信息





Insert title here








15.Detail.html

py-21-Android_第40张图片

12.响应式网页






Insert title here




13.得itemId









Insert title here





14.显示图片









Insert title here


返回


{{item.title}}
{{item.sellPoint}}

day02:拼多商城

  1. 复习

    1. Vue

py-21-Android_第41张图片

2.京淘框架

py-21-Android_第42张图片

2.Android

3.b/s与c/s区别

browser/webserver

优点:不用安装

缺点:功能不强大,界面用html,界面做的好用flash,canvas

client/server

优点:功能强大

缺点:客户端要升级

做的软件运行在电脑上,最好用b/s

做的软件运行在手机上,最好用c/s

手机上或电脑上的软件用c/s+b/s 叫混合开发模式,hybrid,混编

4.入门项目

开发工具

py-21-Android_第43张图片

有些公司做网站用的是intellij

3.项目目录

py-21-Android_第44张图片

4.程序是如何运行

py-21-Android_第45张图片

py-21-Android_第46张图片

修改res/layout/activity_main.xml






修改MainActivity.java

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//资源必须通过R类来访问
//框架会压缩资源,访问速度也快
//不要import android.R
//import 当前包下的R类
setContentView(R.layout.activity_main);
//找到button
Button button= (Button) this.findViewById
(R.id.testBtn);
//设置单击事件
//jquery button.click(function)
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显示确认框
//window.alert()
Toast.makeText(MainActivity.this,"你好",Toast.LENGTH_LONG).show();
}
});
}
}

5.从网站上下载apk

  1. 到\app\build\outputs\apk文件夹下找到apk,拷贝到\pdServer\src\main\webapp\文件夹中。

py-21-Android_第47张图片

2.制作apk.html


apk

3.Android模拟器中访问apk.html,下载apk

py-21-Android_第48张图片

5.拼多商城

6.登录界面

  1. 需求

py-21-Android_第49张图片

2.分析

创建项目

拷贝图片

修改activity_main.xml设置背景图

py-21-Android_第50张图片

3.实现

在资源管事器拷贝资源。

打开activity_main.xml 查看tools:context有没有变红,如果变红,改包名

修改activity_main.xml





7.跳到登录界面

py-21-Android_第51张图片

6.注册界面

需求

py-21-Android_第52张图片

1.创建RegisterActivity

2.制作注册界面

3.登录中单击按钮跳到到RegisterActivity

在LoginActivity增加下面代码

//单击登录界面中的注册按钮跳到注册界面
Button registerButton = (Button)
findViewById(R.id.login_registerButton);

registerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LoginActivity.this
, RegisterActivity.class);
startActivity(intent);
}
});

7.联网注册用户

4.测试服务器接口

1.    查看源码 pdServer\src\main\java\com\pd\controller\UserController.java

@RequestMapping("/user/register.html")
@ResponseBody
//http://ip/user/register.html
//?username=180501&password=123456&phone=13691481001&email=1@qq.com
public PdResult register(PdUser ajiaUser)
throws Exception
{
PdResult ajiaResult=new PdResult();
ajiaResult.setStatus(500);
String password=ajiaUser.getPassword();
password=DesUtil.encrypt(password, "88889999");
password=MD5Encrypt.MD5Encode(password);

ajiaUser.setPassword(password);

String username=ajiaUser.getUsername();
PdUser dbPdUser=userService
.selectByUsername(username);
if (dbPdUser==null)
{
int row=userService.insert(ajiaUser);
if (row>=1)
{
ajiaResult.setStatus(200);
}
}
return ajiaResult;
}

2.    浏览器测试

http://ip/user/register.html?username=180501&password=123456&phone=13691481001&email=1@qq.com

第一次访问,服务器返回

{"status":200,"msg":null,"data":null}

再刷新url,服务器返回

{"status":500,"msg":null,"data":null}

3.    查看数据库有没有注册成功

执行下面select查询最新用户

SELECT * FROM pd_user  ORDER BY id desc

5.联网过程分析

py-21-Android_第53张图片

Volley框架原理

6.拷贝jar

py-21-Android_第54张图片

把两个jar加到编译路径中有两种方 法

第一种方法

py-21-Android_第55张图片

在下图中点击ok

py-21-Android_第56张图片

第二种方法

7.代码实现

1,创建实体类

//{"status":200,"msg":null,"data":null}
public class ServerResult implements Serializable {
private int status;
private String msg;
private Object data;

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public Object getData() {
return data;
}

public void setData(Object data) {
this.data = data;
}

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}
}

定义常量

public class PdApplication {
final static String serverIP="http://192.168.221.194";
}

在androidManifest.xml中添加联网权限






















2.联网发数据

public class RegisterActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_register);        final Button registerBtn = (Button) findViewById(R.id.register_registerButton);        registerBtn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try {                    //1.找到5个控件                    EditText usernameEt = (EditText) findViewById(R.id.register_usernameEditText);                    EditText passwordEt = (EditText) findViewById(R.id.register_paswordEditText);                    EditText confirmPasswordEt = (EditText) findViewById(R.id.register_confirm_paswordEditText);                    EditText phoneEt = (EditText) findViewById(R.id.register_phoneEditText);                    EditText emailEt = (EditText) findViewById(R.id.register_emailEditText);                    //2.接收信息                    String username = usernameEt.getText().toString();                    String passowrd = passwordEt.getText().toString();                    String confirmPassword = confirmPasswordEt.getText().toString();                    String phone = phoneEt.getText().toString();                    String email = emailEt.getText().toString();                    //3.判断信息                    if (passowrd.equals(confirmPassword)) {                        //4. 联网                        //4.1 拼出url                        String url = PdApplication.serverIP+"/user/register.html?" +                                "username=" + username +                                "&password=" + passowrd +                                "&phone=" + phone +                                "&email=" + email;                        //4.2 发数据                        MyListener myListener = new MyListener();                        MyErrorListener myErrorListener = new MyErrorListener();                        StringRequest request = new StringRequest(url, myListener, myErrorListener);                        RequestQueue requestQueue = Volley.newRequestQueue(RegisterActivity.this);                        requestQueue.add(request);                    } else {                        Toast.makeText(RegisterActivity.this, "密码不一致", Toast.LENGTH_LONG).show();                    }                } catch (Exception e) {                    e.printStackTrace();                }            }        });    }   //内部类

//1,联网成功回调
class MyListener implements Response.Listener {

@Override
public void onResponse(String s) {
Log.i("pd", s);
//4.3 收数据
//4.4 把json转成对象
ServerResult result = JSON.parseObject(s, ServerResult.class);
if (result.getStatus() == 200) {
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(RegisterActivity.this, "注册失败", Toast.LENGTH_LONG).show();

}
}
}

//2,联网失败回调
class MyErrorListener implements Response.ErrorListener {

@Override
public void onErrorResponse(VolleyError volleyError) {
Log.i("pd", volleyError.getMessage());
}
}
}

8.Android与js的互相调用


day03:登录商品显示功能

  1. 复习

py-21-Android_第57张图片

py-21-Android_第58张图片

2.登录

1.分析

py-21-Android_第59张图片

1.测试服务器接口

1.    查看源码 pdServer\src\main\java\com\pd\controller\UserController.java

//http://localhost:8090/user/login.html?username=b&password=123457
@RequestMapping("/user/login.html")
@ResponseBody
public PdResult Login
(String username,String password) throws Exception
{
password=DesUtil.encrypt(password, "88889999");
password=MD5Encrypt.MD5Encode(password);


PdResult ajiaResult=new PdResult();
ajiaResult.setStatus(500);

PdUser dbPdUser=userService
.selectByUsername(username);
if (dbPdUser!=null &&
password.equals(dbPdUser.getPassword()))
{
ajiaResult.setStatus(200);
}

return ajiaResult;
}

2.    浏览器测试

http://192.168.221.194/user/login.html?username=180601&password=123456

2.实现

LoginActivity.oncreate()中增加如下代码

public class LoginActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//单击登录用volley发数据给服务器
Button loginBtn = (Button) findViewById(R.id.login_submit_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//1,找到控件
EditText usernameEt = (EditText)
findViewById(R.id.login_username_editText);
EditText passwordEt = (EditText)
findViewById(R.id.login_password_editText);
//2,接收界面上用户输入的数据
String username = usernameEt.getText().toString();
String password = passwordEt.getText().toString();
//3,判断数据
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
Toast.makeText(LoginActivity.this, "用户名或密码不能为空", Toast.LENGTH_LONG).show();
} else {

//4.联网发送
//4.1 拼出url
String url = PdApplication.SERVER_IP + "/user/login.html" +
"?username=" + username +
"&password=" + password;
//4.2 发送
MySuccessListener successListener = new MySuccessListener();
MyErrorListener errorListener = new MyErrorListener();
StringRequest request = new StringRequest(url, successListener, errorListener);

RequestQueue queue = Volley.newRequestQueue(LoginActivity.this);
queue.add(request);


}
}
});

//单击登录界面中的注册按钮跳到注册界面
Button registerBtn = (Button) findViewById(R.id.login_register_btn);

registerBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//跳到注册界面
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
}
});
}

//内部类
//1,联网成功后回调
class MySuccessListener implements Response.Listener {

@Override
public void onResponse(String s) {
//4.3 在回调的方法中接收数据
//4.4 处理数据
//4.5 把结果显示在界面上
ServerResult serverResult = JSON.parseObject(s, ServerResult.class);
if (serverResult.getStatus() == 200) {
Toast.makeText
(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
} else {
Toast.makeText
(LoginActivity.this, "登录失败", Toast.LENGTH_LONG).show();
}
}
}

//2,联网失败后回调
class MyErrorListener implements Response.ErrorListener {

@Override
public void onErrorResponse(VolleyError volleyError) {
System.out.println("出错了" + volleyError.getMessage());
}
}
}

3.显示主界面

2.分析

py-21-Android_第60张图片

3.显示三个按钮

创建java Class MainFragment

加载main_framgent,只出button

public class MainFragmentActivity
extends FragmentActivity{
//只有一个参数
@Override
protected void onCreate
(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
}
}

清单文件注册



   




4.登录成功跳到主界面

if (result.getStatus() == 200) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
try {//保存用户

Intent intent = new Intent(LoginActivity.this, MainFragmentActivity.class);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}

}

4.数据保存

5.分析

py-21-Android_第61张图片

py-21-Android_第62张图片

6.保存数据

3.databaseHelper

public class DatabaseHelper extends SQLiteOpenHelper {

public DatabaseHelper(Context context) {
super(context, "pd.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table pd_user ("
+ "username varchar(50)) ";

db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}
}

4.UserDAO

public class UserDAO {
public long insert(Context context, String username) {
//得到连接
DatabaseHelper databaseHelper = new DatabaseHelper(context);
//得到写数据库对象
SQLiteDatabase sqLiteDatabase = databaseHelper.getWritableDatabase();
//把数据放到hashMap
ContentValues contentValues = new ContentValues();
contentValues.put("username", username);

//添加
String tableName = "pd_user";
long row= sqLiteDatabase.insert(tableName, null, contentValues);
sqLiteDatabase.close();
databaseHelper.close();

}
}

5.LoginActivity

if (result.getStatus() == 200) {
Toast.makeText(LoginActivity.this, "登录成功", Toast.LENGTH_LONG).show();
try {//保存用户
UserDAO userDAO = new UserDAO();
userDAO.insert(LoginActivity.this, username);
Intent intent = new Intent(LoginActivity.this, MainFragmentActivity.class);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}

}

6.查看数据

使用原生模拟器执行android-sdk-windows\platform-tools下的adb

使用夜神模拟器执行D:\Program Files\Nox\bin>文件夹下的adb

在 dos中切换到文件夹中执行下面的命令

adb shell
root@android:/ # ls
data
etc
root@android:/ # cd data
root@android:/data # ls
data
root@android:/data # cd data
root@android:/data/data # ls
com.pd.pdmobilestore
root@android:/data/data # cd com.pd.pdmobilestore
root@android:/data/data/com.pd.pdmobilestore # ls
app_webview
cache
databases
lib
root@android:/data/data/com.pd.pdmobilestore # cd databases
root@android:/data/data/com.pd.pdmobilestore/databases # ls
pd.db
pd.db-journal
root@android:/data/data/com.pd.pdmobilestore/databases # sqlite3 pd.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .table
android_metadata  pd_user
sqlite> select * from pd_user;
180611
sqlite> .quit
root@android:/data/data/com.pd.pdmobilestore/databases # exit
D:\Program Files\Nox\bin>

5.查询用户数据

py-21-Android_第63张图片

userDao增加query

public  int query(Context context){
int count=0;
//得到连接
DatabaseHelper databaseHelper=new DatabaseHelper(context);
//得到执行sql语句的对象
SQLiteDatabase sqLiteDatabase=databaseHelper.getReadableDatabase();

//定义sql
String sql="select * from pd_user";
String[] args=null;
//cursor游标相当于resultSet
Cursor cursor=sqLiteDatabase.rawQuery(sql,args);
//判断结果
if (cursor!=null)
{
count=cursor.getCount();
}
cursor.close();
databaseHelper.close();
//返回结果
return  count;
}

2.MainActivity修改代码

class ToLoginThread extends Thread {
@Override
public void run() {
try {
sleep(3000);
//从数据库中查询用户是否登录
UserDAO userDAO = new UserDAO();
int count = userDAO.query(MainActivity.this);
if (count >= 1) {
//已经登录过,直接显示主界面
Intent intent = new Intent(MainActivity.this, MainFragmentActivity.class);
startActivity(intent);
} else {
//没登录,跳到loginActivity
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

6.显示商品

7.显示商品

7.分析

py-21-Android_第64张图片

py-21-Android_第65张图片

8.显示首页

创建IndexFragment

//fragment类是v4包
public class IndexFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//把fragment_index.xml转成view
/*getActiviyt()返回的是mainFragmentActivity*/
View view=View.inflate(getActivity(),R.layout.fragment_index,null);
//找到webView
WebView webView= (WebView) view.findViewById(R.id.webView);
//单击超连接,打开的是手机的浏览器,不能打开浏览器
webView.setWebViewClient(new WebViewClient());
//用webView加载网页
String url=PdApplication.serverIP+"/mobileIndex.html";
webView.loadUrl(url);
WebSettings webSettings=webView.getSettings();
//允许webview执行js
webSettings.setJavaScriptEnabled(true);
//返回view
return view;
}
}

MainFragmentActivity中加载IndexFragment

public class MainFragmentActivity extends FragmentActivity {
IndexFragment indexFragment;
//参数只有一个
@Override
protected void onCreate
(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
//在fragment_container中显示indexFragment

//开始事务
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
//动作1:加载indexFragment到fragment_container中
indexFragment=new IndexFragment();
transaction.add(R.id.fragment_container,indexFragment);
//动作2:显示indexfragment
transaction.show(indexFragment);
//add()和show()有一个失败了,出异常,不执行commit()
//提交事务
transaction.commit();

}
}

8.显示消息,我

py-21-Android_第66张图片

创建messageFragment

public class MessageFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=View.inflate
(getActivity(),
R.layout.fragment_message,
null);
return view;
}
}

创建meFragment

public class MeFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view=View.inflate
(getActivity(),
R.layout.fragment_me,
null);
return view;
}
}

修改MainFragmentActivity

public class MainFragmentActivity extends FragmentActivity {
IndexFragment indexFragment;
//indexfragment,messgeFragment,mefragment
Fragment[] fragments=new Fragment[3];

//indexBtn,messageBtn,MeBtn
Button[] buttons=new Button[3];

//现在显示的是第几个fragment
int currentFragmentIndex=0;

//单击的按钮是第几个
int clickBtnIndex=0;
//参数只有一个
@Override
protected void onCreate
(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_fragment);
//在fragment_container中显示indexFragment

//开始事务
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
//动作1:加载indexFragment到fragment_container中
indexFragment=new IndexFragment();
transaction.add(R.id.fragment_container,indexFragment);
//动作2:显示indexfragment
transaction.show(indexFragment);
//add()和show()有一个失败了,出异常,不执行commit()
//提交事务
transaction.commit();

//创建两个fragment
MessageFragment messageFragment=new MessageFragment();
MeFragment meFragment=new MeFragment();
//把三个fragment放到fragments
fragments[0]=indexFragment;
fragments[1]=messageFragment;
fragments[2]=meFragment;

//找到三个按钮
buttons[0]= (Button) findViewById(R.id.btn_main_fragment_store);
buttons[1]= (Button) findViewById(R.id.btn_main_fragment_message);
buttons[2]= (Button) findViewById(R.id.btn_main_fragment_me);

//设置事件监听
MyBtnListener myBtnListener=new MyBtnListener();
for(Button button:buttons)
{
button.setOnClickListener(myBtnListener);
}

//设置第一个按钮的状态为选中
buttons[currentFragmentIndex].setSelected(true);

}
//按钮事件监听的类
class MyBtnListener implements View.OnClickListener
{

@Override
public void onClick(View v) {
//判断单击是第几个按钮 clickBtnIndex=1 fragments[1]
switch (v.getId())
{
case R.id.btn_main_fragment_store:
clickBtnIndex=0;
break;
case R.id.btn_main_fragment_message:
clickBtnIndex=1;
break;
case R.id.btn_main_fragment_me:
clickBtnIndex=2;
break;
}
//判断单击的是不是当前
if (currentFragmentIndex!=clickBtnIndex) {
//开始事务
FragmentManager manager=getSupportFragmentManager();
FragmentTransaction transaction=manager.beginTransaction();
//动作1:隐藏以前的fragment
Fragment hideFragment=fragments[currentFragmentIndex];
transaction.hide(hideFragment);
//动作2:添加新的fragment
Fragment showFragment=fragments[clickBtnIndex];
if (showFragment.isAdded()==false)
{
transaction.add(R.id.fragment_container,showFragment);
}
//动作3:显示新的fragment
transaction.show(showFragment);
//提交
transaction.commit();
buttons[currentFragmentIndex].setSelected(false);
buttons[clickBtnIndex].setSelected(true);
currentFragmentIndex=clickBtnIndex;
}
}
}
}

在androidManifest.xml配置屏幕切换时不执行onCreate()

9.Js与android互相调用

服务器端改动后,客户端不用升级,自动就变了

服务器端写个网页

客户端加载网页

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView= (WebView) findViewById(R.id.webView);
webView.clearCache(true);

String url="http://10.1.6.102:80/11.html";
webView.loadUrl(url);
}
}

加权限















day04:微信小程序

  1. 复习

py-21-Android_第67张图片

2.Android调js代码

py-21-Android_第68张图片

网页




1折

username:

为btn设置事件监听

WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);
Button btn1= (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//java中调js
webView.loadUrl("javascript:setUsername()");
}
});

3.Js能调android

py-21-Android_第69张图片

添加打电话权限














mainActivity中增加Phone.call()

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final WebView webView= (WebView) findViewById(R.id.webView);
webView.clearCache(true);

String url="http://10.1.6.102:80/11.html";
webView.loadUrl(url);
WebSettings webSettings=webView.getSettings();
webSettings.setJavaScriptEnabled(true);
Button btn1= (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//java中调js
webView.loadUrl("javascript:setUsername()");
}
});

Phone phone=new Phone();
//让js能调用phone对象
//在js中通过androidPhoneObject来调用phone对象
webView.addJavascriptInterface(phone,"androidPhoneObject");
}
//内部类
final class Phone{
//告诉手机,js能调call()
@JavascriptInterface
public  void call()
{
Uri uri=Uri.parse("tel:110");
Intent intent=new Intent(Intent.ACTION_CALL,uri);
startActivity(intent);
}
}
}

网页




1折

username:

4.微信小程序环境

  1. 学习小程序的重要性

小程序的设计原则是:无需下载,用完即走。解决了以往APP使用当中的一些问题:单独下????????????????????????????

1.大众化

py-21-Android_第70张图片

2.入口多

扫一扫,分享,超链接。搜索

3.便于传播

当某个购买行为产生后,能在微信好友/群、朋友圈中散发开来,从而引发更多的购买行为??

4.百度,支付宝小程序

5.人才招聘

py-21-Android_第71张图片

2.手机上体验

py-21-Android_第72张图片

微信 升级到 6.5.3版本

微信中 搜小程序示例 点开,查看组件和接口

发现 下就有小程序,在小程序中搜京东,滴滴

py-21-Android_第73张图片

3.开发工具下载

mp.weixin.qq.com  小程序--》小程序开发文档—》工具

py-21-Android_第74张图片

py-21-Android_第75张图片

浏览器设了代理,连不上网,不能扫描。

4.申请appid

注册帐号:[email protected]

 [email protected]

1.进入官网mp.weixin.qq.com注册

2,选择小程序

py-21-Android_第76张图片

3,输入邮箱信息

py-21-Android_第77张图片

  1. 邮箱中收到激活邮件

  2. 输入个人信息

py-21-Android_第78张图片

3.确认

py-21-Android_第79张图片

4.成功

py-21-Android_第80张图片

8,点设置

py-21-Android_第81张图片

9,在开发设置中查看AppId

py-21-Android_第82张图片

5.导入项目

1,扫描二维码登录开发工具

py-21-Android_第83张图片

2,选择小程序

py-21-Android_第84张图片

3,选择程序,输入appId

py-21-Android_第85张图片

4,执行真机调试

py-21-Android_第86张图片

5,在微信上能找到自己开发的程序

py-21-Android_第87张图片

6,转发自己的小程序

py-21-Android_第88张图片

5.文档

py-21-Android_第89张图片

6.入门项目

6.创建项目

不会自动创建子文件夹。

app.json,app.wss,app.js,各个文件夹介绍

py-21-Android_第90张图片

7.模块化编程思想

py-21-Android_第91张图片

8.创建注册模块

1,创建目录

选中page 右键“新建目录”register

2,选中register,右键 “新建Page”

py-21-Android_第92张图片

结果如下图

py-21-Android_第93张图片

3,修改register.wxml中的内容如下

我的第一个小程序

4,app.json指定起始页

{
"pages":[
"pages/01var"
], 
}

9.制作注册界面1

1.需求

py-21-Android_第94张图片

2.Register.wxml 



注册

3.Register.wxss

#registerView{
width: 100%;
height: 200rpx;
background-color: red;
padding-left: 48rpx;
padding-top: 76rpx;
}
#registerText{
font-size: 48rpx; 
}

10.制作注册界面2

1.需求

py-21-Android_第95张图片

2.Register.wxml



注册


用户名:



密码:





3.Register.wxss

.input{
border: 1px black solid;
}
#registerBtn{
margin-top: 24rpx;
width: 80%;
}

11.事件处理

6.Register.wxml中进行事件绑定


用户名:



密码:




7.事件处理

单击输入框后长按鼠标才能输入文字

Page({
/**
* 页面的初始数据
*/
data: {
username: "",
password: ""
},
usernameInput: function(e) {
var username = e.detail.value;
this.setData({
username: username
});
},
passwordInput: function(e) {
var password = e.detail.value;
this.setData({
password: password
});
},
register: function(e) {
console.log("click");
console.log("username=" + this.data.username);
console.log("password=" + this.data.password);
}
}

12.分享

onReady: function() {
wx.showShareMenu({

})
},

7.联网案例

13.需求

py-21-Android_第96张图片

14.page的生命周期

新建的page必须在app.json中申明,才会执行生命周期

程序一启动,就创建所有的js

// pages/index/index.js
console.log("执行index.js")
Page({
/**
* 页面的初始数据
*/
data: {
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
console.log("index onLoad()");
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
console.log("index onReady()");
},
/**
* 生命周期函数--监听页面显示
*/
onShow: function () {
console.log("index onShow()")
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide: function () {
console.log("index onHide()")
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload: function () {
console.log("index onHide()")
},
)

程序结果

py-21-Android_第97张图片

15.界面跳转

Index.wxml

index

 Index.js

Page({
indexClick:function(e)
{
wx.navigateTo({
url: '../login/login',
})
},
}

执行过程如下

py-21-Android_第98张图片

16.http联网

小程序开发工具中设置à项目设置

py-21-Android_第99张图片

storeIndex中增加如下联网代码

onReady: function() {
console.log("login onReady()");
wx.request({
url: 'http://192.168.1.106/api/getIndexItem.html',
success: function(response) {
console.log(response);
},
fail: function(e) {
console.log(e);
}
})

py-21-Android_第100张图片

17.数据绑定

需求

py-21-Android_第101张图片

storeIndex.js

onReady: function() {
console.log("login onReady()");
var page=this;
wx.request({
url: 'http://192.168.1.106/api/getIndexItem.html',
success: function(response) {
console.log(response);
var serverData=response.data;
var items=serverData.data;
for (var i=0;i

storeIndex.wxml




{{item.title}}
{{item.price}}

8.拼多商城

18.首页

创建项目Pdweixin

拷贝图片

修改index.wxml



19.登录页

py-21-Android_第102张图片

Login.wxml



登录


用户名:



密码:






App.wxss中定义的样式是全局样式,所有wxml文件都可以使用。

App.wxss

.titleView{
width: 100%;
height: 100rpx;
background-color:#FF670c;
padding-left: 48rpx;
padding-top: 26rpx;
}
.titleText{
font-size: 48rpx; 
}
.input{
border: 1px black solid;
}
.btn{
margin-top: 24rpx;
width: 80%;
}

Index.js

onReady:function(){
setTimeout(function(){
wx.navigateTo({
url: '../login/login',
})
},3000);
}

20.注册页

Register.wxml




注册


用户名:



密码:



确认密码:



mail:



mobile:





Login.js中增加代码跳转到注册界面

register:function()
{
wx.navigateTo({
url: '../register/register',
})
}

21.联网注册

8.全局变量

App.js中的globalData用来定义全局变量。

globalData: {
userInfo: null,
serverIp:"http://192.168.1.106/"
}

Register.js

var app=getApp();
onReady: function () {
console.log(app.globalData.serverIp);
},

9.取值,联网

usernameInput: function (event) {
var username = event.detail.value;
this.setData({
username: username,
})
},
passwordInput: function (event) {
var password = event.detail.value;
this.setData({
password: password,
})
},
confirmPasswordInput: function (event) {
var confirmPassword = event.detail.value;
this.setData({
confirmPassword: confirmPassword,
})
},
mailInput: function (event) {
var mail = event.detail.value;
this.setData({
mail: mail,
})
},
mobileInput: function (event) {
var mobile = event.detail.value;
this.setData({
mobile: mobile,
})
},
register: function () {
var username = this.data.username;
var password = this.data.password;
var confirmPassword = this.data.confirmPassword;
var mail = this.data.mail;
var mobile = this.data.mobile;
var url = app.globalData.serverIp + "user/register.html?username=" + username + "&password=" + password + "&email=" + mail + "&phone=" + mobile;
wx.request({
url: url,
success: function (response) {
console.log(response);
var serverReturnData = response.data;
var status = serverReturnData.status;
if (status == 200) {
wx.showToast({
title: '成功',
});
} else {
wx.showToast({
title: '失败',
});
}
},
fail: function (e) {
console.log(e);
}
})
},

22.联网登录

usernameInput: function(event) {
var username = event.detail.value;
this.setData({
username: username,
})
},
passwordInput: function(event) {
var password = event.detail.value;
this.setData({
password: password,
})
},
login: function() {
var username = this.data.username;
var password = this.data.password;
var url = app.globalData.serverIp + "user/login.html?username=" + username + "&password=" + password;
wx.request({
url: url,
success: function(response) {
console.log(response);
var serverReturnData = response.data;
var status = serverReturnData.status;
if (status == 200) {
wx.showToast({
title: '成功',
});
} else {
wx.showToast({
title: '失败',
});
}
},
fail: function(e) {
console.log(e);
}
})
},

23.商城首页

创建目录storeIndex

创建page storeIndex

修改storeIndex.xml

登录成功后跳转到storeIndex

修改login.js

if (status == 200) {
wx.showToast({
title: '成功',
});
wx.navigateTo({
url: '../storeIndex/storeIndex',
})

day05:微信支付

  1. 复习

Wx.request({

url:url

success:function(response)

{

Var serverReturndata=response.data;

}

})

断点:

  1. 移出断点

  2. 以断点方式启动

  3. 在那加断点

a.在入口处加断点

b.在所有关键的方法第一行加断点

     4.四个按键

c.F6:下一行

d.F5:进入

e.F7:返回

f.F8:当前断点不跟了,执行到新断点,停下来

2.微信

py-21-Android_第103张图片

1.tabBar

  1. 创建消息

创建目录message

创建page message

2.创建我

创建目录me

创建page me

3.app.json中添加tabbar

"tabBar": {
"color": "#000000",
"selectedColor": "#FF670c",
"list": [
{
"pagePath": "pages/storeIndex/storeIndex",
"text": "首页",
"iconPath": "images/ic_tab_index_normal.png",
"selectedIconPath": "images/ic_tab_index_selected.png"
},
{
"pagePath": "pages/message/message",
"text": "消息",
"iconPath": "images/ic_tab_msg_normal.png",
"selectedIconPath": "images/ic_tab_msg_selected.png"
},
{
"pagePath": "pages/me/me",
"text": "我",
"iconPath": "images/ic_tab_me_normal.png",
"selectedIconPath": "images/ic_tab_me_selected.png"
}
]
}

4.修改login.js

跳到带有tabBar的界面必须用wx.switchTab

// wx.navigateTo({
//   url: '../storeIndex/storeIndex',
// })
wx.switchTab({
url: '../storeIndex/storeIndex',
})

2.保存数据

登录成功后添加

login:function()
{
var page=this;

wx.request({
url: url,
success:function(response){
var serverReturnData=response.data;
if (serverReturnData.status==200)
{
//保存数据
wx.setStorageSync("user", page.data.username);
}

在storage中查看保存的数据

py-21-Android_第104张图片

Index.js中判断有没有用户名,如果有直接跳转到storeIndex.

onReady: function() {
var username = wx.getStorageSync("user");
console.log("username=" + username)
setTimeout(function() {
if (username) {
wx.switchTab({
url: '../storeIndex/storeIndex',
})
} else {
wx.navigateTo({
url: '../login/login',
})
}
}, 3000);
},

3.支付

py-21-Android_第105张图片

py-21-Android_第106张图片

  1. import jt-dubbo-payment

  2. 在server窗口中把jt-dubbo-payment部署到 tocmt,访问path必须改成/

  3. 单独测试

http://10.1.6.102/yibao/submitOrder.html?id=88992115533355

    4.启京淘

    5.修改order.js 5777行

py-21-Android_第107张图片

    6.Order-cart.jsp改version=2

4.Uml

5.Svn

py-21-Android_第108张图片

移动端课前资料\software\VisualSVN\ VisualSVN-Server-2.5.4.msi

6.开发流程

软件企业分信息化企业和互联网企业

3.组建团队

4.需求

5.功能性需求

IBM

6.非功能性需求

由程序员实现

性能

安全

分布式

5.框架设计

子系统划分

py-21-Android_第109张图片

选框架

Mysql/oracle/sqlserver

springMvc/struts

mybatis/hibernate

6.详细设计

把子系统再细化

类图

7.编码

svn

8.测试

9.上线

Docker,linux

10.运维

监控服务器的cpu,内存

查看异常信息

py-21-Android_第110张图片

互联网企业:快


作者:Darren

QQ:603026148

以上内容归Darren所有,如果有什么错误或者不足的地方请联系我,希望我们共同进步。

你可能感兴趣的:(android,java,apache)