html手机网站如何制作wordpress论坛模版

diannao/2026/1/26 9:22:08/文章来源:
html手机网站如何制作,wordpress论坛模版,淘宝店铺去哪里买,买个网站域名要多少钱前言 本章我们基于重构的方式进行一个 MVVM 的实战#xff0c;我们将一个新闻列表的普通实现#xff0c;一步一步的改造成 MVVM 的架构模式#xff0c;一共分为上中下三个章节#xff0c;本章继续上一章#xff0c;开始中篇的讲解#xff1b; 控件化 我们本章向控件化进…前言 本章我们基于重构的方式进行一个 MVVM 的实战我们将一个新闻列表的普通实现一步一步的改造成 MVVM 的架构模式一共分为上中下三个章节本章继续上一章开始中篇的讲解 控件化 我们本章向控件化进一步迈进 BaseView 重构 我们上一章将 TitleView 和 PictureTitleView 抽取了一个 BaseView 来抽取公共的 setData 逻辑我们还可以继续精进一步 我们现将我们上一章定义的接口 BaseView 重命名成 IBaseView public interface IBaseViewDATA extends BaseViewModel {void setData(DATA data); }然后我们定义一个 IBaseView 的实现类BaseView public abstract class BaseView extends LinearLayout implements IBaseViewBaseViewModel {public BaseView(Context context) {super(context);}public BaseView(Context context, Nullable AttributeSet attrs) {super(context, attrs);}public BaseView(Context context, Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public BaseView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}Overridepublic void setData(BaseViewModel baseViewModel) {} }然后我们定义公共的 init 方法方法中我们进行布局的加载但是布局 id 我们无法从自身获取需要通过 工厂方法 模式提供一个抽象接口来从子类中获取布局 id同时通过 泛型 来接收 DataBinding 在 inflater 之后返回的 ViewDataBinding 对象整体如下 public abstract class BaseViewVIEW_BINDING extends ViewDataBinding extends LinearLayout implements IBaseViewBaseViewModel {protected VIEW_BINDING mBinding;private void init() {LayoutInflater layoutInflater (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);mBinding DataBindingUtil.inflate(layoutInflater, getLayoutId(), this, false);addView(mBinding.getRoot());}public abstract int getLayoutId(); }通常View 可能会需要一个点击事件我们这里也提供一下 private void init() {LayoutInflater layoutInflater (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);mBinding DataBindingUtil.inflate(layoutInflater, getLayoutId(), this, false);mBinding.getRoot().setOnClickListener(this::onRootClick);addView(mBinding.getRoot()); }public abstract int getLayoutId();public abstract void onRootClick(View view);然后我们来实现 setData 部分这里我们将泛型的实现交给 BaseView public abstract class BaseViewVIEW_BINDING extends ViewDataBinding, DATA extends BaseViewModel extends LinearLayout implements IBaseViewDATA {}然后我们发现当我们在 setData 中去 setViewModel 的时候报错了并没有 setViewModel 的接口那么我们就需要进行剥离出来交给子类实现 public abstract class BaseViewVIEW_BINDING extends ViewDataBinding, DATA extends BaseViewModel extends LinearLayout implements IBaseViewDATA {Overridepublic void setData(DATA baseViewModel) {setDataToView(baseViewModel);mBinding.executePendingBindings();}public abstract void setDataToView(DATA data); }我们接下来重构 TitleView 和 PictureTitleView来让它们继承 BaseView public class TitleView extends BaseViewTitleViewBinding, TitleViewModel {public TitleView(Context context) {super(context);}Overridepublic int getLayoutId() {return R.layout.title_view;}Overridepublic void onRootClick(View view) {}Overridepublic void setDataToView(TitleViewModel titleViewModel) {mBinding.setTitleViewModel(titleViewModel);} }PictureTitleView public class PictureTitleView extends BaseViewPictureTitleViewBinding, PictureTitleViewModel {public PictureTitleView(Context context) {super(context);}Overridepublic int getLayoutId() {return R.layout.picture_title_view;}Overridepublic void onRootClick(View view) {}Overridepublic void setDataToView(PictureTitleViewModel pictureTitleViewModel) {mBinding.setPictureTitleViewModel(pictureTitleViewModel);}BindingAdapter(loadImageUrl)public static void loadImageUrl(ImageView imageView, String imgUrl) {Glide.with(imageView.getContext()).load(imgUrl).transition(withCrossFade()).into(imageView);} }可以看到我们的 TitleView 和 PictureTitleView 也清爽了很多到这里对齐了我们在讲 MVx 的时候的 控件化 的重要性 Model 我们接下来终于可以向 MVVM 的架构来迈进了我们先来看下我们的 Fragment一开始我们把数据的加载直接放在了 Fragment 中这其实并不合理我们需要将数据的获取放到 model 层我们来进行重构 首先我们在 base 层定义下我们的 baseModel创建一个 IBaseModelListener用来将 model 获取的数据回调到 View public interface IBaseModelListenerDATA {void onLoadSuccess(DATA data);void onLoadFail(int errorCode, String errorMsg); }然后我们定义一个我们用来获取频道列表的 model public class NewsChannelModel {private IBaseModelListenerListNewsChannelsBean.ChannelList mListener;public NewsChannelModel(IBaseModelListenerListNewsChannelsBean.ChannelList mListener) {this.mListener mListener;}public void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsChannels().compose(TecentNetworkApi.getInstance().applySchedulers(new BaseObserverNewsChannelsBean() {Overridepublic void onSuccess(NewsChannelsBean newsChannelsBean) {mListener.onLoadSuccess(newsChannelsBean.showapiResBody.channelList);}Overridepublic void onFailure(Throwable e) {e.printStackTrace();mListener.onLoadFail(400, e.getMessage());}}));} }然后我们在 Fragment 中调用这个 model 的 load 方法 public class HeadlineNewsFragment extends Fragment implements IBaseModelListenerListNewsChannelsBean.ChannelList {public HeadlineNewsFragmentAdapter adapter;private FragmentHomeBinding viewDataBinding;private NewsChannelModel model;Overridepublic View onCreateView(NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {viewDataBinding DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false);adapter new HeadlineNewsFragmentAdapter(getChildFragmentManager());viewDataBinding.tablayout.setTabMode(TabLayout.MODE_SCROLLABLE);viewDataBinding.viewpager.setAdapter(adapter);viewDataBinding.tablayout.setupWithViewPager(viewDataBinding.viewpager);viewDataBinding.viewpager.setOffscreenPageLimit(1);model new NewsChannelModel(this);model.load();return viewDataBinding.getRoot();}Overridepublic void onLoadSuccess(ListNewsChannelsBean.ChannelList channelLists) {if (adapter ! null) {adapter.setChannels(channelLists);}}Overridepublic void onLoadFail(int errorCode, String errorMsg) {} }Fragment 也清爽了很多我们接下来重构下 NewsListFragment重构逻辑一样我们封装一个 NewListModel public class NewsListModel {private IBaseModelListenerArrayListBaseViewModel mListener;private int mPageNum;private String mChannelId;private String mChannelName;public NewsListModel(IBaseModelListenerArrayListBaseViewModel mListener, String channelId, String channelName) {this.mListener mListener;this.mChannelId channelId;this.mChannelName channelName;}public void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsList(mChannelId,mChannelName, String.valueOf(mPageNum)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(new FunctionNewsListBean, ObservableSourceArrayListBaseViewModel() {Overridepublic ObservableSourceArrayListBaseViewModel apply(NewsListBean newsChannelsBean) throws Exception {ArrayListBaseViewModel viewModels new ArrayList();for (NewsListBean.Contentlist contentlist : newsChannelsBean.showapiResBody.pagebean.contentlist) {if (contentlist.imageurls ! null contentlist.imageurls.size() 0) {PictureTitleViewModel pictureTitleViewModel new PictureTitleViewModel();pictureTitleViewModel.imgUrl contentlist.imageurls.get(0).url;pictureTitleViewModel.title contentlist.title;pictureTitleViewModel.jumpUrl contentlist.link;viewModels.add(pictureTitleViewModel);} else {TitleViewModel titleViewModel new TitleViewModel();titleViewModel.title contentlist.title;titleViewModel.jumpUrl contentlist.link;viewModels.add(titleViewModel);}}return Observable.just(viewModels);}}).subscribe(new ConsumerArrayListBaseViewModel() {Overridepublic void accept(ArrayListBaseViewModel baseViewModels) throws Exception {mPageNum;mListener.onLoadSuccess(baseViewModels);}});}public void refresh() {mPageNum 1;load();} }然后 NewListFragment 重构如下 public class NewsListFragment extends Fragment implements IBaseModelListenerArrayListBaseViewModel {private NewsListRecyclerViewAdapter mAdapter;private FragmentNewsBinding viewDataBinding;private NewsListModel mNewsListModel;protected final static String BUNDLE_KEY_PARAM_CHANNEL_ID bundle_key_param_channel_id;protected final static String BUNDLE_KEY_PARAM_CHANNEL_NAME bundle_key_param_channel_name;public static NewsListFragment newInstance(String channelId, String channelName) {NewsListFragment fragment new NewsListFragment();Bundle bundle new Bundle();bundle.putString(BUNDLE_KEY_PARAM_CHANNEL_ID, channelId);bundle.putString(BUNDLE_KEY_PARAM_CHANNEL_NAME, channelName);fragment.setArguments(bundle);return fragment;}Overridepublic View onCreateView(NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {viewDataBinding DataBindingUtil.inflate(inflater, R.layout.fragment_news, container, false);mAdapter new NewsListRecyclerViewAdapter(getContext());viewDataBinding.listview.setHasFixedSize(true);viewDataBinding.listview.setLayoutManager(new LinearLayoutManager(getContext()));viewDataBinding.listview.setAdapter(mAdapter);mNewsListModel new NewsListModel(this, getArguments().getString(BUNDLE_KEY_PARAM_CHANNEL_ID),getArguments().getString(BUNDLE_KEY_PARAM_CHANNEL_NAME));mNewsListModel.load();viewDataBinding.refreshLayout.setOnRefreshListener(new OnRefreshListener() {Overridepublic void onRefresh(NonNull RefreshLayout refreshLayout) {mNewsListModel.refresh();}});viewDataBinding.refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {Overridepublic void onLoadMore(NonNull RefreshLayout refreshLayout) {mNewsListModel.load();}});return viewDataBinding.getRoot();}Overridepublic void onLoadSuccess(ArrayListBaseViewModel baseViewModels) {contentList.addAll(baseViewModels);mAdapter.setData(contentList);viewDataBinding.refreshLayout.finishRefresh();viewDataBinding.refreshLayout.finishLoadMore();}Overridepublic void onLoadFail(int errorCode, String errorMsg) {} }我们这个页面的数据加载涉及到了分页的逻辑我们需要将回调的结果带上分页的结果要告知 View 是加载的哪一页我们需要一个分页结果 public class PageResult {private boolean isFirstPage;private boolean isEmpty;private boolean hasNextPage;public PageResult(boolean isFirstPage, boolean isEmpty, boolean hasNextPage) {this.isFirstPage isFirstPage;this.isEmpty isEmpty;this.hasNextPage hasNextPage;} }然后我们修改回调结果的 Listener这个接口是公共的也就是说有的需要分页结果有的不需要分页结果那么就需要一个可变参数 public interface IBaseModelListenerDATA {void onLoadSuccess(DATA data, PageResult... pageResults);void onLoadFail(int errorCode, String errorMsg); }然后NewsListModel 的回调带上这个 PageResult mListener.onLoadSuccess(baseViewModels,new PageResult(mPageNum 1, baseViewModels.isEmpty(), baseViewModels.size() 10));onLoadSuccess 的回调改造如下 Override public void onLoadSuccess(ArrayListBaseViewModel baseViewModels, PageResult... pageResults) {if (pageResults ! null pageResults.length 0 pageResults[0].isFirstPage) {contentList.clear();}contentList.addAll(baseViewModels);mAdapter.setData(contentList);viewDataBinding.refreshLayout.finishRefresh();viewDataBinding.refreshLayout.finishLoadMore(); }到这的时候我们的 model 层就抽离出来了可能看到这的时候好多人就疑问了你这也没使用 Jetpack 的 ViewModel 和 LiveData 呀别着急我们精彩的还在后面 BaseModel 可以看到NewChannelModel 和 NewListModel 中都有 IBaseModelListener这个是可以抽取到 base 层的所以我们可以创建一个 BaseMvvmModel 来抽取它 public abstract class BaseMvvmModel {protected WeakReferenceIBaseModelListener mReferenceIBaseModeListener;public void register(IBaseModelListener listener) {if (listener ! null) {mReferenceIBaseModeListener new WeakReference(listener);}} }然后NewListModel 和 NewsChannelModel 分别继承 BaseMvvmModel同时移除子类 model 中的 IBaseModelListener 的声明 public class NewsListModel extends BaseMvvmModel {private int mPageNum;private final String mChannelId;private final String mChannelName;public NewsListModel(String channelId, String channelName) {this.mChannelId channelId;this.mChannelName channelName;}public void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsList(mChannelId,mChannelName, String.valueOf(mPageNum)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(new FunctionNewsListBean, ObservableSourceArrayListBaseViewModel() {Overridepublic ObservableSourceArrayListBaseViewModel apply(NewsListBean newsChannelsBean) throws Exception {ArrayListBaseViewModel viewModels new ArrayList();for (NewsListBean.Contentlist contentlist : newsChannelsBean.showapiResBody.pagebean.contentlist) {if (contentlist.imageurls ! null contentlist.imageurls.size() 0) {PictureTitleViewModel pictureTitleViewModel new PictureTitleViewModel();pictureTitleViewModel.imgUrl contentlist.imageurls.get(0).url;pictureTitleViewModel.title contentlist.title;pictureTitleViewModel.jumpUrl contentlist.link;viewModels.add(pictureTitleViewModel);} else {TitleViewModel titleViewModel new TitleViewModel();titleViewModel.title contentlist.title;titleViewModel.jumpUrl contentlist.link;viewModels.add(titleViewModel);}}return Observable.just(viewModels);}}).subscribe(new ConsumerArrayListBaseViewModel() {Overridepublic void accept(ArrayListBaseViewModel baseViewModels) throws Exception {mPageNum;mReferenceIBaseModeListener.get().onLoadSuccess(baseViewModels,new PageResult(mPageNum 1, baseViewModels.isEmpty(), baseViewModels.size() 10));}});}public void refresh() {mPageNum 1;load();} }NewsChannelModel 重构如下 public class NewsChannelModel extends BaseMvvmModel {public NewsChannelModel() {}public void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsChannels().compose(TecentNetworkApi.getInstance().applySchedulers(new BaseObserverNewsChannelsBean() {Overridepublic void onSuccess(NewsChannelsBean newsChannelsBean) {mReferenceIBaseModeListener.get().onLoadSuccess(newsChannelsBean.showapiResBody.channelList);}Overridepublic void onFailure(Throwable e) {e.printStackTrace();mReferenceIBaseModeListener.get().onLoadFail(400, e.getMessage());}}));} }然后对应的 Fragment 也需要重构下 mNewsListModel new NewsListModel(getArguments().getString(BUNDLE_KEY_PARAM_CHANNEL_ID),getArguments().getString(BUNDLE_KEY_PARAM_CHANNEL_NAME)); mNewsListModel.register(this);model new NewsChannelModel(); model.register(this);然后我们的 page 其实也可以抽取到 base 层通过可变参数的形式来决定分页的内容以及是否要分页所以 BaseMvvmModel 继续重构 public abstract class BaseMvvmModel {protected WeakReferenceIBaseModelListener mReferenceIBaseModeListener;protected boolean mIsPaging;protected final int INIT_PAGE_NUMBER;public BaseMvvmModel(boolean isPaging, int... initPageNumber) {if (isPaging initPageNumber ! null initPageNumber.length 0) {INIT_PAGE_NUMBER initPageNumber[0];} else {INIT_PAGE_NUMBER -1;}}public void register(IBaseModelListener listener) {if (listener ! null) {mReferenceIBaseModeListener new WeakReference(listener);}} }子类实现中也需要重构下 NewsChannelModel 的构造方法重构如下 public NewsChannelModel() {super(false); }NewsListModel 的构造方法重构如下 public NewsListModel(String channelId, String channelName) {super(true, 1);this.mChannelId channelId;this.mChannelName channelName; }到这里的时候有人可能会问INIT_PAGE_NUMBER 没有用到呀定义它做什么别急它来了我们其实也可以把 NewListModel 中的 refresh 和 load 提取到 base 层 public abstract class BaseMvvmModel {public void refresh() {mPageNum INIT_PAGE_NUMBER;load();}public abstract void load(); }这样我们定义的 INIT_PAGE_NUMBER 是不是就使用到了然后我们还可以给 refresh 加上多次加载控制如果正在加载中则不触发二次请求所以需要我们定义一个变量来控制是否正在加载同时我们来区分下加载下一页和加载 public abstract class BaseMvvmModel {protected boolean isLoading;public void refresh() {if (!isLoading) {if (mIsPaging) {mPageNum INIT_PAGE_NUMBER;}isLoading true;load();}}public void loadNextPage() {if (!isLoading) {isLoading true;load();}} }另外我们在子类 model 中分别操作了 BaseMvvmModel 中的 mPageNum 和 mReferenceIBaseModeListener 这两个的操作也是需要抽取到 base 层的我们来继续重构 public abstract class BaseMvvmModelRESULT_DATA {//protected void notifyResultToListener(RESULT_DATA data) {IBaseModelListener listener mReferenceIBaseModeListener.get();if (listener ! null) {if (mIsPaging) {listener.onLoadSuccess(this, data, new PageResult(mPageNum INIT_PAGE_NUMBER, data null?true: ((List)data).isEmpty(), ((List)data).size() 10));} else {listener.onLoadSuccess(this, data);}}if (mIsPaging) {if (data ! null ((List)data).size() 0) {mPageNum ;}}isLoading false;}protected void loadFail(int errorCode, String errorMsg) {IBaseModelListener listener mReferenceIBaseModeListener.get();if (listener ! null) {listener.onLoadFail(errorCode, errorMsg);}isLoading false;} }然后子类 model 中直接调用对应的 notifyResultToListener 和 loadFail NewsListModel subscribe(new ConsumerArrayListBaseViewModel() {Overridepublic void accept(ArrayListBaseViewModel baseViewModels) throws Exception {notifyResultToListener(baseViewModels);} });NewsChannelModel .compose(TecentNetworkApi.getInstance().applySchedulers(new BaseObserverNewsChannelsBean() {Overridepublic void onSuccess(NewsChannelsBean newsChannelsBean) {notifyResultToListener(newsChannelsBean.showapiResBody.channelList);}Overridepublic void onFailure(Throwable e) {e.printStackTrace();loadFail(404, e.getMessage());} }));数据缓存 如果我们在无网的情况下打开 app通常会展示一片空白体验很不好所以就需要我们提前将数据缓存下来当用户无网打开的时候不至于显示一片白 首先我们来提供一个 CacheData public class BaseCachedDataDATA {public long updateTimeInMills;public DATA data; }然后我们需要对 BaseMvvmModel 进行重构增加缓存逻辑 public abstract class BaseMvvmModelNETWORK_DATA, RESULT_DATA {private String mCachedPreferenceKey;private BaseCachedDataNETWORK_DATA mData;public BaseMvvmModel(boolean isPaging, String cachedPreferenceKey, int... initPageNumber) {if (isPaging initPageNumber ! null initPageNumber.length 0) {INIT_PAGE_NUMBER initPageNumber[0];} else {INIT_PAGE_NUMBER -1;}// 增加缓存keythis.mCachedPreferenceKey cachedPreferenceKey;}protected void notifyResultToListener(NETWORK_DATA networkData, RESULT_DATA data) {IBaseModelListener listener mReferenceIBaseModeListener.get();if (listener ! null) {if (mIsPaging) {listener.onLoadSuccess(this, data, new PageResult(mPageNum INIT_PAGE_NUMBER, data null ? true : ((List) data).isEmpty(), ((List) data).size() 10));} else {listener.onLoadSuccess(this, data);}}// 增加缓存逻辑将网络数据缓存到本地if (mIsPaging) {if (mCachedPreferenceKey ! null mPageNum INIT_PAGE_NUMBER) {saveDataToPreference(networkData);}} else {if (mCachedPreferenceKey ! null) {saveDataToPreference(networkData);}}if (mIsPaging) {if (data ! null ((List) data).size() 0) {mPageNum;}}}private void saveDataToPreference(NETWORK_DATA networkData) {if (networkData ! null) {BaseCachedDataNETWORK_DATA baseCachedData new BaseCachedData();baseCachedData.data networkData;baseCachedData.updateTimeInMills System.currentTimeMillis();// 这里可以调换成自己的 spUtilsBasicDataPreferenceUtil.getInstance().setString(mCachedPreferenceKey, new Gson().toJson(baseCachedData));}} }同时 NewsChannelModel 和 NewsListModel 的构造方法以及 load 实现也需要重构下增加需要缓存的数据的传入 public class NewsChannelModel extends BaseMvvmModelNewsChannelsBean, ListNewsChannelsBean.ChannelList {public NewsChannelModel() {super(false, NEWS_CHANNEL_PREF_KEY);}Overridepublic void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsChannels().compose(TecentNetworkApi.getInstance().applySchedulers(new BaseObserverNewsChannelsBean() {Overridepublic void onSuccess(NewsChannelsBean newsChannelsBean) {notifyResultToListener(newsChannelsBean, newsChannelsBean.showapiResBody.channelList);}Overridepublic void onFailure(Throwable e) {e.printStackTrace();mReferenceIBaseModeListener.get().onLoadFail(400, e.getMessage());}}));} }NewsListModel 重构如下 public class NewsListModel extends BaseMvvmModelNewsListBean, ArrayListBaseViewModel {private final String mChannelId;private final String mChannelName;private NewsListBean mNewsListBean;public NewsListModel(String channelId, String channelName) {super(true, channelId channelName pref_key, 1);this.mChannelId channelId;this.mChannelName channelName;}Overridepublic void load() {TecentNetworkApi.getService(NewsApiInterface.class).getNewsList(mChannelId,mChannelName, String.valueOf(mPageNum)).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).flatMap(new FunctionNewsListBean, ObservableSourceArrayListBaseViewModel() {Overridepublic ObservableSourceArrayListBaseViewModel apply(NewsListBean newsChannelsBean) throws Exception {ArrayListBaseViewModel viewModels new ArrayList();NewsListModel.this.mNewsListBean newsChannelsBean;for (NewsListBean.Contentlist contentlist : newsChannelsBean.showapiResBody.pagebean.contentlist) {if (contentlist.imageurls ! null contentlist.imageurls.size() 0) {PictureTitleViewModel pictureTitleViewModel new PictureTitleViewModel();pictureTitleViewModel.imgUrl contentlist.imageurls.get(0).url;pictureTitleViewModel.title contentlist.title;pictureTitleViewModel.jumpUrl contentlist.link;viewModels.add(pictureTitleViewModel);} else {TitleViewModel titleViewModel new TitleViewModel();titleViewModel.title contentlist.title;titleViewModel.jumpUrl contentlist.link;viewModels.add(titleViewModel);}}return Observable.just(viewModels);}}).subscribe(new ConsumerArrayListBaseViewModel() {Overridepublic void accept(ArrayListBaseViewModel baseViewModels) throws Exception {notifyResultToListener(NewsListModel.this.mNewsListBean, baseViewModels);}});} }OK运行可以看到数据已经存到了 SP 中 好了中篇文章就讲解到这里吧 下一章预告 MVVM 实战一个新闻客户端 (下) 欢迎三连 来都来了点个关注点个赞吧你的支持是我前进的最大动力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88007.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的网站开发语言有哪些个人域名备案查询

