仿电商App:笔记(六): 登录、注册功能开发(ORM框架-GreenDao)
目录
1、注册UI及验证逻辑实现
1.1 注册页面逻辑实现
1.2 验证效果
2、登录UI及验证逻辑实现
2.1 登录页面逻辑实现
2.2 验证效果
3、服务器数据简单介绍与基于GreenDao的数据库框架设计
3.1 使用Apache+PHP搭建服务器,读取本地的json数据
3.2 数据持久化--GreenDAO(使用单例模式确保操作唯一性)
3.3 登录、注册页面的信息持久化
4、用户状态与用户信息的回调封装
4.2 登录、注册成功回调--使用接口,进行解耦方便在功能模块实现自己的逻辑
4.3 回调方法的具体使用
4.4 验证回调方法
5、启动图界面与登录页面相关联
5.1 完善启动图页面逻辑
5.2 页面关联
注册登录的逻辑整理:
注册:首先判断注册的输入格式是否正确;点击注册按钮,将输入的信息以key-value形式保存在Params(参数名,参数值)中,获取本地准备好的用户信息保存到数据库中(此处与真实情况不符);设置登录成功标志位以及注册成功的提示。
登录:首先判断登录的输入格式是否正确;点击登录按钮,将输入的信息以key-value形式保存在Params(参数名,参数值)中,获取本地准备好的用户信息保存到数据库中(此处与真实情况不符);设置登录成功标志位以及登录成功的提示。
逻辑优化:
注册:首先判断注册的输入格式是否正确;点击注册按钮,需根据Params中的key判断电话号、邮箱、姓名是否被注册(包含相同信息可以Toast弹出提示信息,没有继续),将输入的信息以key-value形式保存在Params(<电话号,密码><邮箱,密码><姓名,密码>)中,将这些信息保存到数据库(手机内部的SQLite数据库,使用了GreenDao包装了)中。
登录:首先判断登录的输入格式是否正确;点击登录按钮,需根据Params中的key判断电话号、邮箱、姓名与对应保存的value密码是否相同(不相同以Toast弹出提示信息,相同则登录成功),不需要将信息保存到服务器的数据库中。
每次登陆注册是从Params中判断。但下次打开App,Params中数据清空(保存在内存中),需要先从数据库中将信息提取到Map中。然后进行登录注册判断。
1、注册UI及验证逻辑实现
1.1 注册页面逻辑实现
位于latte-ec模块sign包下的SignUpDelegate。
主要作用:注册页面的逻辑实现,包含:注册后保存用户信息,已经注册的用户跳转到登录页面。
public class SignUpDelegate extends LatteDelegate {@BindView(R2.id.edit_sign_up_name)TextInputEditText mName = null;@BindView(R2.id.edit_sign_up_email)TextInputEditText mEmail = null;@BindView(R2.id.edit_sign_up_phone)TextInputEditText mPhone = null;@BindView(R2.id.edit_sign_up_password)TextInputEditText mPassword = null;@BindView(R2.id.edit_sign_up_re_password)TextInputEditText mRePassword = null;@OnClick(R2.id.btn_sign_up)void onClickSignUp() {if (checkForm()) {Toast.makeText(getContext(), "验证通过", Toast.LENGTH_SHORT).show();}}@OnClick(R2.id.tv_link_sign_in)void onClickLink(){getSupportDelegate().start(new SignInDelegate());}public boolean checkForm() {//检查填入的信息是否正确final String name = mName.getText().toString();final String email = mEmail.getText().toString();final String phone = mPhone.getText().toString();final String password = mPassword.getText().toString();final String rePassword = mRePassword.getText().toString();boolean isPass = true;if (name.isEmpty()) {mName.setError("请输入姓名");isPass = false;} else {mName.setError(null);}if (email.isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {mEmail.setError("错误的邮箱格式");isPass = false;} else {mEmail.setError(null);}if (phone.isEmpty() || phone.length() != 11) {mPhone.setError("手机号码错误");isPass = false;} else {mPhone.setError(null);}if (password.isEmpty() || password.length() < 6) {mPassword.setError("请填写至少6位数密码");isPass = false;} else {mPassword.setError(null);}if (rePassword.isEmpty() || rePassword.length() < 6 || !(rePassword.equals(password))) {mRePassword.setError("密码验证错误");isPass = false;} else {mRePassword.setError(null);}return isPass;}@Overridepublic Object setLayout() {return R.layout.delegate_sign_up;}@Overridepublic void onBindView(@Nullable Bundle savedInstanceState, View rootView) {}
}
1.2 验证效果
在example模块下,ExampleActivity类中,将根Fragment替换为注册图界面。
public class ExampleActivity extends ProxyActivity {@Overridepublic LatteDelegate setRootDelegate() {return new SignUpDelegate();}
}
2、登录UI及验证逻辑实现
2.1 登录页面逻辑实现
位于latte-ec模块sign包下的SignInDelegate。
主要作用:登录页面的逻辑实现,包含:登录后保存用户信息,还未注册的用户跳转到注册页面。
public class SignInDelegate extends LatteDelegate {@BindView(R2.id.edit_sign_in_email)TextInputEditText mEmail = null;@BindView(R2.id.edit_sign_in_password)TextInputEditText mPassword = null;@OnClick(R2.id.btn_sign_in)void onClickSignIn(){if (checkForm()){Toast.makeText(getContext(), "验证通过", Toast.LENGTH_SHORT).show();}}@OnClick(R2.id.icon_sign_in_wechat)void onClickWeChat(){//微信登录逻辑}@OnClick(R2.id.tv_link_sign_up)void onClickLink(){//未注册的,跳转到注册页面getSupportDelegate().start(new SignUpDelegate());}public boolean checkForm() {//检查填入信息final String email = mEmail.getText().toString();final String password = mPassword.getText().toString();boolean isPass = true;if (email.isEmpty() || !Patterns.EMAIL_ADDRESS.matcher(email).matches()) {mEmail.setError("错误的邮箱格式");isPass = false;} else {mEmail.setError(null);}if (password.isEmpty() || password.length() < 6) {mPassword.setError("请填写至少6位数密码");isPass = false;} else {mPassword.setError(null);}return isPass;}@Overridepublic Object setLayout() {return R.layout.delegate_sign_in;}@Overridepublic void onBindView(@Nullable Bundle savedInstanceState, View rootView) {}
}
2.2 验证效果
在example模块下,ExampleActivity类中,将根Fragment替换为登录图界面。
public class ExampleActivity extends ProxyActivity {@Overridepublic LatteDelegate setRootDelegate() {return new SignInDelegate();}
}
3、服务器数据简单介绍与基于GreenDao的数据库框架设计
3.1 使用Apache+PHP搭建服务器,读取本地的json数据
使用php对json数据进行了包装,最终在代码中通过获取.php文件来读取本地json数据
<?php
$file_name = 'http://127.0.0.1:8081/RestServer/data/user_profile.json';//获取的本地json数据
$file = file_get_contents($file_name);
echo $file;
开启Apache服务,在浏览器中输入:http://192.168.56.1:8081/RestServer/api/user_profile.php(前面是本机ip地址,可通过cmd查询;8081是自己更改的端口号),可以获取到json数据信息。
3.2 数据持久化--GreenDAO(使用单例模式确保操作唯一性)
配置GreenDAO依赖
位于latte-ec模块database包下的UserProfile。
主要作用:实体类,一个实体类代表一张表,里面包含表中各个字段。
@Entity(nameInDb = "user_profile")//定义实体类,nameInDb:数据库名
public class UserProfile {@Idprivate long userId = 0;//唯一id,必须是long型private String name = null;private String avatar = null;private String gender = null;private String address = null;
}
Rebuild Project后会在UserProfile类后自动生成对各个字段得get、set方法。以及自动生成DaoMaster、DaoSession、UserProfileDao文件。
DaoMaster:GreenDao的框架管理类,该类对数据库相关管理进行了封装。
内部含有OpenHelper类(继承于SQLiteOpenHelper)创建所有的数据库;内部有Map集合,将每个EntityDao对象的字节码与它的数据库建立映射关系。通过Map管理所有的EntityDao类(每个类相当于一张表)。
DaoSession:链接GreenDao到SQLite数据库的纽带,通过它可以得到一个与数据库某张表相关的操作对象EntityDao。
从DaoMaster的Map集合中通过key(EntityDao.class)获取到管理数据库的对象(DaoConfig),传递给EntityDao类。DaoSession中的CRUD都是通过调用EntityDao进行的。
UserProfileDao:是具体的EntityDao类,有生成器生成的数据库操作类,封装了所有对数据库表进行CRUD的方法。
位于latte-ec模块database包下的ReleaseOpenHelper,继承自DaoMaster.OpenHelper。
主要作用:数据库表生成类,对DaoMaster自带的OpenHelper进行了封装。
public class ReleaseOpenHelper extends DaoMaster.OpenHelper {public ReleaseOpenHelper(Context context, String name) {super(context, name);}public ReleaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {super(context, name, factory);}@Overridepublic void onCreate(Database db) {super.onCreate(db);}
}
位于latte-ec模块database包下的DatabaseManager。
主要作用:数据库的管理类,内部初始化DaoMaster(使用单例,确保线程安全),内含获取到EntityDao对象的方法。
public class DatabaseManager {private DaoSession mDaoSession = null;private UserProfileDao mDao = null;private DatabaseManager() {}public DatabaseManager init(Context context) {initDao(context);return this;}private static final class Holder {//静态内部类单例模式private static final DatabaseManager INSTANCE = new DatabaseManager();}public static DatabaseManager getInstance() {return Holder.INSTANCE;}private void initDao(Context context) {final ReleaseOpenHelper helper = new ReleaseOpenHelper(context, "fast_ec.db");//传入数据库名,在Map集合中与对应的实体类建立映射关系final Database db = helper.getWritableDb();//以读写方式得到数据库mDaoSession = new DaoMaster(db).newSession();mDao = mDaoSession.getUserProfileDao();//获取该数据库的实体类操作对象}public final UserProfileDao getDao() {return mDao;}
}
在example模块下的ExampleApp类中进行数据库初始化。
public class exampleApp extends Application {@Overridepublic void onCreate() {super.onCreate();Latte.init(this).......configure();
** DatabaseManager.getInstance().init(this);//初始化数据库}
}
3.3 登录、注册页面的信息持久化
位于latte-ec模块database包下的SignHandler。
主要作用:通过登录、注册成功后,获取到已经准备好的json数据,读取json数据保存到数据库中;并设置登录、注册状态以及成功的回调。
public class SignHandler {public static void onSignIn(String response,ISignListener signListener) {final JSONObject profileJson = JSON.parseObject(response).getJSONObject("data");final long userId = profileJson.getLong("userId");final String name = profileJson.getString("name");final String avatar = profileJson.getString("avatar");final String gender = profileJson.getString("gender");final String address = profileJson.getString("address");final UserProfile profile = new UserProfile(userId, name, avatar, gender, address);//从JSON中获取数据,插入数据库DatabaseManager.getInstance().getDao().insert(profile);//将数据插入数据库//已经注册并成功登录AccountManager.setSignState(true);signListener.onSignInSuccess();}public static void onSignUp(String response,ISignListener signListener) {final JSONObject profileJson = JSON.parseObject(response).getJSONObject("data");final long userId = profileJson.getLong("userId");final String name = profileJson.getString("name");final String avatar = profileJson.getString("avatar");final String gender = profileJson.getString("gender");final String address = profileJson.getString("address");final UserProfile profile = new UserProfile(userId, name, avatar, gender, address);DatabaseManager.getInstance().getDao().insert(profile);//已经注册并成功登录AccountManager.setSignState(true);signListener.onSignUpSuccess();}
}
位于latte-ec模块sign包下的SignUpDelegate。完善注册成功后的保存数据到数据库
主要作用:注册页面的逻辑实现,包含:注册后保存用户信息,已经注册的用户跳转到登录页面。
@OnClick(R2.id.btn_sign_up)void onClickSignUp() {if (checkForm()) {RestClient.builder().url("http://192.168.50.189:8081/RestServer/api/user_profile.php").params("name",mName.getText().toString()).params("email", mEmail.getText().toString()).params("phone",mPhone.getText().toString()).params("password",mPassword.getText().toString()).success(new ISuccess() {@Overridepublic void onSuccess(String response) {LatteLogger.json("USER_PROFILE", response);SignHandler.onSignUp(response, mISignListener);}}).build().post();}}
位于latte-ec模块sign包下的SignInDelegate。完善登录成功后的保存数据到数据库
主要作用:登录页面的逻辑实现,包含:登录后保存用户信息,还未注册的用户跳转到注册页面。
@OnClick(R2.id.btn_sign_in)void onClickSignIn(){if (checkForm()){RestClient.builder().url("http://192.168.1.103:8081/RestServer/api/user_profile.php").params("email", mEmail.getText().toString()).params("password",mPassword.getText().toString()).success(new ISuccess() {@Overridepublic void onSuccess(String response) {LatteLogger.json("USER_PROFILE", response);SignHandler.onSignIn(response, mISignListener);}}).build().post();}}
通过adb shell查看数据库信息
4、用户状态与用户信息的回调封装
4.1 用户状态回调--sharedPreference
位于latte-core模块app包下的IUserChecker接口。
主要作用:两个方法:登录、未登录。
public interface IUserChecker {void onSignIn();void onNotSignIn();
}
位于latte-core模块app包下的AccountManager。
主要作用:管理用户信息,内部通过sharedPreference保存登陆状态,检查用户状态--回调IUserChecker接口中方法。
public class AccountManager {private enum SignTag{SIGN_TAG}//保存用户登录状态,登录后调用public static void setSignState(boolean state){LattePreference.setAppFlag(SignTag.SIGN_TAG.name(), state);}private static boolean isSignIn(){return LattePreference.getAppFlag(SignTag.SIGN_TAG.name());}public static void checkAccount(IUserChecker checker){//检查登陆状态if (isSignIn()){checker.onSignIn();}else {checker.onNotSignIn();}}
}
4.2 登录、注册成功回调--使用接口,进行解耦方便在功能模块实现自己的逻辑
位于latte-ec模块sign包下的ISignListener接口。
主要作用:两个方法:登录成功、注册成功。
public interface ISignListener {void onSignInSuccess();void onSignUpSuccess();
}
4.3 回调方法的具体使用
位于latte-ec模块sign包下的SignUpDelegate。完善注册成功后的的信息回调
主要作用:注册页面的逻辑实现,包含:注册后保存用户信息,已经注册的用户跳转到登录页面。
SignInDelegate添加了与SignUpDelegate相同的代码。
public class SignUpDelegate extends LatteDelegate {private ISignListener mISignListener = null;@Overridepublic void onAttach(Activity activity) {super.onAttach(activity);if (activity instanceof ISignListener){mISignListener = (ISignListener) activity;//确保只有继承ISignListener的activity才能实现该方法}}@OnClick(R2.id.btn_sign_up)void onClickSignUp() {if (checkForm()) {RestClient.builder()....success(new ISuccess() {@Overridepublic void onSuccess(String response) {LatteLogger.json("USER_PROFILE", response);
** SignHandler.onSignUp(response, mISignListener);}}).build().post();}}
}
位于latte-ec模块database包下的SignHandler。完善登录、注册状态以及成功的回调。
主要作用:通过登录、注册成功后,获取到已经准备好的json数据,读取json数据保存到数据库中;并设置登录、注册状态以及成功的回调。
public class SignHandler {public static void onSignIn(String response,ISignListener signListener) {......//已经注册并成功登录AccountManager.setSignState(true);signListener.onSignInSuccess();}public static void onSignUp(String response,ISignListener signListener) {......//已经注册并成功登录AccountManager.setSignState(true);signListener.onSignUpSuccess();}
}
4.4 验证回调方法
在example模块下,ExampleActivity类中,实现ISignListener接口中登陆成功、注册成功的方法。
@Overridepublic void onSignInSuccess() {Toast.makeText(this,"登录成功",Toast.LENGTH_LONG).show();}@Overridepublic void onSignUpSuccess() {Toast.makeText(this,"注册成功",Toast.LENGTH_LONG).show();}
5、启动图界面与登录页面相关联
当启动后,判断用户是否登录?登录了:直接跳到主界面;没登陆:跳转到登录界面。(是否登录了?已经在AccountManager中通过SharedPreference保存了)
5.1 完善启动图页面逻辑
位于latte-ui模块launcher包下的ILauncherListener接口。
主要作用:登陆状态判断的回调,在里面设置是否登陆的标志位,最后根据登录标记位判断打开的Fragment
登录过:直接打开主页;没登陆:跳到登录界面。
public interface ILauncherListener {void onLauncherFinish(OnLauncherFinishTag tag);//登录后回调,传入登陆状态
}
位于latte-ec模块launcher包下的LauncherDelegate类,完善启动后登录逻辑的判断。
主要作用:启动页面的逻辑。
public class LauncherDelegate extends LatteDelegate implements ITimerListener {private ILauncherListener mILauncherListener = null;@Overridepublic void onAttach(Activity activity) {//初始化接口实例:实现ILauncherListener接口的activitysuper.onAttach(activity);if (activity instanceof ILauncherListener){mILauncherListener = (ILauncherListener) activity;}}//判断是否显示滑动启动页private void checkIsShowScroll(){if (!LattePreference.getAppFlag(ScrollLauncherTag.HAS_FIRST_LAUNCHER_APP.name())){getSupportDelegate(). start(new LauncherScrollDelegate(), SINGLETASK);}else {//检查用户是否登陆了APPAccountManager.checkAccount(new IUserChecker() {@Overridepublic void onSignIn() {if (mILauncherListener!=null){mILauncherListener.onLauncherFinish(OnLauncherFinishTag.SIGNED);//设置登录的标志位}}@Overridepublic void onNotSignIn() {if (mILauncherListener!=null){mILauncherListener.onLauncherFinish(OnLauncherFinishTag.NOT_SIGNED);}}});}}
}
5.2 页面关联
在example模块下,ExampleActivity类中,实现ILauncherListener接口,完成登陆状态判断方法:根据标记位:登录过:直接打开主页;没登陆:跳到登录界面。
@Overridepublic void onLauncherFinish(OnLauncherFinishTag tag) {switch (tag){case SIGNED:Toast.makeText(this,"启动结束,用户登录了",Toast.LENGTH_LONG).show();getSupportDelegate().startWithPop(new EcBottomDelegate());break;case NOT_SIGNED:Toast.makeText(this,"启动结束,用户没登录",Toast.LENGTH_LONG).show();getSupportDelegate().startWithPop(new SignInDelegate());break;default:break;}}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- mysql使用存储过程&函数实现批量插入
以下是我为了自己学方便建的笔记,都是在其他博主的主页下看到的,自学笔记,有不对的可以指出表结构如下:create table dept(id int unsigned primary key auto_increment,// ID列为无符号整型,该列值不可以为空,并不可以重复,而且自增。 deptno mediumint unsigned not …...
2024/4/28 14:52:32 - redis分布式锁
解决Redis分布式锁业务代码超时导致锁失效问题转载自:https://my.oschina.net/u/4164047/blog/32104621、redis分布式锁的基本实现redis加锁命令:SETNX resource_name my_random_value PX 30000 这个命令的作用是在只有这个key不存在的时候才会设置这个key的值(NX选项的作用…...
2024/5/1 10:36:33 - redis持久化之AOF(Append Only File)及其总结
1.是什么?以日志的形式来记录每个写操作,将redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作2.Aof保存的是…...
2024/5/3 8:26:19 - Java集合类之HashMap
综述 HashMap是一个存储键值对(Key-value)的集合,每一组键值对也叫做Entry,HashMap数组的初始化都是null。 1、成员变量 //初始化容量为16,这个必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //负载因子 static final float DEFAULT_LOAD_FACTOR …...
2024/5/3 7:52:35 - Glide使用总结
简介优点与使用环境生命周期相绑定:RequestManagerFragment & SupportRequestManagerFragment内存的三级缓存池:LruMemoryResources, ActiveResources, BitmapPool内存复用机制:BitmapPool为什么要绑定生命周期可以实现网络请求根据生命周期而暂停、执行、恢复、释放等可…...
2024/4/24 7:25:23 - java空对象占用的内存大小
一. 对象的内存布局HotSpot 虚拟机中。对象在内存中存储的布局能够分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。二. 对象头JVM 对象头一般占用两个机器码,在 32-bit JVM 上占用 8字节, 在 64-bit JVM 上占用 128bit 即 8+8=16 字节(开…...
2024/5/3 7:01:22 - python计算数组元素出现的次数
有时候有些业务场景需要计算数组中元素出现的次数,或者找出出现次数最多的三个元素,怎么实现呢?python的collections模块中Counter类就能很好解决这些问题,Counter类中的most_common()方法就能计算元素出现最多次数的几个元素费话不多说,直接上代码,程序员,用代码说话:…...
2024/5/3 15:22:21 - 【C++】详细解读:typename声明模板中的一个类型
用C++封装一个不带头结点的单链表 要求:用嵌套类型的方式 template<typename T> class CLink//模板 { public:CLink(){phead = NULL;}~CLink(){Node* pCur = phead;Node* pNext;while (pCur != NULL){pNext = pCur->pnext;delete pCur;pCur = pNext;}phead = NULL;}v…...
2024/5/3 7:17:02 - 裂变系统开发_裂变模式讲解
拼客新零售系统,就是一个销售工具。 模式介绍: 1、你给推荐人转198,他发他的产品给你 2、推荐人给你注册帐号,你再转198给五星会员,他给你产品 3、这二个人同时审核激活你的帐号 一:两个条件: 消费396元,找三个合作伙伴,层层复制二、拼客新零售模式开发制度介绍: 1、…...
2024/5/4 4:09:44 - UILabel换行不正常
label.lineBreakMode = NSLineBreakByCharWrapping;...
2024/5/5 2:36:17 - 从零玩转Docker(五):CentOS7下Docker创建启动容器的常用命令(1)
1、Docker创建并启动容器1.1、启动普通容器: docker run --name 别名 镜像ID1.2、启动交互式容器: docker run -it --name 别名 镜像ID 来运行一个容器,取别名,交互模式运行,以及分配一个伪终端(注意:类似我们的命令窗口)docker run [OPTIONS] IMAGEIDoptions相关…...
2024/5/1 2:43:03 - Android笔记:Fragment
Fragment简介Fragment简介 常用、有自己的生命周期、依附于activity、常与viewpager配合使用Fragment加载到Activity两种方式 1.静态加载到布局文件 2.动态加载: 1.添加一个FragmentTransaction实例 2.用add方法加上Fragment对象 3.commit()提交改变FragmentPagerAdapter与Fra…...
2024/5/1 5:00:07 - 【亥著课堂】ipa文件如何安装到ios系统中?
第一种:将ipa上传到Appstore给苹果官方审核,正常上架,上架成功后即可在苹果商店安装应用到苹果手机上;第二种:将ipa上传到TESTFlight,再进行下载安装,首先下载TESTFlight,将应用在TF中 上架,上架成功后即可下载安装;第三种:企业签名或者udid测试的应用可以将ipa文件…...
2024/4/28 13:23:03 - Java 8 新特性 Stream类的collect方法
1.Collectors.toList():转换成List集合。/ Collectors.toSet():转换成set集合。System.out.println(Stream.of("a", "b", "c","a").collect(Collectors.toSet()));2.Collectors.toCollection(TreeSet::new):转换成特定的set集合。T…...
2024/5/1 10:46:08 - SpringCloud之Hystrix容错保护原理及配置
1 什么是灾难性雪崩效应?如下图的过程所示,灾难性雪崩形成原因就大致如此:造成灾难性雪崩效应的原因,可以简单归结为下述三种:服务提供者不可用。如:硬件故障、程序BUG、缓存击穿、并发请求量过大等。重试加大流量。如:用户重试、代码重试逻辑等。服务调用者不可用。如:…...
2024/4/21 6:16:56 - Java class文件格式常量池包含的特殊字符串
class文件中的特殊字符串首先把class文件中的特殊字符串做一个详细的介绍, 现在我们将重点放在特殊字符串上。 特殊字符串包括三种: 类的全限定名, 字段和方法的描述符, 特殊方法的方法名。 就分别介绍这三种特殊字符串。(1) 类的全限定名在常量池中, 一个类型的名字并…...
2024/4/26 14:39:22 - LeetCode每日一题 三角形最小路径和 动态规划(galang)
题目分析过程 1.自上而下 还是用到动态规划的思想 1.用 dp(i,j) 表示从三角形顶端,走到坐标 (i,j) 的所有路径中最小的路径和 2.根据题意,坐标 (i,j)只可能由它左上角或右上角走过来,因此这两个点的坐标分别为dp(i-1,j-1),dp(i-1,j) 3.给出dp(i,j) 的状态转移方程,我们只需…...
2024/5/1 4:23:16 - Centos7部署FreeIPA
FreeIPA简介 FreeIPA官网 FreeIPA是用于Linux / UNIX网络环境的集成身份和验证解决方案。FreeIPA服务通过存储有关用户,组,主机和其他对象的数据来提供集中的身份验证,授权和帐户信息,这些数据对于管理计算机网络的安全性是必需的。 FreeIPA建立在知名的开源组件和标准协议…...
2024/5/3 18:11:04 - 修复禾匠4.3.7在线更新版安装错误
修复禾匠4.3.7在线更新版安装错误 禾匠4.3.7在线更新版,安装报错,插件报错,功能报错,一次性修复! 技术支持:357291243...
2024/5/3 12:59:53 - 你该知道的内存调优
理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数。然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工作中得好伙伴。在这篇文章中,我们将介绍一些关于JVM内存管理的参数。知道…...
2024/5/3 4:09:22
最新文章
- VSCode 配置 Qt 开发环境
文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统:Windows 11VSCode版本:1.88.1CMake版本:3.27.7Qt6版本:6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...
2024/5/5 13:30:37 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - C++ 【原型模式】
简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象,客户端不需要知道要复制的对象是哪个类的实例,只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类,客户端代码无需改变,只需修改原型工…...
2024/5/5 8:37:55 - WKWebView的使用
一、简介 在iOS中,WKWebView是WebKit框架提供的一个用于展示网页内容的控件,相比UIWebView有更好的性能和功能。 以下是在iOS中使用WKWebView的基本步骤: 1.1 导入WebKit框架 import WebKit1.2 创建WKWebView实例 let webView WKWebVie…...
2024/5/4 11:20:05 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/4 12:05:22 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/5 12:22:20 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/4 14:46:16 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/4 23:54:44 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/4 12:10:13 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/4 23:54:49 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/4 23:54:44 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/4 14:46:12 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/4 14:46:11 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/4 14:46:11 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/5 2:25:33 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/4 21:24:42 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/5 13:14:22 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/4 13:16:06 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/4 16:48:41 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/4 14:46:05 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/5 3:37:58 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/4 23:54:30 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/4 9:07:39 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/4 14:46:02 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57