移动应用开发大作业报告

news2024/11/25 11:32:07

1 基本信息

1.1 系统名称

中华字典

1.2 开发运行环境

开发环境:Windows 10 专业版,JDK 1.8,AndroidStudio

运行环境:Java SE Runtime Environment (JRE) 8

1.3 使用的核心技术

JFrame:作为实现界面的窗体类,用于创建图形用户界面。

Random:用来产生随机数,为系统提供随机性支持。

Swing:用于构建丰富的图形用户界面组件。

JDBC:Java Database Connectivity,用于Java程序与数据库之间的连接。

SQL:结构化查询语言,用于管理和查询数据库。

2 系统功能设计

2.1 系统总体功能

中华字典是一款基于Java开发的字典查询系统。该系统旨在为用户提供便捷、准确的汉字、词语查询服务,支持拼音查询、部首查询等多种查询方式。同时,系统还提供了详细的词语解释、例句、同义词、反义词等扩展信息,帮助用户更深入地理解词语的含义和用法。

2.2 系统模块详细设计

2.2.1 拼音查询功能模块

用户通过输入拼音来查询对应的汉字或词语。系统根据输入的拼音在数据库中检索,并返回相关结果。结果页面将展示匹配的汉字或词语列表,并提供详细的解释、例句、同义词、反义词等信息。

2.2.2 部首查询模块功能模块

用户通过选择部首来查询含有该部首的汉字。系统根据选择的部首在数据库中检索,并返回相关结果。用户可进一步筛选查询结果,以便快速定位到所需汉字。

2.2.3 成语查询功能模块

用户通过输入成语或成语的关键词来查询相关的成语信息。系统根据输入的关键词在数据库中检索,并返回相关成语列表。用户可查看成语的解释、出处、用法示例等信息。

2.2.4 成语接龙小游戏功能模块

用户可参与成语接龙小游戏,通过输入成语的最后一个字来寻找下一个成语的开头字,以完成接龙。

3 系统实现

3.1 拼音查询功能实现

3.1.1 功能描述

用户输入拼音后,系统通过调用后端接口进行数据库查询,并将查询结果返回给前端页面进行展示。前端页面提供输入框供用户输入拼音,同时展示查询结果列表和相关解释信息。

3.1.2 核心代码

package com.example.dict;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.text.TextUtils;

import android.view.View;

import android.widget.ExpandableListView;

import com.example.dict.adapter.SearchLeftAdapter;

import com.example.dict.bean.PinBuBean;

import com.example.dict.bean.PinBuWordBean;

import com.example.dict.db.DBManager;

import com.example.dict.utils.AssetsUtils;

import com.example.dict.utils.CommonUtils;

import com.example.dict.utils.URLUtils;

import com.google.gson.Gson;

import com.handmark.pulltorefresh.library.PullToRefreshGridView;

import java.util.ArrayList;

import java.util.List;

public class SearchPinyinActivity extends BaseSearchActivity {

    String url;   //获取指定拼音对应的网址

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        //加载文件数据

       initData(CommonUtils.FILE_PINYIN,CommonUtils.TYPE_PINYIN);

        setExLvListener(CommonUtils.TYPE_PINYIN);

        exLv.expandGroup(0);   //默认展开第一组

        word = "a";     //默认进去时获取的是第一个 a

        url = URLUtils.getPinyinurl(word,page,pagesize);

        // 加载网络数据

        loadData(url);

       setGVListener(CommonUtils.TYPE_PINYIN);

    }

    /**

     * 网络获取失败时会调用的接口

     * 因为拼音查询和部首查询使用的获取数据的方法不一样,所以需要分开写。

     * 所以就把onError的方法写入到子类当中

     * */

    @Override

    public void onError(Throwable ex, boolean isOnCallback) {

        List<PinBuWordBean.ResultBean.ListBean> list = DBManager.queryPyWordFromPywordtb(word, page, pagesize);

        refreshDataByGV(list);

    }

}