css高度设置为auto后,设置的边框 ie正常 火狐 就没有边框了,解决方法 之前是这样写的 #right_bottom { width: 790px; height:auto; border: #EBEBEB 1px solid; } 最后添加了一个overflow: hidden;属性ok了,ie火狐都可以显示边框 即: #right_bottom {…

做的网站加载太慢怎么办注册网站有什么风险吗

公司一台服务器,上面装了filezilla server后,按平常配置好了,但是在本地用FTP客户端不管怎么连接都连接不上,本地FTP客户端总提示连接失败,远程filezilla server的界面也没有提示有人连接, 仔细看了一下&am…

桂林哪里做网站东莞网站建设公司排名

笔记本电脑的电池健康状况至关重要。延长电池寿命可以帮你省下不少钱。对于长时间充电的Windows 11笔记本电脑用户来说,将电池电量限制在80%是很重要的。 虽然操作系统没有提供设置自定义电池充电限制的内置方法,但仍有一些方法可以在Windows 11中配置电池设置,并将其限制在…

充值选建设银行打不开网站网站安全建设的重要性

参考《计算机组成》(北京大学 MOOC) 1 异常与中断的来源(为什么需要中断) 首先,说明一下异常和中断这两个概念。 它们两个唯一的区别,就是,没有什么区别。只是不同的地方不同的时间不同的人的…

