关键业务
添加一个新版本,默认是关闭发布的状态,如果填写的内容有误,可以进行修改删除
发布版本是很严谨的,一旦发布版本,就不能关闭
app端点击更新按钮时, 更新到已发布版本的最新版

CREATE TABLE `tb_version` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`version` varchar(50) DEFAULT NULL COMMENT '版本号',`picture_path` text COMMENT '图片路径',`download_path` text COMMENT '更新包地址',`download_type` int(2) DEFAULT NULL COMMENT '下载地址的类型 1上传应用 2填写外部链接',`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '修改时间',`release_time` datetime DEFAULT NULL COMMENT '发布时间',`is_release` int(2) DEFAULT NULL COMMENT '是否发布 0关闭 1开启',`is_delete` int(2) DEFAULT '0' COMMENT '是否删除 1删除 0未删除',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `index_version` (`version`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='版本信息';
CREATE TABLE `tb_version_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`version_id` bigint(20) NOT NULL COMMENT '版本ID',`introduction` varchar(255) DEFAULT NULL COMMENT '版本内容',`order_num` int(11) DEFAULT NULL COMMENT '顺序号',`is_delete` int(2) DEFAULT '0' COMMENT '是否删除 1删除 0未删除',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='版本详情';

后台管理系统
VersionController.java