3.1.3 运行截图

3.2 部首查询模块功能实现

3.2.1 功能描述

用户通过选择部首来查询含有该部首的汉字。系统根据选择的部首在数据库中检索,并返回相关结果。用户可进一步筛选查询结果,以便快速定位到所需汉字。

3.2.2 核心代码

package com.example.dict;

import android.os.Bundle;

import com.example.dict.bean.PinBuWordBean;

import com.example.dict.db.DBManager;

import com.example.dict.utils.CommonUtils;

import com.example.dict.utils.URLUtils;

import java.util.List;

public class SearchBuShouActivity extends BaseSearchActivity {

    String url;   //获取指定部首对应的网址

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // 页面跳转,Title也要一起改变

        titleTv.setText(R.string.main_tv_bushou);

        //加载文件数据

       initData(CommonUtils.FILE_BUSHOU,CommonUtils.TYPE_BUSHOU);

        //开启部首的监听事件

        setExLvListener(CommonUtils.TYPE_BUSHOU);

        exLv.expandGroup(0);   //默认展开第一组

        word = "丨";     //默认进去时获取的是第一个

        url = URLUtils.getBushouurl(word,page,pagesize);

        // 加载网络数据

        loadData(url);

        setGVListener(CommonUtils.TYPE_BUSHOU);

    }

    @Override

    public void onError(Throwable ex, boolean isOnCallback) {

        List<PinBuWordBean.ResultBean.ListBean> list = DBManager.queryBsWordFromPywordtb(word, page, pagesize);

        refreshDataByGV(list);

    }

}

3.2.3 运行截图

3.3 成语查询模块功能实现

3.3.1 功能描述

3.3.2 核心代码

package com.example.dict;

import android.content.Intent;

import android.os.Bundle;

import android.text.TextUtils;

import android.view.View;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.TextView;

import android.widget.Toast;

import com.example.dict.bean.ChengyuBean;

import com.example.dict.db.DBManager;

import com.example.dict.utils.MyGridView;

import com.example.dict.utils.URLUtils;

import com.google.gson.Gson;

import java.util.ArrayList;

import java.util.List;

public class ChengyuInfoActivity extends BaseActivity {

    // 页面中的是个textView

    TextView ziTv1,ziTv2,ziTv3,ziTv4,pyTv,jsTv,fromTv,exampleTv,yufaTv,yinzhengTv,yinghangTv;

    MyGridView tyGv,fyGv;

    ImageView collectIv;

    private String chengyu;

    List<String> tongyiList,fanyinList;    //GridView的数据源

    ArrayAdapter<String> tyAdapter,fyAdapter;

    //    设置标志位,表示汉字是否被收藏

    boolean isCollect = false;

    boolean isExist = false;    //判断这个汉字是否已经存在

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_chengyu_info);

        initView();

        initAdapter();

