精华内容
下载资源
问答
  • 网络书城系统

    2018-03-19 11:19:51
  • 网络书城系统开发毕业论文.doc
  • 基于SSH的网络书城系统的数据库,使用MySQL数据库。包含六张数据表
  • 基于web的网络书城系统的设计与实现,一整套,工程,数据库文件,word,ppt,直接运行,前后台,发布图书,页面非常美观
  • 在如今的生活中,Internet的...近几年来,ASP.NET这项技术已经被电子商务这种形势广泛应用,成为了开发相关系统的首选标准,利用ASP.NET结合SQL SERVER的方式开发出来的商务系统具有较高的灵活性,稳定性和可扩展性。
  • 使用C#语言所写的简单的网络书城系统 简单易懂
  • 论文的格式很规整,程序是用asp.net+sql2005做的,即使程序你用不到,如果你做的是相关的毕业设计,或学习论文一定能用得到。这是我毕业时做的
  • 网上书城系统

    2014-04-25 19:11:41
    随着当今社会新系统大度的提高,网络的高速发展,计算机已被广泛应用于各个领域,因而网络成为人们生活中不可或缺的一部分。互联网用户应经接受了电子商务,网购成为一种时尚潮流。
  • javaee网络书城 ssh+mysql

    2018-01-08 15:29:12
    基于ssh框架实现的网络书城,有代码,有jar包,有数据库文件。用户密码都是root。导入即用
  • 网络书城模板

    2018-12-17 14:55:53
    自己收藏的一个网上书城的项目,数据库什么的,都齐全,肯定是能跑的
  • 快乐书城系统设计

    2012-11-10 16:48:23
    本设计尝试用ASP.NET在网络上架构一个电子书城,以使每一位顾客不用出门在家里就能够通过上网来轻松购书。本文从理论和实践两个角度出发,对一个具有数据挖掘功能电子书城进行设计与实现。实训首先较为详尽地介绍了...
  • 电子商务是利用现代信息网络进行商务活动的一种先进手段,作为创新的经济运行方式,其影响已经远远超过商业领域。为了跟上世界电子商务的发展潮流,缩短与发达国家之间的差距,每个人都应该从不同的角度积极了解电子...
  • 其中,网上书城就是典型的信息管理系统(MIS),它的产生顺应了时代的潮流。 投资少,回收快。这是网上商城的一大优点。 它利用计算机,使图书销售企业进货、库存和销售可以有机的结合在一起,以此提高了工作效率,...
  • 网上书店系统能在网络上建立一个虚拟的购物平台,改变传统的购物流程,使购物变得轻松、快捷、安全、方便。本网站是基于.NET的在线书城,其开发主要包括后台数据库的建立、后台管理以及前台页面的Web设计。网站使用...
  • JAVA 书城网络管理

    2010-04-29 08:19:49
    系统采用基于JAVA开发的WEB平台,后台...本文主要介绍使用JAVA语言 构建皖北书城网络管理平台的详细过程,包括可行性研究、需求分析、总体设计、详细设计、测试五个阶段。重点介绍MVC开发的具体操作方式及其思想。
  • 网络书城APP 安卓原生制作项目目录设置拓展知识maven私服配置apache Http网页服务器bmob 后端云设置(可选作为用户设置)制作程序相关配置成果 项目目录设置 拓展知识 maven私服配置 maven仓库分为远端服务器和私服 ...

    项目目录设置

    拓展知识

    maven私服配置

    maven仓库分为远端服务器和私服
    maven结构图
    那为什么用私服呢?
    在这里插入图片描述

    • 节省自己的外网带宽
      建立私服可以减少组织自己的开支,大量的对于外部远程仓库的重复请求会消耗很大的带宽,利用私服代理外部仓库后,对外的重复构件下载得以消除,即降低外网带宽的压力。

    • 加速Maven的构建
      不停的请求外部仓库无疑是比较耗时的, 但Maven的一些内部机制(如快照检测)要求Maven在执行构建的时候不停地检查远程仓库的数据。
      因此当配置了很多远程仓库时,构建的速度会被大大降低。使用私服可以很好地解决这个问题。

    • 部署第三方构件
      当某个构件无法从外部远程仓库下载怎么办?
      这样的例子很多,如组织内部的生成的私有的构件肯定无法从外部仓库获取,Oracle的JDBC驱动由于版权原因不能发布到外网的中心仓库。
      建立私服之后便可以将这些构件部署到本地私服中,供内部的Maven项目使用。

    • 提高稳定行,增强控制
      Maven构建搞定依赖于远程仓库,因此,当Internet不稳定的时候,Maven构建也会变的不稳定,甚至无法构建。
      使用私服后即使暂时没有Internet连接Maven也可以正常运行,因为私服中缓存了大量的构件。
      此外一些私服软件(如:Nexus)还提供了很多额外的功能,如权限管理,RELEASE/SNAPSHOT区分等,管理员可以对仓库进行一些更高级的控制。

    • 降低中央仓库的负荷
      数百万的请求,存储数T的数据,需要相相当大的财力。使用私服可以避免很多对中央仓库的重复请求。

    下一步就是安装nexus了

    nexus 安装等教程这里有一篇很好的博文可以参考一下

    apache Http网页服务器

    接下来就是了解一下apache http服务器
    Apache HTTP Server(简称Apache),是Apache软件基金会的一个开放源代码的网页服务器,可以在大多数电脑操作系统中运行,由于其具有的跨平台性和安全性,被广泛使用,是最流行的Web服务器端软件之一。来自百度词条
    知道是个什么就要下载配置安装
    配置过程可以参考apache安装等教程

    做完这两步我们来看一下怎么配置一下整个项目目录

    bmob 后端云设置(可选作为用户设置)

    bmob配置方式

    制作程序

    相关配置

    我们看一下图片上的一些介绍,然后我们进行代码的编写
    在这里插入图片描述
    首先是等待页
    等待也就是一个点击程序时候可以有一个广告页面,这个页面可以跳过或者不跳过
    splash页面
    这里放入关键代码

    public class SplashActivity extends BaseUIActivity{
        public static final int CODE = 1001;
        public static final int TOTAL_TIME = 3000;
        public static final int INTERVAL_TIME = 1000;
    
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_splash);
            mTextView = (TextView) findViewById(R.id.time_text_view);
    
            final Handler handler = new MyHandler(this);
    
            Message message = Message.obtain();
            message.what = CODE;
            message.arg1 = TOTAL_TIME;
            handler.sendMessage(message);
    
            mTextView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    BookListActivity.start(SplashActivity.this);
                    SplashActivity.this.finish();
                    handler.removeMessages(CODE);
                }
            });
    
    
        }
    
        public static class MyHandler extends Handler {
            public final WeakReference<SplashActivity> mWeakReference;
    
            public MyHandler(SplashActivity activity) {
                mWeakReference = new WeakReference<>(activity);
            }
    
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                SplashActivity activity = mWeakReference.get();
                if (msg.what == CODE) {
                    if (activity != null) {
    
                        // 设置textview,更新UI
                        int time = msg.arg1;
                        activity.mTextView.setText(time / INTERVAL_TIME + "秒,点击跳过");
    
                        // 发送倒计时
    
                        Message message = Message.obtain();
                        message.what = CODE;
                        message.arg1 = time - INTERVAL_TIME;
    
                        if (time > 0) {
                            sendMessageDelayed(message, INTERVAL_TIME);
                        } else {
                            BookListActivity.start(activity);
                            activity.finish();
                        }
    
                    }
                }
            }
    
        }
    
    
    }
    

    在这一段里面可以看到,我们的程序界面的设置,但是我们发现,没有BaseUIActivity这个类,我们来看下他是干什么的
    在这里插入图片描述

    public class BaseUIActivity extends BaseActivity {
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
            super.onCreate(savedInstanceState, persistentState);
            SystemUI.fixSystemUI(this);
        }
    }
    

    名字可以看出,我写了一个重置UI的选项,那这个是怎么实现的

    public class SystemUI {
        public static void fixSystemUI(Activity mActivity) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //获取最顶层的View
                mActivity.getWindow().getDecorView()
                        .setSystemUiVisibility(
                                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
                                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
                mActivity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            }
        }
    }
    

    这里要检查一下程序的版本,所以单独写一个类来实现,那接下来要做的就是进入之后的显示类 BookListActivity
    书单
    这些数据全部来自网络端,那网络端要怎么实现,之前提到apache HTTP 看一下列表
    文件关系
    在这里插入图片描述
    上代码

    /**
     * FileName BookListActivity
     *
     * @author ziqin
     * @version 1.0
     * @date 2020/12/17 18:03
     * Descriptopn: 书籍列表类
     */
    public class BookListActivity extends BaseActivity {
        private static final String TAG = "BookListActivity";
        private ListView mListView;
        private List<BookListResult.Book> mBooks = new ArrayList<>();
        private AsyncHttpClient mClient;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_book_list);
            requsetPermiss();
    
            init();
        }
    
        private void init() {
            mListView = (ListView) findViewById(R.id.book_list_view);
            String url ="http://10.0.2.2:8888/lib.json";
            mClient = new AsyncHttpClient();
            mClient.get(url, new AsyncHttpResponseHandler() {
                @Override
                public void onStart() {
                    super.onStart();
    
                }
    
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    final String result = new String(responseBody);
    
                    Gson gson = new Gson();
                    BookListResult bookListResult = gson.fromJson(result, BookListResult.class);
    
                    mBooks = bookListResult.getData();
    
                    mListView.setAdapter(new BookListAdapter());
    
    
                }
    
                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
    
                }
    
                @Override
                public void onFinish() {
                    super.onFinish();
                }
            });
        }
    
        /**
         * 权限申请
         */
        private void requsetPermiss() {
            //危险权限
            request(new OnPermissionsResult() {
                @Override
                public void OnSuccess() {
    
                }
                @Override
                public void OnFail(List<String> noPermissions) {
                    Log.i("noPermissions:", noPermissions.toString());
                }
            });
        }
        public static void start(Context context) {
            Intent intent = new Intent(context, BookListActivity.class);
            context.startActivity(intent);
        }
    
    
        private class BookListAdapter extends BaseAdapter {
    
            @Override
            public int getCount() {
                return mBooks.size();
            }
    
            @Override
            public Object getItem(int i) {
                return mBooks.get(i);
            }
    
            @Override
            public long getItemId(int i) {
                return i;
            }
    
            @Override
            public View getView(int position, View view, ViewGroup viewGroup) {
                final BookListResult.Book book = mBooks.get(position);
    
                ViewHolder viewHolder = new ViewHolder();
                if (view == null) {
                    view = getLayoutInflater().inflate(R.layout.item_book_list_view, null);
                    viewHolder.mNameTextView = (TextView) view.findViewById(R.id.name_text_view);
                    viewHolder.mButton = (Button) view.findViewById(R.id.book_btn);
                    view.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) view.getTag();
                }
    
                viewHolder.mNameTextView.setText(book.getBookname());
                final String path = Environment.getExternalStorageDirectory() + "/yuedukongjian/" + book.getBookname() + ".txt";
                Log.i(TAG,ExistSDCard()+"");
                Log.i(TAG,path);
    
                File file = new File(path);
                // try {
                //     file.createNewFile();
                // } catch (IOException e) {
                //     e.printStackTrace();
                // }
                // try {
                //     FileWriter fileWriter = new FileWriter(file);
                //     fileWriter.write("sssss");
                // } catch (IOException e) {
                //     e.printStackTrace();
                // }
    
    
    
                viewHolder.mButton.setText(file.exists() ? "点击打开" : "点击下载");
    
                final ViewHolder finalViewHolder = viewHolder;
                viewHolder.mButton.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if (file.exists()) {
                            BookActivity.start(BookListActivity.this, path);
                        } else {
                            mClient.addHeader("Accept-Encoding", "identity");
                            mClient.get(book.getBookfile(), new FileAsyncHttpResponseHandler(file) {
                                @Override
                                public void onFailure(int statusCode, Header[] headers, Throwable throwable, File file) {
                                    finalViewHolder.mButton.setText("下载失败");
                                }
    
                                @Override
                                public void onSuccess(int statusCode, Header[] headers, File file) {
                                    finalViewHolder.mButton.setText("点击打开");
                                }
    
                                @Override
                                public void onProgress(long bytesWritten, long totalSize) {
                                    super.onProgress(bytesWritten, totalSize);
                                    finalViewHolder.mButton.setText(String.valueOf(bytesWritten * 100 / totalSize) + "%");
                                }
                            });
    
                        }
    
                    }
                });
    
                return view;
            }
    
            class ViewHolder {
                public TextView mNameTextView;
                public Button mButton;
            }
        }
        private boolean ExistSDCard() {
            if (android.os.Environment.getExternalStorageState().equals(
                    android.os.Environment.MEDIA_MOUNTED)) {
                return true;
            } else
                return false;
        }
    
        //第一次按下时间
        private long firstClick;
    
        @Override
        public void onBackPressed() {
            AppExit();
            //super.onBackPressed();
        }
    
        /**
         * 再按一次退出
         */
        public void AppExit() {
            if (System.currentTimeMillis() - this.firstClick > 2000L) {
                this.firstClick = System.currentTimeMillis();
                Toast.makeText(this, "再按一次退出", Toast.LENGTH_LONG).show();
                return;
            }
            finish();
        }
    
    }
    

    这里用到AsyncHttp,小文件完全够了,并且用的是listview,也可以考虑替换,这里已经够用了就不考虑
    里面涉及到一个端口在init()里面,可以看一下这里对应上面的HTTP设置 10.0.2.2是android studio对主机地址的取值
    String url ="http://10.0.2.2:8888/lib.json";
    接下来获取到json我们可以先打印出来,对应的用插件转换为对应的类

    并且对下载放了一个对应的加载数据 看最后一本书,点击之后显示下载的进度
    在这里插入图片描述

    
    public class BookListResult {
    
        @SerializedName("status")
        private int mStatus;
        @SerializedName("msg")
        private String mMessage;
    
        @SerializedName("data")
        private List<Book> mData;
    
        public int getStatus() {
            return mStatus;
        }
    
        public void setStatus(int status) {
            mStatus = status;
        }
    
        public String getMessage() {
            return mMessage;
        }
    
        public void setMessage(String message) {
            mMessage = message;
        }
    
        public List<Book> getData() {
            return mData;
        }
    
        public void setData(List<Book> data) {
            mData = data;
        }
    
        public static class Book {
            @SerializedName("bookname")
            private String mBookname;
            @SerializedName("bookfile")
            private String mBookfile;
    
            public String getBookname() {
                return mBookname;
            }
    
            public void setBookname(String bookname) {
                mBookname = bookname;
            }
    
            public String getBookfile() {
                return mBookfile;
            }
    
            public void setBookfile(String bookfile) {
                mBookfile = bookfile;
            }
        }
    }
    

    json文件如下

    {
      "status": 1,
      "data": [
        {
          "bookname": "大主宰",
          "bookfile": "http://10.0.2.2:8888/txt/大主宰.txt"
        },
        {
          "bookname": "鬼吹灯",
          "bookfile": "http://10.0.2.2:8888/txt/鬼吹灯.txt"
        },
        {
          "bookname": "盘龙",
          "bookfile": "http://10.0.2.2:8888/txt/大主宰.txt"
        },
        {
          "bookname": "庆余年",
          "bookfile": "http://10.0.2.2:8888/txt/庆余年.txt"
        },
        {
          "bookname": "圣墟",
          "bookfile": "http://10.0.2.2:8888/txt/圣墟.txt"
        },
        {
          "bookname": "心理罪",
          "bookfile": "http://10.0.2.2:8888/txt/心理罪.txt"
        },
        {
          "bookname": "重生九零小俏媳",
          "bookfile": "http://10.0.2.2:8888/txt/重生九零小俏媳.txt"
        }
      ],
      "msg": "成功"
    }
    

    贝塞尔曲线类这里准备了直接导入的类,不赘述

    那我们就要提一下,集成的动态权限
    上代码

    /**
     * FileName BaseActivity
     *
     * @author ziqin
     * @version 1.0
     * @date 2020/12/23 19:20
     * Descriptopn:
     */
    public class BaseActivity extends AppCompatActivity {
        //申请运行时权限的Code
        private static final int PERMISSION_REQUEST_CODE = 1000;
    
        //申明所需权限
        private String[] mStrPermission = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
        };
    
        //保存没有同意的权限
        private List<String> mPerList = new ArrayList<>();
        //保存没有同意的失败权限
        private List<String> mPerNoList = new ArrayList<>();
    
        private OnPermissionsResult permissionsResult;
    
        /**
         * 一个方法请求权限
         *
         * @param permissionsResult
         */
        protected void request(OnPermissionsResult permissionsResult) {
            if (!checkPermissionsAll()) {
                requestPermissionAll(permissionsResult);
            }
        }
    
        /**
         * 判断单个权限
         *
         * @param permissions
         * @return
         */
        protected boolean checkPermissions(String permissions) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                int check = checkSelfPermission(permissions);
                return check == PackageManager.PERMISSION_GRANTED;
            }
            return false;
        }
    
        /**
         * 判断是否需要申请权限
         *
         * @return
         */
        protected boolean checkPermissionsAll() {
            mPerList.clear();
            for (int i = 0; i < mStrPermission.length; i++) {
                boolean check = checkPermissions(mStrPermission[i]);
                //如果不同意则请求
                if (!check) {
                    mPerList.add(mStrPermission[i]);
                }
            }
            return mPerList.size() > 0 ? false : true;
        }
    
        /**
         * 请求权限
         *
         * @param mPermissions
         */
        protected void requestPermission(String[] mPermissions) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(mPermissions, PERMISSION_REQUEST_CODE);
            }
        }
    
        /**
         * 申请所有权限
         *
         * @param permissionsResult
         */
        protected void requestPermissionAll(OnPermissionsResult permissionsResult) {
            this.permissionsResult = permissionsResult;
            requestPermission((String[]) mPerList.toArray(new String[mPerList.size()]));
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
            mPerNoList.clear();
            if (requestCode == PERMISSION_REQUEST_CODE) {
                if (grantResults.length > 0) {
                    for (int i = 0; i < grantResults.length; i++) {
                        if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
                            //你有失败的权限
                            mPerNoList.add(permissions[i]);
                        }
                    }
                    if (permissionsResult != null) {
                        if (mPerNoList.size() == 0) {
                            permissionsResult.OnSuccess();
                        } else {
                            permissionsResult.OnFail(mPerNoList);
                        }
                    }
                }
            }
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
        protected interface OnPermissionsResult {
            void OnSuccess();
    
            void OnFail(List<String> noPermissions);
        }
    }
    
    

    有了这些之后,我们就要来绘制一下点进书籍的时候显示的页面,不过有的方法正在淘汰,要注意一下

    public class BookActivity extends AppCompatActivity {
    
    
        public static final String FILE_PATH = "file_path";
        public static final String BOOKMARK = "bookmark";
        private BookPageView mBookPageView;
        private TextView mProgressTextView;
        private View mSettingView;
        private RecyclerView mRecyclerView;
        private static final String TAG = "BookActivity";
        private int mCurrentLength;
        private BookPageBezierHelper mHelper;
        private Bitmap mCurrentPageBitmap;
        private Bitmap mNextPageBitmap;
        private String mFilePath;
        private int mWidth;
        private int mHeight;
        private int mLastLength;
        private TextToSpeech mTTS;
        private SeekBar mSeekBar;
        private int mTotalLength;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // fullscreen
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            }
    
            setContentView(R.layout.activity_book);
    
            if (getIntent() != null) {
                mFilePath = getIntent().getStringExtra(FILE_PATH);
                if(!TextUtils.isEmpty(mFilePath)){
                    mTotalLength = (int) new File(mFilePath).length();
                }
            } else {
                // todo  can not find the book path
            }
            // init view
            mBookPageView = (BookPageView) findViewById(R.id.book_page_view);
            mProgressTextView = (TextView) findViewById(R.id.progress_text_view);
            mSettingView = findViewById(R.id.setting_view);
            mRecyclerView = (RecyclerView) findViewById(R.id.settingRecyclerView);
            mSeekBar = (SeekBar) findViewById(R.id.seekBar);
    
            // get Size
            DisplayMetrics displayMetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
            mWidth = displayMetrics.widthPixels;
            mHeight = displayMetrics.heightPixels;
            openBookByProgress(R.drawable.book_bg, 0);
            //set progress
    
            mHelper.setOnProgressChangedListener(new BookPageBezierHelper.OnProgressChangedListener() {
                @Override
                public void setProgress(int currentLength, int totalLength) {
                    mCurrentLength = currentLength;
                    float progress = mCurrentLength * 100 / totalLength;
                    mProgressTextView.setText(String.format("%s%%", progress));
                }
            });
    
            // set user setting view listener.
    
            mBookPageView.setOnUserNeedSettingListener(new BookPageView.OnUserNeedSettingListener() {
                @Override
                public void onUserNeedSetting() {
                    mSettingView.setVisibility(mSettingView.getVisibility() == View.VISIBLE
                            ? View.GONE : View.VISIBLE);
                }
            });
    
            // set recyclerView data.
    
            List<String> settingList = new ArrayList<>();
            settingList.add("添加书签");
            settingList.add("读取书签");
            settingList.add("设置背景");
            settingList.add("语音朗读");
            settingList.add("跳转进度");
    
            LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
            mRecyclerView.setLayoutManager(layoutManager);
            mRecyclerView.setAdapter(new HorizontalAdapter(this, settingList));
    
            mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    openBookByProgress(R.drawable.book_bg, seekBar.getProgress()* mTotalLength /100);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    openBookByProgress(R.drawable.book_bg, seekBar.getProgress()* mTotalLength /100);
                }
            });
        }
        private void openBookByProgress(int backgroundResourceID, int progress) {
            // set book helper
            mHelper = new BookPageBezierHelper(mWidth, mHeight, progress);
            mBookPageView.setBookPageBezierHelper(mHelper);
    
            // current page , next page
            mCurrentPageBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
            mNextPageBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
            mBookPageView.setBitmaps(mCurrentPageBitmap, mNextPageBitmap);
    
            // set background
            mHelper.setBackground(this, backgroundResourceID);
            // open book
            if (!TextUtils.isEmpty(mFilePath)) {
                try {
                    mHelper.openBook(mFilePath);
                    mHelper.draw(new Canvas(mCurrentPageBitmap));
                    mBookPageView.invalidate();
                } catch (IOException e) {
                    e.printStackTrace();
                    // todo  can not find the book path
                }
            } else {
                // todo  can not find the book path
            }
        }
    
        public static void start(Context context, String filePath) {
            Intent intent = new Intent(context, BookActivity.class);
            intent.putExtra(FILE_PATH, filePath);
            context.startActivity(intent);
    
        }
    
        private class HorizontalAdapter extends RecyclerView.Adapter {
    
            private Context mContext;
            private List<String> mData = new ArrayList<>();
    
            public HorizontalAdapter(Context context, List<String> list) {
                mContext = context;
                mData = list;
            }
    
            @Override
            public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                TextView itemView = new TextView(mContext);
                return new ViewHolder(itemView);
            }
    
            @Override
            public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
                TextView textView = (TextView) holder.itemView;
                textView.setWidth(350);
                textView.setHeight(180);
                textView.setTextSize(16);
                textView.setTextColor(Color.WHITE);
                textView.setGravity(Gravity.CENTER);
                textView.setText(mData.get(position));
                final SharedPreferences sharedPreferences =
                        mContext.getSharedPreferences("yuedu_book_preference", MODE_PRIVATE);
    
                final SharedPreferences.Editor editor = sharedPreferences.edit();
    
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        switch (position) {
                            case 0:
                                // add bookmark
                                // get progress
                                // save progress to preference.
                                editor.putInt(BOOKMARK, mCurrentLength);
                                editor.apply();
                                break;
                            case 1:
                                // get bookmark from preference.
                                // reload book to the progress.
                                mLastLength = sharedPreferences.getInt(BOOKMARK, 0);
                                openBookByProgress(R.drawable.book_bg, mLastLength);
                                break;
                            case 2:
                                openBookByProgress(R.drawable.book_bg2, mLastLength);
                                break;
                            case 3:
                                if (mTTS == null) {
                                    mTTS = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
                                        @Override
                                        public void onInit(int status) {
                                            if (status == TextToSpeech.SUCCESS) {
                                                int result = mTTS.setLanguage(Locale.CHINA);
                                                if (result == TextToSpeech.LANG_MISSING_DATA
                                                        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                                                    Log.e(TAG, "onInit: language is not available.");
                                                    Uri uri = Uri.parse("http://acj2.pc6.com/pc6_soure/2017-6/com.iflytek.vflynote_208.apk");
                                                    Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                                                    startActivity(intent);
                                                } else {
                                                    Log.i(TAG, "onInit: init success.");
                                                    // mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null);
                                                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                                                        mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null, "悦读");
                                                    } else {
                                                        mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null);
                                                    }
                                                }
                                            } else {
                                                Log.e(TAG, "onInit: error");
                                            }
                                        }
                                    });
                                } else {
                                    if (mTTS.isSpeaking()) {
                                        mTTS.stop();
                                    } else {
                                        // mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null);
                                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                                            mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null, "悦读");
                                        } else {
                                            mTTS.speak(mHelper.getCurrentPageContent(), TextToSpeech.QUEUE_FLUSH, null);
                                        }
                                    }
                                }
                                break;
                            case 4:
                                mSeekBar.setVisibility(View.VISIBLE);
                                break;
                        }
                    }
                });
            }
    
            @Override
            public int getItemCount() {
                return mData.size();
            }
    
            public class ViewHolder extends RecyclerView.ViewHolder {
    
                private TextView mTextView;
    
                public ViewHolder(TextView itemView) {
                    super(itemView);
                    mTextView = itemView;
                }
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            if(mTTS != null){
                mTTS.shutdown();
            }
        }
    }
    

    另外的功能可根据需要看代码怎么实现,也可以引用一些接口实现语音功能

     List<String> settingList = new ArrayList<>();
            settingList.add("添加书签");
            settingList.add("读取书签");
            settingList.add("设置背景");
            settingList.add("语音朗读");
            settingList.add("跳转进度");
    
    

    成果

    书籍显示
    书籍显示,这里要注意一下看一下服务器端的解析,否则会乱码

    添加背景和翻页效果

    在这里插入图片描述
    结束

    展开全文
  • 本网上购书商城系统使用了动态网页开发技术JAVA来实现系统各功能,后台框架使用了SSM框架实现相应的功能,使用MySQL数据库作为本系统的数据库管理工具。本系统的使用大致可以分为两个角色,一个是普通用户,一个是...
  • 基于B/S模式的思源线上书城系统

    千次阅读 2018-09-25 13:34:50
    ...本项目讲述了基于B/S模式的思源线上书城系统的设计与实现。所谓的网上书店系统是通过网站推广互联企业的商品和服务,并使...从长期的战略目标来说,思源线上书城系统不仅是图书品和服务的推广,而是通过Int...

    GitHub地址:https://github.com/mdxiaohu/onlineBookCity


    项目介绍

    本项目讲述了基于B/S模式的思源线上书城系统的设计与实现。所谓的网上书店系统是通过网站推广互联企业的商品和服务,并使客户随时可以了解企业和企业的商品,为客户提供在线服务和订单处理功能。

    从长期的战略目标来说,思源线上书城系统不仅是图书品和服务的推广,而是通过Internet、企业内部网和企业外部网,将买家与卖家、厂商和合作伙伴紧密结合在了一起,因而消除了时间与空间带来的障碍。

    思源线上书城系统提供了多种检索途径,可以从分类、新品、特价等途径进行检索,快捷准确。与传统销售方式相比,在线销售能够提供海量商品信息。书城系统最突出的优点是:不再限制消费者的购买时段,扩大和巩固了客户群,从而增加了商品企业的核心竞争力,节省实际开店时需要投入的成本和租用费用。

    项目说明

    1.项目模块

      1)用户管理模块(3天)user

           用户登录,用户注册,邮箱的验证

      2)产品浏览模块(2天)main

        产品主界面,分类浏览界面

      3)购物车模块(1.5天)cart

        购买,删除,恢复,更新数量等

      4)订单模块(1.5天)order

        订单确认,填写送货地址,订单生成

    2.技术架构

      主要采用Ajax+Struts2+JDBC开发技术.

      基于MVC模式分层设计.

      表现层:JSP,Ajax,jQuery

      控制层:Struts2 Filter控制器+Action

      业务层:Sevice组件(业务复杂)

      数据访问层:DAO组件,基于JDBC技术

     ===============用户管理模块===============

     一.用户注册

       1.了解需求

         1)当用户点击"注册"按钮后,执行客户端js检查

           邮箱地址:非空,格式,唯一性

           昵称:非空,长度4-20(中文字符算2个)

           密码:非空,长度6-20(只允用字母和数字)

           确认密码:非空,与密码一致

           验证码:非空,正确性

         2)通过客户端检查,完成以下处理

           将表单数据写入到d_user表

           生成验证码(采用uuid当做验证码)

           给用户邮箱发送验证码(uuid-userId)

         3)操作成功后进入邮箱验证页面

       2.相关的数据表结构

          了解d_user表结构

       3.编写程序

         1)先编写服务器端实现

           a.编写Action组件

             根据请求页面定义input属性

             根据响应页面定义output属性

             定义业务方法execute,编写服务器处理.

             以Action为主线,需要entity,dao,util,

             编写相应实现

            b.在模块配置文件中,配置Action组件  

      二.邮箱验证

           1.在邮箱验证页面,点击"完成"按钮,先执行js检查

                    非空检查

           2.通过js检查,服务器端主要逻辑如下

                    1)将用户输入的uuid-userId验证码解析,

                             解析出userId和uuid

                    2)去d_user表中检查uuid和userId正确性

                    3)如果验证码正确,将d_user的

                             is_email_verify设置成"Y",

                             页面跳转到register_ok.jsp

                    4)如果验证码不正确,页面返回verify_form.jsp

                             提示错误信息.

      三.登录

        1.用户输入email和密码后,点击"登录"执行js检查

                 Email:非空,格式

                 密码:非空

        2.通过js检查后,服务器端处理如下:

          1)验证email和密码的正确性,不正确返回登录

               页面,显示错误信息

          2)如果email和密码正确,检查邮箱是否通过验证

               ,如果未通过验证跳转到verify_form.jsp

          3)如果邮箱通过验证,更新d_user表的

          last_login_time和last_login_ip信息.

               进入/main/main.jsp

          4)将user信息写入session

       四.main.jsp页眉,登录状态显示

         如果用户登录,显示用户昵称和登出按钮

         如果未登录,只显示登录和注册按钮

     ==================================

             发送一个action请求,将返回的信息填充到标签所在位置

             <s:action name="findnew" namespace="/main"

                                executeResult="true">

             </s:action>

    ===============产品浏览模块需求===================

    一.主界面main.jsp

        1.编辑推荐区域的显示

        采用ajax方式加载recommend.jsp

       该区域显示两个图书信息.这两个图书信息随机从数据库获取.

        2.热销图书区域的显示

        采用ajax方式加载hot.jsp

        该区域显示8个图书信息.这8个图书信息从

        d_item订单销量表中统计获取销量最多的前8个.

        3.新书热卖榜

                       将main.jsp右侧排行榜信息提取成一个jsp,

                       采用ajax方式加载.

               该区域显示热销图书的排行.将热销图书区域的数据显示.

    二.分类浏览页面

        1.左侧类别显示

       根据父类别ID查询出子类别信息并统计出所包含的产品数量.

       2.右侧产品信息显示

        根据当前类别ID查询出所包含的产品信息.

    ===============购物车+订单模块================

    购物车与shoppingcart工程实现相同.代码结构稍改动下

    1.Cart业务组件方法的API进一步简化

    2.编写个CartFactory,用于获取与session相关的Cart对象

    3.购买采用Ajax请求处理,其他的采用原有方式,页面整体刷新

    订单模块

    1.确认订单页面:

     将Cart对象中取出确认购买的商品和金额,显示到页面

    2.填写送货地址

      当用户输入地址后,单击"下一步"按钮,创建一个订单,

      将订单信息写入数据库.步骤如下:

      1)将表单信息写入d_order表,其他字段从session等范围获取

      2)获取order_id,将确认订单列表信息向d_item写入若干条记录.

      --追加功能,当用户在选择地址下拉单,选择"填写新地址"时,

           将表单记录向d_receive_address表写入一条记录

           如果选择以前地址,不需要操作

      3)清空购物车中的商品信息.清除session和cookie保存的购物车信息

     完成以上功能后,实现选择地址下拉单的处理.

      1)页面加载完毕后,采用Ajax将d_receive_address表中

      当前用户使用过的地址取出,以json返回,形成Option给下拉单.

      2)当用户改变下拉单选项后,发送Ajax请求,去d_receive_address

      表中获取地址信息,以json返回,填充到表单输入框中

    ==============登录检查问题===================

    编写一个登录检查的拦截器.参考以前课上案例

    可以添加在购物车"结算"请求处理的<action>配置中

    这样点"结算"时执行登录检查

    注册页面

    在注册页面填写个人信息,输入验证码进行注册。

    邮箱验证

    在后台生成一串字符串进行验证。

    注册成功

    验证完成后就注册成功

    浏览分类

    对应的分类里可以查看当前分类里的所有商品

    购物车

    购买后的商品直接加入到购物车,在购物车里展示所有已添加的商品

    确认地址

    填写收件人姓名,收件人地址,邮政编号以及电话

    生成订单

    在购物车里点击下一步,生成订单。跳转到订单页面

    网上书店系统采用了比较流行的B/S模式,使用当前较流行的技术框架和拥有较高安全性与稳定性的数据库MySQL数据库来完成系统的设计与开发。系统充分考虑了用户的需求,最终达到了预期效果,并添加了一些附加功能,使系统更加人性化。操作者可以随时对所有的信息进行查询,并且每个模块都提供信息浏览的功能。

    系统实现了图书企业通过互联网向消费者推销自己的图书和服务,在网上书店系统网站消费的顾客可以通过计算机网络搜索到自己需要的信息,购买自己需要的图书,在线下达订单。然后由网上书店系统后台来处理相关的订单信息、网站维护等信息。

    由于我在知识、经验方面都存在着不足,在整个开发的过程中时间也比较仓促,因此该系统必然会存在一些缺陷和不足。系统在图书信息管理等方面还有不足之处,由于对其具体功能分析的不够透彻,以至于在实现功能上不够细化,不够详尽,所以有待以后将其更加完善。

    致    谢

    在指导老师的指导和同学帮助之下,我顺利地完成了本次项目实训。在项目实训这段时间里,我认识到了自己的不足并努力的争取完成项目,最终收获很多,学到了以前很多没有学到的知识,同时也巩固了所学过的知识。

    首先,感谢我的指导老师。作为我的导师,无论是在理论还是实践方面都给我提了很多宝贵的意见,使我的实训项目在有条不紊的环境下进行,逐步趋于完善,得以顺利完成。

    其次,我也很感谢在项目检查时老师给我提出宝贵意见,还有其他老师在此期间的关怀和帮助,以及学院为我提供良好的实训环境。

    最后,感谢在实训项目中为我提供帮助的学院的老师和同学,总之感谢在实训项目期间给予我帮助的所有老师和同学,感谢你们对我的支持。

    展开全文
  • 跨平台: 网页应用运行在浏览器上,不会直接和系统打交道 开发成本低: Because 没有平台问题,开发者不需要掌握多种开发语言和框架 更容易迭代: Web应用所有的资源都在服务器,不需要用户主动安装和更新就可以实现...

    移动Web 与 原生应用的优劣势

    一、移动 Web 的优势

    跨平台: 网页应用运行在浏览器上,不会直接和系统打交道 开发成本低: Because 没有平台问题,开发者不需要掌握多种开发语言和框架
    更容易迭代: Web应用所有的资源都在服务器,不需要用户主动安装和更新就可以实现产品的升级迭代

    二、移动 Web 的劣势

    功能有限: 因为没有和系统直接打交道所以只能使用浏览器提供的部分功能 操作体验欠佳:
    由于运行在浏览器上,很多浏览器的质量参差不齐,操作体验势必有所下降 无法离线使用: 虽然 HTML 5
    提供了离线存储,但是不代表客户在第一次首次访问应用的时候,本地已经存在 很难被发现:
    用户获取APP的方式一般都是通过应用商店下载、APP桌面图标,而Web App 并不具备这些的条件

    三、 原生应用的优势

    功能完善: 几乎具备设备的所有功能的访问权限 体验更好: 速度快、性能高 可离线使用:
    在无网络的情况下,客户也可以进行部分操作,因为原生App的所有程序代码和静态资源在用户安装app时就已经下载到了本地 发现机会高:
    应用商城下载、桌面应用图标展示

    四、原生应用的劣势

    开发成本高: 有多少操作系统就得开发多少套应用程序,维护成本也会相对增加 迭代不可控: 安装首先需应用商城审核,其次需要用户即使的升级
    内容限制: 应用商城审核规范条例

    移动Web 现需解决的问题

    浏览器种类太多,参差不齐 除了系统原生的浏览器,还有很多第三方的浏览器,而且那些第三方的浏览器对HTML 5
    的支持程度不一,对网页的渲染与交互也各不相同,增加了Web前端开发的成本。不止是web前端 PC端的IE就是一个魔鬼 网速仍然是性能的瓶颈
    在PC时代网速是困扰用户和开发者的最大难题,到了移动时代,这个问题更加被放大,很多时候开发者都需要为网页加速加载做更多的优化
    多框架造成门槛高 不管是移动端还是PC端,框架的更新速度以及新框架的出现速度都是很快的。
    以上转载于简书蓝海00

    总体来看,移动端Web与原生应用之间各有千秋,而博主在Android方面并不精通,因此便采用了这种移动端Web开发的方式。
    下面是移动端网上书城web界面及功能在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    该移动端web是在SSM网上书城系统基础上开发的,在经过这段时间的改进后,该系统的功能得到了完善,已经具备了作为毕业设计的条件
    码字不易,给个赞呗
    SSM网上书城PC端

    展开全文
  • 基于Java springboot+mybatis 网上书城管理系统一、系统介绍二、功能展示1.主页(客户)2.登陆(客户)3.我的购物车(客户)4.我的订单(客户)5.我的图书(商家)6.新书上架(商家)7.订单管理(商家)7.统计分析(管理...
  • 整个系统分为三个模块(粗粒度): 用户相关模块 --> UserAction 图书相关模块 --> BookAction 购物相关模块 --> ShoppingAction
  • 解决1:(1)虚拟上工具栏编辑-->虚拟网络编辑器,我打算使用VMnet8,它一般支持NAT方式, NAT设置: DHCP设置: (2)右键16.04Ubuntu 64位,设置,网络适配器,勾选NAT模式。NAT模式的最终结果是Ubuntu与Win...
  • 网上书店系统

    2013-03-13 11:27:16
    根据博联书店需求,我们团队花了5个月为其开发出一款可以应用于互联网的网络书城系统。,系统代码清晰,注释详细,有开发文档及帮助手册,只要拷贝到你的MyEclipse中就可以运行。
  • 用户在登录页面,填写用户名和密码,确认正确后进入系统 用户可以在登录之后,浏览图书分类列表页面 用户可以在选择分类编号后,浏览此分类详细图书列表 用户在图书浏览页面,点击”添加”按钮,把选定图书添加到购物车 ...
  • 用户在登录页面,填写用户名和密码,确认正确后进入系统 用户可以在登录之后,浏览图书分类列表页面 用户可以在选择分类编号后,浏览此分类详细图书列表 用户在图书浏览页面,点击”添加”按钮,把选定图书添加到购物车 ...
  • Web网上书城

    2014-09-29 14:03:52
    Web网上书城
  • 一篇硕士学位论文 (1)介绍了基于工nternet网络支付体系的...种融合方式的安全网络支付系统的模拟实现过程,对今后开展网络支付 研究具有一定积极意义。 关键词:网络支付,安全套接层协议,安全电子交易协议,加密,认证
  • 网络书店系统源代码VS2005版 一个全英文的网上书店,具有用户注册功能,可以浏览图书并且评论, 可以网上预订,具有书籍搜索功能。有购物车功能,可以给网站留言 是一个常见的网上书店。 数据库在DB文件夹下附加即可...
  • 用SQL2000和C#语言开发的网络书店系统,包括论文、网站、ppt
  • 《asp.net网络开发实用工程案例》附带光盘代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,202
精华内容 480
关键字:

网络书城系统