南京企业建站系统模板nodejs 做网站

一、基于域名的虚拟主机 修改配置文件/usr/local/nginx/conf/nginx.conf 创建新的虚拟主机的根目录和默认网页index.html 重新加载nginx的配置文件 查看两个虚拟主机 因为这两个域名是随便写的,所以需要修改windows系统的hosts文件,让电脑能够解析www.a.…

常州网站seo做网站需要空间

450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可…

手游门户网站建设网站开发必须要做前端吗

我们借鉴之前抓取台风路径数据的例子,试一试抓取降水量数据:之前我们访问过这个网站,也试着抓取过数据,不过在谷歌浏览器中我们只能够找到两天的数据,但是通过台风路径数据抓取,我们猜想只要我们向服务器提…

网站轮播效果怎么做的网站建设首选玖艺建站信得过

目录 一、concat() 二、join() 三、push() 四、pop() 五、shift() 六、unshift() 七、slice() 九、substring() 和 substr() 十、sort 排序 十一、reverse() 十二、indexOf 和 lastIndexOf 十三、every 十四、some 十五、filter 十六、map ES6新增新操作数组的…

网站怎么做一级域名跳转南京公司网站设计定制

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁…

成都工程建设项目网站做网站怎么签订协议

ArcGIS 9.2补丁真是不少,快把开发人员给淹没了,之前版本的ArcGIS从来没有发布过sp4,现在已经通知马上要发布sp5,修正了大量desktop、engine、server上的bug,估计这应该是9.2最后一组补丁了,记得上次Jack来北…