import com.yymt.common.annotation.Login;
import com.yymt.common.constants.VersionConstant;
import com.yymt.common.utils.BigDataUtil;
import com.yymt.common.utils.ConvertUtil;
import com.yymt.common.utils.R;
import com.yymt.dao.sys.VersionInfoDao;
import com.yymt.entity.sys.VersionEntity;
import com.yymt.modules.controller.base.BaseController;
import com.yymt.service.sys.VersionInfoService;
import com.yymt.service.sys.VersionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.Date;
import java.util.List;
import java.util.Map;/*** 版本信息*/
@RestController
@RequestMapping("version")
@Api(tags = "版本信息")
public class VersionController extends BaseController {@Autowiredprivate VersionService versionService;@Autowiredprivate VersionInfoService versionInfoService;@AutowiredVersionInfoDao versionInfoDao;@PostMapping("/save")@ApiOperation(value = "保存")@Loginpublic R save(@ApiParam("参数说明 " +"version:版本号,introduction:更新内容(必须传数组格式),picturePath:图片路径(必须传数组格式), " +"downloadPath:下载链接, downloadType:下载链接的类型(1上传应用 2填写外部链接)")@RequestBody Map<String, Object> params) {return versionService.saveData(params);}@PostMapping("/updateReleaseStatus/{id}")@ApiOperation(value = "开启发布")@Loginpublic R updateReleaseStatus(@PathVariable("id") Long id){VersionEntity versionEntity = versionService.selectById(id);if (versionEntity == null) {return R.error("该版本不存在");}if (VersionConstant.VERSION_RELEASE_OPEN == versionEntity.getIsRelease()) {return R.error("已发布版本不能关闭!!");}versionEntity.setIsRelease(VersionConstant.VERSION_RELEASE_OPEN);versionEntity.setReleaseTime(new Date());versionService.updateById(versionEntity);return R.ok();}@PostMapping("/list")@ApiOperation(value = "列表")@Loginpublic R list(@ApiParam(value = "参数说明 titleKeyword:关键词,pageSize:个数,currPage:当前页")@RequestBody Map<String, Object> params) {return versionService.queryPageData(params, getTopUrl());}@PostMapping("/info/{id}")@ApiOperation(value = "信息")@Loginpublic R info(@PathVariable("id") Long id){VersionEntity version = versionService.selectById(id);if (version == null) {return R.error("该数据不存在");}return versionService.selectInfo(id, getTopUrl());}@PostMapping("/update")@ApiOperation(value = "修改")@Loginpublic R update(@ApiParam("参数说明 " +"version:版本号,introduction:更新内容(必须传数组格式),picturePath:图片路径(必须传数组格式), " +"downloadPath:下载链接, downloadType:下载链接的类型(1上传应用 2填写外部链接),id:版本ID(必填)")@RequestBody Map<String, Object> params) {Long id = ConvertUtil.parseLong(params.get("id"));VersionEntity versionEntity = versionService.selectById(id);if (versionEntity == null) {return R.error("id不能为空或者该id不存在");}// ###### 先删除, 后添加 #######versionService.deleteById(id);// 获取当前版本的所有版本更新内容List<Map<String, Object>> list = versionInfoDao.queryDataByVersionId(id);// 获取所有idList idList = BigDataUtil.getColumnValueToList(list, "id", 0);versionInfoService.deleteBatchIds(idList);return versionService.saveData(params);}@PostMapping("/delete/{id}")@ApiOperation(value = "删除")@Loginpublic R delete(@PathVariable("id") Long id){// 这里用物理删除, 不用逻辑删除, 避免版本号被占用versionService.deleteById(id);return R.ok();}
}

VersionService .java

import com.baomidou.mybatisplus.service.IService;
import com.yymt.common.utils.PageUtils;
import com.yymt.common.utils.R;
import com.yymt.entity.sys.VersionEntity;import java.util.List;
import java.util.Map;/*** 版本信息*/
public interface VersionService extends IService<VersionEntity> {PageUtils queryPage(Map<String, Object> params);/*** @Description: 最新版本信息*/List<Map<String, Object>> selectLastInfo();/*** @Description: 保存*/R saveData(Map<String, Object> params);/*** @Description: 列表*/R queryPageData(Map<String, Object> params, String topUrl);/*** @Description: 获取总记录数*/int queryCountData(Map<String, Object> params);/*** @Description: 信息*/R selectInfo(Long id, String topUrl);/*** @Description: 删除/批量删除*/R deleteData(List idList);/*** @Description: 当前版本信息*/List<Map<String, Object>> selectCurrentInfoByVersion(Map<String, Object> params);
}

VersionServiceImpl.java

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yymt.common.constants.DeleteSymble;
import com.yymt.common.constants.VersionConstant;
import com.yymt.common.utils.*;
import com.yymt.dao.sys.VersionDao;
import com.yymt.dao.sys.VersionInfoDao;
import com.yymt.entity.sys.VersionEntity;
import com.yymt.entity.sys.VersionInfoEntity;
import com.yymt.service.sys.VersionInfoService;
import com.yymt.service.sys.VersionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.*;@Service("versionService")
public class VersionServiceImpl extends ServiceImpl<VersionDao, VersionEntity> implements VersionService {@AutowiredVersionService versionService;@AutowiredVersionInfoService infoService;@AutowiredVersionInfoDao versionInfoDao;@Overridepublic PageUtils queryPage(Map<String, Object> params) {Page<VersionEntity> page = this.selectPage(new Query<VersionEntity>(params).getPage(),new EntityWrapper<VersionEntity>());return new PageUtils(page);}/*** @return com.yymt.common.utils.R* @Description: 最新版本信息*/@Overridepublic List<Map<String, Object>> selectLastInfo() {List<Map<String, Object>> list = baseMapper.selectLastInfo();List<Map<String, Object>> dataList = null;Map<String, Object> m = null;if (list != null && list.size() > 0) {m = list.get(0);dataList = new ArrayList<>();// 获取指定列的数据List introductionList = BigDataUtil.getColumnValueToList(list, "introduction", 0);m.put("introduction", introductionList);dataList.add(m);}return dataList;}/*** @param params* @return com.yymt.common.utils.R* @Description: 保存*/@Overridepublic R saveData(Map<String, Object> params) {String version = ConvertUtil.objToStrConverNull(params.get("version"));String introduction = ConvertUtil.objToStrConverNull(params.get("introduction"));String picturePath = ConvertUtil.objToStrConverNull(params.get("picturePath"));String downloadPath = ConvertUtil.objToStrConverNull(params.get("downloadPath"));Integer downloadType = ConvertUtil.parseInt(params.get("downloadType"));if (version == null) {return R.error("参数version不能为空");}if (introduction == null) {return R.error("参数introduction不能为空");}if (downloadPath == null) {return R.error("参数downloadPath不能为空");}if (VersionConstant.getMapVERSION_DOWNLOAD_TYPE(downloadType) == null) {return R.error("参数downloadType有误 0关闭 1开启");}// 版本号只能含数字和点, 新版本必须比旧版本更大, 版本号必须唯一, 不发布的版本最多只能有一个(版本更新要很严谨!)if (version != null) {  // 校验版本// 1.版本号只能含数字和点, 第一位不能为小数点String legalChar = "0123456789.";if (version.length() < 3 || !version.contains(".")) {return R.error("版本号长度必须大于等于3, 且要包含数字和点");}if (".".equals(version.substring(0, 1))) {return R.error("第一位不能为小数点, 必须是数字");}for (int i = 0; i < version.length(); i++) {if (i == version.length() - 1) {if (!legalChar.contains(version.substring(i))) {return R.error("版本号只能含数字和点");}} else {if (!legalChar.contains(version.substring(i, i + 1))) {return R.error("版本号只能含数字和点");}}}// 2.新版本必须比旧版本更大,版本号必须唯一// 获取最新的版本号List<Map<String, Object>> lastList = versionService.selectLastInfo();if (lastList != null && lastList.size() > 0) {String lastVersion = (String) lastList.get(0).get("version");int compareResult = PublicUtils.compareVersion(version, lastVersion);if (compareResult != 1) {return R.error("新版本号必须比旧版本号更大");}}VersionEntity entity = versionService.selectOne(new EntityWrapper<VersionEntity>().eq("version", version));if (entity != null) {return R.error("当前版本号已存在, 版本号必须唯一");}// 3.不发布的版本最多只能有一个(严谨一点)// 获取不发布的数量int count = baseMapper.queryCountNotReleaseData();if (count > 0) {return R.error("请先将那些尚未发布的版本发布后,在执行新增版本的操作");}}// 其他校验if ("[]".equals(picturePath)) {picturePath = null;}if (picturePath != null) {if (!picturePath.contains("[") || !picturePath.contains("]")) {return R.error("picturePath必须是数组格式");}}if (!introduction.contains("[") || !introduction.contains("]")) {return R.error("introduction版本更新内容必须是数组格式");}// 校验下载链接 (外部链接类型要校验, 附件上传类型不用校验)if (VersionConstant.VERSION_DOWNLOAD_TYPE_EXT_URL == downloadType) {if (!PublicUtils.isHttpUrl(downloadPath)) {return R.error("下载链接不合法,请输入正确的下载链接");}}// 添加一个新版本,默认是关闭发布的状态,如果填写的内容有误,可以进行修改删除// 默认值VersionEntity versionEntity = new VersionEntity();versionEntity.setCreateTime(new Date());versionEntity.setIsDelete(DeleteSymble.IS_NORMAL);versionEntity.setIsRelease(VersionConstant.VERSION_RELEASE_CLOSE);// 参数值versionEntity.setDownloadPath(downloadPath);versionEntity.setDownloadType(downloadType);versionEntity.setPicturePath(picturePath);versionEntity.setVersion(version);// 避免id已存在的情况try {versionService.insert(versionEntity);} catch (Exception e) {System.out.println("id = " + versionEntity.getId() + "被占用了...");// 获取当前最大的版本IDList<Map<String, Object>> maxList = baseMapper.queryMaxVersionId();Long maxId = (Long) maxList.get(0).get("id");versionEntity.setId(maxId + 1);versionService.insertAllColumn(versionEntity);}// 版本更新内容信息introduction = introduction.substring(1, introduction.length() - 1);String[] introArr = introduction.split(",");Long versionId = versionEntity.getId();for (int i = 0; i < introArr.length; i++) {VersionInfoEntity infoEntity = new VersionInfoEntity();infoEntity.setVersionId(versionId);infoEntity.setIsDelete(DeleteSymble.IS_NORMAL);infoEntity.setIntroduction(introArr[i]);infoEntity.setOrderNum(i + 1);infoService.insert(infoEntity);}return R.ok();}/*** @param params* @param topUrl* @return com.yymt.common.utils.R* @Description: 列表*/@Overridepublic R queryPageData(Map<String, Object> params, String topUrl) {params = ConvertUtil.getParams(params);params.put("isDel", DeleteSymble.IS_NORMAL);List<Map<String, Object>> list = baseMapper.queryPageData(params);// 处理下载链接 没前缀的添加前缀if (list != null && list.size() >0) {String downloadPath = "";Integer downloadType = 0;for (Map<String, Object> map : list) {downloadPath = ConvertUtil.objToStrConverSpace(map.get("downloadPath"));downloadType = ConvertUtil.parseInt(map.get("downloadType"));if (downloadType == VersionConstant.VERSION_DOWNLOAD_TYPE_UPLOAD) {downloadPath = topUrl + downloadPath;map.put("downloadPath", downloadPath);}}}// 获取总记录数int count = versionService.queryCountData(params);PageUtils page = ConvertUtil.getPageUtil(params, list, count);return R.ok().put("data", page);}/*** @param params* @return int* @Description: 获取总记录数*/@Overridepublic int queryCountData(Map<String, Object> params) {return baseMapper.queryCountData(params);}/*** @param id* @param topUrl* @return com.yymt.common.utils.R* @Description: 信息*/@Overridepublic R selectInfo(Long id, String topUrl) {VersionEntity versionEntity = versionService.selectById(id);// 获取当前版本的所有版本更新内容List<Map<String, Object>> list = versionInfoDao.queryDataByVersionId(id);// 获取指定列的数据List introductionList = BigDataUtil.getColumnValueToList(list, "introduction", 0);// 数据信息  po转mapMap<String, Object> map = EntityMapUtils.entityToMap(versionEntity);// 处理下载链接 没前缀的添加前缀String downloadPath = "";Integer downloadType = 0;downloadPath = ConvertUtil.objToStrConverSpace(map.get("downloadPath"));downloadType = ConvertUtil.parseInt(map.get("downloadType"));if (downloadType == VersionConstant.VERSION_DOWNLOAD_TYPE_UPLOAD) {downloadPath = topUrl + downloadPath;map.put("downloadPath", downloadPath);}// 字符串转数组String picturePath = ConvertUtil.objToStrConverNull(map.get("picturePath"));if (picturePath != null && picturePath.length() > 2) {picturePath = picturePath.substring(1, picturePath.length() - 1);String[] picArr = picturePath.split(",");map.put("picturePath", picArr);}map.put("introduction", introductionList);return R.ok().put("data", map);}/*** @param idList* @return com.yymt.common.utils.R* @Description: 删除/批量删除*/@Overridepublic R deleteData(List idList) {Map map = new HashMap();map.put("idList", idList);map.put("isDel", DeleteSymble.IS_DELETE);map.put("updateTime", new Date());baseMapper.deleteData(map);return R.ok();}/*** @param params* @return java.util.List<java.util.Map < java.lang.String, java.lang.Object>>* @Description: 当前版本信息*/@Overridepublic List<Map<String, Object>> selectCurrentInfoByVersion(Map<String, Object> params) {List<Map<String, Object>> list = baseMapper.selectCurrentInfoByVersion(params);List<Map<String, Object>> dataList = null;Map<String, Object> m = null;if (list != null && list.size() > 0) {m = list.get(0);dataList = new ArrayList<>();// 获取指定列的数据List introductionList = BigDataUtil.getColumnValueToList(list, "introduction", 0);m.put("introduction", introductionList);dataList.add(m);}return dataList;}
}

VersionDao.java

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.yymt.entity.sys.VersionEntity;import java.util.List;
import java.util.Map;/*** 版本信息*/
public interface VersionDao extends BaseMapper<VersionEntity> {/*** @Description: 最新版本信息*/List<Map<String, Object>> selectLastInfo();/*** @Description: 列表*/List<Map<String, Object>> queryPageData(Map<String, Object> params);/*** @Description: 获取总记录数*/int queryCountData(Map<String, Object> params);/*** @Description: 删除/批量删除*/void deleteData(Map map);/*** @Description: 获取不发布的数量*/int queryCountNotReleaseData();/*** @Description: 当前版本信息*/List<Map<String, Object>> selectCurrentInfoByVersion(Map<String, Object> params);/*** @Description: 获取当前最大的版本ID*/List<Map<String, Object>> queryMaxVersionId();}

VersionDao.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.yymt.dao.sys.VersionDao"><!-- 可根据自己的需求,是否要使用 --><resultMap type="com.yymt.entity.sys.VersionEntity" id="versionMap"><result property="id" column="id"/><result property="version" column="version"/><result property="picturePath" column="picture_path"/><result property="downloadPath" column="download_path"/><result property="downloadType" column="download_type"/><result property="createTime" column="create_time"/><result property="updateTime" column="update_time"/><result property="releaseTime" column="release_time"/><result property="isRelease" column="is_release"/><result property="isDelete" column="is_delete"/></resultMap><sql id="Base_Column_List" >id AS id,version AS version,picture_path AS picturePath,download_path AS downloadPath,download_type AS downloadType,create_time AS createTime,update_time AS updateTime,release_time AS releaseTime,is_release AS isRelease,is_delete AS isDelete,</sql><select id="queryPageData" resultType="map">SELECTa.id AS id,a.version AS version,a.picture_path AS picturePath,a.download_path AS downloadPath,a.download_type AS downloadType,a.create_time AS createTime,a.update_time AS updateTime,a.release_time AS releaseTime,a.is_release AS isRelease,a.is_delete AS isDeleteFROM tb_version aWHERE 1= 1AND a.is_delete = #{isDel}<!-- 关键字 --><if test="titleKeyword != null and titleKeyword != ''">AND (a.version LIKE CONCAT('%',#{titleKeyword},'%'))</if>ORDER BY a.create_time DESCLIMIT #{index},#{pageSize}</select><select id="queryCountData" resultType="int">SELECT count(1) FROM tb_version aWHERE 1= 1AND a.is_delete = #{isDel}<!-- 关键字 --><if test="titleKeyword != null and titleKeyword != ''">AND (a.version LIKE CONCAT('%',#{titleKeyword},'%'))</if></select><select id="selectLastInfo" resultType="map">SELECTb.*,c.introductionFROM(SELECT*FROMtb_version aWHEREa.is_delete = 0AND a.is_release = 1AND a.release_time IS NOT NULLAND a.download_path IS NOT NULLAND a.download_type IS NOT NULLAND a.version IS NOT NULLORDER BYa.release_time DESCLIMIT 1) bLEFT JOIN tb_version_info c ON b.id = c.version_id<!-- WHEREc.is_delete = 0  -->ORDER BYc.order_num</select><update id="deleteData">UPDATE tb_version aSET a.is_delete = #{isDel},a.update_time = #{updateTime}<where>id<foreach collection="idList" item="id" open="in (" close=")" separator=",">#{id}</foreach></where></update><select id="queryCountNotReleaseData" resultType="int">SELECT count(1) FROM tb_version aWHERE 1= 1AND a.is_delete = 0AND a.is_release = 0</select><select id="selectCurrentInfoByVersion" resultType="map">SELECTb.*,c.introductionFROM(SELECT*FROMtb_version aWHEREa.is_delete = 0AND a.is_release = 1AND a.release_time IS NOT NULLAND a.download_path IS NOT NULLAND a.download_type IS NOT NULLAND a.version = #{version}ORDER BYa.release_time DESCLIMIT 1) bLEFT JOIN tb_version_info c ON b.id = c.version_id<!-- WHEREc.is_delete = 0  -->ORDER BYc.order_num</select><select id="queryMaxVersionId" resultType="map">SELECT id FROM tb_versionORDER BY id DESC LIMIT 1</select></mapper>

app端

VersionController.java

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.yymt.common.annotation.Login;
import com.yymt.common.utils.ConvertUtil;
import com.yymt.common.utils.R;
import com.yymt.dao.sys.VersionDao;
import com.yymt.entity.sys.VersionEntity;
import com.yymt.modules.controller.base.BaseController;
import com.yymt.service.sys.VersionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;/*** 版本信息*/
@RestController
@RequestMapping("version")
@Api(tags = "版本信息")
public class VersionController{@Autowiredprivate VersionService versionService;@Autowiredprivate VersionDao versionDao;@PostMapping("/currentInfo")@ApiOperation(value = "当前版本信息")@Loginpublic R currentInfo( @ApiParam("参数说明 version:版本号(必填)")@RequestBody Map<String, Object> params) {String version = ConvertUtil.objToStrConverNull(params.get("version"));if (version == null) {return R.error("version版本号不能为空");}VersionEntity versionEntity = versionService.selectOne(new EntityWrapper<VersionEntity>().eq("version", version));if (versionEntity == null) {return R.error("版本" + version + "不存在");}return versionService.selectInfo(versionEntity.getId(), getTopUrl());}@PostMapping("/lastInfo")@ApiOperation(value = "检查版本(最新版本信息)")@Loginpublic R lastInfo(){List<Map<String, Object>> list = versionDao.selectLastInfo();if (list == null) {return R.ok().put("data", "当前已是最新版本");}Long id = ConvertUtil.parseLong(list.get(0).get("id"));VersionEntity version = versionService.selectById(id);if (version == null) {return R.error("该数据不存在");}return versionService.selectInfo(id, getTopUrl());}/*** @Description: app下载/版本更新(后端提供下载接口, 安卓端调用api安装即可) 要用手机测试!*/@Login@GetMapping("/download/{id}")@ApiOperation(value = "app下载/版本更新(要用手机测试!)", produces="application/octet-stream")public void downloadPicture(@PathVariable("id") Long id, HttpServletResponse response) throws Exception {VersionEntity versionEntity = versionService.selectById(id);if (versionEntity == null) {return;}String downloadPath = versionEntity.getDownloadPath();downloadApp(downloadPath, response);}public void downloadApp(String appPath, HttpServletResponse response) {// 获取文件的扩展名String suffix = appPath.substring(appPath.lastIndexOf("."));if (appPath != "" && !appPath.equals(null)) {BufferedInputStream in = null;BufferedOutputStream out = null;try {URL url = new URL(appPath);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);InputStream inStream = conn.getInputStream();response.setCharacterEncoding("UTF-8");response.addHeader("Content-Type", "application/vnd.android.package-archive");response.setHeader("Content-disposition", "attachment; filename=" + System.currentTimeMillis() + suffix);in = new BufferedInputStream(inStream);out = new BufferedOutputStream(response.getOutputStream());byte[] data = new byte[1024];int size = 0;int len = 0;while (-1 != (len = in.read(data, 0, data.length))) {size += len;out.write(data, 0, len);}response.addHeader("Content-Length", size + "");} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if (in != null) {in.close();}if (out != null) {out.flush();out.close();}} catch (IOException e) {e.printStackTrace();}}}}
}

app下载 - app版本更新 (实测可行版)相关推荐

