经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » 微信小程序 » 查看文章
taro开发微信小程序的实践
来源:jb51  时间:2019/5/22 8:31:17  对本文有异议

在京东凹凸实验室开发Taro跨平台早期之前,就已经进行Taro尝鲜了。开发这个实例 猫眼电影 已经过去几个月了。案例部分使用的是猫眼电影真实线上接口,关于订座的座位数据是自己模拟实现的,案例只供参考学习。

开发环境

操作系统:Window 10
Taro版本:v0.0.69
Node版本:v8.11.1
github地址: https://github.com/Harhao/miniProgram

运行效果

 

目录分析

src 是主要的开发目录,各个文件实现功能如下所示:

  1. ├─.idea
  2. └─libraries
  3. ├─.temp
  4. ├─config
  5. └─src
  6. ├─assets
  7. └─images
  8. ├─components (公用组件)
  9. ├─Brandbar
  10. ├─Selectbar
  11. ├─Specialbar
  12. └─Toptab(电影详情分类)
  13. └─pages
  14. | ├─cinema(影院列表)
  15. | ├─cinemaDetail(影院详情页)
  16. | ├─content(电影介绍)
  17. | ├─detail(电影详情页)
  18. | ├─map(影院地图定位页)
  19. | ├─movies(电影列表页)
  20. | ├─order(电影票订单页)
  21. | ├─person(用户登录页)
  22. | ├─position(地理位置选择页)
  23. | ├─search(电影/影院搜索页)
  24. | ├─seat(影院座位页)
  25. | └─user(用户中心)
  26. |__app.js(入口配置文件)
  27. |__app.scss
  28. |__index.html

入口配置文件 app.js 分析

Movies 列表页是微信小程序的首页,下面代码中config配置的是小程序中所有使用的页面定义路由。下面重点介绍几个比较重要的关键点微信小程序页。

  1. import Taro, { Component } from "@tarojs/taro";
  2. import Movies from "./pages/movies/movies";
  3. import "./app.scss";
  4. class App extends Component {
  5. config = {
  6. //访问路由文件定义
  7. pages: [
  8. "pages/movies/movies",
  9. "pages/person/person",
  10. "pages/cinema/cinema",
  11. "pages/position/position",
  12. "pages/search/search",
  13. "pages/detail/detail",
  14. "pages/content/content",
  15. "pages/cinemaDetail/cinemaDetail",
  16. "pages/map/map",
  17. "pages/seat/seat",
  18. "pages/user/user",
  19. "pages/order/order"
  20. ],
  21. //小程序顶部设置
  22. window: {
  23. backgroundTextStyle: "light",
  24. navigationBarBackgroundColor: "#e54847",
  25. navigationBarTitleText: "猫眼电影",
  26. navigationBarTextStyle: "white",
  27. enablePullDownRefresh: true
  28. },
  29. //底部tab导航栏配置
  30. tabBar: {
  31. color: "#333",
  32. selectedColor: "#f03d37",
  33. backgroundColor: "#fff",
  34. borderStyle: "black",
  35. list: [
  36. {
  37. pagePath: "pages/movies/movies",
  38. text: "电影",
  39. iconPath: "./assets/images/index.png",
  40. selectedIconPath: "./assets/images/index_focus.png"
  41. },
  42. {
  43. pagePath: "pages/cinema/cinema",
  44. text: "影院",
  45. iconPath: "./assets/images/themeOld.png",
  46. selectedIconPath: "./assets/images/theme.png"
  47. },
  48. {
  49. pagePath: "pages/person/person",
  50. text: "我的",
  51. iconPath: "./assets/images/person.png",
  52. selectedIconPath: "./assets/images/personSelect.png"
  53. }
  54. ]
  55. }
  56. };
  57. render() {
  58. // Movies小程序入口文件
  59. return <Movies />;
  60. }
  61. }
  62.  
  63. Taro.render(<App />, document.getElementById("app"));

Movies 电影列表页

getCities() 是获取当前定位的城市的路由,因为在猫眼电影小程序抓包中没有抓取到获取当前定位的地址接口,所以在猫眼电影H5端获取到了所有城市的数据。之前用了 easyMock 模拟数据接口,现在不能使用了。不过现在在微信小程序的云开发,可以把数据模拟上去。其中TopTab是正在热映和即将上映的两个分类总的组件。

  1. // movies页
  2. export default class Movies extends Component {
  3. config = {
  4. navigationBarTitleText: "猫眼电影"
  5. };
  6. constructor(props) {
  7. super(props);
  8. }
  9. componentDidMount() {
  10. this.getCities();
  11. }
  12. getCities() {
  13. Taro.request({
  14. url:
  15. "https://www.easy-mock.com/mock/5ba0a7f92e49497b37162e32/example_copy/cities_copy_1541385673090",
  16. method: "GET",
  17. header: {
  18. Accept: "application/json, */*",
  19. "Content-Type": "application/json"
  20. }
  21. }).then(res => {
  22. if (res.statusCode == 200) {
  23. let data = res.data.data.data.data;
  24. Taro.setStorageSync("cities", data);
  25. }
  26. });
  27. }
  28. render() {
  29. return (
  30. <View className="movies">
  31. <Toptab />
  32. </View>
  33. );
  34. }
  35. }