//        获取上一个页面传递的数据

        Intent intent = getIntent();

        chengyu = intent.getStringExtra("chengyu");

        String url = URLUtils.getChengyuurl(chengyu);

        loadData(url);

        isExist = DBManager.isExistCyuInCollcyutb(chengyu);

        isCollect = isExist;

        setCollectIvStyle();

    }

    /* 根据收藏的状态,改变星星的颜色*/

    private void setCollectIvStyle() {

        if (isCollect) {

        collectIv.setImageResource(R.mipmap.ic_collection_fs);

        }else{

            collectIv.setImageResource(R.mipmap.ic_collection);

        }

    }

    /**

     *  为GridView设置加载数据的适配器和数据源

     */

    private void initAdapter() {

        tongyiList = new ArrayList<>();

        fanyinList = new ArrayList<>();

        tyAdapter = new ArrayAdapter<>(this, R.layout.item_word_jslv, R.id.item_wordlv_tv, tongyiList);

        fyAdapter = new ArrayAdapter<>(this, R.layout.item_word_jslv, R.id.item_wordlv_tv, fanyinList);

        tyGv.setAdapter(tyAdapter);

        fyGv.setAdapter(fyAdapter);

    }

    /** 网络数据加载成功时回调用的方法*/

    @Override

    public void onSuccess(String result) {

        // 使用Gson反序列化映射成为javaBean

        ChengyuBean bean = new Gson().fromJson(result, ChengyuBean.class);

        ChengyuBean.ResultBean cyBean = bean.getResult();

        if (cyBean!=null) {

//        因数据源当中不包括成语本身,但是后期要插入数据库,所以需要保存这个成语

            cyBean.setChengyu(chengyu);

            // 插入到数据库当中

            DBManager.insertCyToCyutb(cyBean);

            // 显示数据

            showDataToView(cyBean);

        }else{

            Toast.makeText(this,"此成语无法查到,请重新查询!",Toast.LENGTH_SHORT).show();

        }

    }

    /* 网络加载数据失败时,会调用的方法*/

    @Override

    public void onError(Throwable ex, boolean isOnCallback) {

//        获取数据库当中缓存的数据

        ChengyuBean.ResultBean bean = DBManager.queryCyFromCyutb(chengyu);

        if (bean!=null) {

            showDataToView(bean);

        }

    }

    /**

     * 将获取到的数据显示在View上

     * */

    private void showDataToView(ChengyuBean.ResultBean cyBean) {

        String chengyu = cyBean.getChengyu();

        ziTv1.setText(String.valueOf(chengyu.charAt(0)));

        ziTv2.setText(String.valueOf(chengyu.charAt(1)));

        ziTv3.setText(String.valueOf(chengyu.charAt(2)));

        ziTv4.setText(String.valueOf(chengyu.charAt(3)));

        pyTv.setText("拼音 : "+cyBean.getPinyin());

        jsTv.setText(cyBean.getChengyujs());

        fromTv.setText(cyBean.getFrom_());

        exampleTv.setText(cyBean.getExample());

        yufaTv.setText(cyBean.getYufa());

        yinzhengTv.setText(cyBean.getYinzhengjs());

        String ciyujs = cyBean.getCiyujs();

        if (!TextUtils.isEmpty(ciyujs)) {

            ciyujs = ciyujs.replace("]", "\n").replace("[", "").replace(":", "");

            yinghangTv.setText(ciyujs);

        }

        List<String> tList = cyBean.getTongyi();

//        判断是否有同义词

        if (tList!=null&&tList.size()!=0) {

            tongyiList.addAll(tList);

            tyAdapter.notifyDataSetChanged();

        }

        List<String> fList = cyBean.getFanyi();

        if (fList!=null&&fList.size()!=0) {

            fanyinList.addAll(fList);

            fyAdapter.notifyDataSetChanged();

        }

    }

    /**

     * 查找控件的方法

     * */

    private void initView() {

        ziTv1 = findViewById(R.id.cyinfo_tv_zi1);

        ziTv2 = findViewById(R.id.cyinfo_tv_zi2);

        ziTv3 = findViewById(R.id.cyinfo_tv_zi3);

        ziTv4 = findViewById(R.id.cyinfo_tv_zi4);

        pyTv = findViewById(R.id.cyinfo_tv_py);

        jsTv = findViewById(R.id.cyinfo_tv_js);

        fromTv = findViewById(R.id.cyinfo_tv_from);

        exampleTv = findViewById(R.id.cyinfo_tv_example);

        yufaTv = findViewById(R.id.cyinfo_tv_yufa);

        yinzhengTv = findViewById(R.id.cyinfo_tv_yinzheng);

        yinghangTv = findViewById(R.id.cyinfo_tv_yinghan);

        tyGv = findViewById(R.id.cyinfo_gv_tongyi);

        fyGv = findViewById(R.id.cyinfo_gv_fanyi);

        collectIv = findViewById(R.id.cyinfo_iv_collection);

    }

    public void onClick(View view) {

        switch (view.getId()) {

            case R.id.cyinfo_iv_back:

                finish();

                break;

            case R.id.cyinfo_iv_collection:

                isCollect = !isCollect;

                setCollectIvStyle();

                break;

        }

    }

    protected void onDestroy() {

        super.onDestroy();

        if (isExist&&!isCollect) {

            DBManager.deleteCyuToCollcyutb(chengyu);

        }

        if (!isExist&&isCollect) {

            DBManager.insertCyuToCollcyutb(chengyu);

        }

    }

}