  1. 十大优质国内黄金交易app下载平台排行榜(2022版速览)

    黄金交易还是比较吸引人的,因为在这个市场当中,投资者可以随时入场,并且可以通过不同的方式让自己获利.如今市场当中的平台还是蛮多的,而且可以进行交易的软件也有很多.投资者在选择平台时,还是应该根据一些条 ...

  2. 此beta版已额满_嘻游宝赚钱app下载-嘻游宝红包版下载v1.0安卓版

    嘻游宝红包版是一款很不错的手机做任务赚钱的软件,嘻游宝红包版给玩家们带来了手机在线试玩赚钱的方法,只需要下载app试玩平台里面的游戏,就可以获得丰厚的奖励,操作简单轻松,喜欢的快来下载体验. 嘻游宝红 ...

  3. 来电语音播报软件下载apk_消息语音播报app下载-消息语音播报安卓版 v1.0.1 - 安下载...

    消息语音播报app是一款语音播报工具,它可以将微信.QQ.短信等消息进行语音播报,让你能够第一时间知晓消息内容,无需进入界面也能知晓发来的消息:它支持多个场就下使用,开启语音播报后无需你手动打开手机查 ...

  4. modern android5.1,Modern摩登印app下载-Modern摩登印安卓版下载 v1.1.5_5577安卓网