Toptab分类页

其中即将上映和正在热映,做了一个tab组件主要重点的代码是:

  1. <View className="tabItemContent" hidden={this.state.currentNavtab === 0?false:true}>
  2. <!-- 正在热映情况-->
  3. </View>
  4. <View className="tabItemContent" hidden={this.state.currentNavtab === 1?false:true}>
  5. <!--即将上映情况-->
  6. </View>

其中 currentNavTab 控制即将上映和正在热映的 section 显隐, hidden 是taro官方案例提供的推荐实现tab标签组件的方式。使用其他方法亦可。该页主要实现电影列表的影评价和推荐指数,价格等。微信小程序中基本所有接口都依赖于 cityId ,也就是在 movies 页获取定位地址。下面 getMoviesOnList 是获取真实线上猫眼电影的接口,需要伪造请求 header

  1. getMoviesOnList(){
  2. let cityId = this.state.id
  3. Taro.showLoading({
  4. title:"加载中"
  5. });
  6. Taro.request({
  7. url:"https://m.maoyan.com/ajax/movieOnInfoList?token=",
  8. method:"GET",
  9. header:{
  10. "Cookie":`_lxsdk_cuid=164b6cae2cac8-02b7b032f571b5-39614706-1fa400-164b6cae2cbc8; v=3; iuuid=1A6E888B4A4B29B16FBA1299108DBE9CA19FF6972813B39CA13A8D9705187374; revrev=76338a29; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; webp=true; __mta=3463951.1532075108184.1533098338076.1533118040602.20; _lxsdk=1A6E888B4A4B29B16FBA1299108DBE9CA19FF6972813B39CA13A8D9705187374; from=canary; selectci=true; __mta=3463951.1532075108184.1533118040602.1533118773295.21; _lxsdk_s=164f4f4c9e9-45e-d1b-46%7C%7C50; ci=${cityId}`
  11. }
  12. }).then(res=>{
  13. if(res.statusCode == 200){
  14. Taro.hideLoading();
  15. res.data.movieList.forEach((value)=>{
  16. let arr = value["img"].split("w.h");
  17. value["img"] = arr[0]+"128.180"+ arr[1]
  18. });
  19. this.setState({
  20. onList:res.data.movieList,
  21. startIndex:res.data.movieList.length,
  22. lastIndex:res.data.total -1,
  23. movieIds:res.data.movieIds
  24. });
  25. }else{
  26. this.setState({
  27. onList:null,
  28. movieIds:null
  29. })
  30. }
  31. })
  32. }

seat (影院座位页)

自己模拟实现了一个推荐座位与选座功能。为了实现座位信息选择,使用了二维数组对座位信息已选和未选,其中0代表该处拥有座位、E代表该处为空。其中数组的行代表了影院的第几排,嵌套的数组的索引代表了第几列。

  1. [
  2. [0,0,0,0,0,0],
  3. [E,0,0,E,0,0],
  4. [0,0,0,0,0,0],
  5. [E,0,0,E,0,0]
  6. ]

初始化座位信息, https://m.maoyan.com/ajax/seatingPlan?timestamp=${Date.now()} 获取猫眼电影线上座位信息接口, cityId 是当前定位城市ID, ci 是影院ID。 initParams 是获取线上座位信息接口, seatData 是获取到的影院座位信息,需要对座位信息做进一步的加工。遍历座位信息,如果字段 st 为N,则arr设置为0(代表具有座位并未选),为E则为该处不具有座位。

  1. initParams(){
  2. const params = this.$router.params;
  3. const self = this;
  4. Taro.setNavigationBarTitle({
  5. title:params.cinemaName
  6. })
  7. Taro.showLoading({
  8. title:"加载中..."
  9. });
  10. Taro.request({
  11. url:`https://m.maoyan.com/ajax/seatingPlan?timestamp=${Date.now()}`,
  12. method:'post',
  13. header:{
  14. 'Cookie': 'uuid_n_v=v1; iuuid=26F6BA50506A11E9A973FDD3C7EBDF0E29C7297EC72D4F77A53F9445EF0EE9F3; webp=true; ci=20%2C%E5%B9%BF%E5%B7%9E; _lxsdk_cuid=169be42cf28c8-098c7e821e63bd-2d604637-3d10d-169be42cf29c8; _lxsdk=26F6BA50506A11E9A973FDD3C7EBDF0E29C7297EC72D4F77A53F9445EF0EE9F3; from=canary; uid=124265875; token=9P1-5VoykD_qrpBxpTvSoVhMwzQAAAAAJwgAAE2za6eVZdI-oORrTHb8dP4JEMYCiza0zSSNoRkHx4qajm2Nu6ClhU00u5A1avIySg; __mta=250960825.1553675243337.1553675275840.1553675275842.6; user=124265875%2C9P1-5VoykD_qrpBxpTvSoVhMwzQAAAAAJwgAAE2za6eVZdI-oORrTHb8dP4JEMYCiza0zSSNoRkHx4qajm2Nu6ClhU00u5A1avIySg; _lxsdk_s=169be42cf2b-ca7-4ca-570%7C%7C14'
  15. },
  16. data:{
  17. cityId:params.cityId,
  18. ci:params.ci,
  19. seqNo:params.seqNo
  20. }
  21. }).then(res=>{
  22. if(res.statusCode ==200){
  23. Taro.hideLoading();
  24. const seatData = res.data.seatData;
  25. const seatArray = [];
  26. seatData.seat.sections[0].seats.map(item=>{
  27. let arr = [];
  28. item["columns"].map(seat=>{
  29. if(seat["st"] == "N"){
  30. arr.push('0');
  31. }else{
  32. arr.push('E')
  33. }
  34. })
  35. seatArray.push(arr);
  36. })
  37. self.setState({
  38. seatData:seatData,
  39. seatArray:seatArray
  40. });
  41. }
  42. })
  43. }