3.3.3 运行截图

3.4 成语接龙小游戏功能实现

3.4.1 功能描述

用户可参与成语接龙小游戏,通过输入成语的最后一个字来寻找下一个成语的开头字,以完成接龙。

3.4.2 核心代码

package com.example.dict;

import androidx.annotation.Nullable;

import androidx.appcompat.app.AlertDialog;

import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;

import android.content.Intent;

import android.os.Bundle;

import android.os.CountDownTimer;

import android.util.Log;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;

import android.widget.Toast;

import com.example.dict.BaseActivity;

import com.google.gson.Gson;

import com.example.dict.bean.ChengYuJieLongBean;

import com.example.dict.bean.ChengyuBean;

import com.example.dict.bean.WordBean;

import com.example.dict.db.DBManager;

import com.example.dict.filter.LimitInputTextWatcher;

import com.example.dict.utils.URLUtils;

public class ChengYuJieLongActivity  extends BaseActivity {

    EditText chengyu_et;

    Button sure;

    TextView word1,word2,word3,word4,word5,word6,word7,word8,timeout,level;

    ImageView back;

    LinearLayout chengjiebg;

    char myChar[],newChar[];

    String str,chengyu="";

    int i=1;

    Intent intent;

    CountDownTimer timer;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_cheng_yu_jie_long);

        inital();

        chengyu_et.addTextChangedListener(new LimitInputTextWatcher(chengyu_et));

        intent = getIntent();

        i = intent.getIntExtra("level",1);

        chengyu=intent.getStringExtra("accchengyu");

        if(chengyu!=""){

            String url = URLUtils.getChengyujielongurl(chengyu);

            loadData(url);

        }

        chengjiebg.setBackgroundResource(getResources().getIdentifier("gufeng"+i, "drawable", getApplicationInfo().packageName));

        level.setText("关卡:"+i);

        String url = URLUtils.getChengyujielongurl(str);

        loadData(url);