    Modern摩登印app下载推荐,这是一款非常强大的手机相册制作软件,拥有简单的操作流程,轻轻松松就可以制作出大家喜欢的模式,提供众多个性化的模板选择,一起来看看吧. [软件功能] 摩登印能为你提供快 ...

  5. Android lua编辑工具,Lua脚本编辑器app下载-Lua脚本编辑器手机版下载 v1.0.2_5577安卓网...

    Lua脚本编辑器app下载推荐给大家,这是一款非常简洁好用的打码编辑神器,用户轻松下载使用,对代码进行编辑.测试.查错等,手机也能写代码,支持多种文件格式,打开.导出.保存都很方便. [软件介绍] L ...

  6. 小瓦怕扫地机器人_小瓦扫地机器人青春版app下载-小瓦扫地机器人米家app下载v5.6.81 安卓版-西西软件下载...

    小瓦扫地机器人app是小米旗下生态链企业石头科技最近推出的一款小户型扫地机器人的配套软件,这款全新的扫地机器人比起米家扫地机器人少了激光传感器,主打中低端市场.主要是价格便宜,大家可以通过这款小瓦扫地 ...

  7. 我的世界java免费云电脑,云电脑app下载_云电脑官方版下载-我的世界中文网

    软件介绍 云电脑是一款手机模拟器,可以在手机上体验到PC端的软件和游戏,今天小编就和大家分享一下云电脑官方版下载,如果大家也想在手机上玩到电脑游戏的话,就快来试一试吧. 云电脑介绍 手机体验强大的Wi ...