做了影院座位信息是否为空筛选之后,接下来就是选座功能。其中影院座位的选择与取消使用了 buySeat 进行保存。 selectSeat 函数是选择座位, row :代表选择第几行, column 代表第几列, item 是该座位是否被选的信息(0为未选表示可选择、2为已选表示不可再选)

  1. selectSeat(row,column,item){
  2. const self = this;
  3. const arr = this.state.seatArray;
  4. // item代表该座位是否可选
  5. if(item == 0){
  6. if(self.state.buySeat.length ==4){
  7. Taro.showToast({
  8. title: '最多选择4个座位',
  9. duration: 2000
  10. })
  11. return false;
  12. }else{
  13. let buySeat = self.state.buySeat;
  14. arr[row][column]= '2';
  15. buySeat.push({
  16. "row":row,
  17. "column":column
  18. });
  19. self.setState({
  20. buySeat:buySeat,
  21. seatArray:arr
  22. })
  23. }
  24. }else{
  25. arr[row][column]= '0';
  26. const buySeat = this.state.buySeat;
  27. let tmpArr = this.state.buySeat;
  28. buySeat.map((value,index)=>{
  29. if(value["row"]== row && value["column"]== column){
  30. tmpArr.splice(index,1);
  31. self.setState({
  32. buySeat:tmpArr,
  33. seatArray:arr
  34. })
  35. }
  36. })
  37. }
  38. }

推荐座位功能实现, getRecomment 是推荐位实现,现在至于1人、2人、3人、4人推荐。情侣位实现没有抓取到猫眼的推荐接口信息。

  1. selectAll(seats){
  2. const self = this;
  3. seats.map(item=>{
  4. let row = parseInt(item.rowId.split('0')[0]);
  5. let column = parseInt(item.columnId.split('0')[0]);
  6. let itemIndex = self.state.seatArray[row][column];
  7. self.selectSeat(row,column,itemIndex);
  8. })
  9.  
  10. }
  11. getRecomment(recomment,num){
  12. switch(num){
  13. case 1:this.selectAll(recomment.bestOne.seats);break;
  14. case 2:this.selectAll(recomment.bestTwo.seats);break;
  15. case 3:this.selectAll(recomment.bestThree.seats);break;
  16. case 4:this.selectAll(recomment.bestFour.seats);break;
  17. }
  18. }

content电影详情页

电影详情是一部电影简略介绍。主要实现了,电影主要简略描述和预告片的播放关闭,实现比较简单。 getDetailData 是获取电影详情数据接口。其中获取到img路径直接获取不到图片数据,需要对路径进行改写,如下代码所示:

  1. getDetailData(){
  2. Taro.showLoading({
  3. title:"加载中"
  4. });
  5. Taro.request({
  6. url:`https://m.maoyan.com/ajax/detailmovie?movieId=${this.state.params.id}`
  7. }).then(res=>{
  8. if(res.statusCode == 200){
  9. Taro.hideLoading();
  10. let data = res.data.detailMovie;
  11. let arr = data["img"].split("w.h");
  12. data["img"] = arr[0]+"128.180"+ arr[1];
  13. for(let index in data.photos){
  14. let photo = data.photos[index];
  15. let arr = photo.split('w.h');
  16. data.photos[index] = arr[0]+'180.140'+arr[1];
  17. }
  18. this.setState({
  19. detailMovie:data
  20. });
  21. }
  22. }).catch(err=>{
  23. console.log(err.message);
  24. })
  25. }

在今天这个充满恋爱酸臭味日子,满怀期待地水完这篇短文。如果觉得喜欢的话,可不可以给我new个对象。说错了,应该是new个star~。

github地址: https://github.com/Harhao/miniProgram

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号