//        设置倒计时

         timer = new CountDownTimer(300000, 1000) {

            public void onTick(long millisUntilFinished) {

            timeout.setText(String.valueOf(millisUntilFinished / 1000));

            }

            public void onFinish() {

                showEndingNormalDialog();

            }

        };

            //调用 CountDownTimer 对象的 start() 方法开始倒计时,也不涉及到线程处理

                    timer.start();

                }

    public void inital(){

        chengyu_et=findViewById(R.id.chengyu_et);

        sure=findViewById(R.id.sure);

        back=findViewById(R.id.chengyujielong_iv_back);

        word1=findViewById(R.id.word_1);

        word2=findViewById(R.id.word_2);

        word3=findViewById(R.id.word_3);

        word4=findViewById(R.id.word_4);

        word5=findViewById(R.id.word_5);

        word6=findViewById(R.id.word_6);

        word7=findViewById(R.id.word_7);

        word8=findViewById(R.id.word_8);

        timeout=findViewById(R.id.timeout);

        level=findViewById(R.id.level);

        chengjiebg=findViewById(R.id.chengjiebg);

    }

    public void onClick(View view) {

        switch (view.getId()){

            case R.id.chengyujielong_iv_back:

                Intent intent3 = new Intent(ChengYuJieLongActivity.this, MainActivity.class);

                startActivity(intent3);

                break;

            case R.id.sure:

                str=chengyu_et.getText().toString();

                if(str.length()!=4){

//                    Toast.makeText(getApplicationContext(), "您需要输入四个汉字",

//                            Toast.LENGTH_SHORT).show();

                    Toast toast=new Toast(ChengYuJieLongActivity.this);

//创建一个填充物,用于填充Toast

                    LayoutInflater inflater = LayoutInflater.from(ChengYuJieLongActivity.this);

//填充物来自的xml文件,在这个改成一个view

//实现xml到view的转变哦

                    View view2 =inflater.inflate(R.layout.toast,null);

//不一定需要,找到xml里面的组件,设置组件里面的具体内容

                    ImageView imageView1=view2.findViewById(R.id.iv_toast);

                    TextView textView1=view2.findViewById(R.id.tv_toast);

                imageView1.setImageResource(R.drawable.input);

                    textView1.setText("您需要输入四个汉字");

//把填充物放进toast

                    toast.setView(view2);

                    toast.setDuration(Toast.LENGTH_SHORT);

//                    toast位置居中

                    toast.setGravity(Gravity.CENTER,0,0);

//展示toast

                    toast.show();

                }

                else {

                    myChar = str.toCharArray();

                 word5.setText(Character.toString(myChar[0]));

                 word6.setText(Character.toString(myChar[1]));

                 word7.setText(Character.toString(myChar[2]));

                 word8.setText(Character.toString(myChar[3]));

                    Intent intent = new Intent(ChengYuJieLongActivity.this, IsChengYuActivity.class);

                    intent.putExtra("chengyu", str);

                    startActivityForResult(intent, 3);

                    break;

                }

        }



    }

    /* 网络数据加载成功时回调用的方法*/

    public void onSuccess(String json) {

        ChengYuJieLongBean cyjlBean = new Gson().fromJson(json, ChengYuJieLongBean.class);

        ChengYuJieLongBean.ResultBean resultBean = cyjlBean.getResult();

        String mychengyu=resultBean.getData().get(0);

        newChar = mychengyu.toCharArray();

        word1.setText(Character.toString(newChar[0]));

        word2.setText(Character.toString(newChar[1]));

        word3.setText(Character.toString(newChar[2]));

        word4.setText(Character.toString(newChar[3]));

    }

    @Override

    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == 3 && resultCode == RESULT_OK) {

            String chengyuvalue = data.getStringExtra("chengyu");

            if (chengyuvalue.equals("否")) {

                Toast.makeText(getApplicationContext(), "您输入的不是成语!",

                      Toast.LENGTH_SHORT).show();

            } else {

         if(Character.toString(myChar[0]).equals(word4.getText()) && chengyuvalue.equals("是")){

//                    String url = URLUtils.getChengyujielongurl(str);

//                    loadData(url);

//                    Toast.makeText(getApplicationContext(), "您回答正确!",  Toast.LENGTH_SHORT).show();

word5.setBackground(getResources().getDrawable(R.drawable.tianzige));

word6.setBackground(getResources().getDrawable(R.drawable.tianzige));

word7.setBackground(getResources().getDrawable(R.drawable.tianzige));

word8.setBackground(getResources().getDrawable(R.drawable.tianzige));

                    showNormalDialog();

                }

                else {

                    if (Integer.parseInt(timeout.getText().toString()) > 150) {

//                    Toast.makeText(getApplicationContext(), "您输入的成语不正确哦!还有时间哦加油加油",Toast.LENGTH_SHORT).show();

                        Toast toast = new Toast(getApplicationContext());

                        LayoutInflater inflater = LayoutInflater.from(ChengYuJieLongActivity.this);

                        View view2 = inflater.inflate(R.layout.toast, null);

                        ImageView imageView1 = view2.findViewById(R.id.iv_toast);

                        TextView textView1 = view2.findViewById(R.id.tv_toast);

imageView1.setImageResource(R.drawable.fighting);

                        textView1.setText("您输入的成语不正确哦!还有时间哦加油加油!");

                        toast.setView(view2);

                        toast.setDuration(Toast.LENGTH_SHORT);

                        toast.setGravity(Gravity.CENTER, 0, 0);

                        toast.show();

                    } else{

//                    Toast.makeText(getApplicationContext(), "您输入的成语不正确哦!",Toast.LENGTH_SHORT).show();

                        Toast toast = new Toast(ChengYuJieLongActivity.this);

                        LayoutInflater inflater = LayoutInflater.from(ChengYuJieLongActivity.this);

                        View view2 = inflater.inflate(R.layout.toast, null);

                        ImageView imageView1 = view2.findViewById(R.id.iv_toast);

                        TextView textView1 = view2.findViewById(R.id.tv_toast);

    imageView1.setImageResource(R.drawable.wrong);

                        textView1.setText("您输入的成语不正确哦");

                        toast.setView(view2);

                        toast.setDuration(Toast.LENGTH_SHORT);

                        toast.setGravity(Gravity.CENTER, 0, 0);

                        toast.show();

                }

                }

            }

        }

    }

    private void showNormalDialog(){

        /* @setIcon 设置对话框图标

         * @setTitle 设置对话框标题

         * @setMessage 设置对话框消息提示

         * setXXX方法返回Dialog对象,因此可以链式设置属性

         */

        timer.cancel();

        final AlertDialog.Builder normalDialog =

                new AlertDialog.Builder(ChengYuJieLongActivity.this);

        normalDialog.setIcon(R.drawable.like);

        normalDialog.setTitle("恭喜您通过本关");

        String s=String.valueOf(300-Integer.parseInt(timeout.getText().toString()));

        normalDialog.setMessage("仅用了"+s+"秒");



        normalDialog.setPositiveButton("下一关",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent(ChengYuJieLongActivity.this, ChengYuJieLongActivity.class);

                        i++;

                        intent.putExtra("level", i);

                        intent.putExtra("accchengyu", str);

                        startActivity(intent);

                    }

                });

        normalDialog.setNegativeButton("退出游戏",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new

    private void showEndingNormalDialog(){

        final AlertDialog.Builder normalDialog =

                new AlertDialog.Builder(ChengYuJieLongActivity.this);

        normalDialog.setIcon(R.drawable.heartbroken);

        normalDialog.setTitle("游戏结束啦,恭喜您通关到第"+i+"关");

        normalDialog.setPositiveButton("重玩",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent(ChengYuJieLongActivity.this, ChengYuJieLongActivity.class);

                        startActivity(intent);

                    }

                });

        normalDialog.setNegativeButton("退出游戏",

                new DialogInterface.OnClickListener() {

                    @Override

                    public void onClick(DialogInterface dialog, int which) {

                        Intent intent = new Intent(ChengYuJieLongActivity.this, MainActivity.class);

                        startActivity(intent);

                    }

                });

        // 显示

        normalDialog.show();

    }

}