在网站中动态效果怎么做小程序个人开发全过程

文章目录 优先队列相关操作堆化入堆出堆获取堆顶元素小根堆与大根堆 华为OD算法/大厂面试高频题算法练习冲刺训练 优先队列相关操作 注意,优先队列(priority queue)也叫做堆(heap)。谈到优先队列时,一般强调…

专门做化妆品平台的网站有哪些深圳网络科技有限公司有哪些

前言用了那么多年的express.js,终于有时间来深入学习express,然后顺便再和koa2的实现方式对比一下。老实说,还没看express.js源码之前,一直觉得express.js还是很不错的,无论从api设计,还是使用上都是可以的…

董家渡街道网站建设蚌埠市建设工程质监站网站

试卷编号:0134 期末考 劳动法学试题答案 1、劳动法的调整对象 2、竞业限制 3.职工培训 4.行政责任 二、单项选择题(每题4分,共20分) 考生注意:必须将正确答案填入表格中,否则该…

企业网站空间多大合适网站qq访客统计

802.11w(PFM) Protected Management Frames,802.11w协议主要基于现有的对数据报文的加密形式,对管理帧进行类似的加密。802.11w需要加密的管理帧包括解关联帧、去认证帧及强壮Action帧。 802.11k(RRM) Radio Resource …

