商业级项目——基金客户端的架构设计与开发(下)(附源码)
2023-09-27 14:27:56 时间
#项目简介
上一次的博文中详细分析了基金项目的整体架构和主界面的UI设计。今天分享地方是剩下的3个页面及相应功能的实现。#个人中心
个人中心界面,最开始会跳转到一个登陆界面,用户可以通过选择“身份证、基金账户、护照、户口本“,然后输入相应的账号和密码进行登陆。在这个界面中,还具有相应的记住密码,忘记密码功能。不输入是不允许进入账户的,当正确输入相应的账号密码后,通过和后台服务器进行验证
#项目简介
上一次的博文中详细分析了基金项目的整体架构和主界面的UI设计。今天分享地方是剩下的3个页面及相应功能的实现。
#个人中心
个人中心界面,最开始会跳转到一个登陆界面,用户可以通过选择“身份证、基金账户、护照、户口本“,然后输入相应的账号和密码进行登陆。在这个界面中,还具有相应的记住密码,忘记密码功能。不输入是不允许进入账户的,当正确输入相应的账号密码后,通过和后台服务器进行验证登陆,登陆进去之后是一个账户详情页,有持仓查询、盈亏查询、交易查询等功能,在持仓查询中hi有总资产,活期宝、今年收益的详细信息。在下面通过一个listview展示自己已买基金的名称、收益率、代号等信息。
#交易界面
#帮助界面
最后一个节目就是一个帮助界面了,这里有消息中心、帮助、意见反馈、关于我们。当点击拨打客服电话后,会跳转到电话拨打界面。
#异步任务类
我们都知道,在安卓的应用开发中,子线程是不能直接操作主线程的,所以,如果有耗时操作 又或者是密集操作,就只能放在子线程中去处理,但是,如果处理后的结果需要更改UI的显示内容,这时候,就只能使用handler或AsyncTask进行处理。
AsyncTask是一个异步任务类,可以很容易在子线程中处理耗时操作。里面包含三个泛型参数params、progress、result,分别表示:
1.params:在执行asynctack时需要传入的参数,可用于后台任务中使用。
2.progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
3.result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
一个简单的泛型类如下:
数据库是一个非常重要的知识点,这里主要是分享一个这个基金中的数据库,这个数据库是一个小型的轻量级的数据库,
关于分投趣质押模式开发系统搭建原理 存储在链上的数据未以可以有效或轻松地被Dapp使用的格式注册。为了做到这一点,数据需要被索引和组织以进行高效检索。
区块链股权交易系统开发技术应用(源码案例演示) 网络中的许多重要数据都可以通过区块链进行存储和访问,区块链的去中心化可以更好地防止黑客入侵。这使得区块链成为了一项安全便捷的信息交易工具,随着对区块链研究的不断深入,区块链技术也被应用到更多的领域中去。 区块链中的每个参与维护节点都可以获得完整的数据记录,利用区块链的可靠和集体维护特性,可以确认股权所有者的权利。区块链是存储永久记录的理想解决方案,适用于土地所有权和股权交易等场景。
中小企业如何实现在家研发软件?看这个就够了 为降低中小企业的采购成本,云效推出中小企业扶植计划,30 人以下研发团队可以免费使用云效全部功能。在即将正式开工之际,我们特别整理这份《在线协同研发指南》,希望将先进的软件研发经验和工具分享给中小企业,让开发者在家也能安全高效地研发软件。
朱培 CSDN博客专家,大数据与云计算领域,常年活跃于Github、CSDN、开源中国等开源社区。
#项目简介
上一次的博文中详细分析了基金项目的整体架构和主界面的UI设计。今天分享地方是剩下的3个页面及相应功能的实现。
#个人中心
个人中心界面,最开始会跳转到一个登陆界面,用户可以通过选择“身份证、基金账户、护照、户口本“,然后输入相应的账号和密码进行登陆。在这个界面中,还具有相应的记住密码,忘记密码功能。不输入是不允许进入账户的,当正确输入相应的账号密码后,通过和后台服务器进行验证登陆,登陆进去之后是一个账户详情页,有持仓查询、盈亏查询、交易查询等功能,在持仓查询中hi有总资产,活期宝、今年收益的详细信息。在下面通过一个listview展示自己已买基金的名称、收益率、代号等信息。
#交易界面
在这个页面中,若用户未登录,则在该页面最上方会提示:您还未登录”同时在右上角会有一个登陆按钮,通过点击该按钮可跳转至登陆页面。在交易页面,有充值、快速提现、查询等操作。
private class MySpinnerAdapter extends BaseAdapter implements SpinnerAdapter { @Override public int getCount() { return mListData.size(); @Override public Object getItem(int position) { return mListData.get(position); @Override public long getItemId(int position) { return position; @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.my_simple_spinner_item_recharge, null); TextView view = (TextView) convertView .findViewById(R.id.recharge_spinner_view); view.setText(mListData.get(position).getName()); if (mListData.get(position).getSupport_withhold() == 1) { view.setEnabled(true); } else { view.setEnabled(false); return convertView; @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.my_simple_spinner_dropdown_item_recharge, null); CheckedTextView view = (CheckedTextView) convertView.findViewById(R.id.recharge_spinner_item); view.setText(mListData.get(position).getName()); if (mListData.get(position).getSupport_withhold() == 1) { view.setEnabled(true); view.setCompoundDrawablesWithIntrinsicBounds(null, null, getResources().getDrawable(R.drawable.icon_withhold), null); } else { view.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); view.setEnabled(false); return convertView; }
#帮助界面
最后一个节目就是一个帮助界面了,这里有消息中心、帮助、意见反馈、关于我们。当点击拨打客服电话后,会跳转到电话拨打界面。
/** * 获取帮助消息 private Handler getHelpsHandler = new Handler() { public void handleMessage(Message msg) { dismissProgressDialog(); switch (msg.what) { case BaseHandlerUI.TASK_NOTIFY_RETURN_DATA: if (msg.obj != null) { try { bean = (GetHelpsResultBean) msg.obj; if (bean.state.equals("0")) { mDatabaseAdapter.open_fund(); mDatabaseAdapter.deleteAllHelpsData(); List TreeViewAdapter.TreeNode treeNode = adapter.GetTreeNode(); treeNode.clear(); for (int i = 0; i bean.list.size(); i++) { mDatabaseAdapter.insertHelpsData(bean.list.get(i).ask, bean.list.get(i).reply); TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode(); node.parent = bean.list.get(i).ask; for (int ii = 0; ii 1; ii++) { node.childs.add(bean.list.get(i).reply); treeNode.add(node); adapter.UpdateTreeNode(treeNode); expandableList.setAdapter(adapter); mDatabaseAdapter.close_funds(); } catch (Exception e) { e.printStackTrace(); } else { break;
#异步任务类
我们都知道,在安卓的应用开发中,子线程是不能直接操作主线程的,所以,如果有耗时操作 又或者是密集操作,就只能放在子线程中去处理,但是,如果处理后的结果需要更改UI的显示内容,这时候,就只能使用handler或AsyncTask进行处理。
AsyncTask是一个异步任务类,可以很容易在子线程中处理耗时操作。里面包含三个泛型参数params、progress、result,分别表示:
1.params:在执行asynctack时需要传入的参数,可用于后台任务中使用。
2.progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
3.result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
一个简单的泛型类如下:
span class DownloadTask extends AsyncTask Void,Integer,Boolean {} /span
public HttpRequestAsyncTask(HttpRequestInfo request, TaskListener listener, Context context) { this.context = context; request.putParam("device_info", ConfigUtil.getImei(context)) .putParam("app_version", ConfigUtil.getVersionName(context)) .putParam("market", context.getString(R.string.channel_str)); mListener = listener; mRequest = request; public HttpRequestAsyncTask(HttpRequestInfo request, TaskListenerWithState taskListenerWithState, Context context) { this.context = context; request.putParam("device_info", ConfigUtil.getImei(context)) .putParam("app_version", ConfigUtil.getVersionName(context)) .putParam("market", context.getString(R.string.channel_str)); mListenerWithState = taskListenerWithState; mRequest = request; @Override protected HttpResponseInfo doInBackground(Void... params) { if (!ConfigUtil.isConnect(context)) { return new HttpResponseInfo(null, HttpTaskState.STATE_NO_NETWORK_CONNECT); try { if (mRequest != null) { if (mRequest.getRequestID() == -2) { return new HttpResponseInfo( HttpManager.postHttpRequest(mRequest), HttpTaskState.STATE_OK); return new HttpResponseInfo( HttpManager.postHttpsRequest(mRequest), HttpTaskState.STATE_OK); } catch (SocketTimeoutException e) { e.printStackTrace(); return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK); } catch (UnknownHostException e) { e.printStackTrace(); return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK); } catch (Exception e) { e.printStackTrace(); return new HttpResponseInfo("{\"result\":\"3\"}", HttpTaskState.STATE_OK); return null;
#HTTP编程
Http编程有请求和响应,这里我们把对json数据年度解析放到这一部分来讲解:
/** * Http 请求 public class HttpRequestInfo { public static final String TAG = "HttpRequestInfo"; /* Http 请求的 URL */ private String requestUrl; private int requestID; private Map String, String requestParams; public HttpRequestInfo(String url) { this.setRequestUrl(url); requestParams = new HashMap String, String (); public HttpRequestInfo(String url, Map String, String params) { this.setRequestUrl(url); this.setRequestParams(params); public String getRequestUrl() { return requestUrl; public void setRequestUrl(String requestUrl) { this.requestUrl = requestUrl; public Map String, String getRequestParams() { return requestParams; public void setRequestParams(Map String, String requestParams) { this.requestParams = requestParams; public String getParamsStr() { String str = ""; if (requestParams != null) { for (Entry String, String entry : requestParams.entrySet()) { String key = entry.getKey(); String val = entry.getValue(); key = URLEncoder.encode(key); val = URLEncoder.encode(val); str += key + "=" + val + " "; if (str.equals("")) { return null; LogUtil.i(TAG, this.requestUrl + str); return str; public HttpRequestInfo putParam(String key, String value) { this.requestParams.put(key, value); return this; public int getRequestID() { return requestID; public void setRequestID(int requestID) { this.requestID = requestID; }对于响应:
/** * Http 响应 public class HttpResponseInfo { public enum HttpTaskState { STATE_OK, STATE_NO_NETWORK_CONNECT, STATE_TIME_OUT, STATE_UNKNOWN, public HttpResponseInfo(String result, HttpTaskState state) { this.result = result; this.state = state; private HttpTaskState state; private String result; public HttpTaskState getState() { return state; public void setState(HttpTaskState state) { this.state = state; public String getResult() { return result; public void setResult(String result) { this.result = result; }
数据库是一个非常重要的知识点,这里主要是分享一个这个基金中的数据库,这个数据库是一个小型的轻量级的数据库,
SQLiteOpenHelper有onCreate()、onUpgrade()两个方法。
private static class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, DB_NAME, null, version); @Override public void onCreate(SQLiteDatabase db) { //创建所有数据库表 db.execSQL(DB_CREATE_FUND); db.execSQL(DB_CREATE_FAV_FUND); db.execSQL(DB_CREATE_HELPS_INFO); db.execSQL(DB_CREATE_FUND_DETAIL); db.execSQL(DB_CREATE_MSG); // 更新基金数据 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_FUND); db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE_FAV_FUND); db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_HELPS_INFO); db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_FUND_DETAIL); db.execSQL("DROP TABLE IF EXISTS " + DB_CREATE_MSG); onCreate(db);
当然了,仅仅通过一篇博文是不可逆完全完整的说完整个项目了,这里写的仅仅是冰山一角,更多的内容还是希望读者自己去发现并学到里面的精华部分!当然咯,我相信有一部分人读了也基本上没看懂我写的是什么,那么请下载源码看看,互相学习咯!
源码下载地址:http://download.csdn.net/detail/sdksdk0/9461193
关于分投趣质押模式开发系统搭建原理 存储在链上的数据未以可以有效或轻松地被Dapp使用的格式注册。为了做到这一点,数据需要被索引和组织以进行高效检索。
区块链股权交易系统开发技术应用(源码案例演示) 网络中的许多重要数据都可以通过区块链进行存储和访问,区块链的去中心化可以更好地防止黑客入侵。这使得区块链成为了一项安全便捷的信息交易工具,随着对区块链研究的不断深入,区块链技术也被应用到更多的领域中去。 区块链中的每个参与维护节点都可以获得完整的数据记录,利用区块链的可靠和集体维护特性,可以确认股权所有者的权利。区块链是存储永久记录的理想解决方案,适用于土地所有权和股权交易等场景。
中小企业如何实现在家研发软件?看这个就够了 为降低中小企业的采购成本,云效推出中小企业扶植计划,30 人以下研发团队可以免费使用云效全部功能。在即将正式开工之际,我们特别整理这份《在线协同研发指南》,希望将先进的软件研发经验和工具分享给中小企业,让开发者在家也能安全高效地研发软件。
朱培 CSDN博客专家,大数据与云计算领域,常年活跃于Github、CSDN、开源中国等开源社区。
相关文章
- 你需要同款“Unreal项目自动化编译、打包和部署”方案吗?
- 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
- PMBOK泛读(第十三章) - 项目相关方管理
- PMBOK泛读(第六章) - 项目进度管理
- Tesseract-ocr 3.0.2源码 + VS2010项目工程 + 简单测试代码
- Xamarin.Forms项目无法添加服务引用
- 《Android 源码设计模式解析与实战》——第1章,第1.4节让项目拥有变化的能力——依赖倒置原则
- Maven自定义绑定插件目标:创建项目的源码jar
- 在eclipse中进行Struts2项目的配置
- 知识图谱问答的新基准QALD-9-Plus,以及基准测试旨在解决的多语言问题(项目含源码)
- iOS 精品项目之任务管理App基于Realm、SnapKit、UIKit、FSCalendar(教程含源码)
- SwiftUI 绘图类精品项目大全之使用 SwiftUI 开发所见即所得的绘图应用程序 (教程含源码)
- iOS Swift 人工智能相机完成项目之宠物自动拍摄APP基于机器视觉(项目含源码)
- SwiftUI 精品项目之 电影管理和播放App(教程含源码)
- SwiftUI iOS 完整项目之答题闯关类网络数据请求App(教程含源码)
- SwiftUI iOS 精品开源项目之 02 完整播客Podcast采用网络类项目Alamofire Feedkit SQLite (教程含源码)
- Flutter macOS 教程之 02 手动安装macos_ui 如何添加macos_ui到您的历史项目pubspec.yaml文件 (教程含源码)
- macOS Swift精品项目之查找图像的主色App 使用CIE LAB颜色空间和k-means聚类算法(教程含源码)
- SwiftUI 完整精品管理类项目之实现List分类filter海洋生物管理 (教程含源码)
- SwiftUI SQLite 教程之 构建App本地数据库实现创建、读取、更新和删除(教程含完成项目源码)
- 一次不成功的风投见面会(中期项目,则需要有良好的财务构成,以及合适的风投退出方式)
- 基于Python的租房数据分析和房屋租赁爬虫 | 项目案例 | 大学生计算机专业毕业 | 毕业设计
- 针对【create-nuxt-app新版本v3.2.0】构建项目时没有server配置以及运行后弹出收集匿名数据选项等问题的解决方法
- Unity即时战略/塔防项目实战(一)——构造网格建造系统
- 通过APScheduler使用定时任务对openstack的VM虚拟机和计算节点compute node 分别进行cpu、memory、traffic资源统计项目实战及实现源码(五)