3.4.3 运行截图

4 总结体会

在开发中华字典系统的过程中,我深刻体会到了Java编程的魅力和挑战性。通过设计并实现拼音查询、部首查询、成语查询等多个功能模块,我不仅提升了自己的编程能力,还加深了对数据库操作、前后端交互等技术的理解。同时,成语接龙小游戏的加入为系统增加了趣味性,也提升了用户的参与度和满意度。整个开发过程虽然充满了挑战,但收获颇丰,让我更加坚定了继续深入学习Java编程的决心。

5 附录

 

源码文件清单

Java代码、Layout布局

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

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

相关文章

Android framework配置默认屏幕亮度值源码分析

1、概述 在Android中&#xff0c;config.xml文件用于配置各种系统设置和资源。对于屏幕亮度的配置&#xff0c;config.xml并不是直接用于设置屏幕亮度的地方&#xff0c;但它可以包含默认的系统设置和一些相关的参数。以下是如何在config.xml中配置一些与屏幕亮度相关的设置的…

STM32学习笔记(二)--GPIO通用输入输出口详解

&#xff08;1&#xff09;配置步骤1.使用RCC开启GPIO时钟2.使用GPIO_Init函数初始化GPIO3.使用输入或输出的函数等来控制GPIO 其中涉及外设有RCC、GPIO &#xff08;2&#xff09;代码示例 案例1&#xff08;设置PA0为推挽输出&#xff09; RCC_APB2PeriphClockCmd(RCC_APB2P…