青岛外贸网站设计松江九亭网站建设

;GET和INCLUDE功能相同 ;功能:引进一个被编译过的文件。 GET option.inc GET memcfg.inc GET 2440addr.inc ;EQU为程序中的常量、标号等定义一个等效的字符名称 ;定义SDRAM工作在Refresh模式,SDRAM有两种刷新方式:autorefresh和selfrefresh&a…

做网站 就上凡科网中国网站设计欣赏

最大连续子矩阵算法 暴力求解不可取 或许可以从 O(n)复杂度内求解最大连续子数组的算法 得到灵感 O(n2)复杂度求最大连续子矩阵和算法: 创建一个新矩阵sum,sum[i][j]存放sun[i][0-j]的和每个候选矩阵由左上角matrix[i][j]和右下角的元素matrix[p][q]确定…

织梦cms 5.6网站地图合肥网站搭建公司哪家好

2024年认证杯C题的已经完成啦,包括参考论文,模型代码,分享给大家~ 问题分析 对于这些问题,我们首先需要确定影响日光辐射降低效应的关键参数,例如海盐气溶胶的浓度、粒子大小、分布以及喷洒高度和范围。同…

做字幕网站微信文章同步到wordpress

转自——http://blog.csdn.net/v_july_v/article/details/7041827 看到kmp是不是立即想到(*ο*) 哇~,那个东西啊,就是拿来放电影的那个啊! 哦,但是这里我们说的并不是那个东西,身为一名C选手,我…

公司网站在哪备案网页广告屏蔽

https://bbs.espressif.com/viewtopic.php?t75242#p100294 https://blog.csdn.net/ydogg/article/details/72598752

注册网站需要多少钱上海怎样做网站

路由器配置DMZ主机映射 光猫路由模式配置方法 光猫路由模式是用光猫进行拨号连接,所有设备通过光猫访问互联网,只需要设置光猫的DMZ主机映射地址为局域网主机即可 光猫桥接模式配置方法 光猫桥接模式,是穿透光猫,通过路由器拨…