  8. 安卓手机管理软件_vaa云录音app下载-vaa云录音手机版下载v1.1.9 安卓版

    vaa云录音app是一款手机录音软件,软件功能全面,使用方便,在这里为用户提供最方便的录音服务,不管是什么方面的录音,在这里都可以通过软件完成,为你带来最方面实用的录音服务,感兴趣的朋友快来下载看看吧 ...

  9. android设置主题背景为壁纸_主题壁纸美化app下载-主题壁纸美化安卓版(DIY定制) - 超好玩...

    主题壁纸美化是一款非常实用的手机壁纸软件,海量图片素材可以包揽你的桌面.头像.背景图等等,主题壁纸美化安卓版(DIY定制)还有特殊的透明壁纸,可以设置个性挂件,让你的桌面动起来,感兴趣的小伙伴快来下载 ...

最新文章

  1. java程序无法连接redis 正常启动但是无法访问
  2. 基于协同训练的半监督文本分类算法
  3. Graph Search就是语义搜索
  4. java label api_使用python API进行的培训作为Java API中LabelImage模块的输入?
  5. android怎么将editext的文本,android – 如何将文本添加到editext
  6. Js黑客帝国效果 文字下落 制作过程和思路
  7. oracle 采购 日历,Oracle日历程序
  8. python callback failed_Python请求钩子返回导致异常的值
  9. leetcode238-除自身以外数组的乘积
  10. JavaSE 帮助文档下载
  11. Vim编辑器快速上手
  12. java 汇率换算_原生JS实现简单的汇率转换问题
  13. 秋招之前实习面经汇总
  14. 大学生数学竞赛资料目录20190403更新
  15. 视频动作识别(Action Recognition)综述
  16. Java 在Word中创建多级项目符号列表和编号列表
  17. 帝国cms后台admin帐号密码忘记的处理方法
  18. 《写给大家看的设计书》读后
  19. 【阿旭机器学习实战】【13】决策树分类模型实战:泰坦尼克号生存预测
  20. python爬虫——实战篇

热门文章

  1. vs打开sln是空白_周末惊喜版块 | 新文速递 强推全息网游无限流鬼怪文/软妹身大佬心锦鲤女主VS阴郁暴躁倒霉蛋男主【言情】01.20...
  2. ExcelVBA之数组错误
  3. weibo项目分析和理解
  4. Java如何快速组装数据_树形数据组装最简单的方法-Java
  5. 敏捷开发实战(三)--每日晨会,是否只是摆设?
  6. 强一致性、顺序一致性、弱一致性和共识
  7. 传电子烟RELX完成新一轮融资,估值8亿美金
  8. 512mb内存linux,小谈Windows Phone的“512MB 内存够用理论”
  9. 保护生态 一对一直播 脚本 技术分析
  10. 战狼中出现入侵代码,原来是C语言代码