RemObjects教程

File—Other…—RemObjects Data Abstract—ComboServer Step(1) 在出现的 NewRemObjects SDK Server 对话框中 Project Folder &#xff1a;文件存档路径 Project Name &#xff1a;工程名称 Also-Create a matching client application and a project group&#xff1a;在创…

破局消费供应链,企业费用管理如何应对变与不变?

供应链管理在过去一直被局限在生产与产品供应领域&#xff0c;更多被理解为生产及流通过程中&#xff0c;涉及将产品或服务提供给最终用户活动的上游与下游企业所形成的网链结构&#xff0c;即将产品从商家送到消费者手中整个链条。因为直接对企业利润产生重大影响&#xff0c;…

工厂能耗监控与管理

随着工业4.0的浪潮席卷全球&#xff0c;工厂的能耗监控与管理已不再是简单的节能降耗问题&#xff0c;而是关乎企业竞争力、环保责任及可持续发展的核心议题。在这个关键时刻&#xff0c;HiWoo Cloud平台以其独特的视角和强大的功能&#xff0c;为工厂能耗监控与管理领域带来全…

微信客服:塑造卓越客户体验的新引擎

在数字化快速发展的今天&#xff0c;企业与客户之间的沟通方式正在发生深刻变革。微信客服&#xff0c;作为这一变革中的重要一环&#xff0c;以其高效、便捷、智能的特点&#xff0c;正在逐步成为企业塑造卓越客户体验的新引擎。 一、微信客服的崛起 微信&#xff0c;作为中…

虚拟警示教育馆如何革新安全教育?揭秘其深远意义与实际优势

一、推动警示教育的创新与普及 虚拟警示教育馆是将传统警示教育与现代科技相结合的新型教育模式。其意义主要体现在以下几个方面&#xff1a; 1、增强教育的互动性和沉浸感&#xff1a;虚拟警示教育馆通过3D建模、VR等技术&#xff0c;创建逼真的警示场景。这种身临其境的体验能…

【css】如何修改input选中历史选项后,自动填充的蓝色背景色

自动填充前&#xff1a; 自动填充后&#xff1a; 解决办法 方法一&#xff1a;设置背景透明 改变input自动填充背景颜色 // 通过拉长过渡时间&#xff0c;和延迟过渡开始时间&#xff0c;掩盖input自动填充背景颜色input:-internal-autofill-previewed,input:-internal-aut…

2024年文献数据库合集分享

无论是刚踏入学术界的新手&#xff0c;还是经验丰富的资深学者&#xff0c;在寻找专业资料时都可能感到头疼&#xff1a;这些资料太专业了&#xff0c;普通网站难以找到... 许多人可能都有过这样的经历&#xff1a;急需一篇论文&#xff0c;却发现只有海外的专业网站才有&#…

企业为何需要搭建线上虚拟品牌展厅?

在数字化时代&#xff0c;线上虚拟品牌展厅已成为企业不可或缺的一部分。以下是构建线上虚拟品牌展厅的4大关键理由&#xff1a; 1、迎合在线购物趋势 随着移动互联网的飞速发展和普及&#xff0c;消费者越来越倾向于在线购物。一个线上虚拟品牌展厅能够完美地满足这一需求&am…

flac格式如何转mp3?7大热门实用音频转换软件大PK

FLAC是Free Lossless Audio Codec&#xff08;免费无损音频编解码器&#xff09;的缩写&#xff0c;是一种在压缩文件大小的同时保留原始音乐质量的音频格式。不过&#xff0c;大多数音频格式都会在音乐质量和文件大小之间做出权衡。当你使用flac获得更好的音乐质量时&#xff…

软考阅卷将完成?!软考成绩有望六月底公布!

2024上半年软考考试已于5月25日-28日举行&#xff0c;考完试后大家最关心的事情莫过于查分了。 一、最新消息 1、不同地区在报名时对成绩公布的时间有所预示&#xff0c;但并没有一个统一的日期举个例子&#xff0c;江苏考区预计在6月下旬公布成绩&#xff0c;而黑龙江考区则预…

echart在线图表demo下载直接运行

echart 全面的数据可视化图表解决方案 | 折线图、柱状图、饼图、散点图、水球图等各类图表展示 持续更新中 三色带下表题速度仪表盘 地图自定义图标 动态环形图饼状图 动态水波动圆形 多标题指针仪表盘 温度仪表盘带下标题 横向柱状图排名 环形饼状图 双折线趋势变化

影响建筑效果图后期时间的因素有哪些?渲染100邀请码1a12

建筑效果图是建筑设计师展示设计方案的重要手段&#xff0c;为了完美展现&#xff0c;我们通常会对效果图进行后期处理&#xff0c;那么影响后期时间的因素有哪些&#xff1f;这次我们来看看吧。 1、底图的质量 底图是指原始的渲染图片&#xff0c;它决定了后期处理的难易程度…

LVGL——(2)基础对象

目录 一、对象简介 二、基础对象简介 1、概念(lv_obj) 屏幕是没有父类的基础对象 屏幕对象的创建过程 LVGL的三层屏幕 2、大小(size) 相关函数 代码示例 3、位置(position) LVGL屏幕的原点 屏幕&#xff08;部件区域&#xff09;的表示 相关函数 LV_ALIGN_...参数…

无代码爬虫八爪鱼采集器-如何采集携程网指定酒店差评信息

场景描述&#xff1a;有一些酒店会分析同行的差评原因&#xff0c;以便提前做预案&#xff0c;避免自己酒店也放同样的错误。他们通过采集携程网指定酒店的提取中差评&#xff0c;使用的采集工具为无代码爬虫软件八爪鱼采集器免费版&#xff0c;下载链接&#xff1a;1.软件分享…

颠覆行业!格行随身WiFi重新定义服务标准,线上线下无缝融合!随身WiFi行业的“海底捞”!随身WiFi哪个品牌最可靠?随身WiFi靠谱推荐!

不得不承认网络销售是现如今的重要销售方式&#xff0c;刚刚结束的618&#xff0c;以及接下来的双11&#xff0c;双12等电商购物节都是异常火爆&#xff0c;可背后也有不同的声音传来&#xff0c;网店现在生意也难做了&#xff1f;消费正回归线下实体经济&#xff1f; 这就是因…

移动硬盘分区误删?专业恢复策略与预防措施

一、认识移动硬盘分区误删 在使用移动硬盘时&#xff0c;有时我们可能会遇到分区误删的情况。这通常指的是由于某种原因&#xff0c;用户错误地删除了移动硬盘上的某个分区&#xff0c;导致该分区内的所有数据丢失。分区误删是一种常见的数据丢失问题&#xff0c;对于用户来说…

计算机组成原理网课笔记2

存储系统基本概念 主存储器的基本组成 半导体元件的原理 存储芯片的基本原理 如何实现不同的寻址方式

【每日刷题】Day68

【每日刷题】Day68 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 451. 根据字符出现频率排序 - 力扣&#xff08;LeetCode&#xff09; 2. 最小的K个数_牛客题霸_牛客…